@lark-apaas/db-schema-sync 0.1.6-alpha.4 → 0.1.6-alpha.5

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 CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  __toESM,
7
7
  generateSchema,
8
8
  resolveEnvOptions
9
- } from "./chunk-5ZXUJ7KP.js";
9
+ } from "./chunk-PV4EVRKJ.js";
10
10
 
11
11
  // node_modules/dotenv/package.json
12
12
  var require_package = __commonJS({
@@ -56,6 +56,7 @@ 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,
59
60
  HttpClient: () => HttpClient2,
60
61
  HttpError: () => HttpError,
61
62
  generateJWTToken: () => generateJWTToken,
@@ -228,21 +229,80 @@ var require_dist = __commonJS({
228
229
  };
229
230
  }
230
231
  };
231
- var StaticTokenSource = class {
232
- constructor(token) {
233
- this.token = token;
234
- if (!token) {
235
- throw new Error("StaticTokenSource: token \u4E0D\u80FD\u4E3A\u7A7A");
232
+ var import_fs = __require("fs");
233
+ var DEFAULT_REFRESH_BEFORE_MS = 5 * 60 * 1e3;
234
+ var DEFAULT_TOKEN_PATHS = [
235
+ "/home/gem/workspace/.force/openclaw/miaoda-provider-key"
236
+ ];
237
+ var FileTokenProvider = class {
238
+ cache = /* @__PURE__ */ new Map();
239
+ paths;
240
+ refreshBeforeMs;
241
+ constructor(config) {
242
+ this.paths = config?.paths ?? DEFAULT_TOKEN_PATHS;
243
+ this.refreshBeforeMs = config?.refreshBeforeMs ?? DEFAULT_REFRESH_BEFORE_MS;
244
+ }
245
+ /**
246
+ * 获取 token,按路径优先级依次尝试
247
+ *
248
+ * 1. 缓存有效且不在刷新窗口 → 直接返回
249
+ * 2. 进入刷新窗口 → 重读文件,更新缓存
250
+ * 3. 文件未更新但缓存未过期 → 仍返回旧缓存
251
+ * 4. 所有路径均无有效 token → 返回 null
252
+ */
253
+ getToken() {
254
+ const now = Date.now();
255
+ for (const filePath of this.paths) {
256
+ const cached = this.cache.get(filePath);
257
+ if (cached && cached.expiresAtMs - now > this.refreshBeforeMs) {
258
+ return { token: cached.token, accessKey: cached.accessKey };
259
+ }
260
+ const result = this.readAndParse(filePath);
261
+ if (result) {
262
+ this.cache.set(filePath, result);
263
+ if (result.expiresAtMs > now) {
264
+ return { token: result.token, accessKey: result.accessKey };
265
+ }
266
+ }
267
+ if (cached && cached.expiresAtMs > now) {
268
+ return { token: cached.token, accessKey: cached.accessKey };
269
+ }
236
270
  }
271
+ return null;
237
272
  }
238
- getToken(_claims) {
239
- return this.token;
273
+ clearCache() {
274
+ this.cache.clear();
275
+ }
276
+ readAndParse(filePath) {
277
+ try {
278
+ const token = (0, import_fs.readFileSync)(filePath, "utf-8").trim();
279
+ if (!token) return null;
280
+ const payload = this.decodePayload(token);
281
+ if (!payload?.exp) return null;
282
+ return {
283
+ token,
284
+ accessKey: payload.access_key ?? "",
285
+ expiresAtMs: payload.exp * 1e3
286
+ };
287
+ } catch {
288
+ return null;
289
+ }
290
+ }
291
+ decodePayload(token) {
292
+ try {
293
+ const segments = token.split(".");
294
+ if (segments.length !== 3) return null;
295
+ const padLength = (4 - (segments[1].length % 4 || 4)) % 4;
296
+ const padded = `${segments[1]}${"=".repeat(padLength)}`.replace(/-/g, "+").replace(/_/g, "/");
297
+ return JSON.parse(Buffer.from(padded, "base64").toString("utf8"));
298
+ } catch {
299
+ return null;
300
+ }
240
301
  }
241
302
  };
242
303
  var DEFAULT_DOMAIN_ENV = "FORCE_AUTHN_INNERAPI_DOMAIN";
243
304
  var DEFAULT_ACCESS_KEY_ENV = "FORCE_AUTHN_ACCESS_KEY";
244
305
  var DEFAULT_SECRET_KEY_ENV = "FORCE_AUTHN_ACCESS_SECRET";
245
- var DEFAULT_TOKEN_ENV = "FORCE_AUTHN_TOKEN";
246
306
  var DEFAULT_ADMIN_DOMAIN_ENV = "MIAODA_DEV_INNER_DOMAIN_WITH_PREFIX";
247
307
  var DEFAULT_CLIENT_TOKEN_ENV = "MIAODA_AUTHN_CODE";
248
308
  var MIAODA_CLIENT_TOKEN_HEADER = "X-Miaoda-Client-Token";
@@ -265,6 +325,13 @@ var require_dist = __commonJS({
265
325
  return void 0;
266
326
  }
267
327
  ensureNoAccessKeyOverride("platform.defaultClaims", options.defaultClaims);
328
+ let fileTokenProvider;
329
+ if (options.tokenProvider?.type === "file") {
330
+ fileTokenProvider = new FileTokenProvider({
331
+ paths: options.tokenProvider.paths,
332
+ refreshBeforeMs: options.refreshBeforeMs
333
+ });
334
+ }
268
335
  const accessKeyEnv = options.accessKeyEnv || DEFAULT_ACCESS_KEY_ENV;
269
336
  const secretKeyEnv = options.secretKeyEnv || DEFAULT_SECRET_KEY_ENV;
270
337
  const accessKey = options.accessKey ?? (process.env[accessKeyEnv] || "");
@@ -276,26 +343,26 @@ var require_dist = __commonJS({
276
343
  expireTimeMs,
277
344
  refreshBeforeMs: options.refreshBeforeMs
278
345
  });
279
- const tokenEnv = options.tokenEnv || DEFAULT_TOKEN_ENV;
280
- const platformToken = options.token ?? (process.env[tokenEnv] || "");
281
- const staticTokenSource = platformToken ? new StaticTokenSource(platformToken) : null;
282
- const primaryTokenSource = staticTokenSource ?? tokenManager;
283
- const fallbackTokenSource = staticTokenSource ? tokenManager : null;
284
346
  const clientTokenEnv = options.clientTokenEnv || DEFAULT_CLIENT_TOKEN_ENV;
285
347
  interceptors.request.use((config) => {
348
+ if (fileTokenProvider) {
349
+ const fileToken = fileTokenProvider.getToken();
350
+ if (fileToken) {
351
+ const headers2 = {
352
+ ...config.headers,
353
+ "Authorization": `Bearer ${fileToken.token}`,
354
+ "x-api-key": fileToken.accessKey
355
+ };
356
+ return { ...config, headers: headers2 };
357
+ }
358
+ }
286
359
  ensureNoAccessKeyOverride("request.platformAuth.customClaims", config.platformAuth?.customClaims);
287
360
  const claims = {
288
361
  ...options.defaultClaims || {},
289
362
  ...config.platformAuth?.customClaims || {},
290
363
  access_key: accessKey
291
364
  };
292
- let token;
293
- try {
294
- token = primaryTokenSource.getToken(claims);
295
- } catch (err) {
296
- if (!fallbackTokenSource) throw err;
297
- token = fallbackTokenSource.getToken(claims);
298
- }
365
+ const token = tokenManager.getToken(claims);
299
366
  const headers = {
300
367
  ...config.headers,
301
368
  "Authorization": `Bearer ${token}`,
@@ -1530,7 +1597,9 @@ var ImportCollector = class {
1530
1597
  };
1531
1598
 
1532
1599
  // src/generator/default-value.ts
1533
- function formatDefaultValue(value) {
1600
+ var CUSTOM_CAST_TYPES = /* @__PURE__ */ new Set(["user_profile", "file_attachment"]);
1601
+ var CURRENT_USER_SENTINEL = "current_user";
1602
+ function formatDefaultValue(value, field) {
1534
1603
  if (value == null || value === "") return "";
1535
1604
  const trimmed = value.trim();
1536
1605
  if (!trimmed || trimmed.toUpperCase() === "NULL") return "";
@@ -1539,6 +1608,12 @@ function formatDefaultValue(value) {
1539
1608
  if (trimmed === "true") return ".default(true)";
1540
1609
  if (trimmed === "false") return ".default(false)";
1541
1610
  if (/^-?\d+(\.\d+)?$/.test(trimmed)) return `.default(${trimmed})`;
1611
+ if (field && CUSTOM_CAST_TYPES.has(field.type) && !trimmed.includes("::") && trimmed.toLowerCase() !== CURRENT_USER_SENTINEL) {
1612
+ const pgLiteral = trimmed.replace(/'/g, "''");
1613
+ const escaped = pgLiteral.replace(/`/g, "\\`").replace(/\$\{/g, "\\${");
1614
+ const cast = field.isArray ? `${field.type}[]` : field.type;
1615
+ return `.default(sql\`'${escaped}'::${cast}\`)`;
1616
+ }
1542
1617
  if (/::|\(|CASE|current_setting/i.test(trimmed)) {
1543
1618
  const escaped = trimmed.replace(/`/g, "\\`").replace(/\$\{/g, "\\${");
1544
1619
  return `.default(sql\`${escaped}\`)`;
@@ -1567,7 +1642,7 @@ var defaultModifiers = [
1567
1642
  {
1568
1643
  name: "defaultValue",
1569
1644
  match: (f) => f.defaultValue != null && f.defaultValue !== "",
1570
- modify: (f) => formatDefaultValue(f.defaultValue)
1645
+ modify: (f) => formatDefaultValue(f.defaultValue, f)
1571
1646
  }
1572
1647
  ];
1573
1648
  function applyModifiers(field, modifiers) {
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@ import {
5
5
  generateSchemaFromData,
6
6
  normalizeApiResponse,
7
7
  resolveEnvOptions
8
- } from "./chunk-5ZXUJ7KP.js";
8
+ } from "./chunk-PV4EVRKJ.js";
9
9
  export {
10
10
  generateSchema,
11
11
  generateSchemaCode,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lark-apaas/db-schema-sync",
3
- "version": "0.1.6-alpha.4",
3
+ "version": "0.1.6-alpha.5",
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.7-alpha.9",
32
+ "@lark-apaas/http-client": "0.1.7-alpha.10",
33
33
  "dotenv": "^17.3.1",
34
34
  "tiny-pinyin": "^1.3.2"
35
35
  },