{"_id":"@avreg/yaml-doc-splitter","name":"@avreg/yaml-doc-splitter","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@avreg/yaml-doc-splitter","version":"0.1.0","description":"A Node.js transform stream to split multi-doc YAML stream","private":false,"engines":{"node":"^12 || ^14 || ^16"},"main":"dist/yaml-doc-splitter.js","type":"commonjs","types":"dist/index.d.ts","scripts":{"prepare":"husky install","lint":"eslint src test examples","clean":"rimraf ./dist","build":"yarn clean && webpack --mode production -c webpack.config.cjs","build:dev":"yarn clean && webpack --mode development -c webpack.config.cjs","test":"jest"},"keywords":["yaml","doc","multidoc","multi-doc","multi","split","stream"],"author":{"name":"Andrey Nikitin","email":"support@avreg.net"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/avreg/yaml-doc-splitter.git"},"devDependencies":{"@babel/core":"^7.18.5","@babel/preset-env":"^7.18.2","@babel/preset-typescript":"^7.17.12","@commitlint/cli":"^17.0.3","@commitlint/config-conventional":"^17.0.3","@tsconfig/node10":"^1.0.9","@tsconfig/node12":"^1.0.11","@types/jest":"^28.1.3","@types/node":"^17.0.15","@typescript-eslint/eslint-plugin":"^5.18.0","@typescript-eslint/parser":"^5.10.2","babel-jest":"^28.1.1","eslint":"^8.18.0","eslint-config-prettier":"^8.3.0","eslint-config-standard":"^16.0.3","eslint-plugin-import":"^2.25.4","eslint-plugin-jest":"^26.5.3","eslint-plugin-node":"^11.1.0","eslint-plugin-prettier":"^4.0.0","eslint-plugin-promise":"^5.0.0","eslint-webpack-plugin":"^3.1.1","husky":"^8.0.1","jest":"^28.1.1","js-yaml":"^4.1.0","prettier":"^2.5.1","rimraf":"^3.0.2","source-map-loader":"^3.0.1","terser-webpack-plugin":"^5.3.0","ts-loader":"^9.2.6","ts-node":"^10.8.2","typescript":"^4.5.5","webpack":"^5.68.0","webpack-cli":"^4.9.2"},"husky":{"hooks":{"commit-msg":"commitlint -E HUSKY_GIT_PARAMS","pre-commit":"pretty-quick --staged"}},"gitHead":"90170bac8ce0461f7f1d3cd0b9c71921c654f451","bugs":{"url":"https://github.com/avreg/yaml-doc-splitter/issues"},"homepage":"https://github.com/avreg/yaml-doc-splitter#readme","_id":"@avreg/yaml-doc-splitter@0.1.0","_nodeVersion":"16.17.0","_npmVersion":"8.17.0","dist":{"integrity":"sha512-TFu6FgVlGeKp8+3K8r2ujXrIlM+FBEiI1ReIevTNBBc8Zl99h87wa69rp/k/7wzhO7CS9IApwbdlpJL6J6BX3A==","shasum":"5b23bc33d92bcd0df4a63bdfc6e44058474e076a","tarball":"https://registry.npmjs.org/@avreg/yaml-doc-splitter/-/yaml-doc-splitter-0.1.0.tgz","fileCount":5,"unpackedSize":15845,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBNmNG2S04BtyKZeAP4ObPsS9ieJ4Ese05vzG9CbhZ0zAiBGeHyy3iKJq3htzY4ARClgfql+qJaeCdwXYlWsQhEChw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjBInlACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq5gA//V1mbpGzmDmw5FKD7p593NlqqD6XJ+cUkWClLiBf2UGOOGXS6\r\n6vcjPBhpcdC/s5oRISdA8US1LabIx65+Y7tRfPiRuJRtJOCIXPOqhjT1PWoy\r\ndIEI5gyoi2w1kIob7R4466GpG/hOOGCdNu6tFjn4NYm1XV0W+XDIn6b3Gfry\r\nFcqGE8IGFMZahiOXvdzBS6oFtU2Kdb630otglwH16Ha+5c/GpD98dLr+jIUe\r\nQtSHiDgFhbR3dV1zLcGgQTsXmmVpfl2HdL13niYJIowwxYp6vUVmrHK3GTdQ\r\n1CTd2phlglLRQeLeYo0EJ6wjec4vg4TrER2XLMWsMcfX5Gg//Kxqs1MRBU3o\r\n+vLe4kPaaCJvwU6xsnxTIRGvlblDPDbI6IGmUDWLCOxz0OXcJmgYk6BaCDko\r\n9mkSv8mq58mwZN1JvQpoEdbLEBw7eCzzauVJNApBMTizdMF9F1CaPezeJlL8\r\n0cGpgYUOPkONP0I0nTJ+kVqOZXv1jQqvDv6K6YYtgl736gt2XrEDx567DOmJ\r\nOnnHUiJ/h34w5vZRNorJETckBQzIcndE6tQaldGcNIzNMWWLdvi+hjISd2h6\r\nBgW0KG2/1AriMc4akTld1Og60wSzrRSLSGCYyOSzBLXmXIfioMvJwICs5GbX\r\nn0xlGSSs/E7Vb5J2Z+6pbsAv7XhrJ5AN1d0=\r\n=2TV7\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"avreg","email":"andrey.d.nikitin@gmail.com"},"directories":{},"maintainers":[{"name":"avreg","email":"andrey.d.nikitin@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/yaml-doc-splitter_0.1.0_1661241829039_0.6534354264021272"},"_hasShrinkwrap":false}},"time":{"created":"2022-08-23T08:03:48.986Z","0.1.0":"2022-08-23T08:03:49.276Z","modified":"2022-08-23T08:03:49.511Z"},"maintainers":[{"name":"avreg","email":"andrey.d.nikitin@gmail.com"}],"description":"A Node.js transform stream to split multi-doc YAML stream","homepage":"https://github.com/avreg/yaml-doc-splitter#readme","keywords":["yaml","doc","multidoc","multi-doc","multi","split","stream"],"repository":{"type":"git","url":"git+https://github.com/avreg/yaml-doc-splitter.git"},"author":{"name":"Andrey Nikitin","email":"support@avreg.net"},"bugs":{"url":"https://github.com/avreg/yaml-doc-splitter/issues"},"license":"Apache-2.0","readme":"# YAML multi-doc stream splitter\n\nThe \"zero dependency\" package **@avreg/yaml-doc-splitter** exports **YamlDocSplitter** class as [Node.js Transform stream](https://nodejs.org/api/stream.html#duplex-and-transform-streams) to build parser|decoder|convert [pipeline](https://nodejs.org/api/stream.html#streampipelinesource-transforms-destination-callback).\n\nThe YamlDocSplitter reads an multi-document *YAML input stream*, sequentially *splits* it into many individual YAML documents as data arrives, and *pushes* it on to the next streams in the pipeline.\n\nExample of multi-document YAML:\n\n```yml\n# Implicit end with version\n%YAML 1.2\n---\ndoc: 1\n\n# Explicit end without version\n---\ndoc: 2\n...\n\n# Explicit end with another version\n%YAML 1.1\n---\ndoc: 3\n...\n```\n\nYes, [js-yaml](https://github.com/nodeca/js-yaml) (and many another) package have ```loadAll()``` method, but *YamlDocSplitter* can *useful* in the following cases:\n\n- **if input static file have big size**,\n- **realtime input stream**.\n\n## Restrictions\n\n- Node.js >= 12.\n- Only UTF-8 encoding supports now.\n\n## Installation\n\n```bash\nnpm install @avreg/yaml-doc-splitter\n# or\nyarn add @avreg/yaml-doc-splitter\n```\n\n## Usage example\n\n### CommonJS (simplest example)\n\n```javascript\n/***\n * Usage:\n *  $ node path/to/yaml-splitter.cjs multi-doc.yaml\n *  # or\n *  $ cat multi-doc.yaml | node path/to/yaml-splitter.cjs\n */\n\nconst fs = require('fs');\nconst stream = require('stream');\nconst { YamlDocSplitter } = require('@avreg/yaml-doc-splitter');\n\nclass DocDumper extends stream.Writable {\n   constructor() {\n      super();\n\n      this._docNbr = 0;\n   }\n\n   _write(yamlDocBuffer, _encoding, callback) {\n      const yamlDocString = yamlDocBuffer.toString();\n\n      this._docNbr += 1;\n\n      console.log();\n      console.log(`@@@@@@@ Yaml doc #${this._docNbr} @@@@@@@`);\n      console.log(yamlDocString);\n\n      callback();\n   }\n\n   _final(callback) {\n      console.log(`Total Yaml docs count: ${this._docNbr}`);\n\n      callback();\n   }\n}\n\nconst inputStream = process.argv[2]\n   ? fs.createReadStream(process.argv[2])\n   : process.stdio;\nconst splitter = new YamlDocSplitter();\nconst dumper = new DocDumper();\n\ninputStream.pipe(splitter).pipe(dumper);\n```\n\n### ES6 modules (more complete)\n\n```javascript\n/***\n * Usage:\n *  $ node path/to/yaml2json-dumper.mjs multi-doc.yaml\n *  # or\n *  $ cat multi-doc.yaml | node path/to/yaml2json-dumper.mjs\n */\n\nimport fs from 'node:fs';\nimport util from 'node:util';\nimport stream from 'node:stream';\nimport os from 'node:os';\nimport process from 'node:process';\nimport ydsPkg from '@avreg/yaml-doc-splitter.js';\nimport yaml from 'js-yaml';\n\nconst { YamlDocSplitter } = ydsPkg;\n\nconst pipeline = util.promisify(stream.pipeline);\n\nclass YamlToJson extends stream.Transform {\n   constructor() {\n      super({\n         readableObjectMode: true\n      });\n   }\n\n   _transform(stringChunk, _encoding, callback) {\n      try {\n         const jsonObj = yaml.load(stringChunk);\n         if (jsonObj !== null && jsonObj !== undefined) {\n            callback(null, jsonObj);\n         } else {\n            // empty object\n            callback();\n         }\n      } catch (err) {\n         callback(err);\n      }\n   }\n}\n\nclass JsonStringifier extends stream.Transform {\n   constructor() {\n      super({\n         writableObjectMode: true\n      });\n   }\n\n   _transform(jsonObj, _encoding, callback) {\n      try {\n         callback(null, JSON.stringify(jsonObj, null, 3) + os.EOL);\n      } catch (err) {\n         callback(err);\n      }\n   }\n}\n\nconst inputStream = process.argv[2]\n   ? fs.createReadStream(process.argv[2])\n   : process.stdio;\nconst splitter = new YamlDocSplitter();\nconst convertor = new YamlToJson();\nconst stringifier = new JsonStringifier();\n\n(async () => {\n   try {\n      await pipeline(\n         inputStream,\n         splitter,\n         convertor,\n         stringifier,\n         process.stdout\n      );\n   } catch (err) {\n      console.error('Pipeline job failed:', err.message || `${err}`);\n   }\n})();\n```\n\n## TODO\n\n- support all encodings;\n- make \"dist\" package.json.\n\n## BUGS\n\nReport bugs to <support@avreg.net>\n","readmeFilename":"README.md"}