@underpeaks/generator-nextjs 1.0.27 → 1.0.29

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
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ // File: underpeaks_codegen/packages/generator-nextjs/src/templates/page-contact.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.generateContactPage = generateContactPage;
5
+ function generateContactPage(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} — contact`);
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(``);
16
+ lines.push(`export default function ContactPage() {`);
17
+ lines.push(` const [name, setName] = useState('')`);
18
+ lines.push(` const [email, setEmail] = useState('')`);
19
+ lines.push(` const [message, setMessage] = useState('')`);
20
+ lines.push(` const [loading, setLoading] = useState(false)`);
21
+ lines.push(` const [sent, setSent] = useState(false)`);
22
+ lines.push(` const [error, setError] = useState<string | null>(null)`);
23
+ lines.push(``);
24
+ lines.push(` async function handleSubmit(e: React.FormEvent) {`);
25
+ lines.push(` e.preventDefault()`);
26
+ lines.push(` setLoading(true)`);
27
+ lines.push(` setError(null)`);
28
+ lines.push(` try {`);
29
+ lines.push(` const res = await fetch('/api/contact', {`);
30
+ lines.push(` method: 'POST',`);
31
+ lines.push(` headers: { 'Content-Type': 'application/json' },`);
32
+ lines.push(` body: JSON.stringify({ name, email, message }),`);
33
+ lines.push(` })`);
34
+ lines.push(` if (!res.ok) throw new Error('Failed to send message')`);
35
+ lines.push(` setSent(true)`);
36
+ lines.push(` } catch (err: any) {`);
37
+ lines.push(` setError(err.message)`);
38
+ lines.push(` } finally {`);
39
+ lines.push(` setLoading(false)`);
40
+ lines.push(` }`);
41
+ lines.push(` }`);
42
+ lines.push(``);
43
+ lines.push(` if (sent) return (`);
44
+ lines.push(` <div className="container mx-auto px-4 py-16 text-center max-w-lg">`);
45
+ lines.push(` <div className="text-5xl mb-4">✅</div>`);
46
+ lines.push(` <h1 className="text-2xl font-bold mb-2">Message sent!</h1>`);
47
+ lines.push(` <p className="text-gray-500">We&apos;ll get back to you as soon as possible.</p>`);
48
+ lines.push(` </div>`);
49
+ lines.push(` )`);
50
+ lines.push(``);
51
+ lines.push(` return (`);
52
+ lines.push(` <div className="container mx-auto px-4 py-8 max-w-xl">`);
53
+ lines.push(` <h1 className="text-2xl font-bold mb-2">Contact Us</h1>`);
54
+ lines.push(` <p className="text-gray-500 mb-8 text-sm">Fill in the form and we&apos;ll get back to you.</p>`);
55
+ lines.push(` <form onSubmit={handleSubmit} className="bg-white border border-gray-200 rounded-xl p-6 flex flex-col gap-4">`);
56
+ lines.push(` <div className="flex flex-col gap-1">`);
57
+ lines.push(` <label className="text-sm font-medium text-gray-700">Full Name</label>`);
58
+ lines.push(` <input type="text" value={name} onChange={(e) => setName(e.target.value)} required`);
59
+ lines.push(` className="px-3 py-2 border border-gray-200 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-black" />`);
60
+ lines.push(` </div>`);
61
+ lines.push(` <div className="flex flex-col gap-1">`);
62
+ lines.push(` <label className="text-sm font-medium text-gray-700">Email</label>`);
63
+ lines.push(` <input type="email" value={email} onChange={(e) => setEmail(e.target.value)} required`);
64
+ lines.push(` className="px-3 py-2 border border-gray-200 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-black" />`);
65
+ lines.push(` </div>`);
66
+ lines.push(` <div className="flex flex-col gap-1">`);
67
+ lines.push(` <label className="text-sm font-medium text-gray-700">Message</label>`);
68
+ lines.push(` <textarea value={message} onChange={(e) => setMessage(e.target.value)} required rows={5}`);
69
+ lines.push(` className="px-3 py-2 border border-gray-200 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-black resize-none" />`);
70
+ lines.push(` </div>`);
71
+ lines.push(` {error && <p className="text-sm text-red-500">{error}</p>}`);
72
+ lines.push(` <button type="submit" disabled={loading}`);
73
+ lines.push(` className="py-2.5 bg-black text-white rounded-lg text-sm font-medium hover:bg-gray-800 disabled:opacity-40 transition">`);
74
+ lines.push(` {loading ? 'Sending...' : 'Send Message'}`);
75
+ lines.push(` </button>`);
76
+ lines.push(` </form>`);
77
+ lines.push(` </div>`);
78
+ lines.push(` )`);
79
+ lines.push(`}`);
80
+ return {
81
+ path: `app/(presentation)/${routePath}/page.tsx`,
82
+ content: lines.join('\n'),
83
+ category: 'customizable',
84
+ };
85
+ }
86
+ //# sourceMappingURL=page-contact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-contact.js","sourceRoot":"","sources":["../../src/templates/page-contact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { PageDef, GeneratedFile } from '@underpeaks/generator-core';
2
+ export declare function generateCustomPage(page: PageDef): GeneratedFile;
3
+ //# sourceMappingURL=page-custom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-custom.d.ts","sourceRoot":"","sources":["../../src/templates/page-custom.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAExE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,CA4B/D"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ // File: underpeaks_codegen/packages/generator-nextjs/src/templates/page-custom.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.generateCustomPage = generateCustomPage;
5
+ function generateCustomPage(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} — custom`);
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(`export default function CustomPage() {`);
14
+ lines.push(` return (`);
15
+ lines.push(` <div className="container mx-auto px-4 py-8">`);
16
+ lines.push(` <h1 className="text-2xl font-bold mb-4">${page.name}</h1>`);
17
+ lines.push(` <div className="bg-white border border-gray-200 rounded-xl p-8 text-center text-gray-400">`);
18
+ lines.push(` <p className="text-4xl mb-4">⚡</p>`);
19
+ lines.push(` <p className="font-medium">Custom Page</p>`);
20
+ lines.push(` <p className="text-sm mt-1">Build your custom UI here.</p>`);
21
+ lines.push(` </div>`);
22
+ lines.push(` </div>`);
23
+ lines.push(` )`);
24
+ lines.push(`}`);
25
+ return {
26
+ path: `app/(presentation)/${routePath}/page.tsx`,
27
+ content: lines.join('\n'),
28
+ category: 'customizable',
29
+ };
30
+ }
31
+ //# sourceMappingURL=page-custom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-custom.js","sourceRoot":"","sources":["../../src/templates/page-custom.ts"],"names":[],"mappings":";AAAA,kFAAkF;;AAIlF,gDA4BC;AA5BD,SAAgB,kBAAkB,CAAC,IAAa;IAC9C,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,WAAW,CAAC,CAAA;IAC5C,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,wCAAwC,CAAC,CAAA;IACpD,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACxB,KAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAA;IAC/D,KAAK,CAAC,IAAI,CAAC,iDAAiD,IAAI,CAAC,IAAI,OAAO,CAAC,CAAA;IAC7E,KAAK,CAAC,IAAI,CAAC,kGAAkG,CAAC,CAAA;IAC9G,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAA;IACxD,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAA;IAChE,KAAK,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAA;IAChF,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 { Model, PageDef, GeneratedFile } from '@underpeaks/generator-core';
2
+ export declare function generateDashboardPage(page: PageDef, model?: Model): GeneratedFile;
3
+ //# sourceMappingURL=page-dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-dashboard.d.ts","sourceRoot":"","sources":["../../src/templates/page-dashboard.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAG/E,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,aAAa,CAyDjF"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ // File: underpeaks_codegen/packages/generator-nextjs/src/templates/page-dashboard.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.generateDashboardPage = generateDashboardPage;
5
+ const generator_core_1 = require("@underpeaks/generator-core");
6
+ function generateDashboardPage(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 lines = [];
14
+ lines.push(`// GENERATED BY UNDERPEAKS CODEGEN v1.0.0`);
15
+ lines.push(`// Page: ${page.name} — dashboard`);
16
+ lines.push(`// Presentation layer — generated once, you own this file.`);
17
+ lines.push(`// Regenerate: nxf generate nextjs --include-views`);
18
+ lines.push(``);
19
+ lines.push(`import type { ${className} } from '../../../generated/types/${fileName}.types'`);
20
+ lines.push(``);
21
+ lines.push(`async function getItems(): Promise<${className}[]> {`);
22
+ lines.push(` const res = await fetch(\`\${process.env.NEXT_PUBLIC_APP_URL}/api/${fileName}\`, { cache: 'no-store' })`);
23
+ lines.push(` if (!res.ok) return []`);
24
+ lines.push(` const json = await res.json()`);
25
+ lines.push(` return json.data ?? []`);
26
+ lines.push(`}`);
27
+ lines.push(``);
28
+ lines.push(`export default async function DashboardPage() {`);
29
+ lines.push(` const items = await getItems()`);
30
+ lines.push(` return (`);
31
+ lines.push(` <div className="container mx-auto px-4 py-8">`);
32
+ lines.push(` <h1 className="text-2xl font-bold mb-6">Dashboard</h1>`);
33
+ lines.push(` <div className="grid grid-cols-1 md:grid-cols-3 gap-4 mb-8">`);
34
+ lines.push(` <div className="bg-white border border-gray-200 rounded-xl p-6">`);
35
+ lines.push(` <p className="text-sm text-gray-500">Total ${className}s</p>`);
36
+ lines.push(` <p className="text-3xl font-bold mt-1">{items.length}</p>`);
37
+ lines.push(` </div>`);
38
+ lines.push(` </div>`);
39
+ lines.push(` <div className="bg-white border border-gray-200 rounded-xl overflow-hidden">`);
40
+ lines.push(` <div className="px-6 py-4 border-b border-gray-100">`);
41
+ lines.push(` <h2 className="font-semibold">Recent ${className}s</h2>`);
42
+ lines.push(` </div>`);
43
+ lines.push(` <div className="divide-y divide-gray-100">`);
44
+ lines.push(` {items.slice(0, 5).map((item) => (`);
45
+ lines.push(` <div key={item.${pkName}} className="px-6 py-4">`);
46
+ if (columns[0])
47
+ lines.push(` <p className="font-medium">{item.${columns[0].name}?.toString() ?? '—'}</p>`);
48
+ if (columns[1])
49
+ lines.push(` <p className="text-sm text-gray-500">{item.${columns[1].name}?.toString() ?? ''}</p>`);
50
+ lines.push(` </div>`);
51
+ lines.push(` ))}`);
52
+ lines.push(` </div>`);
53
+ lines.push(` </div>`);
54
+ lines.push(` </div>`);
55
+ lines.push(` )`);
56
+ lines.push(`}`);
57
+ return {
58
+ path: `app/(presentation)/${routePath}/page.tsx`,
59
+ content: lines.join('\n'),
60
+ category: 'customizable',
61
+ };
62
+ }
63
+ //# sourceMappingURL=page-dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-dashboard.js","sourceRoot":"","sources":["../../src/templates/page-dashboard.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 generateFeedPage(page: PageDef, model?: Model): GeneratedFile;
3
+ //# sourceMappingURL=page-feed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-feed.d.ts","sourceRoot":"","sources":["../../src/templates/page-feed.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAG/E,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,aAAa,CA+D5E"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ // File: underpeaks_codegen/packages/generator-nextjs/src/templates/page-feed.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.generateFeedPage = generateFeedPage;
5
+ const generator_core_1 = require("@underpeaks/generator-core");
6
+ function generateFeedPage(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 bodyField = columns.find((c) => c.name.includes('body') || c.name.includes('content'))?.name ?? columns[0]?.name ?? pkName;
14
+ const nameField = columns.find((c) => c.name.includes('name') || c.name.includes('author'))?.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} — feed`);
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(`import Link from 'next/link'`);
24
+ lines.push(``);
25
+ lines.push(`async function getItems(): Promise<${className}[]> {`);
26
+ lines.push(` const res = await fetch(\`\${process.env.NEXT_PUBLIC_APP_URL}/api/${modelSlug}\`, { cache: 'no-store' })`);
27
+ lines.push(` if (!res.ok) return []`);
28
+ lines.push(` const json = await res.json()`);
29
+ lines.push(` return json.data ?? []`);
30
+ lines.push(`}`);
31
+ lines.push(``);
32
+ lines.push(`export default async function FeedPage() {`);
33
+ lines.push(` const items = await getItems()`);
34
+ lines.push(` return (`);
35
+ lines.push(` <div className="container mx-auto px-4 py-8 max-w-xl">`);
36
+ lines.push(` <h1 className="text-2xl font-bold mb-6">${page.name}</h1>`);
37
+ lines.push(` <div className="flex flex-col gap-4">`);
38
+ lines.push(` {items.length === 0 && <p className="text-center text-gray-400 py-16">No posts yet.</p>}`);
39
+ lines.push(` {items.map((item) => (`);
40
+ lines.push(` <div key={item.${pkName}} className="bg-white border border-gray-200 rounded-xl p-5">`);
41
+ lines.push(` <div className="flex items-center gap-3 mb-3">`);
42
+ lines.push(` <div className="w-8 h-8 rounded-full bg-gray-200 flex items-center justify-center text-sm">👤</div>`);
43
+ if (nameField) {
44
+ lines.push(` <span className="text-sm font-medium">{item.${nameField}?.toString() ?? 'User'}</span>`);
45
+ }
46
+ else {
47
+ lines.push(` <span className="text-sm font-medium">User</span>`);
48
+ }
49
+ lines.push(` </div>`);
50
+ lines.push(` <p className="text-sm text-gray-700 mb-3">{item.${bodyField}?.toString() ?? ''}</p>`);
51
+ lines.push(` <div className="flex gap-4 text-xs text-gray-400">`);
52
+ lines.push(` <button className="hover:text-gray-600">👍 Like</button>`);
53
+ lines.push(` <button className="hover:text-gray-600">💬 Comment</button>`);
54
+ lines.push(` <button className="hover:text-gray-600">↗ Share</button>`);
55
+ lines.push(` </div>`);
56
+ lines.push(` </div>`);
57
+ lines.push(` ))}`);
58
+ lines.push(` </div>`);
59
+ lines.push(` </div>`);
60
+ lines.push(` )`);
61
+ lines.push(`}`);
62
+ return {
63
+ path: `app/(presentation)/${routePath}/page.tsx`,
64
+ content: lines.join('\n'),
65
+ category: 'customizable',
66
+ };
67
+ }
68
+ //# sourceMappingURL=page-feed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-feed.js","sourceRoot":"","sources":["../../src/templates/page-feed.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 generateGalleryPage(page: PageDef, model?: Model): GeneratedFile;
3
+ //# sourceMappingURL=page-gallery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-gallery.d.ts","sourceRoot":"","sources":["../../src/templates/page-gallery.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAG/E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,aAAa,CA+D/E"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ // File: underpeaks_codegen/packages/generator-nextjs/src/templates/page-gallery.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.generateGalleryPage = generateGalleryPage;
5
+ const generator_core_1 = require("@underpeaks/generator-core");
6
+ function generateGalleryPage(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 imageField = columns.find((c) => c.name.includes('image') || c.name.includes('photo') || c.name.includes('url'))?.name ?? columns[0]?.name ?? pkName;
14
+ const titleField = columns.find((c) => c.name.includes('title') || c.name.includes('name'))?.name ?? columns[0]?.name ?? pkName;
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} — gallery`);
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(`import Image from 'next/image'`);
24
+ lines.push(`import Link from 'next/link'`);
25
+ lines.push(``);
26
+ lines.push(`async function getItems(): Promise<${className}[]> {`);
27
+ lines.push(` const res = await fetch(\`\${process.env.NEXT_PUBLIC_APP_URL}/api/${modelSlug}\`, { cache: 'no-store' })`);
28
+ lines.push(` if (!res.ok) return []`);
29
+ lines.push(` const json = await res.json()`);
30
+ lines.push(` return json.data ?? []`);
31
+ lines.push(`}`);
32
+ lines.push(``);
33
+ lines.push(`export default async function GalleryPage() {`);
34
+ lines.push(` const items = await getItems()`);
35
+ lines.push(` return (`);
36
+ lines.push(` <div className="container mx-auto px-4 py-8">`);
37
+ lines.push(` <h1 className="text-2xl font-bold mb-6">${page.name}</h1>`);
38
+ lines.push(` {items.length === 0 ? (`);
39
+ lines.push(` <div className="text-center py-16 text-gray-400">No items yet.</div>`);
40
+ lines.push(` ) : (`);
41
+ lines.push(` <div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-3">`);
42
+ lines.push(` {items.map((item) => (`);
43
+ lines.push(` <Link key={item.${pkName}} href={\`/${routePath}/\${item.${pkName}}\`}`);
44
+ lines.push(` className="group relative aspect-square bg-gray-100 rounded-xl overflow-hidden">`);
45
+ lines.push(` {item.${imageField} ? (`);
46
+ lines.push(` <Image src={item.${imageField} as string} alt={item.${titleField}?.toString() ?? ''} fill className="object-cover group-hover:scale-105 transition-transform duration-300" />`);
47
+ lines.push(` ) : (`);
48
+ lines.push(` <div className="w-full h-full flex items-center justify-center text-gray-300 text-3xl">🖼</div>`);
49
+ lines.push(` )}`);
50
+ lines.push(` <div className="absolute inset-0 bg-black/0 group-hover:bg-black/20 transition-colors duration-300" />`);
51
+ lines.push(` <div className="absolute bottom-0 left-0 right-0 p-3 translate-y-full group-hover:translate-y-0 transition-transform duration-300">`);
52
+ lines.push(` <p className="text-white text-xs font-medium truncate">{item.${titleField}?.toString() ?? ''}</p>`);
53
+ lines.push(` </div>`);
54
+ lines.push(` </Link>`);
55
+ lines.push(` ))}`);
56
+ lines.push(` </div>`);
57
+ lines.push(` )}`);
58
+ lines.push(` </div>`);
59
+ lines.push(` )`);
60
+ lines.push(`}`);
61
+ return {
62
+ path: `app/(presentation)/${routePath}/page.tsx`,
63
+ content: lines.join('\n'),
64
+ category: 'customizable',
65
+ };
66
+ }
67
+ //# sourceMappingURL=page-gallery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-gallery.js","sourceRoot":"","sources":["../../src/templates/page-gallery.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 generateInvoicePage(page: PageDef, model?: Model): GeneratedFile;
3
+ //# sourceMappingURL=page-invoice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-invoice.d.ts","sourceRoot":"","sources":["../../src/templates/page-invoice.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAG/E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,aAAa,CAkE/E"}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ // File: underpeaks_codegen/packages/generator-nextjs/src/templates/page-invoice.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.generateInvoicePage = generateInvoicePage;
5
+ const generator_core_1 = require("@underpeaks/generator-core");
6
+ function generateInvoicePage(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 totalField = columns.find((c) => c.name.includes('total') || c.name.includes('amount'))?.name ?? null;
14
+ const lines = [];
15
+ lines.push(`// GENERATED BY UNDERPEAKS CODEGEN v1.0.0`);
16
+ lines.push(`// Page: ${page.name} — invoice`);
17
+ lines.push(`// Presentation layer — generated once, you own this file.`);
18
+ lines.push(`// Regenerate: nxf generate nextjs --include-views`);
19
+ lines.push(``);
20
+ lines.push(`import type { ${className} } from '../../../../generated/types/${fileName}.types'`);
21
+ lines.push(`import { notFound } from 'next/navigation'`);
22
+ lines.push(``);
23
+ lines.push(`async function getItem(id: string): Promise<${className} | null> {`);
24
+ lines.push(` const res = await fetch(\`\${process.env.NEXT_PUBLIC_APP_URL}/api/${fileName}/\${id}\`, { cache: 'no-store' })`);
25
+ lines.push(` if (res.status === 404) return null`);
26
+ lines.push(` const json = await res.json()`);
27
+ lines.push(` return json.data`);
28
+ lines.push(`}`);
29
+ lines.push(``);
30
+ lines.push(`interface Props { params: Promise<{ ${pkName}: string }> }`);
31
+ lines.push(``);
32
+ lines.push(`export default async function InvoicePage({ params }: Props) {`);
33
+ lines.push(` const { ${pkName} } = await params`);
34
+ lines.push(` const item = await getItem(${pkName})`);
35
+ lines.push(` if (!item) notFound()`);
36
+ lines.push(` return (`);
37
+ lines.push(` <div className="container mx-auto px-4 py-8 max-w-2xl">`);
38
+ lines.push(` <div className="bg-white border border-gray-200 rounded-xl p-8">`);
39
+ lines.push(` <div className="flex justify-between items-start mb-8">`);
40
+ lines.push(` <div>`);
41
+ lines.push(` <h1 className="text-2xl font-bold">INVOICE</h1>`);
42
+ lines.push(` <p className="text-sm text-gray-500 mt-1">#{item.${pkName}}</p>`);
43
+ lines.push(` </div>`);
44
+ lines.push(` </div>`);
45
+ lines.push(` <div className="border-t border-gray-100 pt-6 flex flex-col gap-3">`);
46
+ for (const col of columns) {
47
+ const label = col.name.replaceAll('_', ' ');
48
+ lines.push(` <div className="flex justify-between text-sm">`);
49
+ lines.push(` <span className="text-gray-500 capitalize">${label}</span>`);
50
+ lines.push(` <span className="font-medium">{item.${col.name}?.toString() ?? '—'}</span>`);
51
+ lines.push(` </div>`);
52
+ }
53
+ lines.push(` </div>`);
54
+ if (totalField) {
55
+ lines.push(` <div className="border-t border-gray-200 mt-6 pt-4 flex justify-between">`);
56
+ lines.push(` <span className="font-bold text-lg">Total</span>`);
57
+ lines.push(` <span className="font-bold text-lg">{item.${totalField}?.toString() ?? '—'}</span>`);
58
+ lines.push(` </div>`);
59
+ }
60
+ lines.push(` </div>`);
61
+ lines.push(` </div>`);
62
+ lines.push(` )`);
63
+ lines.push(`}`);
64
+ return {
65
+ path: `app/(presentation)/${routePath}/[${pkName}]/page.tsx`,
66
+ content: lines.join('\n'),
67
+ category: 'customizable',
68
+ };
69
+ }
70
+ //# sourceMappingURL=page-invoice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-invoice.js","sourceRoot":"","sources":["../../src/templates/page-invoice.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 generateKanbanPage(page: PageDef, model?: Model): GeneratedFile;
3
+ //# sourceMappingURL=page-kanban.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-kanban.d.ts","sourceRoot":"","sources":["../../src/templates/page-kanban.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAG/E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,aAAa,CAmE9E"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ // File: underpeaks_codegen/packages/generator-nextjs/src/templates/page-kanban.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.generateKanbanPage = generateKanbanPage;
5
+ const generator_core_1 = require("@underpeaks/generator-core");
6
+ function generateKanbanPage(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 statusField = columns.find((c) => c.name.includes('status') || c.name.includes('stage'))?.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} — kanban`);
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(`const COLUMNS = ['To Do', 'In Progress', 'Done']`);
25
+ lines.push(``);
26
+ lines.push(`async function getItems(): Promise<${className}[]> {`);
27
+ lines.push(` const res = await fetch(\`\${process.env.NEXT_PUBLIC_APP_URL}/api/${modelSlug}\`, { cache: 'no-store' })`);
28
+ lines.push(` if (!res.ok) return []`);
29
+ lines.push(` const json = await res.json()`);
30
+ lines.push(` return json.data ?? []`);
31
+ lines.push(`}`);
32
+ lines.push(``);
33
+ lines.push(`export default async function KanbanPage() {`);
34
+ lines.push(` const items = await getItems()`);
35
+ lines.push(` return (`);
36
+ lines.push(` <div className="p-6 overflow-x-auto">`);
37
+ lines.push(` <h1 className="text-2xl font-bold mb-6">${page.name}</h1>`);
38
+ lines.push(` <div className="flex gap-4 min-w-max">`);
39
+ lines.push(` {COLUMNS.map((col) => {`);
40
+ lines.push(` const colItems = items.filter((item) => {`);
41
+ if (statusField) {
42
+ lines.push(` return (item.${statusField}?.toString() ?? 'To Do') === col`);
43
+ }
44
+ else {
45
+ lines.push(` return col === 'To Do'`);
46
+ }
47
+ lines.push(` })`);
48
+ lines.push(` return (`);
49
+ lines.push(` <div key={col} className="w-72 bg-gray-50 rounded-xl p-4 flex flex-col gap-3">`);
50
+ lines.push(` <div className="flex items-center justify-between mb-2">`);
51
+ lines.push(` <span className="text-sm font-semibold text-gray-700">{col}</span>`);
52
+ lines.push(` <span className="text-xs bg-gray-200 text-gray-600 rounded-full px-2 py-0.5">{colItems.length}</span>`);
53
+ lines.push(` </div>`);
54
+ lines.push(` {colItems.map((item) => (`);
55
+ lines.push(` <div key={item.${pkName}} className="bg-white border border-gray-200 rounded-lg p-3 shadow-sm">`);
56
+ lines.push(` <p className="text-sm font-medium text-gray-900">{item.${titleField}?.toString() ?? '—'}</p>`);
57
+ lines.push(` </div>`);
58
+ lines.push(` ))}`);
59
+ lines.push(` </div>`);
60
+ lines.push(` )`);
61
+ lines.push(` })}`);
62
+ lines.push(` </div>`);
63
+ lines.push(` </div>`);
64
+ lines.push(` )`);
65
+ lines.push(`}`);
66
+ return {
67
+ path: `app/(presentation)/${routePath}/page.tsx`,
68
+ content: lines.join('\n'),
69
+ category: 'customizable',
70
+ };
71
+ }
72
+ //# sourceMappingURL=page-kanban.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-kanban.js","sourceRoot":"","sources":["../../src/templates/page-kanban.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { PageDef, GeneratedFile } from '@underpeaks/generator-core';
2
+ export declare function generateMapPage(page: PageDef): GeneratedFile;
3
+ //# sourceMappingURL=page-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-map.d.ts","sourceRoot":"","sources":["../../src/templates/page-map.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAExE,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,CA8B5D"}