@lunora/cli 1.0.0-alpha.22 → 1.0.0-alpha.24
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/bin.mjs +1 -1
- package/dist/index.d.mts +33 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.mjs +2 -2
- package/dist/packem_chunks/handler.mjs +15 -5
- package/dist/packem_chunks/handler10.mjs +8 -14
- package/dist/packem_chunks/handler11.mjs +19 -189
- package/dist/packem_chunks/handler12.mjs +176 -115
- package/dist/packem_chunks/handler13.mjs +118 -52
- package/dist/packem_chunks/handler14.mjs +50 -43
- package/dist/packem_chunks/handler15.mjs +46 -67
- package/dist/packem_chunks/handler16.mjs +73 -37
- package/dist/packem_chunks/handler17.mjs +38 -100
- package/dist/packem_chunks/handler18.mjs +87 -152
- package/dist/packem_chunks/handler19.mjs +148 -67
- package/dist/packem_chunks/handler2.mjs +1 -1
- package/dist/packem_chunks/handler20.mjs +71 -76
- package/dist/packem_chunks/handler21.mjs +71 -288
- package/dist/packem_chunks/handler3.mjs +1 -1
- package/dist/packem_chunks/handler4.mjs +1 -1
- package/dist/packem_chunks/handler5.mjs +1 -1
- package/dist/packem_chunks/handler6.mjs +1 -1
- package/dist/packem_chunks/handler7.mjs +1 -1
- package/dist/packem_chunks/handler8.mjs +1 -1
- package/dist/packem_chunks/handler9.mjs +311 -12
- package/dist/packem_chunks/planDevCommand.mjs +2 -2
- package/dist/packem_chunks/runCodegenCommand.mjs +1 -1
- package/dist/packem_chunks/runDeployCommand.mjs +103 -13
- package/dist/packem_chunks/runInitCommand.mjs +44 -6
- package/dist/packem_chunks/runMigrateGenerateCommand.mjs +1 -1
- package/dist/packem_chunks/runResetCommand.mjs +2 -2
- package/dist/packem_chunks/runRpcCommand.mjs +1 -1
- package/dist/packem_shared/{COMMANDS-D3h9Iwvl.mjs → COMMANDS-B0ftFD_3.mjs} +20 -16
- package/dist/packem_shared/{command-BC30oSBW.mjs → command-D3lB_4Az.mjs} +5 -0
- package/dist/packem_shared/{commands-hl0mRqqg.mjs → commands-B-gR09Z_.mjs} +1 -1
- package/dist/packem_shared/prompt-cancelled-APzX1Im-.mjs +9 -0
- package/dist/packem_shared/{runAddCommand-vJdgiR5t.mjs → runAddCommand-bnY6-HKb.mjs} +1 -1
- package/dist/packem_shared/{storage-B7hHSTZP.mjs → storage-BIsph-Vk.mjs} +1 -1
- package/dist/packem_shared/{tui-prompts-M6OWsuyw.mjs → tui-prompts-BjEN8XgP.mjs} +2 -7
- package/dist/packem_shared/wrangler-secrets-P2_ZUR-k.mjs +47 -0
- package/package.json +3 -3
package/dist/bin.mjs
CHANGED
package/dist/index.d.mts
CHANGED
|
@@ -226,6 +226,35 @@ declare const createRecordingSpawner: (exitCode?: number) => {
|
|
|
226
226
|
calls: RecordedSpawn[];
|
|
227
227
|
spawner: Spawner;
|
|
228
228
|
};
|
|
229
|
+
interface SecretListRunnerResult {
|
|
230
|
+
code: number;
|
|
231
|
+
stderr: string;
|
|
232
|
+
stdout: string;
|
|
233
|
+
}
|
|
234
|
+
/** Runs an argv and resolves its captured output. Injected in tests. */
|
|
235
|
+
type SecretListRunner = (command: string, args: ReadonlyArray<string>, cwd: string) => Promise<SecretListRunnerResult>;
|
|
236
|
+
interface ListRemoteSecretsInputs {
|
|
237
|
+
cwd: string;
|
|
238
|
+
/** Cloudflare environment name (`--env`). */
|
|
239
|
+
env?: string;
|
|
240
|
+
/** Injected command runner; defaults to a real `wrangler secret list`. */
|
|
241
|
+
runner?: SecretListRunner;
|
|
242
|
+
/** Target a temporary-account deployment (`--temporary`). */
|
|
243
|
+
temporary?: boolean;
|
|
244
|
+
}
|
|
245
|
+
interface ListRemoteSecretsResult {
|
|
246
|
+
/** Diagnostic message when `ok` is false. */
|
|
247
|
+
error?: string;
|
|
248
|
+
/** Remote secret names (sorted), empty when none or on failure. */
|
|
249
|
+
names: ReadonlyArray<string>;
|
|
250
|
+
/** False when wrangler failed or its output could not be parsed. */
|
|
251
|
+
ok: boolean;
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Parse `wrangler secret list --format json` output into a sorted name list.
|
|
255
|
+
* The payload is an array of `{ name, type }`; anything else yields `undefined`
|
|
256
|
+
* so the caller can report a parse failure rather than silently returning [].
|
|
257
|
+
*/
|
|
229
258
|
type FetchLike = (input: string, init?: {
|
|
230
259
|
body?: string;
|
|
231
260
|
headers?: Record<string, string>;
|
|
@@ -318,6 +347,10 @@ interface DeployCommandOptions {
|
|
|
318
347
|
preview?: boolean;
|
|
319
348
|
/** Railpack-availability probe injected in tests. Defaults to a real `railpack --version` + `BUILDKIT_HOST` check. */
|
|
320
349
|
railpackAvailable?: DockerProbe;
|
|
350
|
+
/** Confirm prompt for the missing-secret offer; injected in tests. Defaults to the TTY prompt. */
|
|
351
|
+
secretConfirm?: (message: string) => Promise<boolean>;
|
|
352
|
+
/** Remote-secret lister for the missing-secret offer; injected in tests. Defaults to `wrangler secret list`. */
|
|
353
|
+
secretLister?: (inputs: ListRemoteSecretsInputs) => Promise<ListRemoteSecretsResult>;
|
|
321
354
|
skipCodegen?: boolean;
|
|
322
355
|
spawner?: Spawner;
|
|
323
356
|
/**
|
package/dist/index.d.ts
CHANGED
|
@@ -226,6 +226,35 @@ declare const createRecordingSpawner: (exitCode?: number) => {
|
|
|
226
226
|
calls: RecordedSpawn[];
|
|
227
227
|
spawner: Spawner;
|
|
228
228
|
};
|
|
229
|
+
interface SecretListRunnerResult {
|
|
230
|
+
code: number;
|
|
231
|
+
stderr: string;
|
|
232
|
+
stdout: string;
|
|
233
|
+
}
|
|
234
|
+
/** Runs an argv and resolves its captured output. Injected in tests. */
|
|
235
|
+
type SecretListRunner = (command: string, args: ReadonlyArray<string>, cwd: string) => Promise<SecretListRunnerResult>;
|
|
236
|
+
interface ListRemoteSecretsInputs {
|
|
237
|
+
cwd: string;
|
|
238
|
+
/** Cloudflare environment name (`--env`). */
|
|
239
|
+
env?: string;
|
|
240
|
+
/** Injected command runner; defaults to a real `wrangler secret list`. */
|
|
241
|
+
runner?: SecretListRunner;
|
|
242
|
+
/** Target a temporary-account deployment (`--temporary`). */
|
|
243
|
+
temporary?: boolean;
|
|
244
|
+
}
|
|
245
|
+
interface ListRemoteSecretsResult {
|
|
246
|
+
/** Diagnostic message when `ok` is false. */
|
|
247
|
+
error?: string;
|
|
248
|
+
/** Remote secret names (sorted), empty when none or on failure. */
|
|
249
|
+
names: ReadonlyArray<string>;
|
|
250
|
+
/** False when wrangler failed or its output could not be parsed. */
|
|
251
|
+
ok: boolean;
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Parse `wrangler secret list --format json` output into a sorted name list.
|
|
255
|
+
* The payload is an array of `{ name, type }`; anything else yields `undefined`
|
|
256
|
+
* so the caller can report a parse failure rather than silently returning [].
|
|
257
|
+
*/
|
|
229
258
|
type FetchLike = (input: string, init?: {
|
|
230
259
|
body?: string;
|
|
231
260
|
headers?: Record<string, string>;
|
|
@@ -318,6 +347,10 @@ interface DeployCommandOptions {
|
|
|
318
347
|
preview?: boolean;
|
|
319
348
|
/** Railpack-availability probe injected in tests. Defaults to a real `railpack --version` + `BUILDKIT_HOST` check. */
|
|
320
349
|
railpackAvailable?: DockerProbe;
|
|
350
|
+
/** Confirm prompt for the missing-secret offer; injected in tests. Defaults to the TTY prompt. */
|
|
351
|
+
secretConfirm?: (message: string) => Promise<boolean>;
|
|
352
|
+
/** Remote-secret lister for the missing-secret offer; injected in tests. Defaults to `wrangler secret list`. */
|
|
353
|
+
secretLister?: (inputs: ListRemoteSecretsInputs) => Promise<ListRemoteSecretsResult>;
|
|
321
354
|
skipCodegen?: boolean;
|
|
322
355
|
spawner?: Spawner;
|
|
323
356
|
/**
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { COMMANDS, VERSION, runCli } from './packem_shared/COMMANDS-
|
|
1
|
+
export { COMMANDS, VERSION, runCli } from './packem_shared/COMMANDS-B0ftFD_3.mjs';
|
|
2
2
|
export { runCodegenCommand } from './packem_chunks/runCodegenCommand.mjs';
|
|
3
3
|
export { DEFAULT_IMPORT_BATCH_SIZE, runExportCommand, runImportCommand } from './packem_shared/DEFAULT_IMPORT_BATCH_SIZE-Ck-2bU08.mjs';
|
|
4
4
|
export { runDeployCommand } from './packem_chunks/runDeployCommand.mjs';
|
|
@@ -16,4 +16,4 @@ export { createRecordingSpawner, defaultSpawner } from './packem_shared/createRe
|
|
|
16
16
|
export { default as parseManifest } from './packem_shared/parseManifest--vZf2FY1.mjs';
|
|
17
17
|
export { REQUIRED_COMPATIBILITY_DATE, REQUIRED_FLAG, validateWranglerProject as validateWrangler, validateWranglerConfig } from '@lunora/config';
|
|
18
18
|
export { buildRegistryIndex } from './packem_shared/buildRegistryIndex-BcYe607_.mjs';
|
|
19
|
-
export { r as runAddCommand, a as runBuildIndexCommand, b as runRegistryViewCommand } from './packem_shared/commands-
|
|
19
|
+
export { r as runAddCommand, a as runBuildIndexCommand, b as runRegistryViewCommand } from './packem_shared/commands-B-gR09Z_.mjs';
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
2
|
import { findWranglerFile } from '@lunora/config';
|
|
3
3
|
import { join, basename } from '@visulima/path';
|
|
4
|
-
import { d as defineHandler } from '../packem_shared/command-
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { r as
|
|
4
|
+
import { d as defineHandler } from '../packem_shared/command-D3lB_4Az.mjs';
|
|
5
|
+
import { v as validateOutputFormat, i as isJsonFormat, p as printJson, l as loggerForFormat } from '../packem_shared/output-format-wUvAN6AL.mjs';
|
|
6
|
+
import { t as tuiText, a as tuiSelect } from '../packem_shared/tui-prompts-BjEN8XgP.mjs';
|
|
7
|
+
import { n as normalizeFeature, E as EMAIL_ITEM, s as sanitizeBucketName, d as deriveBucketName, p as promptBucketName, r as resolveTypedDestination, M as MAIL_DESTINATION_PROMPT, a as sanitizeDatabaseName, b as deriveDatabaseName, c as promptDatabaseName, D as DEFAULT_AUTH_ITEM, e as promptAuthProvider, A as AUTH_PROVIDER_OPTIONS, w as withStorageBucketName, f as withMailDestination, g as withAuthDatabaseName } from '../packem_shared/storage-BIsph-Vk.mjs';
|
|
8
|
+
import { r as runAddCommand } from '../packem_shared/commands-B-gR09Z_.mjs';
|
|
8
9
|
|
|
9
10
|
const providerToItem = (provider) => {
|
|
10
11
|
const value = provider.trim().toLowerCase();
|
|
@@ -130,6 +131,12 @@ const runAddFeature = async (options) => {
|
|
|
130
131
|
return { code: result.code, items };
|
|
131
132
|
};
|
|
132
133
|
const execute = defineHandler(async ({ argument, cwd, logger, options }) => {
|
|
134
|
+
const formatError = validateOutputFormat("add", options.format);
|
|
135
|
+
if (formatError !== void 0) {
|
|
136
|
+
logger.error(formatError);
|
|
137
|
+
return { code: 1 };
|
|
138
|
+
}
|
|
139
|
+
const effectiveLogger = loggerForFormat(options.format, logger);
|
|
133
140
|
const result = await runAddFeature({
|
|
134
141
|
allowUnsafeSource: options.allowUnsafeSource === true,
|
|
135
142
|
bucket: options.bucket,
|
|
@@ -137,13 +144,16 @@ const execute = defineHandler(async ({ argument, cwd, logger, options }) => {
|
|
|
137
144
|
db: options.db,
|
|
138
145
|
feature: argument[0],
|
|
139
146
|
from: options.from,
|
|
140
|
-
logger,
|
|
147
|
+
logger: effectiveLogger,
|
|
141
148
|
mailTo: options.mailTo,
|
|
142
149
|
provider: options.provider,
|
|
143
150
|
ref: options.ref,
|
|
144
151
|
source: options.source,
|
|
145
152
|
yes: options.yes === true
|
|
146
153
|
});
|
|
154
|
+
if (isJsonFormat(options.format)) {
|
|
155
|
+
printJson({ code: result.code, items: result.items });
|
|
156
|
+
}
|
|
147
157
|
return { code: result.code };
|
|
148
158
|
});
|
|
149
159
|
|
|
@@ -1,22 +1,16 @@
|
|
|
1
|
-
import { d as defineHandler } from '../packem_shared/command-
|
|
1
|
+
import { d as defineHandler } from '../packem_shared/command-D3lB_4Az.mjs';
|
|
2
2
|
import { a as resolveProductionWorkerUrl } from '../packem_shared/resolve-target-qbsJ_5sF.mjs';
|
|
3
|
-
import {
|
|
3
|
+
import { runExportCommand } from '../packem_shared/DEFAULT_IMPORT_BATCH_SIZE-Ck-2bU08.mjs';
|
|
4
4
|
|
|
5
|
-
const execute = defineHandler(
|
|
6
|
-
|
|
7
|
-
if (!file) {
|
|
8
|
-
logger.error("import requires a file. Usage: lunora import <path> [--table <name>]");
|
|
9
|
-
return { code: 1 };
|
|
10
|
-
}
|
|
11
|
-
return runImportCommand({
|
|
12
|
-
batchSize: options.batchSize,
|
|
13
|
-
file,
|
|
5
|
+
const execute = defineHandler(
|
|
6
|
+
({ argument, cwd, logger, options }) => runExportCommand({
|
|
14
7
|
logger,
|
|
8
|
+
out: argument[0] ?? options.out,
|
|
15
9
|
prod: options.prod === true,
|
|
16
|
-
|
|
10
|
+
tables: options.tables,
|
|
17
11
|
token: options.token,
|
|
18
12
|
url: resolveProductionWorkerUrl({ cwd, prod: options.prod === true, url: options.url })
|
|
19
|
-
})
|
|
20
|
-
|
|
13
|
+
})
|
|
14
|
+
);
|
|
21
15
|
|
|
22
16
|
export { execute };
|
|
@@ -1,192 +1,22 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { readLinkedProject } from '@lunora/config';
|
|
5
|
-
import { parse } from 'jsonc-parser';
|
|
6
|
-
import { Project } from 'ts-morph';
|
|
7
|
-
import { d as defineHandler } from '../packem_shared/command-BC30oSBW.mjs';
|
|
1
|
+
import { d as defineHandler } from '../packem_shared/command-D3lB_4Az.mjs';
|
|
2
|
+
import { a as resolveProductionWorkerUrl } from '../packem_shared/resolve-target-qbsJ_5sF.mjs';
|
|
3
|
+
import { runImportCommand } from '../packem_shared/DEFAULT_IMPORT_BATCH_SIZE-Ck-2bU08.mjs';
|
|
8
4
|
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
return typeof value === "string" && value.length > 0 ? value : void 0;
|
|
24
|
-
};
|
|
25
|
-
const arrayField = (record, key) => {
|
|
26
|
-
if (record === null || typeof record !== "object") {
|
|
27
|
-
return [];
|
|
28
|
-
}
|
|
29
|
-
const value = record[key];
|
|
30
|
-
return Array.isArray(value) ? value : [];
|
|
31
|
-
};
|
|
32
|
-
const summariseWrangler = (raw) => {
|
|
33
|
-
const durableObjectBindings = arrayField(raw.durable_objects ?? {}, "bindings");
|
|
34
|
-
const d1 = arrayField(raw, "d1_databases");
|
|
35
|
-
const vectorize = arrayField(raw, "vectorize");
|
|
36
|
-
return {
|
|
37
|
-
bindings: {
|
|
38
|
-
d1: d1.map((entry) => stringField(entry, "binding") ?? "<unnamed>"),
|
|
39
|
-
durableObjects: durableObjectBindings.map((entry) => stringField(entry, "name") ?? "<unnamed>"),
|
|
40
|
-
vectorize: vectorize.map((entry) => stringField(entry, "binding") ?? "<unnamed>")
|
|
41
|
-
},
|
|
42
|
-
compatibilityDate: stringField(raw, "compatibility_date"),
|
|
43
|
-
compatibilityFlags: arrayField(raw, "compatibility_flags").filter((entry) => typeof entry === "string"),
|
|
44
|
-
main: stringField(raw, "main"),
|
|
45
|
-
name: stringField(raw, "name")
|
|
46
|
-
};
|
|
47
|
-
};
|
|
48
|
-
const summariseSchema = (schema) => {
|
|
49
|
-
return {
|
|
50
|
-
tables: schema.tables.map((table) => {
|
|
51
|
-
let shard = "root";
|
|
52
|
-
if (table.shardMode === "global") {
|
|
53
|
-
shard = "global";
|
|
54
|
-
} else if (typeof table.shardMode === "object") {
|
|
55
|
-
shard = `shardBy(${table.shardMode.field})`;
|
|
56
|
-
}
|
|
57
|
-
return {
|
|
58
|
-
indexes: table.indexes.length,
|
|
59
|
-
name: table.name,
|
|
60
|
-
shard
|
|
61
|
-
};
|
|
62
|
-
}),
|
|
63
|
-
vectorIndexes: schema.vectorIndexes.length
|
|
64
|
-
};
|
|
65
|
-
};
|
|
66
|
-
const collectLunoraPackages = (projectRoot) => {
|
|
67
|
-
const pkgPath = join(projectRoot, "package.json");
|
|
68
|
-
if (!existsSync(pkgPath)) {
|
|
69
|
-
return [];
|
|
70
|
-
}
|
|
71
|
-
let pkg;
|
|
72
|
-
try {
|
|
73
|
-
pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
|
|
74
|
-
} catch {
|
|
75
|
-
return [];
|
|
76
|
-
}
|
|
77
|
-
if (pkg === null || typeof pkg !== "object") {
|
|
78
|
-
return [];
|
|
79
|
-
}
|
|
80
|
-
const sections = ["dependencies", "devDependencies", "peerDependencies", "optionalDependencies"];
|
|
81
|
-
const seen = /* @__PURE__ */ new Map();
|
|
82
|
-
for (const section of sections) {
|
|
83
|
-
const block = pkg[section];
|
|
84
|
-
if (block === null || typeof block !== "object") {
|
|
85
|
-
continue;
|
|
86
|
-
}
|
|
87
|
-
for (const [name, version] of Object.entries(block)) {
|
|
88
|
-
if (!name.startsWith("@lunora/")) {
|
|
89
|
-
continue;
|
|
90
|
-
}
|
|
91
|
-
if (typeof version === "string" && !seen.has(name)) {
|
|
92
|
-
seen.set(name, version);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
return [...seen.entries()].toSorted(([a], [b]) => a.localeCompare(b)).map(([name, version]) => {
|
|
97
|
-
return { name, version };
|
|
5
|
+
const execute = defineHandler(({ argument, cwd, logger, options }) => {
|
|
6
|
+
const file = argument[0];
|
|
7
|
+
if (!file) {
|
|
8
|
+
logger.error("import requires a file. Usage: lunora import <path> [--table <name>]");
|
|
9
|
+
return { code: 1 };
|
|
10
|
+
}
|
|
11
|
+
return runImportCommand({
|
|
12
|
+
batchSize: options.batchSize,
|
|
13
|
+
file,
|
|
14
|
+
logger,
|
|
15
|
+
prod: options.prod === true,
|
|
16
|
+
table: options.table,
|
|
17
|
+
token: options.token,
|
|
18
|
+
url: resolveProductionWorkerUrl({ cwd, prod: options.prod === true, url: options.url })
|
|
98
19
|
});
|
|
99
|
-
};
|
|
100
|
-
const collectInfo = (projectRoot) => {
|
|
101
|
-
const lunoraPackages = collectLunoraPackages(projectRoot);
|
|
102
|
-
const wranglerPath = findWranglerFile(projectRoot);
|
|
103
|
-
let wrangler;
|
|
104
|
-
if (wranglerPath) {
|
|
105
|
-
try {
|
|
106
|
-
wrangler = summariseWrangler(parse(readFileSync(wranglerPath, "utf8")));
|
|
107
|
-
} catch {
|
|
108
|
-
wrangler = void 0;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
const schemaPath = join(projectRoot, "lunora", "schema.ts");
|
|
112
|
-
let schema;
|
|
113
|
-
let schemaError;
|
|
114
|
-
if (existsSync(schemaPath)) {
|
|
115
|
-
try {
|
|
116
|
-
const project = new Project({ skipAddingFilesFromTsConfig: true, useInMemoryFileSystem: false });
|
|
117
|
-
schema = summariseSchema(discoverSchema(project, schemaPath));
|
|
118
|
-
} catch (error) {
|
|
119
|
-
schemaError = error instanceof Error ? error.message : String(error);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
return {
|
|
123
|
-
link: readLinkedProject(projectRoot),
|
|
124
|
-
lunoraPackages,
|
|
125
|
-
projectRoot,
|
|
126
|
-
schema,
|
|
127
|
-
schemaError,
|
|
128
|
-
wrangler,
|
|
129
|
-
wranglerPath
|
|
130
|
-
};
|
|
131
|
-
};
|
|
132
|
-
const renderText = (snapshot, logger) => {
|
|
133
|
-
logger.info(`project: ${snapshot.projectRoot}`);
|
|
134
|
-
logger.info("");
|
|
135
|
-
logger.info("@lunora/* packages:");
|
|
136
|
-
if (snapshot.lunoraPackages.length === 0) {
|
|
137
|
-
logger.info(" (none found in package.json)");
|
|
138
|
-
} else {
|
|
139
|
-
for (const pkg of snapshot.lunoraPackages) {
|
|
140
|
-
logger.info(` ${pkg.name}@${pkg.version}`);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
logger.info("");
|
|
144
|
-
if (snapshot.wrangler) {
|
|
145
|
-
logger.info(`wrangler: ${snapshot.wranglerPath ?? ""}`);
|
|
146
|
-
logger.info(` name: ${snapshot.wrangler.name ?? "<unset>"}`);
|
|
147
|
-
logger.info(` main: ${snapshot.wrangler.main ?? "<unset>"}`);
|
|
148
|
-
logger.info(` compatibility_date: ${snapshot.wrangler.compatibilityDate ?? "<unset>"}`);
|
|
149
|
-
logger.info(` compatibility_flags: ${snapshot.wrangler.compatibilityFlags.join(", ") || "<none>"}`);
|
|
150
|
-
logger.info(` durable objects: ${snapshot.wrangler.bindings.durableObjects.join(", ") || "<none>"}`);
|
|
151
|
-
logger.info(` d1 databases: ${snapshot.wrangler.bindings.d1.join(", ") || "<none>"}`);
|
|
152
|
-
logger.info(` vectorize indexes: ${snapshot.wrangler.bindings.vectorize.join(", ") || "<none>"}`);
|
|
153
|
-
} else {
|
|
154
|
-
logger.info("wrangler: (not found)");
|
|
155
|
-
}
|
|
156
|
-
logger.info("");
|
|
157
|
-
if (snapshot.link) {
|
|
158
|
-
logger.info(`link: ${snapshot.link.workerName ?? "(unnamed)"} -> ${snapshot.link.workerUrl ?? "<no url>"}`);
|
|
159
|
-
if (snapshot.link.env !== void 0) {
|
|
160
|
-
logger.info(` env: ${snapshot.link.env}`);
|
|
161
|
-
}
|
|
162
|
-
} else {
|
|
163
|
-
logger.info("link: (not linked — run `lunora link --url <https://your-worker>`)");
|
|
164
|
-
}
|
|
165
|
-
logger.info("");
|
|
166
|
-
if (snapshot.schemaError !== void 0) {
|
|
167
|
-
logger.warn(`schema: parse error — ${snapshot.schemaError}`);
|
|
168
|
-
} else if (snapshot.schema) {
|
|
169
|
-
logger.info(`schema: ${String(snapshot.schema.tables.length)} table(s), ${String(snapshot.schema.vectorIndexes)} vector index(es)`);
|
|
170
|
-
for (const table of snapshot.schema.tables) {
|
|
171
|
-
logger.info(` ${table.name} [${table.shard}, ${String(table.indexes)} index(es)]`);
|
|
172
|
-
}
|
|
173
|
-
} else {
|
|
174
|
-
logger.info("schema: (no lunora/schema.ts)");
|
|
175
|
-
}
|
|
176
|
-
};
|
|
177
|
-
const runInfoCommand = (options) => {
|
|
178
|
-
const cwd = options.cwd ?? process.cwd();
|
|
179
|
-
const snapshot = collectInfo(cwd);
|
|
180
|
-
if (options.json) {
|
|
181
|
-
process.stdout.write(`${JSON.stringify(snapshot, void 0, 2)}
|
|
182
|
-
`);
|
|
183
|
-
} else {
|
|
184
|
-
renderText(snapshot, options.logger);
|
|
185
|
-
}
|
|
186
|
-
return { code: 0, snapshot };
|
|
187
|
-
};
|
|
188
|
-
const execute = defineHandler(
|
|
189
|
-
({ cwd, logger, options }) => runInfoCommand({ cwd, json: options.json === true, logger })
|
|
190
|
-
);
|
|
20
|
+
});
|
|
191
21
|
|
|
192
|
-
export {
|
|
22
|
+
export { execute };
|