@underpeaks/generator-nextjs 1.0.28 → 1.0.31

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 (105) hide show
  1. package/dist/components/media/edit/nxf_audio_upload.d.ts +2 -0
  2. package/dist/components/media/edit/nxf_audio_upload.d.ts.map +1 -1
  3. package/dist/components/media/edit/nxf_audio_upload.js +68 -0
  4. package/dist/components/media/edit/nxf_audio_upload.js.map +1 -1
  5. package/dist/components/numeric/display/nxf_formatted_currency.d.ts +2 -0
  6. package/dist/components/numeric/display/nxf_formatted_currency.d.ts.map +1 -1
  7. package/dist/components/numeric/display/nxf_formatted_currency.js +29 -0
  8. package/dist/components/numeric/display/nxf_formatted_currency.js.map +1 -1
  9. package/dist/components/registry-display.d.ts +5 -0
  10. package/dist/components/registry-display.d.ts.map +1 -0
  11. package/dist/components/registry-display.js +116 -0
  12. package/dist/components/registry-display.js.map +1 -0
  13. package/dist/components/registry-edit.d.ts +5 -0
  14. package/dist/components/registry-edit.d.ts.map +1 -0
  15. package/dist/components/registry-edit.js +156 -0
  16. package/dist/components/registry-edit.js.map +1 -0
  17. package/dist/generator.d.ts +13 -1
  18. package/dist/generator.d.ts.map +1 -1
  19. package/dist/generator.js +105 -32
  20. package/dist/generator.js.map +1 -1
  21. package/dist/templates/page-blog-post.d.ts +3 -0
  22. package/dist/templates/page-blog-post.d.ts.map +1 -0
  23. package/dist/templates/page-blog-post.js +63 -0
  24. package/dist/templates/page-blog-post.js.map +1 -0
  25. package/dist/templates/page-calendar.d.ts +3 -0
  26. package/dist/templates/page-calendar.d.ts.map +1 -0
  27. package/dist/templates/page-calendar.js +66 -0
  28. package/dist/templates/page-calendar.js.map +1 -0
  29. package/dist/templates/page-cart.d.ts +3 -0
  30. package/dist/templates/page-cart.d.ts.map +1 -0
  31. package/dist/templates/page-cart.js +37 -0
  32. package/dist/templates/page-cart.js.map +1 -0
  33. package/dist/templates/page-chat.d.ts +3 -0
  34. package/dist/templates/page-chat.d.ts.map +1 -0
  35. package/dist/templates/page-chat.js +65 -0
  36. package/dist/templates/page-chat.js.map +1 -0
  37. package/dist/templates/page-checkout.d.ts +3 -0
  38. package/dist/templates/page-checkout.d.ts.map +1 -0
  39. package/dist/templates/page-checkout.js +57 -0
  40. package/dist/templates/page-checkout.js.map +1 -0
  41. package/dist/templates/page-contact.d.ts +3 -0
  42. package/dist/templates/page-contact.d.ts.map +1 -0
  43. package/dist/templates/page-contact.js +86 -0
  44. package/dist/templates/page-contact.js.map +1 -0
  45. package/dist/templates/page-custom.d.ts +3 -0
  46. package/dist/templates/page-custom.d.ts.map +1 -0
  47. package/dist/templates/page-custom.js +31 -0
  48. package/dist/templates/page-custom.js.map +1 -0
  49. package/dist/templates/page-dashboard.d.ts +3 -0
  50. package/dist/templates/page-dashboard.d.ts.map +1 -0
  51. package/dist/templates/page-dashboard.js +63 -0
  52. package/dist/templates/page-dashboard.js.map +1 -0
  53. package/dist/templates/page-feed.d.ts +3 -0
  54. package/dist/templates/page-feed.d.ts.map +1 -0
  55. package/dist/templates/page-feed.js +68 -0
  56. package/dist/templates/page-feed.js.map +1 -0
  57. package/dist/templates/page-gallery.d.ts +3 -0
  58. package/dist/templates/page-gallery.d.ts.map +1 -0
  59. package/dist/templates/page-gallery.js +67 -0
  60. package/dist/templates/page-gallery.js.map +1 -0
  61. package/dist/templates/page-invoice.d.ts +3 -0
  62. package/dist/templates/page-invoice.d.ts.map +1 -0
  63. package/dist/templates/page-invoice.js +70 -0
  64. package/dist/templates/page-invoice.js.map +1 -0
  65. package/dist/templates/page-kanban.d.ts +3 -0
  66. package/dist/templates/page-kanban.d.ts.map +1 -0
  67. package/dist/templates/page-kanban.js +72 -0
  68. package/dist/templates/page-kanban.js.map +1 -0
  69. package/dist/templates/page-map.d.ts +3 -0
  70. package/dist/templates/page-map.d.ts.map +1 -0
  71. package/dist/templates/page-map.js +33 -0
  72. package/dist/templates/page-map.js.map +1 -0
  73. package/dist/templates/page-messages.d.ts +3 -0
  74. package/dist/templates/page-messages.d.ts.map +1 -0
  75. package/dist/templates/page-messages.js +31 -0
  76. package/dist/templates/page-messages.js.map +1 -0
  77. package/dist/templates/page-otp-entry.d.ts +3 -0
  78. package/dist/templates/page-otp-entry.d.ts.map +1 -0
  79. package/dist/templates/page-otp-entry.js +85 -0
  80. package/dist/templates/page-otp-entry.js.map +1 -0
  81. package/dist/templates/page-otp-request.d.ts +3 -0
  82. package/dist/templates/page-otp-request.d.ts.map +1 -0
  83. package/dist/templates/page-otp-request.js +70 -0
  84. package/dist/templates/page-otp-request.js.map +1 -0
  85. package/dist/templates/page-profile.d.ts +3 -0
  86. package/dist/templates/page-profile.d.ts.map +1 -0
  87. package/dist/templates/page-profile.js +68 -0
  88. package/dist/templates/page-profile.js.map +1 -0
  89. package/dist/templates/page-search.d.ts +3 -0
  90. package/dist/templates/page-search.d.ts.map +1 -0
  91. package/dist/templates/page-search.js +74 -0
  92. package/dist/templates/page-search.js.map +1 -0
  93. package/dist/templates/page-settings.d.ts +3 -0
  94. package/dist/templates/page-settings.d.ts.map +1 -0
  95. package/dist/templates/page-settings.js +76 -0
  96. package/dist/templates/page-settings.js.map +1 -0
  97. package/dist/templates/page-wallet.d.ts +3 -0
  98. package/dist/templates/page-wallet.d.ts.map +1 -0
  99. package/dist/templates/page-wallet.js +44 -0
  100. package/dist/templates/page-wallet.js.map +1 -0
  101. package/package.json +1 -1
  102. package/dist/templates/page-remaining.d.ts +0 -3
  103. package/dist/templates/page-remaining.d.ts.map +0 -1
  104. package/dist/templates/page-remaining.js +0 -870
  105. package/dist/templates/page-remaining.js.map +0 -1
package/dist/generator.js CHANGED
@@ -3,6 +3,8 @@
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.generateNextjs = generateNextjs;
5
5
  const generator_core_1 = require("@underpeaks/generator-core");
6
+ const registry_edit_1 = require("./components/registry-edit");
7
+ const registry_display_1 = require("./components/registry-display");
6
8
  const types_1 = require("./templates/types");
7
9
  const api_route_1 = require("./templates/api-route");
8
10
  const api_route_id_1 = require("./templates/api-route-id");
@@ -11,7 +13,26 @@ const page_detail_1 = require("./templates/page-detail");
11
13
  const page_form_1 = require("./templates/page-form");
12
14
  const page_auth_1 = require("./templates/page-auth");
13
15
  const page_landing_1 = require("./templates/page-landing");
14
- const page_remaining_1 = require("./templates/page-remaining");
16
+ const page_dashboard_1 = require("./templates/page-dashboard");
17
+ const page_profile_1 = require("./templates/page-profile");
18
+ const page_blog_post_1 = require("./templates/page-blog-post");
19
+ const page_contact_1 = require("./templates/page-contact");
20
+ const page_cart_1 = require("./templates/page-cart");
21
+ const page_checkout_1 = require("./templates/page-checkout");
22
+ const page_wallet_1 = require("./templates/page-wallet");
23
+ const page_invoice_1 = require("./templates/page-invoice");
24
+ const page_chat_1 = require("./templates/page-chat");
25
+ const page_messages_1 = require("./templates/page-messages");
26
+ const page_feed_1 = require("./templates/page-feed");
27
+ const page_map_1 = require("./templates/page-map");
28
+ const page_search_1 = require("./templates/page-search");
29
+ const page_settings_1 = require("./templates/page-settings");
30
+ const page_gallery_1 = require("./templates/page-gallery");
31
+ const page_kanban_1 = require("./templates/page-kanban");
32
+ const page_calendar_1 = require("./templates/page-calendar");
33
+ const page_otp_request_1 = require("./templates/page-otp-request");
34
+ const page_otp_entry_1 = require("./templates/page-otp-entry");
35
+ const page_custom_1 = require("./templates/page-custom");
15
36
  const navigation_1 = require("./templates/navigation");
16
37
  const tailwind_1 = require("./templates/tailwind");
17
38
  const theme_1 = require("./templates/theme");
@@ -24,34 +45,27 @@ const api_builder_1 = require("./templates/api-builder");
24
45
  const index_1 = require("./integrations/index");
25
46
  const storage_1 = require("./integrations/storage");
26
47
  const validators_1 = require("./templates/validators");
27
- const LANDING_TYPES = [
28
- 'landing-hero-cta',
29
- 'landing-hero-features',
30
- 'landing-hero-pricing',
31
- 'landing-minimal',
32
- ];
33
- const REMAINING_TYPES = [
34
- 'dashboard', 'profile', 'blog-post', 'contact',
35
- 'cart', 'checkout', 'wallet', 'invoice',
36
- 'chat', 'messages', 'feed', 'map', 'search', 'settings',
37
- 'gallery', 'kanban', 'calendar',
38
- 'otp_request', 'otp_entry', 'custom',
39
- ];
40
- const AUTH_TYPES = [
41
- 'sign_in', 'sign_up', 'forgot_password', 'reset_password',
42
- ];
43
- const NAV_TYPES = ['top-nav', 'sidebar-nav', 'bottom-nav', 'drawer-nav'];
48
+ /**
49
+ * NOTE on widget dedup: see the matching comment in generator-flutter's
50
+ * generator.ts — this only decides WHICH unique ui_type widgets the
51
+ * project needs, always generating all of them fresh. Whether a
52
+ * developer has hand-edited a widget file locally is checked in the
53
+ * CLI's extraction step, not here.
54
+ */
44
55
  async function generateNextjs(data) {
45
56
  const filtered = (0, generator_core_1.filterProjectData)(data);
46
57
  const files = [];
58
+ // ── Widget library (scanned + deduplicated by ui_type) ────────────────────
59
+ const usage = (0, generator_core_1.scanUsedUiTypes)(filtered.models, filtered.pages);
60
+ const resolved = (0, generator_core_1.resolveRequiredWidgets)(usage, { editRegistry: registry_edit_1.nextjsEditRegistry, displayRegistry: registry_display_1.nextjsDisplayRegistry });
61
+ files.push(...resolved.files);
62
+ if (resolved.missing.length > 0) {
63
+ console.warn(`[nxf] No component registered for ui_type(s): ${resolved.missing.join(', ')} — these fields will not render.`);
64
+ }
47
65
  // ── Generated layer (always regenerated) ──────────────────────────────────
48
66
  files.push((0, nxf_client_1.generateNxfClient)(data.source));
49
67
  files.push((0, layout_1.generateLayout)(filtered.pages, data.project_name));
50
- // FIX: AppNav was referenced by layout.ts ('../components/AppNav') but no
51
- // template ever generated it — every project with a nav page would fail
52
- // to build. Only generated when at least one page actually has a nav
53
- // type set, matching layout.ts's own (now-fixed) hasNav check exactly.
54
- if (filtered.pages.some((p) => NAV_TYPES.includes(p.nav_type ?? ''))) {
68
+ if (filtered.pages.some((p) => generator_core_1.NAV_TEMPLATE_TYPES.includes(p.nav_type ?? ''))) {
55
69
  files.push((0, app_nav_1.generateAppNav)(filtered.pages));
56
70
  }
57
71
  files.push((0, env_1.generateEnvTemplate)(data.project_id));
@@ -65,25 +79,21 @@ async function generateNextjs(data) {
65
79
  files.push((0, theme_1.generateTheme)(data.theme));
66
80
  }
67
81
  files.push((0, navigation_1.generateNavigation)(filtered.pages, filtered.routes));
68
- // API Builder codegen
69
82
  files.push((0, api_builder_1.generateApiBuilderNextjs)(data.endpoints ?? []));
70
- // Integration codegen
71
83
  if (data.integrations && data.integrations.length > 0) {
72
84
  files.push(...(0, index_1.generateNextjsIntegrations)(data.integrations));
73
85
  }
74
- // Hosted storage — always available on Studio
75
86
  files.push((0, storage_1.generateStorageNextjs)({}));
76
- // ── Root ───────────────────────────────────────────────────────────────────
77
87
  files.push((0, readme_1.generateReadme)(data.project_name));
78
88
  files.push((0, validators_1.generateValidators)());
79
89
  // ── Presentation layer (generated once, user owns) ────────────────────────
80
90
  for (const page of filtered.pages) {
81
91
  const model = filtered.models.find((m) => m.sm_id === page.model_id);
82
- if (AUTH_TYPES.includes(page.template_type)) {
92
+ if (generator_core_1.AUTH_TEMPLATE_TYPES.includes(page.template_type)) {
83
93
  files.push(...(0, page_auth_1.generateNextjsAuthPages)(page));
84
94
  continue;
85
95
  }
86
- if (LANDING_TYPES.includes(page.template_type)) {
96
+ if (generator_core_1.LANDING_TEMPLATE_TYPES.includes(page.template_type)) {
87
97
  files.push((0, page_landing_1.generateLandingPage)(page));
88
98
  continue;
89
99
  }
@@ -101,13 +111,76 @@ async function generateNextjs(data) {
101
111
  if (model)
102
112
  files.push((0, page_form_1.generateFormPage)(page, model));
103
113
  break;
114
+ case 'dashboard':
115
+ files.push((0, page_dashboard_1.generateDashboardPage)(page, model));
116
+ break;
117
+ case 'profile':
118
+ files.push((0, page_profile_1.generateProfilePage)(page, model));
119
+ break;
120
+ case 'blog-post':
121
+ files.push((0, page_blog_post_1.generateBlogPostPage)(page, model));
122
+ break;
123
+ case 'contact':
124
+ files.push((0, page_contact_1.generateContactPage)(page));
125
+ break;
126
+ case 'cart':
127
+ files.push((0, page_cart_1.generateCartPage)(page));
128
+ break;
129
+ case 'checkout':
130
+ files.push((0, page_checkout_1.generateCheckoutPage)(page));
131
+ break;
132
+ case 'wallet':
133
+ files.push((0, page_wallet_1.generateWalletPage)(page));
134
+ break;
135
+ case 'invoice':
136
+ files.push((0, page_invoice_1.generateInvoicePage)(page, model));
137
+ break;
138
+ case 'chat':
139
+ files.push((0, page_chat_1.generateChatPage)(page));
140
+ break;
141
+ case 'messages':
142
+ files.push((0, page_messages_1.generateMessagesPage)(page));
143
+ break;
144
+ case 'feed':
145
+ files.push((0, page_feed_1.generateFeedPage)(page, model));
146
+ break;
147
+ case 'map':
148
+ files.push((0, page_map_1.generateMapPage)(page));
149
+ break;
150
+ case 'search':
151
+ files.push((0, page_search_1.generateSearchPage)(page, model));
152
+ break;
153
+ case 'settings':
154
+ files.push((0, page_settings_1.generateSettingsPage)(page));
155
+ break;
156
+ case 'gallery':
157
+ files.push((0, page_gallery_1.generateGalleryPage)(page, model));
158
+ break;
159
+ case 'kanban':
160
+ files.push((0, page_kanban_1.generateKanbanPage)(page, model));
161
+ break;
162
+ case 'calendar':
163
+ files.push((0, page_calendar_1.generateCalendarPage)(page, model));
164
+ break;
165
+ case 'otp_request':
166
+ files.push((0, page_otp_request_1.generateOtpRequestPage)(page));
167
+ break;
168
+ case 'otp_entry':
169
+ files.push((0, page_otp_entry_1.generateOtpEntryPage)(page));
170
+ break;
171
+ case 'custom':
172
+ files.push((0, page_custom_1.generateCustomPage)(page));
173
+ break;
104
174
  default:
105
- if (REMAINING_TYPES.includes(page.template_type)) {
106
- files.push((0, page_remaining_1.generateRemainingNextjsPage)(page, model));
175
+ if (generator_core_1.STANDARD_TEMPLATE_TYPES.includes(page.template_type)) {
176
+ console.warn(`[nxf] template_type '${page.template_type}' is listed as standard but has no generator wired in generator.ts.`);
107
177
  }
108
178
  break;
109
179
  }
110
180
  }
111
- return files;
181
+ return {
182
+ files,
183
+ widgetWarnings: { missing: resolved.missing },
184
+ };
112
185
  }
113
186
  //# sourceMappingURL=generator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Model, PageDef, GeneratedFile } from '@underpeaks/generator-core';
2
+ export declare function generateBlogPostPage(page: PageDef, model?: Model): GeneratedFile;
3
+ //# sourceMappingURL=page-blog-post.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-blog-post.d.ts","sourceRoot":"","sources":["../../src/templates/page-blog-post.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAG/E,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,aAAa,CAyDhF"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ // File: underpeaks_codegen/packages/generator-nextjs/src/templates/page-blog-post.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.generateBlogPostPage = generateBlogPostPage;
5
+ const generator_core_1 = require("@underpeaks/generator-core");
6
+ function generateBlogPostPage(page, model) {
7
+ const routePath = page.slug.replace(/^\//, '');
8
+ const className = model ? (0, generator_core_1.modelToClassName)(model.name) : 'Item';
9
+ const fileName = model ? (0, generator_core_1.modelToFileName)(model.name) : 'item';
10
+ const pk = model ? (0, generator_core_1.getPrimaryKey)(model) : null;
11
+ const pkName = pk?.name ?? 'id';
12
+ const columns = model ? (0, generator_core_1.getVisibleColumns)(model) : [];
13
+ const titleField = columns.find((c) => c.name.includes('title'))?.name ?? columns[0]?.name ?? pkName;
14
+ const bodyField = columns.find((c) => c.name.includes('body') || c.name.includes('content'))?.name ?? null;
15
+ const imageField = columns.find((c) => c.name.includes('image') || c.name.includes('cover'))?.name ?? null;
16
+ const authorField = columns.find((c) => c.name.includes('author'))?.name ?? null;
17
+ const lines = [];
18
+ lines.push(`// GENERATED BY UNDERPEAKS CODEGEN v1.0.0`);
19
+ lines.push(`// Page: ${page.name} — blog-post`);
20
+ lines.push(`// Presentation layer — generated once, you own this file.`);
21
+ lines.push(`// Regenerate: nxf generate nextjs --include-views`);
22
+ lines.push(``);
23
+ lines.push(`import type { ${className} } from '../../../../generated/types/${fileName}.types'`);
24
+ lines.push(`import { notFound } from 'next/navigation'`);
25
+ lines.push(`import Image from 'next/image'`);
26
+ lines.push(``);
27
+ lines.push(`async function getItem(id: string): Promise<${className} | null> {`);
28
+ lines.push(` const res = await fetch(\`\${process.env.NEXT_PUBLIC_APP_URL}/api/${fileName}/\${id}\`, { cache: 'no-store' })`);
29
+ lines.push(` if (res.status === 404) return null`);
30
+ lines.push(` const json = await res.json()`);
31
+ lines.push(` return json.data`);
32
+ lines.push(`}`);
33
+ lines.push(``);
34
+ lines.push(`interface Props { params: Promise<{ ${pkName}: string }> }`);
35
+ lines.push(``);
36
+ lines.push(`export default async function BlogPostPage({ params }: Props) {`);
37
+ lines.push(` const { ${pkName} } = await params`);
38
+ lines.push(` const item = await getItem(${pkName})`);
39
+ lines.push(` if (!item) notFound()`);
40
+ lines.push(` return (`);
41
+ lines.push(` <article className="container mx-auto px-4 py-8 max-w-2xl">`);
42
+ if (imageField) {
43
+ lines.push(` {item.${imageField} && (`);
44
+ lines.push(` <div className="relative w-full h-64 rounded-xl overflow-hidden mb-8">`);
45
+ lines.push(` <Image src={item.${imageField} as string} alt="" fill className="object-cover" />`);
46
+ lines.push(` </div>`);
47
+ lines.push(` )}`);
48
+ }
49
+ lines.push(` <h1 className="text-3xl font-bold text-gray-900 mb-4">{item.${titleField}?.toString()}</h1>`);
50
+ if (authorField)
51
+ lines.push(` <p className="text-sm text-gray-500 mb-8">By {item.${authorField}?.toString()}</p>`);
52
+ if (bodyField)
53
+ lines.push(` <div className="prose max-w-none"><p className="text-gray-700 leading-relaxed">{item.${bodyField}?.toString()}</p></div>`);
54
+ lines.push(` </article>`);
55
+ lines.push(` )`);
56
+ lines.push(`}`);
57
+ return {
58
+ path: `app/(presentation)/${routePath}/[${pkName}]/page.tsx`,
59
+ content: lines.join('\n'),
60
+ category: 'customizable',
61
+ };
62
+ }
63
+ //# sourceMappingURL=page-blog-post.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-blog-post.js","sourceRoot":"","sources":["../../src/templates/page-blog-post.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Model, PageDef, GeneratedFile } from '@underpeaks/generator-core';
2
+ export declare function generateCalendarPage(page: PageDef, model?: Model): GeneratedFile;
3
+ //# sourceMappingURL=page-calendar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-calendar.d.ts","sourceRoot":"","sources":["../../src/templates/page-calendar.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAG/E,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,aAAa,CA8DhF"}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ // File: underpeaks_codegen/packages/generator-nextjs/src/templates/page-calendar.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.generateCalendarPage = generateCalendarPage;
5
+ const generator_core_1 = require("@underpeaks/generator-core");
6
+ function generateCalendarPage(page, model) {
7
+ const routePath = page.slug.replace(/^\//, '');
8
+ const className = model ? (0, generator_core_1.modelToClassName)(model.name) : 'Item';
9
+ const fileName = model ? (0, generator_core_1.modelToFileName)(model.name) : 'item';
10
+ const pk = model ? (0, generator_core_1.getPrimaryKey)(model) : null;
11
+ const pkName = pk?.name ?? 'id';
12
+ const columns = model ? (0, generator_core_1.getVisibleColumns)(model) : [];
13
+ const titleField = columns.find((c) => c.name.includes('title') || c.name.includes('name'))?.name ?? columns[0]?.name ?? pkName;
14
+ const dateField = columns.find((c) => c.name.includes('date') || c.name.includes('start'))?.name ?? null;
15
+ const modelSlug = model ? model.name.replace('nxf_', '').replace(/_/g, '-') : fileName;
16
+ const lines = [];
17
+ lines.push(`// GENERATED BY UNDERPEAKS CODEGEN v1.0.0`);
18
+ lines.push(`// Page: ${page.name} — calendar`);
19
+ lines.push(`// Presentation layer — generated once, you own this file.`);
20
+ lines.push(`// Regenerate: nxf generate nextjs --include-views`);
21
+ lines.push(``);
22
+ lines.push(`import type { ${className} } from '../../../generated/types/${fileName}.types'`);
23
+ lines.push(``);
24
+ lines.push(`async function getItems(): Promise<${className}[]> {`);
25
+ lines.push(` const res = await fetch(\`\${process.env.NEXT_PUBLIC_APP_URL}/api/${modelSlug}\`, { cache: 'no-store' })`);
26
+ lines.push(` if (!res.ok) return []`);
27
+ lines.push(` const json = await res.json()`);
28
+ lines.push(` return json.data ?? []`);
29
+ lines.push(`}`);
30
+ lines.push(``);
31
+ lines.push(`export default async function CalendarPage() {`);
32
+ lines.push(` const items = await getItems()`);
33
+ lines.push(` const now = new Date()`);
34
+ lines.push(` return (`);
35
+ lines.push(` <div className="container mx-auto px-4 py-8">`);
36
+ lines.push(` <h1 className="text-2xl font-bold mb-6">${page.name}</h1>`);
37
+ lines.push(` <div className="bg-white border border-gray-200 rounded-xl overflow-hidden">`);
38
+ lines.push(` <div className="flex items-center justify-between px-6 py-4 border-b border-gray-100">`);
39
+ lines.push(` <h2 className="font-semibold">{now.toLocaleString('default', { month: 'long', year: 'numeric' })}</h2>`);
40
+ lines.push(` </div>`);
41
+ lines.push(` <div className="p-4 flex flex-col gap-2">`);
42
+ lines.push(` {items.length === 0 ? (`);
43
+ lines.push(` <p className="text-center text-gray-400 py-8">No events yet.</p>`);
44
+ lines.push(` ) : (`);
45
+ lines.push(` items.map((item) => (`);
46
+ lines.push(` <div key={item.${pkName}} className="flex items-center gap-3 px-4 py-3 bg-gray-50 rounded-lg">`);
47
+ lines.push(` <div className="w-2 h-2 rounded-full bg-black shrink-0" />`);
48
+ lines.push(` <span className="text-sm font-medium">{item.${titleField}?.toString() ?? '—'}</span>`);
49
+ if (dateField) {
50
+ lines.push(` <span className="text-xs text-gray-400 ml-auto">{item.${dateField}?.toString() ?? ''}</span>`);
51
+ }
52
+ lines.push(` </div>`);
53
+ lines.push(` ))`);
54
+ lines.push(` )}`);
55
+ lines.push(` </div>`);
56
+ lines.push(` </div>`);
57
+ lines.push(` </div>`);
58
+ lines.push(` )`);
59
+ lines.push(`}`);
60
+ return {
61
+ path: `app/(presentation)/${routePath}/page.tsx`,
62
+ content: lines.join('\n'),
63
+ category: 'customizable',
64
+ };
65
+ }
66
+ //# sourceMappingURL=page-calendar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-calendar.js","sourceRoot":"","sources":["../../src/templates/page-calendar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { PageDef, GeneratedFile } from '@underpeaks/generator-core';
2
+ export declare function generateCartPage(page: PageDef): GeneratedFile;
3
+ //# sourceMappingURL=page-cart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-cart.d.ts","sourceRoot":"","sources":["../../src/templates/page-cart.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAExE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,CAkC7D"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ // File: underpeaks_codegen/packages/generator-nextjs/src/templates/page-cart.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.generateCartPage = generateCartPage;
5
+ function generateCartPage(page) {
6
+ const routePath = page.slug.replace(/^\//, '');
7
+ const lines = [];
8
+ lines.push(`// GENERATED BY UNDERPEAKS CODEGEN v1.0.0`);
9
+ lines.push(`// Page: ${page.name} — cart`);
10
+ lines.push(`// Presentation layer — generated once, you own this file.`);
11
+ lines.push(`// Regenerate: nxf generate nextjs --include-views`);
12
+ lines.push(``);
13
+ lines.push(`'use client'`);
14
+ lines.push(`import Link from 'next/link'`);
15
+ lines.push(``);
16
+ lines.push(`export default function CartPage() {`);
17
+ lines.push(` return (`);
18
+ lines.push(` <div className="container mx-auto px-4 py-8 max-w-2xl">`);
19
+ lines.push(` <h1 className="text-2xl font-bold mb-6">Cart</h1>`);
20
+ lines.push(` <div className="bg-white border border-gray-200 rounded-xl p-8 text-center">`);
21
+ lines.push(` <div className="text-5xl mb-4">🛒</div>`);
22
+ lines.push(` <p className="text-gray-500 mb-6">Your cart is empty</p>`);
23
+ lines.push(` <Link href="/products"`);
24
+ lines.push(` className="px-6 py-2.5 bg-black text-white rounded-lg text-sm font-medium hover:bg-gray-800 transition">`);
25
+ lines.push(` Continue Shopping`);
26
+ lines.push(` </Link>`);
27
+ lines.push(` </div>`);
28
+ lines.push(` </div>`);
29
+ lines.push(` )`);
30
+ lines.push(`}`);
31
+ return {
32
+ path: `app/(presentation)/${routePath}/page.tsx`,
33
+ content: lines.join('\n'),
34
+ category: 'customizable',
35
+ };
36
+ }
37
+ //# sourceMappingURL=page-cart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-cart.js","sourceRoot":"","sources":["../../src/templates/page-cart.ts"],"names":[],"mappings":";AAAA,gFAAgF;;AAIhF,4CAkCC;AAlCD,SAAgB,gBAAgB,CAAC,IAAa;IAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAE9C,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAA;IACvD,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,SAAS,CAAC,CAAA;IAC1C,KAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAA;IACxE,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAA;IAChE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC1B,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAA;IAC1C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAA;IAClD,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACxB,KAAK,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAA;IACzE,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAA;IACrE,KAAK,CAAC,IAAI,CAAC,oFAAoF,CAAC,CAAA;IAChG,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAA;IAC7D,KAAK,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAA;IAC9E,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAA;IAC5C,KAAK,CAAC,IAAI,CAAC,oHAAoH,CAAC,CAAA;IAChI,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAA;IACzC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;IAC7B,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC1B,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACxB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACjB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAEf,OAAO;QACL,IAAI,EAAM,sBAAsB,SAAS,WAAW;QACpD,OAAO,EAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1B,QAAQ,EAAE,cAAc;KACzB,CAAA;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { PageDef, GeneratedFile } from '@underpeaks/generator-core';
2
+ export declare function generateChatPage(page: PageDef): GeneratedFile;
3
+ //# sourceMappingURL=page-chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-chat.d.ts","sourceRoot":"","sources":["../../src/templates/page-chat.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAExE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,CA8D7D"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ // File: underpeaks_codegen/packages/generator-nextjs/src/templates/page-chat.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.generateChatPage = generateChatPage;
5
+ function generateChatPage(page) {
6
+ const routePath = page.slug.replace(/^\//, '');
7
+ const lines = [];
8
+ lines.push(`// GENERATED BY UNDERPEAKS CODEGEN v1.0.0`);
9
+ lines.push(`// Page: ${page.name} — chat`);
10
+ lines.push(`// Presentation layer — generated once, you own this file.`);
11
+ lines.push(`// Regenerate: nxf generate nextjs --include-views`);
12
+ lines.push(``);
13
+ lines.push(`'use client'`);
14
+ lines.push(`import { useState, useRef, useEffect } from 'react'`);
15
+ lines.push(``);
16
+ lines.push(`export default function ChatPage() {`);
17
+ lines.push(` const [messages, setMessages] = useState<{ text: string; isMe: boolean }[]>([])`);
18
+ lines.push(` const [input, setInput] = useState('')`);
19
+ lines.push(` const bottomRef = useRef<HTMLDivElement>(null)`);
20
+ lines.push(``);
21
+ lines.push(` useEffect(() => {`);
22
+ lines.push(` bottomRef.current?.scrollIntoView({ behavior: 'smooth' })`);
23
+ lines.push(` }, [messages])`);
24
+ lines.push(``);
25
+ lines.push(` function send() {`);
26
+ lines.push(` if (!input.trim()) return`);
27
+ lines.push(` setMessages((prev) => [...prev, { text: input.trim(), isMe: true }])`);
28
+ lines.push(` setInput('')`);
29
+ lines.push(` }`);
30
+ lines.push(``);
31
+ lines.push(` return (`);
32
+ lines.push(` <div className="flex flex-col h-[calc(100vh-4rem)]">`);
33
+ lines.push(` <div className="flex-1 overflow-y-auto p-4 flex flex-col gap-3">`);
34
+ lines.push(` {messages.length === 0 && (`);
35
+ lines.push(` <p className="text-center text-gray-400 text-sm mt-8">No messages yet. Say hello!</p>`);
36
+ lines.push(` )}`);
37
+ lines.push(` {messages.map((msg, i) => (`);
38
+ lines.push(` <div key={i} className={\`flex \${msg.isMe ? 'justify-end' : 'justify-start'}\`}>`);
39
+ lines.push(` <div className={\`max-w-xs px-4 py-2 rounded-2xl text-sm \${msg.isMe ? 'bg-black text-white' : 'bg-gray-100 text-gray-900'}\`}>`);
40
+ lines.push(` {msg.text}`);
41
+ lines.push(` </div>`);
42
+ lines.push(` </div>`);
43
+ lines.push(` ))}`);
44
+ lines.push(` <div ref={bottomRef} />`);
45
+ lines.push(` </div>`);
46
+ lines.push(` <div className="border-t border-gray-200 p-4 flex gap-2">`);
47
+ lines.push(` <input value={input} onChange={(e) => setInput(e.target.value)}`);
48
+ lines.push(` onKeyDown={(e) => e.key === 'Enter' && send()}`);
49
+ lines.push(` placeholder="Type a message..."`);
50
+ lines.push(` className="flex-1 px-4 py-2 border border-gray-200 rounded-full text-sm focus:outline-none focus:ring-2 focus:ring-black" />`);
51
+ lines.push(` <button onClick={send}`);
52
+ lines.push(` className="w-10 h-10 rounded-full bg-black text-white flex items-center justify-center hover:bg-gray-800 transition">`);
53
+ lines.push(` ↑`);
54
+ lines.push(` </button>`);
55
+ lines.push(` </div>`);
56
+ lines.push(` </div>`);
57
+ lines.push(` )`);
58
+ lines.push(`}`);
59
+ return {
60
+ path: `app/(presentation)/${routePath}/page.tsx`,
61
+ content: lines.join('\n'),
62
+ category: 'customizable',
63
+ };
64
+ }
65
+ //# sourceMappingURL=page-chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-chat.js","sourceRoot":"","sources":["../../src/templates/page-chat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { PageDef, GeneratedFile } from '@underpeaks/generator-core';
2
+ export declare function generateCheckoutPage(page: PageDef): GeneratedFile;
3
+ //# sourceMappingURL=page-checkout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-checkout.d.ts","sourceRoot":"","sources":["../../src/templates/page-checkout.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAExE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,CAsDjE"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ // File: underpeaks_codegen/packages/generator-nextjs/src/templates/page-checkout.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.generateCheckoutPage = generateCheckoutPage;
5
+ function generateCheckoutPage(page) {
6
+ const routePath = page.slug.replace(/^\//, '');
7
+ const lines = [];
8
+ lines.push(`// GENERATED BY UNDERPEAKS CODEGEN v1.0.0`);
9
+ lines.push(`// Page: ${page.name} — checkout`);
10
+ lines.push(`// Presentation layer — generated once, you own this file.`);
11
+ lines.push(`// Regenerate: nxf generate nextjs --include-views`);
12
+ lines.push(``);
13
+ lines.push(`'use client'`);
14
+ lines.push(`import { useState } from 'react'`);
15
+ lines.push(`import { useRouter } from 'next/navigation'`);
16
+ lines.push(``);
17
+ lines.push(`export default function CheckoutPage() {`);
18
+ lines.push(` const router = useRouter()`);
19
+ lines.push(` const [step, setStep] = useState(0)`);
20
+ lines.push(` const steps = ['Contact', 'Shipping', 'Payment']`);
21
+ lines.push(` return (`);
22
+ lines.push(` <div className="container mx-auto px-4 py-8 max-w-2xl">`);
23
+ lines.push(` <h1 className="text-2xl font-bold mb-6">Checkout</h1>`);
24
+ lines.push(` <div className="flex gap-2 mb-8">`);
25
+ lines.push(` {steps.map((s, i) => (`);
26
+ lines.push(` <div key={s} className="flex items-center gap-2">`);
27
+ lines.push(` <div className={\`w-8 h-8 rounded-full flex items-center justify-center text-sm font-medium \${i <= step ? 'bg-black text-white' : 'bg-gray-100 text-gray-400'}\`}>{i + 1}</div>`);
28
+ lines.push(` <span className="text-sm text-gray-600">{s}</span>`);
29
+ lines.push(` {i < steps.length - 1 && <div className="w-8 h-px bg-gray-200" />}`);
30
+ lines.push(` </div>`);
31
+ lines.push(` ))}`);
32
+ lines.push(` </div>`);
33
+ lines.push(` <div className="bg-white border border-gray-200 rounded-xl p-6">`);
34
+ lines.push(` <p className="text-gray-500 text-sm">Step {step + 1}: {steps[step]}</p>`);
35
+ lines.push(` <div className="mt-4 flex gap-3">`);
36
+ lines.push(` {step > 0 && (`);
37
+ lines.push(` <button onClick={() => setStep((s) => s - 1)}`);
38
+ lines.push(` className="flex-1 py-2.5 border border-gray-200 rounded-lg text-sm font-medium hover:bg-gray-50 transition">`);
39
+ lines.push(` Back`);
40
+ lines.push(` </button>`);
41
+ lines.push(` )}`);
42
+ lines.push(` <button onClick={() => step < 2 ? setStep((s) => s + 1) : router.push('/orders')}`);
43
+ lines.push(` className="flex-1 py-2.5 bg-black text-white rounded-lg text-sm font-medium hover:bg-gray-800 transition">`);
44
+ lines.push(` {step === 2 ? 'Place Order' : 'Continue'}`);
45
+ lines.push(` </button>`);
46
+ lines.push(` </div>`);
47
+ lines.push(` </div>`);
48
+ lines.push(` </div>`);
49
+ lines.push(` )`);
50
+ lines.push(`}`);
51
+ return {
52
+ path: `app/(presentation)/${routePath}/page.tsx`,
53
+ content: lines.join('\n'),
54
+ category: 'customizable',
55
+ };
56
+ }
57
+ //# sourceMappingURL=page-checkout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-checkout.js","sourceRoot":"","sources":["../../src/templates/page-checkout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { PageDef, GeneratedFile } from '@underpeaks/generator-core';
2
+ export declare function generateContactPage(page: PageDef): GeneratedFile;
3
+ //# sourceMappingURL=page-contact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-contact.d.ts","sourceRoot":"","sources":["../../src/templates/page-contact.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAExE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,CAmFhE"}