@kyro-cms/core 0.6.0 → 0.7.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.
Files changed (145) hide show
  1. package/dist/api-handler.cjs +75 -35
  2. package/dist/api-handler.cjs.map +1 -1
  3. package/dist/api-handler.d.cts +2 -5
  4. package/dist/api-handler.d.ts +2 -5
  5. package/dist/api-handler.js +75 -36
  6. package/dist/api-handler.js.map +1 -1
  7. package/dist/bootstrap-AKAUP6F6.cjs +32 -0
  8. package/dist/{bootstrap-EE6BJZWL.cjs.map → bootstrap-AKAUP6F6.cjs.map} +1 -1
  9. package/dist/bootstrap-JCML6NFO.js +7 -0
  10. package/dist/{bootstrap-4MH44YKG.js.map → bootstrap-JCML6NFO.js.map} +1 -1
  11. package/dist/{chunk-WVPOPOEQ.cjs → chunk-2KVHZE6O.cjs} +286 -126
  12. package/dist/chunk-2KVHZE6O.cjs.map +1 -0
  13. package/dist/{chunk-RALQO47U.cjs → chunk-2OL4O2TH.cjs} +55 -2
  14. package/dist/chunk-2OL4O2TH.cjs.map +1 -0
  15. package/dist/{chunk-XU7AFF6V.js → chunk-35U3FROB.js} +982 -4
  16. package/dist/chunk-35U3FROB.js.map +1 -0
  17. package/dist/{chunk-WSCJQI2B.js → chunk-3J4MFTI3.js} +27 -11
  18. package/dist/chunk-3J4MFTI3.js.map +1 -0
  19. package/dist/chunk-3ZFYL34R.js +391 -0
  20. package/dist/chunk-3ZFYL34R.js.map +1 -0
  21. package/dist/chunk-4DA7QPLA.cjs +356 -0
  22. package/dist/chunk-4DA7QPLA.cjs.map +1 -0
  23. package/dist/{chunk-TP5YQFIX.js → chunk-57P6MJKC.js} +3 -715
  24. package/dist/chunk-57P6MJKC.js.map +1 -0
  25. package/dist/{chunk-R2YHJN6W.cjs → chunk-5KVM3WEY.cjs} +34 -208
  26. package/dist/chunk-5KVM3WEY.cjs.map +1 -0
  27. package/dist/{chunk-Z2OVHWHB.cjs → chunk-6IMPH6WV.cjs} +28 -11
  28. package/dist/chunk-6IMPH6WV.cjs.map +1 -0
  29. package/dist/{chunk-QKVA2SOG.js → chunk-DXHRBMGB.js} +27 -284
  30. package/dist/chunk-DXHRBMGB.js.map +1 -0
  31. package/dist/{chunk-E3BZLMX6.js → chunk-ES5HNFFT.js} +43 -2
  32. package/dist/chunk-ES5HNFFT.js.map +1 -0
  33. package/dist/{chunk-QYZKIPSD.js → chunk-FXYP2HA6.js} +34 -3
  34. package/dist/chunk-FXYP2HA6.js.map +1 -0
  35. package/dist/chunk-H727JIG7.js +809 -0
  36. package/dist/chunk-H727JIG7.js.map +1 -0
  37. package/dist/{chunk-AM4JKIPP.js → chunk-HXRD4B37.js} +9 -183
  38. package/dist/chunk-HXRD4B37.js.map +1 -0
  39. package/dist/chunk-I7HHI6QV.cjs +816 -0
  40. package/dist/chunk-I7HHI6QV.cjs.map +1 -0
  41. package/dist/{chunk-RDRJVCL5.cjs → chunk-IA6AU5PI.cjs} +2 -720
  42. package/dist/chunk-IA6AU5PI.cjs.map +1 -0
  43. package/dist/{chunk-55BNRTLW.cjs → chunk-LINKCEG4.cjs} +985 -4
  44. package/dist/chunk-LINKCEG4.cjs.map +1 -0
  45. package/dist/{chunk-TVVYZ2TH.js → chunk-OHVB4AJ7.js} +56 -3
  46. package/dist/chunk-OHVB4AJ7.js.map +1 -0
  47. package/dist/{chunk-XAEBVZTI.cjs → chunk-PDYFVNUX.cjs} +26 -289
  48. package/dist/chunk-PDYFVNUX.cjs.map +1 -0
  49. package/dist/{chunk-6WXQRYTW.js → chunk-QPPDLRNR.js} +286 -126
  50. package/dist/chunk-QPPDLRNR.js.map +1 -0
  51. package/dist/{chunk-WBCIEYHC.cjs → chunk-QUW2RZTM.cjs} +35 -4
  52. package/dist/chunk-QUW2RZTM.cjs.map +1 -0
  53. package/dist/chunk-SA7NSSIQ.cjs +397 -0
  54. package/dist/chunk-SA7NSSIQ.cjs.map +1 -0
  55. package/dist/{chunk-H4XCAPA6.cjs → chunk-V3LKPM3O.cjs} +43 -2
  56. package/dist/chunk-V3LKPM3O.cjs.map +1 -0
  57. package/dist/chunk-Y3N7UUDO.js +349 -0
  58. package/dist/chunk-Y3N7UUDO.js.map +1 -0
  59. package/dist/{chunk-S3FG2NY7.js → chunk-Y3QQN7PN.js} +4 -3
  60. package/dist/chunk-Y3QQN7PN.js.map +1 -0
  61. package/dist/{chunk-5HA5OMFH.cjs → chunk-YVUJBEXE.cjs} +7 -6
  62. package/dist/chunk-YVUJBEXE.cjs.map +1 -0
  63. package/dist/cli/index.cjs +103 -20
  64. package/dist/cli/index.cjs.map +1 -1
  65. package/dist/cli/index.js +103 -20
  66. package/dist/cli/index.js.map +1 -1
  67. package/dist/client.d.cts +1 -1
  68. package/dist/client.d.ts +1 -1
  69. package/dist/drizzle/index.cjs +12 -12
  70. package/dist/drizzle/index.d.cts +23 -2
  71. package/dist/drizzle/index.d.ts +23 -2
  72. package/dist/drizzle/index.js +3 -3
  73. package/dist/index.cjs +174 -1054
  74. package/dist/index.cjs.map +1 -1
  75. package/dist/index.d.cts +85 -7
  76. package/dist/index.d.ts +85 -7
  77. package/dist/index.js +91 -980
  78. package/dist/index.js.map +1 -1
  79. package/dist/integration.cjs +2 -2
  80. package/dist/integration.d.cts +3 -16
  81. package/dist/integration.d.ts +3 -16
  82. package/dist/integration.js +1 -1
  83. package/dist/mongo-auth-adapter-NHHUJHVH.cjs +17 -0
  84. package/dist/mongo-auth-adapter-NHHUJHVH.cjs.map +1 -0
  85. package/dist/mongo-auth-adapter-NJQUUCTP.js +4 -0
  86. package/dist/mongo-auth-adapter-NJQUUCTP.js.map +1 -0
  87. package/dist/mongodb/index.cjs +9 -8
  88. package/dist/mongodb/index.d.cts +86 -5
  89. package/dist/mongodb/index.d.ts +86 -5
  90. package/dist/mongodb/index.js +3 -2
  91. package/dist/postgres-auth-adapter-3T2NKTSE.js +5 -0
  92. package/dist/{postgres-auth-adapter-B65BULNS.js.map → postgres-auth-adapter-3T2NKTSE.js.map} +1 -1
  93. package/dist/postgres-auth-adapter-7IEENCKQ.cjs +14 -0
  94. package/dist/{postgres-auth-adapter-6742WDCF.cjs.map → postgres-auth-adapter-7IEENCKQ.cjs.map} +1 -1
  95. package/dist/redis-adapter-D2E2S3GB.cjs +13 -0
  96. package/dist/{redis-adapter-LPUWLE4Y.cjs.map → redis-adapter-D2E2S3GB.cjs.map} +1 -1
  97. package/dist/redis-adapter-VQXD7ESY.js +4 -0
  98. package/dist/{redis-adapter-THYDCGQR.js.map → redis-adapter-VQXD7ESY.js.map} +1 -1
  99. package/dist/rest/index.cjs +10 -8
  100. package/dist/rest/index.js +8 -6
  101. package/dist/sqlite-adapter-LVK5PS4T.cjs +13 -0
  102. package/dist/sqlite-adapter-LVK5PS4T.cjs.map +1 -0
  103. package/dist/sqlite-adapter-TR3U3W6Q.js +4 -0
  104. package/dist/sqlite-adapter-TR3U3W6Q.js.map +1 -0
  105. package/dist/templates/index.cjs +31 -27
  106. package/dist/templates/index.d.cts +8 -5
  107. package/dist/templates/index.d.ts +8 -5
  108. package/dist/templates/index.js +1 -1
  109. package/dist/{base-eVegJ_Pr.d.ts → tenant-B1YB0Jy8.d.ts} +10 -1
  110. package/dist/{base-DvvNqnM-.d.cts → tenant-Cpeveji6.d.cts} +10 -1
  111. package/dist/{types-DqN4ckOC.d.cts → types-D6ZLRGbH.d.cts} +19 -1
  112. package/dist/{types-DqN4ckOC.d.ts → types-D6ZLRGbH.d.ts} +19 -1
  113. package/package.json +56 -9
  114. package/dist/adapter-BSvBudTG.d.cts +0 -65
  115. package/dist/adapter-CXGB2Elb.d.ts +0 -65
  116. package/dist/bootstrap-4MH44YKG.js +0 -6
  117. package/dist/bootstrap-EE6BJZWL.cjs +0 -31
  118. package/dist/chunk-55BNRTLW.cjs.map +0 -1
  119. package/dist/chunk-5HA5OMFH.cjs.map +0 -1
  120. package/dist/chunk-6WXQRYTW.js.map +0 -1
  121. package/dist/chunk-A4USRVTQ.js +0 -115
  122. package/dist/chunk-A4USRVTQ.js.map +0 -1
  123. package/dist/chunk-AM4JKIPP.js.map +0 -1
  124. package/dist/chunk-E3BZLMX6.js.map +0 -1
  125. package/dist/chunk-H4XCAPA6.cjs.map +0 -1
  126. package/dist/chunk-KOCTZKPV.cjs +0 -117
  127. package/dist/chunk-KOCTZKPV.cjs.map +0 -1
  128. package/dist/chunk-QKVA2SOG.js.map +0 -1
  129. package/dist/chunk-QYZKIPSD.js.map +0 -1
  130. package/dist/chunk-R2YHJN6W.cjs.map +0 -1
  131. package/dist/chunk-RALQO47U.cjs.map +0 -1
  132. package/dist/chunk-RDRJVCL5.cjs.map +0 -1
  133. package/dist/chunk-S3FG2NY7.js.map +0 -1
  134. package/dist/chunk-TP5YQFIX.js.map +0 -1
  135. package/dist/chunk-TVVYZ2TH.js.map +0 -1
  136. package/dist/chunk-WBCIEYHC.cjs.map +0 -1
  137. package/dist/chunk-WSCJQI2B.js.map +0 -1
  138. package/dist/chunk-WVPOPOEQ.cjs.map +0 -1
  139. package/dist/chunk-XAEBVZTI.cjs.map +0 -1
  140. package/dist/chunk-XU7AFF6V.js.map +0 -1
  141. package/dist/chunk-Z2OVHWHB.cjs.map +0 -1
  142. package/dist/postgres-auth-adapter-6742WDCF.cjs +0 -14
  143. package/dist/postgres-auth-adapter-B65BULNS.js +0 -5
  144. package/dist/redis-adapter-LPUWLE4Y.cjs +0 -13
  145. package/dist/redis-adapter-THYDCGQR.js +0 -4
@@ -1,23 +1,25 @@
1
1
  'use strict';
2
2
 
3
- var chunk55BNRTLW_cjs = require('./chunk-55BNRTLW.cjs');
4
- var chunk5HA5OMFH_cjs = require('./chunk-5HA5OMFH.cjs');
3
+ var chunkLINKCEG4_cjs = require('./chunk-LINKCEG4.cjs');
4
+ var chunkYVUJBEXE_cjs = require('./chunk-YVUJBEXE.cjs');
5
5
  require('./chunk-K7JPTH3G.cjs');
6
- require('./chunk-R2YHJN6W.cjs');
7
- require('./chunk-RDRJVCL5.cjs');
6
+ require('./chunk-5KVM3WEY.cjs');
7
+ require('./chunk-IA6AU5PI.cjs');
8
8
  require('./chunk-4PWRCMTQ.cjs');
9
+ var chunkI7HHI6QV_cjs = require('./chunk-I7HHI6QV.cjs');
9
10
  require('./chunk-ADLJSJSN.cjs');
10
11
  require('./chunk-IBG6V56E.cjs');
11
12
  require('./chunk-VJT6P4N6.cjs');
12
13
  require('./chunk-R3XIBBAW.cjs');
13
14
  require('./chunk-DVD5P72E.cjs');
14
15
  require('./chunk-3YELQL7Z.cjs');
15
- var chunkWVPOPOEQ_cjs = require('./chunk-WVPOPOEQ.cjs');
16
- var chunkRALQO47U_cjs = require('./chunk-RALQO47U.cjs');
16
+ var chunk2KVHZE6O_cjs = require('./chunk-2KVHZE6O.cjs');
17
+ var chunk2OL4O2TH_cjs = require('./chunk-2OL4O2TH.cjs');
17
18
  require('./chunk-WQBRWOQT.cjs');
18
19
  require('./chunk-MTIRYI7F.cjs');
19
- var chunkXAEBVZTI_cjs = require('./chunk-XAEBVZTI.cjs');
20
- require('./chunk-KOCTZKPV.cjs');
20
+ var chunkPDYFVNUX_cjs = require('./chunk-PDYFVNUX.cjs');
21
+ var chunk4DA7QPLA_cjs = require('./chunk-4DA7QPLA.cjs');
22
+ require('./chunk-SA7NSSIQ.cjs');
21
23
  require('./chunk-G7VZBCD6.cjs');
22
24
  var projectConfig = require('kyro:config');
23
25
 
@@ -26,38 +28,75 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
26
28
  var projectConfig__default = /*#__PURE__*/_interopDefault(projectConfig);
27
29
 
28
30
  var kyroInstance = null;
31
+ var initPromise = null;
32
+ async function doInit() {
33
+ if (kyroInstance) return;
34
+ const config = projectConfig__default.default.default || projectConfig__default.default;
35
+ kyroInstance = chunkLINKCEG4_cjs.createKyro(config);
36
+ await kyroInstance.init();
37
+ await kyroInstance.loadSettings();
38
+ const db = kyroInstance.db;
39
+ let bootstrapAuthAdapter = void 0;
40
+ if (db instanceof chunk2KVHZE6O_cjs.DrizzleAdapter) {
41
+ if (db.dialect === "postgres") {
42
+ bootstrapAuthAdapter = new chunk2OL4O2TH_cjs.PostgresAuthAdapter({ db: db.client });
43
+ } else if (db.dialect === "sqlite") {
44
+ const authDbPath = process.env.KYRO_AUTH_DB_PATH || "./data/auth.db";
45
+ bootstrapAuthAdapter = new chunkI7HHI6QV_cjs.SQLiteAuthAdapter({ path: authDbPath });
46
+ }
47
+ } else if (db instanceof chunkLINKCEG4_cjs.LocalAdapter) {
48
+ const authDbPath = process.env.KYRO_AUTH_DB_PATH || "./data/auth.db";
49
+ bootstrapAuthAdapter = new chunkI7HHI6QV_cjs.SQLiteAuthAdapter({ path: authDbPath });
50
+ } else if (db instanceof chunkPDYFVNUX_cjs.MongoDBAdapter) {
51
+ bootstrapAuthAdapter = new chunk4DA7QPLA_cjs.MongoDBAuthAdapter({ db: db.db });
52
+ }
53
+ if (bootstrapAuthAdapter?.connect) {
54
+ await bootstrapAuthAdapter.connect();
55
+ }
56
+ const result = await chunkYVUJBEXE_cjs.autoBootstrap(bootstrapAuthAdapter);
57
+ if (result?.success) {
58
+ console.log(`[Kyro] Admin user auto-created from env: ${result.user?.email}`);
59
+ } else if (result && !result.success) {
60
+ console.warn(`[Kyro] Admin bootstrap skipped: ${result.error}`);
61
+ }
62
+ console.log("[Kyro API] Backend initialized via Astro Integration");
63
+ }
64
+ async function warmKyroInstance() {
65
+ if (!initPromise) {
66
+ initPromise = doInit();
67
+ }
68
+ await initPromise;
69
+ }
29
70
  var ALL = async (context) => {
30
71
  if (!kyroInstance) {
72
+ if (!initPromise) {
73
+ initPromise = doInit();
74
+ }
75
+ const initializing = new Promise((resolve) => {
76
+ const check = () => {
77
+ if (kyroInstance) {
78
+ resolve();
79
+ } else {
80
+ setTimeout(check, 50);
81
+ }
82
+ };
83
+ check();
84
+ });
85
+ const timeout = new Promise((_, reject) => {
86
+ setTimeout(() => reject(new Error("Initialization timeout")), 3e4);
87
+ });
31
88
  try {
32
- const config = projectConfig__default.default.default || projectConfig__default.default;
33
- kyroInstance = chunk55BNRTLW_cjs.createKyro(config);
34
- await kyroInstance.init();
35
- await kyroInstance.loadSettings();
36
- const db = kyroInstance.db;
37
- let bootstrapAuthAdapter = void 0;
38
- if (db instanceof chunkWVPOPOEQ_cjs.DrizzleAdapter && db.dialect === "postgres") {
39
- bootstrapAuthAdapter = new chunkRALQO47U_cjs.PostgresAuthAdapter({ db: db.client });
40
- } else if (db instanceof chunkXAEBVZTI_cjs.MongoDBAdapter) {
41
- bootstrapAuthAdapter = new chunkXAEBVZTI_cjs.MongoDBAuthAdapter({ db: db.db });
42
- }
43
- if (bootstrapAuthAdapter?.connect) {
44
- await bootstrapAuthAdapter.connect();
45
- }
46
- const result = await chunk5HA5OMFH_cjs.autoBootstrap(bootstrapAuthAdapter);
47
- if (result?.success) {
48
- console.log(`[Kyro] Admin user auto-created from env: ${result.user?.email}`);
49
- } else if (result && !result.success) {
50
- console.warn(`[Kyro] Admin bootstrap skipped: ${result.error}`);
51
- }
52
- console.log("[Kyro API] Backend initialized via Astro Integration");
53
- } catch (err) {
54
- console.error("[Kyro API] Failed to initialize backend:", err);
89
+ await Promise.race([initializing, timeout]);
90
+ } catch {
55
91
  return new Response(JSON.stringify({
56
- error: "Internal Server Error",
57
- message: "Kyro failed to initialize. Check server logs."
92
+ error: "Service Unavailable",
93
+ message: "Kyro CMS is still starting up. Please try again in a moment."
58
94
  }), {
59
- status: 500,
60
- headers: { "Content-Type": "application/json" }
95
+ status: 503,
96
+ headers: {
97
+ "Content-Type": "application/json",
98
+ "Retry-After": "5"
99
+ }
61
100
  });
62
101
  }
63
102
  }
@@ -66,5 +105,6 @@ var ALL = async (context) => {
66
105
  };
67
106
 
68
107
  exports.ALL = ALL;
108
+ exports.warmKyroInstance = warmKyroInstance;
69
109
  //# sourceMappingURL=api-handler.cjs.map
70
110
  //# sourceMappingURL=api-handler.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api-handler.ts"],"names":["projectConfig","createKyro","DrizzleAdapter","PostgresAuthAdapter","MongoDBAdapter","MongoDBAuthAdapter","autoBootstrap"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAUA,IAAI,YAAA,GAAoB,IAAA;AAMjB,IAAM,GAAA,GAAgB,OAAO,OAAA,KAAY;AAG9C,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,IAAI;AAEF,MAAA,MAAM,MAAA,GAASA,+BAAc,OAAA,IAAWA,8BAAA;AAExC,MAAA,YAAA,GAAeC,6BAAW,MAAM,CAAA;AAChC,MAAA,MAAM,aAAa,IAAA,EAAK;AAGxB,MAAA,MAAM,aAAa,YAAA,EAAa;AAGhC,MAAA,MAAM,KAAK,YAAA,CAAa,EAAA;AACxB,MAAA,IAAI,oBAAA,GAA4B,KAAA,CAAA;AAChC,MAAA,IAAI,EAAA,YAAcC,gCAAA,IAAkB,EAAA,CAAG,OAAA,KAAY,UAAA,EAAY;AAC7D,QAAA,oBAAA,GAAuB,IAAIC,qCAAA,CAAoB,EAAE,EAAA,EAAI,EAAA,CAAG,QAAQ,CAAA;AAAA,MAClE,CAAA,MAAA,IAAW,cAAcC,gCAAA,EAAgB;AACvC,QAAA,oBAAA,GAAuB,IAAIC,oCAAA,CAAmB,EAAE,EAAA,EAAI,EAAA,CAAG,IAAI,CAAA;AAAA,MAC7D;AAGA,MAAA,IAAI,sBAAsB,OAAA,EAAS;AACjC,QAAA,MAAM,qBAAqB,OAAA,EAAQ;AAAA,MACrC;AAGA,MAAA,MAAM,MAAA,GAAS,MAAMC,+BAAA,CAAc,oBAAoB,CAAA;AACvD,MAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,yCAAA,EAA4C,MAAA,CAAO,IAAA,EAAM,KAAK,CAAA,CAAE,CAAA;AAAA,MAC9E,CAAA,MAAA,IAAW,MAAA,IAAU,CAAC,MAAA,CAAO,OAAA,EAAS;AACpC,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,gCAAA,EAAmC,MAAA,CAAO,KAAK,CAAA,CAAE,CAAA;AAAA,MAChE;AAEA,MAAA,OAAA,CAAQ,IAAI,sDAAsD,CAAA;AAAA,IACpE,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,4CAA4C,GAAG,CAAA;AAC7D,MAAA,OAAO,IAAI,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU;AAAA,QACjC,KAAA,EAAO,uBAAA;AAAA,QACP,OAAA,EAAS;AAAA,OACV,CAAA,EAAG;AAAA,QACF,MAAA,EAAQ,GAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA;AAAmB,OAC/C,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,MAAM,GAAA,GAAM,aAAa,OAAA,EAAQ;AAIjC,EAAA,OAAO,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS,QAAQ,MAAM,CAAA;AAClD","file":"api-handler.cjs","sourcesContent":["import type { APIRoute } from \"astro\";\nimport { createKyro } from \"./createKyro.js\";\nimport { autoBootstrap } from \"./auth/bootstrap.js\";\nimport { DrizzleAdapter } from \"./database/drizzle/adapter.js\";\nimport { PostgresAuthAdapter } from \"./database/drizzle/postgres-auth-adapter.js\";\nimport { MongoDBAdapter } from \"./database/mongodb/adapter.js\";\nimport { MongoDBAuthAdapter } from \"./database/mongodb/mongo-auth-adapter.js\";\n// @ts-ignore - handled by vite alias\nimport projectConfig from \"kyro:config\";\n\nlet kyroInstance: any = null;\n\n/**\n * Global API Handler for Astro\n * This file is injected into the host project at /api/kyro/[...path]\n */\nexport const ALL: APIRoute = async (context) => {\n // Lazy initialize Kyro instance to ensure it only happens on the server\n // and persists across requests in the same container/process.\n if (!kyroInstance) {\n try {\n // Normalize config if it's a default export\n const config = projectConfig.default || projectConfig;\n \n kyroInstance = createKyro(config);\n await kyroInstance.init();\n \n // Pre-load settings\n await kyroInstance.loadSettings();\n\n // Detect the right auth adapter for auto-bootstrap and table creation\n const db = kyroInstance.db;\n let bootstrapAuthAdapter: any = undefined;\n if (db instanceof DrizzleAdapter && db.dialect === \"postgres\") {\n bootstrapAuthAdapter = new PostgresAuthAdapter({ db: db.client });\n } else if (db instanceof MongoDBAdapter) {\n bootstrapAuthAdapter = new MongoDBAuthAdapter({ db: db.db });\n }\n\n // Ensure auth tables/collections exist (connect creates them if missing)\n if (bootstrapAuthAdapter?.connect) {\n await bootstrapAuthAdapter.connect();\n }\n\n // Auto-bootstrap admin user from env vars if no users exist\n const result = await autoBootstrap(bootstrapAuthAdapter);\n if (result?.success) {\n console.log(`[Kyro] Admin user auto-created from env: ${result.user?.email}`);\n } else if (result && !result.success) {\n console.warn(`[Kyro] Admin bootstrap skipped: ${result.error}`);\n }\n \n console.log(\"[Kyro API] Backend initialized via Astro Integration\");\n } catch (err) {\n console.error(\"[Kyro API] Failed to initialize backend:\", err);\n return new Response(JSON.stringify({ \n error: \"Internal Server Error\", \n message: \"Kyro failed to initialize. Check server logs.\" \n }), {\n status: 500,\n headers: { \"Content-Type\": \"application/json\" }\n });\n }\n }\n\n // Get the REST (Hono) app\n const app = kyroInstance.getREST();\n \n // Hono's fetch method handles the web-standard Request and returns a Response.\n // We pass context.locals to allow Hono middleware to access Astro-level data if needed.\n return app.fetch(context.request, context.locals);\n};\n"]}
1
+ {"version":3,"sources":["../src/api-handler.ts"],"names":["projectConfig","createKyro","DrizzleAdapter","PostgresAuthAdapter","SQLiteAuthAdapter","LocalAdapter","MongoDBAdapter","MongoDBAuthAdapter","autoBootstrap"],"mappings":"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","file":"api-handler.cjs","sourcesContent":["import type { APIRoute } from \"astro\";\nimport { createKyro } from \"./createKyro.js\";\nimport { autoBootstrap } from \"./auth/bootstrap.js\";\nimport { DrizzleAdapter } from \"./database/drizzle/adapter.js\";\nimport { PostgresAuthAdapter } from \"./database/drizzle/postgres-auth-adapter.js\";\nimport { LocalAdapter } from \"./database/local/adapter.js\";\nimport { SQLiteAuthAdapter } from \"./auth/sqlite-adapter.js\";\nimport { MongoDBAdapter } from \"./database/mongodb/adapter.js\";\nimport { MongoDBAuthAdapter } from \"./database/mongodb/mongo-auth-adapter.js\";\n// @ts-ignore - handled by vite alias\nimport projectConfig from \"kyro:config\";\n\nlet kyroInstance: any = null;\nlet initPromise: Promise<void> | null = null;\n\nasync function doInit(): Promise<void> {\n if (kyroInstance) return;\n\n const config = projectConfig.default || projectConfig;\n kyroInstance = createKyro(config);\n await kyroInstance.init();\n await kyroInstance.loadSettings();\n\n const db = kyroInstance.db;\n let bootstrapAuthAdapter: any = undefined;\n \n if (db instanceof DrizzleAdapter) {\n if (db.dialect === \"postgres\") {\n bootstrapAuthAdapter = new PostgresAuthAdapter({ db: db.client });\n } else if (db.dialect === \"sqlite\") {\n const authDbPath = process.env.KYRO_AUTH_DB_PATH || \"./data/auth.db\";\n bootstrapAuthAdapter = new SQLiteAuthAdapter({ path: authDbPath });\n }\n } else if (db instanceof LocalAdapter) {\n const authDbPath = process.env.KYRO_AUTH_DB_PATH || \"./data/auth.db\";\n bootstrapAuthAdapter = new SQLiteAuthAdapter({ path: authDbPath });\n } else if (db instanceof MongoDBAdapter) {\n bootstrapAuthAdapter = new MongoDBAuthAdapter({ db: db.db });\n }\n\n if (bootstrapAuthAdapter?.connect) {\n await bootstrapAuthAdapter.connect();\n }\n\n const result = await autoBootstrap(bootstrapAuthAdapter);\n if (result?.success) {\n console.log(`[Kyro] Admin user auto-created from env: ${result.user?.email}`);\n } else if (result && !result.success) {\n console.warn(`[Kyro] Admin bootstrap skipped: ${result.error}`);\n }\n\n console.log(\"[Kyro API] Backend initialized via Astro Integration\");\n}\n\nexport async function warmKyroInstance(): Promise<void> {\n if (!initPromise) {\n initPromise = doInit();\n }\n await initPromise;\n}\n\nexport const ALL: APIRoute = async (context) => {\n if (!kyroInstance) {\n if (!initPromise) {\n initPromise = doInit();\n }\n\n const initializing = new Promise<void>((resolve) => {\n const check = () => {\n if (kyroInstance) {\n resolve();\n } else {\n setTimeout(check, 50);\n }\n };\n check();\n });\n\n const timeout = new Promise<void>((_, reject) => {\n setTimeout(() => reject(new Error(\"Initialization timeout\")), 30000);\n });\n\n try {\n await Promise.race([initializing, timeout]);\n } catch {\n return new Response(JSON.stringify({\n error: \"Service Unavailable\",\n message: \"Kyro CMS is still starting up. Please try again in a moment.\",\n }), {\n status: 503,\n headers: {\n \"Content-Type\": \"application/json\",\n \"Retry-After\": \"5\",\n },\n });\n }\n }\n\n const app = kyroInstance.getREST();\n return app.fetch(context.request, context.locals);\n};\n"]}
@@ -1,9 +1,6 @@
1
1
  import { APIRoute } from 'astro';
2
2
 
3
- /**
4
- * Global API Handler for Astro
5
- * This file is injected into the host project at /api/kyro/[...path]
6
- */
3
+ declare function warmKyroInstance(): Promise<void>;
7
4
  declare const ALL: APIRoute;
8
5
 
9
- export { ALL };
6
+ export { ALL, warmKyroInstance };
@@ -1,9 +1,6 @@
1
1
  import { APIRoute } from 'astro';
2
2
 
3
- /**
4
- * Global API Handler for Astro
5
- * This file is injected into the host project at /api/kyro/[...path]
6
- */
3
+ declare function warmKyroInstance(): Promise<void>;
7
4
  declare const ALL: APIRoute;
8
5
 
9
- export { ALL };
6
+ export { ALL, warmKyroInstance };
@@ -1,57 +1,96 @@
1
- import { createKyro } from './chunk-XU7AFF6V.js';
2
- import { autoBootstrap } from './chunk-S3FG2NY7.js';
1
+ import { createKyro, LocalAdapter } from './chunk-35U3FROB.js';
2
+ import { autoBootstrap } from './chunk-Y3QQN7PN.js';
3
3
  import './chunk-3AJE4SEG.js';
4
- import './chunk-AM4JKIPP.js';
5
- import './chunk-TP5YQFIX.js';
4
+ import './chunk-HXRD4B37.js';
5
+ import './chunk-57P6MJKC.js';
6
6
  import './chunk-YT7HXXVN.js';
7
+ import { SQLiteAuthAdapter } from './chunk-H727JIG7.js';
7
8
  import './chunk-P2YW545G.js';
8
9
  import './chunk-QXIQWPAP.js';
9
10
  import './chunk-REK7AYOC.js';
10
11
  import './chunk-SDMNUYVU.js';
11
12
  import './chunk-3TPQ2BU6.js';
12
13
  import './chunk-QU2RFFH4.js';
13
- import { DrizzleAdapter } from './chunk-6WXQRYTW.js';
14
- import { PostgresAuthAdapter } from './chunk-TVVYZ2TH.js';
14
+ import { DrizzleAdapter } from './chunk-QPPDLRNR.js';
15
+ import { PostgresAuthAdapter } from './chunk-OHVB4AJ7.js';
15
16
  import './chunk-WOWUL7ZY.js';
16
17
  import './chunk-GTGRLD4Y.js';
17
- import { MongoDBAdapter, MongoDBAuthAdapter } from './chunk-QKVA2SOG.js';
18
- import './chunk-A4USRVTQ.js';
18
+ import { MongoDBAdapter } from './chunk-DXHRBMGB.js';
19
+ import { MongoDBAuthAdapter } from './chunk-Y3N7UUDO.js';
20
+ import './chunk-3ZFYL34R.js';
19
21
  import './chunk-Z6ZWNWWR.js';
20
22
  import projectConfig from 'kyro:config';
21
23
 
22
24
  var kyroInstance = null;
25
+ var initPromise = null;
26
+ async function doInit() {
27
+ if (kyroInstance) return;
28
+ const config = projectConfig.default || projectConfig;
29
+ kyroInstance = createKyro(config);
30
+ await kyroInstance.init();
31
+ await kyroInstance.loadSettings();
32
+ const db = kyroInstance.db;
33
+ let bootstrapAuthAdapter = void 0;
34
+ if (db instanceof DrizzleAdapter) {
35
+ if (db.dialect === "postgres") {
36
+ bootstrapAuthAdapter = new PostgresAuthAdapter({ db: db.client });
37
+ } else if (db.dialect === "sqlite") {
38
+ const authDbPath = process.env.KYRO_AUTH_DB_PATH || "./data/auth.db";
39
+ bootstrapAuthAdapter = new SQLiteAuthAdapter({ path: authDbPath });
40
+ }
41
+ } else if (db instanceof LocalAdapter) {
42
+ const authDbPath = process.env.KYRO_AUTH_DB_PATH || "./data/auth.db";
43
+ bootstrapAuthAdapter = new SQLiteAuthAdapter({ path: authDbPath });
44
+ } else if (db instanceof MongoDBAdapter) {
45
+ bootstrapAuthAdapter = new MongoDBAuthAdapter({ db: db.db });
46
+ }
47
+ if (bootstrapAuthAdapter?.connect) {
48
+ await bootstrapAuthAdapter.connect();
49
+ }
50
+ const result = await autoBootstrap(bootstrapAuthAdapter);
51
+ if (result?.success) {
52
+ console.log(`[Kyro] Admin user auto-created from env: ${result.user?.email}`);
53
+ } else if (result && !result.success) {
54
+ console.warn(`[Kyro] Admin bootstrap skipped: ${result.error}`);
55
+ }
56
+ console.log("[Kyro API] Backend initialized via Astro Integration");
57
+ }
58
+ async function warmKyroInstance() {
59
+ if (!initPromise) {
60
+ initPromise = doInit();
61
+ }
62
+ await initPromise;
63
+ }
23
64
  var ALL = async (context) => {
24
65
  if (!kyroInstance) {
66
+ if (!initPromise) {
67
+ initPromise = doInit();
68
+ }
69
+ const initializing = new Promise((resolve) => {
70
+ const check = () => {
71
+ if (kyroInstance) {
72
+ resolve();
73
+ } else {
74
+ setTimeout(check, 50);
75
+ }
76
+ };
77
+ check();
78
+ });
79
+ const timeout = new Promise((_, reject) => {
80
+ setTimeout(() => reject(new Error("Initialization timeout")), 3e4);
81
+ });
25
82
  try {
26
- const config = projectConfig.default || projectConfig;
27
- kyroInstance = createKyro(config);
28
- await kyroInstance.init();
29
- await kyroInstance.loadSettings();
30
- const db = kyroInstance.db;
31
- let bootstrapAuthAdapter = void 0;
32
- if (db instanceof DrizzleAdapter && db.dialect === "postgres") {
33
- bootstrapAuthAdapter = new PostgresAuthAdapter({ db: db.client });
34
- } else if (db instanceof MongoDBAdapter) {
35
- bootstrapAuthAdapter = new MongoDBAuthAdapter({ db: db.db });
36
- }
37
- if (bootstrapAuthAdapter?.connect) {
38
- await bootstrapAuthAdapter.connect();
39
- }
40
- const result = await autoBootstrap(bootstrapAuthAdapter);
41
- if (result?.success) {
42
- console.log(`[Kyro] Admin user auto-created from env: ${result.user?.email}`);
43
- } else if (result && !result.success) {
44
- console.warn(`[Kyro] Admin bootstrap skipped: ${result.error}`);
45
- }
46
- console.log("[Kyro API] Backend initialized via Astro Integration");
47
- } catch (err) {
48
- console.error("[Kyro API] Failed to initialize backend:", err);
83
+ await Promise.race([initializing, timeout]);
84
+ } catch {
49
85
  return new Response(JSON.stringify({
50
- error: "Internal Server Error",
51
- message: "Kyro failed to initialize. Check server logs."
86
+ error: "Service Unavailable",
87
+ message: "Kyro CMS is still starting up. Please try again in a moment."
52
88
  }), {
53
- status: 500,
54
- headers: { "Content-Type": "application/json" }
89
+ status: 503,
90
+ headers: {
91
+ "Content-Type": "application/json",
92
+ "Retry-After": "5"
93
+ }
55
94
  });
56
95
  }
57
96
  }
@@ -59,6 +98,6 @@ var ALL = async (context) => {
59
98
  return app.fetch(context.request, context.locals);
60
99
  };
61
100
 
62
- export { ALL };
101
+ export { ALL, warmKyroInstance };
63
102
  //# sourceMappingURL=api-handler.js.map
64
103
  //# sourceMappingURL=api-handler.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api-handler.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAUA,IAAI,YAAA,GAAoB,IAAA;AAMjB,IAAM,GAAA,GAAgB,OAAO,OAAA,KAAY;AAG9C,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,IAAI;AAEF,MAAA,MAAM,MAAA,GAAS,cAAc,OAAA,IAAW,aAAA;AAExC,MAAA,YAAA,GAAe,WAAW,MAAM,CAAA;AAChC,MAAA,MAAM,aAAa,IAAA,EAAK;AAGxB,MAAA,MAAM,aAAa,YAAA,EAAa;AAGhC,MAAA,MAAM,KAAK,YAAA,CAAa,EAAA;AACxB,MAAA,IAAI,oBAAA,GAA4B,KAAA,CAAA;AAChC,MAAA,IAAI,EAAA,YAAc,cAAA,IAAkB,EAAA,CAAG,OAAA,KAAY,UAAA,EAAY;AAC7D,QAAA,oBAAA,GAAuB,IAAI,mBAAA,CAAoB,EAAE,EAAA,EAAI,EAAA,CAAG,QAAQ,CAAA;AAAA,MAClE,CAAA,MAAA,IAAW,cAAc,cAAA,EAAgB;AACvC,QAAA,oBAAA,GAAuB,IAAI,kBAAA,CAAmB,EAAE,EAAA,EAAI,EAAA,CAAG,IAAI,CAAA;AAAA,MAC7D;AAGA,MAAA,IAAI,sBAAsB,OAAA,EAAS;AACjC,QAAA,MAAM,qBAAqB,OAAA,EAAQ;AAAA,MACrC;AAGA,MAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,oBAAoB,CAAA;AACvD,MAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,yCAAA,EAA4C,MAAA,CAAO,IAAA,EAAM,KAAK,CAAA,CAAE,CAAA;AAAA,MAC9E,CAAA,MAAA,IAAW,MAAA,IAAU,CAAC,MAAA,CAAO,OAAA,EAAS;AACpC,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,gCAAA,EAAmC,MAAA,CAAO,KAAK,CAAA,CAAE,CAAA;AAAA,MAChE;AAEA,MAAA,OAAA,CAAQ,IAAI,sDAAsD,CAAA;AAAA,IACpE,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,4CAA4C,GAAG,CAAA;AAC7D,MAAA,OAAO,IAAI,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU;AAAA,QACjC,KAAA,EAAO,uBAAA;AAAA,QACP,OAAA,EAAS;AAAA,OACV,CAAA,EAAG;AAAA,QACF,MAAA,EAAQ,GAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA;AAAmB,OAC/C,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,MAAM,GAAA,GAAM,aAAa,OAAA,EAAQ;AAIjC,EAAA,OAAO,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS,QAAQ,MAAM,CAAA;AAClD","file":"api-handler.js","sourcesContent":["import type { APIRoute } from \"astro\";\nimport { createKyro } from \"./createKyro.js\";\nimport { autoBootstrap } from \"./auth/bootstrap.js\";\nimport { DrizzleAdapter } from \"./database/drizzle/adapter.js\";\nimport { PostgresAuthAdapter } from \"./database/drizzle/postgres-auth-adapter.js\";\nimport { MongoDBAdapter } from \"./database/mongodb/adapter.js\";\nimport { MongoDBAuthAdapter } from \"./database/mongodb/mongo-auth-adapter.js\";\n// @ts-ignore - handled by vite alias\nimport projectConfig from \"kyro:config\";\n\nlet kyroInstance: any = null;\n\n/**\n * Global API Handler for Astro\n * This file is injected into the host project at /api/kyro/[...path]\n */\nexport const ALL: APIRoute = async (context) => {\n // Lazy initialize Kyro instance to ensure it only happens on the server\n // and persists across requests in the same container/process.\n if (!kyroInstance) {\n try {\n // Normalize config if it's a default export\n const config = projectConfig.default || projectConfig;\n \n kyroInstance = createKyro(config);\n await kyroInstance.init();\n \n // Pre-load settings\n await kyroInstance.loadSettings();\n\n // Detect the right auth adapter for auto-bootstrap and table creation\n const db = kyroInstance.db;\n let bootstrapAuthAdapter: any = undefined;\n if (db instanceof DrizzleAdapter && db.dialect === \"postgres\") {\n bootstrapAuthAdapter = new PostgresAuthAdapter({ db: db.client });\n } else if (db instanceof MongoDBAdapter) {\n bootstrapAuthAdapter = new MongoDBAuthAdapter({ db: db.db });\n }\n\n // Ensure auth tables/collections exist (connect creates them if missing)\n if (bootstrapAuthAdapter?.connect) {\n await bootstrapAuthAdapter.connect();\n }\n\n // Auto-bootstrap admin user from env vars if no users exist\n const result = await autoBootstrap(bootstrapAuthAdapter);\n if (result?.success) {\n console.log(`[Kyro] Admin user auto-created from env: ${result.user?.email}`);\n } else if (result && !result.success) {\n console.warn(`[Kyro] Admin bootstrap skipped: ${result.error}`);\n }\n \n console.log(\"[Kyro API] Backend initialized via Astro Integration\");\n } catch (err) {\n console.error(\"[Kyro API] Failed to initialize backend:\", err);\n return new Response(JSON.stringify({ \n error: \"Internal Server Error\", \n message: \"Kyro failed to initialize. Check server logs.\" \n }), {\n status: 500,\n headers: { \"Content-Type\": \"application/json\" }\n });\n }\n }\n\n // Get the REST (Hono) app\n const app = kyroInstance.getREST();\n \n // Hono's fetch method handles the web-standard Request and returns a Response.\n // We pass context.locals to allow Hono middleware to access Astro-level data if needed.\n return app.fetch(context.request, context.locals);\n};\n"]}
1
+ {"version":3,"sources":["../src/api-handler.ts"],"names":[],"mappings":"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","file":"api-handler.js","sourcesContent":["import type { APIRoute } from \"astro\";\nimport { createKyro } from \"./createKyro.js\";\nimport { autoBootstrap } from \"./auth/bootstrap.js\";\nimport { DrizzleAdapter } from \"./database/drizzle/adapter.js\";\nimport { PostgresAuthAdapter } from \"./database/drizzle/postgres-auth-adapter.js\";\nimport { LocalAdapter } from \"./database/local/adapter.js\";\nimport { SQLiteAuthAdapter } from \"./auth/sqlite-adapter.js\";\nimport { MongoDBAdapter } from \"./database/mongodb/adapter.js\";\nimport { MongoDBAuthAdapter } from \"./database/mongodb/mongo-auth-adapter.js\";\n// @ts-ignore - handled by vite alias\nimport projectConfig from \"kyro:config\";\n\nlet kyroInstance: any = null;\nlet initPromise: Promise<void> | null = null;\n\nasync function doInit(): Promise<void> {\n if (kyroInstance) return;\n\n const config = projectConfig.default || projectConfig;\n kyroInstance = createKyro(config);\n await kyroInstance.init();\n await kyroInstance.loadSettings();\n\n const db = kyroInstance.db;\n let bootstrapAuthAdapter: any = undefined;\n \n if (db instanceof DrizzleAdapter) {\n if (db.dialect === \"postgres\") {\n bootstrapAuthAdapter = new PostgresAuthAdapter({ db: db.client });\n } else if (db.dialect === \"sqlite\") {\n const authDbPath = process.env.KYRO_AUTH_DB_PATH || \"./data/auth.db\";\n bootstrapAuthAdapter = new SQLiteAuthAdapter({ path: authDbPath });\n }\n } else if (db instanceof LocalAdapter) {\n const authDbPath = process.env.KYRO_AUTH_DB_PATH || \"./data/auth.db\";\n bootstrapAuthAdapter = new SQLiteAuthAdapter({ path: authDbPath });\n } else if (db instanceof MongoDBAdapter) {\n bootstrapAuthAdapter = new MongoDBAuthAdapter({ db: db.db });\n }\n\n if (bootstrapAuthAdapter?.connect) {\n await bootstrapAuthAdapter.connect();\n }\n\n const result = await autoBootstrap(bootstrapAuthAdapter);\n if (result?.success) {\n console.log(`[Kyro] Admin user auto-created from env: ${result.user?.email}`);\n } else if (result && !result.success) {\n console.warn(`[Kyro] Admin bootstrap skipped: ${result.error}`);\n }\n\n console.log(\"[Kyro API] Backend initialized via Astro Integration\");\n}\n\nexport async function warmKyroInstance(): Promise<void> {\n if (!initPromise) {\n initPromise = doInit();\n }\n await initPromise;\n}\n\nexport const ALL: APIRoute = async (context) => {\n if (!kyroInstance) {\n if (!initPromise) {\n initPromise = doInit();\n }\n\n const initializing = new Promise<void>((resolve) => {\n const check = () => {\n if (kyroInstance) {\n resolve();\n } else {\n setTimeout(check, 50);\n }\n };\n check();\n });\n\n const timeout = new Promise<void>((_, reject) => {\n setTimeout(() => reject(new Error(\"Initialization timeout\")), 30000);\n });\n\n try {\n await Promise.race([initializing, timeout]);\n } catch {\n return new Response(JSON.stringify({\n error: \"Service Unavailable\",\n message: \"Kyro CMS is still starting up. Please try again in a moment.\",\n }), {\n status: 503,\n headers: {\n \"Content-Type\": \"application/json\",\n \"Retry-After\": \"5\",\n },\n });\n }\n }\n\n const app = kyroInstance.getREST();\n return app.fetch(context.request, context.locals);\n};\n"]}
@@ -0,0 +1,32 @@
1
+ 'use strict';
2
+
3
+ var chunkYVUJBEXE_cjs = require('./chunk-YVUJBEXE.cjs');
4
+ require('./chunk-IA6AU5PI.cjs');
5
+ require('./chunk-4PWRCMTQ.cjs');
6
+ require('./chunk-I7HHI6QV.cjs');
7
+ require('./chunk-G7VZBCD6.cjs');
8
+
9
+
10
+
11
+ Object.defineProperty(exports, "autoBootstrap", {
12
+ enumerable: true,
13
+ get: function () { return chunkYVUJBEXE_cjs.autoBootstrap; }
14
+ });
15
+ Object.defineProperty(exports, "bootstrapAdmin", {
16
+ enumerable: true,
17
+ get: function () { return chunkYVUJBEXE_cjs.bootstrapAdmin; }
18
+ });
19
+ Object.defineProperty(exports, "bootstrapWithRetry", {
20
+ enumerable: true,
21
+ get: function () { return chunkYVUJBEXE_cjs.bootstrapWithRetry; }
22
+ });
23
+ Object.defineProperty(exports, "checkBootstrapRequired", {
24
+ enumerable: true,
25
+ get: function () { return chunkYVUJBEXE_cjs.checkBootstrapRequired; }
26
+ });
27
+ Object.defineProperty(exports, "getBootstrapFromEnv", {
28
+ enumerable: true,
29
+ get: function () { return chunkYVUJBEXE_cjs.getBootstrapFromEnv; }
30
+ });
31
+ //# sourceMappingURL=bootstrap-AKAUP6F6.cjs.map
32
+ //# sourceMappingURL=bootstrap-AKAUP6F6.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"bootstrap-EE6BJZWL.cjs"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"bootstrap-AKAUP6F6.cjs"}
@@ -0,0 +1,7 @@
1
+ export { autoBootstrap, bootstrapAdmin, bootstrapWithRetry, checkBootstrapRequired, getBootstrapFromEnv } from './chunk-Y3QQN7PN.js';
2
+ import './chunk-57P6MJKC.js';
3
+ import './chunk-YT7HXXVN.js';
4
+ import './chunk-H727JIG7.js';
5
+ import './chunk-Z6ZWNWWR.js';
6
+ //# sourceMappingURL=bootstrap-JCML6NFO.js.map
7
+ //# sourceMappingURL=bootstrap-JCML6NFO.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"bootstrap-4MH44YKG.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"bootstrap-JCML6NFO.js"}