@kyro-cms/core 0.9.7 → 0.9.9

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 (101) hide show
  1. package/dist/{WebhookService-BKszZlG0.d.cts → WebhookService-Dj8pJ3sp.d.cts} +1 -1
  2. package/dist/{WebhookService-Ccf1j-IN.d.ts → WebhookService-DpRB940h.d.ts} +1 -1
  3. package/dist/api-handler-graphql.cjs +18 -13
  4. package/dist/api-handler-graphql.cjs.map +1 -1
  5. package/dist/api-handler-graphql.js +14 -9
  6. package/dist/api-handler-graphql.js.map +1 -1
  7. package/dist/api-handler-trpc.cjs +9 -9
  8. package/dist/api-handler-trpc.js +7 -7
  9. package/dist/api-handler.cjs +10 -10
  10. package/dist/api-handler.js +7 -7
  11. package/dist/{base-CIuXkrH4.d.cts → base-BjyoF6da.d.cts} +2 -2
  12. package/dist/{base-fFo4lqER.d.ts → base-C2YR8lWt.d.ts} +2 -2
  13. package/dist/{chunk-NZEUU7QB.js → chunk-3AKCVYDB.js} +4 -109
  14. package/dist/chunk-3AKCVYDB.js.map +1 -0
  15. package/dist/{chunk-FKKQUMXR.cjs → chunk-4OCMVGEY.cjs} +4 -110
  16. package/dist/chunk-4OCMVGEY.cjs.map +1 -0
  17. package/dist/{chunk-VLK5SJRI.js → chunk-5RFGYEQ3.js} +133 -46
  18. package/dist/chunk-5RFGYEQ3.js.map +1 -0
  19. package/dist/chunk-5RPRLTTN.js +861 -0
  20. package/dist/chunk-5RPRLTTN.js.map +1 -0
  21. package/dist/{chunk-AX2TZRQJ.js → chunk-BVUDFKKS.js} +16 -3
  22. package/dist/chunk-BVUDFKKS.js.map +1 -0
  23. package/dist/{chunk-DRVOUQMT.cjs → chunk-E4JZ73FY.cjs} +54 -79
  24. package/dist/chunk-E4JZ73FY.cjs.map +1 -0
  25. package/dist/{chunk-E5UJBLQ7.js → chunk-FIAMXNTH.js} +2 -2
  26. package/dist/chunk-FIAMXNTH.js.map +1 -0
  27. package/dist/{chunk-QVJNSAQL.cjs → chunk-IEIHABVR.cjs} +152 -65
  28. package/dist/chunk-IEIHABVR.cjs.map +1 -0
  29. package/dist/{chunk-QFLB4EIJ.cjs → chunk-LNTFRAHF.cjs} +118 -9
  30. package/dist/chunk-LNTFRAHF.cjs.map +1 -0
  31. package/dist/chunk-N4GN6Q3V.cjs +869 -0
  32. package/dist/chunk-N4GN6Q3V.cjs.map +1 -0
  33. package/dist/{chunk-FSKONGCX.cjs → chunk-OJ2AM75W.cjs} +2 -2
  34. package/dist/chunk-OJ2AM75W.cjs.map +1 -0
  35. package/dist/{chunk-QX3WNQ7V.js → chunk-OX6GOIPH.js} +4 -4
  36. package/dist/{chunk-QX3WNQ7V.js.map → chunk-OX6GOIPH.js.map} +1 -1
  37. package/dist/{chunk-OZ3CCTTA.cjs → chunk-OXYSOU6Z.cjs} +18 -5
  38. package/dist/chunk-OXYSOU6Z.cjs.map +1 -0
  39. package/dist/{chunk-CMXVTUYV.js → chunk-OYCICW4B.js} +38 -63
  40. package/dist/chunk-OYCICW4B.js.map +1 -0
  41. package/dist/{chunk-HVCUIII2.cjs → chunk-TQG7G7YI.cjs} +13 -13
  42. package/dist/{chunk-HVCUIII2.cjs.map → chunk-TQG7G7YI.cjs.map} +1 -1
  43. package/dist/{chunk-3UK5XBVJ.js → chunk-WDTTHKDS.js} +117 -10
  44. package/dist/chunk-WDTTHKDS.js.map +1 -0
  45. package/dist/cli/index.cjs +148 -14
  46. package/dist/cli/index.cjs.map +1 -1
  47. package/dist/cli/index.js +148 -14
  48. package/dist/cli/index.js.map +1 -1
  49. package/dist/client.cjs +3 -3
  50. package/dist/client.d.cts +2 -2
  51. package/dist/client.d.ts +2 -2
  52. package/dist/client.js +1 -1
  53. package/dist/drizzle/index.d.cts +3 -3
  54. package/dist/drizzle/index.d.ts +3 -3
  55. package/dist/fields/index.cjs +21 -21
  56. package/dist/fields/index.d.cts +1 -1
  57. package/dist/fields/index.d.ts +1 -1
  58. package/dist/fields/index.js +1 -1
  59. package/dist/graphql/index.cjs +13 -5
  60. package/dist/graphql/index.d.cts +37 -7
  61. package/dist/graphql/index.d.ts +37 -7
  62. package/dist/graphql/index.js +2 -2
  63. package/dist/{index-BKta3cBH.d.cts → index-DHbywDs-.d.cts} +2 -2
  64. package/dist/{index-ClOqnkTO.d.ts → index-jLs0zlft.d.ts} +2 -2
  65. package/dist/index.cjs +90 -90
  66. package/dist/index.d.cts +15 -14
  67. package/dist/index.d.ts +15 -14
  68. package/dist/index.js +8 -8
  69. package/dist/mongodb/index.d.cts +3 -3
  70. package/dist/mongodb/index.d.ts +3 -3
  71. package/dist/rest/index.cjs +5 -5
  72. package/dist/rest/index.d.cts +4 -4
  73. package/dist/rest/index.d.ts +4 -4
  74. package/dist/rest/index.js +3 -3
  75. package/dist/templates/index.d.cts +2 -2
  76. package/dist/templates/index.d.ts +2 -2
  77. package/dist/trpc/index.cjs +12 -12
  78. package/dist/trpc/index.d.cts +3 -3
  79. package/dist/trpc/index.d.ts +3 -3
  80. package/dist/trpc/index.js +3 -3
  81. package/dist/{types-Dgzlftb7.d.ts → types-BzH3_rtP.d.ts} +7 -7
  82. package/dist/{types-Ds0tCA3L.d.cts → types-CY_iNunL.d.cts} +7 -7
  83. package/dist/{types-DeSApf9T.d.ts → types-C_rVxU2T.d.cts} +4 -4
  84. package/dist/{types-DeSApf9T.d.cts → types-C_rVxU2T.d.ts} +4 -4
  85. package/package.json +2 -1
  86. package/dist/chunk-3UK5XBVJ.js.map +0 -1
  87. package/dist/chunk-AX2TZRQJ.js.map +0 -1
  88. package/dist/chunk-CMXVTUYV.js.map +0 -1
  89. package/dist/chunk-DRVOUQMT.cjs.map +0 -1
  90. package/dist/chunk-E5UJBLQ7.js.map +0 -1
  91. package/dist/chunk-FKKQUMXR.cjs.map +0 -1
  92. package/dist/chunk-FSKONGCX.cjs.map +0 -1
  93. package/dist/chunk-NZEUU7QB.js.map +0 -1
  94. package/dist/chunk-OZ3CCTTA.cjs.map +0 -1
  95. package/dist/chunk-PONTBXR5.js +0 -842
  96. package/dist/chunk-PONTBXR5.js.map +0 -1
  97. package/dist/chunk-QFLB4EIJ.cjs.map +0 -1
  98. package/dist/chunk-QVJNSAQL.cjs.map +0 -1
  99. package/dist/chunk-RRKCIAPU.cjs +0 -848
  100. package/dist/chunk-RRKCIAPU.cjs.map +0 -1
  101. package/dist/chunk-VLK5SJRI.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { B as BaseAdapter } from './types-Ds0tCA3L.cjs';
1
+ import { B as BaseAdapter } from './types-CY_iNunL.cjs';
2
2
 
3
3
  declare const WEBHOOK_EVENTS: {
4
4
  readonly COLLECTION_CREATE: "collection.create";
@@ -1,4 +1,4 @@
1
- import { B as BaseAdapter } from './types-Dgzlftb7.js';
1
+ import { B as BaseAdapter } from './types-BzH3_rtP.js';
2
2
 
3
3
  declare const WEBHOOK_EVENTS: {
4
4
  readonly COLLECTION_CREATE: "collection.create";
@@ -1,19 +1,19 @@
1
1
  'use strict';
2
2
 
3
- var chunkOZ3CCTTA_cjs = require('./chunk-OZ3CCTTA.cjs');
4
- require('./chunk-DRVOUQMT.cjs');
3
+ var chunkOXYSOU6Z_cjs = require('./chunk-OXYSOU6Z.cjs');
4
+ require('./chunk-E4JZ73FY.cjs');
5
5
  require('./chunk-5PMQQFRE.cjs');
6
6
  require('./chunk-3KTWGODI.cjs');
7
- require('./chunk-HVCUIII2.cjs');
8
- require('./chunk-RRKCIAPU.cjs');
9
- require('./chunk-QVJNSAQL.cjs');
7
+ require('./chunk-TQG7G7YI.cjs');
8
+ require('./chunk-N4GN6Q3V.cjs');
9
+ require('./chunk-IEIHABVR.cjs');
10
10
  require('./chunk-Y7AQK4R4.cjs');
11
11
  require('./chunk-4PWRCMTQ.cjs');
12
12
  require('./chunk-KC2GDBLS.cjs');
13
13
  require('./chunk-IDVRRRAK.cjs');
14
14
  require('./chunk-ADLJSJSN.cjs');
15
- require('./chunk-QFLB4EIJ.cjs');
16
- require('./chunk-FKKQUMXR.cjs');
15
+ require('./chunk-LNTFRAHF.cjs');
16
+ require('./chunk-4OCMVGEY.cjs');
17
17
  require('./chunk-EEJUFDMF.cjs');
18
18
  require('./chunk-3YELQL7Z.cjs');
19
19
  require('./chunk-RFFSZSCL.cjs');
@@ -27,15 +27,20 @@ require('./chunk-NKPKR5BW.cjs');
27
27
  require('./chunk-CZLDE2OZ.cjs');
28
28
 
29
29
  // src/api-handler-graphql.ts
30
+ function toNativeResponse(r) {
31
+ return new Response(r.body, r);
32
+ }
30
33
  var POST = async (context) => {
31
- await chunkOZ3CCTTA_cjs.warmKyroInstance();
32
- const app = chunkOZ3CCTTA_cjs.kyroInstance.getGraphQL();
33
- return app.fetch(context.request, context.locals);
34
+ await chunkOXYSOU6Z_cjs.warmKyroInstance();
35
+ const app = chunkOXYSOU6Z_cjs.kyroInstance.getGraphQL();
36
+ const res = await app.fetch(context.request, context.locals);
37
+ return toNativeResponse(res);
34
38
  };
35
39
  var GET = async (context) => {
36
- await chunkOZ3CCTTA_cjs.warmKyroInstance();
37
- const app = chunkOZ3CCTTA_cjs.kyroInstance.getGraphQL();
38
- return app.fetch(context.request, context.locals);
40
+ await chunkOXYSOU6Z_cjs.warmKyroInstance();
41
+ const app = chunkOXYSOU6Z_cjs.kyroInstance.getGraphQL();
42
+ const res = await app.fetch(context.request, context.locals);
43
+ return toNativeResponse(res);
39
44
  };
40
45
 
41
46
  exports.GET = GET;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api-handler-graphql.ts"],"names":["warmKyroInstance","kyroInstance"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGO,IAAM,IAAA,GAAiB,OAAO,OAAA,KAAY;AAC/C,EAAA,MAAMA,kCAAA,EAAiB;AACvB,EAAA,MAAM,GAAA,GAAMC,+BAAc,UAAA,EAAW;AACrC,EAAA,OAAO,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS,QAAQ,MAAM,CAAA;AAClD;AAEO,IAAM,GAAA,GAAgB,OAAO,OAAA,KAAY;AAC9C,EAAA,MAAMD,kCAAA,EAAiB;AACvB,EAAA,MAAM,GAAA,GAAMC,+BAAc,UAAA,EAAW;AACrC,EAAA,OAAO,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS,QAAQ,MAAM,CAAA;AAClD","file":"api-handler-graphql.cjs","sourcesContent":["import type { APIRoute } from \"astro\";\nimport { warmKyroInstance, kyroInstance } from \"./api-handler.js\";\n\nexport const POST: APIRoute = async (context) => {\n await warmKyroInstance();\n const app = kyroInstance!.getGraphQL();\n return app.fetch(context.request, context.locals);\n};\n\nexport const GET: APIRoute = async (context) => {\n await warmKyroInstance();\n const app = kyroInstance!.getGraphQL();\n return app.fetch(context.request, context.locals);\n};\n"]}
1
+ {"version":3,"sources":["../src/api-handler-graphql.ts"],"names":["warmKyroInstance","kyroInstance"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,SAAS,iBAAiB,CAAA,EAAuB;AAC/C,EAAA,OAAO,IAAI,QAAA,CAAS,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA;AAC/B;AAEO,IAAM,IAAA,GAAiB,OAAO,OAAA,KAAY;AAC/C,EAAA,MAAMA,kCAAA,EAAiB;AACvB,EAAA,MAAM,GAAA,GAAMC,+BAAc,UAAA,EAAW;AACrC,EAAA,MAAM,MAAM,MAAM,GAAA,CAAI,MAAM,OAAA,CAAQ,OAAA,EAAS,QAAQ,MAAM,CAAA;AAC3D,EAAA,OAAO,iBAAiB,GAAG,CAAA;AAC7B;AAEO,IAAM,GAAA,GAAgB,OAAO,OAAA,KAAY;AAC9C,EAAA,MAAMD,kCAAA,EAAiB;AACvB,EAAA,MAAM,GAAA,GAAMC,+BAAc,UAAA,EAAW;AACrC,EAAA,MAAM,MAAM,MAAM,GAAA,CAAI,MAAM,OAAA,CAAQ,OAAA,EAAS,QAAQ,MAAM,CAAA;AAC3D,EAAA,OAAO,iBAAiB,GAAG,CAAA;AAC7B","file":"api-handler-graphql.cjs","sourcesContent":["import type { APIRoute } from \"astro\";\nimport { warmKyroInstance, kyroInstance } from \"./api-handler.js\";\n\nfunction toNativeResponse(r: Response): Response {\n return new Response(r.body, r);\n}\n\nexport const POST: APIRoute = async (context) => {\n await warmKyroInstance();\n const app = kyroInstance!.getGraphQL();\n const res = await app.fetch(context.request, context.locals);\n return toNativeResponse(res);\n};\n\nexport const GET: APIRoute = async (context) => {\n await warmKyroInstance();\n const app = kyroInstance!.getGraphQL();\n const res = await app.fetch(context.request, context.locals);\n return toNativeResponse(res);\n};\n"]}
@@ -1,17 +1,17 @@
1
- import { warmKyroInstance, kyroInstance } from './chunk-AX2TZRQJ.js';
2
- import './chunk-CMXVTUYV.js';
1
+ import { warmKyroInstance, kyroInstance } from './chunk-BVUDFKKS.js';
2
+ import './chunk-OYCICW4B.js';
3
3
  import './chunk-GAAHG2Z4.js';
4
4
  import './chunk-GAOXD3XT.js';
5
- import './chunk-QX3WNQ7V.js';
6
- import './chunk-PONTBXR5.js';
7
- import './chunk-VLK5SJRI.js';
5
+ import './chunk-OX6GOIPH.js';
6
+ import './chunk-5RPRLTTN.js';
7
+ import './chunk-5RFGYEQ3.js';
8
8
  import './chunk-6UNONDW7.js';
9
9
  import './chunk-YT7HXXVN.js';
10
10
  import './chunk-XEB7PH2E.js';
11
11
  import './chunk-Q72BOAPK.js';
12
12
  import './chunk-P2YW545G.js';
13
- import './chunk-3UK5XBVJ.js';
14
- import './chunk-NZEUU7QB.js';
13
+ import './chunk-WDTTHKDS.js';
14
+ import './chunk-3AKCVYDB.js';
15
15
  import './chunk-BYBMTIMT.js';
16
16
  import './chunk-QU2RFFH4.js';
17
17
  import './chunk-V7KZQIZ6.js';
@@ -25,15 +25,20 @@ import './chunk-L4EZKIEX.js';
25
25
  import './chunk-4CV4JOE5.js';
26
26
 
27
27
  // src/api-handler-graphql.ts
28
+ function toNativeResponse(r) {
29
+ return new Response(r.body, r);
30
+ }
28
31
  var POST = async (context) => {
29
32
  await warmKyroInstance();
30
33
  const app = kyroInstance.getGraphQL();
31
- return app.fetch(context.request, context.locals);
34
+ const res = await app.fetch(context.request, context.locals);
35
+ return toNativeResponse(res);
32
36
  };
33
37
  var GET = async (context) => {
34
38
  await warmKyroInstance();
35
39
  const app = kyroInstance.getGraphQL();
36
- return app.fetch(context.request, context.locals);
40
+ const res = await app.fetch(context.request, context.locals);
41
+ return toNativeResponse(res);
37
42
  };
38
43
 
39
44
  export { GET, POST };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api-handler-graphql.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAGO,IAAM,IAAA,GAAiB,OAAO,OAAA,KAAY;AAC/C,EAAA,MAAM,gBAAA,EAAiB;AACvB,EAAA,MAAM,GAAA,GAAM,aAAc,UAAA,EAAW;AACrC,EAAA,OAAO,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS,QAAQ,MAAM,CAAA;AAClD;AAEO,IAAM,GAAA,GAAgB,OAAO,OAAA,KAAY;AAC9C,EAAA,MAAM,gBAAA,EAAiB;AACvB,EAAA,MAAM,GAAA,GAAM,aAAc,UAAA,EAAW;AACrC,EAAA,OAAO,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS,QAAQ,MAAM,CAAA;AAClD","file":"api-handler-graphql.js","sourcesContent":["import type { APIRoute } from \"astro\";\nimport { warmKyroInstance, kyroInstance } from \"./api-handler.js\";\n\nexport const POST: APIRoute = async (context) => {\n await warmKyroInstance();\n const app = kyroInstance!.getGraphQL();\n return app.fetch(context.request, context.locals);\n};\n\nexport const GET: APIRoute = async (context) => {\n await warmKyroInstance();\n const app = kyroInstance!.getGraphQL();\n return app.fetch(context.request, context.locals);\n};\n"]}
1
+ {"version":3,"sources":["../src/api-handler-graphql.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,SAAS,iBAAiB,CAAA,EAAuB;AAC/C,EAAA,OAAO,IAAI,QAAA,CAAS,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA;AAC/B;AAEO,IAAM,IAAA,GAAiB,OAAO,OAAA,KAAY;AAC/C,EAAA,MAAM,gBAAA,EAAiB;AACvB,EAAA,MAAM,GAAA,GAAM,aAAc,UAAA,EAAW;AACrC,EAAA,MAAM,MAAM,MAAM,GAAA,CAAI,MAAM,OAAA,CAAQ,OAAA,EAAS,QAAQ,MAAM,CAAA;AAC3D,EAAA,OAAO,iBAAiB,GAAG,CAAA;AAC7B;AAEO,IAAM,GAAA,GAAgB,OAAO,OAAA,KAAY;AAC9C,EAAA,MAAM,gBAAA,EAAiB;AACvB,EAAA,MAAM,GAAA,GAAM,aAAc,UAAA,EAAW;AACrC,EAAA,MAAM,MAAM,MAAM,GAAA,CAAI,MAAM,OAAA,CAAQ,OAAA,EAAS,QAAQ,MAAM,CAAA;AAC3D,EAAA,OAAO,iBAAiB,GAAG,CAAA;AAC7B","file":"api-handler-graphql.js","sourcesContent":["import type { APIRoute } from \"astro\";\nimport { warmKyroInstance, kyroInstance } from \"./api-handler.js\";\n\nfunction toNativeResponse(r: Response): Response {\n return new Response(r.body, r);\n}\n\nexport const POST: APIRoute = async (context) => {\n await warmKyroInstance();\n const app = kyroInstance!.getGraphQL();\n const res = await app.fetch(context.request, context.locals);\n return toNativeResponse(res);\n};\n\nexport const GET: APIRoute = async (context) => {\n await warmKyroInstance();\n const app = kyroInstance!.getGraphQL();\n const res = await app.fetch(context.request, context.locals);\n return toNativeResponse(res);\n};\n"]}
@@ -1,19 +1,19 @@
1
1
  'use strict';
2
2
 
3
- var chunkOZ3CCTTA_cjs = require('./chunk-OZ3CCTTA.cjs');
4
- require('./chunk-DRVOUQMT.cjs');
3
+ var chunkOXYSOU6Z_cjs = require('./chunk-OXYSOU6Z.cjs');
4
+ require('./chunk-E4JZ73FY.cjs');
5
5
  require('./chunk-5PMQQFRE.cjs');
6
6
  require('./chunk-3KTWGODI.cjs');
7
- require('./chunk-HVCUIII2.cjs');
8
- require('./chunk-RRKCIAPU.cjs');
9
- require('./chunk-QVJNSAQL.cjs');
7
+ require('./chunk-TQG7G7YI.cjs');
8
+ require('./chunk-N4GN6Q3V.cjs');
9
+ require('./chunk-IEIHABVR.cjs');
10
10
  require('./chunk-Y7AQK4R4.cjs');
11
11
  require('./chunk-4PWRCMTQ.cjs');
12
12
  require('./chunk-KC2GDBLS.cjs');
13
13
  require('./chunk-IDVRRRAK.cjs');
14
14
  require('./chunk-ADLJSJSN.cjs');
15
- require('./chunk-QFLB4EIJ.cjs');
16
- require('./chunk-FKKQUMXR.cjs');
15
+ require('./chunk-LNTFRAHF.cjs');
16
+ require('./chunk-4OCMVGEY.cjs');
17
17
  require('./chunk-EEJUFDMF.cjs');
18
18
  require('./chunk-3YELQL7Z.cjs');
19
19
  require('./chunk-RFFSZSCL.cjs');
@@ -28,8 +28,8 @@ require('./chunk-CZLDE2OZ.cjs');
28
28
 
29
29
  // src/api-handler-trpc.ts
30
30
  var ALL = async (context) => {
31
- await chunkOZ3CCTTA_cjs.warmKyroInstance();
32
- const app = chunkOZ3CCTTA_cjs.kyroInstance.getTRPC();
31
+ await chunkOXYSOU6Z_cjs.warmKyroInstance();
32
+ const app = chunkOXYSOU6Z_cjs.kyroInstance.getTRPC();
33
33
  return app.fetch(context.request, context.locals);
34
34
  };
35
35
 
@@ -1,17 +1,17 @@
1
- import { warmKyroInstance, kyroInstance } from './chunk-AX2TZRQJ.js';
2
- import './chunk-CMXVTUYV.js';
1
+ import { warmKyroInstance, kyroInstance } from './chunk-BVUDFKKS.js';
2
+ import './chunk-OYCICW4B.js';
3
3
  import './chunk-GAAHG2Z4.js';
4
4
  import './chunk-GAOXD3XT.js';
5
- import './chunk-QX3WNQ7V.js';
6
- import './chunk-PONTBXR5.js';
7
- import './chunk-VLK5SJRI.js';
5
+ import './chunk-OX6GOIPH.js';
6
+ import './chunk-5RPRLTTN.js';
7
+ import './chunk-5RFGYEQ3.js';
8
8
  import './chunk-6UNONDW7.js';
9
9
  import './chunk-YT7HXXVN.js';
10
10
  import './chunk-XEB7PH2E.js';
11
11
  import './chunk-Q72BOAPK.js';
12
12
  import './chunk-P2YW545G.js';
13
- import './chunk-3UK5XBVJ.js';
14
- import './chunk-NZEUU7QB.js';
13
+ import './chunk-WDTTHKDS.js';
14
+ import './chunk-3AKCVYDB.js';
15
15
  import './chunk-BYBMTIMT.js';
16
16
  import './chunk-QU2RFFH4.js';
17
17
  import './chunk-V7KZQIZ6.js';
@@ -1,19 +1,19 @@
1
1
  'use strict';
2
2
 
3
- var chunkOZ3CCTTA_cjs = require('./chunk-OZ3CCTTA.cjs');
4
- require('./chunk-DRVOUQMT.cjs');
3
+ var chunkOXYSOU6Z_cjs = require('./chunk-OXYSOU6Z.cjs');
4
+ require('./chunk-E4JZ73FY.cjs');
5
5
  require('./chunk-5PMQQFRE.cjs');
6
6
  require('./chunk-3KTWGODI.cjs');
7
- require('./chunk-HVCUIII2.cjs');
8
- require('./chunk-RRKCIAPU.cjs');
9
- require('./chunk-QVJNSAQL.cjs');
7
+ require('./chunk-TQG7G7YI.cjs');
8
+ require('./chunk-N4GN6Q3V.cjs');
9
+ require('./chunk-IEIHABVR.cjs');
10
10
  require('./chunk-Y7AQK4R4.cjs');
11
11
  require('./chunk-4PWRCMTQ.cjs');
12
12
  require('./chunk-KC2GDBLS.cjs');
13
13
  require('./chunk-IDVRRRAK.cjs');
14
14
  require('./chunk-ADLJSJSN.cjs');
15
- require('./chunk-QFLB4EIJ.cjs');
16
- require('./chunk-FKKQUMXR.cjs');
15
+ require('./chunk-LNTFRAHF.cjs');
16
+ require('./chunk-4OCMVGEY.cjs');
17
17
  require('./chunk-EEJUFDMF.cjs');
18
18
  require('./chunk-3YELQL7Z.cjs');
19
19
  require('./chunk-RFFSZSCL.cjs');
@@ -30,15 +30,15 @@ require('./chunk-CZLDE2OZ.cjs');
30
30
 
31
31
  Object.defineProperty(exports, "ALL", {
32
32
  enumerable: true,
33
- get: function () { return chunkOZ3CCTTA_cjs.ALL; }
33
+ get: function () { return chunkOXYSOU6Z_cjs.ALL; }
34
34
  });
35
35
  Object.defineProperty(exports, "kyroInstance", {
36
36
  enumerable: true,
37
- get: function () { return chunkOZ3CCTTA_cjs.kyroInstance; }
37
+ get: function () { return chunkOXYSOU6Z_cjs.kyroInstance; }
38
38
  });
39
39
  Object.defineProperty(exports, "warmKyroInstance", {
40
40
  enumerable: true,
41
- get: function () { return chunkOZ3CCTTA_cjs.warmKyroInstance; }
41
+ get: function () { return chunkOXYSOU6Z_cjs.warmKyroInstance; }
42
42
  });
43
43
  //# sourceMappingURL=api-handler.cjs.map
44
44
  //# sourceMappingURL=api-handler.cjs.map
@@ -1,17 +1,17 @@
1
- export { ALL, kyroInstance, warmKyroInstance } from './chunk-AX2TZRQJ.js';
2
- import './chunk-CMXVTUYV.js';
1
+ export { ALL, kyroInstance, warmKyroInstance } from './chunk-BVUDFKKS.js';
2
+ import './chunk-OYCICW4B.js';
3
3
  import './chunk-GAAHG2Z4.js';
4
4
  import './chunk-GAOXD3XT.js';
5
- import './chunk-QX3WNQ7V.js';
6
- import './chunk-PONTBXR5.js';
7
- import './chunk-VLK5SJRI.js';
5
+ import './chunk-OX6GOIPH.js';
6
+ import './chunk-5RPRLTTN.js';
7
+ import './chunk-5RFGYEQ3.js';
8
8
  import './chunk-6UNONDW7.js';
9
9
  import './chunk-YT7HXXVN.js';
10
10
  import './chunk-XEB7PH2E.js';
11
11
  import './chunk-Q72BOAPK.js';
12
12
  import './chunk-P2YW545G.js';
13
- import './chunk-3UK5XBVJ.js';
14
- import './chunk-NZEUU7QB.js';
13
+ import './chunk-WDTTHKDS.js';
14
+ import './chunk-3AKCVYDB.js';
15
15
  import './chunk-BYBMTIMT.js';
16
16
  import './chunk-QU2RFFH4.js';
17
17
  import './chunk-V7KZQIZ6.js';
@@ -1,5 +1,5 @@
1
- import { B as BaseAdapter, C as CollectionConfig, G as GlobalConfig, T as TenantContext, F as FindArgs, b as FindResult, c as FindByIDArgs, d as CreateArgs, e as UpdateArgs, D as DeleteArgs, f as FindVersionsArgs, g as VersionRecord, h as CreateVersionArgs } from './types-Ds0tCA3L.cjs';
2
- import { F as Field, k as RelationshipField, U as UploadField } from './types-DeSApf9T.cjs';
1
+ import { B as BaseAdapter, C as CollectionConfig, G as GlobalConfig, T as TenantContext, F as FindArgs, b as FindResult, c as FindByIDArgs, d as CreateArgs, e as UpdateArgs, D as DeleteArgs, f as FindVersionsArgs, g as VersionRecord, h as CreateVersionArgs } from './types-CY_iNunL.cjs';
2
+ import { F as Field, k as RelationshipField, U as UploadField } from './types-C_rVxU2T.cjs';
3
3
 
4
4
  declare abstract class AbstractBaseAdapter implements BaseAdapter {
5
5
  protected collections: Map<string, CollectionConfig>;
@@ -1,5 +1,5 @@
1
- import { B as BaseAdapter, C as CollectionConfig, G as GlobalConfig, T as TenantContext, F as FindArgs, b as FindResult, c as FindByIDArgs, d as CreateArgs, e as UpdateArgs, D as DeleteArgs, f as FindVersionsArgs, g as VersionRecord, h as CreateVersionArgs } from './types-Dgzlftb7.js';
2
- import { F as Field, k as RelationshipField, U as UploadField } from './types-DeSApf9T.js';
1
+ import { B as BaseAdapter, C as CollectionConfig, G as GlobalConfig, T as TenantContext, F as FindArgs, b as FindResult, c as FindByIDArgs, d as CreateArgs, e as UpdateArgs, D as DeleteArgs, f as FindVersionsArgs, g as VersionRecord, h as CreateVersionArgs } from './types-BzH3_rtP.js';
2
+ import { F as Field, k as RelationshipField, U as UploadField } from './types-C_rVxU2T.js';
3
3
 
4
4
  declare abstract class AbstractBaseAdapter implements BaseAdapter {
5
5
  protected collections: Map<string, CollectionConfig>;
@@ -1,4 +1,3 @@
1
- import { hasPermission } from './chunk-L4EZKIEX.js';
2
1
  import { timingSafeEqual } from 'crypto';
3
2
 
4
3
  // src/access/types.ts
@@ -27,7 +26,7 @@ function getWhereClause(access, args) {
27
26
  return result;
28
27
  });
29
28
  }
30
- var API_KEY_COLLECTION = "_api_keys";
29
+ var API_KEY_COLLECTION = "api_keys";
31
30
  function generateKeyPrefix(key) {
32
31
  return key.substring(0, 8);
33
32
  }
@@ -158,110 +157,6 @@ function generateApiKeyPrefix(key) {
158
157
  return key.substring(0, 8);
159
158
  }
160
159
 
161
- // src/access/checker.ts
162
- function actionToPermission(operation) {
163
- if (operation === "read") return "read";
164
- if (operation === "create") return "create";
165
- if (operation === "update") return "update";
166
- return "delete";
167
- }
168
- function isDefaultAllowed(operation, defaultAccess) {
169
- const levels = {
170
- none: false,
171
- read: operation === "read",
172
- create: operation === "read" || operation === "create",
173
- update: operation === "read" || operation === "create" || operation === "update",
174
- delete: operation === "read" || operation === "create" || operation === "update" || operation === "delete",
175
- admin: true
176
- };
177
- return levels[defaultAccess] || false;
178
- }
179
- async function checkCollectionAccess(config, operation, context, options = {}) {
180
- const { user, req, tenantID, apiKey } = context;
181
- const { enablePublicAccess = true, defaultAccess = "none" } = options;
182
- const accessRule = config.access?.[operation];
183
- if (accessRule) {
184
- const allowed = await evaluateAccess(accessRule, {
185
- req,
186
- user,
187
- tenantID
188
- });
189
- if (allowed === false) {
190
- return { allowed: false, error: "Access denied", status: 403 };
191
- }
192
- if (typeof allowed === "object") {
193
- return { allowed: true, extraWhere: allowed };
194
- }
195
- return { allowed: true };
196
- }
197
- if (apiKey?.permissions?.length > 0) {
198
- const resource = config.slug;
199
- const action = actionToPermission(operation);
200
- const permission = `${resource}:${action}`;
201
- if (!hasApiKeyPermission(apiKey.permissions, permission) && !hasApiKeyPermission(apiKey.permissions, `${resource}:admin`)) {
202
- return { allowed: false, error: "Access denied: insufficient permissions", status: 403 };
203
- }
204
- return { allowed: true };
205
- }
206
- if (user) {
207
- const resource = config.slug;
208
- const action = actionToPermission(operation);
209
- const permission = `${resource}:${action}`;
210
- const userHas = hasPermission(
211
- { id: user.id, email: user.email, role: user.role },
212
- permission
213
- );
214
- const adminHas = hasPermission(
215
- { id: user.id, email: user.email, role: user.role },
216
- `${resource}:admin`
217
- );
218
- if (userHas || adminHas) {
219
- return { allowed: true };
220
- }
221
- return { allowed: false, error: "Access denied: missing RBAC permission", status: 403 };
222
- }
223
- const defaultAllowed = isDefaultAllowed(operation, defaultAccess);
224
- if (enablePublicAccess && defaultAllowed) {
225
- return { allowed: true };
226
- }
227
- return { allowed: false, error: "Authentication required", status: 401 };
228
- }
229
- async function checkGlobalAccess(config, operation, context, options = {}) {
230
- const { user, req, tenantID } = context;
231
- const { enablePublicAccess = true } = options;
232
- const accessRule = config.access?.[operation];
233
- if (accessRule) {
234
- const allowed = await evaluateAccess(accessRule, {
235
- req,
236
- user,
237
- tenantID
238
- });
239
- if (allowed === false) {
240
- return { allowed: false, error: "Access denied", status: 403 };
241
- }
242
- return { allowed: true };
243
- }
244
- if (user) {
245
- const permission = `globals:${operation}`;
246
- const userHas = hasPermission(
247
- { id: user.id, email: user.email, role: user.role },
248
- permission
249
- );
250
- const adminHas = hasPermission(
251
- { id: user.id, email: user.email, role: user.role },
252
- "globals:admin"
253
- );
254
- if (userHas || adminHas) {
255
- return { allowed: true };
256
- }
257
- return { allowed: false, error: "Access denied: missing RBAC permission", status: 403 };
258
- }
259
- if (enablePublicAccess) {
260
- return { allowed: true };
261
- }
262
- return { allowed: false, error: "Authentication required", status: 401 };
263
- }
264
-
265
- export { API_KEY_COLLECTION, checkCollectionAccess, checkGlobalAccess, createApiKeyContext, evaluateAccess, extractApiKeyFromRequest, generateApiKey, generateApiKeyPrefix, getWhereClause, mergeWhereClauses, validateApiKey };
266
- //# sourceMappingURL=chunk-NZEUU7QB.js.map
267
- //# sourceMappingURL=chunk-NZEUU7QB.js.map
160
+ export { API_KEY_COLLECTION, createApiKeyContext, evaluateAccess, extractApiKeyFromRequest, generateApiKey, generateApiKeyPrefix, getWhereClause, hasApiKeyPermission, mergeWhereClauses, validateApiKey };
161
+ //# sourceMappingURL=chunk-3AKCVYDB.js.map
162
+ //# sourceMappingURL=chunk-3AKCVYDB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/access/types.ts","../src/auth/api-key.ts"],"names":[],"mappings":"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","file":"chunk-3AKCVYDB.js","sourcesContent":["import type { User, Request } from '../hooks/types.js';\n\n// ============================================================================\n// Access Control Types\n// ============================================================================\n\nexport interface WhereClause {\n [field: string]: any;\n}\n\nexport interface AccessArgs {\n req: Request;\n user?: User;\n data?: unknown;\n doc?: unknown;\n id?: string;\n tenantID?: string;\n context?: Record<string, unknown>;\n}\n\nexport type AccessControl = boolean | ((args: AccessArgs) => Promise<boolean | WhereClause> | boolean | WhereClause);\n\nexport interface CollectionAccess {\n create?: AccessControl;\n read?: AccessControl;\n update?: AccessControl;\n delete?: AccessControl;\n admin?: AccessControl;\n unlock?: AccessControl;\n readVersions?: AccessControl;\n}\n\nexport interface GlobalAccess {\n read?: AccessControl;\n update?: AccessControl;\n}\n\nexport interface FieldAccess {\n create?: AccessControl;\n read?: AccessControl;\n update?: AccessControl;\n}\n\n// ============================================================================\n// Access Control Evaluation\n// ============================================================================\n\nexport async function evaluateAccess(\n access: AccessControl,\n args: AccessArgs\n): Promise<boolean | WhereClause> {\n if (typeof access === 'boolean') {\n return access;\n }\n if (typeof access === 'function') {\n return await access(args);\n }\n return true;\n}\n\nexport function mergeWhereClauses(\n ...whereClauses: (WhereClause | boolean | undefined)[]\n): WhereClause {\n const result: WhereClause = {};\n for (const clause of whereClauses) {\n if (clause && typeof clause === 'object') {\n Object.assign(result, clause);\n }\n }\n return result;\n}\n\nexport function getWhereClause(\n access: AccessControl,\n args: AccessArgs\n): Promise<WhereClause | undefined> {\n return evaluateAccess(access, args).then(result => {\n if (result === true) return undefined;\n if (result === false) return { _id: { $eq: null } };\n return result;\n });\n}\n","import { timingSafeEqual } from \"crypto\";\nimport type { BaseAdapter } from \"../registry/types.js\";\nimport type { AuthUser, UserRole } from \"./types.js\";\n\nexport interface ApiKeyRecord {\n id: string;\n userId: string;\n name: string;\n key: string;\n keyPrefix: string;\n permissions: string[];\n lastUsedAt?: string;\n expiresAt?: string;\n createdAt: string;\n}\n\nexport interface ApiKeyValidationResult {\n valid: boolean;\n userId?: string;\n user?: Partial<AuthUser>;\n permissions?: string[];\n apiKeyId?: string;\n error?: string;\n tenantId?: string;\n role?: UserRole;\n}\n\nexport interface ApiKeyContext {\n userId: string;\n user: Partial<AuthUser>;\n permissions: string[];\n apiKeyId: string;\n tenantId?: string;\n role?: UserRole;\n}\n\nexport const API_KEY_COLLECTION = \"api_keys\";\n\nfunction generateKeyPrefix(key: string): string {\n return key.substring(0, 8);\n}\n\nfunction constantTimeCompare(a: string, b: string): boolean {\n if (a.length !== b.length) {\n return false;\n }\n try {\n return timingSafeEqual(Buffer.from(a), Buffer.from(b));\n } catch {\n return false;\n }\n}\n\nexport async function validateApiKey(\n rawKey: string,\n db: BaseAdapter,\n userLookup?: (userId: string) => Promise<Partial<AuthUser> | null>,\n): Promise<ApiKeyValidationResult> {\n if (!rawKey || typeof rawKey !== \"string\") {\n return { valid: false, error: \"No API key provided\" };\n }\n\n if (!rawKey.startsWith(\"kyro_\")) {\n return { valid: false, error: \"Invalid API key format\" };\n }\n\n const keyPrefix = generateKeyPrefix(rawKey);\n\n try {\n const result = await db.find({\n collection: API_KEY_COLLECTION,\n where: { keyPrefix: { equals: keyPrefix } },\n limit: 100,\n page: 1,\n });\n\n if (!result.docs || result.docs.length === 0) {\n return { valid: false, error: \"Invalid API key\" };\n }\n\n let matchedKey: ApiKeyRecord | null = null;\n for (const doc of result.docs) {\n const record = doc as unknown as ApiKeyRecord;\n if (constantTimeCompare(record.key, rawKey)) {\n matchedKey = record;\n break;\n }\n }\n\n if (!matchedKey) {\n return { valid: false, error: \"Invalid API key\" };\n }\n\n if (matchedKey.expiresAt) {\n const expiresAt = new Date(matchedKey.expiresAt);\n if (expiresAt < new Date()) {\n return { valid: false, error: \"API key has expired\" };\n }\n }\n\n try {\n await db.update({\n collection: API_KEY_COLLECTION,\n id: matchedKey.id,\n data: { lastUsedAt: new Date().toISOString() },\n });\n } catch {\n // Non-critical: don't fail if lastUsedAt update fails\n }\n\n const user: Partial<AuthUser> = {\n id: matchedKey.userId,\n role: (matchedKey as any).role || \"author\",\n tenantId: (matchedKey as any).tenantId,\n };\n\n if (userLookup) {\n const dbUser = await userLookup(matchedKey.userId);\n if (dbUser) {\n Object.assign(user, dbUser);\n }\n }\n\n return {\n valid: true,\n userId: matchedKey.userId,\n user,\n permissions: matchedKey.permissions || [],\n apiKeyId: matchedKey.id,\n tenantId: user.tenantId,\n role: user.role,\n };\n } catch (error) {\n console.error(\"[ApiKey] Validation error:\", error);\n return { valid: false, error: \"Failed to validate API key\" };\n }\n}\n\nexport function extractApiKeyFromRequest(request: Request): string | null {\n const authHeader = request.headers.get(\"Authorization\");\n if (authHeader) {\n if (authHeader.startsWith(\"ApiKey \")) {\n return authHeader.slice(7).trim();\n }\n if (authHeader.startsWith(\"Bearer \")) {\n return null;\n }\n }\n\n const xApiKey = request.headers.get(\"X-API-Key\");\n if (xApiKey) {\n return xApiKey.trim();\n }\n\n return null;\n}\n\nexport function createApiKeyContext(\n result: ApiKeyValidationResult,\n): ApiKeyContext | null {\n if (!result.valid || !result.userId) {\n return null;\n }\n return {\n userId: result.userId,\n user: result.user || {},\n permissions: result.permissions || [],\n apiKeyId: result.apiKeyId || \"\",\n tenantId: result.tenantId,\n role: result.role,\n };\n}\n\nexport function hasApiKeyPermission(\n permissions: string[],\n required: string,\n): boolean {\n if (permissions.length === 0) return false;\n if (permissions.includes(\"*\")) return true;\n if (permissions.includes(required)) return true;\n\n const [resource, action] = required.split(\":\");\n if (permissions.includes(`${resource}:*`)) return true;\n\n return false;\n}\n\nexport function generateApiKey(): string {\n const chars = \"abcdefghijklmnopqrstuvwxyz0123456789\";\n let suffix = \"\";\n for (let i = 0; i < 32; i++) {\n suffix += chars[Math.floor(Math.random() * chars.length)];\n }\n return `kyro_${suffix}`;\n}\n\nexport function generateApiKeyPrefix(key: string): string {\n return key.substring(0, 8);\n}\n"]}
@@ -1,6 +1,5 @@
1
1
  'use strict';
2
2
 
3
- var chunkNKPKR5BW_cjs = require('./chunk-NKPKR5BW.cjs');
4
3
  var crypto = require('crypto');
5
4
 
6
5
  // src/access/types.ts
@@ -29,7 +28,7 @@ function getWhereClause(access, args) {
29
28
  return result;
30
29
  });
31
30
  }
32
- var API_KEY_COLLECTION = "_api_keys";
31
+ var API_KEY_COLLECTION = "api_keys";
33
32
  function generateKeyPrefix(key) {
34
33
  return key.substring(0, 8);
35
34
  }
@@ -160,120 +159,15 @@ function generateApiKeyPrefix(key) {
160
159
  return key.substring(0, 8);
161
160
  }
162
161
 
163
- // src/access/checker.ts
164
- function actionToPermission(operation) {
165
- if (operation === "read") return "read";
166
- if (operation === "create") return "create";
167
- if (operation === "update") return "update";
168
- return "delete";
169
- }
170
- function isDefaultAllowed(operation, defaultAccess) {
171
- const levels = {
172
- none: false,
173
- read: operation === "read",
174
- create: operation === "read" || operation === "create",
175
- update: operation === "read" || operation === "create" || operation === "update",
176
- delete: operation === "read" || operation === "create" || operation === "update" || operation === "delete",
177
- admin: true
178
- };
179
- return levels[defaultAccess] || false;
180
- }
181
- async function checkCollectionAccess(config, operation, context, options = {}) {
182
- const { user, req, tenantID, apiKey } = context;
183
- const { enablePublicAccess = true, defaultAccess = "none" } = options;
184
- const accessRule = config.access?.[operation];
185
- if (accessRule) {
186
- const allowed = await evaluateAccess(accessRule, {
187
- req,
188
- user,
189
- tenantID
190
- });
191
- if (allowed === false) {
192
- return { allowed: false, error: "Access denied", status: 403 };
193
- }
194
- if (typeof allowed === "object") {
195
- return { allowed: true, extraWhere: allowed };
196
- }
197
- return { allowed: true };
198
- }
199
- if (apiKey?.permissions?.length > 0) {
200
- const resource = config.slug;
201
- const action = actionToPermission(operation);
202
- const permission = `${resource}:${action}`;
203
- if (!hasApiKeyPermission(apiKey.permissions, permission) && !hasApiKeyPermission(apiKey.permissions, `${resource}:admin`)) {
204
- return { allowed: false, error: "Access denied: insufficient permissions", status: 403 };
205
- }
206
- return { allowed: true };
207
- }
208
- if (user) {
209
- const resource = config.slug;
210
- const action = actionToPermission(operation);
211
- const permission = `${resource}:${action}`;
212
- const userHas = chunkNKPKR5BW_cjs.hasPermission(
213
- { id: user.id, email: user.email, role: user.role },
214
- permission
215
- );
216
- const adminHas = chunkNKPKR5BW_cjs.hasPermission(
217
- { id: user.id, email: user.email, role: user.role },
218
- `${resource}:admin`
219
- );
220
- if (userHas || adminHas) {
221
- return { allowed: true };
222
- }
223
- return { allowed: false, error: "Access denied: missing RBAC permission", status: 403 };
224
- }
225
- const defaultAllowed = isDefaultAllowed(operation, defaultAccess);
226
- if (enablePublicAccess && defaultAllowed) {
227
- return { allowed: true };
228
- }
229
- return { allowed: false, error: "Authentication required", status: 401 };
230
- }
231
- async function checkGlobalAccess(config, operation, context, options = {}) {
232
- const { user, req, tenantID } = context;
233
- const { enablePublicAccess = true } = options;
234
- const accessRule = config.access?.[operation];
235
- if (accessRule) {
236
- const allowed = await evaluateAccess(accessRule, {
237
- req,
238
- user,
239
- tenantID
240
- });
241
- if (allowed === false) {
242
- return { allowed: false, error: "Access denied", status: 403 };
243
- }
244
- return { allowed: true };
245
- }
246
- if (user) {
247
- const permission = `globals:${operation}`;
248
- const userHas = chunkNKPKR5BW_cjs.hasPermission(
249
- { id: user.id, email: user.email, role: user.role },
250
- permission
251
- );
252
- const adminHas = chunkNKPKR5BW_cjs.hasPermission(
253
- { id: user.id, email: user.email, role: user.role },
254
- "globals:admin"
255
- );
256
- if (userHas || adminHas) {
257
- return { allowed: true };
258
- }
259
- return { allowed: false, error: "Access denied: missing RBAC permission", status: 403 };
260
- }
261
- if (enablePublicAccess) {
262
- return { allowed: true };
263
- }
264
- return { allowed: false, error: "Authentication required", status: 401 };
265
- }
266
-
267
162
  exports.API_KEY_COLLECTION = API_KEY_COLLECTION;
268
- exports.checkCollectionAccess = checkCollectionAccess;
269
- exports.checkGlobalAccess = checkGlobalAccess;
270
163
  exports.createApiKeyContext = createApiKeyContext;
271
164
  exports.evaluateAccess = evaluateAccess;
272
165
  exports.extractApiKeyFromRequest = extractApiKeyFromRequest;
273
166
  exports.generateApiKey = generateApiKey;
274
167
  exports.generateApiKeyPrefix = generateApiKeyPrefix;
275
168
  exports.getWhereClause = getWhereClause;
169
+ exports.hasApiKeyPermission = hasApiKeyPermission;
276
170
  exports.mergeWhereClauses = mergeWhereClauses;
277
171
  exports.validateApiKey = validateApiKey;
278
- //# sourceMappingURL=chunk-FKKQUMXR.cjs.map
279
- //# sourceMappingURL=chunk-FKKQUMXR.cjs.map
172
+ //# sourceMappingURL=chunk-4OCMVGEY.cjs.map
173
+ //# sourceMappingURL=chunk-4OCMVGEY.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/access/types.ts","../src/auth/api-key.ts"],"names":["timingSafeEqual"],"mappings":"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","file":"chunk-4OCMVGEY.cjs","sourcesContent":["import type { User, Request } from '../hooks/types.js';\n\n// ============================================================================\n// Access Control Types\n// ============================================================================\n\nexport interface WhereClause {\n [field: string]: any;\n}\n\nexport interface AccessArgs {\n req: Request;\n user?: User;\n data?: unknown;\n doc?: unknown;\n id?: string;\n tenantID?: string;\n context?: Record<string, unknown>;\n}\n\nexport type AccessControl = boolean | ((args: AccessArgs) => Promise<boolean | WhereClause> | boolean | WhereClause);\n\nexport interface CollectionAccess {\n create?: AccessControl;\n read?: AccessControl;\n update?: AccessControl;\n delete?: AccessControl;\n admin?: AccessControl;\n unlock?: AccessControl;\n readVersions?: AccessControl;\n}\n\nexport interface GlobalAccess {\n read?: AccessControl;\n update?: AccessControl;\n}\n\nexport interface FieldAccess {\n create?: AccessControl;\n read?: AccessControl;\n update?: AccessControl;\n}\n\n// ============================================================================\n// Access Control Evaluation\n// ============================================================================\n\nexport async function evaluateAccess(\n access: AccessControl,\n args: AccessArgs\n): Promise<boolean | WhereClause> {\n if (typeof access === 'boolean') {\n return access;\n }\n if (typeof access === 'function') {\n return await access(args);\n }\n return true;\n}\n\nexport function mergeWhereClauses(\n ...whereClauses: (WhereClause | boolean | undefined)[]\n): WhereClause {\n const result: WhereClause = {};\n for (const clause of whereClauses) {\n if (clause && typeof clause === 'object') {\n Object.assign(result, clause);\n }\n }\n return result;\n}\n\nexport function getWhereClause(\n access: AccessControl,\n args: AccessArgs\n): Promise<WhereClause | undefined> {\n return evaluateAccess(access, args).then(result => {\n if (result === true) return undefined;\n if (result === false) return { _id: { $eq: null } };\n return result;\n });\n}\n","import { timingSafeEqual } from \"crypto\";\nimport type { BaseAdapter } from \"../registry/types.js\";\nimport type { AuthUser, UserRole } from \"./types.js\";\n\nexport interface ApiKeyRecord {\n id: string;\n userId: string;\n name: string;\n key: string;\n keyPrefix: string;\n permissions: string[];\n lastUsedAt?: string;\n expiresAt?: string;\n createdAt: string;\n}\n\nexport interface ApiKeyValidationResult {\n valid: boolean;\n userId?: string;\n user?: Partial<AuthUser>;\n permissions?: string[];\n apiKeyId?: string;\n error?: string;\n tenantId?: string;\n role?: UserRole;\n}\n\nexport interface ApiKeyContext {\n userId: string;\n user: Partial<AuthUser>;\n permissions: string[];\n apiKeyId: string;\n tenantId?: string;\n role?: UserRole;\n}\n\nexport const API_KEY_COLLECTION = \"api_keys\";\n\nfunction generateKeyPrefix(key: string): string {\n return key.substring(0, 8);\n}\n\nfunction constantTimeCompare(a: string, b: string): boolean {\n if (a.length !== b.length) {\n return false;\n }\n try {\n return timingSafeEqual(Buffer.from(a), Buffer.from(b));\n } catch {\n return false;\n }\n}\n\nexport async function validateApiKey(\n rawKey: string,\n db: BaseAdapter,\n userLookup?: (userId: string) => Promise<Partial<AuthUser> | null>,\n): Promise<ApiKeyValidationResult> {\n if (!rawKey || typeof rawKey !== \"string\") {\n return { valid: false, error: \"No API key provided\" };\n }\n\n if (!rawKey.startsWith(\"kyro_\")) {\n return { valid: false, error: \"Invalid API key format\" };\n }\n\n const keyPrefix = generateKeyPrefix(rawKey);\n\n try {\n const result = await db.find({\n collection: API_KEY_COLLECTION,\n where: { keyPrefix: { equals: keyPrefix } },\n limit: 100,\n page: 1,\n });\n\n if (!result.docs || result.docs.length === 0) {\n return { valid: false, error: \"Invalid API key\" };\n }\n\n let matchedKey: ApiKeyRecord | null = null;\n for (const doc of result.docs) {\n const record = doc as unknown as ApiKeyRecord;\n if (constantTimeCompare(record.key, rawKey)) {\n matchedKey = record;\n break;\n }\n }\n\n if (!matchedKey) {\n return { valid: false, error: \"Invalid API key\" };\n }\n\n if (matchedKey.expiresAt) {\n const expiresAt = new Date(matchedKey.expiresAt);\n if (expiresAt < new Date()) {\n return { valid: false, error: \"API key has expired\" };\n }\n }\n\n try {\n await db.update({\n collection: API_KEY_COLLECTION,\n id: matchedKey.id,\n data: { lastUsedAt: new Date().toISOString() },\n });\n } catch {\n // Non-critical: don't fail if lastUsedAt update fails\n }\n\n const user: Partial<AuthUser> = {\n id: matchedKey.userId,\n role: (matchedKey as any).role || \"author\",\n tenantId: (matchedKey as any).tenantId,\n };\n\n if (userLookup) {\n const dbUser = await userLookup(matchedKey.userId);\n if (dbUser) {\n Object.assign(user, dbUser);\n }\n }\n\n return {\n valid: true,\n userId: matchedKey.userId,\n user,\n permissions: matchedKey.permissions || [],\n apiKeyId: matchedKey.id,\n tenantId: user.tenantId,\n role: user.role,\n };\n } catch (error) {\n console.error(\"[ApiKey] Validation error:\", error);\n return { valid: false, error: \"Failed to validate API key\" };\n }\n}\n\nexport function extractApiKeyFromRequest(request: Request): string | null {\n const authHeader = request.headers.get(\"Authorization\");\n if (authHeader) {\n if (authHeader.startsWith(\"ApiKey \")) {\n return authHeader.slice(7).trim();\n }\n if (authHeader.startsWith(\"Bearer \")) {\n return null;\n }\n }\n\n const xApiKey = request.headers.get(\"X-API-Key\");\n if (xApiKey) {\n return xApiKey.trim();\n }\n\n return null;\n}\n\nexport function createApiKeyContext(\n result: ApiKeyValidationResult,\n): ApiKeyContext | null {\n if (!result.valid || !result.userId) {\n return null;\n }\n return {\n userId: result.userId,\n user: result.user || {},\n permissions: result.permissions || [],\n apiKeyId: result.apiKeyId || \"\",\n tenantId: result.tenantId,\n role: result.role,\n };\n}\n\nexport function hasApiKeyPermission(\n permissions: string[],\n required: string,\n): boolean {\n if (permissions.length === 0) return false;\n if (permissions.includes(\"*\")) return true;\n if (permissions.includes(required)) return true;\n\n const [resource, action] = required.split(\":\");\n if (permissions.includes(`${resource}:*`)) return true;\n\n return false;\n}\n\nexport function generateApiKey(): string {\n const chars = \"abcdefghijklmnopqrstuvwxyz0123456789\";\n let suffix = \"\";\n for (let i = 0; i < 32; i++) {\n suffix += chars[Math.floor(Math.random() * chars.length)];\n }\n return `kyro_${suffix}`;\n}\n\nexport function generateApiKeyPrefix(key: string): string {\n return key.substring(0, 8);\n}\n"]}