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,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Configuration types and dependencies for archetype init
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.headlessDependencies = exports.authDependencies = exports.databaseDependencies = exports.coreDevDependencies = exports.coreDependencies = void 0;
|
|
5
|
+
exports.getDependencies = getDependencies;
|
|
6
|
+
exports.getRecommendedConfig = getRecommendedConfig;
|
|
7
|
+
// Core dependencies (always installed)
|
|
8
|
+
exports.coreDependencies = [
|
|
9
|
+
'@trpc/server',
|
|
10
|
+
'@trpc/client',
|
|
11
|
+
'@trpc/react-query',
|
|
12
|
+
'@tanstack/react-query',
|
|
13
|
+
'drizzle-orm',
|
|
14
|
+
'zod',
|
|
15
|
+
'react-hook-form',
|
|
16
|
+
'@hookform/resolvers',
|
|
17
|
+
];
|
|
18
|
+
// Dev dependencies (always installed)
|
|
19
|
+
exports.coreDevDependencies = [
|
|
20
|
+
'drizzle-kit',
|
|
21
|
+
];
|
|
22
|
+
// Database-specific dependencies
|
|
23
|
+
exports.databaseDependencies = {
|
|
24
|
+
sqlite: {
|
|
25
|
+
deps: ['better-sqlite3'],
|
|
26
|
+
devDeps: ['@types/better-sqlite3'],
|
|
27
|
+
},
|
|
28
|
+
postgres: {
|
|
29
|
+
deps: ['postgres'],
|
|
30
|
+
devDeps: [],
|
|
31
|
+
},
|
|
32
|
+
mysql: {
|
|
33
|
+
deps: ['mysql2'],
|
|
34
|
+
devDeps: [],
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
// Auth dependencies (next-auth v5)
|
|
38
|
+
exports.authDependencies = {
|
|
39
|
+
deps: ['next-auth@beta', '@auth/drizzle-adapter'],
|
|
40
|
+
devDeps: [],
|
|
41
|
+
};
|
|
42
|
+
// Headless mode dependencies (no DB, external APIs)
|
|
43
|
+
exports.headlessDependencies = [
|
|
44
|
+
'@trpc/server',
|
|
45
|
+
'@trpc/client',
|
|
46
|
+
'@trpc/react-query',
|
|
47
|
+
'@tanstack/react-query',
|
|
48
|
+
'zod',
|
|
49
|
+
'react-hook-form',
|
|
50
|
+
'@hookform/resolvers',
|
|
51
|
+
];
|
|
52
|
+
// Get all dependencies for a given config
|
|
53
|
+
function getDependencies(config) {
|
|
54
|
+
// Headless mode - no database deps
|
|
55
|
+
if (config.mode === 'headless') {
|
|
56
|
+
const deps = [...exports.headlessDependencies];
|
|
57
|
+
const devDeps = [];
|
|
58
|
+
// Add auth deps if enabled
|
|
59
|
+
if (config.auth) {
|
|
60
|
+
deps.push(...exports.authDependencies.deps);
|
|
61
|
+
devDeps.push(...exports.authDependencies.devDeps);
|
|
62
|
+
}
|
|
63
|
+
return { deps, devDeps };
|
|
64
|
+
}
|
|
65
|
+
// Full mode - include database deps
|
|
66
|
+
const deps = [...exports.coreDependencies];
|
|
67
|
+
const devDeps = [...exports.coreDevDependencies];
|
|
68
|
+
// Add database-specific deps
|
|
69
|
+
if (config.database) {
|
|
70
|
+
const dbDeps = exports.databaseDependencies[config.database];
|
|
71
|
+
deps.push(...dbDeps.deps);
|
|
72
|
+
devDeps.push(...dbDeps.devDeps);
|
|
73
|
+
}
|
|
74
|
+
// Add auth deps if enabled
|
|
75
|
+
if (config.auth) {
|
|
76
|
+
deps.push(...exports.authDependencies.deps);
|
|
77
|
+
devDeps.push(...exports.authDependencies.devDeps);
|
|
78
|
+
}
|
|
79
|
+
return { deps, devDeps };
|
|
80
|
+
}
|
|
81
|
+
// Get recommended config - template comes from registry
|
|
82
|
+
function getRecommendedConfig(templateId, mode = 'full') {
|
|
83
|
+
if (mode === 'headless') {
|
|
84
|
+
return {
|
|
85
|
+
template: templateId,
|
|
86
|
+
mode: 'headless',
|
|
87
|
+
externalApiUrl: 'env:API_URL',
|
|
88
|
+
auth: false,
|
|
89
|
+
i18n: null,
|
|
90
|
+
includeExamples: true,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
template: templateId,
|
|
95
|
+
mode: 'full',
|
|
96
|
+
database: 'sqlite',
|
|
97
|
+
auth: false,
|
|
98
|
+
i18n: null,
|
|
99
|
+
includeExamples: true,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pre-built entity templates for common use cases
|
|
3
|
+
* Users can copy-paste these to get started quickly
|
|
4
|
+
*/
|
|
5
|
+
export interface EntityTemplate {
|
|
6
|
+
id: string;
|
|
7
|
+
name: string;
|
|
8
|
+
description: string;
|
|
9
|
+
entities: Array<{
|
|
10
|
+
filename: string;
|
|
11
|
+
code: string;
|
|
12
|
+
}>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* SaaS Multi-Tenant Template
|
|
16
|
+
* Perfect for: Team collaboration apps, project management, SaaS products
|
|
17
|
+
*/
|
|
18
|
+
export declare const saasTemplate: EntityTemplate;
|
|
19
|
+
/**
|
|
20
|
+
* E-commerce Template
|
|
21
|
+
* Perfect for: Online stores, marketplaces, product catalogs
|
|
22
|
+
*/
|
|
23
|
+
export declare const ecommerceTemplate: EntityTemplate;
|
|
24
|
+
/**
|
|
25
|
+
* Blog/CMS Template
|
|
26
|
+
* Perfect for: Blogs, news sites, content platforms
|
|
27
|
+
*/
|
|
28
|
+
export declare const blogTemplate: EntityTemplate;
|
|
29
|
+
/**
|
|
30
|
+
* Task Management Template
|
|
31
|
+
* Perfect for: Todo apps, project management, kanban boards
|
|
32
|
+
*/
|
|
33
|
+
export declare const taskTemplate: EntityTemplate;
|
|
34
|
+
/**
|
|
35
|
+
* All available templates
|
|
36
|
+
*/
|
|
37
|
+
export declare const entityTemplates: EntityTemplate[];
|
|
38
|
+
/**
|
|
39
|
+
* Get template by ID
|
|
40
|
+
*/
|
|
41
|
+
export declare function getEntityTemplate(id: string): EntityTemplate | undefined;
|
|
42
|
+
//# sourceMappingURL=entity-templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-templates.d.ts","sourceRoot":"","sources":["../../../src/init/entity-templates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACpD;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,cAuE1B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,cAoG/B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,cA2E1B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,cA8E1B,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,cAAc,EAK3C,CAAA;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAExE"}
|
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Pre-built entity templates for common use cases
|
|
4
|
+
* Users can copy-paste these to get started quickly
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.entityTemplates = exports.taskTemplate = exports.blogTemplate = exports.ecommerceTemplate = exports.saasTemplate = void 0;
|
|
8
|
+
exports.getEntityTemplate = getEntityTemplate;
|
|
9
|
+
/**
|
|
10
|
+
* SaaS Multi-Tenant Template
|
|
11
|
+
* Perfect for: Team collaboration apps, project management, SaaS products
|
|
12
|
+
*/
|
|
13
|
+
exports.saasTemplate = {
|
|
14
|
+
id: 'saas',
|
|
15
|
+
name: 'SaaS Multi-Tenant',
|
|
16
|
+
description: 'Workspace, Team, Member entities with role-based permissions',
|
|
17
|
+
entities: [
|
|
18
|
+
{
|
|
19
|
+
filename: 'workspace.ts',
|
|
20
|
+
code: `import { defineEntity, text, enumField, hasMany } from 'archetype-engine'
|
|
21
|
+
|
|
22
|
+
export const Workspace = defineEntity('Workspace', {
|
|
23
|
+
fields: {
|
|
24
|
+
name: text().required().min(2).max(100).label('Workspace Name'),
|
|
25
|
+
slug: text().required().unique().regex(/^[a-z0-9-]+$/).label('URL Slug'),
|
|
26
|
+
plan: enumField(['free', 'pro', 'enterprise'] as const).default('free').label('Plan'),
|
|
27
|
+
status: enumField(['active', 'suspended', 'cancelled'] as const).default('active'),
|
|
28
|
+
},
|
|
29
|
+
relations: {
|
|
30
|
+
members: hasMany('Member'),
|
|
31
|
+
teams: hasMany('Team'),
|
|
32
|
+
},
|
|
33
|
+
behaviors: {
|
|
34
|
+
timestamps: true,
|
|
35
|
+
softDelete: true,
|
|
36
|
+
},
|
|
37
|
+
protected: 'all',
|
|
38
|
+
})
|
|
39
|
+
`
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
filename: 'team.ts',
|
|
43
|
+
code: `import { defineEntity, text, hasOne, hasMany } from 'archetype-engine'
|
|
44
|
+
|
|
45
|
+
export const Team = defineEntity('Team', {
|
|
46
|
+
fields: {
|
|
47
|
+
name: text().required().min(2).max(100).label('Team Name'),
|
|
48
|
+
description: text().optional().max(500).label('Description'),
|
|
49
|
+
},
|
|
50
|
+
relations: {
|
|
51
|
+
workspace: hasOne('Workspace'),
|
|
52
|
+
members: hasMany('Member'),
|
|
53
|
+
},
|
|
54
|
+
behaviors: {
|
|
55
|
+
timestamps: true,
|
|
56
|
+
},
|
|
57
|
+
protected: 'write',
|
|
58
|
+
})
|
|
59
|
+
`
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
filename: 'member.ts',
|
|
63
|
+
code: `import { defineEntity, text, enumField, hasOne } from 'archetype-engine'
|
|
64
|
+
|
|
65
|
+
export const Member = defineEntity('Member', {
|
|
66
|
+
fields: {
|
|
67
|
+
email: text().required().email().label('Email'),
|
|
68
|
+
name: text().required().min(2).max(100).label('Name'),
|
|
69
|
+
role: enumField(['owner', 'admin', 'member', 'guest'] as const).default('member').label('Role'),
|
|
70
|
+
status: enumField(['active', 'invited', 'suspended'] as const).default('invited'),
|
|
71
|
+
},
|
|
72
|
+
relations: {
|
|
73
|
+
workspace: hasOne('Workspace'),
|
|
74
|
+
team: hasOne('Team'),
|
|
75
|
+
},
|
|
76
|
+
behaviors: {
|
|
77
|
+
timestamps: true,
|
|
78
|
+
},
|
|
79
|
+
protected: 'all',
|
|
80
|
+
})
|
|
81
|
+
`
|
|
82
|
+
},
|
|
83
|
+
],
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* E-commerce Template
|
|
87
|
+
* Perfect for: Online stores, marketplaces, product catalogs
|
|
88
|
+
*/
|
|
89
|
+
exports.ecommerceTemplate = {
|
|
90
|
+
id: 'ecommerce',
|
|
91
|
+
name: 'E-commerce',
|
|
92
|
+
description: 'Product, Order, Customer entities with inventory tracking',
|
|
93
|
+
entities: [
|
|
94
|
+
{
|
|
95
|
+
filename: 'product.ts',
|
|
96
|
+
code: `import { defineEntity, text, number, boolean, hasMany } from 'archetype-engine'
|
|
97
|
+
|
|
98
|
+
export const Product = defineEntity('Product', {
|
|
99
|
+
fields: {
|
|
100
|
+
sku: text().required().unique().label('SKU'),
|
|
101
|
+
name: text().required().min(1).max(200).label('Product Name'),
|
|
102
|
+
description: text().optional().max(2000).label('Description'),
|
|
103
|
+
price: number().required().positive().label('Price'),
|
|
104
|
+
compareAtPrice: number().optional().positive().label('Compare at Price'),
|
|
105
|
+
stock: number().required().integer().min(0).default(0).label('Stock'),
|
|
106
|
+
isActive: boolean().default(true).label('Active'),
|
|
107
|
+
isFeatured: boolean().default(false).label('Featured'),
|
|
108
|
+
},
|
|
109
|
+
relations: {
|
|
110
|
+
orderItems: hasMany('OrderItem'),
|
|
111
|
+
},
|
|
112
|
+
behaviors: {
|
|
113
|
+
timestamps: true,
|
|
114
|
+
softDelete: true,
|
|
115
|
+
},
|
|
116
|
+
protected: 'write',
|
|
117
|
+
})
|
|
118
|
+
`
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
filename: 'customer.ts',
|
|
122
|
+
code: `import { defineEntity, text, hasMany } from 'archetype-engine'
|
|
123
|
+
|
|
124
|
+
export const Customer = defineEntity('Customer', {
|
|
125
|
+
fields: {
|
|
126
|
+
email: text().required().email().unique().label('Email'),
|
|
127
|
+
firstName: text().required().min(1).max(100).label('First Name'),
|
|
128
|
+
lastName: text().required().min(1).max(100).label('Last Name'),
|
|
129
|
+
phone: text().optional().label('Phone'),
|
|
130
|
+
},
|
|
131
|
+
relations: {
|
|
132
|
+
orders: hasMany('Order'),
|
|
133
|
+
},
|
|
134
|
+
behaviors: {
|
|
135
|
+
timestamps: true,
|
|
136
|
+
},
|
|
137
|
+
protected: 'all',
|
|
138
|
+
})
|
|
139
|
+
`
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
filename: 'order.ts',
|
|
143
|
+
code: `import { defineEntity, text, number, enumField, hasOne, hasMany } from 'archetype-engine'
|
|
144
|
+
|
|
145
|
+
export const Order = defineEntity('Order', {
|
|
146
|
+
fields: {
|
|
147
|
+
orderNumber: text().required().unique().label('Order Number'),
|
|
148
|
+
status: enumField(['pending', 'paid', 'processing', 'shipped', 'delivered', 'cancelled'] as const)
|
|
149
|
+
.default('pending')
|
|
150
|
+
.label('Status'),
|
|
151
|
+
subtotal: number().required().positive().label('Subtotal'),
|
|
152
|
+
tax: number().required().min(0).default(0).label('Tax'),
|
|
153
|
+
shipping: number().required().min(0).default(0).label('Shipping'),
|
|
154
|
+
total: number().required().positive().label('Total'),
|
|
155
|
+
},
|
|
156
|
+
relations: {
|
|
157
|
+
customer: hasOne('Customer'),
|
|
158
|
+
items: hasMany('OrderItem'),
|
|
159
|
+
},
|
|
160
|
+
behaviors: {
|
|
161
|
+
timestamps: true,
|
|
162
|
+
},
|
|
163
|
+
protected: 'all',
|
|
164
|
+
})
|
|
165
|
+
`
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
filename: 'order-item.ts',
|
|
169
|
+
code: `import { defineEntity, number, hasOne } from 'archetype-engine'
|
|
170
|
+
|
|
171
|
+
export const OrderItem = defineEntity('OrderItem', {
|
|
172
|
+
fields: {
|
|
173
|
+
quantity: number().required().integer().min(1).label('Quantity'),
|
|
174
|
+
unitPrice: number().required().positive().label('Unit Price'),
|
|
175
|
+
total: number().required().positive().label('Total'),
|
|
176
|
+
},
|
|
177
|
+
relations: {
|
|
178
|
+
order: hasOne('Order'),
|
|
179
|
+
product: hasOne('Product'),
|
|
180
|
+
},
|
|
181
|
+
behaviors: {
|
|
182
|
+
timestamps: true,
|
|
183
|
+
},
|
|
184
|
+
protected: 'all',
|
|
185
|
+
})
|
|
186
|
+
`
|
|
187
|
+
},
|
|
188
|
+
],
|
|
189
|
+
};
|
|
190
|
+
/**
|
|
191
|
+
* Blog/CMS Template
|
|
192
|
+
* Perfect for: Blogs, news sites, content platforms
|
|
193
|
+
*/
|
|
194
|
+
exports.blogTemplate = {
|
|
195
|
+
id: 'blog',
|
|
196
|
+
name: 'Blog/CMS',
|
|
197
|
+
description: 'Post, Author, Comment entities for content management',
|
|
198
|
+
entities: [
|
|
199
|
+
{
|
|
200
|
+
filename: 'author.ts',
|
|
201
|
+
code: `import { defineEntity, text, hasMany } from 'archetype-engine'
|
|
202
|
+
|
|
203
|
+
export const Author = defineEntity('Author', {
|
|
204
|
+
fields: {
|
|
205
|
+
email: text().required().email().unique().label('Email'),
|
|
206
|
+
name: text().required().min(2).max(100).label('Name'),
|
|
207
|
+
bio: text().optional().max(500).label('Bio'),
|
|
208
|
+
avatar: text().optional().url().label('Avatar URL'),
|
|
209
|
+
},
|
|
210
|
+
relations: {
|
|
211
|
+
posts: hasMany('Post'),
|
|
212
|
+
},
|
|
213
|
+
behaviors: {
|
|
214
|
+
timestamps: true,
|
|
215
|
+
},
|
|
216
|
+
protected: 'write',
|
|
217
|
+
})
|
|
218
|
+
`
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
filename: 'post.ts',
|
|
222
|
+
code: `import { defineEntity, text, boolean, date, enumField, hasOne, hasMany } from 'archetype-engine'
|
|
223
|
+
|
|
224
|
+
export const Post = defineEntity('Post', {
|
|
225
|
+
fields: {
|
|
226
|
+
title: text().required().min(1).max(200).label('Title'),
|
|
227
|
+
slug: text().required().unique().regex(/^[a-z0-9-]+$/).label('URL Slug'),
|
|
228
|
+
excerpt: text().optional().max(500).label('Excerpt'),
|
|
229
|
+
content: text().required().label('Content'),
|
|
230
|
+
status: enumField(['draft', 'published', 'archived'] as const).default('draft').label('Status'),
|
|
231
|
+
publishedAt: date().optional().label('Published Date'),
|
|
232
|
+
featured: boolean().default(false).label('Featured'),
|
|
233
|
+
},
|
|
234
|
+
relations: {
|
|
235
|
+
author: hasOne('Author'),
|
|
236
|
+
comments: hasMany('Comment'),
|
|
237
|
+
},
|
|
238
|
+
behaviors: {
|
|
239
|
+
timestamps: true,
|
|
240
|
+
softDelete: true,
|
|
241
|
+
},
|
|
242
|
+
protected: 'write',
|
|
243
|
+
})
|
|
244
|
+
`
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
filename: 'comment.ts',
|
|
248
|
+
code: `import { defineEntity, text, boolean, hasOne } from 'archetype-engine'
|
|
249
|
+
|
|
250
|
+
export const Comment = defineEntity('Comment', {
|
|
251
|
+
fields: {
|
|
252
|
+
content: text().required().min(1).max(2000).label('Comment'),
|
|
253
|
+
authorName: text().required().min(2).max(100).label('Name'),
|
|
254
|
+
authorEmail: text().required().email().label('Email'),
|
|
255
|
+
isApproved: boolean().default(false).label('Approved'),
|
|
256
|
+
},
|
|
257
|
+
relations: {
|
|
258
|
+
post: hasOne('Post'),
|
|
259
|
+
},
|
|
260
|
+
behaviors: {
|
|
261
|
+
timestamps: true,
|
|
262
|
+
softDelete: true,
|
|
263
|
+
},
|
|
264
|
+
protected: 'write',
|
|
265
|
+
})
|
|
266
|
+
`
|
|
267
|
+
},
|
|
268
|
+
],
|
|
269
|
+
};
|
|
270
|
+
/**
|
|
271
|
+
* Task Management Template
|
|
272
|
+
* Perfect for: Todo apps, project management, kanban boards
|
|
273
|
+
*/
|
|
274
|
+
exports.taskTemplate = {
|
|
275
|
+
id: 'task',
|
|
276
|
+
name: 'Task Management',
|
|
277
|
+
description: 'Project, Task, Label entities for productivity apps',
|
|
278
|
+
entities: [
|
|
279
|
+
{
|
|
280
|
+
filename: 'project.ts',
|
|
281
|
+
code: `import { defineEntity, text, enumField, hasMany } from 'archetype-engine'
|
|
282
|
+
|
|
283
|
+
export const Project = defineEntity('Project', {
|
|
284
|
+
fields: {
|
|
285
|
+
name: text().required().min(2).max(100).label('Project Name'),
|
|
286
|
+
description: text().optional().max(500).label('Description'),
|
|
287
|
+
status: enumField(['active', 'on-hold', 'completed', 'archived'] as const)
|
|
288
|
+
.default('active')
|
|
289
|
+
.label('Status'),
|
|
290
|
+
color: text().optional().regex(/^#[0-9A-Fa-f]{6}$/).label('Color'),
|
|
291
|
+
},
|
|
292
|
+
relations: {
|
|
293
|
+
tasks: hasMany('Task'),
|
|
294
|
+
},
|
|
295
|
+
behaviors: {
|
|
296
|
+
timestamps: true,
|
|
297
|
+
softDelete: true,
|
|
298
|
+
},
|
|
299
|
+
protected: 'write',
|
|
300
|
+
})
|
|
301
|
+
`
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
filename: 'task.ts',
|
|
305
|
+
code: `import { defineEntity, text, boolean, date, enumField, hasOne, belongsToMany } from 'archetype-engine'
|
|
306
|
+
|
|
307
|
+
export const Task = defineEntity('Task', {
|
|
308
|
+
fields: {
|
|
309
|
+
title: text().required().min(1).max(200).label('Title'),
|
|
310
|
+
description: text().optional().max(2000).label('Description'),
|
|
311
|
+
status: enumField(['todo', 'in-progress', 'review', 'done'] as const)
|
|
312
|
+
.default('todo')
|
|
313
|
+
.label('Status'),
|
|
314
|
+
priority: enumField(['low', 'medium', 'high', 'urgent'] as const)
|
|
315
|
+
.default('medium')
|
|
316
|
+
.label('Priority'),
|
|
317
|
+
completed: boolean().default(false).label('Completed'),
|
|
318
|
+
dueDate: date().optional().label('Due Date'),
|
|
319
|
+
},
|
|
320
|
+
relations: {
|
|
321
|
+
project: hasOne('Project'),
|
|
322
|
+
labels: belongsToMany('Label'),
|
|
323
|
+
},
|
|
324
|
+
behaviors: {
|
|
325
|
+
timestamps: true,
|
|
326
|
+
softDelete: true,
|
|
327
|
+
},
|
|
328
|
+
protected: 'write',
|
|
329
|
+
})
|
|
330
|
+
`
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
filename: 'label.ts',
|
|
334
|
+
code: `import { defineEntity, text, belongsToMany } from 'archetype-engine'
|
|
335
|
+
|
|
336
|
+
export const Label = defineEntity('Label', {
|
|
337
|
+
fields: {
|
|
338
|
+
name: text().required().min(1).max(50).label('Label Name'),
|
|
339
|
+
color: text().optional().regex(/^#[0-9A-Fa-f]{6}$/).label('Color'),
|
|
340
|
+
},
|
|
341
|
+
relations: {
|
|
342
|
+
tasks: belongsToMany('Task'),
|
|
343
|
+
},
|
|
344
|
+
behaviors: {
|
|
345
|
+
timestamps: true,
|
|
346
|
+
},
|
|
347
|
+
protected: 'write',
|
|
348
|
+
})
|
|
349
|
+
`
|
|
350
|
+
},
|
|
351
|
+
],
|
|
352
|
+
};
|
|
353
|
+
/**
|
|
354
|
+
* All available templates
|
|
355
|
+
*/
|
|
356
|
+
exports.entityTemplates = [
|
|
357
|
+
exports.saasTemplate,
|
|
358
|
+
exports.ecommerceTemplate,
|
|
359
|
+
exports.blogTemplate,
|
|
360
|
+
exports.taskTemplate,
|
|
361
|
+
];
|
|
362
|
+
/**
|
|
363
|
+
* Get template by ID
|
|
364
|
+
*/
|
|
365
|
+
function getEntityTemplate(id) {
|
|
366
|
+
return exports.entityTemplates.find(t => t.id === id);
|
|
367
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface InitOptions {
|
|
2
|
+
yes?: boolean;
|
|
3
|
+
headless?: boolean;
|
|
4
|
+
template?: string;
|
|
5
|
+
directory?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function init(options?: InitOptions): Promise<void>;
|
|
8
|
+
export { getRecommendedConfig } from './dependencies';
|
|
9
|
+
export type { InitConfig } from './dependencies';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/init/index.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAsB,IAAI,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4DnE;AAwLD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AACrD,YAAY,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA"}
|