@smonn/ids 0.7.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.
- package/README.md +129 -20
- package/dist/adapter-types-BY-wrYYB.mjs +27 -0
- package/dist/adapter-types-BY-wrYYB.mjs.map +1 -0
- package/dist/adapter-types-unUcmMXC.d.mts +20 -0
- package/dist/adapter-types-unUcmMXC.d.mts.map +1 -0
- package/dist/cli.mjs +213 -47
- package/dist/cli.mjs.map +1 -1
- package/dist/{codec-shell-DH-UO4UR.mjs → codec-shell-C7_B4oum.mjs} +4 -3
- package/dist/codec-shell-C7_B4oum.mjs.map +1 -0
- package/dist/{drizzle-CeSni5PB.d.mts → drizzle-CHtyDXpv.d.mts} +4 -15
- package/dist/drizzle-CHtyDXpv.d.mts.map +1 -0
- package/dist/drizzle.d.mts +3 -2
- package/dist/drizzle.mjs +2 -3
- package/dist/drizzle.mjs.map +1 -1
- package/dist/express.d.mts +2 -5
- package/dist/express.d.mts.map +1 -1
- package/dist/express.mjs +3 -8
- package/dist/express.mjs.map +1 -1
- package/dist/fastify.d.mts +12 -6
- package/dist/fastify.d.mts.map +1 -1
- package/dist/fastify.mjs +10 -8
- package/dist/fastify.mjs.map +1 -1
- package/dist/hono.d.mts +2 -5
- package/dist/hono.d.mts.map +1 -1
- package/dist/hono.mjs +3 -8
- package/dist/hono.mjs.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/key-material-DUHhmMq-.mjs +137 -0
- package/dist/key-material-DUHhmMq-.mjs.map +1 -0
- package/dist/kysely.d.mts +1 -1
- package/dist/kysely.d.mts.map +1 -1
- package/dist/{opaque-uvjOFY_0.mjs → opaque-BQOlZ2oD.mjs} +8 -44
- package/dist/opaque-BQOlZ2oD.mjs.map +1 -0
- package/dist/opaque.d.mts +8 -0
- package/dist/opaque.d.mts.map +1 -1
- package/dist/opaque.mjs +1 -1
- package/dist/prisma.d.mts +3 -16
- package/dist/prisma.d.mts.map +1 -1
- package/dist/prisma.mjs +2 -3
- package/dist/prisma.mjs.map +1 -1
- package/dist/{reverse-BgFU6JHw.mjs → reverse-C12D1btB.mjs} +4 -6
- package/dist/reverse-C12D1btB.mjs.map +1 -0
- package/dist/reverse.d.mts.map +1 -1
- package/dist/reverse.mjs +1 -1
- package/dist/rng-CPJOx_nE.mjs +9 -0
- package/dist/rng-CPJOx_nE.mjs.map +1 -0
- package/dist/signed-CwqKTFaQ.mjs +207 -0
- package/dist/signed-CwqKTFaQ.mjs.map +1 -0
- package/dist/signed.d.mts +112 -1
- package/dist/signed.d.mts.map +1 -1
- package/dist/signed.mjs +2 -99
- package/dist/{timestamp-B5_UCzc6.mjs → timestamp-BjIMQkJf.mjs} +3 -3
- package/dist/{timestamp-B5_UCzc6.mjs.map → timestamp-BjIMQkJf.mjs.map} +1 -1
- package/dist/{timestamp-bytes-BBY7JI33.mjs → timestamp-bytes-Bbg6Y66Z.mjs} +2 -2
- package/dist/{timestamp-bytes-BBY7JI33.mjs.map → timestamp-bytes-Bbg6Y66Z.mjs.map} +1 -1
- package/dist/{wrapped-0vL72Nje.mjs → wrapped-DKOsN_dq.mjs} +16 -50
- package/dist/wrapped-DKOsN_dq.mjs.map +1 -0
- package/dist/wrapped.d.mts.map +1 -1
- package/dist/wrapped.mjs +1 -1
- package/package.json +1 -1
- package/dist/adapter-types-oHCCSgOO.d.mts +0 -12
- package/dist/adapter-types-oHCCSgOO.d.mts.map +0 -1
- package/dist/bytes-lhzKVaBV.mjs +0 -53
- package/dist/bytes-lhzKVaBV.mjs.map +0 -1
- package/dist/codec-shell-DH-UO4UR.mjs.map +0 -1
- package/dist/drizzle-CeSni5PB.d.mts.map +0 -1
- package/dist/opaque-uvjOFY_0.mjs.map +0 -1
- package/dist/reverse-BgFU6JHw.mjs.map +0 -1
- package/dist/signed.mjs.map +0 -1
- 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-
|
|
4
|
-
import { i as importOpaqueKey, n as decodeOpaqueKey, r as encodeOpaqueKey, t as createOpaqueTimestampId } from "./opaque-
|
|
5
|
-
import { t as createReverseTimestampId } from "./reverse-
|
|
6
|
-
import { i as
|
|
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/
|
|
202
|
+
//#region src/cli/key-io.ts
|
|
193
203
|
function isKeyFormatError(result) {
|
|
194
204
|
return result !== "hex" && result !== "base64url";
|
|
195
205
|
}
|
|
196
|
-
function parseKeyFormatFlag
|
|
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
|
|
204
|
-
const fromFlag = parseKeyFormatFlag
|
|
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
|
|
209
|
-
const fromFlag = parseKeyFormatFlag
|
|
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).
|
|
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
|
|
224
|
+
return `${facet.formatEnvVar} must be hex or base64url, got '${fromEnv}'`;
|
|
215
225
|
}
|
|
216
|
-
async function
|
|
217
|
-
const raw = (opts.env ?? process.env).
|
|
218
|
-
if (raw === void 0 || raw === "") return
|
|
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
|
|
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 (
|
|
262
|
-
opts.stderr("--
|
|
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
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
"
|
|
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
|
-
"
|
|
357
|
-
"
|
|
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 (
|
|
407
|
-
opts.stderr("--
|
|
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
|
-
|
|
592
|
-
|
|
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":";;;;;;;AAGA,SAAgB,UAAU,MAA0C;CAGlE,MAAM,IAA+B,EAAE,qBAAqB,KAAK;CACjE,IAAI,KAAK,QAAQ,KAAA,GAAW,EAAE,MAAM,KAAK;CACzC,IAAI,KAAK,QAAQ,KAAA,GAAW,EAAE,MAAM,KAAK;CACzC,OAAO;AACT;;;ACQA,SAAgB,eAAe,KAAsB;CACnD,OAAO,WAAW,GAAG,IACjB,GAAG,IAAI,KAAK,IAAI,IAAI,YACpB,eAAe,QACb,IAAI,UACJ,OAAO,GAAG;AAClB;AAEA,SAAgB,2BAA2B,QAAsC;CAC/E,MAAM,YAAY,kBAAkB,OAAO,OAAO,OAAO,SAAS;CAClE,OAAO;EACL,eAAe,OAAO;EACtB,eAAe,OAAO,UAAU,SAAS;EACzC,eAAe,OAAO;EACtB,eAAe;EACf;CACF,CAAC,CAAC,KAAK,IAAI;AACb;AAEA,SAAgB,oBAAoB,QAA+B;CACjE,MAAM,WAAW,eAAe,OAAO,UAAU,QAAQ,GAAG,OAAO,KAAK;CACxE,MAAM,YAAY,kBAAkB,OAAO,OAAO,OAAO,SAAS;CAClE,OAAO;EACL,cAAc,OAAO;EACrB,cAAc,OAAO,UAAU,YAAY,EAAE,IAAI,SAAS;EAC1D,cAAc,OAAO;EACrB,cAAc;EACd;CACF,CAAC,CAAC,KAAK,IAAI;AACb;AAEA,SAAgB,kBAAkB,OAAe,WAA+B;CAC9E,IAAI,UAAU,WAAW,OAAO;CAChC,MAAM,QAAkB,CAAC;CACzB,IAAI,UAAU,MAAM,YAAY,GAAG,MAAM,KAAK,eAAe;CAC7D,IAAI,SAAS,KAAK,MAAM,MAAM,CAAC,CAAC,GAAG,MAAM,KAAK,wBAAwB;CACtE,OAAO,kBAAkB,MAAM,KAAK,KAAK,EAAE;AAC7C;AAGA,MAAM,cAAc,KAAK;AACzB,MAAM,YAAY,KAAK;AACvB,MAAM,WAAW,KAAK;AACtB,MAAM,eAAe;AACrB,MAAM,gBAAgB;AAEtB,SAAgB,eAAe,QAAgB,OAAuB;CACpE,MAAM,OAAO,QAAQ;CACrB,MAAM,MAAM,KAAK,IAAI,IAAI;CACzB,MAAM,SAAS,OAAO,IAAI,aAAa;CAEvC,MAAM,OAAO,UAAU,GAAG;CAC1B,OAAO,SAAS,KAAK,aAAa,GAAG,KAAK,GAAG;AAC/C;AAEA,SAAS,UAAU,KAAqB;CACtC,IAAI,MAAM,aAAa,OAAO;CAC9B,IAAI,MAAM,WAAW,OAAO,KAAK,KAAK,MAAM,MAAM,WAAW,GAAG,QAAQ;CACxE,IAAI,MAAM,UAAU,OAAO,KAAK,KAAK,MAAM,MAAM,SAAS,GAAG,MAAM;CACnE,IAAI,MAAM,WAAW,cAAc,OAAO,KAAK,KAAK,MAAM,MAAM,QAAQ,GAAG,KAAK;CAEhF,MAAM,cAAc,KAAK,MAAM,OAAO,WAAW,aAAa;CAC9D,IAAI,cAAc,eAAe,OAAO,KAAK,aAAa,OAAO;CAEjE,MAAM,QAAQ,KAAK,MAAM,cAAc,aAAa;CACpD,MAAM,SAAS,cAAc;CAC7B,OAAO,WAAW,IAAI,KAAK,OAAO,MAAM,IAAI,GAAG,KAAK,OAAO,MAAM,EAAE,GAAG,KAAK,QAAQ,OAAO;AAC5F;AAEA,SAAS,KAAK,GAAW,MAAsB;CAC7C,OAAO,GAAG,EAAE,GAAG,MAAM,IAAI,OAAO,GAAG,KAAK;AAC1C;;;ACzFA,MAAa,mBAAmB;;;ACShC,SAAS,eAAe,KAAgE;CACtF,MAAM,KAAK,IAAI,QAAQ,GAAG;CAC1B,IAAI,MAAM,GAAG,OAAO;EAAE,MAAM;EAAK,aAAa,KAAA;CAAU;CACxD,OAAO;EAAE,MAAM,IAAI,MAAM,GAAG,EAAE;EAAG,aAAa,IAAI,MAAM,KAAK,CAAC;CAAE;AAClE;AAEA,SAAgB,WAAW,MAA0C;CACnE,MAAM,wBAAQ,IAAI,IAAY;CAC9B,MAAM,yBAAS,IAAI,IAAoB;CACvC,MAAM,cAAwB,CAAC;CAC/B,MAAM,SAAmB,CAAC;CAC1B,MAAM,4BAAY,IAAI,IAAY;CAClC,MAAM,aAAa,IAAI,IAAI;EAAC;EAAW;EAAM;EAAU;EAAgB;CAAQ,CAAC;CAChF,MAAM,WAAW,SAAiB;EAChC,MAAM,YAAY,cAAc,IAAI;EACpC,IAAI,UAAU,IAAI,SAAS,GAAG,OAAO,KAAK,mBAAmB,WAAW;EACxE,UAAU,IAAI,SAAS;EACvB,MAAM,IAAI,IAAI;CAChB;CACA,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;EACpC,MAAM,MAAM,KAAK;EACjB,MAAM,EAAE,MAAM,gBAAgB,eAAe,GAAG;EAChD,IAAI,SAAS,cAAc,SAAS,eAAe,SAAS,aAAa;GACvE,QAAQ,IAAI;GACZ,IAAI,gBAAgB,KAAA,GAAW,OAAO,KAAK,+BAA+B,MAAM;GAChF;EACF;EACA,IAAI,WAAW,IAAI,IAAI,GAAG;GACxB,IAAI,gBAAgB,KAAA,GAAW;IAC7B,QAAQ,IAAI;IACZ,OAAO,IAAI,MAAM,WAAW;IAC5B;GACF;GACA,MAAM,QAAQ,KAAK,IAAI;GACvB,IAAI,UAAU,KAAA,KAAa,MAAM,WAAW,GAAG,GAAG;IAChD,QAAQ,IAAI;IACZ,OAAO,IAAI,MAAM,EAAE;IACnB;GACF;GACA,QAAQ,IAAI;GACZ,OAAO,IAAI,MAAM,KAAK;GACtB;GACA;EACF;EACA,IAAI,KAAK,WAAW,GAAG,GAAG;GACxB,QAAQ,IAAI;GACZ;EACF;EACA,YAAY,KAAK,GAAG;CACtB;CACA,OAAO;EAAE;EAAO;EAAQ;EAAa;CAAO;AAC9C;AAEA,SAAS,cAAc,MAAsB;CAC3C,IAAI,SAAS,MAAM,OAAO;CAC1B,OAAO;AACT;AAEA,MAAM,aAAa,IAAI,IAAI;CACzB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,SAAgB,0BACd,SACA,OACA,SACoB;CACpB,KAAK,MAAM,QAAQ,OACjB,IAAI,CAAC,QAAQ,IAAI,IAAI,GACnB,OAAO,WAAW,IAAI,IAAI,IACtB,wBAAwB,QAAQ,IAAI,SACpC,qBAAqB;AAI/B;AAEA,SAAgB,WAAW,QAA8C;CACvE,MAAM,MAAM,OAAO,IAAI,SAAS,KAAK,OAAO,IAAI,IAAI;CACpD,IAAI,QAAQ,KAAA,GAAW,OAAO;CAC9B,IAAI,QAAQ,IAAI,OAAO;CACvB,IAAI,CAAC,gBAAgB,KAAK,GAAG,GAAG,OAAO,4CAA4C,IAAI;CACvF,MAAM,QAAQ,OAAO,SAAS,KAAK,EAAE;CACrC,IAAI,CAAC,OAAO,cAAc,KAAK,KAAK,QAAA,KAClC,OAAO,2BAA2B,iBAAiB,SAAS,IAAI;CAElE,OAAO;AACT;AAEA,SAAgB,UAAU,QAA8C;CACtE,MAAM,MAAM,OAAO,IAAI,QAAQ;CAC/B,IAAI,QAAQ,KAAA,GAAW,OAAO;CAC9B,IAAI,QAAQ,IAAI,OAAO;CACvB,IAAI,QAAQ,OAAO,OAAO;CAC1B,IAAI,QAAQ,OAAO,OAAO;CAC1B,IAAI,QAAQ,OAAO,OAAO;CAC1B,OAAO,yCAAyC,IAAI;AACtD;AAIA,SAAgB,UAAU,QAAoE;CAC5F,MAAM,MAAM,OAAO,IAAI,QAAQ;CAC/B,IAAI,QAAQ,KAAA,GAAW,OAAO,KAAA;CAC9B,IAAI,QAAQ,IAAI,OAAO;CACvB,IAAI,QAAQ,SAAS,QAAQ,SAAS,QAAQ,SAAS,QAAQ,OAAO,OAAO;CAC7E,OAAO,8CAA8C,IAAI;AAC3D;AAEA,SAAgB,YAAY,QAAqD;CAC/E,OAAO,WAAW,SAAS,WAAW,SAAS,WAAW,SAAS,WAAW;AAChF;;;ACvHA,SAAgB,iBAAiB,QAAoD;CACnF,OAAO,WAAW,SAAS,WAAW;AACxC;AAEA,SAASA,qBAAmB,QAAmE;CAC7F,MAAM,WAAW,OAAO,IAAI,cAAc;CAC1C,IAAI,aAAa,KAAA,GAAW,OAAO,KAAA;CACnC,IAAI,aAAa,IAAI,OAAO;CAC5B,IAAI,aAAa,SAAS,aAAa,aAAa,OAAO;CAC3D,OAAO,+CAA+C,SAAS;AACjE;AAEA,SAAgB,kBAAkB,QAAuD;CACvF,MAAM,WAAWA,qBAAmB,MAAM;CAC1C,IAAI,aAAa,KAAA,GAAW,OAAO;CACnC,OAAO;AACT;AAEA,SAAgB,qBACd,QACA,MAC0B;CAC1B,MAAM,WAAWA,qBAAmB,MAAM;CAC1C,IAAI,aAAa,KAAA,GAAW,OAAO;CAEnC,MAAM,WADM,KAAK,OAAO,QAAQ,IAAA,CACZ;CACpB,IAAI,YAAY,KAAA,KAAa,YAAY,IAAI,OAAO;CACpD,IAAI,YAAY,SAAS,YAAY,aAAa,OAAO;CACzD,OAAO,iDAAiD,QAAQ;AAClE;AAEA,eAAsB,cACpB,MACA,QAC6B;CAE7B,MAAM,OADM,KAAK,OAAO,QAAQ,IAAA,CAChB;CAChB,IAAI,QAAQ,KAAA,KAAa,QAAQ,IAAI,OAAO;CAC5C,IAAI;EACF,OAAO,gBAAgB,gBAAgB,KAAK,MAAM,CAAC;CACrD,SAAS,KAAK;EACZ,OAAQ,IAAc;CACxB;AACF;;;AC1CA,SAAgB,YAAY,MAA6B,MAAgC;CACvF,MAAM,EAAE,OAAO,QAAQ,aAAa,WAAW,WAAW,IAAI;CAC9D,MAAM,cAAc,0BAClB,YACA,OACA,IAAI,IAAI;EAAC;EAAW;EAAM;EAAY;EAAa;CAAc,CAAC,CACpE;CACA,IAAI,gBAAgB,KAAA,GAAW;EAC7B,KAAK,OAAO,cAAc,IAAI;EAC9B,OAAO,QAAQ,QAAQ,CAAC;CAC1B;CACA,IAAI,OAAO,OAAO,KAAA,GAAW;EAC3B,KAAK,OAAO,OAAO,KAAK,IAAI;EAC5B,OAAO,QAAQ,QAAQ,CAAC;CAC1B;CACA,MAAM,QAAQ,YAAY;CAC1B,IAAI,UAAU,KAAA,GAAW;EACvB,KAAK,OAAO,wBAAwB,MAAM,GAAG;EAC7C,OAAO,QAAQ,QAAQ,CAAC;CAC1B;CACA,MAAM,CAAC,SAAS;CAChB,MAAM,QAAQ,WAAW,MAAM;CAC/B,IAAI,OAAO,UAAU,UAAU;EAC7B,KAAK,OAAO,QAAQ,IAAI;EACxB,OAAO,QAAQ,QAAQ,CAAC;CAC1B;CACA,MAAM,SAAS,MAAM,IAAI,UAAU;CACnC,MAAM,UAAU,MAAM,IAAI,WAAW;CACrC,IAAI,WAAW,QAAQ;EACrB,KAAK,OAAO,8CAA8C;EAC1D,OAAO,QAAQ,QAAQ,CAAC;CAC1B;CACA,IAAI,CAAC,UAAU,MAAM,IAAI,cAAc,GAAG;EACxC,KAAK,OAAO,kCAAkC;EAC9C,OAAO,QAAQ,QAAQ,CAAC;CAC1B;CACA,IAAI,QAAQ;EACV,MAAM,SAAS,qBAAqB,QAAQ,IAAI;EAChD,IAAI,iBAAiB,MAAM,GAAG;GAC5B,KAAK,OAAO,SAAS,IAAI;GACzB,OAAO,QAAQ,QAAQ,CAAC;EAC1B;EACA,OAAO,kBAAkB,SAAS,IAAI,OAAO,QAAQ,IAAI;CAC3D;CACA,IAAI,SAAS;EACX,IAAI;EACJ,IAAI;GACF,QAAQ,yBAAyB,SAAS,IAAI,UAAU,IAAI,CAAC;EAC/D,SAAS,KAAK;GACZ,KAAK,OAAO,eAAe,GAAG,IAAI,IAAI;GACtC,OAAO,QAAQ,QAAQ,CAAC;EAC1B;EACA,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK,KAAK,OAAO,MAAM,SAAS,IAAI,IAAI;EACnE,OAAO,QAAQ,QAAQ,CAAC;CAC1B;CACA,IAAI;CACJ,IAAI;EACF,QAAQ,kBAAkB,SAAS,IAAI,UAAU,IAAI,CAAC;CACxD,SAAS,KAAK;EACZ,KAAK,OAAO,eAAe,GAAG,IAAI,IAAI;EACtC,OAAO,QAAQ,QAAQ,CAAC;CAC1B;CACA,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK,KAAK,OAAO,MAAM,SAAS,IAAI,IAAI;CACnE,OAAO,QAAQ,QAAQ,CAAC;AAC1B;AAEA,eAAe,kBACb,OACA,OACA,QACA,MACiB;CACjB,MAAM,YAAY,MAAM,cAAc,MAAM,MAAM;CAClD,IAAI,OAAO,cAAc,UAAU;EACjC,KAAK,OAAO,YAAY,IAAI;EAC5B,OAAO;CACT;CACA,IAAI;CACJ,IAAI;EACF,QAAQ,wBAAwB,OAAO;GAAE,KAAK;GAAW,GAAG,UAAU,IAAI;EAAE,CAAC;CAC/E,SAAS,KAAK;EACZ,KAAK,OAAO,eAAe,GAAG,IAAI,IAAI;EACtC,OAAO;CACT;CACA,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK,KAAK,OAAQ,MAAM,MAAM,SAAS,IAAK,IAAI;CAC3E,OAAO;AACT;;;ACvFA,SAAS,mBAAmB,QAAqE;CAC/F,MAAM,WAAW,OAAO,IAAI,cAAc;CAC1C,IAAI,aAAa,KAAA,GAAW,OAAO,KAAA;CACnC,IAAI,aAAa,IAAI,OAAO;CAC5B,IAAI,aAAa,SAAS,aAAa,aAAa,OAAO;CAC3D,OAAO,+CAA+C,SAAS;AACjE;AAEA,SAAgB,uBACd,QACA,MAC4B;CAC5B,MAAM,WAAW,mBAAmB,MAAM;CAC1C,IAAI,aAAa,KAAA,GAAW,OAAO;CAEnC,MAAM,WADM,KAAK,OAAO,QAAQ,IAAA,CACZ;CACpB,IAAI,YAAY,KAAA,KAAa,YAAY,IAAI,OAAO;CACpD,IAAI,YAAY,SAAS,YAAY,aAAa,OAAO;CACzD,OAAO,0DAA0D,QAAQ;AAC3E;AAEA,eAAsB,gBACpB,MACA,QAC+B;CAE/B,MAAM,OADM,KAAK,OAAO,QAAQ,IAAA,CAChB;CAChB,IAAI,QAAQ,KAAA,KAAa,QAAQ,IAAI,OAAO;CAC5C,IAAI;EACF,OAAO,kBAAkB,kBAAkB,KAAK,MAAM,CAAC;CACzD,SAAS,KAAK;EACZ,OAAQ,IAAc;CACxB;AACF;;;ACvCA,SAAgB,QAAgB;CAC9B,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,eAAe,iBAAiB;EAChC;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,IAAI;AACb;;;ACJA,SAAgB,WAAW,MAA6B,MAAgC;CACtF,MAAM,EAAE,OAAO,QAAQ,aAAa,WAAW,WAAW,IAAI;CAC9D,MAAM,cAAc,0BAClB,WACA,OACA,IAAI,IAAI;EAAC;EAAY;EAAa;EAAa;EAAU;CAAc,CAAC,CAC1E;CACA,IAAI,gBAAgB,KAAA,GAAW;EAC7B,KAAK,OAAO,cAAc,IAAI;EAC9B,OAAO,QAAQ,QAAQ,CAAC;CAC1B;CACA,IAAI,OAAO,OAAO,KAAA,GAAW;EAC3B,KAAK,OAAO,OAAO,KAAK,IAAI;EAC5B,OAAO,QAAQ,QAAQ,CAAC;CAC1B;CACA,MAAM,CAAC,SAAS;CAChB,IAAI,UAAU,KAAA,GAAW;EACvB,KAAK,OAAO,MAAM,CAAC;EACnB,OAAO,QAAQ,QAAQ,CAAC;CAC1B;CACA,MAAM,QAAQ,YAAY;CAC1B,IAAI,UAAU,KAAA,GAAW;EACvB,KAAK,OAAO,wBAAwB,MAAM,GAAG;EAC7C,OAAO,QAAQ,QAAQ,CAAC;CAC1B;CACA,MAAM,SAAS,MAAM,IAAI,UAAU;CACnC,MAAM,UAAU,MAAM,IAAI,WAAW;CACrC,MAAM,UAAU,MAAM,IAAI,WAAW;CACrC,IAAI,UAAU,SAAS;EACrB,KAAK,OAAO,8CAA8C;EAC1D,OAAO,QAAQ,QAAQ,CAAC;CAC1B;CACA,IAAI,WAAW,QAAQ;EACrB,KAAK,OAAO,8CAA8C;EAC1D,OAAO,QAAQ,QAAQ,CAAC;CAC1B;CACA,IAAI,WAAW,SAAS;EACtB,KAAK,OAAO,+CAA+C;EAC3D,OAAO,QAAQ,QAAQ,CAAC;CAC1B;CACA,IAAI,CAAC,UAAU,CAAC,WAAW,MAAM,IAAI,cAAc,GAAG;EACpD,KAAK,OAAO,+CAA+C;EAC3D,OAAO,QAAQ,QAAQ,CAAC;CAC1B;CACA,MAAM,QAAQ,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,YAAY;CAC5C,IAAI,SAAS;EACX,MAAM,OAAO,UAAU,MAAM;EAC7B,IAAI,SAAS,KAAA,GAAW;GACtB,KAAK,OAAO,qCAAqC;GACjD,OAAO,QAAQ,QAAQ,CAAC;EAC1B;EACA,IAAI,YAAY,IAAI,GAAG;GACrB,KAAK,OAAO,OAAO,IAAI;GACvB,OAAO,QAAQ,QAAQ,CAAC;EAC1B;EACA,MAAM,SAAS,uBAAuB,QAAQ,IAAI;EAClD,IAAI,iBAAiB,MAAM,GAAG;GAC5B,KAAK,OAAO,SAAS,IAAI;GACzB,OAAO,QAAQ,QAAQ,CAAC;EAC1B;EACA,OAAO,kBAAkB,OAAO,OAAO,MAAM,QAAQ,IAAI;CAC3D;CACA,IAAI,QAAQ;EACV,MAAM,SAAS,qBAAqB,QAAQ,IAAI;EAChD,IAAI,iBAAiB,MAAM,GAAG;GAC5B,KAAK,OAAO,SAAS,IAAI;GACzB,OAAO,QAAQ,QAAQ,CAAC;EAC1B;EACA,OAAO,iBAAiB,OAAO,OAAO,QAAQ,IAAI;CACpD;CACA,IAAI,SAAS;EACX,IAAI;EACJ,IAAI;GACF,eAAe,yBAAyB,OAAO,UAAU,IAAI,CAAC;EAChE,SAAS,KAAK;GACZ,KAAK,OAAO,eAAe,GAAG,IAAI,IAAI;GACtC,OAAO,QAAQ,QAAQ,CAAC;EAC1B;EACA,MAAM,oBAAoB,aAAa,YAAY,CAAC,SAAS,KAAK;EAClE,IAAI,kBAAkB,QAAQ;GAC5B,KAAK,OAAO,kBAAkB,OAAO,EAAE,CAAE,UAAU,IAAI;GACvD,OAAO,QAAQ,QAAQ,CAAC;EAC1B;EACA,MAAM,mBAAmB,kBAAkB;EAC3C,MAAM,mBAAmB,aAAa,iBAAiB,gBAAgB;EACvE,MAAM,gBAAgB,KAAK,OAAO,KAAK,IAAA,CAAK;EAC5C,KAAK,OACH,oBAAoB;GAClB;GACA,WAAW;GACX,WAAW;GACX;GACA,OAAO;EACT,CAAC,CACH;EACA,OAAO,QAAQ,QAAQ,CAAC;CAC1B;CACA,IAAI;CACJ,IAAI;EACF,QAAQ,kBAAkB,OAAO,UAAU,IAAI,CAAC;CAClD,SAAS,KAAK;EACZ,KAAK,OAAO,eAAe,GAAG,IAAI,IAAI;EACtC,OAAO,QAAQ,QAAQ,CAAC;CAC1B;CACA,MAAM,aAAa,MAAM,YAAY,CAAC,SAAS,KAAK;CACpD,IAAI,WAAW,QAAQ;EACrB,KAAK,OAAO,WAAW,OAAO,EAAE,CAAE,UAAU,IAAI;EAChD,OAAO,QAAQ,QAAQ,CAAC;CAC1B;CACA,MAAM,YAAY,WAAW;CAC7B,MAAM,YAAY,MAAM,iBAAiB,SAAS;CAClD,MAAM,SAAS,KAAK,OAAO,KAAK,IAAA,CAAK;CACrC,KAAK,OACH,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF,CAAC,CACH;CACA,OAAO,QAAQ,QAAQ,CAAC;AAC1B;AAEA,eAAe,kBACb,OACA,OACA,MACA,QACA,MACiB;CACjB,MAAM,YAAY,MAAM,gBAAgB,MAAM,MAA6B;CAC3E,IAAI,OAAO,cAAc,UAAU;EACjC,KAAK,OAAO,YAAY,IAAI;EAC5B,OAAO;CACT;CACA,IAAI;CACJ,IAAI;EACF,QAAQ,mBAAmB,OAAO;GAChC;GACA,MAAM,CAAC,SAAwB;GAC/B,qBAAqB;EACvB,CAAC;CACH,SAAS,KAAK;EACZ,KAAK,OAAO,eAAe,GAAG,IAAI,IAAI;EACtC,OAAO;CACT;CACA,MAAM,aAAa,MAAM,YAAY,CAAC,SAAS,KAAK;CACpD,IAAI,WAAW,QAAQ;EACrB,KAAK,OAAO,WAAW,OAAO,EAAE,CAAE,UAAU,IAAI;EAChD,OAAO;CACT;CACA,MAAM,YAAY,WAAW;CAC7B,IAAI;CACJ,IAAI;EACF,YAAY,MAAM,MAAM,OAAO,SAAS;CAC1C,SAAS,KAAK;EACZ,KAAK,OAAO,eAAe,GAAG,IAAI,IAAI;EACtC,OAAO;CACT;CACA,KAAK,OACH,2BAA2B;EACzB;EACA;EACA;EACA;CACF,CAAC,CACH;CACA,OAAO;AACT;AAEA,eAAe,iBACb,OACA,OACA,QACA,MACiB;CACjB,MAAM,YAAY,MAAM,cAAc,MAAM,MAAM;CAClD,IAAI,OAAO,cAAc,UAAU;EACjC,KAAK,OAAO,YAAY,IAAI;EAC5B,OAAO;CACT;CACA,IAAI;CACJ,IAAI;EACF,QAAQ,wBAAwB,OAAO;GAAE,KAAK;GAAW,GAAG,UAAU,IAAI;EAAE,CAAC;CAC/E,SAAS,KAAK;EACZ,KAAK,OAAO,eAAe,GAAG,IAAI,IAAI;EACtC,OAAO;CACT;CACA,MAAM,aAAa,MAAM,YAAY,CAAC,SAAS,KAAK;CACpD,IAAI,WAAW,QAAQ;EACrB,KAAK,OAAO,WAAW,OAAO,EAAE,CAAE,UAAU,IAAI;EAChD,OAAO;CACT;CACA,MAAM,YAAY,WAAW;CAC7B,MAAM,YAAY,MAAM,MAAM,iBAAiB,SAAS;CACxD,MAAM,SAAS,KAAK,OAAO,KAAK,IAAA,CAAK;CACrC,KAAK,OACH,8HACF;CACA,KAAK,OACH,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF,CAAC,CACH;CACA,OAAO;AACT;;;AC9NA,SAAgB,UAAU,MAA6B,MAAgC;CACrF,MAAM,EAAE,OAAO,QAAQ,aAAa,WAAW,WAAW,IAAI;CAC9D,MAAM,cAAc,0BAClB,UACA,OACA,IAAI,IAAI;EAAC;EAAa;EAAU;CAAc,CAAC,CACjD;CACA,IAAI,gBAAgB,KAAA,GAAW;EAC7B,KAAK,OAAO,cAAc,IAAI;EAC9B,OAAO,QAAQ,QAAQ,CAAC;CAC1B;CACA,IAAI,OAAO,OAAO,KAAA,GAAW;EAC3B,KAAK,OAAO,OAAO,KAAK,IAAI;EAC5B,OAAO,QAAQ,QAAQ,CAAC;CAC1B;CACA,MAAM,QAAQ,YAAY;CAC1B,IAAI,UAAU,KAAA,GAAW;EACvB,KAAK,OAAO,wBAAwB,MAAM,GAAG;EAC7C,OAAO,QAAQ,QAAQ,CAAC;CAC1B;CACA,MAAM,OAAO,UAAU,MAAM;CAC7B,IAAI,OAAO,SAAS,UAAU;EAC5B,KAAK,OAAO,OAAO,IAAI;EACvB,OAAO,QAAQ,QAAQ,CAAC;CAC1B;CACA,MAAM,SAAS,kBAAkB,MAAM;CACvC,IAAI,iBAAiB,MAAM,GAAG;EAC5B,KAAK,OAAO,SAAS,IAAI;EACzB,OAAO,QAAQ,QAAQ,CAAC;CAC1B;CACA,MAAM,QAAQ,IAAI,WAAW,OAAO,CAAC;CACrC,OAAO,gBAAgB,KAAK;CAC5B,MAAM,UAAU,MAAM,IAAI,WAAW;CACrC,KAAK,QAAQ,UAAU,kBAAkB,OAAO,MAAM,IAAI,gBAAgB,OAAO,MAAM,KAAK,IAAI;CAChG,OAAO,QAAQ,QAAQ,CAAC;AAC1B;;;AC5BA,MAAM,WAAmC;CACvC;EAAE,OAAO,CAAC,YAAY,GAAG;EAAG,KAAK;CAAY;CAC7C;EAAE,OAAO,CAAC,WAAW,GAAG;EAAG,KAAK;CAAW;CAC3C;EAAE,OAAO,CAAC,UAAU,GAAG;EAAG,KAAK;CAAU;AAC3C;AAEA,eAAsB,IAAI,MAAgC;CACxD,MAAM,CAAC,YAAY,GAAG,QAAQ,KAAK;CACnC,MAAM,UAAU,SAAS,MAAM,cAAc,UAAU,MAAM,SAAS,cAAc,EAAE,CAAC;CACvF,IAAI,YAAY,KAAA,GAAW,OAAO,QAAQ,IAAI,MAAM,IAAI;CACxD,IAAI,eAAe,KAAA,KAAa,eAAe,YAAY,eAAe,MAAM;EAC9E,KAAK,OAAO,MAAM,CAAC;EACnB,OAAO;CACT;CACA,KAAK,OAAO,MAAM,CAAC;CACnB,OAAO;AACT;;;AC1BA,QAAQ,WAAW,MAAM,IAAI;CAC3B,MAAM,QAAQ,KAAK,MAAM,CAAC;CAC1B,SAAS,MAAM,QAAQ,OAAO,MAAM,CAAC;CACrC,SAAS,MAAM,QAAQ,OAAO,MAAM,CAAC;AACvC,CAAC"}
|
|
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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"}
|