{"_id":"@dracoe/tail-number-gen","_rev":"2-ae0821b614e3a8d4a9aad06ddd78caf0","name":"@dracoe/tail-number-gen","dist-tags":{"latest":"1.0.3"},"versions":{"1.0.0":{"name":"@dracoe/tail-number-gen","version":"1.0.0","license":"MIT","_id":"@dracoe/tail-number-gen@1.0.0","maintainers":[{"name":"patrick_dracoe","email":"patrick_r@dracoe.uk"}],"dist":{"shasum":"92158b96edd085f1abaecf82df0650f6f838d63e","tarball":"https://registry.npmjs.org/@dracoe/tail-number-gen/-/tail-number-gen-1.0.0.tgz","fileCount":4,"integrity":"sha512-XtxH7l53ysk7d1KkcXJIA4LaLMUM2bRl2J042fsdta1D9xVsF1LngUVvUayc7Ladj7dLgANoj4yXf2h6GBqCWQ==","signatures":[{"sig":"MEUCIDu8IvpzuN/DWWGKIzTkgpR++kkz+nYI83CZF4c1PcyYAiEAqNxGiMJgwzXbz1Oq998gS0gxz+s5G2f9H4N5pGfZOKY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2318},"main":"index.js","gitHead":"9307b92afdf9671feffcc6d172be213d71cb1d7e","scripts":{"test":"node test.js"},"_npmUser":{"name":"patrick_dracoe","email":"patrick_r@dracoe.uk"},"_npmVersion":"10.9.8","description":"UID to visual tail number (F11 flight-controller convention)","directories":{},"_nodeVersion":"22.23.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/tail-number-gen_1.0.0_1786640325083_0.7161524826206427","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@dracoe/tail-number-gen","version":"1.0.3","description":"UID to visual tail number (F11 flight-controller convention)","main":"index.js","scripts":{"test":"node test.js"},"types":"index.d.ts","license":"MIT","_id":"@dracoe/tail-number-gen@1.0.3","gitHead":"e4523b9d9dc08636f264554dda825b1f8fb15242","_nodeVersion":"22.23.1","_npmVersion":"10.9.8","dist":{"integrity":"sha512-npqFZbAk/crSyE4U9FBcNx+W6oVOMPw7z38sYb3jDjoeV8wQ/1ZYkIjdA4Mkx6xsSPRI2cVXgnj2eSx45F0H+g==","shasum":"a79a62b42b22b5cb9898f0c70fa586410ca1a770","tarball":"https://registry.npmjs.org/@dracoe/tail-number-gen/-/tail-number-gen-1.0.3.tgz","fileCount":5,"unpackedSize":2641,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIH8DapOvK59QrmrpX06LzNOtegTNVyN5Pr4moOqM91zxAiBIRIrucOb3EBidHonE7RZVmFe4q+CtumFn0x+0fw7kEQ=="}]},"_npmUser":{"name":"patrick_dracoe","email":"patrick_r@dracoe.uk"},"directories":{},"maintainers":[{"name":"patrick_dracoe","email":"patrick_r@dracoe.uk"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/tail-number-gen_1.0.3_1786641582500_0.7100257941934056"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-13T16:58:44.912Z","modified":"2026-08-13T17:19:42.854Z","1.0.0":"2026-08-13T16:58:45.222Z","1.0.3":"2026-08-13T17:19:42.664Z"},"license":"MIT","description":"UID to visual tail number (F11 flight-controller convention)","maintainers":[{"name":"patrick_dracoe","email":"patrick_r@dracoe.uk"}],"readme":"# @dracoe/tail-number-gen\n\nConverts a hex UID to a 6-character visual tail number. Identical output to the C, Go, and Python implementations in the same family.\n\n## Install\n\n```\nnpm install @patrick_dracoe/tail-number-gen\n```\n\n## Usage\n\n```js\nconst { uidToTail } = require('@patrick_dracoe/tail-number-gen');\n\nuidToTail('1A2B3C4D5E6F7081');             // '3Z4P18'\nuidToTail('1A2B3C4D-5E6F7081-9A2B3C4D');  // spaces and hyphens stripped\nuidToTail('a1b2c3d4');                     // case-insensitive\n```\n\nTypeScript types are included.\n\n## API\n\n### `uidToTail(uid: string): string`\n\nAccepts 1–36 hex characters. Spaces and hyphens are ignored. Short UIDs are left-padded with zeros.\n\nThrows `Error` if the UID is empty or contains non-hex characters.\n\n## Algorithm\n\n1. Strip spaces/hyphens, uppercase, left-pad to 36 hex digits\n2. SHA-256 the normalized ASCII string\n3. Take the first 4 bytes as a big-endian uint32\n4. Reduce mod 34⁶, base-34 encode to 6 characters (alphabet excludes I and O)\n\nNo dependencies — uses Node's built-in `crypto` module.\n","readmeFilename":"README.md"}