@specific.dev/cli 0.1.37 → 0.1.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/404/index.html +1 -1
- package/dist/admin/404.html +1 -1
- package/dist/admin/__next.__PAGE__.txt +2 -2
- package/dist/admin/__next._full.txt +3 -3
- package/dist/admin/__next._head.txt +1 -1
- package/dist/admin/__next._index.txt +2 -2
- package/dist/admin/__next._tree.txt +2 -2
- package/dist/admin/_next/static/chunks/{de6af6d8adf8b50a.js → 0476153b08658d87.js} +2 -2
- package/dist/admin/_next/static/chunks/{4ab079bdcb131778.js → 1de437acc5206b1f.js} +2 -2
- package/dist/admin/_next/static/chunks/5ff94899b8b7a03a.css +3 -0
- package/dist/admin/_next/static/chunks/{895a6f91f0b479fb.js → 6aae09c9429b9f24.js} +2 -2
- package/dist/admin/_next/static/chunks/b71388016463cab2.js +1 -0
- package/dist/admin/_not-found/__next._full.txt +2 -2
- package/dist/admin/_not-found/__next._head.txt +1 -1
- package/dist/admin/_not-found/__next._index.txt +2 -2
- package/dist/admin/_not-found/__next._not-found.__PAGE__.txt +1 -1
- package/dist/admin/_not-found/__next._not-found.txt +1 -1
- package/dist/admin/_not-found/__next._tree.txt +2 -2
- package/dist/admin/_not-found/index.html +1 -1
- package/dist/admin/_not-found/index.txt +2 -2
- package/dist/admin/databases/__next._full.txt +3 -3
- package/dist/admin/databases/__next._head.txt +1 -1
- package/dist/admin/databases/__next._index.txt +2 -2
- package/dist/admin/databases/__next._tree.txt +2 -2
- package/dist/admin/databases/__next.databases.__PAGE__.txt +2 -2
- package/dist/admin/databases/__next.databases.txt +1 -1
- package/dist/admin/databases/index.html +1 -1
- package/dist/admin/databases/index.txt +3 -3
- package/dist/admin/index.html +1 -1
- package/dist/admin/index.txt +3 -3
- package/dist/cli.js +1182 -496
- package/package.json +1 -1
- package/dist/admin/_next/static/1o2O2QPOKhuZyxcNaCjq8/_buildManifest.js +0 -11
- package/dist/admin/_next/static/1o2O2QPOKhuZyxcNaCjq8/_clientMiddlewareManifest.json +0 -1
- package/dist/admin/_next/static/1o2O2QPOKhuZyxcNaCjq8/_ssgManifest.js +0 -1
- package/dist/admin/_next/static/2ZtqtFX2EkuM82mTM7NWT/_buildManifest.js +0 -11
- package/dist/admin/_next/static/2ZtqtFX2EkuM82mTM7NWT/_clientMiddlewareManifest.json +0 -1
- package/dist/admin/_next/static/2ZtqtFX2EkuM82mTM7NWT/_ssgManifest.js +0 -1
- package/dist/admin/_next/static/2vLF5bo4ZtUfhs8bdQBoF/_buildManifest.js +0 -11
- package/dist/admin/_next/static/2vLF5bo4ZtUfhs8bdQBoF/_clientMiddlewareManifest.json +0 -1
- package/dist/admin/_next/static/2vLF5bo4ZtUfhs8bdQBoF/_ssgManifest.js +0 -1
- package/dist/admin/_next/static/8_8s51m7RbLVvbIechG-b/_buildManifest.js +0 -11
- package/dist/admin/_next/static/8_8s51m7RbLVvbIechG-b/_clientMiddlewareManifest.json +0 -1
- package/dist/admin/_next/static/8_8s51m7RbLVvbIechG-b/_ssgManifest.js +0 -1
- package/dist/admin/_next/static/C4Y44KtLnP684m57gN3Ga/_buildManifest.js +0 -11
- package/dist/admin/_next/static/C4Y44KtLnP684m57gN3Ga/_clientMiddlewareManifest.json +0 -1
- package/dist/admin/_next/static/C4Y44KtLnP684m57gN3Ga/_ssgManifest.js +0 -1
- package/dist/admin/_next/static/DBeh36kAJnZBeBMJSPBW8/_buildManifest.js +0 -11
- package/dist/admin/_next/static/DBeh36kAJnZBeBMJSPBW8/_clientMiddlewareManifest.json +0 -1
- package/dist/admin/_next/static/DBeh36kAJnZBeBMJSPBW8/_ssgManifest.js +0 -1
- package/dist/admin/_next/static/REKEUu6DP2t99jKSAqNOu/_buildManifest.js +0 -11
- package/dist/admin/_next/static/REKEUu6DP2t99jKSAqNOu/_clientMiddlewareManifest.json +0 -1
- package/dist/admin/_next/static/REKEUu6DP2t99jKSAqNOu/_ssgManifest.js +0 -1
- package/dist/admin/_next/static/TDGT3mkKtTe0w_CxujLxI/_buildManifest.js +0 -11
- package/dist/admin/_next/static/TDGT3mkKtTe0w_CxujLxI/_clientMiddlewareManifest.json +0 -1
- package/dist/admin/_next/static/TDGT3mkKtTe0w_CxujLxI/_ssgManifest.js +0 -1
- package/dist/admin/_next/static/ZHMJ-g7mAlAMt_2uCXeEk/_buildManifest.js +0 -11
- package/dist/admin/_next/static/ZHMJ-g7mAlAMt_2uCXeEk/_clientMiddlewareManifest.json +0 -1
- package/dist/admin/_next/static/ZHMJ-g7mAlAMt_2uCXeEk/_ssgManifest.js +0 -1
- package/dist/admin/_next/static/a6JDAB-CdvWPvS4sBgJji/_buildManifest.js +0 -11
- package/dist/admin/_next/static/a6JDAB-CdvWPvS4sBgJji/_clientMiddlewareManifest.json +0 -1
- package/dist/admin/_next/static/a6JDAB-CdvWPvS4sBgJji/_ssgManifest.js +0 -1
- package/dist/admin/_next/static/abFUeBpymhlx-IxygVnM9/_buildManifest.js +0 -11
- package/dist/admin/_next/static/abFUeBpymhlx-IxygVnM9/_clientMiddlewareManifest.json +0 -1
- package/dist/admin/_next/static/abFUeBpymhlx-IxygVnM9/_ssgManifest.js +0 -1
- package/dist/admin/_next/static/chunks/1584f10ea1cebcb2.js +0 -4
- package/dist/admin/_next/static/chunks/195bbec70cfcd241.js +0 -2
- package/dist/admin/_next/static/chunks/2583656ea9ac4ad6.js +0 -5
- package/dist/admin/_next/static/chunks/605800ff25160d05.js +0 -1
- package/dist/admin/_next/static/chunks/656b870f0567ed5f.js +0 -1
- package/dist/admin/_next/static/chunks/71098a6cd6181738.css +0 -3
- package/dist/admin/_next/static/chunks/9032f4a1aac1ca5d.css +0 -3
- package/dist/admin/_next/static/chunks/a28af2dc6f5fbaad.js +0 -1
- package/dist/admin/_next/static/chunks/b4205fc2f84bda68.css +0 -3
- package/dist/admin/_next/static/chunks/c1a750c25bc8d092.js +0 -1
- package/dist/admin/_next/static/chunks/c3d30f6f144dca51.js +0 -2
- package/dist/admin/_next/static/chunks/cbf55ce8731457ae.js +0 -2
- package/dist/admin/_next/static/chunks/f0c001244d275aab.js +0 -5
- package/dist/admin/_next/static/chunks/fde89fd76ad6a3d0.css +0 -3
- package/dist/admin/_next/static/chunks/turbopack-a3d691c83d4b1778.js +0 -4
- package/dist/admin/_next/static/dcjrfD44GuB6g8bZ6BcFm/_buildManifest.js +0 -11
- package/dist/admin/_next/static/dcjrfD44GuB6g8bZ6BcFm/_clientMiddlewareManifest.json +0 -1
- package/dist/admin/_next/static/dcjrfD44GuB6g8bZ6BcFm/_ssgManifest.js +0 -1
- package/dist/admin/_next/static/fTEa8Scx922n-dMuqN3Vc/_buildManifest.js +0 -11
- package/dist/admin/_next/static/fTEa8Scx922n-dMuqN3Vc/_clientMiddlewareManifest.json +0 -1
- package/dist/admin/_next/static/fTEa8Scx922n-dMuqN3Vc/_ssgManifest.js +0 -1
- package/dist/admin/_next/static/kZNwyhHft01wPtJ_AvqQT/_buildManifest.js +0 -11
- package/dist/admin/_next/static/kZNwyhHft01wPtJ_AvqQT/_clientMiddlewareManifest.json +0 -1
- package/dist/admin/_next/static/kZNwyhHft01wPtJ_AvqQT/_ssgManifest.js +0 -1
- package/dist/admin/_next/static/kyVInC6N3DY6NWnjkLQ4J/_buildManifest.js +0 -11
- package/dist/admin/_next/static/kyVInC6N3DY6NWnjkLQ4J/_clientMiddlewareManifest.json +0 -1
- package/dist/admin/_next/static/kyVInC6N3DY6NWnjkLQ4J/_ssgManifest.js +0 -1
- package/dist/admin/_next/static/twedXBdhyxpjS68UQoNAc/_buildManifest.js +0 -11
- package/dist/admin/_next/static/twedXBdhyxpjS68UQoNAc/_clientMiddlewareManifest.json +0 -1
- package/dist/admin/_next/static/twedXBdhyxpjS68UQoNAc/_ssgManifest.js +0 -1
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/commands/check.d.ts +0 -2
- package/dist/commands/check.d.ts.map +0 -1
- package/dist/commands/check.js +0 -104
- package/dist/commands/check.js.map +0 -1
- package/dist/commands/clean.d.ts +0 -2
- package/dist/commands/clean.d.ts.map +0 -1
- package/dist/commands/clean.js +0 -70
- package/dist/commands/clean.js.map +0 -1
- package/dist/commands/deploy.d.ts +0 -2
- package/dist/commands/deploy.d.ts.map +0 -1
- package/dist/commands/deploy.js +0 -11
- package/dist/commands/deploy.js.map +0 -1
- package/dist/commands/dev.d.ts +0 -2
- package/dist/commands/dev.d.ts.map +0 -1
- package/dist/commands/dev.js +0 -398
- package/dist/commands/dev.js.map +0 -1
- package/dist/commands/docs.d.ts +0 -2
- package/dist/commands/docs.d.ts.map +0 -1
- package/dist/commands/docs.js +0 -32
- package/dist/commands/docs.js.map +0 -1
- package/dist/commands/exec.d.ts +0 -2
- package/dist/commands/exec.d.ts.map +0 -1
- package/dist/commands/exec.js +0 -178
- package/dist/commands/exec.js.map +0 -1
- package/dist/commands/init.d.ts +0 -2
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -339
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/psql.d.ts +0 -2
- package/dist/commands/psql.d.ts.map +0 -1
- package/dist/commands/psql.js +0 -53
- package/dist/commands/psql.js.map +0 -1
- package/dist/commands/secrets.d.ts +0 -3
- package/dist/commands/secrets.d.ts.map +0 -1
- package/dist/commands/secrets.js +0 -136
- package/dist/commands/secrets.js.map +0 -1
- package/dist/lib/dev/database-manager.d.ts +0 -17
- package/dist/lib/dev/database-manager.d.ts.map +0 -1
- package/dist/lib/dev/database-manager.js +0 -114
- package/dist/lib/dev/database-manager.js.map +0 -1
- package/dist/lib/dev/env-resolver.d.ts +0 -14
- package/dist/lib/dev/env-resolver.d.ts.map +0 -1
- package/dist/lib/dev/env-resolver.js +0 -109
- package/dist/lib/dev/env-resolver.js.map +0 -1
- package/dist/lib/dev/http-proxy.d.ts +0 -11
- package/dist/lib/dev/http-proxy.d.ts.map +0 -1
- package/dist/lib/dev/http-proxy.js +0 -165
- package/dist/lib/dev/http-proxy.js.map +0 -1
- package/dist/lib/dev/index.d.ts +0 -11
- package/dist/lib/dev/index.d.ts.map +0 -1
- package/dist/lib/dev/index.js +0 -7
- package/dist/lib/dev/index.js.map +0 -1
- package/dist/lib/dev/instance-state.d.ts +0 -45
- package/dist/lib/dev/instance-state.d.ts.map +0 -1
- package/dist/lib/dev/instance-state.js +0 -213
- package/dist/lib/dev/instance-state.js.map +0 -1
- package/dist/lib/dev/port-allocator.d.ts +0 -5
- package/dist/lib/dev/port-allocator.d.ts.map +0 -1
- package/dist/lib/dev/port-allocator.js +0 -21
- package/dist/lib/dev/port-allocator.js.map +0 -1
- package/dist/lib/dev/service-runner.d.ts +0 -16
- package/dist/lib/dev/service-runner.d.ts.map +0 -1
- package/dist/lib/dev/service-runner.js +0 -61
- package/dist/lib/dev/service-runner.js.map +0 -1
- package/dist/lib/secrets/index.d.ts +0 -2
- package/dist/lib/secrets/index.d.ts.map +0 -1
- package/dist/lib/secrets/index.js +0 -2
- package/dist/lib/secrets/index.js.map +0 -1
- package/dist/lib/secrets/parser.d.ts +0 -37
- package/dist/lib/secrets/parser.d.ts.map +0 -1
- package/dist/lib/secrets/parser.js +0 -116
- package/dist/lib/secrets/parser.js.map +0 -1
- /package/dist/admin/_next/static/{0zkv3YeV6IWOWVWE1S1A1 → dtzWfchSIjRVrII5xoJl6}/_buildManifest.js +0 -0
- /package/dist/admin/_next/static/{0zkv3YeV6IWOWVWE1S1A1 → dtzWfchSIjRVrII5xoJl6}/_clientMiddlewareManifest.json +0 -0
- /package/dist/admin/_next/static/{0zkv3YeV6IWOWVWE1S1A1 → dtzWfchSIjRVrII5xoJl6}/_ssgManifest.js +0 -0
|
@@ -1,213 +0,0 @@
|
|
|
1
|
-
import * as fs from "fs";
|
|
2
|
-
import * as path from "path";
|
|
3
|
-
export class InstanceStateManager {
|
|
4
|
-
stateDir;
|
|
5
|
-
statePath;
|
|
6
|
-
lockPath;
|
|
7
|
-
ownsInstances = false;
|
|
8
|
-
constructor(projectRoot) {
|
|
9
|
-
this.stateDir = path.join(projectRoot, ".specific");
|
|
10
|
-
this.statePath = path.join(this.stateDir, "state.json");
|
|
11
|
-
this.lockPath = path.join(this.stateDir, "state.lock");
|
|
12
|
-
}
|
|
13
|
-
ensureStateDir() {
|
|
14
|
-
if (!fs.existsSync(this.stateDir)) {
|
|
15
|
-
fs.mkdirSync(this.stateDir, { recursive: true });
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
isProcessRunning(pid) {
|
|
19
|
-
try {
|
|
20
|
-
process.kill(pid, 0);
|
|
21
|
-
return true;
|
|
22
|
-
}
|
|
23
|
-
catch (e) {
|
|
24
|
-
const err = e;
|
|
25
|
-
// ESRCH means no such process
|
|
26
|
-
return err.code !== "ESRCH";
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
async acquireLock(timeoutMs = 5000) {
|
|
30
|
-
this.ensureStateDir();
|
|
31
|
-
const startTime = Date.now();
|
|
32
|
-
while (Date.now() - startTime < timeoutMs) {
|
|
33
|
-
try {
|
|
34
|
-
// Try to create lock file exclusively
|
|
35
|
-
const fd = fs.openSync(this.lockPath, fs.constants.O_CREAT | fs.constants.O_EXCL | fs.constants.O_WRONLY);
|
|
36
|
-
fs.writeSync(fd, String(process.pid));
|
|
37
|
-
fs.closeSync(fd);
|
|
38
|
-
return () => {
|
|
39
|
-
try {
|
|
40
|
-
fs.unlinkSync(this.lockPath);
|
|
41
|
-
}
|
|
42
|
-
catch {
|
|
43
|
-
// Ignore errors when removing lock
|
|
44
|
-
}
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
catch (e) {
|
|
48
|
-
const err = e;
|
|
49
|
-
if (err.code === "EEXIST") {
|
|
50
|
-
// Lock exists, check if owner is still alive
|
|
51
|
-
try {
|
|
52
|
-
const lockPid = parseInt(fs.readFileSync(this.lockPath, "utf-8").trim(), 10);
|
|
53
|
-
if (!this.isProcessRunning(lockPid)) {
|
|
54
|
-
// Owner is dead, remove stale lock
|
|
55
|
-
fs.unlinkSync(this.lockPath);
|
|
56
|
-
continue;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
// Error reading lock, try to remove it
|
|
61
|
-
try {
|
|
62
|
-
fs.unlinkSync(this.lockPath);
|
|
63
|
-
}
|
|
64
|
-
catch {
|
|
65
|
-
// Ignore
|
|
66
|
-
}
|
|
67
|
-
continue;
|
|
68
|
-
}
|
|
69
|
-
// Owner is alive, wait and retry
|
|
70
|
-
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
throw e;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
throw new Error("Failed to acquire state lock (timeout)");
|
|
78
|
-
}
|
|
79
|
-
async getExistingInstances() {
|
|
80
|
-
if (!fs.existsSync(this.statePath)) {
|
|
81
|
-
return null;
|
|
82
|
-
}
|
|
83
|
-
const releaseLock = await this.acquireLock();
|
|
84
|
-
try {
|
|
85
|
-
const content = fs.readFileSync(this.statePath, "utf-8");
|
|
86
|
-
const state = JSON.parse(content);
|
|
87
|
-
// Verify owner is still running
|
|
88
|
-
if (!this.isProcessRunning(state.owner.pid)) {
|
|
89
|
-
return null; // State is stale
|
|
90
|
-
}
|
|
91
|
-
return state;
|
|
92
|
-
}
|
|
93
|
-
catch {
|
|
94
|
-
return null;
|
|
95
|
-
}
|
|
96
|
-
finally {
|
|
97
|
-
releaseLock();
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
async cleanStaleState() {
|
|
101
|
-
if (!fs.existsSync(this.statePath)) {
|
|
102
|
-
return false;
|
|
103
|
-
}
|
|
104
|
-
const releaseLock = await this.acquireLock();
|
|
105
|
-
try {
|
|
106
|
-
const content = fs.readFileSync(this.statePath, "utf-8");
|
|
107
|
-
const state = JSON.parse(content);
|
|
108
|
-
if (!this.isProcessRunning(state.owner.pid)) {
|
|
109
|
-
// Owner is dead, clean up state
|
|
110
|
-
fs.unlinkSync(this.statePath);
|
|
111
|
-
return true;
|
|
112
|
-
}
|
|
113
|
-
return false;
|
|
114
|
-
}
|
|
115
|
-
catch {
|
|
116
|
-
// Error reading state, try to clean it
|
|
117
|
-
try {
|
|
118
|
-
fs.unlinkSync(this.statePath);
|
|
119
|
-
return true;
|
|
120
|
-
}
|
|
121
|
-
catch {
|
|
122
|
-
// Ignore
|
|
123
|
-
}
|
|
124
|
-
return false;
|
|
125
|
-
}
|
|
126
|
-
finally {
|
|
127
|
-
releaseLock();
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
async claimOwnership(command) {
|
|
131
|
-
const releaseLock = await this.acquireLock();
|
|
132
|
-
try {
|
|
133
|
-
// Check if state already exists
|
|
134
|
-
if (fs.existsSync(this.statePath)) {
|
|
135
|
-
const content = fs.readFileSync(this.statePath, "utf-8");
|
|
136
|
-
const state = JSON.parse(content);
|
|
137
|
-
if (this.isProcessRunning(state.owner.pid)) {
|
|
138
|
-
throw new Error(`Instances already owned by PID ${state.owner.pid}`);
|
|
139
|
-
}
|
|
140
|
-
// Owner is dead, we can take over
|
|
141
|
-
}
|
|
142
|
-
const state = {
|
|
143
|
-
version: 1,
|
|
144
|
-
owner: {
|
|
145
|
-
pid: process.pid,
|
|
146
|
-
command,
|
|
147
|
-
startedAt: new Date().toISOString(),
|
|
148
|
-
},
|
|
149
|
-
databases: {},
|
|
150
|
-
services: {},
|
|
151
|
-
};
|
|
152
|
-
this.writeStateAtomic(state);
|
|
153
|
-
this.ownsInstances = true;
|
|
154
|
-
}
|
|
155
|
-
finally {
|
|
156
|
-
releaseLock();
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
async registerDatabase(name, info) {
|
|
160
|
-
if (!this.ownsInstances) {
|
|
161
|
-
throw new Error("Cannot register database: not the owner");
|
|
162
|
-
}
|
|
163
|
-
const releaseLock = await this.acquireLock();
|
|
164
|
-
try {
|
|
165
|
-
const state = this.readState();
|
|
166
|
-
state.databases[name] = info;
|
|
167
|
-
this.writeStateAtomic(state);
|
|
168
|
-
}
|
|
169
|
-
finally {
|
|
170
|
-
releaseLock();
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
async registerService(name, info) {
|
|
174
|
-
if (!this.ownsInstances) {
|
|
175
|
-
throw new Error("Cannot register service: not the owner");
|
|
176
|
-
}
|
|
177
|
-
const releaseLock = await this.acquireLock();
|
|
178
|
-
try {
|
|
179
|
-
const state = this.readState();
|
|
180
|
-
state.services[name] = info;
|
|
181
|
-
this.writeStateAtomic(state);
|
|
182
|
-
}
|
|
183
|
-
finally {
|
|
184
|
-
releaseLock();
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
async releaseOwnership() {
|
|
188
|
-
if (!this.ownsInstances) {
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
191
|
-
const releaseLock = await this.acquireLock();
|
|
192
|
-
try {
|
|
193
|
-
if (fs.existsSync(this.statePath)) {
|
|
194
|
-
fs.unlinkSync(this.statePath);
|
|
195
|
-
}
|
|
196
|
-
this.ownsInstances = false;
|
|
197
|
-
}
|
|
198
|
-
finally {
|
|
199
|
-
releaseLock();
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
readState() {
|
|
203
|
-
const content = fs.readFileSync(this.statePath, "utf-8");
|
|
204
|
-
return JSON.parse(content);
|
|
205
|
-
}
|
|
206
|
-
writeStateAtomic(state) {
|
|
207
|
-
this.ensureStateDir();
|
|
208
|
-
const tmpPath = this.statePath + ".tmp";
|
|
209
|
-
fs.writeFileSync(tmpPath, JSON.stringify(state, null, 2));
|
|
210
|
-
fs.renameSync(tmpPath, this.statePath);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
//# sourceMappingURL=instance-state.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"instance-state.js","sourceRoot":"","sources":["../../../src/lib/dev/instance-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"port-allocator.d.ts","sourceRoot":"","sources":["../../../src/lib/dev/port-allocator.ts"],"names":[],"mappings":"AAMA,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAA0B;IAE3C,QAAQ,IAAI,MAAM;CAgBnB"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
// Port allocator that assigns random unique ports in a high range
|
|
2
|
-
// Uses range 40000-49999 to avoid conflicts with common applications
|
|
3
|
-
const PORT_RANGE_START = 40000;
|
|
4
|
-
const PORT_RANGE_END = 49999;
|
|
5
|
-
export class PortAllocator {
|
|
6
|
-
usedPorts = new Set();
|
|
7
|
-
allocate() {
|
|
8
|
-
const rangeSize = PORT_RANGE_END - PORT_RANGE_START + 1;
|
|
9
|
-
// Safety check to prevent infinite loop
|
|
10
|
-
if (this.usedPorts.size >= rangeSize) {
|
|
11
|
-
throw new Error("No available ports in range");
|
|
12
|
-
}
|
|
13
|
-
let port;
|
|
14
|
-
do {
|
|
15
|
-
port = PORT_RANGE_START + Math.floor(Math.random() * rangeSize);
|
|
16
|
-
} while (this.usedPorts.has(port));
|
|
17
|
-
this.usedPorts.add(port);
|
|
18
|
-
return port;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
//# sourceMappingURL=port-allocator.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"port-allocator.js","sourceRoot":"","sources":["../../../src/lib/dev/port-allocator.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,qEAAqE;AAErE,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAC/B,MAAM,cAAc,GAAG,KAAK,CAAC;AAE7B,MAAM,OAAO,aAAa;IAChB,SAAS,GAAgB,IAAI,GAAG,EAAE,CAAC;IAE3C,QAAQ;QACN,MAAM,SAAS,GAAG,cAAc,GAAG,gBAAgB,GAAG,CAAC,CAAC;QAExD,wCAAwC;QACxC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,IAAY,CAAC;QACjB,GAAG,CAAC;YACF,IAAI,GAAG,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;QAClE,CAAC,QAAQ,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QAEnC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { ChildProcess } from "child_process";
|
|
2
|
-
import type { Service } from "@specific/config";
|
|
3
|
-
import type { DatabaseInstance } from "./database-manager.js";
|
|
4
|
-
export interface RunningService {
|
|
5
|
-
name: string;
|
|
6
|
-
port: number | undefined;
|
|
7
|
-
process: ChildProcess;
|
|
8
|
-
stop(): Promise<void>;
|
|
9
|
-
}
|
|
10
|
-
export interface LogLine {
|
|
11
|
-
service: string;
|
|
12
|
-
text: string;
|
|
13
|
-
stream: "stdout" | "stderr";
|
|
14
|
-
}
|
|
15
|
-
export declare function startService(service: Service, databases: Map<string, DatabaseInstance>, secrets: Map<string, string>, port: number | undefined, onLog: (line: LogLine) => void): RunningService;
|
|
16
|
-
//# sourceMappingURL=service-runner.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service-runner.d.ts","sourceRoot":"","sources":["../../../src/lib/dev/service-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,YAAY,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAG9D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,OAAO,EAAE,YAAY,CAAC;IACtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC7B;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,EACxC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,GAC7B,cAAc,CAgEhB"}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { spawn, ChildProcess } from "child_process";
|
|
2
|
-
import { resolveEnv } from "./env-resolver.js";
|
|
3
|
-
export function startService(service, databases, secrets, port, onLog) {
|
|
4
|
-
// Determine command: prefer dev.command, fallback to command
|
|
5
|
-
const command = service.dev?.command ?? service.command;
|
|
6
|
-
if (!command) {
|
|
7
|
-
throw new Error(`Service "${service.name}" has no command`);
|
|
8
|
-
}
|
|
9
|
-
// Resolve environment variables
|
|
10
|
-
const resolvedEnv = resolveEnv(service.env, databases, secrets, port);
|
|
11
|
-
// Spawn the process
|
|
12
|
-
const child = spawn(command, {
|
|
13
|
-
shell: true,
|
|
14
|
-
cwd: process.cwd(),
|
|
15
|
-
env: {
|
|
16
|
-
...process.env,
|
|
17
|
-
...resolvedEnv,
|
|
18
|
-
},
|
|
19
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
20
|
-
});
|
|
21
|
-
// Handle stdout
|
|
22
|
-
child.stdout?.on("data", (data) => {
|
|
23
|
-
const lines = data.toString().split("\n");
|
|
24
|
-
for (const line of lines) {
|
|
25
|
-
if (line.trim()) {
|
|
26
|
-
onLog({ service: service.name, text: line, stream: "stdout" });
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
// Handle stderr
|
|
31
|
-
child.stderr?.on("data", (data) => {
|
|
32
|
-
const lines = data.toString().split("\n");
|
|
33
|
-
for (const line of lines) {
|
|
34
|
-
if (line.trim()) {
|
|
35
|
-
onLog({ service: service.name, text: line, stream: "stderr" });
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
});
|
|
39
|
-
return {
|
|
40
|
-
name: service.name,
|
|
41
|
-
port,
|
|
42
|
-
process: child,
|
|
43
|
-
async stop() {
|
|
44
|
-
return new Promise((resolve) => {
|
|
45
|
-
if (child.killed) {
|
|
46
|
-
resolve();
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
child.once("exit", () => resolve());
|
|
50
|
-
child.kill("SIGTERM");
|
|
51
|
-
// Force kill after 5 seconds
|
|
52
|
-
setTimeout(() => {
|
|
53
|
-
if (!child.killed) {
|
|
54
|
-
child.kill("SIGKILL");
|
|
55
|
-
}
|
|
56
|
-
}, 5000);
|
|
57
|
-
});
|
|
58
|
-
},
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
//# sourceMappingURL=service-runner.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service-runner.js","sourceRoot":"","sources":["../../../src/lib/dev/service-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAGpD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAe/C,MAAM,UAAU,YAAY,CAC1B,OAAgB,EAChB,SAAwC,EACxC,OAA4B,EAC5B,IAAwB,EACxB,KAA8B;IAE9B,6DAA6D;IAC7D,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IACxD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,YAAY,OAAO,CAAC,IAAI,kBAAkB,CAAC,CAAC;IAC9D,CAAC;IAED,gCAAgC;IAChC,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAEtE,oBAAoB;IACpB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE;QAC3B,KAAK,EAAE,IAAI;QACX,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,GAAG,EAAE;YACH,GAAG,OAAO,CAAC,GAAG;YACd,GAAG,WAAW;SACf;QACD,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;KAClC,CAAC,CAAC;IAEH,gBAAgB;IAChB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBAChB,KAAK,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,gBAAgB;IAChB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBAChB,KAAK,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI;QACJ,OAAO,EAAE,KAAK;QACd,KAAK,CAAC,IAAI;YACR,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC7B,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBACjB,OAAO,EAAE,CAAC;oBACV,OAAO;gBACT,CAAC;gBAED,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;gBACpC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAEtB,6BAA6B;gBAC7B,UAAU,CAAC,GAAG,EAAE;oBACd,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;wBAClB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACxB,CAAC;gBACH,CAAC,EAAE,IAAI,CAAC,CAAC;YACX,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/secrets/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACd,sBAAsB,GACvB,MAAM,aAAa,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/secrets/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACd,sBAAsB,GACvB,MAAM,aAAa,CAAC"}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
export declare const SECRETS_FILE = "specific.secrets";
|
|
2
|
-
export declare const GENERATED_SECRETS_FILE = ".specific/generated-secrets.json";
|
|
3
|
-
/**
|
|
4
|
-
* Parse a specific.secrets file and return a map of secret names to values.
|
|
5
|
-
* Format: HCL key = "value" pairs
|
|
6
|
-
*/
|
|
7
|
-
export declare function parseSecretsFile(content: string): Promise<Map<string, string>>;
|
|
8
|
-
/**
|
|
9
|
-
* Load secrets from specific.secrets file.
|
|
10
|
-
* Returns an empty map if the file doesn't exist.
|
|
11
|
-
*/
|
|
12
|
-
export declare function loadSecrets(): Promise<Map<string, string>>;
|
|
13
|
-
/**
|
|
14
|
-
* Generate a random alphanumeric string.
|
|
15
|
-
*/
|
|
16
|
-
export declare function generateRandomString(length?: number): string;
|
|
17
|
-
/**
|
|
18
|
-
* Load generated secrets from .specific/generated-secrets.json.
|
|
19
|
-
* Returns an empty map if the file doesn't exist.
|
|
20
|
-
*/
|
|
21
|
-
export declare function loadGeneratedSecrets(): Promise<Map<string, string>>;
|
|
22
|
-
/**
|
|
23
|
-
* Save a generated secret to .specific/generated-secrets.json.
|
|
24
|
-
* Creates the file and directory if they don't exist.
|
|
25
|
-
*/
|
|
26
|
-
export declare function saveGeneratedSecret(name: string, value: string): Promise<void>;
|
|
27
|
-
/**
|
|
28
|
-
* Prepare all secrets for use, handling generated secrets.
|
|
29
|
-
* - Loads user secrets from specific.secrets
|
|
30
|
-
* - For generated secrets not in user secrets, loads or creates from generated storage
|
|
31
|
-
* - Returns merged secrets map ready for env resolution
|
|
32
|
-
*/
|
|
33
|
-
export declare function prepareSecrets(secretsConfig: Array<{
|
|
34
|
-
name: string;
|
|
35
|
-
generated?: boolean;
|
|
36
|
-
}>): Promise<Map<string, string>>;
|
|
37
|
-
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../src/lib/secrets/parser.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,YAAY,qBAAqB,CAAC;AAC/C,eAAO,MAAM,sBAAsB,qCAAqC,CAAC;AAEzE;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAgBpF;AAED;;;GAGG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAOhE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,GAAE,MAAW,GAAG,MAAM,CAQhE;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAQzE;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBpF;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,aAAa,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GAC1D,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAgC9B"}
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
import { readFile, writeFile, mkdir } from "fs/promises";
|
|
2
|
-
import { existsSync } from "fs";
|
|
3
|
-
import * as path from "path";
|
|
4
|
-
import * as crypto from "crypto";
|
|
5
|
-
import hcl2JsonParser from "hcl2-json-parser";
|
|
6
|
-
const { parseToObject } = hcl2JsonParser;
|
|
7
|
-
export const SECRETS_FILE = "specific.secrets";
|
|
8
|
-
export const GENERATED_SECRETS_FILE = ".specific/generated-secrets.json";
|
|
9
|
-
/**
|
|
10
|
-
* Parse a specific.secrets file and return a map of secret names to values.
|
|
11
|
-
* Format: HCL key = "value" pairs
|
|
12
|
-
*/
|
|
13
|
-
export async function parseSecretsFile(content) {
|
|
14
|
-
const secrets = new Map();
|
|
15
|
-
if (!content.trim()) {
|
|
16
|
-
return secrets;
|
|
17
|
-
}
|
|
18
|
-
const parsed = (await parseToObject(content));
|
|
19
|
-
for (const [key, value] of Object.entries(parsed)) {
|
|
20
|
-
if (typeof value === "string") {
|
|
21
|
-
secrets.set(key, value);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
return secrets;
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Load secrets from specific.secrets file.
|
|
28
|
-
* Returns an empty map if the file doesn't exist.
|
|
29
|
-
*/
|
|
30
|
-
export async function loadSecrets() {
|
|
31
|
-
if (!existsSync(SECRETS_FILE)) {
|
|
32
|
-
return new Map();
|
|
33
|
-
}
|
|
34
|
-
const content = await readFile(SECRETS_FILE, "utf-8");
|
|
35
|
-
return await parseSecretsFile(content);
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Generate a random alphanumeric string.
|
|
39
|
-
*/
|
|
40
|
-
export function generateRandomString(length = 30) {
|
|
41
|
-
const chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
|
42
|
-
const bytes = crypto.randomBytes(length);
|
|
43
|
-
let result = "";
|
|
44
|
-
for (let i = 0; i < length; i++) {
|
|
45
|
-
result += chars[bytes[i] % chars.length];
|
|
46
|
-
}
|
|
47
|
-
return result;
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Load generated secrets from .specific/generated-secrets.json.
|
|
51
|
-
* Returns an empty map if the file doesn't exist.
|
|
52
|
-
*/
|
|
53
|
-
export async function loadGeneratedSecrets() {
|
|
54
|
-
if (!existsSync(GENERATED_SECRETS_FILE)) {
|
|
55
|
-
return new Map();
|
|
56
|
-
}
|
|
57
|
-
const content = await readFile(GENERATED_SECRETS_FILE, "utf-8");
|
|
58
|
-
const parsed = JSON.parse(content);
|
|
59
|
-
return new Map(Object.entries(parsed));
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Save a generated secret to .specific/generated-secrets.json.
|
|
63
|
-
* Creates the file and directory if they don't exist.
|
|
64
|
-
*/
|
|
65
|
-
export async function saveGeneratedSecret(name, value) {
|
|
66
|
-
// Load existing secrets
|
|
67
|
-
let secrets = {};
|
|
68
|
-
if (existsSync(GENERATED_SECRETS_FILE)) {
|
|
69
|
-
const content = await readFile(GENERATED_SECRETS_FILE, "utf-8");
|
|
70
|
-
secrets = JSON.parse(content);
|
|
71
|
-
}
|
|
72
|
-
// Add new secret
|
|
73
|
-
secrets[name] = value;
|
|
74
|
-
// Ensure .specific directory exists
|
|
75
|
-
const dir = path.dirname(GENERATED_SECRETS_FILE);
|
|
76
|
-
if (!existsSync(dir)) {
|
|
77
|
-
await mkdir(dir, { recursive: true });
|
|
78
|
-
}
|
|
79
|
-
// Write back
|
|
80
|
-
await writeFile(GENERATED_SECRETS_FILE, JSON.stringify(secrets, null, 2) + "\n");
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Prepare all secrets for use, handling generated secrets.
|
|
84
|
-
* - Loads user secrets from specific.secrets
|
|
85
|
-
* - For generated secrets not in user secrets, loads or creates from generated storage
|
|
86
|
-
* - Returns merged secrets map ready for env resolution
|
|
87
|
-
*/
|
|
88
|
-
export async function prepareSecrets(secretsConfig) {
|
|
89
|
-
// Load user-defined secrets
|
|
90
|
-
const userSecrets = await loadSecrets();
|
|
91
|
-
// Load previously generated secrets
|
|
92
|
-
const generatedSecrets = await loadGeneratedSecrets();
|
|
93
|
-
// Build final secrets map
|
|
94
|
-
const finalSecrets = new Map();
|
|
95
|
-
for (const secretDef of secretsConfig) {
|
|
96
|
-
// Check user secrets first
|
|
97
|
-
const userValue = userSecrets.get(secretDef.name);
|
|
98
|
-
if (userValue !== undefined) {
|
|
99
|
-
finalSecrets.set(secretDef.name, userValue);
|
|
100
|
-
continue;
|
|
101
|
-
}
|
|
102
|
-
// For generated secrets, check or create generated value
|
|
103
|
-
if (secretDef.generated) {
|
|
104
|
-
let generatedValue = generatedSecrets.get(secretDef.name);
|
|
105
|
-
if (generatedValue === undefined) {
|
|
106
|
-
// Generate new value and persist it
|
|
107
|
-
generatedValue = generateRandomString(30);
|
|
108
|
-
await saveGeneratedSecret(secretDef.name, generatedValue);
|
|
109
|
-
}
|
|
110
|
-
finalSecrets.set(secretDef.name, generatedValue);
|
|
111
|
-
}
|
|
112
|
-
// Non-generated secrets without values will be handled by MissingSecretError in resolver
|
|
113
|
-
}
|
|
114
|
-
return finalSecrets;
|
|
115
|
-
}
|
|
116
|
-
//# sourceMappingURL=parser.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/lib/secrets/parser.ts"],"names":[],"mappings":"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"}
|
/package/dist/admin/_next/static/{0zkv3YeV6IWOWVWE1S1A1 → dtzWfchSIjRVrII5xoJl6}/_buildManifest.js
RENAMED
|
File without changes
|
|
File without changes
|
/package/dist/admin/_next/static/{0zkv3YeV6IWOWVWE1S1A1 → dtzWfchSIjRVrII5xoJl6}/_ssgManifest.js
RENAMED
|
File without changes
|