@semilayer/cli 1.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/auth-config-3MWVCUTJ.js +117 -0
- package/dist/auth-config-3MWVCUTJ.js.map +1 -0
- package/dist/billing-OY5GJP5X.js +265 -0
- package/dist/billing-OY5GJP5X.js.map +1 -0
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +49 -0
- package/dist/bin.js.map +1 -0
- package/dist/chunk-7TA63VHV.js +38 -0
- package/dist/chunk-7TA63VHV.js.map +1 -0
- package/dist/chunk-ALA4X7UU.js +19 -0
- package/dist/chunk-ALA4X7UU.js.map +1 -0
- package/dist/chunk-NIDLPHWY.js +53 -0
- package/dist/chunk-NIDLPHWY.js.map +1 -0
- package/dist/chunk-QMF7LD67.js +39 -0
- package/dist/chunk-QMF7LD67.js.map +1 -0
- package/dist/chunk-QXIVJY7K.js +56 -0
- package/dist/chunk-QXIVJY7K.js.map +1 -0
- package/dist/chunk-T3UROBMA.js +169 -0
- package/dist/chunk-T3UROBMA.js.map +1 -0
- package/dist/chunk-WZYOSGN3.js +88 -0
- package/dist/chunk-WZYOSGN3.js.map +1 -0
- package/dist/config-DACYO7JC.js +103 -0
- package/dist/config-DACYO7JC.js.map +1 -0
- package/dist/dev-R3AZSONQ.js +57 -0
- package/dist/dev-R3AZSONQ.js.map +1 -0
- package/dist/envs-RNZQ3OQP.js +105 -0
- package/dist/envs-RNZQ3OQP.js.map +1 -0
- package/dist/export-YRFR3JH2.js +81 -0
- package/dist/export-YRFR3JH2.js.map +1 -0
- package/dist/generate-QUETX3TN.js +41 -0
- package/dist/generate-QUETX3TN.js.map +1 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/init-TWJAGUN3.js +187 -0
- package/dist/init-TWJAGUN3.js.map +1 -0
- package/dist/keys-JBKCYKJU.js +111 -0
- package/dist/keys-JBKCYKJU.js.map +1 -0
- package/dist/lenses-VZSDFH3D.js +51 -0
- package/dist/lenses-VZSDFH3D.js.map +1 -0
- package/dist/login-BZ6ZPFHC.js +119 -0
- package/dist/login-BZ6ZPFHC.js.map +1 -0
- package/dist/logout-VMPRV62T.js +38 -0
- package/dist/logout-VMPRV62T.js.map +1 -0
- package/dist/members-DVE5FDLZ.js +110 -0
- package/dist/members-DVE5FDLZ.js.map +1 -0
- package/dist/observe-W346RZBX.js +149 -0
- package/dist/observe-W346RZBX.js.map +1 -0
- package/dist/orgs-YA3TVA3T.js +67 -0
- package/dist/orgs-YA3TVA3T.js.map +1 -0
- package/dist/pause-GQ6PKBUA.js +50 -0
- package/dist/pause-GQ6PKBUA.js.map +1 -0
- package/dist/projects-DMA2AXH3.js +107 -0
- package/dist/projects-DMA2AXH3.js.map +1 -0
- package/dist/push-3ZK3W2AC.js +145 -0
- package/dist/push-3ZK3W2AC.js.map +1 -0
- package/dist/resume-KVRPLXZZ.js +50 -0
- package/dist/resume-KVRPLXZZ.js.map +1 -0
- package/dist/run-IR5B4AE3.js +375 -0
- package/dist/run-IR5B4AE3.js.map +1 -0
- package/dist/sources-S52HUWRK.js +170 -0
- package/dist/sources-S52HUWRK.js.map +1 -0
- package/dist/status-AUECH6RX.js +130 -0
- package/dist/status-AUECH6RX.js.map +1 -0
- package/dist/stream-V7RGHTPR.js +344 -0
- package/dist/stream-V7RGHTPR.js.map +1 -0
- package/dist/sync-NRTC3WX4.js +68 -0
- package/dist/sync-NRTC3WX4.js.map +1 -0
- package/dist/whoami-EQGW6V5D.js +50 -0
- package/dist/whoami-EQGW6V5D.js.map +1 -0
- package/dist/wizard-QLAR33T2.js +306 -0
- package/dist/wizard-QLAR33T2.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/envs.ts"],"sourcesContent":["import { defineCommand } from 'citty'\nimport type { Environment, CreateEnvResponse } from '@semilayer/core'\nimport { createApiClient } from '../lib/api.js'\nimport { loadContext } from '../lib/context.js'\nimport { projectPath } from '../lib/env-path.js'\nimport { success, error, info, bold, dim, table, newline } from '../lib/output.js'\nimport { confirm } from '../lib/prompt.js'\n\nexport default defineCommand({\n meta: { name: 'envs', description: 'Manage environments' },\n subCommands: {\n list: defineCommand({\n meta: { name: 'list', description: 'List environments in the current project' },\n async run() {\n const ctx = await loadContext()\n if (!ctx) {\n error('No .semilayerrc found. Run `semilayer init` first.')\n process.exitCode = 1\n return\n }\n const api = await createApiClient()\n const { environments } = await api.get<{ environments: Environment[] }>(`${projectPath(ctx)}/envs`)\n if (environments.length === 0) {\n newline()\n bold('No environments found.')\n return\n }\n table(\n ['Slug', 'Name'],\n environments.map((e) => [e.slug, e.name]),\n )\n },\n }),\n\n create: defineCommand({\n meta: { name: 'create', description: 'Create a new environment' },\n args: {\n name: { type: 'string', description: 'Environment name', required: true },\n slug: { type: 'string', description: 'Environment slug', required: true },\n },\n async run({ args }) {\n const ctx = await loadContext()\n if (!ctx) {\n error('No .semilayerrc found. Run `semilayer init` first.')\n process.exitCode = 1\n return\n }\n const api = await createApiClient()\n const result = await api.post<CreateEnvResponse>(`${projectPath(ctx)}/envs`, { name: args.name, slug: args.slug })\n success(`Environment \"${args.name}\" (${args.slug}) created.`)\n newline()\n if (result.keys && result.keys.length > 0) {\n bold('API Keys:')\n for (const k of result.keys) {\n info(` ${k.type}: ${k.key}`)\n }\n newline()\n dim('Save these keys — they will not be shown again.')\n }\n },\n }),\n\n delete: defineCommand({\n meta: { name: 'delete', description: 'Delete an environment' },\n args: {\n env: { type: 'string', description: 'Environment slug to delete', required: true },\n },\n async run({ args }) {\n const ctx = await loadContext()\n if (!ctx) {\n error('No .semilayerrc found. Run `semilayer init` first.')\n process.exitCode = 1\n return\n }\n const ok = await confirm(\n `Delete environment \"${args.env}\" and all its data? This cannot be undone.`,\n )\n if (!ok) return\n const api = await createApiClient()\n await api.del(`${projectPath(ctx)}/envs/${args.env}`)\n success(`Environment \"${args.env}\" deleted.`)\n },\n }),\n },\n})\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAQ9B,IAAO,eAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,QAAQ,aAAa,sBAAsB;AAAA,EACzD,aAAa;AAAA,IACX,MAAM,cAAc;AAAA,MAClB,MAAM,EAAE,MAAM,QAAQ,aAAa,2CAA2C;AAAA,MAC9E,MAAM,MAAM;AACV,cAAM,MAAM,MAAM,YAAY;AAC9B,YAAI,CAAC,KAAK;AACR,gBAAM,oDAAoD;AAC1D,kBAAQ,WAAW;AACnB;AAAA,QACF;AACA,cAAM,MAAM,MAAM,gBAAgB;AAClC,cAAM,EAAE,aAAa,IAAI,MAAM,IAAI,IAAqC,GAAG,YAAY,GAAG,CAAC,OAAO;AAClG,YAAI,aAAa,WAAW,GAAG;AAC7B,kBAAQ;AACR,eAAK,wBAAwB;AAC7B;AAAA,QACF;AACA;AAAA,UACE,CAAC,QAAQ,MAAM;AAAA,UACf,aAAa,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC;AAAA,QAC1C;AAAA,MACF;AAAA,IACF,CAAC;AAAA,IAED,QAAQ,cAAc;AAAA,MACpB,MAAM,EAAE,MAAM,UAAU,aAAa,2BAA2B;AAAA,MAChE,MAAM;AAAA,QACJ,MAAM,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,KAAK;AAAA,QACxE,MAAM,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,KAAK;AAAA,MAC1E;AAAA,MACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,cAAM,MAAM,MAAM,YAAY;AAC9B,YAAI,CAAC,KAAK;AACR,gBAAM,oDAAoD;AAC1D,kBAAQ,WAAW;AACnB;AAAA,QACF;AACA,cAAM,MAAM,MAAM,gBAAgB;AAClC,cAAM,SAAS,MAAM,IAAI,KAAwB,GAAG,YAAY,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,MAAM,KAAK,KAAK,CAAC;AACjH,gBAAQ,gBAAgB,KAAK,IAAI,MAAM,KAAK,IAAI,YAAY;AAC5D,gBAAQ;AACR,YAAI,OAAO,QAAQ,OAAO,KAAK,SAAS,GAAG;AACzC,eAAK,WAAW;AAChB,qBAAW,KAAK,OAAO,MAAM;AAC3B,iBAAK,KAAK,EAAE,IAAI,KAAK,EAAE,GAAG,EAAE;AAAA,UAC9B;AACA,kBAAQ;AACR,cAAI,sDAAiD;AAAA,QACvD;AAAA,MACF;AAAA,IACF,CAAC;AAAA,IAED,QAAQ,cAAc;AAAA,MACpB,MAAM,EAAE,MAAM,UAAU,aAAa,wBAAwB;AAAA,MAC7D,MAAM;AAAA,QACJ,KAAK,EAAE,MAAM,UAAU,aAAa,8BAA8B,UAAU,KAAK;AAAA,MACnF;AAAA,MACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,cAAM,MAAM,MAAM,YAAY;AAC9B,YAAI,CAAC,KAAK;AACR,gBAAM,oDAAoD;AAC1D,kBAAQ,WAAW;AACnB;AAAA,QACF;AACA,cAAM,KAAK,MAAM;AAAA,UACf,uBAAuB,KAAK,GAAG;AAAA,QACjC;AACA,YAAI,CAAC,GAAI;AACT,cAAM,MAAM,MAAM,gBAAgB;AAClC,cAAM,IAAI,IAAI,GAAG,YAAY,GAAG,CAAC,SAAS,KAAK,GAAG,EAAE;AACpD,gBAAQ,gBAAgB,KAAK,GAAG,YAAY;AAAA,MAC9C;AAAA,IACF,CAAC;AAAA,EACH;AACF,CAAC;","names":[]}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
loadContext
|
|
4
|
+
} from "./chunk-QMF7LD67.js";
|
|
5
|
+
import {
|
|
6
|
+
confirm
|
|
7
|
+
} from "./chunk-QXIVJY7K.js";
|
|
8
|
+
import {
|
|
9
|
+
createApiClient
|
|
10
|
+
} from "./chunk-T3UROBMA.js";
|
|
11
|
+
import "./chunk-7TA63VHV.js";
|
|
12
|
+
import {
|
|
13
|
+
dim,
|
|
14
|
+
error,
|
|
15
|
+
info,
|
|
16
|
+
success,
|
|
17
|
+
warn
|
|
18
|
+
} from "./chunk-WZYOSGN3.js";
|
|
19
|
+
|
|
20
|
+
// src/commands/export.ts
|
|
21
|
+
import { defineCommand } from "citty";
|
|
22
|
+
import { existsSync, writeFileSync } from "fs";
|
|
23
|
+
import { resolve } from "path";
|
|
24
|
+
var export_default = defineCommand({
|
|
25
|
+
meta: { name: "export", description: "Export remote config to a local file" },
|
|
26
|
+
subCommands: {
|
|
27
|
+
config: defineCommand({
|
|
28
|
+
meta: { name: "config", description: "Export remote SemiLayer config to sl.config.ts" },
|
|
29
|
+
args: {
|
|
30
|
+
output: {
|
|
31
|
+
type: "string",
|
|
32
|
+
alias: "o",
|
|
33
|
+
description: "Output file path (default: sl.config.ts)"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
async run({ args }) {
|
|
37
|
+
try {
|
|
38
|
+
const ctx = await loadContext();
|
|
39
|
+
if (!ctx) {
|
|
40
|
+
error("No .semilayerrc found. Run `semilayer init` first.");
|
|
41
|
+
process.exitCode = 1;
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const api = await createApiClient();
|
|
45
|
+
const exportPath = `/v1/orgs/${ctx.orgSlug}/projects/${ctx.projectSlug}/envs/${ctx.envSlug}/config/export`;
|
|
46
|
+
const { config } = await api.get(exportPath);
|
|
47
|
+
const outputPath = resolve(
|
|
48
|
+
typeof args.output === "string" ? args.output : "sl.config.ts"
|
|
49
|
+
);
|
|
50
|
+
if (existsSync(outputPath)) {
|
|
51
|
+
warn(`File exists: ${dim(outputPath)}`);
|
|
52
|
+
const ok = await confirm("Overwrite?");
|
|
53
|
+
if (!ok) {
|
|
54
|
+
info("Aborted.");
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const content = generateConfigFile(config);
|
|
59
|
+
writeFileSync(outputPath, content, "utf-8");
|
|
60
|
+
success(`Config exported to ${dim(outputPath)}`);
|
|
61
|
+
info("Note: Source credentials are omitted \u2014 configure them separately.");
|
|
62
|
+
} catch (err) {
|
|
63
|
+
error(err.message);
|
|
64
|
+
process.exitCode = 1;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
})
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
function generateConfigFile(config) {
|
|
71
|
+
const json = JSON.stringify(config, null, 2);
|
|
72
|
+
return `// Exported from SemiLayer remote \u2014 source credentials omitted
|
|
73
|
+
import { defineConfig } from '@semilayer/core'
|
|
74
|
+
|
|
75
|
+
export default defineConfig(${json})
|
|
76
|
+
`;
|
|
77
|
+
}
|
|
78
|
+
export {
|
|
79
|
+
export_default as default
|
|
80
|
+
};
|
|
81
|
+
//# sourceMappingURL=export-YRFR3JH2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/export.ts"],"sourcesContent":["import { defineCommand } from 'citty'\nimport { existsSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport type { SemiLayerConfig } from '@semilayer/core'\nimport { loadContext } from '../lib/context.js'\nimport { createApiClient } from '../lib/api.js'\nimport { success, error, info, warn, dim } from '../lib/output.js'\nimport { confirm } from '../lib/prompt.js'\n\nexport default defineCommand({\n meta: { name: 'export', description: 'Export remote config to a local file' },\n subCommands: {\n config: defineCommand({\n meta: { name: 'config', description: 'Export remote SemiLayer config to sl.config.ts' },\n args: {\n output: {\n type: 'string',\n alias: 'o',\n description: 'Output file path (default: sl.config.ts)',\n },\n },\n async run({ args }) {\n try {\n const ctx = await loadContext()\n if (!ctx) {\n error('No .semilayerrc found. Run `semilayer init` first.')\n process.exitCode = 1\n return\n }\n\n const api = await createApiClient()\n const exportPath = `/v1/orgs/${ctx.orgSlug}/projects/${ctx.projectSlug}/envs/${ctx.envSlug}/config/export`\n const { config } = await api.get<{ config: SemiLayerConfig }>(exportPath)\n\n const outputPath = resolve(\n typeof args.output === 'string' ? args.output : 'sl.config.ts',\n )\n\n // Safety: confirm before overwriting\n if (existsSync(outputPath)) {\n warn(`File exists: ${dim(outputPath)}`)\n const ok = await confirm('Overwrite?')\n if (!ok) {\n info('Aborted.')\n return\n }\n }\n\n // Generate TypeScript config file\n const content = generateConfigFile(config)\n writeFileSync(outputPath, content, 'utf-8')\n\n success(`Config exported to ${dim(outputPath)}`)\n info('Note: Source credentials are omitted — configure them separately.')\n } catch (err) {\n error((err as Error).message)\n process.exitCode = 1\n }\n },\n }),\n },\n})\n\nfunction generateConfigFile(config: SemiLayerConfig): string {\n const json = JSON.stringify(config, null, 2)\n return `// Exported from SemiLayer remote — source credentials omitted\nimport { defineConfig } from '@semilayer/core'\n\nexport default defineConfig(${json})\n`\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAC9B,SAAS,YAAY,qBAAqB;AAC1C,SAAS,eAAe;AAOxB,IAAO,iBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,UAAU,aAAa,uCAAuC;AAAA,EAC5E,aAAa;AAAA,IACX,QAAQ,cAAc;AAAA,MACpB,MAAM,EAAE,MAAM,UAAU,aAAa,iDAAiD;AAAA,MACtF,MAAM;AAAA,QACJ,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aAAa;AAAA,QACf;AAAA,MACF;AAAA,MACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,YAAI;AACF,gBAAM,MAAM,MAAM,YAAY;AAC9B,cAAI,CAAC,KAAK;AACR,kBAAM,oDAAoD;AAC1D,oBAAQ,WAAW;AACnB;AAAA,UACF;AAEA,gBAAM,MAAM,MAAM,gBAAgB;AAClC,gBAAM,aAAa,YAAY,IAAI,OAAO,aAAa,IAAI,WAAW,SAAS,IAAI,OAAO;AAC1F,gBAAM,EAAE,OAAO,IAAI,MAAM,IAAI,IAAiC,UAAU;AAExE,gBAAM,aAAa;AAAA,YACjB,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS;AAAA,UAClD;AAGA,cAAI,WAAW,UAAU,GAAG;AAC1B,iBAAK,gBAAgB,IAAI,UAAU,CAAC,EAAE;AACtC,kBAAM,KAAK,MAAM,QAAQ,YAAY;AACrC,gBAAI,CAAC,IAAI;AACP,mBAAK,UAAU;AACf;AAAA,YACF;AAAA,UACF;AAGA,gBAAM,UAAU,mBAAmB,MAAM;AACzC,wBAAc,YAAY,SAAS,OAAO;AAE1C,kBAAQ,sBAAsB,IAAI,UAAU,CAAC,EAAE;AAC/C,eAAK,wEAAmE;AAAA,QAC1E,SAAS,KAAK;AACZ,gBAAO,IAAc,OAAO;AAC5B,kBAAQ,WAAW;AAAA,QACrB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF,CAAC;AAED,SAAS,mBAAmB,QAAiC;AAC3D,QAAM,OAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AAC3C,SAAO;AAAA;AAAA;AAAA,8BAGqB,IAAI;AAAA;AAElC;","names":[]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
loadConfig
|
|
4
|
+
} from "./chunk-NIDLPHWY.js";
|
|
5
|
+
import {
|
|
6
|
+
dim,
|
|
7
|
+
error,
|
|
8
|
+
info,
|
|
9
|
+
success
|
|
10
|
+
} from "./chunk-WZYOSGN3.js";
|
|
11
|
+
|
|
12
|
+
// src/commands/generate.ts
|
|
13
|
+
import { defineCommand } from "citty";
|
|
14
|
+
var generate_default = defineCommand({
|
|
15
|
+
meta: { name: "generate", description: "Generate the typed Beam client" },
|
|
16
|
+
args: {
|
|
17
|
+
out: {
|
|
18
|
+
type: "string",
|
|
19
|
+
description: "Output directory",
|
|
20
|
+
default: "./generated/semilayer"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
async run({ args }) {
|
|
24
|
+
try {
|
|
25
|
+
const { config, configPath } = await loadConfig();
|
|
26
|
+
info(`Config: ${dim(configPath)}`);
|
|
27
|
+
const { generate } = await import("@semilayer/codegen");
|
|
28
|
+
const result = await generate({ config, outDir: args.out, write: true });
|
|
29
|
+
success(
|
|
30
|
+
`Generated ${result.files.length} files for ${result.lenses.length} lenses (${result.lenses.join(", ")}) in ${result.durationMs}ms`
|
|
31
|
+
);
|
|
32
|
+
} catch (err) {
|
|
33
|
+
error(err.message);
|
|
34
|
+
process.exitCode = 1;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
export {
|
|
39
|
+
generate_default as default
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=generate-QUETX3TN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/generate.ts"],"sourcesContent":["import { defineCommand } from 'citty'\nimport { loadConfig } from '../lib/config-loader.js'\nimport { success, error, info, dim } from '../lib/output.js'\n\nexport default defineCommand({\n meta: { name: 'generate', description: 'Generate the typed Beam client' },\n args: {\n out: {\n type: 'string',\n description: 'Output directory',\n default: './generated/semilayer',\n },\n },\n async run({ args }) {\n try {\n const { config, configPath } = await loadConfig()\n info(`Config: ${dim(configPath)}`)\n\n const { generate } = await import('@semilayer/codegen')\n const result = await generate({ config, outDir: args.out, write: true })\n\n success(\n `Generated ${result.files.length} files for ${result.lenses.length} lenses ` +\n `(${result.lenses.join(', ')}) in ${result.durationMs}ms`,\n )\n } catch (err) {\n error((err as Error).message)\n process.exitCode = 1\n }\n },\n})\n"],"mappings":";;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAI9B,IAAO,mBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,YAAY,aAAa,iCAAiC;AAAA,EACxE,MAAM;AAAA,IACJ,KAAK;AAAA,MACH,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,QAAI;AACF,YAAM,EAAE,QAAQ,WAAW,IAAI,MAAM,WAAW;AAChD,WAAK,WAAW,IAAI,UAAU,CAAC,EAAE;AAEjC,YAAM,EAAE,SAAS,IAAI,MAAM,OAAO,oBAAoB;AACtD,YAAM,SAAS,MAAM,SAAS,EAAE,QAAQ,QAAQ,KAAK,KAAK,OAAO,KAAK,CAAC;AAEvE;AAAA,QACE,aAAa,OAAO,MAAM,MAAM,cAAc,OAAO,OAAO,MAAM,YAC5D,OAAO,OAAO,KAAK,IAAI,CAAC,QAAQ,OAAO,UAAU;AAAA,MACzD;AAAA,IACF,SAAS,KAAK;AACZ,YAAO,IAAc,OAAO;AAC5B,cAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AACF,CAAC;","names":[]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { SemiLayerConfig } from '@semilayer/core';
|
|
2
|
+
|
|
3
|
+
interface Credentials {
|
|
4
|
+
accessToken: string;
|
|
5
|
+
refreshToken: string;
|
|
6
|
+
expiresAt: string;
|
|
7
|
+
email: string;
|
|
8
|
+
serviceUrl: string;
|
|
9
|
+
}
|
|
10
|
+
declare function credentialsPath(): string;
|
|
11
|
+
declare function loadCredentials(): Promise<Credentials | null>;
|
|
12
|
+
declare function saveCredentials(creds: Credentials): Promise<void>;
|
|
13
|
+
declare function clearCredentials(): Promise<void>;
|
|
14
|
+
|
|
15
|
+
interface ProjectContext {
|
|
16
|
+
orgSlug: string;
|
|
17
|
+
projectSlug: string;
|
|
18
|
+
envSlug: string;
|
|
19
|
+
serviceUrl: string;
|
|
20
|
+
}
|
|
21
|
+
declare function findContextFile(cwd?: string): string | null;
|
|
22
|
+
declare function loadContext(cwd?: string): Promise<ProjectContext | null>;
|
|
23
|
+
declare function saveContext(ctx: ProjectContext, cwd?: string): Promise<void>;
|
|
24
|
+
|
|
25
|
+
interface ApiClient {
|
|
26
|
+
get<T>(path: string): Promise<T>;
|
|
27
|
+
post<T>(path: string, body?: unknown): Promise<T>;
|
|
28
|
+
patch<T>(path: string, body?: unknown): Promise<T>;
|
|
29
|
+
put<T>(path: string, body?: unknown): Promise<T>;
|
|
30
|
+
del<T>(path: string): Promise<T>;
|
|
31
|
+
serviceUrl: string;
|
|
32
|
+
}
|
|
33
|
+
declare function createApiClient(): Promise<ApiClient>;
|
|
34
|
+
|
|
35
|
+
interface LoadedConfig {
|
|
36
|
+
config: SemiLayerConfig;
|
|
37
|
+
configPath: string;
|
|
38
|
+
}
|
|
39
|
+
declare function loadConfig(cwd?: string): Promise<LoadedConfig>;
|
|
40
|
+
|
|
41
|
+
declare const VERSION = "0.0.0";
|
|
42
|
+
|
|
43
|
+
export { type ApiClient, type Credentials, type LoadedConfig, type ProjectContext, VERSION, clearCredentials, createApiClient, credentialsPath, findContextFile, loadConfig, loadContext, loadCredentials, saveContext, saveCredentials };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
findContextFile,
|
|
4
|
+
loadContext,
|
|
5
|
+
saveContext
|
|
6
|
+
} from "./chunk-QMF7LD67.js";
|
|
7
|
+
import {
|
|
8
|
+
createApiClient
|
|
9
|
+
} from "./chunk-T3UROBMA.js";
|
|
10
|
+
import {
|
|
11
|
+
clearCredentials,
|
|
12
|
+
credentialsPath,
|
|
13
|
+
loadCredentials,
|
|
14
|
+
saveCredentials
|
|
15
|
+
} from "./chunk-7TA63VHV.js";
|
|
16
|
+
import {
|
|
17
|
+
loadConfig
|
|
18
|
+
} from "./chunk-NIDLPHWY.js";
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var VERSION = "0.0.0";
|
|
22
|
+
export {
|
|
23
|
+
VERSION,
|
|
24
|
+
clearCredentials,
|
|
25
|
+
createApiClient,
|
|
26
|
+
credentialsPath,
|
|
27
|
+
findContextFile,
|
|
28
|
+
loadConfig,
|
|
29
|
+
loadContext,
|
|
30
|
+
loadCredentials,
|
|
31
|
+
saveContext,
|
|
32
|
+
saveCredentials
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export const VERSION = '0.0.0'\n\n// Programmatic exports for consumers who want to use CLI lib modules directly\nexport { loadCredentials, saveCredentials, clearCredentials, credentialsPath } from './lib/credentials.js'\nexport type { Credentials } from './lib/credentials.js'\nexport { loadContext, saveContext, findContextFile } from './lib/context.js'\nexport type { ProjectContext } from './lib/context.js'\nexport { createApiClient } from './lib/api.js'\nexport type { ApiClient } from './lib/api.js'\nexport { loadConfig } from './lib/config-loader.js'\nexport type { LoadedConfig } from './lib/config-loader.js'\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAO,IAAM,UAAU;","names":[]}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
saveContext
|
|
4
|
+
} from "./chunk-QMF7LD67.js";
|
|
5
|
+
import {
|
|
6
|
+
confirm,
|
|
7
|
+
input,
|
|
8
|
+
select
|
|
9
|
+
} from "./chunk-QXIVJY7K.js";
|
|
10
|
+
import {
|
|
11
|
+
createApiClient
|
|
12
|
+
} from "./chunk-T3UROBMA.js";
|
|
13
|
+
import "./chunk-7TA63VHV.js";
|
|
14
|
+
import {
|
|
15
|
+
bold,
|
|
16
|
+
dim,
|
|
17
|
+
error,
|
|
18
|
+
info,
|
|
19
|
+
label,
|
|
20
|
+
newline,
|
|
21
|
+
success
|
|
22
|
+
} from "./chunk-WZYOSGN3.js";
|
|
23
|
+
|
|
24
|
+
// src/commands/init.ts
|
|
25
|
+
import { defineCommand } from "citty";
|
|
26
|
+
import { existsSync } from "fs";
|
|
27
|
+
import { writeFile } from "fs/promises";
|
|
28
|
+
import { join } from "path";
|
|
29
|
+
var CONFIG_NAMES = ["sl.config.ts", "sl.config.js", "semilayer.config.ts", "semilayer.config.js"];
|
|
30
|
+
var STARTER_CONFIG = `import { defineConfig } from '@semilayer/core'
|
|
31
|
+
|
|
32
|
+
export default defineConfig({
|
|
33
|
+
stack: '{{STACK}}',
|
|
34
|
+
sources: {
|
|
35
|
+
main: {
|
|
36
|
+
bridge: '@semilayer/bridge-postgres',
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
lenses: {
|
|
40
|
+
// Define your lenses here. Example:
|
|
41
|
+
//
|
|
42
|
+
// articles: {
|
|
43
|
+
// source: 'main',
|
|
44
|
+
// table: 'articles',
|
|
45
|
+
// fields: {
|
|
46
|
+
// id: { type: 'number', primaryKey: true },
|
|
47
|
+
// title: { type: 'text' },
|
|
48
|
+
// body: { type: 'text' },
|
|
49
|
+
// },
|
|
50
|
+
// facets: {
|
|
51
|
+
// search: { fields: ['title', 'body'] },
|
|
52
|
+
// },
|
|
53
|
+
// },
|
|
54
|
+
},
|
|
55
|
+
})
|
|
56
|
+
`;
|
|
57
|
+
var init_default = defineCommand({
|
|
58
|
+
meta: {
|
|
59
|
+
name: "init",
|
|
60
|
+
description: "Initialize project context, config, and API keys"
|
|
61
|
+
},
|
|
62
|
+
args: {
|
|
63
|
+
"service-url": {
|
|
64
|
+
type: "string",
|
|
65
|
+
description: "Service API URL"
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
async run({ args }) {
|
|
69
|
+
try {
|
|
70
|
+
const api = await createApiClient();
|
|
71
|
+
const serviceUrl = args["service-url"] || api.serviceUrl;
|
|
72
|
+
const me = await api.get("/auth/me");
|
|
73
|
+
if (me.orgs.length === 0) {
|
|
74
|
+
error("No organizations found. Run `semilayer orgs create` first.");
|
|
75
|
+
process.exitCode = 1;
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
newline();
|
|
79
|
+
let orgSlug;
|
|
80
|
+
if (me.orgs.length === 1) {
|
|
81
|
+
orgSlug = me.orgs[0].slug;
|
|
82
|
+
info(`Org: ${bold(orgSlug)}`);
|
|
83
|
+
} else {
|
|
84
|
+
console.log(` ${bold("Select an organization:")}`);
|
|
85
|
+
orgSlug = await select("Choice:", me.orgs.map((o) => o.slug));
|
|
86
|
+
}
|
|
87
|
+
newline();
|
|
88
|
+
const { projects } = await api.get(`/v1/orgs/${orgSlug}/projects`);
|
|
89
|
+
let projectSlug;
|
|
90
|
+
let createdKeys = [];
|
|
91
|
+
if (projects.length === 0) {
|
|
92
|
+
info("No projects yet. Let's create one.");
|
|
93
|
+
const name = await input("Project name", "My Project");
|
|
94
|
+
const slug = await input("Project slug", name.toLowerCase().replace(/[^a-z0-9]+/g, "-"));
|
|
95
|
+
const result = await api.post(`/v1/orgs/${orgSlug}/projects`, {
|
|
96
|
+
name,
|
|
97
|
+
slug
|
|
98
|
+
});
|
|
99
|
+
projectSlug = result.project.slug;
|
|
100
|
+
createdKeys = result.keys ?? [];
|
|
101
|
+
success(`Created project ${bold(projectSlug)} with default environment`);
|
|
102
|
+
} else if (projects.length === 1) {
|
|
103
|
+
projectSlug = projects[0].slug;
|
|
104
|
+
info(`Project: ${bold(projectSlug)}`);
|
|
105
|
+
} else {
|
|
106
|
+
console.log(` ${bold("Select a project:")}`);
|
|
107
|
+
projectSlug = await select("Choice:", projects.map((p) => p.slug));
|
|
108
|
+
}
|
|
109
|
+
newline();
|
|
110
|
+
const { environments } = await api.get(
|
|
111
|
+
`/v1/orgs/${orgSlug}/projects/${projectSlug}/envs`
|
|
112
|
+
);
|
|
113
|
+
let envSlug;
|
|
114
|
+
if (environments.length === 0) {
|
|
115
|
+
info("No environments yet. Creating default...");
|
|
116
|
+
const result = await api.post(
|
|
117
|
+
`/v1/orgs/${orgSlug}/projects/${projectSlug}/envs`,
|
|
118
|
+
{ name: "Development", slug: "development" }
|
|
119
|
+
);
|
|
120
|
+
envSlug = result.environment.slug;
|
|
121
|
+
createdKeys = [...createdKeys, ...result.keys ?? []];
|
|
122
|
+
success(`Created environment ${bold(envSlug)}`);
|
|
123
|
+
} else if (environments.length === 1) {
|
|
124
|
+
envSlug = environments[0].slug;
|
|
125
|
+
info(`Environment: ${bold(envSlug)}`);
|
|
126
|
+
} else {
|
|
127
|
+
console.log(` ${bold("Select an environment:")}`);
|
|
128
|
+
envSlug = await select("Choice:", environments.map((e) => e.slug));
|
|
129
|
+
}
|
|
130
|
+
newline();
|
|
131
|
+
if (createdKeys.length > 0) {
|
|
132
|
+
info("API keys were created with your new project/environment:");
|
|
133
|
+
for (const k of createdKeys) {
|
|
134
|
+
label(k.type === "service" ? "Service key" : "Publishable key", k.key);
|
|
135
|
+
}
|
|
136
|
+
newline();
|
|
137
|
+
console.log(` ${dim("Save these keys \u2014 they won't be shown again.")}`);
|
|
138
|
+
} else {
|
|
139
|
+
const wantKey = await confirm("Generate a new API key?");
|
|
140
|
+
if (wantKey) {
|
|
141
|
+
const envBase = `/v1/orgs/${orgSlug}/projects/${projectSlug}/envs/${envSlug}`;
|
|
142
|
+
const sk = await api.post(`${envBase}/keys`, {
|
|
143
|
+
type: "service",
|
|
144
|
+
label: "CLI-generated"
|
|
145
|
+
});
|
|
146
|
+
newline();
|
|
147
|
+
label("Service key", sk.key);
|
|
148
|
+
console.log(` ${dim("Save this key \u2014 it won't be shown again.")}`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
newline();
|
|
152
|
+
await saveContext({ orgSlug, projectSlug, envSlug, serviceUrl });
|
|
153
|
+
success("Context saved to .semilayerrc");
|
|
154
|
+
const cwd = process.cwd();
|
|
155
|
+
const hasConfig = CONFIG_NAMES.some((name) => existsSync(join(cwd, name)));
|
|
156
|
+
if (!hasConfig) {
|
|
157
|
+
newline();
|
|
158
|
+
const wantConfig = await confirm("No config file found. Create sl.config.ts?", true);
|
|
159
|
+
if (wantConfig) {
|
|
160
|
+
const stack = projectSlug;
|
|
161
|
+
const content = STARTER_CONFIG.replace("{{STACK}}", stack);
|
|
162
|
+
await writeFile(join(cwd, "sl.config.ts"), content, "utf-8");
|
|
163
|
+
success("Created sl.config.ts");
|
|
164
|
+
info("Edit it to define your lenses, then run `semilayer push`");
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
newline();
|
|
168
|
+
info(`${bold("Next steps:")}`);
|
|
169
|
+
if (!hasConfig) {
|
|
170
|
+
info(` 1. Edit sl.config.ts to define your lenses`);
|
|
171
|
+
info(` 2. Run ${bold("semilayer sources connect")} to connect your database`);
|
|
172
|
+
info(` 3. Run ${bold("semilayer push --resume-ingest")} to push and start indexing`);
|
|
173
|
+
info(` 4. Run ${bold("semilayer generate")} to create your typed client`);
|
|
174
|
+
} else {
|
|
175
|
+
info(` 1. Run ${bold("semilayer sources connect")} to connect your database`);
|
|
176
|
+
info(` 2. Run ${bold("semilayer push --resume-ingest")} to push and start indexing`);
|
|
177
|
+
}
|
|
178
|
+
} catch (err) {
|
|
179
|
+
error(err.message);
|
|
180
|
+
process.exitCode = 1;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
export {
|
|
185
|
+
init_default as default
|
|
186
|
+
};
|
|
187
|
+
//# sourceMappingURL=init-TWJAGUN3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/init.ts"],"sourcesContent":["import { defineCommand } from 'citty'\nimport type {\n MeResponse,\n Project,\n Environment,\n CreateProjectResponse,\n CreateEnvResponse,\n ApiKeyInfo,\n} from '@semilayer/core'\nimport { createApiClient } from '../lib/api.js'\nimport { saveContext } from '../lib/context.js'\nimport { success, error, info, bold, dim, newline, label } from '../lib/output.js'\nimport { select, input, confirm } from '../lib/prompt.js'\nimport { existsSync } from 'node:fs'\nimport { writeFile } from 'node:fs/promises'\nimport { join } from 'node:path'\n\nconst CONFIG_NAMES = ['sl.config.ts', 'sl.config.js', 'semilayer.config.ts', 'semilayer.config.js']\n\nconst STARTER_CONFIG = `import { defineConfig } from '@semilayer/core'\n\nexport default defineConfig({\n stack: '{{STACK}}',\n sources: {\n main: {\n bridge: '@semilayer/bridge-postgres',\n },\n },\n lenses: {\n // Define your lenses here. Example:\n //\n // articles: {\n // source: 'main',\n // table: 'articles',\n // fields: {\n // id: { type: 'number', primaryKey: true },\n // title: { type: 'text' },\n // body: { type: 'text' },\n // },\n // facets: {\n // search: { fields: ['title', 'body'] },\n // },\n // },\n },\n})\n`\n\nexport default defineCommand({\n meta: {\n name: 'init',\n description: 'Initialize project context, config, and API keys',\n },\n args: {\n 'service-url': {\n type: 'string',\n description: 'Service API URL',\n },\n },\n async run({ args }) {\n try {\n const api = await createApiClient()\n const serviceUrl = args['service-url'] || api.serviceUrl\n\n const me = await api.get<MeResponse>('/auth/me')\n\n if (me.orgs.length === 0) {\n error('No organizations found. Run `semilayer orgs create` first.')\n process.exitCode = 1\n return\n }\n\n // ── Step 1: Select org ──────────────────────────────────────\n newline()\n let orgSlug: string\n if (me.orgs.length === 1) {\n orgSlug = me.orgs[0]!.slug\n info(`Org: ${bold(orgSlug)}`)\n } else {\n console.log(` ${bold('Select an organization:')}`)\n orgSlug = await select('Choice:', me.orgs.map((o) => o.slug))\n }\n\n // ── Step 2: Select or create project ────────────────────────\n newline()\n const { projects } = await api.get<{ projects: Project[] }>(`/v1/orgs/${orgSlug}/projects`)\n\n let projectSlug: string\n let createdKeys: Array<{ key: string; type: string }> = []\n\n if (projects.length === 0) {\n info('No projects yet. Let\\'s create one.')\n const name = await input('Project name', 'My Project')\n const slug = await input('Project slug', name.toLowerCase().replace(/[^a-z0-9]+/g, '-'))\n\n const result = await api.post<CreateProjectResponse>(`/v1/orgs/${orgSlug}/projects`, {\n name,\n slug,\n })\n projectSlug = result.project.slug\n createdKeys = result.keys ?? []\n success(`Created project ${bold(projectSlug)} with default environment`)\n } else if (projects.length === 1) {\n projectSlug = projects[0]!.slug\n info(`Project: ${bold(projectSlug)}`)\n } else {\n console.log(` ${bold('Select a project:')}`)\n projectSlug = await select('Choice:', projects.map((p) => p.slug))\n }\n\n // ── Step 3: Select or create environment ────────────────────\n newline()\n const { environments } = await api.get<{ environments: Environment[] }>(\n `/v1/orgs/${orgSlug}/projects/${projectSlug}/envs`,\n )\n\n let envSlug: string\n\n if (environments.length === 0) {\n info('No environments yet. Creating default...')\n const result = await api.post<CreateEnvResponse>(\n `/v1/orgs/${orgSlug}/projects/${projectSlug}/envs`,\n { name: 'Development', slug: 'development' },\n )\n envSlug = result.environment.slug\n createdKeys = [...createdKeys, ...(result.keys ?? [])]\n success(`Created environment ${bold(envSlug)}`)\n } else if (environments.length === 1) {\n envSlug = environments[0]!.slug\n info(`Environment: ${bold(envSlug)}`)\n } else {\n console.log(` ${bold('Select an environment:')}`)\n envSlug = await select('Choice:', environments.map((e) => e.slug))\n }\n\n // ── Step 4: Optionally generate API key ─────────────────────\n newline()\n if (createdKeys.length > 0) {\n info('API keys were created with your new project/environment:')\n for (const k of createdKeys) {\n label(k.type === 'service' ? 'Service key' : 'Publishable key', k.key)\n }\n newline()\n console.log(` ${dim('Save these keys — they won\\'t be shown again.')}`)\n } else {\n const wantKey = await confirm('Generate a new API key?')\n if (wantKey) {\n const envBase = `/v1/orgs/${orgSlug}/projects/${projectSlug}/envs/${envSlug}`\n const sk = await api.post<ApiKeyInfo>(`${envBase}/keys`, {\n type: 'service',\n label: 'CLI-generated',\n })\n newline()\n label('Service key', sk.key)\n console.log(` ${dim('Save this key — it won\\'t be shown again.')}`)\n }\n }\n\n // ── Step 5: Save .semilayerrc ───────────────────────────────\n newline()\n await saveContext({ orgSlug, projectSlug, envSlug, serviceUrl })\n success('Context saved to .semilayerrc')\n\n // ── Step 6: Scaffold sl.config.ts if missing ────────────────\n const cwd = process.cwd()\n const hasConfig = CONFIG_NAMES.some((name) => existsSync(join(cwd, name)))\n\n if (!hasConfig) {\n newline()\n const wantConfig = await confirm('No config file found. Create sl.config.ts?', true)\n if (wantConfig) {\n const stack = projectSlug\n const content = STARTER_CONFIG.replace('{{STACK}}', stack)\n await writeFile(join(cwd, 'sl.config.ts'), content, 'utf-8')\n success('Created sl.config.ts')\n info('Edit it to define your lenses, then run `semilayer push`')\n }\n }\n\n // ── Summary ─────────────────────────────────────────────────\n newline()\n info(`${bold('Next steps:')}`)\n if (!hasConfig) {\n info(` 1. Edit sl.config.ts to define your lenses`)\n info(` 2. Run ${bold('semilayer sources connect')} to connect your database`)\n info(` 3. Run ${bold('semilayer push --resume-ingest')} to push and start indexing`)\n info(` 4. Run ${bold('semilayer generate')} to create your typed client`)\n } else {\n info(` 1. Run ${bold('semilayer sources connect')} to connect your database`)\n info(` 2. Run ${bold('semilayer push --resume-ingest')} to push and start indexing`)\n }\n } catch (err) {\n error((err as Error).message)\n process.exitCode = 1\n }\n },\n})\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
envPath
|
|
4
|
+
} from "./chunk-ALA4X7UU.js";
|
|
5
|
+
import {
|
|
6
|
+
loadContext
|
|
7
|
+
} from "./chunk-QMF7LD67.js";
|
|
8
|
+
import {
|
|
9
|
+
confirm
|
|
10
|
+
} from "./chunk-QXIVJY7K.js";
|
|
11
|
+
import {
|
|
12
|
+
createApiClient
|
|
13
|
+
} from "./chunk-T3UROBMA.js";
|
|
14
|
+
import "./chunk-7TA63VHV.js";
|
|
15
|
+
import {
|
|
16
|
+
bold,
|
|
17
|
+
error,
|
|
18
|
+
info,
|
|
19
|
+
newline,
|
|
20
|
+
success,
|
|
21
|
+
table
|
|
22
|
+
} from "./chunk-WZYOSGN3.js";
|
|
23
|
+
|
|
24
|
+
// src/commands/keys.ts
|
|
25
|
+
import { defineCommand } from "citty";
|
|
26
|
+
var keys_default = defineCommand({
|
|
27
|
+
meta: { name: "keys", description: "Manage API keys" },
|
|
28
|
+
subCommands: {
|
|
29
|
+
list: defineCommand({
|
|
30
|
+
meta: { name: "list", description: "List API keys for the current environment" },
|
|
31
|
+
async run() {
|
|
32
|
+
const ctx = await loadContext();
|
|
33
|
+
if (!ctx) {
|
|
34
|
+
error("No .semilayerrc found. Run `semilayer init` first.");
|
|
35
|
+
process.exitCode = 1;
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const api = await createApiClient();
|
|
39
|
+
const { keys } = await api.get(`${envPath(ctx)}/keys`);
|
|
40
|
+
if (keys.length === 0) {
|
|
41
|
+
newline();
|
|
42
|
+
bold("No API keys found.");
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
table(
|
|
46
|
+
["Key", "Type", "Label"],
|
|
47
|
+
keys.map((k) => [k.key, k.type, k.label ?? ""])
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
}),
|
|
51
|
+
create: defineCommand({
|
|
52
|
+
meta: { name: "create", description: "Create a new API key" },
|
|
53
|
+
args: {
|
|
54
|
+
type: {
|
|
55
|
+
type: "string",
|
|
56
|
+
description: 'Key type: "service" or "publishable"',
|
|
57
|
+
required: true
|
|
58
|
+
},
|
|
59
|
+
label: { type: "string", description: "Optional label for the key" }
|
|
60
|
+
},
|
|
61
|
+
async run({ args }) {
|
|
62
|
+
const ctx = await loadContext();
|
|
63
|
+
if (!ctx) {
|
|
64
|
+
error("No .semilayerrc found. Run `semilayer init` first.");
|
|
65
|
+
process.exitCode = 1;
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (args.type !== "service" && args.type !== "publishable") {
|
|
69
|
+
error('Key type must be "service" or "publishable".');
|
|
70
|
+
process.exitCode = 1;
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const api = await createApiClient();
|
|
74
|
+
const result = await api.post(`${envPath(ctx)}/keys`, {
|
|
75
|
+
type: args.type,
|
|
76
|
+
...args.label ? { label: args.label } : {}
|
|
77
|
+
});
|
|
78
|
+
newline();
|
|
79
|
+
bold("Your new API key:");
|
|
80
|
+
newline();
|
|
81
|
+
info(` ${result.key}`);
|
|
82
|
+
newline();
|
|
83
|
+
bold("Save this key now \u2014 it will not be shown again.");
|
|
84
|
+
newline();
|
|
85
|
+
}
|
|
86
|
+
}),
|
|
87
|
+
revoke: defineCommand({
|
|
88
|
+
meta: { name: "revoke", description: "Revoke an API key" },
|
|
89
|
+
args: {
|
|
90
|
+
"key-id": { type: "string", description: "Key ID to revoke", required: true }
|
|
91
|
+
},
|
|
92
|
+
async run({ args }) {
|
|
93
|
+
const ctx = await loadContext();
|
|
94
|
+
if (!ctx) {
|
|
95
|
+
error("No .semilayerrc found. Run `semilayer init` first.");
|
|
96
|
+
process.exitCode = 1;
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const ok = await confirm("Revoke this API key? Any services using it will lose access.");
|
|
100
|
+
if (!ok) return;
|
|
101
|
+
const api = await createApiClient();
|
|
102
|
+
await api.del(`${envPath(ctx)}/keys/${args["key-id"]}`);
|
|
103
|
+
success("API key revoked.");
|
|
104
|
+
}
|
|
105
|
+
})
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
export {
|
|
109
|
+
keys_default as default
|
|
110
|
+
};
|
|
111
|
+
//# sourceMappingURL=keys-JBKCYKJU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/keys.ts"],"sourcesContent":["import { defineCommand } from 'citty'\nimport type { ApiKeyInfo } from '@semilayer/core'\nimport { createApiClient } from '../lib/api.js'\nimport { loadContext } from '../lib/context.js'\nimport { envPath } from '../lib/env-path.js'\nimport { success, error, info, bold, table, newline } from '../lib/output.js'\nimport { confirm } from '../lib/prompt.js'\n\nexport default defineCommand({\n meta: { name: 'keys', description: 'Manage API keys' },\n subCommands: {\n list: defineCommand({\n meta: { name: 'list', description: 'List API keys for the current environment' },\n async run() {\n const ctx = await loadContext()\n if (!ctx) {\n error('No .semilayerrc found. Run `semilayer init` first.')\n process.exitCode = 1\n return\n }\n const api = await createApiClient()\n const { keys } = await api.get<{ keys: ApiKeyInfo[] }>(`${envPath(ctx)}/keys`)\n if (keys.length === 0) {\n newline()\n bold('No API keys found.')\n return\n }\n table(\n ['Key', 'Type', 'Label'],\n keys.map((k) => [k.key, k.type, k.label ?? '']),\n )\n },\n }),\n\n create: defineCommand({\n meta: { name: 'create', description: 'Create a new API key' },\n args: {\n type: {\n type: 'string',\n description: 'Key type: \"service\" or \"publishable\"',\n required: true,\n },\n label: { type: 'string', description: 'Optional label for the key' },\n },\n async run({ args }) {\n const ctx = await loadContext()\n if (!ctx) {\n error('No .semilayerrc found. Run `semilayer init` first.')\n process.exitCode = 1\n return\n }\n if (args.type !== 'service' && args.type !== 'publishable') {\n error('Key type must be \"service\" or \"publishable\".')\n process.exitCode = 1\n return\n }\n const api = await createApiClient()\n const result = await api.post<{ key: string; type: string }>(`${envPath(ctx)}/keys`, {\n type: args.type,\n ...(args.label ? { label: args.label } : {}),\n })\n newline()\n bold('Your new API key:')\n newline()\n info(` ${result.key}`)\n newline()\n bold('Save this key now — it will not be shown again.')\n newline()\n },\n }),\n\n revoke: defineCommand({\n meta: { name: 'revoke', description: 'Revoke an API key' },\n args: {\n 'key-id': { type: 'string', description: 'Key ID to revoke', required: true },\n },\n async run({ args }) {\n const ctx = await loadContext()\n if (!ctx) {\n error('No .semilayerrc found. Run `semilayer init` first.')\n process.exitCode = 1\n return\n }\n const ok = await confirm('Revoke this API key? Any services using it will lose access.')\n if (!ok) return\n const api = await createApiClient()\n await api.del(`${envPath(ctx)}/keys/${args['key-id']}`)\n success('API key revoked.')\n },\n }),\n },\n})\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAQ9B,IAAO,eAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,QAAQ,aAAa,kBAAkB;AAAA,EACrD,aAAa;AAAA,IACX,MAAM,cAAc;AAAA,MAClB,MAAM,EAAE,MAAM,QAAQ,aAAa,4CAA4C;AAAA,MAC/E,MAAM,MAAM;AACV,cAAM,MAAM,MAAM,YAAY;AAC9B,YAAI,CAAC,KAAK;AACR,gBAAM,oDAAoD;AAC1D,kBAAQ,WAAW;AACnB;AAAA,QACF;AACA,cAAM,MAAM,MAAM,gBAAgB;AAClC,cAAM,EAAE,KAAK,IAAI,MAAM,IAAI,IAA4B,GAAG,QAAQ,GAAG,CAAC,OAAO;AAC7E,YAAI,KAAK,WAAW,GAAG;AACrB,kBAAQ;AACR,eAAK,oBAAoB;AACzB;AAAA,QACF;AACA;AAAA,UACE,CAAC,OAAO,QAAQ,OAAO;AAAA,UACvB,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAAA,QAChD;AAAA,MACF;AAAA,IACF,CAAC;AAAA,IAED,QAAQ,cAAc;AAAA,MACpB,MAAM,EAAE,MAAM,UAAU,aAAa,uBAAuB;AAAA,MAC5D,MAAM;AAAA,QACJ,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,aAAa;AAAA,UACb,UAAU;AAAA,QACZ;AAAA,QACA,OAAO,EAAE,MAAM,UAAU,aAAa,6BAA6B;AAAA,MACrE;AAAA,MACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,cAAM,MAAM,MAAM,YAAY;AAC9B,YAAI,CAAC,KAAK;AACR,gBAAM,oDAAoD;AAC1D,kBAAQ,WAAW;AACnB;AAAA,QACF;AACA,YAAI,KAAK,SAAS,aAAa,KAAK,SAAS,eAAe;AAC1D,gBAAM,8CAA8C;AACpD,kBAAQ,WAAW;AACnB;AAAA,QACF;AACA,cAAM,MAAM,MAAM,gBAAgB;AAClC,cAAM,SAAS,MAAM,IAAI,KAAoC,GAAG,QAAQ,GAAG,CAAC,SAAS;AAAA,UACnF,MAAM,KAAK;AAAA,UACX,GAAI,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,QAC5C,CAAC;AACD,gBAAQ;AACR,aAAK,mBAAmB;AACxB,gBAAQ;AACR,aAAK,KAAK,OAAO,GAAG,EAAE;AACtB,gBAAQ;AACR,aAAK,sDAAiD;AACtD,gBAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,IAED,QAAQ,cAAc;AAAA,MACpB,MAAM,EAAE,MAAM,UAAU,aAAa,oBAAoB;AAAA,MACzD,MAAM;AAAA,QACJ,UAAU,EAAE,MAAM,UAAU,aAAa,oBAAoB,UAAU,KAAK;AAAA,MAC9E;AAAA,MACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,cAAM,MAAM,MAAM,YAAY;AAC9B,YAAI,CAAC,KAAK;AACR,gBAAM,oDAAoD;AAC1D,kBAAQ,WAAW;AACnB;AAAA,QACF;AACA,cAAM,KAAK,MAAM,QAAQ,8DAA8D;AACvF,YAAI,CAAC,GAAI;AACT,cAAM,MAAM,MAAM,gBAAgB;AAClC,cAAM,IAAI,IAAI,GAAG,QAAQ,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,EAAE;AACtD,gBAAQ,kBAAkB;AAAA,MAC5B;AAAA,IACF,CAAC;AAAA,EACH;AACF,CAAC;","names":[]}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
envPath
|
|
4
|
+
} from "./chunk-ALA4X7UU.js";
|
|
5
|
+
import {
|
|
6
|
+
loadContext
|
|
7
|
+
} from "./chunk-QMF7LD67.js";
|
|
8
|
+
import {
|
|
9
|
+
createApiClient
|
|
10
|
+
} from "./chunk-T3UROBMA.js";
|
|
11
|
+
import "./chunk-7TA63VHV.js";
|
|
12
|
+
import {
|
|
13
|
+
bold,
|
|
14
|
+
error,
|
|
15
|
+
newline,
|
|
16
|
+
table
|
|
17
|
+
} from "./chunk-WZYOSGN3.js";
|
|
18
|
+
|
|
19
|
+
// src/commands/lenses.ts
|
|
20
|
+
import { defineCommand } from "citty";
|
|
21
|
+
var lenses_default = defineCommand({
|
|
22
|
+
meta: { name: "lenses", description: "Manage lenses" },
|
|
23
|
+
subCommands: {
|
|
24
|
+
list: defineCommand({
|
|
25
|
+
meta: { name: "list", description: "List lenses in the current environment" },
|
|
26
|
+
async run() {
|
|
27
|
+
const ctx = await loadContext();
|
|
28
|
+
if (!ctx) {
|
|
29
|
+
error("No .semilayerrc found. Run `semilayer init` first.");
|
|
30
|
+
process.exitCode = 1;
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const api = await createApiClient();
|
|
34
|
+
const { lenses } = await api.get(`${envPath(ctx)}/lenses`);
|
|
35
|
+
if (lenses.length === 0) {
|
|
36
|
+
newline();
|
|
37
|
+
bold("No lenses found.");
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
table(
|
|
41
|
+
["Name", "Status", "Created"],
|
|
42
|
+
lenses.map((l) => [l.name, l.status, l.createdAt])
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
})
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
export {
|
|
49
|
+
lenses_default as default
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=lenses-VZSDFH3D.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/lenses.ts"],"sourcesContent":["import { defineCommand } from 'citty'\nimport type { Lens } from '@semilayer/core'\nimport { createApiClient } from '../lib/api.js'\nimport { loadContext } from '../lib/context.js'\nimport { envPath } from '../lib/env-path.js'\nimport { error, bold, table, newline } from '../lib/output.js'\n\nexport default defineCommand({\n meta: { name: 'lenses', description: 'Manage lenses' },\n subCommands: {\n list: defineCommand({\n meta: { name: 'list', description: 'List lenses in the current environment' },\n async run() {\n const ctx = await loadContext()\n if (!ctx) {\n error('No .semilayerrc found. Run `semilayer init` first.')\n process.exitCode = 1\n return\n }\n const api = await createApiClient()\n const { lenses } = await api.get<{ lenses: Lens[] }>(`${envPath(ctx)}/lenses`)\n if (lenses.length === 0) {\n newline()\n bold('No lenses found.')\n return\n }\n table(\n ['Name', 'Status', 'Created'],\n lenses.map((l) => [l.name, l.status, l.createdAt]),\n )\n },\n }),\n },\n})\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAO9B,IAAO,iBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,UAAU,aAAa,gBAAgB;AAAA,EACrD,aAAa;AAAA,IACX,MAAM,cAAc;AAAA,MAClB,MAAM,EAAE,MAAM,QAAQ,aAAa,yCAAyC;AAAA,MAC5E,MAAM,MAAM;AACV,cAAM,MAAM,MAAM,YAAY;AAC9B,YAAI,CAAC,KAAK;AACR,gBAAM,oDAAoD;AAC1D,kBAAQ,WAAW;AACnB;AAAA,QACF;AACA,cAAM,MAAM,MAAM,gBAAgB;AAClC,cAAM,EAAE,OAAO,IAAI,MAAM,IAAI,IAAwB,GAAG,QAAQ,GAAG,CAAC,SAAS;AAC7E,YAAI,OAAO,WAAW,GAAG;AACvB,kBAAQ;AACR,eAAK,kBAAkB;AACvB;AAAA,QACF;AACA;AAAA,UACE,CAAC,QAAQ,UAAU,SAAS;AAAA,UAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC;AAAA,QACnD;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF,CAAC;","names":[]}
|