@platforma-sdk/bootstrap 3.5.21 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/compose-backend.yaml +119 -49
- package/dist/commands/svc/create/arg-parser.cjs +175 -0
- package/dist/commands/svc/create/arg-parser.cjs.map +1 -0
- package/dist/commands/svc/create/arg-parser.d.ts +42 -0
- package/dist/commands/svc/create/arg-parser.js +173 -0
- package/dist/commands/svc/create/arg-parser.js.map +1 -0
- package/dist/commands/svc/create/docker/s3.cjs +26 -3
- package/dist/commands/svc/create/docker/s3.cjs.map +1 -1
- package/dist/commands/svc/create/docker/s3.js +26 -3
- package/dist/commands/svc/create/docker/s3.js.map +1 -1
- package/dist/commands/svc/create/docker.cjs +36 -3
- package/dist/commands/svc/create/docker.cjs.map +1 -1
- package/dist/commands/svc/create/docker.js +36 -3
- package/dist/commands/svc/create/docker.js.map +1 -1
- package/dist/commands/svc/create/local/s3.cjs +21 -3
- package/dist/commands/svc/create/local/s3.cjs.map +1 -1
- package/dist/commands/svc/create/local/s3.js +21 -3
- package/dist/commands/svc/create/local/s3.js.map +1 -1
- package/dist/commands/svc/create/local.cjs +51 -28
- package/dist/commands/svc/create/local.cjs.map +1 -1
- package/dist/commands/svc/create/local.js +51 -28
- package/dist/commands/svc/create/local.js.map +1 -1
- package/dist/core.cjs +174 -44
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.ts +3 -0
- package/dist/core.js +198 -68
- package/dist/core.js.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +8 -8
- package/dist/index.js.map +1 -1
- package/dist/package.cjs +21 -2
- package/dist/package.cjs.map +1 -1
- package/dist/package.js +2 -2
- package/dist/package.js.map +1 -1
- package/dist/platforma.js +9 -9
- package/dist/platforma.js.map +1 -1
- package/dist/state.js +13 -13
- package/dist/state.js.map +1 -1
- package/dist/templates/compose.cjs +3 -0
- package/dist/templates/compose.cjs.map +1 -1
- package/dist/templates/compose.d.ts +1 -0
- package/dist/templates/compose.js +6 -3
- package/dist/templates/compose.js.map +1 -1
- package/dist/templates/pl-config.cjs +2 -2
- package/dist/templates/pl-config.cjs.map +1 -1
- package/dist/templates/pl-config.js +4 -4
- package/dist/templates/pl-config.js.map +1 -1
- package/dist/util.js +4 -4
- package/dist/util.js.map +1 -1
- package/package.json +4 -4
package/dist/state.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import os__default from 'node:os';
|
|
2
|
-
import
|
|
2
|
+
import fs__default from 'node:fs';
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import { readFileSync } from './package.js';
|
|
5
5
|
import { assertNever, getDockerComposeInfo, getProcessName } from './util.js';
|
|
@@ -16,10 +16,10 @@ class State {
|
|
|
16
16
|
const stateFile = path.join(stateDir, 'state.json');
|
|
17
17
|
this.dirPath = stateDir;
|
|
18
18
|
this.filePath = stateFile;
|
|
19
|
-
if (!
|
|
20
|
-
|
|
19
|
+
if (!fs__default.existsSync(stateDir)) {
|
|
20
|
+
fs__default.mkdirSync(stateDir, { recursive: true });
|
|
21
21
|
}
|
|
22
|
-
if (
|
|
22
|
+
if (fs__default.existsSync(stateFile)) {
|
|
23
23
|
this.state = JSON.parse(readFileSync(stateFile).toString());
|
|
24
24
|
}
|
|
25
25
|
}
|
|
@@ -42,21 +42,21 @@ class State {
|
|
|
42
42
|
return this.path('binaries', ...p);
|
|
43
43
|
}
|
|
44
44
|
writeState() {
|
|
45
|
-
|
|
45
|
+
fs__default.writeFileSync(this.filePath, JSON.stringify(this.state));
|
|
46
46
|
}
|
|
47
47
|
get instanceList() {
|
|
48
|
-
if (!
|
|
48
|
+
if (!fs__default.existsSync(this.instanceDir())) {
|
|
49
49
|
return [];
|
|
50
50
|
}
|
|
51
|
-
const list =
|
|
51
|
+
const list = fs__default.readdirSync(this.instanceDir());
|
|
52
52
|
return list.filter((iName) => this.instanceExists(iName));
|
|
53
53
|
}
|
|
54
54
|
instanceExists(name) {
|
|
55
|
-
return
|
|
55
|
+
return fs__default.existsSync(this.instanceDir(name, 'instance.json'));
|
|
56
56
|
}
|
|
57
57
|
getInstanceInfo(name) {
|
|
58
58
|
const instanceInfoFile = this.instanceDir(name, 'instance.json');
|
|
59
|
-
if (!
|
|
59
|
+
if (!fs__default.existsSync(instanceInfoFile)) {
|
|
60
60
|
throw new Error(`platforma backend instance '${name}' does not exist or is corrupted`);
|
|
61
61
|
}
|
|
62
62
|
const jsonInfo = JSON.parse(readFileSync(instanceInfoFile).toString());
|
|
@@ -66,15 +66,15 @@ class State {
|
|
|
66
66
|
};
|
|
67
67
|
}
|
|
68
68
|
setInstanceInfo(instanceName, info) {
|
|
69
|
-
if (!
|
|
70
|
-
|
|
69
|
+
if (!fs__default.existsSync(this.instanceDir(instanceName))) {
|
|
70
|
+
fs__default.mkdirSync(this.instanceDir(instanceName), { recursive: true });
|
|
71
71
|
}
|
|
72
72
|
const instanceInfoFile = this.instanceDir(instanceName, 'instance.json');
|
|
73
73
|
let oldInfo = {};
|
|
74
|
-
if (
|
|
74
|
+
if (fs__default.existsSync(instanceInfoFile)) {
|
|
75
75
|
oldInfo = JSON.parse(readFileSync(instanceInfoFile).toString());
|
|
76
76
|
}
|
|
77
|
-
|
|
77
|
+
fs__default.writeFileSync(instanceInfoFile, JSON.stringify({ ...oldInfo, ...info }));
|
|
78
78
|
}
|
|
79
79
|
isInstanceActive(instance) {
|
|
80
80
|
const iType = instance.type;
|
package/dist/state.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sources":["../src/state.ts"],"sourcesContent":["import os from 'node:os';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport * as pkg from './package';\nimport * as util from './util';\nimport type { SpawnOptions } from 'node:child_process';\nimport type * as types from './templates/types';\n\nexport type runInfo = {\n configPath?: string;\n apiPort?: number;\n apiAddr?: string;\n logPath?: string;\n dbPath?: string;\n primary?: types.storageOptions;\n work?: types.fsStorageOptions;\n library?: types.storageOptions;\n};\n\nexport type instanceCommand = {\n async?: boolean;\n cmd: string;\n args: readonly string[];\n envs?: NodeJS.ProcessEnv;\n workdir?: string;\n runOpts: SpawnOptions;\n};\n\nexport type commmonInstanceInfo = {\n name: string;\n upCommands: instanceCommand[];\n downCommands: instanceCommand[];\n cleanupCommands: instanceCommand[];\n runInfo?: runInfo;\n};\n\nexport type dockerInstanceInfo = commmonInstanceInfo & {\n type: 'docker';\n};\nexport type processInstanceInfo = commmonInstanceInfo & {\n type: 'process';\n pid?: number;\n};\n\nexport type instanceInfo = dockerInstanceInfo | processInstanceInfo;\nexport type jsonInstanceInfo = Omit<dockerInstanceInfo, 'name' | 'isActive'> | Omit<processInstanceInfo, 'name' | 'isActive'>;\n\nexport function reset() {\n fs.rmSync(State.getStateInstance().filePath);\n}\n\ntype state = {\n currentInstance: string;\n};\n\nclass State {\n private static instance: State;\n\n private state: state = {\n currentInstance: '',\n };\n\n public readonly filePath: string;\n private readonly dirPath: string;\n\n constructor(stateDir?: string) {\n stateDir = stateDir ?? path.resolve(os.homedir(), '.config', 'pl-bootstrap');\n\n const stateFile = path.join(stateDir, 'state.json');\n\n this.dirPath = stateDir;\n this.filePath = stateFile;\n\n if (!fs.existsSync(stateDir)) {\n fs.mkdirSync(stateDir, { recursive: true });\n }\n\n if (fs.existsSync(stateFile)) {\n this.state = JSON.parse(pkg.readFileSync(stateFile).toString()) as state;\n }\n }\n\n public static getStateInstance(): State {\n if (!State.instance) {\n State.instance = new State();\n }\n\n return State.instance;\n }\n\n public path(...p: string[]): string {\n return path.join(this.dirPath, ...p);\n }\n\n public instanceDir(name?: string, ...p: string[]): string {\n if (name) {\n return this.path('data', name, ...p);\n }\n\n return this.path('data');\n }\n\n public binaries(...p: string[]): string {\n return this.path('binaries', ...p);\n }\n\n private writeState() {\n fs.writeFileSync(this.filePath, JSON.stringify(this.state));\n }\n\n get instanceList(): string[] {\n if (!fs.existsSync(this.instanceDir())) {\n return [];\n }\n\n const list = fs.readdirSync(this.instanceDir());\n\n return list.filter((iName) => this.instanceExists(iName));\n }\n\n instanceExists(name: string): boolean {\n return fs.existsSync(this.instanceDir(name, 'instance.json'));\n }\n\n public getInstanceInfo(name: string): instanceInfo {\n const instanceInfoFile = this.instanceDir(name, 'instance.json');\n if (!fs.existsSync(instanceInfoFile)) {\n throw new Error(`platforma backend instance '${name}' does not exist or is corrupted`);\n }\n\n const jsonInfo = JSON.parse(pkg.readFileSync(instanceInfoFile).toString()) as jsonInstanceInfo;\n return {\n name: name,\n ...jsonInfo,\n };\n }\n\n public setInstanceInfo(instanceName: string, info: jsonInstanceInfo) {\n if (!fs.existsSync(this.instanceDir(instanceName))) {\n fs.mkdirSync(this.instanceDir(instanceName), { recursive: true });\n }\n\n const instanceInfoFile = this.instanceDir(instanceName, 'instance.json');\n let oldInfo: object = {};\n\n if (fs.existsSync(instanceInfoFile)) {\n oldInfo = JSON.parse(pkg.readFileSync(instanceInfoFile).toString()) as object;\n }\n\n fs.writeFileSync(instanceInfoFile, JSON.stringify({ ...oldInfo, ...info }));\n }\n\n public isInstanceActive(instance: instanceInfo): boolean {\n const iType = instance.type;\n switch (iType) {\n case 'docker': {\n const i = util.getDockerComposeInfo(`pl-${instance.name}`);\n if (!i) {\n return false;\n }\n return i.Status.trim().startsWith('running');\n }\n\n case 'process': {\n if (!instance.pid) {\n return false;\n }\n return isValidPID(instance.pid);\n }\n\n default:\n util.assertNever(iType);\n throw new Error('cli logic error: unknown service type, cannot check its state');\n }\n }\n\n get isActive(): boolean {\n for (const iName of this.instanceList) {\n const instance = this.getInstanceInfo(iName);\n if (this.isInstanceActive(instance)) {\n return true;\n }\n }\n\n return false;\n }\n\n public isValidPID(pid: number): boolean {\n return isValidPID(pid);\n }\n\n get currentInstance(): instanceInfo | undefined {\n const name = this.state.currentInstance;\n if (name && this.instanceExists(name)) {\n return this.getInstanceInfo(name);\n }\n\n return undefined;\n }\n\n get currentInstanceName(): string {\n return this.state.currentInstance;\n }\n\n set currentInstanceName(name: string) {\n this.state.currentInstance = name;\n this.writeState();\n }\n\n selectInstance(name: string) {\n if (!this.instanceExists(name)) {\n throw new Error(`instance '${name}' does not exist`);\n }\n this.state.currentInstance = name;\n this.writeState();\n }\n}\n\nfunction isValidPID(pid: number): boolean {\n const processName = util.getProcessName(pid);\n return processName === 'platforma' || processName.endsWith('/platforma') || processName.endsWith('\\\\platforma');\n}\n\nexport default State.getStateInstance();\n"],"names":["os","pkg.readFileSync","util.getDockerComposeInfo","util.assertNever","util.getProcessName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"state.js","sources":["../src/state.ts"],"sourcesContent":["import os from 'node:os';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport * as pkg from './package';\nimport * as util from './util';\nimport type { SpawnOptions } from 'node:child_process';\nimport type * as types from './templates/types';\n\nexport type runInfo = {\n configPath?: string;\n apiPort?: number;\n apiAddr?: string;\n logPath?: string;\n dbPath?: string;\n primary?: types.storageOptions;\n work?: types.fsStorageOptions;\n library?: types.storageOptions;\n};\n\nexport type instanceCommand = {\n async?: boolean;\n cmd: string;\n args: readonly string[];\n envs?: NodeJS.ProcessEnv;\n workdir?: string;\n runOpts: SpawnOptions;\n};\n\nexport type commmonInstanceInfo = {\n name: string;\n upCommands: instanceCommand[];\n downCommands: instanceCommand[];\n cleanupCommands: instanceCommand[];\n runInfo?: runInfo;\n};\n\nexport type dockerInstanceInfo = commmonInstanceInfo & {\n type: 'docker';\n};\nexport type processInstanceInfo = commmonInstanceInfo & {\n type: 'process';\n pid?: number;\n};\n\nexport type instanceInfo = dockerInstanceInfo | processInstanceInfo;\nexport type jsonInstanceInfo = Omit<dockerInstanceInfo, 'name' | 'isActive'> | Omit<processInstanceInfo, 'name' | 'isActive'>;\n\nexport function reset() {\n fs.rmSync(State.getStateInstance().filePath);\n}\n\ntype state = {\n currentInstance: string;\n};\n\nclass State {\n private static instance: State;\n\n private state: state = {\n currentInstance: '',\n };\n\n public readonly filePath: string;\n private readonly dirPath: string;\n\n constructor(stateDir?: string) {\n stateDir = stateDir ?? path.resolve(os.homedir(), '.config', 'pl-bootstrap');\n\n const stateFile = path.join(stateDir, 'state.json');\n\n this.dirPath = stateDir;\n this.filePath = stateFile;\n\n if (!fs.existsSync(stateDir)) {\n fs.mkdirSync(stateDir, { recursive: true });\n }\n\n if (fs.existsSync(stateFile)) {\n this.state = JSON.parse(pkg.readFileSync(stateFile).toString()) as state;\n }\n }\n\n public static getStateInstance(): State {\n if (!State.instance) {\n State.instance = new State();\n }\n\n return State.instance;\n }\n\n public path(...p: string[]): string {\n return path.join(this.dirPath, ...p);\n }\n\n public instanceDir(name?: string, ...p: string[]): string {\n if (name) {\n return this.path('data', name, ...p);\n }\n\n return this.path('data');\n }\n\n public binaries(...p: string[]): string {\n return this.path('binaries', ...p);\n }\n\n private writeState() {\n fs.writeFileSync(this.filePath, JSON.stringify(this.state));\n }\n\n get instanceList(): string[] {\n if (!fs.existsSync(this.instanceDir())) {\n return [];\n }\n\n const list = fs.readdirSync(this.instanceDir());\n\n return list.filter((iName) => this.instanceExists(iName));\n }\n\n instanceExists(name: string): boolean {\n return fs.existsSync(this.instanceDir(name, 'instance.json'));\n }\n\n public getInstanceInfo(name: string): instanceInfo {\n const instanceInfoFile = this.instanceDir(name, 'instance.json');\n if (!fs.existsSync(instanceInfoFile)) {\n throw new Error(`platforma backend instance '${name}' does not exist or is corrupted`);\n }\n\n const jsonInfo = JSON.parse(pkg.readFileSync(instanceInfoFile).toString()) as jsonInstanceInfo;\n return {\n name: name,\n ...jsonInfo,\n };\n }\n\n public setInstanceInfo(instanceName: string, info: jsonInstanceInfo) {\n if (!fs.existsSync(this.instanceDir(instanceName))) {\n fs.mkdirSync(this.instanceDir(instanceName), { recursive: true });\n }\n\n const instanceInfoFile = this.instanceDir(instanceName, 'instance.json');\n let oldInfo: object = {};\n\n if (fs.existsSync(instanceInfoFile)) {\n oldInfo = JSON.parse(pkg.readFileSync(instanceInfoFile).toString()) as object;\n }\n\n fs.writeFileSync(instanceInfoFile, JSON.stringify({ ...oldInfo, ...info }));\n }\n\n public isInstanceActive(instance: instanceInfo): boolean {\n const iType = instance.type;\n switch (iType) {\n case 'docker': {\n const i = util.getDockerComposeInfo(`pl-${instance.name}`);\n if (!i) {\n return false;\n }\n return i.Status.trim().startsWith('running');\n }\n\n case 'process': {\n if (!instance.pid) {\n return false;\n }\n return isValidPID(instance.pid);\n }\n\n default:\n util.assertNever(iType);\n throw new Error('cli logic error: unknown service type, cannot check its state');\n }\n }\n\n get isActive(): boolean {\n for (const iName of this.instanceList) {\n const instance = this.getInstanceInfo(iName);\n if (this.isInstanceActive(instance)) {\n return true;\n }\n }\n\n return false;\n }\n\n public isValidPID(pid: number): boolean {\n return isValidPID(pid);\n }\n\n get currentInstance(): instanceInfo | undefined {\n const name = this.state.currentInstance;\n if (name && this.instanceExists(name)) {\n return this.getInstanceInfo(name);\n }\n\n return undefined;\n }\n\n get currentInstanceName(): string {\n return this.state.currentInstance;\n }\n\n set currentInstanceName(name: string) {\n this.state.currentInstance = name;\n this.writeState();\n }\n\n selectInstance(name: string) {\n if (!this.instanceExists(name)) {\n throw new Error(`instance '${name}' does not exist`);\n }\n this.state.currentInstance = name;\n this.writeState();\n }\n}\n\nfunction isValidPID(pid: number): boolean {\n const processName = util.getProcessName(pid);\n return processName === 'platforma' || processName.endsWith('/platforma') || processName.endsWith('\\\\platforma');\n}\n\nexport default State.getStateInstance();\n"],"names":["os","fs","pkg.readFileSync","util.getDockerComposeInfo","util.assertNever","util.getProcessName"],"mappings":"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"}
|
|
@@ -56,6 +56,9 @@ function render(composeSource, composeDest, deployName, services, options) {
|
|
|
56
56
|
svcSpec.volumes.push(`${mount.hostPath}:${mount.containerPath}`);
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
|
+
if (options.commands) {
|
|
60
|
+
svcSpec.command = options.commands;
|
|
61
|
+
}
|
|
59
62
|
}
|
|
60
63
|
if (options?.dropVolumes) {
|
|
61
64
|
delete compose.volumes;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose.cjs","sources":["../../src/templates/compose.ts"],"sourcesContent":["import fs from 'node:fs';\nimport YAML from 'yaml';\n\nexport type VolumeMountOption = {\n hostPath: string;\n containerPath: string;\n};\n\nexport type ServiceOptions = {\n platform?: string;\n envs?: NodeJS.ProcessEnv;\n mounts?: VolumeMountOption[];\n};\n\ntype ComposeYamlSpec = {\n name: string;\n services: Record<string, {\n platform?: string;\n environment?: string[];\n volumes?: string[];\n }>;\n\n volumes?: unknown;\n};\n\nexport function render(\n composeSource: string,\n composeDest: string,\n deployName: string,\n services?: Map<string, ServiceOptions>,\n options?: {\n dropVolumes: boolean;\n },\n) {\n const composeSrcData = fs.readFileSync(composeSource, { encoding: 'utf-8' });\n const compose = YAML.parse(composeSrcData.toString()) as ComposeYamlSpec;\n\n if (!compose.services) {\n throw new Error(`file '${composeSource}' seems to be not a docker-compose file or has unsupported version`);\n }\n\n if (services) {\n for (const svcName of Object.keys(compose.services)) {\n if (!services.has(svcName)) {\n delete compose.services[svcName];\n }\n }\n }\n\n compose.name = deployName;\n\n for (const [svcName, options] of services?.entries() ?? []) {\n const svcSpec = compose.services[svcName];\n\n if (!svcSpec) {\n throw new Error(`docker compose '${composeSource}' has no declaration of service '${svcName}'`);\n }\n\n if (options.platform) {\n svcSpec.platform = options.platform;\n }\n\n if (options.envs) {\n if (!svcSpec.environment) {\n svcSpec.environment = [];\n }\n for (let envSpecI = 0; envSpecI < (svcSpec?.environment.length ?? 0);) {\n const envSpec: string = svcSpec.environment[envSpecI];\n const envName = envSpec.split('=')[0];\n if (options.envs[envName]) {\n // Drop env expression from list as we will replace it later by our custom configuration\n const last = svcSpec.environment.pop();\n\n // Do not insert back last element we just removed.\n if (last && svcSpec.environment.length !== envSpecI) {\n svcSpec.environment[envSpecI] = last;\n }\n } else {\n envSpecI++;\n }\n }\n\n for (const [envName, envValue] of Object.entries(options.envs)) {\n svcSpec.environment.push(`${envName}=${envValue}`);\n }\n }\n\n if (options.mounts) {\n if (!svcSpec.volumes) {\n svcSpec.volumes = [];\n }\n for (const mount of options.mounts) {\n svcSpec.volumes.push(`${mount.hostPath}:${mount.containerPath}`);\n }\n }\n }\n\n if (options?.dropVolumes) {\n delete compose.volumes;\n }\n\n fs.writeFileSync(composeDest, YAML.stringify(compose));\n}\n"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"compose.cjs","sources":["../../src/templates/compose.ts"],"sourcesContent":["import fs from 'node:fs';\nimport YAML from 'yaml';\n\nexport type VolumeMountOption = {\n hostPath: string;\n containerPath: string;\n};\n\nexport type ServiceOptions = {\n platform?: string;\n envs?: NodeJS.ProcessEnv;\n mounts?: VolumeMountOption[];\n commands?: string[];\n};\n\ntype ComposeYamlSpec = {\n name: string;\n services: Record<string, {\n platform?: string;\n environment?: string[];\n volumes?: string[];\n command?: string[];\n }>;\n\n volumes?: unknown;\n};\n\nexport function render(\n composeSource: string,\n composeDest: string,\n deployName: string,\n services?: Map<string, ServiceOptions>,\n options?: {\n dropVolumes: boolean;\n },\n) {\n const composeSrcData = fs.readFileSync(composeSource, { encoding: 'utf-8' });\n const compose = YAML.parse(composeSrcData.toString()) as ComposeYamlSpec;\n\n if (!compose.services) {\n throw new Error(`file '${composeSource}' seems to be not a docker-compose file or has unsupported version`);\n }\n\n if (services) {\n for (const svcName of Object.keys(compose.services)) {\n if (!services.has(svcName)) {\n delete compose.services[svcName];\n }\n }\n }\n\n compose.name = deployName;\n\n for (const [svcName, options] of services?.entries() ?? []) {\n const svcSpec = compose.services[svcName];\n\n if (!svcSpec) {\n throw new Error(`docker compose '${composeSource}' has no declaration of service '${svcName}'`);\n }\n\n if (options.platform) {\n svcSpec.platform = options.platform;\n }\n\n if (options.envs) {\n if (!svcSpec.environment) {\n svcSpec.environment = [];\n }\n for (let envSpecI = 0; envSpecI < (svcSpec?.environment.length ?? 0);) {\n const envSpec: string = svcSpec.environment[envSpecI];\n const envName = envSpec.split('=')[0];\n if (options.envs[envName]) {\n // Drop env expression from list as we will replace it later by our custom configuration\n const last = svcSpec.environment.pop();\n\n // Do not insert back last element we just removed.\n if (last && svcSpec.environment.length !== envSpecI) {\n svcSpec.environment[envSpecI] = last;\n }\n } else {\n envSpecI++;\n }\n }\n\n for (const [envName, envValue] of Object.entries(options.envs)) {\n svcSpec.environment.push(`${envName}=${envValue}`);\n }\n }\n\n if (options.mounts) {\n if (!svcSpec.volumes) {\n svcSpec.volumes = [];\n }\n for (const mount of options.mounts) {\n svcSpec.volumes.push(`${mount.hostPath}:${mount.containerPath}`);\n }\n }\n\n if (options.commands) {\n svcSpec.command = options.commands;\n }\n }\n\n if (options?.dropVolumes) {\n delete compose.volumes;\n }\n\n fs.writeFileSync(composeDest, YAML.stringify(compose));\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ export type ServiceOptions = {
|
|
|
6
6
|
platform?: string;
|
|
7
7
|
envs?: NodeJS.ProcessEnv;
|
|
8
8
|
mounts?: VolumeMountOption[];
|
|
9
|
+
commands?: string[];
|
|
9
10
|
};
|
|
10
11
|
export declare function render(composeSource: string, composeDest: string, deployName: string, services?: Map<string, ServiceOptions>, options?: {
|
|
11
12
|
dropVolumes: boolean;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import
|
|
1
|
+
import fs__default from 'node:fs';
|
|
2
2
|
import YAML from 'yaml';
|
|
3
3
|
|
|
4
4
|
function render(composeSource, composeDest, deployName, services, options) {
|
|
5
|
-
const composeSrcData =
|
|
5
|
+
const composeSrcData = fs__default.readFileSync(composeSource, { encoding: 'utf-8' });
|
|
6
6
|
const compose = YAML.parse(composeSrcData.toString());
|
|
7
7
|
if (!compose.services) {
|
|
8
8
|
throw new Error(`file '${composeSource}' seems to be not a docker-compose file or has unsupported version`);
|
|
@@ -54,11 +54,14 @@ function render(composeSource, composeDest, deployName, services, options) {
|
|
|
54
54
|
svcSpec.volumes.push(`${mount.hostPath}:${mount.containerPath}`);
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
|
+
if (options.commands) {
|
|
58
|
+
svcSpec.command = options.commands;
|
|
59
|
+
}
|
|
57
60
|
}
|
|
58
61
|
if (options?.dropVolumes) {
|
|
59
62
|
delete compose.volumes;
|
|
60
63
|
}
|
|
61
|
-
|
|
64
|
+
fs__default.writeFileSync(composeDest, YAML.stringify(compose));
|
|
62
65
|
}
|
|
63
66
|
|
|
64
67
|
export { render };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose.js","sources":["../../src/templates/compose.ts"],"sourcesContent":["import fs from 'node:fs';\nimport YAML from 'yaml';\n\nexport type VolumeMountOption = {\n hostPath: string;\n containerPath: string;\n};\n\nexport type ServiceOptions = {\n platform?: string;\n envs?: NodeJS.ProcessEnv;\n mounts?: VolumeMountOption[];\n};\n\ntype ComposeYamlSpec = {\n name: string;\n services: Record<string, {\n platform?: string;\n environment?: string[];\n volumes?: string[];\n }>;\n\n volumes?: unknown;\n};\n\nexport function render(\n composeSource: string,\n composeDest: string,\n deployName: string,\n services?: Map<string, ServiceOptions>,\n options?: {\n dropVolumes: boolean;\n },\n) {\n const composeSrcData = fs.readFileSync(composeSource, { encoding: 'utf-8' });\n const compose = YAML.parse(composeSrcData.toString()) as ComposeYamlSpec;\n\n if (!compose.services) {\n throw new Error(`file '${composeSource}' seems to be not a docker-compose file or has unsupported version`);\n }\n\n if (services) {\n for (const svcName of Object.keys(compose.services)) {\n if (!services.has(svcName)) {\n delete compose.services[svcName];\n }\n }\n }\n\n compose.name = deployName;\n\n for (const [svcName, options] of services?.entries() ?? []) {\n const svcSpec = compose.services[svcName];\n\n if (!svcSpec) {\n throw new Error(`docker compose '${composeSource}' has no declaration of service '${svcName}'`);\n }\n\n if (options.platform) {\n svcSpec.platform = options.platform;\n }\n\n if (options.envs) {\n if (!svcSpec.environment) {\n svcSpec.environment = [];\n }\n for (let envSpecI = 0; envSpecI < (svcSpec?.environment.length ?? 0);) {\n const envSpec: string = svcSpec.environment[envSpecI];\n const envName = envSpec.split('=')[0];\n if (options.envs[envName]) {\n // Drop env expression from list as we will replace it later by our custom configuration\n const last = svcSpec.environment.pop();\n\n // Do not insert back last element we just removed.\n if (last && svcSpec.environment.length !== envSpecI) {\n svcSpec.environment[envSpecI] = last;\n }\n } else {\n envSpecI++;\n }\n }\n\n for (const [envName, envValue] of Object.entries(options.envs)) {\n svcSpec.environment.push(`${envName}=${envValue}`);\n }\n }\n\n if (options.mounts) {\n if (!svcSpec.volumes) {\n svcSpec.volumes = [];\n }\n for (const mount of options.mounts) {\n svcSpec.volumes.push(`${mount.hostPath}:${mount.containerPath}`);\n }\n }\n }\n\n if (options?.dropVolumes) {\n delete compose.volumes;\n }\n\n fs.writeFileSync(composeDest, YAML.stringify(compose));\n}\n"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"compose.js","sources":["../../src/templates/compose.ts"],"sourcesContent":["import fs from 'node:fs';\nimport YAML from 'yaml';\n\nexport type VolumeMountOption = {\n hostPath: string;\n containerPath: string;\n};\n\nexport type ServiceOptions = {\n platform?: string;\n envs?: NodeJS.ProcessEnv;\n mounts?: VolumeMountOption[];\n commands?: string[];\n};\n\ntype ComposeYamlSpec = {\n name: string;\n services: Record<string, {\n platform?: string;\n environment?: string[];\n volumes?: string[];\n command?: string[];\n }>;\n\n volumes?: unknown;\n};\n\nexport function render(\n composeSource: string,\n composeDest: string,\n deployName: string,\n services?: Map<string, ServiceOptions>,\n options?: {\n dropVolumes: boolean;\n },\n) {\n const composeSrcData = fs.readFileSync(composeSource, { encoding: 'utf-8' });\n const compose = YAML.parse(composeSrcData.toString()) as ComposeYamlSpec;\n\n if (!compose.services) {\n throw new Error(`file '${composeSource}' seems to be not a docker-compose file or has unsupported version`);\n }\n\n if (services) {\n for (const svcName of Object.keys(compose.services)) {\n if (!services.has(svcName)) {\n delete compose.services[svcName];\n }\n }\n }\n\n compose.name = deployName;\n\n for (const [svcName, options] of services?.entries() ?? []) {\n const svcSpec = compose.services[svcName];\n\n if (!svcSpec) {\n throw new Error(`docker compose '${composeSource}' has no declaration of service '${svcName}'`);\n }\n\n if (options.platform) {\n svcSpec.platform = options.platform;\n }\n\n if (options.envs) {\n if (!svcSpec.environment) {\n svcSpec.environment = [];\n }\n for (let envSpecI = 0; envSpecI < (svcSpec?.environment.length ?? 0);) {\n const envSpec: string = svcSpec.environment[envSpecI];\n const envName = envSpec.split('=')[0];\n if (options.envs[envName]) {\n // Drop env expression from list as we will replace it later by our custom configuration\n const last = svcSpec.environment.pop();\n\n // Do not insert back last element we just removed.\n if (last && svcSpec.environment.length !== envSpecI) {\n svcSpec.environment[envSpecI] = last;\n }\n } else {\n envSpecI++;\n }\n }\n\n for (const [envName, envValue] of Object.entries(options.envs)) {\n svcSpec.environment.push(`${envName}=${envValue}`);\n }\n }\n\n if (options.mounts) {\n if (!svcSpec.volumes) {\n svcSpec.volumes = [];\n }\n for (const mount of options.mounts) {\n svcSpec.volumes.push(`${mount.hostPath}:${mount.containerPath}`);\n }\n }\n\n if (options.commands) {\n svcSpec.command = options.commands;\n }\n }\n\n if (options?.dropVolumes) {\n delete compose.volumes;\n }\n\n fs.writeFileSync(composeDest, YAML.stringify(compose));\n}\n"],"names":["fs"],"mappings":"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"}
|
|
@@ -88,7 +88,7 @@ function loadDefaults(jwtKey, options) {
|
|
|
88
88
|
path: `${localRoot}/db`,
|
|
89
89
|
},
|
|
90
90
|
};
|
|
91
|
-
const primary = defaultStorageSettings('main', `${localRoot}/storages/main`, '
|
|
91
|
+
const primary = defaultStorageSettings('main', `${localRoot}/storages/main`, 'platforma-primary-bucket', options?.storages?.primary);
|
|
92
92
|
let work;
|
|
93
93
|
const wType = options?.storages?.work?.type;
|
|
94
94
|
switch (wType) {
|
|
@@ -101,7 +101,7 @@ function loadDefaults(jwtKey, options) {
|
|
|
101
101
|
default:
|
|
102
102
|
throw new Error('work storage MUST have \'FS\' type as it is used for working directories management');
|
|
103
103
|
}
|
|
104
|
-
const library = defaultStorageSettings('library', `${localRoot}/storages/library`, 'library-bucket', options?.storages?.library);
|
|
104
|
+
const library = defaultStorageSettings('library', `${localRoot}/storages/library`, 'platforma-library-bucket', options?.storages?.library);
|
|
105
105
|
const monitoring = {
|
|
106
106
|
enabled: defaultBool(options?.monitoring?.enabled, true),
|
|
107
107
|
listen: options?.monitoring?.listen ?? '127.0.0.1:9090',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pl-config.cjs","sources":["../../src/templates/pl-config.ts"],"sourcesContent":["import fs from 'node:fs';\nimport * as types from './types';\nimport { assertNever, resolveTilde } from '../util';\nimport state from '../state';\n\nexport type { plOptions } from './types';\n\nexport function storageSettingsFromURL(\n storageURL: string,\n baseDir?: string,\n defaults?: types.storageOptions,\n): types.storageOptions {\n storageURL = resolveTilde(storageURL);\n const url = new URL(storageURL, `file:${baseDir}`);\n\n switch (url.protocol) {\n case 's3:': {\n const bucketName = url.hostname;\n const region = url.searchParams.get('region');\n const keyPrefix = url.pathname.slice(1); // 's3://bucket/' will have '/' as pathname. We don't want to always have '/' prefix\n\n return {\n ...defaults,\n\n type: 'S3',\n bucketName,\n region,\n keyPrefix,\n } as types.storageOptions;\n }\n case 's3e:': {\n const p = url.pathname.split('/').slice(1); // '/bucket/key/prefix' -> ['', 'bucket', 'key' 'prefix'] -> ['bucket', 'key', 'prefix']\n const bucketName = p[0];\n const keyPrefix = p.length > 1 ? p.slice(1).join('/') : '';\n\n return {\n ...defaults,\n\n type: 'S3',\n endpoint: `http://${url.host}/`,\n bucketName,\n keyPrefix,\n region: url.searchParams.get('region'),\n key: url.username ? `static:${url.username}` : '',\n secret: url.password ? `static:${url.password}` : '',\n } as types.storageOptions;\n }\n case 's3es:': {\n const p = url.pathname.split('/').slice(1); // '/bucket/key/prefix' -> ['', 'bucket', 'key' 'prefix'] -> ['bucket', 'key', 'prefix']\n const bucketName = p[0];\n const keyPrefix = p.length > 1 ? p.slice(1).join('/') : '';\n\n return {\n ...defaults,\n\n type: 'S3',\n endpoint: `https://${url.host}/`,\n bucketName,\n keyPrefix,\n region: url.searchParams.get('region'),\n key: url.username ? `static:${url.username}` : '',\n secret: url.password ? `static:${url.password}` : '',\n } as types.storageOptions;\n }\n case 'file:':\n return {\n type: 'FS',\n rootPath: url.pathname,\n };\n\n default:\n throw new Error(`storage protocol '${url.protocol}' is not supported`);\n }\n}\n\nexport function loadDefaults(jwtKey: string, options?: types.plOptions): types.plSettings {\n const localRoot = options?.localRoot ?? state.instanceDir('default');\n\n const log: types.logSettings = {\n level: options?.log?.level ?? 'info',\n path: options?.log?.path ?? `${localRoot}/logs/platforma.log`,\n };\n\n const grpc: types.grpcSettings = {\n listen: options?.grpc?.listen ?? 'localhost:6345',\n tls: {\n enable: defaultBool(options?.grpc?.tls?.enable, false),\n clientAuthMode: options?.grpc?.tls?.clientAuthMode ?? 'NoAuth',\n certFile: options?.grpc?.tls?.certFile ?? `${localRoot}/certs/tls.cert`,\n keyFile: options?.grpc?.tls?.keyFile ?? `${localRoot}/certs/tls.key`,\n\n ...options?.grpc?.tls,\n },\n };\n\n const core: types.coreSettings = {\n auth: {\n enabled: options?.core?.auth?.enabled ?? false,\n drivers: options?.core?.auth?.drivers ?? [\n { driver: 'jwt', key: jwtKey },\n { driver: 'htpasswd', path: `${localRoot}/users.htpasswd` },\n ],\n },\n db: {\n path: `${localRoot}/db`,\n },\n };\n\n const primary = defaultStorageSettings(\n 'main',\n `${localRoot}/storages/main`,\n 'main-bucket',\n options?.storages?.primary,\n );\n\n let work: types.storageSettings;\n const wType = options?.storages?.work?.type;\n switch (wType) {\n case undefined:\n case 'FS':\n work = types.emptyFSSettings('work');\n work.rootPath = options?.storages?.work?.rootPath ?? `${localRoot}/storages/work`;\n work.indexCachePeriod = options?.storages?.work?.indexCachePeriod ?? '1m';\n break;\n\n default:\n throw new Error('work storage MUST have \\'FS\\' type as it is used for working directories management');\n }\n\n const library = defaultStorageSettings(\n 'library',\n `${localRoot}/storages/library`,\n 'library-bucket',\n options?.storages?.library,\n );\n\n const monitoring: types.monitoringSettings = {\n enabled: defaultBool(options?.monitoring?.enabled, true),\n listen: options?.monitoring?.listen ?? '127.0.0.1:9090',\n };\n const debug: types.debugSettings = {\n enabled: defaultBool(options?.debug?.enabled, true),\n listen: options?.debug?.listen ?? '127.0.0.1:9091',\n };\n const license: types.licenseSettings = {\n value: options?.license?.value ?? '',\n file: options?.license?.file ?? '',\n };\n\n return {\n localRoot,\n license,\n log,\n grpc,\n core,\n monitoring,\n debug,\n numCpu: options?.numCpu,\n storages: { primary, work, library },\n hacks: { libraryDownloadable: true },\n };\n}\n\nfunction defaultStorageSettings(\n storageID: string,\n defaultLocation: string,\n defaultBucket: string,\n options?: types.storageOptions,\n): types.storageSettings {\n let storage: types.storageSettings;\n const pType = options?.type;\n switch (pType) {\n case undefined:\n case 'FS':\n storage = types.emptyFSSettings(storageID);\n storage.rootPath = options?.rootPath ?? defaultLocation;\n break;\n\n case 'S3':\n storage = types.emptyS3Settings(storageID);\n\n storage.endpoint = options?.endpoint;\n storage.region = options?.region;\n storage.presignEndpoint = options?.presignEndpoint ?? options?.endpoint;\n storage.bucketName = options?.bucketName ?? defaultBucket;\n storage.createBucket = defaultBool(options?.createBucket, true);\n storage.forcePathStyle = defaultBool(options?.forcePathStyle, true);\n storage.key = options?.key ?? '';\n storage.secret = options?.secret ?? '';\n storage.keyPrefix = options?.keyPrefix ?? '';\n storage.accessPrefixes = options?.accessPrefixes ?? [''];\n storage.uploadKeyPrefix = options?.uploadKeyPrefix ?? '';\n break;\n\n default:\n assertNever(pType);\n throw new Error('unknown storage type'); // calm down TS type analyzer\n }\n\n return storage;\n}\n\nexport function render(options: types.plSettings): string {\n const disableMon = options.monitoring.enabled ? '' : ' disabled';\n const disableDbg = options.debug.enabled ? '' : ' disabled';\n const libraryDownloadable = options.hacks.libraryDownloadable ? 'true' : 'false';\n let miLicenseSecret = options.license.value;\n if (options.license.file != '') {\n miLicenseSecret = fs.readFileSync(options.license.file).toString().trimEnd();\n }\n\n let cpuLimit = ''\n if (options.numCpu) {\n cpuLimit = `\n resources:\n cpu: ${options.numCpu}\n`;\n }\n\n return `\nlicense:\n value: '${options.license.value}'\n file: '${options.license.file}'\n\nlogging:\n level: '${options.log.level}'\n destinations:\n - path: '${options.log.path}'\n rotation:\n maxSize: 1GiB\n maxBackups: 15\n compress: true\n\nmonitoring${disableMon}:\n listen: '${options.monitoring.listen}'\n\ndebug${disableDbg}:\n listen: '${options.debug.listen}'\n\ncore:\n logging:\n extendedInfo: true\n dumpResourceData: false\n\n grpc:\n listen: '${options.grpc.listen}'\n\n tlsEnabled: ${JSON.stringify(options.grpc.tls.enable)}\n tls:\n clientAuthMode: '${options.grpc.tls.clientAuthMode}'\n certificates:\n - certFile: '${options.grpc.tls.certFile}'\n keyFile: '${options.grpc.tls.keyFile}'\n\n\n authEnabled: ${JSON.stringify(options.core.auth.enabled)}\n auth: ${JSON.stringify(options.core.auth.drivers)}\n db:\n path: '${options.core.db.path}'\n\ncontrollers:\n data:\n main:\n storages:\n main:\n mode: primary\n downloadable: true\n\n library:\n mode: passive\n downloadable: ${libraryDownloadable}\n\n work:\n mode: active\n downloadable: false\n\n storages:\n - ${JSON.stringify(options.storages.primary)}\n - ${JSON.stringify(options.storages.library)}\n - ${JSON.stringify(options.storages.work)}\n\n runner:\n type: local\n storageRoot: '${(options.storages.work).rootPath}'\n workdirCacheOnSuccess: 20m\n workdirCacheOnFailure: 1h\n${cpuLimit}\n secrets:\n - map:\n MI_LICENSE: ${JSON.stringify(miLicenseSecret)}\n\n packageLoader:\n packagesRoot: '${options.localRoot}/packages'\n\n workflows:\n features:\n pureFutureFields: true\n commandExpressions: true\n workdirLimits: true\n computeLimits: false\n`;\n}\n\nfunction defaultBool(v: boolean | undefined, def: boolean): boolean {\n return v === undefined ? def : v;\n}\n"],"names":["resolveTilde","types.emptyFSSettings","types.emptyS3Settings","assertNever"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pl-config.cjs","sources":["../../src/templates/pl-config.ts"],"sourcesContent":["import fs from 'node:fs';\nimport * as types from './types';\nimport { assertNever, resolveTilde } from '../util';\nimport state from '../state';\n\nexport type { plOptions } from './types';\n\nexport function storageSettingsFromURL(\n storageURL: string,\n baseDir?: string,\n defaults?: types.storageOptions,\n): types.storageOptions {\n storageURL = resolveTilde(storageURL);\n const url = new URL(storageURL, `file:${baseDir}`);\n\n switch (url.protocol) {\n case 's3:': {\n const bucketName = url.hostname;\n const region = url.searchParams.get('region');\n const keyPrefix = url.pathname.slice(1); // 's3://bucket/' will have '/' as pathname. We don't want to always have '/' prefix\n\n return {\n ...defaults,\n\n type: 'S3',\n bucketName,\n region,\n keyPrefix,\n } as types.storageOptions;\n }\n case 's3e:': {\n const p = url.pathname.split('/').slice(1); // '/bucket/key/prefix' -> ['', 'bucket', 'key' 'prefix'] -> ['bucket', 'key', 'prefix']\n const bucketName = p[0];\n const keyPrefix = p.length > 1 ? p.slice(1).join('/') : '';\n\n return {\n ...defaults,\n\n type: 'S3',\n endpoint: `http://${url.host}/`,\n bucketName,\n keyPrefix,\n region: url.searchParams.get('region'),\n key: url.username ? `static:${url.username}` : '',\n secret: url.password ? `static:${url.password}` : '',\n } as types.storageOptions;\n }\n case 's3es:': {\n const p = url.pathname.split('/').slice(1); // '/bucket/key/prefix' -> ['', 'bucket', 'key' 'prefix'] -> ['bucket', 'key', 'prefix']\n const bucketName = p[0];\n const keyPrefix = p.length > 1 ? p.slice(1).join('/') : '';\n\n return {\n ...defaults,\n\n type: 'S3',\n endpoint: `https://${url.host}/`,\n bucketName,\n keyPrefix,\n region: url.searchParams.get('region'),\n key: url.username ? `static:${url.username}` : '',\n secret: url.password ? `static:${url.password}` : '',\n } as types.storageOptions;\n }\n case 'file:':\n return {\n type: 'FS',\n rootPath: url.pathname,\n };\n\n default:\n throw new Error(`storage protocol '${url.protocol}' is not supported`);\n }\n}\n\nexport function loadDefaults(jwtKey: string, options?: types.plOptions): types.plSettings {\n const localRoot = options?.localRoot ?? state.instanceDir('default');\n\n const log: types.logSettings = {\n level: options?.log?.level ?? 'info',\n path: options?.log?.path ?? `${localRoot}/logs/platforma.log`,\n };\n\n const grpc: types.grpcSettings = {\n listen: options?.grpc?.listen ?? 'localhost:6345',\n tls: {\n enable: defaultBool(options?.grpc?.tls?.enable, false),\n clientAuthMode: options?.grpc?.tls?.clientAuthMode ?? 'NoAuth',\n certFile: options?.grpc?.tls?.certFile ?? `${localRoot}/certs/tls.cert`,\n keyFile: options?.grpc?.tls?.keyFile ?? `${localRoot}/certs/tls.key`,\n\n ...options?.grpc?.tls,\n },\n };\n\n const core: types.coreSettings = {\n auth: {\n enabled: options?.core?.auth?.enabled ?? false,\n drivers: options?.core?.auth?.drivers ?? [\n { driver: 'jwt', key: jwtKey },\n { driver: 'htpasswd', path: `${localRoot}/users.htpasswd` },\n ],\n },\n db: {\n path: `${localRoot}/db`,\n },\n };\n\n const primary = defaultStorageSettings(\n 'main',\n `${localRoot}/storages/main`,\n 'platforma-primary-bucket',\n options?.storages?.primary,\n );\n\n let work: types.storageSettings;\n const wType = options?.storages?.work?.type;\n switch (wType) {\n case undefined:\n case 'FS':\n work = types.emptyFSSettings('work');\n work.rootPath = options?.storages?.work?.rootPath ?? `${localRoot}/storages/work`;\n work.indexCachePeriod = options?.storages?.work?.indexCachePeriod ?? '1m';\n break;\n\n default:\n throw new Error('work storage MUST have \\'FS\\' type as it is used for working directories management');\n }\n\n const library = defaultStorageSettings(\n 'library',\n `${localRoot}/storages/library`,\n 'platforma-library-bucket',\n options?.storages?.library,\n );\n\n const monitoring: types.monitoringSettings = {\n enabled: defaultBool(options?.monitoring?.enabled, true),\n listen: options?.monitoring?.listen ?? '127.0.0.1:9090',\n };\n const debug: types.debugSettings = {\n enabled: defaultBool(options?.debug?.enabled, true),\n listen: options?.debug?.listen ?? '127.0.0.1:9091',\n };\n const license: types.licenseSettings = {\n value: options?.license?.value ?? '',\n file: options?.license?.file ?? '',\n };\n\n return {\n localRoot,\n license,\n log,\n grpc,\n core,\n monitoring,\n debug,\n numCpu: options?.numCpu,\n storages: { primary, work, library },\n hacks: { libraryDownloadable: true },\n };\n}\n\nfunction defaultStorageSettings(\n storageID: string,\n defaultLocation: string,\n defaultBucket: string,\n options?: types.storageOptions,\n): types.storageSettings {\n let storage: types.storageSettings;\n const pType = options?.type;\n switch (pType) {\n case undefined:\n case 'FS':\n storage = types.emptyFSSettings(storageID);\n storage.rootPath = options?.rootPath ?? defaultLocation;\n break;\n\n case 'S3':\n storage = types.emptyS3Settings(storageID);\n\n storage.endpoint = options?.endpoint;\n storage.region = options?.region;\n storage.presignEndpoint = options?.presignEndpoint ?? options?.endpoint;\n storage.bucketName = options?.bucketName ?? defaultBucket;\n storage.createBucket = defaultBool(options?.createBucket, true);\n storage.forcePathStyle = defaultBool(options?.forcePathStyle, true);\n storage.key = options?.key ?? '';\n storage.secret = options?.secret ?? '';\n storage.keyPrefix = options?.keyPrefix ?? '';\n storage.accessPrefixes = options?.accessPrefixes ?? [''];\n storage.uploadKeyPrefix = options?.uploadKeyPrefix ?? '';\n break;\n\n default:\n assertNever(pType);\n throw new Error('unknown storage type'); // calm down TS type analyzer\n }\n\n return storage;\n}\n\nexport function render(options: types.plSettings): string {\n const disableMon = options.monitoring.enabled ? '' : ' disabled';\n const disableDbg = options.debug.enabled ? '' : ' disabled';\n const libraryDownloadable = options.hacks.libraryDownloadable ? 'true' : 'false';\n let miLicenseSecret = options.license.value;\n if (options.license.file != '') {\n miLicenseSecret = fs.readFileSync(options.license.file).toString().trimEnd();\n }\n\n let cpuLimit = ''\n if (options.numCpu) {\n cpuLimit = `\n resources:\n cpu: ${options.numCpu}\n`;\n }\n\n return `\nlicense:\n value: '${options.license.value}'\n file: '${options.license.file}'\n\nlogging:\n level: '${options.log.level}'\n destinations:\n - path: '${options.log.path}'\n rotation:\n maxSize: 1GiB\n maxBackups: 15\n compress: true\n\nmonitoring${disableMon}:\n listen: '${options.monitoring.listen}'\n\ndebug${disableDbg}:\n listen: '${options.debug.listen}'\n\ncore:\n logging:\n extendedInfo: true\n dumpResourceData: false\n\n grpc:\n listen: '${options.grpc.listen}'\n\n tlsEnabled: ${JSON.stringify(options.grpc.tls.enable)}\n tls:\n clientAuthMode: '${options.grpc.tls.clientAuthMode}'\n certificates:\n - certFile: '${options.grpc.tls.certFile}'\n keyFile: '${options.grpc.tls.keyFile}'\n\n\n authEnabled: ${JSON.stringify(options.core.auth.enabled)}\n auth: ${JSON.stringify(options.core.auth.drivers)}\n db:\n path: '${options.core.db.path}'\n\ncontrollers:\n data:\n main:\n storages:\n main:\n mode: primary\n downloadable: true\n\n library:\n mode: passive\n downloadable: ${libraryDownloadable}\n\n work:\n mode: active\n downloadable: false\n\n storages:\n - ${JSON.stringify(options.storages.primary)}\n - ${JSON.stringify(options.storages.library)}\n - ${JSON.stringify(options.storages.work)}\n\n runner:\n type: local\n storageRoot: '${(options.storages.work).rootPath}'\n workdirCacheOnSuccess: 20m\n workdirCacheOnFailure: 1h\n${cpuLimit}\n secrets:\n - map:\n MI_LICENSE: ${JSON.stringify(miLicenseSecret)}\n\n packageLoader:\n packagesRoot: '${options.localRoot}/packages'\n\n workflows:\n features:\n pureFutureFields: true\n commandExpressions: true\n workdirLimits: true\n computeLimits: false\n`;\n}\n\nfunction defaultBool(v: boolean | undefined, def: boolean): boolean {\n return v === undefined ? def : v;\n}\n"],"names":["resolveTilde","types.emptyFSSettings","types.emptyS3Settings","assertNever"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import fs__default from 'node:fs';
|
|
2
2
|
import { emptyFSSettings, emptyS3Settings } from './types.js';
|
|
3
3
|
import { resolveTilde, assertNever } from '../util.js';
|
|
4
4
|
import state from '../state.js';
|
|
@@ -86,7 +86,7 @@ function loadDefaults(jwtKey, options) {
|
|
|
86
86
|
path: `${localRoot}/db`,
|
|
87
87
|
},
|
|
88
88
|
};
|
|
89
|
-
const primary = defaultStorageSettings('main', `${localRoot}/storages/main`, '
|
|
89
|
+
const primary = defaultStorageSettings('main', `${localRoot}/storages/main`, 'platforma-primary-bucket', options?.storages?.primary);
|
|
90
90
|
let work;
|
|
91
91
|
const wType = options?.storages?.work?.type;
|
|
92
92
|
switch (wType) {
|
|
@@ -99,7 +99,7 @@ function loadDefaults(jwtKey, options) {
|
|
|
99
99
|
default:
|
|
100
100
|
throw new Error('work storage MUST have \'FS\' type as it is used for working directories management');
|
|
101
101
|
}
|
|
102
|
-
const library = defaultStorageSettings('library', `${localRoot}/storages/library`, 'library-bucket', options?.storages?.library);
|
|
102
|
+
const library = defaultStorageSettings('library', `${localRoot}/storages/library`, 'platforma-library-bucket', options?.storages?.library);
|
|
103
103
|
const monitoring = {
|
|
104
104
|
enabled: defaultBool(options?.monitoring?.enabled, true),
|
|
105
105
|
listen: options?.monitoring?.listen ?? '127.0.0.1:9090',
|
|
@@ -160,7 +160,7 @@ function render(options) {
|
|
|
160
160
|
const libraryDownloadable = options.hacks.libraryDownloadable ? 'true' : 'false';
|
|
161
161
|
let miLicenseSecret = options.license.value;
|
|
162
162
|
if (options.license.file != '') {
|
|
163
|
-
miLicenseSecret =
|
|
163
|
+
miLicenseSecret = fs__default.readFileSync(options.license.file).toString().trimEnd();
|
|
164
164
|
}
|
|
165
165
|
let cpuLimit = '';
|
|
166
166
|
if (options.numCpu) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pl-config.js","sources":["../../src/templates/pl-config.ts"],"sourcesContent":["import fs from 'node:fs';\nimport * as types from './types';\nimport { assertNever, resolveTilde } from '../util';\nimport state from '../state';\n\nexport type { plOptions } from './types';\n\nexport function storageSettingsFromURL(\n storageURL: string,\n baseDir?: string,\n defaults?: types.storageOptions,\n): types.storageOptions {\n storageURL = resolveTilde(storageURL);\n const url = new URL(storageURL, `file:${baseDir}`);\n\n switch (url.protocol) {\n case 's3:': {\n const bucketName = url.hostname;\n const region = url.searchParams.get('region');\n const keyPrefix = url.pathname.slice(1); // 's3://bucket/' will have '/' as pathname. We don't want to always have '/' prefix\n\n return {\n ...defaults,\n\n type: 'S3',\n bucketName,\n region,\n keyPrefix,\n } as types.storageOptions;\n }\n case 's3e:': {\n const p = url.pathname.split('/').slice(1); // '/bucket/key/prefix' -> ['', 'bucket', 'key' 'prefix'] -> ['bucket', 'key', 'prefix']\n const bucketName = p[0];\n const keyPrefix = p.length > 1 ? p.slice(1).join('/') : '';\n\n return {\n ...defaults,\n\n type: 'S3',\n endpoint: `http://${url.host}/`,\n bucketName,\n keyPrefix,\n region: url.searchParams.get('region'),\n key: url.username ? `static:${url.username}` : '',\n secret: url.password ? `static:${url.password}` : '',\n } as types.storageOptions;\n }\n case 's3es:': {\n const p = url.pathname.split('/').slice(1); // '/bucket/key/prefix' -> ['', 'bucket', 'key' 'prefix'] -> ['bucket', 'key', 'prefix']\n const bucketName = p[0];\n const keyPrefix = p.length > 1 ? p.slice(1).join('/') : '';\n\n return {\n ...defaults,\n\n type: 'S3',\n endpoint: `https://${url.host}/`,\n bucketName,\n keyPrefix,\n region: url.searchParams.get('region'),\n key: url.username ? `static:${url.username}` : '',\n secret: url.password ? `static:${url.password}` : '',\n } as types.storageOptions;\n }\n case 'file:':\n return {\n type: 'FS',\n rootPath: url.pathname,\n };\n\n default:\n throw new Error(`storage protocol '${url.protocol}' is not supported`);\n }\n}\n\nexport function loadDefaults(jwtKey: string, options?: types.plOptions): types.plSettings {\n const localRoot = options?.localRoot ?? state.instanceDir('default');\n\n const log: types.logSettings = {\n level: options?.log?.level ?? 'info',\n path: options?.log?.path ?? `${localRoot}/logs/platforma.log`,\n };\n\n const grpc: types.grpcSettings = {\n listen: options?.grpc?.listen ?? 'localhost:6345',\n tls: {\n enable: defaultBool(options?.grpc?.tls?.enable, false),\n clientAuthMode: options?.grpc?.tls?.clientAuthMode ?? 'NoAuth',\n certFile: options?.grpc?.tls?.certFile ?? `${localRoot}/certs/tls.cert`,\n keyFile: options?.grpc?.tls?.keyFile ?? `${localRoot}/certs/tls.key`,\n\n ...options?.grpc?.tls,\n },\n };\n\n const core: types.coreSettings = {\n auth: {\n enabled: options?.core?.auth?.enabled ?? false,\n drivers: options?.core?.auth?.drivers ?? [\n { driver: 'jwt', key: jwtKey },\n { driver: 'htpasswd', path: `${localRoot}/users.htpasswd` },\n ],\n },\n db: {\n path: `${localRoot}/db`,\n },\n };\n\n const primary = defaultStorageSettings(\n 'main',\n `${localRoot}/storages/main`,\n 'main-bucket',\n options?.storages?.primary,\n );\n\n let work: types.storageSettings;\n const wType = options?.storages?.work?.type;\n switch (wType) {\n case undefined:\n case 'FS':\n work = types.emptyFSSettings('work');\n work.rootPath = options?.storages?.work?.rootPath ?? `${localRoot}/storages/work`;\n work.indexCachePeriod = options?.storages?.work?.indexCachePeriod ?? '1m';\n break;\n\n default:\n throw new Error('work storage MUST have \\'FS\\' type as it is used for working directories management');\n }\n\n const library = defaultStorageSettings(\n 'library',\n `${localRoot}/storages/library`,\n 'library-bucket',\n options?.storages?.library,\n );\n\n const monitoring: types.monitoringSettings = {\n enabled: defaultBool(options?.monitoring?.enabled, true),\n listen: options?.monitoring?.listen ?? '127.0.0.1:9090',\n };\n const debug: types.debugSettings = {\n enabled: defaultBool(options?.debug?.enabled, true),\n listen: options?.debug?.listen ?? '127.0.0.1:9091',\n };\n const license: types.licenseSettings = {\n value: options?.license?.value ?? '',\n file: options?.license?.file ?? '',\n };\n\n return {\n localRoot,\n license,\n log,\n grpc,\n core,\n monitoring,\n debug,\n numCpu: options?.numCpu,\n storages: { primary, work, library },\n hacks: { libraryDownloadable: true },\n };\n}\n\nfunction defaultStorageSettings(\n storageID: string,\n defaultLocation: string,\n defaultBucket: string,\n options?: types.storageOptions,\n): types.storageSettings {\n let storage: types.storageSettings;\n const pType = options?.type;\n switch (pType) {\n case undefined:\n case 'FS':\n storage = types.emptyFSSettings(storageID);\n storage.rootPath = options?.rootPath ?? defaultLocation;\n break;\n\n case 'S3':\n storage = types.emptyS3Settings(storageID);\n\n storage.endpoint = options?.endpoint;\n storage.region = options?.region;\n storage.presignEndpoint = options?.presignEndpoint ?? options?.endpoint;\n storage.bucketName = options?.bucketName ?? defaultBucket;\n storage.createBucket = defaultBool(options?.createBucket, true);\n storage.forcePathStyle = defaultBool(options?.forcePathStyle, true);\n storage.key = options?.key ?? '';\n storage.secret = options?.secret ?? '';\n storage.keyPrefix = options?.keyPrefix ?? '';\n storage.accessPrefixes = options?.accessPrefixes ?? [''];\n storage.uploadKeyPrefix = options?.uploadKeyPrefix ?? '';\n break;\n\n default:\n assertNever(pType);\n throw new Error('unknown storage type'); // calm down TS type analyzer\n }\n\n return storage;\n}\n\nexport function render(options: types.plSettings): string {\n const disableMon = options.monitoring.enabled ? '' : ' disabled';\n const disableDbg = options.debug.enabled ? '' : ' disabled';\n const libraryDownloadable = options.hacks.libraryDownloadable ? 'true' : 'false';\n let miLicenseSecret = options.license.value;\n if (options.license.file != '') {\n miLicenseSecret = fs.readFileSync(options.license.file).toString().trimEnd();\n }\n\n let cpuLimit = ''\n if (options.numCpu) {\n cpuLimit = `\n resources:\n cpu: ${options.numCpu}\n`;\n }\n\n return `\nlicense:\n value: '${options.license.value}'\n file: '${options.license.file}'\n\nlogging:\n level: '${options.log.level}'\n destinations:\n - path: '${options.log.path}'\n rotation:\n maxSize: 1GiB\n maxBackups: 15\n compress: true\n\nmonitoring${disableMon}:\n listen: '${options.monitoring.listen}'\n\ndebug${disableDbg}:\n listen: '${options.debug.listen}'\n\ncore:\n logging:\n extendedInfo: true\n dumpResourceData: false\n\n grpc:\n listen: '${options.grpc.listen}'\n\n tlsEnabled: ${JSON.stringify(options.grpc.tls.enable)}\n tls:\n clientAuthMode: '${options.grpc.tls.clientAuthMode}'\n certificates:\n - certFile: '${options.grpc.tls.certFile}'\n keyFile: '${options.grpc.tls.keyFile}'\n\n\n authEnabled: ${JSON.stringify(options.core.auth.enabled)}\n auth: ${JSON.stringify(options.core.auth.drivers)}\n db:\n path: '${options.core.db.path}'\n\ncontrollers:\n data:\n main:\n storages:\n main:\n mode: primary\n downloadable: true\n\n library:\n mode: passive\n downloadable: ${libraryDownloadable}\n\n work:\n mode: active\n downloadable: false\n\n storages:\n - ${JSON.stringify(options.storages.primary)}\n - ${JSON.stringify(options.storages.library)}\n - ${JSON.stringify(options.storages.work)}\n\n runner:\n type: local\n storageRoot: '${(options.storages.work).rootPath}'\n workdirCacheOnSuccess: 20m\n workdirCacheOnFailure: 1h\n${cpuLimit}\n secrets:\n - map:\n MI_LICENSE: ${JSON.stringify(miLicenseSecret)}\n\n packageLoader:\n packagesRoot: '${options.localRoot}/packages'\n\n workflows:\n features:\n pureFutureFields: true\n commandExpressions: true\n workdirLimits: true\n computeLimits: false\n`;\n}\n\nfunction defaultBool(v: boolean | undefined, def: boolean): boolean {\n return v === undefined ? def : v;\n}\n"],"names":["types.emptyFSSettings","types.emptyS3Settings"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pl-config.js","sources":["../../src/templates/pl-config.ts"],"sourcesContent":["import fs from 'node:fs';\nimport * as types from './types';\nimport { assertNever, resolveTilde } from '../util';\nimport state from '../state';\n\nexport type { plOptions } from './types';\n\nexport function storageSettingsFromURL(\n storageURL: string,\n baseDir?: string,\n defaults?: types.storageOptions,\n): types.storageOptions {\n storageURL = resolveTilde(storageURL);\n const url = new URL(storageURL, `file:${baseDir}`);\n\n switch (url.protocol) {\n case 's3:': {\n const bucketName = url.hostname;\n const region = url.searchParams.get('region');\n const keyPrefix = url.pathname.slice(1); // 's3://bucket/' will have '/' as pathname. We don't want to always have '/' prefix\n\n return {\n ...defaults,\n\n type: 'S3',\n bucketName,\n region,\n keyPrefix,\n } as types.storageOptions;\n }\n case 's3e:': {\n const p = url.pathname.split('/').slice(1); // '/bucket/key/prefix' -> ['', 'bucket', 'key' 'prefix'] -> ['bucket', 'key', 'prefix']\n const bucketName = p[0];\n const keyPrefix = p.length > 1 ? p.slice(1).join('/') : '';\n\n return {\n ...defaults,\n\n type: 'S3',\n endpoint: `http://${url.host}/`,\n bucketName,\n keyPrefix,\n region: url.searchParams.get('region'),\n key: url.username ? `static:${url.username}` : '',\n secret: url.password ? `static:${url.password}` : '',\n } as types.storageOptions;\n }\n case 's3es:': {\n const p = url.pathname.split('/').slice(1); // '/bucket/key/prefix' -> ['', 'bucket', 'key' 'prefix'] -> ['bucket', 'key', 'prefix']\n const bucketName = p[0];\n const keyPrefix = p.length > 1 ? p.slice(1).join('/') : '';\n\n return {\n ...defaults,\n\n type: 'S3',\n endpoint: `https://${url.host}/`,\n bucketName,\n keyPrefix,\n region: url.searchParams.get('region'),\n key: url.username ? `static:${url.username}` : '',\n secret: url.password ? `static:${url.password}` : '',\n } as types.storageOptions;\n }\n case 'file:':\n return {\n type: 'FS',\n rootPath: url.pathname,\n };\n\n default:\n throw new Error(`storage protocol '${url.protocol}' is not supported`);\n }\n}\n\nexport function loadDefaults(jwtKey: string, options?: types.plOptions): types.plSettings {\n const localRoot = options?.localRoot ?? state.instanceDir('default');\n\n const log: types.logSettings = {\n level: options?.log?.level ?? 'info',\n path: options?.log?.path ?? `${localRoot}/logs/platforma.log`,\n };\n\n const grpc: types.grpcSettings = {\n listen: options?.grpc?.listen ?? 'localhost:6345',\n tls: {\n enable: defaultBool(options?.grpc?.tls?.enable, false),\n clientAuthMode: options?.grpc?.tls?.clientAuthMode ?? 'NoAuth',\n certFile: options?.grpc?.tls?.certFile ?? `${localRoot}/certs/tls.cert`,\n keyFile: options?.grpc?.tls?.keyFile ?? `${localRoot}/certs/tls.key`,\n\n ...options?.grpc?.tls,\n },\n };\n\n const core: types.coreSettings = {\n auth: {\n enabled: options?.core?.auth?.enabled ?? false,\n drivers: options?.core?.auth?.drivers ?? [\n { driver: 'jwt', key: jwtKey },\n { driver: 'htpasswd', path: `${localRoot}/users.htpasswd` },\n ],\n },\n db: {\n path: `${localRoot}/db`,\n },\n };\n\n const primary = defaultStorageSettings(\n 'main',\n `${localRoot}/storages/main`,\n 'platforma-primary-bucket',\n options?.storages?.primary,\n );\n\n let work: types.storageSettings;\n const wType = options?.storages?.work?.type;\n switch (wType) {\n case undefined:\n case 'FS':\n work = types.emptyFSSettings('work');\n work.rootPath = options?.storages?.work?.rootPath ?? `${localRoot}/storages/work`;\n work.indexCachePeriod = options?.storages?.work?.indexCachePeriod ?? '1m';\n break;\n\n default:\n throw new Error('work storage MUST have \\'FS\\' type as it is used for working directories management');\n }\n\n const library = defaultStorageSettings(\n 'library',\n `${localRoot}/storages/library`,\n 'platforma-library-bucket',\n options?.storages?.library,\n );\n\n const monitoring: types.monitoringSettings = {\n enabled: defaultBool(options?.monitoring?.enabled, true),\n listen: options?.monitoring?.listen ?? '127.0.0.1:9090',\n };\n const debug: types.debugSettings = {\n enabled: defaultBool(options?.debug?.enabled, true),\n listen: options?.debug?.listen ?? '127.0.0.1:9091',\n };\n const license: types.licenseSettings = {\n value: options?.license?.value ?? '',\n file: options?.license?.file ?? '',\n };\n\n return {\n localRoot,\n license,\n log,\n grpc,\n core,\n monitoring,\n debug,\n numCpu: options?.numCpu,\n storages: { primary, work, library },\n hacks: { libraryDownloadable: true },\n };\n}\n\nfunction defaultStorageSettings(\n storageID: string,\n defaultLocation: string,\n defaultBucket: string,\n options?: types.storageOptions,\n): types.storageSettings {\n let storage: types.storageSettings;\n const pType = options?.type;\n switch (pType) {\n case undefined:\n case 'FS':\n storage = types.emptyFSSettings(storageID);\n storage.rootPath = options?.rootPath ?? defaultLocation;\n break;\n\n case 'S3':\n storage = types.emptyS3Settings(storageID);\n\n storage.endpoint = options?.endpoint;\n storage.region = options?.region;\n storage.presignEndpoint = options?.presignEndpoint ?? options?.endpoint;\n storage.bucketName = options?.bucketName ?? defaultBucket;\n storage.createBucket = defaultBool(options?.createBucket, true);\n storage.forcePathStyle = defaultBool(options?.forcePathStyle, true);\n storage.key = options?.key ?? '';\n storage.secret = options?.secret ?? '';\n storage.keyPrefix = options?.keyPrefix ?? '';\n storage.accessPrefixes = options?.accessPrefixes ?? [''];\n storage.uploadKeyPrefix = options?.uploadKeyPrefix ?? '';\n break;\n\n default:\n assertNever(pType);\n throw new Error('unknown storage type'); // calm down TS type analyzer\n }\n\n return storage;\n}\n\nexport function render(options: types.plSettings): string {\n const disableMon = options.monitoring.enabled ? '' : ' disabled';\n const disableDbg = options.debug.enabled ? '' : ' disabled';\n const libraryDownloadable = options.hacks.libraryDownloadable ? 'true' : 'false';\n let miLicenseSecret = options.license.value;\n if (options.license.file != '') {\n miLicenseSecret = fs.readFileSync(options.license.file).toString().trimEnd();\n }\n\n let cpuLimit = ''\n if (options.numCpu) {\n cpuLimit = `\n resources:\n cpu: ${options.numCpu}\n`;\n }\n\n return `\nlicense:\n value: '${options.license.value}'\n file: '${options.license.file}'\n\nlogging:\n level: '${options.log.level}'\n destinations:\n - path: '${options.log.path}'\n rotation:\n maxSize: 1GiB\n maxBackups: 15\n compress: true\n\nmonitoring${disableMon}:\n listen: '${options.monitoring.listen}'\n\ndebug${disableDbg}:\n listen: '${options.debug.listen}'\n\ncore:\n logging:\n extendedInfo: true\n dumpResourceData: false\n\n grpc:\n listen: '${options.grpc.listen}'\n\n tlsEnabled: ${JSON.stringify(options.grpc.tls.enable)}\n tls:\n clientAuthMode: '${options.grpc.tls.clientAuthMode}'\n certificates:\n - certFile: '${options.grpc.tls.certFile}'\n keyFile: '${options.grpc.tls.keyFile}'\n\n\n authEnabled: ${JSON.stringify(options.core.auth.enabled)}\n auth: ${JSON.stringify(options.core.auth.drivers)}\n db:\n path: '${options.core.db.path}'\n\ncontrollers:\n data:\n main:\n storages:\n main:\n mode: primary\n downloadable: true\n\n library:\n mode: passive\n downloadable: ${libraryDownloadable}\n\n work:\n mode: active\n downloadable: false\n\n storages:\n - ${JSON.stringify(options.storages.primary)}\n - ${JSON.stringify(options.storages.library)}\n - ${JSON.stringify(options.storages.work)}\n\n runner:\n type: local\n storageRoot: '${(options.storages.work).rootPath}'\n workdirCacheOnSuccess: 20m\n workdirCacheOnFailure: 1h\n${cpuLimit}\n secrets:\n - map:\n MI_LICENSE: ${JSON.stringify(miLicenseSecret)}\n\n packageLoader:\n packagesRoot: '${options.localRoot}/packages'\n\n workflows:\n features:\n pureFutureFields: true\n commandExpressions: true\n workdirLimits: true\n computeLimits: false\n`;\n}\n\nfunction defaultBool(v: boolean | undefined, def: boolean): boolean {\n return v === undefined ? def : v;\n}\n"],"names":["types.emptyFSSettings","types.emptyS3Settings","fs"],"mappings":"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"}
|
package/dist/util.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import os__default from 'node:os';
|
|
2
|
-
import
|
|
2
|
+
import fs__default from 'node:fs';
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import { execSync } from 'node:child_process';
|
|
5
5
|
import winston from 'winston';
|
|
@@ -49,12 +49,12 @@ function resolveTilde(p) {
|
|
|
49
49
|
return p;
|
|
50
50
|
}
|
|
51
51
|
function ensureDir(p, options) {
|
|
52
|
-
if (
|
|
52
|
+
if (fs__default.existsSync(p)) {
|
|
53
53
|
return;
|
|
54
54
|
}
|
|
55
|
-
|
|
55
|
+
fs__default.mkdirSync(p, { recursive: true });
|
|
56
56
|
if (options?.mode) {
|
|
57
|
-
|
|
57
|
+
fs__default.chmodSync(p, options.mode);
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
60
|
function getProcessName(pid) {
|
package/dist/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sources":["../src/util.ts"],"sourcesContent":["import os from 'node:os';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { execSync } from 'node:child_process';\n\nimport winston from 'winston';\nimport { randomBytes } from 'node:crypto';\nimport readlineSync from 'readline-sync';\n\nexport function askYN(prompt: string): boolean {\n const answer = readlineSync.question(`${prompt} [y/N] `);\n return answer.toLowerCase() === 'y';\n}\n\nexport function assertNever(n: never) {\n throw new Error('this should never happen');\n}\n\nexport function createLogger(level: string = 'debug'): winston.Logger {\n return winston.createLogger({\n level: level,\n\n format: winston.format.printf(({ level, message }) => {\n const indent = ' '.repeat(level.length + 2); // For ': ' after the level\n if (typeof message !== 'string') {\n const messageJson = JSON.stringify(message);\n throw Error(`logger message ${messageJson} is not a string`);\n }\n const indentedMessage = message\n .split('\\n')\n .map((line: string, index: number) => (index === 0 ? line : indent + line))\n .join('\\n');\n\n const colorize = (l: string) => winston.format.colorize().colorize(l, l);\n\n return `${colorize(level)}: ${indentedMessage}`;\n }),\n\n transports: [\n new winston.transports.Console({\n stderrLevels: ['error', 'warn', 'info', 'debug'],\n handleExceptions: true,\n }),\n ],\n });\n}\n\nexport function randomStr(len: number): string {\n return randomBytes(Math.ceil(len / 2))\n .toString('hex')\n .slice(0, len);\n}\n\nexport function resolveTilde(p: string): string {\n if (p.startsWith('~')) {\n return path.join(os.homedir(), p.slice(1));\n }\n return p;\n}\n\nexport function ensureDir(p: string, options?: {\n mode?: fs.Mode;\n}) {\n if (fs.existsSync(p)) {\n return;\n }\n\n fs.mkdirSync(p, { recursive: true });\n if (options?.mode) {\n fs.chmodSync(p, options.mode);\n }\n}\n\nexport function getProcessName(pid: number): string {\n try {\n if (os.platform() !== 'win32') {\n return execSync(`ps -p ${pid} -o comm=`, { encoding: 'utf8' }).trim();\n }\n\n const command = `wmic process where processid=${pid} get Caption`;\n const lines = execSync(command, { encoding: 'utf8' }).split('\\n');\n\n // lines = [\"Caption:\", \"<process name>\"]\n if (lines.length <= 1) {\n return '';\n }\n\n return lines[1].trim();\n } catch (e) {\n return '';\n }\n}\n\nexport type dockerComposeStatus = {\n Name: string;\n Status: string;\n ConfigFiles: string;\n};\n\nexport function getDockerComposeInfo(serviceName: string): dockerComposeStatus | undefined {\n const result = execSync(`docker compose ls --filter name=${serviceName} --format json`, { encoding: 'utf8' }).trim();\n\n const report = JSON.parse(result) as dockerComposeStatus[];\n\n for (const st of report) {\n if (st.Name === serviceName) {\n return st;\n }\n }\n\n return undefined;\n}\n"],"names":["os"],"mappings":";;;;;;;;AASM,SAAU,KAAK,CAAC,MAAc,EAAA;IAClC,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA,EAAG,MAAM,CAAA,OAAA,CAAS,CAAC;AACxD,IAAA,OAAO,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG;AACrC;AAEM,SAAU,WAAW,CAAC,CAAQ,EAAA;AAClC,IAAA,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC;AAC7C;AAEM,SAAU,YAAY,CAAC,KAAA,GAAgB,OAAO,EAAA;IAClD,OAAO,OAAO,CAAC,YAAY,CAAC;AAC1B,QAAA,KAAK,EAAE,KAAK;AAEZ,QAAA,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAI;AACnD,YAAA,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC5C,YAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;gBAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;AAC3C,gBAAA,MAAM,KAAK,CAAC,CAAA,eAAA,EAAkB,WAAW,CAAA,gBAAA,CAAkB,CAAC;YAC9D;YACA,MAAM,eAAe,GAAG;iBACrB,KAAK,CAAC,IAAI;iBACV,GAAG,CAAC,CAAC,IAAY,EAAE,KAAa,MAAM,KAAK,KAAK,CAAC,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;iBACzE,IAAI,CAAC,IAAI,CAAC;YAEb,MAAM,QAAQ,GAAG,CAAC,CAAS,KAAK,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;YAExE,OAAO,CAAA,EAAG,QAAQ,CAAC,KAAK,CAAC,CAAA,EAAA,EAAK,eAAe,EAAE;AACjD,QAAA,CAAC,CAAC;AAEF,QAAA,UAAU,EAAE;AACV,YAAA,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;gBAC7B,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC;AAChD,gBAAA,gBAAgB,EAAE,IAAI;aACvB,CAAC;AACH,SAAA;AACF,KAAA,CAAC;AACJ;AAEM,SAAU,SAAS,CAAC,GAAW,EAAA;IACnC,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;SAClC,QAAQ,CAAC,KAAK;AACd,SAAA,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;AAClB;AAEM,SAAU,YAAY,CAAC,CAAS,EAAA;AACpC,IAAA,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AACrB,QAAA,OAAO,IAAI,CAAC,IAAI,CAACA,WAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5C;AACA,IAAA,OAAO,CAAC;AACV;AAEM,SAAU,SAAS,CAAC,CAAS,EAAE,OAEpC,EAAA;AACC,IAAA,
|
|
1
|
+
{"version":3,"file":"util.js","sources":["../src/util.ts"],"sourcesContent":["import os from 'node:os';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { execSync } from 'node:child_process';\n\nimport winston from 'winston';\nimport { randomBytes } from 'node:crypto';\nimport readlineSync from 'readline-sync';\n\nexport function askYN(prompt: string): boolean {\n const answer = readlineSync.question(`${prompt} [y/N] `);\n return answer.toLowerCase() === 'y';\n}\n\nexport function assertNever(n: never) {\n throw new Error('this should never happen');\n}\n\nexport function createLogger(level: string = 'debug'): winston.Logger {\n return winston.createLogger({\n level: level,\n\n format: winston.format.printf(({ level, message }) => {\n const indent = ' '.repeat(level.length + 2); // For ': ' after the level\n if (typeof message !== 'string') {\n const messageJson = JSON.stringify(message);\n throw Error(`logger message ${messageJson} is not a string`);\n }\n const indentedMessage = message\n .split('\\n')\n .map((line: string, index: number) => (index === 0 ? line : indent + line))\n .join('\\n');\n\n const colorize = (l: string) => winston.format.colorize().colorize(l, l);\n\n return `${colorize(level)}: ${indentedMessage}`;\n }),\n\n transports: [\n new winston.transports.Console({\n stderrLevels: ['error', 'warn', 'info', 'debug'],\n handleExceptions: true,\n }),\n ],\n });\n}\n\nexport function randomStr(len: number): string {\n return randomBytes(Math.ceil(len / 2))\n .toString('hex')\n .slice(0, len);\n}\n\nexport function resolveTilde(p: string): string {\n if (p.startsWith('~')) {\n return path.join(os.homedir(), p.slice(1));\n }\n return p;\n}\n\nexport function ensureDir(p: string, options?: {\n mode?: fs.Mode;\n}) {\n if (fs.existsSync(p)) {\n return;\n }\n\n fs.mkdirSync(p, { recursive: true });\n if (options?.mode) {\n fs.chmodSync(p, options.mode);\n }\n}\n\nexport function getProcessName(pid: number): string {\n try {\n if (os.platform() !== 'win32') {\n return execSync(`ps -p ${pid} -o comm=`, { encoding: 'utf8' }).trim();\n }\n\n const command = `wmic process where processid=${pid} get Caption`;\n const lines = execSync(command, { encoding: 'utf8' }).split('\\n');\n\n // lines = [\"Caption:\", \"<process name>\"]\n if (lines.length <= 1) {\n return '';\n }\n\n return lines[1].trim();\n } catch (e) {\n return '';\n }\n}\n\nexport type dockerComposeStatus = {\n Name: string;\n Status: string;\n ConfigFiles: string;\n};\n\nexport function getDockerComposeInfo(serviceName: string): dockerComposeStatus | undefined {\n const result = execSync(`docker compose ls --filter name=${serviceName} --format json`, { encoding: 'utf8' }).trim();\n\n const report = JSON.parse(result) as dockerComposeStatus[];\n\n for (const st of report) {\n if (st.Name === serviceName) {\n return st;\n }\n }\n\n return undefined;\n}\n"],"names":["os","fs"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@platforma-sdk/bootstrap",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.0.0",
|
|
4
4
|
"description": "MiLaboratories Platforma Backend bootstrap code: configuration generators, service run wrappers and so on",
|
|
5
5
|
"bin": {
|
|
6
6
|
"pl-dev": "./bin/run.js"
|
|
@@ -25,11 +25,11 @@
|
|
|
25
25
|
"ts-jest": "^29.2.6",
|
|
26
26
|
"ts-node": "^10.9.2",
|
|
27
27
|
"typescript": "~5.6.3",
|
|
28
|
-
"@milaboratories/build-configs": "1.0.6",
|
|
29
|
-
"@milaboratories/oclif-index": "1.1.1",
|
|
30
28
|
"@milaboratories/eslint-config": "^1.0.4",
|
|
29
|
+
"@milaboratories/oclif-index": "1.1.1",
|
|
31
30
|
"@milaboratories/ts-configs": "1.0.6",
|
|
32
|
-
"@milaboratories/
|
|
31
|
+
"@milaboratories/build-configs": "1.0.7",
|
|
32
|
+
"@milaboratories/ts-builder": "1.0.3"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"@oclif/core": "^4.0.37",
|