@platforma-sdk/bootstrap 5.3.4 → 5.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/_rolldown/runtime.cjs +7 -13
- package/dist/block.cjs +2 -3
- package/dist/block.cjs.map +1 -1
- package/dist/block.js +1 -2
- package/dist/block.js.map +1 -1
- package/dist/cmd-opts.cjs +6 -7
- package/dist/cmd-opts.cjs.map +1 -1
- package/dist/cmd-opts.js +5 -6
- package/dist/cmd-opts.js.map +1 -1
- package/dist/commands/create-block.cjs +5 -6
- package/dist/commands/create-block.cjs.map +1 -1
- package/dist/commands/create-block.d.ts +2 -2
- package/dist/commands/create-block.d.ts.map +1 -0
- package/dist/commands/create-block.js +2 -4
- package/dist/commands/create-block.js.map +1 -1
- package/dist/commands/reset.cjs +5 -6
- package/dist/commands/reset.cjs.map +1 -1
- package/dist/commands/reset.d.ts +2 -2
- package/dist/commands/reset.d.ts.map +1 -0
- package/dist/commands/reset.js +1 -2
- package/dist/commands/reset.js.map +1 -1
- package/dist/commands/start/docker/s3.cjs +6 -7
- package/dist/commands/start/docker/s3.cjs.map +1 -1
- package/dist/commands/start/docker/s3.d.ts +22 -22
- package/dist/commands/start/docker/s3.d.ts.map +1 -0
- package/dist/commands/start/docker/s3.js +1 -2
- package/dist/commands/start/docker/s3.js.map +1 -1
- package/dist/commands/start/docker.cjs +6 -7
- package/dist/commands/start/docker.cjs.map +1 -1
- package/dist/commands/start/docker.d.ts +22 -22
- package/dist/commands/start/docker.d.ts.map +1 -0
- package/dist/commands/start/docker.js +1 -2
- package/dist/commands/start/docker.js.map +1 -1
- package/dist/commands/start/local/s3.cjs +7 -8
- package/dist/commands/start/local/s3.cjs.map +1 -1
- package/dist/commands/start/local/s3.d.ts +26 -26
- package/dist/commands/start/local/s3.d.ts.map +1 -0
- package/dist/commands/start/local/s3.js +1 -2
- package/dist/commands/start/local/s3.js.map +1 -1
- package/dist/commands/start/local.cjs +7 -8
- package/dist/commands/start/local.cjs.map +1 -1
- package/dist/commands/start/local.d.ts +24 -24
- package/dist/commands/start/local.d.ts.map +1 -0
- package/dist/commands/start/local.js +1 -2
- package/dist/commands/start/local.js.map +1 -1
- package/dist/commands/start.cjs +5 -6
- package/dist/commands/start.cjs.map +1 -1
- package/dist/commands/start.d.ts +2 -2
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +1 -2
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/stop.cjs +6 -7
- package/dist/commands/stop.cjs.map +1 -1
- package/dist/commands/stop.d.ts +2 -2
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +1 -2
- package/dist/commands/stop.js.map +1 -1
- package/dist/commands/svc/create/arg-parser.cjs +1 -2
- package/dist/commands/svc/create/arg-parser.cjs.map +1 -1
- package/dist/commands/svc/create/arg-parser.js +1 -1
- package/dist/commands/svc/create/arg-parser.js.map +1 -1
- package/dist/commands/svc/create/docker/s3.cjs +7 -8
- package/dist/commands/svc/create/docker/s3.cjs.map +1 -1
- package/dist/commands/svc/create/docker/s3.d.ts +23 -23
- package/dist/commands/svc/create/docker/s3.d.ts.map +1 -0
- package/dist/commands/svc/create/docker/s3.js +1 -2
- package/dist/commands/svc/create/docker/s3.js.map +1 -1
- package/dist/commands/svc/create/docker.cjs +7 -8
- package/dist/commands/svc/create/docker.cjs.map +1 -1
- package/dist/commands/svc/create/docker.d.ts +23 -23
- package/dist/commands/svc/create/docker.d.ts.map +1 -0
- package/dist/commands/svc/create/docker.js +1 -2
- package/dist/commands/svc/create/docker.js.map +1 -1
- package/dist/commands/svc/create/local/s3.cjs +8 -9
- package/dist/commands/svc/create/local/s3.cjs.map +1 -1
- package/dist/commands/svc/create/local/s3.d.ts +27 -27
- package/dist/commands/svc/create/local/s3.d.ts.map +1 -0
- package/dist/commands/svc/create/local/s3.js +1 -2
- package/dist/commands/svc/create/local/s3.js.map +1 -1
- package/dist/commands/svc/create/local.cjs +8 -9
- package/dist/commands/svc/create/local.cjs.map +1 -1
- package/dist/commands/svc/create/local.d.ts +25 -25
- package/dist/commands/svc/create/local.d.ts.map +1 -0
- package/dist/commands/svc/create/local.js +1 -2
- package/dist/commands/svc/create/local.js.map +1 -1
- package/dist/commands/svc/delete.cjs +5 -6
- package/dist/commands/svc/delete.cjs.map +1 -1
- package/dist/commands/svc/delete.d.ts +4 -4
- package/dist/commands/svc/delete.d.ts.map +1 -0
- package/dist/commands/svc/delete.js +1 -2
- package/dist/commands/svc/delete.js.map +1 -1
- package/dist/commands/svc/down.cjs +6 -7
- package/dist/commands/svc/down.cjs.map +1 -1
- package/dist/commands/svc/down.d.ts +3 -3
- package/dist/commands/svc/down.d.ts.map +1 -0
- package/dist/commands/svc/down.js +1 -2
- package/dist/commands/svc/down.js.map +1 -1
- package/dist/commands/svc/list.cjs +3 -4
- package/dist/commands/svc/list.cjs.map +1 -1
- package/dist/commands/svc/list.d.ts.map +1 -0
- package/dist/commands/svc/list.js +1 -2
- package/dist/commands/svc/list.js.map +1 -1
- package/dist/commands/svc/up.cjs +6 -7
- package/dist/commands/svc/up.cjs.map +1 -1
- package/dist/commands/svc/up.d.ts +3 -3
- package/dist/commands/svc/up.d.ts.map +1 -0
- package/dist/commands/svc/up.js +1 -2
- package/dist/commands/svc/up.js.map +1 -1
- package/dist/core.cjs +9 -10
- package/dist/core.cjs.map +1 -1
- package/dist/core.js +1 -2
- package/dist/core.js.map +1 -1
- package/dist/index.cjs +18 -19
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/package.cjs +2 -3
- package/dist/package.cjs.map +1 -1
- package/dist/package.js +1 -2
- package/dist/package.js.map +1 -1
- package/dist/platforma.cjs +3 -4
- package/dist/platforma.cjs.map +1 -1
- package/dist/platforma.js +1 -2
- package/dist/platforma.js.map +1 -1
- package/dist/run.cjs +3 -4
- package/dist/run.cjs.map +1 -1
- package/dist/run.js +1 -2
- package/dist/run.js.map +1 -1
- package/dist/state.cjs +4 -5
- package/dist/state.cjs.map +1 -1
- package/dist/state.js +1 -2
- package/dist/state.js.map +1 -1
- package/dist/templates/compose.cjs +2 -3
- package/dist/templates/compose.cjs.map +1 -1
- package/dist/templates/compose.js +1 -2
- package/dist/templates/compose.js.map +1 -1
- package/dist/templates/pl-config.cjs +5 -6
- package/dist/templates/pl-config.cjs.map +1 -1
- package/dist/templates/pl-config.js +1 -2
- package/dist/templates/pl-config.js.map +1 -1
- package/dist/templates/types.cjs +1 -2
- package/dist/templates/types.cjs.map +1 -1
- package/dist/templates/types.js +1 -1
- package/dist/util.cjs +2 -3
- package/dist/util.cjs.map +1 -1
- package/dist/util.js +1 -2
- package/dist/util.js.map +1 -1
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose.js","names":[],"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<\n string,\n {\n platform?: string;\n environment?: string[];\n volumes?: string[];\n command?: string[];\n }\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(\n `file '${composeSource}' seems to be not a docker-compose file or has unsupported version`,\n );\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(\n `docker compose '${composeSource}' has no declaration of service '${svcName}'`,\n );\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"],"mappings":"
|
|
1
|
+
{"version":3,"file":"compose.js","names":[],"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<\n string,\n {\n platform?: string;\n environment?: string[];\n volumes?: string[];\n command?: string[];\n }\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(\n `file '${composeSource}' seems to be not a docker-compose file or has unsupported version`,\n );\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(\n `docker compose '${composeSource}' has no declaration of service '${svcName}'`,\n );\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"],"mappings":";;;AA8BA,SAAgB,OACd,eACA,aACA,YACA,UACA,SAGA;CACA,MAAM,iBAAiB,GAAG,aAAa,eAAe,EAAE,UAAU,SAAS,CAAC;CAC5E,MAAM,UAAU,KAAK,MAAM,eAAe,UAAU,CAAC;AAErD,KAAI,CAAC,QAAQ,SACX,OAAM,IAAI,MACR,SAAS,cAAc,oEACxB;AAGH,KAAI;OACG,MAAM,WAAW,OAAO,KAAK,QAAQ,SAAS,CACjD,KAAI,CAAC,SAAS,IAAI,QAAQ,CACxB,QAAO,QAAQ,SAAS;;AAK9B,SAAQ,OAAO;AAEf,MAAK,MAAM,CAAC,SAAS,YAAY,UAAU,SAAS,IAAI,EAAE,EAAE;EAC1D,MAAM,UAAU,QAAQ,SAAS;AAEjC,MAAI,CAAC,QACH,OAAM,IAAI,MACR,mBAAmB,cAAc,mCAAmC,QAAQ,GAC7E;AAGH,MAAI,QAAQ,SACV,SAAQ,WAAW,QAAQ;AAG7B,MAAI,QAAQ,MAAM;AAChB,OAAI,CAAC,QAAQ,YACX,SAAQ,cAAc,EAAE;AAE1B,QAAK,IAAI,WAAW,GAAG,YAAY,SAAS,YAAY,UAAU,KAAM;IAEtE,MAAM,UADkB,QAAQ,YAAY,UACpB,MAAM,IAAI,CAAC;AACnC,QAAI,QAAQ,KAAK,UAAU;KAEzB,MAAM,OAAO,QAAQ,YAAY,KAAK;AAGtC,SAAI,QAAQ,QAAQ,YAAY,WAAW,SACzC,SAAQ,YAAY,YAAY;UAGlC;;AAIJ,QAAK,MAAM,CAAC,SAAS,aAAa,OAAO,QAAQ,QAAQ,KAAK,CAC5D,SAAQ,YAAY,KAAK,GAAG,QAAQ,GAAG,WAAW;;AAItD,MAAI,QAAQ,QAAQ;AAClB,OAAI,CAAC,QAAQ,QACX,SAAQ,UAAU,EAAE;AAEtB,QAAK,MAAM,SAAS,QAAQ,OAC1B,SAAQ,QAAQ,KAAK,GAAG,MAAM,SAAS,GAAG,MAAM,gBAAgB;;AAIpE,MAAI,QAAQ,SACV,SAAQ,UAAU,QAAQ;;AAI9B,KAAI,SAAS,YACX,QAAO,QAAQ;AAGjB,IAAG,cAAc,aAAa,KAAK,UAAU,QAAQ,CAAC"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
const require_runtime = require(
|
|
2
|
-
const require_util = require(
|
|
3
|
-
const require_state = require(
|
|
4
|
-
const require_types = require(
|
|
1
|
+
const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
|
|
2
|
+
const require_util = require("../util.cjs");
|
|
3
|
+
const require_state = require("../state.cjs");
|
|
4
|
+
const require_types = require("./types.cjs");
|
|
5
5
|
let node_fs = require("node:fs");
|
|
6
6
|
node_fs = require_runtime.__toESM(node_fs);
|
|
7
|
-
|
|
8
7
|
//#region src/templates/pl-config.ts
|
|
9
8
|
function storageSettingsFromURL(storageURL, baseDir, defaults) {
|
|
10
9
|
storageURL = require_util.resolveTilde(storageURL);
|
|
@@ -254,9 +253,9 @@ ${cpuLimit}
|
|
|
254
253
|
function defaultBool(v, def) {
|
|
255
254
|
return v === void 0 ? def : v;
|
|
256
255
|
}
|
|
257
|
-
|
|
258
256
|
//#endregion
|
|
259
257
|
exports.loadDefaults = loadDefaults;
|
|
260
258
|
exports.render = render;
|
|
261
259
|
exports.storageSettingsFromURL = storageSettingsFromURL;
|
|
260
|
+
|
|
262
261
|
//# sourceMappingURL=pl-config.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pl-config.cjs","names":["resolveTilde","state","fs"],"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(\n \"work storage MUST have 'FS' type as it is used for working directories management\",\n );\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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pl-config.cjs","names":["resolveTilde","state","fs"],"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(\n \"work storage MUST have 'FS' type as it is used for working directories management\",\n );\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"],"mappings":"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"}
|
|
@@ -2,7 +2,6 @@ import { assertNever, resolveTilde } from "../util.js";
|
|
|
2
2
|
import state_default from "../state.js";
|
|
3
3
|
import { emptyFSSettings, emptyS3Settings } from "./types.js";
|
|
4
4
|
import fs from "node:fs";
|
|
5
|
-
|
|
6
5
|
//#region src/templates/pl-config.ts
|
|
7
6
|
function storageSettingsFromURL(storageURL, baseDir, defaults) {
|
|
8
7
|
storageURL = resolveTilde(storageURL);
|
|
@@ -252,7 +251,7 @@ ${cpuLimit}
|
|
|
252
251
|
function defaultBool(v, def) {
|
|
253
252
|
return v === void 0 ? def : v;
|
|
254
253
|
}
|
|
255
|
-
|
|
256
254
|
//#endregion
|
|
257
255
|
export { loadDefaults, render, storageSettingsFromURL };
|
|
256
|
+
|
|
258
257
|
//# sourceMappingURL=pl-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pl-config.js","names":["state","types.emptyFSSettings","types.emptyS3Settings"],"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(\n \"work storage MUST have 'FS' type as it is used for working directories management\",\n );\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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pl-config.js","names":["state","types.emptyFSSettings","types.emptyS3Settings"],"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(\n \"work storage MUST have 'FS' type as it is used for working directories management\",\n );\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"],"mappings":"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"}
|
package/dist/templates/types.cjs
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
1
|
//#region src/templates/types.ts
|
|
3
2
|
function emptyS3Settings(id) {
|
|
4
3
|
return {
|
|
@@ -25,8 +24,8 @@ function emptyFSSettings(id) {
|
|
|
25
24
|
rootPath: ""
|
|
26
25
|
};
|
|
27
26
|
}
|
|
28
|
-
|
|
29
27
|
//#endregion
|
|
30
28
|
exports.emptyFSSettings = emptyFSSettings;
|
|
31
29
|
exports.emptyS3Settings = emptyS3Settings;
|
|
30
|
+
|
|
32
31
|
//# sourceMappingURL=types.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.cjs","names":[],"sources":["../../src/templates/types.ts"],"sourcesContent":["export type plSettings = {\n localRoot: string;\n\n license: licenseSettings;\n log: logSettings;\n grpc: grpcSettings;\n core: coreSettings;\n storages: storagesSettings;\n\n monitoring: monitoringSettings;\n debug: debugSettings;\n\n numCpu?: number;\n\n hacks: {\n libraryDownloadable: boolean;\n };\n};\nexport type plOptions = {\n localRoot?: string;\n\n license?: licenseOptions;\n log?: logOptions;\n grpc?: grpcOptions;\n core?: coreOptions;\n storages?: storagesOptions;\n\n numCpu?: number;\n\n monitoring?: monitoringOptions;\n debug?: debugOptions;\n};\n\nexport type licenseSettings = {\n value: string;\n file: string;\n};\nexport type licenseOptions = DeepPartial<licenseSettings>;\n\nexport type logSettings = {\n level: string;\n path: string;\n};\nexport type logOptions = DeepPartial<logSettings>;\n\nexport type coreSettings = {\n auth: authSettings;\n db: dbSettings;\n};\nexport type coreOptions = {\n auth?: authOptions;\n db?: dbOptions;\n};\n\nexport type authSettings = {\n enabled: boolean;\n drivers: authDriver[];\n};\nexport type authOptions = Partial<authSettings>;\n\nexport type dbSettings = {\n path: string;\n};\nexport type dbOptions = Partial<dbSettings>;\n\nexport type authDriver =\n | {\n driver: \"ldap\";\n serverUrl: string; // 'ldaps://ldap.example.com:1111'\n defaultDN: string; // 'cn=%u,ou=users,ou=users,dc=example,dc=com'\n }\n | {\n driver: \"jwt\";\n key: string;\n }\n | {\n driver: \"htpasswd\";\n path: string;\n };\n\nexport type grpcSettings = {\n listen: string;\n tls: tlsSettings;\n};\nexport type grpcOptions = Partial<grpcSettings>;\n\nexport type tlsSettings = {\n enable: boolean;\n clientAuthMode: tlsAuthMode;\n certFile: string;\n keyFile: string;\n};\nexport type tlsOptions = Partial<tlsSettings>;\n\nexport type tlsAuthMode =\n | \"NoAuth\"\n | \"RequestAnyCert\"\n | \"RequireAnyCert\"\n | \"RequestValidCert\"\n | \"RequireValidCert\";\n\nexport type storagesSettings = {\n primary: storageSettings;\n work: fsStorageSettings;\n library: storageSettings;\n};\nexport type storagesOptions = {\n primary?: storageOptions;\n work?: storageOptions;\n library?: storageOptions;\n};\n\nexport type storageSettings = s3StorageSettings | fsStorageSettings;\nexport type storageOptions = s3StorageOptions | fsStorageOptions;\n\ntype storageID = { id: string };\ntype commonStorageSettings = {\n indexCachePeriod: string;\n};\n\nexport type s3StorageSettings = storageID &\n s3StorageType &\n commonStorageSettings &\n s3StorageTypeSettings;\nexport type s3StorageOptions = s3StorageType &\n Partial<commonStorageSettings> &\n Partial<s3StorageTypeSettings>;\nexport function emptyS3Settings(id: string): s3StorageSettings {\n return {\n id: id,\n type: \"S3\",\n indexCachePeriod: \"0s\",\n endpoint: \"\",\n region: \"\",\n bucketName: \"\",\n createBucket: false,\n forcePathStyle: false,\n key: \"\",\n secret: \"\",\n keyPrefix: \"\",\n accessPrefixes: [],\n uploadKeyPrefix: \"\",\n };\n}\n\ntype s3StorageType = { type: \"S3\" };\ntype s3StorageTypeSettings = {\n endpoint?: string;\n presignEndpoint?: string;\n region?: string;\n bucketName: string;\n createBucket: boolean;\n forcePathStyle: boolean;\n key: string;\n secret: string;\n keyPrefix: string;\n accessPrefixes: string[];\n uploadKeyPrefix: string;\n};\n\nexport type fsStorageSettings = storageID &\n fsStorageType &\n commonStorageSettings &\n fsStorageTypeSettings;\nexport type fsStorageOptions = fsStorageType &\n Partial<commonStorageSettings> &\n Partial<fsStorageTypeSettings>;\nexport function emptyFSSettings(id: string): fsStorageSettings {\n return {\n id: id,\n type: \"FS\",\n indexCachePeriod: \"0s\",\n rootPath: \"\",\n };\n}\n\ntype fsStorageType = { type: \"FS\" };\ntype fsStorageTypeSettings = {\n rootPath: string;\n};\n\nexport type monitoringSettings = {\n enabled: boolean;\n listen: string;\n};\nexport type monitoringOptions = Partial<monitoringSettings>;\n\nexport type debugSettings = {\n enabled: boolean;\n listen: string;\n};\nexport type debugOptions = Partial<debugSettings>;\n\n/** Makes all keys and keys in sub-objects optional. */\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.cjs","names":[],"sources":["../../src/templates/types.ts"],"sourcesContent":["export type plSettings = {\n localRoot: string;\n\n license: licenseSettings;\n log: logSettings;\n grpc: grpcSettings;\n core: coreSettings;\n storages: storagesSettings;\n\n monitoring: monitoringSettings;\n debug: debugSettings;\n\n numCpu?: number;\n\n hacks: {\n libraryDownloadable: boolean;\n };\n};\nexport type plOptions = {\n localRoot?: string;\n\n license?: licenseOptions;\n log?: logOptions;\n grpc?: grpcOptions;\n core?: coreOptions;\n storages?: storagesOptions;\n\n numCpu?: number;\n\n monitoring?: monitoringOptions;\n debug?: debugOptions;\n};\n\nexport type licenseSettings = {\n value: string;\n file: string;\n};\nexport type licenseOptions = DeepPartial<licenseSettings>;\n\nexport type logSettings = {\n level: string;\n path: string;\n};\nexport type logOptions = DeepPartial<logSettings>;\n\nexport type coreSettings = {\n auth: authSettings;\n db: dbSettings;\n};\nexport type coreOptions = {\n auth?: authOptions;\n db?: dbOptions;\n};\n\nexport type authSettings = {\n enabled: boolean;\n drivers: authDriver[];\n};\nexport type authOptions = Partial<authSettings>;\n\nexport type dbSettings = {\n path: string;\n};\nexport type dbOptions = Partial<dbSettings>;\n\nexport type authDriver =\n | {\n driver: \"ldap\";\n serverUrl: string; // 'ldaps://ldap.example.com:1111'\n defaultDN: string; // 'cn=%u,ou=users,ou=users,dc=example,dc=com'\n }\n | {\n driver: \"jwt\";\n key: string;\n }\n | {\n driver: \"htpasswd\";\n path: string;\n };\n\nexport type grpcSettings = {\n listen: string;\n tls: tlsSettings;\n};\nexport type grpcOptions = Partial<grpcSettings>;\n\nexport type tlsSettings = {\n enable: boolean;\n clientAuthMode: tlsAuthMode;\n certFile: string;\n keyFile: string;\n};\nexport type tlsOptions = Partial<tlsSettings>;\n\nexport type tlsAuthMode =\n | \"NoAuth\"\n | \"RequestAnyCert\"\n | \"RequireAnyCert\"\n | \"RequestValidCert\"\n | \"RequireValidCert\";\n\nexport type storagesSettings = {\n primary: storageSettings;\n work: fsStorageSettings;\n library: storageSettings;\n};\nexport type storagesOptions = {\n primary?: storageOptions;\n work?: storageOptions;\n library?: storageOptions;\n};\n\nexport type storageSettings = s3StorageSettings | fsStorageSettings;\nexport type storageOptions = s3StorageOptions | fsStorageOptions;\n\ntype storageID = { id: string };\ntype commonStorageSettings = {\n indexCachePeriod: string;\n};\n\nexport type s3StorageSettings = storageID &\n s3StorageType &\n commonStorageSettings &\n s3StorageTypeSettings;\nexport type s3StorageOptions = s3StorageType &\n Partial<commonStorageSettings> &\n Partial<s3StorageTypeSettings>;\nexport function emptyS3Settings(id: string): s3StorageSettings {\n return {\n id: id,\n type: \"S3\",\n indexCachePeriod: \"0s\",\n endpoint: \"\",\n region: \"\",\n bucketName: \"\",\n createBucket: false,\n forcePathStyle: false,\n key: \"\",\n secret: \"\",\n keyPrefix: \"\",\n accessPrefixes: [],\n uploadKeyPrefix: \"\",\n };\n}\n\ntype s3StorageType = { type: \"S3\" };\ntype s3StorageTypeSettings = {\n endpoint?: string;\n presignEndpoint?: string;\n region?: string;\n bucketName: string;\n createBucket: boolean;\n forcePathStyle: boolean;\n key: string;\n secret: string;\n keyPrefix: string;\n accessPrefixes: string[];\n uploadKeyPrefix: string;\n};\n\nexport type fsStorageSettings = storageID &\n fsStorageType &\n commonStorageSettings &\n fsStorageTypeSettings;\nexport type fsStorageOptions = fsStorageType &\n Partial<commonStorageSettings> &\n Partial<fsStorageTypeSettings>;\nexport function emptyFSSettings(id: string): fsStorageSettings {\n return {\n id: id,\n type: \"FS\",\n indexCachePeriod: \"0s\",\n rootPath: \"\",\n };\n}\n\ntype fsStorageType = { type: \"FS\" };\ntype fsStorageTypeSettings = {\n rootPath: string;\n};\n\nexport type monitoringSettings = {\n enabled: boolean;\n listen: string;\n};\nexport type monitoringOptions = Partial<monitoringSettings>;\n\nexport type debugSettings = {\n enabled: boolean;\n listen: string;\n};\nexport type debugOptions = Partial<debugSettings>;\n\n/** Makes all keys and keys in sub-objects optional. */\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n"],"mappings":";AA+HA,SAAgB,gBAAgB,IAA+B;AAC7D,QAAO;EACD;EACJ,MAAM;EACN,kBAAkB;EAClB,UAAU;EACV,QAAQ;EACR,YAAY;EACZ,cAAc;EACd,gBAAgB;EAChB,KAAK;EACL,QAAQ;EACR,WAAW;EACX,gBAAgB,EAAE;EAClB,iBAAiB;EAClB;;AAyBH,SAAgB,gBAAgB,IAA+B;AAC7D,QAAO;EACD;EACJ,MAAM;EACN,kBAAkB;EAClB,UAAU;EACX"}
|
package/dist/templates/types.js
CHANGED
package/dist/util.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const require_runtime = require(
|
|
1
|
+
const require_runtime = require("./_virtual/_rolldown/runtime.cjs");
|
|
2
2
|
let node_os = require("node:os");
|
|
3
3
|
node_os = require_runtime.__toESM(node_os);
|
|
4
4
|
let node_fs = require("node:fs");
|
|
@@ -11,7 +11,6 @@ winston = require_runtime.__toESM(winston);
|
|
|
11
11
|
let node_crypto = require("node:crypto");
|
|
12
12
|
let readline_sync = require("readline-sync");
|
|
13
13
|
readline_sync = require_runtime.__toESM(readline_sync);
|
|
14
|
-
|
|
15
14
|
//#region src/util.ts
|
|
16
15
|
function askYN(prompt) {
|
|
17
16
|
return readline_sync.default.question(`${prompt} [y/N] `).toLowerCase() === "y";
|
|
@@ -70,7 +69,6 @@ function getDockerComposeInfo(serviceName) {
|
|
|
70
69
|
const report = JSON.parse(result);
|
|
71
70
|
for (const st of report) if (st.Name === serviceName) return st;
|
|
72
71
|
}
|
|
73
|
-
|
|
74
72
|
//#endregion
|
|
75
73
|
exports.askYN = askYN;
|
|
76
74
|
exports.assertNever = assertNever;
|
|
@@ -80,4 +78,5 @@ exports.getDockerComposeInfo = getDockerComposeInfo;
|
|
|
80
78
|
exports.getProcessName = getProcessName;
|
|
81
79
|
exports.randomStr = randomStr;
|
|
82
80
|
exports.resolveTilde = resolveTilde;
|
|
81
|
+
|
|
83
82
|
//# sourceMappingURL=util.cjs.map
|
package/dist/util.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.cjs","names":["readlineSync","path","os","fs"],"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(\n p: string,\n options?: {\n mode?: fs.Mode;\n },\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 {\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`, {\n encoding: \"utf8\",\n }).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"],"mappings":"
|
|
1
|
+
{"version":3,"file":"util.cjs","names":["readlineSync","path","os","fs"],"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(\n p: string,\n options?: {\n mode?: fs.Mode;\n },\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 {\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`, {\n encoding: \"utf8\",\n }).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"],"mappings":";;;;;;;;;;;;;;AASA,SAAgB,MAAM,QAAyB;AAE7C,QADeA,cAAAA,QAAa,SAAS,GAAG,OAAO,SAAS,CAC1C,aAAa,KAAK;;AAGlC,SAAgB,YAAY,IAAW;AACrC,OAAM,IAAI,MAAM,2BAA2B;;AAG7C,SAAgB,aAAa,QAAgB,SAAyB;AACpE,QAAO,QAAA,QAAQ,aAAa;EACnB;EAEP,QAAQ,QAAA,QAAQ,OAAO,QAAQ,EAAE,OAAO,cAAc;GACpD,MAAM,SAAS,IAAI,OAAO,MAAM,SAAS,EAAE;AAC3C,OAAI,OAAO,YAAY,UAAU;IAC/B,MAAM,cAAc,KAAK,UAAU,QAAQ;AAC3C,UAAM,MAAM,kBAAkB,YAAY,kBAAkB;;GAE9D,MAAM,kBAAkB,QACrB,MAAM,KAAK,CACX,KAAK,MAAc,UAAmB,UAAU,IAAI,OAAO,SAAS,KAAM,CAC1E,KAAK,KAAK;GAEb,MAAM,YAAY,MAAc,QAAA,QAAQ,OAAO,UAAU,CAAC,SAAS,GAAG,EAAE;AAExE,UAAO,GAAG,SAAS,MAAM,CAAC,IAAI;IAC9B;EAEF,YAAY,CACV,IAAI,QAAA,QAAQ,WAAW,QAAQ;GAC7B,cAAc;IAAC;IAAS;IAAQ;IAAQ;IAAQ;GAChD,kBAAkB;GACnB,CAAC,CACH;EACF,CAAC;;AAGJ,SAAgB,UAAU,KAAqB;AAC7C,SAAA,GAAA,YAAA,aAAmB,KAAK,KAAK,MAAM,EAAE,CAAC,CACnC,SAAS,MAAM,CACf,MAAM,GAAG,IAAI;;AAGlB,SAAgB,aAAa,GAAmB;AAC9C,KAAI,EAAE,WAAW,IAAI,CACnB,QAAOC,UAAAA,QAAK,KAAKC,QAAAA,QAAG,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC;AAE5C,QAAO;;AAGT,SAAgB,UACd,GACA,SAGA;AACA,KAAIC,QAAAA,QAAG,WAAW,EAAE,CAClB;AAGF,SAAA,QAAG,UAAU,GAAG,EAAE,WAAW,MAAM,CAAC;AACpC,KAAI,SAAS,KACX,SAAA,QAAG,UAAU,GAAG,QAAQ,KAAK;;AAIjC,SAAgB,eAAe,KAAqB;AAClD,KAAI;AACF,MAAID,QAAAA,QAAG,UAAU,KAAK,QACpB,SAAA,GAAA,mBAAA,UAAgB,SAAS,IAAI,YAAY,EAAE,UAAU,QAAQ,CAAC,CAAC,MAAM;EAIvE,MAAM,SAAA,GAAA,mBAAA,UADU,gCAAgC,IAAI,eACpB,EAAE,UAAU,QAAQ,CAAC,CAAC,MAAM,KAAK;AAGjE,MAAI,MAAM,UAAU,EAClB,QAAO;AAGT,SAAO,MAAM,GAAG,MAAM;SAChB;AACN,SAAO;;;AAUX,SAAgB,qBAAqB,aAAsD;CACzF,MAAM,UAAA,GAAA,mBAAA,UAAkB,mCAAmC,YAAY,iBAAiB,EACtF,UAAU,QACX,CAAC,CAAC,MAAM;CAET,MAAM,SAAS,KAAK,MAAM,OAAO;AAEjC,MAAK,MAAM,MAAM,OACf,KAAI,GAAG,SAAS,YACd,QAAO"}
|
package/dist/util.js
CHANGED
|
@@ -5,7 +5,6 @@ import { execSync } from "node:child_process";
|
|
|
5
5
|
import winston from "winston";
|
|
6
6
|
import { randomBytes } from "node:crypto";
|
|
7
7
|
import readlineSync from "readline-sync";
|
|
8
|
-
|
|
9
8
|
//#region src/util.ts
|
|
10
9
|
function askYN(prompt) {
|
|
11
10
|
return readlineSync.question(`${prompt} [y/N] `).toLowerCase() === "y";
|
|
@@ -64,7 +63,7 @@ function getDockerComposeInfo(serviceName) {
|
|
|
64
63
|
const report = JSON.parse(result);
|
|
65
64
|
for (const st of report) if (st.Name === serviceName) return st;
|
|
66
65
|
}
|
|
67
|
-
|
|
68
66
|
//#endregion
|
|
69
67
|
export { askYN, assertNever, createLogger, ensureDir, getDockerComposeInfo, getProcessName, randomStr, resolveTilde };
|
|
68
|
+
|
|
70
69
|
//# sourceMappingURL=util.js.map
|
package/dist/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","names":[],"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(\n p: string,\n options?: {\n mode?: fs.Mode;\n },\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 {\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`, {\n encoding: \"utf8\",\n }).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"],"mappings":"
|
|
1
|
+
{"version":3,"file":"util.js","names":[],"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(\n p: string,\n options?: {\n mode?: fs.Mode;\n },\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 {\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`, {\n encoding: \"utf8\",\n }).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"],"mappings":";;;;;;;;AASA,SAAgB,MAAM,QAAyB;AAE7C,QADe,aAAa,SAAS,GAAG,OAAO,SAAS,CAC1C,aAAa,KAAK;;AAGlC,SAAgB,YAAY,IAAW;AACrC,OAAM,IAAI,MAAM,2BAA2B;;AAG7C,SAAgB,aAAa,QAAgB,SAAyB;AACpE,QAAO,QAAQ,aAAa;EACnB;EAEP,QAAQ,QAAQ,OAAO,QAAQ,EAAE,OAAO,cAAc;GACpD,MAAM,SAAS,IAAI,OAAO,MAAM,SAAS,EAAE;AAC3C,OAAI,OAAO,YAAY,UAAU;IAC/B,MAAM,cAAc,KAAK,UAAU,QAAQ;AAC3C,UAAM,MAAM,kBAAkB,YAAY,kBAAkB;;GAE9D,MAAM,kBAAkB,QACrB,MAAM,KAAK,CACX,KAAK,MAAc,UAAmB,UAAU,IAAI,OAAO,SAAS,KAAM,CAC1E,KAAK,KAAK;GAEb,MAAM,YAAY,MAAc,QAAQ,OAAO,UAAU,CAAC,SAAS,GAAG,EAAE;AAExE,UAAO,GAAG,SAAS,MAAM,CAAC,IAAI;IAC9B;EAEF,YAAY,CACV,IAAI,QAAQ,WAAW,QAAQ;GAC7B,cAAc;IAAC;IAAS;IAAQ;IAAQ;IAAQ;GAChD,kBAAkB;GACnB,CAAC,CACH;EACF,CAAC;;AAGJ,SAAgB,UAAU,KAAqB;AAC7C,QAAO,YAAY,KAAK,KAAK,MAAM,EAAE,CAAC,CACnC,SAAS,MAAM,CACf,MAAM,GAAG,IAAI;;AAGlB,SAAgB,aAAa,GAAmB;AAC9C,KAAI,EAAE,WAAW,IAAI,CACnB,QAAO,KAAK,KAAK,GAAG,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC;AAE5C,QAAO;;AAGT,SAAgB,UACd,GACA,SAGA;AACA,KAAI,GAAG,WAAW,EAAE,CAClB;AAGF,IAAG,UAAU,GAAG,EAAE,WAAW,MAAM,CAAC;AACpC,KAAI,SAAS,KACX,IAAG,UAAU,GAAG,QAAQ,KAAK;;AAIjC,SAAgB,eAAe,KAAqB;AAClD,KAAI;AACF,MAAI,GAAG,UAAU,KAAK,QACpB,QAAO,SAAS,SAAS,IAAI,YAAY,EAAE,UAAU,QAAQ,CAAC,CAAC,MAAM;EAIvE,MAAM,QAAQ,SADE,gCAAgC,IAAI,eACpB,EAAE,UAAU,QAAQ,CAAC,CAAC,MAAM,KAAK;AAGjE,MAAI,MAAM,UAAU,EAClB,QAAO;AAGT,SAAO,MAAM,GAAG,MAAM;SAChB;AACN,SAAO;;;AAUX,SAAgB,qBAAqB,aAAsD;CACzF,MAAM,SAAS,SAAS,mCAAmC,YAAY,iBAAiB,EACtF,UAAU,QACX,CAAC,CAAC,MAAM;CAET,MAAM,SAAS,KAAK,MAAM,OAAO;AAEjC,MAAK,MAAM,MAAM,OACf,KAAI,GAAG,SAAS,YACd,QAAO"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@platforma-sdk/bootstrap",
|
|
3
|
-
"version": "5.3.
|
|
3
|
+
"version": "5.3.6",
|
|
4
4
|
"description": "MiLaboratories Platforma Backend bootstrap code: configuration generators, service run wrappers and so on",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
"tar": "^7.4.3",
|
|
23
23
|
"winston": "^3.17.0",
|
|
24
24
|
"yaml": "^2.8.0",
|
|
25
|
-
"zod": "~3.
|
|
26
|
-
"@milaboratories/pl-deployments": "2.16.
|
|
25
|
+
"zod": "~3.25.76",
|
|
26
|
+
"@milaboratories/pl-deployments": "2.16.6"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
29
|
"@types/decompress": "^4.2.7",
|
|
@@ -31,9 +31,9 @@
|
|
|
31
31
|
"@types/readline-sync": "^1.4.8",
|
|
32
32
|
"ts-node": "^10.9.2",
|
|
33
33
|
"typescript": "~5.9.3",
|
|
34
|
-
"@milaboratories/build-configs": "
|
|
35
|
-
"@milaboratories/ts-builder": "1.3.
|
|
36
|
-
"@milaboratories/ts-configs": "1.2.
|
|
34
|
+
"@milaboratories/build-configs": "2.0.0",
|
|
35
|
+
"@milaboratories/ts-builder": "1.3.1",
|
|
36
|
+
"@milaboratories/ts-configs": "1.2.3",
|
|
37
37
|
"@milaboratories/oclif-index": "1.1.1"
|
|
38
38
|
},
|
|
39
39
|
"oclif": {
|