@underpeaks/generator-nextjs 1.0.19

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 (185) hide show
  1. package/dist/generator.d.ts +3 -0
  2. package/dist/generator.d.ts.map +1 -0
  3. package/dist/generator.js +113 -0
  4. package/dist/generator.js.map +1 -0
  5. package/dist/index.d.ts +2 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +7 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/integrations/algolia.d.ts +3 -0
  10. package/dist/integrations/algolia.d.ts.map +1 -0
  11. package/dist/integrations/algolia.js +56 -0
  12. package/dist/integrations/algolia.js.map +1 -0
  13. package/dist/integrations/anthropic.d.ts +3 -0
  14. package/dist/integrations/anthropic.d.ts.map +1 -0
  15. package/dist/integrations/anthropic.js +54 -0
  16. package/dist/integrations/anthropic.js.map +1 -0
  17. package/dist/integrations/aws-s3.d.ts +3 -0
  18. package/dist/integrations/aws-s3.d.ts.map +1 -0
  19. package/dist/integrations/aws-s3.js +59 -0
  20. package/dist/integrations/aws-s3.js.map +1 -0
  21. package/dist/integrations/clerk.d.ts +3 -0
  22. package/dist/integrations/clerk.d.ts.map +1 -0
  23. package/dist/integrations/clerk.js +34 -0
  24. package/dist/integrations/clerk.js.map +1 -0
  25. package/dist/integrations/cloudinary.d.ts +3 -0
  26. package/dist/integrations/cloudinary.d.ts.map +1 -0
  27. package/dist/integrations/cloudinary.js +57 -0
  28. package/dist/integrations/cloudinary.js.map +1 -0
  29. package/dist/integrations/crisp.d.ts +3 -0
  30. package/dist/integrations/crisp.d.ts.map +1 -0
  31. package/dist/integrations/crisp.js +53 -0
  32. package/dist/integrations/crisp.js.map +1 -0
  33. package/dist/integrations/firebase.d.ts +3 -0
  34. package/dist/integrations/firebase.d.ts.map +1 -0
  35. package/dist/integrations/firebase.js +53 -0
  36. package/dist/integrations/firebase.js.map +1 -0
  37. package/dist/integrations/flutterwave.d.ts +3 -0
  38. package/dist/integrations/flutterwave.d.ts.map +1 -0
  39. package/dist/integrations/flutterwave.js +53 -0
  40. package/dist/integrations/flutterwave.js.map +1 -0
  41. package/dist/integrations/gemini.d.ts +3 -0
  42. package/dist/integrations/gemini.d.ts.map +1 -0
  43. package/dist/integrations/gemini.js +40 -0
  44. package/dist/integrations/gemini.js.map +1 -0
  45. package/dist/integrations/github.d.ts +3 -0
  46. package/dist/integrations/github.d.ts.map +1 -0
  47. package/dist/integrations/github.js +53 -0
  48. package/dist/integrations/github.js.map +1 -0
  49. package/dist/integrations/hubspot.d.ts +3 -0
  50. package/dist/integrations/hubspot.d.ts.map +1 -0
  51. package/dist/integrations/hubspot.js +54 -0
  52. package/dist/integrations/hubspot.js.map +1 -0
  53. package/dist/integrations/index.d.ts +3 -0
  54. package/dist/integrations/index.d.ts.map +1 -0
  55. package/dist/integrations/index.js +63 -0
  56. package/dist/integrations/index.js.map +1 -0
  57. package/dist/integrations/lemonsqueezy.d.ts +3 -0
  58. package/dist/integrations/lemonsqueezy.d.ts.map +1 -0
  59. package/dist/integrations/lemonsqueezy.js +43 -0
  60. package/dist/integrations/lemonsqueezy.js.map +1 -0
  61. package/dist/integrations/mailchimp.d.ts +3 -0
  62. package/dist/integrations/mailchimp.d.ts.map +1 -0
  63. package/dist/integrations/mailchimp.js +52 -0
  64. package/dist/integrations/mailchimp.js.map +1 -0
  65. package/dist/integrations/openai.d.ts +3 -0
  66. package/dist/integrations/openai.d.ts.map +1 -0
  67. package/dist/integrations/openai.js +78 -0
  68. package/dist/integrations/openai.js.map +1 -0
  69. package/dist/integrations/payfast.d.ts +3 -0
  70. package/dist/integrations/payfast.d.ts.map +1 -0
  71. package/dist/integrations/payfast.js +94 -0
  72. package/dist/integrations/payfast.js.map +1 -0
  73. package/dist/integrations/pusher.d.ts +3 -0
  74. package/dist/integrations/pusher.d.ts.map +1 -0
  75. package/dist/integrations/pusher.js +86 -0
  76. package/dist/integrations/pusher.js.map +1 -0
  77. package/dist/integrations/resend.d.ts +3 -0
  78. package/dist/integrations/resend.d.ts.map +1 -0
  79. package/dist/integrations/resend.js +45 -0
  80. package/dist/integrations/resend.js.map +1 -0
  81. package/dist/integrations/sendgrid.d.ts +3 -0
  82. package/dist/integrations/sendgrid.d.ts.map +1 -0
  83. package/dist/integrations/sendgrid.js +42 -0
  84. package/dist/integrations/sendgrid.js.map +1 -0
  85. package/dist/integrations/sentry.d.ts +3 -0
  86. package/dist/integrations/sentry.d.ts.map +1 -0
  87. package/dist/integrations/sentry.js +49 -0
  88. package/dist/integrations/sentry.js.map +1 -0
  89. package/dist/integrations/slack.d.ts +3 -0
  90. package/dist/integrations/slack.d.ts.map +1 -0
  91. package/dist/integrations/slack.js +54 -0
  92. package/dist/integrations/slack.js.map +1 -0
  93. package/dist/integrations/storage.d.ts +3 -0
  94. package/dist/integrations/storage.d.ts.map +1 -0
  95. package/dist/integrations/storage.js +71 -0
  96. package/dist/integrations/storage.js.map +1 -0
  97. package/dist/integrations/stripe.d.ts +3 -0
  98. package/dist/integrations/stripe.d.ts.map +1 -0
  99. package/dist/integrations/stripe.js +65 -0
  100. package/dist/integrations/stripe.js.map +1 -0
  101. package/dist/integrations/twilio.d.ts +3 -0
  102. package/dist/integrations/twilio.d.ts.map +1 -0
  103. package/dist/integrations/twilio.js +45 -0
  104. package/dist/integrations/twilio.js.map +1 -0
  105. package/dist/integrations/uploadthing.d.ts +3 -0
  106. package/dist/integrations/uploadthing.d.ts.map +1 -0
  107. package/dist/integrations/uploadthing.js +41 -0
  108. package/dist/integrations/uploadthing.js.map +1 -0
  109. package/dist/templates/api-builder.d.ts +12 -0
  110. package/dist/templates/api-builder.d.ts.map +1 -0
  111. package/dist/templates/api-builder.js +76 -0
  112. package/dist/templates/api-builder.js.map +1 -0
  113. package/dist/templates/api-route-id.d.ts +3 -0
  114. package/dist/templates/api-route-id.d.ts.map +1 -0
  115. package/dist/templates/api-route-id.js +137 -0
  116. package/dist/templates/api-route-id.js.map +1 -0
  117. package/dist/templates/api-route.d.ts +3 -0
  118. package/dist/templates/api-route.d.ts.map +1 -0
  119. package/dist/templates/api-route.js +85 -0
  120. package/dist/templates/api-route.js.map +1 -0
  121. package/dist/templates/app-nav.d.ts +23 -0
  122. package/dist/templates/app-nav.d.ts.map +1 -0
  123. package/dist/templates/app-nav.js +132 -0
  124. package/dist/templates/app-nav.js.map +1 -0
  125. package/dist/templates/env.d.ts +3 -0
  126. package/dist/templates/env.d.ts.map +1 -0
  127. package/dist/templates/env.js +39 -0
  128. package/dist/templates/env.js.map +1 -0
  129. package/dist/templates/layout.d.ts +3 -0
  130. package/dist/templates/layout.d.ts.map +1 -0
  131. package/dist/templates/layout.js +50 -0
  132. package/dist/templates/layout.js.map +1 -0
  133. package/dist/templates/navigation.d.ts +3 -0
  134. package/dist/templates/navigation.d.ts.map +1 -0
  135. package/dist/templates/navigation.js +129 -0
  136. package/dist/templates/navigation.js.map +1 -0
  137. package/dist/templates/nxf-client.d.ts +3 -0
  138. package/dist/templates/nxf-client.d.ts.map +1 -0
  139. package/dist/templates/nxf-client.js +96 -0
  140. package/dist/templates/nxf-client.js.map +1 -0
  141. package/dist/templates/page-auth.d.ts +3 -0
  142. package/dist/templates/page-auth.d.ts.map +1 -0
  143. package/dist/templates/page-auth.js +344 -0
  144. package/dist/templates/page-auth.js.map +1 -0
  145. package/dist/templates/page-detail.d.ts +3 -0
  146. package/dist/templates/page-detail.d.ts.map +1 -0
  147. package/dist/templates/page-detail.js +86 -0
  148. package/dist/templates/page-detail.js.map +1 -0
  149. package/dist/templates/page-form.d.ts +3 -0
  150. package/dist/templates/page-form.d.ts.map +1 -0
  151. package/dist/templates/page-form.js +159 -0
  152. package/dist/templates/page-form.js.map +1 -0
  153. package/dist/templates/page-landing.d.ts +3 -0
  154. package/dist/templates/page-landing.d.ts.map +1 -0
  155. package/dist/templates/page-landing.js +140 -0
  156. package/dist/templates/page-landing.js.map +1 -0
  157. package/dist/templates/page-list.d.ts +3 -0
  158. package/dist/templates/page-list.d.ts.map +1 -0
  159. package/dist/templates/page-list.js +130 -0
  160. package/dist/templates/page-list.js.map +1 -0
  161. package/dist/templates/page-remaining.d.ts +3 -0
  162. package/dist/templates/page-remaining.d.ts.map +1 -0
  163. package/dist/templates/page-remaining.js +870 -0
  164. package/dist/templates/page-remaining.js.map +1 -0
  165. package/dist/templates/readme.d.ts +3 -0
  166. package/dist/templates/readme.d.ts.map +1 -0
  167. package/dist/templates/readme.js +87 -0
  168. package/dist/templates/readme.js.map +1 -0
  169. package/dist/templates/tailwind.d.ts +3 -0
  170. package/dist/templates/tailwind.d.ts.map +1 -0
  171. package/dist/templates/tailwind.js +63 -0
  172. package/dist/templates/tailwind.js.map +1 -0
  173. package/dist/templates/theme.d.ts +3 -0
  174. package/dist/templates/theme.d.ts.map +1 -0
  175. package/dist/templates/theme.js +49 -0
  176. package/dist/templates/theme.js.map +1 -0
  177. package/dist/templates/types.d.ts +3 -0
  178. package/dist/templates/types.d.ts.map +1 -0
  179. package/dist/templates/types.js +74 -0
  180. package/dist/templates/types.js.map +1 -0
  181. package/dist/templates/validators.d.ts +3 -0
  182. package/dist/templates/validators.d.ts.map +1 -0
  183. package/dist/templates/validators.js +37 -0
  184. package/dist/templates/validators.js.map +1 -0
  185. package/package.json +24 -0
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ // File: underpeaks_codegen/packages/generator-nextjs/src/integrations/stripe.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.generateStripeNextjs = generateStripeNextjs;
5
+ function generateStripeNextjs(config) {
6
+ const lines = [];
7
+ lines.push(`// GENERATED FILE — DO NOT EDIT MANUALLY`);
8
+ lines.push(`// Generated by Underpeaks CodeGen v1.0.0`);
9
+ lines.push(`// Integration: Stripe`);
10
+ lines.push(``);
11
+ lines.push(`// ── Setup instructions ────────────────────────────────────────────────────`);
12
+ lines.push(`// 1. npm install stripe @stripe/stripe-js @stripe/react-stripe-js`);
13
+ lines.push(`// 2. Add STRIPE_SECRET_KEY and NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY to .env.local`);
14
+ lines.push(``);
15
+ lines.push(`import Stripe from 'stripe'`);
16
+ lines.push(``);
17
+ lines.push(`// ── Server-side Stripe instance ───────────────────────────────────────────`);
18
+ lines.push(`// Only use this in API routes or Server Components`);
19
+ lines.push(``);
20
+ lines.push(`export function getStripe() {`);
21
+ lines.push(` return new Stripe(process.env.STRIPE_SECRET_KEY ?? '', {`);
22
+ lines.push(` apiVersion: '2024-04-10',`);
23
+ lines.push(` })`);
24
+ lines.push(`}`);
25
+ lines.push(``);
26
+ lines.push(`export async function createPaymentIntent({`);
27
+ lines.push(` amount,`);
28
+ lines.push(` currency = 'usd',`);
29
+ lines.push(`}: {`);
30
+ lines.push(` amount: number`);
31
+ lines.push(` currency?: string`);
32
+ lines.push(`}): Promise<string> {`);
33
+ lines.push(` const stripe = getStripe()`);
34
+ lines.push(` const intent = await stripe.paymentIntents.create({ amount, currency })`);
35
+ lines.push(` return intent.client_secret ?? ''`);
36
+ lines.push(`}`);
37
+ lines.push(``);
38
+ lines.push(`export async function createCheckoutSession({`);
39
+ lines.push(` priceId,`);
40
+ lines.push(` successUrl,`);
41
+ lines.push(` cancelUrl,`);
42
+ lines.push(` customerId,`);
43
+ lines.push(`}: {`);
44
+ lines.push(` priceId: string`);
45
+ lines.push(` successUrl: string`);
46
+ lines.push(` cancelUrl: string`);
47
+ lines.push(` customerId?: string`);
48
+ lines.push(`}): Promise<string> {`);
49
+ lines.push(` const stripe = getStripe()`);
50
+ lines.push(` const session = await stripe.checkout.sessions.create({`);
51
+ lines.push(` mode: 'subscription',`);
52
+ lines.push(` line_items: [{ price: priceId, quantity: 1 }],`);
53
+ lines.push(` success_url: successUrl,`);
54
+ lines.push(` cancel_url: cancelUrl,`);
55
+ lines.push(` customer: customerId,`);
56
+ lines.push(` })`);
57
+ lines.push(` return session.url ?? ''`);
58
+ lines.push(`}`);
59
+ return {
60
+ path: 'lib/generated/integrations/stripe.ts',
61
+ content: lines.join('\n'),
62
+ category: 'generated',
63
+ };
64
+ }
65
+ //# sourceMappingURL=stripe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripe.js","sourceRoot":"","sources":["../../src/integrations/stripe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { GeneratedFile } from '@underpeaks/generator-core';
2
+ export declare function generateTwilioNextjs(config: Record<string, string>): GeneratedFile;
3
+ //# sourceMappingURL=twilio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"twilio.d.ts","sourceRoot":"","sources":["../../src/integrations/twilio.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAE/D,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,aAAa,CAyClF"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ // File: underpeaks_codegen/packages/generator-nextjs/src/integrations/twilio.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.generateTwilioNextjs = generateTwilioNextjs;
5
+ function generateTwilioNextjs(config) {
6
+ const lines = [];
7
+ lines.push(`// GENERATED FILE — DO NOT EDIT MANUALLY`);
8
+ lines.push(`// Generated by Underpeaks CodeGen v1.0.0`);
9
+ lines.push(`// Integration: Twilio`);
10
+ lines.push(``);
11
+ lines.push(`// ── Setup instructions ────────────────────────────────────────────────────`);
12
+ lines.push(`// 1. npm install twilio`);
13
+ lines.push(`// 2. Add TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, TWILIO_FROM_NUMBER to .env.local`);
14
+ lines.push(`// 3. Only use in API routes or Server Actions`);
15
+ lines.push(``);
16
+ lines.push(`import twilio from 'twilio'`);
17
+ lines.push(``);
18
+ lines.push(`export function getTwilioClient() {`);
19
+ lines.push(` return twilio(`);
20
+ lines.push(` process.env.TWILIO_ACCOUNT_SID,`);
21
+ lines.push(` process.env.TWILIO_AUTH_TOKEN,`);
22
+ lines.push(` )`);
23
+ lines.push(`}`);
24
+ lines.push(``);
25
+ lines.push(`export async function sendSms({`);
26
+ lines.push(` to,`);
27
+ lines.push(` message,`);
28
+ lines.push(`}: {`);
29
+ lines.push(` to: string`);
30
+ lines.push(` message: string`);
31
+ lines.push(`}) {`);
32
+ lines.push(` const client = getTwilioClient()`);
33
+ lines.push(` return client.messages.create({`);
34
+ lines.push(` to,`);
35
+ lines.push(` from: process.env.TWILIO_FROM_NUMBER ?? '',`);
36
+ lines.push(` body: message,`);
37
+ lines.push(` })`);
38
+ lines.push(`}`);
39
+ return {
40
+ path: 'lib/generated/integrations/twilio.ts',
41
+ content: lines.join('\n'),
42
+ category: 'generated',
43
+ };
44
+ }
45
+ //# sourceMappingURL=twilio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"twilio.js","sourceRoot":"","sources":["../../src/integrations/twilio.ts"],"names":[],"mappings":";AAAA,gFAAgF;;AAIhF,oDAyCC;AAzCD,SAAgB,oBAAoB,CAAC,MAA8B;IACjE,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAA;IACtD,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAA;IACvD,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;IACpC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAA;IAC3F,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;IACtC,KAAK,CAAC,IAAI,CAAC,mFAAmF,CAAC,CAAA;IAC/F,KAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAA;IAC5D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAA;IACzC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAA;IACjD,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;IAC9B,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAA;IACjD,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAA;IAChD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACjB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACf,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAA;IAC7C,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACnB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACxB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAClB,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;IAC/B,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;IAC/B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAClB,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAA;IAChD,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAA;IAC/C,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACrB,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAA;IAC7D,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;IAChC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAClB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAEf,OAAO;QACL,IAAI,EAAM,sCAAsC;QAChD,OAAO,EAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1B,QAAQ,EAAE,WAAW;KACtB,CAAA;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { GeneratedFile } from '@underpeaks/generator-core';
2
+ export declare function generateUploadthingNextjs(config: Record<string, string>): GeneratedFile;
3
+ //# sourceMappingURL=uploadthing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uploadthing.d.ts","sourceRoot":"","sources":["../../src/integrations/uploadthing.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAE/D,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,aAAa,CAqCvF"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ // File: underpeaks_codegen/packages/generator-nextjs/src/integrations/uploadthing.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.generateUploadthingNextjs = generateUploadthingNextjs;
5
+ function generateUploadthingNextjs(config) {
6
+ const lines = [];
7
+ lines.push(`// GENERATED FILE — DO NOT EDIT MANUALLY`);
8
+ lines.push(`// Generated by Underpeaks CodeGen v1.0.0`);
9
+ lines.push(`// Integration: Uploadthing`);
10
+ lines.push(``);
11
+ lines.push(`// ── Setup instructions ────────────────────────────────────────────────────`);
12
+ lines.push(`// 1. npm install uploadthing @uploadthing/react`);
13
+ lines.push(`// 2. Add UPLOADTHING_SECRET to .env.local`);
14
+ lines.push(`// 3. Create app/api/uploadthing/core.ts and app/api/uploadthing/route.ts`);
15
+ lines.push(``);
16
+ lines.push(`import { createUploadthing, type FileRouter } from 'uploadthing/next'`);
17
+ lines.push(``);
18
+ lines.push(`const f = createUploadthing()`);
19
+ lines.push(``);
20
+ lines.push(`// ── File router ───────────────────────────────────────────────────────────`);
21
+ lines.push(`// Copy this to app/api/uploadthing/core.ts`);
22
+ lines.push(``);
23
+ lines.push(`export const uploadRouter = {`);
24
+ lines.push(` imageUploader: f({ image: { maxFileSize: '4MB', maxFileCount: 1 } })`);
25
+ lines.push(` .middleware(async () => {`);
26
+ lines.push(` // Add auth check here if needed`);
27
+ lines.push(` return {}`);
28
+ lines.push(` })`);
29
+ lines.push(` .onUploadComplete(async ({ file }) => {`);
30
+ lines.push(` return { url: file.url }`);
31
+ lines.push(` }),`);
32
+ lines.push(`} satisfies FileRouter`);
33
+ lines.push(``);
34
+ lines.push(`export type NxfUploadRouter = typeof uploadRouter`);
35
+ return {
36
+ path: 'lib/generated/integrations/uploadthing.ts',
37
+ content: lines.join('\n'),
38
+ category: 'generated',
39
+ };
40
+ }
41
+ //# sourceMappingURL=uploadthing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uploadthing.js","sourceRoot":"","sources":["../../src/integrations/uploadthing.ts"],"names":[],"mappings":";AAAA,qFAAqF;;AAIrF,8DAqCC;AArCD,SAAgB,yBAAyB,CAAC,MAA8B;IACtE,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAA;IACtD,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAA;IACvD,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAA;IACzC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAA;IAC3F,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAA;IAC9D,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAA;IACxD,KAAK,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAA;IACvF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAA;IACnF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAA;IAC3C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAA;IAC3F,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAA;IACzD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAA;IAC3C,KAAK,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAA;IACpF,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAA;IAC3C,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAA;IACpD,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;IAC7B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACpB,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAA;IACzD,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAA;IAC5C,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACrB,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;IACpC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAA;IAE/D,OAAO;QACL,IAAI,EAAM,2CAA2C;QACrD,OAAO,EAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1B,QAAQ,EAAE,WAAW;KACtB,CAAA;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { GeneratedFile } from '@underpeaks/generator-core';
2
+ interface Endpoint {
3
+ endpoint_id: string;
4
+ name: string;
5
+ method: string;
6
+ path: string;
7
+ model_name: string;
8
+ operation: string;
9
+ }
10
+ export declare function generateApiBuilderNextjs(endpoints: Endpoint[]): GeneratedFile;
11
+ export {};
12
+ //# sourceMappingURL=api-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-builder.d.ts","sourceRoot":"","sources":["../../src/templates/api-builder.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAE/D,UAAU,QAAQ;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAS,MAAM,CAAA;IACnB,MAAM,EAAO,MAAM,CAAA;IACnB,IAAI,EAAS,MAAM,CAAA;IACnB,UAAU,EAAG,MAAM,CAAA;IACnB,SAAS,EAAI,MAAM,CAAA;CACpB;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,aAAa,CAuE7E"}
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ // File: underpeaks_codegen/packages/generator-nextjs/src/templates/api-builder.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.generateApiBuilderNextjs = generateApiBuilderNextjs;
5
+ function generateApiBuilderNextjs(endpoints) {
6
+ const lines = [];
7
+ lines.push(`// GENERATED FILE — DO NOT EDIT MANUALLY`);
8
+ lines.push(`// Generated by Underpeaks CodeGen v1.0.0`);
9
+ lines.push(`// Custom endpoints from API Builder`);
10
+ lines.push(`// Regenerate: nxf generate nextjs`);
11
+ lines.push(``);
12
+ lines.push(`// ── Custom API endpoints ─────────────────────────────────────────────────`);
13
+ lines.push(`// These are endpoints you built in the Underpeaks API Builder.`);
14
+ lines.push(`// Do not edit this file — regenerate using: nxf generate nextjs`);
15
+ lines.push(``);
16
+ lines.push(`const BASE_URL = process.env.NXF_STUDIO_URL ?? 'https://studio.underpeaks.com'`);
17
+ lines.push(`const PROJECT_ID = process.env.NXF_PROJECT_ID ?? ''`);
18
+ lines.push(`const API_KEY = process.env.NXF_API_KEY ?? ''`);
19
+ lines.push(``);
20
+ lines.push(`const headers = {`);
21
+ lines.push(` 'Content-Type': 'application/json',`);
22
+ lines.push(` 'Authorization': \`Bearer \${API_KEY}\`,`);
23
+ lines.push(`}`);
24
+ lines.push(``);
25
+ if (endpoints.length === 0) {
26
+ lines.push(`// No custom endpoints defined yet.`);
27
+ lines.push(`// Add endpoints in Studio → API Builder to generate functions here.`);
28
+ }
29
+ for (const ep of endpoints) {
30
+ const fnName = toCamelCase(ep.name);
31
+ const method = ep.method.toUpperCase();
32
+ const hasBody = ['POST', 'PUT', 'PATCH'].includes(method);
33
+ const hasFilters = method === 'GET';
34
+ lines.push(`// ── ${ep.name} ─────────────────────────────────────────────────────────`);
35
+ lines.push(`// ${method} ${ep.path}`);
36
+ lines.push(`export async function ${fnName}(${hasFilters ? 'filters?: Record<string, string>' : hasBody ? 'body?: Record<string, unknown>' : ''}) {`);
37
+ lines.push(` const url = new URL(`);
38
+ lines.push(` \`\${BASE_URL}/api-public/v1/\${PROJECT_ID}${ep.path}\``);
39
+ lines.push(` )`);
40
+ if (hasFilters) {
41
+ lines.push(` if (filters) {`);
42
+ lines.push(` Object.entries(filters).forEach(([k, v]) => url.searchParams.set(k, v))`);
43
+ lines.push(` }`);
44
+ }
45
+ lines.push(``);
46
+ lines.push(` const res = await fetch(url.toString(), {`);
47
+ lines.push(` method: '${method}',`);
48
+ lines.push(` headers,`);
49
+ if (hasBody) {
50
+ lines.push(` body: JSON.stringify(body ?? {}),`);
51
+ }
52
+ lines.push(` cache: 'no-store',`);
53
+ lines.push(` })`);
54
+ lines.push(``);
55
+ lines.push(` if (!res.ok) {`);
56
+ lines.push(` const error = await res.json().catch(() => ({ error: 'Unknown error' }))`);
57
+ lines.push(` throw new Error(error.error ?? \`${ep.name} failed: \${res.status}\`)`);
58
+ lines.push(` }`);
59
+ lines.push(``);
60
+ lines.push(` return res.json()`);
61
+ lines.push(`}`);
62
+ lines.push(``);
63
+ }
64
+ return {
65
+ path: 'lib/generated/api/custom-endpoints.ts',
66
+ content: lines.join('\n'),
67
+ category: 'generated',
68
+ };
69
+ }
70
+ function toCamelCase(str) {
71
+ return str
72
+ .toLowerCase()
73
+ .replace(/[^a-z0-9]+(.)/g, (_, c) => c.toUpperCase())
74
+ .replace(/^[A-Z]/, (c) => c.toLowerCase());
75
+ }
76
+ //# sourceMappingURL=api-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-builder.js","sourceRoot":"","sources":["../../src/templates/api-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Model, GeneratedFile, ProjectData } from '@underpeaks/generator-core';
2
+ export declare function generateApiRouteId(model: Model, source?: ProjectData['source']): GeneratedFile;
3
+ //# sourceMappingURL=api-route-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-route-id.d.ts","sourceRoot":"","sources":["../../src/templates/api-route-id.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AASnF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,GAAE,WAAW,CAAC,QAAQ,CAAY,GAAG,aAAa,CA6HxG"}
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ // File: underpeaks_codegen/packages/generator-nextjs/src/templates/api-route-id.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.generateApiRouteId = generateApiRouteId;
5
+ const generator_core_1 = require("@underpeaks/generator-core");
6
+ // FIX: hardcoded /builder/{slug}/{id} path (GET/PUT/DELETE) — broken
7
+ // against Core's real gateway, which has no /builder/ segment AND doesn't
8
+ // use a /[id] URL segment at all: Core's [table]/route.ts reads id via
9
+ // ?id= query param on GET, and { id } in the request body for
10
+ // PATCH/DELETE (not PUT). source now controls both the path shape and
11
+ // the request shape per method.
12
+ function generateApiRouteId(model, source = 'hosted') {
13
+ const className = (0, generator_core_1.modelToClassName)(model.name);
14
+ const fileName = (0, generator_core_1.modelToFileName)(model.name);
15
+ const pk = (0, generator_core_1.getPrimaryKey)(model);
16
+ const pkName = pk?.name ?? 'id';
17
+ const modelSlug = model.name.replace('nxf_', '').replace(/_/g, '-');
18
+ const isCore = source === 'core';
19
+ const basePath = isCore ? model.name : `builder/${modelSlug}`;
20
+ const lines = [];
21
+ lines.push(`// GENERATED FILE — DO NOT EDIT MANUALLY`);
22
+ lines.push(`// Generated by Underpeaks CodeGen v1.0.0`);
23
+ lines.push(`// Source model: ${model.name}`);
24
+ lines.push(``);
25
+ lines.push(`import { NextRequest, NextResponse } from 'next/server'`);
26
+ lines.push(`import type {`);
27
+ lines.push(` ${className},`);
28
+ lines.push(` Update${className}Dto,`);
29
+ lines.push(`} from '../../../../generated/types/${fileName}.types'`);
30
+ lines.push(`import { nxfFetch } from '../../../../lib/nxf-client'`);
31
+ lines.push(``);
32
+ lines.push(`type Params = { ${pkName}: string }`);
33
+ lines.push(``);
34
+ lines.push(`// ── GET /api/${modelSlug}/[${pkName}] ─────────────────────────────────────`);
35
+ lines.push(``);
36
+ lines.push(`export async function GET(`);
37
+ lines.push(` req: NextRequest,`);
38
+ lines.push(` { params }: { params: Promise<Params> },`);
39
+ lines.push(`) {`);
40
+ lines.push(` try {`);
41
+ lines.push(` const { ${pkName} } = await params`);
42
+ if (isCore) {
43
+ lines.push(` // Core's gateway takes the record id as a ?id= query param, not a`);
44
+ lines.push(` // path segment.`);
45
+ lines.push(` const data = await nxfFetch<${className}>(`);
46
+ lines.push(` \`/api-public/v1/\${process.env.NXF_PROJECT_ID}/${basePath}?id=\${${pkName}}\``);
47
+ lines.push(` )`);
48
+ }
49
+ else {
50
+ lines.push(` const data = await nxfFetch<${className}>(`);
51
+ lines.push(` \`/api-public/v1/\${process.env.NXF_PROJECT_ID}/${basePath}/\${${pkName}}\``);
52
+ lines.push(` )`);
53
+ }
54
+ lines.push(` return NextResponse.json({ data })`);
55
+ lines.push(` } catch (err: any) {`);
56
+ lines.push(` const status = err.message?.includes('404') ? 404 : 500`);
57
+ lines.push(` return NextResponse.json({ error: err.message }, { status })`);
58
+ lines.push(` }`);
59
+ lines.push(`}`);
60
+ lines.push(``);
61
+ if (isCore) {
62
+ lines.push(`// ── PATCH /api/${modelSlug}/[${pkName}] ───────────────────────────────────`);
63
+ lines.push(`// Core's gateway only implements PATCH for updates, not PUT — and takes`);
64
+ lines.push(`// { id, ...data } in the request body rather than an id in the URL.`);
65
+ lines.push(``);
66
+ lines.push(`export async function PATCH(`);
67
+ lines.push(` req: NextRequest,`);
68
+ lines.push(` { params }: { params: Promise<Params> },`);
69
+ lines.push(`) {`);
70
+ lines.push(` try {`);
71
+ lines.push(` const { ${pkName} } = await params`);
72
+ lines.push(` const body = await req.json() as Update${className}Dto`);
73
+ lines.push(` const data = await nxfFetch<${className}>(`);
74
+ lines.push(` \`/api-public/v1/\${process.env.NXF_PROJECT_ID}/${basePath}\`,`);
75
+ lines.push(` { method: 'PATCH', body: JSON.stringify({ id: ${pkName}, ...body }) },`);
76
+ lines.push(` )`);
77
+ lines.push(` return NextResponse.json({ data })`);
78
+ lines.push(` } catch (err: any) {`);
79
+ lines.push(` return NextResponse.json({ error: err.message }, { status: 500 })`);
80
+ lines.push(` }`);
81
+ lines.push(`}`);
82
+ }
83
+ else {
84
+ lines.push(`// ── PUT /api/${modelSlug}/[${pkName}] ─────────────────────────────────────`);
85
+ lines.push(``);
86
+ lines.push(`export async function PUT(`);
87
+ lines.push(` req: NextRequest,`);
88
+ lines.push(` { params }: { params: Promise<Params> },`);
89
+ lines.push(`) {`);
90
+ lines.push(` try {`);
91
+ lines.push(` const { ${pkName} } = await params`);
92
+ lines.push(` const body = await req.json() as Update${className}Dto`);
93
+ lines.push(` const data = await nxfFetch<${className}>(`);
94
+ lines.push(` \`/api-public/v1/\${process.env.NXF_PROJECT_ID}/${basePath}/\${${pkName}}\`,`);
95
+ lines.push(` { method: 'PUT', body: JSON.stringify(body) },`);
96
+ lines.push(` )`);
97
+ lines.push(` return NextResponse.json({ data })`);
98
+ lines.push(` } catch (err: any) {`);
99
+ lines.push(` return NextResponse.json({ error: err.message }, { status: 500 })`);
100
+ lines.push(` }`);
101
+ lines.push(`}`);
102
+ }
103
+ lines.push(``);
104
+ lines.push(`// ── DELETE /api/${modelSlug}/[${pkName}] ──────────────────────────────────`);
105
+ lines.push(``);
106
+ lines.push(`export async function DELETE(`);
107
+ lines.push(` req: NextRequest,`);
108
+ lines.push(` { params }: { params: Promise<Params> },`);
109
+ lines.push(`) {`);
110
+ lines.push(` try {`);
111
+ lines.push(` const { ${pkName} } = await params`);
112
+ if (isCore) {
113
+ lines.push(` // Core's gateway takes { id } in the DELETE request body, not a`);
114
+ lines.push(` // path segment.`);
115
+ lines.push(` await nxfFetch(`);
116
+ lines.push(` \`/api-public/v1/\${process.env.NXF_PROJECT_ID}/${basePath}\`,`);
117
+ lines.push(` { method: 'DELETE', body: JSON.stringify({ id: ${pkName} }) },`);
118
+ lines.push(` )`);
119
+ }
120
+ else {
121
+ lines.push(` await nxfFetch(`);
122
+ lines.push(` \`/api-public/v1/\${process.env.NXF_PROJECT_ID}/${basePath}/\${${pkName}}\`,`);
123
+ lines.push(` { method: 'DELETE' },`);
124
+ lines.push(` )`);
125
+ }
126
+ lines.push(` return NextResponse.json({ success: true })`);
127
+ lines.push(` } catch (err: any) {`);
128
+ lines.push(` return NextResponse.json({ error: err.message }, { status: 500 })`);
129
+ lines.push(` }`);
130
+ lines.push(`}`);
131
+ return {
132
+ path: `app/api/${modelSlug}/[${pkName}]/route.ts`,
133
+ content: lines.join('\n'),
134
+ category: 'generated',
135
+ };
136
+ }
137
+ //# sourceMappingURL=api-route-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-route-id.js","sourceRoot":"","sources":["../../src/templates/api-route-id.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Model, GeneratedFile, ProjectData } from '@underpeaks/generator-core';
2
+ export declare function generateApiRoute(model: Model, source?: ProjectData['source']): GeneratedFile;
3
+ //# sourceMappingURL=api-route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-route.d.ts","sourceRoot":"","sources":["../../src/templates/api-route.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAUnF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,GAAE,WAAW,CAAC,QAAQ,CAAY,GAAG,aAAa,CA+EtG"}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ // File: underpeaks_codegen/packages/generator-nextjs/src/templates/api-route.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.generateApiRoute = generateApiRoute;
5
+ const generator_core_1 = require("@underpeaks/generator-core");
6
+ // FIX: hardcoded /builder/{slug} path — broken for Core, whose real gateway
7
+ // has no /builder/ segment and expects X-API-Key, not the Bearer token
8
+ // nxf-client.ts sends. source now threads through from ProjectData.
9
+ function generateApiRoute(model, source = 'hosted') {
10
+ const className = (0, generator_core_1.modelToClassName)(model.name);
11
+ const fileName = (0, generator_core_1.modelToFileName)(model.name);
12
+ const pk = (0, generator_core_1.getPrimaryKey)(model);
13
+ const pkName = pk?.name ?? 'id';
14
+ const modelSlug = model.name.replace('nxf_', '').replace(/_/g, '-');
15
+ // Core: exact table name, no slug transform (matches [table]/route.ts's
16
+ // m.name === tableName lookup against nxf_system_models).
17
+ const endpointPath = source === 'core' ? model.name : `builder/${modelSlug}`;
18
+ const lines = [];
19
+ lines.push(`// GENERATED FILE — DO NOT EDIT MANUALLY`);
20
+ lines.push(`// Generated by Underpeaks CodeGen v1.0.0`);
21
+ lines.push(`// Source model: ${model.name}`);
22
+ lines.push(`// Regenerate: nxf generate nextjs --model=${className}`);
23
+ lines.push(``);
24
+ lines.push(`import { NextRequest, NextResponse } from 'next/server'`);
25
+ lines.push(`import type {`);
26
+ lines.push(` ${className},`);
27
+ lines.push(` Create${className}Dto,`);
28
+ lines.push(` Update${className}Dto,`);
29
+ lines.push(`} from '../../../generated/types/${fileName}.types'`);
30
+ lines.push(`import { nxfFetch } from '../../../lib/nxf-client'`);
31
+ lines.push(``);
32
+ lines.push(`// ── GET /api/${modelSlug} — list all ─────────────────────────────────────`);
33
+ lines.push(``);
34
+ lines.push(`export async function GET(req: NextRequest) {`);
35
+ lines.push(` try {`);
36
+ lines.push(` const { searchParams } = req.nextUrl`);
37
+ lines.push(` const page = searchParams.get('page') ?? '1'`);
38
+ lines.push(` const limit = searchParams.get('limit') ?? '20'`);
39
+ lines.push(``);
40
+ lines.push(` const params = new URLSearchParams()`);
41
+ lines.push(` params.set('page', page)`);
42
+ lines.push(` params.set('limit', limit)`);
43
+ lines.push(` searchParams.forEach((value, key) => {`);
44
+ lines.push(` if (key !== 'page' && key !== 'limit') params.set(key, value)`);
45
+ lines.push(` })`);
46
+ lines.push(``);
47
+ lines.push(` const data = await nxfFetch<${className}[]>(`);
48
+ lines.push(` \`/api-public/v1/\${process.env.NXF_PROJECT_ID}/${endpointPath}?\${params}\``);
49
+ lines.push(` )`);
50
+ lines.push(``);
51
+ lines.push(` return NextResponse.json({ data })`);
52
+ lines.push(` } catch (err: any) {`);
53
+ lines.push(` return NextResponse.json(`);
54
+ lines.push(` { error: err.message },`);
55
+ lines.push(` { status: 500 },`);
56
+ lines.push(` )`);
57
+ lines.push(` }`);
58
+ lines.push(`}`);
59
+ lines.push(``);
60
+ lines.push(`// ── POST /api/${modelSlug} — create ──────────────────────────────────────`);
61
+ lines.push(``);
62
+ lines.push(`export async function POST(req: NextRequest) {`);
63
+ lines.push(` try {`);
64
+ lines.push(` const body = await req.json() as Create${className}Dto`);
65
+ lines.push(``);
66
+ lines.push(` const data = await nxfFetch<${className}>(`);
67
+ lines.push(` \`/api-public/v1/\${process.env.NXF_PROJECT_ID}/${endpointPath}\`,`);
68
+ lines.push(` { method: 'POST', body: JSON.stringify(body) },`);
69
+ lines.push(` )`);
70
+ lines.push(``);
71
+ lines.push(` return NextResponse.json({ data }, { status: 201 })`);
72
+ lines.push(` } catch (err: any) {`);
73
+ lines.push(` return NextResponse.json(`);
74
+ lines.push(` { error: err.message },`);
75
+ lines.push(` { status: 500 },`);
76
+ lines.push(` )`);
77
+ lines.push(` }`);
78
+ lines.push(`}`);
79
+ return {
80
+ path: `app/api/${modelSlug}/route.ts`,
81
+ content: lines.join('\n'),
82
+ category: 'generated',
83
+ };
84
+ }
85
+ //# sourceMappingURL=api-route.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-route.js","sourceRoot":"","sources":["../../src/templates/api-route.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { PageDef, GeneratedFile } from '@underpeaks/generator-core';
2
+ /**
3
+ * generateAppNav
4
+ *
5
+ * Was referenced by layout.ts ('../components/AppNav') but never actually
6
+ * generated by any template — every project with a nav page would fail to
7
+ * build. This is the missing piece.
8
+ *
9
+ * Mirrors Flutter's navigation.ts shell/drawer split, adapted for the web:
10
+ * - top-nav / bottom-nav → a horizontal nav bar (bottom-nav has no native
11
+ * web equivalent as a persistent OS-level bar the way it does on mobile;
12
+ * rendered as a top bar here, same as top-nav, since both express "the
13
+ * same links are always visible" intent).
14
+ * - sidebar-nav / drawer-nav → a collapsible side panel (drawer becomes a
15
+ * toggleable off-canvas panel on mobile widths, persistent sidebar on
16
+ * desktop — matches how most Next.js dashboard layouts behave).
17
+ * If pages mix nav types, sidebar/drawer takes visual priority (rendered
18
+ * as the persistent panel) and top/bottom pages are folded into it as
19
+ * regular links, rather than trying to render two separate nav structures
20
+ * at once.
21
+ */
22
+ export declare function generateAppNav(pages: PageDef[]): GeneratedFile;
23
+ //# sourceMappingURL=app-nav.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-nav.d.ts","sourceRoot":"","sources":["../../src/templates/app-nav.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAExE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,aAAa,CAgH9D"}