@kyro-cms/core 0.1.5 → 0.1.7
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-BCgL1bLF.d.cts +112 -0
- package/dist/WebhookService-BPVJUgTl.d.ts +112 -0
- package/dist/{base-DlhVlwnN.d.cts → base-B0Y6isUJ.d.cts} +1 -1
- package/dist/{base-CQkFzqQl.d.ts → base-DaP-5PPG.d.ts} +1 -1
- package/dist/bootstrap-BMWVB2T6.cjs +31 -0
- package/dist/{bootstrap-X6TP3NKX.cjs.map → bootstrap-BMWVB2T6.cjs.map} +1 -1
- package/dist/bootstrap-LL6O7PWO.js +6 -0
- package/dist/{bootstrap-BDTTUGY2.js.map → bootstrap-LL6O7PWO.js.map} +1 -1
- package/dist/{chunk-3VZCX4DF.cjs → chunk-42JPONZU.cjs} +77 -14
- package/dist/chunk-42JPONZU.cjs.map +1 -0
- package/dist/{chunk-MHS6CPO5.cjs → chunk-4M5PHMUE.cjs} +66 -346
- package/dist/chunk-4M5PHMUE.cjs.map +1 -0
- package/dist/chunk-4PWRCMTQ.cjs +15 -0
- package/dist/chunk-4PWRCMTQ.cjs.map +1 -0
- package/dist/chunk-6COM32WF.js +47 -0
- package/dist/chunk-6COM32WF.js.map +1 -0
- package/dist/chunk-6MSSF46R.js +941 -0
- package/dist/chunk-6MSSF46R.js.map +1 -0
- package/dist/{chunk-TZFJMPCH.cjs → chunk-7YITG2US.cjs} +9 -18
- package/dist/chunk-7YITG2US.cjs.map +1 -0
- package/dist/{chunk-A3RQWHKD.cjs → chunk-BLMFBDBG.cjs} +56 -6
- package/dist/chunk-BLMFBDBG.cjs.map +1 -0
- package/dist/{chunk-EINVJPFM.js → chunk-BTOE3VUK.js} +65 -3
- package/dist/chunk-BTOE3VUK.js.map +1 -0
- package/dist/chunk-E5X75WNB.js +497 -0
- package/dist/chunk-E5X75WNB.js.map +1 -0
- package/dist/chunk-E63IF3MD.cjs +951 -0
- package/dist/chunk-E63IF3MD.cjs.map +1 -0
- package/dist/{chunk-K7QF2QCM.cjs → chunk-FTSSDDZQ.cjs} +7 -3
- package/dist/chunk-FTSSDDZQ.cjs.map +1 -0
- package/dist/chunk-G7VZBCD6.cjs +35 -0
- package/dist/{chunk-5BLDMQED.cjs.map → chunk-G7VZBCD6.cjs.map} +1 -1
- package/dist/{chunk-VMSRTAH7.js → chunk-GLCPGZPM.js} +56 -6
- package/dist/chunk-GLCPGZPM.js.map +1 -0
- package/dist/{chunk-V3B25QOK.cjs → chunk-GVFB5C6O.cjs} +74 -2
- package/dist/chunk-GVFB5C6O.cjs.map +1 -0
- package/dist/chunk-HVSQDZZJ.cjs +765 -0
- package/dist/chunk-HVSQDZZJ.cjs.map +1 -0
- package/dist/chunk-HYC4GNHX.js +758 -0
- package/dist/chunk-HYC4GNHX.js.map +1 -0
- package/dist/chunk-KDVDIZ4Y.cjs +3479 -0
- package/dist/chunk-KDVDIZ4Y.cjs.map +1 -0
- package/dist/{chunk-OG3KX56O.js → chunk-KWGNR4HM.js} +7 -3
- package/dist/chunk-KWGNR4HM.js.map +1 -0
- package/dist/chunk-LIJVWQKU.cjs +256 -0
- package/dist/chunk-LIJVWQKU.cjs.map +1 -0
- package/dist/{chunk-XTZSUDSI.js → chunk-LTRCYJAG.js} +3 -18
- package/dist/chunk-LTRCYJAG.js.map +1 -0
- package/dist/{chunk-UEYC46RL.js → chunk-OUGKLCYF.js} +71 -8
- package/dist/chunk-OUGKLCYF.js.map +1 -0
- package/dist/chunk-RONAX6UU.js +3456 -0
- package/dist/chunk-RONAX6UU.js.map +1 -0
- package/dist/{chunk-C74MQIRL.js → chunk-RRYXQMZG.js} +66 -344
- package/dist/chunk-RRYXQMZG.js.map +1 -0
- package/dist/{chunk-QUJ4OLSC.js → chunk-U74F3YZU.js} +87 -7
- package/dist/chunk-U74F3YZU.js.map +1 -0
- package/dist/chunk-VIONYQ2K.cjs +517 -0
- package/dist/chunk-VIONYQ2K.cjs.map +1 -0
- package/dist/chunk-VSTRLXMQ.cjs +50 -0
- package/dist/chunk-VSTRLXMQ.cjs.map +1 -0
- package/dist/chunk-YT7HXXVN.js +13 -0
- package/dist/chunk-YT7HXXVN.js.map +1 -0
- package/dist/chunk-Z6ZWNWWR.js +30 -0
- package/dist/{chunk-NSBPE2FW.js.map → chunk-Z6ZWNWWR.js.map} +1 -1
- package/dist/cli/index.cjs +11 -7
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +11 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/drizzle/index.cjs +20 -17
- package/dist/drizzle/index.d.cts +4 -4
- package/dist/drizzle/index.d.ts +4 -4
- package/dist/drizzle/index.js +4 -5
- package/dist/graphql/index.cjs +4 -4
- package/dist/graphql/index.d.cts +3 -2
- package/dist/graphql/index.d.ts +3 -2
- package/dist/graphql/index.js +2 -2
- package/dist/{index-DI0DRPNv.d.cts → index-BwE4NueJ.d.cts} +1 -1
- package/dist/{index-CMUNCIWQ.d.ts → index-DUKmDSeC.d.cts} +96 -24
- package/dist/{index-BMySjW6o.d.cts → index-DtBi3zP0.d.ts} +96 -24
- package/dist/{index-4fJKLFK2.d.ts → index-DupWTmW6.d.ts} +1 -1
- package/dist/index.cjs +3317 -352
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +379 -105
- package/dist/index.d.ts +379 -105
- package/dist/index.js +3211 -310
- package/dist/index.js.map +1 -1
- package/dist/media-HOT3O7RW.js +4 -0
- package/dist/media-HOT3O7RW.js.map +1 -0
- package/dist/media-WKP5AOX2.cjs +17 -0
- package/dist/media-WKP5AOX2.cjs.map +1 -0
- package/dist/mongodb/index.cjs +1 -1
- package/dist/mongodb/index.d.cts +2 -2
- package/dist/mongodb/index.d.ts +2 -2
- package/dist/mongodb/index.js +1 -1
- package/dist/mysql-media-AI6YK767.cjs +48 -0
- package/dist/mysql-media-AI6YK767.cjs.map +1 -0
- package/dist/mysql-media-CDZUS7YX.js +45 -0
- package/dist/mysql-media-CDZUS7YX.js.map +1 -0
- package/dist/postgres-auth-adapter-EVRPO7BQ.cjs +14 -0
- package/dist/{postgres-auth-adapter-VK6GY7LX.cjs.map → postgres-auth-adapter-EVRPO7BQ.cjs.map} +1 -1
- package/dist/postgres-auth-adapter-OTRWSTT5.js +5 -0
- package/dist/{postgres-auth-adapter-REJFUMP7.js.map → postgres-auth-adapter-OTRWSTT5.js.map} +1 -1
- package/dist/redis-adapter-2N6VA7BI.cjs +13 -0
- package/dist/{redis-adapter-LBLNKGNS.cjs.map → redis-adapter-2N6VA7BI.cjs.map} +1 -1
- package/dist/redis-adapter-RA24FNCX.js +4 -0
- package/dist/{redis-adapter-4YDY4LWE.js.map → redis-adapter-RA24FNCX.js.map} +1 -1
- package/dist/rest/index.cjs +7 -5
- package/dist/rest/index.d.cts +29 -3
- package/dist/rest/index.d.ts +29 -3
- package/dist/rest/index.js +5 -3
- package/dist/schema-CNB2DDTX.js +6 -0
- package/dist/schema-CNB2DDTX.js.map +1 -0
- package/dist/schema-Y777CQQS.cjs +67 -0
- package/dist/schema-Y777CQQS.cjs.map +1 -0
- package/dist/templates/index.cjs +24 -28
- package/dist/templates/index.d.cts +2 -4
- package/dist/templates/index.d.ts +2 -4
- package/dist/templates/index.js +2 -2
- package/dist/trpc/index.cjs +12 -12
- package/dist/trpc/index.d.cts +19 -14
- package/dist/trpc/index.d.ts +19 -14
- package/dist/trpc/index.js +3 -3
- package/dist/{types-BGM5MV_K.d.cts → types-BM0s_YOy.d.cts} +67 -35
- package/dist/{types-BGM5MV_K.d.ts → types-BM0s_YOy.d.ts} +67 -35
- package/dist/ws/index.cjs +1 -1
- package/dist/ws/index.js +1 -1
- package/package.json +11 -1
- package/dist/bootstrap-BDTTUGY2.js +0 -4
- package/dist/bootstrap-X6TP3NKX.cjs +0 -29
- package/dist/chunk-3QX6KG2S.js +0 -2125
- package/dist/chunk-3QX6KG2S.js.map +0 -1
- package/dist/chunk-3VZCX4DF.cjs.map +0 -1
- package/dist/chunk-5BLDMQED.cjs +0 -18
- package/dist/chunk-7G6EVYCU.cjs +0 -94
- package/dist/chunk-7G6EVYCU.cjs.map +0 -1
- package/dist/chunk-A3RQWHKD.cjs.map +0 -1
- package/dist/chunk-C74MQIRL.js.map +0 -1
- package/dist/chunk-EINVJPFM.js.map +0 -1
- package/dist/chunk-F5B64H5S.cjs +0 -2149
- package/dist/chunk-F5B64H5S.cjs.map +0 -1
- package/dist/chunk-K7QF2QCM.cjs.map +0 -1
- package/dist/chunk-LRTZJJPD.js +0 -86
- package/dist/chunk-LRTZJJPD.js.map +0 -1
- package/dist/chunk-MHS6CPO5.cjs.map +0 -1
- package/dist/chunk-NSBPE2FW.js +0 -15
- package/dist/chunk-OG3KX56O.js.map +0 -1
- package/dist/chunk-QUJ4OLSC.js.map +0 -1
- package/dist/chunk-R3XIBBAW.cjs +0 -34
- package/dist/chunk-R3XIBBAW.cjs.map +0 -1
- package/dist/chunk-SDMNUYVU.js +0 -30
- package/dist/chunk-SDMNUYVU.js.map +0 -1
- package/dist/chunk-TZFJMPCH.cjs.map +0 -1
- package/dist/chunk-UEG7KMKC.cjs +0 -228
- package/dist/chunk-UEG7KMKC.cjs.map +0 -1
- package/dist/chunk-UEYC46RL.js.map +0 -1
- package/dist/chunk-V3B25QOK.cjs.map +0 -1
- package/dist/chunk-VMSRTAH7.js.map +0 -1
- package/dist/chunk-XTZSUDSI.js.map +0 -1
- package/dist/chunk-YD7Y25W7.cjs +0 -176
- package/dist/chunk-YD7Y25W7.cjs.map +0 -1
- package/dist/chunk-YPAFJ7EV.js +0 -225
- package/dist/chunk-YPAFJ7EV.js.map +0 -1
- package/dist/database-7CJOXEZR.js +0 -5
- package/dist/database-7CJOXEZR.js.map +0 -1
- package/dist/database-QOIV44GT.cjs +0 -22
- package/dist/database-QOIV44GT.cjs.map +0 -1
- package/dist/postgres-auth-adapter-REJFUMP7.js +0 -5
- package/dist/postgres-auth-adapter-VK6GY7LX.cjs +0 -14
- package/dist/redis-adapter-4YDY4LWE.js +0 -4
- package/dist/redis-adapter-LBLNKGNS.cjs +0 -13
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/access/types.ts","../src/webhooks/types.ts","../src/webhooks/delivery.ts","../src/webhooks/WebhookService.ts","../src/auth/api-key.ts"],"names":["createHmac","randomBytes","randomUUID","timingSafeEqual"],"mappings":"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","file":"chunk-VIONYQ2K.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?: any;\n doc?: any;\n id?: string;\n tenantID?: string;\n context?: Record<string, any>;\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","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 });\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 }) 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 webhooks = await this.getWebhooks();\n const activeWebhooks = webhooks.filter((w) => w.status === \"active\");\n\n const matchingWebhooks = activeWebhooks.filter((w) =>\n w.events.includes(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 { 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 < 28; 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"]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var pgCore = require('drizzle-orm/pg-core');
|
|
4
|
+
|
|
5
|
+
// src/database/drizzle/schema/media.ts
|
|
6
|
+
var media = pgCore.pgTable(
|
|
7
|
+
"media",
|
|
8
|
+
{
|
|
9
|
+
id: pgCore.uuid("id").primaryKey().defaultRandom(),
|
|
10
|
+
filename: pgCore.varchar("filename", { length: 255 }).notNull().unique(),
|
|
11
|
+
title: pgCore.varchar("title", { length: 255 }),
|
|
12
|
+
originalName: pgCore.varchar("original_name", { length: 255 }).notNull(),
|
|
13
|
+
mimeType: pgCore.varchar("mime_type", { length: 100 }).notNull(),
|
|
14
|
+
fileSize: pgCore.integer("file_size").notNull(),
|
|
15
|
+
width: pgCore.integer("width"),
|
|
16
|
+
height: pgCore.integer("height"),
|
|
17
|
+
url: pgCore.text("url").notNull().unique(),
|
|
18
|
+
thumbnailUrl: pgCore.text("thumbnail_url"),
|
|
19
|
+
folder: pgCore.varchar("folder", { length: 255 }),
|
|
20
|
+
provider: pgCore.varchar("provider", { length: 50 }).notNull(),
|
|
21
|
+
alt: pgCore.text("alt"),
|
|
22
|
+
caption: pgCore.text("caption"),
|
|
23
|
+
metadata: pgCore.jsonb("metadata").$type(),
|
|
24
|
+
createdAt: pgCore.timestamp("created_at").defaultNow().notNull(),
|
|
25
|
+
updatedAt: pgCore.timestamp("updated_at").defaultNow().notNull()
|
|
26
|
+
},
|
|
27
|
+
(table) => [
|
|
28
|
+
pgCore.index("media_folder_idx").on(table.folder),
|
|
29
|
+
pgCore.index("media_provider_idx").on(table.provider),
|
|
30
|
+
pgCore.index("media_filename_idx").on(table.filename)
|
|
31
|
+
]
|
|
32
|
+
);
|
|
33
|
+
var mediaFolders = pgCore.pgTable(
|
|
34
|
+
"media_folders",
|
|
35
|
+
{
|
|
36
|
+
path: pgCore.varchar("path", { length: 500 }).primaryKey(),
|
|
37
|
+
// e.g. "documents/2024"
|
|
38
|
+
name: pgCore.varchar("name", { length: 255 }).notNull(),
|
|
39
|
+
parentPath: pgCore.varchar("parent_path", { length: 500 }),
|
|
40
|
+
createdAt: pgCore.timestamp("created_at").defaultNow().notNull()
|
|
41
|
+
},
|
|
42
|
+
(table) => [
|
|
43
|
+
pgCore.index("media_folders_parent_idx").on(table.parentPath)
|
|
44
|
+
]
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
exports.media = media;
|
|
48
|
+
exports.mediaFolders = mediaFolders;
|
|
49
|
+
//# sourceMappingURL=chunk-VSTRLXMQ.cjs.map
|
|
50
|
+
//# sourceMappingURL=chunk-VSTRLXMQ.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/database/drizzle/schema/media.ts"],"names":["pgTable","uuid","varchar","integer","text","jsonb","timestamp","index"],"mappings":";;;;;AAWO,IAAM,KAAA,GAAQA,cAAA;AAAA,EACnB,OAAA;AAAA,EACA;AAAA,IACE,IAAIC,WAAA,CAAK,IAAI,CAAA,CAAE,UAAA,GAAa,aAAA,EAAc;AAAA,IAC1C,QAAA,EAAUC,cAAA,CAAQ,UAAA,EAAY,EAAE,MAAA,EAAQ,KAAK,CAAA,CAAE,OAAA,EAAQ,CAAE,MAAA,EAAO;AAAA,IAChE,OAAOA,cAAA,CAAQ,OAAA,EAAS,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,IACvC,YAAA,EAAcA,eAAQ,eAAA,EAAiB,EAAE,QAAQ,GAAA,EAAK,EAAE,OAAA,EAAQ;AAAA,IAChE,QAAA,EAAUA,eAAQ,WAAA,EAAa,EAAE,QAAQ,GAAA,EAAK,EAAE,OAAA,EAAQ;AAAA,IACxD,QAAA,EAAUC,cAAA,CAAQ,WAAW,CAAA,CAAE,OAAA,EAAQ;AAAA,IACvC,KAAA,EAAOA,eAAQ,OAAO,CAAA;AAAA,IACtB,MAAA,EAAQA,eAAQ,QAAQ,CAAA;AAAA,IACxB,KAAKC,WAAA,CAAK,KAAK,CAAA,CAAE,OAAA,GAAU,MAAA,EAAO;AAAA,IAClC,YAAA,EAAcA,YAAK,eAAe,CAAA;AAAA,IAClC,QAAQF,cAAA,CAAQ,QAAA,EAAU,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,IACzC,QAAA,EAAUA,eAAQ,UAAA,EAAY,EAAE,QAAQ,EAAA,EAAI,EAAE,OAAA,EAAQ;AAAA,IACtD,GAAA,EAAKE,YAAK,KAAK,CAAA;AAAA,IACf,OAAA,EAASA,YAAK,SAAS,CAAA;AAAA,IACvB,QAAA,EAAUC,YAAA,CAAM,UAAU,CAAA,CAAE,KAAA,EAA+B;AAAA,IAC3D,WAAWC,gBAAA,CAAU,YAAY,CAAA,CAAE,UAAA,GAAa,OAAA,EAAQ;AAAA,IACxD,WAAWA,gBAAA,CAAU,YAAY,CAAA,CAAE,UAAA,GAAa,OAAA;AAAQ,GAC1D;AAAA,EACA,CAAC,KAAA,KAAU;AAAA,IACTC,YAAA,CAAM,kBAAkB,CAAA,CAAE,EAAA,CAAG,MAAM,MAAM,CAAA;AAAA,IACzCA,YAAA,CAAM,oBAAoB,CAAA,CAAE,EAAA,CAAG,MAAM,QAAQ,CAAA;AAAA,IAC7CA,YAAA,CAAM,oBAAoB,CAAA,CAAE,EAAA,CAAG,MAAM,QAAQ;AAAA;AAEjD;AAEO,IAAM,YAAA,GAAeP,cAAA;AAAA,EAC1B,eAAA;AAAA,EACA;AAAA,IACE,IAAA,EAAME,eAAQ,MAAA,EAAQ,EAAE,QAAQ,GAAA,EAAK,EAAE,UAAA,EAAW;AAAA;AAAA,IAClD,IAAA,EAAMA,eAAQ,MAAA,EAAQ,EAAE,QAAQ,GAAA,EAAK,EAAE,OAAA,EAAQ;AAAA,IAC/C,YAAYA,cAAA,CAAQ,aAAA,EAAe,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,IAClD,WAAWI,gBAAA,CAAU,YAAY,CAAA,CAAE,UAAA,GAAa,OAAA;AAAQ,GAC1D;AAAA,EACA,CAAC,KAAA,KAAU;AAAA,IACTC,YAAA,CAAM,0BAA0B,CAAA,CAAE,EAAA,CAAG,MAAM,UAAU;AAAA;AAEzD","file":"chunk-VSTRLXMQ.cjs","sourcesContent":["import {\n pgTable,\n uuid,\n varchar,\n timestamp,\n integer,\n text,\n jsonb,\n index,\n} from \"drizzle-orm/pg-core\";\n\nexport const media = pgTable(\n \"media\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n filename: varchar(\"filename\", { length: 255 }).notNull().unique(),\n title: varchar(\"title\", { length: 255 }),\n originalName: varchar(\"original_name\", { length: 255 }).notNull(),\n mimeType: varchar(\"mime_type\", { length: 100 }).notNull(),\n fileSize: integer(\"file_size\").notNull(),\n width: integer(\"width\"),\n height: integer(\"height\"),\n url: text(\"url\").notNull().unique(),\n thumbnailUrl: text(\"thumbnail_url\"),\n folder: varchar(\"folder\", { length: 255 }),\n provider: varchar(\"provider\", { length: 50 }).notNull(),\n alt: text(\"alt\"),\n caption: text(\"caption\"),\n metadata: jsonb(\"metadata\").$type<Record<string, unknown>>(),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n },\n (table) => [\n index(\"media_folder_idx\").on(table.folder),\n index(\"media_provider_idx\").on(table.provider),\n index(\"media_filename_idx\").on(table.filename),\n ],\n);\n\nexport const mediaFolders = pgTable(\n \"media_folders\",\n {\n path: varchar(\"path\", { length: 500 }).primaryKey(), // e.g. \"documents/2024\"\n name: varchar(\"name\", { length: 255 }).notNull(),\n parentPath: varchar(\"parent_path\", { length: 500 }),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n },\n (table) => [\n index(\"media_folders_parent_idx\").on(table.parentPath),\n ]\n);\n\nexport type Media = typeof media.$inferSelect;\nexport type NewMedia = typeof media.$inferInsert;\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { pgTable, timestamp, text, varchar } from 'drizzle-orm/pg-core';
|
|
2
|
+
|
|
3
|
+
// src/database/drizzle/schema/settings.ts
|
|
4
|
+
var settings = pgTable("settings", {
|
|
5
|
+
key: varchar("key", { length: 255 }).primaryKey(),
|
|
6
|
+
value: text("value").notNull(),
|
|
7
|
+
description: text("description"),
|
|
8
|
+
updatedAt: timestamp("updated_at").defaultNow()
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
export { settings };
|
|
12
|
+
//# sourceMappingURL=chunk-YT7HXXVN.js.map
|
|
13
|
+
//# sourceMappingURL=chunk-YT7HXXVN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/database/drizzle/schema/settings.ts"],"names":[],"mappings":";;;AAEO,IAAM,QAAA,GAAW,QAAQ,UAAA,EAAY;AAAA,EAC1C,GAAA,EAAK,QAAQ,KAAA,EAAO,EAAE,QAAQ,GAAA,EAAK,EAAE,UAAA,EAAW;AAAA,EAChD,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA,CAAE,OAAA,EAAQ;AAAA,EAC7B,WAAA,EAAa,KAAK,aAAa,CAAA;AAAA,EAC/B,SAAA,EAAW,SAAA,CAAU,YAAY,CAAA,CAAE,UAAA;AACrC,CAAC","file":"chunk-YT7HXXVN.js","sourcesContent":["import { pgTable, varchar, text, timestamp } from \"drizzle-orm/pg-core\";\n\nexport const settings = pgTable(\"settings\", {\n key: varchar(\"key\", { length: 255 }).primaryKey(),\n value: text(\"value\").notNull(),\n description: text(\"description\"),\n updatedAt: timestamp(\"updated_at\").defaultNow(),\n});\n\nexport type Setting = typeof settings.$inferSelect;\nexport type NewSetting = typeof settings.$inferInsert;\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
6
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
7
|
+
}) : x)(function(x) {
|
|
8
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
9
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
10
|
+
});
|
|
11
|
+
var __esm = (fn, res) => function __init() {
|
|
12
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
13
|
+
};
|
|
14
|
+
var __export = (target, all) => {
|
|
15
|
+
for (var name in all)
|
|
16
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
17
|
+
};
|
|
18
|
+
var __copyProps = (to, from, except, desc) => {
|
|
19
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
20
|
+
for (let key of __getOwnPropNames(from))
|
|
21
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
22
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
23
|
+
}
|
|
24
|
+
return to;
|
|
25
|
+
};
|
|
26
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
27
|
+
|
|
28
|
+
export { __esm, __export, __require, __toCommonJS };
|
|
29
|
+
//# sourceMappingURL=chunk-Z6ZWNWWR.js.map
|
|
30
|
+
//# sourceMappingURL=chunk-Z6ZWNWWR.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-Z6ZWNWWR.js"}
|
package/dist/cli/index.cjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
require('../chunk-
|
|
4
|
+
require('../chunk-G7VZBCD6.cjs');
|
|
5
5
|
var commander = require('commander');
|
|
6
6
|
var fs = require('fs');
|
|
7
7
|
var path = require('path');
|
|
@@ -354,10 +354,13 @@ authCommand.command("bootstrap").description("Create initial admin user").option
|
|
|
354
354
|
console.log(` Email: ${options.email}`);
|
|
355
355
|
console.log(` Role: ${options.role}`);
|
|
356
356
|
try {
|
|
357
|
-
const { bootstrapAdmin } = await import('../bootstrap-
|
|
358
|
-
const { PostgresAuthAdapter } = await import('../postgres-auth-adapter-
|
|
359
|
-
const {
|
|
360
|
-
const {
|
|
357
|
+
const { bootstrapAdmin } = await import('../bootstrap-BMWVB2T6.cjs');
|
|
358
|
+
const { PostgresAuthAdapter } = await import('../postgres-auth-adapter-EVRPO7BQ.cjs');
|
|
359
|
+
const { drizzle } = await import('drizzle-orm/postgres-js');
|
|
360
|
+
const { default: postgres } = await import('postgres');
|
|
361
|
+
const databaseUrl = process.env.DATABASE_URL || "postgresql://postgres:postgres@localhost:5432/kyro_cms";
|
|
362
|
+
const client = postgres(databaseUrl, { max: 1 });
|
|
363
|
+
const db = drizzle(client);
|
|
361
364
|
const adapter = new PostgresAuthAdapter({ db });
|
|
362
365
|
const result = await bootstrapAdmin({
|
|
363
366
|
authAdapter: adapter,
|
|
@@ -380,8 +383,9 @@ authCommand.command("bootstrap").description("Create initial admin user").option
|
|
|
380
383
|
program.command("health").description("Check system health").action(async () => {
|
|
381
384
|
console.log("\u{1F3E5} System Health Check");
|
|
382
385
|
try {
|
|
383
|
-
const {
|
|
384
|
-
const
|
|
386
|
+
const { default: postgres } = await import('postgres');
|
|
387
|
+
const databaseUrl = process.env.DATABASE_URL || "postgresql://postgres:postgres@localhost:5432/kyro_cms";
|
|
388
|
+
const client = postgres(databaseUrl, { max: 1 });
|
|
385
389
|
await client.unsafe("SELECT 1");
|
|
386
390
|
console.log(" \u2705 Database: Connected");
|
|
387
391
|
await client.end();
|
package/dist/cli/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/generate.ts","../../src/cli/index.ts"],"names":["Command","resolve","glob","join","existsSync","mkdirSync","writeFileSync","__filename","fileURLToPath","__dirname","dirname","readFileSync"],"mappings":"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","file":"index.cjs","sourcesContent":["import { Command } from 'commander';\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { glob } from 'glob';\n\n// ============================================================================\n// Type Generator\n// ============================================================================\n\ninterface FieldConfig {\n name?: string;\n type: string;\n required?: boolean;\n fields?: FieldConfig[];\n relationTo?: string | string[];\n hasMany?: boolean;\n options?: Array<{ label: string; value: string }>;\n}\n\ninterface CollectionConfig {\n slug: string;\n label?: string;\n fields: FieldConfig[];\n}\n\nfunction fieldToType(field: FieldConfig): string {\n switch (field.type) {\n case 'text':\n case 'email':\n case 'password':\n case 'textarea':\n case 'color':\n case 'code':\n case 'markdown':\n case 'date':\n case 'richtext':\n case 'json':\n return field.hasMany ? 'string[]' : 'string';\n case 'number':\n return field.hasMany ? 'number[]' : 'number';\n case 'checkbox':\n return 'boolean';\n case 'select':\n case 'radio':\n if (field.options) {\n const values = field.options.map(o => `'${o.value}'`).join(' | ');\n return field.hasMany ? `(${values})[]` : values;\n }\n return field.hasMany ? 'string[]' : 'string';\n case 'relationship':\n if (Array.isArray(field.relationTo)) {\n const types = field.relationTo.map(r => `${capitalize(r)} | string`).join(' | ');\n return field.hasMany ? `(${types})[]` : `(${types})`;\n }\n const relTo = field.relationTo || 'unknown';\n return field.hasMany ? `(${capitalize(relTo)} | string)[]` : `${capitalize(relTo)} | string`;\n case 'upload':\n return field.hasMany ? '(Media | string)[]' : 'Media | string';\n case 'array':\n if (field.fields && field.fields.length > 0) {\n const itemFields = field.fields.filter(f => f.name).map(f => {\n const type = fieldToType(f);\n return ` ${f.name}${f.required ? '' : '?'}: ${type};`;\n }).join('\\n');\n return `Array<{\\n${itemFields}\\n }>`;\n }\n return 'Record<string, any>[]';\n case 'group':\n if (field.fields && field.fields.length > 0) {\n const itemFields = field.fields.filter(f => f.name).map(f => {\n const type = fieldToType(f);\n return ` ${f.name}${f.required ? '' : '?'}: ${type};`;\n }).join('\\n');\n return `{\\n${itemFields}\\n}`;\n }\n return 'Record<string, any>';\n case 'blocks':\n return 'Block[]';\n default:\n return 'any';\n }\n}\n\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1).replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\nfunction collectionToInterface(collection: CollectionConfig): string {\n const name = capitalize(collection.slug);\n const fields = collection.fields.filter(f => f.name).map(f => {\n const type = fieldToType(f);\n return ` ${f.name}${f.required ? '' : '?'}: ${type};`;\n });\n\n // Add default fields\n fields.unshift(' id: string;');\n fields.push(' createdAt: string;');\n fields.push(' updatedAt: string;');\n\n return `export interface ${name} {\\n${fields.join('\\n')}\\n}`;\n}\n\nfunction generateTypes(collections: CollectionConfig[]): string {\n const interfaces = collections.map(c => collectionToInterface(c));\n \n const header = `// ============================================================================\n// Auto-generated by kyro generate\n// ============================================================================\n\nimport type { RichTextBlock } from '@kyro-cms/core';\n\nexport interface Media {\n id: string;\n url: string;\n filename: string;\n mimeType: string;\n filesize: number;\n width?: number;\n height?: number;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface Block {\n blockType: string;\n [key: string]: any;\n}\n\n`;\n\n const body = interfaces.join('\\n\\n');\n\n const footer = `\n\n// ============================================================================\n// Query Types\n// ============================================================================\n\nexport interface KyroWhereClause {\n [field: string]: {\n equals?: any;\n not_equals?: any;\n in?: any[];\n not_in?: any[];\n greater_than?: number;\n greater_than_equal?: number;\n less_than?: number;\n less_than_equal?: number;\n like?: string;\n exists?: boolean;\n };\n}\n\nexport interface KyroFindArgs {\n where?: KyroWhereClause;\n sort?: string;\n limit?: number;\n page?: number;\n depth?: number;\n select?: string[];\n}\n\nexport interface KyroFindResult<T> {\n docs: T[];\n totalDocs: number;\n limit: number;\n totalPages: number;\n page: number;\n pagingCounter: number;\n hasPrevPage: boolean;\n hasNextPage: boolean;\n prevPage: number | null;\n nextPage: number | null;\n}\n\nexport interface KyroCreateResult<T> {\n doc: T;\n message?: string;\n}\n\nexport interface KyroUpdateResult<T> {\n doc: T;\n message?: string;\n}\n\nexport interface KyroDeleteResult<T> {\n doc: T;\n message: string;\n}\n\n// ============================================================================\n// Collection Map\n// ============================================================================\n\nexport interface KyroCollections {\n${collections.map(c => ` ${c.slug}: ${capitalize(c.slug)};`).join('\\n')}\n}\n\n// ============================================================================\n// Typed Client\n// ============================================================================\n\nexport interface KyroTypedClient<C extends keyof KyroCollections> {\n find: (args?: KyroFindArgs) => Promise<KyroFindResult<KyroCollections[C]>>;\n findByID: (id: string, args?: { depth?: number; select?: string[] }) => Promise<KyroCollections[C]>;\n create: (data: Partial<KyroCollections[C]>) => Promise<KyroCreateResult<KyroCollections[C]>>;\n update: (id: string, data: Partial<KyroCollections[C]>) => Promise<KyroUpdateResult<KyroCollections[C]>>;\n delete: (id: string) => Promise<KyroDeleteResult<KyroCollections[C]>>;\n count: (args?: { where?: KyroWhereClause }) => Promise<{ totalDocs: number }>;\n}\n\nexport interface KyroClient {\n${collections.map(c => ` ${c.slug}: KyroTypedClient<'${c.slug}'>;`).join('\\n')}\n}\n\nexport function createClient(config: { url: string; token?: string }): KyroClient {\n // Client implementation would be here\n throw new Error('Not implemented');\n}\n`;\n\n return header + body + footer;\n}\n\n// ============================================================================\n// CLI Command\n// ============================================================================\n\nexport function createGenerateCommand(): Command {\n const generate = new Command('generate')\n .description('Generate TypeScript types from collection configs')\n .option('-c, --config <path>', 'Path to config file or directory', './src/kyro')\n .option('-o, --output <path>', 'Output file path', './src/types/kyro.d.ts')\n .option('-w, --watch', 'Watch for changes and regenerate')\n .action(async (options) => {\n const configPath = resolve(options.config);\n const outputPath = resolve(options.output);\n\n console.log('🔧 Generating types from:', configPath);\n\n try {\n // Find all config files\n const configFiles = await glob(`${configPath}/**/*.{ts,js}`);\n \n if (configFiles.length === 0) {\n console.error('❌ No config files found at:', configPath);\n process.exit(1);\n }\n\n // Parse configs\n const collections: CollectionConfig[] = [];\n \n for (const file of configFiles) {\n try {\n // Dynamic import of config file\n const mod = await import(file);\n const configs = Object.values(mod).filter((v: any) => v && v.slug && v.fields);\n collections.push(...(configs as CollectionConfig[]));\n } catch (error) {\n console.warn(`⚠️ Could not parse: ${file}`);\n }\n }\n\n if (collections.length === 0) {\n console.error('❌ No valid collection configs found');\n process.exit(1);\n }\n\n console.log(`📦 Found ${collections.length} collection(s):`);\n collections.forEach(c => console.log(` - ${c.slug}`));\n\n // Generate types\n const types = generateTypes(collections);\n\n // Write output\n const outputDir = join(outputPath, '..');\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n\n writeFileSync(outputPath, types);\n console.log(`✅ Types generated at: ${outputPath}`);\n\n // Watch mode\n if (options.watch) {\n console.log('\\n👁️ Watching for changes...');\n const { watch } = await import('fs');\n watch(configPath, { recursive: true }, async (eventType, filename) => {\n console.log(`\\n🔄 File changed: ${filename}`);\n // Regenerate\n const newCollections: CollectionConfig[] = [];\n for (const file of configFiles) {\n try {\n const mod = await import(file + `?t=${Date.now()}`);\n const configs = Object.values(mod).filter((v: any) => v && v.slug && v.fields);\n newCollections.push(...(configs as CollectionConfig[]));\n } catch {}\n }\n const newTypes = generateTypes(newCollections);\n writeFileSync(outputPath, newTypes);\n console.log('✅ Types regenerated');\n });\n }\n } catch (error: any) {\n console.error('❌ Error:', error.message);\n process.exit(1);\n }\n });\n\n return generate;\n}\n\nexport default createGenerateCommand;\n","#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport { readFileSync } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { createGenerateCommand } from \"./generate.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// Read version from package.json\nlet version = \"0.1.0\";\ntry {\n const pkg = JSON.parse(\n readFileSync(join(__dirname, \"../../package.json\"), \"utf-8\"),\n );\n version = pkg.version;\n} catch {}\n\nconst program = new Command();\n\nprogram\n .name(\"kyro\")\n .description(\"Kyro CMS - Astro-native headless CMS\")\n .version(version);\n\n// Register commands\nprogram.addCommand(createGenerateCommand());\n\n// DB command group\nconst dbCommand = program\n .command(\"db\")\n .description(\"Database management commands\");\n\n// DB Generate\ndbCommand\n .command(\"generate\")\n .description(\"Generate migrations from schema\")\n .action(async () => {\n console.log(\"📝 Generating migrations...\");\n const { exec } = await import(\"child_process\");\n exec(\"npx drizzle-kit generate\", (error, stdout, stderr) => {\n if (error) {\n console.error(\"❌ Generation failed:\", error.message);\n process.exit(1);\n }\n console.log(stdout);\n });\n });\n\n// DB Migrate\ndbCommand\n .command(\"migrate\")\n .description(\"Run database migrations\")\n .action(async () => {\n console.log(\"🔄 Running migrations...\");\n const { exec } = await import(\"child_process\");\n exec(\"npx drizzle-kit migrate\", (error, stdout, stderr) => {\n if (error) {\n console.error(\"❌ Migration failed:\", error.message);\n process.exit(1);\n }\n console.log(stdout);\n });\n });\n\n// DB Push\ndbCommand\n .command(\"push\")\n .description(\"Push schema to database (development)\")\n .action(async () => {\n console.log(\"🔄 Pushing schema...\");\n const { exec } = await import(\"child_process\");\n exec(\"npx drizzle-kit push\", (error, stdout, stderr) => {\n if (error) {\n console.error(\"❌ Push failed:\", error.message);\n process.exit(1);\n }\n console.log(stdout);\n });\n });\n\n// DB Seed\ndbCommand\n .command(\"seed\")\n .description(\"Seed database with initial data\")\n .action(async () => {\n console.log(\"🌱 Seeding database...\");\n const { exec } = await import(\"child_process\");\n exec(\"npx tsx src/database/drizzle/seed.ts\", (error, stdout, stderr) => {\n if (error) {\n console.error(\"❌ Seeding failed:\", error.message);\n process.exit(1);\n }\n console.log(stdout);\n });\n });\n\n// DB Studio\ndbCommand\n .command(\"studio\")\n .description(\"Open Drizzle Studio\")\n .action(async () => {\n console.log(\"🔓 Opening Drizzle Studio...\");\n const { exec } = await import(\"child_process\");\n exec(\"npx drizzle-kit studio\", (error, stdout, stderr) => {\n if (error) {\n console.error(\"❌ Studio failed:\", error.message);\n process.exit(1);\n }\n });\n });\n\n// Auth command group\nconst authCommand = program\n .command(\"auth\")\n .description(\"Authentication management commands\");\n\n// Bootstrap admin\nauthCommand\n .command(\"bootstrap\")\n .description(\"Create initial admin user\")\n .option(\"-e, --email <email>\", \"Admin email\", process.env.KYRO_ADMIN_EMAIL)\n .option(\n \"-p, --password <password>\",\n \"Admin password\",\n process.env.KYRO_ADMIN_PASSWORD,\n )\n .option(\n \"-r, --role <role>\",\n \"Admin role\",\n process.env.KYRO_ADMIN_ROLE || \"admin\",\n )\n .action(async (options) => {\n if (!options.email || !options.password) {\n console.error(\n \"❌ Email and password are required. Set KYRO_ADMIN_EMAIL and KYRO_ADMIN_PASSWORD env vars or use -e and -p options.\",\n );\n process.exit(1);\n }\n\n console.log(\"👤 Creating admin user...\");\n console.log(` Email: ${options.email}`);\n console.log(` Role: ${options.role}`);\n\n try {\n const { bootstrapAdmin } = await import(\"../auth/bootstrap.js\");\n const { PostgresAuthAdapter } =\n await import(\"../database/drizzle/postgres-auth-adapter.js\");\n const { createDatabase } =\n await import(\"../database/drizzle/database.js\");\n\n const { client, db } = await createDatabase();\n const adapter = new PostgresAuthAdapter({ db });\n\n const result = await bootstrapAdmin({\n authAdapter: adapter,\n adminEmail: options.email,\n adminPassword: options.password,\n adminRole: options.role,\n });\n\n await client.end();\n\n if (result.success) {\n console.log(\"✅ Admin user created successfully!\");\n } else {\n console.error(\"❌ Failed to create admin:\", result.error);\n process.exit(1);\n }\n } catch (error) {\n console.error(\"❌ Bootstrap failed:\", error);\n process.exit(1);\n }\n });\n\n// Health command\nprogram\n .command(\"health\")\n .description(\"Check system health\")\n .action(async () => {\n console.log(\"🏥 System Health Check\");\n\n try {\n const { createDatabase } =\n await import(\"../database/drizzle/database.js\");\n const { client } = await createDatabase();\n await client.unsafe(\"SELECT 1\");\n console.log(\" ✅ Database: Connected\");\n await client.end();\n } catch {\n console.log(\" ❌ Database: Not connected\");\n }\n\n console.log(\" ✅ API: Running\");\n });\n\n// Parse arguments\nprogram.parse();\n\n// Show help if no command\nif (!process.argv.slice(2).length) {\n program.outputHelp();\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/generate.ts","../../src/cli/index.ts"],"names":["Command","resolve","glob","join","existsSync","mkdirSync","writeFileSync","__filename","fileURLToPath","__dirname","dirname","readFileSync"],"mappings":"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","file":"index.cjs","sourcesContent":["import { Command } from 'commander';\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { glob } from 'glob';\n\n// ============================================================================\n// Type Generator\n// ============================================================================\n\ninterface FieldConfig {\n name?: string;\n type: string;\n required?: boolean;\n fields?: FieldConfig[];\n relationTo?: string | string[];\n hasMany?: boolean;\n options?: Array<{ label: string; value: string }>;\n}\n\ninterface CollectionConfig {\n slug: string;\n label?: string;\n fields: FieldConfig[];\n}\n\nfunction fieldToType(field: FieldConfig): string {\n switch (field.type) {\n case 'text':\n case 'email':\n case 'password':\n case 'textarea':\n case 'color':\n case 'code':\n case 'markdown':\n case 'date':\n case 'richtext':\n case 'json':\n return field.hasMany ? 'string[]' : 'string';\n case 'number':\n return field.hasMany ? 'number[]' : 'number';\n case 'checkbox':\n return 'boolean';\n case 'select':\n case 'radio':\n if (field.options) {\n const values = field.options.map(o => `'${o.value}'`).join(' | ');\n return field.hasMany ? `(${values})[]` : values;\n }\n return field.hasMany ? 'string[]' : 'string';\n case 'relationship':\n if (Array.isArray(field.relationTo)) {\n const types = field.relationTo.map(r => `${capitalize(r)} | string`).join(' | ');\n return field.hasMany ? `(${types})[]` : `(${types})`;\n }\n const relTo = field.relationTo || 'unknown';\n return field.hasMany ? `(${capitalize(relTo)} | string)[]` : `${capitalize(relTo)} | string`;\n case 'upload':\n return field.hasMany ? '(Media | string)[]' : 'Media | string';\n case 'array':\n if (field.fields && field.fields.length > 0) {\n const itemFields = field.fields.filter(f => f.name).map(f => {\n const type = fieldToType(f);\n return ` ${f.name}${f.required ? '' : '?'}: ${type};`;\n }).join('\\n');\n return `Array<{\\n${itemFields}\\n }>`;\n }\n return 'Record<string, any>[]';\n case 'group':\n if (field.fields && field.fields.length > 0) {\n const itemFields = field.fields.filter(f => f.name).map(f => {\n const type = fieldToType(f);\n return ` ${f.name}${f.required ? '' : '?'}: ${type};`;\n }).join('\\n');\n return `{\\n${itemFields}\\n}`;\n }\n return 'Record<string, any>';\n case 'blocks':\n return 'Block[]';\n default:\n return 'any';\n }\n}\n\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1).replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\nfunction collectionToInterface(collection: CollectionConfig): string {\n const name = capitalize(collection.slug);\n const fields = collection.fields.filter(f => f.name).map(f => {\n const type = fieldToType(f);\n return ` ${f.name}${f.required ? '' : '?'}: ${type};`;\n });\n\n // Add default fields\n fields.unshift(' id: string;');\n fields.push(' createdAt: string;');\n fields.push(' updatedAt: string;');\n\n return `export interface ${name} {\\n${fields.join('\\n')}\\n}`;\n}\n\nfunction generateTypes(collections: CollectionConfig[]): string {\n const interfaces = collections.map(c => collectionToInterface(c));\n \n const header = `// ============================================================================\n// Auto-generated by kyro generate\n// ============================================================================\n\nimport type { RichTextBlock } from '@kyro-cms/core';\n\nexport interface Media {\n id: string;\n url: string;\n filename: string;\n mimeType: string;\n filesize: number;\n width?: number;\n height?: number;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface Block {\n blockType: string;\n [key: string]: any;\n}\n\n`;\n\n const body = interfaces.join('\\n\\n');\n\n const footer = `\n\n// ============================================================================\n// Query Types\n// ============================================================================\n\nexport interface KyroWhereClause {\n [field: string]: {\n equals?: any;\n not_equals?: any;\n in?: any[];\n not_in?: any[];\n greater_than?: number;\n greater_than_equal?: number;\n less_than?: number;\n less_than_equal?: number;\n like?: string;\n exists?: boolean;\n };\n}\n\nexport interface KyroFindArgs {\n where?: KyroWhereClause;\n sort?: string;\n limit?: number;\n page?: number;\n depth?: number;\n select?: string[];\n}\n\nexport interface KyroFindResult<T> {\n docs: T[];\n totalDocs: number;\n limit: number;\n totalPages: number;\n page: number;\n pagingCounter: number;\n hasPrevPage: boolean;\n hasNextPage: boolean;\n prevPage: number | null;\n nextPage: number | null;\n}\n\nexport interface KyroCreateResult<T> {\n doc: T;\n message?: string;\n}\n\nexport interface KyroUpdateResult<T> {\n doc: T;\n message?: string;\n}\n\nexport interface KyroDeleteResult<T> {\n doc: T;\n message: string;\n}\n\n// ============================================================================\n// Collection Map\n// ============================================================================\n\nexport interface KyroCollections {\n${collections.map(c => ` ${c.slug}: ${capitalize(c.slug)};`).join('\\n')}\n}\n\n// ============================================================================\n// Typed Client\n// ============================================================================\n\nexport interface KyroTypedClient<C extends keyof KyroCollections> {\n find: (args?: KyroFindArgs) => Promise<KyroFindResult<KyroCollections[C]>>;\n findByID: (id: string, args?: { depth?: number; select?: string[] }) => Promise<KyroCollections[C]>;\n create: (data: Partial<KyroCollections[C]>) => Promise<KyroCreateResult<KyroCollections[C]>>;\n update: (id: string, data: Partial<KyroCollections[C]>) => Promise<KyroUpdateResult<KyroCollections[C]>>;\n delete: (id: string) => Promise<KyroDeleteResult<KyroCollections[C]>>;\n count: (args?: { where?: KyroWhereClause }) => Promise<{ totalDocs: number }>;\n}\n\nexport interface KyroClient {\n${collections.map(c => ` ${c.slug}: KyroTypedClient<'${c.slug}'>;`).join('\\n')}\n}\n\nexport function createClient(config: { url: string; token?: string }): KyroClient {\n // Client implementation would be here\n throw new Error('Not implemented');\n}\n`;\n\n return header + body + footer;\n}\n\n// ============================================================================\n// CLI Command\n// ============================================================================\n\nexport function createGenerateCommand(): Command {\n const generate = new Command('generate')\n .description('Generate TypeScript types from collection configs')\n .option('-c, --config <path>', 'Path to config file or directory', './src/kyro')\n .option('-o, --output <path>', 'Output file path', './src/types/kyro.d.ts')\n .option('-w, --watch', 'Watch for changes and regenerate')\n .action(async (options) => {\n const configPath = resolve(options.config);\n const outputPath = resolve(options.output);\n\n console.log('🔧 Generating types from:', configPath);\n\n try {\n // Find all config files\n const configFiles = await glob(`${configPath}/**/*.{ts,js}`);\n \n if (configFiles.length === 0) {\n console.error('❌ No config files found at:', configPath);\n process.exit(1);\n }\n\n // Parse configs\n const collections: CollectionConfig[] = [];\n \n for (const file of configFiles) {\n try {\n // Dynamic import of config file\n const mod = await import(file);\n const configs = Object.values(mod).filter((v: any) => v && v.slug && v.fields);\n collections.push(...(configs as CollectionConfig[]));\n } catch (error) {\n console.warn(`⚠️ Could not parse: ${file}`);\n }\n }\n\n if (collections.length === 0) {\n console.error('❌ No valid collection configs found');\n process.exit(1);\n }\n\n console.log(`📦 Found ${collections.length} collection(s):`);\n collections.forEach(c => console.log(` - ${c.slug}`));\n\n // Generate types\n const types = generateTypes(collections);\n\n // Write output\n const outputDir = join(outputPath, '..');\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n\n writeFileSync(outputPath, types);\n console.log(`✅ Types generated at: ${outputPath}`);\n\n // Watch mode\n if (options.watch) {\n console.log('\\n👁️ Watching for changes...');\n const { watch } = await import('fs');\n watch(configPath, { recursive: true }, async (eventType, filename) => {\n console.log(`\\n🔄 File changed: ${filename}`);\n // Regenerate\n const newCollections: CollectionConfig[] = [];\n for (const file of configFiles) {\n try {\n const mod = await import(file + `?t=${Date.now()}`);\n const configs = Object.values(mod).filter((v: any) => v && v.slug && v.fields);\n newCollections.push(...(configs as CollectionConfig[]));\n } catch {}\n }\n const newTypes = generateTypes(newCollections);\n writeFileSync(outputPath, newTypes);\n console.log('✅ Types regenerated');\n });\n }\n } catch (error: any) {\n console.error('❌ Error:', error.message);\n process.exit(1);\n }\n });\n\n return generate;\n}\n\nexport default createGenerateCommand;\n","#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport { readFileSync } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { createGenerateCommand } from \"./generate.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// Read version from package.json\nlet version = \"0.1.0\";\ntry {\n const pkg = JSON.parse(\n readFileSync(join(__dirname, \"../../package.json\"), \"utf-8\"),\n );\n version = pkg.version;\n} catch {}\n\nconst program = new Command();\n\nprogram\n .name(\"kyro\")\n .description(\"Kyro CMS - Astro-native headless CMS\")\n .version(version);\n\n// Register commands\nprogram.addCommand(createGenerateCommand());\n\n// DB command group\nconst dbCommand = program\n .command(\"db\")\n .description(\"Database management commands\");\n\n// DB Generate\ndbCommand\n .command(\"generate\")\n .description(\"Generate migrations from schema\")\n .action(async () => {\n console.log(\"📝 Generating migrations...\");\n const { exec } = await import(\"child_process\");\n exec(\"npx drizzle-kit generate\", (error, stdout, stderr) => {\n if (error) {\n console.error(\"❌ Generation failed:\", error.message);\n process.exit(1);\n }\n console.log(stdout);\n });\n });\n\n// DB Migrate\ndbCommand\n .command(\"migrate\")\n .description(\"Run database migrations\")\n .action(async () => {\n console.log(\"🔄 Running migrations...\");\n const { exec } = await import(\"child_process\");\n exec(\"npx drizzle-kit migrate\", (error, stdout, stderr) => {\n if (error) {\n console.error(\"❌ Migration failed:\", error.message);\n process.exit(1);\n }\n console.log(stdout);\n });\n });\n\n// DB Push\ndbCommand\n .command(\"push\")\n .description(\"Push schema to database (development)\")\n .action(async () => {\n console.log(\"🔄 Pushing schema...\");\n const { exec } = await import(\"child_process\");\n exec(\"npx drizzle-kit push\", (error, stdout, stderr) => {\n if (error) {\n console.error(\"❌ Push failed:\", error.message);\n process.exit(1);\n }\n console.log(stdout);\n });\n });\n\n// DB Seed\ndbCommand\n .command(\"seed\")\n .description(\"Seed database with initial data\")\n .action(async () => {\n console.log(\"🌱 Seeding database...\");\n const { exec } = await import(\"child_process\");\n exec(\"npx tsx src/database/drizzle/seed.ts\", (error, stdout, stderr) => {\n if (error) {\n console.error(\"❌ Seeding failed:\", error.message);\n process.exit(1);\n }\n console.log(stdout);\n });\n });\n\n// DB Studio\ndbCommand\n .command(\"studio\")\n .description(\"Open Drizzle Studio\")\n .action(async () => {\n console.log(\"🔓 Opening Drizzle Studio...\");\n const { exec } = await import(\"child_process\");\n exec(\"npx drizzle-kit studio\", (error, stdout, stderr) => {\n if (error) {\n console.error(\"❌ Studio failed:\", error.message);\n process.exit(1);\n }\n });\n });\n\n// Auth command group\nconst authCommand = program\n .command(\"auth\")\n .description(\"Authentication management commands\");\n\n// Bootstrap admin\nauthCommand\n .command(\"bootstrap\")\n .description(\"Create initial admin user\")\n .option(\"-e, --email <email>\", \"Admin email\", process.env.KYRO_ADMIN_EMAIL)\n .option(\n \"-p, --password <password>\",\n \"Admin password\",\n process.env.KYRO_ADMIN_PASSWORD,\n )\n .option(\n \"-r, --role <role>\",\n \"Admin role\",\n process.env.KYRO_ADMIN_ROLE || \"admin\",\n )\n .action(async (options) => {\n if (!options.email || !options.password) {\n console.error(\n \"❌ Email and password are required. Set KYRO_ADMIN_EMAIL and KYRO_ADMIN_PASSWORD env vars or use -e and -p options.\",\n );\n process.exit(1);\n }\n\n console.log(\"👤 Creating admin user...\");\n console.log(` Email: ${options.email}`);\n console.log(` Role: ${options.role}`);\n\n try {\n const { bootstrapAdmin } = await import(\"../auth/bootstrap.js\");\n const { PostgresAuthAdapter } =\n await import(\"../database/drizzle/postgres-auth-adapter.js\");\n const { drizzle } = await import(\"drizzle-orm/postgres-js\");\n const { default: postgres } = await import(\"postgres\");\n const databaseUrl =\n process.env.DATABASE_URL ||\n \"postgresql://postgres:postgres@localhost:5432/kyro_cms\";\n const client = postgres(databaseUrl, { max: 1 });\n const db = drizzle(client);\n const adapter = new PostgresAuthAdapter({ db });\n\n const result = await bootstrapAdmin({\n authAdapter: adapter,\n adminEmail: options.email,\n adminPassword: options.password,\n adminRole: options.role,\n });\n\n await client.end();\n\n if (result.success) {\n console.log(\"✅ Admin user created successfully!\");\n } else {\n console.error(\"❌ Failed to create admin:\", result.error);\n process.exit(1);\n }\n } catch (error) {\n console.error(\"❌ Bootstrap failed:\", error);\n process.exit(1);\n }\n });\n\n// Health command\nprogram\n .command(\"health\")\n .description(\"Check system health\")\n .action(async () => {\n console.log(\"🏥 System Health Check\");\n\n try {\n const { default: postgres } = await import(\"postgres\");\n const databaseUrl =\n process.env.DATABASE_URL ||\n \"postgresql://postgres:postgres@localhost:5432/kyro_cms\";\n const client = postgres(databaseUrl, { max: 1 });\n await client.unsafe(\"SELECT 1\");\n console.log(\" ✅ Database: Connected\");\n await client.end();\n } catch {\n console.log(\" ❌ Database: Not connected\");\n }\n\n console.log(\" ✅ API: Running\");\n });\n\n// Parse arguments\nprogram.parse();\n\n// Show help if no command\nif (!process.argv.slice(2).length) {\n program.outputHelp();\n}\n"]}
|
package/dist/cli/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import '../chunk-
|
|
2
|
+
import '../chunk-Z6ZWNWWR.js';
|
|
3
3
|
import { Command } from 'commander';
|
|
4
4
|
import { readFileSync, existsSync, mkdirSync, writeFileSync } from 'fs';
|
|
5
5
|
import { dirname, join, resolve } from 'path';
|
|
@@ -351,10 +351,13 @@ authCommand.command("bootstrap").description("Create initial admin user").option
|
|
|
351
351
|
console.log(` Email: ${options.email}`);
|
|
352
352
|
console.log(` Role: ${options.role}`);
|
|
353
353
|
try {
|
|
354
|
-
const { bootstrapAdmin } = await import('../bootstrap-
|
|
355
|
-
const { PostgresAuthAdapter } = await import('../postgres-auth-adapter-
|
|
356
|
-
const {
|
|
357
|
-
const {
|
|
354
|
+
const { bootstrapAdmin } = await import('../bootstrap-LL6O7PWO.js');
|
|
355
|
+
const { PostgresAuthAdapter } = await import('../postgres-auth-adapter-OTRWSTT5.js');
|
|
356
|
+
const { drizzle } = await import('drizzle-orm/postgres-js');
|
|
357
|
+
const { default: postgres } = await import('postgres');
|
|
358
|
+
const databaseUrl = process.env.DATABASE_URL || "postgresql://postgres:postgres@localhost:5432/kyro_cms";
|
|
359
|
+
const client = postgres(databaseUrl, { max: 1 });
|
|
360
|
+
const db = drizzle(client);
|
|
358
361
|
const adapter = new PostgresAuthAdapter({ db });
|
|
359
362
|
const result = await bootstrapAdmin({
|
|
360
363
|
authAdapter: adapter,
|
|
@@ -377,8 +380,9 @@ authCommand.command("bootstrap").description("Create initial admin user").option
|
|
|
377
380
|
program.command("health").description("Check system health").action(async () => {
|
|
378
381
|
console.log("\u{1F3E5} System Health Check");
|
|
379
382
|
try {
|
|
380
|
-
const {
|
|
381
|
-
const
|
|
383
|
+
const { default: postgres } = await import('postgres');
|
|
384
|
+
const databaseUrl = process.env.DATABASE_URL || "postgresql://postgres:postgres@localhost:5432/kyro_cms";
|
|
385
|
+
const client = postgres(databaseUrl, { max: 1 });
|
|
382
386
|
await client.unsafe("SELECT 1");
|
|
383
387
|
console.log(" \u2705 Database: Connected");
|
|
384
388
|
await client.end();
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/generate.ts","../../src/cli/index.ts"],"names":["__filename","__dirname","readFileSync","join","Command"],"mappings":"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","file":"index.js","sourcesContent":["import { Command } from 'commander';\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { glob } from 'glob';\n\n// ============================================================================\n// Type Generator\n// ============================================================================\n\ninterface FieldConfig {\n name?: string;\n type: string;\n required?: boolean;\n fields?: FieldConfig[];\n relationTo?: string | string[];\n hasMany?: boolean;\n options?: Array<{ label: string; value: string }>;\n}\n\ninterface CollectionConfig {\n slug: string;\n label?: string;\n fields: FieldConfig[];\n}\n\nfunction fieldToType(field: FieldConfig): string {\n switch (field.type) {\n case 'text':\n case 'email':\n case 'password':\n case 'textarea':\n case 'color':\n case 'code':\n case 'markdown':\n case 'date':\n case 'richtext':\n case 'json':\n return field.hasMany ? 'string[]' : 'string';\n case 'number':\n return field.hasMany ? 'number[]' : 'number';\n case 'checkbox':\n return 'boolean';\n case 'select':\n case 'radio':\n if (field.options) {\n const values = field.options.map(o => `'${o.value}'`).join(' | ');\n return field.hasMany ? `(${values})[]` : values;\n }\n return field.hasMany ? 'string[]' : 'string';\n case 'relationship':\n if (Array.isArray(field.relationTo)) {\n const types = field.relationTo.map(r => `${capitalize(r)} | string`).join(' | ');\n return field.hasMany ? `(${types})[]` : `(${types})`;\n }\n const relTo = field.relationTo || 'unknown';\n return field.hasMany ? `(${capitalize(relTo)} | string)[]` : `${capitalize(relTo)} | string`;\n case 'upload':\n return field.hasMany ? '(Media | string)[]' : 'Media | string';\n case 'array':\n if (field.fields && field.fields.length > 0) {\n const itemFields = field.fields.filter(f => f.name).map(f => {\n const type = fieldToType(f);\n return ` ${f.name}${f.required ? '' : '?'}: ${type};`;\n }).join('\\n');\n return `Array<{\\n${itemFields}\\n }>`;\n }\n return 'Record<string, any>[]';\n case 'group':\n if (field.fields && field.fields.length > 0) {\n const itemFields = field.fields.filter(f => f.name).map(f => {\n const type = fieldToType(f);\n return ` ${f.name}${f.required ? '' : '?'}: ${type};`;\n }).join('\\n');\n return `{\\n${itemFields}\\n}`;\n }\n return 'Record<string, any>';\n case 'blocks':\n return 'Block[]';\n default:\n return 'any';\n }\n}\n\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1).replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\nfunction collectionToInterface(collection: CollectionConfig): string {\n const name = capitalize(collection.slug);\n const fields = collection.fields.filter(f => f.name).map(f => {\n const type = fieldToType(f);\n return ` ${f.name}${f.required ? '' : '?'}: ${type};`;\n });\n\n // Add default fields\n fields.unshift(' id: string;');\n fields.push(' createdAt: string;');\n fields.push(' updatedAt: string;');\n\n return `export interface ${name} {\\n${fields.join('\\n')}\\n}`;\n}\n\nfunction generateTypes(collections: CollectionConfig[]): string {\n const interfaces = collections.map(c => collectionToInterface(c));\n \n const header = `// ============================================================================\n// Auto-generated by kyro generate\n// ============================================================================\n\nimport type { RichTextBlock } from '@kyro-cms/core';\n\nexport interface Media {\n id: string;\n url: string;\n filename: string;\n mimeType: string;\n filesize: number;\n width?: number;\n height?: number;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface Block {\n blockType: string;\n [key: string]: any;\n}\n\n`;\n\n const body = interfaces.join('\\n\\n');\n\n const footer = `\n\n// ============================================================================\n// Query Types\n// ============================================================================\n\nexport interface KyroWhereClause {\n [field: string]: {\n equals?: any;\n not_equals?: any;\n in?: any[];\n not_in?: any[];\n greater_than?: number;\n greater_than_equal?: number;\n less_than?: number;\n less_than_equal?: number;\n like?: string;\n exists?: boolean;\n };\n}\n\nexport interface KyroFindArgs {\n where?: KyroWhereClause;\n sort?: string;\n limit?: number;\n page?: number;\n depth?: number;\n select?: string[];\n}\n\nexport interface KyroFindResult<T> {\n docs: T[];\n totalDocs: number;\n limit: number;\n totalPages: number;\n page: number;\n pagingCounter: number;\n hasPrevPage: boolean;\n hasNextPage: boolean;\n prevPage: number | null;\n nextPage: number | null;\n}\n\nexport interface KyroCreateResult<T> {\n doc: T;\n message?: string;\n}\n\nexport interface KyroUpdateResult<T> {\n doc: T;\n message?: string;\n}\n\nexport interface KyroDeleteResult<T> {\n doc: T;\n message: string;\n}\n\n// ============================================================================\n// Collection Map\n// ============================================================================\n\nexport interface KyroCollections {\n${collections.map(c => ` ${c.slug}: ${capitalize(c.slug)};`).join('\\n')}\n}\n\n// ============================================================================\n// Typed Client\n// ============================================================================\n\nexport interface KyroTypedClient<C extends keyof KyroCollections> {\n find: (args?: KyroFindArgs) => Promise<KyroFindResult<KyroCollections[C]>>;\n findByID: (id: string, args?: { depth?: number; select?: string[] }) => Promise<KyroCollections[C]>;\n create: (data: Partial<KyroCollections[C]>) => Promise<KyroCreateResult<KyroCollections[C]>>;\n update: (id: string, data: Partial<KyroCollections[C]>) => Promise<KyroUpdateResult<KyroCollections[C]>>;\n delete: (id: string) => Promise<KyroDeleteResult<KyroCollections[C]>>;\n count: (args?: { where?: KyroWhereClause }) => Promise<{ totalDocs: number }>;\n}\n\nexport interface KyroClient {\n${collections.map(c => ` ${c.slug}: KyroTypedClient<'${c.slug}'>;`).join('\\n')}\n}\n\nexport function createClient(config: { url: string; token?: string }): KyroClient {\n // Client implementation would be here\n throw new Error('Not implemented');\n}\n`;\n\n return header + body + footer;\n}\n\n// ============================================================================\n// CLI Command\n// ============================================================================\n\nexport function createGenerateCommand(): Command {\n const generate = new Command('generate')\n .description('Generate TypeScript types from collection configs')\n .option('-c, --config <path>', 'Path to config file or directory', './src/kyro')\n .option('-o, --output <path>', 'Output file path', './src/types/kyro.d.ts')\n .option('-w, --watch', 'Watch for changes and regenerate')\n .action(async (options) => {\n const configPath = resolve(options.config);\n const outputPath = resolve(options.output);\n\n console.log('🔧 Generating types from:', configPath);\n\n try {\n // Find all config files\n const configFiles = await glob(`${configPath}/**/*.{ts,js}`);\n \n if (configFiles.length === 0) {\n console.error('❌ No config files found at:', configPath);\n process.exit(1);\n }\n\n // Parse configs\n const collections: CollectionConfig[] = [];\n \n for (const file of configFiles) {\n try {\n // Dynamic import of config file\n const mod = await import(file);\n const configs = Object.values(mod).filter((v: any) => v && v.slug && v.fields);\n collections.push(...(configs as CollectionConfig[]));\n } catch (error) {\n console.warn(`⚠️ Could not parse: ${file}`);\n }\n }\n\n if (collections.length === 0) {\n console.error('❌ No valid collection configs found');\n process.exit(1);\n }\n\n console.log(`📦 Found ${collections.length} collection(s):`);\n collections.forEach(c => console.log(` - ${c.slug}`));\n\n // Generate types\n const types = generateTypes(collections);\n\n // Write output\n const outputDir = join(outputPath, '..');\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n\n writeFileSync(outputPath, types);\n console.log(`✅ Types generated at: ${outputPath}`);\n\n // Watch mode\n if (options.watch) {\n console.log('\\n👁️ Watching for changes...');\n const { watch } = await import('fs');\n watch(configPath, { recursive: true }, async (eventType, filename) => {\n console.log(`\\n🔄 File changed: ${filename}`);\n // Regenerate\n const newCollections: CollectionConfig[] = [];\n for (const file of configFiles) {\n try {\n const mod = await import(file + `?t=${Date.now()}`);\n const configs = Object.values(mod).filter((v: any) => v && v.slug && v.fields);\n newCollections.push(...(configs as CollectionConfig[]));\n } catch {}\n }\n const newTypes = generateTypes(newCollections);\n writeFileSync(outputPath, newTypes);\n console.log('✅ Types regenerated');\n });\n }\n } catch (error: any) {\n console.error('❌ Error:', error.message);\n process.exit(1);\n }\n });\n\n return generate;\n}\n\nexport default createGenerateCommand;\n","#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport { readFileSync } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { createGenerateCommand } from \"./generate.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// Read version from package.json\nlet version = \"0.1.0\";\ntry {\n const pkg = JSON.parse(\n readFileSync(join(__dirname, \"../../package.json\"), \"utf-8\"),\n );\n version = pkg.version;\n} catch {}\n\nconst program = new Command();\n\nprogram\n .name(\"kyro\")\n .description(\"Kyro CMS - Astro-native headless CMS\")\n .version(version);\n\n// Register commands\nprogram.addCommand(createGenerateCommand());\n\n// DB command group\nconst dbCommand = program\n .command(\"db\")\n .description(\"Database management commands\");\n\n// DB Generate\ndbCommand\n .command(\"generate\")\n .description(\"Generate migrations from schema\")\n .action(async () => {\n console.log(\"📝 Generating migrations...\");\n const { exec } = await import(\"child_process\");\n exec(\"npx drizzle-kit generate\", (error, stdout, stderr) => {\n if (error) {\n console.error(\"❌ Generation failed:\", error.message);\n process.exit(1);\n }\n console.log(stdout);\n });\n });\n\n// DB Migrate\ndbCommand\n .command(\"migrate\")\n .description(\"Run database migrations\")\n .action(async () => {\n console.log(\"🔄 Running migrations...\");\n const { exec } = await import(\"child_process\");\n exec(\"npx drizzle-kit migrate\", (error, stdout, stderr) => {\n if (error) {\n console.error(\"❌ Migration failed:\", error.message);\n process.exit(1);\n }\n console.log(stdout);\n });\n });\n\n// DB Push\ndbCommand\n .command(\"push\")\n .description(\"Push schema to database (development)\")\n .action(async () => {\n console.log(\"🔄 Pushing schema...\");\n const { exec } = await import(\"child_process\");\n exec(\"npx drizzle-kit push\", (error, stdout, stderr) => {\n if (error) {\n console.error(\"❌ Push failed:\", error.message);\n process.exit(1);\n }\n console.log(stdout);\n });\n });\n\n// DB Seed\ndbCommand\n .command(\"seed\")\n .description(\"Seed database with initial data\")\n .action(async () => {\n console.log(\"🌱 Seeding database...\");\n const { exec } = await import(\"child_process\");\n exec(\"npx tsx src/database/drizzle/seed.ts\", (error, stdout, stderr) => {\n if (error) {\n console.error(\"❌ Seeding failed:\", error.message);\n process.exit(1);\n }\n console.log(stdout);\n });\n });\n\n// DB Studio\ndbCommand\n .command(\"studio\")\n .description(\"Open Drizzle Studio\")\n .action(async () => {\n console.log(\"🔓 Opening Drizzle Studio...\");\n const { exec } = await import(\"child_process\");\n exec(\"npx drizzle-kit studio\", (error, stdout, stderr) => {\n if (error) {\n console.error(\"❌ Studio failed:\", error.message);\n process.exit(1);\n }\n });\n });\n\n// Auth command group\nconst authCommand = program\n .command(\"auth\")\n .description(\"Authentication management commands\");\n\n// Bootstrap admin\nauthCommand\n .command(\"bootstrap\")\n .description(\"Create initial admin user\")\n .option(\"-e, --email <email>\", \"Admin email\", process.env.KYRO_ADMIN_EMAIL)\n .option(\n \"-p, --password <password>\",\n \"Admin password\",\n process.env.KYRO_ADMIN_PASSWORD,\n )\n .option(\n \"-r, --role <role>\",\n \"Admin role\",\n process.env.KYRO_ADMIN_ROLE || \"admin\",\n )\n .action(async (options) => {\n if (!options.email || !options.password) {\n console.error(\n \"❌ Email and password are required. Set KYRO_ADMIN_EMAIL and KYRO_ADMIN_PASSWORD env vars or use -e and -p options.\",\n );\n process.exit(1);\n }\n\n console.log(\"👤 Creating admin user...\");\n console.log(` Email: ${options.email}`);\n console.log(` Role: ${options.role}`);\n\n try {\n const { bootstrapAdmin } = await import(\"../auth/bootstrap.js\");\n const { PostgresAuthAdapter } =\n await import(\"../database/drizzle/postgres-auth-adapter.js\");\n const { createDatabase } =\n await import(\"../database/drizzle/database.js\");\n\n const { client, db } = await createDatabase();\n const adapter = new PostgresAuthAdapter({ db });\n\n const result = await bootstrapAdmin({\n authAdapter: adapter,\n adminEmail: options.email,\n adminPassword: options.password,\n adminRole: options.role,\n });\n\n await client.end();\n\n if (result.success) {\n console.log(\"✅ Admin user created successfully!\");\n } else {\n console.error(\"❌ Failed to create admin:\", result.error);\n process.exit(1);\n }\n } catch (error) {\n console.error(\"❌ Bootstrap failed:\", error);\n process.exit(1);\n }\n });\n\n// Health command\nprogram\n .command(\"health\")\n .description(\"Check system health\")\n .action(async () => {\n console.log(\"🏥 System Health Check\");\n\n try {\n const { createDatabase } =\n await import(\"../database/drizzle/database.js\");\n const { client } = await createDatabase();\n await client.unsafe(\"SELECT 1\");\n console.log(\" ✅ Database: Connected\");\n await client.end();\n } catch {\n console.log(\" ❌ Database: Not connected\");\n }\n\n console.log(\" ✅ API: Running\");\n });\n\n// Parse arguments\nprogram.parse();\n\n// Show help if no command\nif (!process.argv.slice(2).length) {\n program.outputHelp();\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/generate.ts","../../src/cli/index.ts"],"names":["__filename","__dirname","readFileSync","join","Command"],"mappings":"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","file":"index.js","sourcesContent":["import { Command } from 'commander';\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { glob } from 'glob';\n\n// ============================================================================\n// Type Generator\n// ============================================================================\n\ninterface FieldConfig {\n name?: string;\n type: string;\n required?: boolean;\n fields?: FieldConfig[];\n relationTo?: string | string[];\n hasMany?: boolean;\n options?: Array<{ label: string; value: string }>;\n}\n\ninterface CollectionConfig {\n slug: string;\n label?: string;\n fields: FieldConfig[];\n}\n\nfunction fieldToType(field: FieldConfig): string {\n switch (field.type) {\n case 'text':\n case 'email':\n case 'password':\n case 'textarea':\n case 'color':\n case 'code':\n case 'markdown':\n case 'date':\n case 'richtext':\n case 'json':\n return field.hasMany ? 'string[]' : 'string';\n case 'number':\n return field.hasMany ? 'number[]' : 'number';\n case 'checkbox':\n return 'boolean';\n case 'select':\n case 'radio':\n if (field.options) {\n const values = field.options.map(o => `'${o.value}'`).join(' | ');\n return field.hasMany ? `(${values})[]` : values;\n }\n return field.hasMany ? 'string[]' : 'string';\n case 'relationship':\n if (Array.isArray(field.relationTo)) {\n const types = field.relationTo.map(r => `${capitalize(r)} | string`).join(' | ');\n return field.hasMany ? `(${types})[]` : `(${types})`;\n }\n const relTo = field.relationTo || 'unknown';\n return field.hasMany ? `(${capitalize(relTo)} | string)[]` : `${capitalize(relTo)} | string`;\n case 'upload':\n return field.hasMany ? '(Media | string)[]' : 'Media | string';\n case 'array':\n if (field.fields && field.fields.length > 0) {\n const itemFields = field.fields.filter(f => f.name).map(f => {\n const type = fieldToType(f);\n return ` ${f.name}${f.required ? '' : '?'}: ${type};`;\n }).join('\\n');\n return `Array<{\\n${itemFields}\\n }>`;\n }\n return 'Record<string, any>[]';\n case 'group':\n if (field.fields && field.fields.length > 0) {\n const itemFields = field.fields.filter(f => f.name).map(f => {\n const type = fieldToType(f);\n return ` ${f.name}${f.required ? '' : '?'}: ${type};`;\n }).join('\\n');\n return `{\\n${itemFields}\\n}`;\n }\n return 'Record<string, any>';\n case 'blocks':\n return 'Block[]';\n default:\n return 'any';\n }\n}\n\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1).replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\nfunction collectionToInterface(collection: CollectionConfig): string {\n const name = capitalize(collection.slug);\n const fields = collection.fields.filter(f => f.name).map(f => {\n const type = fieldToType(f);\n return ` ${f.name}${f.required ? '' : '?'}: ${type};`;\n });\n\n // Add default fields\n fields.unshift(' id: string;');\n fields.push(' createdAt: string;');\n fields.push(' updatedAt: string;');\n\n return `export interface ${name} {\\n${fields.join('\\n')}\\n}`;\n}\n\nfunction generateTypes(collections: CollectionConfig[]): string {\n const interfaces = collections.map(c => collectionToInterface(c));\n \n const header = `// ============================================================================\n// Auto-generated by kyro generate\n// ============================================================================\n\nimport type { RichTextBlock } from '@kyro-cms/core';\n\nexport interface Media {\n id: string;\n url: string;\n filename: string;\n mimeType: string;\n filesize: number;\n width?: number;\n height?: number;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface Block {\n blockType: string;\n [key: string]: any;\n}\n\n`;\n\n const body = interfaces.join('\\n\\n');\n\n const footer = `\n\n// ============================================================================\n// Query Types\n// ============================================================================\n\nexport interface KyroWhereClause {\n [field: string]: {\n equals?: any;\n not_equals?: any;\n in?: any[];\n not_in?: any[];\n greater_than?: number;\n greater_than_equal?: number;\n less_than?: number;\n less_than_equal?: number;\n like?: string;\n exists?: boolean;\n };\n}\n\nexport interface KyroFindArgs {\n where?: KyroWhereClause;\n sort?: string;\n limit?: number;\n page?: number;\n depth?: number;\n select?: string[];\n}\n\nexport interface KyroFindResult<T> {\n docs: T[];\n totalDocs: number;\n limit: number;\n totalPages: number;\n page: number;\n pagingCounter: number;\n hasPrevPage: boolean;\n hasNextPage: boolean;\n prevPage: number | null;\n nextPage: number | null;\n}\n\nexport interface KyroCreateResult<T> {\n doc: T;\n message?: string;\n}\n\nexport interface KyroUpdateResult<T> {\n doc: T;\n message?: string;\n}\n\nexport interface KyroDeleteResult<T> {\n doc: T;\n message: string;\n}\n\n// ============================================================================\n// Collection Map\n// ============================================================================\n\nexport interface KyroCollections {\n${collections.map(c => ` ${c.slug}: ${capitalize(c.slug)};`).join('\\n')}\n}\n\n// ============================================================================\n// Typed Client\n// ============================================================================\n\nexport interface KyroTypedClient<C extends keyof KyroCollections> {\n find: (args?: KyroFindArgs) => Promise<KyroFindResult<KyroCollections[C]>>;\n findByID: (id: string, args?: { depth?: number; select?: string[] }) => Promise<KyroCollections[C]>;\n create: (data: Partial<KyroCollections[C]>) => Promise<KyroCreateResult<KyroCollections[C]>>;\n update: (id: string, data: Partial<KyroCollections[C]>) => Promise<KyroUpdateResult<KyroCollections[C]>>;\n delete: (id: string) => Promise<KyroDeleteResult<KyroCollections[C]>>;\n count: (args?: { where?: KyroWhereClause }) => Promise<{ totalDocs: number }>;\n}\n\nexport interface KyroClient {\n${collections.map(c => ` ${c.slug}: KyroTypedClient<'${c.slug}'>;`).join('\\n')}\n}\n\nexport function createClient(config: { url: string; token?: string }): KyroClient {\n // Client implementation would be here\n throw new Error('Not implemented');\n}\n`;\n\n return header + body + footer;\n}\n\n// ============================================================================\n// CLI Command\n// ============================================================================\n\nexport function createGenerateCommand(): Command {\n const generate = new Command('generate')\n .description('Generate TypeScript types from collection configs')\n .option('-c, --config <path>', 'Path to config file or directory', './src/kyro')\n .option('-o, --output <path>', 'Output file path', './src/types/kyro.d.ts')\n .option('-w, --watch', 'Watch for changes and regenerate')\n .action(async (options) => {\n const configPath = resolve(options.config);\n const outputPath = resolve(options.output);\n\n console.log('🔧 Generating types from:', configPath);\n\n try {\n // Find all config files\n const configFiles = await glob(`${configPath}/**/*.{ts,js}`);\n \n if (configFiles.length === 0) {\n console.error('❌ No config files found at:', configPath);\n process.exit(1);\n }\n\n // Parse configs\n const collections: CollectionConfig[] = [];\n \n for (const file of configFiles) {\n try {\n // Dynamic import of config file\n const mod = await import(file);\n const configs = Object.values(mod).filter((v: any) => v && v.slug && v.fields);\n collections.push(...(configs as CollectionConfig[]));\n } catch (error) {\n console.warn(`⚠️ Could not parse: ${file}`);\n }\n }\n\n if (collections.length === 0) {\n console.error('❌ No valid collection configs found');\n process.exit(1);\n }\n\n console.log(`📦 Found ${collections.length} collection(s):`);\n collections.forEach(c => console.log(` - ${c.slug}`));\n\n // Generate types\n const types = generateTypes(collections);\n\n // Write output\n const outputDir = join(outputPath, '..');\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n\n writeFileSync(outputPath, types);\n console.log(`✅ Types generated at: ${outputPath}`);\n\n // Watch mode\n if (options.watch) {\n console.log('\\n👁️ Watching for changes...');\n const { watch } = await import('fs');\n watch(configPath, { recursive: true }, async (eventType, filename) => {\n console.log(`\\n🔄 File changed: ${filename}`);\n // Regenerate\n const newCollections: CollectionConfig[] = [];\n for (const file of configFiles) {\n try {\n const mod = await import(file + `?t=${Date.now()}`);\n const configs = Object.values(mod).filter((v: any) => v && v.slug && v.fields);\n newCollections.push(...(configs as CollectionConfig[]));\n } catch {}\n }\n const newTypes = generateTypes(newCollections);\n writeFileSync(outputPath, newTypes);\n console.log('✅ Types regenerated');\n });\n }\n } catch (error: any) {\n console.error('❌ Error:', error.message);\n process.exit(1);\n }\n });\n\n return generate;\n}\n\nexport default createGenerateCommand;\n","#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport { readFileSync } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { createGenerateCommand } from \"./generate.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// Read version from package.json\nlet version = \"0.1.0\";\ntry {\n const pkg = JSON.parse(\n readFileSync(join(__dirname, \"../../package.json\"), \"utf-8\"),\n );\n version = pkg.version;\n} catch {}\n\nconst program = new Command();\n\nprogram\n .name(\"kyro\")\n .description(\"Kyro CMS - Astro-native headless CMS\")\n .version(version);\n\n// Register commands\nprogram.addCommand(createGenerateCommand());\n\n// DB command group\nconst dbCommand = program\n .command(\"db\")\n .description(\"Database management commands\");\n\n// DB Generate\ndbCommand\n .command(\"generate\")\n .description(\"Generate migrations from schema\")\n .action(async () => {\n console.log(\"📝 Generating migrations...\");\n const { exec } = await import(\"child_process\");\n exec(\"npx drizzle-kit generate\", (error, stdout, stderr) => {\n if (error) {\n console.error(\"❌ Generation failed:\", error.message);\n process.exit(1);\n }\n console.log(stdout);\n });\n });\n\n// DB Migrate\ndbCommand\n .command(\"migrate\")\n .description(\"Run database migrations\")\n .action(async () => {\n console.log(\"🔄 Running migrations...\");\n const { exec } = await import(\"child_process\");\n exec(\"npx drizzle-kit migrate\", (error, stdout, stderr) => {\n if (error) {\n console.error(\"❌ Migration failed:\", error.message);\n process.exit(1);\n }\n console.log(stdout);\n });\n });\n\n// DB Push\ndbCommand\n .command(\"push\")\n .description(\"Push schema to database (development)\")\n .action(async () => {\n console.log(\"🔄 Pushing schema...\");\n const { exec } = await import(\"child_process\");\n exec(\"npx drizzle-kit push\", (error, stdout, stderr) => {\n if (error) {\n console.error(\"❌ Push failed:\", error.message);\n process.exit(1);\n }\n console.log(stdout);\n });\n });\n\n// DB Seed\ndbCommand\n .command(\"seed\")\n .description(\"Seed database with initial data\")\n .action(async () => {\n console.log(\"🌱 Seeding database...\");\n const { exec } = await import(\"child_process\");\n exec(\"npx tsx src/database/drizzle/seed.ts\", (error, stdout, stderr) => {\n if (error) {\n console.error(\"❌ Seeding failed:\", error.message);\n process.exit(1);\n }\n console.log(stdout);\n });\n });\n\n// DB Studio\ndbCommand\n .command(\"studio\")\n .description(\"Open Drizzle Studio\")\n .action(async () => {\n console.log(\"🔓 Opening Drizzle Studio...\");\n const { exec } = await import(\"child_process\");\n exec(\"npx drizzle-kit studio\", (error, stdout, stderr) => {\n if (error) {\n console.error(\"❌ Studio failed:\", error.message);\n process.exit(1);\n }\n });\n });\n\n// Auth command group\nconst authCommand = program\n .command(\"auth\")\n .description(\"Authentication management commands\");\n\n// Bootstrap admin\nauthCommand\n .command(\"bootstrap\")\n .description(\"Create initial admin user\")\n .option(\"-e, --email <email>\", \"Admin email\", process.env.KYRO_ADMIN_EMAIL)\n .option(\n \"-p, --password <password>\",\n \"Admin password\",\n process.env.KYRO_ADMIN_PASSWORD,\n )\n .option(\n \"-r, --role <role>\",\n \"Admin role\",\n process.env.KYRO_ADMIN_ROLE || \"admin\",\n )\n .action(async (options) => {\n if (!options.email || !options.password) {\n console.error(\n \"❌ Email and password are required. Set KYRO_ADMIN_EMAIL and KYRO_ADMIN_PASSWORD env vars or use -e and -p options.\",\n );\n process.exit(1);\n }\n\n console.log(\"👤 Creating admin user...\");\n console.log(` Email: ${options.email}`);\n console.log(` Role: ${options.role}`);\n\n try {\n const { bootstrapAdmin } = await import(\"../auth/bootstrap.js\");\n const { PostgresAuthAdapter } =\n await import(\"../database/drizzle/postgres-auth-adapter.js\");\n const { drizzle } = await import(\"drizzle-orm/postgres-js\");\n const { default: postgres } = await import(\"postgres\");\n const databaseUrl =\n process.env.DATABASE_URL ||\n \"postgresql://postgres:postgres@localhost:5432/kyro_cms\";\n const client = postgres(databaseUrl, { max: 1 });\n const db = drizzle(client);\n const adapter = new PostgresAuthAdapter({ db });\n\n const result = await bootstrapAdmin({\n authAdapter: adapter,\n adminEmail: options.email,\n adminPassword: options.password,\n adminRole: options.role,\n });\n\n await client.end();\n\n if (result.success) {\n console.log(\"✅ Admin user created successfully!\");\n } else {\n console.error(\"❌ Failed to create admin:\", result.error);\n process.exit(1);\n }\n } catch (error) {\n console.error(\"❌ Bootstrap failed:\", error);\n process.exit(1);\n }\n });\n\n// Health command\nprogram\n .command(\"health\")\n .description(\"Check system health\")\n .action(async () => {\n console.log(\"🏥 System Health Check\");\n\n try {\n const { default: postgres } = await import(\"postgres\");\n const databaseUrl =\n process.env.DATABASE_URL ||\n \"postgresql://postgres:postgres@localhost:5432/kyro_cms\";\n const client = postgres(databaseUrl, { max: 1 });\n await client.unsafe(\"SELECT 1\");\n console.log(\" ✅ Database: Connected\");\n await client.end();\n } catch {\n console.log(\" ❌ Database: Not connected\");\n }\n\n console.log(\" ✅ API: Running\");\n });\n\n// Parse arguments\nprogram.parse();\n\n// Show help if no command\nif (!process.argv.slice(2).length) {\n program.outputHelp();\n}\n"]}
|