@smonn/ids 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/README.md +125 -20
  2. package/dist/adapter-types-BY-wrYYB.mjs +27 -0
  3. package/dist/adapter-types-BY-wrYYB.mjs.map +1 -0
  4. package/dist/adapter-types-unUcmMXC.d.mts +20 -0
  5. package/dist/adapter-types-unUcmMXC.d.mts.map +1 -0
  6. package/dist/cli.mjs +213 -47
  7. package/dist/cli.mjs.map +1 -1
  8. package/dist/{codec-shell-DH-UO4UR.mjs → codec-shell-C7_B4oum.mjs} +4 -3
  9. package/dist/codec-shell-C7_B4oum.mjs.map +1 -0
  10. package/dist/{drizzle-CeSni5PB.d.mts → drizzle-CHtyDXpv.d.mts} +4 -15
  11. package/dist/drizzle-CHtyDXpv.d.mts.map +1 -0
  12. package/dist/drizzle.d.mts +3 -2
  13. package/dist/drizzle.mjs +2 -3
  14. package/dist/drizzle.mjs.map +1 -1
  15. package/dist/express.d.mts +2 -5
  16. package/dist/express.d.mts.map +1 -1
  17. package/dist/express.mjs +3 -8
  18. package/dist/express.mjs.map +1 -1
  19. package/dist/fastify.d.mts +2 -5
  20. package/dist/fastify.d.mts.map +1 -1
  21. package/dist/fastify.mjs +3 -8
  22. package/dist/fastify.mjs.map +1 -1
  23. package/dist/hono.d.mts +2 -5
  24. package/dist/hono.d.mts.map +1 -1
  25. package/dist/hono.mjs +3 -8
  26. package/dist/hono.mjs.map +1 -1
  27. package/dist/index.mjs +1 -1
  28. package/dist/key-material-DUHhmMq-.mjs +137 -0
  29. package/dist/key-material-DUHhmMq-.mjs.map +1 -0
  30. package/dist/kysely.d.mts +1 -1
  31. package/dist/kysely.d.mts.map +1 -1
  32. package/dist/{opaque-uvjOFY_0.mjs → opaque-BQOlZ2oD.mjs} +8 -44
  33. package/dist/opaque-BQOlZ2oD.mjs.map +1 -0
  34. package/dist/opaque.d.mts +8 -0
  35. package/dist/opaque.d.mts.map +1 -1
  36. package/dist/opaque.mjs +1 -1
  37. package/dist/prisma.d.mts +3 -16
  38. package/dist/prisma.d.mts.map +1 -1
  39. package/dist/prisma.mjs +2 -3
  40. package/dist/prisma.mjs.map +1 -1
  41. package/dist/{reverse-BgFU6JHw.mjs → reverse-C12D1btB.mjs} +4 -6
  42. package/dist/reverse-C12D1btB.mjs.map +1 -0
  43. package/dist/reverse.d.mts.map +1 -1
  44. package/dist/reverse.mjs +1 -1
  45. package/dist/rng-CPJOx_nE.mjs +9 -0
  46. package/dist/rng-CPJOx_nE.mjs.map +1 -0
  47. package/dist/signed-CwqKTFaQ.mjs +207 -0
  48. package/dist/signed-CwqKTFaQ.mjs.map +1 -0
  49. package/dist/signed.d.mts.map +1 -1
  50. package/dist/signed.mjs +1 -255
  51. package/dist/{timestamp-B5_UCzc6.mjs → timestamp-BjIMQkJf.mjs} +3 -3
  52. package/dist/{timestamp-B5_UCzc6.mjs.map → timestamp-BjIMQkJf.mjs.map} +1 -1
  53. package/dist/{timestamp-bytes-BBY7JI33.mjs → timestamp-bytes-Bbg6Y66Z.mjs} +2 -2
  54. package/dist/{timestamp-bytes-BBY7JI33.mjs.map → timestamp-bytes-Bbg6Y66Z.mjs.map} +1 -1
  55. package/dist/{wrapped-0vL72Nje.mjs → wrapped-DKOsN_dq.mjs} +16 -50
  56. package/dist/wrapped-DKOsN_dq.mjs.map +1 -0
  57. package/dist/wrapped.d.mts.map +1 -1
  58. package/dist/wrapped.mjs +1 -1
  59. package/package.json +1 -1
  60. package/dist/adapter-types-oHCCSgOO.d.mts +0 -12
  61. package/dist/adapter-types-oHCCSgOO.d.mts.map +0 -1
  62. package/dist/bytes-lhzKVaBV.mjs +0 -53
  63. package/dist/bytes-lhzKVaBV.mjs.map +0 -1
  64. package/dist/codec-shell-DH-UO4UR.mjs.map +0 -1
  65. package/dist/drizzle-CeSni5PB.d.mts.map +0 -1
  66. package/dist/opaque-uvjOFY_0.mjs.map +0 -1
  67. package/dist/reverse-BgFU6JHw.mjs.map +0 -1
  68. package/dist/signed.mjs.map +0 -1
  69. package/dist/wrapped-0vL72Nje.mjs.map +0 -1
package/dist/cli.mjs CHANGED
@@ -1,9 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import { n as isIdsError } from "./error-Cp5qYZcv.mjs";
3
- import { t as createTimestampId } from "./timestamp-B5_UCzc6.mjs";
4
- import { i as importOpaqueKey, n as decodeOpaqueKey, r as encodeOpaqueKey, t as createOpaqueTimestampId } from "./opaque-uvjOFY_0.mjs";
5
- import { t as createReverseTimestampId } from "./reverse-BgFU6JHw.mjs";
6
- import { i as importWrappingKey, n as decodeWrappingKey, r as encodeWrappingKey, t as createWrappedKeyId } from "./wrapped-0vL72Nje.mjs";
3
+ import { t as createTimestampId } from "./timestamp-BjIMQkJf.mjs";
4
+ import { i as importOpaqueKey, n as decodeOpaqueKey, r as encodeOpaqueKey, t as createOpaqueTimestampId } from "./opaque-BQOlZ2oD.mjs";
5
+ import { t as createReverseTimestampId } from "./reverse-C12D1btB.mjs";
6
+ import { i as importSigningKey, n as decodeSigningKey, r as encodeSigningKey, t as createSignedTimestampId } from "./signed-CwqKTFaQ.mjs";
7
+ import { i as importWrappingKey, n as decodeWrappingKey, r as encodeWrappingKey, t as createWrappedKeyId } from "./wrapped-DKOsN_dq.mjs";
7
8
  //#region src/cli/codec-options.ts
8
9
  function codecOpts(opts) {
9
10
  const o = { allowDuplicateBrand: true };
@@ -26,6 +27,14 @@ function formatWrappedInspectOutput(result) {
26
27
  ""
27
28
  ].join("\n");
28
29
  }
30
+ function formatSignedInspectOutput(result) {
31
+ const relative = formatRelative(result.timestamp.getTime(), result.nowMs);
32
+ const inputLine = describeInputForm(result.input, result.canonical);
33
+ const lines = [`brand: ${result.brand}`, `timestamp: ${result.timestamp.toISOString()} (${relative})`];
34
+ if (result.verification !== void 0) lines.push(`verification: ${result.verification}`);
35
+ lines.push(`canonical: ${result.canonical}`, `input: ${inputLine}`, "");
36
+ return lines.join("\n");
37
+ }
29
38
  function formatInspectOutput(result) {
30
39
  const relative = formatRelative(result.timestamp.getTime(), result.nowMs);
31
40
  const inputLine = describeInputForm(result.input, result.canonical);
@@ -108,7 +117,7 @@ function splitFlags(args) {
108
117
  for (let i = 0; i < args.length; i++) {
109
118
  const raw = args[i];
110
119
  const { flag, inlineValue } = splitFlagToken(raw);
111
- if (flag === "--opaque" || flag === "--wrapped" || flag === "--reverse") {
120
+ if (flag === "--opaque" || flag === "--wrapped" || flag === "--reverse" || flag === "--signed") {
112
121
  addFlag(flag);
113
122
  if (inlineValue !== void 0) errors.push(`flag does not take a value: ${flag}`);
114
123
  continue;
@@ -151,6 +160,7 @@ const knownFlags = new Set([
151
160
  "--opaque",
152
161
  "--wrapped",
153
162
  "--reverse",
163
+ "--signed",
154
164
  "--kind",
155
165
  "--key-format",
156
166
  "--count",
@@ -189,40 +199,71 @@ function isKindError(result) {
189
199
  return result !== "u32" && result !== "i32" && result !== "u64" && result !== "i64";
190
200
  }
191
201
  //#endregion
192
- //#region src/cli/opaque-key.ts
202
+ //#region src/cli/key-io.ts
193
203
  function isKeyFormatError(result) {
194
204
  return result !== "hex" && result !== "base64url";
195
205
  }
196
- function parseKeyFormatFlag$1(values) {
206
+ function parseKeyFormatFlag(values) {
197
207
  const fromFlag = values.get("--key-format");
198
208
  if (fromFlag === void 0) return void 0;
199
209
  if (fromFlag === "") return "--key-format requires a value";
200
210
  if (fromFlag === "hex" || fromFlag === "base64url") return fromFlag;
201
211
  return `--key-format must be hex or base64url, got '${fromFlag}'`;
202
212
  }
203
- function parseKeygenFormat(values) {
204
- const fromFlag = parseKeyFormatFlag$1(values);
213
+ function parseKeyFormatFromFlag(values) {
214
+ const fromFlag = parseKeyFormatFlag(values);
205
215
  if (fromFlag === void 0) return "hex";
206
216
  return fromFlag;
207
217
  }
208
- function parseOpaqueKeyFormat(values, opts) {
209
- const fromFlag = parseKeyFormatFlag$1(values);
218
+ function parseKeyFormat(values, opts, facet) {
219
+ const fromFlag = parseKeyFormatFlag(values);
210
220
  if (fromFlag !== void 0) return fromFlag;
211
- const fromEnv = (opts.env ?? process.env).IDS_KEY_FORMAT;
221
+ const fromEnv = (opts.env ?? process.env)[facet.formatEnvVar];
212
222
  if (fromEnv === void 0 || fromEnv === "") return "hex";
213
223
  if (fromEnv === "hex" || fromEnv === "base64url") return fromEnv;
214
- return `IDS_KEY_FORMAT must be hex or base64url, got '${fromEnv}'`;
224
+ return `${facet.formatEnvVar} must be hex or base64url, got '${fromEnv}'`;
215
225
  }
216
- async function loadOpaqueKey(opts, format) {
217
- const raw = (opts.env ?? process.env).IDS_KEY;
218
- if (raw === void 0 || raw === "") return "missing IDS_KEY environment variable";
226
+ async function loadKey(opts, format, facet) {
227
+ const raw = (opts.env ?? process.env)[facet.envVar];
228
+ if (raw === void 0 || raw === "") return `missing ${facet.envVar} environment variable`;
219
229
  try {
220
- return importOpaqueKey(decodeOpaqueKey(raw, format));
230
+ return await facet.import(facet.decode(raw, format));
221
231
  } catch (err) {
222
232
  return err.message;
223
233
  }
224
234
  }
225
235
  //#endregion
236
+ //#region src/cli/opaque-key.ts
237
+ const opaqueFacet = {
238
+ envVar: "IDS_KEY",
239
+ formatEnvVar: "IDS_KEY_FORMAT",
240
+ decode: decodeOpaqueKey,
241
+ import: importOpaqueKey
242
+ };
243
+ function parseKeygenFormat(values) {
244
+ return parseKeyFormatFromFlag(values);
245
+ }
246
+ function parseOpaqueKeyFormat(values, opts) {
247
+ return parseKeyFormat(values, opts, opaqueFacet);
248
+ }
249
+ async function loadOpaqueKey(opts, format) {
250
+ return loadKey(opts, format, opaqueFacet);
251
+ }
252
+ //#endregion
253
+ //#region src/cli/signing-key.ts
254
+ const signingFacet = {
255
+ envVar: "IDS_SIGNING_KEY",
256
+ formatEnvVar: "IDS_SIGNING_KEY_FORMAT",
257
+ decode: decodeSigningKey,
258
+ import: importSigningKey
259
+ };
260
+ function parseSigningKeyFormat(values, opts) {
261
+ return parseKeyFormat(values, opts, signingFacet);
262
+ }
263
+ async function loadSigningKey(opts, format) {
264
+ return loadKey(opts, format, signingFacet);
265
+ }
266
+ //#endregion
226
267
  //#region src/cli/commands/generate.ts
227
268
  function runGenerate(args, opts) {
228
269
  const { flags, values, positionals, errors } = splitFlags(args);
@@ -231,6 +272,7 @@ function runGenerate(args, opts) {
231
272
  "-c",
232
273
  "--opaque",
233
274
  "--reverse",
275
+ "--signed",
234
276
  "--key-format"
235
277
  ]));
236
278
  if (unsupported !== void 0) {
@@ -254,12 +296,21 @@ function runGenerate(args, opts) {
254
296
  }
255
297
  const opaque = flags.has("--opaque");
256
298
  const reverse = flags.has("--reverse");
299
+ const signed = flags.has("--signed");
257
300
  if (reverse && opaque) {
258
301
  opts.stderr("cannot use --reverse and --opaque together\n");
259
302
  return Promise.resolve(1);
260
303
  }
261
- if (!opaque && flags.has("--key-format")) {
262
- opts.stderr("--key-format requires --opaque\n");
304
+ if (signed && opaque) {
305
+ opts.stderr("cannot use --signed and --opaque together\n");
306
+ return Promise.resolve(1);
307
+ }
308
+ if (signed && reverse) {
309
+ opts.stderr("cannot use --signed and --reverse together\n");
310
+ return Promise.resolve(1);
311
+ }
312
+ if (!opaque && !signed && flags.has("--key-format")) {
313
+ opts.stderr("--key-format requires --opaque or --signed\n");
263
314
  return Promise.resolve(1);
264
315
  }
265
316
  if (opaque) {
@@ -270,6 +321,14 @@ function runGenerate(args, opts) {
270
321
  }
271
322
  return runOpaqueGenerate(brand ?? "", count, format, opts);
272
323
  }
324
+ if (signed) {
325
+ const format = parseSigningKeyFormat(values, opts);
326
+ if (isKeyFormatError(format)) {
327
+ opts.stderr(format + "\n");
328
+ return Promise.resolve(1);
329
+ }
330
+ return runSignedGenerate(brand ?? "", count, format, opts);
331
+ }
273
332
  if (reverse) {
274
333
  let codec;
275
334
  try {
@@ -310,31 +369,39 @@ async function runOpaqueGenerate(brand, count, format, opts) {
310
369
  for (let i = 0; i < count; i++) opts.stdout(await codec.generate() + "\n");
311
370
  return 0;
312
371
  }
372
+ async function runSignedGenerate(brand, count, format, opts) {
373
+ const keyResult = await loadSigningKey(opts, format);
374
+ if (typeof keyResult === "string") {
375
+ opts.stderr(keyResult + "\n");
376
+ return 1;
377
+ }
378
+ let codec;
379
+ try {
380
+ codec = createSignedTimestampId(brand, {
381
+ keys: [keyResult],
382
+ allowDuplicateBrand: true,
383
+ ...codecOpts(opts)
384
+ });
385
+ } catch (err) {
386
+ opts.stderr(formatCliError(err) + "\n");
387
+ return 1;
388
+ }
389
+ for (let i = 0; i < count; i++) opts.stdout(await codec.generate() + "\n");
390
+ return 0;
391
+ }
313
392
  //#endregion
314
393
  //#region src/cli/wrapping-key.ts
315
- function parseKeyFormatFlag(values) {
316
- const fromFlag = values.get("--key-format");
317
- if (fromFlag === void 0) return void 0;
318
- if (fromFlag === "") return "--key-format requires a value";
319
- if (fromFlag === "hex" || fromFlag === "base64url") return fromFlag;
320
- return `--key-format must be hex or base64url, got '${fromFlag}'`;
321
- }
394
+ const wrappingFacet = {
395
+ envVar: "IDS_WRAPPING_KEY",
396
+ formatEnvVar: "IDS_WRAPPING_KEY_FORMAT",
397
+ decode: decodeWrappingKey,
398
+ import: importWrappingKey
399
+ };
322
400
  function parseWrappingKeyFormat(values, opts) {
323
- const fromFlag = parseKeyFormatFlag(values);
324
- if (fromFlag !== void 0) return fromFlag;
325
- const fromEnv = (opts.env ?? process.env).IDS_WRAPPING_KEY_FORMAT;
326
- if (fromEnv === void 0 || fromEnv === "") return "hex";
327
- if (fromEnv === "hex" || fromEnv === "base64url") return fromEnv;
328
- return `IDS_WRAPPING_KEY_FORMAT must be hex or base64url, got '${fromEnv}'`;
401
+ return parseKeyFormat(values, opts, wrappingFacet);
329
402
  }
330
403
  async function loadWrappingKey(opts, format) {
331
- const raw = (opts.env ?? process.env).IDS_WRAPPING_KEY;
332
- if (raw === void 0 || raw === "") return "missing IDS_WRAPPING_KEY environment variable";
333
- try {
334
- return importWrappingKey(decodeWrappingKey(raw, format));
335
- } catch (err) {
336
- return err.message;
337
- }
404
+ return loadKey(opts, format, wrappingFacet);
338
405
  }
339
406
  //#endregion
340
407
  //#region src/cli/usage.ts
@@ -343,19 +410,23 @@ function usage() {
343
410
  "Usage: ids <subcommand> [args]",
344
411
  "",
345
412
  "Subcommands:",
346
- " inspect, i <id> [--opaque] [--wrapped --kind u32|i32|u64|i64] [--reverse] [--key-format hex|base64url]",
413
+ " inspect, i <id> [--opaque] [--wrapped --kind u32|i32|u64|i64] [--reverse] [--signed] [--key-format hex|base64url]",
347
414
  " Decode an ID and print brand, timestamp (or lookup key), and canonical form.",
348
415
  " --opaque reads the AES key from IDS_KEY (hex by default; IDS_KEY_FORMAT or --key-format).",
349
416
  " --wrapped reads the wrapping key from IDS_WRAPPING_KEY (hex by default; IDS_WRAPPING_KEY_FORMAT or --key-format).",
350
417
  " --kind is required with --wrapped: u32, i32, u64, or i64.",
351
418
  " --reverse decodes a Reverse Timestamp ID (newest-first sort order).",
352
- " generate, g <brand> [--count, -c N] [--opaque] [--reverse] [--key-format hex|base64url]",
419
+ " --signed decodes a Signed Timestamp ID; reads signing key from IDS_SIGNING_KEY (hex by default; IDS_SIGNING_KEY_FORMAT or --key-format).",
420
+ " Without IDS_SIGNING_KEY, --signed prints the timestamp only (no verification). With IDS_SIGNING_KEY, prints verification: ok or failed.",
421
+ " generate, g <brand> [--count, -c N] [--opaque] [--reverse] [--signed] [--key-format hex|base64url]",
353
422
  ` Mint 1..${maxGenerateCount} canonical IDs for the given brand.`,
354
423
  " --opaque reads the AES key from IDS_KEY (hex by default; IDS_KEY_FORMAT or --key-format).",
355
424
  " --reverse mints Reverse Timestamp IDs (newest-first sort order).",
356
- " keygen, k [--wrapped] [--bits 128|192|256] [--key-format hex|base64url]",
357
- " Emit a random AES key for importOpaqueKey (stdout only).",
425
+ " --signed mints Signed Timestamp IDs; reads signing key from IDS_SIGNING_KEY (hex by default; IDS_SIGNING_KEY_FORMAT or --key-format).",
426
+ " keygen, k [--wrapped] [--signed] [--bits 128|192|256] [--key-format hex|base64url]",
427
+ " Emit a random key for importOpaqueKey, importWrappingKey, or importSigningKey (stdout only).",
358
428
  " --wrapped emits a wrapping key for importWrappingKey instead (IDS_WRAPPING_KEY).",
429
+ " --signed emits a signing key for importSigningKey instead (IDS_SIGNING_KEY; hex by default; IDS_SIGNING_KEY_FORMAT or --key-format).",
359
430
  ""
360
431
  ].join("\n");
361
432
  }
@@ -367,6 +438,7 @@ function runInspect(args, opts) {
367
438
  "--opaque",
368
439
  "--wrapped",
369
440
  "--reverse",
441
+ "--signed",
370
442
  "--kind",
371
443
  "--key-format"
372
444
  ]));
@@ -391,6 +463,7 @@ function runInspect(args, opts) {
391
463
  const opaque = flags.has("--opaque");
392
464
  const wrapped = flags.has("--wrapped");
393
465
  const reverse = flags.has("--reverse");
466
+ const signed = flags.has("--signed");
394
467
  if (opaque && wrapped) {
395
468
  opts.stderr("cannot use --wrapped and --opaque together\n");
396
469
  return Promise.resolve(1);
@@ -403,8 +476,20 @@ function runInspect(args, opts) {
403
476
  opts.stderr("cannot use --reverse and --wrapped together\n");
404
477
  return Promise.resolve(1);
405
478
  }
406
- if (!opaque && !wrapped && flags.has("--key-format")) {
407
- opts.stderr("--key-format requires --opaque or --wrapped\n");
479
+ if (signed && opaque) {
480
+ opts.stderr("cannot use --signed and --opaque together\n");
481
+ return Promise.resolve(1);
482
+ }
483
+ if (signed && wrapped) {
484
+ opts.stderr("cannot use --signed and --wrapped together\n");
485
+ return Promise.resolve(1);
486
+ }
487
+ if (signed && reverse) {
488
+ opts.stderr("cannot use --signed and --reverse together\n");
489
+ return Promise.resolve(1);
490
+ }
491
+ if (!opaque && !wrapped && !signed && flags.has("--key-format")) {
492
+ opts.stderr("--key-format requires --opaque, --wrapped, or --signed\n");
408
493
  return Promise.resolve(1);
409
494
  }
410
495
  const brand = input.slice(0, 3).toLowerCase();
@@ -433,6 +518,14 @@ function runInspect(args, opts) {
433
518
  }
434
519
  return runOpaqueInspect(brand, input, format, opts);
435
520
  }
521
+ if (signed) {
522
+ const format = parseSigningKeyFormat(values, opts);
523
+ if (isKeyFormatError(format)) {
524
+ opts.stderr(format + "\n");
525
+ return Promise.resolve(1);
526
+ }
527
+ return runSignedInspect(brand, input, format, opts);
528
+ }
436
529
  if (reverse) {
437
530
  let reverseCodec;
438
531
  try {
@@ -554,11 +647,75 @@ async function runOpaqueInspect(brand, input, format, opts) {
554
647
  }));
555
648
  return 0;
556
649
  }
650
+ async function runSignedInspect(brand, input, format, opts) {
651
+ let structCodec;
652
+ try {
653
+ structCodec = createTimestampId(brand, codecOpts(opts));
654
+ } catch (err) {
655
+ opts.stderr(formatCliError(err) + "\n");
656
+ return 1;
657
+ }
658
+ const validation = structCodec["~standard"].validate(input);
659
+ if (validation.issues) {
660
+ opts.stderr(validation.issues[0].message + "\n");
661
+ return 1;
662
+ }
663
+ const canonical = validation.value;
664
+ const timestamp = structCodec.extractTimestamp(canonical);
665
+ const nowMs = (opts.now ?? Date.now)();
666
+ if ((opts.env ?? process.env).IDS_SIGNING_KEY === void 0) {
667
+ opts.stdout(formatSignedInspectOutput({
668
+ brand,
669
+ timestamp,
670
+ canonical,
671
+ input,
672
+ nowMs
673
+ }));
674
+ return 0;
675
+ }
676
+ const keyResult = await loadSigningKey(opts, format);
677
+ if (typeof keyResult === "string") {
678
+ opts.stderr(keyResult + "\n");
679
+ return 1;
680
+ }
681
+ const verifyResult = await createSignedTimestampId(brand, {
682
+ keys: [keyResult],
683
+ allowDuplicateBrand: true,
684
+ ...codecOpts(opts)
685
+ }).safeVerify(input);
686
+ if (!verifyResult.ok) {
687
+ /* v8 ignore next 4 -- defensive: both codecs share the same wire parse so ParseError
688
+ is unreachable after the createTimestampId pre-validation above passes */
689
+ if (verifyResult.error !== "verification_failed") {
690
+ opts.stderr(verifyResult.error + "\n");
691
+ return 1;
692
+ }
693
+ opts.stdout(formatSignedInspectOutput({
694
+ brand,
695
+ timestamp,
696
+ canonical,
697
+ input,
698
+ nowMs,
699
+ verification: "failed"
700
+ }));
701
+ return 1;
702
+ }
703
+ opts.stdout(formatSignedInspectOutput({
704
+ brand,
705
+ timestamp,
706
+ canonical: verifyResult.id,
707
+ input,
708
+ nowMs,
709
+ verification: "ok"
710
+ }));
711
+ return 0;
712
+ }
557
713
  //#endregion
558
714
  //#region src/cli/commands/keygen.ts
559
715
  function runKeygen(args, opts) {
560
716
  const { flags, values, positionals, errors } = splitFlags(args);
561
717
  const unsupported = unsupportedFlagForCommand("keygen", flags, new Set([
718
+ "--signed",
562
719
  "--wrapped",
563
720
  "--bits",
564
721
  "--key-format"
@@ -576,6 +733,12 @@ function runKeygen(args, opts) {
576
733
  opts.stderr(`unexpected argument: ${extra}\n`);
577
734
  return Promise.resolve(1);
578
735
  }
736
+ const signed = flags.has("--signed");
737
+ const wrapped = flags.has("--wrapped");
738
+ if (signed && wrapped) {
739
+ opts.stderr("cannot use --signed and --wrapped together\n");
740
+ return Promise.resolve(1);
741
+ }
579
742
  const bits = parseBits(values);
580
743
  if (typeof bits === "string") {
581
744
  opts.stderr(bits + "\n");
@@ -588,8 +751,11 @@ function runKeygen(args, opts) {
588
751
  }
589
752
  const bytes = new Uint8Array(bits / 8);
590
753
  crypto.getRandomValues(bytes);
591
- const wrapped = flags.has("--wrapped");
592
- opts.stdout((wrapped ? encodeWrappingKey(bytes, format) : encodeOpaqueKey(bytes, format)) + "\n");
754
+ let encoded;
755
+ if (signed) encoded = encodeSigningKey(bytes, format);
756
+ else if (wrapped) encoded = encodeWrappingKey(bytes, format);
757
+ else encoded = encodeOpaqueKey(bytes, format);
758
+ opts.stdout(encoded + "\n");
593
759
  return Promise.resolve(0);
594
760
  }
595
761
  //#endregion
package/dist/cli.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.mjs","names":["parseKeyFormatFlag"],"sources":["../src/cli/codec-options.ts","../src/cli/format.ts","../src/cli/constants.ts","../src/cli/flags.ts","../src/cli/opaque-key.ts","../src/cli/commands/generate.ts","../src/cli/wrapping-key.ts","../src/cli/usage.ts","../src/cli/commands/inspect.ts","../src/cli/commands/keygen.ts","../src/cli.ts","../bin/cli.ts"],"sourcesContent":["import type { TimestampOptions } from \"../timestamp.js\";\nimport type { RunOpts } from \"./types.js\";\n\nexport function codecOpts(opts: RunOpts): Partial<TimestampOptions> {\n // CLI invocations are intentionally ephemeral: one codec per run, never\n // retained, so this is not the duplicate-brand warning case.\n const o: Partial<TimestampOptions> = { allowDuplicateBrand: true };\n if (opts.now !== undefined) o.now = opts.now;\n if (opts.rng !== undefined) o.rng = opts.rng;\n return o;\n}\n","import { isIdsError } from \"../error.js\";\nimport type { Id } from \"../types.js\";\n\ntype InspectOutput = {\n brand: string;\n timestamp: Date;\n canonical: Id<string>;\n input: string;\n nowMs: number;\n};\n\ntype WrappedInspectOutput = {\n brand: string;\n lookupKey: number | bigint;\n canonical: Id<string>;\n input: string;\n};\n\nexport function formatCliError(err: unknown): string {\n return isIdsError(err)\n ? `${err.code}: ${err.message}`\n : err instanceof Error\n ? err.message\n : String(err);\n}\n\nexport function formatWrappedInspectOutput(result: WrappedInspectOutput): string {\n const inputLine = describeInputForm(result.input, result.canonical);\n return [\n `brand: ${result.brand}`,\n `lookup-key: ${result.lookupKey.toString()}`,\n `canonical: ${result.canonical}`,\n `input: ${inputLine}`,\n \"\",\n ].join(\"\\n\");\n}\n\nexport function formatInspectOutput(result: InspectOutput): string {\n const relative = formatRelative(result.timestamp.getTime(), result.nowMs);\n const inputLine = describeInputForm(result.input, result.canonical);\n return [\n `brand: ${result.brand}`,\n `timestamp: ${result.timestamp.toISOString()} (${relative})`,\n `canonical: ${result.canonical}`,\n `input: ${inputLine}`,\n \"\",\n ].join(\"\\n\");\n}\n\nexport function describeInputForm(input: string, canonical: Id<string>): string {\n if (input === canonical) return \"canonical\";\n const notes: string[] = [];\n if (input !== input.toLowerCase()) notes.push(\"was uppercase\");\n if (/[ilo]/i.test(input.slice(4))) notes.push(\"used Crockford aliases\");\n return `not canonical (${notes.join(\" + \")})`;\n}\n\nconst msPerSecond = 1000;\nconst msPerMinute = 60 * msPerSecond;\nconst msPerHour = 60 * msPerMinute;\nconst msPerDay = 24 * msPerHour;\nconst daysPerMonth = 30.44;\nconst monthsPerYear = 12;\n\nexport function formatRelative(thenMs: number, nowMs: number): string {\n const diff = nowMs - thenMs;\n const abs = Math.abs(diff);\n const suffix = diff < 0 ? \"from now\" : \"ago\";\n\n const head = headUnits(abs);\n return head === \"\" ? \"just now\" : `${head} ${suffix}`;\n}\n\nfunction headUnits(abs: number): string {\n if (abs < msPerMinute) return \"\";\n if (abs < msPerHour) return unit(Math.round(abs / msPerMinute), \"minute\");\n if (abs < msPerDay) return unit(Math.round(abs / msPerHour), \"hour\");\n if (abs < msPerDay * daysPerMonth) return unit(Math.round(abs / msPerDay), \"day\");\n\n const totalMonths = Math.round(abs / (msPerDay * daysPerMonth));\n if (totalMonths < monthsPerYear) return unit(totalMonths, \"month\");\n\n const years = Math.floor(totalMonths / monthsPerYear);\n const months = totalMonths % monthsPerYear;\n return months === 0 ? unit(years, \"year\") : `${unit(years, \"year\")} ${unit(months, \"month\")}`;\n}\n\nfunction unit(n: number, name: string): string {\n return `${n} ${n === 1 ? name : `${name}s`}`;\n}\n","export const maxGenerateCount = 10_000;\n","import { maxGenerateCount } from \"./constants.js\";\n\nexport type ParsedFlags = {\n flags: Set<string>;\n values: Map<string, string>;\n positionals: string[];\n errors: string[];\n};\n\nfunction splitFlagToken(arg: string): { flag: string; inlineValue: string | undefined } {\n const eq = arg.indexOf(\"=\");\n if (eq <= 0) return { flag: arg, inlineValue: undefined };\n return { flag: arg.slice(0, eq), inlineValue: arg.slice(eq + 1) };\n}\n\nexport function splitFlags(args: ReadonlyArray<string>): ParsedFlags {\n const flags = new Set<string>();\n const values = new Map<string, string>();\n const positionals: string[] = [];\n const errors: string[] = [];\n const seenFlags = new Set<string>();\n const valueFlags = new Set([\"--count\", \"-c\", \"--bits\", \"--key-format\", \"--kind\"]);\n const addFlag = (flag: string) => {\n const canonical = canonicalFlag(flag);\n if (seenFlags.has(canonical)) errors.push(`duplicate flag: ${canonical}`);\n seenFlags.add(canonical);\n flags.add(flag);\n };\n for (let i = 0; i < args.length; i++) {\n const raw = args[i]!;\n const { flag, inlineValue } = splitFlagToken(raw);\n if (flag === \"--opaque\" || flag === \"--wrapped\" || flag === \"--reverse\") {\n addFlag(flag);\n if (inlineValue !== undefined) errors.push(`flag does not take a value: ${flag}`);\n continue;\n }\n if (valueFlags.has(flag)) {\n if (inlineValue !== undefined) {\n addFlag(flag);\n values.set(flag, inlineValue);\n continue;\n }\n const value = args[i + 1];\n if (value === undefined || value.startsWith(\"-\")) {\n addFlag(flag);\n values.set(flag, \"\");\n continue;\n }\n addFlag(flag);\n values.set(flag, value);\n i++;\n continue;\n }\n if (flag.startsWith(\"-\")) {\n addFlag(flag);\n continue;\n }\n positionals.push(raw);\n }\n return { flags, values, positionals, errors };\n}\n\nfunction canonicalFlag(flag: string): string {\n if (flag === \"-c\") return \"--count\";\n return flag;\n}\n\nconst knownFlags = new Set([\n \"--opaque\",\n \"--wrapped\",\n \"--reverse\",\n \"--kind\",\n \"--key-format\",\n \"--count\",\n \"-c\",\n \"--bits\",\n]);\n\nexport function unsupportedFlagForCommand(\n command: string,\n flags: Set<string>,\n allowed: Set<string>,\n): string | undefined {\n for (const flag of flags) {\n if (!allowed.has(flag)) {\n return knownFlags.has(flag)\n ? `unsupported flag for ${command}: ${flag}`\n : `unsupported flag: ${flag}`;\n }\n }\n return undefined;\n}\n\nexport function parseCount(values: Map<string, string>): number | string {\n const raw = values.get(\"--count\") ?? values.get(\"-c\");\n if (raw === undefined) return 1;\n if (raw === \"\") return \"--count requires a value\";\n if (!/^[1-9][0-9]*$/.test(raw)) return `--count must be a positive integer, got '${raw}'`;\n const count = Number.parseInt(raw, 10);\n if (!Number.isSafeInteger(count) || count > maxGenerateCount) {\n return `--count must be at most ${maxGenerateCount}, got '${raw}'`;\n }\n return count;\n}\n\nexport function parseBits(values: Map<string, string>): number | string {\n const raw = values.get(\"--bits\");\n if (raw === undefined) return 256;\n if (raw === \"\") return \"--bits requires a value\";\n if (raw === \"128\") return 128;\n if (raw === \"192\") return 192;\n if (raw === \"256\") return 256;\n return `--bits must be 128, 192, or 256, got '${raw}'`;\n}\n\nexport type WrappedKindValue = \"u32\" | \"i32\" | \"u64\" | \"i64\";\n\nexport function parseKind(values: Map<string, string>): WrappedKindValue | string | undefined {\n const raw = values.get(\"--kind\");\n if (raw === undefined) return undefined;\n if (raw === \"\") return \"--kind requires a value\";\n if (raw === \"u32\" || raw === \"i32\" || raw === \"u64\" || raw === \"i64\") return raw;\n return `--kind must be u32, i32, u64, or i64, got '${raw}'`;\n}\n\nexport function isKindError(result: WrappedKindValue | string): result is string {\n return result !== \"u32\" && result !== \"i32\" && result !== \"u64\" && result !== \"i64\";\n}\n","import {\n decodeOpaqueKey,\n importOpaqueKey,\n type OpaqueKey,\n type OpaqueKeyFormat,\n} from \"../opaque.js\";\nimport type { RunOpts } from \"./types.js\";\n\nexport function isKeyFormatError(result: OpaqueKeyFormat | string): result is string {\n return result !== \"hex\" && result !== \"base64url\";\n}\n\nfunction parseKeyFormatFlag(values: Map<string, string>): OpaqueKeyFormat | string | undefined {\n const fromFlag = values.get(\"--key-format\");\n if (fromFlag === undefined) return undefined;\n if (fromFlag === \"\") return \"--key-format requires a value\";\n if (fromFlag === \"hex\" || fromFlag === \"base64url\") return fromFlag;\n return `--key-format must be hex or base64url, got '${fromFlag}'`;\n}\n\nexport function parseKeygenFormat(values: Map<string, string>): OpaqueKeyFormat | string {\n const fromFlag = parseKeyFormatFlag(values);\n if (fromFlag === undefined) return \"hex\";\n return fromFlag;\n}\n\nexport function parseOpaqueKeyFormat(\n values: Map<string, string>,\n opts: RunOpts,\n): OpaqueKeyFormat | string {\n const fromFlag = parseKeyFormatFlag(values);\n if (fromFlag !== undefined) return fromFlag;\n const env = opts.env ?? process.env;\n const fromEnv = env.IDS_KEY_FORMAT;\n if (fromEnv === undefined || fromEnv === \"\") return \"hex\";\n if (fromEnv === \"hex\" || fromEnv === \"base64url\") return fromEnv;\n return `IDS_KEY_FORMAT must be hex or base64url, got '${fromEnv}'`;\n}\n\nexport async function loadOpaqueKey(\n opts: RunOpts,\n format: OpaqueKeyFormat,\n): Promise<OpaqueKey | string> {\n const env = opts.env ?? process.env;\n const raw = env.IDS_KEY;\n if (raw === undefined || raw === \"\") return \"missing IDS_KEY environment variable\";\n try {\n return importOpaqueKey(decodeOpaqueKey(raw, format));\n } catch (err) {\n return (err as Error).message;\n }\n}\n","import { createTimestampId } from \"../../timestamp.js\";\nimport { createOpaqueTimestampId, type OpaqueKeyFormat } from \"../../opaque.js\";\nimport { createReverseTimestampId } from \"../../reverse.js\";\nimport { codecOpts } from \"../codec-options.js\";\nimport { formatCliError } from \"../format.js\";\nimport { parseCount, splitFlags, unsupportedFlagForCommand } from \"../flags.js\";\nimport { isKeyFormatError, loadOpaqueKey, parseOpaqueKeyFormat } from \"../opaque-key.js\";\nimport type { RunOpts } from \"../types.js\";\n\nexport function runGenerate(args: ReadonlyArray<string>, opts: RunOpts): Promise<number> {\n const { flags, values, positionals, errors } = splitFlags(args);\n const unsupported = unsupportedFlagForCommand(\n \"generate\",\n flags,\n new Set([\"--count\", \"-c\", \"--opaque\", \"--reverse\", \"--key-format\"]),\n );\n if (unsupported !== undefined) {\n opts.stderr(unsupported + \"\\n\");\n return Promise.resolve(1);\n }\n if (errors[0] !== undefined) {\n opts.stderr(errors[0] + \"\\n\");\n return Promise.resolve(1);\n }\n const extra = positionals[1];\n if (extra !== undefined) {\n opts.stderr(`unexpected argument: ${extra}\\n`);\n return Promise.resolve(1);\n }\n const [brand] = positionals;\n const count = parseCount(values);\n if (typeof count === \"string\") {\n opts.stderr(count + \"\\n\");\n return Promise.resolve(1);\n }\n const opaque = flags.has(\"--opaque\");\n const reverse = flags.has(\"--reverse\");\n if (reverse && opaque) {\n opts.stderr(\"cannot use --reverse and --opaque together\\n\");\n return Promise.resolve(1);\n }\n if (!opaque && flags.has(\"--key-format\")) {\n opts.stderr(\"--key-format requires --opaque\\n\");\n return Promise.resolve(1);\n }\n if (opaque) {\n const format = parseOpaqueKeyFormat(values, opts);\n if (isKeyFormatError(format)) {\n opts.stderr(format + \"\\n\");\n return Promise.resolve(1);\n }\n return runOpaqueGenerate(brand ?? \"\", count, format, opts);\n }\n if (reverse) {\n let codec;\n try {\n codec = createReverseTimestampId(brand ?? \"\", codecOpts(opts));\n } catch (err) {\n opts.stderr(formatCliError(err) + \"\\n\");\n return Promise.resolve(1);\n }\n for (let i = 0; i < count; i++) opts.stdout(codec.generate() + \"\\n\");\n return Promise.resolve(0);\n }\n let codec;\n try {\n codec = createTimestampId(brand ?? \"\", codecOpts(opts));\n } catch (err) {\n opts.stderr(formatCliError(err) + \"\\n\");\n return Promise.resolve(1);\n }\n for (let i = 0; i < count; i++) opts.stdout(codec.generate() + \"\\n\");\n return Promise.resolve(0);\n}\n\nasync function runOpaqueGenerate(\n brand: string,\n count: number,\n format: OpaqueKeyFormat,\n opts: RunOpts,\n): Promise<number> {\n const keyResult = await loadOpaqueKey(opts, format);\n if (typeof keyResult === \"string\") {\n opts.stderr(keyResult + \"\\n\");\n return 1;\n }\n let codec;\n try {\n codec = createOpaqueTimestampId(brand, { key: keyResult, ...codecOpts(opts) });\n } catch (err) {\n opts.stderr(formatCliError(err) + \"\\n\");\n return 1;\n }\n for (let i = 0; i < count; i++) opts.stdout((await codec.generate()) + \"\\n\");\n return 0;\n}\n","import {\n decodeWrappingKey,\n importWrappingKey,\n type WrappingKey,\n type WrappingKeyFormat,\n} from \"../wrapped.js\";\nimport type { RunOpts } from \"./types.js\";\n\nfunction parseKeyFormatFlag(values: Map<string, string>): WrappingKeyFormat | string | undefined {\n const fromFlag = values.get(\"--key-format\");\n if (fromFlag === undefined) return undefined;\n if (fromFlag === \"\") return \"--key-format requires a value\";\n if (fromFlag === \"hex\" || fromFlag === \"base64url\") return fromFlag;\n return `--key-format must be hex or base64url, got '${fromFlag}'`;\n}\n\nexport function parseWrappingKeyFormat(\n values: Map<string, string>,\n opts: RunOpts,\n): WrappingKeyFormat | string {\n const fromFlag = parseKeyFormatFlag(values);\n if (fromFlag !== undefined) return fromFlag;\n const env = opts.env ?? process.env;\n const fromEnv = env.IDS_WRAPPING_KEY_FORMAT;\n if (fromEnv === undefined || fromEnv === \"\") return \"hex\";\n if (fromEnv === \"hex\" || fromEnv === \"base64url\") return fromEnv;\n return `IDS_WRAPPING_KEY_FORMAT must be hex or base64url, got '${fromEnv}'`;\n}\n\nexport async function loadWrappingKey(\n opts: RunOpts,\n format: WrappingKeyFormat,\n): Promise<WrappingKey | string> {\n const env = opts.env ?? process.env;\n const raw = env.IDS_WRAPPING_KEY;\n if (raw === undefined || raw === \"\") return \"missing IDS_WRAPPING_KEY environment variable\";\n try {\n return importWrappingKey(decodeWrappingKey(raw, format));\n } catch (err) {\n return (err as Error).message;\n }\n}\n","import { maxGenerateCount } from \"./constants.js\";\n\nexport function usage(): string {\n return [\n \"Usage: ids <subcommand> [args]\",\n \"\",\n \"Subcommands:\",\n \" inspect, i <id> [--opaque] [--wrapped --kind u32|i32|u64|i64] [--reverse] [--key-format hex|base64url]\",\n \" Decode an ID and print brand, timestamp (or lookup key), and canonical form.\",\n \" --opaque reads the AES key from IDS_KEY (hex by default; IDS_KEY_FORMAT or --key-format).\",\n \" --wrapped reads the wrapping key from IDS_WRAPPING_KEY (hex by default; IDS_WRAPPING_KEY_FORMAT or --key-format).\",\n \" --kind is required with --wrapped: u32, i32, u64, or i64.\",\n \" --reverse decodes a Reverse Timestamp ID (newest-first sort order).\",\n \" generate, g <brand> [--count, -c N] [--opaque] [--reverse] [--key-format hex|base64url]\",\n ` Mint 1..${maxGenerateCount} canonical IDs for the given brand.`,\n \" --opaque reads the AES key from IDS_KEY (hex by default; IDS_KEY_FORMAT or --key-format).\",\n \" --reverse mints Reverse Timestamp IDs (newest-first sort order).\",\n \" keygen, k [--wrapped] [--bits 128|192|256] [--key-format hex|base64url]\",\n \" Emit a random AES key for importOpaqueKey (stdout only).\",\n \" --wrapped emits a wrapping key for importWrappingKey instead (IDS_WRAPPING_KEY).\",\n \"\",\n ].join(\"\\n\");\n}\n","import { createTimestampId } from \"../../timestamp.js\";\nimport { createOpaqueTimestampId, type OpaqueKeyFormat } from \"../../opaque.js\";\nimport { createReverseTimestampId } from \"../../reverse.js\";\nimport { createWrappedKeyId, type WrappingKey } from \"../../wrapped.js\";\nimport { codecOpts } from \"../codec-options.js\";\nimport { formatCliError, formatInspectOutput, formatWrappedInspectOutput } from \"../format.js\";\nimport {\n isKindError,\n parseKind,\n splitFlags,\n unsupportedFlagForCommand,\n type WrappedKindValue,\n} from \"../flags.js\";\nimport { isKeyFormatError, loadOpaqueKey, parseOpaqueKeyFormat } from \"../opaque-key.js\";\nimport { loadWrappingKey, parseWrappingKeyFormat } from \"../wrapping-key.js\";\nimport type { RunOpts } from \"../types.js\";\nimport { usage } from \"../usage.js\";\n\nexport function runInspect(args: ReadonlyArray<string>, opts: RunOpts): Promise<number> {\n const { flags, values, positionals, errors } = splitFlags(args);\n const unsupported = unsupportedFlagForCommand(\n \"inspect\",\n flags,\n new Set([\"--opaque\", \"--wrapped\", \"--reverse\", \"--kind\", \"--key-format\"]),\n );\n if (unsupported !== undefined) {\n opts.stderr(unsupported + \"\\n\");\n return Promise.resolve(1);\n }\n if (errors[0] !== undefined) {\n opts.stderr(errors[0] + \"\\n\");\n return Promise.resolve(1);\n }\n const [input] = positionals;\n if (input === undefined) {\n opts.stderr(usage());\n return Promise.resolve(1);\n }\n const extra = positionals[1];\n if (extra !== undefined) {\n opts.stderr(`unexpected argument: ${extra}\\n`);\n return Promise.resolve(1);\n }\n const opaque = flags.has(\"--opaque\");\n const wrapped = flags.has(\"--wrapped\");\n const reverse = flags.has(\"--reverse\");\n if (opaque && wrapped) {\n opts.stderr(\"cannot use --wrapped and --opaque together\\n\");\n return Promise.resolve(1);\n }\n if (reverse && opaque) {\n opts.stderr(\"cannot use --reverse and --opaque together\\n\");\n return Promise.resolve(1);\n }\n if (reverse && wrapped) {\n opts.stderr(\"cannot use --reverse and --wrapped together\\n\");\n return Promise.resolve(1);\n }\n if (!opaque && !wrapped && flags.has(\"--key-format\")) {\n opts.stderr(\"--key-format requires --opaque or --wrapped\\n\");\n return Promise.resolve(1);\n }\n const brand = input.slice(0, 3).toLowerCase();\n if (wrapped) {\n const kind = parseKind(values);\n if (kind === undefined) {\n opts.stderr(\"--kind is required with --wrapped\\n\");\n return Promise.resolve(1);\n }\n if (isKindError(kind)) {\n opts.stderr(kind + \"\\n\");\n return Promise.resolve(1);\n }\n const format = parseWrappingKeyFormat(values, opts);\n if (isKeyFormatError(format)) {\n opts.stderr(format + \"\\n\");\n return Promise.resolve(1);\n }\n return runWrappedInspect(brand, input, kind, format, opts);\n }\n if (opaque) {\n const format = parseOpaqueKeyFormat(values, opts);\n if (isKeyFormatError(format)) {\n opts.stderr(format + \"\\n\");\n return Promise.resolve(1);\n }\n return runOpaqueInspect(brand, input, format, opts);\n }\n if (reverse) {\n let reverseCodec;\n try {\n reverseCodec = createReverseTimestampId(brand, codecOpts(opts));\n } catch (err) {\n opts.stderr(formatCliError(err) + \"\\n\");\n return Promise.resolve(1);\n }\n const reverseValidation = reverseCodec[\"~standard\"].validate(input);\n if (reverseValidation.issues) {\n opts.stderr(reverseValidation.issues[0]!.message + \"\\n\");\n return Promise.resolve(1);\n }\n const reverseCanonical = reverseValidation.value;\n const reverseTimestamp = reverseCodec.extractTimestamp(reverseCanonical);\n const reverseNowMs = (opts.now ?? Date.now)();\n opts.stdout(\n formatInspectOutput({\n brand,\n timestamp: reverseTimestamp,\n canonical: reverseCanonical,\n input,\n nowMs: reverseNowMs,\n }),\n );\n return Promise.resolve(0);\n }\n let codec;\n try {\n codec = createTimestampId(brand, codecOpts(opts));\n } catch (err) {\n opts.stderr(formatCliError(err) + \"\\n\");\n return Promise.resolve(1);\n }\n const validation = codec[\"~standard\"].validate(input);\n if (validation.issues) {\n opts.stderr(validation.issues[0]!.message + \"\\n\");\n return Promise.resolve(1);\n }\n const canonical = validation.value;\n const timestamp = codec.extractTimestamp(canonical);\n const nowMs = (opts.now ?? Date.now)();\n opts.stdout(\n formatInspectOutput({\n brand,\n timestamp,\n canonical,\n input,\n nowMs,\n }),\n );\n return Promise.resolve(0);\n}\n\nasync function runWrappedInspect(\n brand: string,\n input: string,\n kind: WrappedKindValue,\n format: string,\n opts: RunOpts,\n): Promise<number> {\n const keyResult = await loadWrappingKey(opts, format as \"hex\" | \"base64url\");\n if (typeof keyResult === \"string\") {\n opts.stderr(keyResult + \"\\n\");\n return 1;\n }\n let codec;\n try {\n codec = createWrappedKeyId(brand, {\n kind,\n keys: [keyResult as WrappingKey],\n allowDuplicateBrand: true,\n });\n } catch (err) {\n opts.stderr(formatCliError(err) + \"\\n\");\n return 1;\n }\n const validation = codec[\"~standard\"].validate(input);\n if (validation.issues) {\n opts.stderr(validation.issues[0]!.message + \"\\n\");\n return 1;\n }\n const canonical = validation.value;\n let lookupKey;\n try {\n lookupKey = await codec.unwrap(canonical);\n } catch (err) {\n opts.stderr(formatCliError(err) + \"\\n\");\n return 1;\n }\n opts.stdout(\n formatWrappedInspectOutput({\n brand,\n lookupKey,\n canonical,\n input,\n }),\n );\n return 0;\n}\n\nasync function runOpaqueInspect(\n brand: string,\n input: string,\n format: OpaqueKeyFormat,\n opts: RunOpts,\n): Promise<number> {\n const keyResult = await loadOpaqueKey(opts, format);\n if (typeof keyResult === \"string\") {\n opts.stderr(keyResult + \"\\n\");\n return 1;\n }\n let codec;\n try {\n codec = createOpaqueTimestampId(brand, { key: keyResult, ...codecOpts(opts) });\n } catch (err) {\n opts.stderr(formatCliError(err) + \"\\n\");\n return 1;\n }\n const validation = codec[\"~standard\"].validate(input);\n if (validation.issues) {\n opts.stderr(validation.issues[0]!.message + \"\\n\");\n return 1;\n }\n const canonical = validation.value;\n const timestamp = await codec.extractTimestamp(canonical);\n const nowMs = (opts.now ?? Date.now)();\n opts.stderr(\n \"note: timestamp assumes IDS_KEY matches the key used at generation; a wrong key yields a plausible but incorrect timestamp\\n\",\n );\n opts.stdout(\n formatInspectOutput({\n brand,\n timestamp,\n canonical,\n input,\n nowMs,\n }),\n );\n return 0;\n}\n","import { encodeOpaqueKey } from \"../../opaque.js\";\nimport { encodeWrappingKey } from \"../../wrapped.js\";\nimport { parseBits, splitFlags, unsupportedFlagForCommand } from \"../flags.js\";\nimport { isKeyFormatError, parseKeygenFormat } from \"../opaque-key.js\";\nimport type { RunOpts } from \"../types.js\";\n\nexport function runKeygen(args: ReadonlyArray<string>, opts: RunOpts): Promise<number> {\n const { flags, values, positionals, errors } = splitFlags(args);\n const unsupported = unsupportedFlagForCommand(\n \"keygen\",\n flags,\n new Set([\"--wrapped\", \"--bits\", \"--key-format\"]),\n );\n if (unsupported !== undefined) {\n opts.stderr(unsupported + \"\\n\");\n return Promise.resolve(1);\n }\n if (errors[0] !== undefined) {\n opts.stderr(errors[0] + \"\\n\");\n return Promise.resolve(1);\n }\n const extra = positionals[0];\n if (extra !== undefined) {\n opts.stderr(`unexpected argument: ${extra}\\n`);\n return Promise.resolve(1);\n }\n const bits = parseBits(values);\n if (typeof bits === \"string\") {\n opts.stderr(bits + \"\\n\");\n return Promise.resolve(1);\n }\n const format = parseKeygenFormat(values);\n if (isKeyFormatError(format)) {\n opts.stderr(format + \"\\n\");\n return Promise.resolve(1);\n }\n const bytes = new Uint8Array(bits / 8);\n crypto.getRandomValues(bytes);\n const wrapped = flags.has(\"--wrapped\");\n opts.stdout((wrapped ? encodeWrappingKey(bytes, format) : encodeOpaqueKey(bytes, format)) + \"\\n\");\n return Promise.resolve(0);\n}\n","import { runGenerate } from \"./cli/commands/generate.js\";\nimport { runInspect } from \"./cli/commands/inspect.js\";\nimport { runKeygen } from \"./cli/commands/keygen.js\";\nimport type { CommandHandler, RunOpts } from \"./cli/types.js\";\nimport { usage } from \"./cli/usage.js\";\n\nexport type { RunOpts } from \"./cli/types.js\";\n\ntype Command = {\n names: ReadonlyArray<string>;\n run: CommandHandler;\n};\n\nconst commands: ReadonlyArray<Command> = [\n { names: [\"generate\", \"g\"], run: runGenerate },\n { names: [\"inspect\", \"i\"], run: runInspect },\n { names: [\"keygen\", \"k\"], run: runKeygen },\n];\n\nexport async function run(opts: RunOpts): Promise<number> {\n const [subcommand, ...rest] = opts.argv;\n const command = commands.find((candidate) => candidate.names.includes(subcommand ?? \"\"));\n if (command !== undefined) return command.run(rest, opts);\n if (subcommand === undefined || subcommand === \"--help\" || subcommand === \"-h\") {\n opts.stdout(usage());\n return 0;\n }\n opts.stderr(usage());\n return 1;\n}\n","#!/usr/bin/env node\nimport { run } from \"../src/cli.js\";\n\nprocess.exitCode = await run({\n argv: process.argv.slice(2),\n stdout: (s) => process.stdout.write(s),\n stderr: (s) => process.stderr.write(s),\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"cli.mjs","names":[],"sources":["../src/cli/codec-options.ts","../src/cli/format.ts","../src/cli/constants.ts","../src/cli/flags.ts","../src/cli/key-io.ts","../src/cli/opaque-key.ts","../src/cli/signing-key.ts","../src/cli/commands/generate.ts","../src/cli/wrapping-key.ts","../src/cli/usage.ts","../src/cli/commands/inspect.ts","../src/cli/commands/keygen.ts","../src/cli.ts","../bin/cli.ts"],"sourcesContent":["import type { TimestampOptions } from \"../timestamp.js\";\nimport type { RunOpts } from \"./types.js\";\n\nexport function codecOpts(opts: RunOpts): Partial<TimestampOptions> {\n // CLI invocations are intentionally ephemeral: one codec per run, never\n // retained, so this is not the duplicate-brand warning case.\n const o: Partial<TimestampOptions> = { allowDuplicateBrand: true };\n if (opts.now !== undefined) o.now = opts.now;\n if (opts.rng !== undefined) o.rng = opts.rng;\n return o;\n}\n","import { isIdsError } from \"../error.js\";\nimport type { Id } from \"../types.js\";\n\ntype InspectOutput = {\n brand: string;\n timestamp: Date;\n canonical: Id<string>;\n input: string;\n nowMs: number;\n};\n\ntype SignedInspectOutput = InspectOutput & {\n verification?: \"ok\" | \"failed\";\n};\n\ntype WrappedInspectOutput = {\n brand: string;\n lookupKey: number | bigint;\n canonical: Id<string>;\n input: string;\n};\n\nexport function formatCliError(err: unknown): string {\n return isIdsError(err)\n ? `${err.code}: ${err.message}`\n : err instanceof Error\n ? err.message\n : String(err);\n}\n\nexport function formatWrappedInspectOutput(result: WrappedInspectOutput): string {\n const inputLine = describeInputForm(result.input, result.canonical);\n return [\n `brand: ${result.brand}`,\n `lookup-key: ${result.lookupKey.toString()}`,\n `canonical: ${result.canonical}`,\n `input: ${inputLine}`,\n \"\",\n ].join(\"\\n\");\n}\n\nexport function formatSignedInspectOutput(result: SignedInspectOutput): string {\n const relative = formatRelative(result.timestamp.getTime(), result.nowMs);\n const inputLine = describeInputForm(result.input, result.canonical);\n const lines = [\n `brand: ${result.brand}`,\n `timestamp: ${result.timestamp.toISOString()} (${relative})`,\n ];\n if (result.verification !== undefined) {\n // \"verification:\" is the spec-mandated key name; the extra chars vs. other labels are intentional.\n lines.push(`verification: ${result.verification}`);\n }\n lines.push(`canonical: ${result.canonical}`, `input: ${inputLine}`, \"\");\n return lines.join(\"\\n\");\n}\n\nexport function formatInspectOutput(result: InspectOutput): string {\n const relative = formatRelative(result.timestamp.getTime(), result.nowMs);\n const inputLine = describeInputForm(result.input, result.canonical);\n return [\n `brand: ${result.brand}`,\n `timestamp: ${result.timestamp.toISOString()} (${relative})`,\n `canonical: ${result.canonical}`,\n `input: ${inputLine}`,\n \"\",\n ].join(\"\\n\");\n}\n\nexport function describeInputForm(input: string, canonical: Id<string>): string {\n if (input === canonical) return \"canonical\";\n const notes: string[] = [];\n if (input !== input.toLowerCase()) notes.push(\"was uppercase\");\n if (/[ilo]/i.test(input.slice(4))) notes.push(\"used Crockford aliases\");\n return `not canonical (${notes.join(\" + \")})`;\n}\n\nconst msPerSecond = 1000;\nconst msPerMinute = 60 * msPerSecond;\nconst msPerHour = 60 * msPerMinute;\nconst msPerDay = 24 * msPerHour;\nconst daysPerMonth = 30.44;\nconst monthsPerYear = 12;\n\nexport function formatRelative(thenMs: number, nowMs: number): string {\n const diff = nowMs - thenMs;\n const abs = Math.abs(diff);\n const suffix = diff < 0 ? \"from now\" : \"ago\";\n\n const head = headUnits(abs);\n return head === \"\" ? \"just now\" : `${head} ${suffix}`;\n}\n\nfunction headUnits(abs: number): string {\n if (abs < msPerMinute) return \"\";\n if (abs < msPerHour) return unit(Math.round(abs / msPerMinute), \"minute\");\n if (abs < msPerDay) return unit(Math.round(abs / msPerHour), \"hour\");\n if (abs < msPerDay * daysPerMonth) return unit(Math.round(abs / msPerDay), \"day\");\n\n const totalMonths = Math.round(abs / (msPerDay * daysPerMonth));\n if (totalMonths < monthsPerYear) return unit(totalMonths, \"month\");\n\n const years = Math.floor(totalMonths / monthsPerYear);\n const months = totalMonths % monthsPerYear;\n return months === 0 ? unit(years, \"year\") : `${unit(years, \"year\")} ${unit(months, \"month\")}`;\n}\n\nfunction unit(n: number, name: string): string {\n return `${n} ${n === 1 ? name : `${name}s`}`;\n}\n","export const maxGenerateCount = 10_000;\n","import { maxGenerateCount } from \"./constants.js\";\n\nexport type ParsedFlags = {\n flags: Set<string>;\n values: Map<string, string>;\n positionals: string[];\n errors: string[];\n};\n\nfunction splitFlagToken(arg: string): { flag: string; inlineValue: string | undefined } {\n const eq = arg.indexOf(\"=\");\n if (eq <= 0) return { flag: arg, inlineValue: undefined };\n return { flag: arg.slice(0, eq), inlineValue: arg.slice(eq + 1) };\n}\n\nexport function splitFlags(args: ReadonlyArray<string>): ParsedFlags {\n const flags = new Set<string>();\n const values = new Map<string, string>();\n const positionals: string[] = [];\n const errors: string[] = [];\n const seenFlags = new Set<string>();\n const valueFlags = new Set([\"--count\", \"-c\", \"--bits\", \"--key-format\", \"--kind\"]);\n const addFlag = (flag: string) => {\n const canonical = canonicalFlag(flag);\n if (seenFlags.has(canonical)) errors.push(`duplicate flag: ${canonical}`);\n seenFlags.add(canonical);\n flags.add(flag);\n };\n for (let i = 0; i < args.length; i++) {\n const raw = args[i]!;\n const { flag, inlineValue } = splitFlagToken(raw);\n if (\n flag === \"--opaque\" ||\n flag === \"--wrapped\" ||\n flag === \"--reverse\" ||\n flag === \"--signed\"\n ) {\n addFlag(flag);\n if (inlineValue !== undefined) errors.push(`flag does not take a value: ${flag}`);\n continue;\n }\n if (valueFlags.has(flag)) {\n if (inlineValue !== undefined) {\n addFlag(flag);\n values.set(flag, inlineValue);\n continue;\n }\n const value = args[i + 1];\n if (value === undefined || value.startsWith(\"-\")) {\n addFlag(flag);\n values.set(flag, \"\");\n continue;\n }\n addFlag(flag);\n values.set(flag, value);\n i++;\n continue;\n }\n if (flag.startsWith(\"-\")) {\n addFlag(flag);\n continue;\n }\n positionals.push(raw);\n }\n return { flags, values, positionals, errors };\n}\n\nfunction canonicalFlag(flag: string): string {\n if (flag === \"-c\") return \"--count\";\n return flag;\n}\n\nconst knownFlags = new Set([\n \"--opaque\",\n \"--wrapped\",\n \"--reverse\",\n \"--signed\",\n \"--kind\",\n \"--key-format\",\n \"--count\",\n \"-c\",\n \"--bits\",\n]);\n\nexport function unsupportedFlagForCommand(\n command: string,\n flags: Set<string>,\n allowed: Set<string>,\n): string | undefined {\n for (const flag of flags) {\n if (!allowed.has(flag)) {\n return knownFlags.has(flag)\n ? `unsupported flag for ${command}: ${flag}`\n : `unsupported flag: ${flag}`;\n }\n }\n return undefined;\n}\n\nexport function parseCount(values: Map<string, string>): number | string {\n const raw = values.get(\"--count\") ?? values.get(\"-c\");\n if (raw === undefined) return 1;\n if (raw === \"\") return \"--count requires a value\";\n if (!/^[1-9][0-9]*$/.test(raw)) return `--count must be a positive integer, got '${raw}'`;\n const count = Number.parseInt(raw, 10);\n if (!Number.isSafeInteger(count) || count > maxGenerateCount) {\n return `--count must be at most ${maxGenerateCount}, got '${raw}'`;\n }\n return count;\n}\n\nexport function parseBits(values: Map<string, string>): number | string {\n const raw = values.get(\"--bits\");\n if (raw === undefined) return 256;\n if (raw === \"\") return \"--bits requires a value\";\n if (raw === \"128\") return 128;\n if (raw === \"192\") return 192;\n if (raw === \"256\") return 256;\n return `--bits must be 128, 192, or 256, got '${raw}'`;\n}\n\nexport type WrappedKindValue = \"u32\" | \"i32\" | \"u64\" | \"i64\";\n\nexport function parseKind(values: Map<string, string>): WrappedKindValue | string | undefined {\n const raw = values.get(\"--kind\");\n if (raw === undefined) return undefined;\n if (raw === \"\") return \"--kind requires a value\";\n if (raw === \"u32\" || raw === \"i32\" || raw === \"u64\" || raw === \"i64\") return raw;\n return `--kind must be u32, i32, u64, or i64, got '${raw}'`;\n}\n\nexport function isKindError(result: WrappedKindValue | string): result is string {\n return result !== \"u32\" && result !== \"i32\" && result !== \"u64\" && result !== \"i64\";\n}\n","import type { RunOpts } from \"./types.js\";\n\nexport type KeyFormat = \"hex\" | \"base64url\";\n\nexport type KeyFacet<K> = {\n envVar: string;\n formatEnvVar: string;\n // Not yet consumed by any helper here; the keygen-delegation chunk wires it.\n encode: (bytes: Uint8Array, format: KeyFormat) => string;\n decode: (raw: string, format: KeyFormat) => Uint8Array;\n import: (bytes: Uint8Array) => K | Promise<K>;\n};\n\nexport function isKeyFormatError(result: KeyFormat | string): result is string {\n return result !== \"hex\" && result !== \"base64url\";\n}\n\nfunction parseKeyFormatFlag(values: Map<string, string>): KeyFormat | string | undefined {\n const fromFlag = values.get(\"--key-format\");\n if (fromFlag === undefined) return undefined;\n if (fromFlag === \"\") return \"--key-format requires a value\";\n if (fromFlag === \"hex\" || fromFlag === \"base64url\") return fromFlag;\n return `--key-format must be hex or base64url, got '${fromFlag}'`;\n}\n\nexport function parseKeyFormatFromFlag(values: Map<string, string>): KeyFormat | string {\n const fromFlag = parseKeyFormatFlag(values);\n if (fromFlag === undefined) return \"hex\";\n return fromFlag;\n}\n\nexport function parseKeyFormat(\n values: Map<string, string>,\n opts: RunOpts,\n facet: Pick<KeyFacet<unknown>, \"formatEnvVar\">,\n): KeyFormat | string {\n const fromFlag = parseKeyFormatFlag(values);\n if (fromFlag !== undefined) return fromFlag;\n const env = opts.env ?? process.env;\n const fromEnv = env[facet.formatEnvVar];\n if (fromEnv === undefined || fromEnv === \"\") return \"hex\";\n if (fromEnv === \"hex\" || fromEnv === \"base64url\") return fromEnv;\n return `${facet.formatEnvVar} must be hex or base64url, got '${fromEnv}'`;\n}\n\nexport async function loadKey<K>(\n opts: RunOpts,\n format: KeyFormat,\n facet: Pick<KeyFacet<K>, \"envVar\" | \"decode\" | \"import\">,\n): Promise<K | string> {\n const env = opts.env ?? process.env;\n const raw = env[facet.envVar];\n if (raw === undefined || raw === \"\") return `missing ${facet.envVar} environment variable`;\n try {\n return await facet.import(facet.decode(raw, format));\n } catch (err) {\n return (err as Error).message;\n }\n}\n","import {\n decodeOpaqueKey,\n importOpaqueKey,\n type OpaqueKey,\n type OpaqueKeyFormat,\n} from \"../opaque.js\";\nimport { loadKey, parseKeyFormat, parseKeyFormatFromFlag } from \"./key-io.js\";\nimport type { RunOpts } from \"./types.js\";\n\nconst opaqueFacet = {\n envVar: \"IDS_KEY\",\n formatEnvVar: \"IDS_KEY_FORMAT\",\n decode: decodeOpaqueKey,\n import: importOpaqueKey,\n};\n\nexport function parseKeygenFormat(values: Map<string, string>): OpaqueKeyFormat | string {\n return parseKeyFormatFromFlag(values);\n}\n\nexport function parseOpaqueKeyFormat(\n values: Map<string, string>,\n opts: RunOpts,\n): OpaqueKeyFormat | string {\n return parseKeyFormat(values, opts, opaqueFacet);\n}\n\nexport async function loadOpaqueKey(\n opts: RunOpts,\n format: OpaqueKeyFormat,\n): Promise<OpaqueKey | string> {\n return loadKey(opts, format, opaqueFacet);\n}\n","import {\n decodeSigningKey,\n importSigningKey,\n type SigningKey,\n type SigningKeyFormat,\n} from \"../signed.js\";\nimport { loadKey, parseKeyFormat } from \"./key-io.js\";\nimport type { RunOpts } from \"./types.js\";\n\nconst signingFacet = {\n envVar: \"IDS_SIGNING_KEY\",\n formatEnvVar: \"IDS_SIGNING_KEY_FORMAT\",\n decode: decodeSigningKey,\n import: importSigningKey,\n};\n\nexport function parseSigningKeyFormat(\n values: Map<string, string>,\n opts: RunOpts,\n): SigningKeyFormat | string {\n return parseKeyFormat(values, opts, signingFacet);\n}\n\nexport async function loadSigningKey(\n opts: RunOpts,\n format: SigningKeyFormat,\n): Promise<SigningKey | string> {\n return loadKey(opts, format, signingFacet);\n}\n","import { createTimestampId } from \"../../timestamp.js\";\nimport { createOpaqueTimestampId, type OpaqueKeyFormat } from \"../../opaque.js\";\nimport { createReverseTimestampId } from \"../../reverse.js\";\nimport { createSignedTimestampId } from \"../../signed.js\";\nimport { codecOpts } from \"../codec-options.js\";\nimport { formatCliError } from \"../format.js\";\nimport { parseCount, splitFlags, unsupportedFlagForCommand } from \"../flags.js\";\nimport { isKeyFormatError } from \"../key-io.js\";\nimport { loadOpaqueKey, parseOpaqueKeyFormat } from \"../opaque-key.js\";\nimport { loadSigningKey, parseSigningKeyFormat } from \"../signing-key.js\";\nimport type { SigningKeyFormat } from \"../../signed.js\";\nimport type { RunOpts } from \"../types.js\";\n\nexport function runGenerate(args: ReadonlyArray<string>, opts: RunOpts): Promise<number> {\n const { flags, values, positionals, errors } = splitFlags(args);\n const unsupported = unsupportedFlagForCommand(\n \"generate\",\n flags,\n new Set([\"--count\", \"-c\", \"--opaque\", \"--reverse\", \"--signed\", \"--key-format\"]),\n );\n if (unsupported !== undefined) {\n opts.stderr(unsupported + \"\\n\");\n return Promise.resolve(1);\n }\n if (errors[0] !== undefined) {\n opts.stderr(errors[0] + \"\\n\");\n return Promise.resolve(1);\n }\n const extra = positionals[1];\n if (extra !== undefined) {\n opts.stderr(`unexpected argument: ${extra}\\n`);\n return Promise.resolve(1);\n }\n const [brand] = positionals;\n const count = parseCount(values);\n if (typeof count === \"string\") {\n opts.stderr(count + \"\\n\");\n return Promise.resolve(1);\n }\n const opaque = flags.has(\"--opaque\");\n const reverse = flags.has(\"--reverse\");\n const signed = flags.has(\"--signed\");\n if (reverse && opaque) {\n opts.stderr(\"cannot use --reverse and --opaque together\\n\");\n return Promise.resolve(1);\n }\n if (signed && opaque) {\n opts.stderr(\"cannot use --signed and --opaque together\\n\");\n return Promise.resolve(1);\n }\n if (signed && reverse) {\n opts.stderr(\"cannot use --signed and --reverse together\\n\");\n return Promise.resolve(1);\n }\n if (!opaque && !signed && flags.has(\"--key-format\")) {\n opts.stderr(\"--key-format requires --opaque or --signed\\n\");\n return Promise.resolve(1);\n }\n if (opaque) {\n const format = parseOpaqueKeyFormat(values, opts);\n if (isKeyFormatError(format)) {\n opts.stderr(format + \"\\n\");\n return Promise.resolve(1);\n }\n return runOpaqueGenerate(brand ?? \"\", count, format, opts);\n }\n if (signed) {\n const format = parseSigningKeyFormat(values, opts);\n if (isKeyFormatError(format)) {\n opts.stderr(format + \"\\n\");\n return Promise.resolve(1);\n }\n return runSignedGenerate(brand ?? \"\", count, format, opts);\n }\n if (reverse) {\n let codec;\n try {\n codec = createReverseTimestampId(brand ?? \"\", codecOpts(opts));\n } catch (err) {\n opts.stderr(formatCliError(err) + \"\\n\");\n return Promise.resolve(1);\n }\n for (let i = 0; i < count; i++) opts.stdout(codec.generate() + \"\\n\");\n return Promise.resolve(0);\n }\n let codec;\n try {\n codec = createTimestampId(brand ?? \"\", codecOpts(opts));\n } catch (err) {\n opts.stderr(formatCliError(err) + \"\\n\");\n return Promise.resolve(1);\n }\n for (let i = 0; i < count; i++) opts.stdout(codec.generate() + \"\\n\");\n return Promise.resolve(0);\n}\n\nasync function runOpaqueGenerate(\n brand: string,\n count: number,\n format: OpaqueKeyFormat,\n opts: RunOpts,\n): Promise<number> {\n const keyResult = await loadOpaqueKey(opts, format);\n if (typeof keyResult === \"string\") {\n opts.stderr(keyResult + \"\\n\");\n return 1;\n }\n let codec;\n try {\n codec = createOpaqueTimestampId(brand, { key: keyResult, ...codecOpts(opts) });\n } catch (err) {\n opts.stderr(formatCliError(err) + \"\\n\");\n return 1;\n }\n for (let i = 0; i < count; i++) opts.stdout((await codec.generate()) + \"\\n\");\n return 0;\n}\n\nasync function runSignedGenerate(\n brand: string,\n count: number,\n format: SigningKeyFormat,\n opts: RunOpts,\n): Promise<number> {\n const keyResult = await loadSigningKey(opts, format);\n if (typeof keyResult === \"string\") {\n opts.stderr(keyResult + \"\\n\");\n return 1;\n }\n let codec;\n try {\n codec = createSignedTimestampId(brand, {\n keys: [keyResult],\n allowDuplicateBrand: true,\n ...codecOpts(opts),\n });\n } catch (err) {\n opts.stderr(formatCliError(err) + \"\\n\");\n return 1;\n }\n for (let i = 0; i < count; i++) opts.stdout((await codec.generate()) + \"\\n\");\n return 0;\n}\n","import {\n decodeWrappingKey,\n importWrappingKey,\n type WrappingKey,\n type WrappingKeyFormat,\n} from \"../wrapped.js\";\nimport { loadKey, parseKeyFormat } from \"./key-io.js\";\nimport type { RunOpts } from \"./types.js\";\n\nconst wrappingFacet = {\n envVar: \"IDS_WRAPPING_KEY\",\n formatEnvVar: \"IDS_WRAPPING_KEY_FORMAT\",\n decode: decodeWrappingKey,\n import: importWrappingKey,\n};\n\nexport function parseWrappingKeyFormat(\n values: Map<string, string>,\n opts: RunOpts,\n): WrappingKeyFormat | string {\n return parseKeyFormat(values, opts, wrappingFacet);\n}\n\nexport async function loadWrappingKey(\n opts: RunOpts,\n format: WrappingKeyFormat,\n): Promise<WrappingKey | string> {\n return loadKey(opts, format, wrappingFacet);\n}\n","import { maxGenerateCount } from \"./constants.js\";\n\nexport function usage(): string {\n return [\n \"Usage: ids <subcommand> [args]\",\n \"\",\n \"Subcommands:\",\n \" inspect, i <id> [--opaque] [--wrapped --kind u32|i32|u64|i64] [--reverse] [--signed] [--key-format hex|base64url]\",\n \" Decode an ID and print brand, timestamp (or lookup key), and canonical form.\",\n \" --opaque reads the AES key from IDS_KEY (hex by default; IDS_KEY_FORMAT or --key-format).\",\n \" --wrapped reads the wrapping key from IDS_WRAPPING_KEY (hex by default; IDS_WRAPPING_KEY_FORMAT or --key-format).\",\n \" --kind is required with --wrapped: u32, i32, u64, or i64.\",\n \" --reverse decodes a Reverse Timestamp ID (newest-first sort order).\",\n \" --signed decodes a Signed Timestamp ID; reads signing key from IDS_SIGNING_KEY (hex by default; IDS_SIGNING_KEY_FORMAT or --key-format).\",\n \" Without IDS_SIGNING_KEY, --signed prints the timestamp only (no verification). With IDS_SIGNING_KEY, prints verification: ok or failed.\",\n \" generate, g <brand> [--count, -c N] [--opaque] [--reverse] [--signed] [--key-format hex|base64url]\",\n ` Mint 1..${maxGenerateCount} canonical IDs for the given brand.`,\n \" --opaque reads the AES key from IDS_KEY (hex by default; IDS_KEY_FORMAT or --key-format).\",\n \" --reverse mints Reverse Timestamp IDs (newest-first sort order).\",\n \" --signed mints Signed Timestamp IDs; reads signing key from IDS_SIGNING_KEY (hex by default; IDS_SIGNING_KEY_FORMAT or --key-format).\",\n \" keygen, k [--wrapped] [--signed] [--bits 128|192|256] [--key-format hex|base64url]\",\n \" Emit a random key for importOpaqueKey, importWrappingKey, or importSigningKey (stdout only).\",\n \" --wrapped emits a wrapping key for importWrappingKey instead (IDS_WRAPPING_KEY).\",\n \" --signed emits a signing key for importSigningKey instead (IDS_SIGNING_KEY; hex by default; IDS_SIGNING_KEY_FORMAT or --key-format).\",\n \"\",\n ].join(\"\\n\");\n}\n","import { createTimestampId } from \"../../timestamp.js\";\nimport { createOpaqueTimestampId, type OpaqueKeyFormat } from \"../../opaque.js\";\nimport { createReverseTimestampId } from \"../../reverse.js\";\nimport { createSignedTimestampId } from \"../../signed.js\";\nimport { createWrappedKeyId, type WrappingKey } from \"../../wrapped.js\";\nimport { codecOpts } from \"../codec-options.js\";\nimport {\n formatCliError,\n formatInspectOutput,\n formatSignedInspectOutput,\n formatWrappedInspectOutput,\n} from \"../format.js\";\nimport {\n isKindError,\n parseKind,\n splitFlags,\n unsupportedFlagForCommand,\n type WrappedKindValue,\n} from \"../flags.js\";\nimport { isKeyFormatError } from \"../key-io.js\";\nimport { loadOpaqueKey, parseOpaqueKeyFormat } from \"../opaque-key.js\";\nimport { loadSigningKey, parseSigningKeyFormat } from \"../signing-key.js\";\nimport type { SigningKeyFormat } from \"../../signed.js\";\nimport { loadWrappingKey, parseWrappingKeyFormat } from \"../wrapping-key.js\";\nimport type { RunOpts } from \"../types.js\";\nimport { usage } from \"../usage.js\";\n\nexport function runInspect(args: ReadonlyArray<string>, opts: RunOpts): Promise<number> {\n const { flags, values, positionals, errors } = splitFlags(args);\n const unsupported = unsupportedFlagForCommand(\n \"inspect\",\n flags,\n new Set([\"--opaque\", \"--wrapped\", \"--reverse\", \"--signed\", \"--kind\", \"--key-format\"]),\n );\n if (unsupported !== undefined) {\n opts.stderr(unsupported + \"\\n\");\n return Promise.resolve(1);\n }\n if (errors[0] !== undefined) {\n opts.stderr(errors[0] + \"\\n\");\n return Promise.resolve(1);\n }\n const [input] = positionals;\n if (input === undefined) {\n opts.stderr(usage());\n return Promise.resolve(1);\n }\n const extra = positionals[1];\n if (extra !== undefined) {\n opts.stderr(`unexpected argument: ${extra}\\n`);\n return Promise.resolve(1);\n }\n const opaque = flags.has(\"--opaque\");\n const wrapped = flags.has(\"--wrapped\");\n const reverse = flags.has(\"--reverse\");\n const signed = flags.has(\"--signed\");\n if (opaque && wrapped) {\n opts.stderr(\"cannot use --wrapped and --opaque together\\n\");\n return Promise.resolve(1);\n }\n if (reverse && opaque) {\n opts.stderr(\"cannot use --reverse and --opaque together\\n\");\n return Promise.resolve(1);\n }\n if (reverse && wrapped) {\n opts.stderr(\"cannot use --reverse and --wrapped together\\n\");\n return Promise.resolve(1);\n }\n if (signed && opaque) {\n opts.stderr(\"cannot use --signed and --opaque together\\n\");\n return Promise.resolve(1);\n }\n if (signed && wrapped) {\n opts.stderr(\"cannot use --signed and --wrapped together\\n\");\n return Promise.resolve(1);\n }\n if (signed && reverse) {\n opts.stderr(\"cannot use --signed and --reverse together\\n\");\n return Promise.resolve(1);\n }\n if (!opaque && !wrapped && !signed && flags.has(\"--key-format\")) {\n opts.stderr(\"--key-format requires --opaque, --wrapped, or --signed\\n\");\n return Promise.resolve(1);\n }\n const brand = input.slice(0, 3).toLowerCase();\n if (wrapped) {\n const kind = parseKind(values);\n if (kind === undefined) {\n opts.stderr(\"--kind is required with --wrapped\\n\");\n return Promise.resolve(1);\n }\n if (isKindError(kind)) {\n opts.stderr(kind + \"\\n\");\n return Promise.resolve(1);\n }\n const format = parseWrappingKeyFormat(values, opts);\n if (isKeyFormatError(format)) {\n opts.stderr(format + \"\\n\");\n return Promise.resolve(1);\n }\n return runWrappedInspect(brand, input, kind, format, opts);\n }\n if (opaque) {\n const format = parseOpaqueKeyFormat(values, opts);\n if (isKeyFormatError(format)) {\n opts.stderr(format + \"\\n\");\n return Promise.resolve(1);\n }\n return runOpaqueInspect(brand, input, format, opts);\n }\n if (signed) {\n const format = parseSigningKeyFormat(values, opts);\n if (isKeyFormatError(format)) {\n opts.stderr(format + \"\\n\");\n return Promise.resolve(1);\n }\n return runSignedInspect(brand, input, format, opts);\n }\n if (reverse) {\n let reverseCodec;\n try {\n reverseCodec = createReverseTimestampId(brand, codecOpts(opts));\n } catch (err) {\n opts.stderr(formatCliError(err) + \"\\n\");\n return Promise.resolve(1);\n }\n const reverseValidation = reverseCodec[\"~standard\"].validate(input);\n if (reverseValidation.issues) {\n opts.stderr(reverseValidation.issues[0]!.message + \"\\n\");\n return Promise.resolve(1);\n }\n const reverseCanonical = reverseValidation.value;\n const reverseTimestamp = reverseCodec.extractTimestamp(reverseCanonical);\n const reverseNowMs = (opts.now ?? Date.now)();\n opts.stdout(\n formatInspectOutput({\n brand,\n timestamp: reverseTimestamp,\n canonical: reverseCanonical,\n input,\n nowMs: reverseNowMs,\n }),\n );\n return Promise.resolve(0);\n }\n let codec;\n try {\n codec = createTimestampId(brand, codecOpts(opts));\n } catch (err) {\n opts.stderr(formatCliError(err) + \"\\n\");\n return Promise.resolve(1);\n }\n const validation = codec[\"~standard\"].validate(input);\n if (validation.issues) {\n opts.stderr(validation.issues[0]!.message + \"\\n\");\n return Promise.resolve(1);\n }\n const canonical = validation.value;\n const timestamp = codec.extractTimestamp(canonical);\n const nowMs = (opts.now ?? Date.now)();\n opts.stdout(\n formatInspectOutput({\n brand,\n timestamp,\n canonical,\n input,\n nowMs,\n }),\n );\n return Promise.resolve(0);\n}\n\nasync function runWrappedInspect(\n brand: string,\n input: string,\n kind: WrappedKindValue,\n format: string,\n opts: RunOpts,\n): Promise<number> {\n const keyResult = await loadWrappingKey(opts, format as \"hex\" | \"base64url\");\n if (typeof keyResult === \"string\") {\n opts.stderr(keyResult + \"\\n\");\n return 1;\n }\n let codec;\n try {\n codec = createWrappedKeyId(brand, {\n kind,\n keys: [keyResult as WrappingKey],\n allowDuplicateBrand: true,\n });\n } catch (err) {\n opts.stderr(formatCliError(err) + \"\\n\");\n return 1;\n }\n const validation = codec[\"~standard\"].validate(input);\n if (validation.issues) {\n opts.stderr(validation.issues[0]!.message + \"\\n\");\n return 1;\n }\n const canonical = validation.value;\n let lookupKey;\n try {\n lookupKey = await codec.unwrap(canonical);\n } catch (err) {\n opts.stderr(formatCliError(err) + \"\\n\");\n return 1;\n }\n opts.stdout(\n formatWrappedInspectOutput({\n brand,\n lookupKey,\n canonical,\n input,\n }),\n );\n return 0;\n}\n\nasync function runOpaqueInspect(\n brand: string,\n input: string,\n format: OpaqueKeyFormat,\n opts: RunOpts,\n): Promise<number> {\n const keyResult = await loadOpaqueKey(opts, format);\n if (typeof keyResult === \"string\") {\n opts.stderr(keyResult + \"\\n\");\n return 1;\n }\n let codec;\n try {\n codec = createOpaqueTimestampId(brand, { key: keyResult, ...codecOpts(opts) });\n } catch (err) {\n opts.stderr(formatCliError(err) + \"\\n\");\n return 1;\n }\n const validation = codec[\"~standard\"].validate(input);\n if (validation.issues) {\n opts.stderr(validation.issues[0]!.message + \"\\n\");\n return 1;\n }\n const canonical = validation.value;\n const timestamp = await codec.extractTimestamp(canonical);\n const nowMs = (opts.now ?? Date.now)();\n opts.stderr(\n \"note: timestamp assumes IDS_KEY matches the key used at generation; a wrong key yields a plausible but incorrect timestamp\\n\",\n );\n opts.stdout(\n formatInspectOutput({\n brand,\n timestamp,\n canonical,\n input,\n nowMs,\n }),\n );\n return 0;\n}\n\nasync function runSignedInspect(\n brand: string,\n input: string,\n format: SigningKeyFormat,\n opts: RunOpts,\n): Promise<number> {\n let structCodec;\n try {\n structCodec = createTimestampId(brand, codecOpts(opts));\n } catch (err) {\n opts.stderr(formatCliError(err) + \"\\n\");\n return 1;\n }\n const validation = structCodec[\"~standard\"].validate(input);\n if (validation.issues) {\n opts.stderr(validation.issues[0]!.message + \"\\n\");\n return 1;\n }\n const canonical = validation.value;\n const timestamp = structCodec.extractTimestamp(canonical);\n const nowMs = (opts.now ?? Date.now)();\n\n const env = opts.env ?? process.env;\n const rawKey = env.IDS_SIGNING_KEY;\n if (rawKey === undefined) {\n opts.stdout(formatSignedInspectOutput({ brand, timestamp, canonical, input, nowMs }));\n return 0;\n }\n\n const keyResult = await loadSigningKey(opts, format);\n if (typeof keyResult === \"string\") {\n opts.stderr(keyResult + \"\\n\");\n return 1;\n }\n // Brand was already validated by createTimestampId above; single key is non-empty and\n // non-duplicate by construction; allowDuplicateBrand silences the registry check. Cannot throw.\n const signedCodec = createSignedTimestampId(brand, {\n keys: [keyResult],\n allowDuplicateBrand: true,\n ...codecOpts(opts),\n });\n const verifyResult = await signedCodec.safeVerify(input);\n if (!verifyResult.ok) {\n /* v8 ignore next 4 -- defensive: both codecs share the same wire parse so ParseError\n is unreachable after the createTimestampId pre-validation above passes */\n if (verifyResult.error !== \"verification_failed\") {\n opts.stderr(verifyResult.error + \"\\n\");\n return 1;\n }\n opts.stdout(\n formatSignedInspectOutput({\n brand,\n timestamp,\n canonical,\n input,\n nowMs,\n verification: \"failed\",\n }),\n );\n return 1;\n }\n opts.stdout(\n formatSignedInspectOutput({\n brand,\n timestamp,\n canonical: verifyResult.id,\n input,\n nowMs,\n verification: \"ok\",\n }),\n );\n return 0;\n}\n","import { encodeOpaqueKey } from \"../../opaque.js\";\nimport { encodeSigningKey } from \"../../signed.js\";\nimport { encodeWrappingKey } from \"../../wrapped.js\";\nimport { parseBits, splitFlags, unsupportedFlagForCommand } from \"../flags.js\";\nimport { isKeyFormatError } from \"../key-io.js\";\nimport { parseKeygenFormat } from \"../opaque-key.js\";\nimport type { RunOpts } from \"../types.js\";\n\nexport function runKeygen(args: ReadonlyArray<string>, opts: RunOpts): Promise<number> {\n const { flags, values, positionals, errors } = splitFlags(args);\n const unsupported = unsupportedFlagForCommand(\n \"keygen\",\n flags,\n new Set([\"--signed\", \"--wrapped\", \"--bits\", \"--key-format\"]),\n );\n if (unsupported !== undefined) {\n opts.stderr(unsupported + \"\\n\");\n return Promise.resolve(1);\n }\n if (errors[0] !== undefined) {\n opts.stderr(errors[0] + \"\\n\");\n return Promise.resolve(1);\n }\n const extra = positionals[0];\n if (extra !== undefined) {\n opts.stderr(`unexpected argument: ${extra}\\n`);\n return Promise.resolve(1);\n }\n const signed = flags.has(\"--signed\");\n const wrapped = flags.has(\"--wrapped\");\n if (signed && wrapped) {\n opts.stderr(\"cannot use --signed and --wrapped together\\n\");\n return Promise.resolve(1);\n }\n const bits = parseBits(values);\n if (typeof bits === \"string\") {\n opts.stderr(bits + \"\\n\");\n return Promise.resolve(1);\n }\n const format = parseKeygenFormat(values);\n if (isKeyFormatError(format)) {\n opts.stderr(format + \"\\n\");\n return Promise.resolve(1);\n }\n const bytes = new Uint8Array(bits / 8);\n crypto.getRandomValues(bytes);\n let encoded: string;\n if (signed) {\n encoded = encodeSigningKey(bytes, format);\n } else if (wrapped) {\n encoded = encodeWrappingKey(bytes, format);\n } else {\n encoded = encodeOpaqueKey(bytes, format);\n }\n opts.stdout(encoded + \"\\n\");\n return Promise.resolve(0);\n}\n","import { runGenerate } from \"./cli/commands/generate.js\";\nimport { runInspect } from \"./cli/commands/inspect.js\";\nimport { runKeygen } from \"./cli/commands/keygen.js\";\nimport type { CommandHandler, RunOpts } from \"./cli/types.js\";\nimport { usage } from \"./cli/usage.js\";\n\nexport type { RunOpts } from \"./cli/types.js\";\n\ntype Command = {\n names: ReadonlyArray<string>;\n run: CommandHandler;\n};\n\nconst commands: ReadonlyArray<Command> = [\n { names: [\"generate\", \"g\"], run: runGenerate },\n { names: [\"inspect\", \"i\"], run: runInspect },\n { names: [\"keygen\", \"k\"], run: runKeygen },\n];\n\nexport async function run(opts: RunOpts): Promise<number> {\n const [subcommand, ...rest] = opts.argv;\n const command = commands.find((candidate) => candidate.names.includes(subcommand ?? \"\"));\n if (command !== undefined) return command.run(rest, opts);\n if (subcommand === undefined || subcommand === \"--help\" || subcommand === \"-h\") {\n opts.stdout(usage());\n return 0;\n }\n opts.stderr(usage());\n return 1;\n}\n","#!/usr/bin/env node\nimport { run } from \"../src/cli.js\";\n\nprocess.exitCode = await run({\n argv: process.argv.slice(2),\n stdout: (s) => process.stdout.write(s),\n stderr: (s) => process.stderr.write(s),\n});\n"],"mappings":"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"}