{"_id":"@emdzej/ncsx-pfl","_rev":"6-091768b39b5e1ca0ae62bd3e97e9802d","name":"@emdzej/ncsx-pfl","dist-tags":{"latest":"0.9.0"},"versions":{"0.4.0":{"name":"@emdzej/ncsx-pfl","version":"0.4.0","_id":"@emdzej/ncsx-pfl@0.4.0","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"homepage":"https://github.com/emdzej/ncsx#readme","bugs":{"url":"https://github.com/emdzej/ncsx/issues"},"dist":{"shasum":"8f33feb7abfe9f4604878f60a914b39b033e9700","tarball":"https://registry.npmjs.org/@emdzej/ncsx-pfl/-/ncsx-pfl-0.4.0.tgz","fileCount":19,"integrity":"sha512-0s6kvIUVlK7TA4sjm65qdYj3YarIgBLbdIRUMplK6rprNRsPj97FXapIxeU8kdFzVyT/zA3Gs7e6I4hjnfn/Yg==","signatures":[{"sig":"MEQCIEjX5+vb0X/CcLKtrayNi/Oy7zBR87TlCaQOLGxkJVDWAiACYuI8a6Ej67orIvGId89IrQmqtolmlyC3JofGhXXptA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":43431},"main":"dist/index.js","type":"module","_from":"file:emdzej-ncsx-pfl-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/0b1188dc2e710c924c4f6d78d37b083e/emdzej-ncsx-pfl-0.4.0.tgz","_integrity":"sha512-0s6kvIUVlK7TA4sjm65qdYj3YarIgBLbdIRUMplK6rprNRsPj97FXapIxeU8kdFzVyT/zA3Gs7e6I4hjnfn/Yg==","repository":{"url":"git+https://github.com/emdzej/ncsx.git","type":"git","directory":"packages/pfl"},"_npmVersion":"11.14.1","description":"Parser/serializer for NCSEXPER .pfl profile files. Spec: ../../docs/pfl-format.md","directories":{},"_nodeVersion":"22.22.1","dependencies":{"@emdzej/inpax-ini-parser":"^0.7.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.8","@types/node":"^22.13.1"},"_npmOperationalInternal":{"tmp":"tmp/ncsx-pfl_0.4.0_1779705616591_0.6967482651108985","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@emdzej/ncsx-pfl","version":"0.5.1","_id":"@emdzej/ncsx-pfl@0.5.1","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"homepage":"https://github.com/emdzej/ncsx#readme","bugs":{"url":"https://github.com/emdzej/ncsx/issues"},"dist":{"shasum":"6caa25b4fb247ad265c4206c9173197b502b3b20","tarball":"https://registry.npmjs.org/@emdzej/ncsx-pfl/-/ncsx-pfl-0.5.1.tgz","fileCount":19,"integrity":"sha512-SyZbJduAxAx1l+E90mqlqdbepPB0pOHNbR9Vibh13hQvFtp86CyBkIHhgsfD1Qd1ujFCi1xfmE3kA9vH+jJsxQ==","signatures":[{"sig":"MEUCIFHXPBlUTM9PA2CrN1Y1SrYcMprf0s3o9HLt2AnnXUleAiEAvp4f67Do73Is/eezSNPnKInFulEJinFqOW5qHqOrJLM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":43431},"main":"dist/index.js","type":"module","_from":"file:emdzej-ncsx-pfl-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/7a9d1d347624c2babdfa5da115f1babe/emdzej-ncsx-pfl-0.5.1.tgz","_integrity":"sha512-SyZbJduAxAx1l+E90mqlqdbepPB0pOHNbR9Vibh13hQvFtp86CyBkIHhgsfD1Qd1ujFCi1xfmE3kA9vH+jJsxQ==","repository":{"url":"git+https://github.com/emdzej/ncsx.git","type":"git","directory":"packages/pfl"},"_npmVersion":"11.14.1","description":"Parser/serializer for NCSEXPER .pfl profile files. Spec: ../../docs/pfl-format.md","directories":{},"_nodeVersion":"22.22.1","dependencies":{"@emdzej/inpax-ini-parser":"^0.8.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.8","@types/node":"^22.13.1"},"_npmOperationalInternal":{"tmp":"tmp/ncsx-pfl_0.5.1_1779876429049_0.023335490120986124","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@emdzej/ncsx-pfl","version":"0.6.0","_id":"@emdzej/ncsx-pfl@0.6.0","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"homepage":"https://github.com/emdzej/ncsx#readme","bugs":{"url":"https://github.com/emdzej/ncsx/issues"},"dist":{"shasum":"7825640036a032125cc4d63eebc6e8156329202b","tarball":"https://registry.npmjs.org/@emdzej/ncsx-pfl/-/ncsx-pfl-0.6.0.tgz","fileCount":19,"integrity":"sha512-AxWd+kzS5I8jd+DPH2t9+aRtq0j1mrMoznfRzeYho3XDkRiGKGENCSa3oiZ2ZKP+iRFXhvXjx0aK/KUbHOiwwA==","signatures":[{"sig":"MEUCIAUbF2ndfOFGncFQNXp7tTPXsBNik5gKotkSrc7pgGiXAiEA8kvUFiwHXX4z2fk9z4FJGSXybpzf/NPQFSmAyDDxzow=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":43431},"main":"dist/index.js","type":"module","_from":"file:emdzej-ncsx-pfl-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/918af57f164e3d39ef42de0b370c230d/emdzej-ncsx-pfl-0.6.0.tgz","_integrity":"sha512-AxWd+kzS5I8jd+DPH2t9+aRtq0j1mrMoznfRzeYho3XDkRiGKGENCSa3oiZ2ZKP+iRFXhvXjx0aK/KUbHOiwwA==","repository":{"url":"git+https://github.com/emdzej/ncsx.git","type":"git","directory":"packages/pfl"},"_npmVersion":"11.14.1","description":"Parser/serializer for NCSEXPER .pfl profile files. Spec: ../../docs/pfl-format.md","directories":{},"_nodeVersion":"22.22.1","dependencies":{"@emdzej/inpax-ini-parser":"^0.9.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.8","@types/node":"^22.13.1"},"_npmOperationalInternal":{"tmp":"tmp/ncsx-pfl_0.6.0_1779981233096_0.09811487146870901","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@emdzej/ncsx-pfl","version":"0.7.0","_id":"@emdzej/ncsx-pfl@0.7.0","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"homepage":"https://github.com/emdzej/ncsx#readme","bugs":{"url":"https://github.com/emdzej/ncsx/issues"},"dist":{"shasum":"e5cd2bf6eb38624edea0475336296db0a047d108","tarball":"https://registry.npmjs.org/@emdzej/ncsx-pfl/-/ncsx-pfl-0.7.0.tgz","fileCount":19,"integrity":"sha512-DX7kyPfGZU7jMzhi3fUkVx5o+Nps1XZhrYkwbb+JSL0r5iSNTw3gLjZQxROA3PkaT1/Ak7TAQdirLj/nC8y9Zg==","signatures":[{"sig":"MEUCIQDGIa88Ll8tQFHBTME9WLSwnraTiGa7g8E+nnOwJHwp2QIgfkxNCFwOnbwZ7b85ElyJmtnAVq9MotJNiQbUUnlu/V4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":43432},"main":"dist/index.js","type":"module","_from":"file:emdzej-ncsx-pfl-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/362d490a7cddbc1634c0739f14b127be/emdzej-ncsx-pfl-0.7.0.tgz","_integrity":"sha512-DX7kyPfGZU7jMzhi3fUkVx5o+Nps1XZhrYkwbb+JSL0r5iSNTw3gLjZQxROA3PkaT1/Ak7TAQdirLj/nC8y9Zg==","repository":{"url":"git+https://github.com/emdzej/ncsx.git","type":"git","directory":"packages/pfl"},"_npmVersion":"11.14.1","description":"Parser/serializer for NCSEXPER .pfl profile files. Spec: ../../docs/pfl-format.md","directories":{},"_nodeVersion":"22.22.1","dependencies":{"@emdzej/inpax-ini-parser":"^0.10.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.8","@types/node":"^22.13.1"},"_npmOperationalInternal":{"tmp":"tmp/ncsx-pfl_0.7.0_1780062999430_0.2513838044338601","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@emdzej/ncsx-pfl","version":"0.8.0","_id":"@emdzej/ncsx-pfl@0.8.0","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"homepage":"https://github.com/emdzej/ncsx#readme","bugs":{"url":"https://github.com/emdzej/ncsx/issues"},"dist":{"shasum":"45362824b9fc9492c957d8e0e5afb5890f6628cc","tarball":"https://registry.npmjs.org/@emdzej/ncsx-pfl/-/ncsx-pfl-0.8.0.tgz","fileCount":19,"integrity":"sha512-MBLp6vsHRt0CD5IBJMPXaMhRxKxuy5AL4/ZCyi28hQc8U52Ldf78tzZIZl0Acd3SQ3b4PTE0z3T0u2MyxQmVhA==","signatures":[{"sig":"MEUCIGA6n0SEB1mxzHUc5eJGUDcBlhFdz71lAWsx7lxtWKKaAiEAjhJWceWkTWNivbPh/vPLggv4QlTFHwDTAf2UNcUiL9A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":43432},"main":"dist/index.js","type":"module","_from":"file:emdzej-ncsx-pfl-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/1a4356fd5c10bd56e47ea55c1725cb7f/emdzej-ncsx-pfl-0.8.0.tgz","_integrity":"sha512-MBLp6vsHRt0CD5IBJMPXaMhRxKxuy5AL4/ZCyi28hQc8U52Ldf78tzZIZl0Acd3SQ3b4PTE0z3T0u2MyxQmVhA==","repository":{"url":"git+https://github.com/emdzej/ncsx.git","type":"git","directory":"packages/pfl"},"_npmVersion":"11.16.0","description":"Parser/serializer for NCSEXPER .pfl profile files. Spec: ../../docs/pfl-format.md","directories":{},"_nodeVersion":"22.22.1","dependencies":{"@emdzej/inpax-ini-parser":"^0.11.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.8","@types/node":"^22.13.1"},"_npmOperationalInternal":{"tmp":"tmp/ncsx-pfl_0.8.0_1780758398614_0.43182152725449496","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@emdzej/ncsx-pfl","version":"0.9.0","description":"Parser/serializer for NCSEXPER .pfl profile files. Spec: ../../docs/pfl-format.md","main":"dist/index.js","types":"dist/index.d.ts","type":"module","dependencies":{"@emdzej/inpax-ini-parser":"^0.12.0"},"devDependencies":{"@types/node":"^22.13.1","vitest":"^2.1.8"},"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/emdzej/ncsx.git","directory":"packages/pfl"},"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-pfl@0.9.0","bugs":{"url":"https://github.com/emdzej/ncsx/issues"},"homepage":"https://github.com/emdzej/ncsx#readme","_integrity":"sha512-Xk8Ca/FZrht1hDB2sSOMQ2dLlGn/FNKDbPREMxMZfMrQ8a8fet0GFacuD3LKQLfNJmPnQ1QsZ+sTou82M20FFQ==","_resolved":"/private/var/folders/7h/x_w_580x4s9dq3sq11tpvzkwy3nbj8/T/c01348c29bab9b7ea590b7c599db68db/emdzej-ncsx-pfl-0.9.0.tgz","_from":"file:emdzej-ncsx-pfl-0.9.0.tgz","_nodeVersion":"22.22.1","_npmVersion":"11.16.0","dist":{"integrity":"sha512-Xk8Ca/FZrht1hDB2sSOMQ2dLlGn/FNKDbPREMxMZfMrQ8a8fet0GFacuD3LKQLfNJmPnQ1QsZ+sTou82M20FFQ==","shasum":"43256c2ef31c5343236929295e57c44a980a2b5a","tarball":"https://registry.npmjs.org/@emdzej/ncsx-pfl/-/ncsx-pfl-0.9.0.tgz","fileCount":19,"unpackedSize":43432,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQC3hiSaGHJKlxrWp0Ivj4/dXLnp/ci3bCTMtgs2II9TUwIgThWfwF+MV1A2GU08Es3yNctEZviVmEz7uGB/BIl9Qlo="}]},"_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-pfl_0.9.0_1783336550321_0.945218214547566"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-25T10:40:16.374Z","modified":"2026-07-06T11:15:50.624Z","0.4.0":"2026-05-25T10:40:16.733Z","0.5.1":"2026-05-27T10:07:09.190Z","0.6.0":"2026-05-28T15:13:53.276Z","0.7.0":"2026-05-29T13:56:39.570Z","0.8.0":"2026-06-06T15:06:38.748Z","0.9.0":"2026-07-06T11:15:50.503Z"},"bugs":{"url":"https://github.com/emdzej/ncsx/issues"},"homepage":"https://github.com/emdzej/ncsx#readme","repository":{"type":"git","url":"git+https://github.com/emdzej/ncsx.git","directory":"packages/pfl"},"description":"Parser/serializer for NCSEXPER .pfl profile files. Spec: ../../docs/pfl-format.md","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"readme":"# @emdzej/ncsx-pfl\n\nTyped parser + serializer for NCSEXPER `.pfl` **profile** files — the INI-style configs\nthat live under `C:\\NCSEXPER\\PFL\\` and that NCS Expert's \"Load profile\" menu picks up.\nBest known is `REVTOR.PFL`, the community profile that enables `CODIERDATEN_LESEN` and a\nfew other expert-mode options.\n\nSpec: [`../../docs/pfl-format.md`](../../docs/pfl-format.md).\n\n## What it does\n\n- Reads a `.pfl` text body into a typed `PflProfile` object (one TypeScript field per\n  documented INI key, with enums / numbers / booleans coerced correctly).\n- Bounds-checks Lesemodus and similar value-range enums.\n- Preserves opaque fields like `ProfilPruefsumme` as hex strings (the loader doesn't\n  verify it, and we don't either — see \"Why no checksum?\" below).\n- Round-trips byte-stable for unmodified profiles: section order, key order, and value\n  formatting all match what NCSEXPER itself writes.\n\n## Install\n\n```bash\npnpm add @emdzej/ncsx-pfl\n# or:\n\"@emdzej/ncsx-pfl\": \"workspace:*\"\n```\n\n## Quick start\n\n```ts\nimport { readFileSync, writeFileSync } from 'node:fs';\nimport { parsePfl, serializePfl } from '@emdzej/ncsx-pfl';\n\nconst raw = readFileSync('NCSEXPER/PFL/Expertenmodus.pfl', 'latin1');\nconst profile = parsePfl(raw);\n\nconsole.log(profile.header.bezeichnung);          // \"Expertenmodus 2.0\"\nconsole.log(profile.coding.fktSgCodieren);        // true\nconsole.log(profile.fgnrZcs.fgNrEingabeModus);    // 1\n\n// Modify a knob and write back:\nprofile.coding.fktCodierdatenLesen = true;\nwriteFileSync('out.pfl', serializePfl(profile), 'latin1');\n```\n\n## Profile sections\n\n| Section          | Type field           | What it controls                                     |\n|------------------|----------------------|------------------------------------------------------|\n| `[KOPF]`         | `PflHeader`          | Profile name / version / description                |\n| `[FGNR_ZCS]`     | `PflFgnrZcs`         | How VIN / ZCS / FA is sourced                       |\n| `[SGET]`         | `PflSget`            | SG-list filter overrides                            |\n| `[APPLIKATION]`  | `PflApplikation`     | UI defaults (which tab opens first, etc.)           |\n| `[CODIERUNG]`    | `PflCoding`          | Which jobs are enabled (CODIERDATEN_LESEN!)         |\n| `[ASW]`          | `PflAsw`             | ASW-edit dialog defaults                            |\n| `[FSWPSW]`       | `PflFswPsw`          | FSW/PSW-edit dialog defaults, Lesemodus enum        |\n| `[NETTODATEN]`   | `PflNettodaten`      | Nettodata-edit dialog defaults                      |\n| `[INDIVID]`      | `PflIndivid`         | Individual-coding flags                             |\n| `[VERIFIKATION]` | `PflVerifikation`    | `.ssd` script reference                             |\n\n## API\n\n| Export             | Purpose                                            |\n|--------------------|----------------------------------------------------|\n| `parsePfl(text)`   | Parse a `.pfl` body to a `PflProfile`              |\n| `serializePfl(p)`  | Serialize a `PflProfile` back to `.pfl` text       |\n| `PflProfile`       | The top-level type (re-exports all section types)  |\n\n### `parsePfl` options\n\n```ts\nparsePfl(raw, {\n  onWarning: (w: PflWarning) => { /* unknown section, out-of-range value, … */ },\n  strict: false, // default — warn rather than throw on unknown sections\n});\n```\n\n## Why no checksum?\n\n`ProfilPruefsumme` is parsed and preserved verbatim. NCSEXPER's profile loader doesn't\nverify it (confirmed via Ghidra against NCSEXPER 4.0.1's `coapiLoadProfil` — see\n[`docs/pfl-format.md`](../../docs/pfl-format.md) for the reverse-engineering notes). If\nyou want to round-trip-edit a profile and have NCSEXPER load it, you don't need to touch\nthe checksum.\n\nIf you want to mint a fresh profile programmatically, the checksum write-path is still\nopen. The community workaround is to copy an existing profile and edit the keys you care\nabout.\n\n## Related\n\n- [`@emdzej/inpax-ini-parser`](../../../inpax/packages/ini-parser/) — underlying INI parse.\n- Spec: [`../../docs/pfl-format.md`](../../docs/pfl-format.md).\n","readmeFilename":"README.md"}