@xylex-group/athena 2.12.1 → 2.13.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/LICENSE +21 -21
- package/README.md +1190 -1184
- package/bin/athena-js.js +104 -76
- package/dist/admin.cjs +45 -0
- package/dist/admin.cjs.map +1 -0
- package/dist/admin.d.cts +64 -0
- package/dist/admin.d.ts +64 -0
- package/dist/admin.js +41 -0
- package/dist/admin.js.map +1 -0
- package/dist/athena-auth-url-oLux_57a.d.cts +377 -0
- package/dist/athena-auth-url-oLux_57a.d.ts +377 -0
- package/dist/browser.cjs +33 -49
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.d.cts +12 -10
- package/dist/browser.d.ts +12 -10
- package/dist/browser.js +33 -49
- package/dist/browser.js.map +1 -1
- package/dist/cli/index.cjs +150 -51
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.d.cts +14 -5
- package/dist/cli/index.d.ts +14 -5
- package/dist/cli/index.js +150 -52
- package/dist/cli/index.js.map +1 -1
- package/dist/{client-CMtx5P4D.d.cts → client-BJjUwDSg.d.cts} +109 -1448
- package/dist/{client-Dre8H24u.d.ts → client-DVOKSYDI.d.ts} +109 -1448
- package/dist/cookies.cjs +18 -0
- package/dist/cookies.cjs.map +1 -1
- package/dist/cookies.d.cts +2 -1
- package/dist/cookies.d.ts +2 -1
- package/dist/cookies.js +17 -1
- package/dist/cookies.js.map +1 -1
- package/dist/{index-CVcQCGyG.d.ts → index-CFL9xbFR.d.cts} +2 -0
- package/dist/{index-CVcQCGyG.d.cts → index-UKJpunc6.d.ts} +2 -0
- package/dist/index.cjs +101 -49
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +13 -10
- package/dist/index.d.ts +13 -10
- package/dist/index.js +101 -50
- package/dist/index.js.map +1 -1
- package/dist/{model-form-DfTi8-D1.d.cts → model-form-Dw4zEL5a.d.cts} +2 -2
- package/dist/{model-form-CU0mWrF9.d.ts → model-form-yRg71q3H.d.ts} +2 -2
- package/dist/{module-DBGmbIuh.d.ts → module-DBteUIob.d.ts} +12 -9
- package/dist/{module-GoijrBXV.d.cts → module-yoX49uQC.d.cts} +12 -9
- package/dist/next/client.cjs +452 -49
- package/dist/next/client.cjs.map +1 -1
- package/dist/next/client.d.cts +7 -4
- package/dist/next/client.d.ts +7 -4
- package/dist/next/client.js +430 -50
- package/dist/next/client.js.map +1 -1
- package/dist/next/server.cjs +292 -49
- package/dist/next/server.cjs.map +1 -1
- package/dist/next/server.d.cts +81 -5
- package/dist/next/server.d.ts +81 -5
- package/dist/next/server.js +280 -50
- package/dist/next/server.js.map +1 -1
- package/dist/organization.cjs +72 -0
- package/dist/organization.cjs.map +1 -0
- package/dist/organization.d.cts +43 -0
- package/dist/organization.d.ts +43 -0
- package/dist/organization.js +70 -0
- package/dist/organization.js.map +1 -0
- package/dist/payload-BzVbUgY_.d.cts +219 -0
- package/dist/payload-DEOWN_oo.d.ts +219 -0
- package/dist/{pipeline-DrjU2vNA.d.ts → pipeline-Bj6RWt1A.d.ts} +1 -1
- package/dist/{pipeline-c7Gdm0qv.d.cts → pipeline-Dwck-wZO.d.cts} +1 -1
- package/dist/react.cjs +2 -13
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +26 -7
- package/dist/react.d.ts +26 -7
- package/dist/react.js +2 -13
- package/dist/react.js.map +1 -1
- package/dist/session-cookie-detection-BqOp9mO6.d.cts +46 -0
- package/dist/session-cookie-detection-BqOp9mO6.d.ts +46 -0
- package/dist/social-providers.cjs +4189 -0
- package/dist/social-providers.cjs.map +1 -0
- package/dist/social-providers.d.cts +4948 -0
- package/dist/social-providers.d.ts +4948 -0
- package/dist/social-providers.js +4117 -0
- package/dist/social-providers.js.map +1 -0
- package/dist/{types-Bez4HSbI.d.cts → types-BRP7sfSF.d.ts} +50 -2
- package/dist/{types-kPaHUqUa.d.ts → types-BU8uJH_b.d.cts} +50 -2
- package/dist/{types-BRUHGXo2.d.ts → types-CH78O90i.d.cts} +2 -2
- package/dist/{types-BRUHGXo2.d.cts → types-CH78O90i.d.ts} +2 -2
- package/dist/{types-BLizCLd1.d.cts → types-CjC9_5ZQ.d.cts} +3 -3
- package/dist/{types-DRRb0Fd0.d.ts → types-DPgejxYC.d.ts} +3 -3
- package/dist/types-eAKAh71s.d.cts +1476 -0
- package/dist/types-eAKAh71s.d.ts +1476 -0
- package/dist/utils.cjs +438 -15
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.cts +76 -11
- package/dist/utils.d.ts +76 -11
- package/dist/utils.js +390 -16
- package/dist/utils.js.map +1 -1
- package/package.json +49 -22
- package/dist/shared-DZSGAmXs.d.cts +0 -35
- package/dist/shared-MMnVBBfy.d.ts +0 -35
package/dist/cli/index.cjs
CHANGED
|
@@ -2004,7 +2004,7 @@ var getSessionCookie = (request2, config) => {
|
|
|
2004
2004
|
|
|
2005
2005
|
// src/utils/athena-request-headers.ts
|
|
2006
2006
|
var NO_CACHE_HEADER_VALUE = "no-cache";
|
|
2007
|
-
var API_KEY_HEADER_CANDIDATES = ["X-Api-Key", "x-api-key", "apikey"];
|
|
2007
|
+
var API_KEY_HEADER_CANDIDATES = ["X-Athena-Key", "x-athena-key", "X-Api-Key", "x-api-key", "apikey"];
|
|
2008
2008
|
var ATHENA_KEY_HEADER_CANDIDATES = ["X-Athena-Key", "x-athena-key"];
|
|
2009
2009
|
var SESSION_TOKEN_HEADER_CANDIDATES = ["X-Athena-Auth-Session-Token"];
|
|
2010
2010
|
var BEARER_MIRROR_HEADER_CANDIDATES = ["X-Athena-Auth-Bearer-Token"];
|
|
@@ -2106,17 +2106,6 @@ function buildServiceRequestHeaders(profile, sdkHeaderValue, config, options, ex
|
|
|
2106
2106
|
});
|
|
2107
2107
|
}
|
|
2108
2108
|
function applyAthenaApiKeyHeaders(headers, apiKey, athenaKey) {
|
|
2109
|
-
if (apiKey) {
|
|
2110
|
-
if (!hasHeaderIgnoreCase(headers, "apikey")) {
|
|
2111
|
-
headers.apikey = apiKey;
|
|
2112
|
-
}
|
|
2113
|
-
if (!Object.hasOwn(headers, "x-api-key")) {
|
|
2114
|
-
headers["x-api-key"] = apiKey;
|
|
2115
|
-
}
|
|
2116
|
-
if (!Object.hasOwn(headers, "X-Api-Key")) {
|
|
2117
|
-
headers["X-Api-Key"] = apiKey;
|
|
2118
|
-
}
|
|
2119
|
-
}
|
|
2120
2109
|
const resolvedAthenaKey = normalizeHeaderValue(athenaKey) ?? normalizeHeaderValue(apiKey);
|
|
2121
2110
|
if (resolvedAthenaKey && !hasHeaderIgnoreCase(headers, "X-Athena-Key")) {
|
|
2122
2111
|
headers["X-Athena-Key"] = resolvedAthenaKey;
|
|
@@ -2242,7 +2231,7 @@ function buildAthenaRequestHeaders(input) {
|
|
|
2242
2231
|
|
|
2243
2232
|
// package.json
|
|
2244
2233
|
var package_default = {
|
|
2245
|
-
version: "2.
|
|
2234
|
+
version: "2.13.0"
|
|
2246
2235
|
};
|
|
2247
2236
|
|
|
2248
2237
|
// src/sdk-version.ts
|
|
@@ -4335,38 +4324,6 @@ function createAuthClient(config = {}) {
|
|
|
4335
4324
|
};
|
|
4336
4325
|
}
|
|
4337
4326
|
|
|
4338
|
-
// src/db/module.ts
|
|
4339
|
-
function createDbModule(input) {
|
|
4340
|
-
const db = {
|
|
4341
|
-
from: input.from,
|
|
4342
|
-
select(table, first, second) {
|
|
4343
|
-
if (first && typeof first === "object" && !Array.isArray(first)) {
|
|
4344
|
-
return input.from(table).select(void 0, first);
|
|
4345
|
-
}
|
|
4346
|
-
return input.from(table).select(first, second);
|
|
4347
|
-
},
|
|
4348
|
-
insert(table, values, options) {
|
|
4349
|
-
return Array.isArray(values) ? input.from(table).insert(values, options) : input.from(table).insert(values, options);
|
|
4350
|
-
},
|
|
4351
|
-
upsert(table, values, options) {
|
|
4352
|
-
return Array.isArray(values) ? input.from(table).upsert(values, options) : input.from(table).upsert(values, options);
|
|
4353
|
-
},
|
|
4354
|
-
update(table, values, options) {
|
|
4355
|
-
return input.from(table).update(values, options);
|
|
4356
|
-
},
|
|
4357
|
-
delete(table, options) {
|
|
4358
|
-
return input.from(table).delete(options);
|
|
4359
|
-
},
|
|
4360
|
-
rpc(fn, args, options) {
|
|
4361
|
-
return input.rpc(fn, args, options);
|
|
4362
|
-
},
|
|
4363
|
-
query(query, options) {
|
|
4364
|
-
return input.query(query, options);
|
|
4365
|
-
}
|
|
4366
|
-
};
|
|
4367
|
-
return db;
|
|
4368
|
-
}
|
|
4369
|
-
|
|
4370
4327
|
// src/storage/file.ts
|
|
4371
4328
|
function createStorageFileModule(base, config = {}) {
|
|
4372
4329
|
const upload = async (input, options) => {
|
|
@@ -9714,7 +9671,30 @@ function createClientFromConfig(config, sourceConfig) {
|
|
|
9714
9671
|
config.experimental,
|
|
9715
9672
|
queryTracer
|
|
9716
9673
|
);
|
|
9717
|
-
const
|
|
9674
|
+
const untypedDbFrom = from;
|
|
9675
|
+
const db = {
|
|
9676
|
+
from,
|
|
9677
|
+
select(table, first, second) {
|
|
9678
|
+
if (first && typeof first === "object" && !Array.isArray(first)) {
|
|
9679
|
+
return untypedDbFrom(table).select(void 0, first);
|
|
9680
|
+
}
|
|
9681
|
+
return untypedDbFrom(table).select(first, second);
|
|
9682
|
+
},
|
|
9683
|
+
insert(table, values, options) {
|
|
9684
|
+
return Array.isArray(values) ? untypedDbFrom(table).insert(values, options) : untypedDbFrom(table).insert(values, options);
|
|
9685
|
+
},
|
|
9686
|
+
upsert(table, values, options) {
|
|
9687
|
+
return Array.isArray(values) ? untypedDbFrom(table).upsert(values, options) : untypedDbFrom(table).upsert(values, options);
|
|
9688
|
+
},
|
|
9689
|
+
update(table, values, options) {
|
|
9690
|
+
return untypedDbFrom(table).update(values, options);
|
|
9691
|
+
},
|
|
9692
|
+
delete(table, options) {
|
|
9693
|
+
return untypedDbFrom(table).delete(options);
|
|
9694
|
+
},
|
|
9695
|
+
rpc,
|
|
9696
|
+
query
|
|
9697
|
+
};
|
|
9718
9698
|
const chat = createChatModule({
|
|
9719
9699
|
baseUrl: config.chatUrl,
|
|
9720
9700
|
apiKey: config.apiKey,
|
|
@@ -9862,7 +9842,8 @@ function createClientFromConfig(config, sourceConfig) {
|
|
|
9862
9842
|
}
|
|
9863
9843
|
return sdkClient;
|
|
9864
9844
|
}
|
|
9865
|
-
function createClient(
|
|
9845
|
+
function createClient(...args) {
|
|
9846
|
+
const [configOrUrl, apiKey, options] = args;
|
|
9866
9847
|
if (typeof configOrUrl === "string" || configOrUrl === null || configOrUrl === void 0) {
|
|
9867
9848
|
return createClientFromInput({
|
|
9868
9849
|
url: configOrUrl,
|
|
@@ -10469,6 +10450,10 @@ async function runSchemaGenerator(options = {}) {
|
|
|
10469
10450
|
}
|
|
10470
10451
|
|
|
10471
10452
|
// src/cli/index.ts
|
|
10453
|
+
function isDebugEnabled() {
|
|
10454
|
+
const value = globalThis.process?.env?.ATHENA_JS_DEBUG;
|
|
10455
|
+
return value === "1" || value === "true";
|
|
10456
|
+
}
|
|
10472
10457
|
function rootUsage() {
|
|
10473
10458
|
return [
|
|
10474
10459
|
"athena-js CLI",
|
|
@@ -10632,7 +10617,61 @@ function extractMissingDatabaseName(message) {
|
|
|
10632
10617
|
function isErrorWithCode(error) {
|
|
10633
10618
|
return typeof error === "object" && error !== null && "code" in error;
|
|
10634
10619
|
}
|
|
10620
|
+
function isNetworkConnectionError(error) {
|
|
10621
|
+
if (!isErrorWithCode(error)) {
|
|
10622
|
+
return false;
|
|
10623
|
+
}
|
|
10624
|
+
const code = typeof error.code === "string" ? error.code : "";
|
|
10625
|
+
if (code === "ECONNRESET" || code === "ECONNREFUSED" || code === "ETIMEDOUT" || code === "ENOTFOUND" || code === "EAI_AGAIN" || code === "EPIPE" || code === "EHOSTUNREACH" || code === "ENETUNREACH") {
|
|
10626
|
+
return true;
|
|
10627
|
+
}
|
|
10628
|
+
const message = normalizeErrorMessage(error).toLowerCase();
|
|
10629
|
+
return message.includes("econnreset") || message.includes("econnrefused") || message.includes("etimedout") || message.includes("connection terminated") || message.includes("connection refused") || message.includes("timeout expired");
|
|
10630
|
+
}
|
|
10631
|
+
function collectErrorDiagnostics(error) {
|
|
10632
|
+
const lines = [];
|
|
10633
|
+
if (!isErrorWithCode(error) && !(error instanceof Error)) {
|
|
10634
|
+
return lines;
|
|
10635
|
+
}
|
|
10636
|
+
const code = isErrorWithCode(error) && error.code !== void 0 ? String(error.code) : void 0;
|
|
10637
|
+
if (code) {
|
|
10638
|
+
lines.push(` code: ${code}`);
|
|
10639
|
+
}
|
|
10640
|
+
const errno = isErrorWithCode(error) && error.errno !== void 0 ? String(error.errno) : void 0;
|
|
10641
|
+
if (errno) {
|
|
10642
|
+
lines.push(` errno: ${errno}`);
|
|
10643
|
+
}
|
|
10644
|
+
const syscall = isErrorWithCode(error) && typeof error.syscall === "string" ? error.syscall : void 0;
|
|
10645
|
+
if (syscall) {
|
|
10646
|
+
lines.push(` syscall: ${syscall}`);
|
|
10647
|
+
}
|
|
10648
|
+
const address = isErrorWithCode(error) && typeof error.address === "string" ? error.address : void 0;
|
|
10649
|
+
const port = isErrorWithCode(error) && error.port !== void 0 ? String(error.port) : void 0;
|
|
10650
|
+
if (address || port) {
|
|
10651
|
+
lines.push(
|
|
10652
|
+
` remote: ${address ?? "?"}${port ? `:${port}` : ""}`
|
|
10653
|
+
);
|
|
10654
|
+
}
|
|
10655
|
+
const hostname = isErrorWithCode(error) && typeof error.hostname === "string" ? error.hostname : void 0;
|
|
10656
|
+
if (hostname) {
|
|
10657
|
+
lines.push(` hostname: ${hostname}`);
|
|
10658
|
+
}
|
|
10659
|
+
let cause = error instanceof Error ? error.cause : isErrorWithCode(error) ? error.cause : void 0;
|
|
10660
|
+
let depth = 0;
|
|
10661
|
+
while (cause && depth < 4) {
|
|
10662
|
+
const causeMessage = normalizeErrorMessage(cause);
|
|
10663
|
+
const causeCode = isErrorWithCode(cause) && cause.code !== void 0 ? String(cause.code) : void 0;
|
|
10664
|
+
lines.push(
|
|
10665
|
+
` cause[${depth}]: ${causeCode ? `${causeCode} \u2014 ` : ""}${causeMessage}`
|
|
10666
|
+
);
|
|
10667
|
+
cause = cause instanceof Error ? cause.cause : isErrorWithCode(cause) ? cause.cause : void 0;
|
|
10668
|
+
depth += 1;
|
|
10669
|
+
}
|
|
10670
|
+
return lines;
|
|
10671
|
+
}
|
|
10635
10672
|
function formatGeneratorError(error, configPath) {
|
|
10673
|
+
const diagnostics = collectErrorDiagnostics(error);
|
|
10674
|
+
const diagnosticsBlock = diagnostics.length > 0 ? ["", "Diagnostics:", ...diagnostics] : [];
|
|
10636
10675
|
if (isErrorWithCode(error) && error.code === "3D000") {
|
|
10637
10676
|
const message = normalizeErrorMessage(error);
|
|
10638
10677
|
const databaseName = extractMissingDatabaseName(message);
|
|
@@ -10641,15 +10680,58 @@ function formatGeneratorError(error, configPath) {
|
|
|
10641
10680
|
return new Error(
|
|
10642
10681
|
[
|
|
10643
10682
|
`${databaseLabel} (code 3D000).`,
|
|
10644
|
-
`Update provider.connectionString (and provider.database, if set) in ${configLabel}, or create that database before running generate
|
|
10683
|
+
`Update provider.connectionString (and provider.database, if set) in ${configLabel}, or create that database before running generate.`,
|
|
10684
|
+
...diagnosticsBlock,
|
|
10685
|
+
"",
|
|
10686
|
+
"Hint: ATHENA_JS_DEBUG=1 pnpm exec athena-js generate"
|
|
10687
|
+
].join("\n")
|
|
10688
|
+
);
|
|
10689
|
+
}
|
|
10690
|
+
if (isNetworkConnectionError(error)) {
|
|
10691
|
+
const message = normalizeErrorMessage(error);
|
|
10692
|
+
const configLabel = configPath ? `config "${configPath}"` : "the resolved athena config";
|
|
10693
|
+
const code = isErrorWithCode(error) && typeof error.code === "string" ? error.code : "network";
|
|
10694
|
+
return new Error(
|
|
10695
|
+
[
|
|
10696
|
+
`Schema introspection failed: database connection was reset or unreachable (${code}: ${message}).`,
|
|
10697
|
+
`The CLI started correctly; generate could not finish talking to Postgres for ${configLabel}.`,
|
|
10698
|
+
...diagnosticsBlock,
|
|
10699
|
+
"",
|
|
10700
|
+
"Check:",
|
|
10701
|
+
" 1. DATABASE_URL / provider.connectionString is reachable from this machine (VPN, Railway proxy, firewall).",
|
|
10702
|
+
' 2. The database is running and accepts connections (try `psql "$DATABASE_URL" -c "select 1"`).',
|
|
10703
|
+
" 3. SSL settings match the host (Railway/public proxy often needs `?sslmode=require`).",
|
|
10704
|
+
" 4. Retry once \u2014 ECONNRESET is often a transient proxy drop mid-introspection.",
|
|
10705
|
+
"",
|
|
10706
|
+
"For a full stack: ATHENA_JS_DEBUG=1 pnpm exec athena-js generate"
|
|
10645
10707
|
].join("\n")
|
|
10646
10708
|
);
|
|
10647
10709
|
}
|
|
10648
10710
|
if (error instanceof Error) {
|
|
10649
|
-
|
|
10711
|
+
if (diagnostics.length === 0 && !isDebugEnabled()) {
|
|
10712
|
+
return error;
|
|
10713
|
+
}
|
|
10714
|
+
const base = error.message || normalizeErrorMessage(error);
|
|
10715
|
+
return new Error(
|
|
10716
|
+
[
|
|
10717
|
+
base,
|
|
10718
|
+
...diagnosticsBlock,
|
|
10719
|
+
...isDebugEnabled() && error.stack ? ["", "Stack:", error.stack] : ["", "Hint: ATHENA_JS_DEBUG=1 pnpm exec athena-js generate"]
|
|
10720
|
+
].join("\n")
|
|
10721
|
+
);
|
|
10650
10722
|
}
|
|
10651
10723
|
return new Error(normalizeErrorMessage(error));
|
|
10652
10724
|
}
|
|
10725
|
+
function logCliError(error, errorLog = console.error) {
|
|
10726
|
+
const message = error instanceof Error ? error.message : normalizeErrorMessage(error);
|
|
10727
|
+
errorLog(message);
|
|
10728
|
+
if (isDebugEnabled() && error instanceof Error && error.stack) {
|
|
10729
|
+
const stackOnly = error.stack.startsWith(error.message) ? error.stack.slice(error.message.length).replace(/^\n/, "") : error.stack;
|
|
10730
|
+
if (stackOnly) {
|
|
10731
|
+
errorLog(stackOnly);
|
|
10732
|
+
}
|
|
10733
|
+
}
|
|
10734
|
+
}
|
|
10653
10735
|
function formatSkippedArtifactLine(artifact) {
|
|
10654
10736
|
if (artifact.reason === "protected-existing-file") {
|
|
10655
10737
|
return ` [skip] ${artifact.path} (existing ${artifact.kind} artifacts are protected from overwrite; delete or retarget the file to regenerate it)`;
|
|
@@ -10658,20 +10740,36 @@ function formatSkippedArtifactLine(artifact) {
|
|
|
10658
10740
|
}
|
|
10659
10741
|
async function runCLI(argv, runtime = {}) {
|
|
10660
10742
|
const log = runtime.log ?? console.log;
|
|
10743
|
+
const errorLog = runtime.errorLog ?? console.error;
|
|
10661
10744
|
const runGenerator = runtime.runGenerator ?? runSchemaGenerator;
|
|
10662
|
-
|
|
10745
|
+
let parsed;
|
|
10746
|
+
try {
|
|
10747
|
+
parsed = parseCommand(argv);
|
|
10748
|
+
} catch (error) {
|
|
10749
|
+
logCliError(formatGeneratorError(error), errorLog);
|
|
10750
|
+
process.exitCode = 1;
|
|
10751
|
+
return;
|
|
10752
|
+
}
|
|
10663
10753
|
if (parsed.command === "help") {
|
|
10664
10754
|
log(usage(parsed.topic));
|
|
10665
10755
|
return;
|
|
10666
10756
|
}
|
|
10667
10757
|
let result;
|
|
10668
10758
|
try {
|
|
10759
|
+
if (isDebugEnabled()) {
|
|
10760
|
+
errorLog(
|
|
10761
|
+
`[athena-js] generate starting (dryRun=${parsed.dryRun}${parsed.configPath ? ` config=${parsed.configPath}` : ""})`
|
|
10762
|
+
);
|
|
10763
|
+
}
|
|
10669
10764
|
result = await runGenerator({
|
|
10670
10765
|
configPath: parsed.configPath,
|
|
10671
10766
|
dryRun: parsed.dryRun
|
|
10672
10767
|
});
|
|
10673
10768
|
} catch (error) {
|
|
10674
|
-
|
|
10769
|
+
const formatted = formatGeneratorError(error, parsed.configPath);
|
|
10770
|
+
logCliError(formatted, errorLog);
|
|
10771
|
+
process.exitCode = 1;
|
|
10772
|
+
return;
|
|
10675
10773
|
}
|
|
10676
10774
|
if (parsed.dryRun) {
|
|
10677
10775
|
log(`[dry-run] Generated ${result.files.length} files from ${result.configPath}`);
|
|
@@ -10695,6 +10793,7 @@ async function runCLI(argv, runtime = {}) {
|
|
|
10695
10793
|
}
|
|
10696
10794
|
}
|
|
10697
10795
|
|
|
10796
|
+
exports.logCliError = logCliError;
|
|
10698
10797
|
exports.parseCommand = parseCommand;
|
|
10699
10798
|
exports.runCLI = runCLI;
|
|
10700
10799
|
exports.usage = usage;
|