@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,114 +0,0 @@
|
|
|
1
|
-
import EmbeddedPostgres from "embedded-postgres";
|
|
2
|
-
import * as fs from "fs";
|
|
3
|
-
import * as path from "path";
|
|
4
|
-
export async function startDatabase(db, port, dataDir = ".specific/data") {
|
|
5
|
-
if (db.engine === "redis") {
|
|
6
|
-
return startRedis(db, port);
|
|
7
|
-
}
|
|
8
|
-
if (db.engine === "object_store") {
|
|
9
|
-
return startObjectStore(db, port, dataDir);
|
|
10
|
-
}
|
|
11
|
-
return startPostgres(db, port, dataDir);
|
|
12
|
-
}
|
|
13
|
-
async function startPostgres(db, port, dataDir) {
|
|
14
|
-
const dbDataPath = path.join(process.cwd(), dataDir, db.name);
|
|
15
|
-
const host = "127.0.0.1";
|
|
16
|
-
const user = "postgres";
|
|
17
|
-
const password = "postgres";
|
|
18
|
-
const pg = new EmbeddedPostgres({
|
|
19
|
-
databaseDir: dbDataPath,
|
|
20
|
-
port,
|
|
21
|
-
user,
|
|
22
|
-
password,
|
|
23
|
-
persistent: true,
|
|
24
|
-
onLog: () => { },
|
|
25
|
-
onError: () => { },
|
|
26
|
-
});
|
|
27
|
-
// Only initialize if the data directory doesn't exist yet
|
|
28
|
-
const dataExists = fs.existsSync(dbDataPath);
|
|
29
|
-
if (!dataExists) {
|
|
30
|
-
await pg.initialise();
|
|
31
|
-
}
|
|
32
|
-
await pg.start();
|
|
33
|
-
// Create the database if it doesn't exist
|
|
34
|
-
try {
|
|
35
|
-
await pg.createDatabase(db.name);
|
|
36
|
-
}
|
|
37
|
-
catch {
|
|
38
|
-
// Database may already exist, which is fine
|
|
39
|
-
}
|
|
40
|
-
return {
|
|
41
|
-
name: db.name,
|
|
42
|
-
engine: "postgres",
|
|
43
|
-
port,
|
|
44
|
-
host,
|
|
45
|
-
user,
|
|
46
|
-
password,
|
|
47
|
-
dbName: db.name,
|
|
48
|
-
url: `postgres://${user}:${password}@${host}:${port}/${db.name}`,
|
|
49
|
-
async stop() {
|
|
50
|
-
await pg.stop();
|
|
51
|
-
},
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
async function startRedis(db, port) {
|
|
55
|
-
const { RedisMemoryServer } = await import("redis-memory-server");
|
|
56
|
-
const server = new RedisMemoryServer({
|
|
57
|
-
instance: {
|
|
58
|
-
port,
|
|
59
|
-
},
|
|
60
|
-
});
|
|
61
|
-
const host = await server.getHost();
|
|
62
|
-
const actualPort = await server.getPort();
|
|
63
|
-
return {
|
|
64
|
-
name: db.name,
|
|
65
|
-
engine: "redis",
|
|
66
|
-
port: actualPort,
|
|
67
|
-
host,
|
|
68
|
-
user: "",
|
|
69
|
-
password: "",
|
|
70
|
-
dbName: db.name,
|
|
71
|
-
url: `redis://${host}:${actualPort}`,
|
|
72
|
-
async stop() {
|
|
73
|
-
await server.stop();
|
|
74
|
-
},
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
async function startObjectStore(db, port, dataDir) {
|
|
78
|
-
const S3rver = (await import("s3rver")).default;
|
|
79
|
-
const dbDataPath = path.join(process.cwd(), dataDir, db.name);
|
|
80
|
-
// Ensure data directory exists
|
|
81
|
-
if (!fs.existsSync(dbDataPath)) {
|
|
82
|
-
fs.mkdirSync(dbDataPath, { recursive: true });
|
|
83
|
-
}
|
|
84
|
-
const host = "127.0.0.1";
|
|
85
|
-
const accessKey = "S3RVER";
|
|
86
|
-
const secretKey = "S3RVER";
|
|
87
|
-
const server = new S3rver({
|
|
88
|
-
address: host,
|
|
89
|
-
port,
|
|
90
|
-
directory: dbDataPath,
|
|
91
|
-
silent: true,
|
|
92
|
-
allowMismatchedSignatures: true,
|
|
93
|
-
configureBuckets: [{ name: db.name }],
|
|
94
|
-
});
|
|
95
|
-
await server.run();
|
|
96
|
-
const endpoint = `http://${host}:${port}`;
|
|
97
|
-
return {
|
|
98
|
-
name: db.name,
|
|
99
|
-
engine: "object_store",
|
|
100
|
-
port,
|
|
101
|
-
host,
|
|
102
|
-
user: "",
|
|
103
|
-
password: "",
|
|
104
|
-
dbName: db.name,
|
|
105
|
-
url: endpoint,
|
|
106
|
-
endpoint,
|
|
107
|
-
accessKey,
|
|
108
|
-
secretKey,
|
|
109
|
-
async stop() {
|
|
110
|
-
await server.close();
|
|
111
|
-
},
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
//# sourceMappingURL=database-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"database-manager.js","sourceRoot":"","sources":["../../../src/lib/dev/database-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { Reference } from "@specific/config";
|
|
2
|
-
import type { DatabaseInstance } from "./database-manager.js";
|
|
3
|
-
export declare class MissingSecretError extends Error {
|
|
4
|
-
secretName: string;
|
|
5
|
-
constructor(secretName: string);
|
|
6
|
-
}
|
|
7
|
-
export declare function resolveEnvValue(value: string | Reference, databases: Map<string, DatabaseInstance>, secrets: Map<string, string>, servicePort?: number): string;
|
|
8
|
-
export declare function resolveEnv(env: Record<string, string | Reference> | undefined, databases: Map<string, DatabaseInstance>, secrets: Map<string, string>, servicePort?: number): Record<string, string>;
|
|
9
|
-
/**
|
|
10
|
-
* Resolve environment variables for exec mode.
|
|
11
|
-
* Silently skips port references since there's no service port in exec context.
|
|
12
|
-
*/
|
|
13
|
-
export declare function resolveEnvForExec(env: Record<string, string | Reference> | undefined, databases: Map<string, DatabaseInstance>, secrets: Map<string, string>): Record<string, string>;
|
|
14
|
-
//# sourceMappingURL=env-resolver.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"env-resolver.d.ts","sourceRoot":"","sources":["../../../src/lib/dev/env-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAG9D,qBAAa,kBAAmB,SAAQ,KAAK;IACxB,UAAU,EAAE,MAAM;gBAAlB,UAAU,EAAE,MAAM;CAQtC;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,EACxC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CAqER;AAED,wBAAgB,UAAU,CACxB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,SAAS,EACnD,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,EACxC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUxB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,SAAS,EACnD,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,EACxC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAqBxB"}
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
import { SECRETS_FILE } from "../secrets/index.js";
|
|
2
|
-
export class MissingSecretError extends Error {
|
|
3
|
-
secretName;
|
|
4
|
-
constructor(secretName) {
|
|
5
|
-
super(`Missing secret '${secretName}'\n\n` +
|
|
6
|
-
`This secret is declared in specific.hcl but has no value in ${SECRETS_FILE}.\n\n` +
|
|
7
|
-
`Run: specific secrets set ${secretName}`);
|
|
8
|
-
this.secretName = secretName;
|
|
9
|
-
this.name = "MissingSecretError";
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
export function resolveEnvValue(value, databases, secrets, servicePort) {
|
|
13
|
-
if (typeof value === "string") {
|
|
14
|
-
return value;
|
|
15
|
-
}
|
|
16
|
-
switch (value.type) {
|
|
17
|
-
case "port":
|
|
18
|
-
if (servicePort === undefined) {
|
|
19
|
-
throw new Error("Port reference used but no port allocated");
|
|
20
|
-
}
|
|
21
|
-
return String(servicePort);
|
|
22
|
-
case "database": {
|
|
23
|
-
const db = databases.get(value.name);
|
|
24
|
-
if (!db) {
|
|
25
|
-
throw new Error(`Database "${value.name}" not found`);
|
|
26
|
-
}
|
|
27
|
-
switch (value.attribute) {
|
|
28
|
-
case "url":
|
|
29
|
-
return db.url;
|
|
30
|
-
case "host":
|
|
31
|
-
return db.host;
|
|
32
|
-
case "port":
|
|
33
|
-
return String(db.port);
|
|
34
|
-
case "user":
|
|
35
|
-
return db.user;
|
|
36
|
-
case "password":
|
|
37
|
-
return db.password;
|
|
38
|
-
case "name":
|
|
39
|
-
return db.dbName;
|
|
40
|
-
case "endpoint":
|
|
41
|
-
if (!db.endpoint) {
|
|
42
|
-
throw new Error(`Database "${value.name}" does not have an endpoint (not an object_store)`);
|
|
43
|
-
}
|
|
44
|
-
return db.endpoint;
|
|
45
|
-
case "access_key":
|
|
46
|
-
if (!db.accessKey) {
|
|
47
|
-
throw new Error(`Database "${value.name}" does not have an access_key (not an object_store)`);
|
|
48
|
-
}
|
|
49
|
-
return db.accessKey;
|
|
50
|
-
case "secret_key":
|
|
51
|
-
if (!db.secretKey) {
|
|
52
|
-
throw new Error(`Database "${value.name}" does not have a secret_key (not an object_store)`);
|
|
53
|
-
}
|
|
54
|
-
return db.secretKey;
|
|
55
|
-
default:
|
|
56
|
-
throw new Error(`Unknown database attribute: ${value.attribute}`);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
case "config":
|
|
60
|
-
// Config variables not supported yet
|
|
61
|
-
throw new Error(`Config variables not supported in dev mode yet`);
|
|
62
|
-
case "secret": {
|
|
63
|
-
const secretValue = secrets.get(value.name);
|
|
64
|
-
if (secretValue === undefined) {
|
|
65
|
-
throw new MissingSecretError(value.name);
|
|
66
|
-
}
|
|
67
|
-
return secretValue;
|
|
68
|
-
}
|
|
69
|
-
case "build":
|
|
70
|
-
// Build references shouldn't appear in env
|
|
71
|
-
throw new Error(`Build references cannot be used as env values`);
|
|
72
|
-
default:
|
|
73
|
-
throw new Error(`Unknown reference type`);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
export function resolveEnv(env, databases, secrets, servicePort) {
|
|
77
|
-
if (!env) {
|
|
78
|
-
return {};
|
|
79
|
-
}
|
|
80
|
-
const resolved = {};
|
|
81
|
-
for (const [key, value] of Object.entries(env)) {
|
|
82
|
-
resolved[key] = resolveEnvValue(value, databases, secrets, servicePort);
|
|
83
|
-
}
|
|
84
|
-
return resolved;
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Resolve environment variables for exec mode.
|
|
88
|
-
* Silently skips port references since there's no service port in exec context.
|
|
89
|
-
*/
|
|
90
|
-
export function resolveEnvForExec(env, databases, secrets) {
|
|
91
|
-
if (!env) {
|
|
92
|
-
return {};
|
|
93
|
-
}
|
|
94
|
-
const resolved = {};
|
|
95
|
-
for (const [key, value] of Object.entries(env)) {
|
|
96
|
-
if (typeof value === "string") {
|
|
97
|
-
resolved[key] = value;
|
|
98
|
-
continue;
|
|
99
|
-
}
|
|
100
|
-
// Skip port references silently
|
|
101
|
-
if (value.type === "port") {
|
|
102
|
-
continue;
|
|
103
|
-
}
|
|
104
|
-
// For other reference types, use the standard resolver (will throw on errors)
|
|
105
|
-
resolved[key] = resolveEnvValue(value, databases, secrets);
|
|
106
|
-
}
|
|
107
|
-
return resolved;
|
|
108
|
-
}
|
|
109
|
-
//# sourceMappingURL=env-resolver.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"env-resolver.js","sourceRoot":"","sources":["../../../src/lib/dev/env-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export interface ServiceRoute {
|
|
2
|
-
name: string;
|
|
3
|
-
port: number;
|
|
4
|
-
}
|
|
5
|
-
export interface HttpProxyInstance {
|
|
6
|
-
httpPort: number;
|
|
7
|
-
httpsPort: number;
|
|
8
|
-
stop(): Promise<void>;
|
|
9
|
-
}
|
|
10
|
-
export declare function startHttpProxy(services: ServiceRoute[]): Promise<HttpProxyInstance>;
|
|
11
|
-
//# sourceMappingURL=http-proxy.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"http-proxy.d.ts","sourceRoot":"","sources":["../../../src/lib/dev/http-proxy.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAMD,wBAAsB,cAAc,CAClC,QAAQ,EAAE,YAAY,EAAE,GACvB,OAAO,CAAC,iBAAiB,CAAC,CAuJ5B"}
|
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
import * as http from "http";
|
|
2
|
-
import * as https from "https";
|
|
3
|
-
import httpProxy from "http-proxy";
|
|
4
|
-
import devcert from "devcert";
|
|
5
|
-
const HTTP_PORT = 80;
|
|
6
|
-
const HTTPS_PORT = 443;
|
|
7
|
-
const DOMAIN_SUFFIX = ".local.spcf.app";
|
|
8
|
-
export async function startHttpProxy(services) {
|
|
9
|
-
// Build service lookup map: name -> port
|
|
10
|
-
const serviceMap = new Map();
|
|
11
|
-
const domains = [];
|
|
12
|
-
for (const svc of services) {
|
|
13
|
-
serviceMap.set(svc.name, svc.port);
|
|
14
|
-
domains.push(`${svc.name}${DOMAIN_SUFFIX}`);
|
|
15
|
-
}
|
|
16
|
-
// Get TLS certificate from devcert for all service domains
|
|
17
|
-
// Use skipCertutil to avoid sudo prompts - CA was already installed during `specific init`
|
|
18
|
-
let key;
|
|
19
|
-
let cert;
|
|
20
|
-
try {
|
|
21
|
-
const result = await devcert.certificateFor(domains, { skipCertutil: true });
|
|
22
|
-
key = result.key;
|
|
23
|
-
cert = result.cert;
|
|
24
|
-
}
|
|
25
|
-
catch (err) {
|
|
26
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
27
|
-
// Check if this is a CA installation issue
|
|
28
|
-
if (message.includes("sudo") || message.includes("password") || message.includes("CA")) {
|
|
29
|
-
throw new Error(`TLS certificate authority not installed. Run 'specific init' first to set up TLS certificates.`);
|
|
30
|
-
}
|
|
31
|
-
throw err;
|
|
32
|
-
}
|
|
33
|
-
// Create the proxy server
|
|
34
|
-
const proxy = httpProxy.createProxyServer({});
|
|
35
|
-
// Handle proxy errors
|
|
36
|
-
proxy.on("error", (err, req, res) => {
|
|
37
|
-
if (res instanceof http.ServerResponse && !res.headersSent) {
|
|
38
|
-
res.writeHead(502, { "Content-Type": "text/html" });
|
|
39
|
-
res.end(`<h1>Bad Gateway</h1><p>Service unavailable: ${err.message}</p>`);
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
// Shared request handler
|
|
43
|
-
const handleRequest = (req, res) => {
|
|
44
|
-
const host = req.headers.host || "";
|
|
45
|
-
const serviceName = extractServiceName(host);
|
|
46
|
-
if (!serviceName) {
|
|
47
|
-
return sendNotFound(res, null, services);
|
|
48
|
-
}
|
|
49
|
-
const targetPort = serviceMap.get(serviceName);
|
|
50
|
-
if (!targetPort) {
|
|
51
|
-
return sendNotFound(res, serviceName, services);
|
|
52
|
-
}
|
|
53
|
-
proxy.web(req, res, { target: `http://127.0.0.1:${targetPort}` });
|
|
54
|
-
};
|
|
55
|
-
// Shared WebSocket upgrade handler
|
|
56
|
-
const handleUpgrade = (req, socket, head) => {
|
|
57
|
-
const host = req.headers.host || "";
|
|
58
|
-
const serviceName = extractServiceName(host);
|
|
59
|
-
if (!serviceName) {
|
|
60
|
-
socket.end("HTTP/1.1 404 Not Found\r\n\r\n");
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
const targetPort = serviceMap.get(serviceName);
|
|
64
|
-
if (!targetPort) {
|
|
65
|
-
socket.end("HTTP/1.1 404 Not Found\r\n\r\n");
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
proxy.ws(req, socket, head, { target: `http://127.0.0.1:${targetPort}` });
|
|
69
|
-
};
|
|
70
|
-
// Create HTTP server (port 80)
|
|
71
|
-
const httpServer = http.createServer(handleRequest);
|
|
72
|
-
httpServer.on("upgrade", handleUpgrade);
|
|
73
|
-
// Create HTTPS server (port 443)
|
|
74
|
-
const httpsServer = https.createServer({ key, cert }, handleRequest);
|
|
75
|
-
httpsServer.on("upgrade", handleUpgrade);
|
|
76
|
-
// Start both servers
|
|
77
|
-
return new Promise((resolve, reject) => {
|
|
78
|
-
let httpStarted = false;
|
|
79
|
-
let httpsStarted = false;
|
|
80
|
-
let failed = false;
|
|
81
|
-
const checkReady = () => {
|
|
82
|
-
if (failed)
|
|
83
|
-
return;
|
|
84
|
-
if (httpStarted && httpsStarted) {
|
|
85
|
-
resolve({
|
|
86
|
-
httpPort: HTTP_PORT,
|
|
87
|
-
httpsPort: HTTPS_PORT,
|
|
88
|
-
async stop() {
|
|
89
|
-
return new Promise((resolve) => {
|
|
90
|
-
let closed = 0;
|
|
91
|
-
const onClose = () => {
|
|
92
|
-
closed++;
|
|
93
|
-
if (closed === 2)
|
|
94
|
-
resolve();
|
|
95
|
-
};
|
|
96
|
-
httpServer.close(onClose);
|
|
97
|
-
httpsServer.close(onClose);
|
|
98
|
-
// Force close after timeout
|
|
99
|
-
setTimeout(() => {
|
|
100
|
-
httpServer.closeAllConnections?.();
|
|
101
|
-
httpsServer.closeAllConnections?.();
|
|
102
|
-
resolve();
|
|
103
|
-
}, 3000);
|
|
104
|
-
});
|
|
105
|
-
},
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
};
|
|
109
|
-
const handleError = (port) => (err) => {
|
|
110
|
-
if (failed)
|
|
111
|
-
return;
|
|
112
|
-
failed = true;
|
|
113
|
-
if (err.code === "EACCES") {
|
|
114
|
-
reject(new Error(`Cannot bind to port ${port}. ` +
|
|
115
|
-
`Try running with sudo: sudo specific dev`));
|
|
116
|
-
}
|
|
117
|
-
else if (err.code === "EADDRINUSE") {
|
|
118
|
-
reject(new Error(`Port ${port} is already in use`));
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
reject(err);
|
|
122
|
-
}
|
|
123
|
-
};
|
|
124
|
-
httpServer.on("error", handleError(HTTP_PORT));
|
|
125
|
-
httpsServer.on("error", handleError(HTTPS_PORT));
|
|
126
|
-
httpServer.listen(HTTP_PORT, () => {
|
|
127
|
-
httpStarted = true;
|
|
128
|
-
checkReady();
|
|
129
|
-
});
|
|
130
|
-
httpsServer.listen(HTTPS_PORT, () => {
|
|
131
|
-
httpsStarted = true;
|
|
132
|
-
checkReady();
|
|
133
|
-
});
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
function extractServiceName(host) {
|
|
137
|
-
// Remove port if present
|
|
138
|
-
const hostname = host.split(":")[0];
|
|
139
|
-
if (!hostname || !hostname.endsWith(DOMAIN_SUFFIX)) {
|
|
140
|
-
return null;
|
|
141
|
-
}
|
|
142
|
-
return hostname.slice(0, -DOMAIN_SUFFIX.length);
|
|
143
|
-
}
|
|
144
|
-
function sendNotFound(res, requestedService, availableServices) {
|
|
145
|
-
const serviceList = availableServices
|
|
146
|
-
.map((s) => `<li>${s.name}.local.spcf.app</li>`)
|
|
147
|
-
.join("\n");
|
|
148
|
-
const message = requestedService
|
|
149
|
-
? `No service named "${requestedService}" is running.`
|
|
150
|
-
: "Invalid host header.";
|
|
151
|
-
res.writeHead(404, { "Content-Type": "text/html" });
|
|
152
|
-
res.end(`<!DOCTYPE html>
|
|
153
|
-
<html>
|
|
154
|
-
<head><title>Service Not Found</title></head>
|
|
155
|
-
<body>
|
|
156
|
-
<h1>Service Not Found</h1>
|
|
157
|
-
<p>${message}</p>
|
|
158
|
-
${availableServices.length > 0
|
|
159
|
-
? `<p>Available services:</p>
|
|
160
|
-
<ul>${serviceList}</ul>`
|
|
161
|
-
: "<p>No services are currently exposed.</p>"}
|
|
162
|
-
</body>
|
|
163
|
-
</html>`);
|
|
164
|
-
}
|
|
165
|
-
//# sourceMappingURL=http-proxy.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"http-proxy.js","sourceRoot":"","sources":["../../../src/lib/dev/http-proxy.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/dev/index.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export { PortAllocator } from "./port-allocator.js";
|
|
2
|
-
export { startDatabase } from "./database-manager.js";
|
|
3
|
-
export type { DatabaseInstance } from "./database-manager.js";
|
|
4
|
-
export { startService } from "./service-runner.js";
|
|
5
|
-
export type { RunningService, LogLine } from "./service-runner.js";
|
|
6
|
-
export { resolveEnvForExec, MissingSecretError } from "./env-resolver.js";
|
|
7
|
-
export { InstanceStateManager } from "./instance-state.js";
|
|
8
|
-
export type { InstanceState, DatabaseState, ServiceState } from "./instance-state.js";
|
|
9
|
-
export { startHttpProxy } from "./http-proxy.js";
|
|
10
|
-
export type { HttpProxyInstance, ServiceRoute } from "./http-proxy.js";
|
|
11
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/dev/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,YAAY,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/lib/dev/index.js
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export { PortAllocator } from "./port-allocator.js";
|
|
2
|
-
export { startDatabase } from "./database-manager.js";
|
|
3
|
-
export { startService } from "./service-runner.js";
|
|
4
|
-
export { resolveEnvForExec, MissingSecretError } from "./env-resolver.js";
|
|
5
|
-
export { InstanceStateManager } from "./instance-state.js";
|
|
6
|
-
export { startHttpProxy } from "./http-proxy.js";
|
|
7
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/dev/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
export interface DatabaseState {
|
|
2
|
-
engine: "postgres" | "redis" | "object_store";
|
|
3
|
-
port: number;
|
|
4
|
-
host: string;
|
|
5
|
-
user: string;
|
|
6
|
-
password: string;
|
|
7
|
-
dbName: string;
|
|
8
|
-
url: string;
|
|
9
|
-
endpoint?: string;
|
|
10
|
-
accessKey?: string;
|
|
11
|
-
secretKey?: string;
|
|
12
|
-
}
|
|
13
|
-
export interface ServiceState {
|
|
14
|
-
port?: number;
|
|
15
|
-
pid: number;
|
|
16
|
-
}
|
|
17
|
-
export interface InstanceState {
|
|
18
|
-
version: 1;
|
|
19
|
-
owner: {
|
|
20
|
-
pid: number;
|
|
21
|
-
command: "dev" | "exec";
|
|
22
|
-
startedAt: string;
|
|
23
|
-
};
|
|
24
|
-
databases: Record<string, DatabaseState>;
|
|
25
|
-
services: Record<string, ServiceState>;
|
|
26
|
-
}
|
|
27
|
-
export declare class InstanceStateManager {
|
|
28
|
-
private stateDir;
|
|
29
|
-
private statePath;
|
|
30
|
-
private lockPath;
|
|
31
|
-
private ownsInstances;
|
|
32
|
-
constructor(projectRoot: string);
|
|
33
|
-
private ensureStateDir;
|
|
34
|
-
private isProcessRunning;
|
|
35
|
-
private acquireLock;
|
|
36
|
-
getExistingInstances(): Promise<InstanceState | null>;
|
|
37
|
-
cleanStaleState(): Promise<boolean>;
|
|
38
|
-
claimOwnership(command: "dev" | "exec"): Promise<void>;
|
|
39
|
-
registerDatabase(name: string, info: DatabaseState): Promise<void>;
|
|
40
|
-
registerService(name: string, info: ServiceState): Promise<void>;
|
|
41
|
-
releaseOwnership(): Promise<void>;
|
|
42
|
-
private readState;
|
|
43
|
-
private writeStateAtomic;
|
|
44
|
-
}
|
|
45
|
-
//# sourceMappingURL=instance-state.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"instance-state.d.ts","sourceRoot":"","sources":["../../../src/lib/dev/instance-state.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,UAAU,GAAG,OAAO,GAAG,cAAc,CAAC;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IAEZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,CAAC,CAAC;IACX,KAAK,EAAE;QACL,GAAG,EAAE,MAAM,CAAC;QACZ,OAAO,EAAE,KAAK,GAAG,MAAM,CAAC;QACxB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACzC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CACxC;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,aAAa,CAAkB;gBAE3B,WAAW,EAAE,MAAM;IAM/B,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,gBAAgB;YAWV,WAAW;IAwDnB,oBAAoB,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAuBrD,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IA+BnC,cAAc,CAAC,OAAO,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgCtD,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAelE,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAehE,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBvC,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,gBAAgB;CAMzB"}
|