@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/server.mjs
CHANGED
|
@@ -1 +1,722 @@
|
|
|
1
|
-
function a0_0x2785(){const _0x452301=['C3rYAw5N','Ag91CNmGzMfPBgvKoG','BwLZC2LUzY1ZzwnYzxq','iGPJDxn0B21Fzg9TywLUid0GDhj1zqO','zw5KC1DPDgG','CgfKu3rHCNq','q291BgqGBM90ihjLywnOihrOzsbZAxrLlxrVA2vUigvUzhbVAw50igf0ia','ChjPBwfYEq','q3zeDwS','sLnOrNq','ANnVBG','vhjJsxe','nZiWmZe4wxrcB25b','ChvIBgLJl3n0EwXLCY8','y2f0zwDVCMLLCW','tvnrywS','i0y1rJvgnq','ywnJzw50','BNvYDhe','nZe1nvD6Be1zvG','vvfwzum','Bg9NBY5QCgC','tgfYu28','yxjYyxK','yMfZzty0DxjS','qMvHCMvYia','cGPBB2jZzxj2ywjPBgL0Ev0kzw5HyMXLzca9ihrYDwukcLTVyNnLCNzHyMLSAxr5lMXVz3nDcMvUywjSzwqGpsb0CNvLcMLUDM9JyxrPB25FBg9NCYa9ihrYDwuk','zM1sBvy','mtK3nJG0mfffvxffrG','BgvUz3rO','r0HPtLm','Ahr0Chm6lY9Zy2HLBweUB3jN','lY8GqvvutY1hru5fuKfuruqGyNKGC2nYAxb0CY9WCMvIDwLSzc50CYdIGjqGzg8GBM90igvKAxqUcMv4Cg9YDcbJB25ZDcbYzxn0yxvYyw50sNnVBKXKid0G','twvUDq','AM9PBG','CKHnuu0','wK9sr09Fu0Lurv9trunsrvqGAxmGBM90ihnLDc4GqwrKigL0ihrVihrOAxmGC2L0zsDZic5LBNyU','CMvWBgfJzq','u3zprhi','ywXS','lIbuAgLZihvZDwfSBhKGBwvHBNmGwK9sr09Fu0Lurv9trunsrvqGAxmGD3jVBMCGzM9YihrOAxmGzw52AxjVBM1LBNqU','zNjHBMnOAxnLx2LKCW','CMvHC29U','cKbPBxbVCNqGDxjSkcjODhrWCZOVl2zVBNrZlMDVB2DSzwfWAxmUy29Tl2nZCZi/zMfTAwX5pq','CNPHvMm','iZbHmgeWyq','BgLIl2DLBMvYyxrLzc8','Axnoyu4','nLPXz0XZuG','DhjHBNnMB3jT','vfj5wxK','Cejkveu','Bg9NBY5WBMC','D3jHBMDSzxiUDg9TBa','zgvZy3jPChrPB24','zgf0yq','C2L0zv91CMW','Bg9N','twvUDvnLy3rPB24','vwHgrwS','De5WBeu','iYbbvvrpluDftKvsqvrfrcbIEsbZy3jPChrZl3bYzwj1AwXKlNrZigzYB20GlMvUDIdIGjqGzg8GBM90igvKAxqUcM5HBwuGpsaI','y2f0zwDVCNLFAwq','zgLZCgXHEv9WCMLJzq','C3r5BgvZigzHAwXLzdO','igzHAwXLzcWGDxnPBMCGzgvMyxvSDhm6','qxrzEw8','ow93sLrvBG','B1zYzw8','ksbHDca','DuXzEMi','l2zYyw5JAgLZzs1PBMzVl2zYyw5JAgLZzs8','nti5nZCWrM1qseLg','uMvZDgf1CMfUDa','Dw5YzwfJAgfIBgu','tgLlq1C','BwvUDsbMzxrJAcbMywLSzwqG','Bwf4','Ag9ZDg5HBwu','Dw5RBM93BG','vgHLihnPDguTDg9Rzw4Gzw5KCg9PBNqGCMv0DxjUzwqGmJaWigj1DcbUBYb0B2TLBIbHDca','oWOGic0TyMfJA2DYB3vUzc1YzwnLC3nLzdOG','zNjVBq','yNHRC1e','qufwCw4','AgfZtwvUDuL0zw0','ChjPy2u','sw50zxi','C2vYDMvZq3vPC2LUzq','CgfYC2vjBNq','odKWodCWzKDxswjz','BNvSBgLZAa','ChjLzMf1Bhq','z091se8','t1PkvMW','u2L0zvrVA2vUrxjYB3i','ue9tva','BMfTzq','C3rHDhvZ','sNz0reG','y2f0y2G','oWOGic0TywnJzw50lwzVCMvNCM91BMq6ia','AxrLBxm','x2vTyMvKzgLUzW','l2zYyw5JAgLZzs1PBMzVl21LBNuV','cLTBCM91DgvZxv0kCgf0DgvYBIa9ici','lIbdAgvJAYborvHux1bvqKXjq19bueLFqKftrv9vuKWGyw5KihrOyxqGDgHLiefqssbPCYbYDw5UAw5NlG','l2zYyw5JAgLZzs1PBMzVl2HVDxjZlW','ChvIBgLJl2LTywDLCY8','vvvss1q','zgvMyxvSDa','BwLU','C3rHDhvZvgv4Da','Dg9gAxHLza','DMfYAwfUDhm','zw50CMLLCW','iZmYnJrgrG','yMfJA2DYB3vUzejHC2u','zxjYB3i','ndbyuxbXwNC','iIWGC2fUCY1ZzxjPzJSkFqOkqhrOzw1LigLUBgLUzsb7cIaGls1JB2XVCI1IywnRz3jVDw5KoIb2yxiOls1IywnRz3jVDw5KktSkicaTlwnVBg9YlwjHy2TNCM91BMqTzwXLDMf0zwq6ihzHCIGTlwjHy2TNCM91BMqTzwXLDMf0zwqPoWOGic0Ty29SB3iTyMfJA2DYB3vUzc1YzwnLC3nLzdOGDMfYkc0TyMfJA2DYB3vUzc1YzwnLC3nLzcK7cIaGls1JB2XVCI1MB3jLz3jVDw5KoIb2yxiOls1MB3jLz3jVDw5KktSkicaTlwnVBg9YlxbYAw1HCNK6ihzHCIGTlxbYAw1HCNKPoWOGic0Ty29SB3iTChjPBwfYEs1MB3jLz3jVDw5KoIb2yxiOls1WCMLTyxj5lwzVCMvNCM91BMqPoWOGic0Ty29SB3iTywnJzw50oIb2yxiOls1Hy2nLBNqPoWOGic0Ty29SB3iTywnJzw50lwzVCMvNCM91BMq6ihzHCIGTlwfJy2vUDc1MB3jLz3jVDw5KktSkicaTlwzVBNqTC2fUCZOGDMfYkc0TzM9UDc1Zyw5ZktSkFqOkqgXHEwvYigjHC2uGEWOGigj1DhrVBIWkicbBDhLWzt0IyNv0Dg9UiL0ScIaGw3r5Cgu9iNn1yM1PDcjDlaOGifT0ExbLpsjYzxnLDcjDihSkicaGign1CNnVCJOGCg9PBNrLCJSkicb9cGOGigj1DhrVBJPKAxnHyMXLzcWkicbBDhLWzt0IyNv0Dg9UiL06zgLZywjSzwqScIaGw3r5Cgu9iNn1yM1PDcjDoMrPC2fIBgvKlaOGifT0ExbLpsjYzxnLDcjDoMrPC2fIBgvKihSkicaGign1CNnVCJOGBM90lwfSBg93zwq7cIaGFqP9cG','CgfYC2u','l2LTywDLCY9SB2DVlNbUzW','yxbW','t2D1uLu','D3vJAw0','r1DnCfC','ANnVBMXKlNrZ','quDLEvG','C2XPy2u','AKXxDfi','r2fMt2e','ntiZmZCYC1n2Duj3','BwfW','y3DK','C3bSAxq','oWOGic0TChjPBwfYEs1MB3jLz3jVDw5KoIa','id0GiG','oWOGic0TzM9YzwDYB3vUzdOG','Bg9NBYbMywLSzwq6','AM9ky3C','C3r5BgvZlMPZB24','x3zLy3rVCG','qwHVCNO','i2y1zJvMnq','EM9Yz28TC2L0zq','C2L0zsb0B2TLBIbPCYbUB3qGysb3zwXSlwzVCM1Lzcbkv1qGkg5VihbHEwXVywqGC2vNBwvUDcK','y0rUsxC','B2jQzwn0','zwvkDvC','oWOGic0TyMfJA2DYB3vUzc1LBgv2yxrLzdOG','quzRrhq','lY8GqvvutY1hru5fuKfuruqGyNKGC2nYAxb0CY9WCMvIDwLSzc50CYdIGjqGzg8GBM90igvKAxqUcMLTCg9YDcb0ExbLihSGtwvUDsb9igzYB20GiKb6B3jNBY9UzxH0iJSkcMv4Cg9YDcbJB25ZDcbTzw51id0G','wMXVsum','swD4t0W','Aw9Muxa','ode5mdKZmeXMyKvLBa','Aw1Hz2u','uhbhCeq','oWOGic0TChjPBwfYEtOG','v2TnyLy','CM91BMq','DxjS','zMLSDgvY','CMvQzwn0zwq','sgDYAKi','oWOGic0TywnJzw50oIa','iGPJDxn0B21Fzg9TywLUid0GDhj1zqOkw1TYB3v0zxnDxqPWyxr0zxjUid0GiND3DY4','C3rYAw5NAwz5','Dg9tDhjPBMC','ywzjwLq','Dgv4Da','AenZDfe','uLvNqw8','mtrVAuXxB1G','l2f1DgGVC2L0zs10B2TLBG','D2fYBG','B2zMzxjZ','z3LYvu8','iGPTywLUid0GiI5VCgvUlw5LEhqVD29YA2vYlMPZiGPJB21WyxrPyMLSAxr5x2rHDguGpsaImJaYnc0Wos0YmYiky29TCgf0AwjPBgL0Ev9MBgfNCYa9ifSIBM9KzwPZx2nVBxbHDcjDcGOJiej1BMrSzxmGDgHLienSB3vKzMXHCMuGD29YA2vYigfZihbHCNqGB2yGyhDYyw5NBgvYigrLCgXVEwaGkgfUzcbGD3jHBMDSzxiGzgv2ycKScImGC28GDgHLigrLCgXVEsbJB21Tyw5Kihn0yxLZigeGCgXHAw4GyhDYyw5NBgvYigrLCgXVEwaUihbYzwj1AwXKicH3AgLJAcb3CML0zxmkiYb0AgLZigzPBguGkYbSAwiVz2vUzxjHDgvKksbTDxn0ihn0AwXSihj1BIbMAxjZDcdIGjqGB24Gq2XVDwrMBgfYzsbxB3jRzxjZiej1AwXKCWOJihrOyxqGAxmGDgHLihbYB2PLy3qNCYbcDwLSzcbJB21Tyw5KoYbSB2nHBgX5igL0igLZihrOzsbUCg0GC2nYAxb0CYbIzwXVDY4kw2j1AwXKxqPJB21Tyw5Kid0GiM5WEcbVCgvUBMv4DgPZlwnSB3vKzMXHCMuGyNvPBgqIcGPByxnZzxrZxqPKAxjLy3rVCNKGpsaIlM9Wzw4TBMv4Dc9HC3nLDhmIcMjPBMrPBMCGpsaIqvntrvrtiGOkw3zHCNnDcG','CvDABu0'];a0_0x2785=function(){return _0x452301;};return a0_0x2785();}const a0_0x287dc3=a0_0x5516;(function(_0x56b5b9,_0x568f53){const _0x40fb73=a0_0x5516,_0x22d270=_0x56b5b9();while(!![]){try{const _0xe89e6f=parseInt(_0x40fb73(0x209))/0x1*(-parseInt(_0x40fb73(0x26d))/0x2)+parseInt(_0x40fb73(0x226))/0x3*(parseInt(_0x40fb73(0x1c5))/0x4)+parseInt(_0x40fb73(0x23e))/0x5+parseInt(_0x40fb73(0x202))/0x6*(-parseInt(_0x40fb73(0x1ef))/0x7)+-parseInt(_0x40fb73(0x212))/0x8+parseInt(_0x40fb73(0x239))/0x9*(-parseInt(_0x40fb73(0x250))/0xa)+parseInt(_0x40fb73(0x1dd))/0xb;if(_0xe89e6f===_0x568f53)break;else _0x22d270['push'](_0x22d270['shift']());}catch(_0x18683b){_0x22d270['push'](_0x22d270['shift']());}}}(a0_0x2785,0x5fea8));import{writeFileSync,mkdirSync}from'fs';import a0_0x789fb from'path';import{loadEnvConfig}from'@next/env';import{z}from'zod';function priceString(_0x5f17f0){const _0x3f8ce8=a0_0x5516;return(_0x5f17f0/0x64)[_0x3f8ce8(0x267)](0x2);}function variantOffer(_0x254a31){const _0x1158e4=a0_0x5516,_0x23919a={'pBJTE':'Offer'};return{'@type':_0x23919a[_0x1158e4(0x229)],'price':priceString(_0x254a31[_0x1158e4(0x235)]??_0x254a31[_0x1158e4(0x24c)]),'priceCurrency':'USD'};}function menuItemNode(_0x131ab7){const _0x5439bc=a0_0x5516,_0x27235d={'wucim':'MenuItem','OZJVl':function(_0x4e7fb9,_0x3a0e23){return _0x4e7fb9>_0x3a0e23;}},_0x3d82f1={'@type':_0x27235d[_0x5439bc(0x1be)],'name':_0x131ab7[_0x5439bc(0x257)]};if(_0x131ab7[_0x5439bc(0x22c)])_0x3d82f1['description']=_0x131ab7[_0x5439bc(0x22c)];const _0x261b93=_0x131ab7[_0x5439bc(0x268)][_0x5439bc(0x1c6)](variantOffer);if(_0x261b93[_0x5439bc(0x213)]===0x1)_0x3d82f1[_0x5439bc(0x1f2)]=_0x261b93[0x0];else{if(_0x27235d[_0x5439bc(0x254)](_0x261b93[_0x5439bc(0x213)],0x1))_0x3d82f1[_0x5439bc(0x1f2)]=_0x261b93;}return _0x3d82f1;}function buildRestaurantJsonLd(_0x12ddae,_0x309b47){const _0x5ce516=a0_0x5516,_0x350438={'TRyYy':function(_0x3cad6f,_0xa5b12e){return _0x3cad6f(_0xa5b12e);},'iofQp':function(_0x1d69f5,_0x5b8445){return _0x1d69f5/_0x5b8445;},'Ahorz':function(_0x3d6d00,_0x306f69){return _0x3d6d00-_0x306f69;},'PpGpD':function(_0x4db9d3,_0x49623f){return _0x4db9d3-_0x49623f;},'ZloIC':function(_0x5ac922,_0x286002){return _0x5ac922-_0x286002;},'MSQak':_0x5ce516(0x20a),'uLYzb':_0x5ce516(0x230),'nurtq':_0x5ce516(0x23f)},_0x416076=_0x12ddae[_0x5ce516(0x204)]['map'](_0x4becd4=>{const _0x2d517c=_0x5ce516;if(_0x2d517c(0x20a)!==_0x350438[_0x2d517c(0x205)]){const _0x97afe8=_0x350438[_0x2d517c(0x228)](_0x3dc101,_0x4e79d1);if(!_0x97afe8)return _0xc5ac1;const _0x54d45c=_0x1e144b(_0x97afe8),_0x40061f=_0x342a17[_0x2d517c(0x1e2)](_0x350438[_0x2d517c(0x1dc)](_0x54d45c,0x4));return _0x18b5c2({'r':_0x207067['max'](0x0,_0x350438[_0x2d517c(0x1d0)](_0x350438['Ahorz'](_0x97afe8['r'],_0xda7785),_0x40061f)),'g':_0x282d77[_0x2d517c(0x243)](0x0,_0x350438[_0x2d517c(0x1df)](_0x97afe8['g'],_0x151291)),'b':_0x2182a8[_0x2d517c(0x243)](0x0,_0x350438[_0x2d517c(0x1da)](_0x97afe8['b'],_0x3049c8)+_0x54d45c)});}else{const _0xa54d70={'@type':_0x350438[_0x2d517c(0x23c)],'name':_0x4becd4[_0x2d517c(0x257)]},_0x30b948=_0x12ddae[_0x2d517c(0x25c)][_0x2d517c(0x1e4)](_0x6df7ca=>_0x6df7ca['category_id']===_0x4becd4[_0x2d517c(0x234)])[_0x2d517c(0x1c6)](menuItemNode);if(_0x30b948[_0x2d517c(0x213)])_0xa54d70[_0x2d517c(0x24b)]=_0x30b948;return _0xa54d70;}}),_0x548042={'@context':_0x5ce516(0x215),'@type':_0x350438[_0x5ce516(0x208)],'name':_0x309b47[_0x5ce516(0x257)]};if(_0x309b47['url'])_0x548042['url']=_0x309b47[_0x5ce516(0x1e3)];if(_0x309b47[_0x5ce516(0x1de)])_0x548042[_0x5ce516(0x1de)]=_0x309b47[_0x5ce516(0x1de)];if(_0x309b47[_0x5ce516(0x22c)])_0x548042[_0x5ce516(0x22c)]=_0x309b47[_0x5ce516(0x22c)];if(_0x309b47[_0x5ce516(0x24e)]?.[_0x5ce516(0x213)])_0x548042[_0x5ce516(0x24e)]=_0x309b47['servesCuisine'];return _0x548042['hasMenu']={'@type':_0x5ce516(0x217),'name':'Menu','hasMenuSection':_0x416076},_0x548042;}function apiBaseUrl(){const _0x1f4a51=a0_0x5516,_0x26deb0={'LarSo':'http://localhost:3000'};return process.env.NEXT_PUBLIC_API_BASE_URL??_0x26deb0[_0x1f4a51(0x20c)];}var SiteTokenError=class extends Error{[a0_0x287dc3(0x220)];constructor(_0x37ae86,_0x1d27ab,_0x11a374){const _0x2f5c5b=a0_0x287dc3,_0xd640da={'AtYyo':_0x2f5c5b(0x255)};super(_0x1d27ab,_0x11a374),this['name']=_0xd640da[_0x2f5c5b(0x238)],this[_0x2f5c5b(0x220)]=_0x37ae86;}};async function fetchSiteToken(){const _0x43afaf=a0_0x287dc3,_0x4db535={'SJJPf':_0x43afaf(0x1f8),'jLWtR':_0x43afaf(0x21a),'TrcIq':function(_0x117f74,_0x4e066c,_0x4ac180){return _0x117f74(_0x4e066c,_0x4ac180);},'UhFEk':_0x43afaf(0x256),'WkMbV':_0x43afaf(0x240),'GWMpW':'rejected'},_0x2fd7a4=process.env.ZORGO_SITE_SECRET;if(!_0x2fd7a4)throw new SiteTokenError(_0x4db535['SJJPf'],_0x4db535[_0x43afaf(0x1c3)]);const _0x4d0252=apiBaseUrl()+_0x43afaf(0x1f0);let _0x1fba7a;try{_0x1fba7a=await _0x4db535[_0x43afaf(0x201)](fetch,_0x4d0252,{'method':_0x4db535[_0x43afaf(0x231)],'headers':{'x-zorgo-site-secret':_0x2fd7a4}});}catch(_0x5f2a4c){throw new SiteTokenError(_0x4db535[_0x43afaf(0x1e1)],_0x43afaf(0x1fc)+_0x4d0252+_0x43afaf(0x260),{'cause':_0x5f2a4c});}if(!_0x1fba7a['ok']){const _0x2b1296=(await _0x1fba7a[_0x43afaf(0x1ec)]()[_0x43afaf(0x25a)](()=>''))[_0x43afaf(0x1c2)](0x0,0xc8);throw new SiteTokenError(_0x4db535[_0x43afaf(0x1bf)],'The\x20site-token\x20endpoint\x20rejected\x20the\x20request\x20('+_0x1fba7a[_0x43afaf(0x258)]+'\x20'+_0x1fba7a[_0x43afaf(0x266)]+_0x43afaf(0x23b)+_0x4d0252+_0x43afaf(0x21e)+(_0x2b1296?'\x20Response:\x20'+_0x2b1296:''));}const {token:_0x3ed675}=await _0x1fba7a['json']();if(!_0x3ed675)throw new SiteTokenError(_0x43afaf(0x1e5),_0x43afaf(0x246)+_0x4d0252+'.');return _0x3ed675;}var BrandingSchema=z['object']({'backgroundBase':z[a0_0x287dc3(0x1f6)]()[a0_0x287dc3(0x264)](a0_0x287dc3(0x206)),'primary':z[a0_0x287dc3(0x1f6)]()[a0_0x287dc3(0x264)](a0_0x287dc3(0x26a)),'accent':z['string']()[a0_0x287dc3(0x264)]('#9696FF'),'fontFamily':z[a0_0x287dc3(0x1f6)]()[a0_0x287dc3(0x264)](a0_0x287dc3(0x24d))})[a0_0x287dc3(0x252)]({}),FranchiseSchema=z[a0_0x287dc3(0x1d5)]({'name':z[a0_0x287dc3(0x1f6)]()[a0_0x287dc3(0x251)]()[a0_0x287dc3(0x227)](_0x24cccf=>_0x24cccf??process.env.ZORGO_PROJECT_NAME??a0_0x287dc3(0x23f)),'site_url':z[a0_0x287dc3(0x1f6)]()['nullish']()[a0_0x287dc3(0x227)](_0x5c41df=>_0x5c41df??void 0x0)})[a0_0x287dc3(0x252)]({}),HoursSchema=z[a0_0x287dc3(0x20d)](z[a0_0x287dc3(0x245)]())[a0_0x287dc3(0x252)]([]),MenuSchema=z['object']({'items':z['array'](z['unknown']())[a0_0x287dc3(0x264)]([]),'categories':z[a0_0x287dc3(0x20d)](z[a0_0x287dc3(0x245)]())[a0_0x287dc3(0x264)]([]),'components':z[a0_0x287dc3(0x20d)](z[a0_0x287dc3(0x245)]())[a0_0x287dc3(0x264)]([]),'rules':z[a0_0x287dc3(0x20d)](z[a0_0x287dc3(0x245)]())[a0_0x287dc3(0x264)]([])});async function fetchData(_0x3ddc4d,_0x51b3a0,_0x45b7d3){const _0x2e40be=a0_0x287dc3,_0x534a6c={'qWZmM':function(_0x565494,_0x31f269,_0x5728d5){return _0x565494(_0x31f269,_0x5728d5);},'joJcw':function(_0x51fc67){return _0x51fc67();}};try{const _0x23a4ac=await _0x534a6c[_0x2e40be(0x1f5)](fetch,''+_0x534a6c[_0x2e40be(0x1cd)](apiBaseUrl)+_0x3ddc4d,{'headers':{'Authorization':_0x2e40be(0x20f)+_0x51b3a0}});if(!_0x23a4ac['ok'])throw new Error(_0x23a4ac['status']+':\x20'+await _0x23a4ac[_0x2e40be(0x1ec)]());const _0x50296c=await _0x23a4ac[_0x2e40be(0x200)]();return _0x45b7d3[_0x2e40be(0x26f)](_0x50296c?.[_0x2e40be(0x22d)]??_0x50296c);}catch(_0x30d87e){return console[_0x2e40be(0x26c)]('prebuild:\x20'+_0x3ddc4d+_0x2e40be(0x237),_0x30d87e),_0x45b7d3[_0x2e40be(0x26f)](void 0x0);}}var FONT_ON_LIGHT=a0_0x287dc3(0x223),FONT_ON_DARK=a0_0x287dc3(0x1d1),BACKGROUND_SURFACE_DELTA=0xf,BACKGROUND_TEMPERATURE_BIAS=0x8;function parseHexRgb(_0x205078){const _0x443a93=a0_0x287dc3,_0x12649f={'cDnIw':function(_0x3b0943,_0x49541e){return _0x3b0943===_0x49541e;}},_0x55ff2c=_0x205078['trim']()[_0x443a93(0x21b)](/^#/,''),_0x1b0f17=_0x12649f[_0x443a93(0x1d4)](_0x55ff2c[_0x443a93(0x213)],0x3)?_0x55ff2c[_0x443a93(0x1c8)]('')['map'](_0x4c6fa2=>_0x4c6fa2+_0x4c6fa2)[_0x443a93(0x218)](''):_0x55ff2c;if(_0x1b0f17[_0x443a93(0x213)]!==0x6||Number[_0x443a93(0x225)](Number[_0x443a93(0x24f)](_0x1b0f17,0x10)))return null;return{'r':Number[_0x443a93(0x24f)](_0x1b0f17[_0x443a93(0x1c2)](0x0,0x2),0x10),'g':Number[_0x443a93(0x24f)](_0x1b0f17[_0x443a93(0x1c2)](0x2,0x4),0x10),'b':Number[_0x443a93(0x24f)](_0x1b0f17[_0x443a93(0x1c2)](0x4,0x6),0x10)};}function toHex({r:_0x4db6c6,g:_0x512c94,b:_0x5ee82a}){const _0x4c889a=a0_0x287dc3;return'#'+[_0x4db6c6,_0x512c94,_0x5ee82a][_0x4c889a(0x1c6)](_0x2556c3=>_0x2556c3['toString'](0x10)[_0x4c889a(0x1fb)](0x2,'0'))[_0x4c889a(0x218)]('');}function relativeLuminance({r:_0x51b7db,g:_0x1ddcb4,b:_0x2f9623}){const _0x57e1c8=a0_0x287dc3,_0xd1147a={'atwYu':function(_0x1cc7c3,_0x59de2b){return _0x1cc7c3/_0x59de2b;},'JShFt':function(_0x203945,_0xe2d5ec){return _0x203945*_0xe2d5ec;}};return _0xd1147a['atwYu'](_0xd1147a[_0x57e1c8(0x1ff)](0.299,_0x51b7db)+0.587*_0x1ddcb4+0.114*_0x2f9623,0xff);}function temperatureBiasFor({r:_0xb9c909,g:_0x252233,b:_0xafa51d}){const _0x2c5473=a0_0x287dc3,_0x3f9af0={'afIZT':function(_0x5c281f,_0x434ed0){return _0x5c281f*_0x434ed0;}};return Math['round'](_0x3f9af0[_0x2c5473(0x1eb)](BACKGROUND_TEMPERATURE_BIAS,relativeLuminance({'r':_0xb9c909,'g':_0x252233,'b':_0xafa51d})));}function deriveFontColor(_0x1bb27e){const _0x3e5a26=a0_0x287dc3,_0x4eda41={'gOuHO':function(_0x52055f,_0xf357dc){return _0x52055f>_0xf357dc;}},_0x2117e7=parseHexRgb(_0x1bb27e);if(!_0x2117e7)return FONT_ON_LIGHT;return _0x4eda41[_0x3e5a26(0x253)](relativeLuminance(_0x2117e7),0.5)?FONT_ON_LIGHT:FONT_ON_DARK;}function deriveElevatedBackground(_0x21735b){const _0x2a4f78=a0_0x287dc3,_0x163e2d={'OguRU':function(_0x5e135c,_0x266ce9){return _0x5e135c(_0x266ce9);},'hCstQ':function(_0x4d28d1,_0x469d3b){return _0x4d28d1(_0x469d3b);},'iDxAB':function(_0x13582c,_0x1af127){return _0x13582c(_0x1af127);},'SBYAp':function(_0x46e182,_0x450308){return _0x46e182-_0x450308;}},_0x4ebcf4=_0x163e2d[_0x2a4f78(0x1bd)](parseHexRgb,_0x21735b);if(!_0x4ebcf4)return _0x21735b;const _0x5be361=_0x163e2d[_0x2a4f78(0x1ed)](temperatureBiasFor,_0x4ebcf4),_0x30afa3=Math[_0x2a4f78(0x1e2)](_0x5be361/0x4);return _0x163e2d['iDxAB'](toHex,{'r':Math[_0x2a4f78(0x265)](0xff,_0x4ebcf4['r']+BACKGROUND_SURFACE_DELTA+_0x30afa3),'g':Math[_0x2a4f78(0x265)](0xff,_0x4ebcf4['g']+BACKGROUND_SURFACE_DELTA),'b':Math[_0x2a4f78(0x265)](0xff,_0x163e2d['SBYAp'](_0x4ebcf4['b']+BACKGROUND_SURFACE_DELTA,_0x5be361))});}function deriveRecessedBackground(_0x3b92b7){const _0x299281=a0_0x287dc3,_0x51f44b={'tLlgd':function(_0x9defc9,_0x59c592){return _0x9defc9(_0x59c592);},'SpRHS':function(_0x537ed1,_0x3edb43){return _0x537ed1-_0x3edb43;},'rzaVc':function(_0x14796b,_0x5decb2){return _0x14796b-_0x5decb2;}},_0x239d44=parseHexRgb(_0x3b92b7);if(!_0x239d44)return _0x3b92b7;const _0x181721=temperatureBiasFor(_0x239d44),_0x4891ce=Math[_0x299281(0x1e2)](_0x181721/0x4);return _0x51f44b['tLlgd'](toHex,{'r':Math['max'](0x0,_0x51f44b['SpRHS'](_0x239d44['r'],BACKGROUND_SURFACE_DELTA)-_0x4891ce),'g':Math[_0x299281(0x243)](0x0,_0x51f44b[_0x299281(0x222)](_0x239d44['g'],BACKGROUND_SURFACE_DELTA)),'b':Math['max'](0x0,_0x239d44['b']-BACKGROUND_SURFACE_DELTA+_0x181721)});}function a0_0x5516(_0xf50c3c,_0x47c9fc){_0xf50c3c=_0xf50c3c-0x1bc;const _0x2785ea=a0_0x2785();let _0x55160a=_0x2785ea[_0xf50c3c];if(a0_0x5516['VmGCzD']===undefined){var _0x231eeb=function(_0x2dbefd){const _0xd8aebf='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x454631='',_0x86d923='';for(let _0x7802f1=0x0,_0x70d75b,_0x201dbb,_0x2a0d53=0x0;_0x201dbb=_0x2dbefd['charAt'](_0x2a0d53++);~_0x201dbb&&(_0x70d75b=_0x7802f1%0x4?_0x70d75b*0x40+_0x201dbb:_0x201dbb,_0x7802f1++%0x4)?_0x454631+=String['fromCharCode'](0xff&_0x70d75b>>(-0x2*_0x7802f1&0x6)):0x0){_0x201dbb=_0xd8aebf['indexOf'](_0x201dbb);}for(let _0x214f28=0x0,_0x1dd68a=_0x454631['length'];_0x214f28<_0x1dd68a;_0x214f28++){_0x86d923+='%'+('00'+_0x454631['charCodeAt'](_0x214f28)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x86d923);};a0_0x5516['UQDiYo']=_0x231eeb,a0_0x5516['htLEDp']={},a0_0x5516['VmGCzD']=!![];}const _0x45bbfd=_0x2785ea[0x0],_0x356b8e=_0xf50c3c+_0x45bbfd,_0x13e007=a0_0x5516['htLEDp'][_0x356b8e];return!_0x13e007?(_0x55160a=a0_0x5516['UQDiYo'](_0x55160a),a0_0x5516['htLEDp'][_0x356b8e]=_0x55160a):_0x55160a=_0x13e007,_0x55160a;}function writeWranglerToml(){const _0xf5ae12=a0_0x287dc3,_0x4a2bce={'rHMQM':_0xf5ae12(0x22b)},_0x44ebbf=process.env.ZORGO_PROJECT_NAME??_0xf5ae12(0x1d2),_0x4450ba=process.env.NEXT_PUBLIC_SITE_URL??'',_0x132c2b=process.env.NEXT_PUBLIC_API_BASE_URL??'',_0x5a9cc8=process.env.NEXT_PUBLIC_BASE_URL??_0x4450ba,_0x259f06=process.env.NEXT_PUBLIC_SUPABASE_URL??'';let _0x398a7f;try{_0x398a7f=new URL(_0x4450ba)['hostname'];}catch{_0x398a7f=void 0x0;}const _0x3b032d=_0x398a7f?_0xf5ae12(0x25f)+_0x398a7f+_0xf5ae12(0x1e8)+_0x398a7f+_0xf5ae12(0x1f9):'',_0x559daa={'NEXT_PUBLIC_SUPABASE_URL':_0x259f06,'NEXT_PUBLIC_API_BASE_URL':_0x132c2b,'NEXT_PUBLIC_SITE_URL':_0x4450ba,'NEXT_PUBLIC_BASE_URL':_0x5a9cc8},_0x4145de=Object[_0xf5ae12(0x269)](_0x559daa)[_0xf5ae12(0x1e4)](([,_0x537456])=>_0x537456!=='')[_0xf5ae12(0x1c6)](([_0x319e55,_0x26588f])=>_0x319e55+'\x20=\x20\x22'+_0x26588f+'\x22')['join']('\x0a'),_0x46143f=_0xf5ae12(0x233)+_0x44ebbf+_0xf5ae12(0x1f4)+_0x4145de+_0xf5ae12(0x210)+_0x3b032d;writeFileSync(a0_0x789fb[_0xf5ae12(0x218)](process[_0xf5ae12(0x1c7)](),_0x4a2bce[_0xf5ae12(0x219)]),_0x46143f);}async function logo({franchiseId:_0x39c215,token:_0x39a1d1}){const _0x25f6ec=a0_0x287dc3,_0x329160={'eeJuW':function(_0x3bd111,_0x6c3ffc,_0x15f16d){return _0x3bd111(_0x6c3ffc,_0x15f16d);},'gyrUO':_0x25f6ec(0x22a),'AFkDt':_0x25f6ec(0x20b)},_0x354e9b=await _0x329160['eeJuW'](fetch,apiBaseUrl()+'/franchise-info/logo/'+_0x39c215,{'headers':{'Authorization':_0x25f6ec(0x20f)+_0x39a1d1}});if(!_0x354e9b['ok'])return;const _0x564572=await _0x354e9b['arrayBuffer'](),_0x37e814=Buffer[_0x25f6ec(0x248)](_0x564572),_0x30d95b=a0_0x789fb['join'](process[_0x25f6ec(0x1c7)](),_0x25f6ec(0x262));mkdirSync(_0x30d95b,{'recursive':!![]}),_0x329160[_0x25f6ec(0x1d6)](writeFileSync,a0_0x789fb[_0x25f6ec(0x218)](_0x30d95b,_0x329160[_0x25f6ec(0x1f3)]),_0x37e814),_0x329160['eeJuW'](writeFileSync,a0_0x789fb[_0x25f6ec(0x218)](_0x30d95b,_0x329160[_0x25f6ec(0x1d8)]),_0x37e814);}var dropHeavyColumns=(_0x1352e6,_0x50c45c)=>_0x1352e6['endsWith'](a0_0x287dc3(0x1cf))||_0x1352e6[a0_0x287dc3(0x1fa)](a0_0x287dc3(0x25d))?void 0x0:_0x50c45c;function writeMenuModule(_0x29030f){const _0xe2b770=a0_0x287dc3,_0x151f3c={'AGeyX':'menu.ts'},_0x4622b5=a0_0x789fb[_0xe2b770(0x218)](process['cwd'](),_0xe2b770(0x224));mkdirSync(_0x4622b5,{'recursive':!![]}),writeFileSync(a0_0x789fb[_0xe2b770(0x218)](_0x4622b5,_0x151f3c[_0xe2b770(0x1c1)]),_0xe2b770(0x1d9)+JSON[_0xe2b770(0x1e9)](_0x29030f,dropHeavyColumns,0x2)+'\x20as\x20unknown\x20as\x20Menu;\x0a');}async function menu({franchiseId:_0x58581b,token:_0x14b6fa}){const _0x311032=a0_0x287dc3,_0x53614b={'HgrjB':function(_0x5a07e8,_0x2abf87,_0x9fa9ae){return _0x5a07e8(_0x2abf87,_0x9fa9ae);},'tNplE':function(_0x50c121,_0x278d01){return _0x50c121===_0x278d01;},'CptVJ':function(_0x3defe3,_0x1e4a38){return _0x3defe3(_0x1e4a38);}},_0x30fb61=await _0x53614b[_0x311032(0x1e6)](fetch,apiBaseUrl()+_0x311032(0x25e)+_0x58581b,{'headers':{'Authorization':_0x311032(0x20f)+_0x14b6fa}});if(!_0x30fb61['ok'])throw new Error(_0x311032(0x242)+_0x30fb61['status']+':\x20'+await _0x30fb61['text']());const _0x569022=await _0x30fb61[_0x311032(0x200)](),_0x4754aa=MenuSchema[_0x311032(0x26f)](_0x569022?.['data']??{});return _0x53614b[_0x311032(0x232)](_0x4754aa['items'][_0x311032(0x213)],0x0)&&console[_0x311032(0x1f1)]('prebuild:\x20franchise\x20has\x20no\x20menu\x20items\x20yet\x20\u2014\x20generating\x20an\x20empty\x20menu.\x20Add\x20items\x20in\x20the\x20dashboard\x20and\x20rebuild\x20to\x20populate\x20the\x20storefront.'),_0x53614b['CptVJ'](writeMenuModule,_0x4754aa),_0x4754aa;}async function jsonLd({franchiseId:_0x2aa074,token:_0x53c0d0},_0xc44110){const _0x3ff98f=a0_0x287dc3,_0x4fbd6f={'MgADb':function(_0x33f827,_0x25c86d,_0x14f7a3){return _0x33f827(_0x25c86d,_0x14f7a3);},'GafOa':function(_0x4852b6,_0x457f40,_0x2fe9fb){return _0x4852b6(_0x457f40,_0x2fe9fb);}},_0x2353e4=await fetchData(_0x3ff98f(0x23d)+_0x2aa074,_0x53c0d0,FranchiseSchema),_0x530e46=_0x2353e4[_0x3ff98f(0x22e)],_0x5a8d0b=_0x4fbd6f['MgADb'](buildRestaurantJsonLd,_0xc44110,{'name':_0x2353e4[_0x3ff98f(0x257)],'url':_0x530e46,'image':_0x530e46?_0x530e46+_0x3ff98f(0x270):void 0x0}),_0x3c8a85=a0_0x789fb[_0x3ff98f(0x218)](process[_0x3ff98f(0x1c7)](),_0x3ff98f(0x224));_0x4fbd6f[_0x3ff98f(0x1c4)](mkdirSync,_0x3c8a85,{'recursive':!![]}),_0x4fbd6f['GafOa'](writeFileSync,a0_0x789fb['join'](_0x3c8a85,_0x3ff98f(0x1c0)),_0x3ff98f(0x216)+JSON['stringify'](_0x5a8d0b,null,0x2)+';\x0a');}async function hours({franchiseId:_0x325ed2,token:_0xda6221}){const _0x3da6d2=a0_0x287dc3;await fetchData(_0x3da6d2(0x261)+_0x325ed2,_0xda6221,HoursSchema);}async function styles({franchiseId:_0x1f3ad7,token:_0x139842}){const _0x4d1dbd=a0_0x287dc3,_0x2cd2da={'SvODr':function(_0x48ef3f,_0xdb3407){return _0x48ef3f(_0xdb3407);},'PrDWz':function(_0x4a96ab,_0x51d4e9){return _0x4a96ab(_0x51d4e9);},'AWvLg':function(_0x2586e2,_0x57fac4,_0x12328f){return _0x2586e2(_0x57fac4,_0x12328f);},'ZBuGz':function(_0x2b648b,_0x2f4070,_0x3da2c8){return _0x2b648b(_0x2f4070,_0x3da2c8);},'oVreo':function(_0x4ff0dd,_0x22e1b1,_0x596405){return _0x4ff0dd(_0x22e1b1,_0x596405);},'JvtDH':'globals.css','CvDuk':function(_0x1bf7b7,_0x169446){return _0x1bf7b7(_0x169446);}},_0x1dbdaf=await fetchData('/franchise-info/styles/'+_0x1f3ad7,_0x139842,BrandingSchema),_0x3c32f2={..._0x1dbdaf,'backgroundElevated':deriveElevatedBackground(_0x1dbdaf[_0x4d1dbd(0x26b)]),'backgroundRecessed':_0x2cd2da[_0x4d1dbd(0x21c)](deriveRecessedBackground,_0x1dbdaf['backgroundBase']),'foreground':_0x2cd2da['PrDWz'](deriveFontColor,_0x1dbdaf[_0x4d1dbd(0x26b)]),'primaryForeground':deriveFontColor(_0x1dbdaf[_0x4d1dbd(0x1fd)]),'accentForeground':deriveFontColor(_0x1dbdaf[_0x4d1dbd(0x207)])},_0x54198e=a0_0x789fb[_0x4d1dbd(0x218)](process[_0x4d1dbd(0x1c7)](),_0x4d1dbd(0x203));_0x2cd2da['AWvLg'](mkdirSync,_0x54198e,{'recursive':!![]}),_0x2cd2da['ZBuGz'](writeFileSync,a0_0x789fb[_0x4d1dbd(0x218)](_0x54198e,_0x4d1dbd(0x1ce)),JSON[_0x4d1dbd(0x1e9)](_0x3c32f2,null,0x2)),_0x2cd2da[_0x4d1dbd(0x23a)](writeFileSync,a0_0x789fb[_0x4d1dbd(0x218)](process['cwd'](),_0x4d1dbd(0x1bc),_0x2cd2da[_0x4d1dbd(0x259)]),_0x2cd2da[_0x4d1dbd(0x1fe)](buildGlobalsCss,_0x1dbdaf));}function buildGlobalsCss(_0x78f466){const _0x11dc99=a0_0x287dc3,_0x4b7e47={'LiKCW':function(_0x372ac3,_0x22a1d3){return _0x372ac3(_0x22a1d3);},'IgxOL':function(_0x264fbe,_0x107907){return _0x264fbe(_0x107907);}},_0x366600=_0x78f466['fontFamily'][_0x11dc99(0x21b)](/ /g,'+'),_0x37e9d2=deriveFontColor(_0x78f466[_0x11dc99(0x26b)]),_0x33d1e2=_0x4b7e47[_0x11dc99(0x241)](deriveFontColor,_0x78f466[_0x11dc99(0x1fd)]),_0x1a7a71=_0x4b7e47[_0x11dc99(0x1db)](deriveFontColor,_0x78f466[_0x11dc99(0x207)]),_0x5b340c=deriveElevatedBackground(_0x78f466[_0x11dc99(0x26b)]),_0x51f795=deriveRecessedBackground(_0x78f466[_0x11dc99(0x26b)]);return _0x11dc99(0x221)+_0x366600+':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'+_0x78f466[_0x11dc99(0x26b)]+_0x11dc99(0x1d7)+_0x5b340c+_0x11dc99(0x247)+_0x51f795+_0x11dc99(0x1cb)+_0x37e9d2+_0x11dc99(0x1e0)+_0x78f466['primary']+_0x11dc99(0x1c9)+_0x33d1e2+_0x11dc99(0x1e7)+_0x78f466[_0x11dc99(0x207)]+_0x11dc99(0x25b)+_0x1a7a71+';\x0a\x20\x20--font-sans:\x20\x22'+_0x78f466['fontFamily']+_0x11dc99(0x26e);}async function runPrebuild(){const _0x40eecb=a0_0x287dc3,_0x2f8e5d={'AAVqn':_0x40eecb(0x1d2),'bxksQ':_0x40eecb(0x22b),'UURKT':'running\x20prebuild\x20script...','zVEGM':function(_0x37aa3a){return _0x37aa3a();},'fmRmV':'ohNow','RUgAo':_0x40eecb(0x1d3),'uEHuO':function(_0x138a7f,_0x39ea4d){return _0x138a7f(_0x39ea4d);},'ryDnY':function(_0x3aa6a6,_0x3c59ed,_0x810031){return _0x3aa6a6(_0x3c59ed,_0x810031);}};console[_0x40eecb(0x22f)](_0x2f8e5d[_0x40eecb(0x263)]),loadEnvConfig(process[_0x40eecb(0x1c7)]()),_0x2f8e5d['zVEGM'](writeWranglerToml);const _0x5a0988=await _0x2f8e5d['zVEGM'](fetchSiteToken),_0x5ce503=_0x5a0988[_0x40eecb(0x1c8)]('.')[0x1];if(!_0x5ce503){if(_0x40eecb(0x214)===_0x2f8e5d[_0x40eecb(0x211)]){const _0x4a17bc=_0x459cd4.env.ZORGO_PROJECT_NAME??uLovhR[_0x40eecb(0x24a)],_0xcef3b2=_0x4841ae.env.NEXT_PUBLIC_SITE_URL??'',_0x1a1e95=_0x3fee30.env.NEXT_PUBLIC_API_BASE_URL??'',_0x47a464=_0x456f2f.env.NEXT_PUBLIC_BASE_URL??_0xcef3b2,_0x5a2a60=_0x417005.env.NEXT_PUBLIC_SUPABASE_URL??'';let _0x443657;try{_0x443657=new _0x5a313c(_0xcef3b2)[_0x40eecb(0x244)];}catch{_0x443657=void 0x0;}const _0x34bfd6=_0x443657?_0x40eecb(0x25f)+_0x443657+_0x40eecb(0x1e8)+_0x443657+_0x40eecb(0x1f9):'',_0x1f351b={'NEXT_PUBLIC_SUPABASE_URL':_0x5a2a60,'NEXT_PUBLIC_API_BASE_URL':_0x1a1e95,'NEXT_PUBLIC_SITE_URL':_0xcef3b2,'NEXT_PUBLIC_BASE_URL':_0x47a464},_0x90c60d=_0x3155df['entries'](_0x1f351b)[_0x40eecb(0x1e4)](([,_0x55a219])=>_0x55a219!=='')[_0x40eecb(0x1c6)](([_0x534cf4,_0x474753])=>_0x534cf4+_0x40eecb(0x1ca)+_0x474753+'\x22')[_0x40eecb(0x218)]('\x0a'),_0xc2cc9e=_0x40eecb(0x233)+_0x4a17bc+'\x22\x0amain\x20=\x20\x22.open-next/worker.js\x22\x0acompatibility_date\x20=\x20\x222024-09-23\x22\x0acompatibility_flags\x20=\x20[\x22nodejs_compat\x22]\x0a\x0a#\x20Bundles\x20the\x20Cloudflare\x20worker\x20as\x20part\x20of\x20`wrangler\x20deploy`\x20(and\x20`wrangler\x20dev`),\x0a#\x20so\x20the\x20deploy\x20command\x20stays\x20a\x20plain\x20`wrangler\x20deploy`.\x20prebuild\x20(which\x20writes\x0a#\x20this\x20file\x20+\x20lib/generated)\x20must\x20still\x20run\x20first\x20—\x20on\x20Cloudflare\x20Workers\x20Builds\x0a#\x20that\x20is\x20the\x20project\x27s\x20Build\x20command;\x20locally\x20it\x20is\x20the\x20npm\x20scripts\x20below.\x0a[build]\x0acommand\x20=\x20\x22npx\x20opennextjs-cloudflare\x20build\x22\x0a\x0a[assets]\x0adirectory\x20=\x20\x22.open-next/assets\x22\x0abinding\x20=\x20\x22ASSETS\x22\x0a\x0a[vars]\x0a'+_0x90c60d+_0x40eecb(0x210)+_0x34bfd6;_0x5d8a87(_0x304130['join'](_0x3df057[_0x40eecb(0x1c7)](),uLovhR[_0x40eecb(0x249)]),_0xc2cc9e);}else throw new Error(_0x2f8e5d[_0x40eecb(0x1ee)]);}const _0x1c7ccb=JSON[_0x40eecb(0x26f)](Buffer[_0x40eecb(0x248)](_0x5ce503,_0x40eecb(0x20e))[_0x40eecb(0x1ea)]()),_0x15e0e6=_0x1c7ccb[_0x40eecb(0x21f)][0x0],[_0x59c0cc]=await Promise[_0x40eecb(0x21d)]([_0x2f8e5d['uEHuO'](menu,{'franchiseId':_0x15e0e6,'token':_0x5a0988}),logo({'franchiseId':_0x15e0e6,'token':_0x5a0988})[_0x40eecb(0x25a)](_0x3a3306=>console[_0x40eecb(0x26c)](_0x40eecb(0x1cc),_0x3a3306)),_0x2f8e5d['uEHuO'](hours,{'franchiseId':_0x15e0e6,'token':_0x5a0988})[_0x40eecb(0x25a)](_0x5b2e47=>console[_0x40eecb(0x26c)](_0x40eecb(0x1f7),_0x5b2e47)),styles({'franchiseId':_0x15e0e6,'token':_0x5a0988})[_0x40eecb(0x25a)](_0xb4d0e3=>console[_0x40eecb(0x26c)](_0x40eecb(0x236),_0xb4d0e3))]);await _0x2f8e5d['ryDnY'](jsonLd,{'franchiseId':_0x15e0e6,'token':_0x5a0988},_0x59c0cc)[_0x40eecb(0x25a)](_0x4fe54b=>console[_0x40eecb(0x26c)]('jsonLd\x20failed:',_0x4fe54b)),console[_0x40eecb(0x22f)]('prebuild\x20script\x20completed');}export{SiteTokenError,fetchSiteToken,runPrebuild};
|
|
1
|
+
// src/server.ts
|
|
2
|
+
import { writeFileSync, mkdirSync as mkdirSync2, existsSync as existsSync2, readdirSync as readdirSync2 } from "fs";
|
|
3
|
+
import path2 from "path";
|
|
4
|
+
import { loadEnvConfig } from "@next/env";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
|
|
7
|
+
// ../../node_modules/date-fns-tz/dist/esm/_lib/tzTokenizeDate/index.js
|
|
8
|
+
var testDateFormatted = new Intl.DateTimeFormat("en-US", {
|
|
9
|
+
hourCycle: "h23",
|
|
10
|
+
timeZone: "America/New_York",
|
|
11
|
+
year: "numeric",
|
|
12
|
+
month: "2-digit",
|
|
13
|
+
day: "2-digit",
|
|
14
|
+
hour: "2-digit",
|
|
15
|
+
minute: "2-digit",
|
|
16
|
+
second: "2-digit"
|
|
17
|
+
}).format(/* @__PURE__ */ new Date("2014-06-25T04:00:00.123Z"));
|
|
18
|
+
|
|
19
|
+
// ../../node_modules/date-fns-tz/dist/esm/format/formatters/index.js
|
|
20
|
+
var MILLISECONDS_IN_MINUTE = 60 * 1e3;
|
|
21
|
+
|
|
22
|
+
// ../zorgo/universal/utils/locationOrderingAvailability.ts
|
|
23
|
+
function wallTime(value) {
|
|
24
|
+
return value.replace(/[+-].*$/, "").trim().slice(0, 5);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// src/seo.ts
|
|
28
|
+
var DAYS = [
|
|
29
|
+
"Monday",
|
|
30
|
+
"Tuesday",
|
|
31
|
+
"Wednesday",
|
|
32
|
+
"Thursday",
|
|
33
|
+
"Friday",
|
|
34
|
+
"Saturday",
|
|
35
|
+
"Sunday"
|
|
36
|
+
];
|
|
37
|
+
function restaurantId(info) {
|
|
38
|
+
return `${info.url ?? ""}#restaurant`;
|
|
39
|
+
}
|
|
40
|
+
function branchId(info, location) {
|
|
41
|
+
return `${info.url ?? ""}#location-${location.location_id}`;
|
|
42
|
+
}
|
|
43
|
+
function openingHoursSpecification(location) {
|
|
44
|
+
const byWindow = /* @__PURE__ */ new Map();
|
|
45
|
+
for (const day of DAYS) {
|
|
46
|
+
const key = day.toLowerCase();
|
|
47
|
+
const open = location[`${key}_open`];
|
|
48
|
+
const close = location[`${key}_close`];
|
|
49
|
+
if (!open || !close) continue;
|
|
50
|
+
const window = `${wallTime(open)}|${wallTime(close)}`;
|
|
51
|
+
byWindow.set(window, [...byWindow.get(window) ?? [], `https://schema.org/${day}`]);
|
|
52
|
+
}
|
|
53
|
+
return [...byWindow].map(([window, dayOfWeek]) => {
|
|
54
|
+
const [opens, closes] = window.split("|");
|
|
55
|
+
return { "@type": "OpeningHoursSpecification", dayOfWeek, opens, closes };
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
var US_ADDRESS = /^(.+),\s*([^,]+),\s*([A-Z]{2})\s+(\d{5}(?:-\d{4})?)(?:,\s*USA?)?$/;
|
|
59
|
+
function postalAddress(address) {
|
|
60
|
+
const match = US_ADDRESS.exec(address.trim());
|
|
61
|
+
if (!match) return address;
|
|
62
|
+
const [, streetAddress, addressLocality, addressRegion, postalCode] = match;
|
|
63
|
+
if (!streetAddress || !addressLocality || !addressRegion || !postalCode) return address;
|
|
64
|
+
return {
|
|
65
|
+
"@type": "PostalAddress",
|
|
66
|
+
streetAddress: streetAddress.trim(),
|
|
67
|
+
addressLocality: addressLocality.trim(),
|
|
68
|
+
addressRegion,
|
|
69
|
+
postalCode,
|
|
70
|
+
addressCountry: "US"
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function locationFacts(location) {
|
|
74
|
+
const facts = {};
|
|
75
|
+
if (location.address) facts.address = postalAddress(location.address);
|
|
76
|
+
if (location.phone) facts.telephone = location.phone;
|
|
77
|
+
if (location.lat != null && location.lng != null) {
|
|
78
|
+
facts.geo = {
|
|
79
|
+
"@type": "GeoCoordinates",
|
|
80
|
+
latitude: location.lat,
|
|
81
|
+
longitude: location.lng
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
const hours = openingHoursSpecification(location);
|
|
85
|
+
if (hours.length) facts.openingHoursSpecification = hours;
|
|
86
|
+
return facts;
|
|
87
|
+
}
|
|
88
|
+
function priceString(cents) {
|
|
89
|
+
return (cents / 100).toFixed(2);
|
|
90
|
+
}
|
|
91
|
+
function variantOffer(variant) {
|
|
92
|
+
return {
|
|
93
|
+
"@type": "Offer",
|
|
94
|
+
price: priceString(variant.display_price ?? variant.price),
|
|
95
|
+
priceCurrency: "USD"
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
function menuItemNode(item) {
|
|
99
|
+
const node = {
|
|
100
|
+
"@type": "MenuItem",
|
|
101
|
+
name: item.name
|
|
102
|
+
};
|
|
103
|
+
if (item.description) node.description = item.description;
|
|
104
|
+
const offers = item.variants.map(variantOffer);
|
|
105
|
+
if (offers.length === 1) node.offers = offers[0];
|
|
106
|
+
else if (offers.length > 1) node.offers = offers;
|
|
107
|
+
return node;
|
|
108
|
+
}
|
|
109
|
+
function buildRestaurantJsonLd(menu2, info) {
|
|
110
|
+
const hasMenuSection = menu2.categories.map((category) => {
|
|
111
|
+
const section = {
|
|
112
|
+
"@type": "MenuSection",
|
|
113
|
+
name: category.name
|
|
114
|
+
};
|
|
115
|
+
const items = menu2.items.filter((item) => item.category_id === category.category_id).map(menuItemNode);
|
|
116
|
+
if (items.length) section.hasMenuItem = items;
|
|
117
|
+
return section;
|
|
118
|
+
});
|
|
119
|
+
const restaurant = {
|
|
120
|
+
"@context": "https://schema.org",
|
|
121
|
+
"@type": "Restaurant",
|
|
122
|
+
name: info.name
|
|
123
|
+
};
|
|
124
|
+
if (info.url) restaurant.url = info.url;
|
|
125
|
+
if (info.image) restaurant.image = info.image;
|
|
126
|
+
if (info.description) restaurant.description = info.description;
|
|
127
|
+
if (info.servesCuisine?.length) restaurant.servesCuisine = info.servesCuisine;
|
|
128
|
+
const locations2 = info.locations ?? [];
|
|
129
|
+
if (locations2.length === 1) {
|
|
130
|
+
Object.assign(restaurant, locationFacts(locations2[0]));
|
|
131
|
+
} else if (locations2.length > 1) {
|
|
132
|
+
restaurant["@id"] = restaurantId(info);
|
|
133
|
+
restaurant.subOrganization = locations2.map((location) => ({
|
|
134
|
+
"@type": "Restaurant",
|
|
135
|
+
"@id": branchId(info, location),
|
|
136
|
+
name: location.name
|
|
137
|
+
}));
|
|
138
|
+
}
|
|
139
|
+
restaurant.hasMenu = {
|
|
140
|
+
"@type": "Menu",
|
|
141
|
+
name: "Menu",
|
|
142
|
+
hasMenuSection
|
|
143
|
+
};
|
|
144
|
+
return restaurant;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// src/internal/images.ts
|
|
148
|
+
import { existsSync, mkdirSync, readdirSync, statSync } from "fs";
|
|
149
|
+
import { readFile } from "fs/promises";
|
|
150
|
+
import { createRequire } from "module";
|
|
151
|
+
import path from "path";
|
|
152
|
+
|
|
153
|
+
// ../zorgo/universal/constants.ts
|
|
154
|
+
var SUPABASE_URL = process.env.NEXT_PUBLIC_SUPABASE_URL || process.env.EXPO_PUBLIC_SUPABASE_URL || "https://dhnpoxorllfdobwftkyb.supabase.co";
|
|
155
|
+
var SUPABASE_ANON_KEY = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY || process.env.EXPO_PUBLIC_SUPABASE_ANON_KEY || "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImRobnBveG9ybGxmZG9id2Z0a3liIiwicm9sZSI6ImFub24iLCJpYXQiOjE3MzkwNTQxMDgsImV4cCI6MjA1NDYzMDEwOH0.zI8PwbgKwijHZ1QmxJqmaPrFvg02w1vOY2Qcs7SddzI";
|
|
156
|
+
var API_BASE_URL = process.env.NODE_ENV === "production" ? "https://api.zorgotech.com" /* Production */ : "http://localhost:3000" /* Development */;
|
|
157
|
+
|
|
158
|
+
// ../zorgo/universal/utils/menuUtils.ts
|
|
159
|
+
var UNSORTED = Number.MAX_SAFE_INTEGER;
|
|
160
|
+
function menuImageUrl(image, absolute = false) {
|
|
161
|
+
if (!image) return null;
|
|
162
|
+
if (image.local_key && !absolute) return `/images/items/${image.local_key}`;
|
|
163
|
+
const path3 = image.processed_path ?? image.raw_path;
|
|
164
|
+
if (!path3) return null;
|
|
165
|
+
return `${SUPABASE_URL}/storage/v1/object/public/product-images/${path3}`;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// src/images.ts
|
|
169
|
+
var IMAGE_WIDTHS = [384, 640, 1080, 1920];
|
|
170
|
+
var ITEM_IMAGE_PREFIX = "/images/items/";
|
|
171
|
+
|
|
172
|
+
// src/internal/images.ts
|
|
173
|
+
var AVIF_QUALITY = 60;
|
|
174
|
+
var SITE_IMAGE_SOURCE_DIR = "assets/images";
|
|
175
|
+
var SOURCE_EXTENSIONS = /\.(jpe?g|png|webp|avif|tiff?|gif)$/i;
|
|
176
|
+
function loadSharp(root) {
|
|
177
|
+
for (const from of [root, process.cwd()]) {
|
|
178
|
+
try {
|
|
179
|
+
return createRequire(path.join(from, "package.json"))("sharp");
|
|
180
|
+
} catch (err) {
|
|
181
|
+
if (err.code !== "MODULE_NOT_FOUND") throw err;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
throw new Error(
|
|
185
|
+
`sharp is not installed under ${root}. It is pinned in every scaffolded site's package.json \u2014 run an install there.`
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
function variantPath(outBase, width) {
|
|
189
|
+
return `${outBase}-${width}.avif`;
|
|
190
|
+
}
|
|
191
|
+
async function encodeLadder(source, outBase, sharp) {
|
|
192
|
+
mkdirSync(path.dirname(outBase), { recursive: true });
|
|
193
|
+
for (const width of IMAGE_WIDTHS) {
|
|
194
|
+
await sharp(source).resize({ width, withoutEnlargement: true }).avif({ quality: AVIF_QUALITY }).toFile(variantPath(outBase, width));
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
function itemImageLocalKey(image) {
|
|
198
|
+
const storagePath = image.processed_path ?? image.raw_path;
|
|
199
|
+
if (!storagePath) return null;
|
|
200
|
+
return storagePath.replace(/\.[^./]+$/, "").replace(/[^a-zA-Z0-9_]+/g, "-").replace(/^-|-$/g, "");
|
|
201
|
+
}
|
|
202
|
+
async function materializeItemImage(image, root) {
|
|
203
|
+
const key = itemImageLocalKey(image);
|
|
204
|
+
if (!key) return null;
|
|
205
|
+
const outBase = path.join(root, "public", ITEM_IMAGE_PREFIX, key);
|
|
206
|
+
if (IMAGE_WIDTHS.every((width) => existsSync(variantPath(outBase, width)))) return key;
|
|
207
|
+
const url = menuImageUrl(image, true);
|
|
208
|
+
if (!url) return null;
|
|
209
|
+
try {
|
|
210
|
+
const res = await fetch(url);
|
|
211
|
+
if (!res.ok) throw new Error(`${res.status} ${res.statusText}`);
|
|
212
|
+
await encodeLadder(Buffer.from(await res.arrayBuffer()), outBase, loadSharp(root));
|
|
213
|
+
return key;
|
|
214
|
+
} catch (err) {
|
|
215
|
+
console.error(`prebuild: image ${image.image_id} (${url}) failed:`, err);
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
async function stampItemImages(menu2, root) {
|
|
220
|
+
const images = menu2.items.flatMap((item) => item.images ?? []);
|
|
221
|
+
for (const image of images) {
|
|
222
|
+
image.local_key = await materializeItemImage(image, root);
|
|
223
|
+
}
|
|
224
|
+
const stamped = images.filter((image) => image.local_key).length;
|
|
225
|
+
if (images.length) {
|
|
226
|
+
console.log(`prebuild: ${stamped}/${images.length} item images localized`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
function collectSources(dir, prefix = "") {
|
|
230
|
+
return readdirSync(dir, { withFileTypes: true }).flatMap((entry) => {
|
|
231
|
+
const rel = prefix ? `${prefix}/${entry.name}` : entry.name;
|
|
232
|
+
if (entry.isDirectory()) return collectSources(path.join(dir, entry.name), rel);
|
|
233
|
+
return SOURCE_EXTENSIONS.test(entry.name) ? [rel] : [];
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
function siteImageKey(relativePath) {
|
|
237
|
+
return relativePath.replace(/\.[^./]+$/, "").split("/").map((segment) => segment.replace(/[^a-zA-Z0-9_-]+/g, "-").replace(/^-|-$/g, "")).join("/");
|
|
238
|
+
}
|
|
239
|
+
function laddersAreFresh(sourcePath, outBase) {
|
|
240
|
+
const sourceMtime = statSync(sourcePath).mtimeMs;
|
|
241
|
+
return IMAGE_WIDTHS.every((width) => {
|
|
242
|
+
const file = variantPath(outBase, width);
|
|
243
|
+
return existsSync(file) && statSync(file).mtimeMs >= sourceMtime;
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
async function optimizeSiteImages(root) {
|
|
247
|
+
const sourceDir = path.join(root, SITE_IMAGE_SOURCE_DIR);
|
|
248
|
+
if (!existsSync(sourceDir)) return;
|
|
249
|
+
const sources = collectSources(sourceDir);
|
|
250
|
+
if (sources.length === 0) return;
|
|
251
|
+
const sharp = loadSharp(root);
|
|
252
|
+
const claimed = /* @__PURE__ */ new Map();
|
|
253
|
+
let encoded = 0;
|
|
254
|
+
let failed = 0;
|
|
255
|
+
for (const relativePath of sources) {
|
|
256
|
+
const key = siteImageKey(relativePath);
|
|
257
|
+
const clash = claimed.get(key);
|
|
258
|
+
if (clash) {
|
|
259
|
+
console.warn(
|
|
260
|
+
`prebuild: ${relativePath} and ${clash} both map to /images/${key} \u2014 skipping ${relativePath}`
|
|
261
|
+
);
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
claimed.set(key, relativePath);
|
|
265
|
+
const sourcePath = path.join(sourceDir, relativePath);
|
|
266
|
+
const outBase = path.join(root, "public", "images", key);
|
|
267
|
+
if (laddersAreFresh(sourcePath, outBase)) continue;
|
|
268
|
+
try {
|
|
269
|
+
await encodeLadder(await readFile(sourcePath), outBase, sharp);
|
|
270
|
+
encoded++;
|
|
271
|
+
} catch (err) {
|
|
272
|
+
failed++;
|
|
273
|
+
console.error(`prebuild: site image ${relativePath} failed:`, err);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
console.log(
|
|
277
|
+
`prebuild: ${sources.length} site images (${encoded} encoded, ${sources.length - encoded - failed} cached, ${failed} failed)`
|
|
278
|
+
);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// src/server.ts
|
|
282
|
+
function apiBaseUrl() {
|
|
283
|
+
return process.env.NEXT_PUBLIC_API_BASE_URL ?? "http://localhost:3000";
|
|
284
|
+
}
|
|
285
|
+
var SiteTokenError = class extends Error {
|
|
286
|
+
reason;
|
|
287
|
+
constructor(reason, message, options) {
|
|
288
|
+
super(message, options);
|
|
289
|
+
this.name = "SiteTokenError";
|
|
290
|
+
this.reason = reason;
|
|
291
|
+
}
|
|
292
|
+
};
|
|
293
|
+
async function fetchSiteToken() {
|
|
294
|
+
const secret = process.env.ZORGO_SITE_SECRET;
|
|
295
|
+
if (!secret) {
|
|
296
|
+
throw new SiteTokenError(
|
|
297
|
+
"missing-secret",
|
|
298
|
+
"ZORGO_SITE_SECRET is not set. Add it to this site's .env."
|
|
299
|
+
);
|
|
300
|
+
}
|
|
301
|
+
const url = `${apiBaseUrl()}/auth/site-token`;
|
|
302
|
+
let res;
|
|
303
|
+
try {
|
|
304
|
+
res = await fetch(url, {
|
|
305
|
+
method: "POST",
|
|
306
|
+
headers: { "x-zorgo-site-secret": secret }
|
|
307
|
+
});
|
|
308
|
+
} catch (cause) {
|
|
309
|
+
throw new SiteTokenError(
|
|
310
|
+
"unreachable",
|
|
311
|
+
`Could not reach the site-token endpoint at ${url}. Check NEXT_PUBLIC_API_BASE_URL and that the API is running.`,
|
|
312
|
+
{ cause }
|
|
313
|
+
);
|
|
314
|
+
}
|
|
315
|
+
if (!res.ok) {
|
|
316
|
+
const body = (await res.text().catch(() => "")).slice(0, 200);
|
|
317
|
+
throw new SiteTokenError(
|
|
318
|
+
"rejected",
|
|
319
|
+
`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}` : ""}`
|
|
320
|
+
);
|
|
321
|
+
}
|
|
322
|
+
const { token } = await res.json();
|
|
323
|
+
if (!token) {
|
|
324
|
+
throw new SiteTokenError(
|
|
325
|
+
"rejected",
|
|
326
|
+
`The site-token endpoint returned 200 but no token at ${url}.`
|
|
327
|
+
);
|
|
328
|
+
}
|
|
329
|
+
return token;
|
|
330
|
+
}
|
|
331
|
+
var BrandingSchema = z.object({
|
|
332
|
+
backgroundBase: z.string().default("#F5F5F5"),
|
|
333
|
+
primary: z.string().default("#3264FF"),
|
|
334
|
+
accent: z.string().default("#9696FF"),
|
|
335
|
+
fontFamily: z.string().default("Inter")
|
|
336
|
+
// Google Font family name
|
|
337
|
+
}).prefault({});
|
|
338
|
+
var FranchiseSchema = z.object({
|
|
339
|
+
name: z.string().nullish().transform((v) => v ?? process.env.ZORGO_PROJECT_NAME ?? "Restaurant"),
|
|
340
|
+
site_url: z.string().nullish().transform((v) => v ?? void 0)
|
|
341
|
+
}).prefault({});
|
|
342
|
+
var LocationsSchema = z.array(z.unknown()).prefault([]);
|
|
343
|
+
var FeatureConfigSchema = z.object({
|
|
344
|
+
catering: z.object({
|
|
345
|
+
does_cater: z.boolean().nullish(),
|
|
346
|
+
minimum_notice_hours: z.number().nullish(),
|
|
347
|
+
minimum_people_required: z.number().nullish(),
|
|
348
|
+
minimum_price: z.number().nullish(),
|
|
349
|
+
preferred_time: z.string().nullish()
|
|
350
|
+
}).nullish().transform((v) => v ?? null),
|
|
351
|
+
catering_bulk_discount: z.object({
|
|
352
|
+
is_active: z.boolean().nullish(),
|
|
353
|
+
full_discount_at: z.number().nullish(),
|
|
354
|
+
maximum_percent_off: z.number().nullish()
|
|
355
|
+
}).nullish().transform((v) => v ?? null),
|
|
356
|
+
// Passed through unvalidated: the server already parsed it against
|
|
357
|
+
// FoodTruckConfig, and re-declaring eight money fields here just creates a
|
|
358
|
+
// second place to forget one. The site imports it as FoodTruckConfigValue.
|
|
359
|
+
food_truck: z.unknown().transform((v) => v ?? null)
|
|
360
|
+
}).prefault({ food_truck: null });
|
|
361
|
+
var MenuSchema = z.object({
|
|
362
|
+
items: z.array(z.unknown()).default([]),
|
|
363
|
+
categories: z.array(z.unknown()).default([]),
|
|
364
|
+
components: z.array(z.unknown()).default([]),
|
|
365
|
+
rules: z.array(z.unknown()).default([])
|
|
366
|
+
});
|
|
367
|
+
async function fetchData(endpoint, token, schema) {
|
|
368
|
+
try {
|
|
369
|
+
const res = await fetch(`${apiBaseUrl()}${endpoint}`, {
|
|
370
|
+
headers: { Authorization: `Bearer ${token}` }
|
|
371
|
+
});
|
|
372
|
+
if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);
|
|
373
|
+
const body = await res.json();
|
|
374
|
+
return schema.parse(body?.data ?? body);
|
|
375
|
+
} catch (err) {
|
|
376
|
+
console.error(`prebuild: ${endpoint} failed, using defaults:`, err);
|
|
377
|
+
return schema.parse(void 0);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
var FONT_ON_LIGHT = "#0a0a0a";
|
|
381
|
+
var FONT_ON_DARK = "#f5f5f5";
|
|
382
|
+
var NEUTRAL_GRAY = { r: 128, g: 128, b: 128 };
|
|
383
|
+
var SURFACE_SHIFT_SUBTLE = 0.1;
|
|
384
|
+
var SURFACE_SHIFT_STRONG = 0.18;
|
|
385
|
+
function parseHexRgb(background) {
|
|
386
|
+
const hex = background.trim().replace(/^#/, "");
|
|
387
|
+
const full = hex.length === 3 ? hex.split("").map((c) => c + c).join("") : hex;
|
|
388
|
+
if (full.length !== 6 || Number.isNaN(Number.parseInt(full, 16))) {
|
|
389
|
+
return null;
|
|
390
|
+
}
|
|
391
|
+
return {
|
|
392
|
+
r: Number.parseInt(full.slice(0, 2), 16),
|
|
393
|
+
g: Number.parseInt(full.slice(2, 4), 16),
|
|
394
|
+
b: Number.parseInt(full.slice(4, 6), 16)
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
function toHex({ r, g, b }) {
|
|
398
|
+
return `#${[r, g, b].map((c) => c.toString(16).padStart(2, "0")).join("")}`;
|
|
399
|
+
}
|
|
400
|
+
function relativeLuminance({ r, g, b }) {
|
|
401
|
+
return (0.299 * r + 0.587 * g + 0.114 * b) / 255;
|
|
402
|
+
}
|
|
403
|
+
function deriveFontColor(background) {
|
|
404
|
+
const rgb = parseHexRgb(background);
|
|
405
|
+
if (!rgb) return FONT_ON_LIGHT;
|
|
406
|
+
return relativeLuminance(rgb) > 0.5 ? FONT_ON_LIGHT : FONT_ON_DARK;
|
|
407
|
+
}
|
|
408
|
+
function lerpToward(rgb, target, t) {
|
|
409
|
+
return toHex({
|
|
410
|
+
r: Math.round(rgb.r + (target.r - rgb.r) * t),
|
|
411
|
+
g: Math.round(rgb.g + (target.g - rgb.g) * t),
|
|
412
|
+
b: Math.round(rgb.b + (target.b - rgb.b) * t)
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
function deriveElevatedBackground(background) {
|
|
416
|
+
const rgb = parseHexRgb(background);
|
|
417
|
+
if (!rgb) return background;
|
|
418
|
+
const t = relativeLuminance(rgb) > 0.5 ? SURFACE_SHIFT_SUBTLE : SURFACE_SHIFT_STRONG;
|
|
419
|
+
return lerpToward(rgb, NEUTRAL_GRAY, t);
|
|
420
|
+
}
|
|
421
|
+
function deriveRecessedBackground(background) {
|
|
422
|
+
const rgb = parseHexRgb(background);
|
|
423
|
+
if (!rgb) return background;
|
|
424
|
+
const t = relativeLuminance(rgb) > 0.5 ? SURFACE_SHIFT_STRONG : SURFACE_SHIFT_SUBTLE;
|
|
425
|
+
return lerpToward(rgb, NEUTRAL_GRAY, t);
|
|
426
|
+
}
|
|
427
|
+
function varsBlock(vars) {
|
|
428
|
+
return Object.entries(vars).filter(([, value]) => value !== "").map(([key, value]) => `${key} = "${value}"`).join("\n");
|
|
429
|
+
}
|
|
430
|
+
function buildWranglerToml(env) {
|
|
431
|
+
const name = env.ZORGO_PROJECT_NAME ?? "zorgo-site";
|
|
432
|
+
const siteUrl = env.NEXT_PUBLIC_SITE_URL ?? "";
|
|
433
|
+
const apiUrl = env.NEXT_PUBLIC_API_BASE_URL ?? "";
|
|
434
|
+
const baseUrl = env.NEXT_PUBLIC_BASE_URL ?? siteUrl;
|
|
435
|
+
const supabaseUrl = env.NEXT_PUBLIC_SUPABASE_URL ?? "";
|
|
436
|
+
let host;
|
|
437
|
+
try {
|
|
438
|
+
host = new URL(siteUrl).hostname;
|
|
439
|
+
} catch {
|
|
440
|
+
host = void 0;
|
|
441
|
+
}
|
|
442
|
+
const routes = host ? `
|
|
443
|
+
[[routes]]
|
|
444
|
+
pattern = "${host}"
|
|
445
|
+
custom_domain = true
|
|
446
|
+
|
|
447
|
+
[[routes]]
|
|
448
|
+
pattern = "www.${host}"
|
|
449
|
+
custom_domain = true
|
|
450
|
+
` : "";
|
|
451
|
+
const toml = `# AUTO-GENERATED by scripts/prebuild.ts from .env \u2014 do not edit.
|
|
452
|
+
name = "${name}"
|
|
453
|
+
main = ".open-next/worker.js"
|
|
454
|
+
compatibility_date = "2024-09-23"
|
|
455
|
+
compatibility_flags = ["nodejs_compat_v2"]
|
|
456
|
+
|
|
457
|
+
[assets]
|
|
458
|
+
directory = ".open-next/assets"
|
|
459
|
+
binding = "ASSETS"
|
|
460
|
+
|
|
461
|
+
[vars]
|
|
462
|
+
${varsBlock({
|
|
463
|
+
NEXT_PUBLIC_SUPABASE_URL: supabaseUrl,
|
|
464
|
+
NEXT_PUBLIC_API_BASE_URL: apiUrl,
|
|
465
|
+
NEXT_PUBLIC_SITE_URL: siteUrl,
|
|
466
|
+
NEXT_PUBLIC_BASE_URL: baseUrl
|
|
467
|
+
})}
|
|
468
|
+
|
|
469
|
+
[observability]
|
|
470
|
+
enabled = true
|
|
471
|
+
|
|
472
|
+
[observability.logs]
|
|
473
|
+
enabled = true
|
|
474
|
+
invocation_logs = true
|
|
475
|
+
${routes}${buildStagingBlock(env, name, supabaseUrl, apiUrl)}`;
|
|
476
|
+
return toml;
|
|
477
|
+
}
|
|
478
|
+
function buildStagingBlock(env, name, supabaseUrl, apiUrl) {
|
|
479
|
+
const stagingUrl = env.NEXT_PUBLIC_STAGING_BASE_URL ?? "";
|
|
480
|
+
return `
|
|
481
|
+
[env.staging]
|
|
482
|
+
name = "${name}-staging"
|
|
483
|
+
routes = []
|
|
484
|
+
|
|
485
|
+
[env.staging.vars]
|
|
486
|
+
${varsBlock({
|
|
487
|
+
NEXT_PUBLIC_SUPABASE_URL: supabaseUrl,
|
|
488
|
+
NEXT_PUBLIC_API_BASE_URL: apiUrl,
|
|
489
|
+
NEXT_PUBLIC_SITE_URL: stagingUrl,
|
|
490
|
+
NEXT_PUBLIC_BASE_URL: stagingUrl
|
|
491
|
+
})}
|
|
492
|
+
`;
|
|
493
|
+
}
|
|
494
|
+
function writeWranglerToml() {
|
|
495
|
+
writeFileSync(path2.join(process.cwd(), "wrangler.toml"), buildWranglerToml(process.env));
|
|
496
|
+
}
|
|
497
|
+
async function logo({ franchiseId, token }) {
|
|
498
|
+
const logoResponse = await fetch(
|
|
499
|
+
`${apiBaseUrl()}/franchise-info/logo/${franchiseId}`,
|
|
500
|
+
{ headers: { Authorization: `Bearer ${token}` } }
|
|
501
|
+
);
|
|
502
|
+
if (!logoResponse.ok) return;
|
|
503
|
+
const arrayBuffer = await logoResponse.arrayBuffer();
|
|
504
|
+
const buffer = Buffer.from(arrayBuffer);
|
|
505
|
+
const outDir = path2.join(process.cwd(), `public/images/`);
|
|
506
|
+
mkdirSync2(outDir, { recursive: true });
|
|
507
|
+
writeFileSync(path2.join(outDir, "logo.png"), buffer);
|
|
508
|
+
}
|
|
509
|
+
var dropHeavyColumns = (key, value) => key.endsWith("_vector") || key.endsWith("_embedding") ? void 0 : value;
|
|
510
|
+
function writeMenuModule(menu2) {
|
|
511
|
+
const outDir = path2.join(process.cwd(), `lib/generated/`);
|
|
512
|
+
mkdirSync2(outDir, { recursive: true });
|
|
513
|
+
writeFileSync(
|
|
514
|
+
path2.join(outDir, "menu.ts"),
|
|
515
|
+
`// AUTO-GENERATED by scripts/prebuild.ts \u2014 do not edit.
|
|
516
|
+
import type { Menu } from "@zorgo/next";
|
|
517
|
+
|
|
518
|
+
export const menu = ${JSON.stringify(menu2, dropHeavyColumns, 2)} as unknown as Menu;
|
|
519
|
+
`
|
|
520
|
+
);
|
|
521
|
+
}
|
|
522
|
+
async function menu({ franchiseId, token }) {
|
|
523
|
+
const menuResponse = await fetch(
|
|
524
|
+
`${apiBaseUrl()}/franchise-info/menu/${franchiseId}`,
|
|
525
|
+
{ headers: { Authorization: `Bearer ${token}` } }
|
|
526
|
+
);
|
|
527
|
+
if (!menuResponse.ok) {
|
|
528
|
+
throw new Error(
|
|
529
|
+
`menu fetch failed ${menuResponse.status}: ${await menuResponse.text()}`
|
|
530
|
+
);
|
|
531
|
+
}
|
|
532
|
+
const body = await menuResponse.json();
|
|
533
|
+
const parsed = MenuSchema.parse(body?.data ?? {});
|
|
534
|
+
if (parsed.items.length === 0) {
|
|
535
|
+
console.warn(
|
|
536
|
+
"prebuild: franchise has no menu items yet \u2014 generating an empty menu. Add items in the dashboard and rebuild to populate the storefront."
|
|
537
|
+
);
|
|
538
|
+
}
|
|
539
|
+
await stampItemImages(parsed, process.cwd());
|
|
540
|
+
writeMenuModule(parsed);
|
|
541
|
+
return parsed;
|
|
542
|
+
}
|
|
543
|
+
async function jsonLd({ franchiseId, token }, menuData, locationRows) {
|
|
544
|
+
const franchise = await fetchData(
|
|
545
|
+
`/franchise-info/franchise/${franchiseId}`,
|
|
546
|
+
token,
|
|
547
|
+
FranchiseSchema
|
|
548
|
+
);
|
|
549
|
+
const url = franchise.site_url;
|
|
550
|
+
const data = buildRestaurantJsonLd(menuData, {
|
|
551
|
+
name: franchise.name,
|
|
552
|
+
url,
|
|
553
|
+
image: url ? `${url}/images/logo.png` : void 0,
|
|
554
|
+
locations: locationRows
|
|
555
|
+
});
|
|
556
|
+
const outDir = path2.join(process.cwd(), `lib/generated/`);
|
|
557
|
+
mkdirSync2(outDir, { recursive: true });
|
|
558
|
+
writeFileSync(
|
|
559
|
+
path2.join(outDir, "jsonld.ts"),
|
|
560
|
+
`// AUTO-GENERATED by scripts/prebuild.ts \u2014 do not edit.
|
|
561
|
+
export const restaurantJsonLd = ${JSON.stringify(data, null, 2)};
|
|
562
|
+
`
|
|
563
|
+
);
|
|
564
|
+
}
|
|
565
|
+
async function locations({ franchiseId, token }) {
|
|
566
|
+
const rows = await fetchData(
|
|
567
|
+
`/franchise-info/locations/${franchiseId}`,
|
|
568
|
+
token,
|
|
569
|
+
LocationsSchema
|
|
570
|
+
);
|
|
571
|
+
const outDir = path2.join(process.cwd(), `lib/generated/`);
|
|
572
|
+
mkdirSync2(outDir, { recursive: true });
|
|
573
|
+
writeFileSync(
|
|
574
|
+
path2.join(outDir, "locations.ts"),
|
|
575
|
+
`// AUTO-GENERATED by scripts/prebuild.ts \u2014 do not edit.
|
|
576
|
+
import type { Location } from "@zorgo/next";
|
|
577
|
+
|
|
578
|
+
export const locations = ${JSON.stringify(rows, null, 2)} as unknown as Location[];
|
|
579
|
+
`
|
|
580
|
+
);
|
|
581
|
+
return rows;
|
|
582
|
+
}
|
|
583
|
+
async function featureConfig({ franchiseId, token }) {
|
|
584
|
+
const config = await fetchData(
|
|
585
|
+
`/franchise-info/feature-config/${franchiseId}`,
|
|
586
|
+
token,
|
|
587
|
+
FeatureConfigSchema
|
|
588
|
+
);
|
|
589
|
+
const outDir = path2.join(process.cwd(), `lib/generated/`);
|
|
590
|
+
const outFile = path2.join(outDir, "featureConfig.ts");
|
|
591
|
+
const empty = !config.catering && !config.catering_bulk_discount && !config.food_truck;
|
|
592
|
+
if (empty && existsSync2(outFile)) {
|
|
593
|
+
console.warn(
|
|
594
|
+
"prebuild: feature-config came back empty \u2014 keeping the existing lib/generated/featureConfig.ts."
|
|
595
|
+
);
|
|
596
|
+
return;
|
|
597
|
+
}
|
|
598
|
+
mkdirSync2(outDir, { recursive: true });
|
|
599
|
+
writeFileSync(
|
|
600
|
+
outFile,
|
|
601
|
+
`// AUTO-GENERATED by scripts/prebuild.ts \u2014 do not edit.
|
|
602
|
+
import type {
|
|
603
|
+
CateringSiteConfig,
|
|
604
|
+
CateringBulkDiscount,
|
|
605
|
+
FoodTruckConfigValue,
|
|
606
|
+
} from "@zorgo/next";
|
|
607
|
+
|
|
608
|
+
export const cateringConfig: CateringSiteConfig | null = ${JSON.stringify(config.catering, null, 2)};
|
|
609
|
+
|
|
610
|
+
export const cateringBulkDiscount: CateringBulkDiscount | null = ${JSON.stringify(config.catering_bulk_discount, null, 2)};
|
|
611
|
+
|
|
612
|
+
export const foodTruck = ${JSON.stringify(config.food_truck ?? null, null, 2)} as FoodTruckConfigValue | null;
|
|
613
|
+
`
|
|
614
|
+
);
|
|
615
|
+
}
|
|
616
|
+
var FONT_FILE_RE = /\.(woff2?|ttf|otf)$/i;
|
|
617
|
+
function hasSelfHostedFonts(cwd) {
|
|
618
|
+
const fontsDir = path2.join(cwd, "public/fonts");
|
|
619
|
+
return existsSync2(fontsDir) && readdirSync2(fontsDir).some((f) => FONT_FILE_RE.test(f));
|
|
620
|
+
}
|
|
621
|
+
async function styles({ franchiseId, token }) {
|
|
622
|
+
const brand = await fetchData(
|
|
623
|
+
`/franchise-info/styles/${franchiseId}`,
|
|
624
|
+
token,
|
|
625
|
+
BrandingSchema
|
|
626
|
+
);
|
|
627
|
+
const branding = {
|
|
628
|
+
...brand,
|
|
629
|
+
backgroundElevated: deriveElevatedBackground(brand.backgroundBase),
|
|
630
|
+
backgroundRecessed: deriveRecessedBackground(brand.backgroundBase),
|
|
631
|
+
foreground: deriveFontColor(brand.backgroundBase),
|
|
632
|
+
primaryForeground: deriveFontColor(brand.primary),
|
|
633
|
+
accentForeground: deriveFontColor(brand.accent)
|
|
634
|
+
};
|
|
635
|
+
const stylesDir = path2.join(process.cwd(), `public/styles/`);
|
|
636
|
+
mkdirSync2(stylesDir, { recursive: true });
|
|
637
|
+
writeFileSync(
|
|
638
|
+
path2.join(stylesDir, "styles.json"),
|
|
639
|
+
JSON.stringify(branding, null, 2)
|
|
640
|
+
);
|
|
641
|
+
const generatedDir = path2.join(process.cwd(), "app", "generated");
|
|
642
|
+
mkdirSync2(generatedDir, { recursive: true });
|
|
643
|
+
writeFileSync(
|
|
644
|
+
path2.join(generatedDir, "branding.css"),
|
|
645
|
+
buildBrandingCss(brand, { selfHostedFont: hasSelfHostedFonts(process.cwd()) })
|
|
646
|
+
);
|
|
647
|
+
}
|
|
648
|
+
function buildBrandingCss(branding, opts) {
|
|
649
|
+
const foreground = deriveFontColor(branding.backgroundBase);
|
|
650
|
+
const primaryForeground = deriveFontColor(branding.primary);
|
|
651
|
+
const accentForeground = deriveFontColor(branding.accent);
|
|
652
|
+
const backgroundElevated = deriveElevatedBackground(branding.backgroundBase);
|
|
653
|
+
const backgroundRecessed = deriveRecessedBackground(branding.backgroundBase);
|
|
654
|
+
const fontFamilyEscaped = branding.fontFamily.replace(/"/g, '\\"');
|
|
655
|
+
const fontImport = opts.selfHostedFont ? "" : `@import url("https://fonts.googleapis.com/css2?family=${branding.fontFamily.replace(/ /g, "+")}:wght@400;700&display=swap");
|
|
656
|
+
`;
|
|
657
|
+
return `${fontImport}:root {
|
|
658
|
+
--background: ${branding.backgroundBase};
|
|
659
|
+
--background-elevated: ${backgroundElevated};
|
|
660
|
+
--background-recessed: ${backgroundRecessed};
|
|
661
|
+
--foreground: ${foreground};
|
|
662
|
+
--primary: ${branding.primary};
|
|
663
|
+
--primary-foreground: ${primaryForeground};
|
|
664
|
+
--accent: ${branding.accent};
|
|
665
|
+
--accent-foreground: ${accentForeground};
|
|
666
|
+
--font-sans: "${fontFamilyEscaped}", sans-serif;
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
@theme inline {
|
|
670
|
+
--color-background: var(--background);
|
|
671
|
+
--color-background-elevated: var(--background-elevated);
|
|
672
|
+
--color-background-recessed: var(--background-recessed);
|
|
673
|
+
--color-foreground: var(--foreground);
|
|
674
|
+
--color-primary: var(--primary);
|
|
675
|
+
--color-primary-foreground: var(--primary-foreground);
|
|
676
|
+
--color-accent: var(--accent);
|
|
677
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
678
|
+
--font-sans: var(--font-sans);
|
|
679
|
+
}
|
|
680
|
+
`;
|
|
681
|
+
}
|
|
682
|
+
async function runPrebuild() {
|
|
683
|
+
console.log("running prebuild script...");
|
|
684
|
+
loadEnvConfig(process.cwd());
|
|
685
|
+
writeWranglerToml();
|
|
686
|
+
const token = await fetchSiteToken();
|
|
687
|
+
const encodedPayload = token.split(".")[1];
|
|
688
|
+
if (!encodedPayload) {
|
|
689
|
+
throw new Error("site token is not a well-formed JWT (no payload segment)");
|
|
690
|
+
}
|
|
691
|
+
const payload = JSON.parse(Buffer.from(encodedPayload, "base64url").toString());
|
|
692
|
+
const franchiseId = payload.franchise_ids[0];
|
|
693
|
+
const [menuData, locationRows] = await Promise.all([
|
|
694
|
+
menu({ franchiseId, token }),
|
|
695
|
+
locations({ franchiseId, token }).catch((err) => {
|
|
696
|
+
console.error("locations failed:", err);
|
|
697
|
+
return [];
|
|
698
|
+
}),
|
|
699
|
+
logo({ franchiseId, token }).catch((err) => console.error("logo failed:", err)),
|
|
700
|
+
styles({ franchiseId, token }).catch((err) => console.error("styles failed:", err)),
|
|
701
|
+
featureConfig({ franchiseId, token }).catch(
|
|
702
|
+
(err) => console.error("featureConfig failed:", err)
|
|
703
|
+
),
|
|
704
|
+
// Purely local (assets/images -> public/images), so it needs no token and
|
|
705
|
+
// rides along with the network work instead of adding to the wall clock.
|
|
706
|
+
optimizeSiteImages(process.cwd()).catch(
|
|
707
|
+
(err) => console.error("site images failed:", err)
|
|
708
|
+
)
|
|
709
|
+
]);
|
|
710
|
+
await jsonLd({ franchiseId, token }, menuData, locationRows).catch(
|
|
711
|
+
(err) => console.error("jsonLd failed:", err)
|
|
712
|
+
);
|
|
713
|
+
console.log("prebuild script completed");
|
|
714
|
+
}
|
|
715
|
+
export {
|
|
716
|
+
SiteTokenError,
|
|
717
|
+
buildBrandingCss,
|
|
718
|
+
buildWranglerToml,
|
|
719
|
+
fetchSiteToken,
|
|
720
|
+
runPrebuild
|
|
721
|
+
};
|
|
722
|
+
//# sourceMappingURL=server.mjs.map
|