@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.
Files changed (74) hide show
  1. package/dist/cli.d.mts +1 -1
  2. package/dist/cli.d.ts +1 -1
  3. package/dist/cli.js +322 -1
  4. package/dist/cli.js.map +1 -0
  5. package/dist/cli.mjs +322 -1
  6. package/dist/cli.mjs.map +1 -0
  7. package/dist/components.d.mts +1047 -89
  8. package/dist/components.d.ts +1047 -89
  9. package/dist/components.js +4611 -1048
  10. package/dist/components.js.map +1 -1
  11. package/dist/components.mjs +4635 -1149
  12. package/dist/components.mjs.map +1 -1
  13. package/dist/images.d.mts +48 -0
  14. package/dist/images.d.ts +48 -0
  15. package/dist/images.js +72 -0
  16. package/dist/images.js.map +1 -0
  17. package/dist/images.mjs +39 -0
  18. package/dist/images.mjs.map +1 -0
  19. package/dist/index.d.mts +489 -14
  20. package/dist/index.d.ts +489 -14
  21. package/dist/index.js +168 -1
  22. package/dist/index.js.map +1 -0
  23. package/dist/index.mjs +168 -1
  24. package/dist/index.mjs.map +1 -0
  25. package/dist/item-page.d.mts +157 -0
  26. package/dist/item-page.d.ts +157 -0
  27. package/dist/item-page.js +168 -0
  28. package/dist/item-page.js.map +1 -0
  29. package/dist/item-page.mjs +131 -0
  30. package/dist/item-page.mjs.map +1 -0
  31. package/dist/legal.d.mts +31 -0
  32. package/dist/legal.d.ts +31 -0
  33. package/dist/legal.js +322 -0
  34. package/dist/legal.js.map +1 -0
  35. package/dist/legal.mjs +293 -0
  36. package/dist/legal.mjs.map +1 -0
  37. package/dist/seo.d.mts +87 -2
  38. package/dist/seo.d.ts +87 -2
  39. package/dist/seo.js +111 -2
  40. package/dist/seo.js.map +1 -1
  41. package/dist/seo.mjs +106 -1
  42. package/dist/seo.mjs.map +1 -1
  43. package/dist/server.d.mts +27 -1
  44. package/dist/server.d.ts +27 -1
  45. package/dist/server.js +761 -1
  46. package/dist/server.js.map +1 -0
  47. package/dist/server.mjs +722 -1
  48. package/dist/server.mjs.map +1 -0
  49. package/dist/slugs.d.mts +2 -1
  50. package/dist/slugs.d.ts +2 -1
  51. package/dist/slugs.js +2 -0
  52. package/dist/slugs.js.map +1 -1
  53. package/dist/slugs.mjs +1 -0
  54. package/dist/slugs.mjs.map +1 -1
  55. package/dist/tree/README.md +2 -2
  56. package/dist/tree/app/components/ClientItemForm.tsx +7 -0
  57. package/dist/tree/app/components/Header.tsx +3 -0
  58. package/dist/tree/app/components/ModalRegistry.tsx +3 -2
  59. package/dist/tree/app/components/index.ts +2 -1
  60. package/dist/tree/app/error.tsx +12 -3
  61. package/dist/tree/app/global-error.tsx +21 -4
  62. package/dist/tree/app/globals.css +41 -0
  63. package/dist/tree/app/menu/[slug]/page.tsx +16 -48
  64. package/dist/tree/app/not-found.tsx +17 -3
  65. package/dist/tree/app/privacy/page.tsx.gen.ts +28 -9
  66. package/dist/tree/app/terms/page.tsx.gen.ts +26 -10
  67. package/dist/tree/gitignore +7 -1
  68. package/dist/tree/image-loader.ts +4 -0
  69. package/dist/tree/next.config.ts +13 -0
  70. package/dist/tree/open-next.config.ts +7 -0
  71. package/dist/tree/package.json.gen.ts +8 -2
  72. package/package.json +17 -2
  73. package/dist/tree/app/globals.css.gen.ts +0 -123
  74. package/dist/tree/app/menu/[slug]/ItemCustomizationClient.tsx +0 -18
package/dist/server.js CHANGED
@@ -1 +1,761 @@
1
- 'use strict';const a0_0x47ed54=a0_0x5037;(function(_0x2b6b5f,_0x1250b4){const _0x4bd109=a0_0x5037,_0x2a4079=_0x2b6b5f();while(!![]){try{const _0x3cb7cc=-parseInt(_0x4bd109(0x265))/0x1*(-parseInt(_0x4bd109(0x237))/0x2)+parseInt(_0x4bd109(0x1c7))/0x3*(parseInt(_0x4bd109(0x255))/0x4)+parseInt(_0x4bd109(0x236))/0x5+-parseInt(_0x4bd109(0x20d))/0x6+-parseInt(_0x4bd109(0x1bb))/0x7+parseInt(_0x4bd109(0x1de))/0x8+parseInt(_0x4bd109(0x247))/0x9*(-parseInt(_0x4bd109(0x1ac))/0xa);if(_0x3cb7cc===_0x1250b4)break;else _0x2a4079['push'](_0x2a4079['shift']());}catch(_0x39d098){_0x2a4079['push'](_0x2a4079['shift']());}}}(a0_0x5733,0x54108));var __create=Object[a0_0x47ed54(0x1a9)],__defProp=Object['defineProperty'],__getOwnPropDesc=Object['getOwnPropertyDescriptor'],__getOwnPropNames=Object['getOwnPropertyNames'],__getProtoOf=Object[a0_0x47ed54(0x1b6)],__hasOwnProp=Object[a0_0x47ed54(0x1f9)]['hasOwnProperty'],__export=(_0x395a0e,_0x3edc95)=>{const _0x59ef0c=a0_0x47ed54,_0x15847b={'uUMdD':function(_0x5dc82b,_0x37ce4f,_0x5b0b6b,_0x45b3b4){return _0x5dc82b(_0x37ce4f,_0x5b0b6b,_0x45b3b4);}};for(var _0x562320 in _0x3edc95)_0x15847b[_0x59ef0c(0x222)](__defProp,_0x395a0e,_0x562320,{'get':_0x3edc95[_0x562320],'enumerable':!![]});},__copyProps=(_0x4d58c7,_0x5e31d2,_0x591ace,_0x51743e)=>{const _0x44de35=a0_0x47ed54,_0x426266={'jmUSr':_0x44de35(0x21e),'ytLgs':function(_0x2c78dc,_0x112fda){return _0x2c78dc!==_0x112fda;},'ZLovo':function(_0x4374b5,_0x1ce868,_0x3082df,_0x21f954){return _0x4374b5(_0x1ce868,_0x3082df,_0x21f954);},'iWPVo':function(_0x3465f5,_0x3dc12c,_0x45418d){return _0x3465f5(_0x3dc12c,_0x45418d);}};if(_0x5e31d2&&typeof _0x5e31d2===_0x426266[_0x44de35(0x1a5)]||typeof _0x5e31d2===_0x44de35(0x238)){for(let _0x19d887 of __getOwnPropNames(_0x5e31d2))if(!__hasOwnProp[_0x44de35(0x22f)](_0x4d58c7,_0x19d887)&&_0x426266['ytLgs'](_0x19d887,_0x591ace))_0x426266[_0x44de35(0x229)](__defProp,_0x4d58c7,_0x19d887,{'get':()=>_0x5e31d2[_0x19d887],'enumerable':!(_0x51743e=_0x426266[_0x44de35(0x254)](__getOwnPropDesc,_0x5e31d2,_0x19d887))||_0x51743e[_0x44de35(0x1ef)]});}return _0x4d58c7;},__toESM=(_0xbb2ddc,_0xca27b6,_0x30f971)=>(_0x30f971=_0xbb2ddc!=null?__create(__getProtoOf(_0xbb2ddc)):{},__copyProps(_0xca27b6||!_0xbb2ddc||!_0xbb2ddc['__esModule']?__defProp(_0x30f971,a0_0x47ed54(0x212),{'value':_0xbb2ddc,'enumerable':!![]}):_0x30f971,_0xbb2ddc)),__toCommonJS=_0x207ddc=>__copyProps(__defProp({},a0_0x47ed54(0x1bc),{'value':!![]}),_0x207ddc),server_exports={};__export(server_exports,{'SiteTokenError':()=>SiteTokenError,'fetchSiteToken':()=>fetchSiteToken,'runPrebuild':()=>runPrebuild}),module['exports']=__toCommonJS(server_exports);var import_fs=require('fs'),import_path=__toESM(require(a0_0x47ed54(0x1df))),import_env=require('@next/env'),import_zod=require(a0_0x47ed54(0x1cf));function priceString(_0x31b78e){const _0x4ba090=a0_0x47ed54;return(_0x31b78e/0x64)[_0x4ba090(0x1f0)](0x2);}function variantOffer(_0x41209e){const _0x485771=a0_0x47ed54,_0x182b47={'okgRj':_0x485771(0x23f),'tNolf':function(_0xb0db41,_0x28a960){return _0xb0db41(_0x28a960);}};return{'@type':_0x182b47[_0x485771(0x1d4)],'price':_0x182b47[_0x485771(0x1b3)](priceString,_0x41209e[_0x485771(0x1c4)]??_0x41209e[_0x485771(0x21c)]),'priceCurrency':_0x485771(0x203)};}function menuItemNode(_0x22e24a){const _0x2922c3=a0_0x47ed54,_0x48c2f1={'@type':_0x2922c3(0x1e0),'name':_0x22e24a['name']};if(_0x22e24a[_0x2922c3(0x21f)])_0x48c2f1['description']=_0x22e24a[_0x2922c3(0x21f)];const _0x299d06=_0x22e24a['variants'][_0x2922c3(0x22c)](variantOffer);if(_0x299d06[_0x2922c3(0x1f5)]===0x1)_0x48c2f1['offers']=_0x299d06[0x0];else{if(_0x299d06[_0x2922c3(0x1f5)]>0x1)_0x48c2f1[_0x2922c3(0x217)]=_0x299d06;}return _0x48c2f1;}function buildRestaurantJsonLd(_0x5db8b8,_0x337504){const _0x1074dd=a0_0x47ed54,_0x57c2f5={'UVmUc':_0x1074dd(0x1af),'xrbwJ':_0x1074dd(0x1b8),'rXSOc':_0x1074dd(0x261)},_0x31a58c=_0x5db8b8[_0x1074dd(0x1f8)][_0x1074dd(0x22c)](_0x1e8bb8=>{const _0x14490a=_0x1074dd,_0xd571fe={'@type':_0x14490a(0x1ee),'name':_0x1e8bb8[_0x14490a(0x1d1)]},_0x5d15dc=_0x5db8b8[_0x14490a(0x232)][_0x14490a(0x205)](_0x3d5229=>_0x3d5229[_0x14490a(0x20a)]===_0x1e8bb8[_0x14490a(0x20a)])[_0x14490a(0x22c)](menuItemNode);if(_0x5d15dc[_0x14490a(0x1f5)])_0xd571fe[_0x14490a(0x1cd)]=_0x5d15dc;return _0xd571fe;}),_0x5d3373={'@context':_0x57c2f5[_0x1074dd(0x1d9)],'@type':_0x57c2f5[_0x1074dd(0x1f4)],'name':_0x337504[_0x1074dd(0x1d1)]};if(_0x337504[_0x1074dd(0x1ba)])_0x5d3373['url']=_0x337504['url'];if(_0x337504[_0x1074dd(0x1a8)])_0x5d3373[_0x1074dd(0x1a8)]=_0x337504[_0x1074dd(0x1a8)];if(_0x337504[_0x1074dd(0x21f)])_0x5d3373[_0x1074dd(0x21f)]=_0x337504[_0x1074dd(0x21f)];if(_0x337504[_0x1074dd(0x223)]?.[_0x1074dd(0x1f5)])_0x5d3373[_0x1074dd(0x223)]=_0x337504[_0x1074dd(0x223)];return _0x5d3373[_0x1074dd(0x213)]={'@type':_0x57c2f5[_0x1074dd(0x200)],'name':_0x57c2f5[_0x1074dd(0x200)],'hasMenuSection':_0x31a58c},_0x5d3373;}function apiBaseUrl(){const _0x2eeb9b=a0_0x47ed54,_0x50d9b5={'pvFyL':_0x2eeb9b(0x1a2)};return process.env.NEXT_PUBLIC_API_BASE_URL??_0x50d9b5[_0x2eeb9b(0x1e5)];}var SiteTokenError=class extends Error{[a0_0x47ed54(0x1a7)];constructor(_0x1f1c06,_0xfedb97,_0x43c164){const _0x16002e=a0_0x47ed54,_0x3357e8={'SZOlZ':_0x16002e(0x20e)};super(_0xfedb97,_0x43c164),this[_0x16002e(0x1d1)]=_0x3357e8[_0x16002e(0x1d0)],this[_0x16002e(0x1a7)]=_0x1f1c06;}};async function fetchSiteToken(){const _0x3e4fbf=a0_0x47ed54,_0xd080da={'TEiBl':function(_0x5443a7,_0x2b231d){return _0x5443a7(_0x2b231d);},'eFaFC':_0x3e4fbf(0x203),'hwhLn':function(_0x48e885,_0x20e72c){return _0x48e885===_0x20e72c;},'WAoHF':function(_0xa00862){return _0xa00862();},'xSjXB':'POST'},_0x541f47=process.env.ZORGO_SITE_SECRET;if(!_0x541f47){if(_0xd080da[_0x3e4fbf(0x234)]('hpWCI',_0x3e4fbf(0x1cb)))throw new SiteTokenError('missing-secret','ZORGO_SITE_SECRET\x20is\x20not\x20set.\x20Add\x20it\x20to\x20this\x20site\x27s\x20.env.');else return _0x5718ae['round'](_0x3435ac*_0xd080da[_0x3e4fbf(0x235)](_0x1a1124,{'r':_0x4265b4,'g':_0x299819,'b':_0x2fa264}));}const _0x5b9ca0=_0xd080da[_0x3e4fbf(0x1d3)](apiBaseUrl)+_0x3e4fbf(0x25d);let _0x346b32;try{_0x346b32=await fetch(_0x5b9ca0,{'method':_0xd080da['xSjXB'],'headers':{'x-zorgo-site-secret':_0x541f47}});}catch(_0xc7590f){if('zLrmo'!==_0x3e4fbf(0x263))throw new SiteTokenError(_0x3e4fbf(0x1dc),_0x3e4fbf(0x241)+_0x5b9ca0+_0x3e4fbf(0x218),{'cause':_0xc7590f});else return{'@type':_0x3e4fbf(0x23f),'price':HPhkjl[_0x3e4fbf(0x235)](_0x409270,_0x378eb1[_0x3e4fbf(0x1c4)]??_0x759343[_0x3e4fbf(0x21c)]),'priceCurrency':HPhkjl[_0x3e4fbf(0x1ce)]};}if(!_0x346b32['ok']){const _0x43f725=(await _0x346b32[_0x3e4fbf(0x1b2)]()[_0x3e4fbf(0x1ff)](()=>''))[_0x3e4fbf(0x22a)](0x0,0xc8);throw new SiteTokenError(_0x3e4fbf(0x1f1),'The\x20site-token\x20endpoint\x20rejected\x20the\x20request\x20('+_0x346b32['status']+'\x20'+_0x346b32[_0x3e4fbf(0x1eb)]+_0x3e4fbf(0x239)+_0x5b9ca0+_0x3e4fbf(0x250)+(_0x43f725?'\x20Response:\x20'+_0x43f725:''));}const {token:_0x530cb5}=await _0x346b32[_0x3e4fbf(0x248)]();if(!_0x530cb5)throw new SiteTokenError(_0x3e4fbf(0x1f1),_0x3e4fbf(0x1e6)+_0x5b9ca0+'.');return _0x530cb5;}var BrandingSchema=import_zod['z'][a0_0x47ed54(0x21e)]({'backgroundBase':import_zod['z'][a0_0x47ed54(0x253)]()[a0_0x47ed54(0x212)](a0_0x47ed54(0x1ec)),'primary':import_zod['z'][a0_0x47ed54(0x253)]()[a0_0x47ed54(0x212)]('#3264FF'),'accent':import_zod['z']['string']()[a0_0x47ed54(0x212)](a0_0x47ed54(0x251)),'fontFamily':import_zod['z']['string']()[a0_0x47ed54(0x212)]('Inter')})[a0_0x47ed54(0x1c2)]({}),FranchiseSchema=import_zod['z'][a0_0x47ed54(0x21e)]({'name':import_zod['z'][a0_0x47ed54(0x253)]()[a0_0x47ed54(0x1b9)]()['transform'](_0x2324b0=>_0x2324b0??process.env.ZORGO_PROJECT_NAME??a0_0x47ed54(0x1b8)),'site_url':import_zod['z'][a0_0x47ed54(0x253)]()['nullish']()[a0_0x47ed54(0x1b4)](_0x51df10=>_0x51df10??void 0x0)})[a0_0x47ed54(0x1c2)]({}),HoursSchema=import_zod['z'][a0_0x47ed54(0x257)](import_zod['z'][a0_0x47ed54(0x249)]())[a0_0x47ed54(0x1c2)]([]),MenuSchema=import_zod['z'][a0_0x47ed54(0x21e)]({'items':import_zod['z']['array'](import_zod['z'][a0_0x47ed54(0x249)]())[a0_0x47ed54(0x212)]([]),'categories':import_zod['z'][a0_0x47ed54(0x257)](import_zod['z']['unknown']())['default']([]),'components':import_zod['z'][a0_0x47ed54(0x257)](import_zod['z'][a0_0x47ed54(0x249)]())[a0_0x47ed54(0x212)]([]),'rules':import_zod['z'][a0_0x47ed54(0x257)](import_zod['z'][a0_0x47ed54(0x249)]())[a0_0x47ed54(0x212)]([])});async function fetchData(_0x34c14a,_0x1494f0,_0x418a65){const _0x2eb809=a0_0x47ed54;try{const _0x29d11e=await fetch(''+apiBaseUrl()+_0x34c14a,{'headers':{'Authorization':_0x2eb809(0x221)+_0x1494f0}});if(!_0x29d11e['ok'])throw new Error(_0x29d11e[_0x2eb809(0x252)]+':\x20'+await _0x29d11e[_0x2eb809(0x1b2)]());const _0x2c81d8=await _0x29d11e[_0x2eb809(0x248)]();return _0x418a65[_0x2eb809(0x1fc)](_0x2c81d8?.[_0x2eb809(0x1d6)]??_0x2c81d8);}catch(_0x107b9e){return console[_0x2eb809(0x1ed)](_0x2eb809(0x1c5)+_0x34c14a+_0x2eb809(0x1aa),_0x107b9e),_0x418a65['parse'](void 0x0);}}var FONT_ON_LIGHT='#0a0a0a',FONT_ON_DARK='#f5f5f5',BACKGROUND_SURFACE_DELTA=0xf,BACKGROUND_TEMPERATURE_BIAS=0x8;function parseHexRgb(_0x307def){const _0x7e28fc=a0_0x47ed54,_0x2c4905={'HUbLg':function(_0x558782,_0x40ee4e){return _0x558782(_0x40ee4e);},'mUDyU':function(_0x59e220,_0x532dbd){return _0x59e220!==_0x532dbd;},'TWVgX':_0x7e28fc(0x1fb)},_0x214326=_0x307def[_0x7e28fc(0x1bf)]()['replace'](/^#/,''),_0x51c219=_0x214326[_0x7e28fc(0x1f5)]===0x3?_0x214326['split']('')[_0x7e28fc(0x22c)](_0x5b210f=>_0x5b210f+_0x5b210f)['join'](''):_0x214326;if(_0x2c4905['mUDyU'](_0x51c219['length'],0x6)||Number[_0x7e28fc(0x228)](Number[_0x7e28fc(0x227)](_0x51c219,0x10))){if(_0x2c4905[_0x7e28fc(0x1d2)](_0x7e28fc(0x1b5),_0x2c4905['TWVgX']))return null;else{const _0x2b1e90=_0x7f7e3d[_0x7e28fc(0x22b)][_0x7e28fc(0x214)](/ /g,'+'),_0x13ba79=_0x2c4905[_0x7e28fc(0x25e)](_0x5374af,_0x20d8bb[_0x7e28fc(0x1c8)]),_0x3fad38=_0x3c4aaa(_0x442b7b[_0x7e28fc(0x1d5)]),_0x2e88d2=_0x1efcce(_0x3d7625['accent']),_0x16242b=_0x2c4905['HUbLg'](_0x35f17f,_0x11af9a[_0x7e28fc(0x1c8)]),_0x3dc196=_0x3fbf3b(_0xd56c87[_0x7e28fc(0x1c8)]);return _0x7e28fc(0x240)+_0x2b1e90+_0x7e28fc(0x231)+_0x1a0617[_0x7e28fc(0x1c8)]+_0x7e28fc(0x25f)+_0x16242b+_0x7e28fc(0x1a6)+_0x3dc196+_0x7e28fc(0x24f)+_0x13ba79+_0x7e28fc(0x262)+_0x1ead19[_0x7e28fc(0x1d5)]+_0x7e28fc(0x1d8)+_0x3fad38+';\x0a\x20\x20--accent:\x20'+_0x1e5e74[_0x7e28fc(0x1e9)]+_0x7e28fc(0x22e)+_0x2e88d2+_0x7e28fc(0x1ab)+_0xd7d28a[_0x7e28fc(0x22b)]+_0x7e28fc(0x215);}}return{'r':Number[_0x7e28fc(0x227)](_0x51c219['slice'](0x0,0x2),0x10),'g':Number[_0x7e28fc(0x227)](_0x51c219[_0x7e28fc(0x22a)](0x2,0x4),0x10),'b':Number[_0x7e28fc(0x227)](_0x51c219[_0x7e28fc(0x22a)](0x4,0x6),0x10)};}function toHex({r:_0x459746,g:_0x1a8b99,b:_0x335985}){const _0x15a5b4=a0_0x47ed54;return'#'+[_0x459746,_0x1a8b99,_0x335985][_0x15a5b4(0x22c)](_0x227b45=>_0x227b45[_0x15a5b4(0x1c6)](0x10)[_0x15a5b4(0x21d)](0x2,'0'))[_0x15a5b4(0x1e2)]('');}function relativeLuminance({r:_0x331ac5,g:_0x45e617,b:_0x2cf186}){const _0x4f23ed=a0_0x47ed54,_0x162147={'AQmpo':function(_0x20bdf1,_0x17a9a4){return _0x20bdf1+_0x17a9a4;},'mYWrS':function(_0x3ae3e0,_0x139b72){return _0x3ae3e0*_0x139b72;}};return _0x162147[_0x4f23ed(0x1e7)](0.299*_0x331ac5+_0x162147[_0x4f23ed(0x245)](0.587,_0x45e617),0.114*_0x2cf186)/0xff;}function temperatureBiasFor({r:_0x185a35,g:_0x5a7e3e,b:_0xec176a}){const _0x5a34df=a0_0x47ed54,_0x4f49ff={'EDmQt':function(_0x3dd24e,_0x41a805){return _0x3dd24e*_0x41a805;}};return Math[_0x5a34df(0x1da)](_0x4f49ff[_0x5a34df(0x1c9)](BACKGROUND_TEMPERATURE_BIAS,relativeLuminance({'r':_0x185a35,'g':_0x5a7e3e,'b':_0xec176a})));}function deriveFontColor(_0xc2b4ca){const _0x49114c=a0_0x47ed54,_0x287a24={'ISRYc':function(_0x2c25e,_0x19486b){return _0x2c25e(_0x19486b);},'MNPli':function(_0x2180af,_0x337f67){return _0x2180af>_0x337f67;},'LHIsU':function(_0x42bb90,_0x590d91){return _0x42bb90(_0x590d91);}},_0x5b832f=_0x287a24['ISRYc'](parseHexRgb,_0xc2b4ca);if(!_0x5b832f)return FONT_ON_LIGHT;return _0x287a24['MNPli'](_0x287a24[_0x49114c(0x201)](relativeLuminance,_0x5b832f),0.5)?FONT_ON_LIGHT:FONT_ON_DARK;}function deriveElevatedBackground(_0x4a6e3b){const _0x417e91=a0_0x47ed54,_0x365de2={'pgMzy':function(_0x1964d6,_0x2b7878){return _0x1964d6(_0x2b7878);},'qdeDE':function(_0x477c65,_0x6a824f){return _0x477c65+_0x6a824f;},'TivCV':function(_0x5ca3fe,_0x24c16a){return _0x5ca3fe-_0x24c16a;}},_0x5707e3=parseHexRgb(_0x4a6e3b);if(!_0x5707e3)return _0x4a6e3b;const _0x581b4b=temperatureBiasFor(_0x5707e3),_0x139cbd=Math['round'](_0x581b4b/0x4);return _0x365de2['pgMzy'](toHex,{'r':Math[_0x417e91(0x23d)](0xff,_0x365de2[_0x417e91(0x206)](_0x5707e3['r']+BACKGROUND_SURFACE_DELTA,_0x139cbd)),'g':Math[_0x417e91(0x23d)](0xff,_0x5707e3['g']+BACKGROUND_SURFACE_DELTA),'b':Math['min'](0xff,_0x365de2['TivCV'](_0x365de2[_0x417e91(0x206)](_0x5707e3['b'],BACKGROUND_SURFACE_DELTA),_0x581b4b))});}function deriveRecessedBackground(_0x3090b8){const _0x4e8fb9=a0_0x47ed54,_0x4f1d80={'ajtbz':function(_0x41afbe,_0x86b330){return _0x41afbe(_0x86b330);},'IrVMh':function(_0xca9854,_0x4e2a06){return _0xca9854/_0x4e2a06;},'ZIUTH':function(_0x1afe47,_0x5d5851){return _0x1afe47-_0x5d5851;}},_0x124514=_0x4f1d80[_0x4e8fb9(0x1cc)](parseHexRgb,_0x3090b8);if(!_0x124514)return _0x3090b8;const _0x524b48=temperatureBiasFor(_0x124514),_0x2858ef=Math[_0x4e8fb9(0x1da)](_0x4f1d80[_0x4e8fb9(0x25c)](_0x524b48,0x4));return _0x4f1d80[_0x4e8fb9(0x1cc)](toHex,{'r':Math['max'](0x0,_0x4f1d80['ZIUTH'](_0x4f1d80[_0x4e8fb9(0x1bd)](_0x124514['r'],BACKGROUND_SURFACE_DELTA),_0x2858ef)),'g':Math[_0x4e8fb9(0x224)](0x0,_0x124514['g']-BACKGROUND_SURFACE_DELTA),'b':Math[_0x4e8fb9(0x224)](0x0,_0x124514['b']-BACKGROUND_SURFACE_DELTA+_0x524b48)});}function writeWranglerToml(){const _0x3875a4=a0_0x47ed54,_0x248444={'UpJYw':_0x3875a4(0x24a),'uOorD':_0x3875a4(0x226),'YfTlu':_0x3875a4(0x25a),'ymaYD':_0x3875a4(0x244)},_0xe90dbb=process.env.ZORGO_PROJECT_NAME??_0x248444[_0x3875a4(0x1e8)],_0x52e381=process.env.NEXT_PUBLIC_SITE_URL??'',_0x32d6b6=process.env.NEXT_PUBLIC_API_BASE_URL??'',_0x109404=process.env.NEXT_PUBLIC_BASE_URL??_0x52e381,_0x84e5d9=process.env.NEXT_PUBLIC_SUPABASE_URL??'';let _0x5a93b6;try{if(_0x248444[_0x3875a4(0x22d)]===_0x3875a4(0x246))throw new _0x3179b2(_0x3875a4(0x1dd),JAABZz['UpJYw']);else _0x5a93b6=new URL(_0x52e381)[_0x3875a4(0x1f3)];}catch{_0x5a93b6=void 0x0;}const _0x24130b=_0x5a93b6?_0x3875a4(0x1e3)+_0x5a93b6+_0x3875a4(0x24c)+_0x5a93b6+_0x3875a4(0x1a4):'',_0x31724c={'NEXT_PUBLIC_SUPABASE_URL':_0x84e5d9,'NEXT_PUBLIC_API_BASE_URL':_0x32d6b6,'NEXT_PUBLIC_SITE_URL':_0x52e381,'NEXT_PUBLIC_BASE_URL':_0x109404},_0x19b071=Object[_0x3875a4(0x1ca)](_0x31724c)[_0x3875a4(0x205)](([,_0x5bbd21])=>_0x5bbd21!=='')['map'](([_0x52a7f4,_0x384c15])=>_0x52a7f4+_0x3875a4(0x1fe)+_0x384c15+'\x22')[_0x3875a4(0x1e2)]('\x0a'),_0x2b57be='#\x20AUTO-GENERATED\x20by\x20scripts/prebuild.ts\x20from\x20.env\x20—\x20do\x20not\x20edit.\x0aname\x20=\x20\x22'+_0xe90dbb+_0x3875a4(0x23b)+_0x19b071+_0x3875a4(0x1ea)+_0x24130b;(0x0,import_fs[_0x3875a4(0x225)])(import_path[_0x3875a4(0x212)][_0x3875a4(0x1e2)](process[_0x3875a4(0x1b1)](),_0x248444[_0x3875a4(0x1ae)]),_0x2b57be);}async function logo({franchiseId:_0x594f2b,token:_0x2fafe4}){const _0x4355f8=a0_0x47ed54,_0x1f6ce5={'nSxel':function(_0x2cc1c9){return _0x2cc1c9();},'KOzZC':_0x4355f8(0x1a1)},_0x1e7a46=await fetch(_0x1f6ce5['nSxel'](apiBaseUrl)+_0x4355f8(0x25b)+_0x594f2b,{'headers':{'Authorization':_0x4355f8(0x221)+_0x2fafe4}});if(!_0x1e7a46['ok'])return;const _0xae5a12=await _0x1e7a46[_0x4355f8(0x24b)](),_0x585814=Buffer['from'](_0xae5a12),_0x173a13=import_path[_0x4355f8(0x212)][_0x4355f8(0x1e2)](process[_0x4355f8(0x1b1)](),_0x4355f8(0x1c1));(0x0,import_fs[_0x4355f8(0x243)])(_0x173a13,{'recursive':!![]}),(0x0,import_fs[_0x4355f8(0x225)])(import_path[_0x4355f8(0x212)][_0x4355f8(0x1e2)](_0x173a13,_0x1f6ce5['KOzZC']),_0x585814),(0x0,import_fs[_0x4355f8(0x225)])(import_path['default'][_0x4355f8(0x1e2)](_0x173a13,'logo.jpg'),_0x585814);}function a0_0x5037(_0x247e46,_0x4bea13){_0x247e46=_0x247e46-0x1a0;const _0x57339e=a0_0x5733();let _0x50374a=_0x57339e[_0x247e46];if(a0_0x5037['IoZvLc']===undefined){var _0x12c847=function(_0x8c89ea){const _0x43f5ba='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x52f510='',_0x364095='';for(let _0x36af06=0x0,_0x3dcc3b,_0x405107,_0x26c974=0x0;_0x405107=_0x8c89ea['charAt'](_0x26c974++);~_0x405107&&(_0x3dcc3b=_0x36af06%0x4?_0x3dcc3b*0x40+_0x405107:_0x405107,_0x36af06++%0x4)?_0x52f510+=String['fromCharCode'](0xff&_0x3dcc3b>>(-0x2*_0x36af06&0x6)):0x0){_0x405107=_0x43f5ba['indexOf'](_0x405107);}for(let _0x3a4853=0x0,_0x3ca639=_0x52f510['length'];_0x3a4853<_0x3ca639;_0x3a4853++){_0x364095+='%'+('00'+_0x52f510['charCodeAt'](_0x3a4853)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x364095);};a0_0x5037['IjiipM']=_0x12c847,a0_0x5037['lKFeAe']={},a0_0x5037['IoZvLc']=!![];}const _0x499b19=_0x57339e[0x0],_0x49d480=_0x247e46+_0x499b19,_0x384b63=a0_0x5037['lKFeAe'][_0x49d480];return!_0x384b63?(_0x50374a=a0_0x5037['IjiipM'](_0x50374a),a0_0x5037['lKFeAe'][_0x49d480]=_0x50374a):_0x50374a=_0x384b63,_0x50374a;}function a0_0x5733(){const _0x327c29=['zNjVBq','vvne','qvLQtfG','zMLSDgvY','CwrLreu','u2jZC2C','l2zYyw5JAgLZzs1PBMzVl2zYyw5JAgLZzs8','BgLIl2DLBMvYyxrLzc8','y2f0zwDVCNLFAwq','CNvUBMLUzYbWCMvIDwLSzcbZy3jPChqUlI4','l2zYyw5JAgLZzs1PBMzVl21LBNuV','mti4nZGYmLj3qLHbAq','u2L0zvrVA2vUrxjYB3i','BwvUDs50CW','twrHqNm','zNjHBMnOAxnLx2LKCW','zgvMyxvSDa','AgfZtwvUDq','CMvWBgfJzq','iIWGC2fUCY1ZzxjPzJSkFqOkqhrOzw1LigLUBgLUzsb7cIaGls1JB2XVCI1IywnRz3jVDw5KoIb2yxiOls1IywnRz3jVDw5KktSkicaTlwnVBg9YlwjHy2TNCM91BMqTzwXLDMf0zwq6ihzHCIGTlwjHy2TNCM91BMqTzwXLDMf0zwqPoWOGic0Ty29SB3iTyMfJA2DYB3vUzc1YzwnLC3nLzdOGDMfYkc0TyMfJA2DYB3vUzc1YzwnLC3nLzcK7cIaGls1JB2XVCI1MB3jLz3jVDw5KoIb2yxiOls1MB3jLz3jVDw5KktSkicaTlwnVBg9YlxbYAw1HCNK6ihzHCIGTlxbYAw1HCNKPoWOGic0Ty29SB3iTChjPBwfYEs1MB3jLz3jVDw5KoIb2yxiOls1WCMLTyxj5lwzVCMvNCM91BMqPoWOGic0Ty29SB3iTywnJzw50oIb2yxiOls1Hy2nLBNqPoWOGic0Ty29SB3iTywnJzw50lwzVCMvNCM91BMq6ihzHCIGTlwfJy2vUDc1MB3jLz3jVDw5KktSkicaTlwzVBNqTC2fUCZOGDMfYkc0TzM9UDc1Zyw5ZktSkFqOkqgXHEwvYigjHC2uGEWOGigj1DhrVBIWkicbBDhLWzt0IyNv0Dg9UiL0ScIaGw3r5Cgu9iNn1yM1PDcjDlaOGifT0ExbLpsjYzxnLDcjDihSkicaGign1CNnVCJOGCg9PBNrLCJSkicb9cGOGigj1DhrVBJPKAxnHyMXLzcWkicbBDhLWzt0IyNv0Dg9UiL06zgLZywjSzwqScIaGw3r5Cgu9iNn1yM1PDcjDoMrPC2fIBgvKlaOGifT0ExbLpsjYzxnLDcjDoMrPC2fIBgvKihSkicaGign1CNnVCJOGBM90lwfSBg93zwq7cIaGFqP9cG','Bg9N','B2zMzxjZ','lIbdAgvJAYborvHux1bvqKXjq19bueLFqKftrv9vuKWGyw5KihrOyxqGDgHLiefqssbPCYbYDw5UAw5NlG','yMfZzty0DxjS','Bg9HzevUDKnVBMzPzW','BwvUDsbMzxrJAcbMywLSzwqG','ChjPy2u','CgfKu3rHCNq','B2jQzwn0','zgvZy3jPChrPB24','D2Pxu2u','qMvHCMvYia','Dvvnzeq','C2vYDMvZq3vPC2LUzq','Bwf4','D3jPDgvgAwXLu3LUyW','EM9Yz28TC2L0zq','CgfYC2vjBNq','Axnoyu4','wKXVDM8','C2XPy2u','zM9UDezHBwLSEq','BwfW','wwzuBhu','oWOGic0TywnJzw50lwzVCMvNCM91BMq6ia','y2fSBa','C2L0zsb0B2TLBIbPCYbUB3qGysb3zwXSlwzVCM1Lzcbkv1qGkg5VihbHEwXVywqGC2vNBwvUDcK','oNDNAhrandaWoZCWmczKAxnWBgf5pxn3yxaIktSkqgLTCg9YDcaIDgfPBhDPBMrJC3mIoWOVkIbuywLSD2LUzcb2ncbZA2LWCYbUB2rLx21VzhvSzxm7ieb6B3jNBY9UzxH0ihnOAxbZihvUlw9IzNvZy2f0zwqGy29TCg9Uzw50CYbZBWOGicb0AgvPCIbJBgfZCYbUyw1LCYbHCMuGC2nHBM5HyMXLigHLCMuUicOVcKbZB3vYy2uGiI4Ul25VzgvFBw9KDwXLCY9aEM9Yz28VBMv4Dc9KAxn0l2nVBxbVBMvUDhmUBwPZiJSkcJPYB290ihSkicaTlwjHy2TNCM91BMq6ia','AxrLBxm','lY8GqvvutY1hru5fuKfuruqGyNKGC2nYAxb0CY9WCMvIDwLSzc50CYdIGjqGzg8GBM90igvKAxqUcMLTCg9YDcb0ExbLihSGtwvUDsb9igzYB20GiKb6B3jNBY9UzxH0iJSkcMv4Cg9YDcbJB25ZDcbTzw51id0G','AhDOtg4','vevPqMW','mJi4otyYmgXvr0PLyG','nMXyDK54qW','zNvUy3rPB24','ksbHDca','igfZihvUA25VD24GyxmGtwvUDtSk','iGPTywLUid0GiI5VCgvUlw5LEhqVD29YA2vYlMPZiGPJB21WyxrPyMLSAxr5x2rHDguGpsaImJaYnc0Wos0YmYiky29TCgf0AwjPBgL0Ev9MBgfNCYa9ifSIBM9KzwPZx2nVBxbHDcjDcGOJiej1BMrSzxmGDgHLienSB3vKzMXHCMuGD29YA2vYigfZihbHCNqGB2yGyhDYyw5NBgvYigrLCgXVEwaGkgfUzcbGD3jHBMDSzxiGzgv2ycKScImGC28GDgHLigrLCgXVEsbJB21Tyw5Kihn0yxLZigeGCgXHAw4GyhDYyw5NBgvYigrLCgXVEwaUihbYzwj1AwXKicH3AgLJAcb3CML0zxmkiYb0AgLZigzPBguGkYbSAwiVz2vUzxjHDgvKksbTDxn0ihn0AwXSihj1BIbMAxjZDcdIGjqGB24Gq2XVDwrMBgfYzsbxB3jRzxjZiej1AwXKCWOJihrOyxqGAxmGDgHLihbYB2PLy3qNCYbcDwLSzcbJB21Tyw5KoYbSB2nHBgX5igL0igLZihrOzsbUCg0GC2nYAxb0CYbIzwXVDY4kw2j1AwXKxqPJB21Tyw5Kid0GiM5WEcbVCgvUBMv4DgPZlwnSB3vKzMXHCMuGyNvPBgqIcGPByxnZzxrZxqPKAxjLy3rVCNKGpsaIlM9Wzw4TBMv4Dc9HC3nLDhmIcMjPBMrPBMCGpsaIqvntrvrtiGOkw3zHCNnDcG','rxHYy1O','BwLU','C3r5BgvZlMPZB24','t2zMzxi','cKbPBxbVCNqGDxjSkcjODhrWCZOVl2zVBNrZlMDVB2DSzwfWAxmUy29Tl2nZCZi/zMfTAwX5pq','q291BgqGBM90ihjLywnOihrOzsbZAxrLlxrVA2vUigvUzhbVAw50igf0ia','Bg9NBYbMywLSzwq6','BwTKAxjtEw5J','D3jHBMDSzxiUDg9TBa','BvLxCLm','Ae5uDLi','mJu1nZGWourgAfzztq','ANnVBG','Dw5RBM93BG','wK9sr09Fu0Lurv9trunsrvqGAxmGBM90ihnLDc4GqwrKigL0ihrVihrOAxmGC2L0zsDZic5LBNyU','yxjYyxLcDwzMzxi','iGPJDxn0B21Fzg9TywLUid0GDhj1zqOkw1TYB3v0zxnDxqPWyxr0zxjUid0GiND3DY4','C3bSAxq','ANnVBMXKlNrZ','oWOGic0TzM9YzwDYB3vUzdOG','lIbuAgLZihvZDwfSBhKGBwvHBNmGwK9sr09Fu0Lurv9trunsrvqGAxmGD3jVBMCGzM9YihrOAxmGzw52AxjVBM1LBNqU','iZK2otzgrG','C3rHDhvZ','C3rYAw5N','AvDqvM8','mJK5mdHHrxfUrMq','l2zYyw5JAgLZzs1PBMzVl3n0EwXLCY8','yxjYyxK','ALvUrhu','oWOGic0TywnJzw50oIa','tejJCeq','l2zYyw5JAgLZzs1PBMzVl2XVz28V','sxjwtwG','l2f1DgGVC2L0zs10B2TLBG','sfvItgC','oWOGic0TyMfJA2DYB3vUzc1LBgv2yxrLzdOG','D2fYBG','twvUDq','oWOGic0TChjPBwfYEtOG','r3H5BxG','y1bJz2O','mtiWnZCYvvv3uwLI','Ag91CNmGzMfPBgvKoG','Bg9NBY5WBMC','Ahr0CdOVl2XVy2fSAg9ZDdOZmdaW','AwLXuu4','iGPJDxn0B21Fzg9TywLUid0GDhj1zqO','AM1vu3i','oWOGic0TyMfJA2DYB3vUzc1YzwnLC3nLzdOG','CMvHC29U','Aw1Hz2u','y3jLyxrL','igzHAwXLzcWGDxnPBMCGzgvMyxvSDhm6','oWOGic0TzM9UDc1Zyw5ZoIaI','mtbMqwXSB2i','B2zsz3K','Ew1Hwuq','Ahr0Chm6lY9Zy2HLBweUB3jN','zhLKwum','y3DK','Dgv4Da','De5VBgy','DhjHBNnMB3jT','Cwn0BMm','z2v0uhjVDg90ExbLt2y','sKXkC0W','uMvZDgf1CMfUDa','BNvSBgLZAa','DxjS','mJG1odCZmgj2ANvhDq','x19LC01VzhvSzq','wKLvveG','ANnVBKXKigzHAwXLzdO','DhjPBq','C3rYAw5NAwz5','ChvIBgLJl2LTywDLCY8','ChjLzMf1Bhq','yLjeALe','zgLZCgXHEv9WCMLJzq','ChjLyNvPBgq6ia','Dg9tDhjPBMC','mtiZC0rAuwzz','yMfJA2DYB3vUzejHC2u','rurTuxq','zw50CMLLCW','Ahbxq0K','ywP0yNO','AgfZtwvUDuL0zw0','zuzHrKm','EM9K','u1PpBfO','BMfTzq','BvveEvu','v0fVsey','B2TNuMO','ChjPBwfYEq','zgf0yq','l2zYyw5JAgLZzs1PBMzVl2HVDxjZlW','oWOGic0TChjPBwfYEs1MB3jLz3jVDw5KoIa','vvzTvwm','CM91BMq','zw5KC1DPDgG','Dw5YzwfJAgfIBgu','BwLZC2LUzY1ZzwnYzxq','otK4mdCYqunSyu9W','Cgf0Aa','twvUDuL0zw0','C2L0zv91CMW','AM9PBG','cLTBCM91DgvZxv0kCgf0DgvYBIa9ici','CNnKDg4','ChzgEuW','vgHLihnPDguTDg9Rzw4Gzw5KCg9PBNqGCMv0DxjUzwqGmJaWigj1DcbUBYb0B2TLBIbHDca','qvfTCg8','Du9VCKq','ywnJzw50','cGPBB2jZzxj2ywjPBgL0Ev0kzw5HyMXLzca9ihrYDwukcLTVyNnLCNzHyMLSAxr5lMXVz3nDcMvUywjSzwqGpsb0CNvLcMLUDM9JyxrPB25FBg9NCYa9ihrYDwuk','C3rHDhvZvgv4Da','i0y1rJvgnq','zxjYB3i','twvUDvnLy3rPB24','zw51BwvYywjSzq','Dg9gAxHLza','CMvQzwn0zwq','zNHcBNq','Ag9ZDg5HBwu','EhjID0O','BgvUz3rO','ChjLyNvPBgqGC2nYAxb0ignVBxbSzxrLza','z2XVyMfSCY5JC3m','y2f0zwDVCMLLCW','ChjVDg90ExbL','ve9Xwe4','rxPjr04','CgfYC2u','shLmC0W','id0GiG','y2f0y2G','CLHtt2m','teHjC1u'];a0_0x5733=function(){return _0x327c29;};return a0_0x5733();}var dropHeavyColumns=(_0xa5b2b3,_0xd30e9)=>_0xa5b2b3[a0_0x47ed54(0x1db)]('_vector')||_0xa5b2b3[a0_0x47ed54(0x1db)]('_embedding')?void 0x0:_0xd30e9;function writeMenuModule(_0x5d2ae0){const _0x63f085=a0_0x47ed54,_0x1b97ce=import_path[_0x63f085(0x212)][_0x63f085(0x1e2)](process[_0x63f085(0x1b1)](),_0x63f085(0x209));(0x0,import_fs[_0x63f085(0x243)])(_0x1b97ce,{'recursive':!![]}),(0x0,import_fs[_0x63f085(0x225)])(import_path['default']['join'](_0x1b97ce,_0x63f085(0x20f)),_0x63f085(0x233)+JSON[_0x63f085(0x1c0)](_0x5d2ae0,dropHeavyColumns,0x2)+_0x63f085(0x23a));}async function menu({franchiseId:_0x38e5b9,token:_0x526a6b}){const _0x1634d9=a0_0x47ed54,_0x195096={'MdaBs':function(_0xa4cb19,_0x30b06d,_0xffe665){return _0xa4cb19(_0x30b06d,_0xffe665);},'bRDjQ':function(_0x3ce2e2){return _0x3ce2e2();},'KgpSy':_0x1634d9(0x1fa),'Sbssg':function(_0xf4dfcd,_0x38cb83){return _0xf4dfcd(_0x38cb83);}},_0x580ff7=await _0x195096[_0x1634d9(0x210)](fetch,_0x195096[_0x1634d9(0x1c3)](apiBaseUrl)+_0x1634d9(0x20c)+_0x38e5b9,{'headers':{'Authorization':'Bearer\x20'+_0x526a6b}});if(!_0x580ff7['ok'])throw new Error(_0x1634d9(0x21b)+_0x580ff7['status']+':\x20'+await _0x580ff7[_0x1634d9(0x1b2)]());const _0x2d5289=await _0x580ff7[_0x1634d9(0x248)](),_0x175b3f=MenuSchema[_0x1634d9(0x1fc)](_0x2d5289?.[_0x1634d9(0x1d6)]??{});if(_0x175b3f[_0x1634d9(0x232)][_0x1634d9(0x1f5)]===0x0){if(_0x1634d9(0x1b7)===_0x195096['KgpSy']){const _0x5a6118={'@type':_0x1634d9(0x1ee),'name':_0x28c4cf[_0x1634d9(0x1d1)]},_0x4553bd=_0x2ab6e1[_0x1634d9(0x232)][_0x1634d9(0x205)](_0x537e91=>_0x537e91[_0x1634d9(0x20a)]===_0x1518d4[_0x1634d9(0x20a)])[_0x1634d9(0x22c)](_0x1bcc3c);if(_0x4553bd[_0x1634d9(0x1f5)])_0x5a6118[_0x1634d9(0x1cd)]=_0x4553bd;return _0x5a6118;}else console[_0x1634d9(0x260)]('prebuild:\x20franchise\x20has\x20no\x20menu\x20items\x20yet\x20\u2014\x20generating\x20an\x20empty\x20menu.\x20Add\x20items\x20in\x20the\x20dashboard\x20and\x20rebuild\x20to\x20populate\x20the\x20storefront.');}return _0x195096[_0x1634d9(0x207)](writeMenuModule,_0x175b3f),_0x175b3f;}async function jsonLd({franchiseId:_0x3b4df5,token:_0x330054},_0x4883c2){const _0x47635b=a0_0x47ed54,_0x587fe6={'AYjLX':function(_0x3bc066,_0x554dfc,_0x56be03){return _0x3bc066(_0x554dfc,_0x56be03);},'dydYC':_0x47635b(0x24e)},_0x32bd6c=await fetchData(_0x47635b(0x208)+_0x3b4df5,_0x330054,FranchiseSchema),_0x49b7c9=_0x32bd6c[_0x47635b(0x1e1)],_0x118875=_0x587fe6[_0x47635b(0x204)](buildRestaurantJsonLd,_0x4883c2,{'name':_0x32bd6c[_0x47635b(0x1d1)],'url':_0x49b7c9,'image':_0x49b7c9?_0x49b7c9+'/images/logo.png':void 0x0}),_0x553907=import_path[_0x47635b(0x212)][_0x47635b(0x1e2)](process['cwd'](),_0x47635b(0x209));(0x0,import_fs[_0x47635b(0x243)])(_0x553907,{'recursive':!![]}),(0x0,import_fs[_0x47635b(0x225)])(import_path[_0x47635b(0x212)][_0x47635b(0x1e2)](_0x553907,_0x587fe6[_0x47635b(0x1b0)]),'//\x20AUTO-GENERATED\x20by\x20scripts/prebuild.ts\x20—\x20do\x20not\x20edit.\x0aexport\x20const\x20restaurantJsonLd\x20=\x20'+JSON['stringify'](_0x118875,null,0x2)+';\x0a');}async function hours({franchiseId:_0xe10478,token:_0x20bd31}){const _0x465a82=a0_0x47ed54,_0x4001b6={'iiqQN':function(_0x3acc7d,_0x23be02,_0x1a8a2f,_0x5eb972){return _0x3acc7d(_0x23be02,_0x1a8a2f,_0x5eb972);}};await _0x4001b6[_0x465a82(0x1a3)](fetchData,_0x465a82(0x1d7)+_0xe10478,_0x20bd31,HoursSchema);}async function styles({franchiseId:_0x28c57a,token:_0x517863}){const _0x2a3178=a0_0x47ed54,_0x3fdb0f={'HyLsL':function(_0x3a2086,_0x2f6983){return _0x3a2086(_0x2f6983);},'MmsvD':function(_0x4f5af6,_0x3acc7f){return _0x4f5af6(_0x3acc7f);},'wjWSe':'app'},_0x42f02f=await fetchData(_0x2a3178(0x256)+_0x28c57a,_0x517863,BrandingSchema),_0x3ee07f={..._0x42f02f,'backgroundElevated':_0x3fdb0f[_0x2a3178(0x1fd)](deriveElevatedBackground,_0x42f02f[_0x2a3178(0x1c8)]),'backgroundRecessed':deriveRecessedBackground(_0x42f02f[_0x2a3178(0x1c8)]),'foreground':_0x3fdb0f['HyLsL'](deriveFontColor,_0x42f02f[_0x2a3178(0x1c8)]),'primaryForeground':_0x3fdb0f[_0x2a3178(0x1fd)](deriveFontColor,_0x42f02f[_0x2a3178(0x1d5)]),'accentForeground':_0x3fdb0f['MmsvD'](deriveFontColor,_0x42f02f['accent'])},_0x424472=import_path[_0x2a3178(0x212)][_0x2a3178(0x1e2)](process[_0x2a3178(0x1b1)](),'public/styles/');(0x0,import_fs[_0x2a3178(0x243)])(_0x424472,{'recursive':!![]}),(0x0,import_fs[_0x2a3178(0x225)])(import_path[_0x2a3178(0x212)][_0x2a3178(0x1e2)](_0x424472,_0x2a3178(0x23e)),JSON[_0x2a3178(0x1c0)](_0x3ee07f,null,0x2)),(0x0,import_fs[_0x2a3178(0x225)])(import_path[_0x2a3178(0x212)][_0x2a3178(0x1e2)](process['cwd'](),_0x3fdb0f[_0x2a3178(0x220)],_0x2a3178(0x1f7)),buildGlobalsCss(_0x42f02f));}function buildGlobalsCss(_0x1b8938){const _0x5dd0cc=a0_0x47ed54,_0x4ec829={'cPcgj':function(_0x1005e3,_0x1edd36){return _0x1005e3(_0x1edd36);},'pzWiz':function(_0x432ad8,_0xe76eb9){return _0x432ad8(_0xe76eb9);},'rsdtn':function(_0x1bdf5e,_0x65d6bd){return _0x1bdf5e(_0x65d6bd);}},_0x2b5015=_0x1b8938[_0x5dd0cc(0x22b)][_0x5dd0cc(0x214)](/ /g,'+'),_0x18e2a5=deriveFontColor(_0x1b8938[_0x5dd0cc(0x1c8)]),_0x3b22a4=_0x4ec829[_0x5dd0cc(0x264)](deriveFontColor,_0x1b8938['primary']),_0x2d064f=deriveFontColor(_0x1b8938[_0x5dd0cc(0x1e9)]),_0x3e04c4=_0x4ec829['pzWiz'](deriveElevatedBackground,_0x1b8938[_0x5dd0cc(0x1c8)]),_0x452c1e=_0x4ec829[_0x5dd0cc(0x1e4)](deriveRecessedBackground,_0x1b8938[_0x5dd0cc(0x1c8)]);return _0x5dd0cc(0x240)+_0x2b5015+':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'+_0x1b8938[_0x5dd0cc(0x1c8)]+';\x0a\x20\x20--background-elevated:\x20'+_0x3e04c4+_0x5dd0cc(0x1a6)+_0x452c1e+_0x5dd0cc(0x24f)+_0x18e2a5+_0x5dd0cc(0x262)+_0x1b8938[_0x5dd0cc(0x1d5)]+_0x5dd0cc(0x1d8)+_0x3b22a4+_0x5dd0cc(0x259)+_0x1b8938[_0x5dd0cc(0x1e9)]+';\x0a\x20\x20--accent-foreground:\x20'+_0x2d064f+_0x5dd0cc(0x1ab)+_0x1b8938[_0x5dd0cc(0x22b)]+'\x22,\x20sans-serif;\x0a}\x0a\x0a@theme\x20inline\x20{\x0a\x20\x20--color-background:\x20var(--background);\x0a\x20\x20--color-background-elevated:\x20var(--background-elevated);\x0a\x20\x20--color-background-recessed:\x20var(--background-recessed);\x0a\x20\x20--color-foreground:\x20var(--foreground);\x0a\x20\x20--color-primary:\x20var(--primary);\x0a\x20\x20--color-primary-foreground:\x20var(--primary-foreground);\x0a\x20\x20--color-accent:\x20var(--accent);\x0a\x20\x20--color-accent-foreground:\x20var(--accent-foreground);\x0a\x20\x20--font-sans:\x20var(--font-sans);\x0a}\x0a\x0a@layer\x20base\x20{\x0a\x20\x20button,\x0a\x20\x20[type=\x22button\x22],\x0a\x20\x20[type=\x22submit\x22],\x0a\x20\x20[type=\x22reset\x22]\x20{\x0a\x20\x20\x20\x20cursor:\x20pointer;\x0a\x20\x20}\x0a\x0a\x20\x20button:disabled,\x0a\x20\x20[type=\x22button\x22]:disabled,\x0a\x20\x20[type=\x22submit\x22]:disabled,\x0a\x20\x20[type=\x22reset\x22]:disabled\x20{\x0a\x20\x20\x20\x20cursor:\x20not-allowed;\x0a\x20\x20}\x0a}\x0a';}async function runPrebuild(){const _0x505f6e=a0_0x47ed54,_0x3fc834={'ExrcZ':_0x505f6e(0x20b),'fxBnt':function(_0x38ad37){return _0x38ad37();},'jUnDu':function(_0x1724eb,_0x285827){return _0x1724eb(_0x285827);},'ofRgy':function(_0x5dbac4,_0x2b56ae,_0x54808d){return _0x5dbac4(_0x2b56ae,_0x54808d);}};console[_0x505f6e(0x216)](_0x3fc834[_0x505f6e(0x23c)]),(0x0,import_env[_0x505f6e(0x21a)])(process[_0x505f6e(0x1b1)]()),writeWranglerToml();const _0x24c0b8=await _0x3fc834[_0x505f6e(0x1f2)](fetchSiteToken),_0x3a24a0=_0x24c0b8[_0x505f6e(0x24d)]('.')[0x1];if(!_0x3a24a0)throw new Error(_0x505f6e(0x230));const _0x8749ea=JSON['parse'](Buffer[_0x505f6e(0x202)](_0x3a24a0,_0x505f6e(0x219))[_0x505f6e(0x1c6)]()),_0x497f98=_0x8749ea[_0x505f6e(0x211)][0x0],[_0x77ae22]=await Promise['all']([menu({'franchiseId':_0x497f98,'token':_0x24c0b8}),logo({'franchiseId':_0x497f98,'token':_0x24c0b8})[_0x505f6e(0x1ff)](_0x5c685d=>console[_0x505f6e(0x1ed)](_0x505f6e(0x242),_0x5c685d)),_0x3fc834[_0x505f6e(0x258)](hours,{'franchiseId':_0x497f98,'token':_0x24c0b8})[_0x505f6e(0x1ff)](_0x219c28=>console[_0x505f6e(0x1ed)](_0x505f6e(0x1a0),_0x219c28)),styles({'franchiseId':_0x497f98,'token':_0x24c0b8})[_0x505f6e(0x1ff)](_0x2848a9=>console['error']('styles\x20failed:',_0x2848a9))]);await _0x3fc834[_0x505f6e(0x1ad)](jsonLd,{'franchiseId':_0x497f98,'token':_0x24c0b8},_0x77ae22)[_0x505f6e(0x1ff)](_0x38e59a=>console[_0x505f6e(0x1ed)](_0x505f6e(0x1be),_0x38e59a)),console[_0x505f6e(0x216)](_0x505f6e(0x1f6));}0x0&&(module['exports']={'SiteTokenError':SiteTokenError,'fetchSiteToken':fetchSiteToken,'runPrebuild':runPrebuild});
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/server.ts
31
+ var server_exports = {};
32
+ __export(server_exports, {
33
+ SiteTokenError: () => SiteTokenError,
34
+ buildBrandingCss: () => buildBrandingCss,
35
+ buildWranglerToml: () => buildWranglerToml,
36
+ fetchSiteToken: () => fetchSiteToken,
37
+ runPrebuild: () => runPrebuild
38
+ });
39
+ module.exports = __toCommonJS(server_exports);
40
+ var import_fs2 = require("fs");
41
+ var import_path2 = __toESM(require("path"));
42
+ var import_env = require("@next/env");
43
+ var import_zod = require("zod");
44
+
45
+ // ../../node_modules/date-fns-tz/dist/esm/_lib/tzTokenizeDate/index.js
46
+ var testDateFormatted = new Intl.DateTimeFormat("en-US", {
47
+ hourCycle: "h23",
48
+ timeZone: "America/New_York",
49
+ year: "numeric",
50
+ month: "2-digit",
51
+ day: "2-digit",
52
+ hour: "2-digit",
53
+ minute: "2-digit",
54
+ second: "2-digit"
55
+ }).format(/* @__PURE__ */ new Date("2014-06-25T04:00:00.123Z"));
56
+
57
+ // ../../node_modules/date-fns-tz/dist/esm/format/formatters/index.js
58
+ var MILLISECONDS_IN_MINUTE = 60 * 1e3;
59
+
60
+ // ../zorgo/universal/utils/locationOrderingAvailability.ts
61
+ function wallTime(value) {
62
+ return value.replace(/[+-].*$/, "").trim().slice(0, 5);
63
+ }
64
+
65
+ // src/seo.ts
66
+ var DAYS = [
67
+ "Monday",
68
+ "Tuesday",
69
+ "Wednesday",
70
+ "Thursday",
71
+ "Friday",
72
+ "Saturday",
73
+ "Sunday"
74
+ ];
75
+ function restaurantId(info) {
76
+ return `${info.url ?? ""}#restaurant`;
77
+ }
78
+ function branchId(info, location) {
79
+ return `${info.url ?? ""}#location-${location.location_id}`;
80
+ }
81
+ function openingHoursSpecification(location) {
82
+ const byWindow = /* @__PURE__ */ new Map();
83
+ for (const day of DAYS) {
84
+ const key = day.toLowerCase();
85
+ const open = location[`${key}_open`];
86
+ const close = location[`${key}_close`];
87
+ if (!open || !close) continue;
88
+ const window = `${wallTime(open)}|${wallTime(close)}`;
89
+ byWindow.set(window, [...byWindow.get(window) ?? [], `https://schema.org/${day}`]);
90
+ }
91
+ return [...byWindow].map(([window, dayOfWeek]) => {
92
+ const [opens, closes] = window.split("|");
93
+ return { "@type": "OpeningHoursSpecification", dayOfWeek, opens, closes };
94
+ });
95
+ }
96
+ var US_ADDRESS = /^(.+),\s*([^,]+),\s*([A-Z]{2})\s+(\d{5}(?:-\d{4})?)(?:,\s*USA?)?$/;
97
+ function postalAddress(address) {
98
+ const match = US_ADDRESS.exec(address.trim());
99
+ if (!match) return address;
100
+ const [, streetAddress, addressLocality, addressRegion, postalCode] = match;
101
+ if (!streetAddress || !addressLocality || !addressRegion || !postalCode) return address;
102
+ return {
103
+ "@type": "PostalAddress",
104
+ streetAddress: streetAddress.trim(),
105
+ addressLocality: addressLocality.trim(),
106
+ addressRegion,
107
+ postalCode,
108
+ addressCountry: "US"
109
+ };
110
+ }
111
+ function locationFacts(location) {
112
+ const facts = {};
113
+ if (location.address) facts.address = postalAddress(location.address);
114
+ if (location.phone) facts.telephone = location.phone;
115
+ if (location.lat != null && location.lng != null) {
116
+ facts.geo = {
117
+ "@type": "GeoCoordinates",
118
+ latitude: location.lat,
119
+ longitude: location.lng
120
+ };
121
+ }
122
+ const hours = openingHoursSpecification(location);
123
+ if (hours.length) facts.openingHoursSpecification = hours;
124
+ return facts;
125
+ }
126
+ function priceString(cents) {
127
+ return (cents / 100).toFixed(2);
128
+ }
129
+ function variantOffer(variant) {
130
+ return {
131
+ "@type": "Offer",
132
+ price: priceString(variant.display_price ?? variant.price),
133
+ priceCurrency: "USD"
134
+ };
135
+ }
136
+ function menuItemNode(item) {
137
+ const node = {
138
+ "@type": "MenuItem",
139
+ name: item.name
140
+ };
141
+ if (item.description) node.description = item.description;
142
+ const offers = item.variants.map(variantOffer);
143
+ if (offers.length === 1) node.offers = offers[0];
144
+ else if (offers.length > 1) node.offers = offers;
145
+ return node;
146
+ }
147
+ function buildRestaurantJsonLd(menu2, info) {
148
+ const hasMenuSection = menu2.categories.map((category) => {
149
+ const section = {
150
+ "@type": "MenuSection",
151
+ name: category.name
152
+ };
153
+ const items = menu2.items.filter((item) => item.category_id === category.category_id).map(menuItemNode);
154
+ if (items.length) section.hasMenuItem = items;
155
+ return section;
156
+ });
157
+ const restaurant = {
158
+ "@context": "https://schema.org",
159
+ "@type": "Restaurant",
160
+ name: info.name
161
+ };
162
+ if (info.url) restaurant.url = info.url;
163
+ if (info.image) restaurant.image = info.image;
164
+ if (info.description) restaurant.description = info.description;
165
+ if (info.servesCuisine?.length) restaurant.servesCuisine = info.servesCuisine;
166
+ const locations2 = info.locations ?? [];
167
+ if (locations2.length === 1) {
168
+ Object.assign(restaurant, locationFacts(locations2[0]));
169
+ } else if (locations2.length > 1) {
170
+ restaurant["@id"] = restaurantId(info);
171
+ restaurant.subOrganization = locations2.map((location) => ({
172
+ "@type": "Restaurant",
173
+ "@id": branchId(info, location),
174
+ name: location.name
175
+ }));
176
+ }
177
+ restaurant.hasMenu = {
178
+ "@type": "Menu",
179
+ name: "Menu",
180
+ hasMenuSection
181
+ };
182
+ return restaurant;
183
+ }
184
+
185
+ // src/internal/images.ts
186
+ var import_fs = require("fs");
187
+ var import_promises = require("fs/promises");
188
+ var import_module = require("module");
189
+ var import_path = __toESM(require("path"));
190
+
191
+ // ../zorgo/universal/constants.ts
192
+ var SUPABASE_URL = process.env.NEXT_PUBLIC_SUPABASE_URL || process.env.EXPO_PUBLIC_SUPABASE_URL || "https://dhnpoxorllfdobwftkyb.supabase.co";
193
+ var SUPABASE_ANON_KEY = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY || process.env.EXPO_PUBLIC_SUPABASE_ANON_KEY || "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImRobnBveG9ybGxmZG9id2Z0a3liIiwicm9sZSI6ImFub24iLCJpYXQiOjE3MzkwNTQxMDgsImV4cCI6MjA1NDYzMDEwOH0.zI8PwbgKwijHZ1QmxJqmaPrFvg02w1vOY2Qcs7SddzI";
194
+ var API_BASE_URL = process.env.NODE_ENV === "production" ? "https://api.zorgotech.com" /* Production */ : "http://localhost:3000" /* Development */;
195
+
196
+ // ../zorgo/universal/utils/menuUtils.ts
197
+ var UNSORTED = Number.MAX_SAFE_INTEGER;
198
+ function menuImageUrl(image, absolute = false) {
199
+ if (!image) return null;
200
+ if (image.local_key && !absolute) return `/images/items/${image.local_key}`;
201
+ const path3 = image.processed_path ?? image.raw_path;
202
+ if (!path3) return null;
203
+ return `${SUPABASE_URL}/storage/v1/object/public/product-images/${path3}`;
204
+ }
205
+
206
+ // src/images.ts
207
+ var IMAGE_WIDTHS = [384, 640, 1080, 1920];
208
+ var ITEM_IMAGE_PREFIX = "/images/items/";
209
+
210
+ // src/internal/images.ts
211
+ var AVIF_QUALITY = 60;
212
+ var SITE_IMAGE_SOURCE_DIR = "assets/images";
213
+ var SOURCE_EXTENSIONS = /\.(jpe?g|png|webp|avif|tiff?|gif)$/i;
214
+ function loadSharp(root) {
215
+ for (const from of [root, process.cwd()]) {
216
+ try {
217
+ return (0, import_module.createRequire)(import_path.default.join(from, "package.json"))("sharp");
218
+ } catch (err) {
219
+ if (err.code !== "MODULE_NOT_FOUND") throw err;
220
+ }
221
+ }
222
+ throw new Error(
223
+ `sharp is not installed under ${root}. It is pinned in every scaffolded site's package.json \u2014 run an install there.`
224
+ );
225
+ }
226
+ function variantPath(outBase, width) {
227
+ return `${outBase}-${width}.avif`;
228
+ }
229
+ async function encodeLadder(source, outBase, sharp) {
230
+ (0, import_fs.mkdirSync)(import_path.default.dirname(outBase), { recursive: true });
231
+ for (const width of IMAGE_WIDTHS) {
232
+ await sharp(source).resize({ width, withoutEnlargement: true }).avif({ quality: AVIF_QUALITY }).toFile(variantPath(outBase, width));
233
+ }
234
+ }
235
+ function itemImageLocalKey(image) {
236
+ const storagePath = image.processed_path ?? image.raw_path;
237
+ if (!storagePath) return null;
238
+ return storagePath.replace(/\.[^./]+$/, "").replace(/[^a-zA-Z0-9_]+/g, "-").replace(/^-|-$/g, "");
239
+ }
240
+ async function materializeItemImage(image, root) {
241
+ const key = itemImageLocalKey(image);
242
+ if (!key) return null;
243
+ const outBase = import_path.default.join(root, "public", ITEM_IMAGE_PREFIX, key);
244
+ if (IMAGE_WIDTHS.every((width) => (0, import_fs.existsSync)(variantPath(outBase, width)))) return key;
245
+ const url = menuImageUrl(image, true);
246
+ if (!url) return null;
247
+ try {
248
+ const res = await fetch(url);
249
+ if (!res.ok) throw new Error(`${res.status} ${res.statusText}`);
250
+ await encodeLadder(Buffer.from(await res.arrayBuffer()), outBase, loadSharp(root));
251
+ return key;
252
+ } catch (err) {
253
+ console.error(`prebuild: image ${image.image_id} (${url}) failed:`, err);
254
+ return null;
255
+ }
256
+ }
257
+ async function stampItemImages(menu2, root) {
258
+ const images = menu2.items.flatMap((item) => item.images ?? []);
259
+ for (const image of images) {
260
+ image.local_key = await materializeItemImage(image, root);
261
+ }
262
+ const stamped = images.filter((image) => image.local_key).length;
263
+ if (images.length) {
264
+ console.log(`prebuild: ${stamped}/${images.length} item images localized`);
265
+ }
266
+ }
267
+ function collectSources(dir, prefix = "") {
268
+ return (0, import_fs.readdirSync)(dir, { withFileTypes: true }).flatMap((entry) => {
269
+ const rel = prefix ? `${prefix}/${entry.name}` : entry.name;
270
+ if (entry.isDirectory()) return collectSources(import_path.default.join(dir, entry.name), rel);
271
+ return SOURCE_EXTENSIONS.test(entry.name) ? [rel] : [];
272
+ });
273
+ }
274
+ function siteImageKey(relativePath) {
275
+ return relativePath.replace(/\.[^./]+$/, "").split("/").map((segment) => segment.replace(/[^a-zA-Z0-9_-]+/g, "-").replace(/^-|-$/g, "")).join("/");
276
+ }
277
+ function laddersAreFresh(sourcePath, outBase) {
278
+ const sourceMtime = (0, import_fs.statSync)(sourcePath).mtimeMs;
279
+ return IMAGE_WIDTHS.every((width) => {
280
+ const file = variantPath(outBase, width);
281
+ return (0, import_fs.existsSync)(file) && (0, import_fs.statSync)(file).mtimeMs >= sourceMtime;
282
+ });
283
+ }
284
+ async function optimizeSiteImages(root) {
285
+ const sourceDir = import_path.default.join(root, SITE_IMAGE_SOURCE_DIR);
286
+ if (!(0, import_fs.existsSync)(sourceDir)) return;
287
+ const sources = collectSources(sourceDir);
288
+ if (sources.length === 0) return;
289
+ const sharp = loadSharp(root);
290
+ const claimed = /* @__PURE__ */ new Map();
291
+ let encoded = 0;
292
+ let failed = 0;
293
+ for (const relativePath of sources) {
294
+ const key = siteImageKey(relativePath);
295
+ const clash = claimed.get(key);
296
+ if (clash) {
297
+ console.warn(
298
+ `prebuild: ${relativePath} and ${clash} both map to /images/${key} \u2014 skipping ${relativePath}`
299
+ );
300
+ continue;
301
+ }
302
+ claimed.set(key, relativePath);
303
+ const sourcePath = import_path.default.join(sourceDir, relativePath);
304
+ const outBase = import_path.default.join(root, "public", "images", key);
305
+ if (laddersAreFresh(sourcePath, outBase)) continue;
306
+ try {
307
+ await encodeLadder(await (0, import_promises.readFile)(sourcePath), outBase, sharp);
308
+ encoded++;
309
+ } catch (err) {
310
+ failed++;
311
+ console.error(`prebuild: site image ${relativePath} failed:`, err);
312
+ }
313
+ }
314
+ console.log(
315
+ `prebuild: ${sources.length} site images (${encoded} encoded, ${sources.length - encoded - failed} cached, ${failed} failed)`
316
+ );
317
+ }
318
+
319
+ // src/server.ts
320
+ function apiBaseUrl() {
321
+ return process.env.NEXT_PUBLIC_API_BASE_URL ?? "http://localhost:3000";
322
+ }
323
+ var SiteTokenError = class extends Error {
324
+ reason;
325
+ constructor(reason, message, options) {
326
+ super(message, options);
327
+ this.name = "SiteTokenError";
328
+ this.reason = reason;
329
+ }
330
+ };
331
+ async function fetchSiteToken() {
332
+ const secret = process.env.ZORGO_SITE_SECRET;
333
+ if (!secret) {
334
+ throw new SiteTokenError(
335
+ "missing-secret",
336
+ "ZORGO_SITE_SECRET is not set. Add it to this site's .env."
337
+ );
338
+ }
339
+ const url = `${apiBaseUrl()}/auth/site-token`;
340
+ let res;
341
+ try {
342
+ res = await fetch(url, {
343
+ method: "POST",
344
+ headers: { "x-zorgo-site-secret": secret }
345
+ });
346
+ } catch (cause) {
347
+ throw new SiteTokenError(
348
+ "unreachable",
349
+ `Could not reach the site-token endpoint at ${url}. Check NEXT_PUBLIC_API_BASE_URL and that the API is running.`,
350
+ { cause }
351
+ );
352
+ }
353
+ if (!res.ok) {
354
+ const body = (await res.text().catch(() => "")).slice(0, 200);
355
+ throw new SiteTokenError(
356
+ "rejected",
357
+ `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}` : ""}`
358
+ );
359
+ }
360
+ const { token } = await res.json();
361
+ if (!token) {
362
+ throw new SiteTokenError(
363
+ "rejected",
364
+ `The site-token endpoint returned 200 but no token at ${url}.`
365
+ );
366
+ }
367
+ return token;
368
+ }
369
+ var BrandingSchema = import_zod.z.object({
370
+ backgroundBase: import_zod.z.string().default("#F5F5F5"),
371
+ primary: import_zod.z.string().default("#3264FF"),
372
+ accent: import_zod.z.string().default("#9696FF"),
373
+ fontFamily: import_zod.z.string().default("Inter")
374
+ // Google Font family name
375
+ }).prefault({});
376
+ var FranchiseSchema = import_zod.z.object({
377
+ name: import_zod.z.string().nullish().transform((v) => v ?? process.env.ZORGO_PROJECT_NAME ?? "Restaurant"),
378
+ site_url: import_zod.z.string().nullish().transform((v) => v ?? void 0)
379
+ }).prefault({});
380
+ var LocationsSchema = import_zod.z.array(import_zod.z.unknown()).prefault([]);
381
+ var FeatureConfigSchema = import_zod.z.object({
382
+ catering: import_zod.z.object({
383
+ does_cater: import_zod.z.boolean().nullish(),
384
+ minimum_notice_hours: import_zod.z.number().nullish(),
385
+ minimum_people_required: import_zod.z.number().nullish(),
386
+ minimum_price: import_zod.z.number().nullish(),
387
+ preferred_time: import_zod.z.string().nullish()
388
+ }).nullish().transform((v) => v ?? null),
389
+ catering_bulk_discount: import_zod.z.object({
390
+ is_active: import_zod.z.boolean().nullish(),
391
+ full_discount_at: import_zod.z.number().nullish(),
392
+ maximum_percent_off: import_zod.z.number().nullish()
393
+ }).nullish().transform((v) => v ?? null),
394
+ // Passed through unvalidated: the server already parsed it against
395
+ // FoodTruckConfig, and re-declaring eight money fields here just creates a
396
+ // second place to forget one. The site imports it as FoodTruckConfigValue.
397
+ food_truck: import_zod.z.unknown().transform((v) => v ?? null)
398
+ }).prefault({ food_truck: null });
399
+ var MenuSchema = import_zod.z.object({
400
+ items: import_zod.z.array(import_zod.z.unknown()).default([]),
401
+ categories: import_zod.z.array(import_zod.z.unknown()).default([]),
402
+ components: import_zod.z.array(import_zod.z.unknown()).default([]),
403
+ rules: import_zod.z.array(import_zod.z.unknown()).default([])
404
+ });
405
+ async function fetchData(endpoint, token, schema) {
406
+ try {
407
+ const res = await fetch(`${apiBaseUrl()}${endpoint}`, {
408
+ headers: { Authorization: `Bearer ${token}` }
409
+ });
410
+ if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);
411
+ const body = await res.json();
412
+ return schema.parse(body?.data ?? body);
413
+ } catch (err) {
414
+ console.error(`prebuild: ${endpoint} failed, using defaults:`, err);
415
+ return schema.parse(void 0);
416
+ }
417
+ }
418
+ var FONT_ON_LIGHT = "#0a0a0a";
419
+ var FONT_ON_DARK = "#f5f5f5";
420
+ var NEUTRAL_GRAY = { r: 128, g: 128, b: 128 };
421
+ var SURFACE_SHIFT_SUBTLE = 0.1;
422
+ var SURFACE_SHIFT_STRONG = 0.18;
423
+ function parseHexRgb(background) {
424
+ const hex = background.trim().replace(/^#/, "");
425
+ const full = hex.length === 3 ? hex.split("").map((c) => c + c).join("") : hex;
426
+ if (full.length !== 6 || Number.isNaN(Number.parseInt(full, 16))) {
427
+ return null;
428
+ }
429
+ return {
430
+ r: Number.parseInt(full.slice(0, 2), 16),
431
+ g: Number.parseInt(full.slice(2, 4), 16),
432
+ b: Number.parseInt(full.slice(4, 6), 16)
433
+ };
434
+ }
435
+ function toHex({ r, g, b }) {
436
+ return `#${[r, g, b].map((c) => c.toString(16).padStart(2, "0")).join("")}`;
437
+ }
438
+ function relativeLuminance({ r, g, b }) {
439
+ return (0.299 * r + 0.587 * g + 0.114 * b) / 255;
440
+ }
441
+ function deriveFontColor(background) {
442
+ const rgb = parseHexRgb(background);
443
+ if (!rgb) return FONT_ON_LIGHT;
444
+ return relativeLuminance(rgb) > 0.5 ? FONT_ON_LIGHT : FONT_ON_DARK;
445
+ }
446
+ function lerpToward(rgb, target, t) {
447
+ return toHex({
448
+ r: Math.round(rgb.r + (target.r - rgb.r) * t),
449
+ g: Math.round(rgb.g + (target.g - rgb.g) * t),
450
+ b: Math.round(rgb.b + (target.b - rgb.b) * t)
451
+ });
452
+ }
453
+ function deriveElevatedBackground(background) {
454
+ const rgb = parseHexRgb(background);
455
+ if (!rgb) return background;
456
+ const t = relativeLuminance(rgb) > 0.5 ? SURFACE_SHIFT_SUBTLE : SURFACE_SHIFT_STRONG;
457
+ return lerpToward(rgb, NEUTRAL_GRAY, t);
458
+ }
459
+ function deriveRecessedBackground(background) {
460
+ const rgb = parseHexRgb(background);
461
+ if (!rgb) return background;
462
+ const t = relativeLuminance(rgb) > 0.5 ? SURFACE_SHIFT_STRONG : SURFACE_SHIFT_SUBTLE;
463
+ return lerpToward(rgb, NEUTRAL_GRAY, t);
464
+ }
465
+ function varsBlock(vars) {
466
+ return Object.entries(vars).filter(([, value]) => value !== "").map(([key, value]) => `${key} = "${value}"`).join("\n");
467
+ }
468
+ function buildWranglerToml(env) {
469
+ const name = env.ZORGO_PROJECT_NAME ?? "zorgo-site";
470
+ const siteUrl = env.NEXT_PUBLIC_SITE_URL ?? "";
471
+ const apiUrl = env.NEXT_PUBLIC_API_BASE_URL ?? "";
472
+ const baseUrl = env.NEXT_PUBLIC_BASE_URL ?? siteUrl;
473
+ const supabaseUrl = env.NEXT_PUBLIC_SUPABASE_URL ?? "";
474
+ let host;
475
+ try {
476
+ host = new URL(siteUrl).hostname;
477
+ } catch {
478
+ host = void 0;
479
+ }
480
+ const routes = host ? `
481
+ [[routes]]
482
+ pattern = "${host}"
483
+ custom_domain = true
484
+
485
+ [[routes]]
486
+ pattern = "www.${host}"
487
+ custom_domain = true
488
+ ` : "";
489
+ const toml = `# AUTO-GENERATED by scripts/prebuild.ts from .env \u2014 do not edit.
490
+ name = "${name}"
491
+ main = ".open-next/worker.js"
492
+ compatibility_date = "2024-09-23"
493
+ compatibility_flags = ["nodejs_compat_v2"]
494
+
495
+ [assets]
496
+ directory = ".open-next/assets"
497
+ binding = "ASSETS"
498
+
499
+ [vars]
500
+ ${varsBlock({
501
+ NEXT_PUBLIC_SUPABASE_URL: supabaseUrl,
502
+ NEXT_PUBLIC_API_BASE_URL: apiUrl,
503
+ NEXT_PUBLIC_SITE_URL: siteUrl,
504
+ NEXT_PUBLIC_BASE_URL: baseUrl
505
+ })}
506
+
507
+ [observability]
508
+ enabled = true
509
+
510
+ [observability.logs]
511
+ enabled = true
512
+ invocation_logs = true
513
+ ${routes}${buildStagingBlock(env, name, supabaseUrl, apiUrl)}`;
514
+ return toml;
515
+ }
516
+ function buildStagingBlock(env, name, supabaseUrl, apiUrl) {
517
+ const stagingUrl = env.NEXT_PUBLIC_STAGING_BASE_URL ?? "";
518
+ return `
519
+ [env.staging]
520
+ name = "${name}-staging"
521
+ routes = []
522
+
523
+ [env.staging.vars]
524
+ ${varsBlock({
525
+ NEXT_PUBLIC_SUPABASE_URL: supabaseUrl,
526
+ NEXT_PUBLIC_API_BASE_URL: apiUrl,
527
+ NEXT_PUBLIC_SITE_URL: stagingUrl,
528
+ NEXT_PUBLIC_BASE_URL: stagingUrl
529
+ })}
530
+ `;
531
+ }
532
+ function writeWranglerToml() {
533
+ (0, import_fs2.writeFileSync)(import_path2.default.join(process.cwd(), "wrangler.toml"), buildWranglerToml(process.env));
534
+ }
535
+ async function logo({ franchiseId, token }) {
536
+ const logoResponse = await fetch(
537
+ `${apiBaseUrl()}/franchise-info/logo/${franchiseId}`,
538
+ { headers: { Authorization: `Bearer ${token}` } }
539
+ );
540
+ if (!logoResponse.ok) return;
541
+ const arrayBuffer = await logoResponse.arrayBuffer();
542
+ const buffer = Buffer.from(arrayBuffer);
543
+ const outDir = import_path2.default.join(process.cwd(), `public/images/`);
544
+ (0, import_fs2.mkdirSync)(outDir, { recursive: true });
545
+ (0, import_fs2.writeFileSync)(import_path2.default.join(outDir, "logo.png"), buffer);
546
+ }
547
+ var dropHeavyColumns = (key, value) => key.endsWith("_vector") || key.endsWith("_embedding") ? void 0 : value;
548
+ function writeMenuModule(menu2) {
549
+ const outDir = import_path2.default.join(process.cwd(), `lib/generated/`);
550
+ (0, import_fs2.mkdirSync)(outDir, { recursive: true });
551
+ (0, import_fs2.writeFileSync)(
552
+ import_path2.default.join(outDir, "menu.ts"),
553
+ `// AUTO-GENERATED by scripts/prebuild.ts \u2014 do not edit.
554
+ import type { Menu } from "@zorgo/next";
555
+
556
+ export const menu = ${JSON.stringify(menu2, dropHeavyColumns, 2)} as unknown as Menu;
557
+ `
558
+ );
559
+ }
560
+ async function menu({ franchiseId, token }) {
561
+ const menuResponse = await fetch(
562
+ `${apiBaseUrl()}/franchise-info/menu/${franchiseId}`,
563
+ { headers: { Authorization: `Bearer ${token}` } }
564
+ );
565
+ if (!menuResponse.ok) {
566
+ throw new Error(
567
+ `menu fetch failed ${menuResponse.status}: ${await menuResponse.text()}`
568
+ );
569
+ }
570
+ const body = await menuResponse.json();
571
+ const parsed = MenuSchema.parse(body?.data ?? {});
572
+ if (parsed.items.length === 0) {
573
+ console.warn(
574
+ "prebuild: franchise has no menu items yet \u2014 generating an empty menu. Add items in the dashboard and rebuild to populate the storefront."
575
+ );
576
+ }
577
+ await stampItemImages(parsed, process.cwd());
578
+ writeMenuModule(parsed);
579
+ return parsed;
580
+ }
581
+ async function jsonLd({ franchiseId, token }, menuData, locationRows) {
582
+ const franchise = await fetchData(
583
+ `/franchise-info/franchise/${franchiseId}`,
584
+ token,
585
+ FranchiseSchema
586
+ );
587
+ const url = franchise.site_url;
588
+ const data = buildRestaurantJsonLd(menuData, {
589
+ name: franchise.name,
590
+ url,
591
+ image: url ? `${url}/images/logo.png` : void 0,
592
+ locations: locationRows
593
+ });
594
+ const outDir = import_path2.default.join(process.cwd(), `lib/generated/`);
595
+ (0, import_fs2.mkdirSync)(outDir, { recursive: true });
596
+ (0, import_fs2.writeFileSync)(
597
+ import_path2.default.join(outDir, "jsonld.ts"),
598
+ `// AUTO-GENERATED by scripts/prebuild.ts \u2014 do not edit.
599
+ export const restaurantJsonLd = ${JSON.stringify(data, null, 2)};
600
+ `
601
+ );
602
+ }
603
+ async function locations({ franchiseId, token }) {
604
+ const rows = await fetchData(
605
+ `/franchise-info/locations/${franchiseId}`,
606
+ token,
607
+ LocationsSchema
608
+ );
609
+ const outDir = import_path2.default.join(process.cwd(), `lib/generated/`);
610
+ (0, import_fs2.mkdirSync)(outDir, { recursive: true });
611
+ (0, import_fs2.writeFileSync)(
612
+ import_path2.default.join(outDir, "locations.ts"),
613
+ `// AUTO-GENERATED by scripts/prebuild.ts \u2014 do not edit.
614
+ import type { Location } from "@zorgo/next";
615
+
616
+ export const locations = ${JSON.stringify(rows, null, 2)} as unknown as Location[];
617
+ `
618
+ );
619
+ return rows;
620
+ }
621
+ async function featureConfig({ franchiseId, token }) {
622
+ const config = await fetchData(
623
+ `/franchise-info/feature-config/${franchiseId}`,
624
+ token,
625
+ FeatureConfigSchema
626
+ );
627
+ const outDir = import_path2.default.join(process.cwd(), `lib/generated/`);
628
+ const outFile = import_path2.default.join(outDir, "featureConfig.ts");
629
+ const empty = !config.catering && !config.catering_bulk_discount && !config.food_truck;
630
+ if (empty && (0, import_fs2.existsSync)(outFile)) {
631
+ console.warn(
632
+ "prebuild: feature-config came back empty \u2014 keeping the existing lib/generated/featureConfig.ts."
633
+ );
634
+ return;
635
+ }
636
+ (0, import_fs2.mkdirSync)(outDir, { recursive: true });
637
+ (0, import_fs2.writeFileSync)(
638
+ outFile,
639
+ `// AUTO-GENERATED by scripts/prebuild.ts \u2014 do not edit.
640
+ import type {
641
+ CateringSiteConfig,
642
+ CateringBulkDiscount,
643
+ FoodTruckConfigValue,
644
+ } from "@zorgo/next";
645
+
646
+ export const cateringConfig: CateringSiteConfig | null = ${JSON.stringify(config.catering, null, 2)};
647
+
648
+ export const cateringBulkDiscount: CateringBulkDiscount | null = ${JSON.stringify(config.catering_bulk_discount, null, 2)};
649
+
650
+ export const foodTruck = ${JSON.stringify(config.food_truck ?? null, null, 2)} as FoodTruckConfigValue | null;
651
+ `
652
+ );
653
+ }
654
+ var FONT_FILE_RE = /\.(woff2?|ttf|otf)$/i;
655
+ function hasSelfHostedFonts(cwd) {
656
+ const fontsDir = import_path2.default.join(cwd, "public/fonts");
657
+ return (0, import_fs2.existsSync)(fontsDir) && (0, import_fs2.readdirSync)(fontsDir).some((f) => FONT_FILE_RE.test(f));
658
+ }
659
+ async function styles({ franchiseId, token }) {
660
+ const brand = await fetchData(
661
+ `/franchise-info/styles/${franchiseId}`,
662
+ token,
663
+ BrandingSchema
664
+ );
665
+ const branding = {
666
+ ...brand,
667
+ backgroundElevated: deriveElevatedBackground(brand.backgroundBase),
668
+ backgroundRecessed: deriveRecessedBackground(brand.backgroundBase),
669
+ foreground: deriveFontColor(brand.backgroundBase),
670
+ primaryForeground: deriveFontColor(brand.primary),
671
+ accentForeground: deriveFontColor(brand.accent)
672
+ };
673
+ const stylesDir = import_path2.default.join(process.cwd(), `public/styles/`);
674
+ (0, import_fs2.mkdirSync)(stylesDir, { recursive: true });
675
+ (0, import_fs2.writeFileSync)(
676
+ import_path2.default.join(stylesDir, "styles.json"),
677
+ JSON.stringify(branding, null, 2)
678
+ );
679
+ const generatedDir = import_path2.default.join(process.cwd(), "app", "generated");
680
+ (0, import_fs2.mkdirSync)(generatedDir, { recursive: true });
681
+ (0, import_fs2.writeFileSync)(
682
+ import_path2.default.join(generatedDir, "branding.css"),
683
+ buildBrandingCss(brand, { selfHostedFont: hasSelfHostedFonts(process.cwd()) })
684
+ );
685
+ }
686
+ function buildBrandingCss(branding, opts) {
687
+ const foreground = deriveFontColor(branding.backgroundBase);
688
+ const primaryForeground = deriveFontColor(branding.primary);
689
+ const accentForeground = deriveFontColor(branding.accent);
690
+ const backgroundElevated = deriveElevatedBackground(branding.backgroundBase);
691
+ const backgroundRecessed = deriveRecessedBackground(branding.backgroundBase);
692
+ const fontFamilyEscaped = branding.fontFamily.replace(/"/g, '\\"');
693
+ const fontImport = opts.selfHostedFont ? "" : `@import url("https://fonts.googleapis.com/css2?family=${branding.fontFamily.replace(/ /g, "+")}:wght@400;700&display=swap");
694
+ `;
695
+ return `${fontImport}:root {
696
+ --background: ${branding.backgroundBase};
697
+ --background-elevated: ${backgroundElevated};
698
+ --background-recessed: ${backgroundRecessed};
699
+ --foreground: ${foreground};
700
+ --primary: ${branding.primary};
701
+ --primary-foreground: ${primaryForeground};
702
+ --accent: ${branding.accent};
703
+ --accent-foreground: ${accentForeground};
704
+ --font-sans: "${fontFamilyEscaped}", sans-serif;
705
+ }
706
+
707
+ @theme inline {
708
+ --color-background: var(--background);
709
+ --color-background-elevated: var(--background-elevated);
710
+ --color-background-recessed: var(--background-recessed);
711
+ --color-foreground: var(--foreground);
712
+ --color-primary: var(--primary);
713
+ --color-primary-foreground: var(--primary-foreground);
714
+ --color-accent: var(--accent);
715
+ --color-accent-foreground: var(--accent-foreground);
716
+ --font-sans: var(--font-sans);
717
+ }
718
+ `;
719
+ }
720
+ async function runPrebuild() {
721
+ console.log("running prebuild script...");
722
+ (0, import_env.loadEnvConfig)(process.cwd());
723
+ writeWranglerToml();
724
+ const token = await fetchSiteToken();
725
+ const encodedPayload = token.split(".")[1];
726
+ if (!encodedPayload) {
727
+ throw new Error("site token is not a well-formed JWT (no payload segment)");
728
+ }
729
+ const payload = JSON.parse(Buffer.from(encodedPayload, "base64url").toString());
730
+ const franchiseId = payload.franchise_ids[0];
731
+ const [menuData, locationRows] = await Promise.all([
732
+ menu({ franchiseId, token }),
733
+ locations({ franchiseId, token }).catch((err) => {
734
+ console.error("locations failed:", err);
735
+ return [];
736
+ }),
737
+ logo({ franchiseId, token }).catch((err) => console.error("logo failed:", err)),
738
+ styles({ franchiseId, token }).catch((err) => console.error("styles failed:", err)),
739
+ featureConfig({ franchiseId, token }).catch(
740
+ (err) => console.error("featureConfig failed:", err)
741
+ ),
742
+ // Purely local (assets/images -> public/images), so it needs no token and
743
+ // rides along with the network work instead of adding to the wall clock.
744
+ optimizeSiteImages(process.cwd()).catch(
745
+ (err) => console.error("site images failed:", err)
746
+ )
747
+ ]);
748
+ await jsonLd({ franchiseId, token }, menuData, locationRows).catch(
749
+ (err) => console.error("jsonLd failed:", err)
750
+ );
751
+ console.log("prebuild script completed");
752
+ }
753
+ // Annotate the CommonJS export names for ESM import in node:
754
+ 0 && (module.exports = {
755
+ SiteTokenError,
756
+ buildBrandingCss,
757
+ buildWranglerToml,
758
+ fetchSiteToken,
759
+ runPrebuild
760
+ });
761
+ //# sourceMappingURL=server.js.map