@lark-apaas/db-schema-sync 0.1.6-beta.0 → 0.1.7-alpha.0
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/bin.js +5 -7
- package/dist/{chunk-SWKVIZTR.js → chunk-JOLAF4EV.js} +12 -127
- package/dist/index.js +1 -1
- package/package.json +2 -2
package/dist/bin.js
CHANGED
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
__toESM,
|
|
7
7
|
generateSchema,
|
|
8
8
|
resolveEnvOptions
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-JOLAF4EV.js";
|
|
10
10
|
|
|
11
11
|
// node_modules/dotenv/package.json
|
|
12
12
|
var require_package = __commonJS({
|
|
@@ -424,12 +424,10 @@ function parseArgs(argv) {
|
|
|
424
424
|
|
|
425
425
|
// src/bin.ts
|
|
426
426
|
async function main() {
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
console.log(`[db-schema-sync] \u2713 Loaded ${name}`);
|
|
432
|
-
}
|
|
427
|
+
const envPath = resolve(process.cwd(), ".env");
|
|
428
|
+
if (existsSync(envPath)) {
|
|
429
|
+
(0, import_dotenv.config)({ path: envPath });
|
|
430
|
+
console.log("[db-schema-sync] \u2713 Loaded .env file");
|
|
433
431
|
}
|
|
434
432
|
const cliArgs = parseArgs(process.argv);
|
|
435
433
|
const output = cliArgs.output || process.env.DB_SCHEMA_OUTPUT || "server/database/schema.ts";
|
|
@@ -56,7 +56,6 @@ var require_dist = __commonJS({
|
|
|
56
56
|
__export(index_exports, {
|
|
57
57
|
DEFAULT_CLOCK_TOLERANCE_SEC: () => DEFAULT_CLOCK_TOLERANCE_SEC,
|
|
58
58
|
DEFAULT_JWT_EXPIRE_TIME_MS: () => DEFAULT_JWT_EXPIRE_TIME_MS,
|
|
59
|
-
FileTokenProvider: () => FileTokenProvider,
|
|
60
59
|
HttpClient: () => HttpClient2,
|
|
61
60
|
HttpError: () => HttpError,
|
|
62
61
|
generateJWTToken: () => generateJWTToken,
|
|
@@ -229,92 +228,9 @@ var require_dist = __commonJS({
|
|
|
229
228
|
};
|
|
230
229
|
}
|
|
231
230
|
};
|
|
232
|
-
var StaticTokenSource = class {
|
|
233
|
-
constructor(token) {
|
|
234
|
-
this.token = token;
|
|
235
|
-
if (!token) {
|
|
236
|
-
throw new Error("StaticTokenSource: token \u4E0D\u80FD\u4E3A\u7A7A");
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
getToken(_claims) {
|
|
240
|
-
return this.token;
|
|
241
|
-
}
|
|
242
|
-
};
|
|
243
|
-
var import_fs = __require("fs");
|
|
244
|
-
var DEFAULT_REFRESH_BEFORE_MS = 5 * 60 * 1e3;
|
|
245
|
-
var DEFAULT_TOKEN_PATHS = [
|
|
246
|
-
"/home/gem/workspace/.force/openclaw/miaoda-provider-key"
|
|
247
|
-
];
|
|
248
|
-
var FileTokenProvider = class {
|
|
249
|
-
cache = /* @__PURE__ */ new Map();
|
|
250
|
-
paths;
|
|
251
|
-
refreshBeforeMs;
|
|
252
|
-
constructor(config) {
|
|
253
|
-
this.paths = config?.paths ?? DEFAULT_TOKEN_PATHS;
|
|
254
|
-
this.refreshBeforeMs = config?.refreshBeforeMs ?? DEFAULT_REFRESH_BEFORE_MS;
|
|
255
|
-
}
|
|
256
|
-
/**
|
|
257
|
-
* 获取 token,按路径优先级依次尝试
|
|
258
|
-
*
|
|
259
|
-
* 1. 缓存有效且不在刷新窗口 → 直接返回
|
|
260
|
-
* 2. 进入刷新窗口 → 重读文件,更新缓存
|
|
261
|
-
* 3. 文件未更新但缓存未过期 → 仍返回旧缓存
|
|
262
|
-
* 4. 所有路径均无有效 token → 返回 null
|
|
263
|
-
*/
|
|
264
|
-
getToken() {
|
|
265
|
-
const now = Date.now();
|
|
266
|
-
for (const filePath of this.paths) {
|
|
267
|
-
const cached = this.cache.get(filePath);
|
|
268
|
-
if (cached && cached.expiresAtMs - now > this.refreshBeforeMs) {
|
|
269
|
-
return { token: cached.token, accessKey: cached.accessKey };
|
|
270
|
-
}
|
|
271
|
-
const result = this.readAndParse(filePath);
|
|
272
|
-
if (result) {
|
|
273
|
-
this.cache.set(filePath, result);
|
|
274
|
-
if (result.expiresAtMs > now) {
|
|
275
|
-
return { token: result.token, accessKey: result.accessKey };
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
if (cached && cached.expiresAtMs > now) {
|
|
279
|
-
return { token: cached.token, accessKey: cached.accessKey };
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
return null;
|
|
283
|
-
}
|
|
284
|
-
clearCache() {
|
|
285
|
-
this.cache.clear();
|
|
286
|
-
}
|
|
287
|
-
readAndParse(filePath) {
|
|
288
|
-
try {
|
|
289
|
-
const token = (0, import_fs.readFileSync)(filePath, "utf-8").trim();
|
|
290
|
-
if (!token) return null;
|
|
291
|
-
const payload = this.decodePayload(token);
|
|
292
|
-
if (!payload?.exp) return null;
|
|
293
|
-
return {
|
|
294
|
-
token,
|
|
295
|
-
accessKey: payload.access_key ?? "",
|
|
296
|
-
expiresAtMs: payload.exp * 1e3
|
|
297
|
-
};
|
|
298
|
-
} catch {
|
|
299
|
-
return null;
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
decodePayload(token) {
|
|
303
|
-
try {
|
|
304
|
-
const segments = token.split(".");
|
|
305
|
-
if (segments.length !== 3) return null;
|
|
306
|
-
const padLength = (4 - (segments[1].length % 4 || 4)) % 4;
|
|
307
|
-
const padded = `${segments[1]}${"=".repeat(padLength)}`.replace(/-/g, "+").replace(/_/g, "/");
|
|
308
|
-
return JSON.parse(Buffer.from(padded, "base64").toString("utf8"));
|
|
309
|
-
} catch {
|
|
310
|
-
return null;
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
};
|
|
314
231
|
var DEFAULT_DOMAIN_ENV = "FORCE_AUTHN_INNERAPI_DOMAIN";
|
|
315
232
|
var DEFAULT_ACCESS_KEY_ENV = "FORCE_AUTHN_ACCESS_KEY";
|
|
316
233
|
var DEFAULT_SECRET_KEY_ENV = "FORCE_AUTHN_ACCESS_SECRET";
|
|
317
|
-
var DEFAULT_TOKEN_ENV = "FORCE_AUTHN_TOKEN";
|
|
318
234
|
var DEFAULT_ADMIN_DOMAIN_ENV = "MIAODA_DEV_INNER_DOMAIN_WITH_PREFIX";
|
|
319
235
|
var DEFAULT_CLIENT_TOKEN_ENV = "MIAODA_AUTHN_CODE";
|
|
320
236
|
var MIAODA_CLIENT_TOKEN_HEADER = "X-Miaoda-Client-Token";
|
|
@@ -337,13 +253,6 @@ var require_dist = __commonJS({
|
|
|
337
253
|
return void 0;
|
|
338
254
|
}
|
|
339
255
|
ensureNoAccessKeyOverride("platform.defaultClaims", options.defaultClaims);
|
|
340
|
-
let fileTokenProvider;
|
|
341
|
-
if (options.tokenProvider?.type === "file") {
|
|
342
|
-
fileTokenProvider = new FileTokenProvider({
|
|
343
|
-
paths: options.tokenProvider.paths,
|
|
344
|
-
refreshBeforeMs: options.refreshBeforeMs
|
|
345
|
-
});
|
|
346
|
-
}
|
|
347
256
|
const accessKeyEnv = options.accessKeyEnv || DEFAULT_ACCESS_KEY_ENV;
|
|
348
257
|
const secretKeyEnv = options.secretKeyEnv || DEFAULT_SECRET_KEY_ENV;
|
|
349
258
|
const accessKey = options.accessKey ?? (process.env[accessKeyEnv] || "");
|
|
@@ -355,38 +264,15 @@ var require_dist = __commonJS({
|
|
|
355
264
|
expireTimeMs,
|
|
356
265
|
refreshBeforeMs: options.refreshBeforeMs
|
|
357
266
|
});
|
|
358
|
-
const tokenEnv = options.tokenEnv || DEFAULT_TOKEN_ENV;
|
|
359
|
-
const platformToken = options.token ?? (process.env[tokenEnv] || "");
|
|
360
|
-
const staticTokenSource = platformToken ? new StaticTokenSource(platformToken) : null;
|
|
361
267
|
const clientTokenEnv = options.clientTokenEnv || DEFAULT_CLIENT_TOKEN_ENV;
|
|
362
268
|
interceptors.request.use((config) => {
|
|
363
|
-
if (fileTokenProvider) {
|
|
364
|
-
const fileToken = fileTokenProvider.getToken();
|
|
365
|
-
if (fileToken) {
|
|
366
|
-
const headers2 = {
|
|
367
|
-
...config.headers,
|
|
368
|
-
"Authorization": `Bearer ${fileToken.token}`,
|
|
369
|
-
"x-api-key": fileToken.accessKey
|
|
370
|
-
};
|
|
371
|
-
return { ...config, headers: headers2 };
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
269
|
ensureNoAccessKeyOverride("request.platformAuth.customClaims", config.platformAuth?.customClaims);
|
|
375
270
|
const claims = {
|
|
376
271
|
...options.defaultClaims || {},
|
|
377
272
|
...config.platformAuth?.customClaims || {},
|
|
378
273
|
access_key: accessKey
|
|
379
274
|
};
|
|
380
|
-
|
|
381
|
-
if (staticTokenSource) {
|
|
382
|
-
try {
|
|
383
|
-
token = staticTokenSource.getToken(claims);
|
|
384
|
-
} catch {
|
|
385
|
-
token = tokenManager.getToken(claims);
|
|
386
|
-
}
|
|
387
|
-
} else {
|
|
388
|
-
token = tokenManager.getToken(claims);
|
|
389
|
-
}
|
|
275
|
+
const token = tokenManager.getToken(claims);
|
|
390
276
|
const headers = {
|
|
391
277
|
...config.headers,
|
|
392
278
|
"Authorization": `Bearer ${token}`,
|
|
@@ -1621,9 +1507,7 @@ var ImportCollector = class {
|
|
|
1621
1507
|
};
|
|
1622
1508
|
|
|
1623
1509
|
// src/generator/default-value.ts
|
|
1624
|
-
|
|
1625
|
-
var CURRENT_USER_SENTINEL = "current_user";
|
|
1626
|
-
function formatDefaultValue(value, field) {
|
|
1510
|
+
function formatDefaultValue(value) {
|
|
1627
1511
|
if (value == null || value === "") return "";
|
|
1628
1512
|
const trimmed = value.trim();
|
|
1629
1513
|
if (!trimmed || trimmed.toUpperCase() === "NULL") return "";
|
|
@@ -1632,12 +1516,6 @@ function formatDefaultValue(value, field) {
|
|
|
1632
1516
|
if (trimmed === "true") return ".default(true)";
|
|
1633
1517
|
if (trimmed === "false") return ".default(false)";
|
|
1634
1518
|
if (/^-?\d+(\.\d+)?$/.test(trimmed)) return `.default(${trimmed})`;
|
|
1635
|
-
if (field && CUSTOM_CAST_TYPES.has(field.type) && !trimmed.includes("::") && trimmed.toLowerCase() !== CURRENT_USER_SENTINEL) {
|
|
1636
|
-
const pgLiteral = trimmed.replace(/'/g, "''");
|
|
1637
|
-
const escaped = pgLiteral.replace(/`/g, "\\`").replace(/\$\{/g, "\\${");
|
|
1638
|
-
const cast = field.isArray ? `${field.type}[]` : field.type;
|
|
1639
|
-
return `.default(sql\`'${escaped}'::${cast}\`)`;
|
|
1640
|
-
}
|
|
1641
1519
|
if (/::|\(|CASE|current_setting/i.test(trimmed)) {
|
|
1642
1520
|
const escaped = trimmed.replace(/`/g, "\\`").replace(/\$\{/g, "\\${");
|
|
1643
1521
|
return `.default(sql\`${escaped}\`)`;
|
|
@@ -1666,7 +1544,7 @@ var defaultModifiers = [
|
|
|
1666
1544
|
{
|
|
1667
1545
|
name: "defaultValue",
|
|
1668
1546
|
match: (f) => f.defaultValue != null && f.defaultValue !== "",
|
|
1669
|
-
modify: (f) => formatDefaultValue(f.defaultValue
|
|
1547
|
+
modify: (f) => formatDefaultValue(f.defaultValue)
|
|
1670
1548
|
}
|
|
1671
1549
|
];
|
|
1672
1550
|
function applyModifiers(field, modifiers) {
|
|
@@ -2058,7 +1936,7 @@ var inlineTypesEnhancer = {
|
|
|
2058
1936
|
);
|
|
2059
1937
|
if (pgCoreImportMatch) {
|
|
2060
1938
|
const insertPoint = text.indexOf(pgCoreImportMatch[0]) + pgCoreImportMatch[0].length;
|
|
2061
|
-
text = text.slice(0, insertPoint) +
|
|
1939
|
+
text = text.slice(0, insertPoint) + 'import { sql } from "drizzle-orm";\n' + text.slice(insertPoint);
|
|
2062
1940
|
}
|
|
2063
1941
|
}
|
|
2064
1942
|
const definitions = [];
|
|
@@ -2099,7 +1977,14 @@ function ensureImportIdentifier(source, packageName, identifier) {
|
|
|
2099
1977
|
);
|
|
2100
1978
|
const match = source.match(importRegex);
|
|
2101
1979
|
if (!match) {
|
|
2102
|
-
|
|
1980
|
+
const importLine = `import { ${identifier} } from "${packageName}";
|
|
1981
|
+
`;
|
|
1982
|
+
const headerPrefix = `${FULL_HEADER}
|
|
1983
|
+
`;
|
|
1984
|
+
if (source.startsWith(headerPrefix)) {
|
|
1985
|
+
return source.slice(0, headerPrefix.length) + importLine + source.slice(headerPrefix.length);
|
|
1986
|
+
}
|
|
1987
|
+
return importLine + source;
|
|
2103
1988
|
}
|
|
2104
1989
|
const identifiers = match[1].split(",").map((id) => id.trim()).filter(Boolean);
|
|
2105
1990
|
if (identifiers.includes(identifier)) {
|
package/dist/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lark-apaas/db-schema-sync",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.7-alpha.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"node": ">=18.0.0"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@lark-apaas/http-client": "0.1.
|
|
32
|
+
"@lark-apaas/http-client": "^0.1.6",
|
|
33
33
|
"dotenv": "^17.3.1",
|
|
34
34
|
"tiny-pinyin": "^1.3.2"
|
|
35
35
|
},
|