@zorgo/next 1.1.7 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.d.mts +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +322 -1
- package/dist/cli.js.map +1 -0
- package/dist/cli.mjs +322 -1
- package/dist/cli.mjs.map +1 -0
- package/dist/components.d.mts +1047 -89
- package/dist/components.d.ts +1047 -89
- package/dist/components.js +4611 -1048
- package/dist/components.js.map +1 -1
- package/dist/components.mjs +4635 -1149
- package/dist/components.mjs.map +1 -1
- package/dist/images.d.mts +48 -0
- package/dist/images.d.ts +48 -0
- package/dist/images.js +72 -0
- package/dist/images.js.map +1 -0
- package/dist/images.mjs +39 -0
- package/dist/images.mjs.map +1 -0
- package/dist/index.d.mts +489 -14
- package/dist/index.d.ts +489 -14
- package/dist/index.js +168 -1
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +168 -1
- package/dist/index.mjs.map +1 -0
- package/dist/item-page.d.mts +157 -0
- package/dist/item-page.d.ts +157 -0
- package/dist/item-page.js +168 -0
- package/dist/item-page.js.map +1 -0
- package/dist/item-page.mjs +131 -0
- package/dist/item-page.mjs.map +1 -0
- package/dist/legal.d.mts +31 -0
- package/dist/legal.d.ts +31 -0
- package/dist/legal.js +322 -0
- package/dist/legal.js.map +1 -0
- package/dist/legal.mjs +293 -0
- package/dist/legal.mjs.map +1 -0
- package/dist/seo.d.mts +87 -2
- package/dist/seo.d.ts +87 -2
- package/dist/seo.js +111 -2
- package/dist/seo.js.map +1 -1
- package/dist/seo.mjs +106 -1
- package/dist/seo.mjs.map +1 -1
- package/dist/server.d.mts +27 -1
- package/dist/server.d.ts +27 -1
- package/dist/server.js +761 -1
- package/dist/server.js.map +1 -0
- package/dist/server.mjs +722 -1
- package/dist/server.mjs.map +1 -0
- package/dist/slugs.d.mts +2 -1
- package/dist/slugs.d.ts +2 -1
- package/dist/slugs.js +2 -0
- package/dist/slugs.js.map +1 -1
- package/dist/slugs.mjs +1 -0
- package/dist/slugs.mjs.map +1 -1
- package/dist/tree/README.md +2 -2
- package/dist/tree/app/components/ClientItemForm.tsx +7 -0
- package/dist/tree/app/components/Header.tsx +3 -0
- package/dist/tree/app/components/ModalRegistry.tsx +3 -2
- package/dist/tree/app/components/index.ts +2 -1
- package/dist/tree/app/error.tsx +12 -3
- package/dist/tree/app/global-error.tsx +21 -4
- package/dist/tree/app/globals.css +41 -0
- package/dist/tree/app/menu/[slug]/page.tsx +16 -48
- package/dist/tree/app/not-found.tsx +17 -3
- package/dist/tree/app/privacy/page.tsx.gen.ts +28 -9
- package/dist/tree/app/terms/page.tsx.gen.ts +26 -10
- package/dist/tree/gitignore +7 -1
- package/dist/tree/image-loader.ts +4 -0
- package/dist/tree/next.config.ts +13 -0
- package/dist/tree/open-next.config.ts +7 -0
- package/dist/tree/package.json.gen.ts +8 -2
- package/package.json +17 -2
- package/dist/tree/app/globals.css.gen.ts +0 -123
- package/dist/tree/app/menu/[slug]/ItemCustomizationClient.tsx +0 -18
package/dist/cli.mjs
CHANGED
|
@@ -1,2 +1,323 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
const a0_0x8834bf=a0_0x3aed;(function(_0x1ba823,_0x48f3c9){const _0x2cef4c=a0_0x3aed,_0x33c8f9=_0x1ba823();while(!![]){try{const _0x45838b=-parseInt(_0x2cef4c(0x1ae))/0x1+-parseInt(_0x2cef4c(0x169))/0x2+-parseInt(_0x2cef4c(0x13d))/0x3*(parseInt(_0x2cef4c(0x15e))/0x4)+parseInt(_0x2cef4c(0x162))/0x5*(-parseInt(_0x2cef4c(0x134))/0x6)+-parseInt(_0x2cef4c(0x160))/0x7*(-parseInt(_0x2cef4c(0x1aa))/0x8)+parseInt(_0x2cef4c(0x185))/0x9*(parseInt(_0x2cef4c(0x167))/0xa)+-parseInt(_0x2cef4c(0x19b))/0xb*(-parseInt(_0x2cef4c(0x143))/0xc);if(_0x45838b===_0x48f3c9)break;else _0x33c8f9['push'](_0x33c8f9['shift']());}catch(_0x4826f0){_0x33c8f9['push'](_0x33c8f9['shift']());}}}(a0_0x2802,0x9ae95));import a0_0x5a857c from'path';import{fileURLToPath as a0_0xb03b71}from'url';var B=()=>a0_0xb03b71(import.meta.url),M=()=>a0_0x5a857c[a0_0x8834bf(0x18f)](B()),i=M();import{parseArgs as a0_0x4c97b2}from'util';import{cp as a0_0x4f583f,rename as a0_0x4bacea}from'fs/promises';import{existsSync as a0_0x5ac367}from'fs';import{join as a0_0x26fdf0}from'path';import{writeFileSync as a0_0x8d74a6,mkdirSync as a0_0x8df9e9}from'fs';import{dirname as a0_0x2a9a97,join as a0_0x36da14}from'path';function g(_0x3d20d8,_0x259396,_0x1b5454){const _0x15e322=a0_0x8834bf,_0x389115={'vpnnG':function(_0x33d767,_0x2af554,_0x1be2b3){return _0x33d767(_0x2af554,_0x1be2b3);},'frNDm':function(_0x368660,_0x261182){return _0x368660(_0x261182);},'xzwmr':function(_0x54a55f,_0x22d3af,_0xb4d18a){return _0x54a55f(_0x22d3af,_0xb4d18a);}};let _0x46dd02=_0x389115['vpnnG'](a0_0x36da14,_0x3d20d8,_0x259396);a0_0x8df9e9(_0x389115[_0x15e322(0x12e)](a0_0x2a9a97,_0x46dd02),{'recursive':!0x0}),_0x389115['xzwmr'](a0_0x8d74a6,_0x46dd02,_0x1b5454);}var k=a0_0x8834bf(0x177),U={'@zorgo/next':k,'@cloudflare/kv-asset-handler':'0.4.0','@opennextjs/cloudflare':a0_0x8834bf(0x12c),'@stripe/react-stripe-js':'6.7.0','@stripe/stripe-js':a0_0x8834bf(0x15a),'@supabase/ssr':a0_0x8834bf(0x141),'@supabase/supabase-js':a0_0x8834bf(0x161),'class-variance-authority':a0_0x8834bf(0x1a1),'clsx':a0_0x8834bf(0x131),'date-fns':'4.1.0','date-fns-tz':a0_0x8834bf(0x173),'geojson-vt':'4.0.2','gsap':'3.12.7','iconoir-react':a0_0x8834bf(0x1ab),'libphonenumber-js':a0_0x8834bf(0x14c),'lucide-react':a0_0x8834bf(0x153),'promise-timeout':a0_0x8834bf(0x137),'sharp':a0_0x8834bf(0x125),'stripe':a0_0x8834bf(0x116),'tailwind-merge':'3.0.1','tailwindcss-animate':a0_0x8834bf(0x172),'zod':a0_0x8834bf(0x181),'next':a0_0x8834bf(0x138),'react':a0_0x8834bf(0x18e),'react-dom':a0_0x8834bf(0x18e)},L={'wrangler':a0_0x8834bf(0x17a),'@tailwindcss/postcss':a0_0x8834bf(0x1a0),'@types/node':'20.19.43','@types/react':a0_0x8834bf(0x1a3),'@types/react-dom':'19.2.3','babel-plugin-react-compiler':'1.0.0','eslint':a0_0x8834bf(0x14e),'eslint-config-next':a0_0x8834bf(0x138),'tailwindcss':a0_0x8834bf(0x1a0),'typescript':a0_0x8834bf(0x1a9),'tsx':a0_0x8834bf(0x183),'@next/env':a0_0x8834bf(0x138)};function a0_0x2802(){const _0x5c1c00=['ms4XmY44','s3PkAuO','os4Zos40','oWOGic0TzM9UDc1Zyw5ZoIaI','oWOGic0TyMfJA2DYB3vUzc1YzwnLC3nLzdOG','y29UzMLYBq','DhjLzq','ms4YmY4W','oNDNAhrandaWoZCWmczKAxnWBgf5pxn3yxaIktSkqgLTCg9YDcaIDgfPBhDPBMrJC3mIoWOVkIbuywLSD2LUzcb2ncbZA2LWCYbUB2rLx21VzhvSzxm7ieb6B3jNBY9UzxH0ihnOAxbZihvUlw9IzNvZy2f0zwqGy29TCg9Uzw50CYbZBWOGicb0AgvPCIbJBgfZCYbUyw1LCYbHCMuGC2nHBM5HyMXLigHLCMuUicOVcKbZB3vYy2uGiI4Ul25VzgvFBw9KDwXLCY9aEM9Yz28VBMv4Dc9KAxn0l2nVBxbVBMvUDhmUBwPZiJSkcJPYB290ihSkicaTlwjHy2TNCM91BMq6ia','Ahr0Chm6lY9ZDgfNAw5NlNPVCMDVlMfP','ChvZAa','zxHWB3j0igrLzMf1BhqGzNvUy3rPB24GuhjPDMfJEvbHz2uOksb7cIaGicaGicaGicaGihjLDhvYBIaOcIaGicaGicaGicaGicaGica8zgL2pGOGicaGicaGicaGicaGicaGicaGidXOmt5qCML2ywn5ifbVBgLJEtWVAde+cIaGicaGicaGicaGicaGica8l2rPDJ4kicaGicaGicaGicaGkqOGicaGicaGih0','zfzTr04','C3bSAxq','os45lJa','ChjVAMvJDc1Uyw1L','AM9PBG','laOjcxn0yxj0x3vYBdOGiI8IlaOjcwrPC3bSyxK6icjZDgfUzgfSB25LiIWkcqLIywnRz3jVDw5Kx2nVBg9YoIb0AgvTzt8UyMfJA2DYB3vUzejHC2uGpZ8GiInMzMzMzMyIlaOjcxrOzw1Lx2nVBg9YoIb0AgvTzt8UChjPBwfYEsa/pYaIiZe3mtCXnYiScGKjAwnVBNm6ifSkcqKjEYbZCMm6iciVAwnVBI8XotiIlcbZAxPLCZOGiJe5mNGXotiIlcb0ExbLoIaIAw1Hz2uVCg5NiIb9laOjcqL7ihnYyZOGiI9Py29UlZuXmIiSihnPEMvZoIaInteYEduXmIiSihr5Cgu6icjPBwfNzs9WBMCIih0ScGKjxsWkcx07cN0k','mZGWotq2mhbVt2PrwG','DvnRBum','ndC5nJi2zwfzEenZ','mI40nY41','mtbNDhveDMG','Dhn4ihnJCMLWDhmVChjLyNvPBgqUDhm','iZmYnJrgrG','yxbWl29Wzw5NCMfWAc1PBwfNzs50C3G','wxbUr2G','mtb3B05Hqu0','Aw5JBhvKzvbYAxzHy3LqywDL','mtmWodaZme9HvNHIyq','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','C3rYAw5NAwz5','CgfKu3rHCNq','D2vIC2L0zvnLy3jLDa','yxbWl2LJB24UDhn4','BgvUz3rO','zxjYB3i','qgLTCg9YDcb1CMWOiMH0DhbZoI8VzM9UDhmUz29Vz2XLyxbPCY5JB20Vy3nZmJ9Myw1PBhK9','ms4WlJC','mY4YlJa','Dg9mB3DLCKnHC2u','lMDLBI50CW','C2XPy2u','ms4XlJu','CMvWBgfJzq','yxbWl2XHEw91Dc50C3G','nc44nI4W','C3rYAw5N','i2y1zJvMnq','yMfJA2DYB3vUzejHC2u','CKLzqwm','qLzMswm','tg9JywW','nc4ZlJy','tKvyvf9qvujmsunFqKftrv9vuKW9','nc4YmY4W','tKvyvf9qvujmsunFu0Lurv9vuKW9','mtuWmdy1mw5KwfDuyq','A2TOEhm','BMfTzq','A2v5CW','sw50zxi','Bg9JywW','Dhn4ihnJCMLWDhmVChjLyNvPBgqUDhmGjIyGBMv4DcbIDwLSza','D2vIC2L0zs1ZzwnYzxq','suLNBwi','mtKUmI40','zgLYBMfTzq','iIWGC2fUCY1ZzxjPzJSkFqOkqhrOzw1LigLUBgLUzsb7cIaGls1JB2XVCI1IywnRz3jVDw5KoIb2yxiOls1IywnRz3jVDw5KktSkicaTlwnVBg9YlwjHy2TNCM91BMqTzwXLDMf0zwq6ihzHCIGTlwjHy2TNCM91BMqTzwXLDMf0zwqPoWOGic0Ty29SB3iTyMfJA2DYB3vUzc1YzwnLC3nLzdOGDMfYkc0TyMfJA2DYB3vUzc1YzwnLC3nLzcK7cIaGls1JB2XVCI1MB3jLz3jVDw5KoIb2yxiOls1MB3jLz3jVDw5KktSkicaTlwnVBg9YlxbYAw1HCNK6ihzHCIGTlxbYAw1HCNKPoWOGic0Ty29SB3iTChjPBwfYEs1MB3jLz3jVDw5KoIb2yxiOls1WCMLTyxj5lwzVCMvNCM91BMqPoWOGic0Ty29SB3iTywnJzw50oIb2yxiOls1Hy2nLBNqPoWOGic0Ty29SB3iTywnJzw50lwzVCMvNCM91BMq6ihzHCIGTlwfJy2vUDc1MB3jLz3jVDw5KktSkicaTlwzVBNqTC2fUCZOGDMfYkc0TzM9UDc1Zyw5ZktSkFqOkqgXHEwvYigjHC2uGEWOGigj1DhrVBIWkicbBDhLWzt0IyNv0Dg9UiL0ScIaGw3r5Cgu9iNn1yM1PDcjDlaOGifT0ExbLpsjYzxnLDcjDihSkicaGign1CNnVCJOGCg9PBNrLCJSkicb9cGOGigj1DhrVBJPKAxnHyMXLzcWkicbBDhLWzt0IyNv0Dg9UiL06zgLZywjSzwqScIaGw3r5Cgu9iNn1yM1PDcjDoMrPC2fIBgvKlaOGifT0ExbLpsjYzxnLDcjDoMrPC2fIBgvKihSkicaGign1CNnVCJOGBM90lwfSBg93zwq7cIaGFqP9cG','laOjcwXVy2fSztOGiMvUx1vtiIWkcx0ScGL0D2L0DgvYoIb7cGKjy2fYzdOGiNn1Bw1HCNLFBgfYz2vFAw1Hz2uIlaOjFsWkFtSkcMv4Cg9YDcbJB25ZDcb2Awv3Cg9YDdOGvMLLD3bVCNqGpsb7cGL3Awr0AdOGiMrLDMLJzs13Awr0AciScGLPBML0AwfSu2nHBgu6ideScN07cGPLEhbVCNqGzgvMyxvSDcbHC3LUyYbMDw5JDgLVBIbsB290tgf5B3v0khSGy2HPBgrYzw4GFtOGEYbJAgLSzhjLBJOGuMvHy3qUuMvHy3roB2rLih0PihSkcxjLDhvYBIaOcGKjpgH0BwWGBgfUzZ0Izw4IpGOjcqK8AgvHzd4kcqKjctXZy3jPChqkcqKjcqL0ExbLpsjHChbSAwnHDgLVBI9SzcTQC29UiGOjcqKjcwrHBMDLCM91C2X5u2v0sw5Uzxjive1mpxT7if9FAhrTBdOGsLnptI5ZDhjPBMDPzNKOCMvZDgf1CMfUDePZB25mzcKGFx0kcqKjcs8+cGKjctWVAgvHzd4kcqKjpgjVzhKGy2XHC3noyw1LpsjTAw4TAc1Zy3jLzw4GzMXLEcbMBgv4lwnVBcbIzY1IywnRz3jVDw5KihrLEhqTzM9YzwDYB3vUzci+cGKjcqK8sgvHzgvYic8+cGKjcqK8BwfPBIbJBgfZC05HBwu9iMzSzxGTmsi+cGKjcqKjE2nOAwXKCMvUFqOjcqKjpc9TywLUpGOjcqKjpezVB3rLCIaVpGOjcqKjpe1VzgfSsg9ZDcaVpGOjcqKjpenVB2TPzunVBNnLBNqGlZ4kcqKjpc9IB2r5pGOjctWVAhrTBd4kcsL9cGO','BMv4DcbKzxy','t2rWB3a','v2HPy2GGzw52AxjVBM1LBNqGyxjLihLVDsb1C2LUzZ8GkhDPBgWGy2HHBMDLihDOAwnOigvUDMLYB25Tzw50ihDLihrLC3qGA2v5CYbHz2fPBNn0kq','BM9UlwLUDgvYywn0AxzL','lMDPDgLNBM9Yzq','ChjPDMfJEq','Dgv4Da','v2HHDcbPCYb0AguGC2L0zsDZifvstd8','CgfJA2fNzs5QC29U','mJuYnJC0odrhu1jAwLa','DgvYBxm','qwzUq3m','C3rHz2LUzW','sw52ywXPzcaTlxn0CMLWzs1RzxK','nc4ZlJi','mc43lJe','tKvyvf9qvujmsunFu1vqqujbu0vFvvjmpq','mtKUmI4XnW','ywnJzw50','zw5KC1DPDgG','y2HHCKf0','vgHHDcDZig5VDcbHihzHBgLKifPpuKDpx1njvevFu0vduKvu','ChjVAMvJDe5HBwu','ns45lJm','nZjfCeXtzeO','nY44lJa','zxHWB3j0igrLzMf1BhqGzNvUy3rPB24GvgvYBxnqywDLkcKGEWOGicaGicaGicaGicbYzxr1CM4GkaOGicaGicaGicaGicaGicaGpgrPDJ4kicaGicaGicaGicaGicaGicaGica8Ade+vgvYBxmGB2yGu2vYDMLJztWVAde+cIaGicaGicaGicaGicaGica8l2rPDJ4kicaGicaGicaGicaGkqOGicaGicaGih0','BLbgC1G','mJu2ntaYwM5NqKvz','igLUDg8G','oWOGic0TywnJzw50oIa','z2vUzxjHDgu','v2HHDcb3B3vSzcb5B3uGBgLRzsb0BYbUyw1LihrOAxmGChjVAMvJDd8','Bwf4','ue9tva','Ahr0CdOVl2XVy2fSAg9ZDdOZmdaW','Dhn4ihnJCMLWDhmVChjLyNvPBgqUDhmGjIyGD3jHBMDSzxiGzgvWBg95','i0y1rJvgnq','Aw1WB3j0ihSGsw1Hz2vszxnWB25Zzsb9igzYB20GiM5LEhqVB2CIoWPPBxbVCNqGEYbYzwfKrMLSzvn5BMmGFsbMCM9TicjMCYi7cMLTCg9YDcb7igPVAw4GFsbMCM9TicjWyxrOiJSkcMv4Cg9YDcbJB25ZDcbHBhqGpsa','laOjB3bLBKDYyxbOoIb7cGKjDhLWztOGiNDLyNnPDguIlaOjcxnPDgvoyw1LoIa','laOjcxnOB3j0x25HBwu6ia','oWPLEhbVCNqGy29UC3qGC2L6zsa9ihSGD2LKDgG6ideYmdaSigHLAwDODdOGnJmWih07cMv4Cg9YDcbJB25ZDcbJB250zw50vhLWzsa9icjPBwfNzs9WBMCIoWOklY8GqNjHBMqGCgfSzxr0zsbWCMvIDwLSzcbKCM9WCYbHDcbWDwjSAwmVC3r5BgvZl3n0EwXLCY5QC29UlIbozxv0CMfSigzHBgXIywnRigLMcI8VigL0j3mGBwLZC2LUzYbZBYb0AguGy2fYzcbZDgLSBcbYzw5KzxjZlGPMDw5JDgLVBIbSB2fKvgHLBwuOksb7cGL0CNKGEWOjcxjLDhvYBIbku09olNbHCNnLkaOjcqLYzwfKrMLSzvn5BMmOAM9PBIHWCM9JzxnZlMn3zcGPlcaIChvIBgLJl3n0EwXLCY9ZDhLSzxmUANnVBIiPlcaIDxrMociPlaOjcsK7cGL9ignHDgnOihSkcqLYzxr1CM4GBNvSBdSkcx0kFqOkzxHWB3j0igrLzMf1BhqGzNvUy3rPB24Gt3bLBMDYyxbOsw1Hz2uOksb7cGLJB25ZDcb0AgvTzsa9igXVywruAgvTzsGPoWOjy29UC3qGyMfJA2DYB3vUzca9ihrOzw1LpY5IywnRz3jVDw5KqMfZzsa/pYaIiZe3mtCXnYi7cGLJB25ZDcbMB3jLz3jVDw5Kid0GDgHLBwu/lMzVCMvNCM91BMqGpZ8GiInMzMzMzMyIoWOjy29UC3qGyMfKz2uGpsb0AgvTzt8UChjPBwfYEsa/pYaIi2zMzMzMzIi7cGLJB25ZDcbIywrNzuzVCMvNCM91BMqGpsb0AgvTzt8UChjPBwfYEuzVCMvNCM91BMqGpZ8GiImXnZe3mtCIoWOjCMv0DxjUig5LDYbjBwfNzvjLC3bVBNnLkaOjcsGkcqKjpgrPDGOjcqKjC3r5Bgu9E3SkcqKjcqL3Awr0AdOGiJeWmcuIlaOjcqKjcwHLAwDODdOGiJeWmcuIlaOjcqKjcwrPC3bSyxK6icjMBgv4iIWkcqKjcqLMBgv4rgLYzwn0Aw9UoIaIy29SDw1UiIWkcqKjcqLHBgLNBKL0zw1ZoIaIy2vUDgvYiIWkcqKjcqLQDxn0Awz5q29UDgvUDdOGiMnLBNrLCIiScGKjcqKjyMfJA2DYB3vUzcWkcqKjcqLJB2XVCJOGzM9YzwDYB3vUzcWkcqKjcx19cGKjct4kcqKjctXKAxykcqKjcqLZDhLSzt17EWOjcqKjcqLKAxnWBgf5oIaIzMXLEciScGKjcqKjcwfSAwDUsxrLBxm6icjJzw50zxiIlaOjcqKjcqLQDxn0Awz5q29UDgvUDdOGiMnLBNrLCIiScGKjcqKjcxDPzhrOoIaXndaScGKjcqKjcwHLAwDODdOGmtqWlaOjcqKjcqLIB3jKzxjsywrPDxm6idmYlaOjcqKjcqLIywnRz3jVDw5KoIbIywrNzsWkcqKjcqKjy29SB3i6igjHzgDLrM9YzwDYB3vUzcWkcqKjcqKjzM9UDfnPEMu6idG0laOjcqKjcqLMB250v2vPz2H0oIa3mdaScGKjcqKjcw1HCMDPBKjVDhrVBtOGndGScGKjcqKjFx0kcqKjct4kcqKjcqK','DhjPBq','tKvyvf9qvujmsunFqvbjx0jbu0vFvvjmpq','rgf0ysbJyw5UB3qGyMuGzMv0y2HLzcb3AxrOB3v0igeGC2vJCMv0','C3rYAxbLlwTLEq','wK9sr09Fu0Lurv9trunsrvq9','C2vSzwn0','Bg9N','ChjVAMvJDc11CMW','ChjVzhvJDgLVBG','sxjoq0C','rw50zxiGwK9sr09Fu0Lurv9trunsrvq','Cgf0Aa','tKvyvf9qvujmsunFu1rssvbfx1bvqKXjq19lrvK9','zxHPDa','mtCUnc4W','Ahr0Chm6lY9HCgKUEM9Yz290zwnOlMnVBq','yxbWBgLJyxrPB24VANnVBG','oWOGic0TywnJzw50lwzVCMvNCM91BMq6ia','zM9UDezHBwLSEq','ChjVAMvJDfvYBa','zMLSDgvY','oWOGic0TzM9YzwDYB3vUzdOG','B0zMrNm','u2nHzMzVBgrLzca','wK9sr09FufjpsKvdvf9oqu1fpq','C3rYAxbLuhvIBgLZAgfIBgvlzxK','ChjPBwfYEq','sw52ywXPzcbtDhjPCguGChvIBgLZAgfIBguGA2v5','BwfW','mc4Znc41','cGKjctWVzgL2pGOjcsKScGKjC2L6zsWkcsK7cN0k','yMnPq2W','ms4WlJa','t1Pws1u','u3rHz2LUzW','sw52ywXPzcaTlwvUDMLYB25Tzw50ici','ms4Xos4Xmq','Ahr0Chm6lY9KAg5WB3HVCMXSzMrVyNDMDgT5yI5ZDxbHyMfZzs5JBW','zNjorg0','oWOGic0TChjPBwfYEs1MB3jLz3jVDw5KoIa','u2f3reu','mI4XlJe','rMPOrMi','zw52AxjVBM1LBNq','mtC0oteZognPzxn6DG','laOjcxrLBxbSyxrLoIa','twLZC2LUzYbYzxf1AxjLzcbMBgfNCYbMB3iGBM9UlwLUDgvYywn0AxzLig1Vzgu6ia','ms4ZlJa','mtyUmI4Xma','Dg9tDhjPBMC','Aw5JBhvKzvrLCM1ZugfNzq','cMLTCg9YDcb0ExbLihSGtwv0ywrHDgeSifzPzxDWB3j0ih0GzNjVBsaIBMv4Dci7cMLTCg9YDcaIlI9NBg9IywXZlMnZCYi7cMLTCg9YDcb7ieHLywrLCIWGrM9VDgvYlcbnB2rHBeHVC3qGFsbMCM9TiciUl2nVBxbVBMvUDhmIoWPPBxbVCNqGEYbdB29RAwvdB25Zzw50ih0GzNjVBsaIqhPVCMDVl25LEhqVy29TCg9Uzw50CYi7cMLTCg9YDcb7ihjLC3rHDxjHBNrkC29UtgqGFsbMCM9TiciUlI9SAwiVz2vUzxjHDgvKl2PZB25Szci7cMv4Cg9YDcbJB25ZDcbTzxrHzgf0ytOGtwv0ywrHDgeGpsb7cGKVlYbYzxnVBhzLCYbYzwXHDgL2zsbvuKXZicHJyw5VBMLJywXZlcb0AguGyxv0BY1PBMPLy3rLzcbVCgvUz3jHCgGTAw1Hz2uPihrVigfIC29SDxrLlGOjlY8GFhWGkg5VDca/pYKGC28Gyw4Gzw1WDhKGtKvyvf9qvujmsunFu0Lurv9vuKWG4OcuigeGC2L0zsbWAwXVDgvKigjLzM9YzsbPDhmGvvjmigLZcGKVlYbZzxqG4OcuigzHBgXZigjHy2SGDg9VoYbUzxCGvvjmkciIksb0AhjVD3mGyw5KihDVDwXKigjYzwfRihrOzsbIDwLSzc9KzxbSB3KUcGLTzxrHzgf0yujHC2u6ig5LDYbvuKWOChjVy2vZCY5LBNyUtKvyvf9qvujmsunFu0Lurv9vuKWGFhWGiMH0Dha6lY9SB2nHBgHVC3q6mZaWmciPlaOjDgL0Bgu6ihSkcqLKzwzHDwX0oIa','CgfYC2vjBNq','m21ZrhjVBa','r2PXwM4','cGKjctWVzgL2pGOjcsKScGKjEYb3Awr0AdOGzgLTzw5ZAw9UlcbOzwLNAhq6igrPBwvUC2LVBIb9laOjktSkFqO','Dg9vChbLCKnHC2u','mc41lJi','tu9vwuO','mtjmDLDrvLy','yM9VBgvHBG','t3jKzxiGB25SAw5LigzYB20G','iZbHmgeWyq','zhjJvfO','l2f1DgGVDMfSAwrHDguTC3rYAxbLlwTLEq','Aw1WB3j0ihr5CguGEYbnzxrHzgf0yvjVDxrLih0GzNjVBsaIBMv4Dci7cMLTCg9YDcb7ihjLywrgAwXLu3LUyYb9igzYB20GiMzZiJSkAw1WB3j0ihSGAM9PBIb9igzYB20GiNbHDgGIoWOklY8GqNjHBMqGCgfSzxr0zsbWCMvIDwLSzcbKCM9WCYbHDcbWDwjSAwmVC3r5BgvZl3n0EwXLCY5QC29UlIbozxv0CMfSigzHBgXIywnRigLMcI8VigL0j3mGBwLZC2LUzY4kzNvUy3rPB24GBg9HzfrOzw1LkcKGEWOjDhj5ihSkcqLYzxr1CM4GsLnptI5WyxjZzsGkcqKjCMvHzezPBgvtEw5JkgPVAw4OChjVy2vZCY5JD2qOksWGiNb1yMXPyY9ZDhLSzxmVC3r5BgvZlMPZB24IksWGiNv0zJGIksWkcqKPoWOjFsbJyxrJAcb7cGKjCMv0DxjUig51BgW7cGL9cN0kcMv4Cg9YDcbKzwzHDwX0igz1BMn0Aw9Uig1HBMLMzxn0kcK6ie1LDgfKyxrHuM91DguUtwfUAwzLC3qGEWOjy29UC3qGDgHLBwuGpsbSB2fKvgHLBwuOktSkcxjLDhvYBIb7cGKjBMfTztOG','BwLU','yxbWl3bYAxzHy3KVCgfNzs50C3G'];a0_0x2802=function(){return _0x5c1c00;};return a0_0x2802();}function f(_0x12335e){const _0x43c1eb=a0_0x8834bf,_0x4ffa0a={'IrNCG':_0x43c1eb(0x163),'anRXO':_0x43c1eb(0x1b6),'rIYAc':'tsx\x20scripts/prebuild.ts\x20&&\x20wrangler\x20dev'};return JSON['stringify']({'name':_0x12335e['projectName'],'version':_0x43c1eb(0x128),'private':!0x0,'scripts':{'dev':'tsx\x20scripts/prebuild.ts\x20&&\x20next\x20dev','dev:no-prebuild':_0x43c1eb(0x192),'prebuild':_0x4ffa0a[_0x43c1eb(0x111)],'build':_0x43c1eb(0x18b),'cloudflare:deploy':_0x4ffa0a['anRXO'],'preview':_0x4ffa0a[_0x43c1eb(0x17e)]},'dependencies':U,'devDependencies':L},null,0x2);}var V={'backgroundBase':a0_0x8834bf(0x1b7),'primary':a0_0x8834bf(0x164),'accent':'#9664FF','fontFamily':a0_0x8834bf(0x189)},A=a0_0x8834bf(0x146),Z=a0_0x8834bf(0x17c),p=0xf;function h(_0x559060){const _0x16e1c0=a0_0x8834bf,_0x512fa9={'nPFsX':function(_0x10c1e8,_0x2d6942){return _0x10c1e8===_0x2d6942;}};let _0x384c1d=_0x559060['trim']()['replace'](/^#/,''),_0x54d683=_0x512fa9[_0x16e1c0(0x1ad)](_0x384c1d[_0x16e1c0(0x16f)],0x3)?_0x384c1d[_0x16e1c0(0x159)]('')[_0x16e1c0(0x124)](_0x2b197b=>_0x2b197b+_0x2b197b)[_0x16e1c0(0x15c)](''):_0x384c1d;return _0x54d683['length']!==0x6||Number['isNaN'](Number[_0x16e1c0(0x13c)](_0x54d683,0x10))?null:{'r':Number[_0x16e1c0(0x13c)](_0x54d683[_0x16e1c0(0x176)](0x0,0x2),0x10),'g':Number['parseInt'](_0x54d683[_0x16e1c0(0x176)](0x2,0x4),0x10),'b':Number[_0x16e1c0(0x13c)](_0x54d683['slice'](0x4,0x6),0x10)};}function D({r:_0x49ae37,g:_0x50ae82,b:_0xde1dab}){const _0x264cdd=a0_0x8834bf;return'#'+[_0x49ae37,_0x50ae82,_0xde1dab][_0x264cdd(0x124)](_0x23395f=>_0x23395f[_0x264cdd(0x139)](0x10)[_0x264cdd(0x16c)](0x2,'0'))[_0x264cdd(0x15c)]('');}function y(_0x4f3832){const _0x708fb3=a0_0x8834bf,_0x27fed9={'dVmGN':function(_0x13b58c,_0x7492c8){return _0x13b58c>_0x7492c8;},'kkhxs':function(_0x426fa6,_0x50b42a){return _0x426fa6/_0x50b42a;},'dsAHU':function(_0x4ca785,_0x384c1e){return _0x4ca785+_0x384c1e;},'MOUYJ':function(_0xfd3c74,_0x5c93dc){return _0xfd3c74*_0x5c93dc;}};let _0x13673e=h(_0x4f3832);return _0x13673e?_0x27fed9[_0x708fb3(0x158)](_0x27fed9[_0x708fb3(0x186)](_0x27fed9['dsAHU'](_0x27fed9['dsAHU'](0.299*_0x13673e['r'],_0x27fed9[_0x708fb3(0x142)](0.587,_0x13673e['g'])),0.114*_0x13673e['b']),0xff),0.5)?A:Z:A;}function a0_0x3aed(_0x39330a,_0x31fdde){_0x39330a=_0x39330a-0x10c;const _0x2802d0=a0_0x2802();let _0x3aedc1=_0x2802d0[_0x39330a];if(a0_0x3aed['ROfWZW']===undefined){var _0x41ffb2=function(_0x22938b){const _0x250a08='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x14fbe0='',_0x52b237='';for(let _0x46c52d=0x0,_0x243e61,_0x116b9c,_0x4e9d1e=0x0;_0x116b9c=_0x22938b['charAt'](_0x4e9d1e++);~_0x116b9c&&(_0x243e61=_0x46c52d%0x4?_0x243e61*0x40+_0x116b9c:_0x116b9c,_0x46c52d++%0x4)?_0x14fbe0+=String['fromCharCode'](0xff&_0x243e61>>(-0x2*_0x46c52d&0x6)):0x0){_0x116b9c=_0x250a08['indexOf'](_0x116b9c);}for(let _0x19f70a=0x0,_0x2525f9=_0x14fbe0['length'];_0x19f70a<_0x2525f9;_0x19f70a++){_0x52b237+='%'+('00'+_0x14fbe0['charCodeAt'](_0x19f70a)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x52b237);};a0_0x3aed['VrhKkq']=_0x41ffb2,a0_0x3aed['apNpTS']={},a0_0x3aed['ROfWZW']=!![];}const _0x21014f=_0x2802d0[0x0],_0x3fcab0=_0x39330a+_0x21014f,_0x160aac=a0_0x3aed['apNpTS'][_0x3fcab0];return!_0x160aac?(_0x3aedc1=a0_0x3aed['VrhKkq'](_0x3aedc1),a0_0x3aed['apNpTS'][_0x3fcab0]=_0x3aedc1):_0x3aedc1=_0x160aac,_0x3aedc1;}function Y(_0xdbf813){const _0x1b89bd=a0_0x8834bf,_0x19f484={'ZZcJn':function(_0x148383,_0x11f3b7){return _0x148383(_0x11f3b7);},'oFfFs':function(_0x22e01d,_0x4c94a5){return _0x22e01d(_0x4c94a5);},'IIgmb':function(_0x3d1a78,_0x4220c0){return _0x3d1a78+_0x4220c0;}};let _0x3553a7=_0x19f484['ZZcJn'](h,_0xdbf813);return _0x3553a7?_0x19f484[_0x1b89bd(0x11e)](D,{'r':Math['min'](0xff,_0x19f484['IIgmb'](_0x3553a7['r'],p)),'g':Math['min'](0xff,_0x19f484[_0x1b89bd(0x18d)](_0x3553a7['g'],p)),'b':Math[_0x1b89bd(0x14a)](0xff,_0x3553a7['b']+p)}):_0xdbf813;}function W(_0x486bba){const _0x8763ba=a0_0x8834bf,_0x1c5bff={'Odpop':function(_0x39d1ec,_0x2651cf){return _0x39d1ec(_0x2651cf);},'BVfIc':function(_0x154c0e,_0x3f9c7b){return _0x154c0e-_0x3f9c7b;}};let _0xabd554=_0x1c5bff[_0x8763ba(0x193)](h,_0x486bba);return _0xabd554?_0x1c5bff[_0x8763ba(0x193)](D,{'r':Math[_0x8763ba(0x1b3)](0x0,_0x1c5bff[_0x8763ba(0x17f)](_0xabd554['r'],p)),'g':Math['max'](0x0,_0x1c5bff['BVfIc'](_0xabd554['g'],p)),'b':Math[_0x8763ba(0x1b3)](0x0,_0x1c5bff[_0x8763ba(0x17f)](_0xabd554['b'],p))}):_0x486bba;}function b(_0x5dce14){const _0x3ce45c=a0_0x8834bf,_0x44c217={'oWZrs':function(_0x1b54b1,_0x16b96a){return _0x1b54b1(_0x16b96a);},'AfnCs':function(_0x560b2a,_0x2e5920){return _0x560b2a(_0x2e5920);},'Lyehm':function(_0x365a92,_0xb8ed44){return _0x365a92(_0xb8ed44);}};let _0x1dbdf6=V,_0x58184a=_0x1dbdf6[_0x3ce45c(0x11a)][_0x3ce45c(0x178)](/ /g,'+'),_0x41bc3c=y(_0x1dbdf6[_0x3ce45c(0x17d)]),_0x13ea94=_0x44c217['oWZrs'](y,_0x1dbdf6[_0x3ce45c(0x122)]),_0x472c34=_0x44c217[_0x3ce45c(0x19d)](y,_0x1dbdf6[_0x3ce45c(0x1a4)]),_0x21968a=Y(_0x1dbdf6[_0x3ce45c(0x17d)]),_0x358242=_0x44c217['Lyehm'](W,_0x1dbdf6[_0x3ce45c(0x17d)]);return _0x3ce45c(0x171)+_0x58184a+_0x3ce45c(0x154)+_0x1dbdf6[_0x3ce45c(0x17d)]+';\x0a\x20\x20--background-elevated:\x20'+_0x21968a+_0x3ce45c(0x150)+_0x358242+_0x3ce45c(0x11d)+_0x41bc3c+';\x0a\x20\x20--primary:\x20'+_0x1dbdf6[_0x3ce45c(0x122)]+_0x3ce45c(0x12f)+_0x13ea94+_0x3ce45c(0x1b0)+_0x1dbdf6[_0x3ce45c(0x1a4)]+_0x3ce45c(0x119)+_0x472c34+_0x3ce45c(0x14f)+_0x1dbdf6[_0x3ce45c(0x11a)]+_0x3ce45c(0x190);}function _(_0x22265c){const _0x477e7c=a0_0x8834bf;return _0x477e7c(0x13b)+JSON[_0x477e7c(0x16b)](_0x22265c[_0x477e7c(0x1a8)])+_0x477e7c(0x135)+JSON[_0x477e7c(0x16b)]('%s\x20|\x20'+_0x22265c[_0x477e7c(0x1a8)])+',\x0a\x09},\x0a\x09description:\x20'+JSON['stringify']('Order\x20online\x20from\x20'+_0x22265c[_0x477e7c(0x1a8)]+'.')+_0x477e7c(0x1b9)+JSON['stringify'](_0x22265c[_0x477e7c(0x1a8)])+_0x477e7c(0x191);}function x(_0x2c7694){const _0x77a64a=a0_0x8834bf;return _0x77a64a(0x16a)+_0x2c7694['projectName'][_0x77a64a(0x1a6)](0x0)['toUpperCase']()+_0x77a64a(0x13f);}function S(_0x3b8604){const _0x42ab07=a0_0x8834bf;return'import\x20{\x20ImageResponse\x20}\x20from\x20\x22next/og\x22;\x0aimport\x20{\x20readFileSync\x20}\x20from\x20\x22fs\x22;\x0aimport\x20{\x20join\x20}\x20from\x20\x22path\x22;\x0a\x0aexport\x20const\x20size\x20=\x20{\x20width:\x20180,\x20height:\x20180\x20};\x0aexport\x20const\x20contentType\x20=\x20\x22image/png\x22;\x0a\x0a//\x20Brand\x20palette\x20prebuild\x20drops\x20at\x20public/styles/styles.json.\x20Neutral\x20fallback\x20if\x0a//\x20it\x27s\x20missing\x20so\x20the\x20icon\x20still\x20renders.\x0afunction\x20loadTheme()\x20{\x0a\x09try\x20{\x0a\x09\x09return\x20JSON.parse(\x0a\x09\x09\x09readFileSync(join(process.cwd(),\x20\x22public/styles/styles.json\x22),\x20\x22utf8\x22),\x0a\x09\x09);\x0a\x09}\x20catch\x20{\x0a\x09\x09return\x20null;\x0a\x09}\x0a}\x0a\x0aexport\x20default\x20function\x20AppleIcon()\x20{\x0a\x09const\x20theme\x20=\x20loadTheme();\x0a\x09const\x20background\x20=\x20theme?.primary\x20??\x20\x22#171717\x22;\x0a\x09const\x20foreground\x20=\x20theme?.primaryForeground\x20??\x20\x22#ffffff\x22;\x0a\x09return\x20new\x20ImageResponse(\x0a\x09\x09(\x0a\x09\x09\x09<div\x0a\x09\x09\x09\x09style={{\x0a\x09\x09\x09\x09\x09width:\x20\x22100%\x22,\x0a\x09\x09\x09\x09\x09height:\x20\x22100%\x22,\x0a\x09\x09\x09\x09\x09display:\x20\x22flex\x22,\x0a\x09\x09\x09\x09\x09alignItems:\x20\x22center\x22,\x0a\x09\x09\x09\x09\x09justifyContent:\x20\x22center\x22,\x0a\x09\x09\x09\x09\x09background,\x0a\x09\x09\x09\x09\x09color:\x20foreground,\x0a\x09\x09\x09\x09\x09fontSize:\x20112,\x0a\x09\x09\x09\x09\x09fontWeight:\x20700,\x0a\x09\x09\x09\x09}}\x0a\x09\x09\x09>\x0a\x09\x09\x09\x09'+_0x3b8604[_0x42ab07(0x1a8)][_0x42ab07(0x1a6)](0x0)[_0x42ab07(0x140)]()+_0x42ab07(0x126);}function v(_0xb0698c){const _0x46e0dc=a0_0x8834bf;let _0x40ecd7=_0xb0698c['projectName'],_0x4d6066=_0x40ecd7[_0x46e0dc(0x1a6)](0x0)[_0x46e0dc(0x140)]();return _0x46e0dc(0x1b8)+JSON[_0x46e0dc(0x16b)](_0x40ecd7)+_0x46e0dc(0x1bb)+_0x4d6066+'\x0a\x09\x09\x09\x09</div>\x0a\x09\x09\x09\x09<div\x0a\x09\x09\x09\x09\x09style={{\x0a\x09\x09\x09\x09\x09\x09display:\x20\x22flex\x22,\x0a\x09\x09\x09\x09\x09\x09fontSize:\x2072,\x0a\x09\x09\x09\x09\x09\x09fontWeight:\x20700,\x0a\x09\x09\x09\x09\x09\x09letterSpacing:\x20\x22-0.02em\x22,\x0a\x09\x09\x09\x09\x09\x09textAlign:\x20\x22center\x22,\x0a\x09\x09\x09\x09\x09\x09padding:\x20\x220\x2080px\x22,\x0a\x09\x09\x09\x09\x09}}\x0a\x09\x09\x09\x09>\x0a\x09\x09\x09\x09\x09'+_0x40ecd7+'\x0a\x09\x09\x09\x09</div>\x0a\x09\x09\x09</div>\x0a\x09\x09),\x0a\x09\x09size,\x0a\x09);\x0a}\x0a';}function j(_0x32463b){const _0x5677a0=a0_0x8834bf;let _0x2b80c8=_0x32463b[_0x5677a0(0x1a8)];return _0x5677a0(0x149)+JSON[_0x5677a0(0x16b)](_0x2b80c8)+_0x5677a0(0x1ba)+JSON[_0x5677a0(0x16b)](_0x2b80c8)+',\x0a\x09\x09description:\x20'+JSON[_0x5677a0(0x16b)](_0x5677a0(0x145)+_0x2b80c8+'.')+_0x5677a0(0x15d);}function E(_0x18ce38){const _0x117513=a0_0x8834bf;if(_0x18ce38['includeTermsPage'])return _0x117513(0x1ac);}function N(_0x4591ad){const _0x3ad8cf=a0_0x8834bf;if(_0x4591ad['includePrivacyPage'])return _0x3ad8cf(0x157);}var C=a0_0x8834bf(0x12d),ze=process.env.NODE_ENV===a0_0x8834bf(0x110)?a0_0x8834bf(0x117):a0_0x8834bf(0x155);function I(_0x3f989a){const _0x5cd485=a0_0x8834bf,_0x12ea6b={'fAREI':function(_0x143c53,_0x1334fa){return _0x143c53+_0x1334fa;}};let _0x288ef9=[_0x5cd485(0x1bd)+_0x3f989a['apiBaseUrl'],_0x5cd485(0x184)+_0x3f989a[_0x5cd485(0x11b)],_0x5cd485(0x182)+_0x3f989a[_0x5cd485(0x11b)],_0x5cd485(0x1a2)+C,_0x5cd485(0x120)+_0x3f989a[_0x5cd485(0x1a8)]];return _0x3f989a[_0x5cd485(0x121)]&&_0x288ef9[_0x5cd485(0x156)](_0x5cd485(0x114)+_0x3f989a[_0x5cd485(0x121)]),_0x3f989a['websiteSecret']&&_0x288ef9[_0x5cd485(0x156)](_0x5cd485(0x10c)+_0x3f989a[_0x5cd485(0x16d)]),_0x12ea6b['fAREI'](_0x288ef9[_0x5cd485(0x15c)]('\x0a'),'\x0a');}var te=a0_0x26fdf0(i,a0_0x8834bf(0x152)),re=[{'path':a0_0x8834bf(0x19a),'generate':f},{'path':'app/globals.css','generate':b},{'path':a0_0x8834bf(0x179),'generate':_},{'path':a0_0x8834bf(0x16e),'generate':x},{'path':'app/apple-icon.tsx','generate':S},{'path':a0_0x8834bf(0x165),'generate':v},{'path':'app/manifest.ts','generate':j},{'path':'app/terms/page.tsx','generate':E},{'path':a0_0x8834bf(0x14b),'generate':N},{'path':'.env','generate':I}];async function O(_0x509fef,_0x4f5a48){const _0x498943=a0_0x8834bf,_0x2153a2={'SawDE':function(_0x1a8407,_0x377fff,_0x414dc6,_0x287489){return _0x1a8407(_0x377fff,_0x414dc6,_0x287489);},'drcTZ':function(_0x1227ad,_0x16c8c5,_0x471ced){return _0x1227ad(_0x16c8c5,_0x471ced);},'ZeQVE':function(_0x4931db,_0x448f41){return _0x4931db(_0x448f41);}};await _0x2153a2[_0x498943(0x130)](a0_0x4f583f,te,_0x509fef,{'recursive':!0x0,'filter':_0x17a97c=>!_0x17a97c[_0x498943(0x1a5)](_0x498943(0x175))});let _0x38ed17=_0x2153a2[_0x498943(0x147)](a0_0x26fdf0,_0x509fef,'gitignore');_0x2153a2['ZeQVE'](a0_0x5ac367,_0x38ed17)&&await _0x2153a2[_0x498943(0x147)](a0_0x4bacea,_0x38ed17,a0_0x26fdf0(_0x509fef,_0x498943(0x196)));for(let _0x49138a of re){let _0x4d7a80=_0x49138a[_0x498943(0x1b1)](_0x4f5a48);_0x4d7a80!==void 0x0&&g(_0x509fef,_0x49138a[_0x498943(0x113)],_0x4d7a80);}}import a0_0x2fb8e8 from'prompts';async function w(_0x19947b){const _0x5e528c=a0_0x8834bf,_0x5c2825={'YpnGh':function(_0x1643cc,_0x15821e,_0x8fda43){return _0x1643cc(_0x15821e,_0x8fda43);}};try{return(await _0x5c2825[_0x5e528c(0x166)](fetch,l+'/auth/site-token',{'method':'POST','headers':{'x-zorgo-site-secret':_0x19947b}}))['ok'];}catch{return!0x1;}}async function R(_0x58e5c7){const _0x27eb12=a0_0x8834bf,_0x5bb048={'uSkmC':function(_0x420971,_0x5bf2e7,_0x1a5be0){return _0x420971(_0x5bf2e7,_0x1a5be0);},'KzJiJ':_0x27eb12(0x118)};try{let _0x499e98=await _0x5bb048[_0x27eb12(0x15f)](fetch,l+_0x27eb12(0x148),{'method':_0x27eb12(0x1b4),'headers':{'Content-Type':_0x5bb048[_0x27eb12(0x14d)]},'body':JSON[_0x27eb12(0x16b)]({'publishableKey':_0x58e5c7})});if(!_0x499e98['ok'])return!0x1;let {valid:_0x301cc3}=await _0x499e98['json']();return _0x301cc3===!0x0;}catch{return!0x1;}}var m={'local':a0_0x8834bf(0x1b5),'staging':'http://api.zorgo.ai','production':'https://api.zorgotech.com'},l=a0_0x8834bf(0x1b5),{values:n,positionals:T}=a0_0x4c97b2({'args':process['argv'][a0_0x8834bf(0x176)](0x2),'allowPositionals':!0x0,'options':{'project-url':{'type':a0_0x8834bf(0x17b)},'project-name':{'type':a0_0x8834bf(0x17b)},'terms':{'type':'boolean'},'privacy':{'type':a0_0x8834bf(0x144)},'environment':{'type':a0_0x8834bf(0x17b)},'stripe-key':{'type':a0_0x8834bf(0x17b)},'website-secret':{'type':a0_0x8834bf(0x17b)},'non-interactive':{'type':a0_0x8834bf(0x144)}}}),ie=T[0x0]==='init'?T[a0_0x8834bf(0x176)](0x1):T,se=ie[0x0],ae=_0x27e156=>_0x27e156[a0_0x8834bf(0x174)]()[a0_0x8834bf(0x1bc)]()[a0_0x8834bf(0x178)](/[^a-z0-9]+/g,'-')[a0_0x8834bf(0x178)](/^-+|-+$/g,'')||'zorgo-site';n['environment']&&!(n[a0_0x8834bf(0x133)]in m)&&(console['error'](a0_0x8834bf(0x12b)+n[a0_0x8834bf(0x133)]+'\x22.\x20Expected\x20one\x20of:\x20'+Object[a0_0x8834bf(0x188)](m)['join'](',\x20')),process['exit'](0x1)),n[a0_0x8834bf(0x133)]&&(l=m[n[a0_0x8834bf(0x133)]]);var ce=[{'type':'text','name':a0_0x8834bf(0x11b),'message':a0_0x8834bf(0x199)},{'type':a0_0x8834bf(0x198),'name':a0_0x8834bf(0x1a8),'message':a0_0x8834bf(0x1b2)},{'type':a0_0x8834bf(0x151),'name':a0_0x8834bf(0x13a),'message':'Include\x20terms\x20page?'},{'type':'confirm','name':a0_0x8834bf(0x168),'message':'Include\x20privacy\x20page?'},{'type':a0_0x8834bf(0x10d),'name':a0_0x8834bf(0x133),'message':a0_0x8834bf(0x194),'choices':[{'title':a0_0x8834bf(0x180),'value':a0_0x8834bf(0x18a)},{'title':a0_0x8834bf(0x12a),'value':a0_0x8834bf(0x19e)},{'title':'Production','value':a0_0x8834bf(0x110)}],'initial':0x0},{'type':'password','name':'stripePublishableKey','message':'Enter\x20NEXT_PUBLIC_STRIPE_PUBLIC_KEY','validate':async _0x169b94=>!_0x169b94||!await R(_0x169b94)?a0_0x8834bf(0x123):!0x0},{'type':'password','name':a0_0x8834bf(0x16d),'message':a0_0x8834bf(0x112),'validate':async _0x37f1fe=>_0x37f1fe?await w(_0x37f1fe)?!0x0:a0_0x8834bf(0x1a7):a0_0x8834bf(0x1be)}],d={...n[a0_0x8834bf(0x10f)]&&{'projectUrl':n[a0_0x8834bf(0x10f)]},...n['project-name']&&{'projectName':n[a0_0x8834bf(0x15b)]},...n[a0_0x8834bf(0x19c)]&&{'includeTermsPage':!0x0},...n[a0_0x8834bf(0x197)]&&{'includePrivacyPage':!0x0},...n['environment']&&{'environment':n[a0_0x8834bf(0x133)]},...n['stripe-key']&&{'stripePublishableKey':n[a0_0x8834bf(0x1bf)]},...n[a0_0x8834bf(0x18c)]&&{'websiteSecret':n[a0_0x8834bf(0x18c)]}};async function pe(){const _0x1b61fd=a0_0x8834bf,_0x2337a3={'GjqZn':'local','upEhB':_0x1b61fd(0x1bf),'bciCl':function(_0xf50723,_0x295ffa){return _0xf50723(_0x295ffa);},'MUdTI':_0x1b61fd(0x18c),'OZVKU':'Invalid\x20--website-secret'};n[_0x1b61fd(0x195)]&&(d['includeTermsPage']??=!0x1,d[_0x1b61fd(0x168)]??=!0x1,d['environment']??=_0x2337a3[_0x1b61fd(0x13e)]);let _0x54d2a5=ce[_0x1b61fd(0x11c)](_0x2d8ea6=>!(_0x2d8ea6[_0x1b61fd(0x187)]in d));n[_0x1b61fd(0x195)]&&_0x54d2a5[_0x1b61fd(0x16f)]>0x0&&(console['error'](_0x1b61fd(0x136)+_0x54d2a5[_0x1b61fd(0x124)](_0x466277=>_0x466277[_0x1b61fd(0x187)])['join'](',\x20')),process[_0x1b61fd(0x115)](0x1)),n[_0x2337a3['upEhB']]&&!await _0x2337a3[_0x1b61fd(0x127)](R,n[_0x2337a3['upEhB']])&&(console['error'](_0x1b61fd(0x19f)),process['exit'](0x1)),n[_0x1b61fd(0x18c)]&&!await w(n[_0x2337a3['MUdTI']])&&(console[_0x1b61fd(0x170)](_0x2337a3[_0x1b61fd(0x129)]),process[_0x1b61fd(0x115)](0x1));let _0x2c518b=_0x54d2a5[_0x1b61fd(0x16f)]?await a0_0x2fb8e8(_0x54d2a5,{'onSubmit':async(_0x5cb0e1,_0x1b6d04)=>{const _0x3e0586=_0x1b61fd;if('FjhFb'!==_0x3e0586(0x132))return _0x3e0586(0x16a)+_0x28d1e9[_0x3e0586(0x1a8)][_0x3e0586(0x1a6)](0x0)[_0x3e0586(0x140)]()+_0x3e0586(0x13f);else _0x5cb0e1[_0x3e0586(0x187)]===_0x3e0586(0x133)&&(l=m[_0x1b6d04]??'http://localhost:3000');}}):{},_0x439ddf={...d,..._0x2c518b},_0x1cd7a5={'projectUrl':_0x439ddf['projectUrl'],'projectName':_0x439ddf[_0x1b61fd(0x1a8)],'apiBaseUrl':l,'includeTermsPage':_0x439ddf[_0x1b61fd(0x13a)],'includePrivacyPage':_0x439ddf[_0x1b61fd(0x168)],'stripePublishableKey':_0x439ddf['stripePublishableKey'],'websiteSecret':_0x439ddf[_0x1b61fd(0x16d)]},_0x40278d=se??_0x2337a3[_0x1b61fd(0x127)](ae,_0x1cd7a5[_0x1b61fd(0x1a8)]);await O(_0x40278d,_0x1cd7a5),console[_0x1b61fd(0x10e)](_0x1b61fd(0x11f)+_0x439ddf['projectName']+_0x1b61fd(0x1af)+_0x40278d);}pe();export{l as ZORGO_API_BASE_URL};
|
|
2
|
+
import U from"path";import{fileURLToPath as L}from"url";var A=()=>L(import.meta.url),D=()=>U.dirname(A()),s=D();import{parseArgs as H}from"util";import{cp as F,rename as J}from"fs/promises";import{existsSync as M}from"fs";import{join as v}from"path";import{writeFileSync as C,mkdirSync as k}from"fs";import{dirname as B,join as z}from"path";function d(e,t,r){let o=z(e,t);k(B(o),{recursive:!0}),C(o,r)}var I="1.3.0";var O={"@zorgo/next":I,"@cloudflare/kv-asset-handler":"0.4.0","@opennextjs/cloudflare":"1.19.11","@stripe/react-stripe-js":"6.7.0","@stripe/stripe-js":"9.9.0","@supabase/ssr":"0.5.2","@supabase/supabase-js":"2.47.5","class-variance-authority":"0.7.1",clsx:"2.1.1","date-fns":"4.1.0","date-fns-tz":"3.2.0","geojson-vt":"4.0.2",gsap:"3.12.7","iconoir-react":"7.8.0","libphonenumber-js":"1.13.8","lucide-react":"1.23.0","promise-timeout":"1.3.0",sharp:"0.34.5",stripe:"17.4.0","tailwind-merge":"3.0.1","tailwindcss-animate":"1.0.7",zod:"4.3.6",next:"16.2.10",react:"19.2.4","react-dom":"19.2.4"},w={wrangler:"4.86.0","@tailwindcss/postcss":"4.3.2","@types/node":"20.19.43","@types/react":"19.2.17","@types/react-dom":"19.2.3","babel-plugin-react-compiler":"1.0.0",eslint:"9.39.4","eslint-config-next":"16.2.10",tailwindcss:"4.3.2",typescript:"5.9.3",tsx:"4.23.0","@next/env":"16.2.10"};function g(e){return JSON.stringify({name:e.projectName,version:"1.0.0",private:!0,scripts:{dev:"tsx scripts/prebuild.ts && next dev","dev:no-prebuild":"next dev",prebuild:"tsx scripts/prebuild.ts",build:"tsx scripts/prebuild.ts && next build","cloudflare:deploy":"tsx scripts/prebuild.ts && opennextjs-cloudflare build && wrangler deploy","cloudflare:deploy:staging":"tsx scripts/prebuild.ts && opennextjs-cloudflare build && wrangler deploy --env staging",preview:"tsx scripts/prebuild.ts && opennextjs-cloudflare build && wrangler dev","preview:staging":"tsx scripts/prebuild.ts && opennextjs-cloudflare build && wrangler dev --env staging"},dependencies:O,devDependencies:w},null,2)}function f(e){return`
|
|
3
|
+
import type { Metadata, Viewport } from "next";
|
|
4
|
+
import "./globals.css";
|
|
5
|
+
import { Header, Footer, ModalHost } from "./components";
|
|
6
|
+
import { CookieConsent } from "@zorgo/next/components";
|
|
7
|
+
import { restaurantJsonLd } from "../lib/generated/jsonld";
|
|
8
|
+
export const metadata: Metadata = {
|
|
9
|
+
// resolves relative URLs (canonicals, the auto-injected opengraph-image) to absolute.
|
|
10
|
+
// || (not ??) so an empty NEXT_PUBLIC_SITE_URL \u2014 a site piloted before its URL is
|
|
11
|
+
// set \u2014 falls back too; new URL("") throws and would break the build/deploy.
|
|
12
|
+
metadataBase: new URL(process.env.NEXT_PUBLIC_SITE_URL || "http://localhost:3000"),
|
|
13
|
+
title: {
|
|
14
|
+
default: ${JSON.stringify(e.projectName)},
|
|
15
|
+
template: ${JSON.stringify(`%s | ${e.projectName}`)},
|
|
16
|
+
},
|
|
17
|
+
description: ${JSON.stringify(`Order online from ${e.projectName}.`)},
|
|
18
|
+
openGraph: {
|
|
19
|
+
type: "website",
|
|
20
|
+
siteName: ${JSON.stringify(e.projectName)},
|
|
21
|
+
locale: "en_US",
|
|
22
|
+
},
|
|
23
|
+
twitter: {
|
|
24
|
+
card: "summary_large_image",
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export const viewport: Viewport = {
|
|
29
|
+
width: "device-width",
|
|
30
|
+
initialScale: 1,
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export default async function RootLayout({ children }: { children: React.ReactNode }) {
|
|
34
|
+
return (
|
|
35
|
+
<html lang="en">
|
|
36
|
+
<head>
|
|
37
|
+
<script
|
|
38
|
+
type="application/ld+json"
|
|
39
|
+
dangerouslySetInnerHTML={{ __html: JSON.stringify(restaurantJsonLd) }}
|
|
40
|
+
/>
|
|
41
|
+
</head>
|
|
42
|
+
<body className="min-h-screen flex flex-col bg-background text-foreground">
|
|
43
|
+
<Header />
|
|
44
|
+
<main className="flex-1">
|
|
45
|
+
{children}
|
|
46
|
+
</main>
|
|
47
|
+
<Footer />
|
|
48
|
+
<ModalHost />
|
|
49
|
+
<CookieConsent />
|
|
50
|
+
</body>
|
|
51
|
+
</html>
|
|
52
|
+
)}
|
|
53
|
+
|
|
54
|
+
`}function u(e){return`import { ImageResponse } from "next/og";
|
|
55
|
+
import { readFileSync } from "fs";
|
|
56
|
+
import { join } from "path";
|
|
57
|
+
|
|
58
|
+
// One PNG per size: 32 for the browser tab/favicon, 192 & 512 for the web
|
|
59
|
+
// manifest (PWA install). generateImageMetadata gives each a stable /icon/<id> URL
|
|
60
|
+
// the manifest references, and all three are prerendered at build.
|
|
61
|
+
export function generateImageMetadata() {
|
|
62
|
+
return [
|
|
63
|
+
{ id: "32", size: { width: 32, height: 32 }, contentType: "image/png" },
|
|
64
|
+
{ id: "192", size: { width: 192, height: 192 }, contentType: "image/png" },
|
|
65
|
+
{ id: "512", size: { width: 512, height: 512 }, contentType: "image/png" },
|
|
66
|
+
];
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Brand palette prebuild drops at public/styles/styles.json. Neutral fallback if
|
|
70
|
+
// it's missing so the icon still renders. primary is the badge fill.
|
|
71
|
+
function loadTheme() {
|
|
72
|
+
try {
|
|
73
|
+
return JSON.parse(
|
|
74
|
+
readFileSync(join(process.cwd(), "public/styles/styles.json"), "utf8"),
|
|
75
|
+
);
|
|
76
|
+
} catch {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Prebuild drops the franchise logo at public/images/logo.png. Use it as the
|
|
82
|
+
// icon when it's a real image; the magic-byte sniff both picks the data-URI mime
|
|
83
|
+
// and rejects a 404 JSON body (no logo) so we cleanly fall back to the letter.
|
|
84
|
+
function loadLogo(): string | null {
|
|
85
|
+
try {
|
|
86
|
+
const buf = readFileSync(join(process.cwd(), "public/images/logo.png"));
|
|
87
|
+
const mime =
|
|
88
|
+
buf[0] === 0x89 && buf[1] === 0x50
|
|
89
|
+
? "image/png"
|
|
90
|
+
: buf[0] === 0xff && buf[1] === 0xd8
|
|
91
|
+
? "image/jpeg"
|
|
92
|
+
: null;
|
|
93
|
+
if (!mime) return null;
|
|
94
|
+
return \`data:\${mime};base64,\${buf.toString("base64")}\`;
|
|
95
|
+
} catch {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export default async function Icon({ id }: { id: Promise<string> }) {
|
|
101
|
+
const dimension = Number(await id);
|
|
102
|
+
const logo = loadLogo();
|
|
103
|
+
const theme = loadTheme();
|
|
104
|
+
const background = theme?.primary ?? "#171717";
|
|
105
|
+
const foreground = theme?.primaryForeground ?? "#ffffff";
|
|
106
|
+
return new ImageResponse(
|
|
107
|
+
logo ? (
|
|
108
|
+
<img
|
|
109
|
+
src={logo}
|
|
110
|
+
width={dimension}
|
|
111
|
+
height={dimension}
|
|
112
|
+
style={{ objectFit: "contain" }}
|
|
113
|
+
/>
|
|
114
|
+
) : (
|
|
115
|
+
<div
|
|
116
|
+
style={{
|
|
117
|
+
width: "100%",
|
|
118
|
+
height: "100%",
|
|
119
|
+
display: "flex",
|
|
120
|
+
alignItems: "center",
|
|
121
|
+
justifyContent: "center",
|
|
122
|
+
background,
|
|
123
|
+
color: foreground,
|
|
124
|
+
fontSize: dimension * 0.625,
|
|
125
|
+
fontWeight: 700,
|
|
126
|
+
}}
|
|
127
|
+
>
|
|
128
|
+
${e.projectName.charAt(0).toUpperCase()}
|
|
129
|
+
</div>
|
|
130
|
+
),
|
|
131
|
+
{ width: dimension, height: dimension },
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
`}function y(e){return`import { ImageResponse } from "next/og";
|
|
135
|
+
import { readFileSync } from "fs";
|
|
136
|
+
import { join } from "path";
|
|
137
|
+
|
|
138
|
+
export const size = { width: 180, height: 180 };
|
|
139
|
+
export const contentType = "image/png";
|
|
140
|
+
|
|
141
|
+
// Brand palette prebuild drops at public/styles/styles.json. Neutral fallback if
|
|
142
|
+
// it's missing so the icon still renders.
|
|
143
|
+
function loadTheme() {
|
|
144
|
+
try {
|
|
145
|
+
return JSON.parse(
|
|
146
|
+
readFileSync(join(process.cwd(), "public/styles/styles.json"), "utf8"),
|
|
147
|
+
);
|
|
148
|
+
} catch {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export default function AppleIcon() {
|
|
154
|
+
const theme = loadTheme();
|
|
155
|
+
const background = theme?.primary ?? "#171717";
|
|
156
|
+
const foreground = theme?.primaryForeground ?? "#ffffff";
|
|
157
|
+
return new ImageResponse(
|
|
158
|
+
(
|
|
159
|
+
<div
|
|
160
|
+
style={{
|
|
161
|
+
width: "100%",
|
|
162
|
+
height: "100%",
|
|
163
|
+
display: "flex",
|
|
164
|
+
alignItems: "center",
|
|
165
|
+
justifyContent: "center",
|
|
166
|
+
background,
|
|
167
|
+
color: foreground,
|
|
168
|
+
fontSize: 112,
|
|
169
|
+
fontWeight: 700,
|
|
170
|
+
}}
|
|
171
|
+
>
|
|
172
|
+
${e.projectName.charAt(0).toUpperCase()}
|
|
173
|
+
</div>
|
|
174
|
+
),
|
|
175
|
+
size,
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
`}function h(e){let t=e.projectName,r=t.charAt(0).toUpperCase();return`import { ImageResponse } from "next/og";
|
|
179
|
+
import { readFileSync } from "fs";
|
|
180
|
+
import { join } from "path";
|
|
181
|
+
|
|
182
|
+
export const alt = ${JSON.stringify(t)};
|
|
183
|
+
export const size = { width: 1200, height: 630 };
|
|
184
|
+
export const contentType = "image/png";
|
|
185
|
+
|
|
186
|
+
// Brand palette prebuild drops at public/styles/styles.json. Neutral fallback if
|
|
187
|
+
// it's missing so the card still renders.
|
|
188
|
+
function loadTheme() {
|
|
189
|
+
try {
|
|
190
|
+
return JSON.parse(
|
|
191
|
+
readFileSync(join(process.cwd(), "public/styles/styles.json"), "utf8"),
|
|
192
|
+
);
|
|
193
|
+
} catch {
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export default function OpengraphImage() {
|
|
199
|
+
const theme = loadTheme();
|
|
200
|
+
const background = theme?.backgroundBase ?? "#171717";
|
|
201
|
+
const foreground = theme?.foreground ?? "#ffffff";
|
|
202
|
+
const badge = theme?.primary ?? "#ffffff";
|
|
203
|
+
const badgeForeground = theme?.primaryForeground ?? "#171717";
|
|
204
|
+
return new ImageResponse(
|
|
205
|
+
(
|
|
206
|
+
<div
|
|
207
|
+
style={{
|
|
208
|
+
width: "100%",
|
|
209
|
+
height: "100%",
|
|
210
|
+
display: "flex",
|
|
211
|
+
flexDirection: "column",
|
|
212
|
+
alignItems: "center",
|
|
213
|
+
justifyContent: "center",
|
|
214
|
+
background,
|
|
215
|
+
color: foreground,
|
|
216
|
+
}}
|
|
217
|
+
>
|
|
218
|
+
<div
|
|
219
|
+
style={{
|
|
220
|
+
display: "flex",
|
|
221
|
+
alignItems: "center",
|
|
222
|
+
justifyContent: "center",
|
|
223
|
+
width: 140,
|
|
224
|
+
height: 140,
|
|
225
|
+
borderRadius: 32,
|
|
226
|
+
background: badge,
|
|
227
|
+
color: badgeForeground,
|
|
228
|
+
fontSize: 84,
|
|
229
|
+
fontWeight: 700,
|
|
230
|
+
marginBottom: 48,
|
|
231
|
+
}}
|
|
232
|
+
>
|
|
233
|
+
${r}
|
|
234
|
+
</div>
|
|
235
|
+
<div
|
|
236
|
+
style={{
|
|
237
|
+
display: "flex",
|
|
238
|
+
fontSize: 72,
|
|
239
|
+
fontWeight: 700,
|
|
240
|
+
letterSpacing: "-0.02em",
|
|
241
|
+
textAlign: "center",
|
|
242
|
+
padding: "0 80px",
|
|
243
|
+
}}
|
|
244
|
+
>
|
|
245
|
+
${t}
|
|
246
|
+
</div>
|
|
247
|
+
</div>
|
|
248
|
+
),
|
|
249
|
+
size,
|
|
250
|
+
);
|
|
251
|
+
}
|
|
252
|
+
`}function _(e){let t=e.projectName;return`import type { MetadataRoute } from "next";
|
|
253
|
+
import { readFileSync } from "fs";
|
|
254
|
+
import { join } from "path";
|
|
255
|
+
|
|
256
|
+
// Brand palette prebuild drops at public/styles/styles.json. Neutral fallback if
|
|
257
|
+
// it's missing.
|
|
258
|
+
function loadTheme() {
|
|
259
|
+
try {
|
|
260
|
+
return JSON.parse(
|
|
261
|
+
readFileSync(join(process.cwd(), "public/styles/styles.json"), "utf8"),
|
|
262
|
+
);
|
|
263
|
+
} catch {
|
|
264
|
+
return null;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
export default function manifest(): MetadataRoute.Manifest {
|
|
269
|
+
const theme = loadTheme();
|
|
270
|
+
return {
|
|
271
|
+
name: ${JSON.stringify(t)},
|
|
272
|
+
short_name: ${JSON.stringify(t)},
|
|
273
|
+
description: ${JSON.stringify(`Order online from ${t}.`)},
|
|
274
|
+
start_url: "/",
|
|
275
|
+
display: "standalone",
|
|
276
|
+
background_color: theme?.backgroundBase ?? "#ffffff",
|
|
277
|
+
theme_color: theme?.primary ?? "#171717",
|
|
278
|
+
icons: [
|
|
279
|
+
{ src: "/icon/192", sizes: "192x192", type: "image/png" },
|
|
280
|
+
{ src: "/icon/512", sizes: "512x512", type: "image/png" },
|
|
281
|
+
],
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
`}function S(e){if(!e.includeTermsPage)return;let t=new Date().toLocaleDateString("en-US",{year:"numeric",month:"long",day:"numeric"});return`import { LegalPage, termsOfUseHtml } from "@zorgo/next/legal";
|
|
285
|
+
|
|
286
|
+
const BRAND = ${JSON.stringify(e.franchiseName)};
|
|
287
|
+
|
|
288
|
+
export const metadata = {
|
|
289
|
+
title: "Terms of Service",
|
|
290
|
+
description: \`Terms for ordering online from \${BRAND}.\`,
|
|
291
|
+
};
|
|
292
|
+
|
|
293
|
+
export default function TermsPage() {
|
|
294
|
+
return (
|
|
295
|
+
<LegalPage
|
|
296
|
+
title="Online Ordering Terms of Use"
|
|
297
|
+
lastUpdated="${t}"
|
|
298
|
+
html={termsOfUseHtml({ brand: BRAND, lastUpdated: "${t}" })}
|
|
299
|
+
/>
|
|
300
|
+
);
|
|
301
|
+
}
|
|
302
|
+
`}function b(e){if(!e.includePrivacyPage)return;let t=new Date().toLocaleDateString("en-US",{year:"numeric",month:"long",day:"numeric"});return`import { LegalPage, privacyPolicyHtml } from "@zorgo/next/legal";
|
|
303
|
+
|
|
304
|
+
const BRAND = ${JSON.stringify(e.franchiseName)};
|
|
305
|
+
|
|
306
|
+
export const metadata = {
|
|
307
|
+
title: "Privacy Policy",
|
|
308
|
+
description: \`How \${BRAND} handles your information.\`,
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
export default function PrivacyPage() {
|
|
312
|
+
return (
|
|
313
|
+
<LegalPage
|
|
314
|
+
title="Privacy Policy"
|
|
315
|
+
lastUpdated="${t}"
|
|
316
|
+
html={privacyPolicyHtml({ brand: BRAND, lastUpdated: "${t}" })}
|
|
317
|
+
/>
|
|
318
|
+
);
|
|
319
|
+
}
|
|
320
|
+
`}var R=process.env.NEXT_PUBLIC_SUPABASE_URL||process.env.EXPO_PUBLIC_SUPABASE_URL||"https://dhnpoxorllfdobwftkyb.supabase.co",Ie=process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY||process.env.EXPO_PUBLIC_SUPABASE_ANON_KEY||"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImRobnBveG9ybGxmZG9id2Z0a3liIiwicm9sZSI6ImFub24iLCJpYXQiOjE3MzkwNTQxMDgsImV4cCI6MjA1NDYzMDEwOH0.zI8PwbgKwijHZ1QmxJqmaPrFvg02w1vOY2Qcs7SddzI";var Oe=process.env.NODE_ENV==="production"?"https://api.zorgotech.com":"http://localhost:3000";function x(e){let t=[`NEXT_PUBLIC_API_BASE_URL=${e.apiBaseUrl}`,`NEXT_PUBLIC_SITE_URL=${e.projectUrl}`,`NEXT_PUBLIC_BASE_URL=${e.projectUrl}`,`NEXT_PUBLIC_SUPABASE_URL=${R}`,`ZORGO_PROJECT_NAME=${e.projectName}`];return e.stripePublishableKey&&t.push(`NEXT_PUBLIC_STRIPE_PUBLIC_KEY=${e.stripePublishableKey}`),e.websiteSecret&&t.push(`ZORGO_SITE_SECRET=${e.websiteSecret}`),t.join(`
|
|
321
|
+
`)+`
|
|
322
|
+
`}var q=v(s,"tree"),G=[{path:"package.json",generate:g},{path:"app/layout.tsx",generate:f},{path:"app/icon.tsx",generate:u},{path:"app/apple-icon.tsx",generate:y},{path:"app/opengraph-image.tsx",generate:h},{path:"app/manifest.ts",generate:_},{path:"app/terms/page.tsx",generate:S},{path:"app/privacy/page.tsx",generate:b},{path:".env",generate:x}];async function j(e,t){await F(q,e,{recursive:!0,filter:o=>!o.endsWith(".gen.ts")});let r=v(e,"gitignore");M(r)&&await J(r,v(e,".gitignore"));for(let o of G){let c=o.generate(t);c!==void 0&&d(e,o.path,c)}}import K from"prompts";async function E(e){try{return(await fetch(`${p}/auth/site-token`,{method:"POST",headers:{"x-zorgo-site-secret":e}})).ok}catch{return!1}}async function P(e){try{let t=await fetch(`${p}/auth/validate-stripe-key`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({publishableKey:e})});if(!t.ok)return!1;let{valid:r}=await t.json();return r===!0}catch{return!1}}var m={local:"http://localhost:3000",staging:"https://staging.zorgo.ai",production:"https://api.zorgotech.com"},p="http://localhost:3000",{values:i,positionals:N}=H({args:process.argv.slice(2),allowPositionals:!0,options:{"project-url":{type:"string"},"project-name":{type:"string"},"franchise-name":{type:"string"},terms:{type:"boolean"},privacy:{type:"boolean"},environment:{type:"string"},"stripe-key":{type:"string"},"website-secret":{type:"string"},"non-interactive":{type:"boolean"}}}),V=N[0]==="init"?N.slice(1):N,X=V[0],Y=e=>e.toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"zorgo-site";i.environment&&!(i.environment in m)&&(console.error(`Invalid --environment "${i.environment}". Expected one of: ${Object.keys(m).join(", ")}`),process.exit(1));i.environment&&(p=m[i.environment]);var Z=[{type:"text",name:"projectUrl",message:"What is the site's URL?"},{type:"text",name:"projectName",message:"What would you like to name this project?"},{type:"text",name:"franchiseName",message:"What is the restaurant called on the site? (used on the legal pages)"},{type:"confirm",name:"includeTermsPage",message:"Include terms page?"},{type:"confirm",name:"includePrivacyPage",message:"Include privacy page?"},{type:"select",name:"environment",message:"Which environment are you using? (will change which environment we test keys against)",choices:[{title:"Local",value:"local"},{title:"Staging",value:"staging"},{title:"Production",value:"production"}],initial:0},{type:"password",name:"stripePublishableKey",message:"Enter NEXT_PUBLIC_STRIPE_PUBLIC_KEY",validate:async e=>!e||!await P(e)?"Invalid Stripe publishable key":!0},{type:"password",name:"websiteSecret",message:"Enter ZORGO_SITE_SECRET",validate:async e=>e?await E(e)?!0:"That's not a valid ZORGO_SITE_SECRET":"Data cannot be fetched without a secret"}],a={...i["project-url"]&&{projectUrl:i["project-url"]},...i["project-name"]&&{projectName:i["project-name"]},...i["franchise-name"]&&{franchiseName:i["franchise-name"]},...i.terms&&{includeTermsPage:!0},...i.privacy&&{includePrivacyPage:!0},...i.environment&&{environment:i.environment},...i["stripe-key"]&&{stripePublishableKey:i["stripe-key"]},...i["website-secret"]&&{websiteSecret:i["website-secret"]}};async function W(){i["non-interactive"]&&(a.franchiseName??=a.projectName,a.includeTermsPage??=!1,a.includePrivacyPage??=!1,a.environment??="local");let e=Z.filter(l=>!(l.name in a));i["non-interactive"]&&e.length>0&&(console.error(`Missing required flags for non-interactive mode: ${e.map(l=>l.name).join(", ")}`),process.exit(1)),i["stripe-key"]&&!await P(i["stripe-key"])&&(console.error("Invalid --stripe-key"),process.exit(1)),i["website-secret"]&&!await E(i["website-secret"])&&(console.error("Invalid --website-secret"),process.exit(1));let t=e.length?await K(e,{onSubmit:async(l,T)=>{l.name==="environment"&&(p=m[T]??"http://localhost:3000")}}):{},r={...a,...t},o={projectUrl:r.projectUrl,projectName:r.projectName,franchiseName:r.franchiseName||r.projectName,apiBaseUrl:p,includeTermsPage:r.includeTermsPage,includePrivacyPage:r.includePrivacyPage,stripePublishableKey:r.stripePublishableKey,websiteSecret:r.websiteSecret},c=X??Y(o.projectName);await j(c,o),console.log(`Scaffolded ${r.projectName} into ${c}`)}W();export{p as ZORGO_API_BASE_URL};
|
|
323
|
+
//# sourceMappingURL=cli.mjs.map
|
package/dist/cli.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/tsup/assets/esm_shims.js","../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/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":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","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\"franchise-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: \"text\",\n\t\tname: \"franchiseName\",\n\t\tmessage: \"What is the restaurant called on the site? (used on the legal pages)\",\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[\"franchise-name\"] && { franchiseName: flags[\"franchise-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.franchiseName ??= flagAnswers.projectName;\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\tfranchiseName: answers.franchiseName || 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 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// app/globals.css is a static file under tree/, not generated — it's\n\t\t// hand-owned from the moment a site is scaffolded (see ZOR-391). Only its\n\t\t// import, app/generated/branding.css, is written by prebuild.\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.3.0\",\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\": \"node -e \\\"require('fs').rmSync('dist',{recursive:true,force:true})\\\" && 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\"./images\": {\n\t\t\t\t\"import\": \"./dist/images.mjs\",\n\t\t\t\t\"require\": \"./dist/images.js\",\n\t\t\t\t\"types\": \"./dist/images.d.ts\"\n\t\t\t},\n\t\t\t\"./legal\": {\n\t\t\t\t\"import\": \"./dist/legal.mjs\",\n\t\t\t\t\"require\": \"./dist/legal.js\",\n\t\t\t\t\"types\": \"./dist/legal.d.ts\"\n\t\t\t},\n\t\t\t\"./item-page\": {\n\t\t\t\t\"import\": \"./dist/item-page.mjs\",\n\t\t\t\t\"require\": \"./dist/item-page.js\",\n\t\t\t\t\"types\": \"./dist/item-page.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\"./images\": {\n\t\t\t\"types\": \"./dist/images.d.ts\",\n\t\t\t\"import\": \"./dist/images.mjs\",\n\t\t\t\"require\": \"./dist/images.js\"\n\t\t},\n\t\t\"./legal\": {\n\t\t\t\"types\": \"./dist/legal.d.ts\",\n\t\t\t\"import\": \"./dist/legal.mjs\",\n\t\t\t\"require\": \"./dist/legal.js\"\n\t\t},\n\t\t\"./item-page\": {\n\t\t\t\"types\": \"./dist/item-page.d.ts\",\n\t\t\t\"import\": \"./dist/item-page.mjs\",\n\t\t\t\"require\": \"./dist/item-page.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\":\n\t\t\t\t\t\"tsx scripts/prebuild.ts && opennextjs-cloudflare build && wrangler deploy\",\n\t\t\t\t\"cloudflare:deploy:staging\":\n\t\t\t\t\t\"tsx scripts/prebuild.ts && opennextjs-cloudflare build && wrangler deploy --env staging\",\n\t\t\t\t\"preview\":\n\t\t\t\t\t\"tsx scripts/prebuild.ts && opennextjs-cloudflare build && wrangler dev\",\n\t\t\t\t\"preview:staging\":\n\t\t\t\t\t\"tsx scripts/prebuild.ts && opennextjs-cloudflare build && wrangler dev --env staging\",\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\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// See privacy/page.tsx.gen.ts — the terms text is shipped by the package.\nexport default function generateTermsPage(opts: ScaffoldOptions) {\n\tif (!opts.includeTermsPage) return;\n\n\tconst today = new Date().toLocaleDateString(\"en-US\", {\n\t\tyear: \"numeric\",\n\t\tmonth: \"long\",\n\t\tday: \"numeric\",\n\t});\n\n\treturn `import { LegalPage, termsOfUseHtml } from \"@zorgo/next/legal\";\n\nconst BRAND = ${JSON.stringify(opts.franchiseName)};\n\nexport const metadata = {\n title: \"Terms of Service\",\n description: \\`Terms for ordering online from \\${BRAND}.\\`,\n};\n\nexport default function TermsPage() {\n return (\n <LegalPage\n title=\"Online Ordering Terms of Use\"\n lastUpdated=\"${today}\"\n html={termsOfUseHtml({ brand: BRAND, lastUpdated: \"${today}\" })}\n />\n );\n}\n`;\n}\n","import type { ScaffoldOptions } from \"../../../../types\";\n\n// The policy text itself lives in @zorgo/next/components (src/components/client/legal.ts),\n// so updating the package updates every scaffolded site. Only the brand name and\n// the \"last updated\" date are baked in here.\nexport default function generatePrivacyPage(opts: ScaffoldOptions) {\n\tif (!opts.includePrivacyPage) return;\n\n\tconst today = new Date().toLocaleDateString(\"en-US\", {\n\t\tyear: \"numeric\",\n\t\tmonth: \"long\",\n\t\tday: \"numeric\",\n\t});\n\n\treturn `import { LegalPage, privacyPolicyHtml } from \"@zorgo/next/legal\";\n\nconst BRAND = ${JSON.stringify(opts.franchiseName)};\n\nexport const metadata = {\n title: \"Privacy Policy\",\n description: \\`How \\${BRAND} handles your information.\\`,\n};\n\nexport default function PrivacyPage() {\n return (\n <LegalPage\n title=\"Privacy Policy\"\n lastUpdated=\"${today}\"\n html={privacyPolicyHtml({ brand: BRAND, lastUpdated: \"${today}\" })}\n />\n );\n}\n`;\n}\n","// Env first, hardcoded production second — the same shape POS and kiosk already\n// use in their own config/environment.ts. Both bundlers inline these by literal\n// name (Next NEXT_PUBLIC_*, Expo EXPO_PUBLIC_*), so the lookups have to stay\n// written out; a destructured or computed read is not substituted. Without this\n// the two vars zorgo_site/.env already declares were dead, and pointing any app\n// at a Supabase preview branch meant editing this file.\nexport const SUPABASE_URL =\n\tprocess.env.NEXT_PUBLIC_SUPABASE_URL ||\n\tprocess.env.EXPO_PUBLIC_SUPABASE_URL ||\n\t\"https://dhnpoxorllfdobwftkyb.supabase.co\";\n\nexport const SUPABASE_ANON_KEY =\n\tprocess.env.NEXT_PUBLIC_SUPABASE_ANON_KEY ||\n\tprocess.env.EXPO_PUBLIC_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\n// replace instances of API_BASE_URL with env enum\nexport enum Environments {\n\tProduction = \"https://api.zorgotech.com\",\n\tStaging = \"https://staging.zorgo.ai\",\n\tDevelopment = \"http://localhost:3000\",\n}\n\nexport const API_BASE_URL =\n\tprocess.env.NODE_ENV === \"production\"\n\t\t? Environments.Production\n\t\t: Environments.Development;\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\tREQUESTED: 13,\n\t},\n\tPOS_METHOD_ID: 3,\n\t/**\n\t * Internal QA accounts — their orders are excluded from dashboard order queries.\n\t * Matched on dev/QA emails (kcjayd@, clawsorgo@, gmandwee@, aaiden798@, *@zorgo.*),\n\t * the \"c d\" throwaway persona, and known test names (casey donegan, aiden alazo, …).\n\t * ponytail: hardcoded snapshot — new test accounts need re-running the query.\n\t * Promote to an `is_test` column on `customers` if this list keeps growing.\n\t */\n\tTEST_CUSTOMER_IDS: [\n\t\t85, 90, 91, 93, 95, 96, 97, 203, 238, 240, 241, 244, 245, 246, 317, 318, 319, 322,\n\t\t579, 580, 658, 1526, 2567, 2573, 2703, 2725, 2737, 2739, 2740, 2741, 2742, 2744,\n\t\t2746, 2747, 2749, 2751, 2752, 2753, 2754, 2755, 2767, 2768, 2778, 2779, 2780, 2781,\n\t\t2783, 2814, 2816, 2818, 2819, 2820, 2821, 2822, 2823, 2824, 2835, 2836, 2851, 2853,\n\t\t2859, 2871, 2882, 2883, 2887, 2888, 2889, 2891, 2892, 2893, 2894, 2895, 2896, 2897,\n\t\t2898, 2899, 2900, 2901, 2902, 2903, 2904, 2905, 2907, 2908, 2919, 2921, 2922, 2923,\n\t\t2924, 2925, 2926, 2927, 2946, 3017, 3018, 3022, 3024, 3025, 3026, 3027, 3028, 3029,\n\t\t3030, 3031, 3082, 3091, 3092, 3093,\n\t],\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\tlocations (name),\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\tportion_schemes (id, franchise_id, geometry, name, min_divisions, max_divisions),\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, portion,\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\titem_components (\n\t\t\t\t\tservings_per_item,\n\t\t\t\t\tcomponent_quantity_behaviors (headcount_threshold, starting_amount, step_size, step_interval, maximum),\n\t\t\t\t\tcomponents (id, name, component_type_id, serving_weight, measurement_type, display_unit)\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, portion,\n\t\t\tcomponents (id, name, component_type_id, serving_weight, measurement_type, display_unit), 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, portion,\n\t\t\tcomponents (id, name, component_type_id, serving_weight, measurement_type, display_unit)\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":["path","fileURLToPath","getFilename","getDirname","__dirname","parseArgs","cp","rename","existsSync","join","writeFileSync","mkdirSync","dirname","join","writeGeneratedFile","targetDir","relativePath","content","fullPath","version","PINNED_VERSIONS","version","DEV_DEPENDENCIES","generatePackageJson","opts","PINNED_VERSIONS","DEV_DEPENDENCIES","generateLayout","opts","generateIcon","opts","generateAppleIcon","opts","generateOpengraphImage","opts","projectName","letter","generateManifest","opts","name","generateTermsPage","opts","today","generatePrivacyPage","opts","today","SUPABASE_URL","SUPABASE_ANON_KEY","API_BASE_URL","generateEnvFile","opts","lines","SUPABASE_URL","TREE_DIR","join","__dirname","GENERATED_FILES","generatePackageJson","generateLayout","generateIcon","generateAppleIcon","generateOpengraphImage","generateManifest","generateTermsPage","generatePrivacyPage","generateEnvFile","scaffold","targetDir","opts","cp","src","gitignore","existsSync","rename","file","content","writeGeneratedFile","prompts","validateWebsiteSecret","value","ZORGO_API_BASE_URL","validateStripePublicKey","key","res","valid","ENV_URLS","ZORGO_API_BASE_URL","flags","positionals","parseArgs","args","targetDirArg","slugify","s","questions","value","validateStripePublicKey","validateWebsiteSecret","flagAnswers","main","remainingQuestions","q","promptedAnswers","prompts","question","answer","answers","opts","targetDir","scaffold"]}
|