{"_id":"@emdzej/ncsx-options","_rev":"6-7db4fff2ba9f282a82cadce1460026cd","name":"@emdzej/ncsx-options","dist-tags":{"latest":"0.9.0"},"versions":{"0.4.0":{"name":"@emdzej/ncsx-options","version":"0.4.0","_id":"@emdzej/ncsx-options@0.4.0","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"homepage":"https://github.com/emdzej/coding#readme","bugs":{"url":"https://github.com/emdzej/coding/issues"},"dist":{"shasum":"40329280267c1df43cde2d7eb05afacf4072fd40","tarball":"https://registry.npmjs.org/@emdzej/ncsx-options/-/ncsx-options-0.4.0.tgz","fileCount":15,"integrity":"sha512-drhAc4Hic4b/IltWHDF2Bl6E+h/fWEupL+b4MTj1bagWua1mGdQrgHDZ78QcpoASGNj98XB2dgVDCHcoBT0UCA==","signatures":[{"sig":"MEUCIQD7Xlkw6ixLtEwyDOfAWA94bopm/G3m2XVu92hMg5W34gIgVvqYBA4kBf5DJ3prZqyeXwkaWgVjwNrd0MpMIY+8DKU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22539},"main":"dist/index.js","type":"module","_from":"file:emdzej-ncsx-options-0.4.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint .","test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.json","clean":"rm -rf dist .turbo *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"emdzej","email":"michal@jaskolski.pro"},"_resolved":"/private/var/folders/7h/x_w_580x4s9dq3sq11tpvzkwy3nbj8/T/3eb34c696356260a636380e25a609141/emdzej-ncsx-options-0.4.0.tgz","_integrity":"sha512-drhAc4Hic4b/IltWHDF2Bl6E+h/fWEupL+b4MTj1bagWua1mGdQrgHDZ78QcpoASGNj98XB2dgVDCHcoBT0UCA==","repository":{"url":"git+https://github.com/emdzej/coding.git","type":"git","directory":"packages/options"},"_npmVersion":"11.14.1","description":"CVT DATEN reader — emits an OptionFunctionList of per-(FSW, PSW) AUFTRAGSAUSDRUCK predicate bytes for friendly UI filtering. Mirrors NCSDummy's Classes/Options/OptionListReader. Spec: ../../docs/ncsdummy-analysis.md §3.3.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"@emdzej/ncsx-daten":"0.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.8","@types/node":"^22.13.1"},"_npmOperationalInternal":{"tmp":"tmp/ncsx-options_0.4.0_1779705640551_0.027703448050823587","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@emdzej/ncsx-options","version":"0.5.1","_id":"@emdzej/ncsx-options@0.5.1","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"homepage":"https://github.com/emdzej/coding#readme","bugs":{"url":"https://github.com/emdzej/coding/issues"},"dist":{"shasum":"69de603cafb0c34856c29f95c71b5eec2132aad4","tarball":"https://registry.npmjs.org/@emdzej/ncsx-options/-/ncsx-options-0.5.1.tgz","fileCount":15,"integrity":"sha512-uHCtdUmt611qm9Tx8VaWUmCVzC2iNLMDsdGO/cwhdJn7OSnV1C7D7Ku9bcpq2FxtYwiQLcVtkzyyOOfGZQNnkQ==","signatures":[{"sig":"MEUCIQDj1FuJa3E3NGyUE0Xr0bzKN6ybD6TketcZ+7LdffFpXwIgGsPyPtdGNNdH4UiA7SuALJ8qN9UHreujtuDbF1YeBYA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22539},"main":"dist/index.js","type":"module","_from":"file:emdzej-ncsx-options-0.5.1.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint .","test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.json","clean":"rm -rf dist .turbo *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"emdzej","email":"michal@jaskolski.pro"},"_resolved":"/private/var/folders/7h/x_w_580x4s9dq3sq11tpvzkwy3nbj8/T/6025c28bc66de9cc916fffc6c1bb8764/emdzej-ncsx-options-0.5.1.tgz","_integrity":"sha512-uHCtdUmt611qm9Tx8VaWUmCVzC2iNLMDsdGO/cwhdJn7OSnV1C7D7Ku9bcpq2FxtYwiQLcVtkzyyOOfGZQNnkQ==","repository":{"url":"git+https://github.com/emdzej/coding.git","type":"git","directory":"packages/options"},"_npmVersion":"11.14.1","description":"CVT DATEN reader — emits an OptionFunctionList of per-(FSW, PSW) AUFTRAGSAUSDRUCK predicate bytes for friendly UI filtering. Mirrors NCSDummy's Classes/Options/OptionListReader. Spec: ../../docs/ncsdummy-analysis.md §3.3.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"@emdzej/ncsx-daten":"0.5.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.8","@types/node":"^22.13.1"},"_npmOperationalInternal":{"tmp":"tmp/ncsx-options_0.5.1_1779876449355_0.576512772552787","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@emdzej/ncsx-options","version":"0.6.0","_id":"@emdzej/ncsx-options@0.6.0","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"homepage":"https://github.com/emdzej/coding#readme","bugs":{"url":"https://github.com/emdzej/coding/issues"},"dist":{"shasum":"b820cd5d9d946a7bf3be339e9f162972dacbf4d8","tarball":"https://registry.npmjs.org/@emdzej/ncsx-options/-/ncsx-options-0.6.0.tgz","fileCount":15,"integrity":"sha512-OBm30k0vl3JINfxSN+kasAcWMxsWJQYbsvL8yMIB6nYSi5Z+aNkAKN/P9ay81wUwkWPqdje6j0wzfWTXP3gp4g==","signatures":[{"sig":"MEYCIQCPJrMHr9Ctu3vpuAcgxiho8C9icCporhjUkY7Ex3t91gIhAOL6Rhdkf9JXd5cpq3lR9SALmDsBYBxHt8ypG3gGsMZz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22539},"main":"dist/index.js","type":"module","_from":"file:emdzej-ncsx-options-0.6.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint .","test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.json","clean":"rm -rf dist .turbo *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"emdzej","email":"michal@jaskolski.pro"},"_resolved":"/private/var/folders/7h/x_w_580x4s9dq3sq11tpvzkwy3nbj8/T/f305bb450d7ba293ed884b55b9c1b382/emdzej-ncsx-options-0.6.0.tgz","_integrity":"sha512-OBm30k0vl3JINfxSN+kasAcWMxsWJQYbsvL8yMIB6nYSi5Z+aNkAKN/P9ay81wUwkWPqdje6j0wzfWTXP3gp4g==","repository":{"url":"git+https://github.com/emdzej/coding.git","type":"git","directory":"packages/options"},"_npmVersion":"11.14.1","description":"CVT DATEN reader — emits an OptionFunctionList of per-(FSW, PSW) AUFTRAGSAUSDRUCK predicate bytes for friendly UI filtering. Mirrors NCSDummy's Classes/Options/OptionListReader. Spec: ../../docs/ncsdummy-analysis.md §3.3.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"@emdzej/ncsx-daten":"0.6.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.8","@types/node":"^22.13.1"},"_npmOperationalInternal":{"tmp":"tmp/ncsx-options_0.6.0_1779981252935_0.7576359372616108","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@emdzej/ncsx-options","version":"0.7.0","_id":"@emdzej/ncsx-options@0.7.0","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"homepage":"https://github.com/emdzej/coding#readme","bugs":{"url":"https://github.com/emdzej/coding/issues"},"dist":{"shasum":"822476071d6c01ee84175d6451b0eba27b3eb510","tarball":"https://registry.npmjs.org/@emdzej/ncsx-options/-/ncsx-options-0.7.0.tgz","fileCount":15,"integrity":"sha512-qwjtZuTOkbUjV4DweGm+9HtvijQ0gvZUu2kBLCPEWBePPkRpIyRlaDbywEiEWeVffBAm9M9myc1L+8g+Q/EaPA==","signatures":[{"sig":"MEYCIQCmNVUyXB+rSypfWWNRZs0G8dwqptA1uJlSuf3U43Pk6QIhAM2hfm4t0LmmULKJjpZjftb3H1l94sMyzg06iqVzdzcH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22539},"main":"dist/index.js","type":"module","_from":"file:emdzej-ncsx-options-0.7.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint .","test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.json","clean":"rm -rf dist .turbo *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"emdzej","email":"michal@jaskolski.pro"},"_resolved":"/private/var/folders/7h/x_w_580x4s9dq3sq11tpvzkwy3nbj8/T/d809f944a0c9c2f705215e6276f88e7e/emdzej-ncsx-options-0.7.0.tgz","_integrity":"sha512-qwjtZuTOkbUjV4DweGm+9HtvijQ0gvZUu2kBLCPEWBePPkRpIyRlaDbywEiEWeVffBAm9M9myc1L+8g+Q/EaPA==","repository":{"url":"git+https://github.com/emdzej/coding.git","type":"git","directory":"packages/options"},"_npmVersion":"11.14.1","description":"CVT DATEN reader — emits an OptionFunctionList of per-(FSW, PSW) AUFTRAGSAUSDRUCK predicate bytes for friendly UI filtering. Mirrors NCSDummy's Classes/Options/OptionListReader. Spec: ../../docs/ncsdummy-analysis.md §3.3.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"@emdzej/ncsx-daten":"0.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.8","@types/node":"^22.13.1"},"_npmOperationalInternal":{"tmp":"tmp/ncsx-options_0.7.0_1780063019183_0.8295931823498046","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@emdzej/ncsx-options","version":"0.8.0","_id":"@emdzej/ncsx-options@0.8.0","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"homepage":"https://github.com/emdzej/coding#readme","bugs":{"url":"https://github.com/emdzej/coding/issues"},"dist":{"shasum":"9a82b214b5cbab5f827a5fa3b9aef9d813307a60","tarball":"https://registry.npmjs.org/@emdzej/ncsx-options/-/ncsx-options-0.8.0.tgz","fileCount":15,"integrity":"sha512-KX0p30E8X5jqA1YvzWVYDLsftzIUzNuJZR0Vsm4/COiytLR3RkQd1bEjMZS5AehwF7qizMw6ro9oYZGg8CNMXg==","signatures":[{"sig":"MEQCIB7u8xNeDYOTBSlojtvMcEEac61VZeTujbbO064lPsxbAiBCVp9nUxcT5uerDWstD/Kq9vkxD1t1nskHHNFjlZzi2w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22539},"main":"dist/index.js","type":"module","_from":"file:emdzej-ncsx-options-0.8.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint .","test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.json","clean":"rm -rf dist .turbo *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"emdzej","email":"michal@jaskolski.pro"},"_resolved":"/private/var/folders/7h/x_w_580x4s9dq3sq11tpvzkwy3nbj8/T/15188d94670fe84337de76aed8651181/emdzej-ncsx-options-0.8.0.tgz","_integrity":"sha512-KX0p30E8X5jqA1YvzWVYDLsftzIUzNuJZR0Vsm4/COiytLR3RkQd1bEjMZS5AehwF7qizMw6ro9oYZGg8CNMXg==","repository":{"url":"git+https://github.com/emdzej/coding.git","type":"git","directory":"packages/options"},"_npmVersion":"11.16.0","description":"CVT DATEN reader — emits an OptionFunctionList of per-(FSW, PSW) AUFTRAGSAUSDRUCK predicate bytes for friendly UI filtering. Mirrors NCSDummy's Classes/Options/OptionListReader. Spec: ../../docs/ncsdummy-analysis.md §3.3.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"@emdzej/ncsx-daten":"0.8.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.8","@types/node":"^22.13.1"},"_npmOperationalInternal":{"tmp":"tmp/ncsx-options_0.8.0_1780758428580_0.8837220182955197","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@emdzej/ncsx-options","version":"0.9.0","description":"CVT DATEN reader — emits an OptionFunctionList of per-(FSW, PSW) AUFTRAGSAUSDRUCK predicate bytes for friendly UI filtering. Mirrors NCSDummy's Classes/Options/OptionListReader. Spec: ../../docs/ncsdummy-analysis.md §3.3.","main":"dist/index.js","types":"dist/index.d.ts","type":"module","dependencies":{"@emdzej/ncsx-daten":"0.9.0"},"devDependencies":{"@types/node":"^22.13.1","vitest":"^2.1.8"},"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/emdzej/coding.git","directory":"packages/options"},"scripts":{"build":"tsc -p tsconfig.json","test":"vitest run --passWithNoTests","test:watch":"vitest","lint":"eslint .","typecheck":"tsc --noEmit","clean":"rm -rf dist .turbo *.tsbuildinfo"},"_id":"@emdzej/ncsx-options@0.9.0","bugs":{"url":"https://github.com/emdzej/coding/issues"},"homepage":"https://github.com/emdzej/coding#readme","_integrity":"sha512-vhPuUVDskTyeD3vpOF4mfMnuIrCr0ehJujiSI6hMfD0fnujs+8YkEQ4MRRDjomnzG7nO+VSHNAKIPNug4pbWYA==","_resolved":"/private/var/folders/7h/x_w_580x4s9dq3sq11tpvzkwy3nbj8/T/1a61ca40e73ea535d2370b9cb291197f/emdzej-ncsx-options-0.9.0.tgz","_from":"file:emdzej-ncsx-options-0.9.0.tgz","_nodeVersion":"22.22.1","_npmVersion":"11.16.0","dist":{"integrity":"sha512-vhPuUVDskTyeD3vpOF4mfMnuIrCr0ehJujiSI6hMfD0fnujs+8YkEQ4MRRDjomnzG7nO+VSHNAKIPNug4pbWYA==","shasum":"70156cb2a94ce9f08e7df505938d82368c5ac9b8","tarball":"https://registry.npmjs.org/@emdzej/ncsx-options/-/ncsx-options-0.9.0.tgz","fileCount":15,"unpackedSize":22539,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIEnPRuXq+0WXSSMRohBzrw/lD4nwnMZrZtOBBdhl2MuNAiEA9Uz2veqBrEmR7vo1bA9QWC2+IIvfp7F+PeHOLGtQEec="}]},"_npmUser":{"name":"emdzej","email":"michal@jaskolski.pro"},"directories":{},"maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ncsx-options_0.9.0_1783336571997_0.016124273682698753"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-25T10:40:40.364Z","modified":"2026-07-06T11:16:12.221Z","0.4.0":"2026-05-25T10:40:40.690Z","0.5.1":"2026-05-27T10:07:29.498Z","0.6.0":"2026-05-28T15:14:13.125Z","0.7.0":"2026-05-29T13:56:59.332Z","0.8.0":"2026-06-06T15:07:08.724Z","0.9.0":"2026-07-06T11:16:12.119Z"},"bugs":{"url":"https://github.com/emdzej/coding/issues"},"homepage":"https://github.com/emdzej/coding#readme","repository":{"type":"git","url":"git+https://github.com/emdzej/coding.git","directory":"packages/options"},"description":"CVT DATEN reader — emits an OptionFunctionList of per-(FSW, PSW) AUFTRAGSAUSDRUCK predicate bytes for friendly UI filtering. Mirrors NCSDummy's Classes/Options/OptionListReader. Spec: ../../docs/ncsdummy-analysis.md §3.3.","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"readme":"# @emdzej/ncsx-options\n\nReads a chassis-level **CVT DATEN file** (`<BR>CVT.000`) and emits an `OptionList` —\nper-(FSW, PSW) byte-coded AUFTRAGSAUSDRUCK predicates that tell the UI **which PSWs are\napplicable under which FAs**.\n\nThis is the data backing the \"✓ in FA / ⚠ not in FA\" badges next to each PSW in the\nfriendly checkbox editor. Pair with [`@emdzej/ncsx-predicate`](../predicate/) to evaluate\neach predicate against the car's FA.\n\nMirrors NCS Dummy's `Classes/Options/OptionListReader`. Design notes:\n[`../../docs/ncsdummy-analysis.md` §3.3](../../docs/ncsdummy-analysis.md).\n\n## What it does\n\nWalks the CVT DATEN file's rows in document order:\n\n- An `AUFTRAGSAUSDRUCK` row stashes its predicate bytes.\n- The **immediately-following** `FSW_PSW` row consumes that predicate and binds it to\n  its `(FSW, PSW)` target.\n- If multiple AUFTRAGSAUSDRUCK fragments accumulate for the same `(FSW, PSW)` pair (a\n  legitimate CVT pattern), they're comma-joined into one OR-of-conjunctions blob.\n- `GRUPPE` / `INDIVID` boundary rows toggle scope; by default only group-scope rows\n  are surfaced (per NCS Dummy convention — individual-mode coding isn't part of order\n  options).\n\n## Install\n\n```bash\npnpm add @emdzej/ncsx-options\n# or:\n\"@emdzej/ncsx-options\": \"workspace:*\"\n```\n\n## Quick start\n\n```ts\nimport { readFileSync } from 'node:fs';\nimport { parseDatenFile } from '@emdzej/ncsx-daten';\nimport { buildOptionList } from '@emdzej/ncsx-options';\nimport { evalAuftragsausdruck } from '@emdzej/ncsx-predicate';\nimport { faToAsw } from '@emdzej/ncsx-fa-asw';\n\nconst cvt = parseDatenFile(readFileSync('E46CVT.000'));\nconst opts = buildOptionList(cvt);\n\nconst asw = faToAsw('0205 0502 0524', { chassis });\n\nfor (const fn of opts.functions) {\n  for (const p of fn.parameters) {\n    const applicable =\n      p.predicate.length === 0\n        ? true\n        : evalAuftragsausdruck(p.predicate, asw);\n    console.log(`FSW=${fn.fsw} PSW=${p.psw} ${applicable ? '✓' : '⚠'}`);\n  }\n}\n```\n\n## API\n\n| Export                | Purpose                                                       |\n|-----------------------|---------------------------------------------------------------|\n| `buildOptionList(cvt, opts?)` | Walk a parsed CVT `DatenFile` → `OptionList`          |\n| `OptionList`          | Top-level result — `{ functions: OptionFunction[] }`          |\n| `OptionFunction`      | One FSW's options: `{ fsw, parameters: OptionParameter[] }`   |\n| `OptionParameter`     | One PSW's predicate: `{ psw, predicate: Uint8Array }`         |\n| `OptionListError`     | Thrown on malformed rows                                      |\n\n### `buildOptionList` options\n\n```ts\nbuildOptionList(cvt, {\n  // When true (default), rows inside INDIVID scope are skipped. Set false if you want\n  // to surface individual-mode options too (rare; typically used for car-and-key memory\n  // edits).\n  groupScopeOnly: true,\n});\n```\n\n## Predicate encoding\n\nThe `predicate` byte arrays are AUFTRAGSAUSDRUCK in the same byte-coded language used by\n`<BR>SGET.000` rows. Evaluate them via [`@emdzej/ncsx-predicate`](../predicate/):\n\n```ts\nimport { evalAuftragsausdruck, extractReferencedIds } from '@emdzej/ncsx-predicate';\n\nconst applies = evalAuftragsausdruck(param.predicate, asw);\nconst sasMentioned = extractReferencedIds(param.predicate); // for tooltips\n```\n\nAn **empty `predicate`** means \"always applicable\" — no FA constraint on this PSW. Most\nbasic on/off PSWs (`aktiv`, `nicht_aktiv`) have empty predicates; the gating predicates\nmostly live on country variants, special-equipment options, and version-specific values.\n\n## When multiple fragments accumulate\n\nCVT files sometimes list the same `(FSW, PSW)` pair more than once, each preceded by a\ndifferent AUFTRAGSAUSDRUCK fragment. NCS Dummy treats that as an OR of the fragments and\ncomma-joins them; this package matches that convention. The joined byte sequence is still\na valid AUFTRAGSAUSDRUCK and evaluates correctly through the standard predicate\nevaluator.\n\n## Related\n\n- [`@emdzej/ncsx-daten`](../daten/) — required input. Parses the CVT DATEN file.\n- [`@emdzej/ncsx-predicate`](../predicate/) — evaluates the produced predicate bytes.\n- [`@emdzej/ncsx-fa-asw`](../fa-asw/) — produces the `AswSet` the predicate consumes.\n- [`@emdzej/ncsx-function-list`](../function-list/) — the catalog this layer annotates.\n- Design: [`../../docs/ncsdummy-analysis.md` §3.3](../../docs/ncsdummy-analysis.md).\n","readmeFilename":"README.md"}