@aphexcms/cms-core 0.1.12 → 0.1.14

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 (95) hide show
  1. package/LICENSE +21 -0
  2. package/dist/api/documents.d.ts +1 -0
  3. package/dist/api/documents.d.ts.map +1 -1
  4. package/dist/api/documents.js +9 -1
  5. package/dist/api/types.d.ts +24 -2
  6. package/dist/api/types.d.ts.map +1 -1
  7. package/dist/auth/auth-hooks.d.ts.map +1 -1
  8. package/dist/auth/auth-hooks.js +18 -4
  9. package/dist/cli/generate-types.js +218 -0
  10. package/dist/cli/index.js +86 -0
  11. package/dist/components/AdminApp.svelte +15 -12
  12. package/dist/components/AdminApp.svelte.d.ts.map +1 -1
  13. package/dist/components/admin/DocumentEditor.svelte +60 -14
  14. package/dist/components/admin/DocumentEditor.svelte.d.ts.map +1 -1
  15. package/dist/components/admin/fields/ImageField.svelte +22 -13
  16. package/dist/components/admin/fields/ImageField.svelte.d.ts.map +1 -1
  17. package/dist/components/admin/fields/ReferenceField.svelte +2 -3
  18. package/dist/components/admin/fields/ReferenceField.svelte.d.ts.map +1 -1
  19. package/dist/components/layout/sidebar/AppSidebar.svelte.d.ts +8 -1
  20. package/dist/components/layout/sidebar/AppSidebar.svelte.d.ts.map +1 -1
  21. package/dist/db/interfaces/asset.d.ts +22 -0
  22. package/dist/db/interfaces/asset.d.ts.map +1 -1
  23. package/dist/db/interfaces/document.d.ts +25 -0
  24. package/dist/db/interfaces/document.d.ts.map +1 -1
  25. package/dist/field-validation/utils.d.ts +19 -1
  26. package/dist/field-validation/utils.d.ts.map +1 -1
  27. package/dist/field-validation/utils.js +33 -0
  28. package/dist/hooks.d.ts +2 -0
  29. package/dist/hooks.d.ts.map +1 -1
  30. package/dist/hooks.js +80 -12
  31. package/dist/lib/auth/provider.js +1 -0
  32. package/dist/lib/db/index.js +4 -0
  33. package/dist/lib/db/interfaces/asset.js +1 -0
  34. package/dist/lib/db/interfaces/document.js +1 -0
  35. package/dist/lib/db/interfaces/index.js +1 -0
  36. package/dist/lib/db/interfaces/organization.js +1 -0
  37. package/dist/lib/db/interfaces/schema.js +1 -0
  38. package/dist/lib/db/interfaces/user.js +1 -0
  39. package/dist/lib/email/index.js +4 -0
  40. package/dist/lib/email/interfaces/email.js +1 -0
  41. package/dist/lib/field-validation/rule.js +221 -0
  42. package/dist/lib/field-validation/utils.js +99 -0
  43. package/dist/lib/storage/interfaces/index.js +2 -0
  44. package/dist/lib/storage/interfaces/storage.js +1 -0
  45. package/dist/lib/types/asset.js +2 -0
  46. package/dist/lib/types/auth.js +41 -0
  47. package/dist/lib/types/config.js +1 -0
  48. package/dist/lib/types/document.js +1 -0
  49. package/dist/lib/types/filters.js +5 -0
  50. package/dist/lib/types/index.js +9 -0
  51. package/dist/lib/types/organization.js +3 -0
  52. package/dist/lib/types/schemas.js +1 -0
  53. package/dist/lib/types/sidebar.js +1 -0
  54. package/dist/lib/types/user.js +1 -0
  55. package/dist/local-api/auth-helpers.d.ts +65 -0
  56. package/dist/local-api/auth-helpers.d.ts.map +1 -0
  57. package/dist/local-api/auth-helpers.js +102 -0
  58. package/dist/local-api/collection-api.d.ts +138 -0
  59. package/dist/local-api/collection-api.d.ts.map +1 -0
  60. package/dist/local-api/collection-api.js +276 -0
  61. package/dist/local-api/index.d.ts +108 -0
  62. package/dist/local-api/index.d.ts.map +1 -0
  63. package/dist/local-api/index.js +157 -0
  64. package/dist/local-api/permissions.d.ts +45 -0
  65. package/dist/local-api/permissions.d.ts.map +1 -0
  66. package/dist/local-api/permissions.js +117 -0
  67. package/dist/local-api/types.d.ts +65 -0
  68. package/dist/local-api/types.d.ts.map +1 -0
  69. package/dist/local-api/types.js +4 -0
  70. package/dist/routes/documents-by-id.d.ts.map +1 -1
  71. package/dist/routes/documents-by-id.js +84 -63
  72. package/dist/routes/documents-publish.d.ts.map +1 -1
  73. package/dist/routes/documents-publish.js +57 -72
  74. package/dist/routes/documents-query.d.ts +24 -0
  75. package/dist/routes/documents-query.d.ts.map +1 -0
  76. package/dist/routes/documents-query.js +95 -0
  77. package/dist/routes/documents.d.ts.map +1 -1
  78. package/dist/routes/documents.js +80 -75
  79. package/dist/routes/index.d.ts +2 -0
  80. package/dist/routes/index.d.ts.map +1 -1
  81. package/dist/routes/index.js +2 -0
  82. package/dist/server/index.d.ts +1 -0
  83. package/dist/server/index.d.ts.map +1 -1
  84. package/dist/server/index.js +2 -0
  85. package/dist/types/config.d.ts +18 -1
  86. package/dist/types/config.d.ts.map +1 -1
  87. package/dist/types/document.d.ts +1 -0
  88. package/dist/types/document.d.ts.map +1 -1
  89. package/dist/types/filters.d.ts +173 -0
  90. package/dist/types/filters.d.ts.map +1 -0
  91. package/dist/types/filters.js +5 -0
  92. package/dist/types/index.d.ts +1 -0
  93. package/dist/types/index.d.ts.map +1 -1
  94. package/dist/types/index.js +1 -0
  95. package/package.json +101 -95
@@ -0,0 +1,24 @@
1
+ import type { RequestHandler } from '@sveltejs/kit';
2
+ /**
3
+ * POST /api/documents/query - Advanced document querying with complex filters
4
+ *
5
+ * Accepts LocalAPI FindOptions in request body for full filtering power
6
+ *
7
+ * @example
8
+ * POST /api/documents/query
9
+ * {
10
+ * "type": "page",
11
+ * "where": {
12
+ * "status": { "equals": "published" },
13
+ * "hero.heading": { "contains": "Welcome" },
14
+ * "publishedAt": { "gte": "2024-01-01" }
15
+ * },
16
+ * "limit": 20,
17
+ * "page": 1,
18
+ * "sort": ["-publishedAt", "title"],
19
+ * "depth": 1,
20
+ * "perspective": "published"
21
+ * }
22
+ */
23
+ export declare const POST: RequestHandler;
24
+ //# sourceMappingURL=documents-query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents-query.d.ts","sourceRoot":"","sources":["../../src/lib/routes/documents-query.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AASpD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,IAAI,EAAE,cAqFlB,CAAC"}
@@ -0,0 +1,95 @@
1
+ // Aphex CMS Document Query API - Complex filtering with POST
2
+ import { json } from '@sveltejs/kit';
3
+ import { authToContext } from '../local-api/auth-helpers.js';
4
+ import { PermissionError } from '../local-api/permissions.js';
5
+ // Default values
6
+ const DEFAULT_PAGE_SIZE = 20;
7
+ const DEFAULT_PAGE = 1;
8
+ /**
9
+ * POST /api/documents/query - Advanced document querying with complex filters
10
+ *
11
+ * Accepts LocalAPI FindOptions in request body for full filtering power
12
+ *
13
+ * @example
14
+ * POST /api/documents/query
15
+ * {
16
+ * "type": "page",
17
+ * "where": {
18
+ * "status": { "equals": "published" },
19
+ * "hero.heading": { "contains": "Welcome" },
20
+ * "publishedAt": { "gte": "2024-01-01" }
21
+ * },
22
+ * "limit": 20,
23
+ * "page": 1,
24
+ * "sort": ["-publishedAt", "title"],
25
+ * "depth": 1,
26
+ * "perspective": "published"
27
+ * }
28
+ */
29
+ export const POST = async ({ request, locals }) => {
30
+ try {
31
+ const { localAPI } = locals.aphexCMS;
32
+ const context = authToContext(locals.auth);
33
+ const body = await request.json();
34
+ // Extract document type
35
+ const documentType = body.type;
36
+ if (!documentType) {
37
+ return json({
38
+ success: false,
39
+ error: 'Bad Request',
40
+ message: 'Document type is required in request body'
41
+ }, { status: 400 });
42
+ }
43
+ // Check if collection exists
44
+ if (!localAPI.hasCollection(documentType)) {
45
+ return json({
46
+ success: false,
47
+ error: 'Invalid document type',
48
+ message: `Collection '${documentType}' not found. Available: ${localAPI.getCollectionNames().join(', ')}`
49
+ }, { status: 400 });
50
+ }
51
+ // Parse pagination - support both page-based and offset-based
52
+ const page = body.page ? Math.max(1, parseInt(body.page)) : DEFAULT_PAGE;
53
+ const pageSize = body.pageSize || body.limit || DEFAULT_PAGE_SIZE;
54
+ const offset = body.offset !== undefined ? body.offset : (page - 1) * pageSize;
55
+ // Build FindOptions from request body
56
+ const findOptions = {
57
+ where: body.where,
58
+ limit: pageSize,
59
+ offset: offset,
60
+ sort: body.sort,
61
+ depth: body.depth !== undefined ? Math.max(0, Math.min(body.depth, 5)) : 0,
62
+ select: body.select,
63
+ perspective: body.perspective || 'draft'
64
+ };
65
+ // Query via LocalAPI
66
+ const result = await localAPI.collections[documentType].find(context, findOptions);
67
+ return json({
68
+ success: true,
69
+ data: result.docs,
70
+ pagination: {
71
+ total: result.totalDocs,
72
+ page: result.page,
73
+ pageSize: result.limit,
74
+ totalPages: result.totalPages,
75
+ hasNextPage: result.hasNextPage,
76
+ hasPrevPage: result.hasPrevPage
77
+ }
78
+ });
79
+ }
80
+ catch (error) {
81
+ console.error('Failed to query documents:', error);
82
+ if (error instanceof PermissionError) {
83
+ return json({
84
+ success: false,
85
+ error: 'Forbidden',
86
+ message: error.message
87
+ }, { status: 403 });
88
+ }
89
+ return json({
90
+ success: false,
91
+ error: 'Failed to query documents',
92
+ message: error instanceof Error ? error.message : 'Unknown error'
93
+ }, { status: 500 });
94
+ }
95
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../src/lib/routes/documents.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAQpD,eAAO,MAAM,GAAG,EAAE,cAsEjB,CAAC;AAGF,eAAO,MAAM,IAAI,EAAE,cAwFlB,CAAC"}
1
+ {"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../src/lib/routes/documents.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AASpD,eAAO,MAAM,GAAG,EAAE,cAiGjB,CAAC;AAGF,eAAO,MAAM,IAAI,EAAE,cAsElB,CAAC"}
@@ -1,63 +1,81 @@
1
1
  // Aphex CMS Document API Handlers
2
2
  import { json } from '@sveltejs/kit';
3
- import { canWrite } from '../types/auth.js';
3
+ import { authToContext } from '../local-api/auth-helpers.js';
4
+ import { PermissionError } from '../local-api/permissions.js';
4
5
  // Default values for API
5
- const DEFAULT_API_LIMIT = 20;
6
- const DEFAULT_API_OFFSET = 0;
7
- // GET /api/documents - List documents with filtering
6
+ const DEFAULT_PAGE_SIZE = 20;
7
+ const DEFAULT_PAGE = 1;
8
+ // GET /api/documents - Simple document listing with basic filters
8
9
  export const GET = async ({ url, locals }) => {
9
10
  try {
10
- const { databaseAdapter } = locals.aphexCMS;
11
- const auth = locals.auth;
12
- if (!auth) {
11
+ const { localAPI } = locals.aphexCMS;
12
+ const context = authToContext(locals.auth);
13
+ // Parse query params
14
+ const docType = url.searchParams.get('type') || url.searchParams.get('docType');
15
+ const status = url.searchParams.get('status');
16
+ const pageParam = url.searchParams.get('page');
17
+ const pageSizeParam = url.searchParams.get('pageSize') || url.searchParams.get('limit');
18
+ const depthParam = url.searchParams.get('depth');
19
+ const sortParam = url.searchParams.get('sort');
20
+ const perspective = url.searchParams.get('perspective') || 'draft';
21
+ // Parse pagination
22
+ const page = pageParam ? Math.max(1, parseInt(pageParam)) : DEFAULT_PAGE;
23
+ const pageSize = pageSizeParam ? parseInt(pageSizeParam) : DEFAULT_PAGE_SIZE;
24
+ const offset = (page - 1) * pageSize;
25
+ // Parse depth (clamp between 0-5)
26
+ const depth = depthParam ? Math.max(0, Math.min(parseInt(depthParam), 5)) : 0;
27
+ if (!docType) {
13
28
  return json({
14
29
  success: false,
15
- error: 'Unauthorized',
16
- message: 'Authentication required'
17
- }, { status: 401 });
30
+ error: 'Bad Request',
31
+ message: 'Document type is required. Use ?type=page or ?docType=page'
32
+ }, { status: 400 });
18
33
  }
19
- const docType = url.searchParams.get('docType');
20
- const status = url.searchParams.get('status') || undefined;
21
- const limitParam = url.searchParams.get('limit');
22
- const offsetParam = url.searchParams.get('offset');
23
- const depthParam = url.searchParams.get('depth');
24
- const organizationIdsParam = url.searchParams.get('organizationIds'); // Comma-separated list
25
- // Parse with defaults
26
- const limit = limitParam ? parseInt(limitParam) : DEFAULT_API_LIMIT;
27
- const offset = offsetParam ? parseInt(offsetParam) : DEFAULT_API_OFFSET;
28
- const depth = depthParam ? parseInt(depthParam) : 0;
29
- // Parse organizationIds if provided
30
- const filterOrganizationIds = organizationIdsParam
31
- ? organizationIdsParam
32
- .split(',')
33
- .map((id) => id.trim())
34
- .filter(Boolean)
35
- : undefined;
36
- const filters = {
37
- ...(docType && { type: docType }),
38
- ...(status && { status }),
39
- ...(filterOrganizationIds && { filterOrganizationIds }),
40
- limit: isNaN(limit) ? DEFAULT_API_LIMIT : limit,
41
- offset: isNaN(offset) ? DEFAULT_API_OFFSET : offset,
42
- depth: isNaN(depth) ? 0 : Math.max(0, Math.min(depth, 5)) // Clamp between 0-5 for safety
43
- };
44
- const documents = await databaseAdapter.findManyDoc(auth.organizationId, filters);
34
+ // Get collection API (TypeScript-safe)
35
+ const collection = localAPI.collections[docType];
36
+ if (!collection) {
37
+ return json({
38
+ success: false,
39
+ error: 'Invalid document type',
40
+ message: `Collection '${docType}' not found. Available: ${localAPI.getCollectionNames().join(', ')}`
41
+ }, { status: 400 });
42
+ }
43
+ // Build where clause from query params
44
+ const where = {};
45
+ if (status) {
46
+ where.status = { equals: status };
47
+ }
48
+ // Query via LocalAPI
49
+ const result = await collection.find(context, {
50
+ where: Object.keys(where).length > 0 ? where : undefined,
51
+ limit: pageSize,
52
+ offset: offset,
53
+ depth: depth,
54
+ sort: sortParam || undefined,
55
+ perspective
56
+ });
45
57
  return json({
46
58
  success: true,
47
- data: documents,
48
- meta: {
49
- count: documents.length,
50
- limit: filters.limit,
51
- offset: filters.offset,
52
- filters: {
53
- docType,
54
- status
55
- }
59
+ data: result.docs,
60
+ pagination: {
61
+ total: result.totalDocs,
62
+ page: result.page,
63
+ pageSize: result.limit,
64
+ totalPages: result.totalPages,
65
+ hasNextPage: result.hasNextPage,
66
+ hasPrevPage: result.hasPrevPage
56
67
  }
57
68
  });
58
69
  }
59
70
  catch (error) {
60
71
  console.error('Failed to fetch documents:', error);
72
+ if (error instanceof PermissionError) {
73
+ return json({
74
+ success: false,
75
+ error: 'Forbidden',
76
+ message: error.message
77
+ }, { status: 403 });
78
+ }
61
79
  return json({
62
80
  success: false,
63
81
  error: 'Failed to fetch documents',
@@ -68,27 +86,13 @@ export const GET = async ({ url, locals }) => {
68
86
  // POST /api/documents - Create new document
69
87
  export const POST = async ({ request, locals }) => {
70
88
  try {
71
- const { databaseAdapter } = locals.aphexCMS;
72
- const auth = locals.auth;
73
- if (!auth) {
74
- return json({
75
- success: false,
76
- error: 'Unauthorized',
77
- message: 'Authentication required'
78
- }, { status: 401 });
79
- }
80
- // Check write permissions (viewers are read-only)
81
- if (!canWrite(auth)) {
82
- return json({
83
- success: false,
84
- error: 'Forbidden',
85
- message: 'You do not have permission to create documents. Viewers have read-only access.'
86
- }, { status: 403 });
87
- }
89
+ const { localAPI } = locals.aphexCMS;
90
+ const context = authToContext(locals.auth);
88
91
  const body = await request.json();
89
92
  // Validate required fields (support both old and new format)
90
93
  const documentType = body.type;
91
94
  const documentData = body.draftData || body.data;
95
+ const shouldPublish = body.publish || false;
92
96
  if (!documentType || !documentData) {
93
97
  return json({
94
98
  success: false,
@@ -96,24 +100,18 @@ export const POST = async ({ request, locals }) => {
96
100
  message: 'Document type and data are required'
97
101
  }, { status: 400 });
98
102
  }
99
- // Validate document type exists
100
- const { cmsEngine } = locals.aphexCMS;
101
- const schema = cmsEngine.getSchemaTypeByName(documentType);
102
- if (!schema) {
103
+ // Get collection API (TypeScript-safe)
104
+ const collection = localAPI.collections[documentType];
105
+ if (!collection) {
103
106
  return json({
104
107
  success: false,
105
108
  error: 'Invalid document type',
106
- message: `Schema type '${documentType}' not found`
109
+ message: `Collection '${documentType}' not found. Available: ${localAPI.getCollectionNames().join(', ')}`
107
110
  }, { status: 400 });
108
111
  }
109
- // NO VALIDATION FOR DRAFTS - Sanity-style: drafts can have any state
110
- // Validation only happens on publish
111
- // Create document (always starts as draft)
112
- const newDocument = await databaseAdapter.createDocument({
113
- type: documentType,
114
- draftData: documentData,
115
- organizationId: auth.organizationId,
116
- createdBy: auth.type === 'session' ? auth.user.id : undefined
112
+ // Create via LocalAPI (permission checks happen inside)
113
+ const newDocument = await collection.create(context, documentData, {
114
+ publish: shouldPublish
117
115
  });
118
116
  return json({
119
117
  success: true,
@@ -122,6 +120,13 @@ export const POST = async ({ request, locals }) => {
122
120
  }
123
121
  catch (error) {
124
122
  console.error('Failed to create document:', error);
123
+ if (error instanceof PermissionError) {
124
+ return json({
125
+ success: false,
126
+ error: 'Forbidden',
127
+ message: error.message
128
+ }, { status: 403 });
129
+ }
125
130
  return json({
126
131
  success: false,
127
132
  error: 'Failed to create document',
@@ -1,5 +1,7 @@
1
1
  export * as documents from './documents.js';
2
2
  export * as documentsById from './documents-by-id.js';
3
+ export * as documentsQuery from './documents-query.js';
4
+ export * as documentsPublish from './documents-publish.js';
3
5
  export * as assets from './assets.js';
4
6
  export * as schemas from './schemas.js';
5
7
  export * as schemasByType from './schemas-by-type.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/routes/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,aAAa,MAAM,mBAAmB,CAAC;AAGnD,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AAGnC,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,aAAa,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/routes/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,aAAa,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,cAAc,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,gBAAgB,MAAM,qBAAqB,CAAC;AAGxD,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AAGnC,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,aAAa,MAAM,mBAAmB,CAAC"}
@@ -3,6 +3,8 @@
3
3
  // Document management routes
4
4
  export * as documents from './documents.js';
5
5
  export * as documentsById from './documents-by-id.js';
6
+ export * as documentsQuery from './documents-query.js';
7
+ export * as documentsPublish from './documents-publish.js';
6
8
  // Asset management routes
7
9
  export * as assets from './assets.js';
8
10
  // Schema information routes
@@ -13,4 +13,5 @@ export { AssetService } from '../services/asset-service.js';
13
13
  export * from '../routes-exports.js';
14
14
  export * from '../schema-utils/index.js';
15
15
  export { createHashForPublishing } from '../utils/content-hash.js';
16
+ export { LocalAPI, createLocalAPI, getLocalAPI, CollectionAPI, PermissionChecker, PermissionError, type Collections, type LocalAPIContext, type CreateOptions, type UpdateOptions } from '../local-api/index.js';
16
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/server/index.ts"],"names":[],"mappings":"AAIA,cAAc,gBAAgB,CAAC;AAE/B,cAAc,kBAAkB,CAAC;AAEjC,cAAc,gBAAgB,CAAC;AAG/B,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAG5C,OAAO,EAAE,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAG5D,cAAc,wBAAwB,CAAC;AAGvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAG7C,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAIzD,cAAc,mBAAmB,CAAC;AAGlC,cAAc,uBAAuB,CAAC;AAGtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/server/index.ts"],"names":[],"mappings":"AAIA,cAAc,gBAAgB,CAAC;AAE/B,cAAc,kBAAkB,CAAC;AAEjC,cAAc,gBAAgB,CAAC;AAG/B,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAG5C,OAAO,EAAE,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAG5D,cAAc,wBAAwB,CAAC;AAGvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAG7C,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAIzD,cAAc,mBAAmB,CAAC;AAGlC,cAAc,uBAAuB,CAAC;AAGtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAGhE,OAAO,EACN,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,MAAM,oBAAoB,CAAC"}
@@ -26,3 +26,5 @@ export * from '../routes-exports.js';
26
26
  export * from '../schema-utils/index.js';
27
27
  // Content hash utilities (server-side)
28
28
  export { createHashForPublishing } from '../utils/content-hash.js';
29
+ // Local API (unified operations layer)
30
+ export { LocalAPI, createLocalAPI, getLocalAPI, CollectionAPI, PermissionChecker, PermissionError } from '../local-api/index.js';
@@ -14,6 +14,23 @@ export interface CMSPlugin {
14
14
  [key: string]: any;
15
15
  };
16
16
  }
17
+ /**
18
+ * Plugin reference with options
19
+ * Example: { name: '@aphexcms/graphql-plugin', options: { endpoint: '/api/graphql' } }
20
+ */
21
+ export interface CMSPluginReference {
22
+ name: string;
23
+ options?: {
24
+ [key: string]: any;
25
+ };
26
+ }
27
+ /**
28
+ * Plugin configuration - supports three formats:
29
+ * 1. String reference: '@aphexcms/graphql-plugin' (loaded at runtime)
30
+ * 2. Plugin reference with options: { name: '@aphexcms/graphql-plugin', options: {...} }
31
+ * 3. Instantiated plugin: createGraphQLPlugin({...}) (traditional, but causes large bundles)
32
+ */
33
+ export type CMSPluginConfig = string | CMSPluginReference | CMSPlugin;
17
34
  export interface CMSConfig {
18
35
  schemaTypes: SchemaType[];
19
36
  database: DatabaseAdapter;
@@ -30,7 +47,7 @@ export interface CMSConfig {
30
47
  fonts?: Record<string, string>;
31
48
  };
32
49
  };
33
- plugins?: CMSPlugin[];
50
+ plugins?: CMSPluginConfig[];
34
51
  auth?: {
35
52
  provider: AuthProvider;
36
53
  loginUrl?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/types/config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAA;KAAE,CAAC;IAC1E,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;CAChC;AAED,MAAM,WAAW,SAAS;IACzB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,QAAQ,EAAE,eAAe,CAAC;IAC1B,OAAO,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IAChC,KAAK,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B,aAAa,CAAC,EAAE;QACf,QAAQ,CAAC,EAAE;YACV,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,OAAO,CAAC,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,KAAK,CAAC,EAAE;YACP,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAChC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;SAC/B,CAAC;KACF,CAAC;IACF,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE;QACN,QAAQ,EAAE,YAAY,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,QAAQ,CAAC,EAAE;QACV;;;;WAIG;QACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC5B,CAAC;CACF"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/types/config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAA;KAAE,CAAC;IAC1E,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;CAChC;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;CACjC;AAED;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAAC;AAEtE,MAAM,WAAW,SAAS;IACzB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,QAAQ,EAAE,eAAe,CAAC;IAC1B,OAAO,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IAChC,KAAK,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B,aAAa,CAAC,EAAE;QACf,QAAQ,CAAC,EAAE;YACV,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,OAAO,CAAC,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,KAAK,CAAC,EAAE;YACP,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAChC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;SAC/B,CAAC;KACF,CAAC;IACF,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,IAAI,CAAC,EAAE;QACN,QAAQ,EAAE,YAAY,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,QAAQ,CAAC,EAAE;QACV;;;;WAIG;QACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC5B,CAAC;CACF"}
@@ -4,6 +4,7 @@ import { AuthUser } from '../types/user.js';
4
4
  */
5
5
  export interface Document {
6
6
  id: string;
7
+ organizationId: string;
7
8
  type: string;
8
9
  status: 'draft' | 'published' | null;
9
10
  draftData: any;
@@ -1 +1 @@
1
- {"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../src/lib/types/document.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC;;GAEG;AACH,MAAM,WAAW,QAAQ;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAAC;IACrC,SAAS,EAAE,GAAG,CAAC;IACf,aAAa,EAAE,GAAG,CAAC;IACnB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC;IACpC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAAC;IACtC,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACxB"}
1
+ {"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../src/lib/types/document.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC;;GAEG;AACH,MAAM,WAAW,QAAQ;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAAC;IACrC,SAAS,EAAE,GAAG,CAAC;IACf,aAAa,EAAE,GAAG,CAAC;IACnB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC;IACpC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAAC;IACtC,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACxB"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Valid filter value types
3
+ */
4
+ export type FilterValue = string | number | boolean | Date | null;
5
+ /**
6
+ * Field filter operators with type-safe constraints
7
+ * Each adapter will parse these into their specific query language
8
+ */
9
+ export interface FieldFilter<T = unknown> {
10
+ equals?: T;
11
+ not_equals?: T;
12
+ in?: T[];
13
+ not_in?: T[];
14
+ exists?: boolean;
15
+ greater_than?: T extends number | Date ? T : number | Date;
16
+ greater_than_equal?: T extends number | Date ? T : number | Date;
17
+ less_than?: T extends number | Date ? T : number | Date;
18
+ less_than_equal?: T extends number | Date ? T : number | Date;
19
+ like?: T extends string ? string : string;
20
+ contains?: T extends string ? string : string;
21
+ starts_with?: T extends string ? string : string;
22
+ ends_with?: T extends string ? string : string;
23
+ }
24
+ /**
25
+ * WHERE clause for filtering (database-agnostic)
26
+ * Each adapter will parse this into their specific query language
27
+ *
28
+ * Examples:
29
+ * ```typescript
30
+ * // Simple field filters
31
+ * { title: { contains: 'blog' } }
32
+ * { status: { equals: 'published' } }
33
+ *
34
+ * // Multiple conditions (implicit AND)
35
+ * {
36
+ * status: { equals: 'published' },
37
+ * publishedAt: { greater_than: new Date('2024-01-01') }
38
+ * }
39
+ *
40
+ * // Nested OR logic
41
+ * {
42
+ * status: { equals: 'published' },
43
+ * or: [
44
+ * { 'author.name': { equals: 'John' } },
45
+ * { 'author.name': { equals: 'Jane' } }
46
+ * ]
47
+ * }
48
+ *
49
+ * // Nested AND logic
50
+ * {
51
+ * and: [
52
+ * { 'seo.title': { contains: 'blog' } },
53
+ * { content: { exists: true } }
54
+ * ]
55
+ * }
56
+ * ```
57
+ */
58
+ export interface Where<T = unknown> {
59
+ and?: Where<T>[];
60
+ or?: Where<T>[];
61
+ [field: string]: FieldFilter<unknown> | FilterValue | FieldFilter<unknown>[] | Where<T>[] | undefined;
62
+ }
63
+ /**
64
+ * Helper type to flatten object into dot-notation paths
65
+ * Limits depth to 3 levels to avoid infinite recursion and improve performance
66
+ */
67
+ type DotNotation<T, D extends number = 3> = D extends 0 ? never : T extends object ? {
68
+ [K in keyof T & string]: K | (T[K] extends object ? T[K] extends Array<any> ? never : `${K}.${DotNotation<T[K], Prev[D]>}` : never);
69
+ }[keyof T & string] : never;
70
+ type Prev = [never, 0, 1, 2, 3];
71
+ /**
72
+ * Helper type to extract the value type at a given path
73
+ * Handles both direct keys and dot-notation paths
74
+ */
75
+ type PathValue<T, P> = P extends `${infer K}.${infer Rest}` ? K extends keyof T ? PathValue<T[K], Rest> : unknown : P extends keyof T ? T[P] : unknown;
76
+ /**
77
+ * Type-safe WHERE clause with autocomplete for field names
78
+ * Provides autocomplete for known fields while still allowing dynamic field names
79
+ */
80
+ export type WhereTyped<T> = {
81
+ and?: WhereTyped<T>[];
82
+ or?: WhereTyped<T>[];
83
+ } & {
84
+ [K in DotNotation<T> | (keyof T & string)]?: FieldFilter<PathValue<T, K>> | FilterValue;
85
+ } & {
86
+ [field: string]: FieldFilter<unknown> | FilterValue | WhereTyped<T>[] | undefined;
87
+ };
88
+ /**
89
+ * Options for find operations (database-agnostic)
90
+ */
91
+ export interface FindOptions<T = unknown> {
92
+ /**
93
+ * Filter conditions
94
+ * When T is provided, you get autocomplete on field names!
95
+ */
96
+ where?: WhereTyped<T>;
97
+ /**
98
+ * Maximum number of results to return
99
+ * @default 50
100
+ */
101
+ limit?: number;
102
+ /**
103
+ * Number of results to skip (for pagination)
104
+ * @default 0
105
+ */
106
+ offset?: number;
107
+ /**
108
+ * Sort order
109
+ * - Single field: 'title' (ascending) or '-publishedAt' (descending)
110
+ * - Multiple fields: ['title', '-publishedAt']
111
+ */
112
+ sort?: string | string[];
113
+ /**
114
+ * Reference resolution depth
115
+ * - 0: No reference resolution
116
+ * - 1: Resolve first-level references
117
+ * - 2: Resolve second-level references
118
+ * @default 0
119
+ */
120
+ depth?: number;
121
+ /**
122
+ * Field selection (projection)
123
+ * - Only return specified fields
124
+ * - Example: ['id', 'title', 'slug']
125
+ */
126
+ select?: string[];
127
+ /**
128
+ * Perspective to query
129
+ * - 'draft': Query draft data
130
+ * - 'published': Query published data
131
+ * @default 'draft'
132
+ */
133
+ perspective?: 'draft' | 'published';
134
+ }
135
+ /**
136
+ * Result from find operations with pagination metadata
137
+ */
138
+ export interface FindResult<T> {
139
+ /**
140
+ * Array of documents matching the query
141
+ */
142
+ docs: T[];
143
+ /**
144
+ * Total number of documents matching the query (without limit/offset)
145
+ */
146
+ totalDocs: number;
147
+ /**
148
+ * Maximum number of results returned per page
149
+ */
150
+ limit: number;
151
+ /**
152
+ * Number of results skipped
153
+ */
154
+ offset: number;
155
+ /**
156
+ * Current page number (1-indexed)
157
+ */
158
+ page: number;
159
+ /**
160
+ * Total number of pages
161
+ */
162
+ totalPages: number;
163
+ /**
164
+ * Whether there is a next page
165
+ */
166
+ hasNextPage: boolean;
167
+ /**
168
+ * Whether there is a previous page
169
+ */
170
+ hasPrevPage: boolean;
171
+ }
172
+ export {};
173
+ //# sourceMappingURL=filters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../src/lib/types/filters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ // types/filters.ts
2
+ //
3
+ // Database-agnostic filter types for the unified Local API
4
+ // These interfaces define the contract that all database adapters must implement
5
+ export {};
@@ -6,4 +6,5 @@ export * from './config.js';
6
6
  export * from './user.js';
7
7
  export * from './sidebar.js';
8
8
  export * from './organization.js';
9
+ export * from './filters.js';
9
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC"}
@@ -6,3 +6,4 @@ export * from './config.js';
6
6
  export * from './user.js';
7
7
  export * from './sidebar.js';
8
8
  export * from './organization.js';
9
+ export * from './filters.js';