@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.
- package/dist/{WebhookService-BKszZlG0.d.cts → WebhookService-Dj8pJ3sp.d.cts} +1 -1
- package/dist/{WebhookService-Ccf1j-IN.d.ts → WebhookService-DpRB940h.d.ts} +1 -1
- package/dist/api-handler-graphql.cjs +18 -13
- package/dist/api-handler-graphql.cjs.map +1 -1
- package/dist/api-handler-graphql.js +14 -9
- package/dist/api-handler-graphql.js.map +1 -1
- package/dist/api-handler-trpc.cjs +9 -9
- package/dist/api-handler-trpc.js +7 -7
- package/dist/api-handler.cjs +10 -10
- package/dist/api-handler.js +7 -7
- package/dist/{base-CIuXkrH4.d.cts → base-BjyoF6da.d.cts} +2 -2
- package/dist/{base-fFo4lqER.d.ts → base-C2YR8lWt.d.ts} +2 -2
- package/dist/{chunk-NZEUU7QB.js → chunk-3AKCVYDB.js} +4 -109
- package/dist/chunk-3AKCVYDB.js.map +1 -0
- package/dist/{chunk-FKKQUMXR.cjs → chunk-4OCMVGEY.cjs} +4 -110
- package/dist/chunk-4OCMVGEY.cjs.map +1 -0
- package/dist/{chunk-VLK5SJRI.js → chunk-5RFGYEQ3.js} +133 -46
- package/dist/chunk-5RFGYEQ3.js.map +1 -0
- package/dist/chunk-5RPRLTTN.js +861 -0
- package/dist/chunk-5RPRLTTN.js.map +1 -0
- package/dist/{chunk-AX2TZRQJ.js → chunk-BVUDFKKS.js} +16 -3
- package/dist/chunk-BVUDFKKS.js.map +1 -0
- package/dist/{chunk-DRVOUQMT.cjs → chunk-E4JZ73FY.cjs} +54 -79
- package/dist/chunk-E4JZ73FY.cjs.map +1 -0
- package/dist/{chunk-E5UJBLQ7.js → chunk-FIAMXNTH.js} +2 -2
- package/dist/chunk-FIAMXNTH.js.map +1 -0
- package/dist/{chunk-QVJNSAQL.cjs → chunk-IEIHABVR.cjs} +152 -65
- package/dist/chunk-IEIHABVR.cjs.map +1 -0
- package/dist/{chunk-QFLB4EIJ.cjs → chunk-LNTFRAHF.cjs} +118 -9
- package/dist/chunk-LNTFRAHF.cjs.map +1 -0
- package/dist/chunk-N4GN6Q3V.cjs +869 -0
- package/dist/chunk-N4GN6Q3V.cjs.map +1 -0
- package/dist/{chunk-FSKONGCX.cjs → chunk-OJ2AM75W.cjs} +2 -2
- package/dist/chunk-OJ2AM75W.cjs.map +1 -0
- package/dist/{chunk-QX3WNQ7V.js → chunk-OX6GOIPH.js} +4 -4
- package/dist/{chunk-QX3WNQ7V.js.map → chunk-OX6GOIPH.js.map} +1 -1
- package/dist/{chunk-OZ3CCTTA.cjs → chunk-OXYSOU6Z.cjs} +18 -5
- package/dist/chunk-OXYSOU6Z.cjs.map +1 -0
- package/dist/{chunk-CMXVTUYV.js → chunk-OYCICW4B.js} +38 -63
- package/dist/chunk-OYCICW4B.js.map +1 -0
- package/dist/{chunk-HVCUIII2.cjs → chunk-TQG7G7YI.cjs} +13 -13
- package/dist/{chunk-HVCUIII2.cjs.map → chunk-TQG7G7YI.cjs.map} +1 -1
- package/dist/{chunk-3UK5XBVJ.js → chunk-WDTTHKDS.js} +117 -10
- package/dist/chunk-WDTTHKDS.js.map +1 -0
- package/dist/cli/index.cjs +148 -14
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +148 -14
- package/dist/cli/index.js.map +1 -1
- package/dist/client.cjs +3 -3
- package/dist/client.d.cts +2 -2
- package/dist/client.d.ts +2 -2
- package/dist/client.js +1 -1
- package/dist/drizzle/index.d.cts +3 -3
- package/dist/drizzle/index.d.ts +3 -3
- package/dist/fields/index.cjs +21 -21
- package/dist/fields/index.d.cts +1 -1
- package/dist/fields/index.d.ts +1 -1
- package/dist/fields/index.js +1 -1
- package/dist/graphql/index.cjs +13 -5
- package/dist/graphql/index.d.cts +37 -7
- package/dist/graphql/index.d.ts +37 -7
- package/dist/graphql/index.js +2 -2
- package/dist/{index-BKta3cBH.d.cts → index-DHbywDs-.d.cts} +2 -2
- package/dist/{index-ClOqnkTO.d.ts → index-jLs0zlft.d.ts} +2 -2
- package/dist/index.cjs +90 -90
- package/dist/index.d.cts +15 -14
- package/dist/index.d.ts +15 -14
- package/dist/index.js +8 -8
- package/dist/mongodb/index.d.cts +3 -3
- package/dist/mongodb/index.d.ts +3 -3
- package/dist/rest/index.cjs +5 -5
- package/dist/rest/index.d.cts +4 -4
- package/dist/rest/index.d.ts +4 -4
- package/dist/rest/index.js +3 -3
- package/dist/templates/index.d.cts +2 -2
- package/dist/templates/index.d.ts +2 -2
- package/dist/trpc/index.cjs +12 -12
- package/dist/trpc/index.d.cts +3 -3
- package/dist/trpc/index.d.ts +3 -3
- package/dist/trpc/index.js +3 -3
- package/dist/{types-Dgzlftb7.d.ts → types-BzH3_rtP.d.ts} +7 -7
- package/dist/{types-Ds0tCA3L.d.cts → types-CY_iNunL.d.cts} +7 -7
- package/dist/{types-DeSApf9T.d.ts → types-C_rVxU2T.d.cts} +4 -4
- package/dist/{types-DeSApf9T.d.cts → types-C_rVxU2T.d.ts} +4 -4
- package/package.json +2 -1
- package/dist/chunk-3UK5XBVJ.js.map +0 -1
- package/dist/chunk-AX2TZRQJ.js.map +0 -1
- package/dist/chunk-CMXVTUYV.js.map +0 -1
- package/dist/chunk-DRVOUQMT.cjs.map +0 -1
- package/dist/chunk-E5UJBLQ7.js.map +0 -1
- package/dist/chunk-FKKQUMXR.cjs.map +0 -1
- package/dist/chunk-FSKONGCX.cjs.map +0 -1
- package/dist/chunk-NZEUU7QB.js.map +0 -1
- package/dist/chunk-OZ3CCTTA.cjs.map +0 -1
- package/dist/chunk-PONTBXR5.js +0 -842
- package/dist/chunk-PONTBXR5.js.map +0 -1
- package/dist/chunk-QFLB4EIJ.cjs.map +0 -1
- package/dist/chunk-QVJNSAQL.cjs.map +0 -1
- package/dist/chunk-RRKCIAPU.cjs +0 -848
- package/dist/chunk-RRKCIAPU.cjs.map +0 -1
- package/dist/chunk-VLK5SJRI.js.map +0 -1
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('./chunk-
|
|
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-
|
|
8
|
-
require('./chunk-
|
|
9
|
-
require('./chunk-
|
|
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-
|
|
16
|
-
require('./chunk-
|
|
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
|
|
32
|
-
const app =
|
|
33
|
-
|
|
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
|
|
37
|
-
const app =
|
|
38
|
-
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
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-
|
|
2
|
-
import './chunk-
|
|
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-
|
|
6
|
-
import './chunk-
|
|
7
|
-
import './chunk-
|
|
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-
|
|
14
|
-
import './chunk-
|
|
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
|
-
|
|
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
|
-
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
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
|
|
4
|
-
require('./chunk-
|
|
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-
|
|
8
|
-
require('./chunk-
|
|
9
|
-
require('./chunk-
|
|
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-
|
|
16
|
-
require('./chunk-
|
|
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
|
|
32
|
-
const app =
|
|
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
|
|
package/dist/api-handler-trpc.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import { warmKyroInstance, kyroInstance } from './chunk-
|
|
2
|
-
import './chunk-
|
|
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-
|
|
6
|
-
import './chunk-
|
|
7
|
-
import './chunk-
|
|
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-
|
|
14
|
-
import './chunk-
|
|
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';
|
package/dist/api-handler.cjs
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('./chunk-
|
|
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-
|
|
8
|
-
require('./chunk-
|
|
9
|
-
require('./chunk-
|
|
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-
|
|
16
|
-
require('./chunk-
|
|
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
|
|
33
|
+
get: function () { return chunkOXYSOU6Z_cjs.ALL; }
|
|
34
34
|
});
|
|
35
35
|
Object.defineProperty(exports, "kyroInstance", {
|
|
36
36
|
enumerable: true,
|
|
37
|
-
get: function () { return
|
|
37
|
+
get: function () { return chunkOXYSOU6Z_cjs.kyroInstance; }
|
|
38
38
|
});
|
|
39
39
|
Object.defineProperty(exports, "warmKyroInstance", {
|
|
40
40
|
enumerable: true,
|
|
41
|
-
get: function () { return
|
|
41
|
+
get: function () { return chunkOXYSOU6Z_cjs.warmKyroInstance; }
|
|
42
42
|
});
|
|
43
43
|
//# sourceMappingURL=api-handler.cjs.map
|
|
44
44
|
//# sourceMappingURL=api-handler.cjs.map
|
package/dist/api-handler.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
export { ALL, kyroInstance, warmKyroInstance } from './chunk-
|
|
2
|
-
import './chunk-
|
|
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-
|
|
6
|
-
import './chunk-
|
|
7
|
-
import './chunk-
|
|
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-
|
|
14
|
-
import './chunk-
|
|
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-
|
|
2
|
-
import { F as Field, k as RelationshipField, U as UploadField } from './types-
|
|
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-
|
|
2
|
-
import { F as Field, k as RelationshipField, U as UploadField } from './types-
|
|
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 = "
|
|
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
|
-
|
|
162
|
-
|
|
163
|
-
|
|
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 = "
|
|
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-
|
|
279
|
-
//# sourceMappingURL=chunk-
|
|
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"]}
|