@platforma-sdk/bootstrap 5.2.41 → 5.2.43

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.
Files changed (168) hide show
  1. package/README.md +10 -2
  2. package/assets/compose-backend.yaml +2 -2
  3. package/bin/run.js +3 -3
  4. package/dist/block.cjs +36 -31
  5. package/dist/block.cjs.map +1 -1
  6. package/dist/block.d.ts +2 -2
  7. package/dist/block.d.ts.map +1 -1
  8. package/dist/block.js +36 -31
  9. package/dist/block.js.map +1 -1
  10. package/dist/cmd-opts.cjs +74 -74
  11. package/dist/cmd-opts.cjs.map +1 -1
  12. package/dist/cmd-opts.d.ts +23 -23
  13. package/dist/cmd-opts.d.ts.map +1 -1
  14. package/dist/cmd-opts.js +74 -74
  15. package/dist/cmd-opts.js.map +1 -1
  16. package/dist/commands/create-block.cjs +3 -3
  17. package/dist/commands/create-block.cjs.map +1 -1
  18. package/dist/commands/create-block.d.ts +2 -2
  19. package/dist/commands/create-block.d.ts.map +1 -1
  20. package/dist/commands/create-block.js +3 -3
  21. package/dist/commands/create-block.js.map +1 -1
  22. package/dist/commands/reset.cjs +3 -3
  23. package/dist/commands/reset.cjs.map +1 -1
  24. package/dist/commands/reset.d.ts +2 -2
  25. package/dist/commands/reset.d.ts.map +1 -1
  26. package/dist/commands/reset.js +3 -3
  27. package/dist/commands/reset.js.map +1 -1
  28. package/dist/commands/start/docker/s3.cjs +18 -18
  29. package/dist/commands/start/docker/s3.cjs.map +1 -1
  30. package/dist/commands/start/docker/s3.d.ts +15 -15
  31. package/dist/commands/start/docker/s3.d.ts.map +1 -1
  32. package/dist/commands/start/docker/s3.js +18 -18
  33. package/dist/commands/start/docker/s3.js.map +1 -1
  34. package/dist/commands/start/docker.cjs +18 -18
  35. package/dist/commands/start/docker.cjs.map +1 -1
  36. package/dist/commands/start/docker.d.ts +16 -16
  37. package/dist/commands/start/docker.d.ts.map +1 -1
  38. package/dist/commands/start/docker.js +18 -18
  39. package/dist/commands/start/docker.js.map +1 -1
  40. package/dist/commands/start/local/s3.cjs +36 -34
  41. package/dist/commands/start/local/s3.cjs.map +1 -1
  42. package/dist/commands/start/local/s3.d.ts +18 -18
  43. package/dist/commands/start/local/s3.d.ts.map +1 -1
  44. package/dist/commands/start/local/s3.js +36 -34
  45. package/dist/commands/start/local/s3.js.map +1 -1
  46. package/dist/commands/start/local.cjs +32 -30
  47. package/dist/commands/start/local.cjs.map +1 -1
  48. package/dist/commands/start/local.d.ts +16 -16
  49. package/dist/commands/start/local.d.ts.map +1 -1
  50. package/dist/commands/start/local.js +32 -30
  51. package/dist/commands/start/local.js.map +1 -1
  52. package/dist/commands/start.cjs +3 -3
  53. package/dist/commands/start.cjs.map +1 -1
  54. package/dist/commands/start.d.ts +2 -2
  55. package/dist/commands/start.js +3 -3
  56. package/dist/commands/start.js.map +1 -1
  57. package/dist/commands/stop.cjs +4 -4
  58. package/dist/commands/stop.cjs.map +1 -1
  59. package/dist/commands/stop.d.ts +2 -2
  60. package/dist/commands/stop.js +4 -4
  61. package/dist/commands/stop.js.map +1 -1
  62. package/dist/commands/svc/create/arg-parser.cjs +13 -13
  63. package/dist/commands/svc/create/arg-parser.cjs.map +1 -1
  64. package/dist/commands/svc/create/arg-parser.d.ts +1 -1
  65. package/dist/commands/svc/create/arg-parser.js +13 -13
  66. package/dist/commands/svc/create/arg-parser.js.map +1 -1
  67. package/dist/commands/svc/create/docker/s3.cjs +27 -27
  68. package/dist/commands/svc/create/docker/s3.cjs.map +1 -1
  69. package/dist/commands/svc/create/docker/s3.d.ts +15 -15
  70. package/dist/commands/svc/create/docker/s3.d.ts.map +1 -1
  71. package/dist/commands/svc/create/docker/s3.js +27 -27
  72. package/dist/commands/svc/create/docker/s3.js.map +1 -1
  73. package/dist/commands/svc/create/docker.cjs +35 -35
  74. package/dist/commands/svc/create/docker.cjs.map +1 -1
  75. package/dist/commands/svc/create/docker.d.ts +16 -16
  76. package/dist/commands/svc/create/docker.js +35 -35
  77. package/dist/commands/svc/create/docker.js.map +1 -1
  78. package/dist/commands/svc/create/local/s3.cjs +37 -35
  79. package/dist/commands/svc/create/local/s3.cjs.map +1 -1
  80. package/dist/commands/svc/create/local/s3.d.ts +18 -18
  81. package/dist/commands/svc/create/local/s3.d.ts.map +1 -1
  82. package/dist/commands/svc/create/local/s3.js +37 -35
  83. package/dist/commands/svc/create/local/s3.js.map +1 -1
  84. package/dist/commands/svc/create/local.cjs +35 -35
  85. package/dist/commands/svc/create/local.cjs.map +1 -1
  86. package/dist/commands/svc/create/local.d.ts +16 -16
  87. package/dist/commands/svc/create/local.d.ts.map +1 -1
  88. package/dist/commands/svc/create/local.js +35 -35
  89. package/dist/commands/svc/create/local.js.map +1 -1
  90. package/dist/commands/svc/delete.cjs +4 -4
  91. package/dist/commands/svc/delete.cjs.map +1 -1
  92. package/dist/commands/svc/delete.d.ts +2 -2
  93. package/dist/commands/svc/delete.js +4 -4
  94. package/dist/commands/svc/delete.js.map +1 -1
  95. package/dist/commands/svc/down.cjs +3 -3
  96. package/dist/commands/svc/down.cjs.map +1 -1
  97. package/dist/commands/svc/down.d.ts +2 -2
  98. package/dist/commands/svc/down.js +3 -3
  99. package/dist/commands/svc/down.js.map +1 -1
  100. package/dist/commands/svc/list.cjs +5 -5
  101. package/dist/commands/svc/list.cjs.map +1 -1
  102. package/dist/commands/svc/list.d.ts +1 -1
  103. package/dist/commands/svc/list.d.ts.map +1 -1
  104. package/dist/commands/svc/list.js +5 -5
  105. package/dist/commands/svc/list.js.map +1 -1
  106. package/dist/commands/svc/up.cjs +5 -5
  107. package/dist/commands/svc/up.cjs.map +1 -1
  108. package/dist/commands/svc/up.d.ts +2 -2
  109. package/dist/commands/svc/up.d.ts.map +1 -1
  110. package/dist/commands/svc/up.js +5 -5
  111. package/dist/commands/svc/up.js.map +1 -1
  112. package/dist/core.cjs +261 -231
  113. package/dist/core.cjs.map +1 -1
  114. package/dist/core.d.ts +10 -10
  115. package/dist/core.d.ts.map +1 -1
  116. package/dist/core.js +261 -231
  117. package/dist/core.js.map +1 -1
  118. package/dist/index.cjs +16 -16
  119. package/dist/index.cjs.map +1 -1
  120. package/dist/index.d.ts +29 -29
  121. package/dist/index.js +16 -16
  122. package/dist/index.js.map +1 -1
  123. package/dist/package.cjs +2 -2
  124. package/dist/package.cjs.map +1 -1
  125. package/dist/package.js +2 -2
  126. package/dist/package.js.map +1 -1
  127. package/dist/platforma.cjs +24 -24
  128. package/dist/platforma.cjs.map +1 -1
  129. package/dist/platforma.d.ts +1 -1
  130. package/dist/platforma.d.ts.map +1 -1
  131. package/dist/platforma.js +24 -24
  132. package/dist/platforma.js.map +1 -1
  133. package/dist/run.cjs +6 -6
  134. package/dist/run.cjs.map +1 -1
  135. package/dist/run.d.ts +3 -3
  136. package/dist/run.d.ts.map +1 -1
  137. package/dist/run.js +6 -6
  138. package/dist/run.js.map +1 -1
  139. package/dist/state.cjs +16 -14
  140. package/dist/state.cjs.map +1 -1
  141. package/dist/state.d.ts +5 -5
  142. package/dist/state.d.ts.map +1 -1
  143. package/dist/state.js +16 -14
  144. package/dist/state.js.map +1 -1
  145. package/dist/templates/compose.cjs +2 -2
  146. package/dist/templates/compose.cjs.map +1 -1
  147. package/dist/templates/compose.d.ts.map +1 -1
  148. package/dist/templates/compose.js +2 -2
  149. package/dist/templates/compose.js.map +1 -1
  150. package/dist/templates/pl-config.cjs +49 -49
  151. package/dist/templates/pl-config.cjs.map +1 -1
  152. package/dist/templates/pl-config.d.ts +2 -2
  153. package/dist/templates/pl-config.d.ts.map +1 -1
  154. package/dist/templates/pl-config.js +49 -49
  155. package/dist/templates/pl-config.js.map +1 -1
  156. package/dist/templates/types.cjs +12 -12
  157. package/dist/templates/types.cjs.map +1 -1
  158. package/dist/templates/types.d.ts +6 -6
  159. package/dist/templates/types.d.ts.map +1 -1
  160. package/dist/templates/types.js +12 -12
  161. package/dist/templates/types.js.map +1 -1
  162. package/dist/util.cjs +19 -17
  163. package/dist/util.cjs.map +1 -1
  164. package/dist/util.d.ts +2 -2
  165. package/dist/util.d.ts.map +1 -1
  166. package/dist/util.js +19 -17
  167. package/dist/util.js.map +1 -1
  168. package/package.json +23 -22
@@ -1 +1 @@
1
- {"version":3,"file":"state.cjs","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":["pkg.readFileSync","util.getDockerComposeInfo","util.assertNever","util.getProcessName"],"mappings":"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"}
1
+ {"version":3,"file":"state.cjs","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 =\n | Omit<dockerInstanceInfo, \"name\" | \"isActive\">\n | 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 (\n processName === \"platforma\" ||\n processName.endsWith(\"/platforma\") ||\n processName.endsWith(\"\\\\platforma\")\n );\n}\n\nexport default State.getStateInstance();\n"],"names":["pkg.readFileSync","util.getDockerComposeInfo","util.assertNever","util.getProcessName"],"mappings":"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"}
package/dist/state.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import type { SpawnOptions } from 'node:child_process';
2
- import type * as types from './templates/types';
1
+ import type { SpawnOptions } from "node:child_process";
2
+ import type * as types from "./templates/types";
3
3
  export type runInfo = {
4
4
  configPath?: string;
5
5
  apiPort?: number;
@@ -26,14 +26,14 @@ export type commmonInstanceInfo = {
26
26
  runInfo?: runInfo;
27
27
  };
28
28
  export type dockerInstanceInfo = commmonInstanceInfo & {
29
- type: 'docker';
29
+ type: "docker";
30
30
  };
31
31
  export type processInstanceInfo = commmonInstanceInfo & {
32
- type: 'process';
32
+ type: "process";
33
33
  pid?: number;
34
34
  };
35
35
  export type instanceInfo = dockerInstanceInfo | processInstanceInfo;
36
- export type jsonInstanceInfo = Omit<dockerInstanceInfo, 'name' | 'isActive'> | Omit<processInstanceInfo, 'name' | 'isActive'>;
36
+ export type jsonInstanceInfo = Omit<dockerInstanceInfo, "name" | "isActive"> | Omit<processInstanceInfo, "name" | "isActive">;
37
37
  export declare function reset(): void;
38
38
  declare class State {
39
39
  private static instance;
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
package/dist/state.js CHANGED
@@ -7,13 +7,13 @@ import { assertNever, getDockerComposeInfo, getProcessName } from './util.js';
7
7
  class State {
8
8
  static instance;
9
9
  state = {
10
- currentInstance: '',
10
+ currentInstance: "",
11
11
  };
12
12
  filePath;
13
13
  dirPath;
14
14
  constructor(stateDir) {
15
- stateDir = stateDir ?? path.resolve(os__default.homedir(), '.config', 'pl-bootstrap');
16
- const stateFile = path.join(stateDir, 'state.json');
15
+ stateDir = stateDir ?? path.resolve(os__default.homedir(), ".config", "pl-bootstrap");
16
+ const stateFile = path.join(stateDir, "state.json");
17
17
  this.dirPath = stateDir;
18
18
  this.filePath = stateFile;
19
19
  if (!fs__default.existsSync(stateDir)) {
@@ -34,12 +34,12 @@ class State {
34
34
  }
35
35
  instanceDir(name, ...p) {
36
36
  if (name) {
37
- return this.path('data', name, ...p);
37
+ return this.path("data", name, ...p);
38
38
  }
39
- return this.path('data');
39
+ return this.path("data");
40
40
  }
41
41
  binaries(...p) {
42
- return this.path('binaries', ...p);
42
+ return this.path("binaries", ...p);
43
43
  }
44
44
  writeState() {
45
45
  fs__default.writeFileSync(this.filePath, JSON.stringify(this.state));
@@ -52,10 +52,10 @@ class State {
52
52
  return list.filter((iName) => this.instanceExists(iName));
53
53
  }
54
54
  instanceExists(name) {
55
- return fs__default.existsSync(this.instanceDir(name, 'instance.json'));
55
+ return fs__default.existsSync(this.instanceDir(name, "instance.json"));
56
56
  }
57
57
  getInstanceInfo(name) {
58
- const instanceInfoFile = this.instanceDir(name, 'instance.json');
58
+ const instanceInfoFile = this.instanceDir(name, "instance.json");
59
59
  if (!fs__default.existsSync(instanceInfoFile)) {
60
60
  throw new Error(`platforma backend instance '${name}' does not exist or is corrupted`);
61
61
  }
@@ -69,7 +69,7 @@ class State {
69
69
  if (!fs__default.existsSync(this.instanceDir(instanceName))) {
70
70
  fs__default.mkdirSync(this.instanceDir(instanceName), { recursive: true });
71
71
  }
72
- const instanceInfoFile = this.instanceDir(instanceName, 'instance.json');
72
+ const instanceInfoFile = this.instanceDir(instanceName, "instance.json");
73
73
  let oldInfo = {};
74
74
  if (fs__default.existsSync(instanceInfoFile)) {
75
75
  oldInfo = JSON.parse(readFileSync(instanceInfoFile).toString());
@@ -79,14 +79,14 @@ class State {
79
79
  isInstanceActive(instance) {
80
80
  const iType = instance.type;
81
81
  switch (iType) {
82
- case 'docker': {
82
+ case "docker": {
83
83
  const i = getDockerComposeInfo(`pl-${instance.name}`);
84
84
  if (!i) {
85
85
  return false;
86
86
  }
87
- return i.Status.trim().startsWith('running');
87
+ return i.Status.trim().startsWith("running");
88
88
  }
89
- case 'process': {
89
+ case "process": {
90
90
  if (!instance.pid) {
91
91
  return false;
92
92
  }
@@ -94,7 +94,7 @@ class State {
94
94
  }
95
95
  default:
96
96
  assertNever();
97
- throw new Error('cli logic error: unknown service type, cannot check its state');
97
+ throw new Error("cli logic error: unknown service type, cannot check its state");
98
98
  }
99
99
  }
100
100
  get isActive() {
@@ -133,7 +133,9 @@ class State {
133
133
  }
134
134
  function isValidPID(pid) {
135
135
  const processName = getProcessName(pid);
136
- return processName === 'platforma' || processName.endsWith('/platforma') || processName.endsWith('\\platforma');
136
+ return (processName === "platforma" ||
137
+ processName.endsWith("/platforma") ||
138
+ processName.endsWith("\\platforma"));
137
139
  }
138
140
  var state = State.getStateInstance();
139
141
 
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","fs","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 =\n | Omit<dockerInstanceInfo, \"name\" | \"isActive\">\n | 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 (\n processName === \"platforma\" ||\n processName.endsWith(\"/platforma\") ||\n processName.endsWith(\"\\\\platforma\")\n );\n}\n\nexport default State.getStateInstance();\n"],"names":["os","fs","pkg.readFileSync","util.getDockerComposeInfo","util.assertNever","util.getProcessName"],"mappings":"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"}
@@ -4,7 +4,7 @@ var fs = require('node:fs');
4
4
  var YAML = require('yaml');
5
5
 
6
6
  function render(composeSource, composeDest, deployName, services, options) {
7
- const composeSrcData = fs.readFileSync(composeSource, { encoding: 'utf-8' });
7
+ const composeSrcData = fs.readFileSync(composeSource, { encoding: "utf-8" });
8
8
  const compose = YAML.parse(composeSrcData.toString());
9
9
  if (!compose.services) {
10
10
  throw new Error(`file '${composeSource}' seems to be not a docker-compose file or has unsupported version`);
@@ -31,7 +31,7 @@ function render(composeSource, composeDest, deployName, services, options) {
31
31
  }
32
32
  for (let envSpecI = 0; envSpecI < (svcSpec?.environment.length ?? 0);) {
33
33
  const envSpec = svcSpec.environment[envSpecI];
34
- const envName = envSpec.split('=')[0];
34
+ const envName = envSpec.split("=")[0];
35
35
  if (options.envs[envName]) {
36
36
  // Drop env expression from list as we will replace it later by our custom configuration
37
37
  const last = svcSpec.environment.pop();
@@ -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 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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"}
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<\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"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../src/templates/compose.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACzB,MAAM,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB,CAAC;AAcF,wBAAgB,MAAM,CACpB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,EACtC,OAAO,CAAC,EAAE;IACR,WAAW,EAAE,OAAO,CAAC;CACtB,QA0EF"}
1
+ {"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../src/templates/compose.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACzB,MAAM,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB,CAAC;AAiBF,wBAAgB,MAAM,CACpB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,EACtC,OAAO,CAAC,EAAE;IACR,WAAW,EAAE,OAAO,CAAC;CACtB,QA8EF"}
@@ -2,7 +2,7 @@ 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 = fs__default.readFileSync(composeSource, { encoding: 'utf-8' });
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`);
@@ -29,7 +29,7 @@ function render(composeSource, composeDest, deployName, services, options) {
29
29
  }
30
30
  for (let envSpecI = 0; envSpecI < (svcSpec?.environment.length ?? 0);) {
31
31
  const envSpec = svcSpec.environment[envSpecI];
32
- const envName = envSpec.split('=')[0];
32
+ const envName = envSpec.split("=")[0];
33
33
  if (options.envs[envName]) {
34
34
  // Drop env expression from list as we will replace it later by our custom configuration
35
35
  const last = svcSpec.environment.pop();
@@ -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 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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"}
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<\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"],"names":["fs"],"mappings":"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"}
@@ -9,51 +9,51 @@ function storageSettingsFromURL(storageURL, baseDir, defaults) {
9
9
  storageURL = util.resolveTilde(storageURL);
10
10
  const url = new URL(storageURL, `file:${baseDir}`);
11
11
  switch (url.protocol) {
12
- case 's3:': {
12
+ case "s3:": {
13
13
  const bucketName = url.hostname;
14
- const region = url.searchParams.get('region');
14
+ const region = url.searchParams.get("region");
15
15
  const keyPrefix = url.pathname.slice(1); // 's3://bucket/' will have '/' as pathname. We don't want to always have '/' prefix
16
16
  return {
17
17
  ...defaults,
18
- type: 'S3',
18
+ type: "S3",
19
19
  bucketName,
20
20
  region,
21
21
  keyPrefix,
22
22
  };
23
23
  }
24
- case 's3e:': {
25
- const p = url.pathname.split('/').slice(1); // '/bucket/key/prefix' -> ['', 'bucket', 'key' 'prefix'] -> ['bucket', 'key', 'prefix']
24
+ case "s3e:": {
25
+ const p = url.pathname.split("/").slice(1); // '/bucket/key/prefix' -> ['', 'bucket', 'key' 'prefix'] -> ['bucket', 'key', 'prefix']
26
26
  const bucketName = p[0];
27
- const keyPrefix = p.length > 1 ? p.slice(1).join('/') : '';
27
+ const keyPrefix = p.length > 1 ? p.slice(1).join("/") : "";
28
28
  return {
29
29
  ...defaults,
30
- type: 'S3',
30
+ type: "S3",
31
31
  endpoint: `http://${url.host}/`,
32
32
  bucketName,
33
33
  keyPrefix,
34
- region: url.searchParams.get('region'),
35
- key: url.username ? `static:${url.username}` : '',
36
- secret: url.password ? `static:${url.password}` : '',
34
+ region: url.searchParams.get("region"),
35
+ key: url.username ? `static:${url.username}` : "",
36
+ secret: url.password ? `static:${url.password}` : "",
37
37
  };
38
38
  }
39
- case 's3es:': {
40
- const p = url.pathname.split('/').slice(1); // '/bucket/key/prefix' -> ['', 'bucket', 'key' 'prefix'] -> ['bucket', 'key', 'prefix']
39
+ case "s3es:": {
40
+ const p = url.pathname.split("/").slice(1); // '/bucket/key/prefix' -> ['', 'bucket', 'key' 'prefix'] -> ['bucket', 'key', 'prefix']
41
41
  const bucketName = p[0];
42
- const keyPrefix = p.length > 1 ? p.slice(1).join('/') : '';
42
+ const keyPrefix = p.length > 1 ? p.slice(1).join("/") : "";
43
43
  return {
44
44
  ...defaults,
45
- type: 'S3',
45
+ type: "S3",
46
46
  endpoint: `https://${url.host}/`,
47
47
  bucketName,
48
48
  keyPrefix,
49
- region: url.searchParams.get('region'),
50
- key: url.username ? `static:${url.username}` : '',
51
- secret: url.password ? `static:${url.password}` : '',
49
+ region: url.searchParams.get("region"),
50
+ key: url.username ? `static:${url.username}` : "",
51
+ secret: url.password ? `static:${url.password}` : "",
52
52
  };
53
53
  }
54
- case 'file:':
54
+ case "file:":
55
55
  return {
56
- type: 'FS',
56
+ type: "FS",
57
57
  rootPath: url.pathname,
58
58
  };
59
59
  default:
@@ -61,16 +61,16 @@ function storageSettingsFromURL(storageURL, baseDir, defaults) {
61
61
  }
62
62
  }
63
63
  function loadDefaults(jwtKey, options) {
64
- const localRoot = options?.localRoot ?? state.instanceDir('default');
64
+ const localRoot = options?.localRoot ?? state.instanceDir("default");
65
65
  const log = {
66
- level: options?.log?.level ?? 'info',
66
+ level: options?.log?.level ?? "info",
67
67
  path: options?.log?.path ?? `${localRoot}/logs/platforma.log`,
68
68
  };
69
69
  const grpc = {
70
- listen: options?.grpc?.listen ?? 'localhost:6345',
70
+ listen: options?.grpc?.listen ?? "localhost:6345",
71
71
  tls: {
72
72
  enable: defaultBool(options?.grpc?.tls?.enable, false),
73
- clientAuthMode: options?.grpc?.tls?.clientAuthMode ?? 'NoAuth',
73
+ clientAuthMode: options?.grpc?.tls?.clientAuthMode ?? "NoAuth",
74
74
  certFile: options?.grpc?.tls?.certFile ?? `${localRoot}/certs/tls.cert`,
75
75
  keyFile: options?.grpc?.tls?.keyFile ?? `${localRoot}/certs/tls.key`,
76
76
  ...options?.grpc?.tls,
@@ -80,39 +80,39 @@ function loadDefaults(jwtKey, options) {
80
80
  auth: {
81
81
  enabled: options?.core?.auth?.enabled ?? false,
82
82
  drivers: options?.core?.auth?.drivers ?? [
83
- { driver: 'jwt', key: jwtKey },
84
- { driver: 'htpasswd', path: `${localRoot}/users.htpasswd` },
83
+ { driver: "jwt", key: jwtKey },
84
+ { driver: "htpasswd", path: `${localRoot}/users.htpasswd` },
85
85
  ],
86
86
  },
87
87
  db: {
88
88
  path: `${localRoot}/db`,
89
89
  },
90
90
  };
91
- const primary = defaultStorageSettings('main', `${localRoot}/storages/main`, 'platforma-primary-bucket', options?.storages?.primary);
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) {
95
95
  case undefined:
96
- case 'FS':
97
- work = types.emptyFSSettings('work');
96
+ case "FS":
97
+ work = types.emptyFSSettings("work");
98
98
  work.rootPath = options?.storages?.work?.rootPath ?? `${localRoot}/storages/work`;
99
- work.indexCachePeriod = options?.storages?.work?.indexCachePeriod ?? '1m';
99
+ work.indexCachePeriod = options?.storages?.work?.indexCachePeriod ?? "1m";
100
100
  break;
101
101
  default:
102
- throw new Error('work storage MUST have \'FS\' type as it is used for working directories management');
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`, 'platforma-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
- listen: options?.monitoring?.listen ?? '127.0.0.1:9090',
107
+ listen: options?.monitoring?.listen ?? "127.0.0.1:9090",
108
108
  };
109
109
  const debug = {
110
110
  enabled: defaultBool(options?.debug?.enabled, true),
111
- listen: options?.debug?.listen ?? '127.0.0.1:9091',
111
+ listen: options?.debug?.listen ?? "127.0.0.1:9091",
112
112
  };
113
113
  const license = {
114
- value: options?.license?.value ?? '',
115
- file: options?.license?.file ?? '',
114
+ value: options?.license?.value ?? "",
115
+ file: options?.license?.file ?? "",
116
116
  };
117
117
  return {
118
118
  localRoot,
@@ -132,11 +132,11 @@ function defaultStorageSettings(storageID, defaultLocation, defaultBucket, optio
132
132
  const pType = options?.type;
133
133
  switch (pType) {
134
134
  case undefined:
135
- case 'FS':
135
+ case "FS":
136
136
  storage = types.emptyFSSettings(storageID);
137
137
  storage.rootPath = options?.rootPath ?? defaultLocation;
138
138
  break;
139
- case 'S3':
139
+ case "S3":
140
140
  storage = types.emptyS3Settings(storageID);
141
141
  storage.endpoint = options?.endpoint;
142
142
  storage.region = options?.region;
@@ -144,27 +144,27 @@ function defaultStorageSettings(storageID, defaultLocation, defaultBucket, optio
144
144
  storage.bucketName = options?.bucketName ?? defaultBucket;
145
145
  storage.createBucket = defaultBool(options?.createBucket, true);
146
146
  storage.forcePathStyle = defaultBool(options?.forcePathStyle, true);
147
- storage.key = options?.key ?? '';
148
- storage.secret = options?.secret ?? '';
149
- storage.keyPrefix = options?.keyPrefix ?? '';
150
- storage.accessPrefixes = options?.accessPrefixes ?? [''];
151
- storage.uploadKeyPrefix = options?.uploadKeyPrefix ?? '';
147
+ storage.key = options?.key ?? "";
148
+ storage.secret = options?.secret ?? "";
149
+ storage.keyPrefix = options?.keyPrefix ?? "";
150
+ storage.accessPrefixes = options?.accessPrefixes ?? [""];
151
+ storage.uploadKeyPrefix = options?.uploadKeyPrefix ?? "";
152
152
  break;
153
153
  default:
154
154
  util.assertNever();
155
- throw new Error('unknown storage type'); // calm down TS type analyzer
155
+ throw new Error("unknown storage type"); // calm down TS type analyzer
156
156
  }
157
157
  return storage;
158
158
  }
159
159
  function render(options) {
160
- const disableMon = options.monitoring.enabled ? '' : ' disabled';
161
- const disableDbg = options.debug.enabled ? '' : ' disabled';
162
- const libraryDownloadable = options.hacks.libraryDownloadable ? 'true' : 'false';
160
+ const disableMon = options.monitoring.enabled ? "" : " disabled";
161
+ const disableDbg = options.debug.enabled ? "" : " disabled";
162
+ const libraryDownloadable = options.hacks.libraryDownloadable ? "true" : "false";
163
163
  let miLicenseSecret = options.license.value;
164
- if (options.license.file != '') {
164
+ if (options.license.file != "") {
165
165
  miLicenseSecret = fs.readFileSync(options.license.file).toString().trimEnd();
166
166
  }
167
- let cpuLimit = '';
167
+ let cpuLimit = "";
168
168
  if (options.numCpu) {
169
169
  cpuLimit = `
170
170
  resources:
@@ -235,7 +235,7 @@ controllers:
235
235
 
236
236
  runner:
237
237
  type: local
238
- storageRoot: '${(options.storages.work).rootPath}'
238
+ storageRoot: '${options.storages.work.rootPath}'
239
239
  workdirCacheOnSuccess: 20m
240
240
  workdirCacheOnFailure: 1h
241
241
  ${cpuLimit}