@zorgo/next 1.1.2 → 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/server.mjs CHANGED
@@ -1,422 +1 @@
1
- // src/server.ts
2
- import { writeFileSync, mkdirSync } from "fs";
3
- import path from "path";
4
- import { loadEnvConfig } from "@next/env";
5
- import { z } from "zod";
6
-
7
- // src/seo.ts
8
- function priceString(cents) {
9
- return (cents / 100).toFixed(2);
10
- }
11
- function variantOffer(variant) {
12
- return {
13
- "@type": "Offer",
14
- price: priceString(variant.display_price ?? variant.price),
15
- priceCurrency: "USD"
16
- };
17
- }
18
- function menuItemNode(item) {
19
- const node = {
20
- "@type": "MenuItem",
21
- name: item.name
22
- };
23
- if (item.description) node.description = item.description;
24
- const offers = item.variants.map(variantOffer);
25
- if (offers.length === 1) node.offers = offers[0];
26
- else if (offers.length > 1) node.offers = offers;
27
- return node;
28
- }
29
- function buildRestaurantJsonLd(menu2, info) {
30
- const hasMenuSection = menu2.categories.map((category) => {
31
- const section = {
32
- "@type": "MenuSection",
33
- name: category.name
34
- };
35
- const items = menu2.items.filter((item) => item.category_id === category.category_id).map(menuItemNode);
36
- if (items.length) section.hasMenuItem = items;
37
- return section;
38
- });
39
- const restaurant = {
40
- "@context": "https://schema.org",
41
- "@type": "Restaurant",
42
- name: info.name
43
- };
44
- if (info.url) restaurant.url = info.url;
45
- if (info.image) restaurant.image = info.image;
46
- if (info.description) restaurant.description = info.description;
47
- if (info.servesCuisine?.length) restaurant.servesCuisine = info.servesCuisine;
48
- restaurant.hasMenu = {
49
- "@type": "Menu",
50
- name: "Menu",
51
- hasMenuSection
52
- };
53
- return restaurant;
54
- }
55
-
56
- // src/server.ts
57
- function apiBaseUrl() {
58
- return process.env.NEXT_PUBLIC_API_BASE_URL ?? "http://localhost:3000";
59
- }
60
- var SiteTokenError = class extends Error {
61
- reason;
62
- constructor(reason, message, options) {
63
- super(message, options);
64
- this.name = "SiteTokenError";
65
- this.reason = reason;
66
- }
67
- };
68
- async function fetchSiteToken() {
69
- const secret = process.env.ZORGO_SITE_SECRET;
70
- if (!secret) {
71
- throw new SiteTokenError(
72
- "missing-secret",
73
- "ZORGO_SITE_SECRET is not set. Add it to this site's .env."
74
- );
75
- }
76
- const url = `${apiBaseUrl()}/auth/site-token`;
77
- let res;
78
- try {
79
- res = await fetch(url, {
80
- method: "POST",
81
- headers: { "x-zorgo-site-secret": secret }
82
- });
83
- } catch (cause) {
84
- throw new SiteTokenError(
85
- "unreachable",
86
- `Could not reach the site-token endpoint at ${url}. Check NEXT_PUBLIC_API_BASE_URL and that the API is running.`,
87
- { cause }
88
- );
89
- }
90
- if (!res.ok) {
91
- const body = (await res.text().catch(() => "")).slice(0, 200);
92
- throw new SiteTokenError(
93
- "rejected",
94
- `The site-token endpoint rejected the request (${res.status} ${res.statusText}) at ${url}. This usually means ZORGO_SITE_SECRET is wrong for this environment.${body ? ` Response: ${body}` : ""}`
95
- );
96
- }
97
- const { token } = await res.json();
98
- if (!token) {
99
- throw new SiteTokenError(
100
- "rejected",
101
- `The site-token endpoint returned 200 but no token at ${url}.`
102
- );
103
- }
104
- return token;
105
- }
106
- var BrandingSchema = z.object({
107
- backgroundBase: z.string().default("#F5F5F5"),
108
- primary: z.string().default("#3264FF"),
109
- accent: z.string().default("#9696FF"),
110
- fontFamily: z.string().default("Inter")
111
- // Google Font family name
112
- }).prefault({});
113
- var FranchiseSchema = z.object({
114
- name: z.string().nullish().transform((v) => v ?? process.env.ZORGO_PROJECT_NAME ?? "Restaurant"),
115
- site_url: z.string().nullish().transform((v) => v ?? void 0)
116
- }).prefault({});
117
- var HoursSchema = z.array(z.unknown()).prefault([]);
118
- var MenuSchema = z.object({
119
- items: z.array(z.unknown()).default([]),
120
- categories: z.array(z.unknown()).default([]),
121
- components: z.array(z.unknown()).default([]),
122
- rules: z.array(z.unknown()).default([])
123
- });
124
- async function fetchData(endpoint, token, schema) {
125
- try {
126
- const res = await fetch(`${apiBaseUrl()}${endpoint}`, {
127
- headers: { Authorization: `Bearer ${token}` }
128
- });
129
- if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);
130
- const body = await res.json();
131
- return schema.parse(body?.data ?? body);
132
- } catch (err) {
133
- console.error(`prebuild: ${endpoint} failed, using defaults:`, err);
134
- return schema.parse(void 0);
135
- }
136
- }
137
- var FONT_ON_LIGHT = "#0a0a0a";
138
- var FONT_ON_DARK = "#f5f5f5";
139
- var BACKGROUND_SURFACE_DELTA = 15;
140
- var BACKGROUND_TEMPERATURE_BIAS = 8;
141
- function parseHexRgb(background) {
142
- const hex = background.trim().replace(/^#/, "");
143
- const full = hex.length === 3 ? hex.split("").map((c) => c + c).join("") : hex;
144
- if (full.length !== 6 || Number.isNaN(Number.parseInt(full, 16))) {
145
- return null;
146
- }
147
- return {
148
- r: Number.parseInt(full.slice(0, 2), 16),
149
- g: Number.parseInt(full.slice(2, 4), 16),
150
- b: Number.parseInt(full.slice(4, 6), 16)
151
- };
152
- }
153
- function toHex({ r, g, b }) {
154
- return `#${[r, g, b].map((c) => c.toString(16).padStart(2, "0")).join("")}`;
155
- }
156
- function relativeLuminance({ r, g, b }) {
157
- return (0.299 * r + 0.587 * g + 0.114 * b) / 255;
158
- }
159
- function temperatureBiasFor({ r, g, b }) {
160
- return Math.round(BACKGROUND_TEMPERATURE_BIAS * relativeLuminance({ r, g, b }));
161
- }
162
- function deriveFontColor(background) {
163
- const rgb = parseHexRgb(background);
164
- if (!rgb) return FONT_ON_LIGHT;
165
- return relativeLuminance(rgb) > 0.5 ? FONT_ON_LIGHT : FONT_ON_DARK;
166
- }
167
- function deriveElevatedBackground(background) {
168
- const rgb = parseHexRgb(background);
169
- if (!rgb) return background;
170
- const bias = temperatureBiasFor(rgb);
171
- const warm = Math.round(bias / 4);
172
- return toHex({
173
- r: Math.min(255, rgb.r + BACKGROUND_SURFACE_DELTA + warm),
174
- g: Math.min(255, rgb.g + BACKGROUND_SURFACE_DELTA),
175
- b: Math.min(255, rgb.b + BACKGROUND_SURFACE_DELTA - bias)
176
- });
177
- }
178
- function deriveRecessedBackground(background) {
179
- const rgb = parseHexRgb(background);
180
- if (!rgb) return background;
181
- const bias = temperatureBiasFor(rgb);
182
- const cool = Math.round(bias / 4);
183
- return toHex({
184
- r: Math.max(0, rgb.r - BACKGROUND_SURFACE_DELTA - cool),
185
- g: Math.max(0, rgb.g - BACKGROUND_SURFACE_DELTA),
186
- b: Math.max(0, rgb.b - BACKGROUND_SURFACE_DELTA + bias)
187
- });
188
- }
189
- function writeWranglerToml() {
190
- const name = process.env.ZORGO_PROJECT_NAME ?? "zorgo-site";
191
- const siteUrl = process.env.NEXT_PUBLIC_SITE_URL ?? "";
192
- const apiUrl = process.env.NEXT_PUBLIC_API_BASE_URL ?? "";
193
- const baseUrl = process.env.NEXT_PUBLIC_BASE_URL ?? siteUrl;
194
- const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL ?? "";
195
- let host;
196
- try {
197
- host = new URL(siteUrl).hostname;
198
- } catch {
199
- host = void 0;
200
- }
201
- const routes = host ? `
202
- [[routes]]
203
- pattern = "${host}"
204
- custom_domain = true
205
-
206
- [[routes]]
207
- pattern = "www.${host}"
208
- custom_domain = true
209
- ` : "";
210
- const vars = {
211
- NEXT_PUBLIC_SUPABASE_URL: supabaseUrl,
212
- NEXT_PUBLIC_API_BASE_URL: apiUrl,
213
- NEXT_PUBLIC_SITE_URL: siteUrl,
214
- NEXT_PUBLIC_BASE_URL: baseUrl
215
- };
216
- const varsBlock = Object.entries(vars).filter(([, value]) => value !== "").map(([key, value]) => `${key} = "${value}"`).join("\n");
217
- const toml = `# AUTO-GENERATED by scripts/prebuild.ts from .env \u2014 do not edit.
218
- name = "${name}"
219
- main = ".open-next/worker.js"
220
- compatibility_date = "2024-09-23"
221
- compatibility_flags = ["nodejs_compat"]
222
-
223
- # Bundles the Cloudflare worker as part of \`wrangler deploy\` (and \`wrangler dev\`),
224
- # so the deploy command stays a plain \`wrangler deploy\`. prebuild (which writes
225
- # this file + lib/generated) must still run first \u2014 on Cloudflare Workers Builds
226
- # that is the project's Build command; locally it is the npm scripts below.
227
- [build]
228
- command = "npx opennextjs-cloudflare build"
229
-
230
- [assets]
231
- directory = ".open-next/assets"
232
- binding = "ASSETS"
233
-
234
- [vars]
235
- ${varsBlock}
236
-
237
- [observability]
238
- enabled = true
239
-
240
- [observability.logs]
241
- enabled = true
242
- invocation_logs = true
243
- ${routes}`;
244
- writeFileSync(path.join(process.cwd(), "wrangler.toml"), toml);
245
- }
246
- async function logo({ franchiseId, token }) {
247
- const logoResponse = await fetch(
248
- `${apiBaseUrl()}/franchise-info/logo/${franchiseId}`,
249
- { headers: { Authorization: `Bearer ${token}` } }
250
- );
251
- if (!logoResponse.ok) return;
252
- const arrayBuffer = await logoResponse.arrayBuffer();
253
- const buffer = Buffer.from(arrayBuffer);
254
- const outDir = path.join(process.cwd(), `public/images/`);
255
- mkdirSync(outDir, { recursive: true });
256
- writeFileSync(path.join(outDir, "logo.png"), buffer);
257
- writeFileSync(path.join(outDir, "logo.jpg"), buffer);
258
- }
259
- function writeMenuModule(menu2) {
260
- const outDir = path.join(process.cwd(), `lib/generated/`);
261
- mkdirSync(outDir, { recursive: true });
262
- writeFileSync(
263
- path.join(outDir, "menu.ts"),
264
- `// AUTO-GENERATED by scripts/prebuild.ts \u2014 do not edit.
265
- import type { Menu } from "@zorgo/next";
266
-
267
- export const menu: Menu = ${JSON.stringify(menu2, null, 2)};
268
- `
269
- );
270
- }
271
- async function menu({ franchiseId, token }) {
272
- const menuResponse = await fetch(
273
- `${apiBaseUrl()}/franchise-info/menu/${franchiseId}`,
274
- { headers: { Authorization: `Bearer ${token}` } }
275
- );
276
- if (!menuResponse.ok) {
277
- throw new Error(
278
- `menu fetch failed ${menuResponse.status}: ${await menuResponse.text()}`
279
- );
280
- }
281
- const body = await menuResponse.json();
282
- const parsed = MenuSchema.parse(body?.data ?? {});
283
- if (parsed.items.length === 0) {
284
- console.warn(
285
- "prebuild: franchise has no menu items yet \u2014 generating an empty menu. Add items in the dashboard and rebuild to populate the storefront."
286
- );
287
- }
288
- writeMenuModule(parsed);
289
- return parsed;
290
- }
291
- async function jsonLd({ franchiseId, token }, menuData) {
292
- const franchise = await fetchData(
293
- `/franchise-info/franchise/${franchiseId}`,
294
- token,
295
- FranchiseSchema
296
- );
297
- const url = franchise.site_url;
298
- const data = buildRestaurantJsonLd(menuData, {
299
- name: franchise.name,
300
- url,
301
- image: url ? `${url}/images/logo.png` : void 0
302
- });
303
- const outDir = path.join(process.cwd(), `lib/generated/`);
304
- mkdirSync(outDir, { recursive: true });
305
- writeFileSync(
306
- path.join(outDir, "jsonld.ts"),
307
- `// AUTO-GENERATED by scripts/prebuild.ts \u2014 do not edit.
308
- export const restaurantJsonLd = ${JSON.stringify(data, null, 2)};
309
- `
310
- );
311
- }
312
- async function hours({ franchiseId, token }) {
313
- await fetchData(`/franchise-info/hours/${franchiseId}`, token, HoursSchema);
314
- }
315
- async function styles({ franchiseId, token }) {
316
- const brand = await fetchData(
317
- `/franchise-info/styles/${franchiseId}`,
318
- token,
319
- BrandingSchema
320
- );
321
- const branding = {
322
- ...brand,
323
- backgroundElevated: deriveElevatedBackground(brand.backgroundBase),
324
- backgroundRecessed: deriveRecessedBackground(brand.backgroundBase),
325
- foreground: deriveFontColor(brand.backgroundBase),
326
- primaryForeground: deriveFontColor(brand.primary),
327
- accentForeground: deriveFontColor(brand.accent)
328
- };
329
- const stylesDir = path.join(process.cwd(), `public/styles/`);
330
- mkdirSync(stylesDir, { recursive: true });
331
- writeFileSync(
332
- path.join(stylesDir, "styles.json"),
333
- JSON.stringify(branding, null, 2)
334
- );
335
- writeFileSync(
336
- path.join(process.cwd(), "app", "globals.css"),
337
- buildGlobalsCss(brand)
338
- );
339
- }
340
- function buildGlobalsCss(branding) {
341
- const fontFamilyParam = branding.fontFamily.replace(/ /g, "+");
342
- const foreground = deriveFontColor(branding.backgroundBase);
343
- const primaryForeground = deriveFontColor(branding.primary);
344
- const accentForeground = deriveFontColor(branding.accent);
345
- const backgroundElevated = deriveElevatedBackground(branding.backgroundBase);
346
- const backgroundRecessed = deriveRecessedBackground(branding.backgroundBase);
347
- return `
348
- @import url("https://fonts.googleapis.com/css2?family=${fontFamilyParam}:wght@400;700&display=swap");
349
- @import "tailwindcss";
350
- /* Tailwind v4 skips node_modules; @zorgo/next ships un-obfuscated components so
351
- their class names are scannable here. */
352
- @source "../node_modules/@zorgo/next/dist/components.mjs";
353
-
354
- :root {
355
- --background: ${branding.backgroundBase};
356
- --background-elevated: ${backgroundElevated};
357
- --background-recessed: ${backgroundRecessed};
358
- --foreground: ${foreground};
359
- --primary: ${branding.primary};
360
- --primary-foreground: ${primaryForeground};
361
- --accent: ${branding.accent};
362
- --accent-foreground: ${accentForeground};
363
- --font-sans: "${branding.fontFamily}", sans-serif;
364
- }
365
-
366
- @theme inline {
367
- --color-background: var(--background);
368
- --color-background-elevated: var(--background-elevated);
369
- --color-background-recessed: var(--background-recessed);
370
- --color-foreground: var(--foreground);
371
- --color-primary: var(--primary);
372
- --color-primary-foreground: var(--primary-foreground);
373
- --color-accent: var(--accent);
374
- --color-accent-foreground: var(--accent-foreground);
375
- --font-sans: var(--font-sans);
376
- }
377
-
378
- @layer base {
379
- button,
380
- [type="button"],
381
- [type="submit"],
382
- [type="reset"] {
383
- cursor: pointer;
384
- }
385
-
386
- button:disabled,
387
- [type="button"]:disabled,
388
- [type="submit"]:disabled,
389
- [type="reset"]:disabled {
390
- cursor: not-allowed;
391
- }
392
- }
393
- `;
394
- }
395
- async function runPrebuild() {
396
- console.log("running prebuild script...");
397
- loadEnvConfig(process.cwd());
398
- writeWranglerToml();
399
- const token = await fetchSiteToken();
400
- const encodedPayload = token.split(".")[1];
401
- if (!encodedPayload) {
402
- throw new Error("site token is not a well-formed JWT (no payload segment)");
403
- }
404
- const payload = JSON.parse(Buffer.from(encodedPayload, "base64url").toString());
405
- const franchiseId = payload.franchise_ids[0];
406
- const [menuData] = await Promise.all([
407
- menu({ franchiseId, token }),
408
- logo({ franchiseId, token }).catch((err) => console.error("logo failed:", err)),
409
- hours({ franchiseId, token }).catch((err) => console.error("hours failed:", err)),
410
- styles({ franchiseId, token }).catch((err) => console.error("styles failed:", err))
411
- ]);
412
- await jsonLd({ franchiseId, token }, menuData).catch(
413
- (err) => console.error("jsonLd failed:", err)
414
- );
415
- console.log("prebuild script completed");
416
- }
417
- export {
418
- SiteTokenError,
419
- fetchSiteToken,
420
- runPrebuild
421
- };
422
- //# sourceMappingURL=server.mjs.map
1
+ const a0_0x1ccc3e=a0_0x265f;(function(_0x365c70,_0xb732d5){const _0xfd382=a0_0x265f,_0x5f15e6=_0x365c70();while(!![]){try{const _0x5754d4=-parseInt(_0xfd382(0x1c4))/0x1*(parseInt(_0xfd382(0x1e9))/0x2)+-parseInt(_0xfd382(0x1ab))/0x3+parseInt(_0xfd382(0x207))/0x4+-parseInt(_0xfd382(0x1b1))/0x5*(parseInt(_0xfd382(0x1b6))/0x6)+parseInt(_0xfd382(0x19e))/0x7*(-parseInt(_0xfd382(0x199))/0x8)+parseInt(_0xfd382(0x1c3))/0x9+-parseInt(_0xfd382(0x1ef))/0xa*(-parseInt(_0xfd382(0x1cd))/0xb);if(_0x5754d4===_0xb732d5)break;else _0x5f15e6['push'](_0x5f15e6['shift']());}catch(_0x5c7c64){_0x5f15e6['push'](_0x5f15e6['shift']());}}}(a0_0xbb59,0x40a92));import{writeFileSync,mkdirSync}from'fs';import a0_0x2668ce from'path';import{loadEnvConfig}from'@next/env';import{z}from'zod';function a0_0xbb59(){const _0x215af4=['Ahr0CdOVl2XVy2fSAg9ZDdOZmdaW','zgLZCgXHEv9WCMLJzq','twvUDvnLy3rPB24','CNvUBMLUzYbWCMvIDwLSzcbZy3jPChqUlI4','BwfW','zM9UDezHBwLSEq','Dg9tDhjPBMC','x2vTyMvKzgLUzW','igfZihvUA25VD24GyxmGtwvUDtSk','oWOGic0TChjPBwfYEtOG','mtK5ndC2mgT1B0zztG','mJC4mdi3zvD6BfDi','Dg9gAxHLza','q291BgqGBM90ihjLywnOihrOzsbZAxrLlxrVA2vUigvUzhbVAw50igf0ia','oWOGic0TywnJzw50lwzVCMvNCM91BMq6ia','Dw5YzwfJAgfIBgu','zvDtC1q','C2XPy2u','zxjYB3i','AvLXChu','mtfUC1PICg0','oWOGic0TyMfJA2DYB3vUzc1LBgv2yxrLzdOG','ENvlEfi','qwvSqNa','vgHLihnPDguTDg9Rzw4Gzw5KCg9PBNqGCMv0DxjUzwqGmJaWigj1DcbUBYb0B2TLBIbHDca','twvUDq','wufsDLa','y3DK','iIWGC2fUCY1ZzxjPzJSkFqOkqhrOzw1LigLUBgLUzsb7cIaGls1JB2XVCI1IywnRz3jVDw5KoIb2yxiOls1IywnRz3jVDw5KktSkicaTlwnVBg9YlwjHy2TNCM91BMqTzwXLDMf0zwq6ihzHCIGTlwjHy2TNCM91BMqTzwXLDMf0zwqPoWOGic0Ty29SB3iTyMfJA2DYB3vUzc1YzwnLC3nLzdOGDMfYkc0TyMfJA2DYB3vUzc1YzwnLC3nLzcK7cIaGls1JB2XVCI1MB3jLz3jVDw5KoIb2yxiOls1MB3jLz3jVDw5KktSkicaTlwnVBg9YlxbYAw1HCNK6ihzHCIGTlxbYAw1HCNKPoWOGic0Ty29SB3iTChjPBwfYEs1MB3jLz3jVDw5KoIb2yxiOls1WCMLTyxj5lwzVCMvNCM91BMqPoWOGic0Ty29SB3iTywnJzw50oIb2yxiOls1Hy2nLBNqPoWOGic0Ty29SB3iTywnJzw50lwzVCMvNCM91BMq6ihzHCIGTlwfJy2vUDc1MB3jLz3jVDw5KktSkicaTlwzVBNqTC2fUCZOGDMfYkc0TzM9UDc1Zyw5ZktSkFqOkqgXHEwvYigjHC2uGEWOGigj1DhrVBIWkicbBDhLWzt0IyNv0Dg9UiL0ScIaGw3r5Cgu9iNn1yM1PDcjDlaOGifT0ExbLpsjYzxnLDcjDihSkicaGign1CNnVCJOGCg9PBNrLCJSkicb9cGOGigj1DhrVBJPKAxnHyMXLzcWkicbBDhLWzt0IyNv0Dg9UiL06zgLZywjSzwqScIaGw3r5Cgu9iNn1yM1PDcjDoMrPC2fIBgvKlaOGifT0ExbLpsjYzxnLDcjDoMrPC2fIBgvKihSkicaGign1CNnVCJOGBM90lwfSBg93zwq7cIaGFqP9cG','qw1bC3u','DMfYAwfUDhm','CgfKu3rHCNq','oNDNAhrandaWoZCWmczKAxnWBgf5pxn3yxaIktSkqgLTCg9YDcaIDgfPBhDPBMrJC3mIoWOVkIbuywLSD2LUzcb2ncbZA2LWCYbUB2rLx21VzhvSzxm7ieb6B3jNBY9UzxH0ihnOAxbZihvUlw9IzNvZy2f0zwqGy29TCg9Uzw50CYbZBWOGicb0AgvPCIbJBgfZCYbUyw1LCYbHCMuGC2nHBM5HyMXLigHLCMuUicOVcKbZB3vYy2uGiI4Ul25VzgvFBw9KDwXLCY9aEM9Yz28VBMv4Dc9KAxn0l2nVBxbVBMvUDhmUBwPZiJSkcJPYB290ihSkicaTlwjHy2TNCM91BMq6ia','DMLyuxa','BwLZC2LUzY1ZzwnYzxq','Dw5RBM93BG','ze5czgG','ifjLC3bVBNnLoIa','AgfZtwvUDq','ChvIBgLJl3n0EwXLCY8','ue9tva','uMvZDgf1CMfUDa','ve95qMi','reDVvuS','Dgv4Da','ChjPy2u','vvne','CMvQzwn0zwq','mKPntgLyAq','AgLRwfK','lY8GqvvutY1hru5fuKfuruqGyNKGC2nYAxb0CY9WCMvIDwLSzc50CYdIGjqGzg8GBM90igvKAxqUcMv4Cg9YDcbJB25ZDcbYzxn0yxvYyw50sNnVBKXKid0G','CgfYC2u','u2HRqvm','C2L0zv91CMW','ndyXmZeZmfvJz3LutG','t1HWyu8','zNjVBq','qxjiwxe','BgvUz3rO','l2zYyw5JAgLZzs1PBMzVl2XVz28V','ksbHDca','vgHLihnPDguTDg9Rzw4Gzw5KCg9PBNqGCMvQzwn0zwqGDgHLihjLCxvLC3qGka','Axnoyu4','BLv3AKi','i0y1rJvgnq','rKfhveu','wwjfyue','C2vYDMvZq3vPC2LUzq','zNjHBMnOAxnLx2LKCW','q3niCMy','CM91BMq','wgv4C2y','l2zYyw5JAgLZzs1PBMzVl2HVDxjZlW','D2fYBG','AgfZtwvUDuL0zw0','t2zMzxi','ANnVBG','C3rYAw5N','nti4mJq4u1fIuMHO','ve9kAfy','AxrLBxm','C3bSAxq','Bg9N','CMvWBgfJzq','BgLIl2DLBMvYyxrLzc8','CMvHC29U','yvjqCw4','AM9PBG','x3zLy3rVCG','yNn4rey','BNvSBgLZAa','Ag9ZDg5HBwu','Bu5zBwW','r1rSywq','zw50CMLLCW','Bg9NBY5QCgC','Bg9NBY5WBMC','BwvUDsbMzxrJAcbMywLSzwqG','zgf0yq','z2XVyMfSCY5JC3m','oWOGic0TyMfJA2DYB3vUzc1YzwnLC3nLzdOG','l2f1DgGVC2L0zs10B2TLBG','twvUDuL0zw0','zMLSDgvY','zgvMyxvSDa','id0GiG','oWOGic0TzM9UDc1Zyw5ZoIaI','ChjLyNvPBgq6igzYyw5JAgLZzsbOyxmGBM8GBwvUDsbPDgvTCYb5zxqG4OcuigDLBMvYyxrPBMCGyw4Gzw1WDhKGBwvUDs4GqwrKigL0zw1ZigLUihrOzsbKyxnOyM9HCMqGyw5KihjLyNvPBgqGDg8GCg9WDwXHDguGDgHLihn0B3jLzNjVBNqU','tw9yDei','wLbmBNK','DxjS','oWOGic0TChjPBwfYEs1MB3jLz3jVDw5KoIa','D3jHBMDSzxiUDg9TBa','yxjYyxK','rvvor2C','ywXS','cLTBCM91DgvZxv0kCgf0DgvYBIa9ici','B2jQzwn0','DhjHBNnMB3jT','l2zYyw5JAgLZzs1PBMzVl21LBNuV','ANnVBKXKigzHAwXLzdO','CgfYC2vjBNq','ywnJzw50','oWOGic0TzM9YzwDYB3vUzdOG','iZbHmgeWyq','s29NquO','tuPgEey','cKbPBxbVCNqGDxjSkcjODhrWCZOVl2zVBNrZlMDVB2DSzwfWAxmUy29Tl2nZCZi/zMfTAwX5pq','DhjPBq','Bwf4','y2f0y2G','EhfuwMO','C3rHDhvZ','iZmYnJrgrG','ChjLzMf1Bhq','iGPJDxn0B21Fzg9TywLUid0GDhj1zqOkw1TYB3v0zxnDxqPWyxr0zxjUid0GiND3DY4','qKTyr1i','v1fMvgq','t0fwr2m','vxLkA3q','l2LTywDLCY9SB2DVlNbUzW','zgvZy3jPChrPB24','sMr6Awy','nJreqM1Rzgq','AgL1vxa','ANnVBMXKlNrZ','BwLU','ChvIBgLJl2LTywDLCY8','ote5nJzOsNDLC2O','Ag91CNmGzMfPBgvKoG','iGPTywLUid0GiI5VCgvUlw5LEhqVD29YA2vYlMPZiGPJB21WyxrPyMLSAxr5x2rHDguGpsaImJaYnc0Wos0YmYiky29TCgf0AwjPBgL0Ev9MBgfNCYa9ifSIBM9KzwPZx2nVBxbHDcjDcGOJiej1BMrSzxmGDgHLienSB3vKzMXHCMuGD29YA2vYigfZihbHCNqGB2yGyhDYyw5NBgvYigrLCgXVEwaGkgfUzcbGD3jHBMDSzxiGzgv2ycKScImGC28GDgHLigrLCgXVEsbJB21Tyw5Kihn0yxLZigeGCgXHAw4GyhDYyw5NBgvYigrLCgXVEwaUihbYzwj1AwXKicH3AgLJAcb3CML0zxmkiYb0AgLZigzPBguGkYbSAwiVz2vUzxjHDgvKksbTDxn0ihn0AwXSihj1BIbMAxjZDcdIGjqGB24Gq2XVDwrMBgfYzsbxB3jRzxjZiej1AwXKCWOJihrOyxqGAxmGDgHLihbYB2PLy3qNCYbcDwLSzcbJB21Tyw5KoYbSB2nHBgX5igL0igLZihrOzsbUCg0GC2nYAxb0CYbIzwXVDY4kw2j1AwXKxqPJB21Tyw5Kid0GiM5WEcbVCgvUBMv4DgPZlwnSB3vKzMXHCMuGyNvPBgqIcGPByxnZzxrZxqPKAxjLy3rVCNKGpsaIlM9Wzw4TBMv4Dc9HC3nLDhmIcMjPBMrPBMCGpsaIqvntrvrtiGOkw3zHCNnDcG','B2zMzxjZ','l2zYyw5JAgLZzs1PBMzVl3n0EwXLCY8','C3rYAw5NAwz5','u2L0zvrVA2vUrxjYB3i','yxbW','sKDTDNG','D1PNyNK','AKDsr2C','Aw1Hz2u','oWOGic0TywnJzw50oIa','mJu1nty0q052Be5O','BMfTzq','y2f0zwDVCNLFAwq','qMvHCMvYia','A3Pqzge','ChjPBwfYEq','mJi3mZvXrNfmExq','Ahr0Chm6lY9Zy2HLBweUB3jN','C3r5BgvZigzHAwXLzdO','zw5KC1DPDgG','igzHAwXLzcWGDxnPBMCGzgvMyxvSDhm6','mta4BfrfwurX','yMfJA2DYB3vUzejHC2u','lIbuAgLZihvZDwfSBhKGBwvHBNmGwK9sr09Fu0Lurv9trunsrvqGAxmGD3jVBMCGzM9YihrOAxmGzw52AxjVBM1LBNqU'];a0_0xbb59=function(){return _0x215af4;};return a0_0xbb59();}function priceString(_0x403c9c){const _0x50ac7f=a0_0x265f,_0x2ac307={'wZgby':function(_0x36868c,_0x37edfb){return _0x36868c/_0x37edfb;}};return _0x2ac307[_0x50ac7f(0x1a7)](_0x403c9c,0x64)[_0x50ac7f(0x1c5)](0x2);}function variantOffer(_0x401fa2){const _0x17ff58=a0_0x265f,_0x535576={'MoXtB':function(_0x55b8d4,_0x5296c6){return _0x55b8d4(_0x5296c6);},'JGmvx':_0x17ff58(0x1e7)};return{'@type':_0x17ff58(0x204),'price':_0x535576[_0x17ff58(0x176)](priceString,_0x401fa2[_0x17ff58(0x1ba)]??_0x401fa2[_0x17ff58(0x1e6)]),'priceCurrency':_0x535576[_0x17ff58(0x1a6)]};}function menuItemNode(_0x2e68be){const _0x34166e=a0_0x265f,_0x3afeb9={'@type':_0x34166e(0x170),'name':_0x2e68be[_0x34166e(0x1ac)]};if(_0x2e68be[_0x34166e(0x197)])_0x3afeb9[_0x34166e(0x197)]=_0x2e68be[_0x34166e(0x197)];const _0x21542c=_0x2e68be[_0x34166e(0x1d7)][_0x34166e(0x1bd)](variantOffer);if(_0x21542c[_0x34166e(0x1f3)]===0x1)_0x3afeb9[_0x34166e(0x1a1)]=_0x21542c[0x0];else{if(_0x21542c[_0x34166e(0x1f3)]>0x1)_0x3afeb9[_0x34166e(0x1a1)]=_0x21542c;}return _0x3afeb9;}function buildRestaurantJsonLd(_0x101465,_0xa811fa){const _0x2389c0=a0_0x265f,_0x416324={'hikXY':_0x2389c0(0x1bb),'TOJhV':_0x2389c0(0x1b2),'OAVGc':_0x2389c0(0x1d2)},_0x338b4c=_0x101465['categories'][_0x2389c0(0x1bd)](_0x579e9a=>{const _0x2cf9b6=_0x2389c0,_0x43190f={'@type':_0x416324[_0x2cf9b6(0x1ea)],'name':_0x579e9a[_0x2cf9b6(0x1ac)]},_0x416f8b=_0x101465[_0x2cf9b6(0x209)]['filter'](_0x6095e2=>_0x6095e2[_0x2cf9b6(0x1ad)]===_0x579e9a[_0x2cf9b6(0x1ad)])[_0x2cf9b6(0x1bd)](menuItemNode);if(_0x416f8b[_0x2cf9b6(0x1f3)])_0x43190f[_0x2cf9b6(0x203)]=_0x416f8b;return _0x43190f;}),_0x171ebc={'@context':_0x416324[_0x2389c0(0x208)],'@type':_0x2389c0(0x1e2),'name':_0xa811fa['name']};if(_0xa811fa[_0x2389c0(0x178)])_0x171ebc['url']=_0xa811fa[_0x2389c0(0x178)];if(_0xa811fa[_0x2389c0(0x1a9)])_0x171ebc[_0x2389c0(0x1a9)]=_0xa811fa[_0x2389c0(0x1a9)];if(_0xa811fa['description'])_0x171ebc['description']=_0xa811fa['description'];if(_0xa811fa['servesCuisine']?.['length'])_0x171ebc[_0x2389c0(0x1fc)]=_0xa811fa[_0x2389c0(0x1fc)];return _0x171ebc[_0x2389c0(0x1df)]={'@type':_0x416324[_0x2389c0(0x194)],'name':_0x416324[_0x2389c0(0x194)],'hasMenuSection':_0x338b4c},_0x171ebc;}function apiBaseUrl(){const _0x2f621a=a0_0x265f;return process.env.NEXT_PUBLIC_API_BASE_URL??_0x2f621a(0x1b9);}var SiteTokenError=class extends Error{[a0_0x1ccc3e(0x20e)];constructor(_0x48b872,_0x34caf7,_0x25c558){const _0x7d24fa=a0_0x1ccc3e;super(_0x34caf7,_0x25c558),this[_0x7d24fa(0x1ac)]=_0x7d24fa(0x1a4),this[_0x7d24fa(0x20e)]=_0x48b872;}};async function fetchSiteToken(){const _0x3bc8b0=a0_0x1ccc3e,_0x7558ea={'YbEaA':function(_0xf4e3ed,_0x306751){return _0xf4e3ed===_0x306751;},'wYMcQ':'ZORGO_SITE_SECRET\x20is\x20not\x20set.\x20Add\x20it\x20to\x20this\x20site\x27s\x20.env.','MJFxF':function(_0x51303c){return _0x51303c();},'jGRGg':_0x3bc8b0(0x1e1),'ArHYq':_0x3bc8b0(0x1fa),'Xexsf':_0x3bc8b0(0x1e8)},_0x4d0da3=process.env.ZORGO_SITE_SECRET;if(!_0x4d0da3)throw new SiteTokenError(_0x3bc8b0(0x1db),_0x7558ea['wYMcQ']);const _0x1d1b49=_0x7558ea[_0x3bc8b0(0x188)](apiBaseUrl)+_0x3bc8b0(0x16f);let _0x32e29e;try{_0x32e29e=await fetch(_0x1d1b49,{'method':_0x7558ea[_0x3bc8b0(0x1a8)],'headers':{'x-zorgo-site-secret':_0x4d0da3}});}catch(_0x5ba76f){if(_0x7558ea[_0x3bc8b0(0x1f2)]!==_0x3bc8b0(0x18d))throw new SiteTokenError(_0x3bc8b0(0x1c8),_0x3bc8b0(0x1c6)+_0x1d1b49+'.\x20Check\x20NEXT_PUBLIC_API_BASE_URL\x20and\x20that\x20the\x20API\x20is\x20running.',{'cause':_0x5ba76f});else{const _0x18726b=_0x3241a8[_0x3bc8b0(0x18a)]()['replace'](/^#/,''),_0x4f5f03=_0x7558ea[_0x3bc8b0(0x1fb)](_0x18726b['length'],0x3)?_0x18726b[_0x3bc8b0(0x20a)]('')['map'](_0x3d077a=>_0x3d077a+_0x3d077a)['join'](''):_0x18726b;if(_0x4f5f03[_0x3bc8b0(0x1f3)]!==0x6||_0x364104[_0x3bc8b0(0x1f7)](_0x538b32[_0x3bc8b0(0x183)](_0x4f5f03,0x10)))return null;return{'r':_0x2a3783[_0x3bc8b0(0x183)](_0x4f5f03[_0x3bc8b0(0x1ca)](0x0,0x2),0x10),'g':_0x36c88f[_0x3bc8b0(0x183)](_0x4f5f03[_0x3bc8b0(0x1ca)](0x2,0x4),0x10),'b':_0x4fe021[_0x3bc8b0(0x183)](_0x4f5f03[_0x3bc8b0(0x1ca)](0x4,0x6),0x10)};}}if(!_0x32e29e['ok']){const _0x38c220=(await _0x32e29e[_0x3bc8b0(0x1e5)]()['catch'](()=>''))[_0x3bc8b0(0x1ca)](0x0,0xc8);throw new SiteTokenError(_0x7558ea['Xexsf'],_0x3bc8b0(0x1f6)+_0x32e29e[_0x3bc8b0(0x18e)]+'\x20'+_0x32e29e['statusText']+_0x3bc8b0(0x1f5)+_0x1d1b49+_0x3bc8b0(0x1b8)+(_0x38c220?_0x3bc8b0(0x1de)+_0x38c220:''));}const {token:_0x2f5010}=await _0x32e29e[_0x3bc8b0(0x205)]();if(!_0x2f5010)throw new SiteTokenError(_0x7558ea[_0x3bc8b0(0x200)],_0x3bc8b0(0x1d1)+_0x1d1b49+'.');return _0x2f5010;}var BrandingSchema=z['object']({'backgroundBase':z[a0_0x1ccc3e(0x206)]()[a0_0x1ccc3e(0x172)](a0_0x1ccc3e(0x1f9)),'primary':z[a0_0x1ccc3e(0x206)]()[a0_0x1ccc3e(0x172)](a0_0x1ccc3e(0x18f)),'accent':z[a0_0x1ccc3e(0x206)]()[a0_0x1ccc3e(0x172)]('#9696FF'),'fontFamily':z[a0_0x1ccc3e(0x206)]()[a0_0x1ccc3e(0x172)]('Inter')})[a0_0x1ccc3e(0x190)]({}),FranchiseSchema=z[a0_0x1ccc3e(0x17f)]({'name':z[a0_0x1ccc3e(0x206)]()[a0_0x1ccc3e(0x213)]()[a0_0x1ccc3e(0x180)](_0x175e08=>_0x175e08??process.env.ZORGO_PROJECT_NAME??'Restaurant'),'site_url':z[a0_0x1ccc3e(0x206)]()[a0_0x1ccc3e(0x213)]()[a0_0x1ccc3e(0x180)](_0x20b2f2=>_0x20b2f2??void 0x0)})['prefault']({}),HoursSchema=z[a0_0x1ccc3e(0x17b)](z[a0_0x1ccc3e(0x1dc)]())[a0_0x1ccc3e(0x190)]([]),MenuSchema=z[a0_0x1ccc3e(0x17f)]({'items':z[a0_0x1ccc3e(0x17b)](z['unknown']())[a0_0x1ccc3e(0x172)]([]),'categories':z['array'](z[a0_0x1ccc3e(0x1dc)]())[a0_0x1ccc3e(0x172)]([]),'components':z[a0_0x1ccc3e(0x17b)](z[a0_0x1ccc3e(0x1dc)]())[a0_0x1ccc3e(0x172)]([]),'rules':z[a0_0x1ccc3e(0x17b)](z[a0_0x1ccc3e(0x1dc)]())['default']([])});async function fetchData(_0x17ded5,_0x26d52a,_0x2695f8){const _0x13cf22=a0_0x1ccc3e,_0x2f8477={'nUwjB':function(_0x14b4e7){return _0x14b4e7();}};try{const _0x2259bd=await fetch(''+_0x2f8477[_0x13cf22(0x1f8)](apiBaseUrl)+_0x17ded5,{'headers':{'Authorization':_0x13cf22(0x1ae)+_0x26d52a}});if(!_0x2259bd['ok'])throw new Error(_0x2259bd[_0x13cf22(0x18e)]+':\x20'+await _0x2259bd[_0x13cf22(0x1e5)]());const _0x1d3f18=await _0x2259bd[_0x13cf22(0x205)]();return _0x2695f8[_0x13cf22(0x1ec)](_0x1d3f18?.[_0x13cf22(0x16c)]??_0x1d3f18);}catch(_0x5cce3d){return console[_0x13cf22(0x1cb)]('prebuild:\x20'+_0x17ded5+_0x13cf22(0x1b5),_0x5cce3d),_0x2695f8[_0x13cf22(0x1ec)](void 0x0);}}var FONT_ON_LIGHT=a0_0x1ccc3e(0x186),FONT_ON_DARK='#f5f5f5',BACKGROUND_SURFACE_DELTA=0xf,BACKGROUND_TEMPERATURE_BIAS=0x8;function parseHexRgb(_0x26b251){const _0x199273=a0_0x1ccc3e,_0x426366={'aRPqn':function(_0xef1e18,_0x640bc1){return _0xef1e18(_0x640bc1);},'xSOsk':function(_0x3fb5a7,_0x3216d3){return _0x3fb5a7!==_0x3216d3;},'BKXGR':_0x199273(0x1fe)},_0x219406=_0x26b251[_0x199273(0x18a)]()[_0x199273(0x20c)](/^#/,''),_0x1aea65=_0x219406[_0x199273(0x1f3)]===0x3?_0x219406[_0x199273(0x20a)]('')[_0x199273(0x1bd)](_0x4e42ae=>_0x4e42ae+_0x4e42ae)[_0x199273(0x210)](''):_0x219406;if(_0x426366['xSOsk'](_0x1aea65[_0x199273(0x1f3)],0x6)||Number[_0x199273(0x1f7)](Number[_0x199273(0x183)](_0x1aea65,0x10))){if(_0x426366[_0x199273(0x192)]!==_0x199273(0x177))return null;else{const _0x181f18=_0x4e1e12[_0x199273(0x1be)][_0x199273(0x20c)](/ /g,'+'),_0x1a7376=_0x900e40(_0x374973[_0x199273(0x1b7)]),_0x1d0702=_0x5e5368(_0x447f1e[_0x199273(0x1b0)]),_0x2b216c=_0x30935f(_0x30cbf8[_0x199273(0x184)]),_0x2713e0=_0x426366[_0x199273(0x20f)](_0x124e0b,_0x5a05ff[_0x199273(0x1b7)]),_0x26053b=_0x51c337(_0x3d6ef6[_0x199273(0x1b7)]);return _0x199273(0x189)+_0x181f18+_0x199273(0x1d9)+_0x28ef99['backgroundBase']+_0x199273(0x1ce)+_0x2713e0+';\x0a\x20\x20--background-recessed:\x20'+_0x26053b+_0x199273(0x185)+_0x1a7376+_0x199273(0x1c2)+_0xb56b4d['primary']+_0x199273(0x179)+_0x1d0702+_0x199273(0x1aa)+_0x3a58d4[_0x199273(0x184)]+_0x199273(0x1c7)+_0x2b216c+_0x199273(0x174)+_0x22feb3[_0x199273(0x1be)]+_0x199273(0x1d5);}}return{'r':Number[_0x199273(0x183)](_0x1aea65[_0x199273(0x1ca)](0x0,0x2),0x10),'g':Number[_0x199273(0x183)](_0x1aea65['slice'](0x2,0x4),0x10),'b':Number['parseInt'](_0x1aea65[_0x199273(0x1ca)](0x4,0x6),0x10)};}function toHex({r:_0x423ea8,g:_0x472ed9,b:_0x30a3ab}){const _0x2ecf26=a0_0x1ccc3e;return'#'+[_0x423ea8,_0x472ed9,_0x30a3ab]['map'](_0x4b7602=>_0x4b7602['toString'](0x10)[_0x2ecf26(0x1d8)](0x2,'0'))['join']('');}function relativeLuminance({r:_0x165fe4,g:_0x42fd70,b:_0x216277}){const _0x36d5ba=a0_0x1ccc3e,_0x7d82ee={'mNYml':function(_0x4c77c7,_0x181d60){return _0x4c77c7/_0x181d60;},'YARvP':function(_0x10a567,_0x832390){return _0x10a567+_0x832390;}};return _0x7d82ee[_0x36d5ba(0x166)](_0x7d82ee[_0x36d5ba(0x1d3)](0.299*_0x165fe4+0.587*_0x42fd70,0.114*_0x216277),0xff);}function temperatureBiasFor({r:_0x401d80,g:_0x294a56,b:_0x47e227}){const _0x416f6a=a0_0x1ccc3e,_0x3dc0e2={'dNBdh':function(_0x1c5933,_0x60c334){return _0x1c5933*_0x60c334;},'OXpaO':function(_0x10e8ce,_0x3c503d){return _0x10e8ce(_0x3c503d);}};return Math[_0x416f6a(0x1ff)](_0x3dc0e2[_0x416f6a(0x1dd)](BACKGROUND_TEMPERATURE_BIAS,_0x3dc0e2[_0x416f6a(0x1f0)](relativeLuminance,{'r':_0x401d80,'g':_0x294a56,'b':_0x47e227})));}function deriveFontColor(_0x5db2e7){const _0x3a3edc={'rbzCm':function(_0x52ee7b,_0x2b7a6a){return _0x52ee7b(_0x2b7a6a);}},_0x12de87=_0x3a3edc['rbzCm'](parseHexRgb,_0x5db2e7);if(!_0x12de87)return FONT_ON_LIGHT;return relativeLuminance(_0x12de87)>0.5?FONT_ON_LIGHT:FONT_ON_DARK;}function deriveElevatedBackground(_0x50801b){const _0x349f79=a0_0x1ccc3e,_0x2fcfb0={'XhSXt':function(_0x52441e,_0x3cfe7f){return _0x52441e(_0x3cfe7f);},'WQfTd':function(_0x46dcd4,_0x2edb3f){return _0x46dcd4+_0x2edb3f;},'KogAJ':function(_0x10c98d,_0x549d5a){return _0x10c98d+_0x549d5a;}},_0x5d99d9=parseHexRgb(_0x50801b);if(!_0x5d99d9)return _0x50801b;const _0x36b805=temperatureBiasFor(_0x5d99d9),_0x2c5f84=Math[_0x349f79(0x1ff)](_0x36b805/0x4);return _0x2fcfb0['XhSXt'](toHex,{'r':Math['min'](0xff,_0x2fcfb0[_0x349f79(0x193)](_0x5d99d9['r']+BACKGROUND_SURFACE_DELTA,_0x2c5f84)),'g':Math['min'](0xff,_0x2fcfb0[_0x349f79(0x187)](_0x5d99d9['g'],BACKGROUND_SURFACE_DELTA)),'b':Math[_0x349f79(0x19c)](0xff,_0x5d99d9['b']+BACKGROUND_SURFACE_DELTA-_0x36b805)});}function deriveRecessedBackground(_0x1e6669){const _0x5dd27c=a0_0x1ccc3e,_0x29b42a={'bsxDF':function(_0x1db2d2,_0xe8a9c5){return _0x1db2d2(_0xe8a9c5);},'EUNGg':function(_0x3864cd,_0x3de792){return _0x3864cd-_0x3de792;}},_0x1a5e9e=_0x29b42a[_0x5dd27c(0x212)](parseHexRgb,_0x1e6669);if(!_0x1a5e9e)return _0x1e6669;const _0x134d81=_0x29b42a['bsxDF'](temperatureBiasFor,_0x1a5e9e),_0x18ec63=Math[_0x5dd27c(0x1ff)](_0x134d81/0x4);return toHex({'r':Math['max'](0x0,_0x29b42a[_0x5dd27c(0x17c)](_0x1a5e9e['r']-BACKGROUND_SURFACE_DELTA,_0x18ec63)),'g':Math[_0x5dd27c(0x18b)](0x0,_0x1a5e9e['g']-BACKGROUND_SURFACE_DELTA),'b':Math[_0x5dd27c(0x18b)](0x0,_0x29b42a[_0x5dd27c(0x17c)](_0x1a5e9e['b'],BACKGROUND_SURFACE_DELTA)+_0x134d81)});}function writeWranglerToml(){const _0x1871bb=a0_0x1ccc3e,_0x4c470f={'rgAQI':_0x1871bb(0x17a)},_0x50569b=process.env.ZORGO_PROJECT_NAME??'zorgo-site',_0x24f60f=process.env.NEXT_PUBLIC_SITE_URL??'',_0x297479=process.env.NEXT_PUBLIC_API_BASE_URL??'',_0x49c509=process.env.NEXT_PUBLIC_BASE_URL??_0x24f60f,_0x4a2976=process.env.NEXT_PUBLIC_SUPABASE_URL??'';let _0x4a9854;try{_0x4a9854=new URL(_0x24f60f)[_0x1871bb(0x214)];}catch{_0x4a9854=void 0x0;}const _0x2950a9=_0x4a9854?_0x1871bb(0x17e)+_0x4a9854+_0x1871bb(0x191)+_0x4a9854+'\x22\x0acustom_domain\x20=\x20true\x0a':'',_0x53fb76={'NEXT_PUBLIC_SUPABASE_URL':_0x4a2976,'NEXT_PUBLIC_API_BASE_URL':_0x297479,'NEXT_PUBLIC_SITE_URL':_0x24f60f,'NEXT_PUBLIC_BASE_URL':_0x49c509},_0x14ea0a=Object[_0x1871bb(0x168)](_0x53fb76)[_0x1871bb(0x171)](([,_0x42bd84])=>_0x42bd84!=='')[_0x1871bb(0x1bd)](([_0x19335a,_0x2b7c99])=>_0x19335a+_0x1871bb(0x173)+_0x2b7c99+'\x22')[_0x1871bb(0x210)]('\x0a'),_0x422210='#\x20AUTO-GENERATED\x20by\x20scripts/prebuild.ts\x20from\x20.env\x20—\x20do\x20not\x20edit.\x0aname\x20=\x20\x22'+_0x50569b+_0x1871bb(0x1a0)+_0x14ea0a+'\x0a\x0a[observability]\x0aenabled\x20=\x20true\x0a\x0a[observability.logs]\x0aenabled\x20=\x20true\x0ainvocation_logs\x20=\x20true\x0a'+_0x2950a9;writeFileSync(a0_0x2668ce[_0x1871bb(0x210)](process[_0x1871bb(0x1d4)](),_0x4c470f['rgAQI']),_0x422210);}function a0_0x265f(_0xc4f413,_0x51777c){_0xc4f413=_0xc4f413-0x166;const _0xbb590a=a0_0xbb59();let _0x265f20=_0xbb590a[_0xc4f413];if(a0_0x265f['hMwebC']===undefined){var _0x39e29=function(_0x50ea84){const _0x294648='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x4ac414='',_0x13e593='';for(let _0x5569b6=0x0,_0x2ecc80,_0x2f5ab3,_0x437d36=0x0;_0x2f5ab3=_0x50ea84['charAt'](_0x437d36++);~_0x2f5ab3&&(_0x2ecc80=_0x5569b6%0x4?_0x2ecc80*0x40+_0x2f5ab3:_0x2f5ab3,_0x5569b6++%0x4)?_0x4ac414+=String['fromCharCode'](0xff&_0x2ecc80>>(-0x2*_0x5569b6&0x6)):0x0){_0x2f5ab3=_0x294648['indexOf'](_0x2f5ab3);}for(let _0x686c81=0x0,_0x465a33=_0x4ac414['length'];_0x686c81<_0x465a33;_0x686c81++){_0x13e593+='%'+('00'+_0x4ac414['charCodeAt'](_0x686c81)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x13e593);};a0_0x265f['sqrlxx']=_0x39e29,a0_0x265f['uyuuHA']={},a0_0x265f['hMwebC']=!![];}const _0x367006=_0xbb590a[0x0],_0x42193d=_0xc4f413+_0x367006,_0x5823cb=a0_0x265f['uyuuHA'][_0x42193d];return!_0x5823cb?(_0x265f20=a0_0x265f['sqrlxx'](_0x265f20),a0_0x265f['uyuuHA'][_0x42193d]=_0x265f20):_0x265f20=_0x5823cb,_0x265f20;}async function logo({franchiseId:_0x2cbbac,token:_0xf57d}){const _0x2ab25f=a0_0x1ccc3e,_0x4ee12e={'TOyBb':function(_0x6aedda,_0x3db90e,_0x3429ed){return _0x6aedda(_0x3db90e,_0x3429ed);},'hiuUp':_0x2ab25f(0x16a),'GTlad':function(_0x31f097,_0xabf6f,_0x2f1dab){return _0x31f097(_0xabf6f,_0x2f1dab);}},_0x12a297=await _0x4ee12e[_0x2ab25f(0x1e3)](fetch,apiBaseUrl()+_0x2ab25f(0x1f4)+_0x2cbbac,{'headers':{'Authorization':'Bearer\x20'+_0xf57d}});if(!_0x12a297['ok'])return;const _0x583013=await _0x12a297['arrayBuffer'](),_0x4f9f16=Buffer[_0x2ab25f(0x1f1)](_0x583013),_0x14fdf7=a0_0x2668ce[_0x2ab25f(0x210)](process[_0x2ab25f(0x1d4)](),_0x2ab25f(0x19d));mkdirSync(_0x14fdf7,{'recursive':!![]}),_0x4ee12e[_0x2ab25f(0x1e3)](writeFileSync,a0_0x2668ce[_0x2ab25f(0x210)](_0x14fdf7,_0x4ee12e[_0x2ab25f(0x19a)]),_0x4f9f16),_0x4ee12e[_0x2ab25f(0x167)](writeFileSync,a0_0x2668ce[_0x2ab25f(0x210)](_0x14fdf7,_0x2ab25f(0x169)),_0x4f9f16);}var dropHeavyColumns=(_0x28847e,_0x2240c6)=>_0x28847e[a0_0x1ccc3e(0x1b4)](a0_0x1ccc3e(0x211))||_0x28847e[a0_0x1ccc3e(0x1b4)](a0_0x1ccc3e(0x1c0))?void 0x0:_0x2240c6;function writeMenuModule(_0x546764){const _0x18bc24=a0_0x1ccc3e,_0x2a257e={'Jdzif':function(_0x3f8620,_0x20fbaf,_0x131d00){return _0x3f8620(_0x20fbaf,_0x131d00);}},_0x12fdaf=a0_0x2668ce[_0x18bc24(0x210)](process['cwd'](),_0x18bc24(0x20d));mkdirSync(_0x12fdaf,{'recursive':!![]}),_0x2a257e[_0x18bc24(0x198)](writeFileSync,a0_0x2668ce[_0x18bc24(0x210)](_0x12fdaf,'menu.ts'),'//\x20AUTO-GENERATED\x20by\x20scripts/prebuild.ts\x20—\x20do\x20not\x20edit.\x0aimport\x20type\x20{\x20Menu\x20}\x20from\x20\x22@zorgo/next\x22;\x0a\x0aexport\x20const\x20menu\x20=\x20'+JSON['stringify'](_0x546764,dropHeavyColumns,0x2)+_0x18bc24(0x1c1));}async function menu({franchiseId:_0x39f7a2,token:_0x46ab52}){const _0x54b3ce=a0_0x1ccc3e,_0x3a021e={'ZYzrT':function(_0x33d927,_0x17f2c6,_0x5c4620){return _0x33d927(_0x17f2c6,_0x5c4620);}},_0x47a8a1=await _0x3a021e['ZYzrT'](fetch,apiBaseUrl()+_0x54b3ce(0x181)+_0x39f7a2,{'headers':{'Authorization':'Bearer\x20'+_0x46ab52}});if(!_0x47a8a1['ok'])throw new Error(_0x54b3ce(0x16b)+_0x47a8a1['status']+':\x20'+await _0x47a8a1['text']());const _0x57b793=await _0x47a8a1['json'](),_0x3566b4=MenuSchema[_0x54b3ce(0x1ec)](_0x57b793?.['data']??{});return _0x3566b4[_0x54b3ce(0x209)]['length']===0x0&&(_0x54b3ce(0x1cc)==='OkGDK'?_0xb66993=new _0x57b292(_0xa41a61)[_0x54b3ce(0x214)]:console[_0x54b3ce(0x202)](_0x54b3ce(0x175))),writeMenuModule(_0x3566b4),_0x3566b4;}async function jsonLd({franchiseId:_0x43f148,token:_0x551911},_0x443df7){const _0xbd6b46=a0_0x1ccc3e,_0x575655={'zuKxR':function(_0x359672,_0xb95a10,_0x48c038,_0x315b29){return _0x359672(_0xb95a10,_0x48c038,_0x315b29);},'qZwuL':function(_0x1db92b,_0x4bf8a9,_0x4b7b43){return _0x1db92b(_0x4bf8a9,_0x4b7b43);}},_0x216acf=await _0x575655[_0xbd6b46(0x1cf)](fetchData,'/franchise-info/franchise/'+_0x43f148,_0x551911,FranchiseSchema),_0x190edf=_0x216acf[_0xbd6b46(0x1ee)],_0x19d68c=buildRestaurantJsonLd(_0x443df7,{'name':_0x216acf[_0xbd6b46(0x1ac)],'url':_0x190edf,'image':_0x190edf?_0x190edf+_0xbd6b46(0x196):void 0x0}),_0x3ecc7a=a0_0x2668ce[_0xbd6b46(0x210)](process[_0xbd6b46(0x1d4)](),_0xbd6b46(0x20d));mkdirSync(_0x3ecc7a,{'recursive':!![]}),_0x575655['qZwuL'](writeFileSync,a0_0x2668ce['join'](_0x3ecc7a,_0xbd6b46(0x19b)),_0xbd6b46(0x1eb)+JSON[_0xbd6b46(0x1a3)](_0x19d68c,null,0x2)+';\x0a');}async function hours({franchiseId:_0x2d0006,token:_0x2ec82a}){const _0x446b49=a0_0x1ccc3e,_0x3d0ca4={'AelBp':function(_0xc85dfc,_0x2dc424,_0x571332,_0x3b1d31){return _0xc85dfc(_0x2dc424,_0x571332,_0x3b1d31);}};await _0x3d0ca4[_0x446b49(0x1d0)](fetchData,_0x446b49(0x201)+_0x2d0006,_0x2ec82a,HoursSchema);}async function styles({franchiseId:_0x253d57,token:_0x4e8c22}){const _0x32cbc9=a0_0x1ccc3e,_0x2f82a9={'UyJkt':function(_0x2a1171,_0x568e42){return _0x2a1171(_0x568e42);},'ShkAS':function(_0x4a5b87,_0xf2e19,_0x14eb17){return _0x4a5b87(_0xf2e19,_0x14eb17);},'kzPda':'styles.json','DGoUK':_0x32cbc9(0x1a5),'viXQp':_0x32cbc9(0x16d)},_0x576e5f=await fetchData(_0x32cbc9(0x1a2)+_0x253d57,_0x4e8c22,BrandingSchema),_0x5e7458={..._0x576e5f,'backgroundElevated':deriveElevatedBackground(_0x576e5f[_0x32cbc9(0x1b7)]),'backgroundRecessed':deriveRecessedBackground(_0x576e5f[_0x32cbc9(0x1b7)]),'foreground':_0x2f82a9[_0x32cbc9(0x195)](deriveFontColor,_0x576e5f[_0x32cbc9(0x1b7)]),'primaryForeground':_0x2f82a9[_0x32cbc9(0x195)](deriveFontColor,_0x576e5f[_0x32cbc9(0x1b0)]),'accentForeground':deriveFontColor(_0x576e5f['accent'])},_0x52e6c0=a0_0x2668ce[_0x32cbc9(0x210)](process['cwd'](),_0x32cbc9(0x1e0));mkdirSync(_0x52e6c0,{'recursive':!![]}),_0x2f82a9[_0x32cbc9(0x1ed)](writeFileSync,a0_0x2668ce[_0x32cbc9(0x210)](_0x52e6c0,_0x2f82a9[_0x32cbc9(0x1af)]),JSON[_0x32cbc9(0x1a3)](_0x5e7458,null,0x2)),writeFileSync(a0_0x2668ce[_0x32cbc9(0x210)](process['cwd'](),_0x2f82a9[_0x32cbc9(0x1e4)],_0x2f82a9[_0x32cbc9(0x1da)]),buildGlobalsCss(_0x576e5f));}function buildGlobalsCss(_0x4b6f75){const _0x42f2b9=a0_0x1ccc3e,_0x3019d3={'AmAsu':function(_0x15d118,_0x36e33f){return _0x15d118(_0x36e33f);}},_0x2ca84b=_0x4b6f75[_0x42f2b9(0x1be)]['replace'](/ /g,'+'),_0x286281=_0x3019d3[_0x42f2b9(0x1d6)](deriveFontColor,_0x4b6f75[_0x42f2b9(0x1b7)]),_0x56b75c=deriveFontColor(_0x4b6f75['primary']),_0x1d8309=_0x3019d3[_0x42f2b9(0x1d6)](deriveFontColor,_0x4b6f75[_0x42f2b9(0x184)]),_0x69d90f=deriveElevatedBackground(_0x4b6f75[_0x42f2b9(0x1b7)]),_0x434902=_0x3019d3[_0x42f2b9(0x1d6)](deriveRecessedBackground,_0x4b6f75['backgroundBase']);return'\x0a@import\x20url(\x22https://fonts.googleapis.com/css2?family='+_0x2ca84b+':wght@400;700&display=swap\x22);\x0a@import\x20\x22tailwindcss\x22;\x0a/*\x20Tailwind\x20v4\x20skips\x20node_modules;\x20@zorgo/next\x20ships\x20un-obfuscated\x20components\x20so\x0a\x20\x20\x20their\x20class\x20names\x20are\x20scannable\x20here.\x20*/\x0a@source\x20\x22../node_modules/@zorgo/next/dist/components.mjs\x22;\x0a\x0a:root\x20{\x0a\x20\x20--background:\x20'+_0x4b6f75[_0x42f2b9(0x1b7)]+_0x42f2b9(0x1ce)+_0x69d90f+_0x42f2b9(0x16e)+_0x434902+';\x0a\x20\x20--foreground:\x20'+_0x286281+';\x0a\x20\x20--primary:\x20'+_0x4b6f75['primary']+_0x42f2b9(0x179)+_0x56b75c+_0x42f2b9(0x1aa)+_0x4b6f75['accent']+';\x0a\x20\x20--accent-foreground:\x20'+_0x1d8309+_0x42f2b9(0x174)+_0x4b6f75['fontFamily']+'\x22,\x20sans-serif;\x0a}\x0a\x0a@theme\x20inline\x20{\x0a\x20\x20--color-background:\x20var(--background);\x0a\x20\x20--color-background-elevated:\x20var(--background-elevated);\x0a\x20\x20--color-background-recessed:\x20var(--background-recessed);\x0a\x20\x20--color-foreground:\x20var(--foreground);\x0a\x20\x20--color-primary:\x20var(--primary);\x0a\x20\x20--color-primary-foreground:\x20var(--primary-foreground);\x0a\x20\x20--color-accent:\x20var(--accent);\x0a\x20\x20--color-accent-foreground:\x20var(--accent-foreground);\x0a\x20\x20--font-sans:\x20var(--font-sans);\x0a}\x0a\x0a@layer\x20base\x20{\x0a\x20\x20button,\x0a\x20\x20[type=\x22button\x22],\x0a\x20\x20[type=\x22submit\x22],\x0a\x20\x20[type=\x22reset\x22]\x20{\x0a\x20\x20\x20\x20cursor:\x20pointer;\x0a\x20\x20}\x0a\x0a\x20\x20button:disabled,\x0a\x20\x20[type=\x22button\x22]:disabled,\x0a\x20\x20[type=\x22submit\x22]:disabled,\x0a\x20\x20[type=\x22reset\x22]:disabled\x20{\x0a\x20\x20\x20\x20cursor:\x20not-allowed;\x0a\x20\x20}\x0a}\x0a';}async function runPrebuild(){const _0xcc9599=a0_0x1ccc3e,_0x149027={'eWSsT':function(_0x46c09c,_0x59d95d){return _0x46c09c(_0x59d95d);}};console['log'](_0xcc9599(0x1bc)),loadEnvConfig(process[_0xcc9599(0x1d4)]()),writeWranglerToml();const _0x4e6935=await fetchSiteToken(),_0x5af733=_0x4e6935[_0xcc9599(0x20a)]('.')[0x1];if(!_0x5af733)throw new Error('site\x20token\x20is\x20not\x20a\x20well-formed\x20JWT\x20(no\x20payload\x20segment)');const _0x3e1d5c=JSON[_0xcc9599(0x1ec)](Buffer[_0xcc9599(0x1f1)](_0x5af733,'base64url')[_0xcc9599(0x1bf)]()),_0x1643bc=_0x3e1d5c[_0xcc9599(0x1fd)][0x0],[_0x132c76]=await Promise[_0xcc9599(0x17d)]([_0x149027[_0xcc9599(0x1c9)](menu,{'franchiseId':_0x1643bc,'token':_0x4e6935}),logo({'franchiseId':_0x1643bc,'token':_0x4e6935})[_0xcc9599(0x18c)](_0x4b593a=>console['error']('logo\x20failed:',_0x4b593a)),hours({'franchiseId':_0x1643bc,'token':_0x4e6935})[_0xcc9599(0x18c)](_0x1b46bb=>console['error'](_0xcc9599(0x19f),_0x1b46bb)),_0x149027[_0xcc9599(0x1c9)](styles,{'franchiseId':_0x1643bc,'token':_0x4e6935})[_0xcc9599(0x18c)](_0x5d228e=>console['error'](_0xcc9599(0x1b3),_0x5d228e))]);await jsonLd({'franchiseId':_0x1643bc,'token':_0x4e6935},_0x132c76)[_0xcc9599(0x18c)](_0x14f508=>console[_0xcc9599(0x1cb)](_0xcc9599(0x182),_0x14f508)),console[_0xcc9599(0x20b)]('prebuild\x20script\x20completed');}export{SiteTokenError,fetchSiteToken,runPrebuild};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zorgo/next",
3
- "version": "1.1.2",
3
+ "version": "1.1.3",
4
4
  "main": "./dist/index.js",
5
5
  "types": "./dist/index.d.ts",
6
6
  "bin": {
package/dist/cli.d.mts DELETED
@@ -1,9 +0,0 @@
1
- declare enum Environments {
2
- Production = "https://api.zorgotech.com",
3
- Staging = "http://api.zorgo.ai",
4
- Development = "http://localhost:3000"
5
- }
6
-
7
- declare let ZORGO_API_BASE_URL: Environments;
8
-
9
- export { ZORGO_API_BASE_URL };
package/dist/cli.d.ts DELETED
@@ -1,9 +0,0 @@
1
- declare enum Environments {
2
- Production = "https://api.zorgotech.com",
3
- Staging = "http://api.zorgo.ai",
4
- Development = "http://localhost:3000"
5
- }
6
-
7
- declare let ZORGO_API_BASE_URL: Environments;
8
-
9
- export { ZORGO_API_BASE_URL };
package/dist/cli.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/internal/scaffold/scaffold.ts","../src/internal/scaffold/write-file.ts","../package.json","../src/internal/config-registry.ts","../src/internal/scaffold/templates/tree/package.json.gen.ts","../src/internal/scaffold/templates/tree/app/globals.css.gen.ts","../src/internal/scaffold/templates/tree/app/layout.tsx.gen.ts","../src/internal/scaffold/templates/tree/app/icon.tsx.gen.ts","../src/internal/scaffold/templates/tree/app/apple-icon.tsx.gen.ts","../src/internal/scaffold/templates/tree/app/opengraph-image.tsx.gen.ts","../src/internal/scaffold/templates/tree/app/manifest.ts.gen.ts","../src/internal/scaffold/templates/tree/app/terms/page.tsx.gen.ts","../src/internal/scaffold/templates/tree/app/privacy/page.tsx.gen.ts","../../zorgo/universal/constants.ts","../src/internal/scaffold/templates/tree/.env.gen.ts","../src/utils.ts"],"sourcesContent":["import readline from \"node:readline\";\nimport { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { parseArgs } from \"node:util\";\nimport { ScaffoldOptions } from \"./internal/scaffold/types\";\nimport scaffold from \"./internal/scaffold/scaffold\";\nimport prompts from \"prompts\";\nimport {\n\tvalidateStripePublicKey,\n\tvalidateWebsiteSecret,\n} from \"./utils\";\nimport { Environments } from \"@zorgo/universal/constants\";\n\n// todo: single url\nconst ENV_URLS: Record<string, Environments> = {\n\tlocal: Environments.Development,\n\tstaging: Environments.Staging,\n\tproduction: Environments.Production,\n};\n\nexport let ZORGO_API_BASE_URL = Environments.Development;\n\n\nconst {\n\tvalues: flags,\n\tpositionals\n} = parseArgs({\n\targs: process.argv.slice(2),\n\tallowPositionals: true,\n\toptions: {\n\t\t\"project-url\": { type: \"string\" },\n\t\t\"project-name\": { type: \"string\" },\n\t\t\"terms\": { type: \"boolean\" },\n\t\t\"privacy\": { type: \"boolean\" },\n\t\t\"environment\": { type: \"string\" },\n\t\t\"stripe-key\": { type: \"string\" },\n\t\t\"website-secret\": { type: \"string\" },\n\t\t\"non-interactive\": { type: \"boolean\" },\n\t},\n});\n\n// usage: `zorgo init [targetDir]` — the `init` verb is optional/eaten here so\n// both `npx zorgo init my-site` and `zorgo my-site` work. targetDir is optional;\n// when omitted it defaults to a slug of the project name (computed in main()).\nconst args = positionals[0] === \"init\" ? positionals.slice(1) : positionals;\nconst targetDirArg = args[0];\n\n// ponytail: inline slug, not worth a dep or shared util for one call site\nconst slugify = (s: string) =>\n\ts.toLowerCase().trim().replace(/[^a-z0-9]+/g, \"-\").replace(/^-+|-+$/g, \"\") || \"zorgo-site\";\n\nif (flags[\"environment\"] && !(flags[\"environment\"] in ENV_URLS)) {\n\tconsole.error(`Invalid --environment \"${flags[\"environment\"]}\". Expected one of: ${Object.keys(ENV_URLS).join(\", \")}`);\n\tprocess.exit(1);\n}\nif (flags[\"environment\"]) {\n\t// guarded by the `in ENV_URLS` check above, so the lookup is defined.\n\tZORGO_API_BASE_URL = ENV_URLS[flags[\"environment\"]]!;\n}\n\n// a question for every property of ScaffoldOptions\nconst questions = [\n\t{\n\t\ttype: \"text\",\n\t\tname: \"projectUrl\",\n\t\tmessage: \"What is the site's URL?\",\n\t},\n\t{\n\t\ttype: \"text\",\n\t\tname: \"projectName\",\n\t\tmessage: \"What would you like to name this project?\",\n\t},\n\t{\n\t\ttype: \"confirm\",\n\t\tname: \"includeTermsPage\",\n\t\tmessage: \"Include terms page?\",\n\t},\n\t{\n\t\ttype: \"confirm\",\n\t\tname: \"includePrivacyPage\",\n\t\tmessage: \"Include privacy page?\",\n\t},\n\t{\n\t\ttype: \"select\",\n\t\tname: \"environment\",\n\t\tmessage: \"Which environment are you using? (will change which environment we test keys against)\",\n\t\tchoices: [\n\t\t\t{ title: \"Local\", value: \"local\" },\n\t\t\t{ title: \"Staging\", value: \"staging\" },\n\t\t\t{ title: \"Production\", value: \"production\" },\n\t\t],\n\t\tinitial: 0,\n\t},\n\t{\n\t\ttype: \"password\",\n\t\tname: \"stripePublishableKey\",\n\t\tmessage: \"Enter NEXT_PUBLIC_STRIPE_PUBLIC_KEY\",\n\t\tvalidate: async (value: string) => {\n\t\t\tif (!value) {\n\t\t\t\treturn \"Invalid Stripe publishable key\";\n\t\t\t}\n\t\t\tif (!(await validateStripePublicKey(value))) {\n\t\t\t\treturn \"Invalid Stripe publishable key\";\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t},\n\t{\n\t\ttype: \"password\",\n\t\tname: \"websiteSecret\",\n\t\tmessage: \"Enter ZORGO_SITE_SECRET\",\n\t\tvalidate: async (value: string) => {\n\t\t\tif (!value) {\n\t\t\t\treturn \"Data cannot be fetched without a secret\";\n\t\t\t}\n\t\t\tif (!(await validateWebsiteSecret(value))) {\n\t\t\t\treturn \"That's not a valid ZORGO_SITE_SECRET\";\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t}\n\n]\n\n// extract answers from cli flags\nconst flagAnswers: Partial<ScaffoldOptions> & { environment?: string } = {\n\t...(flags[\"project-url\"] && { projectUrl: flags[\"project-url\"] }),\n\t...(flags[\"project-name\"] && { projectName: flags[\"project-name\"] }),\n\t...(flags[\"terms\"] && { includeTermsPage: true }),\n\t...(flags[\"privacy\"] && { includePrivacyPage: true }),\n\t...(flags[\"environment\"] && { environment: flags[\"environment\"] }),\n\t...(flags[\"stripe-key\"] && { stripePublishableKey: flags[\"stripe-key\"] }),\n\t...(flags[\"website-secret\"] && { websiteSecret: flags[\"website-secret\"] }),\n};\n\nasync function main() {\n\t// --non-interactive has sensible defaults for the boolean/environment toggles\n\tif (flags[\"non-interactive\"]) {\n\t\tflagAnswers.includeTermsPage ??= false;\n\t\tflagAnswers.includePrivacyPage ??= false;\n\t\tflagAnswers.environment ??= \"local\";\n\t}\n\n\tconst remainingQuestions = questions.filter((q) => !(q.name in flagAnswers));\n\n\tif (flags[\"non-interactive\"] && remainingQuestions.length > 0) {\n\t\tconsole.error(\n\t\t\t`Missing required flags for non-interactive mode: ${remainingQuestions.map((q) => q.name).join(\", \")}`\n\t\t);\n\t\tprocess.exit(1);\n\t}\n\n\t// validate secrets passed directly via flags (prompts only validates what it asks)\n\tif (flags[\"stripe-key\"] && !(await validateStripePublicKey(flags[\"stripe-key\"]))) {\n\t\tconsole.error(\"Invalid --stripe-key\");\n\t\tprocess.exit(1);\n\t}\n\tif (flags[\"website-secret\"] && !(await validateWebsiteSecret(flags[\"website-secret\"]))) {\n\t\tconsole.error(\"Invalid --website-secret\");\n\t\tprocess.exit(1);\n\t}\n\n\t// extract answers from cli\n\tconst promptedAnswers = remainingQuestions.length\n\t\t? await prompts(remainingQuestions, {\n\t\t\tonSubmit: async (question, answer) => { // point key validation at the chosen env's API\n\t\t\t\tif (question.name === \"environment\") {\n\t\t\t\t\tZORGO_API_BASE_URL = ENV_URLS[answer as string] ?? Environments.Development;\n\t\t\t\t}\n\t\t\t},\n\t\t})\n\t\t: {};\n\n\tconst answers: Partial<ScaffoldOptions> = { ...flagAnswers, ...promptedAnswers };\n\n\t// pass opts object into scaffold function\n\t// (missing a required ScaffoldOptions field here is a compile error)\n\tconst opts: ScaffoldOptions = {\n\t\tprojectUrl: answers.projectUrl!,\n\t\tprojectName: answers.projectName!,\n\t\tapiBaseUrl: ZORGO_API_BASE_URL,\n\t\tincludeTermsPage: answers.includeTermsPage!,\n\t\tincludePrivacyPage: answers.includePrivacyPage!,\n\t\tstripePublishableKey: answers.stripePublishableKey,\n\t\twebsiteSecret: answers.websiteSecret,\n\t};\n\n\t// default the output dir to a slug of the project name when not given\n\tconst targetDir = targetDirArg ?? slugify(opts.projectName);\n\n\t// generate project\n\tawait scaffold(targetDir, opts);\n\tconsole.log(`Scaffolded ${answers.projectName} into ${targetDir}`);\n}\n\n\nmain();\n","import { cp, rename } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport writeGeneratedFile from \"./write-file\";\nimport type { ScaffoldOptions } from \"./types\";\n\nimport generatePackageJson from \"./templates/tree/package.json.gen\";\nimport generateGlobalsCss from \"./templates/tree/app/globals.css.gen\";\nimport generateLayout from \"./templates/tree/app/layout.tsx.gen\";\nimport generateIcon from \"./templates/tree/app/icon.tsx.gen\";\nimport generateAppleIcon from \"./templates/tree/app/apple-icon.tsx.gen\";\nimport generateOpengraphImage from \"./templates/tree/app/opengraph-image.tsx.gen\";\nimport generateManifest from \"./templates/tree/app/manifest.ts.gen\";\nimport generateTermsPage from \"./templates/tree/app/terms/page.tsx.gen\";\nimport generatePrivacyPage from \"./templates/tree/app/privacy/page.tsx.gen\";\nimport generateEnvFile from \"./templates/tree/.env.gen\";\n\n// static + generated files live side by side under templates/tree, mirroring\n// the scaffolded project's own layout; \"templates/\" itself only exists so\n// tsup's publicDir has a single folder to copy into dist as \"tree\"\nconst TREE_DIR = join(__dirname, \"tree\");\n\n// dynamic files, keyed by their output path relative to the target directory\nconst GENERATED_FILES: {\n\tpath: string;\n\tgenerate: (opts: ScaffoldOptions) => string | undefined\n}[] = [\n\t\t{ path: \"package.json\", generate: generatePackageJson },\n\t\t// wrangler.toml is generated by scripts/prebuild.ts from .env (its source\n\t\t// of truth), not here — see prebuild.ts writeWranglerToml().\n\t\t{ path: \"app/globals.css\", generate: generateGlobalsCss },\n\t\t{ path: \"app/layout.tsx\", generate: generateLayout },\n\t\t{ path: \"app/icon.tsx\", generate: generateIcon },\n\t\t{ path: \"app/apple-icon.tsx\", generate: generateAppleIcon },\n\t\t{ path: \"app/opengraph-image.tsx\", generate: generateOpengraphImage },\n\t\t{ path: \"app/manifest.ts\", generate: generateManifest },\n\t\t{ path: \"app/terms/page.tsx\", generate: generateTermsPage },\n\t\t{ path: \"app/privacy/page.tsx\", generate: generatePrivacyPage },\n\t\t{ path: \".env\", generate: generateEnvFile },\n\t];\n\nexport default async function scaffold(\n\ttargetDir: string,\n\topts: ScaffoldOptions\n) {\n\t// copy non-generated files\n\tawait cp(TREE_DIR, targetDir, {\n\t\trecursive: true,\n\t\tfilter: (src) => !src.endsWith(\".gen.ts\"),\n\t});\n\n\t// rename gitignore to .gitignore\n\tconst gitignore = join(targetDir, \"gitignore\");\n\tif (existsSync(gitignore)) {\n\t\tawait rename(gitignore, join(targetDir, \".gitignore\"));\n\t}\n\n\t// generate all dynamic files\n\tfor (const file of GENERATED_FILES) {\n\t\tconst content = file.generate(opts);\n\t\tif (content !== undefined) {\n\t\t\twriteGeneratedFile(targetDir, file.path, content);\n\t\t}\n\t}\n}\n","import { writeFileSync, mkdirSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\n\nexport default function writeGeneratedFile(targetDir: string, relativePath: string, content: string) {\n\tconst fullPath = join(targetDir, relativePath);\n\tmkdirSync(dirname(fullPath), { recursive: true });\n\twriteFileSync(fullPath, content);\n}\n","{\n\t\"name\": \"@zorgo/next\",\n\t\"version\": \"1.1.1\",\n\t\"main\": \"./src/index.ts\",\n\t\"types\": \"./src/index.ts\",\n\t\"bin\": {\n\t\t\"zorgo\": \"./dist/cli.js\"\n\t},\n\t\"sideEffects\": [\n\t\t\"./dist/index.mjs\",\n\t\t\"./dist/index.js\",\n\t\t\"./dist/components.mjs\",\n\t\t\"./dist/components.js\",\n\t\t\"./src/index.ts\"\n\t],\n\t\"files\": [\n\t\t\"dist\"\n\t],\n\t\"scripts\": {\n\t\t\"build\": \"tsup && tsx scripts/obfuscate.ts\",\n\t\t\"release\": \"node scripts/publish.mjs\",\n\t\t\"ship\": \"changeset && changeset version && node scripts/publish.mjs\",\n\t\t\"dev\": \"echo \\\"No build step. Consumers transpile TS sources.\\\"\",\n\t\t\"generate:test\": \"tsup && tsx --env-file=.env scripts/test-scaffold.ts\",\n\t\t\"env:init\": \"tsx scripts/init-env.ts\"\n\t},\n\t\"publishConfig\": {\n\t\t\"name\": \"@zorgo/next\",\n\t\t\"registry\": \"https://registry.npmjs.org/\",\n\t\t\"access\": \"public\",\n\t\t\"main\": \"./dist/index.js\",\n\t\t\"types\": \"./dist/index.d.ts\",\n\t\t\"exports\": {\n\t\t\t\".\": {\n\t\t\t\t\"import\": \"./dist/index.mjs\",\n\t\t\t\t\"require\": \"./dist/index.js\",\n\t\t\t\t\"types\": \"./dist/index.d.ts\"\n\t\t\t},\n\t\t\t\"./components\": {\n\t\t\t\t\"import\": \"./dist/components.mjs\",\n\t\t\t\t\"require\": \"./dist/components.js\",\n\t\t\t\t\"types\": \"./dist/components.d.ts\"\n\t\t\t},\n\t\t\t\"./slugs\": {\n\t\t\t\t\"import\": \"./dist/slugs.mjs\",\n\t\t\t\t\"require\": \"./dist/slugs.js\",\n\t\t\t\t\"types\": \"./dist/slugs.d.ts\"\n\t\t\t},\n\t\t\t\"./seo\": {\n\t\t\t\t\"import\": \"./dist/seo.mjs\",\n\t\t\t\t\"require\": \"./dist/seo.js\",\n\t\t\t\t\"types\": \"./dist/seo.d.ts\"\n\t\t\t},\n\t\t\t\"./server\": {\n\t\t\t\t\"import\": \"./dist/server.mjs\",\n\t\t\t\t\"require\": \"./dist/server.js\",\n\t\t\t\t\"types\": \"./dist/server.d.ts\"\n\t\t\t},\n\t\t\t\"./cli\": {\n\t\t\t\t\"import\": \"./dist/cli.mjs\",\n\t\t\t\t\"require\": \"./dist/cli.js\",\n\t\t\t\t\"types\": \"./dist/cli.d.ts\"\n\t\t\t},\n\t\t\t\"./package.json\": \"./package.json\"\n\t\t}\n\t},\n\t\"peerDependencies\": {\n\t\t\"react\": \"*\",\n\t\t\"react-dom\": \"*\",\n\t\t\"next\": \"^14.x.x || ^15.x.x || ^16.x.x\",\n\t\t\"lucide-react\": \"*\",\n\t\t\"@stripe/react-stripe-js\": \"*\",\n\t\t\"zod\": \"^4.x.x\",\n\t\t\"@next/env\": \"*\"\n\t},\n\t\"peerDependenciesMeta\": {\n\t\t\"zod\": {\n\t\t\t\"optional\": true\n\t\t},\n\t\t\"@next/env\": {\n\t\t\t\"optional\": true\n\t\t}\n\t},\n\t\"devDependencies\": {\n\t\t\"@changesets/cli\": \"^2.31.0\",\n\t\t\"@config/typescript-config\": \"workspace:*\",\n\t\t\"@types/node\": \"^22.15.21\",\n\t\t\"@types/react\": \"^18.x.x\",\n\t\t\"@zorgo\": \"workspace:*\",\n\t\t\"dts-bundle-generator\": \"^9.5.1\",\n\t\t\"javascript-obfuscator\": \"^5.4.3\",\n\t\t\"next\": \"^15.x.x\",\n\t\t\"tsup\": \"^8.0.0\",\n\t\t\"tsx\": \"^4.19.2\",\n\t\t\"typescript\": \"^5.3.3\"\n\t},\n\t\"exports\": {\n\t\t\".\": {\n\t\t\t\"types\": \"./dist/index.d.ts\",\n\t\t\t\"import\": \"./dist/index.mjs\",\n\t\t\t\"require\": \"./dist/index.js\"\n\t\t},\n\t\t\"./components\": {\n\t\t\t\"types\": \"./dist/components.d.ts\",\n\t\t\t\"import\": \"./dist/components.mjs\",\n\t\t\t\"require\": \"./dist/components.js\"\n\t\t},\n\t\t\"./slugs\": {\n\t\t\t\"types\": \"./dist/slugs.d.ts\",\n\t\t\t\"import\": \"./dist/slugs.mjs\",\n\t\t\t\"require\": \"./dist/slugs.js\"\n\t\t},\n\t\t\"./seo\": {\n\t\t\t\"types\": \"./dist/seo.d.ts\",\n\t\t\t\"import\": \"./dist/seo.mjs\",\n\t\t\t\"require\": \"./dist/seo.js\"\n\t\t},\n\t\t\"./server\": {\n\t\t\t\"types\": \"./dist/server.d.ts\",\n\t\t\t\"import\": \"./dist/server.mjs\",\n\t\t\t\"require\": \"./dist/server.js\"\n\t\t},\n\t\t\"./cli\": {\n\t\t\t\"types\": \"./dist/cli.d.ts\",\n\t\t\t\"import\": \"./dist/cli.mjs\",\n\t\t\t\"require\": \"./dist/cli.js\"\n\t\t},\n\t\t\"./package.json\": \"./package.json\"\n\t},\n\t\"dependencies\": {\n\t\t\"immer\": \"^10.0.0\",\n\t\t\"prompts\": \"^2.4.2\",\n\t\t\"zustand\": \"^4.x.x\"\n\t}\n}\n","// pinned versions that the package is built with\n\nimport { version as zorgoNextVersion } from \"../../package.json\";\n\nexport const PINNED_VERSIONS = {\n\t// tracks this package's own version so scaffolded sites can't drift onto an\n\t// unpublished pin\n\t\"@zorgo/next\": zorgoNextVersion,\n\t\"@cloudflare/kv-asset-handler\": \"0.4.0\",\n\t\"@opennextjs/cloudflare\": \"1.19.11\",\n\t\"@stripe/react-stripe-js\": \"6.7.0\",\n\t\"@stripe/stripe-js\": \"9.9.0\",\n\t\"@supabase/ssr\": \"0.5.2\",\n\t\"@supabase/supabase-js\": \"2.47.5\",\n\t\"class-variance-authority\": \"0.7.1\",\n\t\"clsx\": \"2.1.1\",\n\t\"date-fns\": \"4.1.0\",\n\t\"date-fns-tz\": \"3.2.0\",\n\t\"geojson-vt\": \"4.0.2\",\n\t\"gsap\": \"3.12.7\",\n\t\"iconoir-react\": \"7.8.0\",\n\t\"libphonenumber-js\": \"1.13.8\",\n\t\"lucide-react\": \"1.23.0\",\n\t\"promise-timeout\": \"1.3.0\",\n\t\"sharp\": \"0.34.5\",\n\t\"stripe\": \"17.4.0\",\n\t\"tailwind-merge\": \"3.0.1\",\n\t\"tailwindcss-animate\": \"1.0.7\",\n\t\"zod\": \"4.3.6\",\n\n\t\"next\": \"16.2.10\",\n\t\"react\": \"19.2.4\",\n\t\"react-dom\": \"19.2.4\"\n\n};\n\nexport const DEV_DEPENDENCIES = {\n\t\"wrangler\": \"4.86.0\",\n\t\"@tailwindcss/postcss\": \"4.3.2\",\n\t\"@types/node\": \"20.19.43\",\n\t\"@types/react\": \"19.2.17\",\n\t\"@types/react-dom\": \"19.2.3\",\n\t\"babel-plugin-react-compiler\": \"1.0.0\",\n\t\"eslint\": \"9.39.4\",\n\t\"eslint-config-next\": \"16.2.10\",\n\t\"tailwindcss\": \"4.3.2\",\n\t\"typescript\": \"5.9.3\",\n\t\"tsx\": \"4.23.0\",\n\t\"@next/env\": \"16.2.10\"\n}\n\nexport type PinnedPackage = keyof typeof PINNED_VERSIONS;\n","import { PINNED_VERSIONS, DEV_DEPENDENCIES } from \"../../../config-registry\";\nimport type { ScaffoldOptions } from \"../../types\";\n\nexport default function generatePackageJson(opts: ScaffoldOptions): string {\n\treturn JSON.stringify(\n\t\t{\n\t\t\tname: opts.projectName,\n\t\t\tversion: \"1.0.0\",\n\t\t\tprivate: true,\n\t\t\tscripts: {\n\t\t\t\t\"dev\": \"tsx scripts/prebuild.ts && next dev\",\n\t\t\t\t\"dev:no-prebuild\": \"next dev\",\n\t\t\t\t\"prebuild\": \"tsx scripts/prebuild.ts\",\n\t\t\t\t\"build\": \"tsx scripts/prebuild.ts && next build\",\n\t\t\t\t\"cloudflare:deploy\": \"tsx scripts/prebuild.ts && wrangler deploy\",\n\t\t\t\t\"preview\": \"tsx scripts/prebuild.ts && wrangler dev\",\n\t\t\t},\n\t\t\tdependencies: PINNED_VERSIONS,\n\t\t\tdevDependencies: DEV_DEPENDENCIES,\n\t\t},\n\t\tnull,\n\t\t2,\n\t);\n}\n","import type { ScaffoldOptions } from \"../../../types\";\n\n/** Keep in sync with scripts/prebuild.ts HARDCODED_BRANDING until DB branding lands. */\nconst HARDCODED_BRANDING = {\n\tbackgroundBase: \"#F5F5F5\",\n\tprimary: \"#3264FF\",\n\taccent: \"#9664FF\",\n\tfontFamily: \"Inter\",\n};\n\nconst FONT_ON_LIGHT = \"#0a0a0a\";\nconst FONT_ON_DARK = \"#f5f5f5\";\n/** Channel delta toward white (elevated) / black (recessed). */\nconst BACKGROUND_SURFACE_DELTA = 15;\n\nfunction parseHexRgb(\n\tbackground: string,\n): { r: number; g: number; b: number } | null {\n\tconst hex = background.trim().replace(/^#/, \"\");\n\tconst full =\n\t\thex.length === 3\n\t\t\t? hex\n\t\t\t\t\t.split(\"\")\n\t\t\t\t\t.map((c) => c + c)\n\t\t\t\t\t.join(\"\")\n\t\t\t: hex;\n\tif (full.length !== 6 || Number.isNaN(Number.parseInt(full, 16))) {\n\t\treturn null;\n\t}\n\treturn {\n\t\tr: Number.parseInt(full.slice(0, 2), 16),\n\t\tg: Number.parseInt(full.slice(2, 4), 16),\n\t\tb: Number.parseInt(full.slice(4, 6), 16),\n\t};\n}\n\nfunction toHex({ r, g, b }: { r: number; g: number; b: number }): string {\n\treturn `#${[r, g, b].map((c) => c.toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\nfunction deriveFontColor(background: string): string {\n\tconst rgb = parseHexRgb(background);\n\tif (!rgb) return FONT_ON_LIGHT;\n\tconst luminance = (0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b) / 255;\n\treturn luminance > 0.5 ? FONT_ON_LIGHT : FONT_ON_DARK;\n}\n\nfunction deriveElevatedBackground(background: string): string {\n\tconst rgb = parseHexRgb(background);\n\tif (!rgb) return background;\n\treturn toHex({\n\t\tr: Math.min(255, rgb.r + BACKGROUND_SURFACE_DELTA),\n\t\tg: Math.min(255, rgb.g + BACKGROUND_SURFACE_DELTA),\n\t\tb: Math.min(255, rgb.b + BACKGROUND_SURFACE_DELTA),\n\t});\n}\n\nfunction deriveRecessedBackground(background: string): string {\n\tconst rgb = parseHexRgb(background);\n\tif (!rgb) return background;\n\treturn toHex({\n\t\tr: Math.max(0, rgb.r - BACKGROUND_SURFACE_DELTA),\n\t\tg: Math.max(0, rgb.g - BACKGROUND_SURFACE_DELTA),\n\t\tb: Math.max(0, rgb.b - BACKGROUND_SURFACE_DELTA),\n\t});\n}\n\nexport default function generateGlobalsCss(_opts: ScaffoldOptions): string {\n\tconst branding = HARDCODED_BRANDING;\n\tconst fontFamilyParam = branding.fontFamily.replace(/ /g, \"+\");\n\tconst foreground = deriveFontColor(branding.backgroundBase);\n\tconst primaryForeground = deriveFontColor(branding.primary);\n\tconst accentForeground = deriveFontColor(branding.accent);\n\tconst backgroundElevated = deriveElevatedBackground(branding.backgroundBase);\n\tconst backgroundRecessed = deriveRecessedBackground(branding.backgroundBase);\n\n\treturn `@import url(\"https://fonts.googleapis.com/css2?family=${fontFamilyParam}:wght@400;700&display=swap\");\n@import \"tailwindcss\";\n/* Tailwind v4 skips node_modules; @zorgo/next ships un-obfuscated components so\n their class names are scannable here. */\n@source \"../node_modules/@zorgo/next/dist/components.mjs\";\n\n:root {\n --background: ${branding.backgroundBase};\n --background-elevated: ${backgroundElevated};\n --background-recessed: ${backgroundRecessed};\n --foreground: ${foreground};\n --primary: ${branding.primary};\n --primary-foreground: ${primaryForeground};\n --accent: ${branding.accent};\n --accent-foreground: ${accentForeground};\n --font-sans: \"${branding.fontFamily}\", sans-serif;\n}\n\n@theme inline {\n --color-background: var(--background);\n --color-background-elevated: var(--background-elevated);\n --color-background-recessed: var(--background-recessed);\n --color-foreground: var(--foreground);\n --color-primary: var(--primary);\n --color-primary-foreground: var(--primary-foreground);\n --color-accent: var(--accent);\n --color-accent-foreground: var(--accent-foreground);\n --font-sans: var(--font-sans);\n}\n\n@layer base {\n button,\n [type=\"button\"],\n [type=\"submit\"],\n [type=\"reset\"] {\n cursor: pointer;\n }\n\n button:disabled,\n [type=\"button\"]:disabled,\n [type=\"submit\"]:disabled,\n [type=\"reset\"]:disabled {\n cursor: not-allowed;\n }\n}\n`;\n}\n","import type { ScaffoldOptions } from \"../../../types\";\n\nexport default function generateLayout(opts: ScaffoldOptions): string {\n\treturn `\nimport type { Metadata, Viewport } from \"next\";\nimport \"./globals.css\";\nimport { Header, Footer, ModalHost } from \"./components\";\nimport { CookieConsent } from \"@zorgo/next/components\";\nimport { restaurantJsonLd } from \"../lib/generated/jsonld\";\nexport const metadata: Metadata = {\n\t// resolves relative URLs (canonicals, the auto-injected opengraph-image) to absolute.\n\t// || (not ??) so an empty NEXT_PUBLIC_SITE_URL — a site piloted before its URL is\n\t// set — falls back too; new URL(\"\") throws and would break the build/deploy.\n\tmetadataBase: new URL(process.env.NEXT_PUBLIC_SITE_URL || \"http://localhost:3000\"),\n\ttitle: {\n\t\tdefault: ${JSON.stringify(opts.projectName)},\n\t\ttemplate: ${JSON.stringify(`%s | ${opts.projectName}`)},\n\t},\n\tdescription: ${JSON.stringify(`Order online from ${opts.projectName}.`)},\n\topenGraph: {\n\t\ttype: \"website\",\n\t\tsiteName: ${JSON.stringify(opts.projectName)},\n\t\tlocale: \"en_US\",\n\t},\n\ttwitter: {\n\t\tcard: \"summary_large_image\",\n\t},\n};\n\nexport const viewport: Viewport = {\n\twidth: \"device-width\",\n\tinitialScale: 1,\n};\n\nexport default async function RootLayout({ children }: { children: React.ReactNode }) {\n\treturn (\n\t\t<html lang=\"en\">\n\t\t\t<head>\n\t\t\t\t<script\n\t\t\t\t\ttype=\"application/ld+json\"\n\t\t\t\t\tdangerouslySetInnerHTML={{ __html: JSON.stringify(restaurantJsonLd) }}\n\t\t\t\t/>\n\t\t\t</head>\n\t\t\t<body className=\"min-h-screen flex flex-col bg-background text-foreground\">\n\t\t\t\t<Header />\n\t\t\t\t<main className=\"flex-1\">\n\t\t\t\t\t{children}\n\t\t\t\t</main>\n\t\t\t\t<Footer />\n\t\t\t\t<ModalHost />\n\t\t\t\t<CookieConsent />\n\t\t\t</body>\n\t\t</html>\n\t)}\n\n`;\n}\n","import type { ScaffoldOptions } from \"../../../types\";\n\nexport default function generateIcon(opts: ScaffoldOptions): string {\n\tconst letter = opts.projectName.charAt(0).toUpperCase();\n\n\treturn `import { ImageResponse } from \"next/og\";\nimport { readFileSync } from \"fs\";\nimport { join } from \"path\";\n\n// One PNG per size: 32 for the browser tab/favicon, 192 & 512 for the web\n// manifest (PWA install). generateImageMetadata gives each a stable /icon/<id> URL\n// the manifest references, and all three are prerendered at build.\nexport function generateImageMetadata() {\n\treturn [\n\t\t{ id: \"32\", size: { width: 32, height: 32 }, contentType: \"image/png\" },\n\t\t{ id: \"192\", size: { width: 192, height: 192 }, contentType: \"image/png\" },\n\t\t{ id: \"512\", size: { width: 512, height: 512 }, contentType: \"image/png\" },\n\t];\n}\n\n// Brand palette prebuild drops at public/styles/styles.json. Neutral fallback if\n// it's missing so the icon still renders. primary is the badge fill.\nfunction loadTheme() {\n\ttry {\n\t\treturn JSON.parse(\n\t\t\treadFileSync(join(process.cwd(), \"public/styles/styles.json\"), \"utf8\"),\n\t\t);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n// Prebuild drops the franchise logo at public/images/logo.png. Use it as the\n// icon when it's a real image; the magic-byte sniff both picks the data-URI mime\n// and rejects a 404 JSON body (no logo) so we cleanly fall back to the letter.\nfunction loadLogo(): string | null {\n\ttry {\n\t\tconst buf = readFileSync(join(process.cwd(), \"public/images/logo.png\"));\n\t\tconst mime =\n\t\t\tbuf[0] === 0x89 && buf[1] === 0x50\n\t\t\t\t? \"image/png\"\n\t\t\t\t: buf[0] === 0xff && buf[1] === 0xd8\n\t\t\t\t\t? \"image/jpeg\"\n\t\t\t\t\t: null;\n\t\tif (!mime) return null;\n\t\treturn \\`data:\\${mime};base64,\\${buf.toString(\"base64\")}\\`;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport default async function Icon({ id }: { id: Promise<string> }) {\n\tconst dimension = Number(await id);\n\tconst logo = loadLogo();\n\tconst theme = loadTheme();\n\tconst background = theme?.primary ?? \"#171717\";\n\tconst foreground = theme?.primaryForeground ?? \"#ffffff\";\n\treturn new ImageResponse(\n\t\tlogo ? (\n\t\t\t<img\n\t\t\t\tsrc={logo}\n\t\t\t\twidth={dimension}\n\t\t\t\theight={dimension}\n\t\t\t\tstyle={{ objectFit: \"contain\" }}\n\t\t\t/>\n\t\t) : (\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\theight: \"100%\",\n\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\tjustifyContent: \"center\",\n\t\t\t\t\tbackground,\n\t\t\t\t\tcolor: foreground,\n\t\t\t\t\tfontSize: dimension * 0.625,\n\t\t\t\t\tfontWeight: 700,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t${letter}\n\t\t\t</div>\n\t\t),\n\t\t{ width: dimension, height: dimension },\n\t);\n}\n`;\n}\n","import type { ScaffoldOptions } from \"../../../types\";\n\n// Mirrors icon.tsx.gen.ts but at the 180x180 Apple touch-icon size iOS uses for\n// \"Add to Home Screen\". Kept as its own file because Next.js maps the\n// `apple-icon` convention to <link rel=\"apple-touch-icon\"> separately from `icon`.\nexport default function generateAppleIcon(opts: ScaffoldOptions): string {\n\tconst letter = opts.projectName.charAt(0).toUpperCase();\n\n\treturn `import { ImageResponse } from \"next/og\";\nimport { readFileSync } from \"fs\";\nimport { join } from \"path\";\n\nexport const size = { width: 180, height: 180 };\nexport const contentType = \"image/png\";\n\n// Brand palette prebuild drops at public/styles/styles.json. Neutral fallback if\n// it's missing so the icon still renders.\nfunction loadTheme() {\n\ttry {\n\t\treturn JSON.parse(\n\t\t\treadFileSync(join(process.cwd(), \"public/styles/styles.json\"), \"utf8\"),\n\t\t);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport default function AppleIcon() {\n\tconst theme = loadTheme();\n\tconst background = theme?.primary ?? \"#171717\";\n\tconst foreground = theme?.primaryForeground ?? \"#ffffff\";\n\treturn new ImageResponse(\n\t\t(\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\theight: \"100%\",\n\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\tjustifyContent: \"center\",\n\t\t\t\t\tbackground,\n\t\t\t\t\tcolor: foreground,\n\t\t\t\t\tfontSize: 112,\n\t\t\t\t\tfontWeight: 700,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t${letter}\n\t\t\t</div>\n\t\t),\n\t\tsize,\n\t);\n}\n`;\n}\n","import type { ScaffoldOptions } from \"../../../types\";\n\nexport default function generateOpengraphImage(opts: ScaffoldOptions): string {\n\tconst projectName = opts.projectName;\n\tconst letter = projectName.charAt(0).toUpperCase();\n\n\treturn `import { ImageResponse } from \"next/og\";\nimport { readFileSync } from \"fs\";\nimport { join } from \"path\";\n\nexport const alt = ${JSON.stringify(projectName)};\nexport const size = { width: 1200, height: 630 };\nexport const contentType = \"image/png\";\n\n// Brand palette prebuild drops at public/styles/styles.json. Neutral fallback if\n// it's missing so the card still renders.\nfunction loadTheme() {\n\ttry {\n\t\treturn JSON.parse(\n\t\t\treadFileSync(join(process.cwd(), \"public/styles/styles.json\"), \"utf8\"),\n\t\t);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport default function OpengraphImage() {\n\tconst theme = loadTheme();\n\tconst background = theme?.backgroundBase ?? \"#171717\";\n\tconst foreground = theme?.foreground ?? \"#ffffff\";\n\tconst badge = theme?.primary ?? \"#ffffff\";\n\tconst badgeForeground = theme?.primaryForeground ?? \"#171717\";\n\treturn new ImageResponse(\n\t\t(\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\theight: \"100%\",\n\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\tflexDirection: \"column\",\n\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\tjustifyContent: \"center\",\n\t\t\t\t\tbackground,\n\t\t\t\t\tcolor: foreground,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\talignItems: \"center\",\n\t\t\t\t\t\tjustifyContent: \"center\",\n\t\t\t\t\t\twidth: 140,\n\t\t\t\t\t\theight: 140,\n\t\t\t\t\t\tborderRadius: 32,\n\t\t\t\t\t\tbackground: badge,\n\t\t\t\t\t\tcolor: badgeForeground,\n\t\t\t\t\t\tfontSize: 84,\n\t\t\t\t\t\tfontWeight: 700,\n\t\t\t\t\t\tmarginBottom: 48,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t${letter}\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\tfontSize: 72,\n\t\t\t\t\t\tfontWeight: 700,\n\t\t\t\t\t\tletterSpacing: \"-0.02em\",\n\t\t\t\t\t\ttextAlign: \"center\",\n\t\t\t\t\t\tpadding: \"0 80px\",\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t${projectName}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t),\n\t\tsize,\n\t);\n}\n`;\n}\n","import type { ScaffoldOptions } from \"../../../types\";\n\nexport default function generateManifest(opts: ScaffoldOptions): string {\n\tconst name = opts.projectName;\n\n\treturn `import type { MetadataRoute } from \"next\";\nimport { readFileSync } from \"fs\";\nimport { join } from \"path\";\n\n// Brand palette prebuild drops at public/styles/styles.json. Neutral fallback if\n// it's missing.\nfunction loadTheme() {\n\ttry {\n\t\treturn JSON.parse(\n\t\t\treadFileSync(join(process.cwd(), \"public/styles/styles.json\"), \"utf8\"),\n\t\t);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport default function manifest(): MetadataRoute.Manifest {\n\tconst theme = loadTheme();\n\treturn {\n\t\tname: ${JSON.stringify(name)},\n\t\tshort_name: ${JSON.stringify(name)},\n\t\tdescription: ${JSON.stringify(`Order online from ${name}.`)},\n\t\tstart_url: \"/\",\n\t\tdisplay: \"standalone\",\n\t\tbackground_color: theme?.backgroundBase ?? \"#ffffff\",\n\t\ttheme_color: theme?.primary ?? \"#171717\",\n\t\ticons: [\n\t\t\t{ src: \"/icon/192\", sizes: \"192x192\", type: \"image/png\" },\n\t\t\t{ src: \"/icon/512\", sizes: \"512x512\", type: \"image/png\" },\n\t\t],\n\t};\n}\n`;\n}\n","import type { ScaffoldOptions } from \"../../../../types\";\n\n// add bullshit tos here\nexport default function generateTermsPage(opts: ScaffoldOptions) {\n\n if (opts.includeTermsPage) {\n return `export default function TermsPage() {\n return (\n <div>\n <h1>Terms of Service</h1>\n </div>\n )\n }`;\n }\n\n}\n","import type { ScaffoldOptions } from \"../../../../types\";\n\nexport default function generatePrivacyPage(opts: ScaffoldOptions) {\n\n if (opts.includePrivacyPage) {\n return `export default function PrivacyPage() {\n return (\n <div>\n <h1>Privacy Policy</h1>\n </div>\n )\n }`;\n }\n\n}\n","export const SUPABASE_URL = \"https://dhnpoxorllfdobwftkyb.supabase.co\";\n\nexport const SUPABASE_ANON_KEY =\n\t\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImRobnBveG9ybGxmZG9id2Z0a3liIiwicm9sZSI6ImFub24iLCJpYXQiOjE3MzkwNTQxMDgsImV4cCI6MjA1NDYzMDEwOH0.zI8PwbgKwijHZ1QmxJqmaPrFvg02w1vOY2Qcs7SddzI\";\nexport const ZORGO_PURPLE = \"rgb(153,67,233)\";\n\nexport const expoGoGoogleClientId =\n\t\"959654249401-dm6nbi27rj605ul1nkt8o2imb8f7daff.apps.googleusercontent.com\";\n\nexport const API_BASE_URL =\n\tprocess.env.NODE_ENV === \"production\"\n\t\t? \"https://api.zorgotech.com\"\n\t\t: \"https://staging.zorgo.ai\";\n\n\n// replace instances of API_BASE_URL with env enum\nexport enum Environments {\n\tProduction = \"https://api.zorgotech.com\",\n\tStaging = \"http://api.zorgo.ai\",\n\tDevelopment = \"http://localhost:3000\",\n}\n/** Emails allowed to access developer-only metrics (e.g. /performance/developer). */\nexport const DEVELOPER_EMAILS = [\"clawsorgo@gmail.com\", \"gmandwee@gmail.com\"] as const;\n\nexport function isDeveloperEmail(email?: string | null): boolean {\n\treturn !!email && (DEVELOPER_EMAILS as readonly string[]).includes(email);\n}\n\nexport const ORDER_STORE_CONSTANTS = {\n\tDEFAULTS: {\n\t\tPREP_MINUTES: 20, // default amount of time for prep\n\t\tPAST_HOURS: 24, // hours into the past orders are fetched for\n\t\tFUTURE_HOURS: 72 // hours into the future orders are fetched for \n\t},\n\tORDER_STATUS: {\n\t\tSTAGING: 10,\n\t\tPENDING: 1,\n\t\tCOMPLETED: 2,\n\t\tCANCELLED: 4,\n\t\tPAID: 6,\n\t\tPARTIALLY_PAID: 7,\n\t\tKITCHEN_DONE: 9,\n\t\tCONFIRMED: 11,\n\t\tPREPARING: 12,\n\t},\n\tPOS_METHOD_ID: 3,\n\tORDER_TYPE: {\n\t\tDINE_IN: 1,\n\t\tTAKEOUT: 2,\n\t\tDELIVERY: 3\n\t},\n\t/** KDS edit highlight duration after a POS modification. */\n\tMODIFICATION_HIGHLIGHT_MS: 8_000,\n\t/** POS order realtime: refetch + recycle postgres_changes channel on this cadence. */\n\tLISTENER_SYNC_INTERVAL_MS: 60_000,\n\tORDER_SELECT: `\n\t*,\n\n\tcharges (\n\t\t*\n\t),\n\n\tcustomers\n\t (customer_id, first_name, last_name, phone_number, email),\n\n\torder_items\n\t (\n\t\torder_item_id, item_id, quantity, price_at_order, order_id, comments, status, applied_promo_id, discount_amount,\n\t\titems (\n\t\t\titem_id, name, price,\n\t\t\tbase_items (\n\t\t\t\tbase_item_id, category_id, name,\n\t\t\t\tcategories (category_id, name, is_catering)\n\t\t\t)\n\t\t),\n\t\torder_item_selected_items (\n\t\t\torder_item_id, rule_id, item_id, quantity, upcharge_price,\n\t\t\titems (\n\t\t\t\titem_id, name, price,\n\t\t\t\tbase_items (\n\t\t\t\t\tbase_item_id, category_id, name,\n\t\t\t\t\tcategories (category_id, name, is_catering)\n\t\t\t\t)\n\t\t\t),\n\t\t\titem_rules (rule_id, group_name)\n\t\t),\n\t\torder_item_selected_components (\n\t\t\torder_item_id, rule_id, component_id, quantity, upcharge_price,\n\t\t\tcomponents (id, name, component_type_id), item_rules (rule_id, group_name)\n\t\t),\n\t\torder_item_components (\n\t\t\torder_item_id, component_id, quantity_servings, is_base,\n\t\t\tcomponents (id, name, component_type_id)\n\t\t)\n\t)\n`,\n};\n\nexport const CHARGE_STATUSES = {\n\tSUCCESS: 1,\n\tPENDING: 2,\n\tREFUNDED: 3,\n\tVOIDED: 4,\n\tPAYMENT_QUEUED: 5,\n\tFAILED: 6\n}\n","import { SUPABASE_URL } from \"@zorgo/universal/constants\";\nimport type { ScaffoldOptions } from \"../../types\";\n\n// .env is the single source of truth for this site. Everything that varies per\n// project (which API environment, the site URL, the worker name) lives here;\n// scripts/prebuild.ts reads these back to regenerate wrangler.toml on every\n// build, so wrangler.toml is a build artifact — edit .env, not it.\nexport default function generateEnvFile(opts: ScaffoldOptions): string {\n\tconst lines = [\n\t\t// which Zorgo API this site talks to (an Environments enum value). read by\n\t\t// @zorgo constants (client), scripts/prebuild.ts, and lib/zorgoSiteToken.ts.\n\t\t`NEXT_PUBLIC_API_BASE_URL=${opts.apiBaseUrl}`,\n\t\t// the site's own origin — read by sitemap.ts, robots.ts, layout, stores.\n\t\t`NEXT_PUBLIC_SITE_URL=${opts.projectUrl}`,\n\t\t`NEXT_PUBLIC_BASE_URL=${opts.projectUrl}`,\n\t\t`NEXT_PUBLIC_SUPABASE_URL=${SUPABASE_URL}`,\n\t\t// worker name for the generated wrangler.toml.\n\t\t`ZORGO_PROJECT_NAME=${opts.projectName}`,\n\t];\n\tif (opts.stripePublishableKey) {\n\t\tlines.push(`NEXT_PUBLIC_STRIPE_PUBLIC_KEY=${opts.stripePublishableKey}`);\n\t}\n\tif (opts.websiteSecret) {\n\t\tlines.push(`ZORGO_SITE_SECRET=${opts.websiteSecret}`);\n\t}\n\treturn lines.join(\"\\n\") + \"\\n\";\n}\n","import { ZORGO_API_BASE_URL } from \"./cli\";\n\nexport async function validateWebsiteSecret(value: string): Promise<boolean> {\n try {\n const res = await fetch(`${ZORGO_API_BASE_URL}/auth/site-token`, {\n method: \"POST\",\n headers: { \"x-zorgo-site-secret\": value },\n });\n return res.ok;\n } catch {\n return false;\n }\n}\n\nexport async function validateStripePublicKey(key: string): Promise<boolean> {\n try {\n const res = await fetch(`${ZORGO_API_BASE_URL}/auth/validate-stripe-key`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ publishableKey: key }),\n });\n if (!res.ok) return false;\n const { valid } = await res.json();\n return valid === true;\n } catch {\n return false;\n }\n}\n\nexport function formatProjectName(value: string) {\n return value.toLowerCase().trim().replace(/ /g, \"-\");\n}\n"],"mappings":"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","names":["cli_exports","__export","ZORGO_API_BASE_URL","__toCommonJS","import_node_util","import_promises","import_node_fs","import_node_path","import_node_fs","import_node_path","writeGeneratedFile","targetDir","relativePath","content","fullPath","version","PINNED_VERSIONS","version","DEV_DEPENDENCIES","generatePackageJson","opts","PINNED_VERSIONS","DEV_DEPENDENCIES","HARDCODED_BRANDING","FONT_ON_LIGHT","FONT_ON_DARK","BACKGROUND_SURFACE_DELTA","parseHexRgb","background","hex","full","c","toHex","r","g","b","deriveFontColor","rgb","deriveElevatedBackground","deriveRecessedBackground","generateGlobalsCss","_opts","branding","fontFamilyParam","foreground","primaryForeground","accentForeground","backgroundElevated","backgroundRecessed","generateLayout","opts","generateIcon","opts","generateAppleIcon","opts","generateOpengraphImage","opts","projectName","letter","generateManifest","opts","name","generateTermsPage","opts","generatePrivacyPage","opts","SUPABASE_URL","API_BASE_URL","generateEnvFile","opts","lines","SUPABASE_URL","TREE_DIR","GENERATED_FILES","generatePackageJson","generateGlobalsCss","generateLayout","generateIcon","generateAppleIcon","generateOpengraphImage","generateManifest","generateTermsPage","generatePrivacyPage","generateEnvFile","scaffold","targetDir","opts","src","gitignore","file","content","writeGeneratedFile","import_prompts","validateWebsiteSecret","value","ZORGO_API_BASE_URL","validateStripePublicKey","key","res","valid","ENV_URLS","ZORGO_API_BASE_URL","flags","positionals","args","targetDirArg","slugify","s","questions","value","validateStripePublicKey","validateWebsiteSecret","flagAnswers","main","remainingQuestions","q","promptedAnswers","prompts","question","answer","answers","opts","targetDir","scaffold"]}