@kyro-cms/core 0.10.4 → 0.10.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api-handler-graphql.cjs +1 -49
- package/dist/api-handler-graphql.js +1 -46
- package/dist/api-handler-trpc.cjs +1 -38
- package/dist/api-handler-trpc.js +1 -36
- package/dist/api-handler.cjs +1 -44
- package/dist/api-handler.js +1 -27
- package/dist/bootstrap-IVQWSJXZ.js +1 -0
- package/dist/bootstrap-OHGQGMRV.cjs +1 -0
- package/dist/chunk-2BTRHVT3.cjs +20 -0
- package/dist/chunk-2W4FK6CJ.js +122 -0
- package/dist/chunk-4ORJMSJU.cjs +1 -0
- package/dist/chunk-5J6HXUF6.js +1 -0
- package/dist/chunk-65G73T7Z.cjs +2 -0
- package/dist/chunk-6CLRVJPP.cjs +133 -0
- package/dist/chunk-7N6NKCRT.js +1 -0
- package/dist/chunk-7WOX27LK.js +259 -0
- package/dist/chunk-AE6GXUT7.js +1 -0
- package/dist/chunk-AHSFSERC.cjs +1 -0
- package/dist/chunk-AJAZ7D3W.cjs +259 -0
- package/dist/chunk-ATLSIYRH.cjs +1 -0
- package/dist/chunk-AU6IWTBO.js +2 -0
- package/dist/chunk-CIE3XMLH.cjs +2 -0
- package/dist/chunk-CVVW4LXZ.cjs +1 -0
- package/dist/chunk-DV4LFLPL.cjs +1 -0
- package/dist/chunk-ELICKLFM.cjs +3 -0
- package/dist/chunk-EQUQJBPP.cjs +2 -0
- package/dist/chunk-ET6NN2V2.cjs +122 -0
- package/dist/chunk-F3Z67QWS.cjs +86 -0
- package/dist/chunk-F7SR5IDT.cjs +1 -0
- package/dist/chunk-FO3HLBC7.js +1 -0
- package/dist/chunk-G6A7OSIG.js +2 -0
- package/dist/chunk-GFU7AOI3.cjs +1 -0
- package/dist/chunk-GYQMNXXW.cjs +114 -0
- package/dist/chunk-HLSB2MCK.js +1 -0
- package/dist/chunk-HVXO3OFB.cjs +1 -0
- package/dist/chunk-ISWMETHJ.cjs +1 -0
- package/dist/chunk-K6WUOU6P.js +1 -0
- package/dist/chunk-KDNYHLD2.js +1 -0
- package/dist/chunk-L6CZYN3L.cjs +20 -0
- package/dist/chunk-LZ6YFYQM.js +20 -0
- package/dist/chunk-MIOMMB23.cjs +1 -0
- package/dist/chunk-MSSRVZH6.js +1 -0
- package/dist/chunk-NGBJKZMT.js +90 -0
- package/dist/chunk-NRLIGDYF.js +1 -0
- package/dist/chunk-NY47CFVP.cjs +1 -0
- package/dist/chunk-NZ35PV5R.js +2 -0
- package/dist/chunk-OG7CNQGU.js +1 -0
- package/dist/chunk-P7CESLDJ.js +1 -0
- package/dist/chunk-POWTSLKC.js +21 -0
- package/dist/chunk-PP5S2UBV.js +0 -0
- package/dist/chunk-PWGS2GPI.js +86 -0
- package/dist/chunk-Q3Q7BJVQ.cjs +1 -0
- package/dist/chunk-Q4CSLXCO.cjs +90 -0
- package/dist/chunk-QRXDCV6K.js +0 -0
- package/dist/chunk-R6UUTH3T.js +2 -0
- package/dist/chunk-RHCWCG3O.js +114 -0
- package/dist/chunk-SL3LZQCF.js +1 -0
- package/dist/chunk-TD6RULJU.cjs +21 -0
- package/dist/chunk-UBHFUFD4.cjs +1 -0
- package/dist/chunk-UBRYJP2G.js +1 -0
- package/dist/chunk-UDSJGML2.cjs +2 -0
- package/dist/chunk-UHFDH3PG.js +20 -0
- package/dist/chunk-UJNSOOYZ.cjs +1 -0
- package/dist/chunk-UVTS2IWM.js +1 -0
- package/dist/chunk-V65NPSR5.cjs +1 -0
- package/dist/chunk-VKXQUYYV.js +133 -0
- package/dist/chunk-WIZ6C5QZ.cjs +1 -0
- package/dist/chunk-Y7K26TBA.cjs +1 -0
- package/dist/chunk-ZAQOSRP6.js +1 -0
- package/dist/chunk-ZELCS7IC.js +3 -0
- package/dist/cli/index.cjs +35 -405
- package/dist/cli/index.js +35 -402
- package/dist/client.cjs +1 -55
- package/dist/client.js +1 -6
- package/dist/drizzle/index.cjs +1 -50
- package/dist/drizzle/index.d.cts +1 -2
- package/dist/drizzle/index.d.ts +1 -2
- package/dist/drizzle/index.js +1 -9
- package/dist/fields/index.cjs +1 -89
- package/dist/fields/index.js +1 -4
- package/dist/graphql/index.cjs +1 -31
- package/dist/graphql/index.d.cts +1 -1
- package/dist/graphql/index.d.ts +1 -1
- package/dist/graphql/index.js +1 -6
- package/dist/{index-jLs0zlft.d.ts → index-DXr33e0x.d.ts} +1 -1
- package/dist/{index-DHbywDs-.d.cts → index-DuuUzWBq.d.cts} +1 -1
- package/dist/index.cjs +29 -2464
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +29 -1929
- package/dist/integration.cjs +1 -10
- package/dist/integration.js +1 -4
- package/dist/media-L5XDD47D.js +1 -0
- package/dist/media-OUBQTIQP.cjs +1 -0
- package/dist/mongo-auth-adapter-LG5O4LIH.js +1 -0
- package/dist/mongo-auth-adapter-YPONSOCY.cjs +1 -0
- package/dist/mongodb/index.cjs +1 -29
- package/dist/mongodb/index.d.cts +1 -2
- package/dist/mongodb/index.d.ts +1 -2
- package/dist/mongodb/index.js +1 -8
- package/dist/postgres-auth-adapter-33QOIRXT.js +1 -0
- package/dist/postgres-auth-adapter-JKDYYULH.cjs +1 -0
- package/dist/redis-adapter-KECGVSVX.cjs +1 -0
- package/dist/redis-adapter-VAXP43GR.js +1 -0
- package/dist/rest/index.cjs +1 -31
- package/dist/rest/index.d.cts +1 -1
- package/dist/rest/index.d.ts +1 -1
- package/dist/rest/index.js +1 -18
- package/dist/schema-HIUSHSUI.cjs +1 -0
- package/dist/schema-KFYUM674.js +1 -0
- package/dist/sqlite-adapter-FP45QCYK.js +1 -0
- package/dist/sqlite-adapter-Z3IBBI4X.cjs +1 -0
- package/dist/templates/index.cjs +1 -207
- package/dist/templates/index.js +1 -6
- package/dist/trpc/index.cjs +1 -48
- package/dist/trpc/index.js +1 -7
- package/dist/ws/index.cjs +1 -25
- package/dist/ws/index.js +1 -4
- package/package.json +49 -12
- package/dist/api-handler-graphql.cjs.map +0 -1
- package/dist/api-handler-graphql.js.map +0 -1
- package/dist/api-handler-trpc.cjs.map +0 -1
- package/dist/api-handler-trpc.js.map +0 -1
- package/dist/api-handler.cjs.map +0 -1
- package/dist/api-handler.js.map +0 -1
- package/dist/bootstrap-FUAPY2OF.cjs +0 -32
- package/dist/bootstrap-FUAPY2OF.cjs.map +0 -1
- package/dist/bootstrap-OXNVM7FP.js +0 -7
- package/dist/bootstrap-OXNVM7FP.js.map +0 -1
- package/dist/chunk-2HFJUUFZ.js +0 -250
- package/dist/chunk-2HFJUUFZ.js.map +0 -1
- package/dist/chunk-3AKCVYDB.js +0 -162
- package/dist/chunk-3AKCVYDB.js.map +0 -1
- package/dist/chunk-3KTWGODI.cjs +0 -178
- package/dist/chunk-3KTWGODI.cjs.map +0 -1
- package/dist/chunk-3YELQL7Z.cjs +0 -4
- package/dist/chunk-3YELQL7Z.cjs.map +0 -1
- package/dist/chunk-4CV4JOE5.js +0 -24
- package/dist/chunk-4CV4JOE5.js.map +0 -1
- package/dist/chunk-4OCMVGEY.cjs +0 -173
- package/dist/chunk-4OCMVGEY.cjs.map +0 -1
- package/dist/chunk-4PWRCMTQ.cjs +0 -15
- package/dist/chunk-4PWRCMTQ.cjs.map +0 -1
- package/dist/chunk-53NYVYVX.js +0 -3243
- package/dist/chunk-53NYVYVX.js.map +0 -1
- package/dist/chunk-5GFQPHGT.cjs +0 -156
- package/dist/chunk-5GFQPHGT.cjs.map +0 -1
- package/dist/chunk-5RPRLTTN.js +0 -861
- package/dist/chunk-5RPRLTTN.js.map +0 -1
- package/dist/chunk-74YSDAWE.cjs +0 -2749
- package/dist/chunk-74YSDAWE.cjs.map +0 -1
- package/dist/chunk-7OGPN7MP.js +0 -352
- package/dist/chunk-7OGPN7MP.js.map +0 -1
- package/dist/chunk-7OS7TX2Q.cjs +0 -495
- package/dist/chunk-7OS7TX2Q.cjs.map +0 -1
- package/dist/chunk-ADLJSJSN.cjs +0 -13
- package/dist/chunk-ADLJSJSN.cjs.map +0 -1
- package/dist/chunk-B6X3LN25.cjs +0 -6486
- package/dist/chunk-B6X3LN25.cjs.map +0 -1
- package/dist/chunk-BYBMTIMT.js +0 -419
- package/dist/chunk-BYBMTIMT.js.map +0 -1
- package/dist/chunk-CF7OL6HR.js +0 -355
- package/dist/chunk-CF7OL6HR.js.map +0 -1
- package/dist/chunk-CJX74IYK.js +0 -489
- package/dist/chunk-CJX74IYK.js.map +0 -1
- package/dist/chunk-CKVOU6MX.cjs +0 -52
- package/dist/chunk-CKVOU6MX.cjs.map +0 -1
- package/dist/chunk-CZLDE2OZ.cjs +0 -28
- package/dist/chunk-CZLDE2OZ.cjs.map +0 -1
- package/dist/chunk-DPA3KWPY.cjs +0 -205
- package/dist/chunk-DPA3KWPY.cjs.map +0 -1
- package/dist/chunk-EEJUFDMF.cjs +0 -424
- package/dist/chunk-EEJUFDMF.cjs.map +0 -1
- package/dist/chunk-FIAMXNTH.js +0 -220
- package/dist/chunk-FIAMXNTH.js.map +0 -1
- package/dist/chunk-GAOXD3XT.js +0 -175
- package/dist/chunk-GAOXD3XT.js.map +0 -1
- package/dist/chunk-GTGRLD4Y.js +0 -3
- package/dist/chunk-GTGRLD4Y.js.map +0 -1
- package/dist/chunk-GUUB5EAG.cjs +0 -223
- package/dist/chunk-GUUB5EAG.cjs.map +0 -1
- package/dist/chunk-GXFOGU7N.cjs +0 -359
- package/dist/chunk-GXFOGU7N.cjs.map +0 -1
- package/dist/chunk-GZS4LMR7.js +0 -422
- package/dist/chunk-GZS4LMR7.js.map +0 -1
- package/dist/chunk-HY6B7B5A.js +0 -150
- package/dist/chunk-HY6B7B5A.js.map +0 -1
- package/dist/chunk-HZOMOK5Y.js +0 -2728
- package/dist/chunk-HZOMOK5Y.js.map +0 -1
- package/dist/chunk-IDVRRRAK.cjs +0 -824
- package/dist/chunk-IDVRRRAK.cjs.map +0 -1
- package/dist/chunk-KC2GDBLS.cjs +0 -84
- package/dist/chunk-KC2GDBLS.cjs.map +0 -1
- package/dist/chunk-L4EZKIEX.js +0 -185
- package/dist/chunk-L4EZKIEX.js.map +0 -1
- package/dist/chunk-LNTFRAHF.cjs +0 -473
- package/dist/chunk-LNTFRAHF.cjs.map +0 -1
- package/dist/chunk-MTIRYI7F.cjs +0 -4
- package/dist/chunk-MTIRYI7F.cjs.map +0 -1
- package/dist/chunk-N4GN6Q3V.cjs +0 -869
- package/dist/chunk-N4GN6Q3V.cjs.map +0 -1
- package/dist/chunk-N4H37VN4.cjs +0 -259
- package/dist/chunk-N4H37VN4.cjs.map +0 -1
- package/dist/chunk-N5QSHUA6.js +0 -1135
- package/dist/chunk-N5QSHUA6.js.map +0 -1
- package/dist/chunk-NKPKR5BW.cjs +0 -188
- package/dist/chunk-NKPKR5BW.cjs.map +0 -1
- package/dist/chunk-OIRG6ZRV.cjs +0 -1073
- package/dist/chunk-OIRG6ZRV.cjs.map +0 -1
- package/dist/chunk-OJ2AM75W.cjs +0 -253
- package/dist/chunk-OJ2AM75W.cjs.map +0 -1
- package/dist/chunk-OLV7K22H.js +0 -6457
- package/dist/chunk-OLV7K22H.js.map +0 -1
- package/dist/chunk-OX6GOIPH.js +0 -516
- package/dist/chunk-OX6GOIPH.js.map +0 -1
- package/dist/chunk-P2YW545G.js +0 -11
- package/dist/chunk-P2YW545G.js.map +0 -1
- package/dist/chunk-PHJRNPHY.cjs +0 -3291
- package/dist/chunk-PHJRNPHY.cjs.map +0 -1
- package/dist/chunk-Q72BOAPK.js +0 -817
- package/dist/chunk-Q72BOAPK.js.map +0 -1
- package/dist/chunk-QU2RFFH4.js +0 -3
- package/dist/chunk-QU2RFFH4.js.map +0 -1
- package/dist/chunk-RP7VZUEL.js +0 -49
- package/dist/chunk-RP7VZUEL.js.map +0 -1
- package/dist/chunk-SHTTJMLT.cjs +0 -361
- package/dist/chunk-SHTTJMLT.cjs.map +0 -1
- package/dist/chunk-SX76DNOO.js +0 -103
- package/dist/chunk-SX76DNOO.js.map +0 -1
- package/dist/chunk-THBQG64D.cjs +0 -425
- package/dist/chunk-THBQG64D.cjs.map +0 -1
- package/dist/chunk-TQG7G7YI.cjs +0 -526
- package/dist/chunk-TQG7G7YI.cjs.map +0 -1
- package/dist/chunk-U3VVLYXG.cjs +0 -189
- package/dist/chunk-U3VVLYXG.cjs.map +0 -1
- package/dist/chunk-UUDTPZX6.js +0 -193
- package/dist/chunk-UUDTPZX6.js.map +0 -1
- package/dist/chunk-V5AWATUP.js +0 -1059
- package/dist/chunk-V5AWATUP.js.map +0 -1
- package/dist/chunk-VAXLFZCV.cjs +0 -110
- package/dist/chunk-VAXLFZCV.cjs.map +0 -1
- package/dist/chunk-VKREAIBA.cjs +0 -1139
- package/dist/chunk-VKREAIBA.cjs.map +0 -1
- package/dist/chunk-WDTTHKDS.js +0 -458
- package/dist/chunk-WDTTHKDS.js.map +0 -1
- package/dist/chunk-WXVB364T.js +0 -218
- package/dist/chunk-WXVB364T.js.map +0 -1
- package/dist/chunk-X4BPPD6K.js +0 -181
- package/dist/chunk-X4BPPD6K.js.map +0 -1
- package/dist/chunk-XEB7PH2E.js +0 -81
- package/dist/chunk-XEB7PH2E.js.map +0 -1
- package/dist/chunk-YT7HXXVN.js +0 -13
- package/dist/chunk-YT7HXXVN.js.map +0 -1
- package/dist/cli/index.cjs.map +0 -1
- package/dist/cli/index.js.map +0 -1
- package/dist/client.cjs.map +0 -1
- package/dist/client.js.map +0 -1
- package/dist/drizzle/index.cjs.map +0 -1
- package/dist/drizzle/index.js.map +0 -1
- package/dist/fields/index.cjs.map +0 -1
- package/dist/fields/index.js.map +0 -1
- package/dist/graphql/index.cjs.map +0 -1
- package/dist/graphql/index.js.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/integration.cjs.map +0 -1
- package/dist/integration.js.map +0 -1
- package/dist/media-7WDX4BDJ.js +0 -4
- package/dist/media-7WDX4BDJ.js.map +0 -1
- package/dist/media-TUSLVRQ6.cjs +0 -17
- package/dist/media-TUSLVRQ6.cjs.map +0 -1
- package/dist/mongo-auth-adapter-GT4S7SCU.cjs +0 -17
- package/dist/mongo-auth-adapter-GT4S7SCU.cjs.map +0 -1
- package/dist/mongo-auth-adapter-M7VV4LNB.js +0 -4
- package/dist/mongo-auth-adapter-M7VV4LNB.js.map +0 -1
- package/dist/mongodb/index.cjs.map +0 -1
- package/dist/mongodb/index.js.map +0 -1
- package/dist/postgres-auth-adapter-AFAPISH7.js +0 -5
- package/dist/postgres-auth-adapter-AFAPISH7.js.map +0 -1
- package/dist/postgres-auth-adapter-SFDTLONT.cjs +0 -14
- package/dist/postgres-auth-adapter-SFDTLONT.cjs.map +0 -1
- package/dist/redis-adapter-UQX4EE3B.cjs +0 -13
- package/dist/redis-adapter-UQX4EE3B.cjs.map +0 -1
- package/dist/redis-adapter-XALOGWY3.js +0 -4
- package/dist/redis-adapter-XALOGWY3.js.map +0 -1
- package/dist/rest/index.cjs.map +0 -1
- package/dist/rest/index.js.map +0 -1
- package/dist/schema-6QL3USNB.cjs +0 -67
- package/dist/schema-6QL3USNB.cjs.map +0 -1
- package/dist/schema-FNNWEAAW.js +0 -6
- package/dist/schema-FNNWEAAW.js.map +0 -1
- package/dist/sqlite-adapter-AQB5TCGV.cjs +0 -13
- package/dist/sqlite-adapter-AQB5TCGV.cjs.map +0 -1
- package/dist/sqlite-adapter-N5H6IM2X.js +0 -4
- package/dist/sqlite-adapter-N5H6IM2X.js.map +0 -1
- package/dist/templates/index.cjs.map +0 -1
- package/dist/templates/index.js.map +0 -1
- package/dist/trpc/index.cjs.map +0 -1
- package/dist/trpc/index.js.map +0 -1
- package/dist/ws/index.cjs.map +0 -1
- package/dist/ws/index.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/webhooks/types.ts","../src/webhooks/delivery.ts","../src/webhooks/WebhookService.ts","../src/access/checker.ts"],"names":[],"mappings":"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","file":"chunk-WDTTHKDS.js","sourcesContent":["export const WEBHOOK_EVENTS = {\n COLLECTION_CREATE: \"collection.create\",\n COLLECTION_UPDATE: \"collection.update\",\n COLLECTION_DELETE: \"collection.delete\",\n MEDIA_UPLOAD: \"media.upload\",\n MEDIA_DELETE: \"media.delete\",\n AUTH_LOGIN: \"auth.login\",\n AUTH_REGISTER: \"auth.register\",\n AUTH_LOGOUT: \"auth.logout\",\n ORDER_CREATED: \"order.created\",\n ORDER_PAID: \"order.paid\",\n ORDER_SHIPPED: \"order.shipped\",\n ORDER_DELIVERED: \"order.delivered\",\n} as const;\n\nexport type WebhookEvent = (typeof WEBHOOK_EVENTS)[keyof typeof WEBHOOK_EVENTS];\n\nexport const ALL_WEBHOOK_EVENTS: WebhookEvent[] = Object.values(WEBHOOK_EVENTS);\n\nexport interface WebhookConfig {\n id: string;\n name: string;\n url: string;\n events: WebhookEvent[];\n status: \"active\" | \"inactive\" | \"error\";\n secret?: string;\n headers?: Record<string, string>;\n lastTriggered?: string;\n lastError?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreateWebhookData {\n name: string;\n url: string;\n events: WebhookEvent[];\n status?: \"active\" | \"inactive\";\n secret?: string;\n headers?: Record<string, string>;\n}\n\nexport interface UpdateWebhookData {\n name?: string;\n url?: string;\n events?: WebhookEvent[];\n status?: \"active\" | \"inactive\" | \"error\";\n secret?: string;\n headers?: Record<string, string>;\n lastTriggered?: string | null;\n lastError?: string | null;\n}\n\nexport interface WebhookPayload {\n id: string;\n event: WebhookEvent;\n timestamp: string;\n collection?: string;\n operation?: \"create\" | \"update\" | \"delete\";\n data?: unknown;\n previousData?: unknown;\n user?: {\n id: string;\n email?: string;\n role?: string;\n };\n tenantId?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface WebhookDelivery {\n id: string;\n webhookId: string;\n event: WebhookEvent;\n payload: WebhookPayload;\n attempt: number;\n status: \"pending\" | \"success\" | \"failed\" | \"retrying\";\n responseStatus?: number;\n responseBody?: string;\n error?: string;\n duration?: number;\n createdAt: string;\n deliveredAt?: string;\n nextRetryAt?: string;\n}\n\nexport interface WebhookTriggerResult {\n deliveryId: string;\n webhookId: string;\n event: WebhookEvent;\n status: \"queued\" | \"success\" | \"failed\";\n responseStatus?: number;\n duration?: number;\n error?: string;\n}\n\nexport const WEBHOOK_COLLECTION = \"_webhooks\";\nexport const WEBHOOK_DELIVERY_COLLECTION = \"_webhook_deliveries\";\n","import { createHmac, randomBytes } from \"crypto\";\nimport type {\n WebhookConfig,\n WebhookPayload,\n WebhookDelivery,\n} from \"./types.js\";\n\nexport interface DeliveryResult {\n success: boolean;\n status: number;\n statusText?: string;\n body?: string;\n duration: number;\n error?: string;\n}\n\nexport interface DeliveryOptions {\n timeout?: number;\n maxRetries?: number;\n retryDelay?: number;\n onRetry?: (attempt: number, error: string) => void;\n onSuccess?: (result: DeliveryResult) => void;\n onFailure?: (error: string) => void;\n}\n\nexport function signPayload(payload: string, secret: string): string {\n return `sha256=${createHmac(\"sha256\", secret).update(payload).digest(\"hex\")}`;\n}\n\nexport function generateWebhookSecret(): string {\n return randomBytes(32).toString(\"hex\");\n}\n\nexport async function deliverWebhook(\n webhook: WebhookConfig,\n payload: WebhookPayload,\n options: DeliveryOptions = {},\n): Promise<DeliveryResult> {\n const timeout = options.timeout || 30000;\n const startTime = Date.now();\n\n const body = JSON.stringify(payload);\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"User-Agent\": \"Kyro-CMS-Webhook/1.0\",\n \"X-Webhook-Event\": payload.event,\n \"X-Webhook-Delivery\": payload.id,\n \"X-Webhook-Timestamp\": payload.timestamp,\n ...(webhook.headers || {}),\n };\n\n if (webhook.secret) {\n const signature = signPayload(body, webhook.secret);\n headers[\"X-Webhook-Signature\"] = signature;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(webhook.url, {\n method: \"POST\",\n headers,\n body,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const duration = Date.now() - startTime;\n let responseBody: string | undefined;\n\n try {\n const text = await response.text();\n responseBody = text.slice(0, 1000);\n } catch {}\n\n const result: DeliveryResult = {\n success: response.ok,\n status: response.status,\n statusText: response.statusText,\n body: responseBody,\n duration,\n };\n\n if (result.success && options.onSuccess) {\n options.onSuccess(result);\n } else if (!result.success && options.onFailure) {\n options.onFailure(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n return result;\n } catch (error: any) {\n clearTimeout(timeoutId);\n const duration = Date.now() - startTime;\n const errorMessage =\n error.name === \"AbortError\"\n ? `Request timed out after ${timeout}ms`\n : error.message || \"Unknown error\";\n\n if (options.onFailure) {\n options.onFailure(errorMessage);\n }\n\n return {\n success: false,\n status: 0,\n duration,\n error: errorMessage,\n };\n }\n}\n\nexport async function deliverWithRetry(\n webhook: WebhookConfig,\n payload: WebhookPayload,\n deliveryId: string,\n options: DeliveryOptions = {},\n): Promise<DeliveryResult> {\n const maxRetries = options.maxRetries ?? 5;\n const baseDelay = options.retryDelay ?? 1000;\n let lastResult: DeliveryResult | null = null;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n if (attempt > 0) {\n const delay = Math.min(baseDelay * Math.pow(2, attempt - 1), 30000);\n if (options.onRetry) {\n options.onRetry(attempt, `Retrying in ${delay}ms...`);\n }\n await sleep(delay);\n }\n\n if (options.onRetry && attempt > 0) {\n options.onRetry(attempt, `Attempt ${attempt + 1}/${maxRetries + 1}`);\n }\n\n lastResult = await deliverWebhook(webhook, payload, {\n ...options,\n onRetry: undefined,\n onSuccess: undefined,\n onFailure: undefined,\n });\n\n if (lastResult.success) {\n return lastResult;\n }\n\n if (lastResult.error?.includes(\"timed out\") && attempt < maxRetries) {\n continue;\n }\n\n if (lastResult.status >= 400 && lastResult.status < 500) {\n return lastResult;\n }\n }\n\n return (\n lastResult || {\n success: false,\n status: 0,\n duration: 0,\n error: \"All delivery attempts failed\",\n }\n );\n}\n\nexport function buildDeliveryRecord(\n deliveryId: string,\n webhookId: string,\n event: string,\n payload: WebhookPayload,\n attempt: number,\n result: DeliveryResult,\n): WebhookDelivery {\n return {\n id: deliveryId,\n webhookId,\n event: event as any,\n payload,\n attempt,\n status: result.success ? \"success\" : \"failed\",\n responseStatus: result.status || undefined,\n responseBody: result.body,\n duration: result.duration,\n error: result.error,\n createdAt: new Date().toISOString(),\n deliveredAt: result.success ? new Date().toISOString() : undefined,\n };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function createTestPayload(): WebhookPayload {\n return {\n id: `test_${Date.now()}`,\n event: \"collection.create\",\n timestamp: new Date().toISOString(),\n collection: \"test\",\n operation: \"create\",\n data: { message: \"This is a test webhook delivery\" },\n user: { id: \"system\", email: \"system@kyro.dev\", role: \"super_admin\" },\n };\n}\n","import { randomUUID } from \"crypto\";\nimport type { BaseAdapter } from \"../registry/types.js\";\nimport {\n type WebhookConfig,\n type CreateWebhookData,\n type UpdateWebhookData,\n type WebhookPayload,\n type WebhookDelivery,\n type WebhookEvent,\n type WebhookTriggerResult,\n WEBHOOK_COLLECTION,\n WEBHOOK_DELIVERY_COLLECTION,\n} from \"./types.js\";\nimport {\n deliverWithRetry,\n buildDeliveryRecord,\n generateWebhookSecret,\n} from \"./delivery.js\";\n\nexport class WebhookService {\n private db: BaseAdapter;\n\n constructor(db: BaseAdapter) {\n this.db = db;\n }\n\n async getWebhooks(filters?: {\n status?: string;\n event?: WebhookEvent;\n }): Promise<WebhookConfig[]> {\n const result = await this.db.find({\n collection: WEBHOOK_COLLECTION,\n where: filters?.status ? { status: { equals: filters.status } } : {},\n limit: 100,\n page: 1,\n draft: true,\n });\n\n const webhooks = result.docs as unknown as WebhookConfig[];\n\n if (filters?.event) {\n return webhooks.filter((w) =>\n w.events.includes(filters.event as WebhookEvent),\n );\n }\n\n return webhooks;\n }\n\n async getWebhookById(id: string): Promise<WebhookConfig | null> {\n return this.db.findByID({\n collection: WEBHOOK_COLLECTION,\n id,\n draft: true,\n }) as Promise<WebhookConfig | null>;\n }\n\n async createWebhook(data: CreateWebhookData): Promise<WebhookConfig> {\n const now = new Date().toISOString();\n const secret = data.secret || generateWebhookSecret();\n\n const webhook = {\n id: randomUUID(),\n name: data.name,\n url: data.url,\n events: data.events,\n status: data.status || \"active\",\n secret,\n headers: data.headers || {},\n createdAt: now,\n updatedAt: now,\n };\n\n await this.db.create({\n collection: WEBHOOK_COLLECTION,\n data: webhook,\n });\n\n return webhook as WebhookConfig;\n }\n\n async updateWebhook(\n id: string,\n data: UpdateWebhookData,\n ): Promise<WebhookConfig | null> {\n const existing = await this.getWebhookById(id);\n if (!existing) return null;\n\n const updated = {\n ...existing,\n ...data,\n updatedAt: new Date().toISOString(),\n };\n\n if (data.secret === \"\" && \"secret\" in data) {\n delete updated.secret;\n }\n\n await this.db.update({\n collection: WEBHOOK_COLLECTION,\n id,\n data: updated,\n });\n\n return updated as WebhookConfig;\n }\n\n async deleteWebhook(id: string): Promise<void> {\n await this.db.delete({\n collection: WEBHOOK_COLLECTION,\n id,\n });\n }\n\n async trigger(\n event: WebhookEvent,\n payloadData: Omit<WebhookPayload, \"id\" | \"event\" | \"timestamp\">,\n ): Promise<WebhookTriggerResult[]> {\n const matchingWebhooks = await this.getWebhooks({\n status: \"active\",\n event,\n });\n\n if (matchingWebhooks.length === 0) {\n return [];\n }\n\n const payload: WebhookPayload = {\n id: `wh_${Date.now()}_${randomUUID().slice(0, 8)}`,\n event,\n timestamp: new Date().toISOString(),\n ...payloadData,\n };\n\n const results: WebhookTriggerResult[] = [];\n\n for (const webhook of matchingWebhooks) {\n const result = await this.triggerWebhook(webhook, payload);\n results.push(result);\n }\n\n return results;\n }\n\n async triggerWebhook(\n webhook: WebhookConfig,\n payload: WebhookPayload,\n ): Promise<WebhookTriggerResult> {\n const deliveryId = `dlv_${Date.now()}_${randomUUID().slice(0, 8)}`;\n\n try {\n const result = await deliverWithRetry(webhook, payload, deliveryId, {\n maxRetries: 5,\n retryDelay: 1000,\n });\n\n const deliveryRecord = buildDeliveryRecord(\n deliveryId,\n webhook.id,\n webhook.events[0],\n payload,\n 1,\n result,\n );\n\n try {\n await this.db.create({\n collection: WEBHOOK_DELIVERY_COLLECTION,\n data: deliveryRecord,\n });\n } catch {\n console.warn(\n \"[WebhookService] Failed to save delivery record:\",\n deliveryId,\n );\n }\n\n if (!result.success) {\n await this.updateWebhook(webhook.id, {\n status: \"error\",\n lastError: result.error,\n }).catch(() => {});\n } else {\n await this.updateWebhook(webhook.id, {\n status: \"active\",\n lastTriggered: new Date().toISOString(),\n }).catch(() => {});\n }\n\n return {\n deliveryId,\n webhookId: webhook.id,\n event: webhook.events[0],\n status: result.success ? \"success\" : \"failed\",\n responseStatus: result.status,\n duration: result.duration,\n error: result.error,\n };\n } catch (error: any) {\n return {\n deliveryId,\n webhookId: webhook.id,\n event: webhook.events[0],\n status: \"failed\",\n error: error.message,\n };\n }\n }\n\n async testWebhook(webhookId: string): Promise<WebhookTriggerResult | null> {\n const webhook = await this.getWebhookById(webhookId);\n if (!webhook) return null;\n\n const payload: WebhookPayload = {\n id: `test_${Date.now()}`,\n event: webhook.events[0] || \"collection.create\",\n timestamp: new Date().toISOString(),\n collection: \"test\",\n operation: \"create\",\n data: { message: \"This is a test webhook delivery from Kyro CMS\" },\n user: {\n id: \"system\",\n email: \"system@kyro.dev\",\n role: \"super_admin\",\n },\n };\n\n return this.triggerWebhook(webhook, payload);\n }\n\n async getDeliveryHistory(\n webhookId: string,\n limit: number = 50,\n ): Promise<WebhookDelivery[]> {\n const result = await this.db.find({\n collection: WEBHOOK_DELIVERY_COLLECTION,\n where: { webhookId: { equals: webhookId } },\n sort: \"-createdAt\",\n limit,\n page: 1,\n });\n\n return result.docs as unknown as WebhookDelivery[];\n }\n\n async retryDelivery(\n deliveryId: string,\n ): Promise<WebhookTriggerResult | null> {\n const delivery = (await this.db.findByID({\n collection: WEBHOOK_DELIVERY_COLLECTION,\n id: deliveryId,\n })) as WebhookDelivery | null;\n\n if (!delivery) return null;\n\n const webhook = await this.getWebhookById(delivery.webhookId);\n if (!webhook) return null;\n\n return this.triggerWebhook(webhook, delivery.payload);\n }\n}\n\nexport function createWebhookService(db: BaseAdapter): WebhookService {\n return new WebhookService(db);\n}\n","import type { User, Request } from '../hooks/types.js';\nimport { evaluateAccess, type WhereClause } from './types.js';\nimport { hasPermission } from '../auth/rbac/checker.js';\nimport { hasApiKeyPermission } from '../auth/api-key.js';\n\nexport interface AccessCheckResult {\n allowed: boolean;\n extraWhere?: WhereClause;\n error?: string;\n status?: number;\n}\n\nexport interface AccessContext {\n user?: User;\n req?: Request;\n tenantID?: string;\n apiKey?: any;\n}\n\nexport interface AccessOptions {\n enablePublicAccess?: boolean;\n defaultAccess?: string;\n}\n\nfunction actionToPermission(\n operation: \"read\" | \"create\" | \"update\" | \"delete\",\n): string {\n if (operation === \"read\") return \"read\";\n if (operation === \"create\") return \"create\";\n if (operation === \"update\") return \"update\";\n return \"delete\";\n}\n\nfunction isDefaultAllowed(\n operation: \"read\" | \"create\" | \"update\" | \"delete\",\n defaultAccess: string,\n): boolean {\n const levels: Record<string, boolean> = {\n none: false,\n read: operation === \"read\",\n create: operation === \"read\" || operation === \"create\",\n update: operation === \"read\" || operation === \"create\" || operation === \"update\",\n delete: operation === \"read\" || operation === \"create\" || operation === \"update\" || operation === \"delete\",\n admin: true,\n };\n return levels[defaultAccess] || false;\n}\n\nexport async function checkCollectionAccess(\n config: { access?: any; slug: string },\n operation: \"read\" | \"create\" | \"update\" | \"delete\",\n context: AccessContext,\n options: AccessOptions = {},\n): Promise<AccessCheckResult> {\n const { user, req, tenantID, apiKey } = context;\n const { enablePublicAccess = true, defaultAccess = \"none\" } = options;\n const accessRule = config.access?.[operation];\n\n // Custom access function (highest priority)\n if (accessRule) {\n const allowed = await evaluateAccess(accessRule, {\n req: req!,\n user,\n tenantID,\n });\n if (allowed === false) {\n return { allowed: false, error: \"Access denied\", status: 403 };\n }\n if (typeof allowed === \"object\") {\n return { allowed: true, extraWhere: allowed as WhereClause };\n }\n return { allowed: true };\n }\n\n // API key permission check\n if (apiKey?.permissions?.length > 0) {\n const resource = config.slug;\n const action = actionToPermission(operation);\n const permission = `${resource}:${action}`;\n if (\n !hasApiKeyPermission(apiKey.permissions, permission) &&\n !hasApiKeyPermission(apiKey.permissions, `${resource}:admin`)\n ) {\n return { allowed: false, error: \"Access denied: insufficient permissions\", status: 403 };\n }\n return { allowed: true };\n }\n\n // No accessRule, no apiKey — authenticated user RBAC\n if (user) {\n const resource = config.slug;\n const action = actionToPermission(operation);\n const permission = `${resource}:${action}`;\n\n const userHas = hasPermission(\n { id: user.id, email: user.email, role: user.role } as any,\n permission,\n );\n const adminHas = hasPermission(\n { id: user.id, email: user.email, role: user.role } as any,\n `${resource}:admin`,\n );\n\n if (userHas || adminHas) {\n return { allowed: true };\n }\n return { allowed: false, error: \"Access denied: missing RBAC permission\", status: 403 };\n }\n\n // Unauthenticated — check public access\n const defaultAllowed = isDefaultAllowed(operation, defaultAccess);\n if (enablePublicAccess && defaultAllowed) {\n return { allowed: true };\n }\n\n return { allowed: false, error: \"Authentication required\", status: 401 };\n}\n\nexport async function checkGlobalAccess(\n config: { access?: any; slug: string },\n operation: \"read\" | \"update\",\n context: AccessContext,\n options: AccessOptions = {},\n): Promise<AccessCheckResult> {\n const { user, req, tenantID } = context;\n const { enablePublicAccess = true } = options;\n const accessRule = config.access?.[operation];\n\n // Custom access function\n if (accessRule) {\n const allowed = await evaluateAccess(accessRule, {\n req: req!,\n user,\n tenantID,\n });\n if (allowed === false) {\n return { allowed: false, error: \"Access denied\", status: 403 };\n }\n return { allowed: true };\n }\n\n // Authenticated user RBAC\n if (user) {\n const permission = `globals:${operation}`;\n const userHas = hasPermission(\n { id: user.id, email: user.email, role: user.role } as any,\n permission,\n );\n const adminHas = hasPermission(\n { id: user.id, email: user.email, role: user.role } as any,\n \"globals:admin\",\n );\n if (userHas || adminHas) {\n return { allowed: true };\n }\n return { allowed: false, error: \"Access denied: missing RBAC permission\", status: 403 };\n }\n\n // Unauthenticated\n if (enablePublicAccess) {\n return { allowed: true };\n }\n\n return { allowed: false, error: \"Authentication required\", status: 401 };\n}\n"]}
|
package/dist/chunk-WXVB364T.js
DELETED
|
@@ -1,218 +0,0 @@
|
|
|
1
|
-
import { hasAnyRole } from './chunk-L4EZKIEX.js';
|
|
2
|
-
|
|
3
|
-
// src/database/base.ts
|
|
4
|
-
var AbstractBaseAdapter = class {
|
|
5
|
-
collections = /* @__PURE__ */ new Map();
|
|
6
|
-
globals = /* @__PURE__ */ new Map();
|
|
7
|
-
connected = false;
|
|
8
|
-
tenantContext;
|
|
9
|
-
setTenantContext(context) {
|
|
10
|
-
this.tenantContext = context;
|
|
11
|
-
}
|
|
12
|
-
getTenantContext() {
|
|
13
|
-
return this.tenantContext;
|
|
14
|
-
}
|
|
15
|
-
async init(collections, globals = []) {
|
|
16
|
-
for (const config of collections) {
|
|
17
|
-
this.collections.set(config.slug, config);
|
|
18
|
-
}
|
|
19
|
-
for (const config of globals) {
|
|
20
|
-
this.globals.set(config.slug, config);
|
|
21
|
-
}
|
|
22
|
-
await this.connect();
|
|
23
|
-
}
|
|
24
|
-
// ========================================================================
|
|
25
|
-
// Utility Methods
|
|
26
|
-
// ========================================================================
|
|
27
|
-
getCollection(slug) {
|
|
28
|
-
const collection = this.collections.get(slug);
|
|
29
|
-
if (!collection) {
|
|
30
|
-
throw new Error(`Collection "${slug}" not found in adapter`);
|
|
31
|
-
}
|
|
32
|
-
return collection;
|
|
33
|
-
}
|
|
34
|
-
applyTenantFilter(where = {}, tenantID) {
|
|
35
|
-
if (tenantID) {
|
|
36
|
-
return {
|
|
37
|
-
...where,
|
|
38
|
-
tenantID: { equals: tenantID }
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
return where;
|
|
42
|
-
}
|
|
43
|
-
getTableName(slug) {
|
|
44
|
-
return slug.replace(/-/g, "_");
|
|
45
|
-
}
|
|
46
|
-
prepareData(data, collection) {
|
|
47
|
-
const prepared = { ...data };
|
|
48
|
-
if (collection.timestamps) {
|
|
49
|
-
prepared.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
50
|
-
if (!prepared.createdAt) {
|
|
51
|
-
prepared.createdAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
if (collection.auth && prepared.password) ;
|
|
55
|
-
return prepared;
|
|
56
|
-
}
|
|
57
|
-
processRelationships(data, fields, depth) {
|
|
58
|
-
return data;
|
|
59
|
-
}
|
|
60
|
-
parseSort(sort) {
|
|
61
|
-
if (!sort) return { field: "createdAt", direction: "desc" };
|
|
62
|
-
if (sort.startsWith("-")) {
|
|
63
|
-
return { field: sort.slice(1), direction: "desc" };
|
|
64
|
-
}
|
|
65
|
-
return { field: sort, direction: "asc" };
|
|
66
|
-
}
|
|
67
|
-
calculatePagination(page, limit, totalDocs) {
|
|
68
|
-
const totalPages = Math.ceil(totalDocs / limit);
|
|
69
|
-
return {
|
|
70
|
-
totalDocs,
|
|
71
|
-
limit,
|
|
72
|
-
totalPages,
|
|
73
|
-
page,
|
|
74
|
-
pagingCounter: (page - 1) * limit + 1,
|
|
75
|
-
hasPrevPage: page > 1,
|
|
76
|
-
hasNextPage: page < totalPages,
|
|
77
|
-
prevPage: page > 1 ? page - 1 : null,
|
|
78
|
-
nextPage: page < totalPages ? page + 1 : null
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
selectFields(data, select) {
|
|
82
|
-
if (!select || select.length === 0) return data;
|
|
83
|
-
const result = {};
|
|
84
|
-
for (const field of select) {
|
|
85
|
-
if (field in data) {
|
|
86
|
-
result[field] = data[field];
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
result["id"] = data.id;
|
|
90
|
-
return result;
|
|
91
|
-
}
|
|
92
|
-
isRelationshipField(field) {
|
|
93
|
-
return field.type === "relationship";
|
|
94
|
-
}
|
|
95
|
-
isUploadField(field) {
|
|
96
|
-
return field.type === "upload";
|
|
97
|
-
}
|
|
98
|
-
getRelationshipFields(fields) {
|
|
99
|
-
const result = [];
|
|
100
|
-
for (const field of fields) {
|
|
101
|
-
if (field.type === "relationship") {
|
|
102
|
-
result.push(field);
|
|
103
|
-
} else if ("fields" in field && field.fields) {
|
|
104
|
-
result.push(...this.getRelationshipFields(field.fields));
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
return result;
|
|
108
|
-
}
|
|
109
|
-
getUploadFields(fields) {
|
|
110
|
-
const result = [];
|
|
111
|
-
for (const field of fields) {
|
|
112
|
-
if (field.type === "upload") {
|
|
113
|
-
result.push(field);
|
|
114
|
-
} else if ("fields" in field && field.fields) {
|
|
115
|
-
result.push(...this.getUploadFields(field.fields));
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
return result;
|
|
119
|
-
}
|
|
120
|
-
};
|
|
121
|
-
|
|
122
|
-
// src/auth/rls/tenant.ts
|
|
123
|
-
var DEFAULT_RLS_CONFIG = {
|
|
124
|
-
tenantEnabled: true,
|
|
125
|
-
tenantField: "tenantId",
|
|
126
|
-
ownershipRules: {
|
|
127
|
-
posts: {
|
|
128
|
-
ownerField: "authorId",
|
|
129
|
-
bypassRoles: ["super_admin", "admin", "editor"]
|
|
130
|
-
},
|
|
131
|
-
pages: {
|
|
132
|
-
ownerField: "authorId",
|
|
133
|
-
bypassRoles: ["super_admin", "admin", "editor"]
|
|
134
|
-
},
|
|
135
|
-
media: {
|
|
136
|
-
ownerField: "uploadedBy",
|
|
137
|
-
bypassRoles: ["super_admin", "admin", "editor"]
|
|
138
|
-
},
|
|
139
|
-
orders: {
|
|
140
|
-
ownerField: "customerId",
|
|
141
|
-
bypassRoles: ["super_admin", "admin", "editor"]
|
|
142
|
-
},
|
|
143
|
-
customers: { ownerField: "id", bypassRoles: ["super_admin", "admin"] },
|
|
144
|
-
navigation: { ownerField: "id", bypassRoles: ["super_admin", "admin"] }
|
|
145
|
-
}
|
|
146
|
-
};
|
|
147
|
-
function addTenantFilter(query, context, config = DEFAULT_RLS_CONFIG) {
|
|
148
|
-
if (!config.tenantEnabled || context.isSuperAdmin) {
|
|
149
|
-
return query;
|
|
150
|
-
}
|
|
151
|
-
return {
|
|
152
|
-
...query,
|
|
153
|
-
where: {
|
|
154
|
-
...query.where,
|
|
155
|
-
[config.tenantField]: context.tenantId
|
|
156
|
-
}
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
function applyOwnershipRule(query, collection, context, config = DEFAULT_RLS_CONFIG) {
|
|
160
|
-
const rule = config.ownershipRules[collection];
|
|
161
|
-
if (!rule) {
|
|
162
|
-
return query;
|
|
163
|
-
}
|
|
164
|
-
if (rule.bypassRoles && hasAnyRole({ role: context.role }, rule.bypassRoles)) {
|
|
165
|
-
return query;
|
|
166
|
-
}
|
|
167
|
-
if (rule.ownerField === "id" && context.userId) {
|
|
168
|
-
return {
|
|
169
|
-
...query,
|
|
170
|
-
where: {
|
|
171
|
-
...query.where,
|
|
172
|
-
id: context.userId
|
|
173
|
-
}
|
|
174
|
-
};
|
|
175
|
-
}
|
|
176
|
-
if (rule.ownerField && context.userId) {
|
|
177
|
-
return {
|
|
178
|
-
...query,
|
|
179
|
-
where: {
|
|
180
|
-
...query.where,
|
|
181
|
-
[rule.ownerField]: context.userId
|
|
182
|
-
}
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
return query;
|
|
186
|
-
}
|
|
187
|
-
function applyRLS(query, collection, context, config = DEFAULT_RLS_CONFIG) {
|
|
188
|
-
let result = query;
|
|
189
|
-
result = addTenantFilter(result, context, config);
|
|
190
|
-
result = applyOwnershipRule(result, collection, context, config);
|
|
191
|
-
return result;
|
|
192
|
-
}
|
|
193
|
-
function canAccessDocument(doc, collection, context, config = DEFAULT_RLS_CONFIG) {
|
|
194
|
-
if (context.isSuperAdmin) {
|
|
195
|
-
return true;
|
|
196
|
-
}
|
|
197
|
-
if (config.tenantEnabled && doc[config.tenantField] !== context.tenantId) {
|
|
198
|
-
return false;
|
|
199
|
-
}
|
|
200
|
-
const rule = config.ownershipRules[collection];
|
|
201
|
-
if (!rule) {
|
|
202
|
-
return true;
|
|
203
|
-
}
|
|
204
|
-
if (rule.bypassRoles && hasAnyRole({ role: context.role }, rule.bypassRoles)) {
|
|
205
|
-
return true;
|
|
206
|
-
}
|
|
207
|
-
if (rule.ownerField === "id") {
|
|
208
|
-
return doc.id === context.userId;
|
|
209
|
-
}
|
|
210
|
-
if (rule.ownerField) {
|
|
211
|
-
return doc[rule.ownerField] === context.userId;
|
|
212
|
-
}
|
|
213
|
-
return true;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
export { AbstractBaseAdapter, DEFAULT_RLS_CONFIG, applyRLS, canAccessDocument };
|
|
217
|
-
//# sourceMappingURL=chunk-WXVB364T.js.map
|
|
218
|
-
//# sourceMappingURL=chunk-WXVB364T.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/database/base.ts","../src/auth/rls/tenant.ts"],"names":[],"mappings":"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","file":"chunk-WXVB364T.js","sourcesContent":["import type {\n BaseAdapter,\n CollectionConfig,\n GlobalConfig,\n FindArgs,\n FindByIDArgs,\n CreateArgs,\n UpdateArgs,\n DeleteArgs,\n FindResult,\n VersionRecord,\n CreateVersionArgs,\n FindVersionsArgs,\n} from '../registry/types.js';\nimport type { Field, RelationshipField, UploadField } from '../fields/types.js';\nimport type { TenantContext } from '../auth/rls/tenant.js';\n\n// ============================================================================\n// Abstract Base Adapter\n// ============================================================================\n\nexport abstract class AbstractBaseAdapter implements BaseAdapter {\n protected collections: Map<string, CollectionConfig> = new Map();\n protected globals: Map<string, GlobalConfig> = new Map();\n protected connected = false;\n protected tenantContext?: TenantContext;\n\n abstract connect(): Promise<void>;\n abstract disconnect(): Promise<void>;\n\n setTenantContext(context: TenantContext | undefined): void {\n this.tenantContext = context;\n }\n\n getTenantContext(): TenantContext | undefined {\n return this.tenantContext;\n }\n\n async init(collections: CollectionConfig[], globals: GlobalConfig[] = []): Promise<void> {\n for (const config of collections) {\n this.collections.set(config.slug, config);\n }\n for (const config of globals) {\n this.globals.set(config.slug, config);\n }\n await this.connect();\n }\n\n abstract find<T>(args: FindArgs): Promise<FindResult<T>>;\n abstract findByID<T>(args: FindByIDArgs): Promise<T | null>;\n abstract create<T>(args: CreateArgs): Promise<T>;\n abstract update<T>(args: UpdateArgs): Promise<T>;\n abstract delete<T>(args: DeleteArgs): Promise<T>;\n abstract count(args: { collection: string; where?: Record<string, any>; tenantID?: string }): Promise<number>;\n\n abstract findOne(args: { collection: string; where: Record<string, any>; tenantID?: string; draft?: boolean }): Promise<any>;\n\n abstract findVersions(args: FindVersionsArgs): Promise<FindResult<VersionRecord>>;\n abstract findVersionByID(args: { collection: string; versionId: string; tenantID?: string }): Promise<VersionRecord | null>;\n abstract createVersion<T = Record<string, any>>(args: CreateVersionArgs<T>): Promise<VersionRecord<T>>;\n abstract updateLatestVersion<T = Record<string, any>>(args: CreateVersionArgs<T>): Promise<VersionRecord<T>>;\n abstract deleteVersions(args: { collection: string; documentId: string; keepLatest?: number; tenantID?: string }): Promise<void>;\n\n async migrate?(): Promise<void>;\n async rollback?(): Promise<void>;\n async transaction?<T>(fn: (tx: any) => Promise<T>): Promise<T>;\n\n // ========================================================================\n // Utility Methods\n // ========================================================================\n\n protected getCollection(slug: string): CollectionConfig {\n const collection = this.collections.get(slug);\n if (!collection) {\n throw new Error(`Collection \"${slug}\" not found in adapter`);\n }\n return collection;\n }\n\n protected applyTenantFilter(where: Record<string, any> = {}, tenantID?: string): Record<string, any> {\n if (tenantID) {\n return {\n ...where,\n tenantID: { equals: tenantID },\n };\n }\n return where;\n }\n\n protected getTableName(slug: string): string {\n return slug.replace(/-/g, '_');\n }\n\n protected prepareData(data: Record<string, any>, collection: CollectionConfig): Record<string, any> {\n const prepared: Record<string, any> = { ...data };\n \n if (collection.timestamps) {\n prepared.updatedAt = new Date().toISOString();\n if (!prepared.createdAt) {\n prepared.createdAt = new Date().toISOString();\n }\n }\n\n // Handle password hashing\n if (collection.auth && prepared.password) {\n // Password should be hashed before this point via hooks\n }\n\n return prepared;\n }\n\n protected processRelationships(\n data: Record<string, any>,\n fields: Field[],\n depth: number\n ): Record<string, any> {\n // This is a base implementation - specific adapters override\n return data;\n }\n\n protected parseSort(sort?: string): { field: string; direction: 'asc' | 'desc' } {\n if (!sort) return { field: 'createdAt', direction: 'desc' };\n if (sort.startsWith('-')) {\n return { field: sort.slice(1), direction: 'desc' };\n }\n return { field: sort, direction: 'asc' };\n }\n\n protected calculatePagination(page: number, limit: number, totalDocs: number) {\n const totalPages = Math.ceil(totalDocs / limit);\n return {\n totalDocs,\n limit,\n totalPages,\n page,\n pagingCounter: (page - 1) * limit + 1,\n hasPrevPage: page > 1,\n hasNextPage: page < totalPages,\n prevPage: page > 1 ? page - 1 : null,\n nextPage: page < totalPages ? page + 1 : null,\n };\n }\n\n protected selectFields(data: Record<string, any>, select?: string[]): Record<string, any> {\n if (!select || select.length === 0) return data;\n const result: Record<string, any> = {};\n for (const field of select) {\n if (field in data) {\n result[field] = data[field];\n }\n }\n result['id'] = data.id;\n return result;\n }\n\n protected isRelationshipField(field: Field): field is RelationshipField {\n return field.type === 'relationship';\n }\n\n protected isUploadField(field: Field): field is UploadField {\n return field.type === 'upload';\n }\n\n protected getRelationshipFields(fields: Field[]): RelationshipField[] {\n const result: RelationshipField[] = [];\n for (const field of fields) {\n if (field.type === 'relationship') {\n result.push(field);\n } else if ('fields' in field && field.fields) {\n result.push(...this.getRelationshipFields(field.fields));\n }\n }\n return result;\n }\n\n protected getUploadFields(fields: Field[]): UploadField[] {\n const result: UploadField[] = [];\n for (const field of fields) {\n if (field.type === 'upload') {\n result.push(field);\n } else if ('fields' in field && field.fields) {\n result.push(...this.getUploadFields(field.fields));\n }\n }\n return result;\n }\n}\n","import type { AuthUser } from \"../types.js\";\nimport { hasAnyRole } from \"../rbac/checker.js\";\n\nexport interface TenantContext {\n tenantId: string;\n userId: string;\n role?: string;\n roles?: string[];\n permissions?: string[];\n isSuperAdmin?: boolean;\n}\n\nexport interface OwnershipRule {\n ownerField: string;\n bypassRoles?: string[];\n}\n\nexport interface RLSConfig {\n tenantEnabled: boolean;\n tenantField: string;\n ownershipRules: Record<string, OwnershipRule>;\n}\n\nexport const DEFAULT_RLS_CONFIG: RLSConfig = {\n tenantEnabled: true,\n tenantField: \"tenantId\",\n ownershipRules: {\n posts: {\n ownerField: \"authorId\",\n bypassRoles: [\"super_admin\", \"admin\", \"editor\"],\n },\n pages: {\n ownerField: \"authorId\",\n bypassRoles: [\"super_admin\", \"admin\", \"editor\"],\n },\n media: {\n ownerField: \"uploadedBy\",\n bypassRoles: [\"super_admin\", \"admin\", \"editor\"],\n },\n orders: {\n ownerField: \"customerId\",\n bypassRoles: [\"super_admin\", \"admin\", \"editor\"],\n },\n customers: { ownerField: \"id\", bypassRoles: [\"super_admin\", \"admin\"] },\n navigation: { ownerField: \"id\", bypassRoles: [\"super_admin\", \"admin\"] },\n },\n};\n\nexport function createTenantContext(user: AuthUser | undefined): TenantContext {\n if (!user) {\n return {\n tenantId: \"public\",\n userId: \"anonymous\",\n role: \"guest\",\n roles: [\"guest\"],\n permissions: [],\n isSuperAdmin: false,\n };\n }\n\n const isSuperAdmin = user.role === \"super_admin\";\n\n return {\n tenantId: user.tenantId || \"default\",\n userId: user.id,\n role: user.role,\n roles: [user.role],\n permissions: [],\n isSuperAdmin,\n };\n}\n\nexport function addTenantFilter<T extends Record<string, any>>(\n query: T,\n context: TenantContext,\n config: RLSConfig = DEFAULT_RLS_CONFIG,\n): T {\n if (!config.tenantEnabled || context.isSuperAdmin) {\n return query;\n }\n\n return {\n ...query,\n where: {\n ...query.where,\n [config.tenantField]: context.tenantId,\n },\n };\n}\n\nexport function applyOwnershipRule(\n query: Record<string, any>,\n collection: string,\n context: TenantContext,\n config: RLSConfig = DEFAULT_RLS_CONFIG,\n): Record<string, any> {\n const rule = config.ownershipRules[collection];\n\n if (!rule) {\n return query;\n }\n\n if (\n rule.bypassRoles &&\n hasAnyRole({ role: context.role } as AuthUser, rule.bypassRoles)\n ) {\n return query;\n }\n\n if (rule.ownerField === \"id\" && context.userId) {\n return {\n ...query,\n where: {\n ...query.where,\n id: context.userId,\n },\n };\n }\n\n if (rule.ownerField && context.userId) {\n return {\n ...query,\n where: {\n ...query.where,\n [rule.ownerField]: context.userId,\n },\n };\n }\n\n return query;\n}\n\nexport function applyRLS<T extends Record<string, any>>(\n query: T,\n collection: string,\n context: TenantContext,\n config: RLSConfig = DEFAULT_RLS_CONFIG,\n): T {\n let result = query;\n\n result = addTenantFilter(result, context, config) as T;\n\n result = applyOwnershipRule(result, collection, context, config) as T;\n\n return result;\n}\n\nexport function canAccessDocument(\n doc: Record<string, any>,\n collection: string,\n context: TenantContext,\n config: RLSConfig = DEFAULT_RLS_CONFIG,\n): boolean {\n if (context.isSuperAdmin) {\n return true;\n }\n\n if (config.tenantEnabled && doc[config.tenantField] !== context.tenantId) {\n return false;\n }\n\n const rule = config.ownershipRules[collection];\n\n if (!rule) {\n return true;\n }\n\n if (\n rule.bypassRoles &&\n hasAnyRole({ role: context.role } as AuthUser, rule.bypassRoles)\n ) {\n return true;\n }\n\n if (rule.ownerField === \"id\") {\n return doc.id === context.userId;\n }\n\n if (rule.ownerField) {\n return doc[rule.ownerField] === context.userId;\n }\n\n return true;\n}\n\nexport function filterDocumentsByRLS(\n docs: Record<string, any>[],\n collection: string,\n context: TenantContext,\n config: RLSConfig = DEFAULT_RLS_CONFIG,\n): Record<string, any>[] {\n if (context.isSuperAdmin) {\n return docs;\n }\n\n return docs.filter((doc) =>\n canAccessDocument(doc, collection, context, config),\n );\n}\n\nexport function sanitizeDocumentByRLS(\n doc: Record<string, any>,\n collection: string,\n context: TenantContext,\n config: RLSConfig = DEFAULT_RLS_CONFIG,\n): Record<string, any> | null {\n if (!canAccessDocument(doc, collection, context, config)) {\n return null;\n }\n\n if (config.tenantEnabled && !context.isSuperAdmin) {\n const { [config.tenantField]: _, ...rest } = doc;\n return rest;\n }\n\n return doc;\n}\n\nexport class RLSPolicy {\n private config: RLSConfig;\n\n constructor(config: RLSConfig = DEFAULT_RLS_CONFIG) {\n this.config = config;\n }\n\n setConfig(config: RLSConfig): void {\n this.config = config;\n }\n\n getConfig(): RLSConfig {\n return this.config;\n }\n\n addOwnershipRule(collection: string, rule: OwnershipRule): void {\n this.config.ownershipRules[collection] = rule;\n }\n\n removeOwnershipRule(collection: string): void {\n delete this.config.ownershipRules[collection];\n }\n\n createContext(user: AuthUser | undefined): TenantContext {\n return createTenantContext(user);\n }\n\n apply<T extends Record<string, any>>(\n query: T,\n collection: string,\n context: TenantContext,\n ): T {\n return applyRLS(query, collection, context, this.config);\n }\n\n canAccess(\n doc: Record<string, any>,\n collection: string,\n context: TenantContext,\n ): boolean {\n return canAccessDocument(doc, collection, context, this.config);\n }\n\n filter(\n docs: Record<string, any>[],\n collection: string,\n context: TenantContext,\n ): Record<string, any>[] {\n return filterDocumentsByRLS(docs, collection, context, this.config);\n }\n\n sanitize(\n doc: Record<string, any>,\n collection: string,\n context: TenantContext,\n ): Record<string, any> | null {\n return sanitizeDocumentByRLS(doc, collection, context, this.config);\n }\n}\n"]}
|
package/dist/chunk-X4BPPD6K.js
DELETED
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
import path from 'path';
|
|
2
|
-
import fs from 'fs';
|
|
3
|
-
|
|
4
|
-
// src/integration.ts
|
|
5
|
-
var API_HANDLER_ENTRYPOINT = path.resolve(
|
|
6
|
-
new URL(".", import.meta.url).pathname,
|
|
7
|
-
"api-handler.js"
|
|
8
|
-
);
|
|
9
|
-
var GRAPHQL_HANDLER_ENTRYPOINT = path.resolve(
|
|
10
|
-
new URL(".", import.meta.url).pathname,
|
|
11
|
-
"api-handler-graphql.js"
|
|
12
|
-
);
|
|
13
|
-
var TRPC_HANDLER_ENTRYPOINT = path.resolve(
|
|
14
|
-
new URL(".", import.meta.url).pathname,
|
|
15
|
-
"api-handler-trpc.js"
|
|
16
|
-
);
|
|
17
|
-
function kyro(options = {}) {
|
|
18
|
-
const {
|
|
19
|
-
configPath = "./kyro.config.ts",
|
|
20
|
-
apiPath = "/api",
|
|
21
|
-
adminPath = "/admin",
|
|
22
|
-
admin = true,
|
|
23
|
-
enableGraphQL = false,
|
|
24
|
-
enableTRPC = false,
|
|
25
|
-
enableWebSocket = false
|
|
26
|
-
} = options;
|
|
27
|
-
return {
|
|
28
|
-
name: "@kyro-cms/core",
|
|
29
|
-
hooks: {
|
|
30
|
-
"astro:config:setup": async ({ config, updateConfig, injectRoute, logger }) => {
|
|
31
|
-
logger.info(`Setting up Kyro CMS (API: ${apiPath}, Admin: ${adminPath})`);
|
|
32
|
-
if (apiPath === adminPath) {
|
|
33
|
-
throw new Error(`Kyro CMS: apiPath and adminPath cannot be the same ("${apiPath}")`);
|
|
34
|
-
}
|
|
35
|
-
const resolvedConfigPath = path.resolve(config.root.pathname, configPath);
|
|
36
|
-
let finalConfigPath = resolvedConfigPath;
|
|
37
|
-
if (!fs.existsSync(resolvedConfigPath)) {
|
|
38
|
-
logger.warn(`Kyro config file not found at ${configPath}. The API will fail to boot if collections are needed.`);
|
|
39
|
-
}
|
|
40
|
-
updateConfig({
|
|
41
|
-
vite: {
|
|
42
|
-
ssr: {
|
|
43
|
-
external: [
|
|
44
|
-
"better-sqlite3",
|
|
45
|
-
"pg",
|
|
46
|
-
"mongodb",
|
|
47
|
-
"ioredis",
|
|
48
|
-
"sharp",
|
|
49
|
-
"ssh2",
|
|
50
|
-
"cpu-features",
|
|
51
|
-
"ssh2-sftp-client",
|
|
52
|
-
"nodemailer",
|
|
53
|
-
"jsonwebtoken",
|
|
54
|
-
"@mapbox/node-pre-gyp",
|
|
55
|
-
"mock-aws-s3",
|
|
56
|
-
"aws-sdk",
|
|
57
|
-
"nock"
|
|
58
|
-
]
|
|
59
|
-
},
|
|
60
|
-
build: {
|
|
61
|
-
rollupOptions: {
|
|
62
|
-
external: [
|
|
63
|
-
"better-sqlite3",
|
|
64
|
-
"pg",
|
|
65
|
-
"mongodb",
|
|
66
|
-
"ioredis",
|
|
67
|
-
"sharp",
|
|
68
|
-
"ssh2",
|
|
69
|
-
"cpu-features",
|
|
70
|
-
"ssh2-sftp-client",
|
|
71
|
-
"nodemailer",
|
|
72
|
-
"jsonwebtoken",
|
|
73
|
-
"@mapbox/node-pre-gyp",
|
|
74
|
-
"mock-aws-s3",
|
|
75
|
-
"aws-sdk",
|
|
76
|
-
"nock"
|
|
77
|
-
]
|
|
78
|
-
}
|
|
79
|
-
},
|
|
80
|
-
optimizeDeps: {
|
|
81
|
-
exclude: [
|
|
82
|
-
"better-sqlite3",
|
|
83
|
-
"pg",
|
|
84
|
-
"mongodb",
|
|
85
|
-
"ioredis",
|
|
86
|
-
"sharp",
|
|
87
|
-
"ssh2",
|
|
88
|
-
"cpu-features",
|
|
89
|
-
"ssh2-sftp-client",
|
|
90
|
-
"nodemailer",
|
|
91
|
-
"jsonwebtoken",
|
|
92
|
-
"@mapbox/node-pre-gyp",
|
|
93
|
-
"mock-aws-s3",
|
|
94
|
-
"aws-sdk",
|
|
95
|
-
"nock"
|
|
96
|
-
]
|
|
97
|
-
},
|
|
98
|
-
plugins: [
|
|
99
|
-
{
|
|
100
|
-
name: "use-sync-external-store-shim-fix",
|
|
101
|
-
enforce: "pre",
|
|
102
|
-
resolveId(id) {
|
|
103
|
-
if (id === "use-sync-external-store/shim" || id === "use-sync-external-store/shim/index.js") {
|
|
104
|
-
return "\0virtual:use-sync-external-store-shim";
|
|
105
|
-
}
|
|
106
|
-
if (id === "use-sync-external-store/shim/with-selector" || id === "use-sync-external-store/shim/with-selector.js") {
|
|
107
|
-
return "\0virtual:use-sync-external-store-shim-with-selector";
|
|
108
|
-
}
|
|
109
|
-
},
|
|
110
|
-
load(id) {
|
|
111
|
-
if (id === "\0virtual:use-sync-external-store-shim") {
|
|
112
|
-
return `export { useSyncExternalStore } from "react";`;
|
|
113
|
-
}
|
|
114
|
-
if (id === "\0virtual:use-sync-external-store-shim-with-selector") {
|
|
115
|
-
return `
|
|
116
|
-
import { useSyncExternalStore, useMemo } from "react";
|
|
117
|
-
export function useSyncExternalStoreWithSelector(subscribe, getSnapshot, getServerSnapshot, selector, isEqual) {
|
|
118
|
-
const memoizedSelector = useMemo(() => {
|
|
119
|
-
let last, lastSnap, hasMemo = false;
|
|
120
|
-
return (snap) => {
|
|
121
|
-
if (!hasMemo || !Object.is(lastSnap, snap)) {
|
|
122
|
-
const next = selector(snap);
|
|
123
|
-
if (!hasMemo || !(isEqual ? isEqual(last, next) : Object.is(last, next))) {
|
|
124
|
-
last = next; lastSnap = snap; hasMemo = true;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
return last;
|
|
128
|
-
};
|
|
129
|
-
}, [selector, isEqual]);
|
|
130
|
-
const getSelection = () => memoizedSelector(getSnapshot());
|
|
131
|
-
const getServerSelection = getServerSnapshot != null ? () => memoizedSelector(getServerSnapshot()) : undefined;
|
|
132
|
-
return useSyncExternalStore(subscribe, getSelection, getServerSelection);
|
|
133
|
-
}
|
|
134
|
-
`;
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
],
|
|
139
|
-
resolve: {
|
|
140
|
-
alias: {
|
|
141
|
-
"kyro:config": finalConfigPath
|
|
142
|
-
}
|
|
143
|
-
},
|
|
144
|
-
define: {
|
|
145
|
-
__KYRO_API_PATH__: JSON.stringify(apiPath),
|
|
146
|
-
__KYRO_ADMIN_PATH__: JSON.stringify(adminPath),
|
|
147
|
-
__KYRO_ENABLE_GRAPHQL__: JSON.stringify(enableGraphQL),
|
|
148
|
-
__KYRO_ENABLE_TRPC__: JSON.stringify(enableTRPC),
|
|
149
|
-
__KYRO_ENABLE_WS__: JSON.stringify(enableWebSocket)
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
});
|
|
153
|
-
injectRoute({
|
|
154
|
-
pattern: `${apiPath}/[...path]`,
|
|
155
|
-
entrypoint: API_HANDLER_ENTRYPOINT
|
|
156
|
-
});
|
|
157
|
-
if (enableGraphQL) {
|
|
158
|
-
injectRoute({
|
|
159
|
-
pattern: `${apiPath}/graphql`,
|
|
160
|
-
entrypoint: GRAPHQL_HANDLER_ENTRYPOINT
|
|
161
|
-
});
|
|
162
|
-
logger.info(`GraphQL endpoint enabled at ${apiPath}/graphql`);
|
|
163
|
-
}
|
|
164
|
-
if (enableTRPC) {
|
|
165
|
-
injectRoute({
|
|
166
|
-
pattern: `${apiPath}/trpc/[...path]`,
|
|
167
|
-
entrypoint: TRPC_HANDLER_ENTRYPOINT
|
|
168
|
-
});
|
|
169
|
-
logger.info(`tRPC endpoint enabled at ${apiPath}/trpc`);
|
|
170
|
-
}
|
|
171
|
-
if (enableWebSocket) {
|
|
172
|
-
logger.info(`WebSocket support enabled (auto-starts at first request)`);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
};
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
export { kyro };
|
|
180
|
-
//# sourceMappingURL=chunk-X4BPPD6K.js.map
|
|
181
|
-
//# sourceMappingURL=chunk-X4BPPD6K.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/integration.ts"],"names":[],"mappings":"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","file":"chunk-X4BPPD6K.js","sourcesContent":["import type { AstroIntegration } from \"astro\";\nimport path from \"path\";\nimport fs from \"fs\";\n\nconst API_HANDLER_ENTRYPOINT = path.resolve(\n new URL(\".\", import.meta.url).pathname,\n \"api-handler.js\",\n);\nconst GRAPHQL_HANDLER_ENTRYPOINT = path.resolve(\n new URL(\".\", import.meta.url).pathname,\n \"api-handler-graphql.js\",\n);\nconst TRPC_HANDLER_ENTRYPOINT = path.resolve(\n new URL(\".\", import.meta.url).pathname,\n \"api-handler-trpc.js\",\n);\n\nexport interface KyroIntegrationOptions {\n configPath?: string;\n apiPath?: string;\n adminPath?: string;\n admin?: boolean;\n enableGraphQL?: boolean;\n enableTRPC?: boolean;\n enableWebSocket?: boolean;\n}\n\nexport default function kyro(options: KyroIntegrationOptions = {}): AstroIntegration {\n const {\n configPath = \"./kyro.config.ts\",\n apiPath = \"/api\",\n adminPath = \"/admin\",\n admin = true,\n enableGraphQL = false,\n enableTRPC = false,\n enableWebSocket = false,\n } = options;\n\n return {\n name: \"@kyro-cms/core\",\n hooks: {\n \"astro:config:setup\": async ({ config, updateConfig, injectRoute, logger }) => {\n logger.info(`Setting up Kyro CMS (API: ${apiPath}, Admin: ${adminPath})`);\n \n if (apiPath === adminPath) {\n throw new Error(`Kyro CMS: apiPath and adminPath cannot be the same (\"${apiPath}\")`);\n }\n\n const resolvedConfigPath = path.resolve(config.root.pathname, configPath);\n \n let finalConfigPath = resolvedConfigPath;\n if (!fs.existsSync(resolvedConfigPath)) {\n logger.warn(`Kyro config file not found at ${configPath}. The API will fail to boot if collections are needed.`);\n }\n \n updateConfig({\n vite: {\n ssr: {\n external: [\n \"better-sqlite3\",\n \"pg\",\n \"mongodb\",\n \"ioredis\",\n \"sharp\",\n \"ssh2\",\n \"cpu-features\",\n \"ssh2-sftp-client\",\n \"nodemailer\",\n \"jsonwebtoken\",\n \"@mapbox/node-pre-gyp\",\n \"mock-aws-s3\",\n \"aws-sdk\",\n \"nock\",\n ],\n },\n build: {\n rollupOptions: {\n external: [\n \"better-sqlite3\",\n \"pg\",\n \"mongodb\",\n \"ioredis\",\n \"sharp\",\n \"ssh2\",\n \"cpu-features\",\n \"ssh2-sftp-client\",\n \"nodemailer\",\n \"jsonwebtoken\",\n \"@mapbox/node-pre-gyp\",\n \"mock-aws-s3\",\n \"aws-sdk\",\n \"nock\",\n ],\n },\n },\n optimizeDeps: {\n exclude: [\n \"better-sqlite3\",\n \"pg\",\n \"mongodb\",\n \"ioredis\",\n \"sharp\",\n \"ssh2\",\n \"cpu-features\",\n \"ssh2-sftp-client\",\n \"nodemailer\",\n \"jsonwebtoken\",\n \"@mapbox/node-pre-gyp\",\n \"mock-aws-s3\",\n \"aws-sdk\",\n \"nock\",\n ],\n },\n plugins: [\n {\n name: \"use-sync-external-store-shim-fix\",\n enforce: \"pre\" as const,\n resolveId(id: string) {\n if (\n id === \"use-sync-external-store/shim\" ||\n id === \"use-sync-external-store/shim/index.js\"\n ) {\n return \"\\0virtual:use-sync-external-store-shim\";\n }\n if (\n id === \"use-sync-external-store/shim/with-selector\" ||\n id === \"use-sync-external-store/shim/with-selector.js\"\n ) {\n return \"\\0virtual:use-sync-external-store-shim-with-selector\";\n }\n },\n load(id: string) {\n if (id === \"\\0virtual:use-sync-external-store-shim\") {\n return `export { useSyncExternalStore } from \"react\";`;\n }\n if (id === \"\\0virtual:use-sync-external-store-shim-with-selector\") {\n return `\nimport { useSyncExternalStore, useMemo } from \"react\";\nexport function useSyncExternalStoreWithSelector(subscribe, getSnapshot, getServerSnapshot, selector, isEqual) {\n const memoizedSelector = useMemo(() => {\n let last, lastSnap, hasMemo = false;\n return (snap) => {\n if (!hasMemo || !Object.is(lastSnap, snap)) {\n const next = selector(snap);\n if (!hasMemo || !(isEqual ? isEqual(last, next) : Object.is(last, next))) {\n last = next; lastSnap = snap; hasMemo = true;\n }\n }\n return last;\n };\n }, [selector, isEqual]);\n const getSelection = () => memoizedSelector(getSnapshot());\n const getServerSelection = getServerSnapshot != null ? () => memoizedSelector(getServerSnapshot()) : undefined;\n return useSyncExternalStore(subscribe, getSelection, getServerSelection);\n}\n`;\n }\n },\n },\n ],\n resolve: {\n alias: {\n \"kyro:config\": finalConfigPath,\n },\n },\n define: {\n __KYRO_API_PATH__: JSON.stringify(apiPath),\n __KYRO_ADMIN_PATH__: JSON.stringify(adminPath),\n __KYRO_ENABLE_GRAPHQL__: JSON.stringify(enableGraphQL),\n __KYRO_ENABLE_TRPC__: JSON.stringify(enableTRPC),\n __KYRO_ENABLE_WS__: JSON.stringify(enableWebSocket),\n },\n },\n });\n \n injectRoute({\n pattern: `${apiPath}/[...path]`,\n entrypoint: API_HANDLER_ENTRYPOINT,\n });\n\n if (enableGraphQL) {\n injectRoute({\n pattern: `${apiPath}/graphql`,\n entrypoint: GRAPHQL_HANDLER_ENTRYPOINT,\n });\n logger.info(`GraphQL endpoint enabled at ${apiPath}/graphql`);\n }\n\n if (enableTRPC) {\n injectRoute({\n pattern: `${apiPath}/trpc/[...path]`,\n entrypoint: TRPC_HANDLER_ENTRYPOINT,\n });\n logger.info(`tRPC endpoint enabled at ${apiPath}/trpc`);\n }\n\n if (enableWebSocket) {\n logger.info(`WebSocket support enabled (auto-starts at first request)`);\n }\n },\n },\n };\n}\n"]}
|
package/dist/chunk-XEB7PH2E.js
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
// src/templates/auth.ts
|
|
2
|
-
var usersCollection = {
|
|
3
|
-
slug: "users",
|
|
4
|
-
label: "Users",
|
|
5
|
-
fields: [
|
|
6
|
-
{ name: "name", type: "text", label: "Name" },
|
|
7
|
-
{ name: "email", type: "email", required: true },
|
|
8
|
-
{
|
|
9
|
-
name: "passwordHash",
|
|
10
|
-
type: "text",
|
|
11
|
-
label: "Password Hash",
|
|
12
|
-
admin: { hidden: true }
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
name: "role",
|
|
16
|
-
type: "select",
|
|
17
|
-
options: [
|
|
18
|
-
{ label: "Super Admin", value: "super_admin" },
|
|
19
|
-
{ label: "Admin", value: "admin" },
|
|
20
|
-
{ label: "Editor", value: "editor" },
|
|
21
|
-
{ label: "Author", value: "author" },
|
|
22
|
-
{ label: "Customer", value: "customer" },
|
|
23
|
-
{ label: "Guest", value: "guest" }
|
|
24
|
-
],
|
|
25
|
-
required: true
|
|
26
|
-
},
|
|
27
|
-
{ name: "avatar", type: "upload", relationTo: "media", label: "Profile Picture" },
|
|
28
|
-
{ name: "tenantId", type: "text", label: "Tenant" },
|
|
29
|
-
{ name: "emailVerified", type: "checkbox", label: "Email Verified" },
|
|
30
|
-
{ name: "locked", type: "checkbox" },
|
|
31
|
-
{
|
|
32
|
-
name: "lastLogin",
|
|
33
|
-
type: "date",
|
|
34
|
-
time: true,
|
|
35
|
-
label: "Last Login",
|
|
36
|
-
admin: { readOnly: true }
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
name: "failedLoginAttempts",
|
|
40
|
-
type: "number",
|
|
41
|
-
label: "Failed Login Attempts",
|
|
42
|
-
admin: { readOnly: true }
|
|
43
|
-
}
|
|
44
|
-
],
|
|
45
|
-
timestamps: true,
|
|
46
|
-
admin: {
|
|
47
|
-
useAsTitle: "email",
|
|
48
|
-
defaultColumns: ["email", "role", "tenantId", "lastLogin"]
|
|
49
|
-
}
|
|
50
|
-
};
|
|
51
|
-
var auditLogsCollection = {
|
|
52
|
-
slug: "audit_logs",
|
|
53
|
-
label: "Audit Logs",
|
|
54
|
-
fields: [
|
|
55
|
-
{ name: "action", type: "text", required: true },
|
|
56
|
-
{ name: "userId", type: "text", label: "User ID" },
|
|
57
|
-
{ name: "userEmail", type: "email", label: "User Email" },
|
|
58
|
-
{ name: "role", type: "text" },
|
|
59
|
-
{ name: "resource", type: "text", label: "Resource" },
|
|
60
|
-
{ name: "ipAddress", type: "text", label: "IP Address" },
|
|
61
|
-
{ name: "success", type: "checkbox" },
|
|
62
|
-
{
|
|
63
|
-
name: "timestamp",
|
|
64
|
-
type: "date",
|
|
65
|
-
time: true,
|
|
66
|
-
required: true,
|
|
67
|
-
admin: { readOnly: true }
|
|
68
|
-
}
|
|
69
|
-
],
|
|
70
|
-
admin: {
|
|
71
|
-
defaultColumns: ["action", "userEmail", "resource", "success", "timestamp"]
|
|
72
|
-
}
|
|
73
|
-
};
|
|
74
|
-
var authCollections = {
|
|
75
|
-
users: usersCollection,
|
|
76
|
-
audit_logs: auditLogsCollection
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
export { authCollections, usersCollection };
|
|
80
|
-
//# sourceMappingURL=chunk-XEB7PH2E.js.map
|
|
81
|
-
//# sourceMappingURL=chunk-XEB7PH2E.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/templates/auth.ts"],"names":[],"mappings":"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","file":"chunk-XEB7PH2E.js","sourcesContent":["import type { CollectionConfig } from \"../registry/types.js\";\n\nexport const usersCollection: CollectionConfig = {\n slug: \"users\",\n label: \"Users\",\n fields: [\n { name: \"name\", type: \"text\", label: \"Name\" },\n { name: \"email\", type: \"email\", required: true },\n {\n name: \"passwordHash\",\n type: \"text\",\n label: \"Password Hash\",\n admin: { hidden: true },\n },\n {\n name: \"role\",\n type: \"select\",\n options: [\n { label: \"Super Admin\", value: \"super_admin\" },\n { label: \"Admin\", value: \"admin\" },\n { label: \"Editor\", value: \"editor\" },\n { label: \"Author\", value: \"author\" },\n { label: \"Customer\", value: \"customer\" },\n { label: \"Guest\", value: \"guest\" },\n ],\n required: true,\n },\n { name: \"avatar\", type: \"upload\", relationTo: \"media\", label: \"Profile Picture\" },\n { name: \"tenantId\", type: \"text\", label: \"Tenant\" },\n { name: \"emailVerified\", type: \"checkbox\", label: \"Email Verified\" },\n { name: \"locked\", type: \"checkbox\" },\n {\n name: \"lastLogin\",\n type: \"date\",\n time: true,\n label: \"Last Login\",\n admin: { readOnly: true },\n },\n {\n name: \"failedLoginAttempts\",\n type: \"number\",\n label: \"Failed Login Attempts\",\n admin: { readOnly: true },\n },\n ],\n timestamps: true,\n admin: {\n useAsTitle: \"email\",\n defaultColumns: [\"email\", \"role\", \"tenantId\", \"lastLogin\"],\n },\n};\n\nexport const auditLogsCollection: CollectionConfig = {\n slug: \"audit_logs\",\n label: \"Audit Logs\",\n fields: [\n { name: \"action\", type: \"text\", required: true },\n { name: \"userId\", type: \"text\", label: \"User ID\" },\n { name: \"userEmail\", type: \"email\", label: \"User Email\" },\n { name: \"role\", type: \"text\" },\n { name: \"resource\", type: \"text\", label: \"Resource\" },\n { name: \"ipAddress\", type: \"text\", label: \"IP Address\" },\n { name: \"success\", type: \"checkbox\" },\n {\n name: \"timestamp\",\n type: \"date\",\n time: true,\n required: true,\n admin: { readOnly: true },\n },\n ],\n admin: {\n defaultColumns: [\"action\", \"userEmail\", \"resource\", \"success\", \"timestamp\"],\n },\n};\n\nexport const authCollections = {\n users: usersCollection,\n audit_logs: auditLogsCollection,\n};\n"]}
|