@cartanova/qgrid-cli 2.4.3 → 2.4.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.
Files changed (94) hide show
  1. package/bundle/dist/application/qgrid/qgrid.frame.js +17 -19
  2. package/bundle/dist/application/qgrid/qgrid.types.js +3 -2
  3. package/bundle/dist/application/qgrid/token-subscriber.js +23 -9
  4. package/bundle/dist/application/qgrid/token-trigger-setup.js +4 -4
  5. package/bundle/dist/application/qgrid/tool-emulation.js +1 -1
  6. package/bundle/dist/application/sonamu.generated.js +5 -3
  7. package/bundle/dist/application/sonamu.generated.sso.js +3 -2
  8. package/bundle/dist/application/token/token.model.js +8 -3
  9. package/bundle/dist/application/token/token.types.js +8 -3
  10. package/bundle/dist/i18n/sd.generated.js +2 -1
  11. package/bundle/dist/index.js +3 -6
  12. package/bundle/dist/migrations/20260521134025_alter_request_log_steps_alter1.js +3 -9
  13. package/bundle/dist/migrations/20260706120000_alter_request_logs_add_image_cost.js +1 -1
  14. package/bundle/dist/migrations/20260710090000_alter_tokens_add_weight.js +41 -0
  15. package/bundle/dist/server-bootstrap.js +17 -0
  16. package/bundle/dist/sonamu.config.js +1 -10
  17. package/bundle/dist/startup-migrations.js +21 -0
  18. package/bundle/dist/testing/global.js +93 -5
  19. package/bundle/dist/testing/test-database-name.js +22 -0
  20. package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +24 -27
  21. package/bundle/dist/utils/providers/common/smooth-weighted-round-robin.js +43 -0
  22. package/bundle/dist/utils/providers/openai/codex-worker.js +4 -2
  23. package/bundle/dist/utils/providers/openai/openai-dispatcher.js +220 -49
  24. package/bundle/src/application/qgrid/qgrid.frame.test.ts +60 -14
  25. package/bundle/src/application/qgrid/qgrid.frame.ts +24 -25
  26. package/bundle/src/application/qgrid/qgrid.types.ts +1 -0
  27. package/bundle/src/application/qgrid/token-subscriber.test.ts +102 -0
  28. package/bundle/src/application/qgrid/token-subscriber.ts +37 -6
  29. package/bundle/src/application/qgrid/token-trigger-setup.test.ts +9 -0
  30. package/bundle/src/application/qgrid/token-trigger-setup.ts +2 -2
  31. package/bundle/src/application/qgrid/token-weight-migration.test.ts +42 -0
  32. package/bundle/src/application/qgrid/tool-emulation.ts +6 -1
  33. package/bundle/src/application/sonamu.generated.http +4 -2
  34. package/bundle/src/application/sonamu.generated.sso.ts +1 -0
  35. package/bundle/src/application/sonamu.generated.ts +10 -1
  36. package/bundle/src/application/token/token.entity.json +17 -1
  37. package/bundle/src/application/token/token.model.test.ts +43 -0
  38. package/bundle/src/application/token/token.model.ts +18 -2
  39. package/bundle/src/application/token/token.types.test.ts +11 -0
  40. package/bundle/src/application/token/token.types.ts +3 -0
  41. package/bundle/src/i18n/sd.generated.ts +1 -0
  42. package/bundle/src/index.ts +2 -5
  43. package/bundle/src/migrations/20260521134025_alter_request_log_steps_alter1.ts +4 -8
  44. package/bundle/src/migrations/20260706120000_alter_request_logs_add_image_cost.ts +1 -1
  45. package/bundle/src/migrations/20260710090000_alter_tokens_add_weight.ts +38 -0
  46. package/bundle/src/server-bootstrap.test.ts +39 -0
  47. package/bundle/src/server-bootstrap.ts +21 -0
  48. package/bundle/src/sonamu.config.ts +0 -12
  49. package/bundle/src/startup-migrations.test.ts +25 -0
  50. package/bundle/src/startup-migrations.ts +20 -0
  51. package/bundle/src/testing/global.test.ts +130 -0
  52. package/bundle/src/testing/global.ts +143 -13
  53. package/bundle/src/testing/test-database-name.test.ts +38 -0
  54. package/bundle/src/testing/test-database-name.ts +21 -0
  55. package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.test.ts +75 -45
  56. package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +23 -29
  57. package/bundle/src/utils/providers/common/provider-dispatcher.ts +1 -1
  58. package/bundle/src/utils/providers/common/smooth-weighted-round-robin.test.ts +73 -0
  59. package/bundle/src/utils/providers/common/smooth-weighted-round-robin.ts +48 -0
  60. package/bundle/src/utils/providers/openai/codex-worker.test.ts +26 -0
  61. package/bundle/src/utils/providers/openai/codex-worker.ts +3 -1
  62. package/bundle/src/utils/providers/openai/openai-dispatcher.test.ts +304 -12
  63. package/bundle/src/utils/providers/openai/openai-dispatcher.ts +354 -68
  64. package/bundle/web-dist/client/assets/{index-DsGDBrrH.js → index-D0dRwMp0.js} +3 -3
  65. package/bundle/web-dist/client/assets/{logs-C6EMtwDn.js → logs-BMzzMMRA.js} +1 -1
  66. package/bundle/web-dist/client/assets/routes-XqQHRGxI.js +5 -0
  67. package/bundle/web-dist/client/assets/{sd.generated-BrUnRt0B.js → sd.generated-WA5SGJYZ.js} +1 -1
  68. package/bundle/web-dist/client/assets/{services.generated-AsEvHbJ7.js → services.generated-DzZLnb7S.js} +1 -1
  69. package/bundle/web-dist/client/assets/{show-BSW3PE7Z.js → show-63BsotX6.js} +1 -1
  70. package/bundle/web-dist/client/assets/tokens-C416mWQ-.js +1 -0
  71. package/bundle/web-dist/client/assets/use-update-token-mutation-BV6msjuy.js +1 -0
  72. package/bundle/web-dist/client/index.html +2 -2
  73. package/bundle/web-dist/server/assets/{lazyRouteComponent-BswulcOx.js → lazyRouteComponent-BrPAFtBA.js} +1 -1
  74. package/bundle/web-dist/server/assets/{logs-Bk9C0ELo.js → logs-CKM6W3W6.js} +3 -3
  75. package/bundle/web-dist/server/assets/{routes-D9OiKoqa.js → routes-VY2um2KO.js} +140 -9
  76. package/bundle/web-dist/server/assets/{sd.generated-DRuQSIKo.js → sd.generated-Cwg2f53z.js} +1 -0
  77. package/bundle/web-dist/server/assets/{services.generated-Dp0uKgpV.js → services.generated-CsotZP44.js} +5 -5
  78. package/bundle/web-dist/server/assets/{show-3GokIDEJ.js → show-CV2UFjaH.js} +3 -3
  79. package/bundle/web-dist/server/assets/{tokens-Cjw6cQxZ.js → tokens-DfGj1y2v.js} +5 -5
  80. package/bundle/web-dist/server/assets/use-update-token-mutation-BL96w-Pg.js +7 -0
  81. package/bundle/web-dist/server/entry-server.generated.js +7 -7
  82. package/package.json +1 -1
  83. package/skills/qgrid/SKILL.md +1 -1
  84. package/skills/qgrid/references/anthropic-claude-code-runtime.md +2 -2
  85. package/skills/qgrid/references/cli-env-and-server-boot.md +9 -9
  86. package/skills/qgrid/references/decision-rationale.md +23 -0
  87. package/skills/qgrid/references/openai-codex-runtime.md +4 -3
  88. package/skills/qgrid/references/prompt-cache-and-usage.md +2 -0
  89. package/skills/qgrid/references/provider-runtime-differences.md +2 -1
  90. package/skills/qgrid/references/repo-map.md +2 -0
  91. package/skills/qgrid/references/token-auth-quota-lifecycle.md +8 -3
  92. package/skills/qgrid/references/verification-and-debugging.md +3 -0
  93. package/bundle/web-dist/client/assets/routes-De9iuL80.js +0 -5
  94. package/bundle/web-dist/client/assets/tokens-BMsL6vk9.js +0 -1
@@ -1,11 +1,8 @@
1
1
  import "./_virtual/_rolldown/runtime.js";
2
- import { Sonamu } from "sonamu";
2
+ import { bootstrapServer } from "./server-bootstrap.js";
3
3
  //#region src/index.ts
4
- async function bootstrap() {
5
- await Sonamu.createServer();
6
- }
7
- bootstrap();
4
+ bootstrapServer();
8
5
  //#endregion
9
6
  export {};
10
7
 
11
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCJzb25hbXVcIjtcblxuYXN5bmMgZnVuY3Rpb24gYm9vdHN0cmFwKCkge1xuICBhd2FpdCBTb25hbXUuY3JlYXRlU2VydmVyKCk7XG59XG5ib290c3RyYXAoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsZUFBZSxZQUFZO0FBQ3pCLE9BQU0sT0FBTyxjQUFjOztBQUU3QixXQUFXIn0=
8
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJvb3RzdHJhcFNlcnZlciB9IGZyb20gXCIuL3NlcnZlci1ib290c3RyYXBcIjtcblxudm9pZCBib290c3RyYXBTZXJ2ZXIoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7O0FBRUssaUJBQWlCIn0=
@@ -1,14 +1,8 @@
1
1
  import "../_virtual/_rolldown/runtime.js";
2
2
  //#region src/migrations/20260521134025_alter_request_log_steps_alter1.ts
3
- async function up(knex) {
4
- await knex.raw(`CREATE INDEX request_log_steps_request_log_id_index ON request_log_steps USING btree(request_log_id ASC NULLS LAST);`);
5
- }
6
- async function down(knex) {
7
- await knex.schema.alterTable("request_log_steps", (table) => {
8
- table.dropIndex(["request_log_id"], "request_log_steps_request_log_id_index");
9
- });
10
- }
3
+ async function up(_knex) {}
4
+ async function down(_knex) {}
11
5
  //#endregion
12
6
  export { down, up };
13
7
 
14
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAyNjA1MjExMzQwMjVfYWx0ZXJfcmVxdWVzdF9sb2dfc3RlcHNfYWx0ZXIxLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb25zLzIwMjYwNTIxMTM0MDI1X2FsdGVyX3JlcXVlc3RfbG9nX3N0ZXBzX2FsdGVyMS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIEtuZXggfSBmcm9tIFwia25leFwiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXAoa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBrbmV4LnJhdyhcbiAgICBgQ1JFQVRFIElOREVYIHJlcXVlc3RfbG9nX3N0ZXBzX3JlcXVlc3RfbG9nX2lkX2luZGV4IE9OIHJlcXVlc3RfbG9nX3N0ZXBzIFVTSU5HIGJ0cmVlKHJlcXVlc3RfbG9nX2lkIEFTQyBOVUxMUyBMQVNUKTtgLFxuICApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZG93bihrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGtuZXguc2NoZW1hLmFsdGVyVGFibGUoXCJyZXF1ZXN0X2xvZ19zdGVwc1wiLCAodGFibGUpID0+IHtcbiAgICB0YWJsZS5kcm9wSW5kZXgoW1wicmVxdWVzdF9sb2dfaWRcIl0sIFwicmVxdWVzdF9sb2dfc3RlcHNfcmVxdWVzdF9sb2dfaWRfaW5kZXhcIik7XG4gIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiOztBQUVBLGVBQXNCLEdBQUcsTUFBMkI7QUFDbEQsT0FBTSxLQUFLLElBQ1QsdUhBQ0Q7O0FBR0gsZUFBc0IsS0FBSyxNQUEyQjtBQUNwRCxPQUFNLEtBQUssT0FBTyxXQUFXLHNCQUFzQixVQUFVO0FBQzNELFFBQU0sVUFBVSxDQUFDLGlCQUFpQixFQUFFLHlDQUF5QztHQUM3RSJ9
8
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAyNjA1MjExMzQwMjVfYWx0ZXJfcmVxdWVzdF9sb2dfc3RlcHNfYWx0ZXIxLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb25zLzIwMjYwNTIxMTM0MDI1X2FsdGVyX3JlcXVlc3RfbG9nX3N0ZXBzX2FsdGVyMS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIEtuZXggfSBmcm9tIFwia25leFwiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXAoX2tuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gVGhlIHByZWNlZGluZyBjcmVhdGUtdGFibGUgbWlncmF0aW9uIGFscmVhZHkgY3JlYXRlcyB0aGlzIGluZGV4LlxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZG93bihfa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBLZWVwIHRoZSBpbmRleCBvd25lZCBieSB0aGUgcHJlY2VkaW5nIGNyZWF0ZS10YWJsZSBtaWdyYXRpb24uXG59XG4iXSwibWFwcGluZ3MiOiI7O0FBRUEsZUFBc0IsR0FBRyxPQUE0QjtBQUlyRCxlQUFzQixLQUFLLE9BQTRCIn0=
@@ -14,4 +14,4 @@ async function down(knex) {
14
14
  //#endregion
15
15
  export { down, up };
16
16
 
17
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAyNjA3MDYxMjAwMDBfYWx0ZXJfcmVxdWVzdF9sb2dzX2FkZF9pbWFnZV9jb3N0LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb25zLzIwMjYwNzA2MTIwMDAwX2FsdGVyX3JlcXVlc3RfbG9nc19hZGRfaW1hZ2VfY29zdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEtuZXggfSBmcm9tIFwia25leFwiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXAoa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBrbmV4LnNjaGVtYS5hbHRlclRhYmxlKFwicmVxdWVzdF9sb2dzXCIsICh0YWJsZSkgPT4ge1xuICAgIHRhYmxlLmludGVnZXIoXCJpbWFnZV9jb3N0X3VzZFwiKS5udWxsYWJsZSgpO1xuICAgIHRhYmxlLnN0cmluZyhcImltYWdlX2Nvc3RfbWV0aG9kXCIsIDEwMCkubnVsbGFibGUoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb3duKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQga25leC5zY2hlbWEuYWx0ZXJUYWJsZShcInJlcXVlc3RfbG9nc1wiLCAodGFibGUpID0+IHtcbiAgICB0YWJsZS5kcm9wQ29sdW1ucyhcImltYWdlX2Nvc3RfdXNkXCIsIFwiaW1hZ2VfY29zdF9tZXRob2RcIik7XG4gIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiOztBQUVBLGVBQXNCLEdBQUcsTUFBMkI7QUFDbEQsT0FBTSxLQUFLLE9BQU8sV0FBVyxpQkFBaUIsVUFBVTtBQUN0RCxRQUFNLFFBQVEsaUJBQWlCLENBQUMsVUFBVTtBQUMxQyxRQUFNLE9BQU8scUJBQXFCLElBQUksQ0FBQyxVQUFVO0dBQ2pEOztBQUdKLGVBQXNCLEtBQUssTUFBMkI7QUFDcEQsT0FBTSxLQUFLLE9BQU8sV0FBVyxpQkFBaUIsVUFBVTtBQUN0RCxRQUFNLFlBQVksa0JBQWtCLG9CQUFvQjtHQUN4RCJ9
17
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAyNjA3MDYxMjAwMDBfYWx0ZXJfcmVxdWVzdF9sb2dzX2FkZF9pbWFnZV9jb3N0LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb25zLzIwMjYwNzA2MTIwMDAwX2FsdGVyX3JlcXVlc3RfbG9nc19hZGRfaW1hZ2VfY29zdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIEtuZXggfSBmcm9tIFwia25leFwiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXAoa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBrbmV4LnNjaGVtYS5hbHRlclRhYmxlKFwicmVxdWVzdF9sb2dzXCIsICh0YWJsZSkgPT4ge1xuICAgIHRhYmxlLmludGVnZXIoXCJpbWFnZV9jb3N0X3VzZFwiKS5udWxsYWJsZSgpO1xuICAgIHRhYmxlLnN0cmluZyhcImltYWdlX2Nvc3RfbWV0aG9kXCIsIDEwMCkubnVsbGFibGUoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb3duKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQga25leC5zY2hlbWEuYWx0ZXJUYWJsZShcInJlcXVlc3RfbG9nc1wiLCAodGFibGUpID0+IHtcbiAgICB0YWJsZS5kcm9wQ29sdW1ucyhcImltYWdlX2Nvc3RfdXNkXCIsIFwiaW1hZ2VfY29zdF9tZXRob2RcIik7XG4gIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiOztBQUVBLGVBQXNCLEdBQUcsTUFBMkI7QUFDbEQsT0FBTSxLQUFLLE9BQU8sV0FBVyxpQkFBaUIsVUFBVTtBQUN0RCxRQUFNLFFBQVEsaUJBQWlCLENBQUMsVUFBVTtBQUMxQyxRQUFNLE9BQU8scUJBQXFCLElBQUksQ0FBQyxVQUFVO0dBQ2pEOztBQUdKLGVBQXNCLEtBQUssTUFBMkI7QUFDcEQsT0FBTSxLQUFLLE9BQU8sV0FBVyxpQkFBaUIsVUFBVTtBQUN0RCxRQUFNLFlBQVksa0JBQWtCLG9CQUFvQjtHQUN4RCJ9
@@ -0,0 +1,41 @@
1
+ import "../_virtual/_rolldown/runtime.js";
2
+ //#region src/migrations/20260710090000_alter_tokens_add_weight.ts
3
+ async function up(knex) {
4
+ await knex.schema.alterTable("tokens", (table) => {
5
+ table.integer("weight").notNullable().defaultTo(1);
6
+ });
7
+ await knex.raw(`
8
+ CREATE OR REPLACE FUNCTION public.tokens_weight_notify() RETURNS trigger
9
+ LANGUAGE plpgsql
10
+ SET search_path = pg_catalog, public
11
+ AS $func$
12
+ BEGIN
13
+ PERFORM pg_notify('tokens_changed', json_build_object(
14
+ 'op', TG_OP,
15
+ 'id', NEW.id
16
+ )::text);
17
+ RETURN NEW;
18
+ END;
19
+ $func$;
20
+
21
+ DROP TRIGGER IF EXISTS tokens_weight_changed_upd ON public.tokens;
22
+ CREATE TRIGGER tokens_weight_changed_upd
23
+ AFTER UPDATE OF weight ON public.tokens
24
+ FOR EACH ROW
25
+ WHEN (OLD.weight IS DISTINCT FROM NEW.weight)
26
+ EXECUTE FUNCTION public.tokens_weight_notify();
27
+ `);
28
+ }
29
+ async function down(knex) {
30
+ await knex.raw(`
31
+ DROP TRIGGER IF EXISTS tokens_weight_changed_upd ON public.tokens;
32
+ DROP FUNCTION IF EXISTS public.tokens_weight_notify();
33
+ `);
34
+ await knex.schema.alterTable("tokens", (table) => {
35
+ table.dropColumns("weight");
36
+ });
37
+ }
38
+ //#endregion
39
+ export { down, up };
40
+
41
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAyNjA3MTAwOTAwMDBfYWx0ZXJfdG9rZW5zX2FkZF93ZWlnaHQuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21pZ3JhdGlvbnMvMjAyNjA3MTAwOTAwMDBfYWx0ZXJfdG9rZW5zX2FkZF93ZWlnaHQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBLbmV4IH0gZnJvbSBcImtuZXhcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQga25leC5zY2hlbWEuYWx0ZXJUYWJsZShcInRva2Vuc1wiLCAodGFibGUpID0+IHtcbiAgICB0YWJsZS5pbnRlZ2VyKFwid2VpZ2h0XCIpLm5vdE51bGxhYmxlKCkuZGVmYXVsdFRvKDEpO1xuICB9KTtcbiAgYXdhaXQga25leC5yYXcoYFxuICAgIENSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OIHB1YmxpYy50b2tlbnNfd2VpZ2h0X25vdGlmeSgpIFJFVFVSTlMgdHJpZ2dlclxuICAgIExBTkdVQUdFIHBscGdzcWxcbiAgICBTRVQgc2VhcmNoX3BhdGggPSBwZ19jYXRhbG9nLCBwdWJsaWNcbiAgICBBUyAkZnVuYyRcbiAgICBCRUdJTlxuICAgICAgUEVSRk9STSBwZ19ub3RpZnkoJ3Rva2Vuc19jaGFuZ2VkJywganNvbl9idWlsZF9vYmplY3QoXG4gICAgICAgICdvcCcsIFRHX09QLFxuICAgICAgICAnaWQnLCBORVcuaWRcbiAgICAgICk6OnRleHQpO1xuICAgICAgUkVUVVJOIE5FVztcbiAgICBFTkQ7XG4gICAgJGZ1bmMkO1xuXG4gICAgRFJPUCBUUklHR0VSIElGIEVYSVNUUyB0b2tlbnNfd2VpZ2h0X2NoYW5nZWRfdXBkIE9OIHB1YmxpYy50b2tlbnM7XG4gICAgQ1JFQVRFIFRSSUdHRVIgdG9rZW5zX3dlaWdodF9jaGFuZ2VkX3VwZFxuICAgIEFGVEVSIFVQREFURSBPRiB3ZWlnaHQgT04gcHVibGljLnRva2Vuc1xuICAgIEZPUiBFQUNIIFJPV1xuICAgIFdIRU4gKE9MRC53ZWlnaHQgSVMgRElTVElOQ1QgRlJPTSBORVcud2VpZ2h0KVxuICAgIEVYRUNVVEUgRlVOQ1RJT04gcHVibGljLnRva2Vuc193ZWlnaHRfbm90aWZ5KCk7XG4gIGApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZG93bihrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGtuZXgucmF3KGBcbiAgICBEUk9QIFRSSUdHRVIgSUYgRVhJU1RTIHRva2Vuc193ZWlnaHRfY2hhbmdlZF91cGQgT04gcHVibGljLnRva2VucztcbiAgICBEUk9QIEZVTkNUSU9OIElGIEVYSVNUUyBwdWJsaWMudG9rZW5zX3dlaWdodF9ub3RpZnkoKTtcbiAgYCk7XG4gIGF3YWl0IGtuZXguc2NoZW1hLmFsdGVyVGFibGUoXCJ0b2tlbnNcIiwgKHRhYmxlKSA9PiB7XG4gICAgdGFibGUuZHJvcENvbHVtbnMoXCJ3ZWlnaHRcIik7XG4gIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiOztBQUVBLGVBQXNCLEdBQUcsTUFBMkI7QUFDbEQsT0FBTSxLQUFLLE9BQU8sV0FBVyxXQUFXLFVBQVU7QUFDaEQsUUFBTSxRQUFRLFNBQVMsQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFO0dBQ2xEO0FBQ0YsT0FBTSxLQUFLLElBQUk7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBb0JiOztBQUdKLGVBQXNCLEtBQUssTUFBMkI7QUFDcEQsT0FBTSxLQUFLLElBQUk7OztJQUdiO0FBQ0YsT0FBTSxLQUFLLE9BQU8sV0FBVyxXQUFXLFVBQVU7QUFDaEQsUUFBTSxZQUFZLFNBQVM7R0FDM0IifQ==
@@ -0,0 +1,17 @@
1
+ import "./_virtual/_rolldown/runtime.js";
2
+ import { runRequiredMigrations } from "./startup-migrations.js";
3
+ import { Sonamu } from "sonamu";
4
+ //#region src/server-bootstrap.ts
5
+ async function bootstrapServer(steps = {
6
+ init: () => Sonamu.init(),
7
+ migrate: runRequiredMigrations,
8
+ listen: () => Sonamu.createServer()
9
+ }) {
10
+ await steps.init();
11
+ await steps.migrate();
12
+ await steps.listen();
13
+ }
14
+ //#endregion
15
+ export { bootstrapServer };
16
+
17
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLWJvb3RzdHJhcC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi9zcmMvc2VydmVyLWJvb3RzdHJhcC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwic29uYW11XCI7XG5cbmltcG9ydCB7IHJ1blJlcXVpcmVkTWlncmF0aW9ucyB9IGZyb20gXCIuL3N0YXJ0dXAtbWlncmF0aW9uc1wiO1xuXG50eXBlIEJvb3RzdHJhcFN0ZXBzID0ge1xuICBpbml0OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBtaWdyYXRlOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBsaXN0ZW46ICgpID0+IFByb21pc2U8dW5rbm93bj47XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYm9vdHN0cmFwU2VydmVyKFxuICBzdGVwczogQm9vdHN0cmFwU3RlcHMgPSB7XG4gICAgaW5pdDogKCkgPT4gU29uYW11LmluaXQoKSxcbiAgICBtaWdyYXRlOiBydW5SZXF1aXJlZE1pZ3JhdGlvbnMsXG4gICAgbGlzdGVuOiAoKSA9PiBTb25hbXUuY3JlYXRlU2VydmVyKCksXG4gIH0sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgc3RlcHMuaW5pdCgpO1xuICBhd2FpdCBzdGVwcy5taWdyYXRlKCk7XG4gIGF3YWl0IHN0ZXBzLmxpc3RlbigpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7O0FBVUEsZUFBc0IsZ0JBQ3BCLFFBQXdCO0NBQ3RCLFlBQVksT0FBTyxNQUFNO0NBQ3pCLFNBQVM7Q0FDVCxjQUFjLE9BQU8sY0FBYztDQUNwQyxFQUNjO0FBQ2YsT0FBTSxNQUFNLE1BQU07QUFDbEIsT0FBTSxNQUFNLFNBQVM7QUFDckIsT0FBTSxNQUFNLFFBQVEifQ==
@@ -1,6 +1,5 @@
1
1
  import "./_virtual/_rolldown/runtime.js";
2
2
  import { QgridDispatcher } from "./application/qgrid/qgrid.dispatcher.js";
3
- import { TokenModel } from "./application/token/token.model.js";
4
3
  import { QgridFrame } from "./application/qgrid/qgrid.frame.js";
5
4
  import { TokenSubscriber } from "./application/qgrid/token-subscriber.js";
6
5
  import { ensureTokensTrigger } from "./application/qgrid/token-trigger-setup.js";
@@ -144,14 +143,6 @@ var sonamu_config_default = defineConfig({
144
143
  lifecycle: {
145
144
  onStart: async () => {
146
145
  const log = getLogger(["qgrid", "startup"]);
147
- try {
148
- const knex = TokenModel.getDB("w");
149
- const migrationsDir = path.join(import.meta.dirname, "../src/migrations");
150
- const [batch, migrations] = await knex.migrate.latest({ directory: migrationsDir });
151
- if (migrations.length > 0) log.info(`migration: ${migrations.length} applied (batch ${batch})`);
152
- } catch (e) {
153
- log.warn(`migration skipped: ${e.message}`);
154
- }
155
146
  let triggerReady = true;
156
147
  try {
157
148
  await ensureTokensTrigger(connConfig);
@@ -204,4 +195,4 @@ var sonamu_config_default = defineConfig({
204
195
  //#endregion
205
196
  export { sonamu_config_default as default };
206
197
 
207
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmNvbmZpZy5qcyIsIm5hbWVzIjpbImNhY2hlRHJpdmVycyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9zb25hbXUuY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IGdldENvbnNvbGVTaW5rIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyBnZXRQcmV0dHlGb3JtYXR0ZXIgfSBmcm9tIFwiQGxvZ3RhcGUvcHJldHR5XCI7XG5pbXBvcnQgZG90ZW52IGZyb20gXCJkb3RlbnZcIjtcbmltcG9ydCB7IENhY2hlUHJlc2V0cywgZGVmaW5lQ29uZmlnIH0gZnJvbSBcInNvbmFtdVwiO1xuaW1wb3J0IHsgZHJpdmVycyBhcyBjYWNoZURyaXZlcnMsIHN0b3JlIH0gZnJvbSBcInNvbmFtdS9jYWNoZVwiO1xuXG5pbXBvcnQgeyBRZ3JpZERpc3BhdGNoZXIgfSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC5kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBRZ3JpZEZyYW1lIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZnJhbWVcIjtcbmltcG9ydCB7IFRva2VuU3Vic2NyaWJlciB9IGZyb20gXCIuL2FwcGxpY2F0aW9uL3FncmlkL3Rva2VuLXN1YnNjcmliZXJcIjtcbmltcG9ydCB7IGVuc3VyZVRva2Vuc1RyaWdnZXIgfSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC90b2tlbi10cmlnZ2VyLXNldHVwXCI7XG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vdG9rZW4vdG9rZW4ubW9kZWxcIjtcbmltcG9ydCB7IEFudGhyb3BpY0Rpc3BhdGNoZXIgfSBmcm9tIFwiLi91dGlscy9wcm92aWRlcnMvYW50aHJvcGljL2FudGhyb3BpYy1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBPcGVuQUlEaXNwYXRjaGVyIH0gZnJvbSBcIi4vdXRpbHMvcHJvdmlkZXJzL29wZW5haS9vcGVuYWktZGlzcGF0Y2hlclwiO1xuXG5kb3RlbnYuY29uZmlnKHsgcGF0aDogcGF0aC5qb2luKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLi4vLmVudlwiKSB9KTtcblxuY29uc3QgaG9zdCA9IHByb2Nlc3MuZW52LkhPU1QgPz8gXCJsb2NhbGhvc3RcIjtcbmNvbnN0IHBvcnQgPSBOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVCA/PyA0NDkwMCk7XG5cbmNvbnN0IGNvbm5Db25maWcgPSB7XG4gIGhvc3Q6IHByb2Nlc3MuZW52LlFHUklEX0RCX0hPU1QgPz8gXCJsb2NhbGhvc3RcIixcbiAgcG9ydDogTnVtYmVyKHByb2Nlc3MuZW52LlFHUklEX0RCX1BPUlQgPz8gNTQzMiksXG4gIHVzZXI6IHByb2Nlc3MuZW52LlFHUklEX0RCX1VTRVIgPz8gXCJwb3N0Z3Jlc1wiLFxuICBwYXNzd29yZDogcHJvY2Vzcy5lbnYuUUdSSURfREJfUEFTU1dPUkQgPz8gXCJwb3N0Z3Jlc1wiLFxuICBkYXRhYmFzZTogcHJvY2Vzcy5lbnYuUUdSSURfREJfTkFNRSA/PyBcInFncmlkXCIsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xuICBwcm9qZWN0TmFtZTogcHJvY2Vzcy5lbnYuUFJPSkVDVF9OQU1FID8/IFwiUWdyaWRcIixcbiAgZGF0YWJhc2U6IHtcbiAgICBuYW1lOiBcInFncmlkXCIsXG4gICAgZGVmYXVsdE9wdGlvbnM6IHtcbiAgICAgIGNvbm5lY3Rpb246IHtcbiAgICAgICAgLi4uY29ubkNvbmZpZyxcbiAgICAgICAga2VlcEFsaXZlOiB0cnVlLFxuICAgICAgICBrZWVwQWxpdmVJbml0aWFsRGVsYXlNaWxsaXM6IDEwMDAwLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGVudmlyb25tZW50czoge1xuICAgICAgZml4dHVyZToge1xuICAgICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgICAgLi4uY29ubkNvbmZpZyxcbiAgICAgICAgICBkYXRhYmFzZTogcHJvY2Vzcy5lbnYuUUdSSURfREJfTkFNRSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0ZXN0OiB7XG4gICAgICAgIGNvbm5lY3Rpb246IHtcbiAgICAgICAgICAuLi5jb25uQ29uZmlnLFxuICAgICAgICAgIGRhdGFiYXNlOiBwcm9jZXNzLmVudi5RR1JJRF9EQl9OQU1FLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBhcGk6IHtcbiAgICBkaXI6IFwiYXBpXCIsXG4gICAgdGltZXpvbmU6IFwiQXNpYS9TZW91bFwiLFxuICAgIHJvdXRlOiB7XG4gICAgICBwcmVmaXg6IFwiL2FwaVwiLFxuICAgIH0sXG4gIH0sXG4gIGkxOG46IHtcbiAgICBkZWZhdWx0TG9jYWxlOiBcImtvXCIsXG4gICAgc3VwcG9ydGVkTG9jYWxlczogW1wia29cIiwgXCJlblwiXSxcbiAgfSxcbiAgc3luYzoge1xuICAgIHRhcmdldHM6IFtcIndlYlwiXSxcbiAgfSxcbiAgdGVzdDoge1xuICAgIHBhcmFsbGVsOiB0cnVlLFxuICAgIG1heFdvcmtlcnM6IDQsXG4gICAgZGV2UnVubmVyOiB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgfSxcbiAgbG9nZ2luZzoge1xuICAgIHNpbmtzOiB7XG4gICAgICBjb25zb2xlOiBnZXRDb25zb2xlU2luayh7XG4gICAgICAgIGZvcm1hdHRlcjogZ2V0UHJldHR5Rm9ybWF0dGVyKHtcbiAgICAgICAgICB0aW1lc3RhbXA6IFwidGltZVwiLFxuICAgICAgICAgIGNhdGVnb3J5V2lkdGg6IDIwLFxuICAgICAgICAgIGNhdGVnb3J5VHJ1bmNhdGU6IFwibWlkZGxlXCIsXG4gICAgICAgIH0pLFxuICAgICAgfSksXG4gICAgfSxcbiAgICBsb2dnZXJzOiBbXG4gICAgICAvLyBxZ3JpZCDroZzqt7ggKOyalOyyrSDrtoTrsLAsIG9hdXRoL3VzYWdlIEFQSSlcbiAgICAgIHsgY2F0ZWdvcnk6IFtcInFncmlkXCJdLCBzaW5rczogW1wiY29uc29sZVwiXSwgbG93ZXN0TGV2ZWw6IFwiaW5mb1wiIH0sXG4gICAgICAvLyBzb25hbXUg66Gc6re464qUIHdhcm5pbmcg7J207IOB66eMXG4gICAgICB7IGNhdGVnb3J5OiBbXCJzb25hbXVcIl0sIHNpbmtzOiBbXCJjb25zb2xlXCJdLCBsb3dlc3RMZXZlbDogXCJ3YXJuaW5nXCIgfSxcbiAgICAgIC8vIGZhc3RpZnkg66Gc6re4IOywqOuLqFxuICAgICAgeyBjYXRlZ29yeTogW1wiZmFzdGlmeVwiXSwgc2lua3M6IFtdLCBsb3dlc3RMZXZlbDogXCJmYXRhbFwiIH0sXG4gICAgXSxcbiAgfSxcbiAgc2VydmVyOiB7XG4gICAgbGlzdGVuOiB7IHBvcnQsIGhvc3QgfSxcbiAgICBmYXN0aWZ5OiB7XG4gICAgICBib2R5TGltaXQ6IDEwICogMTAyNCAqIDEwMjQsXG4gICAgfSxcbiAgICBwbHVnaW5zOiB7XG4gICAgICBmb3JtYm9keTogdHJ1ZSxcbiAgICAgIHFzOiB0cnVlLFxuICAgICAgc3NlOiB0cnVlLFxuICAgICAgbXVsdGlwYXJ0OiB7IGxpbWl0czogeyBmaWxlU2l6ZTogMTAyNCAqIDEwMjQgKiAzMCB9IH0sXG4gICAgICBzdGF0aWM6IHtcbiAgICAgICAgcm9vdDogcGF0aC5qb2luKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLy4uL1wiLCBcInB1YmxpY1wiKSxcbiAgICAgICAgcHJlZml4OiBcIi9hcGkvcHVibGljXCIsXG4gICAgICB9LFxuICAgICAgY3VzdG9tOiAoc2VydmVyKSA9PiB7XG4gICAgICAgIC8vIE9BdXRoIOy9nOuwsSDigJQgQW50aHJvcGlj7J20IC9jYWxsYmFja+ycvOuhnCDrpqzri6TsnbTroIntirhcbiAgICAgICAgc2VydmVyLmdldChcIi9jYWxsYmFja1wiLCBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGNvZGUsIHN0YXRlIH0gPSByZXF1ZXN0LnF1ZXJ5IGFzIHsgY29kZT86IHN0cmluZzsgc3RhdGU/OiBzdHJpbmcgfTtcbiAgICAgICAgICBpZiAoIWNvZGUgfHwgIXN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoXCIvP29hdXRoPWVycm9yJnJlYXNvbj1taXNzaW5nX3BhcmFtc1wiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBRZ3JpZEZyYW1lLmhhbmRsZU9BdXRoQ2FsbGJhY2soY29kZSwgc3RhdGUsIHJlcGx5KTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoXG4gICAgICAgICAgICAgIGAvP29hdXRoPWVycm9yJnJlYXNvbj0ke2VuY29kZVVSSUNvbXBvbmVudCgoZSBhcyBFcnJvcikubWVzc2FnZSl9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBPcGVuQUkgT0F1dGgg64qUIGNvZGV4IGFwcC1zZXJ2ZXIg6rCAIOyekOyytCBjYWxsYmFjayDshJzrsoTrpbwg7Jis66a8XG4gICAgICAgIC8vIGhhbmRsZU9wZW5BSUNhbGxiYWNrIOu2iO2VhOyalCDigJQgb2F1dGhDb21wbGV0ZU9wZW5BSSBBUEkg66GcIOyZhOujjCDtmZXsnbhcbiAgICAgIH0sXG4gICAgfSxcbiAgICBhcGlDb25maWc6IHtcbiAgICAgIGNvbnRleHRQcm92aWRlcjogKGRlZmF1bHRDb250ZXh0LCByZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uZGVmYXVsdENvbnRleHQsXG4gICAgICAgICAgaXA6IHJlcXVlc3QuaXAsXG4gICAgICAgICAgYm9keTogcmVxdWVzdC5ib2R5LFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGd1YXJkSGFuZGxlcjogKCkgPT4ge30sXG4gICAgICBjYWNoZUNvbnRyb2xIYW5kbGVyOiAocmVxKSA9PiB7XG4gICAgICAgIHN3aXRjaCAocmVxLnR5cGUpIHtcbiAgICAgICAgICBjYXNlIFwiYXNzZXRzXCI6XG4gICAgICAgICAgICAvLyBIYXNoIO2PrO2VqOuQnCDtjIzsnbw6IOyYgeq1rCDsupDsi5xcbiAgICAgICAgICAgIGlmIChyZXEucGF0aC5tYXRjaCgvLVthLWYwLTldK1xcLi8pKSB7XG4gICAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMuaW1tdXRhYmxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5sb25nTGl2ZWQ7XG5cbiAgICAgICAgICBjYXNlIFwiYXBpXCI6XG4gICAgICAgICAgICAvLyBHRVQg7JqU7LKt66eMIOy6kOyLsSDqs6DroKRcbiAgICAgICAgICAgIGlmIChyZXEubWV0aG9kID09PSBcIkdFVFwiKSB7XG4gICAgICAgICAgICAgIC8vIO2KueyglSDqsr3roZzripQg7Ken7J2AIOy6kOyLnFxuICAgICAgICAgICAgICBpZiAocmVxLnBhdGguc3RhcnRzV2l0aChcIi9hcGkvc3RhdGljLWRhdGFcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLnNob3J0TGl2ZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHJlcS5wYXRoLnN0YXJ0c1dpdGgoXCIvYXBpL3Rlcm1zXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5tZWRpdW1MaXZlZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g6riw67O4OiDsupDsi5wg7JeG7J2MXG4gICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLm5vQ2FjaGU7XG5cbiAgICAgICAgICBjYXNlIFwic3NyXCI6XG4gICAgICAgICAgICAvLyBTU1Ig7Y6Y7J207KeAOiAxMOy0iCDsupDsi5xcbiAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMuc3NyO1xuXG4gICAgICAgICAgY2FzZSBcImNzclwiOlxuICAgICAgICAgICAgLy8gQ1NSIGZhbGxiYWNrIChpbmRleC5odG1sKTogMeu2hCDsupDsi5xcbiAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMuc2hvcnRMaXZlZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLm5vQ2FjaGU7XG4gICAgICB9LFxuICAgIH0sXG4gICAgY2FjaGU6IHtcbiAgICAgIGRlZmF1bHQ6IFwibWFpblwiLFxuICAgICAgc3RvcmVzOiB7XG4gICAgICAgIG1haW46IHN0b3JlKCkudXNlTDFMYXllcihjYWNoZURyaXZlcnMubWVtb3J5KHsgbWF4U2l6ZTogXCI1MG1iXCIgfSkpLFxuICAgICAgfSxcbiAgICAgIHR0bDogXCI1bVwiLFxuICAgICAgcHJlZml4OiBcIlwiLFxuICAgIH0sXG4gICAgbGlmZWN5Y2xlOiB7XG4gICAgICBvblN0YXJ0OiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGxvZyA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcInN0YXJ0dXBcIl0pO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qga25leCA9IFRva2VuTW9kZWwuZ2V0REIoXCJ3XCIpO1xuICAgICAgICAgIGNvbnN0IG1pZ3JhdGlvbnNEaXIgPSBwYXRoLmpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLi9zcmMvbWlncmF0aW9uc1wiKTtcbiAgICAgICAgICBjb25zdCBbYmF0Y2gsIG1pZ3JhdGlvbnNdID0gYXdhaXQga25leC5taWdyYXRlLmxhdGVzdCh7IGRpcmVjdG9yeTogbWlncmF0aW9uc0RpciB9KTtcbiAgICAgICAgICBpZiAobWlncmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2cuaW5mbyhgbWlncmF0aW9uOiAke21pZ3JhdGlvbnMubGVuZ3RofSBhcHBsaWVkIChiYXRjaCAke2JhdGNofSlgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2cud2FybihgbWlncmF0aW9uIHNraXBwZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdHJpZ2dlclJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBlbnN1cmVUb2tlbnNUcmlnZ2VyKGNvbm5Db25maWcpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdHJpZ2dlclJlYWR5ID0gZmFsc2U7XG4gICAgICAgICAgbG9nLndhcm4oYHRyaWdnZXIgc2V0dXAgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3Vic2NyaWJlciA9IG5ldyBUb2tlblN1YnNjcmliZXIoY29ubkNvbmZpZywgUWdyaWREaXNwYXRjaGVyKTtcbiAgICAgICAgUWdyaWREaXNwYXRjaGVyLnN1YnNjcmliZXIgPSBzdWJzY3JpYmVyO1xuXG4gICAgICAgIGNvbnN0IHN0YXJ0ZWQgPSBhd2FpdCBzdWJzY3JpYmVyLnN0YXJ0KCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBvcGVuYWlEaXNwYXRjaGVyID0gbmV3IE9wZW5BSURpc3BhdGNoZXIoKTtcbiAgICAgICAgICBhd2FpdCBvcGVuYWlEaXNwYXRjaGVyLnN0YXJ0KCk7XG4gICAgICAgICAgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXIgPSBvcGVuYWlEaXNwYXRjaGVyO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nLndhcm4oYG9wZW5haSBkaXNwYXRjaGVyIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYW50aHJvcGljRGlzcGF0Y2hlciA9IG5ldyBBbnRocm9waWNEaXNwYXRjaGVyKCk7XG4gICAgICAgICAgYXdhaXQgYW50aHJvcGljRGlzcGF0Y2hlci5zdGFydCgpO1xuICAgICAgICAgIFFncmlkRGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyID0gYW50aHJvcGljRGlzcGF0Y2hlcjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZy53YXJuKGBhbnRocm9waWMgZGlzcGF0Y2hlciBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhbnRocm9waWNDb3VudCA9IFFncmlkRGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy50b2tlbkNvdW50ID8/IDA7XG4gICAgICAgIGNvbnN0IG9wZW5haVJlYWR5ID0gUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXI/LnJlYWR5V29ya2VyQ291bnQgPz8gMDtcbiAgICAgICAgY29uc3Qgb3BlbmFpVG90YWwgPSBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcj8ud29ya2VyQ291bnQgPz8gMDtcblxuICAgICAgICBsb2cuaW5mbyhgbGlzdGVuaW5nIG9uIGh0dHA6Ly8ke2hvc3R9OiR7cG9ydH1gKTtcbiAgICAgICAgbG9nLmluZm8oYGFudGhyb3BpYzogJHthbnRocm9waWNDb3VudH0gdG9rZW5zIHJlYWR5YCk7XG4gICAgICAgIGxvZy5pbmZvKGBvcGVuYWk6ICR7b3BlbmFpUmVhZHl9LyR7b3BlbmFpVG90YWx9IHRva2VucyByZWFkeWApO1xuICAgICAgICBsb2cuaW5mbyhcbiAgICAgICAgICBgc3Vic2NyaWJlcjogJHtzdGFydGVkID8gXCJMSVNURU4gYWN0aXZlXCIgOiBcImRlZ3JhZGVkXCJ9JHt0cmlnZ2VyUmVhZHkgPyBcIlwiIDogXCIsIHRyaWdnZXIgZmFpbGVkXCJ9YCxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBvblNodXRkb3duOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGxvZyA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcInN0YXJ0dXBcIl0pO1xuICAgICAgICBpZiAoUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXIpIHtcbiAgICAgICAgICBhd2FpdCBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlci5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFFncmlkRGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyKSB7XG4gICAgICAgICAgYXdhaXQgUWdyaWREaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXIuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChRZ3JpZERpc3BhdGNoZXIuc3Vic2NyaWJlcikge1xuICAgICAgICAgIGF3YWl0IFFncmlkRGlzcGF0Y2hlci5zdWJzY3JpYmVyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgICBsb2cuaW5mbyhcImdyYWNlZnVsIHNodXRkb3duXCIpO1xuICAgICAgfSxcbiAgICAgIG9uRXJyb3I6IChlcnJvciwgX3JlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGdldExvZ2dlcihbXCJxZ3JpZFwiXSkuZXJyb3IoYCR7ZXJyb3J9YCk7XG4gICAgICAgIHJlcGx5LnN0YXR1cyg1MDApLnNlbmQoe1xuICAgICAgICAgIG5hbWU6IGVycm9yLm5hbWUsXG4gICAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBaUJBLE9BQU8sT0FBTyxFQUFFLE1BQU0sS0FBSyxLQUFLLE9BQU8sS0FBSyxTQUFTLFVBQVUsRUFBRSxDQUFDO0FBRWxFLE1BQU0sT0FBTyxRQUFRLElBQUksUUFBUTtBQUNqQyxNQUFNLE9BQU8sT0FBTyxRQUFRLElBQUksUUFBUSxNQUFNO0FBRTlDLE1BQU0sYUFBYTtDQUNqQixNQUFNLFFBQVEsSUFBSSxpQkFBaUI7Q0FDbkMsTUFBTSxPQUFPLFFBQVEsSUFBSSxpQkFBaUIsS0FBSztDQUMvQyxN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
198
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmNvbmZpZy5qcyIsIm5hbWVzIjpbImNhY2hlRHJpdmVycyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9zb25hbXUuY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IGdldENvbnNvbGVTaW5rIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyBnZXRQcmV0dHlGb3JtYXR0ZXIgfSBmcm9tIFwiQGxvZ3RhcGUvcHJldHR5XCI7XG5pbXBvcnQgZG90ZW52IGZyb20gXCJkb3RlbnZcIjtcbmltcG9ydCB7IENhY2hlUHJlc2V0cywgZGVmaW5lQ29uZmlnIH0gZnJvbSBcInNvbmFtdVwiO1xuaW1wb3J0IHsgZHJpdmVycyBhcyBjYWNoZURyaXZlcnMsIHN0b3JlIH0gZnJvbSBcInNvbmFtdS9jYWNoZVwiO1xuXG5pbXBvcnQgeyBRZ3JpZERpc3BhdGNoZXIgfSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC5kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBRZ3JpZEZyYW1lIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZnJhbWVcIjtcbmltcG9ydCB7IFRva2VuU3Vic2NyaWJlciB9IGZyb20gXCIuL2FwcGxpY2F0aW9uL3FncmlkL3Rva2VuLXN1YnNjcmliZXJcIjtcbmltcG9ydCB7IGVuc3VyZVRva2Vuc1RyaWdnZXIgfSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC90b2tlbi10cmlnZ2VyLXNldHVwXCI7XG5pbXBvcnQgeyBBbnRocm9waWNEaXNwYXRjaGVyIH0gZnJvbSBcIi4vdXRpbHMvcHJvdmlkZXJzL2FudGhyb3BpYy9hbnRocm9waWMtZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgT3BlbkFJRGlzcGF0Y2hlciB9IGZyb20gXCIuL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpc3BhdGNoZXJcIjtcblxuZG90ZW52LmNvbmZpZyh7IHBhdGg6IHBhdGguam9pbihpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi4uLy5lbnZcIikgfSk7XG5cbmNvbnN0IGhvc3QgPSBwcm9jZXNzLmVudi5IT1NUID8/IFwibG9jYWxob3N0XCI7XG5jb25zdCBwb3J0ID0gTnVtYmVyKHByb2Nlc3MuZW52LlBPUlQgPz8gNDQ5MDApO1xuXG5jb25zdCBjb25uQ29uZmlnID0ge1xuICBob3N0OiBwcm9jZXNzLmVudi5RR1JJRF9EQl9IT1NUID8/IFwibG9jYWxob3N0XCIsXG4gIHBvcnQ6IE51bWJlcihwcm9jZXNzLmVudi5RR1JJRF9EQl9QT1JUID8/IDU0MzIpLFxuICB1c2VyOiBwcm9jZXNzLmVudi5RR1JJRF9EQl9VU0VSID8/IFwicG9zdGdyZXNcIixcbiAgcGFzc3dvcmQ6IHByb2Nlc3MuZW52LlFHUklEX0RCX1BBU1NXT1JEID8/IFwicG9zdGdyZXNcIixcbiAgZGF0YWJhc2U6IHByb2Nlc3MuZW52LlFHUklEX0RCX05BTUUgPz8gXCJxZ3JpZFwiLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHtcbiAgcHJvamVjdE5hbWU6IHByb2Nlc3MuZW52LlBST0pFQ1RfTkFNRSA/PyBcIlFncmlkXCIsXG4gIGRhdGFiYXNlOiB7XG4gICAgbmFtZTogXCJxZ3JpZFwiLFxuICAgIGRlZmF1bHRPcHRpb25zOiB7XG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLmNvbm5Db25maWcsXG4gICAgICAgIGtlZXBBbGl2ZTogdHJ1ZSxcbiAgICAgICAga2VlcEFsaXZlSW5pdGlhbERlbGF5TWlsbGlzOiAxMDAwMCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBlbnZpcm9ubWVudHM6IHtcbiAgICAgIGZpeHR1cmU6IHtcbiAgICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAgIC4uLmNvbm5Db25maWcsXG4gICAgICAgICAgZGF0YWJhc2U6IHByb2Nlc3MuZW52LlFHUklEX0RCX05BTUUsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdGVzdDoge1xuICAgICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgICAgLi4uY29ubkNvbmZpZyxcbiAgICAgICAgICBkYXRhYmFzZTogcHJvY2Vzcy5lbnYuUUdSSURfREJfTkFNRSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgYXBpOiB7XG4gICAgZGlyOiBcImFwaVwiLFxuICAgIHRpbWV6b25lOiBcIkFzaWEvU2VvdWxcIixcbiAgICByb3V0ZToge1xuICAgICAgcHJlZml4OiBcIi9hcGlcIixcbiAgICB9LFxuICB9LFxuICBpMThuOiB7XG4gICAgZGVmYXVsdExvY2FsZTogXCJrb1wiLFxuICAgIHN1cHBvcnRlZExvY2FsZXM6IFtcImtvXCIsIFwiZW5cIl0sXG4gIH0sXG4gIHN5bmM6IHtcbiAgICB0YXJnZXRzOiBbXCJ3ZWJcIl0sXG4gIH0sXG4gIHRlc3Q6IHtcbiAgICBwYXJhbGxlbDogdHJ1ZSxcbiAgICBtYXhXb3JrZXJzOiA0LFxuICAgIGRldlJ1bm5lcjogeyBlbmFibGVkOiB0cnVlIH0sXG4gIH0sXG4gIGxvZ2dpbmc6IHtcbiAgICBzaW5rczoge1xuICAgICAgY29uc29sZTogZ2V0Q29uc29sZVNpbmsoe1xuICAgICAgICBmb3JtYXR0ZXI6IGdldFByZXR0eUZvcm1hdHRlcih7XG4gICAgICAgICAgdGltZXN0YW1wOiBcInRpbWVcIixcbiAgICAgICAgICBjYXRlZ29yeVdpZHRoOiAyMCxcbiAgICAgICAgICBjYXRlZ29yeVRydW5jYXRlOiBcIm1pZGRsZVwiLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgIH0sXG4gICAgbG9nZ2VyczogW1xuICAgICAgLy8gcWdyaWQg66Gc6re4ICjsmpTssq0g67aE67CwLCBvYXV0aC91c2FnZSBBUEkpXG4gICAgICB7IGNhdGVnb3J5OiBbXCJxZ3JpZFwiXSwgc2lua3M6IFtcImNvbnNvbGVcIl0sIGxvd2VzdExldmVsOiBcImluZm9cIiB9LFxuICAgICAgLy8gc29uYW11IOuhnOq3uOuKlCB3YXJuaW5nIOydtOyDgeunjFxuICAgICAgeyBjYXRlZ29yeTogW1wic29uYW11XCJdLCBzaW5rczogW1wiY29uc29sZVwiXSwgbG93ZXN0TGV2ZWw6IFwid2FybmluZ1wiIH0sXG4gICAgICAvLyBmYXN0aWZ5IOuhnOq3uCDssKjri6hcbiAgICAgIHsgY2F0ZWdvcnk6IFtcImZhc3RpZnlcIl0sIHNpbmtzOiBbXSwgbG93ZXN0TGV2ZWw6IFwiZmF0YWxcIiB9LFxuICAgIF0sXG4gIH0sXG4gIHNlcnZlcjoge1xuICAgIGxpc3RlbjogeyBwb3J0LCBob3N0IH0sXG4gICAgZmFzdGlmeToge1xuICAgICAgYm9keUxpbWl0OiAxMCAqIDEwMjQgKiAxMDI0LFxuICAgIH0sXG4gICAgcGx1Z2luczoge1xuICAgICAgZm9ybWJvZHk6IHRydWUsXG4gICAgICBxczogdHJ1ZSxcbiAgICAgIHNzZTogdHJ1ZSxcbiAgICAgIG11bHRpcGFydDogeyBsaW1pdHM6IHsgZmlsZVNpemU6IDEwMjQgKiAxMDI0ICogMzAgfSB9LFxuICAgICAgc3RhdGljOiB7XG4gICAgICAgIHJvb3Q6IHBhdGguam9pbihpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi8uLi9cIiwgXCJwdWJsaWNcIiksXG4gICAgICAgIHByZWZpeDogXCIvYXBpL3B1YmxpY1wiLFxuICAgICAgfSxcbiAgICAgIGN1c3RvbTogKHNlcnZlcikgPT4ge1xuICAgICAgICAvLyBPQXV0aCDsvZzrsLEg4oCUIEFudGhyb3BpY+ydtCAvY2FsbGJhY2vsnLzroZwg66as64uk7J2066CJ7Yq4XG4gICAgICAgIHNlcnZlci5nZXQoXCIvY2FsbGJhY2tcIiwgYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBjb2RlLCBzdGF0ZSB9ID0gcmVxdWVzdC5xdWVyeSBhcyB7IGNvZGU/OiBzdHJpbmc7IHN0YXRlPzogc3RyaW5nIH07XG4gICAgICAgICAgaWYgKCFjb2RlIHx8ICFzdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcGx5LnJlZGlyZWN0KFwiLz9vYXV0aD1lcnJvciZyZWFzb249bWlzc2luZ19wYXJhbXNcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gUWdyaWRGcmFtZS5oYW5kbGVPQXV0aENhbGxiYWNrKGNvZGUsIHN0YXRlLCByZXBseSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcGx5LnJlZGlyZWN0KFxuICAgICAgICAgICAgICBgLz9vYXV0aD1lcnJvciZyZWFzb249JHtlbmNvZGVVUklDb21wb25lbnQoKGUgYXMgRXJyb3IpLm1lc3NhZ2UpfWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gT3BlbkFJIE9BdXRoIOuKlCBjb2RleCBhcHAtc2VydmVyIOqwgCDsnpDssrQgY2FsbGJhY2sg7ISc67KE66W8IOyYrOumvFxuICAgICAgICAvLyBoYW5kbGVPcGVuQUlDYWxsYmFjayDrtojtlYTsmpQg4oCUIG9hdXRoQ29tcGxldGVPcGVuQUkgQVBJIOuhnCDsmYTro4wg7ZmV7J24XG4gICAgICB9LFxuICAgIH0sXG4gICAgYXBpQ29uZmlnOiB7XG4gICAgICBjb250ZXh0UHJvdmlkZXI6IChkZWZhdWx0Q29udGV4dCwgcmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmRlZmF1bHRDb250ZXh0LFxuICAgICAgICAgIGlwOiByZXF1ZXN0LmlwLFxuICAgICAgICAgIGJvZHk6IHJlcXVlc3QuYm9keSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBndWFyZEhhbmRsZXI6ICgpID0+IHt9LFxuICAgICAgY2FjaGVDb250cm9sSGFuZGxlcjogKHJlcSkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHJlcS50eXBlKSB7XG4gICAgICAgICAgY2FzZSBcImFzc2V0c1wiOlxuICAgICAgICAgICAgLy8gSGFzaCDtj6ztlajrkJwg7YyM7J28OiDsmIHqtawg7LqQ7IucXG4gICAgICAgICAgICBpZiAocmVxLnBhdGgubWF0Y2goLy1bYS1mMC05XStcXC4vKSkge1xuICAgICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLmltbXV0YWJsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMubG9uZ0xpdmVkO1xuXG4gICAgICAgICAgY2FzZSBcImFwaVwiOlxuICAgICAgICAgICAgLy8gR0VUIOyalOyyreunjCDsupDsi7Eg6rOg66CkXG4gICAgICAgICAgICBpZiAocmVxLm1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgICAgICAgICAvLyDtirnsoJUg6rK966Gc64qUIOynp+ydgCDsupDsi5xcbiAgICAgICAgICAgICAgaWYgKHJlcS5wYXRoLnN0YXJ0c1dpdGgoXCIvYXBpL3N0YXRpYy1kYXRhXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5zaG9ydExpdmVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChyZXEucGF0aC5zdGFydHNXaXRoKFwiL2FwaS90ZXJtc1wiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMubWVkaXVtTGl2ZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOq4sOuzuDog7LqQ7IucIOyXhuydjFxuICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5ub0NhY2hlO1xuXG4gICAgICAgICAgY2FzZSBcInNzclwiOlxuICAgICAgICAgICAgLy8gU1NSIO2OmOydtOyngDogMTDstIgg7LqQ7IucXG4gICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLnNzcjtcblxuICAgICAgICAgIGNhc2UgXCJjc3JcIjpcbiAgICAgICAgICAgIC8vIENTUiBmYWxsYmFjayAoaW5kZXguaHRtbCk6IDHrtoQg7LqQ7IucXG4gICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLnNob3J0TGl2ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5ub0NhY2hlO1xuICAgICAgfSxcbiAgICB9LFxuICAgIGNhY2hlOiB7XG4gICAgICBkZWZhdWx0OiBcIm1haW5cIixcbiAgICAgIHN0b3Jlczoge1xuICAgICAgICBtYWluOiBzdG9yZSgpLnVzZUwxTGF5ZXIoY2FjaGVEcml2ZXJzLm1lbW9yeSh7IG1heFNpemU6IFwiNTBtYlwiIH0pKSxcbiAgICAgIH0sXG4gICAgICB0dGw6IFwiNW1cIixcbiAgICAgIHByZWZpeDogXCJcIixcbiAgICB9LFxuICAgIGxpZmVjeWNsZToge1xuICAgICAgb25TdGFydDogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBsb2cgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJzdGFydHVwXCJdKTtcblxuICAgICAgICBsZXQgdHJpZ2dlclJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBlbnN1cmVUb2tlbnNUcmlnZ2VyKGNvbm5Db25maWcpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdHJpZ2dlclJlYWR5ID0gZmFsc2U7XG4gICAgICAgICAgbG9nLndhcm4oYHRyaWdnZXIgc2V0dXAgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3Vic2NyaWJlciA9IG5ldyBUb2tlblN1YnNjcmliZXIoY29ubkNvbmZpZywgUWdyaWREaXNwYXRjaGVyKTtcbiAgICAgICAgUWdyaWREaXNwYXRjaGVyLnN1YnNjcmliZXIgPSBzdWJzY3JpYmVyO1xuXG4gICAgICAgIGNvbnN0IHN0YXJ0ZWQgPSBhd2FpdCBzdWJzY3JpYmVyLnN0YXJ0KCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBvcGVuYWlEaXNwYXRjaGVyID0gbmV3IE9wZW5BSURpc3BhdGNoZXIoKTtcbiAgICAgICAgICBhd2FpdCBvcGVuYWlEaXNwYXRjaGVyLnN0YXJ0KCk7XG4gICAgICAgICAgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXIgPSBvcGVuYWlEaXNwYXRjaGVyO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nLndhcm4oYG9wZW5haSBkaXNwYXRjaGVyIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYW50aHJvcGljRGlzcGF0Y2hlciA9IG5ldyBBbnRocm9waWNEaXNwYXRjaGVyKCk7XG4gICAgICAgICAgYXdhaXQgYW50aHJvcGljRGlzcGF0Y2hlci5zdGFydCgpO1xuICAgICAgICAgIFFncmlkRGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyID0gYW50aHJvcGljRGlzcGF0Y2hlcjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZy53YXJuKGBhbnRocm9waWMgZGlzcGF0Y2hlciBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhbnRocm9waWNDb3VudCA9IFFncmlkRGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy50b2tlbkNvdW50ID8/IDA7XG4gICAgICAgIGNvbnN0IG9wZW5haVJlYWR5ID0gUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXI/LnJlYWR5V29ya2VyQ291bnQgPz8gMDtcbiAgICAgICAgY29uc3Qgb3BlbmFpVG90YWwgPSBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcj8ud29ya2VyQ291bnQgPz8gMDtcblxuICAgICAgICBsb2cuaW5mbyhgbGlzdGVuaW5nIG9uIGh0dHA6Ly8ke2hvc3R9OiR7cG9ydH1gKTtcbiAgICAgICAgbG9nLmluZm8oYGFudGhyb3BpYzogJHthbnRocm9waWNDb3VudH0gdG9rZW5zIHJlYWR5YCk7XG4gICAgICAgIGxvZy5pbmZvKGBvcGVuYWk6ICR7b3BlbmFpUmVhZHl9LyR7b3BlbmFpVG90YWx9IHRva2VucyByZWFkeWApO1xuICAgICAgICBsb2cuaW5mbyhcbiAgICAgICAgICBgc3Vic2NyaWJlcjogJHtzdGFydGVkID8gXCJMSVNURU4gYWN0aXZlXCIgOiBcImRlZ3JhZGVkXCJ9JHt0cmlnZ2VyUmVhZHkgPyBcIlwiIDogXCIsIHRyaWdnZXIgZmFpbGVkXCJ9YCxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBvblNodXRkb3duOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGxvZyA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcInN0YXJ0dXBcIl0pO1xuICAgICAgICBpZiAoUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXIpIHtcbiAgICAgICAgICBhd2FpdCBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlci5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFFncmlkRGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyKSB7XG4gICAgICAgICAgYXdhaXQgUWdyaWREaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXIuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChRZ3JpZERpc3BhdGNoZXIuc3Vic2NyaWJlcikge1xuICAgICAgICAgIGF3YWl0IFFncmlkRGlzcGF0Y2hlci5zdWJzY3JpYmVyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgICBsb2cuaW5mbyhcImdyYWNlZnVsIHNodXRkb3duXCIpO1xuICAgICAgfSxcbiAgICAgIG9uRXJyb3I6IChlcnJvciwgX3JlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGdldExvZ2dlcihbXCJxZ3JpZFwiXSkuZXJyb3IoYCR7ZXJyb3J9YCk7XG4gICAgICAgIHJlcGx5LnN0YXR1cyg1MDApLnNlbmQoe1xuICAgICAgICAgIG5hbWU6IGVycm9yLm5hbWUsXG4gICAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFnQkEsT0FBTyxPQUFPLEVBQUUsTUFBTSxLQUFLLEtBQUssT0FBTyxLQUFLLFNBQVMsVUFBVSxFQUFFLENBQUM7QUFFbEUsTUFBTSxPQUFPLFFBQVEsSUFBSSxRQUFRO0FBQ2pDLE1BQU0sT0FBTyxPQUFPLFFBQVEsSUFBSSxRQUFRLE1BQU07QUFFOUMsTUFBTSxhQUFhO0NBQ2pCLE1BQU0sUUFBUSxJQUFJLGlCQUFpQjtDQUNuQyxNQUFNLE9BQU8sUUFBUSxJQUFJLGlCQUFpQixLQUFLO0NBQy9DLE1BQU0sUUFBUSxJQUFJLGlCQUFpQjtDQUNuQyxVQUFVLFFBQVEsSUFBSSxxQkFBcUI7Q0FDM0MsVUFBVSxRQUFRLElBQUksaUJBQWlCO0NBQ3hDO0FBRUQsSUFBQSx3QkFBZSxhQUFhO0NBQzFCLGFBQWEsUUFBUSxJQUFJLGdCQUFnQjtDQUN6QyxVQUFVO0VBQ1IsTUFBTTtFQUNOLGdCQUFnQixFQUNkLFlBQVk7R0FDVixHQUFHO0dBQ0gsV0FBVztHQUNYLDZCQUE2QjtHQUM5QixFQUNGO0VBQ0QsY0FBYztHQUNaLFNBQVMsRUFDUCxZQUFZO0lBQ1YsR0FBRztJQUNILFVBQVUsUUFBUSxJQUFJO0lBQ3ZCLEVBQ0Y7R0FDRCxNQUFNLEVBQ0osWUFBWTtJQUNWLEdBQUc7SUFDSCxVQUFVLFFBQVEsSUFBSTtJQUN2QixFQUNGO0dBQ0Y7RUFDRjtDQUNELEtBQUs7RUFDSCxLQUFLO0VBQ0wsVUFBVTtFQUNWLE9BQU8sRUFDTCxRQUFRLFFBQ1Q7RUFDRjtDQUNELE1BQU07RUFDSixlQUFlO0VBQ2Ysa0JBQWtCLENBQUMsTUFBTSxLQUFLO0VBQy9CO0NBQ0QsTUFBTSxFQUNKLFNBQVMsQ0FBQyxNQUFNLEVBQ2pCO0NBQ0QsTUFBTTtFQUNKLFVBQVU7RUFDVixZQUFZO0VBQ1osV0FBVyxFQUFF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
@@ -0,0 +1,21 @@
1
+ import "./_virtual/_rolldown/runtime.js";
2
+ import { TokenModel } from "./application/token/token.model.js";
3
+ import { getLogger } from "@logtape/logtape";
4
+ import path from "node:path";
5
+ //#region src/startup-migrations.ts
6
+ async function runRequiredMigrations() {
7
+ const log = getLogger(["qgrid", "startup"]);
8
+ try {
9
+ const knex = TokenModel.getDB("w");
10
+ const migrationsDir = path.join(import.meta.dirname, "../src/migrations");
11
+ const [batch, migrations] = await knex.migrate.latest({ directory: migrationsDir });
12
+ if (migrations.length > 0) log.info(`migration: ${migrations.length} applied (batch ${batch})`);
13
+ } catch (error) {
14
+ log.error(`migration failed: ${error.message}`);
15
+ process.exit(1);
16
+ }
17
+ }
18
+ //#endregion
19
+ export { runRequiredMigrations };
20
+
21
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnR1cC1taWdyYXRpb25zLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uL3NyYy9zdGFydHVwLW1pZ3JhdGlvbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuXG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vdG9rZW4vdG9rZW4ubW9kZWxcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1blJlcXVpcmVkTWlncmF0aW9ucygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgbG9nID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwic3RhcnR1cFwiXSk7XG4gIHRyeSB7XG4gICAgY29uc3Qga25leCA9IFRva2VuTW9kZWwuZ2V0REIoXCJ3XCIpO1xuICAgIGNvbnN0IG1pZ3JhdGlvbnNEaXIgPSBwYXRoLmpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLi9zcmMvbWlncmF0aW9uc1wiKTtcbiAgICBjb25zdCBbYmF0Y2gsIG1pZ3JhdGlvbnNdID0gYXdhaXQga25leC5taWdyYXRlLmxhdGVzdCh7IGRpcmVjdG9yeTogbWlncmF0aW9uc0RpciB9KTtcbiAgICBpZiAobWlncmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2cuaW5mbyhgbWlncmF0aW9uOiAke21pZ3JhdGlvbnMubGVuZ3RofSBhcHBsaWVkIChiYXRjaCAke2JhdGNofSlgKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLmVycm9yKGBtaWdyYXRpb24gZmFpbGVkOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFNQSxlQUFzQix3QkFBdUM7Q0FDM0QsTUFBTSxNQUFNLFVBQVUsQ0FBQyxTQUFTLFVBQVUsQ0FBQztBQUMzQyxLQUFJO0VBQ0YsTUFBTSxPQUFPLFdBQVcsTUFBTSxJQUFJO0VBQ2xDLE1BQU0sZ0JBQWdCLEtBQUssS0FBSyxPQUFPLEtBQUssU0FBUyxvQkFBb0I7RUFDekUsTUFBTSxDQUFDLE9BQU8sY0FBYyxNQUFNLEtBQUssUUFBUSxPQUFPLEVBQUUsV0FBVyxlQUFlLENBQUM7QUFDbkYsTUFBSSxXQUFXLFNBQVMsRUFDdEIsS0FBSSxLQUFLLGNBQWMsV0FBVyxPQUFPLGtCQUFrQixNQUFNLEdBQUc7VUFFL0QsT0FBTztBQUNkLE1BQUksTUFBTSxxQkFBc0IsTUFBZ0IsVUFBVTtBQUMxRCxVQUFRLEtBQUssRUFBRSJ9
@@ -1,12 +1,100 @@
1
1
  import "../_virtual/_rolldown/runtime.js";
2
+ import { Client } from "pg";
2
3
  import dotenv from "dotenv";
3
4
  //#region src/testing/global.ts
4
5
  dotenv.config();
5
- async function setup() {
6
- const { setup: sonamuSetup } = await import(new URL("../../node_modules/sonamu/dist/testing/global-setup.js", import.meta.url).href);
7
- return sonamuSetup();
6
+ const MAX_WORKERS = 4;
7
+ const TEMPLATE_DB = process.env.QGRID_TEST_DB_NAME ?? "qgrid_test";
8
+ function quoteIdentifier(value) {
9
+ if (!/^[A-Za-z0-9_]+$/.test(value)) throw new Error(`invalid database identifier: ${value}`);
10
+ return `"${value}"`;
11
+ }
12
+ function workerDatabaseNames(templateDb, maxWorkers) {
13
+ return Array.from({ length: maxWorkers }, (_, index) => `${templateDb}_${index + 1}`);
14
+ }
15
+ async function terminateConnections(client, database) {
16
+ await client.query(`
17
+ SELECT pg_terminate_backend(pid)
18
+ FROM pg_stat_activity
19
+ WHERE datname = $1
20
+ AND pid <> pg_backend_pid()
21
+ `, [database]);
22
+ }
23
+ async function recreateWorkerDatabases(client, templateDb, runDatabase, maxWorkers) {
24
+ const workers = workerDatabaseNames(runDatabase, maxWorkers);
25
+ for (const database of [...workers, templateDb]) await terminateConnections(client, database);
26
+ for (const database of workers) {
27
+ await client.query(`DROP DATABASE IF EXISTS ${quoteIdentifier(database)}`);
28
+ await client.query(`CREATE DATABASE ${quoteIdentifier(database)} TEMPLATE ${quoteIdentifier(templateDb)} STRATEGY FILE_COPY`);
29
+ }
30
+ return workers;
31
+ }
32
+ async function dropWorkerDatabases(client, templateDb, maxWorkers) {
33
+ const errors = [];
34
+ for (const database of workerDatabaseNames(templateDb, maxWorkers)) {
35
+ await terminateConnections(client, database).catch((error) => {
36
+ errors.push(error);
37
+ });
38
+ await client.query(`DROP DATABASE IF EXISTS ${quoteIdentifier(database)}`).catch((error) => {
39
+ errors.push(error);
40
+ });
41
+ }
42
+ if (errors.length > 0) throw new AggregateError(errors, "failed to clean one or more test databases", { cause: errors[0] });
43
+ }
44
+ function createAdminClient() {
45
+ return new Client({
46
+ host: process.env.QGRID_DB_HOST ?? "localhost",
47
+ port: Number(process.env.QGRID_DB_PORT ?? 5432),
48
+ user: process.env.QGRID_DB_USER ?? "postgres",
49
+ password: process.env.QGRID_DB_PASSWORD ?? "postgres",
50
+ database: "postgres",
51
+ application_name: "qgrid-vitest-global-setup"
52
+ });
53
+ }
54
+ function resolveMaxWorkers(project) {
55
+ const maxWorkers = project?.config?.maxWorkers;
56
+ return Number.isInteger(maxWorkers) && maxWorkers !== void 0 && maxWorkers > 0 ? maxWorkers : MAX_WORKERS;
57
+ }
58
+ async function provisionWorkerDatabases(createClient, templateDb, runDatabase, maxWorkers) {
59
+ const client = createClient();
60
+ await client.connect();
61
+ try {
62
+ await recreateWorkerDatabases(client, templateDb, runDatabase, maxWorkers);
63
+ } catch (setupError) {
64
+ await client.end().catch(() => {});
65
+ const cleanupClient = createClient();
66
+ let cleanupError;
67
+ try {
68
+ await cleanupClient.connect();
69
+ await dropWorkerDatabases(cleanupClient, runDatabase, maxWorkers);
70
+ } catch (error) {
71
+ cleanupError = error;
72
+ } finally {
73
+ await cleanupClient.end().catch((error) => {
74
+ cleanupError ??= error;
75
+ });
76
+ }
77
+ if (cleanupError) throw new AggregateError([setupError, cleanupError], "test database setup and cleanup both failed", { cause: setupError });
78
+ throw setupError;
79
+ }
80
+ await client.end();
81
+ }
82
+ async function setup(project) {
83
+ const runDatabase = process.env.QGRID_TEST_RUN_DB;
84
+ if (!runDatabase || process.env.QGRID_DB_NAME !== runDatabase) throw new Error("Vitest test database name was not configured consistently");
85
+ const maxWorkers = resolveMaxWorkers(project);
86
+ await provisionWorkerDatabases(createAdminClient, TEMPLATE_DB, runDatabase, maxWorkers);
87
+ return async () => {
88
+ const teardownClient = createAdminClient();
89
+ await teardownClient.connect();
90
+ try {
91
+ await dropWorkerDatabases(teardownClient, runDatabase, maxWorkers);
92
+ } finally {
93
+ await teardownClient.end();
94
+ }
95
+ };
8
96
  }
9
97
  //#endregion
10
- export { setup };
98
+ export { dropWorkerDatabases, provisionWorkerDatabases, recreateWorkerDatabases, resolveMaxWorkers, setup };
11
99
 
12
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2dsb2JhbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZG90ZW52IGZyb20gXCJkb3RlbnZcIjtcblxuZG90ZW52LmNvbmZpZygpO1xuXG50eXBlIFNvbmFtdUdsb2JhbFNldHVwTW9kdWxlID0ge1xuICBzZXR1cDogKCkgPT4gUHJvbWlzZTwoKCkgPT4gUHJvbWlzZTx2b2lkPikgfCB2b2lkPjtcbn07XG5cbi8vIHNvbmFtdS90ZXN0IOydmCBiYXJyZWwgZXhwb3J0IOuKlCBib290c3RyYXAuanMg66W8IO2VqOq7mCDroZzrk5ztlZjqs6AsIGJvb3RzdHJhcC5qcyDripQgdG9wLWxldmVsIOyXkOyEnFxuLy8gdml0ZXN0IOulvCBpbXBvcnQg7ZWc64ukLiBWaXRlc3QgNCBnbG9iYWxTZXR1cCDsu6jthY3siqTtirjsl5DshJzripQg7J20IGltcG9ydCDqsIAgaW50ZXJuYWwgc3RhdGUg7JeQ65+s66W8XG4vLyDrp4zrk6TquLAg65WM66y47JeQIGdsb2JhbC1zZXR1cC5qcyDrp4wg7KeB7KCRIOuhnOuTnO2VnOuLpC5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cCgpOiBQcm9taXNlPCgoKSA9PiBQcm9taXNlPHZvaWQ+KSB8IHZvaWQ+IHtcbiAgY29uc3QgZ2xvYmFsU2V0dXBVcmwgPSBuZXcgVVJMKFxuICAgIFwiLi4vLi4vbm9kZV9tb2R1bGVzL3NvbmFtdS9kaXN0L3Rlc3RpbmcvZ2xvYmFsLXNldHVwLmpzXCIsXG4gICAgaW1wb3J0Lm1ldGEudXJsLFxuICApO1xuICBjb25zdCB7IHNldHVwOiBzb25hbXVTZXR1cCB9ID0gKGF3YWl0IGltcG9ydChnbG9iYWxTZXR1cFVybC5ocmVmKSkgYXMgU29uYW11R2xvYmFsU2V0dXBNb2R1bGU7XG5cbiAgcmV0dXJuIHNvbmFtdVNldHVwKCk7XG59XG4iXSwibWFwcGluZ3MiOiI7OztBQUVBLE9BQU8sUUFBUTtBQVNmLGVBQXNCLFFBQStDO0NBS25FLE1BQU0sRUFBRSxPQUFPLGdCQUFpQixNQUFNLE9BSmYsSUFBSSxJQUN6QiwwREFDQSxPQUFPLEtBQUssSUFDYixDQUMyRDtBQUU1RCxRQUFPLGFBQWEifQ==
100
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2dsb2JhbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZG90ZW52IGZyb20gXCJkb3RlbnZcIjtcbmltcG9ydCB7IENsaWVudCB9IGZyb20gXCJwZ1wiO1xuXG5kb3RlbnYuY29uZmlnKCk7XG5cbmNvbnN0IE1BWF9XT1JLRVJTID0gNDtcbmNvbnN0IFRFTVBMQVRFX0RCID0gcHJvY2Vzcy5lbnYuUUdSSURfVEVTVF9EQl9OQU1FID8/IFwicWdyaWRfdGVzdFwiO1xuXG50eXBlIFF1ZXJ5Q2xpZW50ID0gUGljazxDbGllbnQsIFwicXVlcnlcIj47XG50eXBlIEFkbWluQ2xpZW50ID0gUGljazxDbGllbnQsIFwiY29ubmVjdFwiIHwgXCJlbmRcIiB8IFwicXVlcnlcIj47XG50eXBlIEFkbWluQ2xpZW50RmFjdG9yeSA9ICgpID0+IEFkbWluQ2xpZW50O1xudHlwZSBWaXRlc3RQcm9qZWN0ID0geyBjb25maWc/OiB7IG1heFdvcmtlcnM/OiBudW1iZXIgfSB9O1xuXG5mdW5jdGlvbiBxdW90ZUlkZW50aWZpZXIodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghL15bQS1aYS16MC05X10rJC8udGVzdCh2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgZGF0YWJhc2UgaWRlbnRpZmllcjogJHt2YWx1ZX1gKTtcbiAgfVxuICByZXR1cm4gYFwiJHt2YWx1ZX1cImA7XG59XG5cbmZ1bmN0aW9uIHdvcmtlckRhdGFiYXNlTmFtZXModGVtcGxhdGVEYjogc3RyaW5nLCBtYXhXb3JrZXJzOiBudW1iZXIpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBtYXhXb3JrZXJzIH0sIChfLCBpbmRleCkgPT4gYCR7dGVtcGxhdGVEYn1fJHtpbmRleCArIDF9YCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlcm1pbmF0ZUNvbm5lY3Rpb25zKGNsaWVudDogUXVlcnlDbGllbnQsIGRhdGFiYXNlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgY2xpZW50LnF1ZXJ5KFxuICAgIGBcbiAgICAgIFNFTEVDVCBwZ190ZXJtaW5hdGVfYmFja2VuZChwaWQpXG4gICAgICBGUk9NIHBnX3N0YXRfYWN0aXZpdHlcbiAgICAgIFdIRVJFIGRhdG5hbWUgPSAkMVxuICAgICAgICBBTkQgcGlkIDw+IHBnX2JhY2tlbmRfcGlkKClcbiAgICBgLFxuICAgIFtkYXRhYmFzZV0sXG4gICk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWNyZWF0ZVdvcmtlckRhdGFiYXNlcyhcbiAgY2xpZW50OiBRdWVyeUNsaWVudCxcbiAgdGVtcGxhdGVEYjogc3RyaW5nLFxuICBydW5EYXRhYmFzZTogc3RyaW5nLFxuICBtYXhXb3JrZXJzOiBudW1iZXIsXG4pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHdvcmtlcnMgPSB3b3JrZXJEYXRhYmFzZU5hbWVzKHJ1bkRhdGFiYXNlLCBtYXhXb3JrZXJzKTtcbiAgZm9yIChjb25zdCBkYXRhYmFzZSBvZiBbLi4ud29ya2VycywgdGVtcGxhdGVEYl0pIHtcbiAgICBhd2FpdCB0ZXJtaW5hdGVDb25uZWN0aW9ucyhjbGllbnQsIGRhdGFiYXNlKTtcbiAgfVxuICBmb3IgKGNvbnN0IGRhdGFiYXNlIG9mIHdvcmtlcnMpIHtcbiAgICBhd2FpdCBjbGllbnQucXVlcnkoYERST1AgREFUQUJBU0UgSUYgRVhJU1RTICR7cXVvdGVJZGVudGlmaWVyKGRhdGFiYXNlKX1gKTtcbiAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICBgQ1JFQVRFIERBVEFCQVNFICR7cXVvdGVJZGVudGlmaWVyKGRhdGFiYXNlKX0gVEVNUExBVEUgJHtxdW90ZUlkZW50aWZpZXIodGVtcGxhdGVEYil9IFNUUkFURUdZIEZJTEVfQ09QWWAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gd29ya2Vycztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRyb3BXb3JrZXJEYXRhYmFzZXMoXG4gIGNsaWVudDogUXVlcnlDbGllbnQsXG4gIHRlbXBsYXRlRGI6IHN0cmluZyxcbiAgbWF4V29ya2VyczogbnVtYmVyLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGVycm9yczogdW5rbm93bltdID0gW107XG4gIGZvciAoY29uc3QgZGF0YWJhc2Ugb2Ygd29ya2VyRGF0YWJhc2VOYW1lcyh0ZW1wbGF0ZURiLCBtYXhXb3JrZXJzKSkge1xuICAgIGF3YWl0IHRlcm1pbmF0ZUNvbm5lY3Rpb25zKGNsaWVudCwgZGF0YWJhc2UpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgIH0pO1xuICAgIGF3YWl0IGNsaWVudC5xdWVyeShgRFJPUCBEQVRBQkFTRSBJRiBFWElTVFMgJHtxdW90ZUlkZW50aWZpZXIoZGF0YWJhc2UpfWApLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgIH0pO1xuICB9XG4gIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGNsZWFudXBFcnJvciA9IG5ldyBBZ2dyZWdhdGVFcnJvcihlcnJvcnMsIFwiZmFpbGVkIHRvIGNsZWFuIG9uZSBvciBtb3JlIHRlc3QgZGF0YWJhc2VzXCIsIHtcbiAgICAgIGNhdXNlOiBlcnJvcnNbMF0sXG4gICAgfSk7XG4gICAgdGhyb3cgY2xlYW51cEVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUFkbWluQ2xpZW50KCk6IENsaWVudCB7XG4gIHJldHVybiBuZXcgQ2xpZW50KHtcbiAgICBob3N0OiBwcm9jZXNzLmVudi5RR1JJRF9EQl9IT1NUID8/IFwibG9jYWxob3N0XCIsXG4gICAgcG9ydDogTnVtYmVyKHByb2Nlc3MuZW52LlFHUklEX0RCX1BPUlQgPz8gNTQzMiksXG4gICAgdXNlcjogcHJvY2Vzcy5lbnYuUUdSSURfREJfVVNFUiA/PyBcInBvc3RncmVzXCIsXG4gICAgcGFzc3dvcmQ6IHByb2Nlc3MuZW52LlFHUklEX0RCX1BBU1NXT1JEID8/IFwicG9zdGdyZXNcIixcbiAgICBkYXRhYmFzZTogXCJwb3N0Z3Jlc1wiLFxuICAgIGFwcGxpY2F0aW9uX25hbWU6IFwicWdyaWQtdml0ZXN0LWdsb2JhbC1zZXR1cFwiLFxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVNYXhXb3JrZXJzKHByb2plY3Q/OiBWaXRlc3RQcm9qZWN0KTogbnVtYmVyIHtcbiAgY29uc3QgbWF4V29ya2VycyA9IHByb2plY3Q/LmNvbmZpZz8ubWF4V29ya2VycztcbiAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIobWF4V29ya2VycykgJiYgbWF4V29ya2VycyAhPT0gdW5kZWZpbmVkICYmIG1heFdvcmtlcnMgPiAwXG4gICAgPyBtYXhXb3JrZXJzXG4gICAgOiBNQVhfV09SS0VSUztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb3Zpc2lvbldvcmtlckRhdGFiYXNlcyhcbiAgY3JlYXRlQ2xpZW50OiBBZG1pbkNsaWVudEZhY3RvcnksXG4gIHRlbXBsYXRlRGI6IHN0cmluZyxcbiAgcnVuRGF0YWJhc2U6IHN0cmluZyxcbiAgbWF4V29ya2VyczogbnVtYmVyLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNsaWVudCA9IGNyZWF0ZUNsaWVudCgpO1xuICBhd2FpdCBjbGllbnQuY29ubmVjdCgpO1xuICB0cnkge1xuICAgIGF3YWl0IHJlY3JlYXRlV29ya2VyRGF0YWJhc2VzKGNsaWVudCwgdGVtcGxhdGVEYiwgcnVuRGF0YWJhc2UsIG1heFdvcmtlcnMpO1xuICB9IGNhdGNoIChzZXR1cEVycm9yKSB7XG4gICAgYXdhaXQgY2xpZW50LmVuZCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICBjb25zdCBjbGVhbnVwQ2xpZW50ID0gY3JlYXRlQ2xpZW50KCk7XG4gICAgbGV0IGNsZWFudXBFcnJvcjogdW5rbm93bjtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2xlYW51cENsaWVudC5jb25uZWN0KCk7XG4gICAgICBhd2FpdCBkcm9wV29ya2VyRGF0YWJhc2VzKGNsZWFudXBDbGllbnQsIHJ1bkRhdGFiYXNlLCBtYXhXb3JrZXJzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY2xlYW51cEVycm9yID0gZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFudXBDbGllbnQuZW5kKCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIGNsZWFudXBFcnJvciA/Pz0gZXJyb3I7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGNsZWFudXBFcnJvcikge1xuICAgICAgY29uc3QgY29tYmluZWRFcnJvciA9IG5ldyBBZ2dyZWdhdGVFcnJvcihcbiAgICAgICAgW3NldHVwRXJyb3IsIGNsZWFudXBFcnJvcl0sXG4gICAgICAgIFwidGVzdCBkYXRhYmFzZSBzZXR1cCBhbmQgY2xlYW51cCBib3RoIGZhaWxlZFwiLFxuICAgICAgICB7IGNhdXNlOiBzZXR1cEVycm9yIH0sXG4gICAgICApO1xuICAgICAgdGhyb3cgY29tYmluZWRFcnJvcjtcbiAgICB9XG4gICAgdGhyb3cgc2V0dXBFcnJvcjtcbiAgfVxuICBhd2FpdCBjbGllbnQuZW5kKCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cChwcm9qZWN0PzogVml0ZXN0UHJvamVjdCk6IFByb21pc2U8KCkgPT4gUHJvbWlzZTx2b2lkPj4ge1xuICBjb25zdCBydW5EYXRhYmFzZSA9IHByb2Nlc3MuZW52LlFHUklEX1RFU1RfUlVOX0RCO1xuICBpZiAoIXJ1bkRhdGFiYXNlIHx8IHByb2Nlc3MuZW52LlFHUklEX0RCX05BTUUgIT09IHJ1bkRhdGFiYXNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVml0ZXN0IHRlc3QgZGF0YWJhc2UgbmFtZSB3YXMgbm90IGNvbmZpZ3VyZWQgY29uc2lzdGVudGx5XCIpO1xuICB9XG4gIGNvbnN0IG1heFdvcmtlcnMgPSByZXNvbHZlTWF4V29ya2Vycyhwcm9qZWN0KTtcbiAgYXdhaXQgcHJvdmlzaW9uV29ya2VyRGF0YWJhc2VzKGNyZWF0ZUFkbWluQ2xpZW50LCBURU1QTEFURV9EQiwgcnVuRGF0YWJhc2UsIG1heFdvcmtlcnMpO1xuXG4gIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGVhcmRvd25DbGllbnQgPSBjcmVhdGVBZG1pbkNsaWVudCgpO1xuICAgIGF3YWl0IHRlYXJkb3duQ2xpZW50LmNvbm5lY3QoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZHJvcFdvcmtlckRhdGFiYXNlcyh0ZWFyZG93bkNsaWVudCwgcnVuRGF0YWJhc2UsIG1heFdvcmtlcnMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0ZWFyZG93bkNsaWVudC5lbmQoKTtcbiAgICB9XG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFHQSxPQUFPLFFBQVE7QUFFZixNQUFNLGNBQWM7QUFDcEIsTUFBTSxjQUFjLFFBQVEsSUFBSSxzQkFBc0I7QUFPdEQsU0FBUyxnQkFBZ0IsT0FBdUI7QUFDOUMsS0FBSSxDQUFDLGtCQUFrQixLQUFLLE1BQU0sQ0FDaEMsT0FBTSxJQUFJLE1BQU0sZ0NBQWdDLFFBQVE7QUFFMUQsUUFBTyxJQUFJLE1BQU07O0FBR25CLFNBQVMsb0JBQW9CLFlBQW9CLFlBQThCO0FBQzdFLFFBQU8sTUFBTSxLQUFLLEVBQUUsUUFBUSxZQUFZLEdBQUcsR0FBRyxVQUFVLEdBQUcsV0FBVyxHQUFHLFFBQVEsSUFBSTs7QUFHdkYsZUFBZSxxQkFBcUIsUUFBcUIsVUFBaUM7QUFDeEYsT0FBTSxPQUFPLE1BQ1g7Ozs7O09BTUEsQ0FBQyxTQUFTLENBQ1g7O0FBR0gsZUFBc0Isd0JBQ3BCLFFBQ0EsWUFDQSxhQUNBLFlBQ21CO0NBQ25CLE1BQU0sVUFBVSxvQkFBb0IsYUFBYSxXQUFXO0FBQzVELE1BQUssTUFBTSxZQUFZLENBQUMsR0FBRyxTQUFTLFdBQVcsQ0FDN0MsT0FBTSxxQkFBcUIs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
@@ -0,0 +1,22 @@
1
+ import "../_virtual/_rolldown/runtime.js";
2
+ import { randomUUID } from "node:crypto";
3
+ //#region src/testing/test-database-name.ts
4
+ let configuredRunDatabase;
5
+ function createTestRunDatabaseName(prefix, entropy) {
6
+ const safePrefix = prefix.replaceAll(/[^A-Za-z0-9_]/g, "_");
7
+ const safeEntropy = entropy.replaceAll(/[^A-Za-z0-9_]/g, "_");
8
+ const maxPrefixLength = 63 - safeEntropy.length - 1;
9
+ return `${safePrefix.slice(0, maxPrefixLength)}_${safeEntropy}`;
10
+ }
11
+ function configureTestRunDatabaseName() {
12
+ if (configuredRunDatabase) return configuredRunDatabase;
13
+ const runDatabase = createTestRunDatabaseName(process.env.QGRID_TEST_RUN_DB ?? "qgrid_test", `${process.pid}_${Date.now().toString(36)}_${randomUUID().slice(0, 8)}`);
14
+ configuredRunDatabase = runDatabase;
15
+ process.env.QGRID_TEST_RUN_DB = runDatabase;
16
+ process.env.QGRID_DB_NAME = runDatabase;
17
+ return runDatabase;
18
+ }
19
+ //#endregion
20
+ export { configureTestRunDatabaseName, createTestRunDatabaseName };
21
+
22
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1kYXRhYmFzZS1uYW1lLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL3Rlc3QtZGF0YWJhc2UtbmFtZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5cbmxldCBjb25maWd1cmVkUnVuRGF0YWJhc2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRlc3RSdW5EYXRhYmFzZU5hbWUocHJlZml4OiBzdHJpbmcsIGVudHJvcHk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHNhZmVQcmVmaXggPSBwcmVmaXgucmVwbGFjZUFsbCgvW15BLVphLXowLTlfXS9nLCBcIl9cIik7XG4gIGNvbnN0IHNhZmVFbnRyb3B5ID0gZW50cm9weS5yZXBsYWNlQWxsKC9bXkEtWmEtejAtOV9dL2csIFwiX1wiKTtcbiAgY29uc3QgbWF4UHJlZml4TGVuZ3RoID0gNjMgLSBzYWZlRW50cm9weS5sZW5ndGggLSAxO1xuICByZXR1cm4gYCR7c2FmZVByZWZpeC5zbGljZSgwLCBtYXhQcmVmaXhMZW5ndGgpfV8ke3NhZmVFbnRyb3B5fWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVUZXN0UnVuRGF0YWJhc2VOYW1lKCk6IHN0cmluZyB7XG4gIGlmIChjb25maWd1cmVkUnVuRGF0YWJhc2UpIHJldHVybiBjb25maWd1cmVkUnVuRGF0YWJhc2U7XG4gIGNvbnN0IHByZWZpeCA9IHByb2Nlc3MuZW52LlFHUklEX1RFU1RfUlVOX0RCID8/IFwicWdyaWRfdGVzdFwiO1xuICBjb25zdCBlbnRyb3B5ID0gYCR7cHJvY2Vzcy5waWR9XyR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9XyR7cmFuZG9tVVVJRCgpLnNsaWNlKDAsIDgpfWA7XG4gIGNvbnN0IHJ1bkRhdGFiYXNlID0gY3JlYXRlVGVzdFJ1bkRhdGFiYXNlTmFtZShwcmVmaXgsIGVudHJvcHkpO1xuICBjb25maWd1cmVkUnVuRGF0YWJhc2UgPSBydW5EYXRhYmFzZTtcbiAgcHJvY2Vzcy5lbnYuUUdSSURfVEVTVF9SVU5fREIgPSBydW5EYXRhYmFzZTtcbiAgcHJvY2Vzcy5lbnYuUUdSSURfREJfTkFNRSA9IHJ1bkRhdGFiYXNlO1xuICByZXR1cm4gcnVuRGF0YWJhc2U7XG59XG4iXSwibWFwcGluZ3MiOiI7OztBQUVBLElBQUk7QUFFSixTQUFnQiwwQkFBMEIsUUFBZ0IsU0FBeUI7Q0FDakYsTUFBTSxhQUFhLE9BQU8sV0FBVyxrQkFBa0IsSUFBSTtDQUMzRCxNQUFNLGNBQWMsUUFBUSxXQUFXLGtCQUFrQixJQUFJO0NBQzdELE1BQU0sa0JBQWtCLEtBQUssWUFBWSxTQUFTO0FBQ2xELFFBQU8sR0FBRyxXQUFXLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHOztBQUdwRCxTQUFnQiwrQkFBdUM7QUFDckQsS0FBSSxzQkFBdUIsUUFBTztDQUdsQyxNQUFNLGNBQWMsMEJBRkwsUUFBUSxJQUFJLHFCQUFxQixjQUNoQyxHQUFHLFFBQVEsSUFBSSxHQUFHLEtBQUssS0FBSyxDQUFDLFNBQVMsR0FBRyxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sR0FBRyxFQUFFLEdBQ3ZCO0FBQzlELHlCQUF3QjtBQUN4QixTQUFRLElBQUksb0JBQW9CO0FBQ2hDLFNBQVEsSUFBSSxnQkFBZ0I7QUFDNUIsUUFBTyJ9