create-prenta 1.3.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 (49) hide show
  1. package/CHANGELOG.md +964 -0
  2. package/LICENSE +21 -0
  3. package/assets/prisma/migrations/0001_init/migration.sql +941 -0
  4. package/assets/prisma/migrations/0002_media_usage_field_path/migration.sql +11 -0
  5. package/assets/prisma/migrations/0003_ai_crawler_hits/migration.sql +21 -0
  6. package/assets/prisma/migrations/0004_drop_search_vector/migration.sql +4 -0
  7. package/assets/prisma/migrations/0005_script_tag_delivery_controls/migration.sql +8 -0
  8. package/assets/prisma/migrations/0006_totp_last_step/migration.sql +4 -0
  9. package/assets/prisma/migrations/0007_workflow_fk_drop_dead_enums/migration.sql +27 -0
  10. package/assets/prisma/migrations/0008_form_delivery_attempts/migration.sql +29 -0
  11. package/assets/prisma/migrations/0009_webhook_secret_rotation/migration.sql +6 -0
  12. package/assets/prisma/migrations/0010_media_is_decorative/migration.sql +3 -0
  13. package/assets/prisma/migrations/0011_media_content_hash/migration.sql +4 -0
  14. package/assets/prisma/migrations/0012_rename_to_prenta/migration.sql +89 -0
  15. package/assets/prisma/migrations/migration_lock.toml +3 -0
  16. package/assets/prisma/schema.prisma +989 -0
  17. package/dist/index.d.ts +3 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +182 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/options.d.ts +160 -0
  22. package/dist/options.d.ts.map +1 -0
  23. package/dist/options.js +206 -0
  24. package/dist/options.js.map +1 -0
  25. package/dist/scaffold.d.ts +45 -0
  26. package/dist/scaffold.d.ts.map +1 -0
  27. package/dist/scaffold.js +2163 -0
  28. package/dist/scaffold.js.map +1 -0
  29. package/dist/templates/admin-page.ts.template.d.ts +24 -0
  30. package/dist/templates/admin-page.ts.template.d.ts.map +1 -0
  31. package/dist/templates/admin-page.ts.template.js +145 -0
  32. package/dist/templates/admin-page.ts.template.js.map +1 -0
  33. package/dist/templates/astro-site.d.ts +36 -0
  34. package/dist/templates/astro-site.d.ts.map +1 -0
  35. package/dist/templates/astro-site.js +918 -0
  36. package/dist/templates/astro-site.js.map +1 -0
  37. package/dist/templates/login-page.ts.template.d.ts +14 -0
  38. package/dist/templates/login-page.ts.template.d.ts.map +1 -0
  39. package/dist/templates/login-page.ts.template.js +143 -0
  40. package/dist/templates/login-page.ts.template.js.map +1 -0
  41. package/dist/templates/marketing-custom.d.ts +56 -0
  42. package/dist/templates/marketing-custom.d.ts.map +1 -0
  43. package/dist/templates/marketing-custom.js +814 -0
  44. package/dist/templates/marketing-custom.js.map +1 -0
  45. package/dist/templates/prenta.config.ts.template.d.ts +3 -0
  46. package/dist/templates/prenta.config.ts.template.d.ts.map +1 -0
  47. package/dist/templates/prenta.config.ts.template.js +253 -0
  48. package/dist/templates/prenta.config.ts.template.js.map +1 -0
  49. package/package.json +58 -0
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,182 @@
1
+ #!/usr/bin/env node
2
+ import { readFile } from 'node:fs/promises';
3
+ import { fileURLToPath } from 'node:url';
4
+ import path from 'node:path';
5
+ import { Command } from 'commander';
6
+ import chalk from 'chalk';
7
+ import prompts from 'prompts';
8
+ import { scaffoldProject } from './scaffold.js';
9
+ import { AUTH_CHOICES, DATABASE_CHOICES, DEFAULT_PRODUCTION_PLUGINS, DEFAULTS, FRAMEWORK_CHOICES, PLATFORM_CHOICES, PLUGIN_CHOICES, TEMPLATE_CHOICES, parseFlagOverrides, resolveNonInteractiveOptions, } from './options.js';
10
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
11
+ async function readPackageVersion() {
12
+ try {
13
+ const pkgPath = path.resolve(__dirname, '..', 'package.json');
14
+ const raw = await readFile(pkgPath, 'utf-8');
15
+ return JSON.parse(raw).version;
16
+ }
17
+ catch {
18
+ return '0.0.0';
19
+ }
20
+ }
21
+ const PLUGINS = PLUGIN_CHOICES;
22
+ const PLATFORMS = PLATFORM_CHOICES;
23
+ const DATABASES = DATABASE_CHOICES;
24
+ const AUTH_PROVIDERS = AUTH_CHOICES;
25
+ const TEMPLATES = TEMPLATE_CHOICES;
26
+ const FRAMEWORKS = FRAMEWORK_CHOICES;
27
+ async function run() {
28
+ const program = new Command();
29
+ const version = await readPackageVersion();
30
+ program
31
+ .name('create-prenta')
32
+ .description('Scaffold a new Prenta CMS project')
33
+ .version(version)
34
+ .argument('[project-name]', 'Name for the new project')
35
+ .option('-y, --yes', 'Skip all prompts; use flags + defaults (non-interactive)')
36
+ .option('--admin-path <path>', 'Admin panel path (e.g. /admin)')
37
+ .option('--login-path <path>', 'Login/setup path (e.g. /securelogin); set equal to --admin-path for inline login')
38
+ .option('--template <name>', `Starter template (${TEMPLATES.map((t) => t.value).join('|')})`)
39
+ .option('--framework <name>', `Public delivery (${FRAMEWORKS.map((f) => f.value).join('|')}; default astro-split)`)
40
+ .option('--plugins <list>', 'Comma-separated plugins, or "all" / "none"')
41
+ .option('--platform <name>', `Deployment platform (${PLATFORMS.map((p) => p.value).join('|')})`)
42
+ .option('--database <name>', `Database provider (${DATABASES.map((d) => d.value).join('|')})`)
43
+ .option('--auth <list>', `Comma-separated auth providers (${AUTH_PROVIDERS.map((a) => a.value).join(',')})`)
44
+ .action(async (nameArg, opts) => {
45
+ console.log();
46
+ console.log(chalk.bold(' Prenta CMS'));
47
+ console.log(chalk.dim(' The developer-first headless CMS'));
48
+ console.log();
49
+ const flags = {
50
+ yes: opts.yes === true,
51
+ adminPath: opts.adminPath,
52
+ loginPath: opts.loginPath,
53
+ plugins: opts.plugins,
54
+ platform: opts.platform,
55
+ database: opts.database,
56
+ auth: opts.auth,
57
+ template: opts.template,
58
+ framework: opts.framework,
59
+ };
60
+ // Non-interactive when the agent asked for it (`--yes`) or when there is no
61
+ // TTY to prompt against (CI / piped stdin). Prompting in those contexts
62
+ // would hang, which is the exact failure D1 fixes.
63
+ const nonInteractive = flags.yes === true || !process.stdin.isTTY;
64
+ if (nonInteractive) {
65
+ let options;
66
+ try {
67
+ options = resolveNonInteractiveOptions(nameArg, flags);
68
+ }
69
+ catch (err) {
70
+ console.error(chalk.red(err instanceof Error ? err.message : String(err)));
71
+ process.exit(1);
72
+ }
73
+ await scaffoldProject(options);
74
+ return;
75
+ }
76
+ // Interactive: validate any flags up front (fail fast, before prompting),
77
+ // then prompt only for the choices the caller did not pre-supply.
78
+ let overrides;
79
+ try {
80
+ overrides = parseFlagOverrides(flags);
81
+ }
82
+ catch (err) {
83
+ console.error(chalk.red(err instanceof Error ? err.message : String(err)));
84
+ process.exit(1);
85
+ }
86
+ const onCancel = () => {
87
+ console.log(chalk.red('\nSetup cancelled.'));
88
+ process.exit(1);
89
+ };
90
+ const answers = await prompts([
91
+ {
92
+ type: nameArg ? null : 'text',
93
+ name: 'projectName',
94
+ message: 'Project name',
95
+ initial: DEFAULTS.projectName,
96
+ validate: (v) => /^[a-z0-9_-]+$/i.test(v) || 'Only alphanumeric characters, hyphens, and underscores',
97
+ },
98
+ {
99
+ type: overrides.adminPath ? null : 'text',
100
+ name: 'adminPath',
101
+ message: 'Admin panel path (where the signed-in admin app lives)',
102
+ initial: DEFAULTS.adminPath,
103
+ validate: (v) => (v.startsWith('/') && /^\/[a-z0-9_-]+$/i.test(v)) ||
104
+ 'Must start with / and use URL-safe characters',
105
+ },
106
+ {
107
+ type: overrides.loginPath ? null : 'text',
108
+ name: 'loginPath',
109
+ message: 'Login path (login + setup wizard; same as admin path for inline login)',
110
+ initial: DEFAULTS.loginPath,
111
+ validate: (v) => (v.startsWith('/') && /^\/[a-z0-9_-]+$/i.test(v)) ||
112
+ 'Must start with / and use URL-safe characters',
113
+ },
114
+ {
115
+ type: overrides.template ? null : 'select',
116
+ name: 'template',
117
+ message: 'Starter template',
118
+ choices: [...TEMPLATES],
119
+ // Standard = designed sections (schema + shared admin/public renderers)
120
+ initial: 0,
121
+ },
122
+ {
123
+ type: overrides.framework ? null : 'select',
124
+ name: 'framework',
125
+ message: 'Public site framework',
126
+ choices: [...FRAMEWORKS],
127
+ // astro-split (workspace) is the blessed default; Next monolith is
128
+ // the explicit escape hatch.
129
+ initial: 0,
130
+ },
131
+ {
132
+ type: overrides.plugins ? null : 'multiselect',
133
+ name: 'plugins',
134
+ message: 'Which plugins would you like to include?',
135
+ choices: PLUGINS.map((choice) => ({
136
+ ...choice,
137
+ selected: DEFAULT_PRODUCTION_PLUGINS.includes(choice.value),
138
+ })),
139
+ hint: 'Space to select, Enter to confirm',
140
+ },
141
+ {
142
+ type: overrides.platform ? null : 'select',
143
+ name: 'platform',
144
+ message: 'Deployment platform',
145
+ choices: [...PLATFORMS],
146
+ },
147
+ {
148
+ type: overrides.database ? null : 'select',
149
+ name: 'database',
150
+ message: 'Database provider',
151
+ choices: [...DATABASES],
152
+ },
153
+ {
154
+ type: overrides.authProviders ? null : 'multiselect',
155
+ name: 'authProviders',
156
+ message: 'Authentication providers',
157
+ choices: [...AUTH_PROVIDERS],
158
+ hint: 'Space to select, Enter to confirm',
159
+ min: 1,
160
+ },
161
+ ], { onCancel });
162
+ const options = {
163
+ projectName: nameArg ?? answers.projectName,
164
+ adminPath: overrides.adminPath ?? (answers.adminPath || DEFAULTS.adminPath),
165
+ loginPath: overrides.loginPath ?? (answers.loginPath || DEFAULTS.loginPath),
166
+ plugins: overrides.plugins ?? answers.plugins,
167
+ platform: overrides.platform ?? answers.platform,
168
+ database: overrides.database ?? answers.database,
169
+ authProviders: overrides.authProviders ?? answers.authProviders,
170
+ template: overrides.template ?? (answers.template || DEFAULTS.template),
171
+ framework: overrides.framework ??
172
+ (answers.framework || DEFAULTS.framework),
173
+ };
174
+ await scaffoldProject(options);
175
+ });
176
+ program.parse();
177
+ }
178
+ run().catch((err) => {
179
+ console.error(chalk.red('Fatal error:'), err);
180
+ process.exit(1);
181
+ });
182
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,160 @@
1
+ import type { ProjectOptions } from './scaffold.js';
2
+ export declare const PLUGIN_CHOICES: readonly [{
3
+ readonly title: "SEO";
4
+ readonly value: "seo";
5
+ }, {
6
+ readonly title: "Blocks";
7
+ readonly value: "blocks";
8
+ }, {
9
+ readonly title: "Forms";
10
+ readonly value: "forms";
11
+ }, {
12
+ readonly title: "Email";
13
+ readonly value: "email";
14
+ }, {
15
+ readonly title: "Media";
16
+ readonly value: "media";
17
+ }, {
18
+ readonly title: "Redirects";
19
+ readonly value: "redirects";
20
+ }, {
21
+ readonly title: "Navigation";
22
+ readonly value: "navigation";
23
+ }, {
24
+ readonly title: "Commerce";
25
+ readonly value: "commerce";
26
+ }, {
27
+ readonly title: "AI";
28
+ readonly value: "ai";
29
+ }, {
30
+ readonly title: "Consent & analytics";
31
+ readonly value: "consent";
32
+ }];
33
+ export declare const PLATFORM_CHOICES: readonly [{
34
+ readonly title: "Vercel";
35
+ readonly value: "vercel";
36
+ }, {
37
+ readonly title: "AWS";
38
+ readonly value: "aws";
39
+ }];
40
+ export declare const DATABASE_CHOICES: readonly [{
41
+ readonly title: "Prisma Postgres";
42
+ readonly value: "prisma-postgres";
43
+ }, {
44
+ readonly title: "Neon";
45
+ readonly value: "neon";
46
+ }, {
47
+ readonly title: "Supabase";
48
+ readonly value: "supabase";
49
+ }, {
50
+ readonly title: "Custom PostgreSQL URL";
51
+ readonly value: "custom";
52
+ }];
53
+ export declare const AUTH_CHOICES: readonly [{
54
+ readonly title: "Google";
55
+ readonly value: "google";
56
+ }, {
57
+ readonly title: "GitHub";
58
+ readonly value: "github";
59
+ }, {
60
+ readonly title: "Microsoft";
61
+ readonly value: "microsoft";
62
+ }, {
63
+ readonly title: "Credentials only";
64
+ readonly value: "credentials";
65
+ }];
66
+ /**
67
+ * Starter templates. `marketing-custom` is the **standard** scaffold for
68
+ * designed frontends: schema (`sections.types`) + one shared renderer map for
69
+ * public `<Sections>` and `<AdminRoot sectionRenderers>` + seed + verify.
70
+ * `default` is a minimal built-ins-only kit (no custom section wiring).
71
+ *
72
+ * @see apps/docs/content/designed-frontend-best-practices.md
73
+ */
74
+ export declare const TEMPLATE_CHOICES: readonly [{
75
+ readonly title: "Standard (designed sections)";
76
+ readonly value: "marketing-custom";
77
+ }, {
78
+ readonly title: "Minimal (built-in sections only)";
79
+ readonly value: "default";
80
+ }];
81
+ /**
82
+ * Public delivery framework. `astro-split` is the **default** blessed path:
83
+ * a pnpm workspace with the Next CMS host in `apps/cms`, the Astro public
84
+ * site in `apps/site`, and (marketing-custom) the shared section kit in
85
+ * `packages/sections`.
86
+ * - `astro-split` = pnpm workspace: Astro public site + Next CMS host (default)
87
+ * - `next` = monolith (site + admin + API in one Next app) — explicit escape hatch
88
+ * - `astro-site` = Astro public site only (existing CMS host; also via `create-prenta-astro`)
89
+ */
90
+ export declare const FRAMEWORK_CHOICES: readonly [{
91
+ readonly title: "Astro public site + Next CMS host (recommended)";
92
+ readonly value: "astro-split";
93
+ }, {
94
+ readonly title: "Next.js (monolith)";
95
+ readonly value: "next";
96
+ }, {
97
+ readonly title: "Astro public site only (existing CMS)";
98
+ readonly value: "astro-site";
99
+ }];
100
+ export declare const PLUGIN_VALUES: ("seo" | "blocks" | "forms" | "email" | "media" | "redirects" | "navigation" | "commerce" | "ai" | "consent")[];
101
+ export declare const PLATFORM_VALUES: ("vercel" | "aws")[];
102
+ export declare const DATABASE_VALUES: ("prisma-postgres" | "neon" | "supabase" | "custom")[];
103
+ export declare const AUTH_VALUES: ("google" | "github" | "microsoft" | "credentials")[];
104
+ export declare const TEMPLATE_VALUES: ("marketing-custom" | "default")[];
105
+ export declare const FRAMEWORK_VALUES: ("next" | "astro-split" | "astro-site")[];
106
+ export declare const DEFAULT_PRODUCTION_PLUGINS: readonly ["seo", "forms", "redirects", "media", "email"];
107
+ /** Defaults applied for any choice the agent did not pass as a flag. */
108
+ export declare const DEFAULTS: {
109
+ readonly projectName: "my-prenta-app";
110
+ readonly adminPath: "/admin";
111
+ readonly loginPath: "/securelogin";
112
+ readonly platform: "vercel";
113
+ readonly database: "prisma-postgres";
114
+ readonly authProviders: readonly ["credentials"];
115
+ /** Designed-frontend contract: schema + shared admin/public renderers. */
116
+ readonly template: "marketing-custom";
117
+ /**
118
+ * astro-split (workspace) is the blessed default for public delivery —
119
+ * fastest public HTML + purge-on-publish freshness. Pass `--framework next`
120
+ * for the classic monolith.
121
+ */
122
+ readonly framework: "astro-split";
123
+ };
124
+ /** Raw flag bag mirroring the commander options. All optional. */
125
+ export interface CliFlags {
126
+ yes?: boolean;
127
+ adminPath?: string;
128
+ loginPath?: string;
129
+ plugins?: string;
130
+ platform?: string;
131
+ database?: string;
132
+ auth?: string;
133
+ template?: string;
134
+ framework?: string;
135
+ }
136
+ export declare function validateProjectName(name: string): string;
137
+ export declare function validateAdminPath(adminPath: string): string;
138
+ /** Validate a single choice value against an allow-list (case-insensitive). */
139
+ export declare function validateChoice(value: string, allowed: readonly string[], label: string): string;
140
+ /**
141
+ * Parse a comma-separated multi-select flag (e.g. plugins/auth) into a validated
142
+ * list. Supports the keywords `all` and `none` when enabled. Throws on any
143
+ * unknown token so an agent gets an actionable error instead of a silent drop.
144
+ */
145
+ export declare function parseSelection(raw: string, allowed: readonly string[], label: string, opts?: {
146
+ allowAll?: boolean;
147
+ allowNone?: boolean;
148
+ }): string[];
149
+ /**
150
+ * Validate only the flags the caller actually passed, returning a partial
151
+ * `ProjectOptions`. Used by both the non-interactive resolver and the
152
+ * interactive flow (to skip prompts for pre-supplied answers).
153
+ */
154
+ export declare function parseFlagOverrides(flags: CliFlags): Partial<ProjectOptions>;
155
+ /**
156
+ * Resolve a complete `ProjectOptions` with no prompting. Missing choices fall
157
+ * back to {@link DEFAULTS}. Throws (with an actionable message) on invalid input.
158
+ */
159
+ export declare function resolveNonInteractiveOptions(nameArg: string | undefined, flags: CliFlags): ProjectOptions;
160
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAEnD,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWjB,CAAA;AAEV,eAAO,MAAM,gBAAgB;;;;;;EAGnB,CAAA;AAEV,eAAO,MAAM,gBAAgB;;;;;;;;;;;;EAKnB,CAAA;AAEV,eAAO,MAAM,YAAY;;;;;;;;;;;;EAKf,CAAA;AAEV;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB;;;;;;EASnB,CAAA;AAEV;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;EAIpB,CAAA;AAEV,eAAO,MAAM,aAAa,iHAAqC,CAAA;AAC/D,eAAO,MAAM,eAAe,sBAAuC,CAAA;AACnE,eAAO,MAAM,eAAe,wDAAuC,CAAA;AACnE,eAAO,MAAM,WAAW,uDAAmC,CAAA;AAC3D,eAAO,MAAM,eAAe,oCAAuC,CAAA;AACnE,eAAO,MAAM,gBAAgB,2CAAwC,CAAA;AAErE,eAAO,MAAM,0BAA0B,0DAA2D,CAAA;AAElG,wEAAwE;AACxE,eAAO,MAAM,QAAQ;;;;;;;IAWnB,0EAA0E;;IAE1E;;;;OAIG;;CAEK,CAAA;AAEV,kEAAkE;AAClE,MAAM,WAAW,QAAQ;IACvB,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAKD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQxD;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAQ3D;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAM/F;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,KAAK,EAAE,MAAM,EACb,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GACrD,MAAM,EAAE,CAyBV;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,cAAc,CAAC,CA0C3E;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,KAAK,EAAE,QAAQ,GACd,cAAc,CAahB"}
@@ -0,0 +1,206 @@
1
+ // Non-interactive option resolution for the scaffolder.
2
+ //
3
+ // `index.ts` runs an interactive `prompts` flow by default, but an AI agent (or
4
+ // CI) needs to scaffold headlessly. These pure helpers turn CLI flags into a
5
+ // validated `ProjectOptions`, with clear errors instead of hanging on a prompt.
6
+ // Kept side-effect free so they can be unit-tested without spawning the CLI.
7
+ export const PLUGIN_CHOICES = [
8
+ { title: 'SEO', value: 'seo' },
9
+ { title: 'Blocks', value: 'blocks' },
10
+ { title: 'Forms', value: 'forms' },
11
+ { title: 'Email', value: 'email' },
12
+ { title: 'Media', value: 'media' },
13
+ { title: 'Redirects', value: 'redirects' },
14
+ { title: 'Navigation', value: 'navigation' },
15
+ { title: 'Commerce', value: 'commerce' },
16
+ { title: 'AI', value: 'ai' },
17
+ { title: 'Consent & analytics', value: 'consent' },
18
+ ];
19
+ export const PLATFORM_CHOICES = [
20
+ { title: 'Vercel', value: 'vercel' },
21
+ { title: 'AWS', value: 'aws' },
22
+ ];
23
+ export const DATABASE_CHOICES = [
24
+ { title: 'Prisma Postgres', value: 'prisma-postgres' },
25
+ { title: 'Neon', value: 'neon' },
26
+ { title: 'Supabase', value: 'supabase' },
27
+ { title: 'Custom PostgreSQL URL', value: 'custom' },
28
+ ];
29
+ export const AUTH_CHOICES = [
30
+ { title: 'Google', value: 'google' },
31
+ { title: 'GitHub', value: 'github' },
32
+ { title: 'Microsoft', value: 'microsoft' },
33
+ { title: 'Credentials only', value: 'credentials' },
34
+ ];
35
+ /**
36
+ * Starter templates. `marketing-custom` is the **standard** scaffold for
37
+ * designed frontends: schema (`sections.types`) + one shared renderer map for
38
+ * public `<Sections>` and `<AdminRoot sectionRenderers>` + seed + verify.
39
+ * `default` is a minimal built-ins-only kit (no custom section wiring).
40
+ *
41
+ * @see apps/docs/content/designed-frontend-best-practices.md
42
+ */
43
+ export const TEMPLATE_CHOICES = [
44
+ {
45
+ title: 'Standard (designed sections)',
46
+ value: 'marketing-custom',
47
+ },
48
+ {
49
+ title: 'Minimal (built-in sections only)',
50
+ value: 'default',
51
+ },
52
+ ];
53
+ /**
54
+ * Public delivery framework. `astro-split` is the **default** blessed path:
55
+ * a pnpm workspace with the Next CMS host in `apps/cms`, the Astro public
56
+ * site in `apps/site`, and (marketing-custom) the shared section kit in
57
+ * `packages/sections`.
58
+ * - `astro-split` = pnpm workspace: Astro public site + Next CMS host (default)
59
+ * - `next` = monolith (site + admin + API in one Next app) — explicit escape hatch
60
+ * - `astro-site` = Astro public site only (existing CMS host; also via `create-prenta-astro`)
61
+ */
62
+ export const FRAMEWORK_CHOICES = [
63
+ { title: 'Astro public site + Next CMS host (recommended)', value: 'astro-split' },
64
+ { title: 'Next.js (monolith)', value: 'next' },
65
+ { title: 'Astro public site only (existing CMS)', value: 'astro-site' },
66
+ ];
67
+ export const PLUGIN_VALUES = PLUGIN_CHOICES.map((c) => c.value);
68
+ export const PLATFORM_VALUES = PLATFORM_CHOICES.map((c) => c.value);
69
+ export const DATABASE_VALUES = DATABASE_CHOICES.map((c) => c.value);
70
+ export const AUTH_VALUES = AUTH_CHOICES.map((c) => c.value);
71
+ export const TEMPLATE_VALUES = TEMPLATE_CHOICES.map((c) => c.value);
72
+ export const FRAMEWORK_VALUES = FRAMEWORK_CHOICES.map((c) => c.value);
73
+ export const DEFAULT_PRODUCTION_PLUGINS = ['seo', 'forms', 'redirects', 'media', 'email'];
74
+ /** Defaults applied for any choice the agent did not pass as a flag. */
75
+ export const DEFAULTS = {
76
+ projectName: 'my-prenta-app',
77
+ adminPath: '/admin',
78
+ // Split-login by default: auth screens (login, setup wizard, password
79
+ // reset) live on their own non-obvious mount, and the admin mount renders
80
+ // a 404 lookalike for signed-out visitors. Pass --login-path equal to
81
+ // --admin-path to keep the classic inline login.
82
+ loginPath: '/securelogin',
83
+ platform: 'vercel',
84
+ database: 'prisma-postgres',
85
+ authProviders: ['credentials'],
86
+ /** Designed-frontend contract: schema + shared admin/public renderers. */
87
+ template: 'marketing-custom',
88
+ /**
89
+ * astro-split (workspace) is the blessed default for public delivery —
90
+ * fastest public HTML + purge-on-publish freshness. Pass `--framework next`
91
+ * for the classic monolith.
92
+ */
93
+ framework: 'astro-split',
94
+ };
95
+ const PROJECT_NAME_RE = /^[a-z0-9_-]+$/i;
96
+ const ADMIN_PATH_RE = /^\/[a-z0-9_-]+$/i;
97
+ export function validateProjectName(name) {
98
+ const trimmed = name.trim();
99
+ if (!PROJECT_NAME_RE.test(trimmed)) {
100
+ throw new Error(`Invalid project name "${name}". Use only letters, numbers, hyphens, and underscores.`);
101
+ }
102
+ return trimmed;
103
+ }
104
+ export function validateAdminPath(adminPath) {
105
+ const trimmed = adminPath.trim();
106
+ if (!trimmed.startsWith('/') || !ADMIN_PATH_RE.test(trimmed)) {
107
+ throw new Error(`Invalid admin path "${adminPath}". Must start with "/" and use URL-safe characters (e.g. /admin).`);
108
+ }
109
+ return trimmed;
110
+ }
111
+ /** Validate a single choice value against an allow-list (case-insensitive). */
112
+ export function validateChoice(value, allowed, label) {
113
+ const normalized = value.trim().toLowerCase();
114
+ if (!allowed.includes(normalized)) {
115
+ throw new Error(`Invalid ${label} "${value}". Choose one of: ${allowed.join(', ')}.`);
116
+ }
117
+ return normalized;
118
+ }
119
+ /**
120
+ * Parse a comma-separated multi-select flag (e.g. plugins/auth) into a validated
121
+ * list. Supports the keywords `all` and `none` when enabled. Throws on any
122
+ * unknown token so an agent gets an actionable error instead of a silent drop.
123
+ */
124
+ export function parseSelection(raw, allowed, label, opts = {}) {
125
+ const tokens = raw
126
+ .split(',')
127
+ .map((t) => t.trim().toLowerCase())
128
+ .filter((t) => t.length > 0);
129
+ if (tokens.length === 1 && tokens[0] === 'all') {
130
+ if (!opts.allowAll)
131
+ throw new Error(`"all" is not valid for ${label}.`);
132
+ return [...allowed];
133
+ }
134
+ if ((tokens.length === 0 || (tokens.length === 1 && tokens[0] === 'none')) && opts.allowNone) {
135
+ return [];
136
+ }
137
+ const result = [];
138
+ for (const token of tokens) {
139
+ if (token === 'none') {
140
+ throw new Error(`"none" cannot be combined with other ${label} values.`);
141
+ }
142
+ if (!allowed.includes(token)) {
143
+ throw new Error(`Unknown ${label} "${token}". Valid values: ${allowed.join(', ')}.`);
144
+ }
145
+ if (!result.includes(token))
146
+ result.push(token);
147
+ }
148
+ return result;
149
+ }
150
+ /**
151
+ * Validate only the flags the caller actually passed, returning a partial
152
+ * `ProjectOptions`. Used by both the non-interactive resolver and the
153
+ * interactive flow (to skip prompts for pre-supplied answers).
154
+ */
155
+ export function parseFlagOverrides(flags) {
156
+ const overrides = {};
157
+ if (flags.adminPath != null)
158
+ overrides.adminPath = validateAdminPath(flags.adminPath);
159
+ if (flags.loginPath != null)
160
+ overrides.loginPath = validateAdminPath(flags.loginPath);
161
+ if (flags.plugins != null) {
162
+ overrides.plugins = parseSelection(flags.plugins, PLUGIN_VALUES, 'plugin', {
163
+ allowAll: true,
164
+ allowNone: true,
165
+ });
166
+ }
167
+ if (flags.platform != null) {
168
+ overrides.platform = validateChoice(flags.platform, PLATFORM_VALUES, 'platform');
169
+ }
170
+ if (flags.template != null) {
171
+ overrides.template = validateChoice(flags.template, TEMPLATE_VALUES, 'template');
172
+ }
173
+ if (flags.framework != null) {
174
+ overrides.framework = validateChoice(flags.framework, FRAMEWORK_VALUES, 'framework');
175
+ }
176
+ if (flags.database != null) {
177
+ overrides.database = validateChoice(flags.database, DATABASE_VALUES, 'database');
178
+ }
179
+ if (flags.auth != null) {
180
+ const providers = parseSelection(flags.auth, AUTH_VALUES, 'auth provider');
181
+ if (providers.length === 0) {
182
+ throw new Error('At least one auth provider is required (e.g. --auth credentials).');
183
+ }
184
+ overrides.authProviders = providers;
185
+ }
186
+ return overrides;
187
+ }
188
+ /**
189
+ * Resolve a complete `ProjectOptions` with no prompting. Missing choices fall
190
+ * back to {@link DEFAULTS}. Throws (with an actionable message) on invalid input.
191
+ */
192
+ export function resolveNonInteractiveOptions(nameArg, flags) {
193
+ const overrides = parseFlagOverrides(flags);
194
+ return {
195
+ projectName: validateProjectName(nameArg ?? DEFAULTS.projectName),
196
+ adminPath: overrides.adminPath ?? DEFAULTS.adminPath,
197
+ loginPath: overrides.loginPath ?? DEFAULTS.loginPath,
198
+ plugins: overrides.plugins ?? [...DEFAULT_PRODUCTION_PLUGINS],
199
+ platform: overrides.platform ?? DEFAULTS.platform,
200
+ database: overrides.database ?? DEFAULTS.database,
201
+ authProviders: overrides.authProviders ?? [...DEFAULTS.authProviders],
202
+ template: overrides.template ?? DEFAULTS.template,
203
+ framework: (overrides.framework ?? DEFAULTS.framework),
204
+ };
205
+ }
206
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ export interface ProjectOptions {
2
+ projectName: string;
3
+ adminPath: string;
4
+ /**
5
+ * Mount path for the unauthenticated auth screens (login, setup wizard,
6
+ * forgot/reset password), e.g. `/securelogin`. When it differs from
7
+ * `adminPath`, the scaffold generates a split-login install: a separate
8
+ * login route is emitted and the admin mount renders a 404 lookalike for
9
+ * signed-out visitors. Set equal to `adminPath` for the classic inline
10
+ * login.
11
+ */
12
+ loginPath: string;
13
+ plugins: string[];
14
+ platform: string;
15
+ database: string;
16
+ authProviders: string[];
17
+ /**
18
+ * Starter template id (see {@link TEMPLATE_CHOICES}).
19
+ * CLI / `--yes` default is `'marketing-custom'` (designed-sections standard).
20
+ * Omit or pass `'default'` for a minimal built-ins-only kit.
21
+ */
22
+ template?: string;
23
+ /**
24
+ * Public delivery framework. `astro-split` (the CLI default) emits a pnpm
25
+ * workspace: Next CMS host in `apps/cms` (admin + API + cron), Astro public
26
+ * site in `apps/site`, and (marketing-custom) a shared section kit in
27
+ * `packages/sections`. `next` is the classic monolith scaffold; `astro-site`
28
+ * emits only the Astro public site (for an existing CMS host).
29
+ *
30
+ * Programmatic callers that omit this get `next` (monolith) for
31
+ * backwards compatibility — the CLI default lives in {@link DEFAULTS}.
32
+ */
33
+ framework?: 'next' | 'astro-split' | 'astro-site';
34
+ }
35
+ /**
36
+ * Split-login mode: the auth screens get their own mount, distinct from the
37
+ * admin app. When the two paths are equal the classic inline login applies.
38
+ */
39
+ export declare function isSplitLogin(options: ProjectOptions): boolean;
40
+ /** Package names for CLI plugin slugs — exported for scaffold / CLI consistency tests. */
41
+ export declare const PLUGIN_PACKAGES: Record<string, string>;
42
+ /** Package names for CLI platform slugs — exported for scaffold / CLI consistency tests. */
43
+ export declare const PLATFORM_PACKAGES: Record<string, string>;
44
+ export declare function scaffoldProject(rawOptions: ProjectOptions): Promise<void>;
45
+ //# sourceMappingURL=scaffold.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAyiBA,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB;;;;;;;OAOG;IACH,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,YAAY,CAAA;CAClD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAE7D;AAED,0FAA0F;AAC1F,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAWlD,CAAA;AAED,4FAA4F;AAC5F,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAGpD,CAAA;AAq+BD,wBAAsB,eAAe,CAAC,UAAU,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA6T/E"}