@undefineds.co/xpod 0.3.14 → 0.3.16
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/config/local.json +5 -5
- package/config/xpod.json +24 -10
- package/dist/cli/commands/auth.d.ts +1 -0
- package/dist/cli/commands/auth.js +117 -37
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/login.js +16 -23
- package/dist/cli/commands/login.js.map +1 -1
- package/dist/cli/commands/logs.d.ts +2 -0
- package/dist/cli/commands/logs.js +20 -5
- package/dist/cli/commands/logs.js.map +1 -1
- package/dist/cli/commands/obj.d.ts +44 -0
- package/dist/cli/commands/obj.js +1059 -0
- package/dist/cli/commands/obj.js.map +1 -0
- package/dist/cli/commands/rdf.d.ts +14 -0
- package/dist/cli/commands/rdf.js +235 -0
- package/dist/cli/commands/rdf.js.map +1 -0
- package/dist/cli/commands/resource.d.ts +31 -0
- package/dist/cli/commands/resource.js +191 -0
- package/dist/cli/commands/resource.js.map +1 -0
- package/dist/cli/commands/secret.d.ts +36 -0
- package/dist/cli/commands/secret.js +285 -0
- package/dist/cli/commands/secret.js.map +1 -0
- package/dist/cli/commands/server.d.ts +11 -0
- package/dist/cli/commands/server.js +168 -0
- package/dist/cli/commands/server.js.map +1 -0
- package/dist/cli/commands/start.d.ts +1 -0
- package/dist/cli/commands/start.js +5 -0
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/status.d.ts +1 -0
- package/dist/cli/commands/status.js +21 -6
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/stop.d.ts +3 -0
- package/dist/cli/commands/stop.js +40 -6
- package/dist/cli/commands/stop.js.map +1 -1
- package/dist/cli/index.js +23 -8
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/lib/auth-context.d.ts +24 -0
- package/dist/cli/lib/auth-context.js +70 -0
- package/dist/cli/lib/auth-context.js.map +1 -0
- package/dist/cli/lib/output.d.ts +23 -0
- package/dist/cli/lib/output.js +63 -0
- package/dist/cli/lib/output.js.map +1 -0
- package/dist/cli/lib/resource.d.ts +29 -0
- package/dist/cli/lib/resource.js +114 -0
- package/dist/cli/lib/resource.js.map +1 -0
- package/dist/components/context.jsonld +6 -0
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.d.ts +11 -10
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js +13 -24
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js.map +1 -1
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.jsonld +4 -4
- package/dist/identity/oidc/AutoDetectOidcHandler.d.ts +8 -4
- package/dist/identity/oidc/AutoDetectOidcHandler.js +10 -6
- package/dist/identity/oidc/AutoDetectOidcHandler.js.map +1 -1
- package/dist/identity/oidc/AutoDetectOidcHandler.jsonld +3 -3
- package/dist/storage/accessors/MixDataAccessor.js +3 -0
- package/dist/storage/accessors/MixDataAccessor.js.map +1 -1
- package/dist/storage/quint/SqliteQuintStore.d.ts +26 -1
- package/dist/storage/quint/SqliteQuintStore.js +551 -318
- package/dist/storage/quint/SqliteQuintStore.js.map +1 -1
- package/dist/storage/quint/SqliteQuintStore.jsonld +102 -2
- package/dist/storage/quint/schema.d.ts +76 -0
- package/dist/storage/quint/schema.js +13 -7
- package/dist/storage/quint/schema.js.map +1 -1
- package/dist/storage/rdf/RdfLocalQueryEngine.d.ts +4 -1
- package/dist/storage/rdf/RdfLocalQueryEngine.js +77 -8
- package/dist/storage/rdf/RdfLocalQueryEngine.js.map +1 -1
- package/dist/storage/rdf/SolidRdfEngine.d.ts +5 -0
- package/dist/storage/rdf/SolidRdfEngine.js +31 -3
- package/dist/storage/rdf/SolidRdfEngine.js.map +1 -1
- package/dist/storage/rdf/SolidRdfEngine.jsonld +34 -0
- package/dist/storage/sparql/ComunicaQuintEngine.js +16 -3
- package/dist/storage/sparql/ComunicaQuintEngine.js.map +1 -1
- package/package.json +1 -1
- package/dist/cli/commands/config.d.ts +0 -42
- package/dist/cli/commands/config.js +0 -289
- package/dist/cli/commands/config.js.map +0 -1
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.serverCommand = exports.serverConfigCommand = void 0;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const os_1 = require("os");
|
|
7
|
+
const start_1 = require("./start");
|
|
8
|
+
const stop_1 = require("./stop");
|
|
9
|
+
const status_1 = require("./status");
|
|
10
|
+
const logs_1 = require("./logs");
|
|
11
|
+
const output_1 = require("../lib/output");
|
|
12
|
+
function configPath() {
|
|
13
|
+
return (0, path_1.join)((0, os_1.homedir)(), '.xpod', 'server-config.json');
|
|
14
|
+
}
|
|
15
|
+
function readConfig() {
|
|
16
|
+
try {
|
|
17
|
+
const path = configPath();
|
|
18
|
+
if (!(0, fs_1.existsSync)(path))
|
|
19
|
+
return {};
|
|
20
|
+
const parsed = JSON.parse((0, fs_1.readFileSync)(path, 'utf-8'));
|
|
21
|
+
return parsed && typeof parsed === 'object' && !Array.isArray(parsed)
|
|
22
|
+
? Object.fromEntries(Object.entries(parsed).map(([key, value]) => [key, String(value)]))
|
|
23
|
+
: {};
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return {};
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function writeConfig(config) {
|
|
30
|
+
const path = configPath();
|
|
31
|
+
(0, fs_1.mkdirSync)((0, path_1.dirname)(path), { recursive: true });
|
|
32
|
+
(0, fs_1.writeFileSync)(path, `${JSON.stringify(config, null, 2)}\n`, 'utf-8');
|
|
33
|
+
}
|
|
34
|
+
const healthCommand = {
|
|
35
|
+
command: 'health',
|
|
36
|
+
describe: 'Show xpod server health checks',
|
|
37
|
+
builder: (yargs) => yargs
|
|
38
|
+
.option('port', { alias: 'p', type: 'number', default: 3000, description: 'Gateway port' })
|
|
39
|
+
.option('host', { type: 'string', default: 'localhost', description: 'Gateway host' })
|
|
40
|
+
.option('env', { alias: 'e', type: 'string', description: 'Env file path for runtime context' })
|
|
41
|
+
.option('json', { type: 'boolean', default: false, description: 'Output JSON envelope' }),
|
|
42
|
+
handler: async (argv) => {
|
|
43
|
+
const baseUrl = `http://${argv.host}:${argv.port}`;
|
|
44
|
+
try {
|
|
45
|
+
const checks = {
|
|
46
|
+
gateway: 'fail',
|
|
47
|
+
css: 'fail',
|
|
48
|
+
api: 'fail',
|
|
49
|
+
};
|
|
50
|
+
try {
|
|
51
|
+
const gateway = await fetch(`${baseUrl}/service/status`);
|
|
52
|
+
checks.gateway = gateway.ok ? 'pass' : 'fail';
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
checks.gateway = 'fail';
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
const css = await fetch(`${baseUrl}/`, { method: 'HEAD' });
|
|
59
|
+
checks.css = css.ok ? 'pass' : 'fail';
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
checks.css = 'fail';
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
const api = await fetch(`${baseUrl}/api/ready`);
|
|
66
|
+
checks.api = api.ok ? 'pass' : 'fail';
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
checks.api = 'fail';
|
|
70
|
+
}
|
|
71
|
+
const data = {
|
|
72
|
+
schemaVersion: '1.0',
|
|
73
|
+
healthy: Object.values(checks).every((status) => status === 'pass'),
|
|
74
|
+
checks,
|
|
75
|
+
timestamp: new Date().toISOString(),
|
|
76
|
+
};
|
|
77
|
+
if (argv.json) {
|
|
78
|
+
(0, output_1.writeJsonResult)(data);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
console.log(data.healthy ? 'Healthy' : 'Unhealthy');
|
|
82
|
+
for (const [name, status] of Object.entries(checks)) {
|
|
83
|
+
console.log(` ${name}: ${status}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
(0, output_1.handleCliError)(error, argv.json === true);
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
const configGetCommand = {
|
|
92
|
+
command: 'get <key>',
|
|
93
|
+
describe: 'Get xpod server config value',
|
|
94
|
+
builder: (yargs) => yargs
|
|
95
|
+
.positional('key', { type: 'string', demandOption: true, description: 'Config key' })
|
|
96
|
+
.option('json', { type: 'boolean', default: false, description: 'Output JSON envelope' }),
|
|
97
|
+
handler: (argv) => {
|
|
98
|
+
const config = readConfig();
|
|
99
|
+
const value = config[argv.key];
|
|
100
|
+
if (argv.json) {
|
|
101
|
+
(0, output_1.writeJsonResult)({ key: argv.key, value: value ?? null });
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (value === undefined) {
|
|
105
|
+
console.log('');
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
console.log(value);
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
const configSetCommand = {
|
|
112
|
+
command: 'set <key> <value>',
|
|
113
|
+
describe: 'Set xpod server config value',
|
|
114
|
+
builder: (yargs) => yargs
|
|
115
|
+
.positional('key', { type: 'string', demandOption: true, description: 'Config key' })
|
|
116
|
+
.positional('value', { type: 'string', demandOption: true, description: 'Config value' })
|
|
117
|
+
.option('json', { type: 'boolean', default: false, description: 'Output JSON envelope' }),
|
|
118
|
+
handler: (argv) => {
|
|
119
|
+
const config = readConfig();
|
|
120
|
+
config[argv.key] = argv.value;
|
|
121
|
+
writeConfig(config);
|
|
122
|
+
const data = { key: argv.key, value: argv.value, path: configPath() };
|
|
123
|
+
if (argv.json) {
|
|
124
|
+
(0, output_1.writeJsonResult)(data);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
console.log(`${argv.key}=${argv.value}`);
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
const configListCommand = {
|
|
131
|
+
command: 'list',
|
|
132
|
+
describe: 'List xpod server config values',
|
|
133
|
+
builder: (yargs) => yargs.option('json', { type: 'boolean', default: false, description: 'Output JSON envelope' }),
|
|
134
|
+
handler: (argv) => {
|
|
135
|
+
const config = readConfig();
|
|
136
|
+
if (argv.json) {
|
|
137
|
+
(0, output_1.writeJsonResult)({ config, path: configPath() });
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
for (const [key, value] of Object.entries(config)) {
|
|
141
|
+
console.log(`${key}=${value}`);
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
exports.serverConfigCommand = {
|
|
146
|
+
command: 'config',
|
|
147
|
+
describe: 'Manage xpod server config',
|
|
148
|
+
builder: (yargs) => yargs
|
|
149
|
+
.command(configGetCommand)
|
|
150
|
+
.command(configSetCommand)
|
|
151
|
+
.command(configListCommand)
|
|
152
|
+
.demandCommand(1, 'Please specify a server config subcommand'),
|
|
153
|
+
handler: () => { },
|
|
154
|
+
};
|
|
155
|
+
exports.serverCommand = {
|
|
156
|
+
command: 'server',
|
|
157
|
+
describe: 'Manage the xpod server runtime',
|
|
158
|
+
builder: (yargs) => yargs
|
|
159
|
+
.command(start_1.startCommand)
|
|
160
|
+
.command(stop_1.stopCommand)
|
|
161
|
+
.command(status_1.statusCommand)
|
|
162
|
+
.command(healthCommand)
|
|
163
|
+
.command(logs_1.logsCommand)
|
|
164
|
+
.command(exports.serverConfigCommand)
|
|
165
|
+
.demandCommand(1, 'Please specify a server subcommand'),
|
|
166
|
+
handler: () => { },
|
|
167
|
+
};
|
|
168
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/cli/commands/server.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CommandModule } from 'yargs';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';\nimport { dirname, join } from 'path';\nimport { homedir } from 'os';\nimport { startCommand } from './start';\nimport { stopCommand } from './stop';\nimport { statusCommand } from './status';\nimport { logsCommand } from './logs';\nimport { handleCliError, writeJsonResult } from '../lib/output';\n\ninterface ServerArgs {\n json?: boolean;\n}\n\ninterface HealthArgs extends ServerArgs {\n port: number;\n host: string;\n env?: string;\n}\n\ninterface ConfigArgs extends ServerArgs {\n key?: string;\n value?: string;\n}\n\nfunction configPath(): string {\n return join(homedir(), '.xpod', 'server-config.json');\n}\n\nfunction readConfig(): Record<string, string> {\n try {\n const path = configPath();\n if (!existsSync(path)) return {};\n const parsed = JSON.parse(readFileSync(path, 'utf-8')) as unknown;\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? Object.fromEntries(Object.entries(parsed).map(([ key, value ]) => [ key, String(value) ]))\n : {};\n } catch {\n return {};\n }\n}\n\nfunction writeConfig(config: Record<string, string>): void {\n const path = configPath();\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, `${JSON.stringify(config, null, 2)}\\n`, 'utf-8');\n}\n\nconst healthCommand: CommandModule<object, HealthArgs> = {\n command: 'health',\n describe: 'Show xpod server health checks',\n builder: (yargs) =>\n yargs\n .option('port', { alias: 'p', type: 'number', default: 3000, description: 'Gateway port' })\n .option('host', { type: 'string', default: 'localhost', description: 'Gateway host' })\n .option('env', { alias: 'e', type: 'string', description: 'Env file path for runtime context' })\n .option('json', { type: 'boolean', default: false, description: 'Output JSON envelope' }),\n handler: async (argv) => {\n const baseUrl = `http://${argv.host}:${argv.port}`;\n try {\n const checks: Record<string, 'pass' | 'fail'> = {\n gateway: 'fail',\n css: 'fail',\n api: 'fail',\n };\n\n try {\n const gateway = await fetch(`${baseUrl}/service/status`);\n checks.gateway = gateway.ok ? 'pass' : 'fail';\n } catch {\n checks.gateway = 'fail';\n }\n\n try {\n const css = await fetch(`${baseUrl}/`, { method: 'HEAD' });\n checks.css = css.ok ? 'pass' : 'fail';\n } catch {\n checks.css = 'fail';\n }\n\n try {\n const api = await fetch(`${baseUrl}/api/ready`);\n checks.api = api.ok ? 'pass' : 'fail';\n } catch {\n checks.api = 'fail';\n }\n\n const data = {\n schemaVersion: '1.0',\n healthy: Object.values(checks).every((status) => status === 'pass'),\n checks,\n timestamp: new Date().toISOString(),\n };\n\n if (argv.json) {\n writeJsonResult(data);\n return;\n }\n console.log(data.healthy ? 'Healthy' : 'Unhealthy');\n for (const [ name, status ] of Object.entries(checks)) {\n console.log(` ${name}: ${status}`);\n }\n } catch (error) {\n handleCliError(error, argv.json === true);\n }\n },\n};\n\nconst configGetCommand: CommandModule<object, ConfigArgs> = {\n command: 'get <key>',\n describe: 'Get xpod server config value',\n builder: (yargs) =>\n yargs\n .positional('key', { type: 'string', demandOption: true, description: 'Config key' })\n .option('json', { type: 'boolean', default: false, description: 'Output JSON envelope' }),\n handler: (argv) => {\n const config = readConfig();\n const value = config[argv.key!];\n if (argv.json) {\n writeJsonResult({ key: argv.key, value: value ?? null });\n return;\n }\n if (value === undefined) {\n console.log('');\n return;\n }\n console.log(value);\n },\n};\n\nconst configSetCommand: CommandModule<object, ConfigArgs> = {\n command: 'set <key> <value>',\n describe: 'Set xpod server config value',\n builder: (yargs) =>\n yargs\n .positional('key', { type: 'string', demandOption: true, description: 'Config key' })\n .positional('value', { type: 'string', demandOption: true, description: 'Config value' })\n .option('json', { type: 'boolean', default: false, description: 'Output JSON envelope' }),\n handler: (argv) => {\n const config = readConfig();\n config[argv.key!] = argv.value!;\n writeConfig(config);\n const data = { key: argv.key, value: argv.value, path: configPath() };\n if (argv.json) {\n writeJsonResult(data);\n return;\n }\n console.log(`${argv.key}=${argv.value}`);\n },\n};\n\nconst configListCommand: CommandModule<object, ConfigArgs> = {\n command: 'list',\n describe: 'List xpod server config values',\n builder: (yargs) => yargs.option('json', { type: 'boolean', default: false, description: 'Output JSON envelope' }),\n handler: (argv) => {\n const config = readConfig();\n if (argv.json) {\n writeJsonResult({ config, path: configPath() });\n return;\n }\n for (const [ key, value ] of Object.entries(config)) {\n console.log(`${key}=${value}`);\n }\n },\n};\n\nexport const serverConfigCommand: CommandModule<object, ConfigArgs> = {\n command: 'config',\n describe: 'Manage xpod server config',\n builder: (yargs) =>\n yargs\n .command(configGetCommand)\n .command(configSetCommand)\n .command(configListCommand)\n .demandCommand(1, 'Please specify a server config subcommand'),\n handler: () => {},\n};\n\nexport const serverCommand: CommandModule<object, ServerArgs> = {\n command: 'server',\n describe: 'Manage the xpod server runtime',\n builder: (yargs) =>\n yargs\n .command(startCommand)\n .command(stopCommand)\n .command(statusCommand)\n .command(healthCommand)\n .command(logsCommand)\n .command(serverConfigCommand)\n .demandCommand(1, 'Please specify a server subcommand'),\n handler: () => {},\n};\n"]}
|
|
@@ -67,6 +67,11 @@ exports.startCommand = {
|
|
|
67
67
|
type: 'string',
|
|
68
68
|
description: 'Gateway host',
|
|
69
69
|
default: 'localhost',
|
|
70
|
+
})
|
|
71
|
+
.option('foreground', {
|
|
72
|
+
type: 'boolean',
|
|
73
|
+
default: true,
|
|
74
|
+
description: 'Run in the foreground',
|
|
70
75
|
}),
|
|
71
76
|
handler: async (argv) => {
|
|
72
77
|
if (argv.env) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":";;;;;;AACA,gDAAwB;AACxB,4CAAoB;AACpB,iDAA8C;AAC9C,2CAAwE;AACxE,2DAA0H;AAC1H,2DAAsE;AAUtE,MAAM,cAAc,GAAG,OAAQ,UAAgC,CAAC,GAAG,KAAK,WAAW;IACjF,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,MAAM,CAAC;IAC1C,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;AAErB,SAAS,WAAW,CAAC,OAAe;IAClC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC;QAC/C,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,YAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAClD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,OAAO,KAAK,CAAC,CAAC;YAAE,SAAS;QAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7C,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9C,IACE,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9C,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAC9C,CAAC;YACD,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC3B,CAAC;IACH,CAAC;AACH,CAAC;AAEY,QAAA,YAAY,GAAqC;IAC5D,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE,qBAAqB;IAC/B,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,MAAM,CAAC,MAAM,EAAE;QACd,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;QAC3B,WAAW,EAAE,UAAU;KACxB,CAAC;SACD,MAAM,CAAC,QAAQ,EAAE;QAChB,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,wCAAwC;KACtD,CAAC;SACD,MAAM,CAAC,KAAK,EAAE;QACb,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,mBAAmB;KACjC,CAAC;SACD,MAAM,CAAC,MAAM,EAAE;QACd,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,cAAc;QAC3B,OAAO,EAAE,IAAI;KACd,CAAC;SACD,MAAM,CAAC,MAAM,EAAE;QACd,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,cAAc;QAC3B,OAAO,EAAE,WAAW;KACrB,CAAC;IACN,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACtB,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;QAED,MAAM,QAAQ,GACZ,IAAI,CAAC,IAAI,KAAK,IAAI;YAChB,CAAC,CAAC,IAAI,CAAC,IAAI;YACX,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;QAExE,IAAI,UAAkB,CAAC;QACvB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACrB,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,sBAAY,EAAE,UAAU,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,sBAAY,EAAE,mBAAmB,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAA,qBAAW,EAAC,QAAQ,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,MAAM,IAAA,qBAAW,EAAC,OAAO,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAE1D,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,UAAU,IAAI,CAAC,IAAI,IAAI,QAAQ,GAAG,CAAC;QAE/E,yDAAyD;QACzD,MAAM,kBAAkB,GAAG,IAAA,uCAAyB,EAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAElE,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,KAAK,IAAI,CAAC,IAAI,IAAI,QAAQ,GAAG,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,sCAAsC,OAAO,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,sCAAsC,OAAO,EAAE,CAAC,CAAC;QAC7D,IAAI,kBAAkB,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,0BAA0B,kBAAkB,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,uBAAU,EAAE,CAAC;QACpC,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC;QAC3E,MAAM,gBAAgB,GAAG,IAAA,yCAA2B,EAAC;YACnD,UAAU;YACV,WAAW,EAAE,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,0BAA0B,CAAC;YACjE,kBAAkB;SACnB,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,IAAA,0BAAY,EAAC;YAC3B,SAAS;YACT,UAAU,EAAE,gBAAgB,CAAC,UAAU;YACvC,aAAa,EAAE,sBAAY;YAC3B,OAAO;YACP,OAAO;YACP,kBAAkB;SACnB,CAAC,CAAC;QAEH,UAAU,CAAC,QAAQ,CAAC;YAClB,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,cAAc;YACvB,IAAI,EAAE,OAAO;YACb,GAAG,EAAE,gBAAgB,CAAC,GAAG;YACzB,GAAG,EAAE,IAAA,8BAAgB,EAAC,OAAO,EAAE,OAAO,EAAE,kBAAkB,CAAC;SAC5D,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,SAAS;YACvB,CAAC,CAAC;gBACE,IAAI;gBACJ,OAAO,CAAC,OAAO,CAAC,iCAAiC,CAAC;gBAClD,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC;aACtD;YACH,CAAC,CAAC,CAAC,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;QAE5D,UAAU,CAAC,QAAQ,CAAC;YAClB,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,cAAc;YACvB,IAAI,EAAE,OAAO;YACb,GAAG,EAAE,IAAA,8BAAgB,EAAC;gBACpB,OAAO;gBACP,QAAQ;gBACR,OAAO;gBACP,OAAO;gBACP,kBAAkB;aACnB,CAAC;SACH,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,IAAI,sBAAY,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE;YAC9D,UAAU,EAAE,IAAI;YAChB,OAAO;SACR,CAAC,CAAC;QACH,KAAK,CAAC,UAAU,CAAC;YACf,GAAG,EAAE,oBAAoB,OAAO,EAAE;YAClC,GAAG,EAAE,oBAAoB,OAAO,EAAE;SACnC,CAAC,CAAC;QAEH,MAAM,UAAU,CAAC,QAAQ,EAAE,CAAC;QAC5B,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QAEpB,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAiB,EAAE;YACvD,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,oBAAoB,CAAC,CAAC;YACtD,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC;QAEF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjD,CAAC;CACF,CAAC","sourcesContent":["import type { CommandModule } from 'yargs';\nimport path from 'path';\nimport fs from 'fs';\nimport { Supervisor } from '../../supervisor';\nimport { GatewayProxy, getFreePort, PACKAGE_ROOT } from '../../runtime';\nimport { buildApiChildEnv, buildCssArgs, buildCssChildEnv, createCssChildRuntimeConfig } from '../../runtime/css-process';\nimport { resolveExternalOidcIssuer } from '../../runtime/oidc-issuer';\n\ninterface StartArgs {\n mode?: string;\n config?: string;\n env?: string;\n port: number;\n host: string;\n}\n\nconst childJsRuntime = typeof (globalThis as { Bun?: unknown }).Bun !== 'undefined'\n ? (process.env.XPOD_NODE_BINARY ?? 'node')\n : process.execPath;\n\nfunction loadEnvFile(envPath: string): void {\n if (!fs.existsSync(envPath)) {\n console.warn(`Env file not found: ${envPath}`);\n return;\n }\n const content = fs.readFileSync(envPath, 'utf-8');\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const eqIndex = trimmed.indexOf('=');\n if (eqIndex === -1) continue;\n const key = trimmed.slice(0, eqIndex).trim();\n let value = trimmed.slice(eqIndex + 1).trim();\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n if (!process.env[key]) {\n process.env[key] = value;\n }\n }\n}\n\nexport const startCommand: CommandModule<object, StartArgs> = {\n command: 'start',\n describe: 'Start xpod services',\n builder: (yargs) =>\n yargs\n .option('mode', {\n alias: 'm',\n type: 'string',\n choices: ['local', 'cloud'],\n description: 'Run mode',\n })\n .option('config', {\n alias: 'c',\n type: 'string',\n description: 'Path to config file (overrides --mode)',\n })\n .option('env', {\n alias: 'e',\n type: 'string',\n description: 'Path to .env file',\n })\n .option('port', {\n alias: 'p',\n type: 'number',\n description: 'Gateway port',\n default: 3000,\n })\n .option('host', {\n type: 'string',\n description: 'Gateway host',\n default: 'localhost',\n }),\n handler: async (argv) => {\n if (argv.env) {\n loadEnvFile(argv.env);\n }\n\n const mainPort =\n argv.port !== 3000\n ? argv.port\n : parseInt(process.env.XPOD_PORT ?? process.env.PORT ?? '3000', 10);\n\n let configPath: string;\n if (argv.config) {\n configPath = argv.config;\n } else if (argv.mode) {\n configPath = path.join(PACKAGE_ROOT, `config/${argv.mode}.json`);\n } else {\n configPath = path.join(PACKAGE_ROOT, 'config/local.json');\n }\n\n const cssPort = await getFreePort(mainPort + 1, argv.host);\n const apiPort = await getFreePort(cssPort + 1, argv.host);\n\n const baseUrl = process.env.CSS_BASE_URL || `http://${argv.host}:${mainPort}/`;\n\n // SP 模式:oidcIssuer 显式指定外部 IdP;Cloud API 地址不再隐式当作 issuer。\n const externalOidcIssuer = resolveExternalOidcIssuer(process.env);\n\n console.log('Starting xpod...');\n console.log(` Gateway: ${baseUrl} (${argv.host}:${mainPort})`);\n console.log(` CSS (internal): http://localhost:${cssPort}`);\n console.log(` API (internal): http://localhost:${apiPort}`);\n if (externalOidcIssuer) {\n console.log(` SP mode: Cloud IdP = ${externalOidcIssuer}`);\n }\n\n const supervisor = new Supervisor();\n const cssBinary = require.resolve('@solid/community-server/bin/server.js');\n const cssRuntimeConfig = createCssChildRuntimeConfig({\n configPath,\n runtimeRoot: path.join(process.cwd(), '.xpod/runtime/legacy-css'),\n externalOidcIssuer,\n });\n const cssArgs = buildCssArgs({\n cssBinary,\n configPath: cssRuntimeConfig.configPath,\n cssModuleRoot: PACKAGE_ROOT,\n cssPort,\n baseUrl,\n externalOidcIssuer,\n });\n\n supervisor.register({\n name: 'css',\n command: childJsRuntime,\n args: cssArgs,\n cwd: cssRuntimeConfig.cwd,\n env: buildCssChildEnv(baseUrl, cssPort, externalOidcIssuer),\n });\n\n const isDevMode = __filename.endsWith('.ts');\n const apiArgs = isDevMode\n ? [\n '-r',\n require.resolve('ts-node/register/transpile-only'),\n path.resolve(__dirname, '..', '..', 'api', 'main.ts'),\n ]\n : [path.resolve(__dirname, '..', '..', 'api', 'main.js')];\n\n supervisor.register({\n name: 'api',\n command: childJsRuntime,\n args: apiArgs,\n env: buildApiChildEnv({\n apiPort,\n mainPort,\n cssPort,\n baseUrl,\n externalOidcIssuer,\n }),\n });\n\n const proxy = new GatewayProxy(mainPort, supervisor, '0.0.0.0', {\n exitOnStop: true,\n baseUrl,\n });\n proxy.setTargets({\n css: `http://localhost:${cssPort}`,\n api: `http://localhost:${apiPort}`,\n });\n\n await supervisor.startAll();\n await proxy.start();\n\n const shutdown = async (signal: string): Promise<void> => {\n console.log(`\\nReceived ${signal}, shutting down...`);\n await supervisor.stopAll();\n process.exit(0);\n };\n\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\n },\n};\n"]}
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CommandModule } from 'yargs';\nimport path from 'path';\nimport fs from 'fs';\nimport { Supervisor } from '../../supervisor';\nimport { GatewayProxy, getFreePort, PACKAGE_ROOT } from '../../runtime';\nimport { buildApiChildEnv, buildCssArgs, buildCssChildEnv, createCssChildRuntimeConfig } from '../../runtime/css-process';\nimport { resolveExternalOidcIssuer } from '../../runtime/oidc-issuer';\n\ninterface StartArgs {\n mode?: string;\n config?: string;\n env?: string;\n port: number;\n host: string;\n foreground?: boolean;\n}\n\nconst childJsRuntime = typeof (globalThis as { Bun?: unknown }).Bun !== 'undefined'\n ? (process.env.XPOD_NODE_BINARY ?? 'node')\n : process.execPath;\n\nfunction loadEnvFile(envPath: string): void {\n if (!fs.existsSync(envPath)) {\n console.warn(`Env file not found: ${envPath}`);\n return;\n }\n const content = fs.readFileSync(envPath, 'utf-8');\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const eqIndex = trimmed.indexOf('=');\n if (eqIndex === -1) continue;\n const key = trimmed.slice(0, eqIndex).trim();\n let value = trimmed.slice(eqIndex + 1).trim();\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n if (!process.env[key]) {\n process.env[key] = value;\n }\n }\n}\n\nexport const startCommand: CommandModule<object, StartArgs> = {\n command: 'start',\n describe: 'Start xpod services',\n builder: (yargs) =>\n yargs\n .option('mode', {\n alias: 'm',\n type: 'string',\n choices: ['local', 'cloud'],\n description: 'Run mode',\n })\n .option('config', {\n alias: 'c',\n type: 'string',\n description: 'Path to config file (overrides --mode)',\n })\n .option('env', {\n alias: 'e',\n type: 'string',\n description: 'Path to .env file',\n })\n .option('port', {\n alias: 'p',\n type: 'number',\n description: 'Gateway port',\n default: 3000,\n })\n .option('host', {\n type: 'string',\n description: 'Gateway host',\n default: 'localhost',\n })\n .option('foreground', {\n type: 'boolean',\n default: true,\n description: 'Run in the foreground',\n }),\n handler: async (argv) => {\n if (argv.env) {\n loadEnvFile(argv.env);\n }\n\n const mainPort =\n argv.port !== 3000\n ? argv.port\n : parseInt(process.env.XPOD_PORT ?? process.env.PORT ?? '3000', 10);\n\n let configPath: string;\n if (argv.config) {\n configPath = argv.config;\n } else if (argv.mode) {\n configPath = path.join(PACKAGE_ROOT, `config/${argv.mode}.json`);\n } else {\n configPath = path.join(PACKAGE_ROOT, 'config/local.json');\n }\n\n const cssPort = await getFreePort(mainPort + 1, argv.host);\n const apiPort = await getFreePort(cssPort + 1, argv.host);\n\n const baseUrl = process.env.CSS_BASE_URL || `http://${argv.host}:${mainPort}/`;\n\n // SP 模式:oidcIssuer 显式指定外部 IdP;Cloud API 地址不再隐式当作 issuer。\n const externalOidcIssuer = resolveExternalOidcIssuer(process.env);\n\n console.log('Starting xpod...');\n console.log(` Gateway: ${baseUrl} (${argv.host}:${mainPort})`);\n console.log(` CSS (internal): http://localhost:${cssPort}`);\n console.log(` API (internal): http://localhost:${apiPort}`);\n if (externalOidcIssuer) {\n console.log(` SP mode: Cloud IdP = ${externalOidcIssuer}`);\n }\n\n const supervisor = new Supervisor();\n const cssBinary = require.resolve('@solid/community-server/bin/server.js');\n const cssRuntimeConfig = createCssChildRuntimeConfig({\n configPath,\n runtimeRoot: path.join(process.cwd(), '.xpod/runtime/legacy-css'),\n externalOidcIssuer,\n });\n const cssArgs = buildCssArgs({\n cssBinary,\n configPath: cssRuntimeConfig.configPath,\n cssModuleRoot: PACKAGE_ROOT,\n cssPort,\n baseUrl,\n externalOidcIssuer,\n });\n\n supervisor.register({\n name: 'css',\n command: childJsRuntime,\n args: cssArgs,\n cwd: cssRuntimeConfig.cwd,\n env: buildCssChildEnv(baseUrl, cssPort, externalOidcIssuer),\n });\n\n const isDevMode = __filename.endsWith('.ts');\n const apiArgs = isDevMode\n ? [\n '-r',\n require.resolve('ts-node/register/transpile-only'),\n path.resolve(__dirname, '..', '..', 'api', 'main.ts'),\n ]\n : [path.resolve(__dirname, '..', '..', 'api', 'main.js')];\n\n supervisor.register({\n name: 'api',\n command: childJsRuntime,\n args: apiArgs,\n env: buildApiChildEnv({\n apiPort,\n mainPort,\n cssPort,\n baseUrl,\n externalOidcIssuer,\n }),\n });\n\n const proxy = new GatewayProxy(mainPort, supervisor, '0.0.0.0', {\n exitOnStop: true,\n baseUrl,\n });\n proxy.setTargets({\n css: `http://localhost:${cssPort}`,\n api: `http://localhost:${apiPort}`,\n });\n\n await supervisor.startAll();\n await proxy.start();\n\n const shutdown = async (signal: string): Promise<void> => {\n console.log(`\\nReceived ${signal}, shutting down...`);\n await supervisor.stopAll();\n process.exit(0);\n };\n\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\n },\n};\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.statusCommand = void 0;
|
|
4
|
+
const output_1 = require("../lib/output");
|
|
4
5
|
exports.statusCommand = {
|
|
5
6
|
command: 'status',
|
|
6
7
|
describe: 'Show service status',
|
|
@@ -15,6 +16,11 @@ exports.statusCommand = {
|
|
|
15
16
|
type: 'string',
|
|
16
17
|
description: 'Gateway host',
|
|
17
18
|
default: 'localhost',
|
|
19
|
+
})
|
|
20
|
+
.option('env', {
|
|
21
|
+
alias: 'e',
|
|
22
|
+
type: 'string',
|
|
23
|
+
description: 'Env file path for runtime context',
|
|
18
24
|
})
|
|
19
25
|
.option('json', {
|
|
20
26
|
type: 'boolean',
|
|
@@ -26,12 +32,22 @@ exports.statusCommand = {
|
|
|
26
32
|
try {
|
|
27
33
|
const res = await fetch(`${baseUrl}/service/status`);
|
|
28
34
|
if (!res.ok) {
|
|
29
|
-
|
|
30
|
-
|
|
35
|
+
throw new output_1.CliCommandError('server_status_failed', `Failed to get status: HTTP ${res.status}`, 1, {
|
|
36
|
+
status: res.status,
|
|
37
|
+
});
|
|
31
38
|
}
|
|
32
39
|
const statuses = (await res.json());
|
|
33
40
|
if (argv.json) {
|
|
34
|
-
|
|
41
|
+
const running = statuses.some((svc) => svc.status === 'running');
|
|
42
|
+
const ready = statuses.length > 0 && statuses.every((svc) => svc.status === 'running');
|
|
43
|
+
(0, output_1.writeJsonResult)({
|
|
44
|
+
schemaVersion: '1.0',
|
|
45
|
+
running,
|
|
46
|
+
ready,
|
|
47
|
+
baseUrl: `${baseUrl}/`,
|
|
48
|
+
port: argv.port,
|
|
49
|
+
services: statuses,
|
|
50
|
+
});
|
|
35
51
|
return;
|
|
36
52
|
}
|
|
37
53
|
if (statuses.length === 0) {
|
|
@@ -55,9 +71,8 @@ exports.statusCommand = {
|
|
|
55
71
|
console.log(`${icon} ${svc.name.padEnd(8)} ${svc.status}${pid}${uptime}${restarts}`);
|
|
56
72
|
}
|
|
57
73
|
}
|
|
58
|
-
catch {
|
|
59
|
-
|
|
60
|
-
process.exit(1);
|
|
74
|
+
catch (error) {
|
|
75
|
+
(0, output_1.handleCliError)(error instanceof Error ? error : new Error(`Cannot connect to xpod at ${baseUrl}. Is it running?`), argv.json);
|
|
61
76
|
}
|
|
62
77
|
},
|
|
63
78
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CommandModule } from 'yargs';\nimport { CliCommandError, handleCliError, writeJsonResult } from '../lib/output';\n\ninterface StatusArgs {\n port: number;\n host: string;\n json: boolean;\n env?: string;\n}\n\nexport const statusCommand: CommandModule<object, StatusArgs> = {\n command: 'status',\n describe: 'Show service status',\n builder: (yargs) =>\n yargs\n .option('port', {\n alias: 'p',\n type: 'number',\n description: 'Gateway port',\n default: 3000,\n })\n .option('host', {\n type: 'string',\n description: 'Gateway host',\n default: 'localhost',\n })\n .option('env', {\n alias: 'e',\n type: 'string',\n description: 'Env file path for runtime context',\n })\n .option('json', {\n type: 'boolean',\n description: 'Output as JSON',\n default: false,\n }),\n handler: async (argv) => {\n const baseUrl = `http://${argv.host}:${argv.port}`;\n\n try {\n const res = await fetch(`${baseUrl}/service/status`);\n if (!res.ok) {\n throw new CliCommandError('server_status_failed', `Failed to get status: HTTP ${res.status}`, 1, {\n status: res.status,\n });\n }\n\n const statuses = (await res.json()) as Array<{\n name: string;\n status: string;\n pid?: number;\n uptime?: number;\n restartCount: number;\n lastExitCode?: number;\n }>;\n\n if (argv.json) {\n const running = statuses.some((svc) => svc.status === 'running');\n const ready = statuses.length > 0 && statuses.every((svc) => svc.status === 'running');\n writeJsonResult({\n schemaVersion: '1.0',\n running,\n ready,\n baseUrl: `${baseUrl}/`,\n port: argv.port,\n services: statuses,\n });\n return;\n }\n\n if (statuses.length === 0) {\n console.log('No services registered.');\n return;\n }\n\n const statusIcon = (s: string): string => {\n switch (s) {\n case 'running': return '●';\n case 'stopped': return '○';\n case 'starting': return '◌';\n case 'crashed': return '✗';\n default: return '?';\n }\n };\n\n for (const svc of statuses) {\n const icon = statusIcon(svc.status);\n const uptime = svc.uptime != null ? ` uptime=${formatUptime(svc.uptime)}` : '';\n const pid = svc.pid != null ? ` pid=${svc.pid}` : '';\n const restarts = svc.restartCount > 0 ? ` restarts=${svc.restartCount}` : '';\n console.log(`${icon} ${svc.name.padEnd(8)} ${svc.status}${pid}${uptime}${restarts}`);\n }\n } catch (error) {\n handleCliError(error instanceof Error ? error : new Error(`Cannot connect to xpod at ${baseUrl}. Is it running?`), argv.json);\n }\n },\n};\n\nfunction formatUptime(ms: number): string {\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m${s % 60}s`;\n const h = Math.floor(m / 60);\n return `${h}h${m % 60}m`;\n}\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.stopCommand = void 0;
|
|
4
|
+
const output_1 = require("../lib/output");
|
|
4
5
|
exports.stopCommand = {
|
|
5
6
|
command: 'stop',
|
|
6
7
|
describe: 'Stop xpod services',
|
|
@@ -15,28 +16,62 @@ exports.stopCommand = {
|
|
|
15
16
|
type: 'string',
|
|
16
17
|
description: 'Gateway host',
|
|
17
18
|
default: 'localhost',
|
|
19
|
+
})
|
|
20
|
+
.option('env', {
|
|
21
|
+
alias: 'e',
|
|
22
|
+
type: 'string',
|
|
23
|
+
description: 'Env file path for runtime context',
|
|
24
|
+
})
|
|
25
|
+
.option('timeout', {
|
|
26
|
+
type: 'number',
|
|
27
|
+
default: 10000,
|
|
28
|
+
description: 'Graceful stop timeout in milliseconds',
|
|
29
|
+
})
|
|
30
|
+
.option('json', {
|
|
31
|
+
type: 'boolean',
|
|
32
|
+
default: false,
|
|
33
|
+
description: 'Output JSON envelope',
|
|
18
34
|
}),
|
|
19
35
|
handler: async (argv) => {
|
|
20
36
|
const baseUrl = `http://${argv.host}:${argv.port}`;
|
|
21
|
-
|
|
37
|
+
if (!argv.json) {
|
|
38
|
+
console.log(`Stopping xpod at ${baseUrl}...`);
|
|
39
|
+
}
|
|
22
40
|
try {
|
|
23
41
|
const res = await fetch(`${baseUrl}/service/status`);
|
|
24
42
|
if (!res.ok) {
|
|
25
|
-
|
|
26
|
-
|
|
43
|
+
throw new output_1.CliCommandError('server_not_reachable', 'Service not reachable or already stopped.', 1, {
|
|
44
|
+
status: res.status,
|
|
45
|
+
});
|
|
27
46
|
}
|
|
28
47
|
const statuses = (await res.json());
|
|
29
48
|
const running = statuses.filter((s) => s.status === 'running');
|
|
30
49
|
if (running.length === 0) {
|
|
50
|
+
if (argv.json) {
|
|
51
|
+
(0, output_1.writeJsonResult)({ running: false, stopped: false, services: statuses }, 'not_running');
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
31
54
|
console.log('No running services found.');
|
|
32
55
|
return;
|
|
33
56
|
}
|
|
34
57
|
// Send SIGTERM to the gateway process via the internal stop endpoint
|
|
35
58
|
const stopRes = await fetch(`${baseUrl}/service/stop`, { method: 'POST' });
|
|
36
59
|
if (stopRes.ok) {
|
|
60
|
+
if (argv.json) {
|
|
61
|
+
(0, output_1.writeJsonResult)({ running: true, stopped: true, services: running });
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
37
64
|
console.log('Stop signal sent.');
|
|
38
65
|
}
|
|
39
66
|
else {
|
|
67
|
+
if (argv.json) {
|
|
68
|
+
(0, output_1.writeJson)((0, output_1.fail)('stop_signal_failed', 'Could not send stop signal via API.', [], {
|
|
69
|
+
running: true,
|
|
70
|
+
stopped: false,
|
|
71
|
+
services: running,
|
|
72
|
+
}));
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
40
75
|
// Fallback: print PIDs for manual kill
|
|
41
76
|
console.log('Could not send stop signal via API. Running services:');
|
|
42
77
|
for (const s of running) {
|
|
@@ -45,9 +80,8 @@ exports.stopCommand = {
|
|
|
45
80
|
console.log('\nTo stop manually, kill the gateway process.');
|
|
46
81
|
}
|
|
47
82
|
}
|
|
48
|
-
catch {
|
|
49
|
-
|
|
50
|
-
process.exit(1);
|
|
83
|
+
catch (error) {
|
|
84
|
+
(0, output_1.handleCliError)(error instanceof Error ? error : new Error(`Cannot connect to xpod at ${baseUrl}. Is it running?`), argv.json);
|
|
51
85
|
}
|
|
52
86
|
},
|
|
53
87
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../src/cli/commands/stop.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../src/cli/commands/stop.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CommandModule } from 'yargs';\nimport { CliCommandError, fail, handleCliError, writeJson, writeJsonResult } from '../lib/output';\n\ninterface StopArgs {\n port: number;\n host: string;\n env?: string;\n timeout: number;\n json: boolean;\n}\n\nexport const stopCommand: CommandModule<object, StopArgs> = {\n command: 'stop',\n describe: 'Stop xpod services',\n builder: (yargs) =>\n yargs\n .option('port', {\n alias: 'p',\n type: 'number',\n description: 'Gateway port',\n default: 3000,\n })\n .option('host', {\n type: 'string',\n description: 'Gateway host',\n default: 'localhost',\n })\n .option('env', {\n alias: 'e',\n type: 'string',\n description: 'Env file path for runtime context',\n })\n .option('timeout', {\n type: 'number',\n default: 10000,\n description: 'Graceful stop timeout in milliseconds',\n })\n .option('json', {\n type: 'boolean',\n default: false,\n description: 'Output JSON envelope',\n }),\n handler: async (argv) => {\n const baseUrl = `http://${argv.host}:${argv.port}`;\n if (!argv.json) {\n console.log(`Stopping xpod at ${baseUrl}...`);\n }\n\n try {\n const res = await fetch(`${baseUrl}/service/status`);\n if (!res.ok) {\n throw new CliCommandError('server_not_reachable', 'Service not reachable or already stopped.', 1, {\n status: res.status,\n });\n }\n\n const statuses = (await res.json()) as Array<{ name: string; status: string; pid?: number }>;\n const running = statuses.filter((s) => s.status === 'running');\n\n if (running.length === 0) {\n if (argv.json) {\n writeJsonResult({ running: false, stopped: false, services: statuses }, 'not_running');\n return;\n }\n console.log('No running services found.');\n return;\n }\n\n // Send SIGTERM to the gateway process via the internal stop endpoint\n const stopRes = await fetch(`${baseUrl}/service/stop`, { method: 'POST' });\n if (stopRes.ok) {\n if (argv.json) {\n writeJsonResult({ running: true, stopped: true, services: running });\n return;\n }\n console.log('Stop signal sent.');\n } else {\n if (argv.json) {\n writeJson(fail('stop_signal_failed', 'Could not send stop signal via API.', [], {\n running: true,\n stopped: false,\n services: running,\n }));\n return;\n }\n // Fallback: print PIDs for manual kill\n console.log('Could not send stop signal via API. Running services:');\n for (const s of running) {\n console.log(` ${s.name} (pid: ${s.pid ?? 'unknown'})`);\n }\n console.log('\\nTo stop manually, kill the gateway process.');\n }\n } catch (error) {\n handleCliError(error instanceof Error ? error : new Error(`Cannot connect to xpod at ${baseUrl}. Is it running?`), argv.json);\n }\n },\n};\n"]}
|
package/dist/cli/index.js
CHANGED
|
@@ -32,8 +32,9 @@ const yargs_1 = __importDefault(require("yargs"));
|
|
|
32
32
|
const helpers_1 = require("yargs/helpers");
|
|
33
33
|
// Known subcommands
|
|
34
34
|
const KNOWN_COMMANDS = [
|
|
35
|
-
'
|
|
36
|
-
'
|
|
35
|
+
'get', 'put', 'patch', 'delete', 'head', 'list',
|
|
36
|
+
'rdf', 'obj', 'secret', 'server', 'start', 'stop', 'status', 'logs',
|
|
37
|
+
'auth', 'login', 'import', 'pod',
|
|
37
38
|
'account', 'backup', 'restore', 'doctor',
|
|
38
39
|
];
|
|
39
40
|
function createRootParser() {
|
|
@@ -45,14 +46,18 @@ function createRootParser() {
|
|
|
45
46
|
.version();
|
|
46
47
|
}
|
|
47
48
|
async function createCommandParser() {
|
|
48
|
-
const [{ startCommand }, { stopCommand }, { statusCommand }, { logsCommand }, {
|
|
49
|
+
const [{ startCommand }, { stopCommand }, { statusCommand }, { logsCommand }, { serverCommand }, { getCommand, putCommand, patchCommand, deleteCommand, headCommand, listCommand }, { rdfCommand }, { objCommand }, { secretCommand }, { authCommand }, { loginCommandModule }, { importCommand }, { podCommand }, { accountCommand }, { backupCommand, restoreCommand }, { doctorCommand },] = await Promise.all([
|
|
49
50
|
Promise.resolve().then(() => __importStar(require('./commands/start'))),
|
|
50
51
|
Promise.resolve().then(() => __importStar(require('./commands/stop'))),
|
|
51
52
|
Promise.resolve().then(() => __importStar(require('./commands/status'))),
|
|
52
53
|
Promise.resolve().then(() => __importStar(require('./commands/logs'))),
|
|
54
|
+
Promise.resolve().then(() => __importStar(require('./commands/server'))),
|
|
55
|
+
Promise.resolve().then(() => __importStar(require('./commands/resource'))),
|
|
56
|
+
Promise.resolve().then(() => __importStar(require('./commands/rdf'))),
|
|
57
|
+
Promise.resolve().then(() => __importStar(require('./commands/obj'))),
|
|
58
|
+
Promise.resolve().then(() => __importStar(require('./commands/secret'))),
|
|
53
59
|
Promise.resolve().then(() => __importStar(require('./commands/auth'))),
|
|
54
60
|
Promise.resolve().then(() => __importStar(require('./commands/login'))),
|
|
55
|
-
Promise.resolve().then(() => __importStar(require('./commands/config'))),
|
|
56
61
|
Promise.resolve().then(() => __importStar(require('./commands/import'))),
|
|
57
62
|
Promise.resolve().then(() => __importStar(require('./commands/pod'))),
|
|
58
63
|
Promise.resolve().then(() => __importStar(require('./commands/account'))),
|
|
@@ -64,9 +69,18 @@ async function createCommandParser() {
|
|
|
64
69
|
.command(stopCommand)
|
|
65
70
|
.command(statusCommand)
|
|
66
71
|
.command(logsCommand)
|
|
72
|
+
.command(serverCommand)
|
|
73
|
+
.command(getCommand)
|
|
74
|
+
.command(putCommand)
|
|
75
|
+
.command(patchCommand)
|
|
76
|
+
.command(deleteCommand)
|
|
77
|
+
.command(headCommand)
|
|
78
|
+
.command(listCommand)
|
|
79
|
+
.command(rdfCommand)
|
|
80
|
+
.command(objCommand)
|
|
81
|
+
.command(secretCommand)
|
|
67
82
|
.command(authCommand)
|
|
68
83
|
.command(loginCommandModule)
|
|
69
|
-
.command(configCommand)
|
|
70
84
|
.command(importCommand)
|
|
71
85
|
.command(podCommand)
|
|
72
86
|
.command(accountCommand)
|
|
@@ -79,10 +93,11 @@ async function createCommandParser() {
|
|
|
79
93
|
}
|
|
80
94
|
async function main() {
|
|
81
95
|
const argv = process.argv.slice(2);
|
|
82
|
-
const wantsRootHelp = argv.
|
|
83
|
-
const wantsVersion = argv
|
|
96
|
+
const wantsRootHelp = argv.length === 0 || argv[0] === 'help' || argv[0] === '--help' || argv[0] === '-h';
|
|
97
|
+
const wantsVersion = argv[0] === '--version' || argv[0] === '-v';
|
|
84
98
|
if (wantsRootHelp || wantsVersion) {
|
|
85
|
-
|
|
99
|
+
const parser = wantsRootHelp ? await createCommandParser() : createRootParser();
|
|
100
|
+
parser.parse(wantsVersion ? ['--version'] : ['--help']);
|
|
86
101
|
return;
|
|
87
102
|
}
|
|
88
103
|
(await createCommandParser())
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,8CAA4C;AAC5C,kDAA0B;AAC1B,2CAAwC;AAExC,oBAAoB;AACpB,MAAM,cAAc,GAAG;IACrB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport '../runtime/configure-drizzle-solid';\nimport yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\n\n// Known subcommands\nconst KNOWN_COMMANDS = [\n 'get', 'put', 'patch', 'delete', 'head', 'list',\n 'rdf', 'obj', 'secret', 'server', 'start', 'stop', 'status', 'logs',\n 'auth', 'login', 'import', 'pod',\n 'account', 'backup', 'restore', 'doctor',\n];\n\nfunction createRootParser() {\n return yargs(hideBin(process.argv))\n .scriptName('xpod')\n .usage('$0 <command> [options]')\n .epilog(`Commands: ${KNOWN_COMMANDS.join(', ')}`)\n .help()\n .version();\n}\n\nasync function createCommandParser() {\n const [\n { startCommand },\n { stopCommand },\n { statusCommand },\n { logsCommand },\n { serverCommand },\n { getCommand, putCommand, patchCommand, deleteCommand, headCommand, listCommand },\n { rdfCommand },\n { objCommand },\n { secretCommand },\n { authCommand },\n { loginCommandModule },\n { importCommand },\n { podCommand },\n { accountCommand },\n { backupCommand, restoreCommand },\n { doctorCommand },\n ] = await Promise.all([\n import('./commands/start'),\n import('./commands/stop'),\n import('./commands/status'),\n import('./commands/logs'),\n import('./commands/server'),\n import('./commands/resource'),\n import('./commands/rdf'),\n import('./commands/obj'),\n import('./commands/secret'),\n import('./commands/auth'),\n import('./commands/login'),\n import('./commands/import'),\n import('./commands/pod'),\n import('./commands/account'),\n import('./commands/backup'),\n import('./commands/doctor'),\n ]);\n\n return createRootParser()\n .command(startCommand)\n .command(stopCommand)\n .command(statusCommand)\n .command(logsCommand)\n .command(serverCommand)\n .command(getCommand)\n .command(putCommand)\n .command(patchCommand)\n .command(deleteCommand)\n .command(headCommand)\n .command(listCommand)\n .command(rdfCommand)\n .command(objCommand)\n .command(secretCommand)\n .command(authCommand)\n .command(loginCommandModule)\n .command(importCommand)\n .command(podCommand)\n .command(accountCommand)\n .command(backupCommand)\n .command(restoreCommand)\n .command(doctorCommand)\n .strict()\n .help()\n .version();\n}\n\nasync function main() {\n const argv = process.argv.slice(2);\n const wantsRootHelp = argv.length === 0 || argv[0] === 'help' || argv[0] === '--help' || argv[0] === '-h';\n const wantsVersion = argv[0] === '--version' || argv[0] === '-v';\n\n if (wantsRootHelp || wantsVersion) {\n const parser = wantsRootHelp ? await createCommandParser() : createRootParser();\n parser.parse(wantsVersion ? [ '--version' ] : [ '--help' ]);\n return;\n }\n\n (await createCommandParser())\n .demandCommand(1, 'Please specify an operations command')\n .parse();\n}\n\nmain().catch((error) => {\n console.error('Fatal error:', error);\n process.exit(1);\n});\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type StoredCredentials } from './credentials-store';
|
|
2
|
+
export interface CliAuthContext {
|
|
3
|
+
baseUrl: string;
|
|
4
|
+
webId: string;
|
|
5
|
+
podRoot: string;
|
|
6
|
+
baseIri: string;
|
|
7
|
+
accessToken: string;
|
|
8
|
+
credentials: StoredCredentials;
|
|
9
|
+
}
|
|
10
|
+
export interface AuthStatus {
|
|
11
|
+
authenticated: boolean;
|
|
12
|
+
authType?: string;
|
|
13
|
+
baseUrl?: string;
|
|
14
|
+
webId?: string;
|
|
15
|
+
podRoot?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function normalizeBaseUrl(url: string): string;
|
|
18
|
+
export declare function resolvePodRootFromWebId(webId: string): string;
|
|
19
|
+
export declare function getStoredAuthStatus(urlOverride?: string): AuthStatus;
|
|
20
|
+
export declare function requireAuthContext(options?: {
|
|
21
|
+
url?: string;
|
|
22
|
+
json?: boolean;
|
|
23
|
+
}): Promise<CliAuthContext>;
|
|
24
|
+
export declare function authFetch(context: CliAuthContext, url: string, init?: RequestInit): Promise<Response>;
|