@airdraft/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 (42) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/adapters/GitHubAdapter.d.ts +69 -0
  3. package/dist/adapters/GitHubAdapter.d.ts.map +1 -0
  4. package/dist/adapters/GitHubAdapter.js +278 -0
  5. package/dist/adapters/GitHubAdapter.js.map +1 -0
  6. package/dist/adapters/LocalAdapter.d.ts +21 -0
  7. package/dist/adapters/LocalAdapter.d.ts.map +1 -0
  8. package/dist/adapters/LocalAdapter.js +109 -0
  9. package/dist/adapters/LocalAdapter.js.map +1 -0
  10. package/dist/config.d.ts +21 -0
  11. package/dist/config.d.ts.map +1 -0
  12. package/dist/config.js +34 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/engine.d.ts +26 -0
  15. package/dist/engine.d.ts.map +1 -0
  16. package/dist/engine.js +379 -0
  17. package/dist/engine.js.map +1 -0
  18. package/dist/errors.d.ts +45 -0
  19. package/dist/errors.d.ts.map +1 -0
  20. package/dist/errors.js +80 -0
  21. package/dist/errors.js.map +1 -0
  22. package/dist/fields.d.ts +23 -0
  23. package/dist/fields.d.ts.map +1 -0
  24. package/dist/fields.js +181 -0
  25. package/dist/fields.js.map +1 -0
  26. package/dist/index.d.ts +10 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +11 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/publish.d.ts +20 -0
  31. package/dist/publish.d.ts.map +1 -0
  32. package/dist/publish.js +25 -0
  33. package/dist/publish.js.map +1 -0
  34. package/dist/slug.d.ts +21 -0
  35. package/dist/slug.d.ts.map +1 -0
  36. package/dist/slug.js +39 -0
  37. package/dist/slug.js.map +1 -0
  38. package/dist/types.d.ts +326 -0
  39. package/dist/types.d.ts.map +1 -0
  40. package/dist/types.js +3 -0
  41. package/dist/types.js.map +1 -0
  42. package/package.json +41 -0
package/dist/engine.js ADDED
@@ -0,0 +1,379 @@
1
+ import { CollectionNotFoundError, EntryNotFoundError, SlugConflictError, ValidationError, ConflictError, } from './errors.js';
2
+ import { validateFields } from './fields.js';
3
+ import { deriveSlug, validateSlug } from './slug.js';
4
+ import { isLive, initialPublishFields } from './publish.js';
5
+ // ---------------------------------------------------------------------------
6
+ // Internal serialization helpers
7
+ // ---------------------------------------------------------------------------
8
+ function buildFilePath(pathTemplate, slug) {
9
+ return pathTemplate.replace('{slug}', slug);
10
+ }
11
+ function buildCommitMessage(action, collection, slug) {
12
+ return `cms: ${action} ${collection}/${slug}`;
13
+ }
14
+ function serializeMdx(data) {
15
+ const { body, ...frontmatter } = data;
16
+ const fm = serializeYaml(frontmatter);
17
+ const bodyStr = typeof body === 'string' ? body : '';
18
+ return `---\n${fm}\n---\n\n${bodyStr}`;
19
+ }
20
+ function deserializeMdx(raw) {
21
+ const fmMatch = raw.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);
22
+ if (!fmMatch)
23
+ return { body: raw };
24
+ const fmRaw = fmMatch[1];
25
+ const bodyStr = fmMatch[2].trim();
26
+ // Try JSON first for backward compat with files written before this fix,
27
+ // then fall back to YAML (the canonical format going forward).
28
+ let frontmatter;
29
+ try {
30
+ frontmatter = JSON.parse(fmRaw);
31
+ }
32
+ catch {
33
+ frontmatter = deserializeYaml(fmRaw);
34
+ }
35
+ frontmatter['body'] = bodyStr;
36
+ return frontmatter;
37
+ }
38
+ function serializeJson(data) {
39
+ return JSON.stringify(data, null, 2);
40
+ }
41
+ function deserializeJson(raw) {
42
+ return JSON.parse(raw);
43
+ }
44
+ function serializeYaml(data) {
45
+ // Minimal YAML serialization. Plain scalars are written unquoted;
46
+ // strings containing YAML-special chars are double-quoted.
47
+ const SAFE_STRING = /^[^:#{}&*,\[\]|>'"%@`\s].*$/;
48
+ function yamlValue(v) {
49
+ if (v === null || v === undefined)
50
+ return 'null';
51
+ if (typeof v === 'boolean' || typeof v === 'number')
52
+ return String(v);
53
+ if (typeof v === 'string')
54
+ return SAFE_STRING.test(v) ? v : JSON.stringify(v);
55
+ return JSON.stringify(v);
56
+ }
57
+ return Object.entries(data)
58
+ .map(([k, v]) => `${k}: ${yamlValue(v)}`)
59
+ .join('\n');
60
+ }
61
+ function deserializeYaml(raw) {
62
+ // Minimal YAML deserialization — for production a yaml library will replace this
63
+ const result = {};
64
+ for (const line of raw.split('\n')) {
65
+ const idx = line.indexOf(':');
66
+ if (idx === -1)
67
+ continue;
68
+ const key = line.slice(0, idx).trim();
69
+ const value = line.slice(idx + 1).trim();
70
+ try {
71
+ result[key] = JSON.parse(value);
72
+ }
73
+ catch {
74
+ result[key] = value;
75
+ }
76
+ }
77
+ return result;
78
+ }
79
+ function serialize(format, data) {
80
+ if (format === 'mdx')
81
+ return serializeMdx(data);
82
+ if (format === 'json')
83
+ return serializeJson(data);
84
+ return serializeYaml(data);
85
+ }
86
+ function deserialize(format, raw) {
87
+ if (format === 'mdx')
88
+ return deserializeMdx(raw);
89
+ if (format === 'json')
90
+ return deserializeJson(raw);
91
+ return deserializeYaml(raw);
92
+ }
93
+ // ---------------------------------------------------------------------------
94
+ // CmsEngine
95
+ // ---------------------------------------------------------------------------
96
+ /**
97
+ * The core runtime class. Instantiated by framework adapters.
98
+ * Not part of the public API surface — do not use directly in application code.
99
+ */
100
+ export class CmsEngine {
101
+ config;
102
+ /** Collections after all plugin.schema() transforms have been applied. */
103
+ resolvedCollections;
104
+ constructor(config) {
105
+ this.config = config;
106
+ let schema = { collections: config.collections };
107
+ for (const plugin of config.plugins) {
108
+ if (plugin.schema)
109
+ schema = plugin.schema(schema);
110
+ }
111
+ this.resolvedCollections = schema.collections;
112
+ }
113
+ // -------------------------------------------------------------------------
114
+ // Introspection
115
+ // -------------------------------------------------------------------------
116
+ getSchema() {
117
+ return { collections: this.resolvedCollections };
118
+ }
119
+ getCollection(name) {
120
+ return this.resolvedCollections[name] ?? null;
121
+ }
122
+ requireCollection(name) {
123
+ const col = this.getCollection(name);
124
+ if (!col)
125
+ throw new CollectionNotFoundError(name);
126
+ return col;
127
+ }
128
+ // -------------------------------------------------------------------------
129
+ // listEntries
130
+ // -------------------------------------------------------------------------
131
+ async listEntries(collection, options = {}) {
132
+ const col = this.requireCollection(collection);
133
+ await this.runReadHooks({ collection, adapter: this.config.adapter });
134
+ const pattern = col.path.replace('{slug}', '*');
135
+ const files = await this.config.adapter.list(pattern);
136
+ const entries = [];
137
+ for (const file of files) {
138
+ const fileResult = await this.config.adapter.read(file.path);
139
+ if (!fileResult)
140
+ continue;
141
+ const data = deserialize(col.format, fileResult.content);
142
+ const slug = this.extractSlugFromPath(col.path, file.path);
143
+ const entry = this.buildEntry(slug, fileResult.sha, data, col);
144
+ entries.push(entry);
145
+ }
146
+ // Status filter (only for publish-enabled collections)
147
+ const { status = 'all' } = options;
148
+ const filtered = col.publish && status !== 'all'
149
+ ? entries.filter((e) => {
150
+ const live = isLive(Boolean(e.published), e.publishedAt);
151
+ return status === 'published' ? live : !live;
152
+ })
153
+ : entries;
154
+ // Sort
155
+ const sortBy = options.sort ?? col.defaultSort;
156
+ if (sortBy) {
157
+ filtered.sort((a, b) => {
158
+ const av = a.data[sortBy.field] ?? '';
159
+ const bv = b.data[sortBy.field] ?? '';
160
+ const cmp = String(av).localeCompare(String(bv));
161
+ return sortBy.order === 'desc' ? -cmp : cmp;
162
+ });
163
+ }
164
+ // Field equality filter
165
+ const field_filter = options.filter;
166
+ const result = field_filter
167
+ ? filtered.filter((e) => Object.entries(field_filter).every(([k, v]) => {
168
+ const fieldType = col.fields[k]?.type;
169
+ if (fieldType === 'relations') {
170
+ return Array.isArray(e.data[k]) && e.data[k].includes(v);
171
+ }
172
+ return e.data[k] === v;
173
+ }))
174
+ : filtered;
175
+ // Pagination
176
+ const { offset = 0, limit } = options;
177
+ const paginated = result.slice(offset, limit !== undefined ? offset + limit : undefined);
178
+ // Expand relation fields
179
+ if (options.expand && options.expand.length > 0) {
180
+ return Promise.all(paginated.map((e) => this.expandEntry(e, col, options.expand)));
181
+ }
182
+ return paginated;
183
+ }
184
+ // -------------------------------------------------------------------------
185
+ // getEntry
186
+ // -------------------------------------------------------------------------
187
+ async getEntry(collection, slug, options = {}) {
188
+ const col = this.requireCollection(collection);
189
+ await this.runReadHooks({ collection, slug, adapter: this.config.adapter });
190
+ const path = buildFilePath(col.path, slug);
191
+ const fileResult = await this.config.adapter.read(path);
192
+ if (!fileResult)
193
+ return null;
194
+ const data = deserialize(col.format, fileResult.content);
195
+ let entry = this.buildEntry(slug, fileResult.sha, data, col);
196
+ if (options.expand && options.expand.length > 0) {
197
+ entry = await this.expandEntry(entry, col, options.expand);
198
+ }
199
+ return entry;
200
+ }
201
+ // -------------------------------------------------------------------------
202
+ // createEntry
203
+ // -------------------------------------------------------------------------
204
+ async createEntry(collection, slugOrUndefined, data) {
205
+ const col = this.requireCollection(collection);
206
+ // Resolve slug
207
+ let slug;
208
+ if (slugOrUndefined) {
209
+ slug = validateSlug(slugOrUndefined);
210
+ }
211
+ else {
212
+ let derived;
213
+ try {
214
+ derived = deriveSlug(data, col.slugSource ?? 'title');
215
+ }
216
+ catch {
217
+ const field = col.slugSource ?? 'title';
218
+ throw new ValidationError([{ field, message: `Field "${field}" must be a non-empty string to auto-generate a slug.` }]);
219
+ }
220
+ slug = validateSlug(derived);
221
+ }
222
+ // Check for conflict
223
+ const existing = await this.config.adapter.read(buildFilePath(col.path, slug));
224
+ if (existing)
225
+ throw new SlugConflictError(collection, slug);
226
+ // Validate fields
227
+ const fieldErrors = validateFields(data, col.fields);
228
+ if (fieldErrors.length > 0)
229
+ throw new ValidationError(fieldErrors);
230
+ // Inject publish fields
231
+ const writeData = col.publish
232
+ ? { ...data, ...initialPublishFields() }
233
+ : { ...data };
234
+ // Write hooks
235
+ await this.runWriteHooks({ collection, slug, data: writeData, adapter: this.config.adapter });
236
+ const content = serialize(col.format, writeData);
237
+ await this.config.adapter.write(buildFilePath(col.path, slug), content, { message: buildCommitMessage('create', collection, slug) });
238
+ // Read back to get actual sha
239
+ const written = await this.config.adapter.read(buildFilePath(col.path, slug));
240
+ if (!written)
241
+ throw new Error('Failed to read back entry after create');
242
+ return this.buildEntry(slug, written.sha, writeData, col);
243
+ }
244
+ // -------------------------------------------------------------------------
245
+ // updateEntry
246
+ // -------------------------------------------------------------------------
247
+ async updateEntry(collection, slug, data) {
248
+ const col = this.requireCollection(collection);
249
+ validateSlug(slug);
250
+ // sha must be provided for optimistic concurrency
251
+ const sha = data['meta.sha'];
252
+ if (!sha) {
253
+ throw new ConflictError('meta.sha is required for update operations');
254
+ }
255
+ const { 'meta.sha': _sha, ...payload } = data;
256
+ // Validate fields
257
+ const fieldErrors = validateFields(payload, col.fields);
258
+ if (fieldErrors.length > 0)
259
+ throw new ValidationError(fieldErrors);
260
+ // Check entry exists
261
+ const existing = await this.config.adapter.read(buildFilePath(col.path, slug));
262
+ if (!existing)
263
+ throw new EntryNotFoundError(collection, slug);
264
+ // Preserve publish fields if present
265
+ const existingData = deserialize(col.format, existing.content);
266
+ const writeData = col.publish
267
+ ? {
268
+ ...payload,
269
+ published: payload['published'] ?? existingData['published'],
270
+ publishedAt: payload['publishedAt'] ?? existingData['publishedAt'],
271
+ }
272
+ : { ...payload };
273
+ // Write hooks
274
+ await this.runWriteHooks({ collection, slug, data: writeData, adapter: this.config.adapter });
275
+ const content = serialize(col.format, writeData);
276
+ await this.config.adapter.write(buildFilePath(col.path, slug), content, { message: buildCommitMessage('update', collection, slug), sha });
277
+ const written = await this.config.adapter.read(buildFilePath(col.path, slug));
278
+ if (!written)
279
+ throw new Error('Failed to read back entry after update');
280
+ return this.buildEntry(slug, written.sha, writeData, col);
281
+ }
282
+ // -------------------------------------------------------------------------
283
+ // deleteEntry
284
+ // -------------------------------------------------------------------------
285
+ async deleteEntry(collection, slug, sha) {
286
+ const col = this.requireCollection(collection);
287
+ validateSlug(slug);
288
+ const existing = await this.config.adapter.read(buildFilePath(col.path, slug));
289
+ if (!existing)
290
+ throw new EntryNotFoundError(collection, slug);
291
+ await this.runDeleteHooks({ collection, slug, sha, adapter: this.config.adapter });
292
+ await this.config.adapter.delete(buildFilePath(col.path, slug), { message: buildCommitMessage('delete', collection, slug), sha });
293
+ }
294
+ // -------------------------------------------------------------------------
295
+ // Internal helpers
296
+ // -------------------------------------------------------------------------
297
+ buildEntry(slug, sha, data, col) {
298
+ const entry = {
299
+ slug,
300
+ meta: { sha },
301
+ data: {},
302
+ };
303
+ // Separate publish system fields from regular data
304
+ for (const [k, v] of Object.entries(data)) {
305
+ if (col.publish && k === 'published') {
306
+ entry.published = v;
307
+ }
308
+ else if (col.publish && k === 'publishedAt') {
309
+ entry.publishedAt = v;
310
+ }
311
+ else {
312
+ entry.data[k] = v;
313
+ }
314
+ }
315
+ return entry;
316
+ }
317
+ extractSlugFromPath(template, filePath) {
318
+ const prefix = template.split('{slug}')[0];
319
+ const suffix = template.split('{slug}')[1] ?? '';
320
+ let slug = filePath;
321
+ if (prefix)
322
+ slug = slug.replace(prefix, '');
323
+ if (suffix)
324
+ slug = slug.replace(suffix, '');
325
+ return slug;
326
+ }
327
+ async runReadHooks(ctx) {
328
+ for (const plugin of this.config.plugins) {
329
+ await plugin.hooks?.beforeRead?.(ctx);
330
+ }
331
+ }
332
+ async runWriteHooks(ctx) {
333
+ let index = 0;
334
+ const plugins = this.config.plugins;
335
+ const next = async () => {
336
+ const plugin = plugins[index++];
337
+ if (plugin)
338
+ await plugin.hooks?.beforeWrite?.({ ...ctx, next });
339
+ };
340
+ await next();
341
+ }
342
+ async runDeleteHooks(ctx) {
343
+ let index = 0;
344
+ const plugins = this.config.plugins;
345
+ const next = async () => {
346
+ const plugin = plugins[index++];
347
+ if (plugin)
348
+ await plugin.hooks?.beforeDelete?.({ ...ctx, next });
349
+ };
350
+ await next();
351
+ }
352
+ // -------------------------------------------------------------------------
353
+ // expandEntry — resolves relation/relations fields to full entry objects
354
+ // -------------------------------------------------------------------------
355
+ async expandEntry(entry, col, expand) {
356
+ const data = { ...entry.data };
357
+ for (const fieldName of expand) {
358
+ const fieldConfig = col.fields[fieldName];
359
+ if (!fieldConfig)
360
+ continue;
361
+ if (fieldConfig.type === 'relation' && fieldConfig.collection) {
362
+ const slug = data[fieldName];
363
+ if (slug) {
364
+ const related = await this.getEntry(fieldConfig.collection, slug);
365
+ data[fieldName] = related ? { slug: related.slug, ...related.data } : slug;
366
+ }
367
+ }
368
+ else if (fieldConfig.type === 'relations' && fieldConfig.collection) {
369
+ const slugs = data[fieldName] ?? [];
370
+ data[fieldName] = await Promise.all(slugs.map(async (s) => {
371
+ const related = await this.getEntry(fieldConfig.collection, s);
372
+ return related ? { slug: related.slug, ...related.data } : s;
373
+ }));
374
+ }
375
+ }
376
+ return { ...entry, data };
377
+ }
378
+ }
379
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ export declare class AirdraftError extends Error {
2
+ readonly code: string;
3
+ readonly statusHint: number;
4
+ constructor(code: string, message: string, statusHint?: number);
5
+ }
6
+ export declare class EntryNotFoundError extends AirdraftError {
7
+ constructor(collection: string, slug: string);
8
+ }
9
+ export declare class CollectionNotFoundError extends AirdraftError {
10
+ constructor(collection: string);
11
+ }
12
+ export declare class ValidationError extends AirdraftError {
13
+ readonly details: Array<{
14
+ field: string;
15
+ message: string;
16
+ }>;
17
+ constructor(details: Array<{
18
+ field: string;
19
+ message: string;
20
+ }>);
21
+ }
22
+ export declare class SlugConflictError extends AirdraftError {
23
+ readonly suggestions?: string[] | undefined;
24
+ constructor(collection: string, slug: string, suggestions?: string[] | undefined);
25
+ }
26
+ export declare class ConflictError extends AirdraftError {
27
+ constructor(message: string);
28
+ }
29
+ export declare class UnauthorizedError extends AirdraftError {
30
+ constructor(message?: string);
31
+ }
32
+ export declare class ForbiddenError extends AirdraftError {
33
+ constructor(message?: string);
34
+ }
35
+ export declare class GitHubError extends AirdraftError {
36
+ constructor(message: string);
37
+ }
38
+ export declare class InternalError extends AirdraftError {
39
+ constructor(message?: string);
40
+ }
41
+ export declare class AdapterError extends AirdraftError {
42
+ readonly cause?: unknown | undefined;
43
+ constructor(message: string, cause?: unknown | undefined);
44
+ }
45
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA,qBAAa,aAAc,SAAQ,KAAK;aAEpB,IAAI,EAAE,MAAM;aAEZ,UAAU,EAAE,MAAM;gBAFlB,IAAI,EAAE,MAAM,EAC5B,OAAO,EAAE,MAAM,EACC,UAAU,GAAE,MAAY;CAO3C;AAED,qBAAa,kBAAmB,SAAQ,aAAa;gBACvC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAQ7C;AAED,qBAAa,uBAAwB,SAAQ,aAAa;gBAC5C,UAAU,EAAE,MAAM;CAI/B;AAED,qBAAa,eAAgB,SAAQ,aAAa;aAE9B,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;gBAAlD,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAKrE;AAED,qBAAa,iBAAkB,SAAQ,aAAa;aAIhC,WAAW,CAAC,EAAE,MAAM,EAAE;gBAFtC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACI,WAAW,CAAC,EAAE,MAAM,EAAE,YAAA;CASzC;AAED,qBAAa,aAAc,SAAQ,aAAa;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,iBAAkB,SAAQ,aAAa;gBACtC,OAAO,SAA4B;CAIhD;AAED,qBAAa,cAAe,SAAQ,aAAa;gBACnC,OAAO,SAA6B;CAIjD;AAED,qBAAa,WAAY,SAAQ,aAAa;gBAChC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,aAAc,SAAQ,aAAa;gBAClC,OAAO,SAA0B;CAI9C;AAED,qBAAa,YAAa,SAAQ,aAAa;aACA,KAAK,CAAC,EAAE,OAAO;gBAAhD,OAAO,EAAE,MAAM,EAAkB,KAAK,CAAC,EAAE,OAAO,YAAA;CAI7D"}
package/dist/errors.js ADDED
@@ -0,0 +1,80 @@
1
+ // Typed error classes for @airdraft/core
2
+ export class AirdraftError extends Error {
3
+ code;
4
+ statusHint;
5
+ constructor(code, message, statusHint = 500) {
6
+ super(message);
7
+ this.code = code;
8
+ this.statusHint = statusHint;
9
+ this.name = 'AirdraftError';
10
+ // Maintain proper prototype chain in transpiled ES5
11
+ Object.setPrototypeOf(this, new.target.prototype);
12
+ }
13
+ }
14
+ export class EntryNotFoundError extends AirdraftError {
15
+ constructor(collection, slug) {
16
+ super('ENTRY_NOT_FOUND', `No entry found in collection '${collection}' with slug '${slug}'`, 404);
17
+ this.name = 'EntryNotFoundError';
18
+ }
19
+ }
20
+ export class CollectionNotFoundError extends AirdraftError {
21
+ constructor(collection) {
22
+ super('COLLECTION_NOT_FOUND', `Collection '${collection}' is not defined in the config`, 404);
23
+ this.name = 'CollectionNotFoundError';
24
+ }
25
+ }
26
+ export class ValidationError extends AirdraftError {
27
+ details;
28
+ constructor(details) {
29
+ super('VALIDATION_ERROR', 'Validation failed', 422);
30
+ this.details = details;
31
+ this.name = 'ValidationError';
32
+ }
33
+ }
34
+ export class SlugConflictError extends AirdraftError {
35
+ suggestions;
36
+ constructor(collection, slug, suggestions) {
37
+ super('SLUG_CONFLICT', `A ${collection} entry with slug '${slug}' already exists`, 409);
38
+ this.suggestions = suggestions;
39
+ this.name = 'SlugConflictError';
40
+ }
41
+ }
42
+ export class ConflictError extends AirdraftError {
43
+ constructor(message) {
44
+ super('CONFLICT', message, 409);
45
+ this.name = 'ConflictError';
46
+ }
47
+ }
48
+ export class UnauthorizedError extends AirdraftError {
49
+ constructor(message = 'Authentication required') {
50
+ super('UNAUTHORIZED', message, 401);
51
+ this.name = 'UnauthorizedError';
52
+ }
53
+ }
54
+ export class ForbiddenError extends AirdraftError {
55
+ constructor(message = 'Insufficient permissions') {
56
+ super('FORBIDDEN', message, 403);
57
+ this.name = 'ForbiddenError';
58
+ }
59
+ }
60
+ export class GitHubError extends AirdraftError {
61
+ constructor(message) {
62
+ super('GITHUB_ERROR', message, 502);
63
+ this.name = 'GitHubError';
64
+ }
65
+ }
66
+ export class InternalError extends AirdraftError {
67
+ constructor(message = 'Internal server error') {
68
+ super('INTERNAL_ERROR', message, 500);
69
+ this.name = 'InternalError';
70
+ }
71
+ }
72
+ export class AdapterError extends AirdraftError {
73
+ cause;
74
+ constructor(message, cause) {
75
+ super('ADAPTER_ERROR', message, 502);
76
+ this.cause = cause;
77
+ this.name = 'AdapterError';
78
+ }
79
+ }
80
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { FieldConfig, FieldType } from './types.js';
2
+ export type FieldValidationError = {
3
+ field: string;
4
+ message: string;
5
+ };
6
+ /**
7
+ * Validate a single field value against its FieldConfig.
8
+ * Returns an array of error messages (empty = valid).
9
+ */
10
+ export declare function validateField(fieldName: string, value: unknown, config: FieldConfig): FieldValidationError[];
11
+ /**
12
+ * Validate all fields in an entry payload against a collection's field schema.
13
+ * Returns all collected errors.
14
+ */
15
+ export declare function validateFields(data: Record<string, unknown>, fields: Record<string, FieldConfig>): FieldValidationError[];
16
+ /**
17
+ * Incompatible field/format checks.
18
+ * Returns an error message if the collection config has an inconsistency, otherwise null.
19
+ */
20
+ export declare function checkFormatCompatibility(format: 'mdx' | 'json' | 'yaml', fields: Record<string, FieldConfig>): string | null;
21
+ /** Build a Zod-compatible FieldType enum for schema export. */
22
+ export declare const FIELD_TYPES: readonly FieldType[];
23
+ //# sourceMappingURL=fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../src/fields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAMxD,MAAM,MAAM,oBAAoB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAErE;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,WAAW,GAClB,oBAAoB,EAAE,CAwIxB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAClC,oBAAoB,EAAE,CAMxB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAClC,MAAM,GAAG,IAAI,CASf;AAED,+DAA+D;AAC/D,eAAO,MAAM,WAAW,EAAE,SAAS,SAAS,EAelC,CAAA"}