@platforma-sdk/bootstrap 3.5.19 → 3.5.21

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 (171) hide show
  1. package/dist/block.cjs +172 -0
  2. package/dist/block.cjs.map +1 -0
  3. package/dist/block.d.ts +0 -1
  4. package/dist/block.js +151 -0
  5. package/dist/block.js.map +1 -0
  6. package/dist/cmd-opts.cjs +205 -0
  7. package/dist/cmd-opts.cjs.map +1 -0
  8. package/dist/cmd-opts.d.ts +36 -38
  9. package/dist/cmd-opts.js +181 -0
  10. package/dist/cmd-opts.js.map +1 -0
  11. package/dist/commands/create-block.cjs +22 -0
  12. package/dist/commands/create-block.cjs.map +1 -0
  13. package/dist/commands/create-block.d.ts +1 -3
  14. package/dist/commands/create-block.js +20 -0
  15. package/dist/commands/create-block.js.map +1 -0
  16. package/dist/commands/reset.cjs +23 -0
  17. package/dist/commands/reset.cjs.map +1 -0
  18. package/dist/commands/reset.d.ts +1 -3
  19. package/dist/commands/reset.js +21 -0
  20. package/dist/commands/reset.js.map +1 -0
  21. package/dist/commands/start/docker/s3.cjs +69 -0
  22. package/dist/commands/start/docker/s3.cjs.map +1 -0
  23. package/dist/commands/start/docker/s3.d.ts +21 -23
  24. package/dist/commands/start/docker/s3.js +67 -0
  25. package/dist/commands/start/docker/s3.js.map +1 -0
  26. package/dist/commands/start/docker.cjs +69 -0
  27. package/dist/commands/start/docker.cjs.map +1 -0
  28. package/dist/commands/start/docker.d.ts +21 -23
  29. package/dist/commands/start/docker.js +67 -0
  30. package/dist/commands/start/docker.js.map +1 -0
  31. package/dist/commands/start/local/s3.cjs +135 -0
  32. package/dist/commands/start/local/s3.cjs.map +1 -0
  33. package/dist/commands/start/local/s3.d.ts +25 -27
  34. package/dist/commands/start/local/s3.js +114 -0
  35. package/dist/commands/start/local/s3.js.map +1 -0
  36. package/dist/commands/start/local.cjs +122 -0
  37. package/dist/commands/start/local.cjs.map +1 -0
  38. package/dist/commands/start/local.d.ts +23 -25
  39. package/dist/commands/start/local.js +101 -0
  40. package/dist/commands/start/local.js.map +1 -0
  41. package/dist/commands/start.cjs +23 -0
  42. package/dist/commands/start.cjs.map +1 -0
  43. package/dist/commands/start.d.ts +1 -3
  44. package/dist/commands/start.js +21 -0
  45. package/dist/commands/start.js.map +1 -0
  46. package/dist/commands/stop.cjs +29 -0
  47. package/dist/commands/stop.cjs.map +1 -0
  48. package/dist/commands/stop.d.ts +1 -3
  49. package/dist/commands/stop.js +27 -0
  50. package/dist/commands/stop.js.map +1 -0
  51. package/dist/commands/svc/create/docker/s3.cjs +75 -0
  52. package/dist/commands/svc/create/docker/s3.cjs.map +1 -0
  53. package/dist/commands/svc/create/docker/s3.d.ts +22 -24
  54. package/dist/commands/svc/create/docker/s3.js +73 -0
  55. package/dist/commands/svc/create/docker/s3.js.map +1 -0
  56. package/dist/commands/svc/create/docker.cjs +72 -0
  57. package/dist/commands/svc/create/docker.cjs.map +1 -0
  58. package/dist/commands/svc/create/docker.d.ts +22 -24
  59. package/dist/commands/svc/create/docker.js +70 -0
  60. package/dist/commands/svc/create/docker.js.map +1 -0
  61. package/dist/commands/svc/create/local/s3.cjs +121 -0
  62. package/dist/commands/svc/create/local/s3.cjs.map +1 -0
  63. package/dist/commands/svc/create/local/s3.d.ts +26 -28
  64. package/dist/commands/svc/create/local/s3.js +100 -0
  65. package/dist/commands/svc/create/local/s3.js.map +1 -0
  66. package/dist/commands/svc/create/local.cjs +117 -0
  67. package/dist/commands/svc/create/local.cjs.map +1 -0
  68. package/dist/commands/svc/create/local.d.ts +24 -26
  69. package/dist/commands/svc/create/local.js +96 -0
  70. package/dist/commands/svc/create/local.js.map +1 -0
  71. package/dist/commands/svc/delete.cjs +40 -0
  72. package/dist/commands/svc/delete.cjs.map +1 -0
  73. package/dist/commands/svc/delete.d.ts +3 -5
  74. package/dist/commands/svc/delete.js +38 -0
  75. package/dist/commands/svc/delete.js.map +1 -0
  76. package/dist/commands/svc/down.cjs +32 -0
  77. package/dist/commands/svc/down.cjs.map +1 -0
  78. package/dist/commands/svc/down.d.ts +2 -4
  79. package/dist/commands/svc/down.js +30 -0
  80. package/dist/commands/svc/down.js.map +1 -0
  81. package/dist/commands/svc/list.cjs +31 -0
  82. package/dist/commands/svc/list.cjs.map +1 -0
  83. package/dist/commands/svc/list.d.ts +0 -1
  84. package/dist/commands/svc/list.js +29 -0
  85. package/dist/commands/svc/list.js.map +1 -0
  86. package/dist/commands/svc/up.cjs +51 -0
  87. package/dist/commands/svc/up.cjs.map +1 -0
  88. package/dist/commands/svc/up.d.ts +2 -4
  89. package/dist/commands/svc/up.js +49 -0
  90. package/dist/commands/svc/up.js.map +1 -0
  91. package/dist/core.cjs +742 -0
  92. package/dist/core.cjs.map +1 -0
  93. package/dist/core.d.ts +0 -1
  94. package/dist/core.js +737 -0
  95. package/dist/core.js.map +1 -0
  96. package/dist/index.cjs +42 -0
  97. package/dist/index.cjs.map +1 -0
  98. package/dist/index.d.ts +0 -1
  99. package/dist/index.js +39 -126
  100. package/dist/index.js.map +1 -1
  101. package/dist/package.cjs +27 -0
  102. package/dist/package.cjs.map +1 -0
  103. package/dist/package.d.ts +0 -1
  104. package/dist/package.js +22 -0
  105. package/dist/package.js.map +1 -0
  106. package/dist/platforma.cjs +169 -0
  107. package/dist/platforma.cjs.map +1 -0
  108. package/dist/platforma.d.ts +0 -1
  109. package/dist/platforma.js +141 -0
  110. package/dist/platforma.js.map +1 -0
  111. package/dist/run.cjs +68 -0
  112. package/dist/run.cjs.map +1 -0
  113. package/dist/run.d.ts +0 -1
  114. package/dist/run.js +64 -0
  115. package/dist/run.js.map +1 -0
  116. package/dist/state.cjs +143 -0
  117. package/dist/state.cjs.map +1 -0
  118. package/dist/state.d.ts +0 -1
  119. package/dist/state.js +141 -0
  120. package/dist/state.js.map +1 -0
  121. package/dist/templates/compose.cjs +67 -0
  122. package/dist/templates/compose.cjs.map +1 -0
  123. package/dist/templates/compose.d.ts +0 -1
  124. package/dist/templates/compose.js +65 -0
  125. package/dist/templates/compose.js.map +1 -0
  126. package/dist/templates/pl-config.cjs +264 -0
  127. package/dist/templates/pl-config.cjs.map +1 -0
  128. package/dist/templates/pl-config.d.ts +0 -1
  129. package/dist/templates/pl-config.js +260 -0
  130. package/dist/templates/pl-config.js.map +1 -0
  131. package/dist/templates/types.cjs +31 -0
  132. package/dist/templates/types.cjs.map +1 -0
  133. package/dist/templates/types.d.ts +0 -1
  134. package/dist/templates/types.js +28 -0
  135. package/dist/templates/types.js.map +1 -0
  136. package/dist/util.cjs +98 -0
  137. package/dist/util.cjs.map +1 -0
  138. package/dist/util.d.ts +0 -1
  139. package/dist/util.js +89 -0
  140. package/dist/util.js.map +1 -0
  141. package/package.json +10 -13
  142. package/dist/block.d.ts.map +0 -1
  143. package/dist/cmd-opts.d.ts.map +0 -1
  144. package/dist/commands/create-block.d.ts.map +0 -1
  145. package/dist/commands/reset.d.ts.map +0 -1
  146. package/dist/commands/start/docker/s3.d.ts.map +0 -1
  147. package/dist/commands/start/docker.d.ts.map +0 -1
  148. package/dist/commands/start/local/s3.d.ts.map +0 -1
  149. package/dist/commands/start/local.d.ts.map +0 -1
  150. package/dist/commands/start.d.ts.map +0 -1
  151. package/dist/commands/stop.d.ts.map +0 -1
  152. package/dist/commands/svc/create/docker/s3.d.ts.map +0 -1
  153. package/dist/commands/svc/create/docker.d.ts.map +0 -1
  154. package/dist/commands/svc/create/local/s3.d.ts.map +0 -1
  155. package/dist/commands/svc/create/local.d.ts.map +0 -1
  156. package/dist/commands/svc/delete.d.ts.map +0 -1
  157. package/dist/commands/svc/down.d.ts.map +0 -1
  158. package/dist/commands/svc/list.d.ts.map +0 -1
  159. package/dist/commands/svc/up.d.ts.map +0 -1
  160. package/dist/core.d.ts.map +0 -1
  161. package/dist/index.d.ts.map +0 -1
  162. package/dist/index.mjs +0 -1945
  163. package/dist/index.mjs.map +0 -1
  164. package/dist/package.d.ts.map +0 -1
  165. package/dist/platforma.d.ts.map +0 -1
  166. package/dist/run.d.ts.map +0 -1
  167. package/dist/state.d.ts.map +0 -1
  168. package/dist/templates/compose.d.ts.map +0 -1
  169. package/dist/templates/pl-config.d.ts.map +0 -1
  170. package/dist/templates/types.d.ts.map +0 -1
  171. package/dist/util.d.ts.map +0 -1
package/dist/state.cjs ADDED
@@ -0,0 +1,143 @@
1
+ 'use strict';
2
+
3
+ var os = require('node:os');
4
+ var fs = require('node:fs');
5
+ var path = require('node:path');
6
+ var _package = require('./package.cjs');
7
+ var util = require('./util.cjs');
8
+
9
+ class State {
10
+ static instance;
11
+ state = {
12
+ currentInstance: '',
13
+ };
14
+ filePath;
15
+ dirPath;
16
+ constructor(stateDir) {
17
+ stateDir = stateDir ?? path.resolve(os.homedir(), '.config', 'pl-bootstrap');
18
+ const stateFile = path.join(stateDir, 'state.json');
19
+ this.dirPath = stateDir;
20
+ this.filePath = stateFile;
21
+ if (!fs.existsSync(stateDir)) {
22
+ fs.mkdirSync(stateDir, { recursive: true });
23
+ }
24
+ if (fs.existsSync(stateFile)) {
25
+ this.state = JSON.parse(_package.readFileSync(stateFile).toString());
26
+ }
27
+ }
28
+ static getStateInstance() {
29
+ if (!State.instance) {
30
+ State.instance = new State();
31
+ }
32
+ return State.instance;
33
+ }
34
+ path(...p) {
35
+ return path.join(this.dirPath, ...p);
36
+ }
37
+ instanceDir(name, ...p) {
38
+ if (name) {
39
+ return this.path('data', name, ...p);
40
+ }
41
+ return this.path('data');
42
+ }
43
+ binaries(...p) {
44
+ return this.path('binaries', ...p);
45
+ }
46
+ writeState() {
47
+ fs.writeFileSync(this.filePath, JSON.stringify(this.state));
48
+ }
49
+ get instanceList() {
50
+ if (!fs.existsSync(this.instanceDir())) {
51
+ return [];
52
+ }
53
+ const list = fs.readdirSync(this.instanceDir());
54
+ return list.filter((iName) => this.instanceExists(iName));
55
+ }
56
+ instanceExists(name) {
57
+ return fs.existsSync(this.instanceDir(name, 'instance.json'));
58
+ }
59
+ getInstanceInfo(name) {
60
+ const instanceInfoFile = this.instanceDir(name, 'instance.json');
61
+ if (!fs.existsSync(instanceInfoFile)) {
62
+ throw new Error(`platforma backend instance '${name}' does not exist or is corrupted`);
63
+ }
64
+ const jsonInfo = JSON.parse(_package.readFileSync(instanceInfoFile).toString());
65
+ return {
66
+ name: name,
67
+ ...jsonInfo,
68
+ };
69
+ }
70
+ setInstanceInfo(instanceName, info) {
71
+ if (!fs.existsSync(this.instanceDir(instanceName))) {
72
+ fs.mkdirSync(this.instanceDir(instanceName), { recursive: true });
73
+ }
74
+ const instanceInfoFile = this.instanceDir(instanceName, 'instance.json');
75
+ let oldInfo = {};
76
+ if (fs.existsSync(instanceInfoFile)) {
77
+ oldInfo = JSON.parse(_package.readFileSync(instanceInfoFile).toString());
78
+ }
79
+ fs.writeFileSync(instanceInfoFile, JSON.stringify({ ...oldInfo, ...info }));
80
+ }
81
+ isInstanceActive(instance) {
82
+ const iType = instance.type;
83
+ switch (iType) {
84
+ case 'docker': {
85
+ const i = util.getDockerComposeInfo(`pl-${instance.name}`);
86
+ if (!i) {
87
+ return false;
88
+ }
89
+ return i.Status.trim().startsWith('running');
90
+ }
91
+ case 'process': {
92
+ if (!instance.pid) {
93
+ return false;
94
+ }
95
+ return isValidPID(instance.pid);
96
+ }
97
+ default:
98
+ util.assertNever();
99
+ throw new Error('cli logic error: unknown service type, cannot check its state');
100
+ }
101
+ }
102
+ get isActive() {
103
+ for (const iName of this.instanceList) {
104
+ const instance = this.getInstanceInfo(iName);
105
+ if (this.isInstanceActive(instance)) {
106
+ return true;
107
+ }
108
+ }
109
+ return false;
110
+ }
111
+ isValidPID(pid) {
112
+ return isValidPID(pid);
113
+ }
114
+ get currentInstance() {
115
+ const name = this.state.currentInstance;
116
+ if (name && this.instanceExists(name)) {
117
+ return this.getInstanceInfo(name);
118
+ }
119
+ return undefined;
120
+ }
121
+ get currentInstanceName() {
122
+ return this.state.currentInstance;
123
+ }
124
+ set currentInstanceName(name) {
125
+ this.state.currentInstance = name;
126
+ this.writeState();
127
+ }
128
+ selectInstance(name) {
129
+ if (!this.instanceExists(name)) {
130
+ throw new Error(`instance '${name}' does not exist`);
131
+ }
132
+ this.state.currentInstance = name;
133
+ this.writeState();
134
+ }
135
+ }
136
+ function isValidPID(pid) {
137
+ const processName = util.getProcessName(pid);
138
+ return processName === 'platforma' || processName.endsWith('/platforma') || processName.endsWith('\\platforma');
139
+ }
140
+ var state = State.getStateInstance();
141
+
142
+ module.exports = state;
143
+ //# sourceMappingURL=state.cjs.map
@@ -0,0 +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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"}
package/dist/state.d.ts CHANGED
@@ -60,4 +60,3 @@ declare class State {
60
60
  }
61
61
  declare const _default: State;
62
62
  export default _default;
63
- //# sourceMappingURL=state.d.ts.map
package/dist/state.js ADDED
@@ -0,0 +1,141 @@
1
+ import os__default from 'node:os';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import { readFileSync } from './package.js';
5
+ import { assertNever, getDockerComposeInfo, getProcessName } from './util.js';
6
+
7
+ class State {
8
+ static instance;
9
+ state = {
10
+ currentInstance: '',
11
+ };
12
+ filePath;
13
+ dirPath;
14
+ constructor(stateDir) {
15
+ stateDir = stateDir ?? path.resolve(os__default.homedir(), '.config', 'pl-bootstrap');
16
+ const stateFile = path.join(stateDir, 'state.json');
17
+ this.dirPath = stateDir;
18
+ this.filePath = stateFile;
19
+ if (!fs.existsSync(stateDir)) {
20
+ fs.mkdirSync(stateDir, { recursive: true });
21
+ }
22
+ if (fs.existsSync(stateFile)) {
23
+ this.state = JSON.parse(readFileSync(stateFile).toString());
24
+ }
25
+ }
26
+ static getStateInstance() {
27
+ if (!State.instance) {
28
+ State.instance = new State();
29
+ }
30
+ return State.instance;
31
+ }
32
+ path(...p) {
33
+ return path.join(this.dirPath, ...p);
34
+ }
35
+ instanceDir(name, ...p) {
36
+ if (name) {
37
+ return this.path('data', name, ...p);
38
+ }
39
+ return this.path('data');
40
+ }
41
+ binaries(...p) {
42
+ return this.path('binaries', ...p);
43
+ }
44
+ writeState() {
45
+ fs.writeFileSync(this.filePath, JSON.stringify(this.state));
46
+ }
47
+ get instanceList() {
48
+ if (!fs.existsSync(this.instanceDir())) {
49
+ return [];
50
+ }
51
+ const list = fs.readdirSync(this.instanceDir());
52
+ return list.filter((iName) => this.instanceExists(iName));
53
+ }
54
+ instanceExists(name) {
55
+ return fs.existsSync(this.instanceDir(name, 'instance.json'));
56
+ }
57
+ getInstanceInfo(name) {
58
+ const instanceInfoFile = this.instanceDir(name, 'instance.json');
59
+ if (!fs.existsSync(instanceInfoFile)) {
60
+ throw new Error(`platforma backend instance '${name}' does not exist or is corrupted`);
61
+ }
62
+ const jsonInfo = JSON.parse(readFileSync(instanceInfoFile).toString());
63
+ return {
64
+ name: name,
65
+ ...jsonInfo,
66
+ };
67
+ }
68
+ setInstanceInfo(instanceName, info) {
69
+ if (!fs.existsSync(this.instanceDir(instanceName))) {
70
+ fs.mkdirSync(this.instanceDir(instanceName), { recursive: true });
71
+ }
72
+ const instanceInfoFile = this.instanceDir(instanceName, 'instance.json');
73
+ let oldInfo = {};
74
+ if (fs.existsSync(instanceInfoFile)) {
75
+ oldInfo = JSON.parse(readFileSync(instanceInfoFile).toString());
76
+ }
77
+ fs.writeFileSync(instanceInfoFile, JSON.stringify({ ...oldInfo, ...info }));
78
+ }
79
+ isInstanceActive(instance) {
80
+ const iType = instance.type;
81
+ switch (iType) {
82
+ case 'docker': {
83
+ const i = getDockerComposeInfo(`pl-${instance.name}`);
84
+ if (!i) {
85
+ return false;
86
+ }
87
+ return i.Status.trim().startsWith('running');
88
+ }
89
+ case 'process': {
90
+ if (!instance.pid) {
91
+ return false;
92
+ }
93
+ return isValidPID(instance.pid);
94
+ }
95
+ default:
96
+ assertNever();
97
+ throw new Error('cli logic error: unknown service type, cannot check its state');
98
+ }
99
+ }
100
+ get isActive() {
101
+ for (const iName of this.instanceList) {
102
+ const instance = this.getInstanceInfo(iName);
103
+ if (this.isInstanceActive(instance)) {
104
+ return true;
105
+ }
106
+ }
107
+ return false;
108
+ }
109
+ isValidPID(pid) {
110
+ return isValidPID(pid);
111
+ }
112
+ get currentInstance() {
113
+ const name = this.state.currentInstance;
114
+ if (name && this.instanceExists(name)) {
115
+ return this.getInstanceInfo(name);
116
+ }
117
+ return undefined;
118
+ }
119
+ get currentInstanceName() {
120
+ return this.state.currentInstance;
121
+ }
122
+ set currentInstanceName(name) {
123
+ this.state.currentInstance = name;
124
+ this.writeState();
125
+ }
126
+ selectInstance(name) {
127
+ if (!this.instanceExists(name)) {
128
+ throw new Error(`instance '${name}' does not exist`);
129
+ }
130
+ this.state.currentInstance = name;
131
+ this.writeState();
132
+ }
133
+ }
134
+ function isValidPID(pid) {
135
+ const processName = getProcessName(pid);
136
+ return processName === 'platforma' || processName.endsWith('/platforma') || processName.endsWith('\\platforma');
137
+ }
138
+ var state = State.getStateInstance();
139
+
140
+ export { state as default };
141
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sources":["../src/state.ts"],"sourcesContent":["import os from 'node:os';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport * as pkg from './package';\nimport * as util from './util';\nimport type { SpawnOptions } from 'node:child_process';\nimport type * as types from './templates/types';\n\nexport type runInfo = {\n configPath?: string;\n apiPort?: number;\n apiAddr?: string;\n logPath?: string;\n dbPath?: string;\n primary?: types.storageOptions;\n work?: types.fsStorageOptions;\n library?: types.storageOptions;\n};\n\nexport type instanceCommand = {\n async?: boolean;\n cmd: string;\n args: readonly string[];\n envs?: NodeJS.ProcessEnv;\n workdir?: string;\n runOpts: SpawnOptions;\n};\n\nexport type commmonInstanceInfo = {\n name: string;\n upCommands: instanceCommand[];\n downCommands: instanceCommand[];\n cleanupCommands: instanceCommand[];\n runInfo?: runInfo;\n};\n\nexport type dockerInstanceInfo = commmonInstanceInfo & {\n type: 'docker';\n};\nexport type processInstanceInfo = commmonInstanceInfo & {\n type: 'process';\n pid?: number;\n};\n\nexport type instanceInfo = dockerInstanceInfo | processInstanceInfo;\nexport type jsonInstanceInfo = Omit<dockerInstanceInfo, 'name' | 'isActive'> | Omit<processInstanceInfo, 'name' | 'isActive'>;\n\nexport function reset() {\n fs.rmSync(State.getStateInstance().filePath);\n}\n\ntype state = {\n currentInstance: string;\n};\n\nclass State {\n private static instance: State;\n\n private state: state = {\n currentInstance: '',\n };\n\n public readonly filePath: string;\n private readonly dirPath: string;\n\n constructor(stateDir?: string) {\n stateDir = stateDir ?? path.resolve(os.homedir(), '.config', 'pl-bootstrap');\n\n const stateFile = path.join(stateDir, 'state.json');\n\n this.dirPath = stateDir;\n this.filePath = stateFile;\n\n if (!fs.existsSync(stateDir)) {\n fs.mkdirSync(stateDir, { recursive: true });\n }\n\n if (fs.existsSync(stateFile)) {\n this.state = JSON.parse(pkg.readFileSync(stateFile).toString()) as state;\n }\n }\n\n public static getStateInstance(): State {\n if (!State.instance) {\n State.instance = new State();\n }\n\n return State.instance;\n }\n\n public path(...p: string[]): string {\n return path.join(this.dirPath, ...p);\n }\n\n public instanceDir(name?: string, ...p: string[]): string {\n if (name) {\n return this.path('data', name, ...p);\n }\n\n return this.path('data');\n }\n\n public binaries(...p: string[]): string {\n return this.path('binaries', ...p);\n }\n\n private writeState() {\n fs.writeFileSync(this.filePath, JSON.stringify(this.state));\n }\n\n get instanceList(): string[] {\n if (!fs.existsSync(this.instanceDir())) {\n return [];\n }\n\n const list = fs.readdirSync(this.instanceDir());\n\n return list.filter((iName) => this.instanceExists(iName));\n }\n\n instanceExists(name: string): boolean {\n return fs.existsSync(this.instanceDir(name, 'instance.json'));\n }\n\n public getInstanceInfo(name: string): instanceInfo {\n const instanceInfoFile = this.instanceDir(name, 'instance.json');\n if (!fs.existsSync(instanceInfoFile)) {\n throw new Error(`platforma backend instance '${name}' does not exist or is corrupted`);\n }\n\n const jsonInfo = JSON.parse(pkg.readFileSync(instanceInfoFile).toString()) as jsonInstanceInfo;\n return {\n name: name,\n ...jsonInfo,\n };\n }\n\n public setInstanceInfo(instanceName: string, info: jsonInstanceInfo) {\n if (!fs.existsSync(this.instanceDir(instanceName))) {\n fs.mkdirSync(this.instanceDir(instanceName), { recursive: true });\n }\n\n const instanceInfoFile = this.instanceDir(instanceName, 'instance.json');\n let oldInfo: object = {};\n\n if (fs.existsSync(instanceInfoFile)) {\n oldInfo = JSON.parse(pkg.readFileSync(instanceInfoFile).toString()) as object;\n }\n\n fs.writeFileSync(instanceInfoFile, JSON.stringify({ ...oldInfo, ...info }));\n }\n\n public isInstanceActive(instance: instanceInfo): boolean {\n const iType = instance.type;\n switch (iType) {\n case 'docker': {\n const i = util.getDockerComposeInfo(`pl-${instance.name}`);\n if (!i) {\n return false;\n }\n return i.Status.trim().startsWith('running');\n }\n\n case 'process': {\n if (!instance.pid) {\n return false;\n }\n return isValidPID(instance.pid);\n }\n\n default:\n util.assertNever(iType);\n throw new Error('cli logic error: unknown service type, cannot check its state');\n }\n }\n\n get isActive(): boolean {\n for (const iName of this.instanceList) {\n const instance = this.getInstanceInfo(iName);\n if (this.isInstanceActive(instance)) {\n return true;\n }\n }\n\n return false;\n }\n\n public isValidPID(pid: number): boolean {\n return isValidPID(pid);\n }\n\n get currentInstance(): instanceInfo | undefined {\n const name = this.state.currentInstance;\n if (name && this.instanceExists(name)) {\n return this.getInstanceInfo(name);\n }\n\n return undefined;\n }\n\n get currentInstanceName(): string {\n return this.state.currentInstance;\n }\n\n set currentInstanceName(name: string) {\n this.state.currentInstance = name;\n this.writeState();\n }\n\n selectInstance(name: string) {\n if (!this.instanceExists(name)) {\n throw new Error(`instance '${name}' does not exist`);\n }\n this.state.currentInstance = name;\n this.writeState();\n }\n}\n\nfunction isValidPID(pid: number): boolean {\n const processName = util.getProcessName(pid);\n return processName === 'platforma' || processName.endsWith('/platforma') || processName.endsWith('\\\\platforma');\n}\n\nexport default State.getStateInstance();\n"],"names":["os","pkg.readFileSync","util.getDockerComposeInfo","util.assertNever","util.getProcessName"],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ 'use strict';
2
+
3
+ var fs = require('node:fs');
4
+ var YAML = require('yaml');
5
+
6
+ function render(composeSource, composeDest, deployName, services, options) {
7
+ const composeSrcData = fs.readFileSync(composeSource, { encoding: 'utf-8' });
8
+ const compose = YAML.parse(composeSrcData.toString());
9
+ if (!compose.services) {
10
+ throw new Error(`file '${composeSource}' seems to be not a docker-compose file or has unsupported version`);
11
+ }
12
+ if (services) {
13
+ for (const svcName of Object.keys(compose.services)) {
14
+ if (!services.has(svcName)) {
15
+ delete compose.services[svcName];
16
+ }
17
+ }
18
+ }
19
+ compose.name = deployName;
20
+ for (const [svcName, options] of services?.entries() ?? []) {
21
+ const svcSpec = compose.services[svcName];
22
+ if (!svcSpec) {
23
+ throw new Error(`docker compose '${composeSource}' has no declaration of service '${svcName}'`);
24
+ }
25
+ if (options.platform) {
26
+ svcSpec.platform = options.platform;
27
+ }
28
+ if (options.envs) {
29
+ if (!svcSpec.environment) {
30
+ svcSpec.environment = [];
31
+ }
32
+ for (let envSpecI = 0; envSpecI < (svcSpec?.environment.length ?? 0);) {
33
+ const envSpec = svcSpec.environment[envSpecI];
34
+ const envName = envSpec.split('=')[0];
35
+ if (options.envs[envName]) {
36
+ // Drop env expression from list as we will replace it later by our custom configuration
37
+ const last = svcSpec.environment.pop();
38
+ // Do not insert back last element we just removed.
39
+ if (last && svcSpec.environment.length !== envSpecI) {
40
+ svcSpec.environment[envSpecI] = last;
41
+ }
42
+ }
43
+ else {
44
+ envSpecI++;
45
+ }
46
+ }
47
+ for (const [envName, envValue] of Object.entries(options.envs)) {
48
+ svcSpec.environment.push(`${envName}=${envValue}`);
49
+ }
50
+ }
51
+ if (options.mounts) {
52
+ if (!svcSpec.volumes) {
53
+ svcSpec.volumes = [];
54
+ }
55
+ for (const mount of options.mounts) {
56
+ svcSpec.volumes.push(`${mount.hostPath}:${mount.containerPath}`);
57
+ }
58
+ }
59
+ }
60
+ if (options?.dropVolumes) {
61
+ delete compose.volumes;
62
+ }
63
+ fs.writeFileSync(composeDest, YAML.stringify(compose));
64
+ }
65
+
66
+ exports.render = render;
67
+ //# sourceMappingURL=compose.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.cjs","sources":["../../src/templates/compose.ts"],"sourcesContent":["import fs from 'node:fs';\nimport YAML from 'yaml';\n\nexport type VolumeMountOption = {\n hostPath: string;\n containerPath: string;\n};\n\nexport type ServiceOptions = {\n platform?: string;\n envs?: NodeJS.ProcessEnv;\n mounts?: VolumeMountOption[];\n};\n\ntype ComposeYamlSpec = {\n name: string;\n services: Record<string, {\n platform?: string;\n environment?: string[];\n volumes?: string[];\n }>;\n\n volumes?: unknown;\n};\n\nexport function render(\n composeSource: string,\n composeDest: string,\n deployName: string,\n services?: Map<string, ServiceOptions>,\n options?: {\n dropVolumes: boolean;\n },\n) {\n const composeSrcData = fs.readFileSync(composeSource, { encoding: 'utf-8' });\n const compose = YAML.parse(composeSrcData.toString()) as ComposeYamlSpec;\n\n if (!compose.services) {\n throw new Error(`file '${composeSource}' seems to be not a docker-compose file or has unsupported version`);\n }\n\n if (services) {\n for (const svcName of Object.keys(compose.services)) {\n if (!services.has(svcName)) {\n delete compose.services[svcName];\n }\n }\n }\n\n compose.name = deployName;\n\n for (const [svcName, options] of services?.entries() ?? []) {\n const svcSpec = compose.services[svcName];\n\n if (!svcSpec) {\n throw new Error(`docker compose '${composeSource}' has no declaration of service '${svcName}'`);\n }\n\n if (options.platform) {\n svcSpec.platform = options.platform;\n }\n\n if (options.envs) {\n if (!svcSpec.environment) {\n svcSpec.environment = [];\n }\n for (let envSpecI = 0; envSpecI < (svcSpec?.environment.length ?? 0);) {\n const envSpec: string = svcSpec.environment[envSpecI];\n const envName = envSpec.split('=')[0];\n if (options.envs[envName]) {\n // Drop env expression from list as we will replace it later by our custom configuration\n const last = svcSpec.environment.pop();\n\n // Do not insert back last element we just removed.\n if (last && svcSpec.environment.length !== envSpecI) {\n svcSpec.environment[envSpecI] = last;\n }\n } else {\n envSpecI++;\n }\n }\n\n for (const [envName, envValue] of Object.entries(options.envs)) {\n svcSpec.environment.push(`${envName}=${envValue}`);\n }\n }\n\n if (options.mounts) {\n if (!svcSpec.volumes) {\n svcSpec.volumes = [];\n }\n for (const mount of options.mounts) {\n svcSpec.volumes.push(`${mount.hostPath}:${mount.containerPath}`);\n }\n }\n }\n\n if (options?.dropVolumes) {\n delete compose.volumes;\n }\n\n fs.writeFileSync(composeDest, YAML.stringify(compose));\n}\n"],"names":[],"mappings":"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"}
@@ -10,4 +10,3 @@ export type ServiceOptions = {
10
10
  export declare function render(composeSource: string, composeDest: string, deployName: string, services?: Map<string, ServiceOptions>, options?: {
11
11
  dropVolumes: boolean;
12
12
  }): void;
13
- //# sourceMappingURL=compose.d.ts.map
@@ -0,0 +1,65 @@
1
+ import fs from 'node:fs';
2
+ import YAML from 'yaml';
3
+
4
+ function render(composeSource, composeDest, deployName, services, options) {
5
+ const composeSrcData = fs.readFileSync(composeSource, { encoding: 'utf-8' });
6
+ const compose = YAML.parse(composeSrcData.toString());
7
+ if (!compose.services) {
8
+ throw new Error(`file '${composeSource}' seems to be not a docker-compose file or has unsupported version`);
9
+ }
10
+ if (services) {
11
+ for (const svcName of Object.keys(compose.services)) {
12
+ if (!services.has(svcName)) {
13
+ delete compose.services[svcName];
14
+ }
15
+ }
16
+ }
17
+ compose.name = deployName;
18
+ for (const [svcName, options] of services?.entries() ?? []) {
19
+ const svcSpec = compose.services[svcName];
20
+ if (!svcSpec) {
21
+ throw new Error(`docker compose '${composeSource}' has no declaration of service '${svcName}'`);
22
+ }
23
+ if (options.platform) {
24
+ svcSpec.platform = options.platform;
25
+ }
26
+ if (options.envs) {
27
+ if (!svcSpec.environment) {
28
+ svcSpec.environment = [];
29
+ }
30
+ for (let envSpecI = 0; envSpecI < (svcSpec?.environment.length ?? 0);) {
31
+ const envSpec = svcSpec.environment[envSpecI];
32
+ const envName = envSpec.split('=')[0];
33
+ if (options.envs[envName]) {
34
+ // Drop env expression from list as we will replace it later by our custom configuration
35
+ const last = svcSpec.environment.pop();
36
+ // Do not insert back last element we just removed.
37
+ if (last && svcSpec.environment.length !== envSpecI) {
38
+ svcSpec.environment[envSpecI] = last;
39
+ }
40
+ }
41
+ else {
42
+ envSpecI++;
43
+ }
44
+ }
45
+ for (const [envName, envValue] of Object.entries(options.envs)) {
46
+ svcSpec.environment.push(`${envName}=${envValue}`);
47
+ }
48
+ }
49
+ if (options.mounts) {
50
+ if (!svcSpec.volumes) {
51
+ svcSpec.volumes = [];
52
+ }
53
+ for (const mount of options.mounts) {
54
+ svcSpec.volumes.push(`${mount.hostPath}:${mount.containerPath}`);
55
+ }
56
+ }
57
+ }
58
+ if (options?.dropVolumes) {
59
+ delete compose.volumes;
60
+ }
61
+ fs.writeFileSync(composeDest, YAML.stringify(compose));
62
+ }
63
+
64
+ export { render };
65
+ //# sourceMappingURL=compose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.js","sources":["../../src/templates/compose.ts"],"sourcesContent":["import fs from 'node:fs';\nimport YAML from 'yaml';\n\nexport type VolumeMountOption = {\n hostPath: string;\n containerPath: string;\n};\n\nexport type ServiceOptions = {\n platform?: string;\n envs?: NodeJS.ProcessEnv;\n mounts?: VolumeMountOption[];\n};\n\ntype ComposeYamlSpec = {\n name: string;\n services: Record<string, {\n platform?: string;\n environment?: string[];\n volumes?: string[];\n }>;\n\n volumes?: unknown;\n};\n\nexport function render(\n composeSource: string,\n composeDest: string,\n deployName: string,\n services?: Map<string, ServiceOptions>,\n options?: {\n dropVolumes: boolean;\n },\n) {\n const composeSrcData = fs.readFileSync(composeSource, { encoding: 'utf-8' });\n const compose = YAML.parse(composeSrcData.toString()) as ComposeYamlSpec;\n\n if (!compose.services) {\n throw new Error(`file '${composeSource}' seems to be not a docker-compose file or has unsupported version`);\n }\n\n if (services) {\n for (const svcName of Object.keys(compose.services)) {\n if (!services.has(svcName)) {\n delete compose.services[svcName];\n }\n }\n }\n\n compose.name = deployName;\n\n for (const [svcName, options] of services?.entries() ?? []) {\n const svcSpec = compose.services[svcName];\n\n if (!svcSpec) {\n throw new Error(`docker compose '${composeSource}' has no declaration of service '${svcName}'`);\n }\n\n if (options.platform) {\n svcSpec.platform = options.platform;\n }\n\n if (options.envs) {\n if (!svcSpec.environment) {\n svcSpec.environment = [];\n }\n for (let envSpecI = 0; envSpecI < (svcSpec?.environment.length ?? 0);) {\n const envSpec: string = svcSpec.environment[envSpecI];\n const envName = envSpec.split('=')[0];\n if (options.envs[envName]) {\n // Drop env expression from list as we will replace it later by our custom configuration\n const last = svcSpec.environment.pop();\n\n // Do not insert back last element we just removed.\n if (last && svcSpec.environment.length !== envSpecI) {\n svcSpec.environment[envSpecI] = last;\n }\n } else {\n envSpecI++;\n }\n }\n\n for (const [envName, envValue] of Object.entries(options.envs)) {\n svcSpec.environment.push(`${envName}=${envValue}`);\n }\n }\n\n if (options.mounts) {\n if (!svcSpec.volumes) {\n svcSpec.volumes = [];\n }\n for (const mount of options.mounts) {\n svcSpec.volumes.push(`${mount.hostPath}:${mount.containerPath}`);\n }\n }\n }\n\n if (options?.dropVolumes) {\n delete compose.volumes;\n }\n\n fs.writeFileSync(composeDest, YAML.stringify(compose));\n}\n"],"names":[],"mappings":"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"}