@platforma-sdk/bootstrap 5.2.51 → 5.2.53

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 (176) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +29 -0
  2. package/dist/block.cjs +106 -146
  3. package/dist/block.cjs.map +1 -1
  4. package/dist/block.js +100 -125
  5. package/dist/block.js.map +1 -1
  6. package/dist/cmd-opts.cjs +87 -177
  7. package/dist/cmd-opts.cjs.map +1 -1
  8. package/dist/cmd-opts.js +87 -172
  9. package/dist/cmd-opts.js.map +1 -1
  10. package/dist/commands/create-block.cjs +19 -20
  11. package/dist/commands/create-block.cjs.map +1 -1
  12. package/dist/commands/create-block.d.ts +12 -7
  13. package/dist/commands/create-block.js +17 -17
  14. package/dist/commands/create-block.js.map +1 -1
  15. package/dist/commands/reset.cjs +18 -21
  16. package/dist/commands/reset.cjs.map +1 -1
  17. package/dist/commands/reset.d.ts +12 -7
  18. package/dist/commands/reset.js +16 -18
  19. package/dist/commands/reset.js.map +1 -1
  20. package/dist/commands/start/docker/s3.cjs +64 -67
  21. package/dist/commands/start/docker/s3.cjs.map +1 -1
  22. package/dist/commands/start/docker/s3.d.ts +32 -27
  23. package/dist/commands/start/docker/s3.js +61 -64
  24. package/dist/commands/start/docker/s3.js.map +1 -1
  25. package/dist/commands/start/docker.cjs +64 -67
  26. package/dist/commands/start/docker.cjs.map +1 -1
  27. package/dist/commands/start/docker.d.ts +32 -27
  28. package/dist/commands/start/docker.js +61 -64
  29. package/dist/commands/start/docker.js.map +1 -1
  30. package/dist/commands/start/local/s3.cjs +101 -135
  31. package/dist/commands/start/local/s3.cjs.map +1 -1
  32. package/dist/commands/start/local/s3.d.ts +36 -31
  33. package/dist/commands/start/local/s3.js +97 -113
  34. package/dist/commands/start/local/s3.js.map +1 -1
  35. package/dist/commands/start/local.cjs +95 -122
  36. package/dist/commands/start/local.cjs.map +1 -1
  37. package/dist/commands/start/local.d.ts +34 -29
  38. package/dist/commands/start/local.js +91 -100
  39. package/dist/commands/start/local.js.map +1 -1
  40. package/dist/commands/start.cjs +18 -21
  41. package/dist/commands/start.cjs.map +1 -1
  42. package/dist/commands/start.d.ts +12 -7
  43. package/dist/commands/start.js +16 -18
  44. package/dist/commands/start.js.map +1 -1
  45. package/dist/commands/stop.cjs +22 -27
  46. package/dist/commands/stop.cjs.map +1 -1
  47. package/dist/commands/stop.d.ts +12 -7
  48. package/dist/commands/stop.js +20 -24
  49. package/dist/commands/stop.js.map +1 -1
  50. package/dist/commands/svc/create/arg-parser.cjs +102 -172
  51. package/dist/commands/svc/create/arg-parser.cjs.map +1 -1
  52. package/dist/commands/svc/create/arg-parser.js +102 -171
  53. package/dist/commands/svc/create/arg-parser.js.map +1 -1
  54. package/dist/commands/svc/create/docker/s3.cjs +78 -96
  55. package/dist/commands/svc/create/docker/s3.cjs.map +1 -1
  56. package/dist/commands/svc/create/docker/s3.d.ts +35 -30
  57. package/dist/commands/svc/create/docker/s3.js +75 -93
  58. package/dist/commands/svc/create/docker/s3.js.map +1 -1
  59. package/dist/commands/svc/create/docker.cjs +82 -103
  60. package/dist/commands/svc/create/docker.cjs.map +1 -1
  61. package/dist/commands/svc/create/docker.d.ts +35 -30
  62. package/dist/commands/svc/create/docker.js +79 -100
  63. package/dist/commands/svc/create/docker.js.map +1 -1
  64. package/dist/commands/svc/create/local/s3.cjs +107 -139
  65. package/dist/commands/svc/create/local/s3.cjs.map +1 -1
  66. package/dist/commands/svc/create/local/s3.d.ts +39 -34
  67. package/dist/commands/svc/create/local/s3.js +103 -117
  68. package/dist/commands/svc/create/local/s3.js.map +1 -1
  69. package/dist/commands/svc/create/local.cjs +101 -138
  70. package/dist/commands/svc/create/local.cjs.map +1 -1
  71. package/dist/commands/svc/create/local.d.ts +37 -32
  72. package/dist/commands/svc/create/local.js +97 -116
  73. package/dist/commands/svc/create/local.js.map +1 -1
  74. package/dist/commands/svc/delete.cjs +36 -38
  75. package/dist/commands/svc/delete.cjs.map +1 -1
  76. package/dist/commands/svc/delete.d.ts +16 -11
  77. package/dist/commands/svc/delete.js +34 -35
  78. package/dist/commands/svc/delete.js.map +1 -1
  79. package/dist/commands/svc/down.cjs +27 -30
  80. package/dist/commands/svc/down.cjs.map +1 -1
  81. package/dist/commands/svc/down.d.ts +15 -10
  82. package/dist/commands/svc/down.js +25 -27
  83. package/dist/commands/svc/down.js.map +1 -1
  84. package/dist/commands/svc/list.cjs +25 -29
  85. package/dist/commands/svc/list.cjs.map +1 -1
  86. package/dist/commands/svc/list.d.ts +9 -5
  87. package/dist/commands/svc/list.js +23 -26
  88. package/dist/commands/svc/list.js.map +1 -1
  89. package/dist/commands/svc/up.cjs +33 -49
  90. package/dist/commands/svc/up.cjs.map +1 -1
  91. package/dist/commands/svc/up.d.ts +15 -10
  92. package/dist/commands/svc/up.js +31 -46
  93. package/dist/commands/svc/up.js.map +1 -1
  94. package/dist/core.cjs +712 -881
  95. package/dist/core.cjs.map +1 -1
  96. package/dist/core.js +709 -877
  97. package/dist/core.js.map +1 -1
  98. package/dist/index.cjs +36 -36
  99. package/dist/index.cjs.map +1 -1
  100. package/dist/index.d.ts +37 -33
  101. package/dist/index.js +35 -34
  102. package/dist/index.js.map +1 -1
  103. package/dist/package.cjs +15 -36
  104. package/dist/package.cjs.map +1 -1
  105. package/dist/package.js +14 -14
  106. package/dist/package.js.map +1 -1
  107. package/dist/platforma.cjs +119 -148
  108. package/dist/platforma.cjs.map +1 -1
  109. package/dist/platforma.js +114 -122
  110. package/dist/platforma.js.map +1 -1
  111. package/dist/run.cjs +55 -58
  112. package/dist/run.cjs.map +1 -1
  113. package/dist/run.js +56 -56
  114. package/dist/run.js.map +1 -1
  115. package/dist/state.cjs +114 -141
  116. package/dist/state.cjs.map +1 -1
  117. package/dist/state.js +110 -139
  118. package/dist/state.js.map +1 -1
  119. package/dist/templates/compose.cjs +38 -65
  120. package/dist/templates/compose.cjs.map +1 -1
  121. package/dist/templates/compose.js +35 -63
  122. package/dist/templates/compose.js.map +1 -1
  123. package/dist/templates/pl-config.cjs +163 -165
  124. package/dist/templates/pl-config.cjs.map +1 -1
  125. package/dist/templates/pl-config.js +161 -163
  126. package/dist/templates/pl-config.js.map +1 -1
  127. package/dist/templates/types.cjs +24 -23
  128. package/dist/templates/types.cjs.map +1 -1
  129. package/dist/templates/types.js +24 -22
  130. package/dist/templates/types.js.map +1 -1
  131. package/dist/util.cjs +57 -74
  132. package/dist/util.cjs.map +1 -1
  133. package/dist/util.js +51 -72
  134. package/dist/util.js.map +1 -1
  135. package/package.json +7 -7
  136. package/dist/block.d.ts +0 -25
  137. package/dist/block.d.ts.map +0 -1
  138. package/dist/cmd-opts.d.ts +0 -89
  139. package/dist/cmd-opts.d.ts.map +0 -1
  140. package/dist/commands/create-block.d.ts.map +0 -1
  141. package/dist/commands/reset.d.ts.map +0 -1
  142. package/dist/commands/start/docker/s3.d.ts.map +0 -1
  143. package/dist/commands/start/docker.d.ts.map +0 -1
  144. package/dist/commands/start/local/s3.d.ts.map +0 -1
  145. package/dist/commands/start/local.d.ts.map +0 -1
  146. package/dist/commands/start.d.ts.map +0 -1
  147. package/dist/commands/stop.d.ts.map +0 -1
  148. package/dist/commands/svc/create/arg-parser.d.ts +0 -43
  149. package/dist/commands/svc/create/arg-parser.d.ts.map +0 -1
  150. package/dist/commands/svc/create/docker/s3.d.ts.map +0 -1
  151. package/dist/commands/svc/create/docker.d.ts.map +0 -1
  152. package/dist/commands/svc/create/local/s3.d.ts.map +0 -1
  153. package/dist/commands/svc/create/local.d.ts.map +0 -1
  154. package/dist/commands/svc/delete.d.ts.map +0 -1
  155. package/dist/commands/svc/down.d.ts.map +0 -1
  156. package/dist/commands/svc/list.d.ts.map +0 -1
  157. package/dist/commands/svc/up.d.ts.map +0 -1
  158. package/dist/core.d.ts +0 -105
  159. package/dist/core.d.ts.map +0 -1
  160. package/dist/index.d.ts.map +0 -1
  161. package/dist/package.d.ts +0 -7
  162. package/dist/package.d.ts.map +0 -1
  163. package/dist/platforma.d.ts +0 -24
  164. package/dist/platforma.d.ts.map +0 -1
  165. package/dist/run.d.ts +0 -13
  166. package/dist/run.d.ts.map +0 -1
  167. package/dist/state.d.ts +0 -63
  168. package/dist/state.d.ts.map +0 -1
  169. package/dist/templates/compose.d.ts +0 -14
  170. package/dist/templates/compose.d.ts.map +0 -1
  171. package/dist/templates/pl-config.d.ts +0 -6
  172. package/dist/templates/pl-config.d.ts.map +0 -1
  173. package/dist/templates/types.d.ts +0 -138
  174. package/dist/templates/types.d.ts.map +0 -1
  175. package/dist/util.d.ts +0 -18
  176. package/dist/util.d.ts.map +0 -1
package/dist/state.cjs CHANGED
@@ -1,145 +1,118 @@
1
- 'use strict';
1
+ const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
2
+ const require_util = require('./util.cjs');
3
+ const require_package = require('./package.cjs');
4
+ let node_os = require("node:os");
5
+ node_os = require_runtime.__toESM(node_os);
6
+ let node_fs = require("node:fs");
7
+ node_fs = require_runtime.__toESM(node_fs);
8
+ let node_path = require("node:path");
9
+ node_path = require_runtime.__toESM(node_path);
2
10
 
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
- }
11
+ //#region src/state.ts
12
+ var State = class State {
13
+ static instance;
14
+ state = { currentInstance: "" };
15
+ filePath;
16
+ dirPath;
17
+ constructor(stateDir) {
18
+ stateDir = stateDir ?? node_path.default.resolve(node_os.default.homedir(), ".config", "pl-bootstrap");
19
+ const stateFile = node_path.default.join(stateDir, "state.json");
20
+ this.dirPath = stateDir;
21
+ this.filePath = stateFile;
22
+ if (!node_fs.default.existsSync(stateDir)) node_fs.default.mkdirSync(stateDir, { recursive: true });
23
+ if (node_fs.default.existsSync(stateFile)) this.state = JSON.parse(require_package.readFileSync(stateFile).toString());
24
+ }
25
+ static getStateInstance() {
26
+ if (!State.instance) State.instance = new State();
27
+ return State.instance;
28
+ }
29
+ path(...p) {
30
+ return node_path.default.join(this.dirPath, ...p);
31
+ }
32
+ instanceDir(name, ...p) {
33
+ if (name) return this.path("data", name, ...p);
34
+ return this.path("data");
35
+ }
36
+ binaries(...p) {
37
+ return this.path("binaries", ...p);
38
+ }
39
+ writeState() {
40
+ node_fs.default.writeFileSync(this.filePath, JSON.stringify(this.state));
41
+ }
42
+ get instanceList() {
43
+ if (!node_fs.default.existsSync(this.instanceDir())) return [];
44
+ return node_fs.default.readdirSync(this.instanceDir()).filter((iName) => this.instanceExists(iName));
45
+ }
46
+ instanceExists(name) {
47
+ return node_fs.default.existsSync(this.instanceDir(name, "instance.json"));
48
+ }
49
+ getInstanceInfo(name) {
50
+ const instanceInfoFile = this.instanceDir(name, "instance.json");
51
+ if (!node_fs.default.existsSync(instanceInfoFile)) throw new Error(`platforma backend instance '${name}' does not exist or is corrupted`);
52
+ return {
53
+ name,
54
+ ...JSON.parse(require_package.readFileSync(instanceInfoFile).toString())
55
+ };
56
+ }
57
+ setInstanceInfo(instanceName, info) {
58
+ if (!node_fs.default.existsSync(this.instanceDir(instanceName))) node_fs.default.mkdirSync(this.instanceDir(instanceName), { recursive: true });
59
+ const instanceInfoFile = this.instanceDir(instanceName, "instance.json");
60
+ let oldInfo = {};
61
+ if (node_fs.default.existsSync(instanceInfoFile)) oldInfo = JSON.parse(require_package.readFileSync(instanceInfoFile).toString());
62
+ node_fs.default.writeFileSync(instanceInfoFile, JSON.stringify({
63
+ ...oldInfo,
64
+ ...info
65
+ }));
66
+ }
67
+ isInstanceActive(instance) {
68
+ const iType = instance.type;
69
+ switch (iType) {
70
+ case "docker": {
71
+ const i = require_util.getDockerComposeInfo(`pl-${instance.name}`);
72
+ if (!i) return false;
73
+ return i.Status.trim().startsWith("running");
74
+ }
75
+ case "process":
76
+ if (!instance.pid) return false;
77
+ return isValidPID(instance.pid);
78
+ default:
79
+ require_util.assertNever(iType);
80
+ throw new Error("cli logic error: unknown service type, cannot check its state");
81
+ }
82
+ }
83
+ get isActive() {
84
+ for (const iName of this.instanceList) {
85
+ const instance = this.getInstanceInfo(iName);
86
+ if (this.isInstanceActive(instance)) return true;
87
+ }
88
+ return false;
89
+ }
90
+ isValidPID(pid) {
91
+ return isValidPID(pid);
92
+ }
93
+ get currentInstance() {
94
+ const name = this.state.currentInstance;
95
+ if (name && this.instanceExists(name)) return this.getInstanceInfo(name);
96
+ }
97
+ get currentInstanceName() {
98
+ return this.state.currentInstance;
99
+ }
100
+ set currentInstanceName(name) {
101
+ this.state.currentInstance = name;
102
+ this.writeState();
103
+ }
104
+ selectInstance(name) {
105
+ if (!this.instanceExists(name)) throw new Error(`instance '${name}' does not exist`);
106
+ this.state.currentInstance = name;
107
+ this.writeState();
108
+ }
109
+ };
136
110
  function isValidPID(pid) {
137
- const processName = util.getProcessName(pid);
138
- return (processName === "platforma" ||
139
- processName.endsWith("/platforma") ||
140
- processName.endsWith("\\platforma"));
111
+ const processName = require_util.getProcessName(pid);
112
+ return processName === "platforma" || processName.endsWith("/platforma") || processName.endsWith("\\platforma");
141
113
  }
142
- var state = State.getStateInstance();
114
+ var state_default = State.getStateInstance();
143
115
 
144
- module.exports = state;
145
- //# sourceMappingURL=state.cjs.map
116
+ //#endregion
117
+ exports.default = state_default;
118
+ //# sourceMappingURL=state.cjs.map
@@ -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 =\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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"}
1
+ {"version":3,"file":"state.cjs","names":["path","os","fs"],"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"],"mappings":"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"}
package/dist/state.js CHANGED
@@ -1,143 +1,114 @@
1
- import os__default from 'node:os';
2
- import fs__default from 'node:fs';
3
- import path from 'node:path';
4
- import { readFileSync } from './package.js';
5
- import { assertNever, getDockerComposeInfo, getProcessName } from './util.js';
1
+ import { assertNever, getDockerComposeInfo, getProcessName } from "./util.js";
2
+ import { readFileSync } from "./package.js";
3
+ import os from "node:os";
4
+ import fs from "node:fs";
5
+ import path from "node:path";
6
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__default.existsSync(stateDir)) {
20
- fs__default.mkdirSync(stateDir, { recursive: true });
21
- }
22
- if (fs__default.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__default.writeFileSync(this.filePath, JSON.stringify(this.state));
46
- }
47
- get instanceList() {
48
- if (!fs__default.existsSync(this.instanceDir())) {
49
- return [];
50
- }
51
- const list = fs__default.readdirSync(this.instanceDir());
52
- return list.filter((iName) => this.instanceExists(iName));
53
- }
54
- instanceExists(name) {
55
- return fs__default.existsSync(this.instanceDir(name, "instance.json"));
56
- }
57
- getInstanceInfo(name) {
58
- const instanceInfoFile = this.instanceDir(name, "instance.json");
59
- if (!fs__default.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__default.existsSync(this.instanceDir(instanceName))) {
70
- fs__default.mkdirSync(this.instanceDir(instanceName), { recursive: true });
71
- }
72
- const instanceInfoFile = this.instanceDir(instanceName, "instance.json");
73
- let oldInfo = {};
74
- if (fs__default.existsSync(instanceInfoFile)) {
75
- oldInfo = JSON.parse(readFileSync(instanceInfoFile).toString());
76
- }
77
- fs__default.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
- }
7
+ //#region src/state.ts
8
+ var State = class State {
9
+ static instance;
10
+ state = { currentInstance: "" };
11
+ filePath;
12
+ dirPath;
13
+ constructor(stateDir) {
14
+ stateDir = stateDir ?? path.resolve(os.homedir(), ".config", "pl-bootstrap");
15
+ const stateFile = path.join(stateDir, "state.json");
16
+ this.dirPath = stateDir;
17
+ this.filePath = stateFile;
18
+ if (!fs.existsSync(stateDir)) fs.mkdirSync(stateDir, { recursive: true });
19
+ if (fs.existsSync(stateFile)) this.state = JSON.parse(readFileSync(stateFile).toString());
20
+ }
21
+ static getStateInstance() {
22
+ if (!State.instance) State.instance = new State();
23
+ return State.instance;
24
+ }
25
+ path(...p) {
26
+ return path.join(this.dirPath, ...p);
27
+ }
28
+ instanceDir(name, ...p) {
29
+ if (name) return this.path("data", name, ...p);
30
+ return this.path("data");
31
+ }
32
+ binaries(...p) {
33
+ return this.path("binaries", ...p);
34
+ }
35
+ writeState() {
36
+ fs.writeFileSync(this.filePath, JSON.stringify(this.state));
37
+ }
38
+ get instanceList() {
39
+ if (!fs.existsSync(this.instanceDir())) return [];
40
+ return fs.readdirSync(this.instanceDir()).filter((iName) => this.instanceExists(iName));
41
+ }
42
+ instanceExists(name) {
43
+ return fs.existsSync(this.instanceDir(name, "instance.json"));
44
+ }
45
+ getInstanceInfo(name) {
46
+ const instanceInfoFile = this.instanceDir(name, "instance.json");
47
+ if (!fs.existsSync(instanceInfoFile)) throw new Error(`platforma backend instance '${name}' does not exist or is corrupted`);
48
+ return {
49
+ name,
50
+ ...JSON.parse(readFileSync(instanceInfoFile).toString())
51
+ };
52
+ }
53
+ setInstanceInfo(instanceName, info) {
54
+ if (!fs.existsSync(this.instanceDir(instanceName))) fs.mkdirSync(this.instanceDir(instanceName), { recursive: true });
55
+ const instanceInfoFile = this.instanceDir(instanceName, "instance.json");
56
+ let oldInfo = {};
57
+ if (fs.existsSync(instanceInfoFile)) oldInfo = JSON.parse(readFileSync(instanceInfoFile).toString());
58
+ fs.writeFileSync(instanceInfoFile, JSON.stringify({
59
+ ...oldInfo,
60
+ ...info
61
+ }));
62
+ }
63
+ isInstanceActive(instance) {
64
+ const iType = instance.type;
65
+ switch (iType) {
66
+ case "docker": {
67
+ const i = getDockerComposeInfo(`pl-${instance.name}`);
68
+ if (!i) return false;
69
+ return i.Status.trim().startsWith("running");
70
+ }
71
+ case "process":
72
+ if (!instance.pid) return false;
73
+ return isValidPID(instance.pid);
74
+ default:
75
+ assertNever(iType);
76
+ throw new Error("cli logic error: unknown service type, cannot check its state");
77
+ }
78
+ }
79
+ get isActive() {
80
+ for (const iName of this.instanceList) {
81
+ const instance = this.getInstanceInfo(iName);
82
+ if (this.isInstanceActive(instance)) return true;
83
+ }
84
+ return false;
85
+ }
86
+ isValidPID(pid) {
87
+ return isValidPID(pid);
88
+ }
89
+ get currentInstance() {
90
+ const name = this.state.currentInstance;
91
+ if (name && this.instanceExists(name)) return this.getInstanceInfo(name);
92
+ }
93
+ get currentInstanceName() {
94
+ return this.state.currentInstance;
95
+ }
96
+ set currentInstanceName(name) {
97
+ this.state.currentInstance = name;
98
+ this.writeState();
99
+ }
100
+ selectInstance(name) {
101
+ if (!this.instanceExists(name)) throw new Error(`instance '${name}' does not exist`);
102
+ this.state.currentInstance = name;
103
+ this.writeState();
104
+ }
105
+ };
134
106
  function isValidPID(pid) {
135
- const processName = getProcessName(pid);
136
- return (processName === "platforma" ||
137
- processName.endsWith("/platforma") ||
138
- processName.endsWith("\\platforma"));
107
+ const processName = getProcessName(pid);
108
+ return processName === "platforma" || processName.endsWith("/platforma") || processName.endsWith("\\platforma");
139
109
  }
140
- var state = State.getStateInstance();
110
+ var state_default = State.getStateInstance();
141
111
 
142
- export { state as default };
143
- //# sourceMappingURL=state.js.map
112
+ //#endregion
113
+ export { state_default as default };
114
+ //# sourceMappingURL=state.js.map
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 =\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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"}
1
+ {"version":3,"file":"state.js","names":["pkg.readFileSync","util.getDockerComposeInfo","util.getProcessName"],"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"],"mappings":"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"}