@kyro-cms/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/README.md +241 -0
  2. package/dist/base-CQkFzqQl.d.ts +62 -0
  3. package/dist/base-DlhVlwnN.d.cts +62 -0
  4. package/dist/chunk-3Q3FS5J4.cjs +273 -0
  5. package/dist/chunk-3Q3FS5J4.cjs.map +1 -0
  6. package/dist/chunk-3TPQ2BU6.js +423 -0
  7. package/dist/chunk-3TPQ2BU6.js.map +1 -0
  8. package/dist/chunk-3VZCX4DF.cjs +384 -0
  9. package/dist/chunk-3VZCX4DF.cjs.map +1 -0
  10. package/dist/chunk-BXMWDUED.js +115 -0
  11. package/dist/chunk-BXMWDUED.js.map +1 -0
  12. package/dist/chunk-DIC236EW.js +290 -0
  13. package/dist/chunk-DIC236EW.js.map +1 -0
  14. package/dist/chunk-DKSMFC3L.js +268 -0
  15. package/dist/chunk-DKSMFC3L.js.map +1 -0
  16. package/dist/chunk-DVD5P72E.cjs +428 -0
  17. package/dist/chunk-DVD5P72E.cjs.map +1 -0
  18. package/dist/chunk-HT6VE4NW.cjs +293 -0
  19. package/dist/chunk-HT6VE4NW.cjs.map +1 -0
  20. package/dist/chunk-K7QF2QCM.cjs +311 -0
  21. package/dist/chunk-K7QF2QCM.cjs.map +1 -0
  22. package/dist/chunk-OG3KX56O.js +308 -0
  23. package/dist/chunk-OG3KX56O.js.map +1 -0
  24. package/dist/chunk-R3XIBBAW.cjs +34 -0
  25. package/dist/chunk-R3XIBBAW.cjs.map +1 -0
  26. package/dist/chunk-RLTG4YZM.cjs +117 -0
  27. package/dist/chunk-RLTG4YZM.cjs.map +1 -0
  28. package/dist/chunk-SDMNUYVU.js +30 -0
  29. package/dist/chunk-SDMNUYVU.js.map +1 -0
  30. package/dist/chunk-UEG7KMKC.cjs +228 -0
  31. package/dist/chunk-UEG7KMKC.cjs.map +1 -0
  32. package/dist/chunk-UEYC46RL.js +374 -0
  33. package/dist/chunk-UEYC46RL.js.map +1 -0
  34. package/dist/chunk-YPAFJ7EV.js +225 -0
  35. package/dist/chunk-YPAFJ7EV.js.map +1 -0
  36. package/dist/cli/index.cjs +306 -0
  37. package/dist/cli/index.cjs.map +1 -0
  38. package/dist/cli/index.d.cts +1 -0
  39. package/dist/cli/index.d.ts +1 -0
  40. package/dist/cli/index.js +303 -0
  41. package/dist/cli/index.js.map +1 -0
  42. package/dist/drizzle/index.cjs +25 -0
  43. package/dist/drizzle/index.cjs.map +1 -0
  44. package/dist/drizzle/index.d.cts +49 -0
  45. package/dist/drizzle/index.d.ts +49 -0
  46. package/dist/drizzle/index.js +4 -0
  47. package/dist/drizzle/index.js.map +1 -0
  48. package/dist/graphql/index.cjs +16 -0
  49. package/dist/graphql/index.cjs.map +1 -0
  50. package/dist/graphql/index.d.cts +20 -0
  51. package/dist/graphql/index.d.ts +20 -0
  52. package/dist/graphql/index.js +3 -0
  53. package/dist/graphql/index.js.map +1 -0
  54. package/dist/index-4fJKLFK2.d.ts +63 -0
  55. package/dist/index-DI0DRPNv.d.cts +63 -0
  56. package/dist/index.cjs +2506 -0
  57. package/dist/index.cjs.map +1 -0
  58. package/dist/index.d.cts +525 -0
  59. package/dist/index.d.ts +525 -0
  60. package/dist/index.js +2334 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/mongodb/index.cjs +17 -0
  63. package/dist/mongodb/index.cjs.map +1 -0
  64. package/dist/mongodb/index.d.cts +49 -0
  65. package/dist/mongodb/index.d.ts +49 -0
  66. package/dist/mongodb/index.js +4 -0
  67. package/dist/mongodb/index.js.map +1 -0
  68. package/dist/rest/index.cjs +17 -0
  69. package/dist/rest/index.cjs.map +1 -0
  70. package/dist/rest/index.d.cts +28 -0
  71. package/dist/rest/index.d.ts +28 -0
  72. package/dist/rest/index.js +4 -0
  73. package/dist/rest/index.js.map +1 -0
  74. package/dist/trpc/index.cjs +45 -0
  75. package/dist/trpc/index.cjs.map +1 -0
  76. package/dist/trpc/index.d.cts +130 -0
  77. package/dist/trpc/index.d.ts +130 -0
  78. package/dist/trpc/index.js +4 -0
  79. package/dist/trpc/index.js.map +1 -0
  80. package/dist/types-BGM5MV_K.d.cts +589 -0
  81. package/dist/types-BGM5MV_K.d.ts +589 -0
  82. package/dist/ws/index.cjs +24 -0
  83. package/dist/ws/index.cjs.map +1 -0
  84. package/dist/ws/index.d.cts +88 -0
  85. package/dist/ws/index.d.ts +88 -0
  86. package/dist/ws/index.js +3 -0
  87. package/dist/ws/index.js.map +1 -0
  88. package/package.json +120 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/api/trpc/context.ts","../src/api/trpc/procedures.ts","../src/api/trpc/router.ts"],"names":[],"mappings":"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","file":"chunk-UEYC46RL.js","sourcesContent":["import type { BaseAdapter } from '../../registry/types.js';\nimport type { User, Request } from '../../hooks/types.js';\n\n// ============================================================================\n// Context Types\n// ============================================================================\n\nexport interface KyroContext {\n db: BaseAdapter;\n registry: any;\n user?: User;\n tenantID?: string;\n req: Request;\n [key: string]: any;\n}\n\n// ============================================================================\n// Context Factory\n// ============================================================================\n\nexport function createContext(options: {\n db: BaseAdapter;\n registry: any;\n req: Request;\n user?: User;\n tenantID?: string;\n}): KyroContext {\n return {\n db: options.db,\n registry: options.registry,\n req: options.req,\n user: options.user,\n tenantID: options.tenantID,\n };\n}\n","import type { BaseAdapter, CollectionConfig, FindArgs, CreateArgs, UpdateArgs, DeleteArgs } from '../../registry/types.js';\nimport type { User, Request } from '../../hooks/types.js';\nimport { runHooks } from '../../hooks/types.js';\nimport { evaluateAccess } from '../../access/types.js';\n\n// ============================================================================\n// Context Types\n// ============================================================================\n\nexport interface KyroContext {\n db: BaseAdapter;\n registry: any;\n user?: User;\n tenantID?: string;\n req: Request;\n [key: string]: any;\n}\n\n// ============================================================================\n// Context Factory\n// ============================================================================\n\nexport function createContext(options: {\n db: BaseAdapter;\n registry: any;\n req: Request;\n user?: User;\n tenantID?: string;\n}): KyroContext {\n return {\n db: options.db,\n registry: options.registry,\n req: options.req,\n user: options.user,\n tenantID: options.tenantID,\n };\n}\n\n// ============================================================================\n// CRUD Procedure Builders\n// ============================================================================\n\nexport function createFindProcedure(ctx: KyroContext) {\n return async (input: {\n collection: string;\n where?: Record<string, any>;\n sort?: string;\n limit?: number;\n page?: number;\n depth?: number;\n select?: string[];\n }) => {\n const { collection, where, sort, limit, page, depth, select } = input;\n const config = ctx.registry.getCollection(collection);\n \n // Check access\n if (config.access?.read) {\n const allowed = await evaluateAccess(config.access.read, {\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n });\n if (allowed === false) throw new Error('Access denied');\n }\n\n // Run beforeRead hooks\n if (config.hooks?.beforeRead) {\n for (const hook of config.hooks.beforeRead) {\n await hook({\n collection,\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n operation: 'read',\n where,\n });\n }\n }\n\n // Execute query\n const result = await ctx.db.find({\n collection,\n where: where || {},\n sort,\n limit: limit || 10,\n page: page || 1,\n depth: depth || 0,\n tenantID: ctx.tenantID,\n select,\n });\n\n // Run afterRead hooks\n if (config.hooks?.afterRead) {\n for (const doc of result.docs) {\n for (const hook of config.hooks.afterRead) {\n await hook({\n collection,\n doc,\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n operation: 'read',\n });\n }\n }\n }\n\n return result;\n };\n}\n\nexport function createFindByIDProcedure(ctx: KyroContext) {\n return async (input: {\n collection: string;\n id: string;\n depth?: number;\n select?: string[];\n }) => {\n const { collection, id, depth, select } = input;\n const config = ctx.registry.getCollection(collection);\n \n // Check access\n if (config.access?.read) {\n const allowed = await evaluateAccess(config.access.read, {\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n id,\n });\n if (allowed === false) throw new Error('Access denied');\n }\n\n const doc = await ctx.db.findByID({\n collection,\n id,\n depth: depth || 0,\n tenantID: ctx.tenantID,\n select,\n });\n\n if (!doc) throw new Error(`Document not found: ${collection}/${id}`);\n\n // Run afterRead hooks\n if (config.hooks?.afterRead) {\n for (const hook of config.hooks.afterRead) {\n await hook({\n collection,\n doc,\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n operation: 'read',\n id,\n });\n }\n }\n\n return doc;\n };\n}\n\nexport function createCreateProcedure(ctx: KyroContext) {\n return async (input: {\n collection: string;\n data: Record<string, any>;\n depth?: number;\n select?: string[];\n }) => {\n const { collection, data, depth, select } = input;\n const config = ctx.registry.getCollection(collection);\n \n // Check access\n if (config.access?.create) {\n const allowed = await evaluateAccess(config.access.create, {\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n data,\n });\n if (allowed === false) throw new Error('Access denied');\n }\n\n // Validate with Zod\n const schema = ctx.registry.getCreateZodSchema(collection);\n const validated = schema.parse(data);\n\n // Add tenantID if scoped\n if (config.tenantScoped && ctx.tenantID) {\n validated.tenantID = ctx.tenantID;\n }\n\n // Run beforeValidate hooks\n if (config.hooks?.beforeValidate) {\n for (const hook of config.hooks.beforeValidate) {\n const hookResult = await hook({\n collection,\n data: validated,\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n operation: 'create',\n });\n if (hookResult) Object.assign(validated, hookResult);\n }\n }\n\n // Run beforeChange hooks\n if (config.hooks?.beforeChange) {\n for (const hook of config.hooks.beforeChange) {\n const hookResult = await hook({\n collection,\n data: validated,\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n operation: 'create',\n });\n if (hookResult) Object.assign(validated, hookResult);\n }\n }\n\n // Execute create\n const doc = await ctx.db.create({\n collection,\n data: validated,\n depth: depth || 0,\n tenantID: ctx.tenantID,\n select,\n });\n\n // Run afterChange hooks\n if (config.hooks?.afterChange) {\n for (const hook of config.hooks.afterChange) {\n await hook({\n collection,\n doc,\n data: validated,\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n operation: 'create',\n });\n }\n }\n\n return { doc };\n };\n}\n\nexport function createUpdateProcedure(ctx: KyroContext) {\n return async (input: {\n collection: string;\n id: string;\n data: Record<string, any>;\n depth?: number;\n select?: string[];\n }) => {\n const { collection, id, data, depth, select } = input;\n const config = ctx.registry.getCollection(collection);\n \n // Get original doc for hooks\n const originalDoc = await ctx.db.findByID({\n collection,\n id,\n tenantID: ctx.tenantID,\n });\n\n if (!originalDoc) throw new Error(`Document not found: ${collection}/${id}`);\n\n // Check access\n if (config.access?.update) {\n const allowed = await evaluateAccess(config.access.update, {\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n id,\n doc: originalDoc,\n data,\n });\n if (allowed === false) throw new Error('Access denied');\n }\n\n // Validate with Zod\n const schema = ctx.registry.getUpdateZodSchema(collection);\n const validated = schema.parse(data);\n\n // Add tenantID if scoped\n if (config.tenantScoped && ctx.tenantID) {\n validated.tenantID = ctx.tenantID;\n }\n\n // Run beforeValidate hooks\n if (config.hooks?.beforeValidate) {\n for (const hook of config.hooks.beforeValidate) {\n const hookResult = await hook({\n collection,\n data: validated,\n originalDoc,\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n operation: 'update',\n id,\n });\n if (hookResult) Object.assign(validated, hookResult);\n }\n }\n\n // Run beforeChange hooks\n if (config.hooks?.beforeChange) {\n for (const hook of config.hooks.beforeChange) {\n const hookResult = await hook({\n collection,\n data: validated,\n originalDoc,\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n operation: 'update',\n id,\n });\n if (hookResult) Object.assign(validated, hookResult);\n }\n }\n\n // Execute update\n const doc = await ctx.db.update({\n collection,\n id,\n data: validated,\n depth: depth || 0,\n tenantID: ctx.tenantID,\n select,\n });\n\n // Run afterChange hooks\n if (config.hooks?.afterChange) {\n for (const hook of config.hooks.afterChange) {\n await hook({\n collection,\n doc,\n data: validated,\n originalDoc,\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n operation: 'update',\n id,\n });\n }\n }\n\n return { doc };\n };\n}\n\nexport function createDeleteProcedure(ctx: KyroContext) {\n return async (input: {\n collection: string;\n id: string;\n }) => {\n const { collection, id } = input;\n const config = ctx.registry.getCollection(collection);\n \n // Get original doc for hooks\n const originalDoc = await ctx.db.findByID({\n collection,\n id,\n tenantID: ctx.tenantID,\n });\n\n if (!originalDoc) throw new Error(`Document not found: ${collection}/${id}`);\n\n // Check access\n if (config.access?.delete) {\n const allowed = await evaluateAccess(config.access.delete, {\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n id,\n doc: originalDoc,\n });\n if (allowed === false) throw new Error('Access denied');\n }\n\n // Run beforeDelete hooks\n if (config.hooks?.beforeDelete) {\n for (const hook of config.hooks.beforeDelete) {\n await hook({\n collection,\n doc: originalDoc,\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n operation: 'delete',\n id,\n });\n }\n }\n\n // Execute delete\n const doc = await ctx.db.delete({\n collection,\n id,\n tenantID: ctx.tenantID,\n });\n\n // Run afterDelete hooks\n if (config.hooks?.afterDelete) {\n for (const hook of config.hooks.afterDelete) {\n await hook({\n collection,\n doc,\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n operation: 'delete',\n id,\n });\n }\n }\n\n return { doc, message: 'Deleted successfully' };\n };\n}\n\nexport function createCountProcedure(ctx: KyroContext) {\n return async (input: {\n collection: string;\n where?: Record<string, any>;\n }) => {\n const { collection, where } = input;\n const config = ctx.registry.getCollection(collection);\n \n // Check access\n if (config.access?.read) {\n const allowed = await evaluateAccess(config.access.read, {\n req: ctx.req,\n user: ctx.user,\n tenantID: ctx.tenantID,\n });\n if (allowed === false) throw new Error('Access denied');\n }\n\n const totalDocs = await ctx.db.count({\n collection,\n where: where || {},\n tenantID: ctx.tenantID,\n });\n\n return { totalDocs };\n };\n}\n","import type { KyroContext } from './context.js';\nimport {\n createFindProcedure,\n createFindByIDProcedure,\n createCreateProcedure,\n createUpdateProcedure,\n createDeleteProcedure,\n createCountProcedure,\n} from './procedures.js';\n\n// ============================================================================\n// Dynamic Router Generator\n// ============================================================================\n\nexport function createDynamicRouter(ctx: KyroContext) {\n const router: Record<string, any> = {};\n const collections = ctx.registry.getCollections();\n\n for (const collection of collections) {\n const slug = collection.slug;\n \n router[slug] = {\n find: createFindProcedure(ctx),\n findByID: createFindByIDProcedure(ctx),\n create: createCreateProcedure(ctx),\n update: createUpdateProcedure(ctx),\n delete: createDeleteProcedure(ctx),\n count: createCountProcedure(ctx),\n };\n }\n\n // Add globals\n const globals = ctx.registry.getGlobals();\n for (const global of globals) {\n const slug = global.slug;\n \n router[`_globals_${slug}`] = {\n get: async () => {\n const doc = await ctx.db.findOne({\n collection: `_globals_${slug}`,\n where: {},\n tenantID: ctx.tenantID,\n });\n return doc;\n },\n update: async (input: { data: Record<string, any> }) => {\n const schema = ctx.registry.getZodSchema(slug);\n const validated = schema.parse(input.data);\n \n const doc = await ctx.db.create({\n collection: `_globals_${slug}`,\n data: { ...validated, id: slug },\n tenantID: ctx.tenantID,\n });\n \n return doc;\n },\n };\n }\n\n return router;\n}\n\n// ============================================================================\n// Typed Router Interface\n// ============================================================================\n\nexport interface KyroRouter {\n [collectionSlug: string]: {\n find: (input: {\n where?: Record<string, any>;\n sort?: string;\n limit?: number;\n page?: number;\n depth?: number;\n select?: string[];\n }) => Promise<{\n docs: any[];\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 findByID: (input: {\n id: string;\n depth?: number;\n select?: string[];\n }) => Promise<any>;\n create: (input: {\n data: Record<string, any>;\n depth?: number;\n select?: string[];\n }) => Promise<{ doc: any }>;\n update: (input: {\n id: string;\n data: Record<string, any>;\n depth?: number;\n select?: string[];\n }) => Promise<{ doc: any }>;\n delete: (input: {\n id: string;\n }) => Promise<{ doc: any; message: string }>;\n count: (input: {\n where?: Record<string, any>;\n }) => Promise<{ totalDocs: number }>;\n };\n}\n\n// ============================================================================\n// Server Entry\n// ============================================================================\n\nexport function createKyroServer(ctx: KyroContext): KyroRouter {\n return createDynamicRouter(ctx) as KyroRouter;\n}\n"]}
@@ -0,0 +1,225 @@
1
+ import { evaluateAccess } from './chunk-SDMNUYVU.js';
2
+ import { Hono } from 'hono';
3
+
4
+ function createHonoApp(options) {
5
+ const { registry, db, user, tenantID, cors } = options;
6
+ const app = new Hono();
7
+ if (cors) {
8
+ app.use("*", async (c, next) => {
9
+ const origin = c.req.header("Origin") || "*";
10
+ if (cors.origins && !cors.origins.includes(origin) && !cors.origins.includes("*")) ;
11
+ c.header("Access-Control-Allow-Origin", origin);
12
+ c.header("Access-Control-Allow-Methods", "GET, POST, PATCH, DELETE, OPTIONS");
13
+ c.header("Access-Control-Allow-Headers", "Content-Type, Authorization");
14
+ if (cors.credentials) {
15
+ c.header("Access-Control-Allow-Credentials", "true");
16
+ }
17
+ if (c.req.method === "OPTIONS") {
18
+ return c.text("");
19
+ }
20
+ await next();
21
+ });
22
+ }
23
+ app.get("/api/health", (c) => {
24
+ return c.json({
25
+ status: "ok",
26
+ version: "0.1.0",
27
+ collections: registry.getCollectionSlugs(),
28
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
29
+ });
30
+ });
31
+ app.get("/api/collections", (c) => {
32
+ const collections2 = registry.getCollections().map((col) => ({
33
+ slug: col.slug,
34
+ label: col.label || col.slug,
35
+ fields: col.fields.filter((f) => f.name).map((f) => ({
36
+ name: f.name,
37
+ type: f.type,
38
+ required: f.required,
39
+ label: f.label
40
+ }))
41
+ }));
42
+ return c.json(collections2);
43
+ });
44
+ const collections = registry.getCollections();
45
+ for (const collection of collections) {
46
+ const slug = collection.slug;
47
+ const basePath = `/api/${slug}`;
48
+ app.get(basePath, async (c) => {
49
+ try {
50
+ if (collection.access?.read) {
51
+ const allowed = await evaluateAccess(collection.access.read, {
52
+ req: c.req,
53
+ user,
54
+ tenantID
55
+ });
56
+ if (allowed === false) {
57
+ return c.json({ error: "Access denied" }, 403);
58
+ }
59
+ }
60
+ const url = new URL(c.req.url);
61
+ const page = parseInt(url.searchParams.get("page") || "1");
62
+ const limit = Math.min(parseInt(url.searchParams.get("limit") || "10"), 100);
63
+ const sort = url.searchParams.get("sort") || void 0;
64
+ const depth = parseInt(url.searchParams.get("depth") || "0");
65
+ const select = url.searchParams.get("select")?.split(",") || void 0;
66
+ let where = {};
67
+ const whereParam = url.searchParams.get("where");
68
+ if (whereParam) {
69
+ try {
70
+ where = JSON.parse(whereParam);
71
+ } catch {
72
+ }
73
+ }
74
+ const result = await db.find({
75
+ collection: slug,
76
+ where,
77
+ sort,
78
+ limit,
79
+ page,
80
+ depth,
81
+ tenantID,
82
+ select
83
+ });
84
+ return c.json(result);
85
+ } catch (error) {
86
+ return c.json({ error: error.message }, 500);
87
+ }
88
+ });
89
+ app.get(`${basePath}/:id`, async (c) => {
90
+ try {
91
+ const id = c.req.param("id");
92
+ const url = new URL(c.req.url);
93
+ const depth = parseInt(url.searchParams.get("depth") || "0");
94
+ const select = url.searchParams.get("select")?.split(",") || void 0;
95
+ if (collection.access?.read) {
96
+ const allowed = await evaluateAccess(collection.access.read, {
97
+ req: c.req,
98
+ user,
99
+ tenantID,
100
+ id
101
+ });
102
+ if (allowed === false) {
103
+ return c.json({ error: "Access denied" }, 403);
104
+ }
105
+ }
106
+ const doc = await db.findByID({
107
+ collection: slug,
108
+ id,
109
+ depth,
110
+ tenantID,
111
+ select
112
+ });
113
+ if (!doc) {
114
+ return c.json({ error: "Document not found" }, 404);
115
+ }
116
+ return c.json(doc);
117
+ } catch (error) {
118
+ return c.json({ error: error.message }, 500);
119
+ }
120
+ });
121
+ app.post(basePath, async (c) => {
122
+ try {
123
+ const body = await c.req.json();
124
+ if (collection.access?.create) {
125
+ const allowed = await evaluateAccess(collection.access.create, {
126
+ req: c.req,
127
+ user,
128
+ tenantID,
129
+ data: body
130
+ });
131
+ if (allowed === false) {
132
+ return c.json({ error: "Access denied" }, 403);
133
+ }
134
+ }
135
+ const schema = registry.getCreateZodSchema(slug);
136
+ const validated = schema.parse(body);
137
+ if (collection.tenantScoped && tenantID) {
138
+ validated.tenantID = tenantID;
139
+ }
140
+ const doc = await db.create({
141
+ collection: slug,
142
+ data: validated,
143
+ tenantID
144
+ });
145
+ return c.json({ doc, message: "Created successfully" }, 201);
146
+ } catch (error) {
147
+ if (error.name === "ZodError") {
148
+ return c.json({ error: "Validation failed", details: error.errors }, 400);
149
+ }
150
+ return c.json({ error: error.message }, 500);
151
+ }
152
+ });
153
+ app.patch(`${basePath}/:id`, async (c) => {
154
+ try {
155
+ const id = c.req.param("id");
156
+ const body = await c.req.json();
157
+ if (collection.access?.update) {
158
+ const allowed = await evaluateAccess(collection.access.update, {
159
+ req: c.req,
160
+ user,
161
+ tenantID,
162
+ id,
163
+ data: body
164
+ });
165
+ if (allowed === false) {
166
+ return c.json({ error: "Access denied" }, 403);
167
+ }
168
+ }
169
+ const schema = registry.getUpdateZodSchema(slug);
170
+ const validated = schema.parse(body);
171
+ const doc = await db.update({
172
+ collection: slug,
173
+ id,
174
+ data: validated,
175
+ tenantID
176
+ });
177
+ return c.json({ doc, message: "Updated successfully" });
178
+ } catch (error) {
179
+ if (error.name === "ZodError") {
180
+ return c.json({ error: "Validation failed", details: error.errors }, 400);
181
+ }
182
+ return c.json({ error: error.message }, 500);
183
+ }
184
+ });
185
+ app.delete(`${basePath}/:id`, async (c) => {
186
+ try {
187
+ const id = c.req.param("id");
188
+ if (collection.access?.delete) {
189
+ const allowed = await evaluateAccess(collection.access.delete, {
190
+ req: c.req,
191
+ user,
192
+ tenantID,
193
+ id
194
+ });
195
+ if (allowed === false) {
196
+ return c.json({ error: "Access denied" }, 403);
197
+ }
198
+ }
199
+ const doc = await db.delete({
200
+ collection: slug,
201
+ id,
202
+ tenantID
203
+ });
204
+ return c.json({ doc, message: "Deleted successfully" });
205
+ } catch (error) {
206
+ return c.json({ error: error.message }, 500);
207
+ }
208
+ });
209
+ }
210
+ return app;
211
+ }
212
+ function createRESTAPI(registry, db, options) {
213
+ return createHonoApp({
214
+ registry,
215
+ db,
216
+ user: options?.user,
217
+ req: options?.req,
218
+ tenantID: options?.tenantID,
219
+ cors: options?.cors
220
+ });
221
+ }
222
+
223
+ export { createHonoApp, createRESTAPI };
224
+ //# sourceMappingURL=chunk-YPAFJ7EV.js.map
225
+ //# sourceMappingURL=chunk-YPAFJ7EV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/api/rest/hono-app.ts"],"names":["collections"],"mappings":"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","file":"chunk-YPAFJ7EV.js","sourcesContent":["import { Hono } from 'hono';\nimport type { BaseAdapter } from '../../registry/types.js';\nimport { Registry } from '../../registry/index.js';\nimport { evaluateAccess } from '../../access/types.js';\nimport type { User, Request } from '../../hooks/types.js';\n\n// ============================================================================\n// REST API Factory\n// ============================================================================\n\nexport interface HonoAppOptions {\n registry: Registry;\n db: BaseAdapter;\n user?: User;\n req?: Request;\n tenantID?: string;\n cors?: {\n origins?: string[];\n credentials?: boolean;\n };\n}\n\nexport function createHonoApp(options: HonoAppOptions): Hono {\n const { registry, db, user, tenantID, cors } = options;\n const app = new Hono();\n\n // CORS middleware\n if (cors) {\n app.use('*', async (c, next) => {\n const origin = c.req.header('Origin') || '*';\n if (cors.origins && !cors.origins.includes(origin) && !cors.origins.includes('*')) {\n // Blocked origin\n }\n \n c.header('Access-Control-Allow-Origin', origin);\n c.header('Access-Control-Allow-Methods', 'GET, POST, PATCH, DELETE, OPTIONS');\n c.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');\n if (cors.credentials) {\n c.header('Access-Control-Allow-Credentials', 'true');\n }\n \n if (c.req.method === 'OPTIONS') {\n return c.text('');\n }\n \n await next();\n });\n }\n\n // Health check\n app.get('/api/health', (c) => {\n return c.json({\n status: 'ok',\n version: '0.1.0',\n collections: registry.getCollectionSlugs(),\n timestamp: new Date().toISOString(),\n });\n });\n\n // List collections\n app.get('/api/collections', (c) => {\n const collections = registry.getCollections().map(col => ({\n slug: col.slug,\n label: col.label || col.slug,\n fields: col.fields.filter(f => f.name).map(f => ({\n name: f.name,\n type: f.type,\n required: f.required,\n label: f.label,\n })),\n }));\n return c.json(collections);\n });\n\n // Dynamic collection routes\n const collections = registry.getCollections();\n\n for (const collection of collections) {\n const slug = collection.slug;\n const basePath = `/api/${slug}`;\n\n // GET /api/:collection - List\n app.get(basePath, async (c) => {\n try {\n // Check access\n if (collection.access?.read) {\n const allowed = await evaluateAccess(collection.access.read, {\n req: c.req as any,\n user,\n tenantID,\n });\n if (allowed === false) {\n return c.json({ error: 'Access denied' }, 403);\n }\n }\n\n // Parse query params\n const url = new URL(c.req.url);\n const page = parseInt(url.searchParams.get('page') || '1');\n const limit = Math.min(parseInt(url.searchParams.get('limit') || '10'), 100);\n const sort = url.searchParams.get('sort') || undefined;\n const depth = parseInt(url.searchParams.get('depth') || '0');\n const select = url.searchParams.get('select')?.split(',') || undefined;\n \n let where = {};\n const whereParam = url.searchParams.get('where');\n if (whereParam) {\n try {\n where = JSON.parse(whereParam);\n } catch {}\n }\n\n const result = await db.find({\n collection: slug,\n where,\n sort,\n limit,\n page,\n depth,\n tenantID,\n select,\n });\n\n return c.json(result);\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n // GET /api/:collection/:id - Find by ID\n app.get(`${basePath}/:id`, async (c) => {\n try {\n const id = c.req.param('id');\n const url = new URL(c.req.url);\n const depth = parseInt(url.searchParams.get('depth') || '0');\n const select = url.searchParams.get('select')?.split(',') || undefined;\n\n // Check access\n if (collection.access?.read) {\n const allowed = await evaluateAccess(collection.access.read, {\n req: c.req as any,\n user,\n tenantID,\n id,\n });\n if (allowed === false) {\n return c.json({ error: 'Access denied' }, 403);\n }\n }\n\n const doc = await db.findByID({\n collection: slug,\n id,\n depth,\n tenantID,\n select,\n });\n\n if (!doc) {\n return c.json({ error: 'Document not found' }, 404);\n }\n\n return c.json(doc);\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n\n // POST /api/:collection - Create\n app.post(basePath, async (c) => {\n try {\n const body = await c.req.json();\n\n // Check access\n if (collection.access?.create) {\n const allowed = await evaluateAccess(collection.access.create, {\n req: c.req as any,\n user,\n tenantID,\n data: body,\n });\n if (allowed === false) {\n return c.json({ error: 'Access denied' }, 403);\n }\n }\n\n // Validate with Zod\n const schema = registry.getCreateZodSchema(slug);\n const validated = schema.parse(body);\n\n // Add tenantID if scoped\n if (collection.tenantScoped && tenantID) {\n validated.tenantID = tenantID;\n }\n\n const doc = await db.create({\n collection: slug,\n data: validated,\n tenantID,\n });\n\n return c.json({ doc, message: 'Created successfully' }, 201);\n } catch (error: any) {\n if (error.name === 'ZodError') {\n return c.json({ error: 'Validation failed', details: error.errors }, 400);\n }\n return c.json({ error: error.message }, 500);\n }\n });\n\n // PATCH /api/:collection/:id - Update\n app.patch(`${basePath}/:id`, async (c) => {\n try {\n const id = c.req.param('id');\n const body = await c.req.json();\n\n // Check access\n if (collection.access?.update) {\n const allowed = await evaluateAccess(collection.access.update, {\n req: c.req as any,\n user,\n tenantID,\n id,\n data: body,\n });\n if (allowed === false) {\n return c.json({ error: 'Access denied' }, 403);\n }\n }\n\n // Validate with Zod\n const schema = registry.getUpdateZodSchema(slug);\n const validated = schema.parse(body);\n\n const doc = await db.update({\n collection: slug,\n id,\n data: validated,\n tenantID,\n });\n\n return c.json({ doc, message: 'Updated successfully' });\n } catch (error: any) {\n if (error.name === 'ZodError') {\n return c.json({ error: 'Validation failed', details: error.errors }, 400);\n }\n return c.json({ error: error.message }, 500);\n }\n });\n\n // DELETE /api/:collection/:id - Delete\n app.delete(`${basePath}/:id`, async (c) => {\n try {\n const id = c.req.param('id');\n\n // Check access\n if (collection.access?.delete) {\n const allowed = await evaluateAccess(collection.access.delete, {\n req: c.req as any,\n user,\n tenantID,\n id,\n });\n if (allowed === false) {\n return c.json({ error: 'Access denied' }, 403);\n }\n }\n\n const doc = await db.delete({\n collection: slug,\n id,\n tenantID,\n });\n\n return c.json({ doc, message: 'Deleted successfully' });\n } catch (error: any) {\n return c.json({ error: error.message }, 500);\n }\n });\n }\n\n return app;\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\nexport function createRESTAPI(registry: Registry, db: BaseAdapter, options?: {\n user?: User;\n req?: Request;\n tenantID?: string;\n cors?: {\n origins?: string[];\n credentials?: boolean;\n };\n}): Hono {\n return createHonoApp({\n registry,\n db,\n user: options?.user,\n req: options?.req,\n tenantID: options?.tenantID,\n cors: options?.cors,\n });\n}\n"]}
@@ -0,0 +1,306 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ var commander = require('commander');
5
+ var fs = require('fs');
6
+ var path = require('path');
7
+ var url = require('url');
8
+ var glob = require('glob');
9
+
10
+ var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
11
+ function fieldToType(field) {
12
+ switch (field.type) {
13
+ case "text":
14
+ case "email":
15
+ case "password":
16
+ case "textarea":
17
+ case "color":
18
+ case "code":
19
+ case "markdown":
20
+ case "date":
21
+ case "richtext":
22
+ case "json":
23
+ return field.hasMany ? "string[]" : "string";
24
+ case "number":
25
+ return field.hasMany ? "number[]" : "number";
26
+ case "checkbox":
27
+ return "boolean";
28
+ case "select":
29
+ case "radio":
30
+ if (field.options) {
31
+ const values = field.options.map((o) => `'${o.value}'`).join(" | ");
32
+ return field.hasMany ? `(${values})[]` : values;
33
+ }
34
+ return field.hasMany ? "string[]" : "string";
35
+ case "relationship":
36
+ if (Array.isArray(field.relationTo)) {
37
+ const types = field.relationTo.map((r) => `${capitalize(r)} | string`).join(" | ");
38
+ return field.hasMany ? `(${types})[]` : `(${types})`;
39
+ }
40
+ const relTo = field.relationTo || "unknown";
41
+ return field.hasMany ? `(${capitalize(relTo)} | string)[]` : `${capitalize(relTo)} | string`;
42
+ case "upload":
43
+ return field.hasMany ? "(Media | string)[]" : "Media | string";
44
+ case "array":
45
+ if (field.fields && field.fields.length > 0) {
46
+ const itemFields = field.fields.filter((f) => f.name).map((f) => {
47
+ const type = fieldToType(f);
48
+ return ` ${f.name}${f.required ? "" : "?"}: ${type};`;
49
+ }).join("\n");
50
+ return `Array<{
51
+ ${itemFields}
52
+ }>`;
53
+ }
54
+ return "Record<string, any>[]";
55
+ case "group":
56
+ if (field.fields && field.fields.length > 0) {
57
+ const itemFields = field.fields.filter((f) => f.name).map((f) => {
58
+ const type = fieldToType(f);
59
+ return ` ${f.name}${f.required ? "" : "?"}: ${type};`;
60
+ }).join("\n");
61
+ return `{
62
+ ${itemFields}
63
+ }`;
64
+ }
65
+ return "Record<string, any>";
66
+ case "blocks":
67
+ return "Block[]";
68
+ default:
69
+ return "any";
70
+ }
71
+ }
72
+ function capitalize(str) {
73
+ return str.charAt(0).toUpperCase() + str.slice(1).replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());
74
+ }
75
+ function collectionToInterface(collection) {
76
+ const name = capitalize(collection.slug);
77
+ const fields = collection.fields.filter((f) => f.name).map((f) => {
78
+ const type = fieldToType(f);
79
+ return ` ${f.name}${f.required ? "" : "?"}: ${type};`;
80
+ });
81
+ fields.unshift(" id: string;");
82
+ fields.push(" createdAt: string;");
83
+ fields.push(" updatedAt: string;");
84
+ return `export interface ${name} {
85
+ ${fields.join("\n")}
86
+ }`;
87
+ }
88
+ function generateTypes(collections) {
89
+ const interfaces = collections.map((c) => collectionToInterface(c));
90
+ const header = `// ============================================================================
91
+ // Auto-generated by kyro generate
92
+ // ============================================================================
93
+
94
+ import type { RichTextBlock } from '@kyro-cms/core';
95
+
96
+ export interface Media {
97
+ id: string;
98
+ url: string;
99
+ filename: string;
100
+ mimeType: string;
101
+ filesize: number;
102
+ width?: number;
103
+ height?: number;
104
+ createdAt: string;
105
+ updatedAt: string;
106
+ }
107
+
108
+ export interface Block {
109
+ blockType: string;
110
+ [key: string]: any;
111
+ }
112
+
113
+ `;
114
+ const body = interfaces.join("\n\n");
115
+ const footer = `
116
+
117
+ // ============================================================================
118
+ // Query Types
119
+ // ============================================================================
120
+
121
+ export interface KyroWhereClause {
122
+ [field: string]: {
123
+ equals?: any;
124
+ not_equals?: any;
125
+ in?: any[];
126
+ not_in?: any[];
127
+ greater_than?: number;
128
+ greater_than_equal?: number;
129
+ less_than?: number;
130
+ less_than_equal?: number;
131
+ like?: string;
132
+ exists?: boolean;
133
+ };
134
+ }
135
+
136
+ export interface KyroFindArgs {
137
+ where?: KyroWhereClause;
138
+ sort?: string;
139
+ limit?: number;
140
+ page?: number;
141
+ depth?: number;
142
+ select?: string[];
143
+ }
144
+
145
+ export interface KyroFindResult<T> {
146
+ docs: T[];
147
+ totalDocs: number;
148
+ limit: number;
149
+ totalPages: number;
150
+ page: number;
151
+ pagingCounter: number;
152
+ hasPrevPage: boolean;
153
+ hasNextPage: boolean;
154
+ prevPage: number | null;
155
+ nextPage: number | null;
156
+ }
157
+
158
+ export interface KyroCreateResult<T> {
159
+ doc: T;
160
+ message?: string;
161
+ }
162
+
163
+ export interface KyroUpdateResult<T> {
164
+ doc: T;
165
+ message?: string;
166
+ }
167
+
168
+ export interface KyroDeleteResult<T> {
169
+ doc: T;
170
+ message: string;
171
+ }
172
+
173
+ // ============================================================================
174
+ // Collection Map
175
+ // ============================================================================
176
+
177
+ export interface KyroCollections {
178
+ ${collections.map((c) => ` ${c.slug}: ${capitalize(c.slug)};`).join("\n")}
179
+ }
180
+
181
+ // ============================================================================
182
+ // Typed Client
183
+ // ============================================================================
184
+
185
+ export interface KyroTypedClient<C extends keyof KyroCollections> {
186
+ find: (args?: KyroFindArgs) => Promise<KyroFindResult<KyroCollections[C]>>;
187
+ findByID: (id: string, args?: { depth?: number; select?: string[] }) => Promise<KyroCollections[C]>;
188
+ create: (data: Partial<KyroCollections[C]>) => Promise<KyroCreateResult<KyroCollections[C]>>;
189
+ update: (id: string, data: Partial<KyroCollections[C]>) => Promise<KyroUpdateResult<KyroCollections[C]>>;
190
+ delete: (id: string) => Promise<KyroDeleteResult<KyroCollections[C]>>;
191
+ count: (args?: { where?: KyroWhereClause }) => Promise<{ totalDocs: number }>;
192
+ }
193
+
194
+ export interface KyroClient {
195
+ ${collections.map((c) => ` ${c.slug}: KyroTypedClient<'${c.slug}'>;`).join("\n")}
196
+ }
197
+
198
+ export function createClient(config: { url: string; token?: string }): KyroClient {
199
+ // Client implementation would be here
200
+ throw new Error('Not implemented');
201
+ }
202
+ `;
203
+ return header + body + footer;
204
+ }
205
+ function createGenerateCommand() {
206
+ const generate = new commander.Command("generate").description("Generate TypeScript types from collection configs").option("-c, --config <path>", "Path to config file or directory", "./src/kyro").option("-o, --output <path>", "Output file path", "./src/types/kyro.d.ts").option("-w, --watch", "Watch for changes and regenerate").action(async (options) => {
207
+ const configPath = path.resolve(options.config);
208
+ const outputPath = path.resolve(options.output);
209
+ console.log("\u{1F527} Generating types from:", configPath);
210
+ try {
211
+ const configFiles = await glob.glob(`${configPath}/**/*.{ts,js}`);
212
+ if (configFiles.length === 0) {
213
+ console.error("\u274C No config files found at:", configPath);
214
+ process.exit(1);
215
+ }
216
+ const collections = [];
217
+ for (const file of configFiles) {
218
+ try {
219
+ const mod = await import(file);
220
+ const configs = Object.values(mod).filter((v) => v && v.slug && v.fields);
221
+ collections.push(...configs);
222
+ } catch (error) {
223
+ console.warn(`\u26A0\uFE0F Could not parse: ${file}`);
224
+ }
225
+ }
226
+ if (collections.length === 0) {
227
+ console.error("\u274C No valid collection configs found");
228
+ process.exit(1);
229
+ }
230
+ console.log(`\u{1F4E6} Found ${collections.length} collection(s):`);
231
+ collections.forEach((c) => console.log(` - ${c.slug}`));
232
+ const types = generateTypes(collections);
233
+ const outputDir = path.join(outputPath, "..");
234
+ if (!fs.existsSync(outputDir)) {
235
+ fs.mkdirSync(outputDir, { recursive: true });
236
+ }
237
+ fs.writeFileSync(outputPath, types);
238
+ console.log(`\u2705 Types generated at: ${outputPath}`);
239
+ if (options.watch) {
240
+ console.log("\n\u{1F441}\uFE0F Watching for changes...");
241
+ const { watch } = await import('fs');
242
+ watch(configPath, { recursive: true }, async (eventType, filename) => {
243
+ console.log(`
244
+ \u{1F504} File changed: ${filename}`);
245
+ const newCollections = [];
246
+ for (const file of configFiles) {
247
+ try {
248
+ const mod = await import(file + `?t=${Date.now()}`);
249
+ const configs = Object.values(mod).filter((v) => v && v.slug && v.fields);
250
+ newCollections.push(...configs);
251
+ } catch {
252
+ }
253
+ }
254
+ const newTypes = generateTypes(newCollections);
255
+ fs.writeFileSync(outputPath, newTypes);
256
+ console.log("\u2705 Types regenerated");
257
+ });
258
+ }
259
+ } catch (error) {
260
+ console.error("\u274C Error:", error.message);
261
+ process.exit(1);
262
+ }
263
+ });
264
+ return generate;
265
+ }
266
+
267
+ // src/cli/index.ts
268
+ var __filename$1 = url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)));
269
+ var __dirname$1 = path.dirname(__filename$1);
270
+ var version = "0.1.0";
271
+ try {
272
+ const pkg = JSON.parse(fs.readFileSync(path.join(__dirname$1, "../../package.json"), "utf-8"));
273
+ version = pkg.version;
274
+ } catch {
275
+ }
276
+ var program = new commander.Command();
277
+ program.name("kyro").description("Kyro CMS - Astro-native headless CMS").version(version);
278
+ program.addCommand(createGenerateCommand());
279
+ program.command("dev").description("Start development server").option("-p, --port <port>", "Port number", "4321").action(async (options) => {
280
+ console.log("\u{1F680} Starting Kyro CMS development server...");
281
+ console.log(` Port: ${options.port}`);
282
+ });
283
+ program.command("build").description("Build for production").action(async () => {
284
+ console.log("\u{1F528} Building Kyro CMS for production...");
285
+ });
286
+ program.command("migrate").description("Run database migrations").option("--dry-run", "Show what would be migrated without executing").action(async (options) => {
287
+ console.log("\u{1F504} Running database migrations...");
288
+ if (options.dryRun) {
289
+ console.log(" (Dry run mode)");
290
+ }
291
+ });
292
+ program.command("seed").description("Seed the database with initial data").option("-f, --file <path>", "Seed file path").action(async (options) => {
293
+ console.log("\u{1F331} Seeding database...");
294
+ });
295
+ program.command("health").description("Check system health").action(async () => {
296
+ console.log("\u{1F3E5} System Health Check");
297
+ console.log(" \u2705 Database: Connected");
298
+ console.log(" \u2705 API: Running");
299
+ console.log(" \u2705 WebSocket: Listening");
300
+ });
301
+ program.parse();
302
+ if (!process.argv.slice(2).length) {
303
+ program.outputHelp();
304
+ }
305
+ //# sourceMappingURL=index.cjs.map
306
+ //# sourceMappingURL=index.cjs.map