@secondlayer/cli 7.0.1 → 8.1.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/dist/cli.js +67 -90
- package/dist/cli.js.map +5 -5
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -32354,7 +32354,7 @@ var {
|
|
|
32354
32354
|
// package.json
|
|
32355
32355
|
var package_default = {
|
|
32356
32356
|
name: "@secondlayer/cli",
|
|
32357
|
-
version: "
|
|
32357
|
+
version: "8.1.0",
|
|
32358
32358
|
repository: {
|
|
32359
32359
|
type: "git",
|
|
32360
32360
|
url: "git+https://github.com/ryanwaits/secondlayer.git",
|
|
@@ -33386,7 +33386,7 @@ async function createSubscription(name, opts) {
|
|
|
33386
33386
|
let sl = null;
|
|
33387
33387
|
if (!opts.skipApi) {
|
|
33388
33388
|
try {
|
|
33389
|
-
sl = await getSubscriptionClient(
|
|
33389
|
+
sl = await getSubscriptionClient();
|
|
33390
33390
|
await validateSubscriptionTargetFromApi(sl, {
|
|
33391
33391
|
subgraphName: subgraph,
|
|
33392
33392
|
tableName: table,
|
|
@@ -33418,7 +33418,7 @@ async function createSubscription(name, opts) {
|
|
|
33418
33418
|
if (!opts.skipApi) {
|
|
33419
33419
|
try {
|
|
33420
33420
|
if (!sl)
|
|
33421
|
-
sl = await getSubscriptionClient(
|
|
33421
|
+
sl = await getSubscriptionClient();
|
|
33422
33422
|
const res = await sl.subscriptions.create({
|
|
33423
33423
|
name,
|
|
33424
33424
|
subgraphName: subgraph,
|
|
@@ -33490,39 +33490,12 @@ SIGNING_SECRET=${signingSecret}
|
|
|
33490
33490
|
success(`Done. Next:
|
|
33491
33491
|
${dashboardLine}${pausedLine}${runHint}`);
|
|
33492
33492
|
}
|
|
33493
|
-
function
|
|
33494
|
-
const
|
|
33495
|
-
|
|
33496
|
-
if ((needsResolvedKey || needsResolvedUrl) && !resolved) {
|
|
33497
|
-
return { needsTenantResolution: true };
|
|
33498
|
-
}
|
|
33499
|
-
const apiKey = opts.serviceKey ?? env.SL_SERVICE_KEY ?? resolved?.ephemeralKey;
|
|
33500
|
-
const baseUrl = opts.baseUrl ?? env.SL_API_URL ?? resolved?.apiUrl;
|
|
33501
|
-
if (!apiKey) {
|
|
33502
|
-
throw new Error("No service key available. Run `sl login` from an active project or pass --service-key.");
|
|
33503
|
-
}
|
|
33504
|
-
if (!baseUrl) {
|
|
33505
|
-
throw new Error("No API URL available. Run `sl login` or pass --base-url.");
|
|
33506
|
-
}
|
|
33507
|
-
return { needsTenantResolution: false, baseUrl, apiKey };
|
|
33508
|
-
}
|
|
33509
|
-
async function getSubscriptionClient(opts) {
|
|
33510
|
-
const config = resolveSubscriptionClientConfig(opts);
|
|
33511
|
-
if (!config.needsTenantResolution) {
|
|
33512
|
-
return new SecondLayer2({ baseUrl: config.baseUrl, apiKey: config.apiKey });
|
|
33513
|
-
}
|
|
33514
|
-
const resolved = await resolveAuth();
|
|
33515
|
-
const resolvedConfig = resolveSubscriptionClientConfig(opts, process.env, resolved);
|
|
33516
|
-
if (resolvedConfig.needsTenantResolution) {
|
|
33517
|
-
throw new Error("Could not resolve credentials — run `sl login`.");
|
|
33518
|
-
}
|
|
33519
|
-
return new SecondLayer2({
|
|
33520
|
-
baseUrl: resolvedConfig.baseUrl,
|
|
33521
|
-
apiKey: resolvedConfig.apiKey
|
|
33522
|
-
});
|
|
33493
|
+
async function getSubscriptionClient() {
|
|
33494
|
+
const { apiUrl, ephemeralKey } = await resolveAuth();
|
|
33495
|
+
return new SecondLayer2({ baseUrl: apiUrl, apiKey: ephemeralKey });
|
|
33523
33496
|
}
|
|
33524
33497
|
function addSubscriptionScaffold(parent, commandSpec, opts) {
|
|
33525
|
-
parent.command(commandSpec).description(opts.description).option("-r, --runtime <runtime>", "inngest | trigger | cloudflare | node").option("-s, --subgraph <name>", "Subgraph to subscribe to").option("-t, --table <name>", "Table to subscribe to").option("-u, --url <url>", "Webhook URL").option("--auth-token <token>", "Bearer token for receiver API auth").option("--filter <kv...>", "Filter as key=value (supports .eq/.neq/.gt/.gte/.lt/.lte suffixes)").option("--
|
|
33498
|
+
parent.command(commandSpec).description(opts.description).option("-r, --runtime <runtime>", "inngest | trigger | cloudflare | node").option("-s, --subgraph <name>", "Subgraph to subscribe to").option("-t, --table <name>", "Table to subscribe to").option("-u, --url <url>", "Webhook URL").option("--auth-token <token>", "Bearer token for receiver API auth").option("--filter <kv...>", "Filter as key=value (supports .eq/.neq/.gt/.gte/.lt/.lte suffixes)").option("--skip-api", "Copy template only, don't call the API").option("--no-scaffold", "Skip the local runtime template directory (webhook-only setups)").addHelpText("after", `
|
|
33526
33499
|
Examples:
|
|
33527
33500
|
$ ${opts.examplePrefix} my-sub -s my-graph -t transfers -u https://example.com/webhook
|
|
33528
33501
|
$ ${opts.examplePrefix} my-sub -s my-graph -t balances -r inngest --filter amount.gte=1000`).action(async (name, options) => {
|
|
@@ -33537,9 +33510,6 @@ function addSubscriptionsCreateCommand(subscriptions) {
|
|
|
33537
33510
|
}
|
|
33538
33511
|
|
|
33539
33512
|
// src/commands/subscriptions.ts
|
|
33540
|
-
function commonOptions(cmd) {
|
|
33541
|
-
return cmd.option("--service-key <key>", "SL_SERVICE_KEY override").option("--base-url <url>", "SL_API_URL override");
|
|
33542
|
-
}
|
|
33543
33513
|
function parseIntegerOption(value, name, min) {
|
|
33544
33514
|
if (value === undefined)
|
|
33545
33515
|
return;
|
|
@@ -33892,11 +33862,11 @@ async function confirmOrExit(message, yes) {
|
|
|
33892
33862
|
return true;
|
|
33893
33863
|
}
|
|
33894
33864
|
function registerSubscriptionsCommand(program2) {
|
|
33895
|
-
const subscriptions =
|
|
33865
|
+
const subscriptions = program2.command("subscriptions").alias("subs").description("Manage subgraph table subscriptions");
|
|
33896
33866
|
addSubscriptionsCreateCommand(subscriptions);
|
|
33897
|
-
|
|
33867
|
+
subscriptions.command("list").alias("ls").description("List subscriptions").option("--json", "Output as JSON").action(async (options) => {
|
|
33898
33868
|
try {
|
|
33899
|
-
const client = await getSubscriptionClient(
|
|
33869
|
+
const client = await getSubscriptionClient();
|
|
33900
33870
|
const { data } = await client.subscriptions.list();
|
|
33901
33871
|
if (options.json) {
|
|
33902
33872
|
printJson(data);
|
|
@@ -33920,9 +33890,9 @@ ${data.length} subscription(s) total`));
|
|
|
33920
33890
|
handleApiError(err, "list subscriptions");
|
|
33921
33891
|
}
|
|
33922
33892
|
});
|
|
33923
|
-
|
|
33893
|
+
subscriptions.command("get <idOrName>").description("Show subscription details").option("--json", "Output as JSON").action(async (idOrName, options) => {
|
|
33924
33894
|
try {
|
|
33925
|
-
const client = await getSubscriptionClient(
|
|
33895
|
+
const client = await getSubscriptionClient();
|
|
33926
33896
|
const { detail } = await resolveSubscriptionRef(client, idOrName);
|
|
33927
33897
|
if (options.json)
|
|
33928
33898
|
printJson(detail);
|
|
@@ -33932,13 +33902,13 @@ ${data.length} subscription(s) total`));
|
|
|
33932
33902
|
handleApiError(err, "get subscription");
|
|
33933
33903
|
}
|
|
33934
33904
|
});
|
|
33935
|
-
|
|
33905
|
+
subscriptions.command("update <idOrName>").description("Update subscription config").option("--name <name>", "Rename subscription").option("--url <url>", "Webhook URL").option("--auth-token <token>", "Set bearer token auth config").option("--format <format>", "standard-webhooks | inngest | trigger | cloudflare | cloudevents | raw").option("--runtime <runtime>", "inngest | trigger | cloudflare | node | none").option("--filter <kv...>", "Filter as key=value (supports .eq/.neq/.gt/.gte/.lt/.lte suffixes)").option("--clear-filter", "Replace filter with {}").option("--max-retries <n>", "Maximum delivery retries").option("--timeout-ms <n>", "Delivery timeout in milliseconds").option("--concurrency <n>", "Per-subscription delivery concurrency").option("--json", "Output as JSON").addHelpText("after", `
|
|
33936
33906
|
Examples:
|
|
33937
33907
|
$ sl subscriptions update my-sub --url https://example.com/hook
|
|
33938
33908
|
$ sl subscriptions update my-sub --filter amount.gte=1000 --max-retries 5
|
|
33939
|
-
$ sl subscriptions update my-sub --clear-filter`)
|
|
33909
|
+
$ sl subscriptions update my-sub --clear-filter`).action(async (idOrName, options) => {
|
|
33940
33910
|
try {
|
|
33941
|
-
const client = await getSubscriptionClient(
|
|
33911
|
+
const client = await getSubscriptionClient();
|
|
33942
33912
|
const patch = buildUpdatePatch(options);
|
|
33943
33913
|
const { id, detail } = await resolveSubscriptionRef(client, idOrName);
|
|
33944
33914
|
if (patch.filter !== undefined) {
|
|
@@ -33958,9 +33928,9 @@ Examples:
|
|
|
33958
33928
|
}
|
|
33959
33929
|
});
|
|
33960
33930
|
for (const action of ["pause", "resume"]) {
|
|
33961
|
-
|
|
33931
|
+
subscriptions.command(`${action} <idOrName>`).description(`${action === "pause" ? "Pause" : "Resume"} a subscription`).option("--json", "Output as JSON").action(async (idOrName, options) => {
|
|
33962
33932
|
try {
|
|
33963
|
-
const client = await getSubscriptionClient(
|
|
33933
|
+
const client = await getSubscriptionClient();
|
|
33964
33934
|
const { id } = await resolveSubscriptionRef(client, idOrName);
|
|
33965
33935
|
const updated = await client.subscriptions[action](id);
|
|
33966
33936
|
if (options.json)
|
|
@@ -33972,9 +33942,9 @@ Examples:
|
|
|
33972
33942
|
}
|
|
33973
33943
|
});
|
|
33974
33944
|
}
|
|
33975
|
-
|
|
33945
|
+
subscriptions.command("delete <idOrName>").alias("rm").description("Delete a subscription").option("-y, --yes", "Skip confirmation").option("--json", "Output as JSON").action(async (idOrName, options) => {
|
|
33976
33946
|
try {
|
|
33977
|
-
const client = await getSubscriptionClient(
|
|
33947
|
+
const client = await getSubscriptionClient();
|
|
33978
33948
|
let resolved = null;
|
|
33979
33949
|
try {
|
|
33980
33950
|
resolved = await resolveSubscriptionRef(client, idOrName);
|
|
@@ -34003,9 +33973,9 @@ Examples:
|
|
|
34003
33973
|
handleApiError(err, "delete subscription");
|
|
34004
33974
|
}
|
|
34005
33975
|
});
|
|
34006
|
-
|
|
33976
|
+
subscriptions.command("rotate-secret <idOrName>").description("Rotate the signing secret").option("-y, --yes", "Skip confirmation").option("--json", "Output as JSON").action(async (idOrName, options) => {
|
|
34007
33977
|
try {
|
|
34008
|
-
const client = await getSubscriptionClient(
|
|
33978
|
+
const client = await getSubscriptionClient();
|
|
34009
33979
|
const { id, detail } = await resolveSubscriptionRef(client, idOrName);
|
|
34010
33980
|
const ok = await confirmOrExit(`Rotate signing secret for "${detail.name}"? Existing receivers using the old secret will fail verification.`, options.yes);
|
|
34011
33981
|
if (!ok)
|
|
@@ -34021,9 +33991,9 @@ Examples:
|
|
|
34021
33991
|
handleApiError(err, "rotate subscription secret");
|
|
34022
33992
|
}
|
|
34023
33993
|
});
|
|
34024
|
-
|
|
33994
|
+
subscriptions.command("deliveries <idOrName>").description("Show recent delivery attempts").option("--json", "Output as JSON").action(async (idOrName, options) => {
|
|
34025
33995
|
try {
|
|
34026
|
-
const client = await getSubscriptionClient(
|
|
33996
|
+
const client = await getSubscriptionClient();
|
|
34027
33997
|
const { id } = await resolveSubscriptionRef(client, idOrName);
|
|
34028
33998
|
const { data } = await client.subscriptions.recentDeliveries(id);
|
|
34029
33999
|
if (options.json)
|
|
@@ -34034,9 +34004,9 @@ Examples:
|
|
|
34034
34004
|
handleApiError(err, "list subscription deliveries");
|
|
34035
34005
|
}
|
|
34036
34006
|
});
|
|
34037
|
-
|
|
34007
|
+
subscriptions.command("dead <idOrName>").description("Show dead-letter outbox rows").option("--json", "Output as JSON").action(async (idOrName, options) => {
|
|
34038
34008
|
try {
|
|
34039
|
-
const client = await getSubscriptionClient(
|
|
34009
|
+
const client = await getSubscriptionClient();
|
|
34040
34010
|
const { id } = await resolveSubscriptionRef(client, idOrName);
|
|
34041
34011
|
const { data } = await client.subscriptions.dead(id);
|
|
34042
34012
|
if (options.json)
|
|
@@ -34047,9 +34017,9 @@ Examples:
|
|
|
34047
34017
|
handleApiError(err, "list dead-letter rows");
|
|
34048
34018
|
}
|
|
34049
34019
|
});
|
|
34050
|
-
|
|
34020
|
+
subscriptions.command("requeue <idOrName> <outboxId>").description("Requeue one dead-letter row").option("-y, --yes", "Skip confirmation").option("--json", "Output as JSON").action(async (idOrName, outboxId, options) => {
|
|
34051
34021
|
try {
|
|
34052
|
-
const client = await getSubscriptionClient(
|
|
34022
|
+
const client = await getSubscriptionClient();
|
|
34053
34023
|
const { id, detail } = await resolveSubscriptionRef(client, idOrName);
|
|
34054
34024
|
const ok = await confirmOrExit(`Requeue ${outboxId} for "${detail.name}"?`, options.yes);
|
|
34055
34025
|
if (!ok)
|
|
@@ -34063,16 +34033,16 @@ Examples:
|
|
|
34063
34033
|
handleApiError(err, "requeue dead-letter row");
|
|
34064
34034
|
}
|
|
34065
34035
|
});
|
|
34066
|
-
|
|
34036
|
+
subscriptions.command("replay <idOrName>").description("Replay a block range").requiredOption("--from-block <n>", "Start block height").requiredOption("--to-block <n>", "End block height").option("-y, --yes", "Skip confirmation").option("--json", "Output as JSON").addHelpText("after", `
|
|
34067
34037
|
Examples:
|
|
34068
|
-
$ sl subscriptions replay my-sub --from-block 150000 --to-block 160000 -y`)
|
|
34038
|
+
$ sl subscriptions replay my-sub --from-block 150000 --to-block 160000 -y`).action(async (idOrName, options) => {
|
|
34069
34039
|
try {
|
|
34070
34040
|
const fromBlock = requireIntegerOption(options.fromBlock, "--from-block");
|
|
34071
34041
|
const toBlock = requireIntegerOption(options.toBlock, "--to-block");
|
|
34072
34042
|
if (fromBlock > toBlock) {
|
|
34073
34043
|
throw new Error("--from-block must be <= --to-block");
|
|
34074
34044
|
}
|
|
34075
|
-
const client = await getSubscriptionClient(
|
|
34045
|
+
const client = await getSubscriptionClient();
|
|
34076
34046
|
const { id, detail } = await resolveSubscriptionRef(client, idOrName);
|
|
34077
34047
|
const ok = await confirmOrExit(`Replay ${detail.name} from block ${fromBlock} to ${toBlock}?`, options.yes);
|
|
34078
34048
|
if (!ok)
|
|
@@ -34091,9 +34061,9 @@ Examples:
|
|
|
34091
34061
|
handleApiError(err, "replay subscription");
|
|
34092
34062
|
}
|
|
34093
34063
|
});
|
|
34094
|
-
|
|
34064
|
+
subscriptions.command("doctor <idOrName>").description("Diagnose subscription health and next steps").option("--json", "Output as JSON").action(async (idOrName, options) => {
|
|
34095
34065
|
try {
|
|
34096
|
-
const client = await getSubscriptionClient(
|
|
34066
|
+
const client = await getSubscriptionClient();
|
|
34097
34067
|
const { id, detail } = await resolveSubscriptionRef(client, idOrName);
|
|
34098
34068
|
const [deliveries, dead, subgraph] = await Promise.allSettled([
|
|
34099
34069
|
client.subscriptions.recentDeliveries(id),
|
|
@@ -34114,10 +34084,10 @@ Examples:
|
|
|
34114
34084
|
handleApiError(err, "diagnose subscription");
|
|
34115
34085
|
}
|
|
34116
34086
|
});
|
|
34117
|
-
|
|
34087
|
+
subscriptions.command("test <idOrName>").description("Build and optionally POST a signed Standard Webhooks fixture").option("--signing-secret <secret>", "Signing secret override").option("--post", "POST the fixture to the subscription URL").option("--json", "Output as JSON").action(async (idOrName, options) => {
|
|
34118
34088
|
try {
|
|
34119
34089
|
const signingSecret = resolveSigningSecret(options);
|
|
34120
|
-
const client = await getSubscriptionClient(
|
|
34090
|
+
const client = await getSubscriptionClient();
|
|
34121
34091
|
const { detail } = await resolveSubscriptionRef(client, idOrName);
|
|
34122
34092
|
const subgraph = await client.subgraphs.get(detail.subgraphName).catch(() => null);
|
|
34123
34093
|
const row = await representativeRow(client, detail, subgraph);
|
|
@@ -37450,6 +37420,29 @@ init_dev_state();
|
|
|
37450
37420
|
init_node_manager();
|
|
37451
37421
|
init_output();
|
|
37452
37422
|
var DEV_SERVICES = ["api", "indexer", "worker", "subgraphs"];
|
|
37423
|
+
async function startStack(options2) {
|
|
37424
|
+
if (options2.devnet) {
|
|
37425
|
+
await connect({
|
|
37426
|
+
project: options2.project,
|
|
37427
|
+
imageTag: options2.imageTag ?? DEFAULT_IMAGE_TAG,
|
|
37428
|
+
owner: options2.owner,
|
|
37429
|
+
up: options2.up ?? true
|
|
37430
|
+
});
|
|
37431
|
+
} else {
|
|
37432
|
+
await stackStart({ node: options2.node, dev: options2.dev });
|
|
37433
|
+
}
|
|
37434
|
+
}
|
|
37435
|
+
async function stopStack(options2) {
|
|
37436
|
+
if (options2.devnet) {
|
|
37437
|
+
await down({ project: options2.project, purge: options2.purge });
|
|
37438
|
+
} else {
|
|
37439
|
+
await stackStop({
|
|
37440
|
+
node: options2.node,
|
|
37441
|
+
dev: options2.dev,
|
|
37442
|
+
wait: options2.wait
|
|
37443
|
+
});
|
|
37444
|
+
}
|
|
37445
|
+
}
|
|
37453
37446
|
function registerLocalCommand(program2) {
|
|
37454
37447
|
const local = program2.command("local").description("Manage local development environment and Stacks node").hook("preAction", async (_thisCommand, actionCommand) => {
|
|
37455
37448
|
if (actionCommand.name() === "help")
|
|
@@ -37471,32 +37464,16 @@ function registerLocalCommand(program2) {
|
|
|
37471
37464
|
const { stopDev: stopDev2 } = await Promise.resolve().then(() => (init_dev_impl(), exports_dev_impl));
|
|
37472
37465
|
await stopDev2();
|
|
37473
37466
|
});
|
|
37474
|
-
local.command("
|
|
37475
|
-
|
|
37476
|
-
|
|
37477
|
-
|
|
37478
|
-
|
|
37479
|
-
|
|
37480
|
-
|
|
37481
|
-
project: options2.project,
|
|
37482
|
-
imageTag: options2.imageTag ?? DEFAULT_IMAGE_TAG,
|
|
37483
|
-
owner: options2.owner,
|
|
37484
|
-
up: options2.up
|
|
37485
|
-
});
|
|
37486
|
-
} else {
|
|
37487
|
-
await stackStart({ node: options2.node, dev: options2.dev });
|
|
37488
|
-
}
|
|
37489
|
-
});
|
|
37490
|
-
local.command("down").description("Stop the full local stack").option("--devnet", "Stop a local Clarinet devnet instead").option("--no-node", "Skip stopping the Stacks node").option("--no-dev", "Skip stopping dev services").option("--wait", "Wait for in-flight work to drain before stopping").option("--project <dir>", "[--devnet] Clarinet project directory").option("--purge", "[--devnet] Also remove volumes (wipes the local index)").action(async (options2) => {
|
|
37491
|
-
if (options2.devnet) {
|
|
37492
|
-
await down({ project: options2.project, purge: options2.purge });
|
|
37493
|
-
} else {
|
|
37494
|
-
await stackStop({
|
|
37495
|
-
node: options2.node,
|
|
37496
|
-
dev: options2.dev,
|
|
37497
|
-
wait: options2.wait
|
|
37498
|
-
});
|
|
37467
|
+
local.command("up").description("Start the full local stack (Stacks node + dev services)").option("--devnet", "Run against a local Clarinet devnet instead").option("--no-node", "Skip starting the Stacks node").option("--no-dev", "Skip starting dev services").option("--project <dir>", "[--devnet] Clarinet project directory").option("--image-tag <tag>", "[--devnet] Published image tag to run").option("--owner <owner>", "[--devnet] ghcr image owner to pull from").option("--no-up", "[--devnet] Patch config + write compose without starting").action((options2) => startStack(options2));
|
|
37468
|
+
local.command("down").description("Stop the full local stack").option("--devnet", "Stop a local Clarinet devnet instead").option("--no-node", "Skip stopping the Stacks node").option("--no-dev", "Skip stopping dev services").option("--wait", "Wait for in-flight work to drain before stopping").option("--project <dir>", "[--devnet] Clarinet project directory").option("--purge", "[--devnet] Also remove volumes (wipes the local index)").action((options2) => stopStack(options2));
|
|
37469
|
+
local.command("restart").description("Restart the full local stack (stop then start)").option("--devnet", "Restart a local Clarinet devnet instead").option("--no-node", "Skip the Stacks node (restart dev services only)").option("--no-dev", "Skip dev services").option("--wait", "Wait for in-flight work to drain before stopping").option("--project <dir>", "[--devnet] Clarinet project directory").option("--image-tag <tag>", "[--devnet] Published image tag to run").option("--owner <owner>", "[--devnet] ghcr image owner to pull from").action(async (options2) => {
|
|
37470
|
+
if (options2.node === false && !options2.devnet) {
|
|
37471
|
+
const { restartDev: restartDev2 } = await Promise.resolve().then(() => (init_dev_impl(), exports_dev_impl));
|
|
37472
|
+
await restartDev2();
|
|
37473
|
+
return;
|
|
37499
37474
|
}
|
|
37475
|
+
await stopStack(options2);
|
|
37476
|
+
await startStack(options2);
|
|
37500
37477
|
});
|
|
37501
37478
|
local.command("status").description("Show local environment status").action(async () => {
|
|
37502
37479
|
await showLocalStatus();
|
|
@@ -38043,5 +38020,5 @@ program.commandsGroup("Account:");
|
|
|
38043
38020
|
registerAccountCommand(program);
|
|
38044
38021
|
program.parse();
|
|
38045
38022
|
|
|
38046
|
-
//# debugId=
|
|
38023
|
+
//# debugId=EB492BA5EF828A4C64756E2164756E21
|
|
38047
38024
|
//# sourceMappingURL=cli.js.map
|