@platforma-sdk/bootstrap 5.3.35 → 5.3.36
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/bin/run.js +6 -5
- package/dist/cli.cjs +57 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +55 -0
- package/dist/cli.js.map +1 -0
- package/dist/cmd-opts.cjs +116 -109
- package/dist/cmd-opts.cjs.map +1 -1
- package/dist/cmd-opts.js +95 -91
- package/dist/cmd-opts.js.map +1 -1
- package/dist/commands/create-block.cjs +10 -10
- package/dist/commands/create-block.cjs.map +1 -1
- package/dist/commands/create-block.js +11 -12
- package/dist/commands/create-block.js.map +1 -1
- package/dist/commands/reset.cjs +10 -10
- package/dist/commands/reset.cjs.map +1 -1
- package/dist/commands/reset.js +11 -12
- package/dist/commands/reset.js.map +1 -1
- package/dist/commands/start/docker/s3.cjs +10 -22
- package/dist/commands/start/docker/s3.cjs.map +1 -1
- package/dist/commands/start/docker/s3.js +11 -23
- package/dist/commands/start/docker/s3.js.map +1 -1
- package/dist/commands/start/docker.cjs +10 -23
- package/dist/commands/start/docker.cjs.map +1 -1
- package/dist/commands/start/docker.js +11 -24
- package/dist/commands/start/docker.js.map +1 -1
- package/dist/commands/start/local/s3.cjs +10 -26
- package/dist/commands/start/local/s3.cjs.map +1 -1
- package/dist/commands/start/local/s3.js +11 -27
- package/dist/commands/start/local/s3.js.map +1 -1
- package/dist/commands/start/local.cjs +10 -25
- package/dist/commands/start/local.cjs.map +1 -1
- package/dist/commands/start/local.js +11 -26
- package/dist/commands/start/local.js.map +1 -1
- package/dist/commands/start.cjs +10 -10
- package/dist/commands/start.cjs.map +1 -1
- package/dist/commands/start.js +11 -12
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/stop.cjs +10 -10
- package/dist/commands/stop.cjs.map +1 -1
- package/dist/commands/stop.js +11 -12
- package/dist/commands/stop.js.map +1 -1
- package/dist/commands/svc/create/arg-parser.cjs.map +1 -1
- package/dist/commands/svc/create/arg-parser.js.map +1 -1
- package/dist/commands/svc/create/docker/s3.cjs +25 -24
- package/dist/commands/svc/create/docker/s3.cjs.map +1 -1
- package/dist/commands/svc/create/docker/s3.js +26 -25
- package/dist/commands/svc/create/docker/s3.js.map +1 -1
- package/dist/commands/svc/create/docker.cjs +26 -25
- package/dist/commands/svc/create/docker.cjs.map +1 -1
- package/dist/commands/svc/create/docker.js +27 -26
- package/dist/commands/svc/create/docker.js.map +1 -1
- package/dist/commands/svc/create/local/s3.cjs +29 -28
- package/dist/commands/svc/create/local/s3.cjs.map +1 -1
- package/dist/commands/svc/create/local/s3.js +30 -29
- package/dist/commands/svc/create/local/s3.js.map +1 -1
- package/dist/commands/svc/create/local.cjs +28 -27
- package/dist/commands/svc/create/local.cjs.map +1 -1
- package/dist/commands/svc/create/local.js +29 -28
- package/dist/commands/svc/create/local.js.map +1 -1
- package/dist/commands/svc/delete.cjs +15 -21
- package/dist/commands/svc/delete.cjs.map +1 -1
- package/dist/commands/svc/delete.js +16 -23
- package/dist/commands/svc/delete.js.map +1 -1
- package/dist/commands/svc/down.cjs +12 -12
- package/dist/commands/svc/down.cjs.map +1 -1
- package/dist/commands/svc/down.js +13 -14
- package/dist/commands/svc/down.js.map +1 -1
- package/dist/commands/svc/list.cjs +8 -10
- package/dist/commands/svc/list.cjs.map +1 -1
- package/dist/commands/svc/list.js +8 -10
- package/dist/commands/svc/list.js.map +1 -1
- package/dist/commands/svc/up.cjs +12 -12
- package/dist/commands/svc/up.cjs.map +1 -1
- package/dist/commands/svc/up.js +13 -14
- package/dist/commands/svc/up.js.map +1 -1
- package/dist/index.cjs +3 -39
- package/dist/index.d.ts +2 -39
- package/dist/index.js +2 -39
- package/package.json +5 -17
- package/dist/commands/create-block.d.ts +0 -15
- package/dist/commands/create-block.d.ts.map +0 -1
- package/dist/commands/reset.d.ts +0 -15
- package/dist/commands/reset.d.ts.map +0 -1
- package/dist/commands/start/docker/s3.d.ts +0 -35
- package/dist/commands/start/docker/s3.d.ts.map +0 -1
- package/dist/commands/start/docker.d.ts +0 -35
- package/dist/commands/start/docker.d.ts.map +0 -1
- package/dist/commands/start/local/s3.d.ts +0 -39
- package/dist/commands/start/local/s3.d.ts.map +0 -1
- package/dist/commands/start/local.d.ts +0 -37
- package/dist/commands/start/local.d.ts.map +0 -1
- package/dist/commands/start.d.ts +0 -15
- package/dist/commands/start.d.ts.map +0 -1
- package/dist/commands/stop.d.ts +0 -15
- package/dist/commands/stop.d.ts.map +0 -1
- package/dist/commands/svc/create/docker/s3.d.ts +0 -38
- package/dist/commands/svc/create/docker/s3.d.ts.map +0 -1
- package/dist/commands/svc/create/docker.d.ts +0 -38
- package/dist/commands/svc/create/docker.d.ts.map +0 -1
- package/dist/commands/svc/create/local/s3.d.ts +0 -42
- package/dist/commands/svc/create/local/s3.d.ts.map +0 -1
- package/dist/commands/svc/create/local.d.ts +0 -40
- package/dist/commands/svc/create/local.d.ts.map +0 -1
- package/dist/commands/svc/delete.d.ts +0 -19
- package/dist/commands/svc/delete.d.ts.map +0 -1
- package/dist/commands/svc/down.d.ts +0 -18
- package/dist/commands/svc/down.d.ts.map +0 -1
- package/dist/commands/svc/list.d.ts +0 -12
- package/dist/commands/svc/list.d.ts.map +0 -1
- package/dist/commands/svc/up.d.ts +0 -18
- package/dist/commands/svc/up.d.ts.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
package/dist/commands/start.js
CHANGED
|
@@ -1,18 +1,17 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { GlobalOptions, addOptions, toFlags } from "../cmd-opts.js";
|
|
2
2
|
import { createLogger } from "../util.js";
|
|
3
3
|
import Core from "../core.js";
|
|
4
|
-
import { Command } from "
|
|
4
|
+
import { Command } from "commander";
|
|
5
5
|
//#region src/commands/start.ts
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
};
|
|
6
|
+
function startCommand() {
|
|
7
|
+
const cmd = new Command("start").description("Start last run service configuraiton");
|
|
8
|
+
addOptions(cmd, GlobalOptions());
|
|
9
|
+
cmd.action(async (o) => {
|
|
10
|
+
new Core(createLogger(toFlags(o)["log-level"])).startLast();
|
|
11
|
+
});
|
|
12
|
+
return cmd;
|
|
13
|
+
}
|
|
15
14
|
//#endregion
|
|
16
|
-
export {
|
|
15
|
+
export { startCommand as default };
|
|
17
16
|
|
|
18
17
|
//# sourceMappingURL=start.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","names":["cmdOpts.
|
|
1
|
+
{"version":3,"file":"start.js","names":["cmdOpts.GlobalOptions","cmdOpts.toFlags","util.createLogger"],"sources":["../../src/commands/start.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport Core from \"../core\";\nimport * as cmdOpts from \"../cmd-opts\";\nimport * as util from \"../util\";\n\nexport default function startCommand(): Command {\n const cmd = new Command(\"start\").description(\"Start last run service configuraiton\");\n\n cmdOpts.addOptions(cmd, cmdOpts.GlobalOptions());\n\n cmd.action(async (o) => {\n const flags = cmdOpts.toFlags(o);\n\n const logger = util.createLogger(flags[\"log-level\"]);\n const core = new Core(logger);\n\n core.startLast();\n });\n\n return cmd;\n}\n"],"mappings":";;;;;AAKA,SAAwB,eAAwB;CAC9C,MAAM,MAAM,IAAI,QAAQ,QAAQ,CAAC,YAAY,uCAAuC;AAEpF,YAAmB,KAAKA,eAAuB,CAAC;AAEhD,KAAI,OAAO,OAAO,MAAM;AAIT,MAAI,KADFE,aAFDD,QAAgB,EAAE,CAEO,aAAa,CACvB,CAExB,WAAW;GAChB;AAEF,QAAO"}
|
package/dist/commands/stop.cjs
CHANGED
|
@@ -3,21 +3,21 @@ const require_cmd_opts = require("../cmd-opts.cjs");
|
|
|
3
3
|
const require_util = require("../util.cjs");
|
|
4
4
|
const require_state = require("../state.cjs");
|
|
5
5
|
const require_core = require("../core.cjs");
|
|
6
|
-
let
|
|
6
|
+
let commander = require("commander");
|
|
7
7
|
//#region src/commands/stop.ts
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const { flags } = await this.parse(Stop);
|
|
8
|
+
function stopCommand() {
|
|
9
|
+
const cmd = new commander.Command("stop").description("Stop platforma service");
|
|
10
|
+
require_cmd_opts.addOptions(cmd, require_cmd_opts.GlobalOptions());
|
|
11
|
+
cmd.action(async (o) => {
|
|
12
|
+
const flags = require_cmd_opts.toFlags(o);
|
|
14
13
|
const logger = require_util.createLogger(flags["log-level"]);
|
|
15
14
|
const core = new require_core.default(logger);
|
|
16
15
|
if (require_state.default.currentInstance) core.stopInstance(require_state.default.currentInstance);
|
|
17
16
|
else logger.warn("up/start command was not called for any instance, nothing to stop");
|
|
18
|
-
}
|
|
19
|
-
|
|
17
|
+
});
|
|
18
|
+
return cmd;
|
|
19
|
+
}
|
|
20
20
|
//#endregion
|
|
21
|
-
exports.default =
|
|
21
|
+
exports.default = stopCommand;
|
|
22
22
|
|
|
23
23
|
//# sourceMappingURL=stop.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stop.cjs","names":["Command","Core","state"],"sources":["../../src/commands/stop.ts"],"sourcesContent":["import { Command } from \"
|
|
1
|
+
{"version":3,"file":"stop.cjs","names":["Command","Core","state"],"sources":["../../src/commands/stop.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport Core from \"../core\";\nimport state from \"../state\";\nimport * as cmdOpts from \"../cmd-opts\";\nimport * as util from \"../util\";\n\nexport default function stopCommand(): Command {\n const cmd = new Command(\"stop\").description(\"Stop platforma service\");\n\n cmdOpts.addOptions(cmd, cmdOpts.GlobalOptions());\n\n cmd.action(async (o) => {\n const flags = cmdOpts.toFlags(o);\n\n const logger = util.createLogger(flags[\"log-level\"]);\n const core = new Core(logger);\n\n if (state.currentInstance) {\n core.stopInstance(state.currentInstance);\n } else {\n logger.warn(\"up/start command was not called for any instance, nothing to stop\");\n }\n });\n\n return cmd;\n}\n"],"mappings":";;;;;;;AAMA,SAAwB,cAAuB;CAC7C,MAAM,MAAM,IAAIA,UAAAA,QAAQ,OAAO,CAAC,YAAY,yBAAyB;AAErE,kBAAA,WAAmB,KAAA,iBAAA,eAA4B,CAAC;AAEhD,KAAI,OAAO,OAAO,MAAM;EACtB,MAAM,QAAA,iBAAA,QAAwB,EAAE;EAEhC,MAAM,SAAA,aAAA,aAA2B,MAAM,aAAa;EACpD,MAAM,OAAO,IAAIC,aAAAA,QAAK,OAAO;AAE7B,MAAIC,cAAAA,QAAM,gBACR,MAAK,aAAaA,cAAAA,QAAM,gBAAgB;MAExC,QAAO,KAAK,oEAAoE;GAElF;AAEF,QAAO"}
|
package/dist/commands/stop.js
CHANGED
|
@@ -1,22 +1,21 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { GlobalOptions, addOptions, toFlags } from "../cmd-opts.js";
|
|
2
2
|
import { createLogger } from "../util.js";
|
|
3
3
|
import state_default from "../state.js";
|
|
4
4
|
import Core from "../core.js";
|
|
5
|
-
import { Command } from "
|
|
5
|
+
import { Command } from "commander";
|
|
6
6
|
//#region src/commands/stop.ts
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const { flags } = await this.parse(Stop);
|
|
13
|
-
const logger = createLogger(flags["log-level"]);
|
|
7
|
+
function stopCommand() {
|
|
8
|
+
const cmd = new Command("stop").description("Stop platforma service");
|
|
9
|
+
addOptions(cmd, GlobalOptions());
|
|
10
|
+
cmd.action(async (o) => {
|
|
11
|
+
const logger = createLogger(toFlags(o)["log-level"]);
|
|
14
12
|
const core = new Core(logger);
|
|
15
13
|
if (state_default.currentInstance) core.stopInstance(state_default.currentInstance);
|
|
16
14
|
else logger.warn("up/start command was not called for any instance, nothing to stop");
|
|
17
|
-
}
|
|
18
|
-
|
|
15
|
+
});
|
|
16
|
+
return cmd;
|
|
17
|
+
}
|
|
19
18
|
//#endregion
|
|
20
|
-
export {
|
|
19
|
+
export { stopCommand as default };
|
|
21
20
|
|
|
22
21
|
//# sourceMappingURL=stop.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stop.js","names":["cmdOpts.
|
|
1
|
+
{"version":3,"file":"stop.js","names":["cmdOpts.GlobalOptions","cmdOpts.toFlags","util.createLogger","state"],"sources":["../../src/commands/stop.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport Core from \"../core\";\nimport state from \"../state\";\nimport * as cmdOpts from \"../cmd-opts\";\nimport * as util from \"../util\";\n\nexport default function stopCommand(): Command {\n const cmd = new Command(\"stop\").description(\"Stop platforma service\");\n\n cmdOpts.addOptions(cmd, cmdOpts.GlobalOptions());\n\n cmd.action(async (o) => {\n const flags = cmdOpts.toFlags(o);\n\n const logger = util.createLogger(flags[\"log-level\"]);\n const core = new Core(logger);\n\n if (state.currentInstance) {\n core.stopInstance(state.currentInstance);\n } else {\n logger.warn(\"up/start command was not called for any instance, nothing to stop\");\n }\n });\n\n return cmd;\n}\n"],"mappings":";;;;;;AAMA,SAAwB,cAAuB;CAC7C,MAAM,MAAM,IAAI,QAAQ,OAAO,CAAC,YAAY,yBAAyB;AAErE,YAAmB,KAAKA,eAAuB,CAAC;AAEhD,KAAI,OAAO,OAAO,MAAM;EAGtB,MAAM,SAASE,aAFDD,QAAgB,EAAE,CAEO,aAAa;EACpD,MAAM,OAAO,IAAI,KAAK,OAAO;AAE7B,MAAIE,cAAM,gBACR,MAAK,aAAaA,cAAM,gBAAgB;MAExC,QAAO,KAAK,oEAAoE;GAElF;AAEF,QAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arg-parser.cjs","names":[],"sources":["../../../../src/commands/svc/create/arg-parser.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"arg-parser.cjs","names":[],"sources":["../../../../src/commands/svc/create/arg-parser.ts"],"sourcesContent":["/** Argument parser that separates known flags from unknown ones (forwarded to the backend). */\n\nexport interface ParsedArgs {\n instanceName: string;\n knownFlags: Record<string, any>;\n unknownFlags: string[];\n positionalArgs: string[];\n}\n\nexport interface FlagDefinition {\n name: string;\n type: \"string\" | \"boolean\" | \"number\" | \"array\";\n required?: boolean;\n default?: any;\n multiple?: boolean;\n}\n\nexport class ArgParser {\n private knownFlags: Set<string>;\n private flagDefinitions: Map<string, FlagDefinition>;\n\n constructor(flags: Record<string, any>) {\n this.knownFlags = new Set(Object.keys(flags));\n this.flagDefinitions = new Map();\n\n // Analyze flag definitions\n for (const [name, flag] of Object.entries(flags)) {\n if (flag.type) {\n this.flagDefinitions.set(name, {\n name,\n type: flag.type,\n required: flag.required || false,\n default: flag.default,\n multiple: flag.multiple || false,\n });\n }\n }\n }\n\n /**\n * Parse command line arguments\n */\n parse(argv: string[]): ParsedArgs {\n const result: ParsedArgs = {\n instanceName: \"\",\n knownFlags: {},\n unknownFlags: [],\n positionalArgs: [],\n };\n\n let i = 0;\n while (i < argv.length) {\n const arg = argv[i];\n\n if (arg.startsWith(\"--\")) {\n // Handle flag\n if (arg.includes(\"=\")) {\n // Flag with value: --flag=value\n const [flagName, value] = arg.split(\"=\", 2);\n const cleanFlagName = flagName.substring(2);\n\n if (this.knownFlags.has(cleanFlagName)) {\n result.knownFlags[cleanFlagName] = this.parseFlagValue(cleanFlagName, value);\n } else {\n result.unknownFlags.push(arg);\n }\n } else {\n // Flag without value: --flag or --flag value\n const flagName = arg.substring(2);\n\n if (this.knownFlags.has(flagName)) {\n const flagDef = this.flagDefinitions.get(flagName);\n\n if (flagDef?.type === \"boolean\") {\n // Boolean flag\n result.knownFlags[flagName] = true;\n } else if (i + 1 < argv.length && !argv[i + 1].startsWith(\"-\")) {\n // Flag with value in next argument\n const value = argv[i + 1];\n result.knownFlags[flagName] = this.parseFlagValue(flagName, value);\n i++; // Skip next argument\n } else {\n // Flag without value\n result.knownFlags[flagName] = true;\n }\n } else {\n result.unknownFlags.push(arg);\n }\n }\n } else if (arg.startsWith(\"-\") && arg.length > 1) {\n // Short flags: -f, -abc\n const shortFlags = arg.substring(1).split(\"\");\n for (const shortFlag of shortFlags) {\n // Find long name for short flag\n const longFlagName = this.findLongFlagName(shortFlag);\n if (longFlagName) {\n result.knownFlags[longFlagName] = true;\n } else {\n result.unknownFlags.push(`-${shortFlag}`);\n }\n }\n } else {\n // Positional argument\n if (!result.instanceName) {\n result.instanceName = arg;\n } else {\n result.positionalArgs.push(arg);\n }\n }\n\n i++;\n }\n\n // Set default values\n this.setDefaultValues(result.knownFlags);\n\n return result;\n }\n\n /**\n * Parse flag value according to its type\n */\n private parseFlagValue(flagName: string, value: string): any {\n const flagDef = this.flagDefinitions.get(flagName);\n\n if (!flagDef) {\n return value;\n }\n\n switch (flagDef.type) {\n case \"number\":\n const num = parseFloat(value);\n if (isNaN(num)) {\n throw new Error(`Invalid number value for flag --${flagName}: ${value}`);\n }\n return num;\n\n case \"boolean\":\n if (value === \"true\" || value === \"1\") return true;\n if (value === \"false\" || value === \"0\") return false;\n return Boolean(value);\n\n case \"array\":\n if (flagDef.multiple) {\n // For multiple flags create array\n // This will be handled in main parse method\n return [value];\n }\n return value;\n\n default:\n return value;\n }\n }\n\n /**\n * Find long flag name by short flag\n */\n private findLongFlagName(shortFlag: string): string | null {\n // Simple implementation - can be extended\n for (const flagName of this.knownFlags) {\n if (flagName.startsWith(shortFlag)) {\n return flagName;\n }\n }\n return null;\n }\n\n /**\n * Set default values for flags\n */\n private setDefaultValues(flags: Record<string, any>): void {\n for (const [name, flagDef] of this.flagDefinitions) {\n if (flagDef.default !== undefined && flags[name] === undefined) {\n flags[name] = flagDef.default;\n }\n }\n }\n\n /**\n * Validate required flags\n */\n validateRequired(flags: Record<string, any>): string[] {\n const errors: string[] = [];\n\n for (const [name, flagDef] of this.flagDefinitions) {\n if (flagDef.required && flags[name] === undefined) {\n errors.push(`Required flag --${name} is missing`);\n }\n }\n\n return errors;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arg-parser.js","names":[],"sources":["../../../../src/commands/svc/create/arg-parser.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"arg-parser.js","names":[],"sources":["../../../../src/commands/svc/create/arg-parser.ts"],"sourcesContent":["/** Argument parser that separates known flags from unknown ones (forwarded to the backend). */\n\nexport interface ParsedArgs {\n instanceName: string;\n knownFlags: Record<string, any>;\n unknownFlags: string[];\n positionalArgs: string[];\n}\n\nexport interface FlagDefinition {\n name: string;\n type: \"string\" | \"boolean\" | \"number\" | \"array\";\n required?: boolean;\n default?: any;\n multiple?: boolean;\n}\n\nexport class ArgParser {\n private knownFlags: Set<string>;\n private flagDefinitions: Map<string, FlagDefinition>;\n\n constructor(flags: Record<string, any>) {\n this.knownFlags = new Set(Object.keys(flags));\n this.flagDefinitions = new Map();\n\n // Analyze flag definitions\n for (const [name, flag] of Object.entries(flags)) {\n if (flag.type) {\n this.flagDefinitions.set(name, {\n name,\n type: flag.type,\n required: flag.required || false,\n default: flag.default,\n multiple: flag.multiple || false,\n });\n }\n }\n }\n\n /**\n * Parse command line arguments\n */\n parse(argv: string[]): ParsedArgs {\n const result: ParsedArgs = {\n instanceName: \"\",\n knownFlags: {},\n unknownFlags: [],\n positionalArgs: [],\n };\n\n let i = 0;\n while (i < argv.length) {\n const arg = argv[i];\n\n if (arg.startsWith(\"--\")) {\n // Handle flag\n if (arg.includes(\"=\")) {\n // Flag with value: --flag=value\n const [flagName, value] = arg.split(\"=\", 2);\n const cleanFlagName = flagName.substring(2);\n\n if (this.knownFlags.has(cleanFlagName)) {\n result.knownFlags[cleanFlagName] = this.parseFlagValue(cleanFlagName, value);\n } else {\n result.unknownFlags.push(arg);\n }\n } else {\n // Flag without value: --flag or --flag value\n const flagName = arg.substring(2);\n\n if (this.knownFlags.has(flagName)) {\n const flagDef = this.flagDefinitions.get(flagName);\n\n if (flagDef?.type === \"boolean\") {\n // Boolean flag\n result.knownFlags[flagName] = true;\n } else if (i + 1 < argv.length && !argv[i + 1].startsWith(\"-\")) {\n // Flag with value in next argument\n const value = argv[i + 1];\n result.knownFlags[flagName] = this.parseFlagValue(flagName, value);\n i++; // Skip next argument\n } else {\n // Flag without value\n result.knownFlags[flagName] = true;\n }\n } else {\n result.unknownFlags.push(arg);\n }\n }\n } else if (arg.startsWith(\"-\") && arg.length > 1) {\n // Short flags: -f, -abc\n const shortFlags = arg.substring(1).split(\"\");\n for (const shortFlag of shortFlags) {\n // Find long name for short flag\n const longFlagName = this.findLongFlagName(shortFlag);\n if (longFlagName) {\n result.knownFlags[longFlagName] = true;\n } else {\n result.unknownFlags.push(`-${shortFlag}`);\n }\n }\n } else {\n // Positional argument\n if (!result.instanceName) {\n result.instanceName = arg;\n } else {\n result.positionalArgs.push(arg);\n }\n }\n\n i++;\n }\n\n // Set default values\n this.setDefaultValues(result.knownFlags);\n\n return result;\n }\n\n /**\n * Parse flag value according to its type\n */\n private parseFlagValue(flagName: string, value: string): any {\n const flagDef = this.flagDefinitions.get(flagName);\n\n if (!flagDef) {\n return value;\n }\n\n switch (flagDef.type) {\n case \"number\":\n const num = parseFloat(value);\n if (isNaN(num)) {\n throw new Error(`Invalid number value for flag --${flagName}: ${value}`);\n }\n return num;\n\n case \"boolean\":\n if (value === \"true\" || value === \"1\") return true;\n if (value === \"false\" || value === \"0\") return false;\n return Boolean(value);\n\n case \"array\":\n if (flagDef.multiple) {\n // For multiple flags create array\n // This will be handled in main parse method\n return [value];\n }\n return value;\n\n default:\n return value;\n }\n }\n\n /**\n * Find long flag name by short flag\n */\n private findLongFlagName(shortFlag: string): string | null {\n // Simple implementation - can be extended\n for (const flagName of this.knownFlags) {\n if (flagName.startsWith(shortFlag)) {\n return flagName;\n }\n }\n return null;\n }\n\n /**\n * Set default values for flags\n */\n private setDefaultValues(flags: Record<string, any>): void {\n for (const [name, flagDef] of this.flagDefinitions) {\n if (flagDef.default !== undefined && flags[name] === undefined) {\n flags[name] = flagDef.default;\n }\n }\n }\n\n /**\n * Validate required flags\n */\n validateRequired(flags: Record<string, any>): string[] {\n const errors: string[] = [];\n\n for (const [name, flagDef] of this.flagDefinitions) {\n if (flagDef.required && flags[name] === undefined) {\n errors.push(`Required flag --${name} is missing`);\n }\n }\n\n return errors;\n }\n}\n"],"mappings":"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"}
|
|
@@ -4,30 +4,30 @@ const require_util = require("../../../../util.cjs");
|
|
|
4
4
|
const require_state = require("../../../../state.cjs");
|
|
5
5
|
const require_core = require("../../../../core.cjs");
|
|
6
6
|
const require_arg_parser = require("../arg-parser.cjs");
|
|
7
|
-
let
|
|
7
|
+
let commander = require("commander");
|
|
8
8
|
let node_path = require("node:path");
|
|
9
9
|
node_path = require_runtime.__toESM(node_path);
|
|
10
10
|
//#region src/commands/svc/create/docker/s3.ts
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const parser = new require_arg_parser.ArgParser(
|
|
30
|
-
const parsed = parser.parse(
|
|
11
|
+
const optionGroups = () => [
|
|
12
|
+
require_cmd_opts.GlobalOptions(),
|
|
13
|
+
require_cmd_opts.AddressesOptions(),
|
|
14
|
+
require_cmd_opts.S3AddressesOptions(),
|
|
15
|
+
require_cmd_opts.ImageOptions(),
|
|
16
|
+
require_cmd_opts.VersionOptions(),
|
|
17
|
+
require_cmd_opts.ArchOptions(),
|
|
18
|
+
require_cmd_opts.AuthOptions(),
|
|
19
|
+
require_cmd_opts.LicenseOptions(),
|
|
20
|
+
require_cmd_opts.MountOptions(),
|
|
21
|
+
require_cmd_opts.StorageOptions(),
|
|
22
|
+
require_cmd_opts.MinioPresignHostOptions()
|
|
23
|
+
];
|
|
24
|
+
function svcCreateDockerS3Command() {
|
|
25
|
+
const cmd = new commander.Command("s3").description("Run Platforma Backend service as docker container on current host with MinIO as local S3 storage").allowUnknownOption().allowExcessArguments();
|
|
26
|
+
cmd.argument("[args...]", "instance name followed by optional backend flags");
|
|
27
|
+
cmd.action(async () => {
|
|
28
|
+
const args = cmd.args;
|
|
29
|
+
const parser = new require_arg_parser.ArgParser(require_cmd_opts.argDefs(...optionGroups()));
|
|
30
|
+
const parsed = parser.parse(args);
|
|
31
31
|
const errors = parser.validateRequired(parsed.knownFlags);
|
|
32
32
|
if (errors.length > 0) throw new Error(`Validation errors:\n${errors.join("\n")}`);
|
|
33
33
|
const instanceName = parsed.instanceName;
|
|
@@ -71,9 +71,10 @@ var S3 = class S3 extends _oclif_core.Command {
|
|
|
71
71
|
logger.info(`Instance '${instanceName}' was created. To start it run 'up' command`);
|
|
72
72
|
if (flags["minio-presign-host"]) logger.info(" NOTE: make sure you have 'minio' host in your hosts file as 127.0.0.1 address");
|
|
73
73
|
if (backendCommands.length > 0) logger.info(`Unknown flags will be passed to backend: ${backendCommands.join(" ")}`);
|
|
74
|
-
}
|
|
75
|
-
|
|
74
|
+
});
|
|
75
|
+
return cmd;
|
|
76
|
+
}
|
|
76
77
|
//#endregion
|
|
77
|
-
exports.default =
|
|
78
|
+
exports.default = svcCreateDockerS3Command;
|
|
78
79
|
|
|
79
80
|
//# sourceMappingURL=s3.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3.cjs","names":["Command","
|
|
1
|
+
{"version":3,"file":"s3.cjs","names":["Command","ArgParser","Core","path","state"],"sources":["../../../../../src/commands/svc/create/docker/s3.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport path from \"node:path\";\nimport type * as types from \"../../../../templates/types\";\nimport Core from \"../../../../core\";\nimport * as cmdOpts from \"../../../../cmd-opts\";\nimport * as util from \"../../../../util\";\nimport state from \"../../../../state\";\nimport { ArgParser } from \"../arg-parser\";\n\nconst optionGroups = (): Parameters<typeof cmdOpts.argDefs> => [\n cmdOpts.GlobalOptions(),\n cmdOpts.AddressesOptions(),\n cmdOpts.S3AddressesOptions(),\n cmdOpts.ImageOptions(),\n cmdOpts.VersionOptions(),\n cmdOpts.ArchOptions(),\n cmdOpts.AuthOptions(),\n cmdOpts.LicenseOptions(),\n cmdOpts.MountOptions(),\n cmdOpts.StorageOptions(),\n cmdOpts.MinioPresignHostOptions(),\n];\n\nexport default function svcCreateDockerS3Command(): Command {\n const cmd = new Command(\"s3\")\n .description(\n \"Run Platforma Backend service as docker container on current host with MinIO as local S3 storage\",\n )\n .allowUnknownOption()\n .allowExcessArguments();\n\n // Unknown flags are forwarded to the backend, so parse the raw token list\n // ourselves instead of letting commander reject them.\n cmd.argument(\"[args...]\", \"instance name followed by optional backend flags\");\n\n cmd.action(async () => {\n const args = cmd.args;\n const parser = new ArgParser(cmdOpts.argDefs(...optionGroups()));\n const parsed = parser.parse(args);\n\n const errors = parser.validateRequired(parsed.knownFlags);\n if (errors.length > 0) {\n throw new Error(`Validation errors:\\n${errors.join(\"\\n\")}`);\n }\n\n const instanceName = parsed.instanceName;\n const flags = parsed.knownFlags;\n\n const backendCommands = parsed.unknownFlags;\n if (flags[\"log-level\"]) {\n backendCommands.push(`--log-level=${flags[\"log-level\"]}`);\n }\n\n if (!flags[\"s3-port\"]) flags[\"s3-port\"] = 9000;\n if (!flags[\"s3-console-port\"]) flags[\"s3-console-port\"] = 9001;\n\n const logger = util.createLogger(flags[\"log-level\"] || \"info\");\n const core = new Core(logger);\n core.mergeLicenseEnvs(flags);\n\n const authEnabled = flags[\"auth-enabled\"];\n const authOptions: types.authOptions | undefined = authEnabled\n ? {\n enabled: authEnabled,\n drivers: core.initAuthDriversList(flags, \".\"),\n }\n : undefined;\n\n const storage = flags.storage ? path.join(\".\", flags.storage) : state.instanceDir(instanceName);\n\n const mounts: { hostPath: string; containerPath?: string }[] = [];\n for (const p of flags.mount ?? []) {\n mounts.push({ hostPath: p });\n }\n\n const platformOverride = flags.arch ? `linux/${flags.arch}` : undefined;\n const presignHost = flags[\"minio-presign-host\"] ? \"minio\" : \"localhost\";\n\n core.createDockerS3(instanceName, storage, {\n image: flags.image,\n version: flags.version,\n\n license: flags[\"license\"],\n licenseFile: flags[\"license-file\"],\n\n platformOverride: platformOverride,\n customMounts: mounts,\n\n auth: authOptions,\n\n grpcAddr: flags[\"grpc-listen\"],\n grpcPort: flags[\"grpc-port\"],\n\n monitoringAddr: flags[\"monitoring-listen\"],\n monitoringPort: flags[\"monitoring-port\"],\n\n debugAddr: flags[\"debug-listen\"],\n debugPort: flags[\"debug-port\"],\n\n s3Port: flags[\"s3-port\"],\n s3ConsolePort: flags[\"s3-console-port\"],\n\n presignHost: presignHost,\n\n backendCommands: backendCommands,\n });\n\n logger.info(`Instance '${instanceName}' was created. To start it run 'up' command`);\n if (flags[\"minio-presign-host\"]) {\n logger.info(\n \" NOTE: make sure you have 'minio' host in your hosts file as 127.0.0.1 address\",\n );\n }\n\n if (backendCommands.length > 0) {\n logger.info(`Unknown flags will be passed to backend: ${backendCommands.join(\" \")}`);\n }\n });\n\n return cmd;\n}\n"],"mappings":";;;;;;;;;;AASA,MAAM,qBAAyD;iCACtC;oCACG;sCACE;gCACN;kCACE;+BACH;+BACA;kCACG;gCACF;kCACE;2CACS;CAClC;AAED,SAAwB,2BAAoC;CAC1D,MAAM,MAAM,IAAIA,UAAAA,QAAQ,KAAK,CAC1B,YACC,mGACD,CACA,oBAAoB,CACpB,sBAAsB;AAIzB,KAAI,SAAS,aAAa,mDAAmD;AAE7E,KAAI,OAAO,YAAY;EACrB,MAAM,OAAO,IAAI;EACjB,MAAM,SAAS,IAAIC,mBAAAA,UAAAA,iBAAAA,QAA0B,GAAG,cAAc,CAAC,CAAC;EAChE,MAAM,SAAS,OAAO,MAAM,KAAK;EAEjC,MAAM,SAAS,OAAO,iBAAiB,OAAO,WAAW;AACzD,MAAI,OAAO,SAAS,EAClB,OAAM,IAAI,MAAM,uBAAuB,OAAO,KAAK,KAAK,GAAG;EAG7D,MAAM,eAAe,OAAO;EAC5B,MAAM,QAAQ,OAAO;EAErB,MAAM,kBAAkB,OAAO;AAC/B,MAAI,MAAM,aACR,iBAAgB,KAAK,eAAe,MAAM,eAAe;AAG3D,MAAI,CAAC,MAAM,WAAY,OAAM,aAAa;AAC1C,MAAI,CAAC,MAAM,mBAAoB,OAAM,qBAAqB;EAE1D,MAAM,SAAA,aAAA,aAA2B,MAAM,gBAAgB,OAAO;EAC9D,MAAM,OAAO,IAAIC,aAAAA,QAAK,OAAO;AAC7B,OAAK,iBAAiB,MAAM;EAE5B,MAAM,cAAc,MAAM;EAC1B,MAAM,cAA6C,cAC/C;GACE,SAAS;GACT,SAAS,KAAK,oBAAoB,OAAO,IAAI;GAC9C,GACD,KAAA;EAEJ,MAAM,UAAU,MAAM,UAAUC,UAAAA,QAAK,KAAK,KAAK,MAAM,QAAQ,GAAGC,cAAAA,QAAM,YAAY,aAAa;EAE/F,MAAM,SAAyD,EAAE;AACjE,OAAK,MAAM,KAAK,MAAM,SAAS,EAAE,CAC/B,QAAO,KAAK,EAAE,UAAU,GAAG,CAAC;EAG9B,MAAM,mBAAmB,MAAM,OAAO,SAAS,MAAM,SAAS,KAAA;EAC9D,MAAM,cAAc,MAAM,wBAAwB,UAAU;AAE5D,OAAK,eAAe,cAAc,SAAS;GACzC,OAAO,MAAM;GACb,SAAS,MAAM;GAEf,SAAS,MAAM;GACf,aAAa,MAAM;GAED;GAClB,cAAc;GAEd,MAAM;GAEN,UAAU,MAAM;GAChB,UAAU,MAAM;GAEhB,gBAAgB,MAAM;GACtB,gBAAgB,MAAM;GAEtB,WAAW,MAAM;GACjB,WAAW,MAAM;GAEjB,QAAQ,MAAM;GACd,eAAe,MAAM;GAER;GAEI;GAClB,CAAC;AAEF,SAAO,KAAK,aAAa,aAAa,6CAA6C;AACnF,MAAI,MAAM,sBACR,QAAO,KACL,kFACD;AAGH,MAAI,gBAAgB,SAAS,EAC3B,QAAO,KAAK,4CAA4C,gBAAgB,KAAK,IAAI,GAAG;GAEtF;AAEF,QAAO"}
|
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { AddressesOptions, ArchOptions, AuthOptions, GlobalOptions, ImageOptions, LicenseOptions, MinioPresignHostOptions, MountOptions, S3AddressesOptions, StorageOptions, VersionOptions, argDefs } from "../../../../cmd-opts.js";
|
|
2
2
|
import { createLogger } from "../../../../util.js";
|
|
3
3
|
import state_default from "../../../../state.js";
|
|
4
4
|
import Core from "../../../../core.js";
|
|
5
5
|
import { ArgParser } from "../arg-parser.js";
|
|
6
|
-
import {
|
|
6
|
+
import { Command } from "commander";
|
|
7
7
|
import path from "node:path";
|
|
8
8
|
//#region src/commands/svc/create/docker/s3.ts
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const parser = new ArgParser(
|
|
28
|
-
const parsed = parser.parse(
|
|
9
|
+
const optionGroups = () => [
|
|
10
|
+
GlobalOptions(),
|
|
11
|
+
AddressesOptions(),
|
|
12
|
+
S3AddressesOptions(),
|
|
13
|
+
ImageOptions(),
|
|
14
|
+
VersionOptions(),
|
|
15
|
+
ArchOptions(),
|
|
16
|
+
AuthOptions(),
|
|
17
|
+
LicenseOptions(),
|
|
18
|
+
MountOptions(),
|
|
19
|
+
StorageOptions(),
|
|
20
|
+
MinioPresignHostOptions()
|
|
21
|
+
];
|
|
22
|
+
function svcCreateDockerS3Command() {
|
|
23
|
+
const cmd = new Command("s3").description("Run Platforma Backend service as docker container on current host with MinIO as local S3 storage").allowUnknownOption().allowExcessArguments();
|
|
24
|
+
cmd.argument("[args...]", "instance name followed by optional backend flags");
|
|
25
|
+
cmd.action(async () => {
|
|
26
|
+
const args = cmd.args;
|
|
27
|
+
const parser = new ArgParser(argDefs(...optionGroups()));
|
|
28
|
+
const parsed = parser.parse(args);
|
|
29
29
|
const errors = parser.validateRequired(parsed.knownFlags);
|
|
30
30
|
if (errors.length > 0) throw new Error(`Validation errors:\n${errors.join("\n")}`);
|
|
31
31
|
const instanceName = parsed.instanceName;
|
|
@@ -69,9 +69,10 @@ var S3 = class S3 extends Command {
|
|
|
69
69
|
logger.info(`Instance '${instanceName}' was created. To start it run 'up' command`);
|
|
70
70
|
if (flags["minio-presign-host"]) logger.info(" NOTE: make sure you have 'minio' host in your hosts file as 127.0.0.1 address");
|
|
71
71
|
if (backendCommands.length > 0) logger.info(`Unknown flags will be passed to backend: ${backendCommands.join(" ")}`);
|
|
72
|
-
}
|
|
73
|
-
|
|
72
|
+
});
|
|
73
|
+
return cmd;
|
|
74
|
+
}
|
|
74
75
|
//#endregion
|
|
75
|
-
export {
|
|
76
|
+
export { svcCreateDockerS3Command as default };
|
|
76
77
|
|
|
77
78
|
//# sourceMappingURL=s3.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3.js","names":["cmdOpts.
|
|
1
|
+
{"version":3,"file":"s3.js","names":["cmdOpts.GlobalOptions","cmdOpts.AddressesOptions","cmdOpts.S3AddressesOptions","cmdOpts.ImageOptions","cmdOpts.VersionOptions","cmdOpts.ArchOptions","cmdOpts.AuthOptions","cmdOpts.LicenseOptions","cmdOpts.MountOptions","cmdOpts.StorageOptions","cmdOpts.MinioPresignHostOptions","cmdOpts.argDefs","util.createLogger","state"],"sources":["../../../../../src/commands/svc/create/docker/s3.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport path from \"node:path\";\nimport type * as types from \"../../../../templates/types\";\nimport Core from \"../../../../core\";\nimport * as cmdOpts from \"../../../../cmd-opts\";\nimport * as util from \"../../../../util\";\nimport state from \"../../../../state\";\nimport { ArgParser } from \"../arg-parser\";\n\nconst optionGroups = (): Parameters<typeof cmdOpts.argDefs> => [\n cmdOpts.GlobalOptions(),\n cmdOpts.AddressesOptions(),\n cmdOpts.S3AddressesOptions(),\n cmdOpts.ImageOptions(),\n cmdOpts.VersionOptions(),\n cmdOpts.ArchOptions(),\n cmdOpts.AuthOptions(),\n cmdOpts.LicenseOptions(),\n cmdOpts.MountOptions(),\n cmdOpts.StorageOptions(),\n cmdOpts.MinioPresignHostOptions(),\n];\n\nexport default function svcCreateDockerS3Command(): Command {\n const cmd = new Command(\"s3\")\n .description(\n \"Run Platforma Backend service as docker container on current host with MinIO as local S3 storage\",\n )\n .allowUnknownOption()\n .allowExcessArguments();\n\n // Unknown flags are forwarded to the backend, so parse the raw token list\n // ourselves instead of letting commander reject them.\n cmd.argument(\"[args...]\", \"instance name followed by optional backend flags\");\n\n cmd.action(async () => {\n const args = cmd.args;\n const parser = new ArgParser(cmdOpts.argDefs(...optionGroups()));\n const parsed = parser.parse(args);\n\n const errors = parser.validateRequired(parsed.knownFlags);\n if (errors.length > 0) {\n throw new Error(`Validation errors:\\n${errors.join(\"\\n\")}`);\n }\n\n const instanceName = parsed.instanceName;\n const flags = parsed.knownFlags;\n\n const backendCommands = parsed.unknownFlags;\n if (flags[\"log-level\"]) {\n backendCommands.push(`--log-level=${flags[\"log-level\"]}`);\n }\n\n if (!flags[\"s3-port\"]) flags[\"s3-port\"] = 9000;\n if (!flags[\"s3-console-port\"]) flags[\"s3-console-port\"] = 9001;\n\n const logger = util.createLogger(flags[\"log-level\"] || \"info\");\n const core = new Core(logger);\n core.mergeLicenseEnvs(flags);\n\n const authEnabled = flags[\"auth-enabled\"];\n const authOptions: types.authOptions | undefined = authEnabled\n ? {\n enabled: authEnabled,\n drivers: core.initAuthDriversList(flags, \".\"),\n }\n : undefined;\n\n const storage = flags.storage ? path.join(\".\", flags.storage) : state.instanceDir(instanceName);\n\n const mounts: { hostPath: string; containerPath?: string }[] = [];\n for (const p of flags.mount ?? []) {\n mounts.push({ hostPath: p });\n }\n\n const platformOverride = flags.arch ? `linux/${flags.arch}` : undefined;\n const presignHost = flags[\"minio-presign-host\"] ? \"minio\" : \"localhost\";\n\n core.createDockerS3(instanceName, storage, {\n image: flags.image,\n version: flags.version,\n\n license: flags[\"license\"],\n licenseFile: flags[\"license-file\"],\n\n platformOverride: platformOverride,\n customMounts: mounts,\n\n auth: authOptions,\n\n grpcAddr: flags[\"grpc-listen\"],\n grpcPort: flags[\"grpc-port\"],\n\n monitoringAddr: flags[\"monitoring-listen\"],\n monitoringPort: flags[\"monitoring-port\"],\n\n debugAddr: flags[\"debug-listen\"],\n debugPort: flags[\"debug-port\"],\n\n s3Port: flags[\"s3-port\"],\n s3ConsolePort: flags[\"s3-console-port\"],\n\n presignHost: presignHost,\n\n backendCommands: backendCommands,\n });\n\n logger.info(`Instance '${instanceName}' was created. To start it run 'up' command`);\n if (flags[\"minio-presign-host\"]) {\n logger.info(\n \" NOTE: make sure you have 'minio' host in your hosts file as 127.0.0.1 address\",\n );\n }\n\n if (backendCommands.length > 0) {\n logger.info(`Unknown flags will be passed to backend: ${backendCommands.join(\" \")}`);\n }\n });\n\n return cmd;\n}\n"],"mappings":";;;;;;;;AASA,MAAM,qBAAyD;CAC7DA,eAAuB;CACvBC,kBAA0B;CAC1BC,oBAA4B;CAC5BC,cAAsB;CACtBC,gBAAwB;CACxBC,aAAqB;CACrBC,aAAqB;CACrBC,gBAAwB;CACxBC,cAAsB;CACtBC,gBAAwB;CACxBC,yBAAiC;CAClC;AAED,SAAwB,2BAAoC;CAC1D,MAAM,MAAM,IAAI,QAAQ,KAAK,CAC1B,YACC,mGACD,CACA,oBAAoB,CACpB,sBAAsB;AAIzB,KAAI,SAAS,aAAa,mDAAmD;AAE7E,KAAI,OAAO,YAAY;EACrB,MAAM,OAAO,IAAI;EACjB,MAAM,SAAS,IAAI,UAAUC,QAAgB,GAAG,cAAc,CAAC,CAAC;EAChE,MAAM,SAAS,OAAO,MAAM,KAAK;EAEjC,MAAM,SAAS,OAAO,iBAAiB,OAAO,WAAW;AACzD,MAAI,OAAO,SAAS,EAClB,OAAM,IAAI,MAAM,uBAAuB,OAAO,KAAK,KAAK,GAAG;EAG7D,MAAM,eAAe,OAAO;EAC5B,MAAM,QAAQ,OAAO;EAErB,MAAM,kBAAkB,OAAO;AAC/B,MAAI,MAAM,aACR,iBAAgB,KAAK,eAAe,MAAM,eAAe;AAG3D,MAAI,CAAC,MAAM,WAAY,OAAM,aAAa;AAC1C,MAAI,CAAC,MAAM,mBAAoB,OAAM,qBAAqB;EAE1D,MAAM,SAASC,aAAkB,MAAM,gBAAgB,OAAO;EAC9D,MAAM,OAAO,IAAI,KAAK,OAAO;AAC7B,OAAK,iBAAiB,MAAM;EAE5B,MAAM,cAAc,MAAM;EAC1B,MAAM,cAA6C,cAC/C;GACE,SAAS;GACT,SAAS,KAAK,oBAAoB,OAAO,IAAI;GAC9C,GACD,KAAA;EAEJ,MAAM,UAAU,MAAM,UAAU,KAAK,KAAK,KAAK,MAAM,QAAQ,GAAGC,cAAM,YAAY,aAAa;EAE/F,MAAM,SAAyD,EAAE;AACjE,OAAK,MAAM,KAAK,MAAM,SAAS,EAAE,CAC/B,QAAO,KAAK,EAAE,UAAU,GAAG,CAAC;EAG9B,MAAM,mBAAmB,MAAM,OAAO,SAAS,MAAM,SAAS,KAAA;EAC9D,MAAM,cAAc,MAAM,wBAAwB,UAAU;AAE5D,OAAK,eAAe,cAAc,SAAS;GACzC,OAAO,MAAM;GACb,SAAS,MAAM;GAEf,SAAS,MAAM;GACf,aAAa,MAAM;GAED;GAClB,cAAc;GAEd,MAAM;GAEN,UAAU,MAAM;GAChB,UAAU,MAAM;GAEhB,gBAAgB,MAAM;GACtB,gBAAgB,MAAM;GAEtB,WAAW,MAAM;GACjB,WAAW,MAAM;GAEjB,QAAQ,MAAM;GACd,eAAe,MAAM;GAER;GAEI;GAClB,CAAC;AAEF,SAAO,KAAK,aAAa,aAAa,6CAA6C;AACnF,MAAI,MAAM,sBACR,QAAO,KACL,kFACD;AAGH,MAAI,gBAAgB,SAAS,EAC3B,QAAO,KAAK,4CAA4C,gBAAgB,KAAK,IAAI,GAAG;GAEtF;AAEF,QAAO"}
|
|
@@ -4,31 +4,31 @@ const require_util = require("../../../util.cjs");
|
|
|
4
4
|
const require_state = require("../../../state.cjs");
|
|
5
5
|
const require_core = require("../../../core.cjs");
|
|
6
6
|
const require_arg_parser = require("./arg-parser.cjs");
|
|
7
|
-
let
|
|
7
|
+
let commander = require("commander");
|
|
8
8
|
let node_path = require("node:path");
|
|
9
9
|
node_path = require_runtime.__toESM(node_path);
|
|
10
10
|
//#region src/commands/svc/create/docker.ts
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const parser = new require_arg_parser.ArgParser(
|
|
31
|
-
const parsed = parser.parse(
|
|
11
|
+
const optionGroups = () => [
|
|
12
|
+
require_cmd_opts.GlobalOptions(),
|
|
13
|
+
require_cmd_opts.AddressesOptions(),
|
|
14
|
+
require_cmd_opts.ImageOptions(),
|
|
15
|
+
require_cmd_opts.VersionOptions(),
|
|
16
|
+
require_cmd_opts.ArchOptions(),
|
|
17
|
+
require_cmd_opts.AuthOptions(),
|
|
18
|
+
require_cmd_opts.LicenseOptions(),
|
|
19
|
+
require_cmd_opts.MountOptions(),
|
|
20
|
+
require_cmd_opts.StorageOptions(),
|
|
21
|
+
require_cmd_opts.StoragePrimaryURLOptions(),
|
|
22
|
+
require_cmd_opts.StorageWorkPathOptions(),
|
|
23
|
+
require_cmd_opts.StorageLibraryURLOptions()
|
|
24
|
+
];
|
|
25
|
+
function svcCreateDockerCommand() {
|
|
26
|
+
const cmd = new commander.Command("docker").description("Run Platforma Backend service as docker container on current host").allowUnknownOption().allowExcessArguments();
|
|
27
|
+
cmd.argument("[args...]", "instance name followed by optional backend flags");
|
|
28
|
+
cmd.action(async () => {
|
|
29
|
+
const args = cmd.args;
|
|
30
|
+
const parser = new require_arg_parser.ArgParser(require_cmd_opts.argDefs(...optionGroups()));
|
|
31
|
+
const parsed = parser.parse(args);
|
|
32
32
|
const errors = parser.validateRequired(parsed.knownFlags);
|
|
33
33
|
if (errors.length > 0) throw new Error(`Validation errors:\n${errors.join("\n")}`);
|
|
34
34
|
const instanceName = parsed.instanceName;
|
|
@@ -75,9 +75,10 @@ var Docker = class Docker extends _oclif_core.Command {
|
|
|
75
75
|
});
|
|
76
76
|
logger.info(`Instance '${instanceName}' was created. To start it run 'up' command`);
|
|
77
77
|
if (backendCommands.length > 0) logger.info(`Unknown flags will be passed to backend: ${backendCommands.join(" ")}`);
|
|
78
|
-
}
|
|
79
|
-
|
|
78
|
+
});
|
|
79
|
+
return cmd;
|
|
80
|
+
}
|
|
80
81
|
//#endregion
|
|
81
|
-
exports.default =
|
|
82
|
+
exports.default = svcCreateDockerCommand;
|
|
82
83
|
|
|
83
84
|
//# sourceMappingURL=docker.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker.cjs","names":["Command","
|
|
1
|
+
{"version":3,"file":"docker.cjs","names":["Command","ArgParser","Core","path","state"],"sources":["../../../../src/commands/svc/create/docker.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport path from \"node:path\";\nimport type * as types from \"../../../templates/types\";\nimport Core from \"../../../core\";\nimport * as cmdOpts from \"../../../cmd-opts\";\nimport * as util from \"../../../util\";\nimport state from \"../../../state\";\nimport { ArgParser } from \"./arg-parser\";\n\nconst optionGroups = (): Parameters<typeof cmdOpts.argDefs> => [\n cmdOpts.GlobalOptions(),\n cmdOpts.AddressesOptions(),\n cmdOpts.ImageOptions(),\n cmdOpts.VersionOptions(),\n cmdOpts.ArchOptions(),\n cmdOpts.AuthOptions(),\n cmdOpts.LicenseOptions(),\n cmdOpts.MountOptions(),\n cmdOpts.StorageOptions(),\n cmdOpts.StoragePrimaryURLOptions(),\n cmdOpts.StorageWorkPathOptions(),\n cmdOpts.StorageLibraryURLOptions(),\n];\n\nexport default function svcCreateDockerCommand(): Command {\n const cmd = new Command(\"docker\")\n .description(\"Run Platforma Backend service as docker container on current host\")\n .allowUnknownOption()\n .allowExcessArguments();\n\n // Unknown flags are forwarded to the backend, so parse the raw token list\n // ourselves instead of letting commander reject them.\n cmd.argument(\"[args...]\", \"instance name followed by optional backend flags\");\n\n cmd.action(async () => {\n const args = cmd.args;\n const parser = new ArgParser(cmdOpts.argDefs(...optionGroups()));\n const parsed = parser.parse(args);\n\n const errors = parser.validateRequired(parsed.knownFlags);\n if (errors.length > 0) {\n throw new Error(`Validation errors:\\n${errors.join(\"\\n\")}`);\n }\n\n const instanceName = parsed.instanceName;\n const flags = parsed.knownFlags;\n const backendCommands = parsed.unknownFlags;\n if (flags[\"log-level\"]) {\n backendCommands.push(`--log-level=${flags[\"log-level\"]}`);\n }\n\n if (!flags[\"log-level\"]) flags[\"log-level\"] = \"info\";\n if (!flags[\"grpc-port\"]) flags[\"grpc-port\"] = 6345;\n if (!flags[\"grpc-listen\"]) flags[\"grpc-listen\"] = \"127.0.0.1:6345\";\n if (!flags[\"monitoring-port\"]) flags[\"monitoring-port\"] = 9090;\n if (!flags[\"monitoring-listen\"]) flags[\"monitoring-listen\"] = \"127.0.0.1:9090\";\n if (!flags[\"debug-port\"]) flags[\"debug-port\"] = 9091;\n if (!flags[\"debug-listen\"]) flags[\"debug-listen\"] = \"127.0.0.1:9091\";\n\n const logger = util.createLogger(flags[\"log-level\"] || \"info\");\n const core = new Core(logger);\n core.mergeLicenseEnvs(flags);\n\n const authEnabled = flags[\"auth-enabled\"];\n const authOptions: types.authOptions | undefined = authEnabled\n ? {\n enabled: authEnabled,\n drivers: core.initAuthDriversList(flags, \".\"),\n }\n : undefined;\n\n const storage = flags.storage ? path.join(\".\", flags.storage) : state.instanceDir(instanceName);\n\n const mounts: { hostPath: string; containerPath?: string }[] = [];\n for (const p of flags.mount ?? []) {\n mounts.push({ hostPath: p });\n }\n\n const platformOverride = flags.arch ? `linux/${flags.arch}` : undefined;\n\n core.createDocker(instanceName, storage, {\n primaryStorageURL: flags[\"storage-primary\"],\n workStoragePath: flags[\"storage-work\"],\n libraryStorageURL: flags[\"storage-library\"],\n\n image: flags.image,\n version: flags.version,\n\n platformOverride: platformOverride,\n customMounts: mounts,\n\n license: flags[\"license\"],\n licenseFile: flags[\"license-file\"],\n\n auth: authOptions,\n\n grpcAddr: flags[\"grpc-listen\"],\n grpcPort: flags[\"grpc-port\"],\n\n monitoringAddr: flags[\"monitoring-listen\"],\n monitoringPort: flags[\"monitoring-port\"],\n\n debugAddr: flags[\"debug-listen\"],\n debugPort: flags[\"debug-port\"],\n\n backendCommands: backendCommands,\n });\n\n logger.info(`Instance '${instanceName}' was created. To start it run 'up' command`);\n\n if (backendCommands.length > 0) {\n logger.info(`Unknown flags will be passed to backend: ${backendCommands.join(\" \")}`);\n }\n });\n\n return cmd;\n}\n"],"mappings":";;;;;;;;;;AASA,MAAM,qBAAyD;iCACtC;oCACG;gCACJ;kCACE;+BACH;+BACA;kCACG;gCACF;kCACE;4CACU;0CACF;4CACE;CACnC;AAED,SAAwB,yBAAkC;CACxD,MAAM,MAAM,IAAIA,UAAAA,QAAQ,SAAS,CAC9B,YAAY,oEAAoE,CAChF,oBAAoB,CACpB,sBAAsB;AAIzB,KAAI,SAAS,aAAa,mDAAmD;AAE7E,KAAI,OAAO,YAAY;EACrB,MAAM,OAAO,IAAI;EACjB,MAAM,SAAS,IAAIC,mBAAAA,UAAAA,iBAAAA,QAA0B,GAAG,cAAc,CAAC,CAAC;EAChE,MAAM,SAAS,OAAO,MAAM,KAAK;EAEjC,MAAM,SAAS,OAAO,iBAAiB,OAAO,WAAW;AACzD,MAAI,OAAO,SAAS,EAClB,OAAM,IAAI,MAAM,uBAAuB,OAAO,KAAK,KAAK,GAAG;EAG7D,MAAM,eAAe,OAAO;EAC5B,MAAM,QAAQ,OAAO;EACrB,MAAM,kBAAkB,OAAO;AAC/B,MAAI,MAAM,aACR,iBAAgB,KAAK,eAAe,MAAM,eAAe;AAG3D,MAAI,CAAC,MAAM,aAAc,OAAM,eAAe;AAC9C,MAAI,CAAC,MAAM,aAAc,OAAM,eAAe;AAC9C,MAAI,CAAC,MAAM,eAAgB,OAAM,iBAAiB;AAClD,MAAI,CAAC,MAAM,mBAAoB,OAAM,qBAAqB;AAC1D,MAAI,CAAC,MAAM,qBAAsB,OAAM,uBAAuB;AAC9D,MAAI,CAAC,MAAM,cAAe,OAAM,gBAAgB;AAChD,MAAI,CAAC,MAAM,gBAAiB,OAAM,kBAAkB;EAEpD,MAAM,SAAA,aAAA,aAA2B,MAAM,gBAAgB,OAAO;EAC9D,MAAM,OAAO,IAAIC,aAAAA,QAAK,OAAO;AAC7B,OAAK,iBAAiB,MAAM;EAE5B,MAAM,cAAc,MAAM;EAC1B,MAAM,cAA6C,cAC/C;GACE,SAAS;GACT,SAAS,KAAK,oBAAoB,OAAO,IAAI;GAC9C,GACD,KAAA;EAEJ,MAAM,UAAU,MAAM,UAAUC,UAAAA,QAAK,KAAK,KAAK,MAAM,QAAQ,GAAGC,cAAAA,QAAM,YAAY,aAAa;EAE/F,MAAM,SAAyD,EAAE;AACjE,OAAK,MAAM,KAAK,MAAM,SAAS,EAAE,CAC/B,QAAO,KAAK,EAAE,UAAU,GAAG,CAAC;EAG9B,MAAM,mBAAmB,MAAM,OAAO,SAAS,MAAM,SAAS,KAAA;AAE9D,OAAK,aAAa,cAAc,SAAS;GACvC,mBAAmB,MAAM;GACzB,iBAAiB,MAAM;GACvB,mBAAmB,MAAM;GAEzB,OAAO,MAAM;GACb,SAAS,MAAM;GAEG;GAClB,cAAc;GAEd,SAAS,MAAM;GACf,aAAa,MAAM;GAEnB,MAAM;GAEN,UAAU,MAAM;GAChB,UAAU,MAAM;GAEhB,gBAAgB,MAAM;GACtB,gBAAgB,MAAM;GAEtB,WAAW,MAAM;GACjB,WAAW,MAAM;GAEA;GAClB,CAAC;AAEF,SAAO,KAAK,aAAa,aAAa,6CAA6C;AAEnF,MAAI,gBAAgB,SAAS,EAC3B,QAAO,KAAK,4CAA4C,gBAAgB,KAAK,IAAI,GAAG;GAEtF;AAEF,QAAO"}
|