{"_id":"@baclib/bacnet-asn1-parser","_rev":"4-6d8159ae52de7e5db3cbf3bfd923417b","name":"@baclib/bacnet-asn1-parser","dist-tags":{"latest":"3.0.1"},"versions":{"1.0.0":{"name":"@baclib/bacnet-asn1-parser","version":"1.0.0","keywords":["bacnet","asn1","parser"],"author":{"url":"https://github.com/baclib","name":"The BAClib Initiative","email":"baclib@mailbox.org"},"license":"BSD-2-Clause","_id":"@baclib/bacnet-asn1-parser@1.0.0","maintainers":[{"name":"the-baclib-initiative","email":"baclib@mailbox.org"}],"homepage":"https://github.com/baclib/bacnet-asn1-parser#readme","bugs":{"url":"https://github.com/baclib/bacnet-asn1-parser/issues"},"dist":{"shasum":"80432ff95575c4db1e8a02b8e9271875c2b05a6f","tarball":"https://registry.npmjs.org/@baclib/bacnet-asn1-parser/-/bacnet-asn1-parser-1.0.0.tgz","fileCount":50,"integrity":"sha512-rsdDZBCzPQQgcAMdnjgO4plo402kyf5bFTgL3nnl+7rq06r8b62FzPfJlGVpGa0HK9Q4mkZy0kQ6XtBCiWKMaA==","signatures":[{"sig":"MEQCIGCmYHZVTwpoRUN5PGLu3yheBL4jyggzi6Vp0sg1dRyzAiBms7X/FCK8DG7NyzGmGcSJNy+rzony8cyw2H4RYhWtwQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":45786},"main":"src/index.js","type":"module","engines":{"node":">=16.0.0"},"gitHead":"fcfd13d60d4215f4d1d64847bdab928799e63822","scripts":{"test":"node tests/test-suite.js"},"_npmUser":{"name":"the-baclib-initiative","email":"baclib@mailbox.org"},"repository":{"url":"git+https://github.com/baclib/bacnet-asn1-parser.git","type":"git"},"_npmVersion":"10.9.3","description":"Parse ASN.1 notation of BACnet data types","directories":{},"_nodeVersion":"22.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/bacnet-asn1-parser_1.0.0_1764069949132_0.14177086647273884","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@baclib/bacnet-asn1-parser","version":"2.0.0","keywords":["bacnet","asn1","parser"],"author":{"url":"https://github.com/baclib","name":"The BAClib Initiative","email":"baclib@mailbox.org"},"license":"EPL-2.0","_id":"@baclib/bacnet-asn1-parser@2.0.0","maintainers":[{"name":"the-baclib-initiative","email":"baclib@mailbox.org"}],"homepage":"https://github.com/baclib/bacnet-asn1-parser#readme","bugs":{"url":"https://github.com/baclib/bacnet-asn1-parser/issues"},"dist":{"shasum":"49c28747f3c356be71c568c4cfc4bb96af1e5b48","tarball":"https://registry.npmjs.org/@baclib/bacnet-asn1-parser/-/bacnet-asn1-parser-2.0.0.tgz","fileCount":90,"integrity":"sha512-3quQUdYq/IeSxYPRoa9tHJ4GoEOoz7OBR/5Spdpq9aHly738ViQt1pI46EtJ97EhcSCPdTk2X9Zvba4KBtgZ0g==","signatures":[{"sig":"MEYCIQDQ7z8SPNKAYuZvbZ68154MVFzHGwLgqczgZWIqlKU8KQIhANRyJy+B3OPRemz2NcdOeHfeIK44bJy/7R7E7kR0KoMb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":90044},"main":"src/index.js","type":"module","engines":{"node":">=16.0.0"},"gitHead":"93bf6a929f87c80d0074d77f3330bb30ebaae73a","scripts":{"test":"node test/test-suite.js"},"_npmUser":{"name":"the-baclib-initiative","email":"baclib@mailbox.org"},"repository":{"url":"git+https://github.com/baclib/bacnet-asn1-parser.git","type":"git"},"_npmVersion":"10.9.3","description":"Parse ASN.1 notation of BACnet data types","directories":{},"_nodeVersion":"22.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/bacnet-asn1-parser_2.0.0_1765525537997_0.9968373112015894","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@baclib/bacnet-asn1-parser","version":"3.0.0","keywords":["asn1","bacnet","building-automation","parser"],"author":{"url":"https://github.com/baclib","name":"The BAClib Initiative","email":"baclib@mailbox.org"},"license":"EPL-2.0","_id":"@baclib/bacnet-asn1-parser@3.0.0","maintainers":[{"name":"the-baclib-initiative","email":"baclib@mailbox.org"}],"homepage":"https://github.com/baclib/bacnet-asn1-parser#readme","bugs":{"url":"https://github.com/baclib/bacnet-asn1-parser/issues"},"dist":{"shasum":"25a73b0a0c6ea0aa7aaedee5c2d2b31a4cbc83a6","tarball":"https://registry.npmjs.org/@baclib/bacnet-asn1-parser/-/bacnet-asn1-parser-3.0.0.tgz","fileCount":44,"integrity":"sha512-fhDv4Mqht1JAW5ZZLmLA8vFBtBAJH9pHeGh2iB2T4gK4tl+epLxana1Prqj9cbcR9xOkS0Ehr7Hs1QrQee9cng==","signatures":[{"sig":"MEUCIHg6SBFooxgD1+GJ9alHhkH635fWQakQL89tEzEvQ/6UAiEAj8tN0RtfHWcfAQkg3/+TgPGdTkNFlSvmploOvAHyQSk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":73769},"main":"src/index.js","type":"module","engines":{"node":">=22"},"gitHead":"e0f2b7314d1f5b33887aefeaef0f92df4a4d5a7f","scripts":{"test":"node test/test-suite.js","regenerate":"node src/generate-predefined.js"},"_npmUser":{"name":"the-baclib-initiative","email":"baclib@mailbox.org"},"repository":{"url":"git+https://github.com/baclib/bacnet-asn1-parser.git","type":"git"},"_npmVersion":"10.9.3","description":"Parse ASN.1 notation of BACnet data types","directories":{},"_nodeVersion":"22.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/bacnet-asn1-parser_3.0.0_1768037655801_0.9323329174340163","host":"s3://npm-registry-packages-npm-production"}},"3.0.1":{"name":"@baclib/bacnet-asn1-parser","version":"3.0.1","description":"Parse ASN.1 notation of BACnet data types","type":"module","main":"src/index.js","scripts":{"regenerate":"node src/generate-predefined.js","test":"node test/test-suite.js"},"keywords":["asn1","bacnet","building-automation","parser"],"author":{"name":"The BAClib Initiative","email":"baclib@mailbox.org","url":"https://github.com/baclib"},"license":"EPL-2.0","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/baclib/bacnet-asn1-parser.git"},"bugs":{"url":"https://github.com/baclib/bacnet-asn1-parser/issues"},"homepage":"https://github.com/baclib/bacnet-asn1-parser#readme","engines":{"node":">=22"},"_id":"@baclib/bacnet-asn1-parser@3.0.1","gitHead":"32055fe537b4ef8d3b2d0c7a213dc563fc34af2a","_nodeVersion":"22.18.0","_npmVersion":"10.9.3","dist":{"integrity":"sha512-UCgPtj0nWui022Sp4RFspjOLa5ji3O2JCec0JnvJJ+1e7D2KXcbnh7eskK0I0uqjTMHx1gSST6auDHC9nyCfQg==","shasum":"a968f54ffc64535adc895c493af980d57f21820d","tarball":"https://registry.npmjs.org/@baclib/bacnet-asn1-parser/-/bacnet-asn1-parser-3.0.1.tgz","fileCount":45,"unpackedSize":73990,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQC6KZez5bLxfszQ17imYMx8LJJv3AOEFXOfF+5b0al+wgIgf0VhcoBlgGzOWsw/aD7ARo1ogU3CCEjdJsjdwdavfWA="}]},"_npmUser":{"name":"the-baclib-initiative","email":"baclib@mailbox.org"},"directories":{},"maintainers":[{"name":"the-baclib-initiative","email":"baclib@mailbox.org"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/bacnet-asn1-parser_3.0.1_1768648919725_0.5765806732913745"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-25T11:25:49.019Z","modified":"2026-01-17T11:22:00.007Z","1.0.0":"2025-11-25T11:25:49.334Z","2.0.0":"2025-12-12T07:45:38.194Z","3.0.0":"2026-01-10T09:34:15.953Z","3.0.1":"2026-01-17T11:21:59.867Z"},"bugs":{"url":"https://github.com/baclib/bacnet-asn1-parser/issues"},"author":{"name":"The BAClib Initiative","email":"baclib@mailbox.org","url":"https://github.com/baclib"},"license":"EPL-2.0","homepage":"https://github.com/baclib/bacnet-asn1-parser#readme","keywords":["asn1","bacnet","building-automation","parser"],"repository":{"type":"git","url":"git+https://github.com/baclib/bacnet-asn1-parser.git"},"description":"Parse ASN.1 notation of BACnet data types","maintainers":[{"name":"the-baclib-initiative","email":"baclib@mailbox.org"}],"readme":"# BACnet ASN.1 Parser\r\n\r\nA lightweight Node.js parser for ASN.1 notation of BACnet data types.\r\n\r\n## Features\r\n\r\n- ✅ **Parse** ASN.1 definitions of BACnet data types into structured objects\r\n- ✅ **Normalize** parsed definitions into BAClib-compliant kebab-case format\r\n- ✅ **Predefined types** library with standard BACnet primitive types\r\n- ✅ Support for ENUMERATED, SEQUENCE, CHOICE, BIT STRING, OCTET STRING\r\n- ✅ Handle APPLICATION tags and context-specific tags\r\n- ✅ Range and size constraints with MIN/MAX keywords\r\n- ✅ OPTIONAL fields and extensibility markers\r\n- ✅ ASN.1 comment preservation as inline documentation\r\n- ✅ Proprietary range detection for extensible enumerations\r\n- ✅ Production-ready with comprehensive error handling and line-number tracking\r\n\r\n## Installation\r\n\r\n```bash\r\nnpm install\r\n```\r\n\r\n## Usage\r\n\r\n### Parse and Normalize ASN.1 Content\r\n\r\n```javascript\r\nimport { parse, normalize, ParserError } from './src/index.js';\r\n\r\nconst asn1 = `TriState ::= ENUMERATED {\r\n    off (0),\r\n    on (1),\r\n    auto (2)\r\n}`;\r\n\r\ntry {\r\n    // Parse ASN.1 into raw definition objects\r\n    const definitions = parse(asn1);\r\n    console.log('Parsed:', definitions);\r\n    \r\n    // Normalize to BAClib format with predefined type checking\r\n    const normalized = definitions.map(def => normalize(def));\r\n    console.log('Normalized:', normalized);\r\n} catch (error) {\r\n    if (error instanceof ParserError) {\r\n        console.error(`Parse error at line ${error.line}: ${error.message}`);\r\n    }\r\n}\r\n```\r\n\r\n### Parse ASN.1 File\r\n\r\n```javascript\r\nimport { parse } from './src/index.js';\r\nimport fs from 'fs';\r\n\r\n// Parse ASN.1 content\r\nconst asn1Content = fs.readFileSync('input.asn1', 'utf8');\r\nconst definitions = parse(asn1Content);\r\n\r\nconsole.log(definitions);\r\n```\r\n\r\n## Project Structure\r\n\r\n```\r\nbacnet-asn1-parser/\r\n├── src/\r\n│   ├── index.js                  # Main parser and normalization engine\r\n│   ├── to-baclib-name.js         # Name conversion utility (PascalCase -> kebab-case)\r\n│   ├── generate-predefined.js    # Script to generate predefined type definitions\r\n│   └── predefined-abstract.json  # Abstract specifications for predefined types\r\n├── predefined/\r\n│   ├── unsigned.json             # Predefined type definitions (auto-generated)\r\n│   ├── integer.json\r\n│   ├── bit-string.json\r\n│   └── ...                       # 30+ predefined BACnet primitive types\r\n└── README.md\r\n```\r\n\r\n## ASN.1 Support\r\n\r\nSupported constructs:\r\n- ✅ APPLICATION tags\r\n- ✅ SEQUENCE types with ordered fields\r\n- ✅ SEQUENCE OF and SEQUENCE SIZE OF\r\n- ✅ OPTIONAL fields\r\n- ✅ CHOICE types with alternative fields\r\n- ✅ OCTET STRING\r\n- ✅ ENUMERATED types with named values\r\n- ✅ BIT STRING with named bits\r\n- ✅ Type references\r\n- ✅ Context-specific tags\r\n- ✅ Range constraints (MIN..MAX)\r\n- ✅ Size constraints\r\n- ✅ Extensibility markers (...)\r\n\r\nExample input:\r\n```asn1\r\nTriState ::= ENUMERATED {\r\n    off (0),\r\n    on (1),\r\n    auto (2)\r\n}\r\n\r\nBACnetObjectIdentifier ::= [APPLICATION 12] OCTETSTRING (SIZE(4))\r\n```\r\n\r\n## Output Formats\r\n\r\n### Parsed Format (Raw ASN.1 Structure)\r\n\r\nThe `parse()` function returns ASN.1 definitions in their raw parsed form:\r\n\r\n```javascript\r\n[\r\n    {\r\n        name: 'TriState',\r\n        type: 'Enumerated',\r\n        items: [\r\n            { name: 'off', number: 0 },\r\n            { name: 'on', number: 1 },\r\n            { name: 'auto', number: 2 }\r\n        ]\r\n    }\r\n]\r\n```\r\n\r\n### Normalized Format (BAClib-Compliant)\r\n\r\nThe `normalize()` function converts to BAClib kebab-case format with enhanced metadata:\r\n\r\n```javascript\r\n[\r\n  {\r\n    name: 'tri-state',\r\n    type: {\r\n      base: 'enumerated',\r\n      values: [\r\n        { name: 'off', constant: 0 },\r\n        { name: 'on', constant: 1 },\r\n        { name: 'auto', constant: 2 }\r\n      ]\r\n    }\r\n  }\r\n]\r\n```\r\n\r\n### Predefined Types\r\n\r\nPredefined types are automatically recognized and returned from the predefined library:\r\n\r\n```javascript\r\nimport { normalize, predefinedTypes } from './src/index.js';\r\n\r\n// Access predefined types directly\r\nconst unsigned8 = predefinedTypes.get('Unsigned8');\r\n// Returns: { alias: 'Unsigned8', name: 'unsigned-8', type: 'unsigned', minimum: 0, maximum: 255 }\r\n\r\n// Or by normalized name\r\nconst real = predefinedTypes.get('real');\r\n// Returns: { name: 'real', primitive: 4, minimum: -3.4e38, maximum: 3.4e38 }\r\n```\r\n\r\n## API Reference\r\n\r\n### parse(content)\r\nParse ASN.1 content string into raw definition objects.\r\n\r\n**Parameters:**\r\n- `content` (string): ASN.1 notation to parse\r\n\r\n**Returns:** Array of definition objects with original ASN.1 names and structure\r\n\r\n**Throws:** `ParserError` if parsing fails (includes line number)\r\n\r\n**Example:**\r\n```javascript\r\nconst definitions = parse('Unsigned ::= Unsigned (0..255)');\r\n// Returns: [{ name: 'Unsigned', type: 'Unsigned', range: { min: 0, max: 255 } }]\r\n```\r\n\r\n### normalize(definition)\r\nNormalize a parsed definition into BAClib-compliant format.\r\n\r\nChecks against predefined types first; if found, returns the predefined version.\r\nOtherwise, normalizes the definition by:\r\n- Converting names to kebab-case\r\n- Structuring types with base and traits\r\n- Adding proprietary range information for extensible types\r\n- Sorting enumeration values by constant number\r\n\r\n**Parameters:**\r\n- `definition` (object): A single parsed definition object\r\n\r\n**Returns:** Normalized definition with kebab-case names and structured types\r\n\r\n**Example:**\r\n```javascript\r\nconst parsed = parse('Unsigned8 ::= Unsigned (0..255)')[0];\r\nconst normalized = normalize(parsed);\r\n// Returns: { name: 'unsigned-8', type: { base: 'unsigned', minimum: 0, maximum: 255 } }\r\n```\r\n\r\n### predefinedTypes\r\nMap containing all predefined BACnet/BAClib type definitions.\r\n\r\nTypes can be accessed by either their original name (e.g., 'Unsigned8') or\r\nnormalized name (e.g., 'unsigned-8').\r\n\r\n**Type:** `Map<string|number, Object>`\r\n\r\n**Example:**\r\n```javascript\r\nimport { predefinedTypes } from './src/index.js';\r\n\r\n// Access by original name\r\nconst uint8 = predefinedTypes.get('Unsigned8');\r\n\r\n// Access by normalized name  \r\nconst boolean = predefinedTypes.get('boolean');\r\n\r\n// Check if type is predefined\r\nif (predefinedTypes.has('Real')) {\r\n  console.log('Real is a predefined type');\r\n}\r\n```\r\n\r\n### toBaclibName(string, prefix)\r\nConvert BACnet names to BAClib kebab-case format.\r\n\r\n**Parameters:**\r\n- `string` (string): The name to convert\r\n- `prefix` (boolean|string|number): Controls \"BACnet\" prefix handling\r\n  - `false`: Remove \"BACnet\" prefix\r\n  - `true`: Replace with \"0-\"\r\n  - `string`: Replace with custom prefix\r\n  - `undefined`: Keep as \"bacnet\"\r\n\r\n**Returns:** Kebab-case name string\r\n\r\n**Example:**\r\n```javascript\r\nimport { toBaclibName } from './src/to-baclib-name.js';\r\n\r\ntoBaclibName('BACnetPropertyReference', false);  // 'property-reference'\r\ntoBaclibName('Unsigned16');                      // 'unsigned-16'\r\ntoBaclibName('HTTPResponse');                    // 'http-response'\r\n```\r\n\r\n### generatePredefined()\r\nGenerate normalized predefined type definitions from abstract specifications.\r\n\r\nThis function is used by the `generate-predefined.js` script to create the\r\npredefined type JSON files. It reads from `predefined-abstract.json` and\r\ntransforms abstract type specs into normalized definitions.\r\n\r\n**Returns:** Array of normalized predefined type definitions\r\n\r\n**Example:**\r\n```javascript\r\nimport { generatePredefined } from './src/generate-predefined.js';\r\n\r\nconst types = generatePredefined();\r\n// Returns array of all predefined types with normalized names and constraints\r\n```\r\n\r\n### ParserError\r\nCustom error class for ASN.1 parsing errors with line number tracking.\r\n\r\n**Properties:**\r\n- `message` (string): Error description\r\n- `name` (string): Always 'ParserError'\r\n- `line` (number): Line number where error occurred (1-indexed)\r\n\r\n**Example:**\r\n```javascript\r\ntry {\r\n  parse('Invalid ::= SOMETHING');\r\n} catch (error) {\r\n  if (error instanceof ParserError) {\r\n    console.error(`Error at line ${error.line}: ${error.message}`);\r\n  }\r\n}\r\n```\r\n\r\n## Use Cases\r\n\r\n1. **BACnet Protocol Development**: Parse and normalize standard ASN.1 definitions into structured, consistent format\r\n2. **Code Generation**: Use normalized definitions to generate type-safe code in TypeScript, C++, Python, etc.\r\n3. **Protocol Analysis**: Extract metadata including proprietary ranges, constraints, and documentation from ASN.1\r\n4. **API Documentation**: Generate comprehensive API docs from ASN.1 specifications with preserved comments\r\n5. **Validation Tools**: Build validators using parsed range constraints and type information\r\n6. **Schema Conversion**: Transform BACnet ASN.1 to JSON Schema, OpenAPI, or other schema formats\r\n7. **Type Libraries**: Build runtime type libraries with kebab-case naming for modern frameworks\r\n\r\n## License\r\n\r\nCopyright 2024-2026, The BAClib Initiative and Contributors\r\n\r\nAll project files are provided under the terms of the [Eclipse Public License - v 2.0](https://www.eclipse.org/legal/epl-2.0/).\r\n\r\nAdditionally the corresponding [SPDX Identifier `EPL-2.0`](https://spdx.org/licenses/EPL-2.0.html) is placed in all relevant files to clearly indicate the project license.\r\n\r\n> [!NOTE]\r\n> The Eclipse Public License 2.0 (EPL-2.0) is a business-friendly open source license. It allows integration into commercial software without requiring disclosure of proprietary material.\r\n","readmeFilename":"README.md"}