archetype-engine 2.0.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.
- package/LICENSE +21 -0
- package/README.md +241 -0
- package/dist/src/ai/adapters/anthropic.d.ts +31 -0
- package/dist/src/ai/adapters/anthropic.d.ts.map +1 -0
- package/dist/src/ai/adapters/anthropic.js +75 -0
- package/dist/src/ai/adapters/openai.d.ts +33 -0
- package/dist/src/ai/adapters/openai.d.ts.map +1 -0
- package/dist/src/ai/adapters/openai.js +120 -0
- package/dist/src/ai/adapters/vercel.d.ts +434 -0
- package/dist/src/ai/adapters/vercel.d.ts.map +1 -0
- package/dist/src/ai/adapters/vercel.js +162 -0
- package/dist/src/ai/index.d.ts +492 -0
- package/dist/src/ai/index.d.ts.map +1 -0
- package/dist/src/ai/index.js +71 -0
- package/dist/src/ai/state.d.ts +13 -0
- package/dist/src/ai/state.d.ts.map +1 -0
- package/dist/src/ai/state.js +215 -0
- package/dist/src/ai/tools.d.ts +13 -0
- package/dist/src/ai/tools.d.ts.map +1 -0
- package/dist/src/ai/tools.js +257 -0
- package/dist/src/ai/types.d.ts +196 -0
- package/dist/src/ai/types.d.ts.map +1 -0
- package/dist/src/ai/types.js +9 -0
- package/dist/src/cli.d.ts +3 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +540 -0
- package/dist/src/core/utils.d.ts +27 -0
- package/dist/src/core/utils.d.ts.map +1 -0
- package/dist/src/core/utils.js +56 -0
- package/dist/src/entity.d.ts +165 -0
- package/dist/src/entity.d.ts.map +1 -0
- package/dist/src/entity.js +108 -0
- package/dist/src/fields.d.ts +207 -0
- package/dist/src/fields.d.ts.map +1 -0
- package/dist/src/fields.js +291 -0
- package/dist/src/generators/erd-ir.d.ts +10 -0
- package/dist/src/generators/erd-ir.d.ts.map +1 -0
- package/dist/src/generators/erd-ir.js +119 -0
- package/dist/src/index.d.ts +51 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +101 -0
- package/dist/src/init/dependencies.d.ts +31 -0
- package/dist/src/init/dependencies.d.ts.map +1 -0
- package/dist/src/init/dependencies.js +101 -0
- package/dist/src/init/entity-templates.d.ts +42 -0
- package/dist/src/init/entity-templates.d.ts.map +1 -0
- package/dist/src/init/entity-templates.js +367 -0
- package/dist/src/init/index.d.ts +10 -0
- package/dist/src/init/index.d.ts.map +1 -0
- package/dist/src/init/index.js +250 -0
- package/dist/src/init/prompts.d.ts +11 -0
- package/dist/src/init/prompts.d.ts.map +1 -0
- package/dist/src/init/prompts.js +275 -0
- package/dist/src/init/templates.d.ts +24 -0
- package/dist/src/init/templates.d.ts.map +1 -0
- package/dist/src/init/templates.js +587 -0
- package/dist/src/json/index.d.ts +11 -0
- package/dist/src/json/index.d.ts.map +1 -0
- package/dist/src/json/index.js +26 -0
- package/dist/src/json/parser.d.ts +61 -0
- package/dist/src/json/parser.d.ts.map +1 -0
- package/dist/src/json/parser.js +309 -0
- package/dist/src/json/types.d.ts +275 -0
- package/dist/src/json/types.d.ts.map +1 -0
- package/dist/src/json/types.js +10 -0
- package/dist/src/manifest.d.ts +147 -0
- package/dist/src/manifest.d.ts.map +1 -0
- package/dist/src/manifest.js +104 -0
- package/dist/src/relations.d.ts +96 -0
- package/dist/src/relations.d.ts.map +1 -0
- package/dist/src/relations.js +108 -0
- package/dist/src/source.d.ts +93 -0
- package/dist/src/source.d.ts.map +1 -0
- package/dist/src/source.js +89 -0
- package/dist/src/template/context.d.ts +34 -0
- package/dist/src/template/context.d.ts.map +1 -0
- package/dist/src/template/context.js +31 -0
- package/dist/src/template/index.d.ts +6 -0
- package/dist/src/template/index.d.ts.map +1 -0
- package/dist/src/template/index.js +12 -0
- package/dist/src/template/registry.d.ts +18 -0
- package/dist/src/template/registry.d.ts.map +1 -0
- package/dist/src/template/registry.js +89 -0
- package/dist/src/template/runner.d.ts +9 -0
- package/dist/src/template/runner.d.ts.map +1 -0
- package/dist/src/template/runner.js +125 -0
- package/dist/src/template/types.d.ts +73 -0
- package/dist/src/template/types.d.ts.map +1 -0
- package/dist/src/template/types.js +3 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/api.d.ts +22 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/api.d.ts.map +1 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/api.js +866 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/auth.d.ts +20 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/auth.d.ts.map +1 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/auth.js +273 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/crud-hooks.d.ts +22 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/crud-hooks.d.ts.map +1 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/crud-hooks.js +237 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/hooks.d.ts +30 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/hooks.d.ts.map +1 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/hooks.js +345 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/i18n.d.ts +25 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/i18n.d.ts.map +1 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/i18n.js +199 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/index.d.ts +8 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/index.d.ts.map +1 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/index.js +18 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/schema.d.ts +22 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/schema.d.ts.map +1 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/schema.js +270 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/service.d.ts +23 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/service.d.ts.map +1 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/service.js +304 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/validation.d.ts +21 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/validation.d.ts.map +1 -0
- package/dist/src/templates/nextjs-drizzle-trpc/generators/validation.js +248 -0
- package/dist/src/templates/nextjs-drizzle-trpc/index.d.ts +30 -0
- package/dist/src/templates/nextjs-drizzle-trpc/index.d.ts.map +1 -0
- package/dist/src/templates/nextjs-drizzle-trpc/index.js +71 -0
- package/dist/src/validation/index.d.ts +71 -0
- package/dist/src/validation/index.d.ts.map +1 -0
- package/dist/src/validation/index.js +314 -0
- package/package.json +86 -0
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* JSON Parser - converts JSON manifest to IR
|
|
4
|
+
*
|
|
5
|
+
* @module json/parser
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.parseFieldJSON = parseFieldJSON;
|
|
42
|
+
exports.parseRelationJSON = parseRelationJSON;
|
|
43
|
+
exports.parseExternalSourceJSON = parseExternalSourceJSON;
|
|
44
|
+
exports.parseProtectedJSON = parseProtectedJSON;
|
|
45
|
+
exports.parseHooksJSON = parseHooksJSON;
|
|
46
|
+
exports.parseEntityJSON = parseEntityJSON;
|
|
47
|
+
exports.parseManifestJSON = parseManifestJSON;
|
|
48
|
+
exports.loadManifestFromJSONFile = loadManifestFromJSONFile;
|
|
49
|
+
const manifest_1 = require("../manifest");
|
|
50
|
+
/**
|
|
51
|
+
* Parse a JSON field definition to FieldConfig
|
|
52
|
+
*/
|
|
53
|
+
function parseFieldJSON(field) {
|
|
54
|
+
const validations = [];
|
|
55
|
+
// Text validations
|
|
56
|
+
if (field.min !== undefined) {
|
|
57
|
+
// For text fields, min/max are length validations
|
|
58
|
+
// For number fields, they are value validations
|
|
59
|
+
if (field.type === 'text') {
|
|
60
|
+
validations.push({ type: 'minLength', value: field.min });
|
|
61
|
+
}
|
|
62
|
+
else if (field.type === 'number') {
|
|
63
|
+
validations.push({ type: 'min', value: field.min });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (field.max !== undefined) {
|
|
67
|
+
if (field.type === 'text') {
|
|
68
|
+
validations.push({ type: 'maxLength', value: field.max });
|
|
69
|
+
}
|
|
70
|
+
else if (field.type === 'number') {
|
|
71
|
+
validations.push({ type: 'max', value: field.max });
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (field.email)
|
|
75
|
+
validations.push({ type: 'email' });
|
|
76
|
+
if (field.url)
|
|
77
|
+
validations.push({ type: 'url' });
|
|
78
|
+
if (field.regex)
|
|
79
|
+
validations.push({ type: 'regex', value: field.regex });
|
|
80
|
+
if (field.oneOf)
|
|
81
|
+
validations.push({ type: 'oneOf', value: field.oneOf });
|
|
82
|
+
if (field.trim)
|
|
83
|
+
validations.push({ type: 'trim' });
|
|
84
|
+
if (field.lowercase)
|
|
85
|
+
validations.push({ type: 'lowercase' });
|
|
86
|
+
if (field.uppercase)
|
|
87
|
+
validations.push({ type: 'uppercase' });
|
|
88
|
+
// Number validations
|
|
89
|
+
if (field.integer)
|
|
90
|
+
validations.push({ type: 'integer' });
|
|
91
|
+
if (field.positive)
|
|
92
|
+
validations.push({ type: 'positive' });
|
|
93
|
+
// Determine required status
|
|
94
|
+
// Default is true (required) unless optional is true or required is explicitly false
|
|
95
|
+
const required = field.optional === true ? false : (field.required !== false);
|
|
96
|
+
return {
|
|
97
|
+
type: field.type,
|
|
98
|
+
required,
|
|
99
|
+
unique: field.unique || false,
|
|
100
|
+
default: field.default,
|
|
101
|
+
label: field.label,
|
|
102
|
+
validations,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Parse a JSON relation definition to RelationConfig
|
|
107
|
+
*/
|
|
108
|
+
function parseRelationJSON(relation) {
|
|
109
|
+
return {
|
|
110
|
+
type: relation.type,
|
|
111
|
+
entity: relation.entity,
|
|
112
|
+
field: relation.field,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Parse a JSON external source to ExternalSourceConfig
|
|
117
|
+
*/
|
|
118
|
+
function parseExternalSourceJSON(source) {
|
|
119
|
+
let auth;
|
|
120
|
+
if (source.auth) {
|
|
121
|
+
auth = {
|
|
122
|
+
type: source.auth.type,
|
|
123
|
+
header: source.auth.header || (source.auth.type === 'api-key' ? 'X-API-Key' : 'Authorization'),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
type: 'external',
|
|
128
|
+
baseUrl: source.baseUrl,
|
|
129
|
+
pathPrefix: source.pathPrefix || '',
|
|
130
|
+
resourceName: source.resourceName,
|
|
131
|
+
endpoints: {
|
|
132
|
+
list: source.override?.list || '',
|
|
133
|
+
get: source.override?.get || '',
|
|
134
|
+
create: source.override?.create || '',
|
|
135
|
+
update: source.override?.update || '',
|
|
136
|
+
delete: source.override?.delete || '',
|
|
137
|
+
},
|
|
138
|
+
auth,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Parse a JSON protected option to ProtectedIR
|
|
143
|
+
*/
|
|
144
|
+
function parseProtectedJSON(option) {
|
|
145
|
+
const allPublic = { list: false, get: false, create: false, update: false, remove: false };
|
|
146
|
+
const allProtected = { list: true, get: true, create: true, update: true, remove: true };
|
|
147
|
+
const writeProtected = { list: false, get: false, create: true, update: true, remove: true };
|
|
148
|
+
if (option === undefined || option === false)
|
|
149
|
+
return allPublic;
|
|
150
|
+
if (option === true || option === 'all')
|
|
151
|
+
return allProtected;
|
|
152
|
+
if (option === 'write')
|
|
153
|
+
return writeProtected;
|
|
154
|
+
// Granular config - merge with allPublic defaults
|
|
155
|
+
return { ...allPublic, ...option };
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Parse a JSON hooks option to HooksIR
|
|
159
|
+
*/
|
|
160
|
+
function parseHooksJSON(option) {
|
|
161
|
+
const noHooks = {
|
|
162
|
+
beforeCreate: false,
|
|
163
|
+
afterCreate: false,
|
|
164
|
+
beforeUpdate: false,
|
|
165
|
+
afterUpdate: false,
|
|
166
|
+
beforeRemove: false,
|
|
167
|
+
afterRemove: false,
|
|
168
|
+
};
|
|
169
|
+
const allHooks = {
|
|
170
|
+
beforeCreate: true,
|
|
171
|
+
afterCreate: true,
|
|
172
|
+
beforeUpdate: true,
|
|
173
|
+
afterUpdate: true,
|
|
174
|
+
beforeRemove: true,
|
|
175
|
+
afterRemove: true,
|
|
176
|
+
};
|
|
177
|
+
if (option === undefined || option === false)
|
|
178
|
+
return noHooks;
|
|
179
|
+
if (option === true)
|
|
180
|
+
return allHooks;
|
|
181
|
+
// Granular config - merge with noHooks defaults
|
|
182
|
+
return { ...noHooks, ...option };
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Parse a JSON entity definition to EntityIR
|
|
186
|
+
*/
|
|
187
|
+
function parseEntityJSON(entity) {
|
|
188
|
+
// Parse fields
|
|
189
|
+
const fields = {};
|
|
190
|
+
for (const [fieldName, field] of Object.entries(entity.fields)) {
|
|
191
|
+
fields[fieldName] = parseFieldJSON(field);
|
|
192
|
+
}
|
|
193
|
+
// Parse relations
|
|
194
|
+
const relations = {};
|
|
195
|
+
if (entity.relations) {
|
|
196
|
+
for (const [relationName, relation] of Object.entries(entity.relations)) {
|
|
197
|
+
relations[relationName] = parseRelationJSON(relation);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// Parse behaviors with defaults
|
|
201
|
+
const behaviors = {
|
|
202
|
+
timestamps: entity.behaviors?.timestamps !== false, // default true
|
|
203
|
+
softDelete: entity.behaviors?.softDelete || false,
|
|
204
|
+
audit: entity.behaviors?.audit || false,
|
|
205
|
+
};
|
|
206
|
+
// Parse source if present
|
|
207
|
+
let source;
|
|
208
|
+
if (entity.source) {
|
|
209
|
+
source = parseExternalSourceJSON(entity.source);
|
|
210
|
+
}
|
|
211
|
+
return {
|
|
212
|
+
name: entity.name,
|
|
213
|
+
fields,
|
|
214
|
+
relations,
|
|
215
|
+
behaviors,
|
|
216
|
+
auth: entity.auth || false,
|
|
217
|
+
protected: parseProtectedJSON(entity.protected),
|
|
218
|
+
source,
|
|
219
|
+
hooks: parseHooksJSON(entity.hooks),
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Parse a JSON manifest to ManifestIR
|
|
224
|
+
*
|
|
225
|
+
* @param json - JSON manifest object or string
|
|
226
|
+
* @returns Compiled ManifestIR
|
|
227
|
+
* @throws Error if JSON is invalid or validation fails
|
|
228
|
+
*
|
|
229
|
+
* @example
|
|
230
|
+
* ```typescript
|
|
231
|
+
* const manifest = parseManifestJSON({
|
|
232
|
+
* entities: [
|
|
233
|
+
* { name: 'User', fields: { email: { type: 'text', email: true } } }
|
|
234
|
+
* ],
|
|
235
|
+
* database: { type: 'sqlite', file: './app.db' }
|
|
236
|
+
* })
|
|
237
|
+
* ```
|
|
238
|
+
*/
|
|
239
|
+
function parseManifestJSON(json) {
|
|
240
|
+
// Parse string if needed
|
|
241
|
+
const manifest = typeof json === 'string' ? JSON.parse(json) : json;
|
|
242
|
+
// Normalize mode
|
|
243
|
+
const mode = (0, manifest_1.normalizeMode)(manifest.mode);
|
|
244
|
+
// Validate: full mode requires database
|
|
245
|
+
if (mode.type === 'full' && !manifest.database) {
|
|
246
|
+
throw new Error(`Mode 'full' requires database configuration.\n` +
|
|
247
|
+
`Fix: Add database config or use mode: 'headless' for frontend-only projects.`);
|
|
248
|
+
}
|
|
249
|
+
// Parse entities
|
|
250
|
+
const entities = manifest.entities.map(parseEntityJSON);
|
|
251
|
+
// Parse global source if present
|
|
252
|
+
let source;
|
|
253
|
+
if (manifest.source) {
|
|
254
|
+
source = parseExternalSourceJSON(manifest.source);
|
|
255
|
+
}
|
|
256
|
+
return {
|
|
257
|
+
template: manifest.template,
|
|
258
|
+
mode,
|
|
259
|
+
entities,
|
|
260
|
+
source,
|
|
261
|
+
database: manifest.database,
|
|
262
|
+
auth: {
|
|
263
|
+
enabled: manifest.auth?.enabled || false,
|
|
264
|
+
adapter: manifest.auth?.adapter || 'drizzle',
|
|
265
|
+
providers: manifest.auth?.providers || [],
|
|
266
|
+
sessionStrategy: manifest.auth?.sessionStrategy || 'jwt',
|
|
267
|
+
},
|
|
268
|
+
i18n: {
|
|
269
|
+
languages: manifest.i18n?.languages || ['en'],
|
|
270
|
+
defaultLanguage: manifest.i18n?.defaultLanguage || 'en',
|
|
271
|
+
outputDir: manifest.i18n?.outputDir || './messages',
|
|
272
|
+
},
|
|
273
|
+
observability: {
|
|
274
|
+
logging: {
|
|
275
|
+
enabled: manifest.observability?.logging?.enabled || false,
|
|
276
|
+
level: manifest.observability?.logging?.level || 'info',
|
|
277
|
+
format: manifest.observability?.logging?.format || 'json',
|
|
278
|
+
},
|
|
279
|
+
telemetry: {
|
|
280
|
+
enabled: manifest.observability?.telemetry?.enabled || false,
|
|
281
|
+
events: manifest.observability?.telemetry?.events || [],
|
|
282
|
+
},
|
|
283
|
+
audit: {
|
|
284
|
+
enabled: manifest.observability?.audit?.enabled || false,
|
|
285
|
+
entity: manifest.observability?.audit?.entity,
|
|
286
|
+
},
|
|
287
|
+
},
|
|
288
|
+
tenancy: {
|
|
289
|
+
enabled: manifest.tenancy?.enabled || false,
|
|
290
|
+
field: manifest.tenancy?.field || 'organizationId',
|
|
291
|
+
},
|
|
292
|
+
defaults: {
|
|
293
|
+
timestamps: manifest.defaults?.timestamps !== false, // default true
|
|
294
|
+
softDelete: manifest.defaults?.softDelete || false,
|
|
295
|
+
audit: manifest.defaults?.audit || false,
|
|
296
|
+
},
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Load manifest from a JSON file
|
|
301
|
+
*
|
|
302
|
+
* @param filePath - Path to JSON file
|
|
303
|
+
* @returns Compiled ManifestIR
|
|
304
|
+
*/
|
|
305
|
+
async function loadManifestFromJSONFile(filePath) {
|
|
306
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs/promises')));
|
|
307
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
308
|
+
return parseManifestJSON(content);
|
|
309
|
+
}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON Schema Types for AI Agent Input
|
|
3
|
+
*
|
|
4
|
+
* These types define the JSON format that AI agents can use to generate
|
|
5
|
+
* archetype manifests without writing TypeScript code.
|
|
6
|
+
*
|
|
7
|
+
* @module json/types
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* JSON representation of a field definition
|
|
11
|
+
*/
|
|
12
|
+
export interface FieldJSON {
|
|
13
|
+
/** Field type */
|
|
14
|
+
type: 'text' | 'number' | 'boolean' | 'date';
|
|
15
|
+
/** Mark field as required (default: true) */
|
|
16
|
+
required?: boolean;
|
|
17
|
+
/** Mark field as optional (shorthand for required: false) */
|
|
18
|
+
optional?: boolean;
|
|
19
|
+
/** Add unique constraint */
|
|
20
|
+
unique?: boolean;
|
|
21
|
+
/** Default value for the field */
|
|
22
|
+
default?: unknown;
|
|
23
|
+
/** Display label for the field */
|
|
24
|
+
label?: string;
|
|
25
|
+
/** Minimum length for text fields */
|
|
26
|
+
min?: number;
|
|
27
|
+
/** Maximum length for text fields */
|
|
28
|
+
max?: number;
|
|
29
|
+
/** Validate as email format */
|
|
30
|
+
email?: boolean;
|
|
31
|
+
/** Validate as URL format */
|
|
32
|
+
url?: boolean;
|
|
33
|
+
/** Validate against regex pattern (as string) */
|
|
34
|
+
regex?: string;
|
|
35
|
+
/** Enum: value must be one of these */
|
|
36
|
+
oneOf?: string[];
|
|
37
|
+
/** Trim whitespace */
|
|
38
|
+
trim?: boolean;
|
|
39
|
+
/** Convert to lowercase */
|
|
40
|
+
lowercase?: boolean;
|
|
41
|
+
/** Convert to uppercase */
|
|
42
|
+
uppercase?: boolean;
|
|
43
|
+
/** Must be integer */
|
|
44
|
+
integer?: boolean;
|
|
45
|
+
/** Must be positive */
|
|
46
|
+
positive?: boolean;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* JSON representation of a relation definition
|
|
50
|
+
*/
|
|
51
|
+
export interface RelationJSON {
|
|
52
|
+
/** Relation type */
|
|
53
|
+
type: 'hasOne' | 'hasMany' | 'belongsToMany';
|
|
54
|
+
/** Target entity name */
|
|
55
|
+
entity: string;
|
|
56
|
+
/** Custom foreign key field name */
|
|
57
|
+
field?: string;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Entity behaviors configuration
|
|
61
|
+
*/
|
|
62
|
+
export interface BehaviorsJSON {
|
|
63
|
+
/** Add createdAt and updatedAt timestamps (default: true) */
|
|
64
|
+
timestamps?: boolean;
|
|
65
|
+
/** Use soft delete instead of hard delete (default: false) */
|
|
66
|
+
softDelete?: boolean;
|
|
67
|
+
/** Enable audit logging (default: false) */
|
|
68
|
+
audit?: boolean;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Granular protection configuration per CRUD operation
|
|
72
|
+
*/
|
|
73
|
+
export interface ProtectedConfigJSON {
|
|
74
|
+
list?: boolean;
|
|
75
|
+
get?: boolean;
|
|
76
|
+
create?: boolean;
|
|
77
|
+
update?: boolean;
|
|
78
|
+
remove?: boolean;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Protection option - shorthand or granular
|
|
82
|
+
* - false: all public (default)
|
|
83
|
+
* - true or 'all': all operations require auth
|
|
84
|
+
* - 'write': list/get public, create/update/remove protected
|
|
85
|
+
* - object: granular control per operation
|
|
86
|
+
*/
|
|
87
|
+
export type ProtectedJSON = boolean | 'write' | 'all' | ProtectedConfigJSON;
|
|
88
|
+
/**
|
|
89
|
+
* External source auth configuration
|
|
90
|
+
*/
|
|
91
|
+
export interface ExternalAuthJSON {
|
|
92
|
+
type: 'bearer' | 'api-key';
|
|
93
|
+
/** Custom header name (default: 'Authorization' for bearer, 'X-API-Key' for api-key) */
|
|
94
|
+
header?: string;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* External source endpoint overrides
|
|
98
|
+
*/
|
|
99
|
+
export interface EndpointOverrideJSON {
|
|
100
|
+
/** e.g., 'GET /catalog/search' */
|
|
101
|
+
list?: string;
|
|
102
|
+
/** e.g., 'GET /items/:sku' */
|
|
103
|
+
get?: string;
|
|
104
|
+
/** e.g., 'POST /items' */
|
|
105
|
+
create?: string;
|
|
106
|
+
/** e.g., 'PUT /items/:id' */
|
|
107
|
+
update?: string;
|
|
108
|
+
/** e.g., 'DELETE /items/:id' */
|
|
109
|
+
delete?: string;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* External API source configuration
|
|
113
|
+
*/
|
|
114
|
+
export interface ExternalSourceJSON {
|
|
115
|
+
/** Base URL - supports 'env:VARIABLE_NAME' syntax */
|
|
116
|
+
baseUrl: string;
|
|
117
|
+
/** Path prefix like '/v1' or '/api' */
|
|
118
|
+
pathPrefix?: string;
|
|
119
|
+
/** Override auto-pluralization (e.g., 'product' instead of 'products') */
|
|
120
|
+
resourceName?: string;
|
|
121
|
+
/** Override specific endpoints */
|
|
122
|
+
override?: EndpointOverrideJSON;
|
|
123
|
+
/** Auth configuration */
|
|
124
|
+
auth?: ExternalAuthJSON;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* JSON representation of an entity definition
|
|
128
|
+
*/
|
|
129
|
+
export interface EntityJSON {
|
|
130
|
+
/** Entity name in PascalCase */
|
|
131
|
+
name: string;
|
|
132
|
+
/** Field definitions */
|
|
133
|
+
fields: Record<string, FieldJSON>;
|
|
134
|
+
/** Relation definitions */
|
|
135
|
+
relations?: Record<string, RelationJSON>;
|
|
136
|
+
/** Entity behaviors */
|
|
137
|
+
behaviors?: BehaviorsJSON;
|
|
138
|
+
/** Mark as auth entity for next-auth integration */
|
|
139
|
+
auth?: boolean;
|
|
140
|
+
/** Protection level for CRUD operations */
|
|
141
|
+
protected?: ProtectedJSON;
|
|
142
|
+
/** External API source (overrides manifest source) */
|
|
143
|
+
source?: ExternalSourceJSON;
|
|
144
|
+
/** CRUD hooks configuration */
|
|
145
|
+
hooks?: boolean | HooksJSON;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Hooks configuration for JSON input
|
|
149
|
+
*/
|
|
150
|
+
export interface HooksJSON {
|
|
151
|
+
beforeCreate?: boolean;
|
|
152
|
+
afterCreate?: boolean;
|
|
153
|
+
beforeUpdate?: boolean;
|
|
154
|
+
afterUpdate?: boolean;
|
|
155
|
+
beforeRemove?: boolean;
|
|
156
|
+
afterRemove?: boolean;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Database configuration
|
|
160
|
+
*/
|
|
161
|
+
export interface DatabaseJSON {
|
|
162
|
+
/** Database type */
|
|
163
|
+
type: 'sqlite' | 'postgres' | 'mysql';
|
|
164
|
+
/** SQLite file path (for SQLite only) */
|
|
165
|
+
file?: string;
|
|
166
|
+
/** Connection URL (for PostgreSQL/MySQL) */
|
|
167
|
+
url?: string;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Auth configuration
|
|
171
|
+
*/
|
|
172
|
+
export interface AuthJSON {
|
|
173
|
+
enabled: boolean;
|
|
174
|
+
adapter?: 'drizzle';
|
|
175
|
+
providers?: ('credentials' | 'google' | 'github' | 'discord')[];
|
|
176
|
+
sessionStrategy?: 'jwt' | 'database';
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* i18n configuration
|
|
180
|
+
*/
|
|
181
|
+
export interface I18nJSON {
|
|
182
|
+
languages: string[];
|
|
183
|
+
defaultLanguage: string;
|
|
184
|
+
outputDir?: string;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Logging configuration
|
|
188
|
+
*/
|
|
189
|
+
export interface LoggingJSON {
|
|
190
|
+
enabled: boolean;
|
|
191
|
+
level?: 'debug' | 'info' | 'warn' | 'error';
|
|
192
|
+
format?: 'json' | 'pretty';
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Telemetry configuration
|
|
196
|
+
*/
|
|
197
|
+
export interface TelemetryJSON {
|
|
198
|
+
enabled: boolean;
|
|
199
|
+
events?: ('create' | 'update' | 'remove')[];
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Audit configuration
|
|
203
|
+
*/
|
|
204
|
+
export interface AuditJSON {
|
|
205
|
+
enabled: boolean;
|
|
206
|
+
entity?: string;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Observability configuration
|
|
210
|
+
*/
|
|
211
|
+
export interface ObservabilityJSON {
|
|
212
|
+
logging?: LoggingJSON;
|
|
213
|
+
telemetry?: TelemetryJSON;
|
|
214
|
+
audit?: AuditJSON;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Tenancy configuration
|
|
218
|
+
*/
|
|
219
|
+
export interface TenancyJSON {
|
|
220
|
+
enabled: boolean;
|
|
221
|
+
/** Field to filter by (e.g., 'organizationId') */
|
|
222
|
+
field: string;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Default behaviors for all entities
|
|
226
|
+
*/
|
|
227
|
+
export interface DefaultsJSON {
|
|
228
|
+
timestamps?: boolean;
|
|
229
|
+
softDelete?: boolean;
|
|
230
|
+
audit?: boolean;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* JSON representation of a manifest/config
|
|
234
|
+
*
|
|
235
|
+
* This is the main type that AI agents should generate.
|
|
236
|
+
*
|
|
237
|
+
* @example
|
|
238
|
+
* ```json
|
|
239
|
+
* {
|
|
240
|
+
* "entities": [
|
|
241
|
+
* {
|
|
242
|
+
* "name": "User",
|
|
243
|
+
* "fields": {
|
|
244
|
+
* "email": { "type": "text", "email": true, "unique": true },
|
|
245
|
+
* "name": { "type": "text" }
|
|
246
|
+
* }
|
|
247
|
+
* }
|
|
248
|
+
* ],
|
|
249
|
+
* "database": { "type": "sqlite", "file": "./app.db" }
|
|
250
|
+
* }
|
|
251
|
+
* ```
|
|
252
|
+
*/
|
|
253
|
+
export interface ManifestJSON {
|
|
254
|
+
/** Entity definitions */
|
|
255
|
+
entities: EntityJSON[];
|
|
256
|
+
/** Template ID (e.g., 'nextjs-drizzle-trpc') */
|
|
257
|
+
template?: string;
|
|
258
|
+
/** Generation mode */
|
|
259
|
+
mode?: 'full' | 'headless' | 'api-only';
|
|
260
|
+
/** Database configuration (required for 'full' mode) */
|
|
261
|
+
database?: DatabaseJSON;
|
|
262
|
+
/** Global default source for all entities */
|
|
263
|
+
source?: ExternalSourceJSON;
|
|
264
|
+
/** Authentication configuration */
|
|
265
|
+
auth?: AuthJSON;
|
|
266
|
+
/** Internationalization configuration */
|
|
267
|
+
i18n?: I18nJSON;
|
|
268
|
+
/** Observability configuration */
|
|
269
|
+
observability?: ObservabilityJSON;
|
|
270
|
+
/** Multi-tenancy configuration */
|
|
271
|
+
tenancy?: TenancyJSON;
|
|
272
|
+
/** Default behaviors for all entities */
|
|
273
|
+
defaults?: DefaultsJSON;
|
|
274
|
+
}
|
|
275
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/json/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* JSON Schema Types for AI Agent Input
|
|
4
|
+
*
|
|
5
|
+
* These types define the JSON format that AI agents can use to generate
|
|
6
|
+
* archetype manifests without writing TypeScript code.
|
|
7
|
+
*
|
|
8
|
+
* @module json/types
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|