@series-inc/venus-sdk 3.4.3-beta.2 → 3.4.3-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{SandboxHost-EUT6YDBE.js → SandboxHost-2Z25NHJU.js} +58 -20
- package/dist/SandboxHost-2Z25NHJU.js.map +1 -0
- package/dist/{chunk-GJAEABTM.js → chunk-PMXFUPVS.js} +5 -5
- package/dist/{chunk-GJAEABTM.js.map → chunk-PMXFUPVS.js.map} +1 -1
- package/dist/{chunk-NSUUMXUE.js → chunk-Z72SXERI.js} +2 -2
- package/dist/{chunk-NSUUMXUE.js.map → chunk-Z72SXERI.js.map} +1 -1
- package/dist/index.js +2 -2
- package/dist/venus-api/index.js +2 -2
- package/dist/vite/index.d.ts +1 -0
- package/dist/vite/index.js +91 -2
- package/dist/vite/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/SandboxHost-EUT6YDBE.js.map +0 -1
package/dist/vite/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/shared-assets/embeddedLibrariesManifest.ts","../../src/shared-assets/generated/threeExports.ts","../../src/vite/venusLibrariesPlugin.ts","../../src/vite/cdnPlugin.ts","raw-loader:/Users/pchan/Development/series/venus/venus-sdk/packages/api/src/vite/sandboxToolbarStyle.css","raw-loader:/Users/pchan/Development/series/venus/venus-sdk/packages/api/src/vite/sandboxToolbarScript.js","../../src/vite/sandboxToolbar.ts","../../src/firebase/firebaseConfigs.ts","../../src/vite/venusSandboxPlugin.ts"],"names":["path","fs","resolvePath","require"],"mappings":"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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;;;ACIR,SAAS,wBAAA,GAAgD;AAC9D,EAAA,MAAM,QAAA,GAA8B;AAAA,IAClC,GAAA,EAAK,OAAA;AAAA,IACL,KAAA,EAAO,EAAE,EAAA,EAAI,qBAAA,EAAsB;AAAA,IACnC,QAAA,EAAU,2BAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,MAAM,SAAA,GAA+B;AAAA,IACnC,GAAA,EAAK,QAAA;AAAA,IACL,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,QAAA;AAAA,MACN,EAAA,EAAI,sBAAA;AAAA,MACJ,mBAAA,EAAqB;AAAA,KACvB;AAAA,IACA,QAAA,EAAU,4BAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,OAAO,CAAC,UAAU,SAAS,CAAA;AAC7B;;;ACKO,IAAM,gBAAA,GAAiE;AAAA;AAAA,EAE5E,KAAA,EAAO;AAAA,IACL,MAAA,EAAQ,yCAAA;AAAA,IACR,UAAA,EAAY,+BAAA;AAAA,IACZ,SAAA,EAAW,eAAA;AAAA,IACX,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,GAAA,EAAK;AAAA,IACH,MAAA,EAAQ,yCAAA;AAAA,IACR,UAAA,EAAY,+BAAA;AAAA,IACZ,SAAA,EAAW,eAAA;AAAA,IACX,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,OAAA,EAAS;AAAA,IACP,MAAA,EAAQ,yCAAA;AAAA,IACR,UAAA,EAAY,mCAAA;AAAA,IACZ,SAAA,EAAW,mBAAA;AAAA,IACX,aAAA,EAAe;AAAA;AAEnB,CAAA;AAKO,IAAM,iBAAA,GAAmD;AAAA,EAC9D,KAAA,EAAO,aAAA;AAAA,EACP,GAAA,EAAK,aAAA;AAAA,EACL,OAAA,EAAS;AACX,CAAA;AAKO,IAAM,sBAAA,GAAyB;AAAA,EACpC,SAAA,EAAW,gBAAA;AAAA,EACX,SAAA,EAAW,gBAAA;AAAA,EACX,IAAA,EAAM;AACR,CAAA;;;AChCA,IAAM,yBAAA,GAA4B,SAAA;AAsBlC,IAAM,oBAAA,GAAuB,kBAAA;AAC7B,IAAM,iBAAA,GAAoB,IAAA,CAAK,OAAA,EAAQ,EAAG,UAAU,aAAa,CAAA;AAE1D,SAAS,kBAAA,CACd,OAAA,GAAqC,EAAC,EAC9B;AACR,EAAA,IAAI,WAAA,GAAc,QAAQ,GAAA,EAAI;AAC9B,EAAA,IAAI,cAAA,GAAiB,KAAA;AACrB,EAAA,IAAI,aAAA,GAAgB,KAAA;AACpB,EAAA,IAAI,eAAA,GAAkB,KAAA;AAEtB,EAAA,MAAM,UAAA,GAAa,CAAC,OAAA,KAA0B;AAC5C,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,aAAA,GAAgB,IAAA;AAChB,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,gBAAA,EAAmB,OAAO,CAAA,CAAE,CAAA;AAAA,IAC3C;AAAA,EACF,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO,OAAA;AAAA,IACP,OAAA,EAAS,KAAA;AAAA;AAAA,IAET,MAAA,CAAO,QAAQ,GAAA,EAAK;AAClB,MAAA,WAAA,GAAc,mBAAmB,MAAM,CAAA;AACvC,MAAA,cAAA,GAAiB,IAAI,OAAA,KAAY,OAAA;AAGjC,MAAA,IAAI,cAAA,IAAkB,CAAC,OAAA,CAAQ,QAAA,EAAU;AACvC,QAAA,MAAM,WAAA,GAAc,wBAAwB,WAAW,CAAA;AACvD,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,eAAA,GAAkB,IAAA;AAClB,UAAA,kBAAA,EAAmB;AAKnB,UAAA,OAAO;AAAA,YACL,GAAG,MAAA;AAAA,YACH,YAAA,EAAc;AAAA,cACZ,GAAG,MAAA,EAAQ,YAAA;AAAA,cACX,OAAA,EAAS;AAAA,gBACP,GAAI,MAAA,EAAQ,YAAA,EAAc,OAAA,IAAW,EAAC;AAAA,gBACtC,uBAAA;AAAA,gBACA,UAAA;AAAA,gBACA,cAAA;AAAA,gBACA,eAAA;AAAA,gBACA;AAAA;AACF;AACF,WACF;AAAA,QACF,CAAA,MAAO;AAKL,UAAA,IAAI,aAAA,GAAsC,IAAA;AAC1C,UAAA,IAAI;AACF,YAAA,aAAA,GAAgB,kBAAA,CAAmB,aAAa,OAAO,CAAA;AAAA,UACzD,CAAA,CAAA,MAAQ;AAAA,UAER;AAIA,UAAA,MAAM,WAAA,GAAc,iBAAiB,aAAa,CAAA;AAElD,UAAA,OAAO;AAAA,YACL,GAAG,MAAA;AAAA,YACH,MAAA,EAAQ;AAAA,cACN,GAAG,MAAA,EAAQ,MAAA;AAAA,cACX,+BAAA,EAAiC,IAAA,CAAK,SAAA,CAAU,MAAM;AAAA,aACxD;AAAA,YACA,YAAA,EAAc;AAAA,cACZ,GAAG,MAAA,EAAQ,YAAA;AAAA,cACX,OAAA,EAAS;AAAA,gBACP,GAAI,MAAA,EAAQ,YAAA,EAAc,OAAA,IAAW,EAAC;AAAA,gBACtC,cAAA;AAAA,gBACA,eAAA;AAAA,gBACA;AAAA;AACF,aACF;AAAA,YACA,MAAA,EAAQ;AAAA,cACN,GAAG,MAAA,EAAQ,MAAA;AAAA,cACX,KAAA,EAAO;AAAA,gBACL,GAAG,QAAQ,MAAA,EAAQ,KAAA;AAAA,gBACnB,GAAG;AAAA;AACL;AACF,WACF;AAAA,QACF;AAAA,MACF;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,mBAAmB,IAAA,EAAyC;AAChE,MAAA,IAAI,CAAC,cAAA,IAAkB,OAAA,CAAQ,QAAA,EAAU;AACvC,QAAA,OAAO,IAAA;AAAA,MACT;AAGA,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,MAAM,YAAA,GAAe,CAAA;;AAAA,iBAAA,EAAkD,yBAAyB,CAAA;;AAAA,oGAAA,CAAA;AAChG,QAAA,MAAM,WAAA,GAAc,uBAAA,CAAwB,YAAA,EAAc,OAAO,CAAA;AACjE,QAAA,OAAO;AAAA,UACL,IAAA;AAAA,UACA,IAAA,EAAM;AAAA,YACJ;AAAA,cACE,GAAA,EAAK,QAAA;AAAA,cACL,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,cACxB,QAAA,EAAU,WAAA;AAAA,cACV,QAAA,EAAU;AAAA;AACZ;AACF,SACF;AAAA,MACF;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,WAAA,EAAa,OAAO,CAAA;AACtD,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,MAAM,YAAA,GAAe,iBAAiB,IAAI,CAAA;AAC1C,QAAA,MAAM,YAAA,GAAe,CAAA,2BAAA,EAA8B,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA,CAAA,CAAA;AAEzE,QAAA,OAAA,CAAQ,IAAI,CAAA,4BAAA,EAA+B,MAAA,CAAO,MAAM,CAAA,sBAAA,EAAyB,MAAA,CAAO,MAAM,CAAA,CAAA,CAAG,CAAA;AAEjG,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,YAAA;AAAA,UACN,IAAA,EAAM;AAAA,YACJ;AAAA,cACE,GAAA,EAAK,QAAA;AAAA,cACL,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,cACxB,QAAA,EAAU,YAAA;AAAA,cACV,QAAA,EAAU;AAAA,aACZ;AAAA,YACA,GAAG,wBAAA;AAAyB;AAC9B,SACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,QAAA,UAAA,CAAW,OAAO,CAAA;AAGlB,QAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,OAAA;AACjC,QAAA,MAAM,WAAA,GAAc,uBAAA,CAAwB,OAAA,EAAS,MAAM,CAAA;AAC3D,QAAA,OAAO;AAAA,UACL,IAAA;AAAA,UACA,IAAA,EAAM;AAAA,YACJ;AAAA,cACE,GAAA,EAAK,QAAA;AAAA,cACL,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,cACxB,QAAA,EAAU,WAAA;AAAA,cACV,QAAA,EAAU;AAAA;AACZ;AACF,SACF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AACF;AAMA,SAAS,kBAAA,CACP,aACA,OAAA,EACsB;AAEtB,EAAA,MAAM,cAAA,GAAiB,mBAAmB,WAAW,CAAA;AACrD,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,iBAAA,EAAoB,oBAAoB,CAAA,eAAA,EAAkB,WAAW,CAAA,6CAAA;AAAA,KAEvE;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,eAAe,cAAc,CAAA;AAChD,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,MAAA,EAAQ,IAAA,EAAK;AACvC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,2BAA2B,cAAc,CAAA,8CAAA;AAAA,KAC3C;AAAA,EACF;AAGA,EAAA,MAAM,YAAY,kBAAA,EAAmB;AACrC,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,YAAA,CAAa,WAAW,SAAS,CAAA;AAGlE,EAAA,MAAM,SAAA,GAAY,SAAA,EAAW,OAAA,GAAU,MAAM,CAAA;AAC7C,EAAA,IAAI,SAAA,EAAW,YAAY,KAAA,EAAO;AAChC,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,cAAA,GAAiB,iBAAiB,MAAM,CAAA;AAC9C,EAAA,MAAM,MAAA,GAAwB;AAAA,IAC5B,OAAA,EAAS,IAAA;AAAA,IACT,MAAA;AAAA,IACA,MAAA;AAAA,IACA,cAAA;AAAA,IACA,eAAA,EAAiB,kBAAkB,MAAM,CAAA;AAAA,IACzC,eAAA,EAAiB,WAAW,eAAA,IAAmB,GAAA;AAAA,IAC/C,aAAA,EAAe,WAAW,aAAA,IAAiB,CAAA;AAAA,IAC3C,eAAA,EAAiB,WAAW,eAAA,IAAmB;AAAA,GACjD;AAGA,EAAA,IAAI,WAAW,OAAA,EAAS;AACtB,IAAA,MAAA,CAAO,wBAAwB,sBAAA,CAAuB,SAAA;AACtD,IAAA,MAAA,CAAO,wBAAwB,sBAAA,CAAuB,SAAA;AACtD,IAAA,MAAA,CAAO,mBAAmB,sBAAA,CAAuB,IAAA;AAAA,EACnD;AAGA,EAAA,IAAI,WAAW,UAAA,EAAY;AACzB,IAAA,MAAA,CAAO,aAAa,SAAA,CAAU,UAAA;AAAA,EAChC;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,kBAAA,GAA4C;AACnD,EAAA,IAAI;AACF,IAAA,IAAI,CAAC,UAAA,CAAW,iBAAiB,CAAA,EAAG;AAClC,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,iBAAA,EAAmB,OAAO,CAAA;AACnD,IAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EACvB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKA,SAAS,eAAe,QAAA,EAAuC;AAC7D,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AAC1C,IAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EACvB,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,QAAQ,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AAAA,EAC3D;AACF;AAKA,SAAS,mBAAmB,QAAA,EAAiC;AAC3D,EAAA,IAAI,OAAA,GAAUC,QAAY,QAAQ,CAAA;AAClC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAEhC,EAAA,OAAO,IAAA,EAAM;AACX,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,EAAS,oBAAoB,CAAA;AACpD,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAA,OAAO,SAAA;AAAA,IACT;AAEA,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AACxB,MAAA;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AAEnB,IAAA,MAAM,MAAA,GAAS,QAAQ,OAAO,CAAA;AAC9B,IAAA,IAAI,WAAW,OAAA,EAAS;AACtB,MAAA;AAAA,IACF;AACA,IAAA,OAAA,GAAU,MAAA;AAAA,EACZ;AAEA,EAAA,OAAO,IAAA;AACT;AAKA,SAAS,mBAAmB,MAAA,EAAoC;AAC9D,EAAA,IAAI,MAAA,EAAQ,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,EAAG;AAC1C,IAAA,OAAOA,OAAA,CAAY,OAAO,IAAI,CAAA;AAAA,EAChC;AACA,EAAA,OAAO,QAAQ,GAAA,EAAI;AACrB;AAKA,SAAS,aAAa,KAAA,EAAsC;AAC1D,EAAA,IAAI,KAAA,KAAU,KAAA,IAAS,KAAA,KAAU,SAAA,EAAW;AAC1C,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAA;AACT;AAKA,SAAS,iBAAiB,IAAA,EAAsB;AAC9C,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,iCAAiC,CAAA;AAC1D,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,GAAG,KAAA,EAAO,QAAQ,CAAA,GAAI,KAAA;AAC5B,EAAA,MAAM,aAAa,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,CAAE,OAAA,CAAQ,gBAAgB,aAAa,CAAA;AAEjF,EAAA,MAAM,KAAA,GAAQ;AAAA,SAAA,EACL,KAAK,CAAA;AAAA;AAAA;AAAA,QAAA,EAGN,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAAA,EAMkB,UAAU,CAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAK5C,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,yBAAA,EAA2B,KAAK,CAAA;AACtD;AAMA,SAAS,wBAAwB,WAAA,EAA8B;AAC7D,EAAA,IAAI;AAEF,IAAA,MAAMC,QAAAA,GAAU,aAAA,CAAc,IAAA,CAAK,WAAA,EAAa,cAAc,CAAC,CAAA;AAC/D,IAAAA,QAAAA,CAAQ,QAAQ,cAAc,CAAA;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAKA,SAAS,kBAAA,GAA2B;AAClC,EAAA,OAAA,CAAQ,KAAA,CAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAA,EAOI,yBAAyB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAY5C,CAAA;AACD;AAKA,SAAS,uBAAA,CAAwB,SAAiB,MAAA,EAA+B;AAC/E,EAAA,MAAM,cAAA,GAAiB,OAAA,CACpB,OAAA,CAAQ,KAAA,EAAO,MAAM,CAAA,CACrB,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA,CACnB,OAAA,CAAQ,KAAA,EAAO,KAAK,CAAA;AAEvB,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,qBAAA,EAmBc,cAAc,CAAA;;AAAA;AAAA;AAAA,sEAAA,EAImC,MAAM,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAiB9E;AAMO,IAAM,oBAAA,GAAuB,aAAA;AAUpC,SAAS,iBACP,MAAA,EAC8F;AAE9F,EAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,OAAA,EAAS;AACxC,IAAA,OAAO,EAAC;AAAA,EACV;AAGA,EAAA,MAAM,SAAA,GAAY,OAAO,cAAA,EAAgB,SAAA;AACzC,EAAA,MAAM,MAAA,GAAS,OAAO,eAAA,IAAmB,aAAA;AAEzC,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,SAAA,GAAY,CAAA,QAAA,EAAW,MAAM,CAAA,CAAA,EAAI,SAAS,CAAA,mBAAA,CAAA;AAEhD,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,uCAAA,EAA0C,oBAAoB,CAAA,MAAA,EAAS,SAAS,CAAA,EAAA,CAAI,CAAA;AAEhG,EAAA,OAAO;AAAA,IACL,CAAC,oBAAoB,GAAG;AAAA,MACtB,MAAA,EAAQ,SAAA;AAAA,MACR,YAAA,EAAc,IAAA;AAAA,MACd,OAAA,EAAS,CAACH,KAAAA,KAAiBA,KAAAA,CAAK,OAAA,CAAQ,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,oBAAoB,CAAA,CAAE,CAAA,EAAG,EAAE;AAAA;AACpF,GACF;AACF","file":"index.js","sourcesContent":["export type ModuleSpecifierMatch = 'exact' | 'prefix';\r\n\r\nexport interface ModuleSpecifierConfig {\r\n match: ModuleSpecifierMatch;\r\n value: string;\r\n behavior?:\r\n | 'default'\r\n | 'react-jsx-runtime'\r\n | 'react-jsx-dev-runtime'\r\n | 'namespace';\r\n}\r\n\r\nexport interface EmbeddedLibraryDefinition {\r\n libraryKey: string;\r\n assetKey: string;\r\n packageName: string;\r\n version: string;\r\n globalVar: string;\r\n cdnPath: string;\r\n moduleSpecifiers: ModuleSpecifierConfig[];\r\n loadStage: number; // Load order: 0 first, then 1, etc. Enables parallel loading within stages\r\n enabled: boolean; // Whether this library is ready for use\r\n}\r\n\r\nexport const DEFAULT_SHARED_LIB_CDN_BASE =\r\n 'https://venus-static-01293ak.web.app/libs';\r\n\r\nexport const EMBEDDED_LIBRARIES: EmbeddedLibraryDefinition[] = [\r\n {\r\n libraryKey: 'phaser@3.90.0',\r\n assetKey: 'library:phaser@3.90.0',\r\n packageName: 'phaser',\r\n version: '3.90.0',\r\n globalVar: 'Phaser',\r\n cdnPath: 'phaser/3.90.0/phaser.min.js',\r\n moduleSpecifiers: [{ match: 'exact', value: 'phaser' }],\r\n loadStage: 0,\r\n enabled: true,\r\n },\r\n {\r\n libraryKey: 'react@18.3.1',\r\n assetKey: 'library:react@18.3.1',\r\n packageName: 'react',\r\n version: '18.3.1',\r\n globalVar: 'React',\r\n cdnPath: 'react/18.3.1/react.production.min.js',\r\n moduleSpecifiers: [\r\n { match: 'exact', value: 'react', behavior: 'namespace' },\r\n { match: 'exact', value: 'react/jsx-runtime', behavior: 'react-jsx-runtime' },\r\n {\r\n match: 'exact',\r\n value: 'react/jsx-dev-runtime',\r\n behavior: 'react-jsx-dev-runtime',\r\n },\r\n ],\r\n loadStage: 0, // Must load before ReactDOM\r\n enabled: true,\r\n },\r\n {\r\n libraryKey: 'react-dom@18.3.1',\r\n assetKey: 'library:react-dom@18.3.1',\r\n packageName: 'react-dom',\r\n version: '18.3.1',\r\n globalVar: 'ReactDOM',\r\n cdnPath: 'react-dom/18.3.1/react-dom.production.min.js',\r\n moduleSpecifiers: [\r\n { match: 'exact', value: 'react-dom', behavior: 'namespace' },\r\n { match: 'exact', value: 'react-dom/client', behavior: 'namespace' },\r\n ],\r\n loadStage: 1, // Depends on React (stage 0)\r\n enabled: true,\r\n },\r\n {\r\n libraryKey: 'three@0.170.0',\r\n assetKey: 'library:three@0.170.0',\r\n packageName: 'three',\r\n version: '0.170.0',\r\n globalVar: 'THREE',\r\n cdnPath: 'three/r170/three.min.js',\r\n moduleSpecifiers: [\r\n { match: 'exact', value: 'three', behavior: 'namespace' },\r\n ],\r\n loadStage: 0,\r\n enabled: true,\r\n },\r\n {\r\n libraryKey: 'matter-js@0.19.0',\r\n assetKey: 'library:matter-js@0.19.0',\r\n packageName: 'matter-js',\r\n version: '0.19.0',\r\n globalVar: 'Matter',\r\n cdnPath: 'matter-js/0.19.0/matter.min.js',\r\n moduleSpecifiers: [{ match: 'exact', value: 'matter-js' }],\r\n loadStage: 0,\r\n enabled: true,\r\n },\r\n {\r\n libraryKey: 'inkjs@2.2.0',\r\n assetKey: 'library:inkjs@2.2.0',\r\n packageName: 'inkjs',\r\n version: '2.2.0',\r\n globalVar: 'inkjs',\r\n cdnPath: 'inkjs/2.2.0/ink.min.js',\r\n moduleSpecifiers: [{ match: 'exact', value: 'inkjs' }],\r\n loadStage: 0,\r\n enabled: true,\r\n },\r\n {\r\n libraryKey: 'zustand@5.0.3',\r\n assetKey: 'library:zustand@5.0.3',\r\n packageName: 'zustand',\r\n version: '5.0.3',\r\n globalVar: 'zustand',\r\n cdnPath: 'zustand/5.0.3/zustand.min.js',\r\n moduleSpecifiers: [\r\n { match: 'exact', value: 'zustand' },\r\n { match: 'exact', value: 'zustand/middleware' },\r\n ],\r\n loadStage: 1, // Depends on React (stage 0)\r\n enabled: true,\r\n },\r\n {\r\n libraryKey: 'ammo.js@2024.11',\r\n assetKey: 'library:ammo.js@2024.11',\r\n packageName: 'ammo.js',\r\n version: '2024.11',\r\n globalVar: 'Ammo',\r\n cdnPath: 'ammo/2024.11/ammo.js',\r\n moduleSpecifiers: [\r\n { match: 'exact', value: 'ammo.js' },\r\n { match: 'exact', value: 'ammo.js/builds/ammo.wasm.js' },\r\n ],\r\n loadStage: 0,\r\n enabled: false, // Not ready yet - WASM loading needs additional work\r\n },\r\n];\r\n\r\nexport const EMBEDDED_LIBRARY_BY_KEY: Record<string, EmbeddedLibraryDefinition> =\r\n EMBEDDED_LIBRARIES.reduce(\r\n (acc, lib) => {\r\n acc[lib.libraryKey] = lib;\r\n return acc;\r\n },\r\n {} as Record<string, EmbeddedLibraryDefinition>,\r\n );\r\n\r\nexport const MODULE_TO_LIBRARY_SPECIFIERS = EMBEDDED_LIBRARIES.filter(\r\n (lib) => lib.enabled,\r\n).flatMap((lib) =>\r\n lib.moduleSpecifiers.map((specifier) => ({\r\n ...specifier,\r\n libraryKey: lib.libraryKey,\r\n })),\r\n);\r\n\r\n/**\r\n * Get library definition by key, throwing if not found.\r\n * @param libraryKey - Library key (e.g., 'phaser@3.90.0')\r\n * @returns Library definition\r\n * @throws Error if library key is not found\r\n */\r\nexport function getLibraryDefinition(\r\n libraryKey: string,\r\n): EmbeddedLibraryDefinition {\r\n const definition = EMBEDDED_LIBRARY_BY_KEY[libraryKey]\r\n if (!definition) {\r\n const availableKeys = Object.keys(EMBEDDED_LIBRARY_BY_KEY).join(', ')\r\n throw new Error(\r\n `Unsupported embedded library: ${libraryKey}. Available libraries: ${availableKeys}`,\r\n )\r\n }\r\n return definition\r\n}\r\n","/* eslint-disable */\r\n/**\r\n * AUTO-GENERATED FILE — DO NOT EDIT.\r\n *\r\n * Generated by: scripts/generate-embedded-three-exports.mjs\r\n * Source: three@0.170.0 (ESM entry)\r\n * Generated at: 2025-12-12T01:45:19.152Z\r\n */\r\n\r\nexport const EMBEDDED_THREE_VERSION = \"0.170.0\" as const;\r\n\r\nexport const EMBEDDED_THREE_NAMED_EXPORTS = [\r\n \"ACESFilmicToneMapping\",\r\n \"AddEquation\",\r\n \"AdditiveAnimationBlendMode\",\r\n \"AdditiveBlending\",\r\n \"AddOperation\",\r\n \"AgXToneMapping\",\r\n \"AlphaFormat\",\r\n \"AlwaysCompare\",\r\n \"AlwaysDepth\",\r\n \"AlwaysStencilFunc\",\r\n \"AmbientLight\",\r\n \"AnimationAction\",\r\n \"AnimationClip\",\r\n \"AnimationLoader\",\r\n \"AnimationMixer\",\r\n \"AnimationObjectGroup\",\r\n \"AnimationUtils\",\r\n \"ArcCurve\",\r\n \"ArrayCamera\",\r\n \"ArrowHelper\",\r\n \"AttachedBindMode\",\r\n \"Audio\",\r\n \"AudioAnalyser\",\r\n \"AudioContext\",\r\n \"AudioListener\",\r\n \"AudioLoader\",\r\n \"AxesHelper\",\r\n \"BackSide\",\r\n \"BasicDepthPacking\",\r\n \"BasicShadowMap\",\r\n \"BatchedMesh\",\r\n \"Bone\",\r\n \"BooleanKeyframeTrack\",\r\n \"Box2\",\r\n \"Box3\",\r\n \"Box3Helper\",\r\n \"BoxGeometry\",\r\n \"BoxHelper\",\r\n \"BufferAttribute\",\r\n \"BufferGeometry\",\r\n \"BufferGeometryLoader\",\r\n \"ByteType\",\r\n \"Cache\",\r\n \"Camera\",\r\n \"CameraHelper\",\r\n \"CanvasTexture\",\r\n \"CapsuleGeometry\",\r\n \"CatmullRomCurve3\",\r\n \"CineonToneMapping\",\r\n \"CircleGeometry\",\r\n \"ClampToEdgeWrapping\",\r\n \"Clock\",\r\n \"Color\",\r\n \"ColorKeyframeTrack\",\r\n \"ColorManagement\",\r\n \"CompressedArrayTexture\",\r\n \"CompressedCubeTexture\",\r\n \"CompressedTexture\",\r\n \"CompressedTextureLoader\",\r\n \"ConeGeometry\",\r\n \"ConstantAlphaFactor\",\r\n \"ConstantColorFactor\",\r\n \"Controls\",\r\n \"createCanvasElement\",\r\n \"CubeCamera\",\r\n \"CubeReflectionMapping\",\r\n \"CubeRefractionMapping\",\r\n \"CubeTexture\",\r\n \"CubeTextureLoader\",\r\n \"CubeUVReflectionMapping\",\r\n \"CubicBezierCurve\",\r\n \"CubicBezierCurve3\",\r\n \"CubicInterpolant\",\r\n \"CullFaceBack\",\r\n \"CullFaceFront\",\r\n \"CullFaceFrontBack\",\r\n \"CullFaceNone\",\r\n \"Curve\",\r\n \"CurvePath\",\r\n \"CustomBlending\",\r\n \"CustomToneMapping\",\r\n \"CylinderGeometry\",\r\n \"Cylindrical\",\r\n \"Data3DTexture\",\r\n \"DataArrayTexture\",\r\n \"DataTexture\",\r\n \"DataTextureLoader\",\r\n \"DataUtils\",\r\n \"DecrementStencilOp\",\r\n \"DecrementWrapStencilOp\",\r\n \"DefaultLoadingManager\",\r\n \"DepthFormat\",\r\n \"DepthStencilFormat\",\r\n \"DepthTexture\",\r\n \"DetachedBindMode\",\r\n \"DirectionalLight\",\r\n \"DirectionalLightHelper\",\r\n \"DiscreteInterpolant\",\r\n \"DodecahedronGeometry\",\r\n \"DoubleSide\",\r\n \"DstAlphaFactor\",\r\n \"DstColorFactor\",\r\n \"DynamicCopyUsage\",\r\n \"DynamicDrawUsage\",\r\n \"DynamicReadUsage\",\r\n \"EdgesGeometry\",\r\n \"EllipseCurve\",\r\n \"EqualCompare\",\r\n \"EqualDepth\",\r\n \"EqualStencilFunc\",\r\n \"EquirectangularReflectionMapping\",\r\n \"EquirectangularRefractionMapping\",\r\n \"Euler\",\r\n \"EventDispatcher\",\r\n \"ExtrudeGeometry\",\r\n \"FileLoader\",\r\n \"Float16BufferAttribute\",\r\n \"Float32BufferAttribute\",\r\n \"FloatType\",\r\n \"Fog\",\r\n \"FogExp2\",\r\n \"FramebufferTexture\",\r\n \"FrontSide\",\r\n \"Frustum\",\r\n \"GLBufferAttribute\",\r\n \"GLSL1\",\r\n \"GLSL3\",\r\n \"GreaterCompare\",\r\n \"GreaterDepth\",\r\n \"GreaterEqualCompare\",\r\n \"GreaterEqualDepth\",\r\n \"GreaterEqualStencilFunc\",\r\n \"GreaterStencilFunc\",\r\n \"GridHelper\",\r\n \"Group\",\r\n \"HalfFloatType\",\r\n \"HemisphereLight\",\r\n \"HemisphereLightHelper\",\r\n \"IcosahedronGeometry\",\r\n \"ImageBitmapLoader\",\r\n \"ImageLoader\",\r\n \"ImageUtils\",\r\n \"IncrementStencilOp\",\r\n \"IncrementWrapStencilOp\",\r\n \"InstancedBufferAttribute\",\r\n \"InstancedBufferGeometry\",\r\n \"InstancedInterleavedBuffer\",\r\n \"InstancedMesh\",\r\n \"Int16BufferAttribute\",\r\n \"Int32BufferAttribute\",\r\n \"Int8BufferAttribute\",\r\n \"InterleavedBuffer\",\r\n \"InterleavedBufferAttribute\",\r\n \"Interpolant\",\r\n \"InterpolateDiscrete\",\r\n \"InterpolateLinear\",\r\n \"InterpolateSmooth\",\r\n \"IntType\",\r\n \"InvertStencilOp\",\r\n \"KeepStencilOp\",\r\n \"KeyframeTrack\",\r\n \"LatheGeometry\",\r\n \"Layers\",\r\n \"LessCompare\",\r\n \"LessDepth\",\r\n \"LessEqualCompare\",\r\n \"LessEqualDepth\",\r\n \"LessEqualStencilFunc\",\r\n \"LessStencilFunc\",\r\n \"Light\",\r\n \"LightProbe\",\r\n \"Line\",\r\n \"Line3\",\r\n \"LinearFilter\",\r\n \"LinearInterpolant\",\r\n \"LinearMipmapLinearFilter\",\r\n \"LinearMipMapLinearFilter\",\r\n \"LinearMipmapNearestFilter\",\r\n \"LinearMipMapNearestFilter\",\r\n \"LinearSRGBColorSpace\",\r\n \"LinearToneMapping\",\r\n \"LinearTransfer\",\r\n \"LineBasicMaterial\",\r\n \"LineCurve\",\r\n \"LineCurve3\",\r\n \"LineDashedMaterial\",\r\n \"LineLoop\",\r\n \"LineSegments\",\r\n \"Loader\",\r\n \"LoaderUtils\",\r\n \"LoadingManager\",\r\n \"LOD\",\r\n \"LoopOnce\",\r\n \"LoopPingPong\",\r\n \"LoopRepeat\",\r\n \"LuminanceAlphaFormat\",\r\n \"LuminanceFormat\",\r\n \"Material\",\r\n \"MaterialLoader\",\r\n \"MathUtils\",\r\n \"Matrix2\",\r\n \"Matrix3\",\r\n \"Matrix4\",\r\n \"MaxEquation\",\r\n \"Mesh\",\r\n \"MeshBasicMaterial\",\r\n \"MeshDepthMaterial\",\r\n \"MeshDistanceMaterial\",\r\n \"MeshLambertMaterial\",\r\n \"MeshMatcapMaterial\",\r\n \"MeshNormalMaterial\",\r\n \"MeshPhongMaterial\",\r\n \"MeshPhysicalMaterial\",\r\n \"MeshStandardMaterial\",\r\n \"MeshToonMaterial\",\r\n \"MinEquation\",\r\n \"MirroredRepeatWrapping\",\r\n \"MixOperation\",\r\n \"MOUSE\",\r\n \"MultiplyBlending\",\r\n \"MultiplyOperation\",\r\n \"NearestFilter\",\r\n \"NearestMipmapLinearFilter\",\r\n \"NearestMipMapLinearFilter\",\r\n \"NearestMipmapNearestFilter\",\r\n \"NearestMipMapNearestFilter\",\r\n \"NeutralToneMapping\",\r\n \"NeverCompare\",\r\n \"NeverDepth\",\r\n \"NeverStencilFunc\",\r\n \"NoBlending\",\r\n \"NoColorSpace\",\r\n \"NormalAnimationBlendMode\",\r\n \"NormalBlending\",\r\n \"NotEqualCompare\",\r\n \"NotEqualDepth\",\r\n \"NotEqualStencilFunc\",\r\n \"NoToneMapping\",\r\n \"NumberKeyframeTrack\",\r\n \"Object3D\",\r\n \"ObjectLoader\",\r\n \"ObjectSpaceNormalMap\",\r\n \"OctahedronGeometry\",\r\n \"OneFactor\",\r\n \"OneMinusConstantAlphaFactor\",\r\n \"OneMinusConstantColorFactor\",\r\n \"OneMinusDstAlphaFactor\",\r\n \"OneMinusDstColorFactor\",\r\n \"OneMinusSrcAlphaFactor\",\r\n \"OneMinusSrcColorFactor\",\r\n \"OrthographicCamera\",\r\n \"Path\",\r\n \"PCFShadowMap\",\r\n \"PCFSoftShadowMap\",\r\n \"PerspectiveCamera\",\r\n \"Plane\",\r\n \"PlaneGeometry\",\r\n \"PlaneHelper\",\r\n \"PMREMGenerator\",\r\n \"PointLight\",\r\n \"PointLightHelper\",\r\n \"Points\",\r\n \"PointsMaterial\",\r\n \"PolarGridHelper\",\r\n \"PolyhedronGeometry\",\r\n \"PositionalAudio\",\r\n \"PropertyBinding\",\r\n \"PropertyMixer\",\r\n \"QuadraticBezierCurve\",\r\n \"QuadraticBezierCurve3\",\r\n \"Quaternion\",\r\n \"QuaternionKeyframeTrack\",\r\n \"QuaternionLinearInterpolant\",\r\n \"RawShaderMaterial\",\r\n \"Ray\",\r\n \"Raycaster\",\r\n \"RectAreaLight\",\r\n \"RED_GREEN_RGTC2_Format\",\r\n \"RED_RGTC1_Format\",\r\n \"RedFormat\",\r\n \"RedIntegerFormat\",\r\n \"ReinhardToneMapping\",\r\n \"RenderTarget\",\r\n \"RepeatWrapping\",\r\n \"ReplaceStencilOp\",\r\n \"ReverseSubtractEquation\",\r\n \"REVISION\",\r\n \"RGB_BPTC_SIGNED_Format\",\r\n \"RGB_BPTC_UNSIGNED_Format\",\r\n \"RGB_ETC1_Format\",\r\n \"RGB_ETC2_Format\",\r\n \"RGB_PVRTC_2BPPV1_Format\",\r\n \"RGB_PVRTC_4BPPV1_Format\",\r\n \"RGB_S3TC_DXT1_Format\",\r\n \"RGBA_ASTC_10x10_Format\",\r\n \"RGBA_ASTC_10x5_Format\",\r\n \"RGBA_ASTC_10x6_Format\",\r\n \"RGBA_ASTC_10x8_Format\",\r\n \"RGBA_ASTC_12x10_Format\",\r\n \"RGBA_ASTC_12x12_Format\",\r\n \"RGBA_ASTC_4x4_Format\",\r\n \"RGBA_ASTC_5x4_Format\",\r\n \"RGBA_ASTC_5x5_Format\",\r\n \"RGBA_ASTC_6x5_Format\",\r\n \"RGBA_ASTC_6x6_Format\",\r\n \"RGBA_ASTC_8x5_Format\",\r\n \"RGBA_ASTC_8x6_Format\",\r\n \"RGBA_ASTC_8x8_Format\",\r\n \"RGBA_BPTC_Format\",\r\n \"RGBA_ETC2_EAC_Format\",\r\n \"RGBA_PVRTC_2BPPV1_Format\",\r\n \"RGBA_PVRTC_4BPPV1_Format\",\r\n \"RGBA_S3TC_DXT1_Format\",\r\n \"RGBA_S3TC_DXT3_Format\",\r\n \"RGBA_S3TC_DXT5_Format\",\r\n \"RGBADepthPacking\",\r\n \"RGBAFormat\",\r\n \"RGBAIntegerFormat\",\r\n \"RGBDepthPacking\",\r\n \"RGBFormat\",\r\n \"RGBIntegerFormat\",\r\n \"RGDepthPacking\",\r\n \"RGFormat\",\r\n \"RGIntegerFormat\",\r\n \"RingGeometry\",\r\n \"Scene\",\r\n \"ShaderChunk\",\r\n \"ShaderLib\",\r\n \"ShaderMaterial\",\r\n \"ShadowMaterial\",\r\n \"Shape\",\r\n \"ShapeGeometry\",\r\n \"ShapePath\",\r\n \"ShapeUtils\",\r\n \"ShortType\",\r\n \"SIGNED_RED_GREEN_RGTC2_Format\",\r\n \"SIGNED_RED_RGTC1_Format\",\r\n \"Skeleton\",\r\n \"SkeletonHelper\",\r\n \"SkinnedMesh\",\r\n \"Source\",\r\n \"Sphere\",\r\n \"SphereGeometry\",\r\n \"Spherical\",\r\n \"SphericalHarmonics3\",\r\n \"SplineCurve\",\r\n \"SpotLight\",\r\n \"SpotLightHelper\",\r\n \"Sprite\",\r\n \"SpriteMaterial\",\r\n \"SrcAlphaFactor\",\r\n \"SrcAlphaSaturateFactor\",\r\n \"SrcColorFactor\",\r\n \"SRGBColorSpace\",\r\n \"SRGBTransfer\",\r\n \"StaticCopyUsage\",\r\n \"StaticDrawUsage\",\r\n \"StaticReadUsage\",\r\n \"StereoCamera\",\r\n \"StreamCopyUsage\",\r\n \"StreamDrawUsage\",\r\n \"StreamReadUsage\",\r\n \"StringKeyframeTrack\",\r\n \"SubtractEquation\",\r\n \"SubtractiveBlending\",\r\n \"TangentSpaceNormalMap\",\r\n \"TetrahedronGeometry\",\r\n \"Texture\",\r\n \"TextureLoader\",\r\n \"TextureUtils\",\r\n \"TorusGeometry\",\r\n \"TorusKnotGeometry\",\r\n \"TOUCH\",\r\n \"Triangle\",\r\n \"TriangleFanDrawMode\",\r\n \"TrianglesDrawMode\",\r\n \"TriangleStripDrawMode\",\r\n \"TubeGeometry\",\r\n \"Uint16BufferAttribute\",\r\n \"Uint32BufferAttribute\",\r\n \"Uint8BufferAttribute\",\r\n \"Uint8ClampedBufferAttribute\",\r\n \"Uniform\",\r\n \"UniformsGroup\",\r\n \"UniformsLib\",\r\n \"UniformsUtils\",\r\n \"UnsignedByteType\",\r\n \"UnsignedInt248Type\",\r\n \"UnsignedInt5999Type\",\r\n \"UnsignedIntType\",\r\n \"UnsignedShort4444Type\",\r\n \"UnsignedShort5551Type\",\r\n \"UnsignedShortType\",\r\n \"UVMapping\",\r\n \"Vector2\",\r\n \"Vector3\",\r\n \"Vector4\",\r\n \"VectorKeyframeTrack\",\r\n \"VideoTexture\",\r\n \"VSMShadowMap\",\r\n \"WebGL3DRenderTarget\",\r\n \"WebGLArrayRenderTarget\",\r\n \"WebGLCoordinateSystem\",\r\n \"WebGLCubeRenderTarget\",\r\n \"WebGLMultipleRenderTargets\",\r\n \"WebGLRenderer\",\r\n \"WebGLRenderTarget\",\r\n \"WebGLUtils\",\r\n \"WebGPUCoordinateSystem\",\r\n \"WireframeGeometry\",\r\n \"WrapAroundEnding\",\r\n \"ZeroCurvatureEnding\",\r\n \"ZeroFactor\",\r\n \"ZeroSlopeEnding\",\r\n \"ZeroStencilOp\"\r\n] as const;\r\n","import type { Plugin, Connect, ViteDevServer } from 'vite'\r\nimport type { ServerResponse } from 'http'\r\nimport path from 'path'\r\nimport fs from 'fs'\r\nimport {\r\n EMBEDDED_LIBRARY_BY_KEY,\r\n EMBEDDED_LIBRARIES,\r\n MODULE_TO_LIBRARY_SPECIFIERS,\r\n DEFAULT_SHARED_LIB_CDN_BASE,\r\n type EmbeddedLibraryDefinition,\r\n type ModuleSpecifierConfig,\r\n} from '../shared-assets/embeddedLibrariesManifest'\r\nimport {\r\n EMBEDDED_THREE_NAMED_EXPORTS,\r\n EMBEDDED_THREE_VERSION,\r\n} from '../shared-assets/generated/threeExports'\r\n\r\nexport interface VenusLibrariesPluginOptions {\r\n /**\r\n * Your app name (used for CDN asset serving in dev mode)\r\n * Optional - only needed if you have game assets in cdn/ folder\r\n * Example: 'block-breakers', 'fortunes-22'\r\n */\r\n appName?: string\r\n\r\n /**\r\n * Path to local cdn/ folder (relative to vite.config.ts)\r\n * Defaults to './cdn'\r\n */\r\n cdnDir?: string\r\n\r\n /**\r\n * Enable debug logging\r\n * Defaults to false\r\n */\r\n debug?: boolean\r\n}\r\n\r\n/**\r\n * Generate virtual module code based on library and specifier behavior\r\n */\r\nasync function resolveInstalledPackageVersion(\r\n pluginContext: { resolve: Plugin['resolveId'] extends any ? any : any },\r\n packageName: string,\r\n cache: Map<string, string | null>,\r\n): Promise<string | null> {\r\n if (cache.has(packageName)) {\r\n return cache.get(packageName) ?? null\r\n }\r\n\r\n const readVersion = (packageJsonPath: string): string | null => {\r\n const raw = fs.readFileSync(packageJsonPath, 'utf8')\r\n const parsed = JSON.parse(raw)\r\n return typeof parsed?.version === 'string' ? parsed.version : null\r\n }\r\n\r\n const findNearestPackageJson = (fromFilePath: string): string | null => {\r\n let dir = path.dirname(fromFilePath)\r\n while (true) {\r\n const candidate = path.join(dir, 'package.json')\r\n if (fs.existsSync(candidate) && fs.statSync(candidate).isFile()) {\r\n return candidate\r\n }\r\n const parent = path.dirname(dir)\r\n if (parent === dir) return null\r\n dir = parent\r\n }\r\n }\r\n\r\n try {\r\n // Best-case: resolve package.json directly (works when exports allows it).\r\n const pkgJsonResolved = await pluginContext.resolve(\r\n `${packageName}/package.json`,\r\n void 0,\r\n { skipSelf: true },\r\n )\r\n if (pkgJsonResolved?.id && fs.existsSync(pkgJsonResolved.id)) {\r\n const v = readVersion(pkgJsonResolved.id)\r\n cache.set(packageName, v)\r\n return v\r\n }\r\n\r\n // Fallback: resolve package entry, then walk up to nearest package.json.\r\n const entryResolved = await pluginContext.resolve(packageName, void 0, {\r\n skipSelf: true,\r\n })\r\n if (entryResolved?.id) {\r\n const pkgJsonPath = findNearestPackageJson(entryResolved.id)\r\n const v = pkgJsonPath ? readVersion(pkgJsonPath) : null\r\n cache.set(packageName, v)\r\n return v\r\n }\r\n } catch {\r\n // ignore (we'll store null below)\r\n }\r\n\r\n cache.set(packageName, null)\r\n return null\r\n}\r\n\r\nfunction generateVirtualModule(\r\n lib: EmbeddedLibraryDefinition,\r\n spec: ModuleSpecifierConfig,\r\n importPath: string,\r\n): string {\r\n const errorCheck = `\r\n// Wait for shim to complete loading libraries\r\nif (window.__venusLibraryShim && window.__venusLibraryShim.ready) {\r\n try {\r\n await window.__venusLibraryShim.ready();\r\n } catch (error) {\r\n console.error('[Venus Libraries] Shim bootstrap failed:', error);\r\n throw error;\r\n }\r\n} else {\r\n console.warn('[Venus Libraries] No shim found - running without embedded libraries');\r\n}\r\n\r\n// Verify library was loaded\r\nif (!window.__venusLibraryExports || !window.__venusLibraryExports['${lib.libraryKey}']) {\r\n console.error('[Venus Libraries] ${lib.packageName} library not loaded');\r\n console.error('[Venus Libraries] Config:', window.__venusLibrariesConfig);\r\n console.error('[Venus Libraries] Exports:', window.__venusLibraryExports);\r\n throw new Error(\r\n '${lib.packageName} not loaded (${importPath}). Check console for errors.'\r\n );\r\n}\r\n`\r\n\r\n const libVar = `window.__venusLibraryExports['${lib.libraryKey}']`\r\n\r\n const renderForwardedNamedExports = (\r\n names: readonly string[],\r\n chunkSize = 50,\r\n ): string => {\r\n if (names.length === 0) return ''\r\n\r\n const chunks: string[] = []\r\n for (let i = 0; i < names.length; i += chunkSize) {\r\n const slice = names.slice(i, i + chunkSize).join(', ')\r\n chunks.push(`export const { ${slice} } = lib;`)\r\n }\r\n return `\\n${chunks.join('\\n')}\\n`\r\n }\r\n\r\n switch (spec.behavior) {\r\n case 'react-jsx-runtime':\r\n // react/jsx-runtime - Production JSX transform\r\n return `\r\nconst React = await (async function() {\r\n ${errorCheck}\r\n return ${libVar};\r\n})();\r\n\r\nexport const jsx = React.jsx || function(type, props, key) {\r\n return React.createElement(type, { ...props, key });\r\n};\r\nexport const jsxs = React.jsxs || jsx;\r\nexport const Fragment = React.Fragment;\r\n`\r\n\r\n case 'react-jsx-dev-runtime':\r\n // react/jsx-dev-runtime - Development JSX transform\r\n return `\r\nconst React = await (async function() {\r\n ${errorCheck}\r\n return ${libVar};\r\n})();\r\n\r\nexport const jsxDEV = React.jsxDEV || React.createElement;\r\nexport const Fragment = React.Fragment;\r\n`\r\n\r\n case 'namespace':\r\n // Re-export all named exports (React, ReactDOM, Three.js, etc.)\r\n // For each library, we export the commonly used named exports\r\n let namedExports = ''\r\n if (lib.packageName === 'react') {\r\n namedExports = `\r\nexport const {\r\n createElement, createContext, createRef,\r\n Component, PureComponent, Fragment, StrictMode, Suspense, lazy, forwardRef, memo,\r\n useState, useEffect, useContext, useReducer, useCallback, useMemo, useRef, \r\n useLayoutEffect, useImperativeHandle, useDebugValue, useTransition, useDeferredValue,\r\n Children, cloneElement, isValidElement, version\r\n} = lib;`\r\n } else if (lib.packageName === 'react-dom') {\r\n namedExports = `\r\nexport const { createRoot, hydrateRoot, render, unmountComponentAtNode, findDOMNode, version } = lib;`\r\n } else if (lib.packageName === 'three') {\r\n // IMPORTANT:\r\n // - Our embedded Three is loaded as a global (window.THREE) via host/CDN.\r\n // - To support ESM consumers (`import * as THREE from 'three'` / `import { Scene } from 'three'`),\r\n // we must provide static named exports.\r\n // - ESM exports are static, so we generate the export-name list at release time and commit it.\r\n if (lib.version !== EMBEDDED_THREE_VERSION) {\r\n // If the manifest bumps but the generated file wasn't updated, fail loudly with an actionable message.\r\n namedExports = `\r\nthrow new Error('[Venus Libraries] Embedded three version mismatch: manifest has ${lib.version} but generated export list is for ${EMBEDDED_THREE_VERSION}. Run: npm run generate:embedded-three-exports (packages/api)');`\r\n } else {\r\n namedExports = renderForwardedNamedExports(EMBEDDED_THREE_NAMED_EXPORTS)\r\n }\r\n } else {\r\n // For other libraries, they should use default export only\r\n namedExports = ''\r\n }\r\n\r\n return `\r\nconst lib = await (async function() {\r\n ${errorCheck}\r\n return ${libVar};\r\n})();\r\n\r\nexport default lib;\r\n${namedExports}\r\n`\r\n\r\n case 'default':\r\n case undefined:\r\n // Simple default export (Phaser, Matter.js, inkjs, base React, etc.)\r\n return `\r\nconst lib = await (async function() {\r\n ${errorCheck}\r\n return ${libVar};\r\n})();\r\n\r\nexport default lib;\r\n`\r\n\r\n default:\r\n throw new Error(\r\n `Unknown behavior: ${spec.behavior} for ${lib.packageName}. Valid behaviors: default, namespace, react-jsx-runtime, react-jsx-dev-runtime`,\r\n )\r\n }\r\n}\r\n\r\n/**\r\n * Vite plugin for Venus embedded libraries system.\r\n *\r\n * This plugin externalizes supported libraries (Phaser, React, Three.js, etc.)\r\n * and loads them from the Venus host on mobile or CDN on web.\r\n *\r\n * By default, libraries are embedded for optimal bundle size.\r\n * Set VENUS_DISABLE_EMBEDDED_LIBS=true to bundle libraries for standalone export.\r\n *\r\n * @example\r\n * ```typescript\r\n * // vite.config.ts\r\n * import { venusLibrariesPlugin } from '@series-inc/venus-sdk/vite';\r\n *\r\n * export default defineConfig({\r\n * plugins: [\r\n * venusLibrariesPlugin({\r\n * appName: 'my-game',\r\n * cdnDir: './cdn',\r\n * }),\r\n * ],\r\n * });\r\n * ```\r\n *\r\n * Default build: npm run build (embedded libraries)\r\n * Standalone export: VENUS_DISABLE_EMBEDDED_LIBS=true npm run build\r\n */\r\nexport function venusLibrariesPlugin(\r\n options: VenusLibrariesPluginOptions = {},\r\n): Plugin {\r\n const cdnDir = path.resolve(options.cdnDir || './cdn')\r\n const debug = options.debug || false\r\n const requiredLibraries = new Set<string>()\r\n let isServe = false\r\n let enabled = false\r\n let appName = options.appName\r\n const installedVersionCache = new Map<string, string | null>()\r\n const loggedMismatch = new Set<string>()\r\n\r\n return {\r\n name: 'vite-plugin-venus-libraries',\r\n enforce: 'pre', // Run before other plugins to intercept imports\r\n\r\n async buildStart() {\r\n // Prime cache for enabled libraries (fast fail / fewer per-import resolves).\r\n if (!enabled) return\r\n const uniquePackages = Array.from(\r\n new Set(\r\n EMBEDDED_LIBRARIES.filter((l) => l.enabled).map((l) => l.packageName),\r\n ),\r\n )\r\n for (const pkgName of uniquePackages) {\r\n await resolveInstalledPackageVersion(this, pkgName, installedVersionCache)\r\n }\r\n },\r\n\r\n // 0. Configure Vite build options\r\n config(config: any): void {\r\n if (!enabled) return\r\n\r\n // Remove manualChunks for all library packages (conflicts with virtual modules)\r\n if (!config.build) config.build = {}\r\n if (!config.build.rollupOptions) config.build.rollupOptions = {}\r\n\r\n if (config.build.rollupOptions.output) {\r\n const output = config.build.rollupOptions.output\r\n const outputs = Array.isArray(output) ? output : [output]\r\n\r\n outputs.forEach((o) => {\r\n if (o.manualChunks && typeof o.manualChunks === 'object') {\r\n // Remove all enabled library package names from manualChunks\r\n const chunks = o.manualChunks as Record<string, string[]>\r\n EMBEDDED_LIBRARIES.forEach((lib) => {\r\n if (lib.enabled && chunks[lib.packageName]) {\r\n delete chunks[lib.packageName]\r\n }\r\n })\r\n }\r\n })\r\n }\r\n },\r\n\r\n // Log plugin status\r\n configResolved(config: any): void {\r\n isServe = config.command === 'serve'\r\n // Only enable for production builds, not dev server\r\n // Set VENUS_DISABLE_EMBEDDED_LIBS=true to create standalone bundles with libraries included\r\n enabled = !isServe && process.env.VENUS_DISABLE_EMBEDDED_LIBS !== 'true'\r\n\r\n // Auto-detect app name from folder structure if not provided\r\n // Pattern: /path/to/H5/{app-name}/ → use {app-name}\r\n // If not in H5 structure, CDN serving is disabled (embedded libraries still work)\r\n if (!appName && config.root) {\r\n const rootParts = config.root.split(path.sep)\r\n const h5Index = rootParts.indexOf('H5')\r\n if (h5Index >= 0 && h5Index < rootParts.length - 1) {\r\n appName = rootParts[h5Index + 1]\r\n if (debug) {\r\n console.log(\r\n `[Venus Libraries] Auto-detected app name from folder structure: ${appName}`,\r\n )\r\n }\r\n } else if (debug) {\r\n console.log(\r\n '[Venus Libraries] Not in H5 folder structure - CDN asset serving disabled (embedded libraries still work)',\r\n )\r\n }\r\n }\r\n\r\n if (isServe) {\r\n // Dev mode always bundles for fast HMR\r\n return\r\n }\r\n\r\n // Always log bundled mode (so devs know why bundle is large)\r\n if (!enabled) {\r\n console.log(\r\n '\\n[Venus Libraries] Building with bundled libraries (standalone mode)',\r\n )\r\n }\r\n },\r\n\r\n // 1. Intercept library imports\r\n async resolveId(\r\n id: string,\r\n importer: string | undefined,\r\n ): Promise<string | null> {\r\n if (!enabled) return null\r\n\r\n // Check if this import matches any enabled library specifier\r\n // MODULE_TO_LIBRARY_SPECIFIERS is already filtered to only include enabled libraries\r\n const match = MODULE_TO_LIBRARY_SPECIFIERS.find((spec) => {\r\n if (spec.match === 'exact') {\r\n return spec.value === id\r\n } else if (spec.match === 'prefix') {\r\n return id.startsWith(spec.value)\r\n }\r\n return false\r\n })\r\n\r\n if (match) {\r\n const lib = EMBEDDED_LIBRARY_BY_KEY[match.libraryKey]\r\n if (!lib) {\r\n throw new Error(\r\n `[Venus Libraries] Internal error: no embedded library for key ${match.libraryKey}`,\r\n )\r\n }\r\n\r\n // Version gate: only rewrite to embedded libs if the app's installed version\r\n // exactly matches the embedded version.\r\n const installed = await resolveInstalledPackageVersion(\r\n this,\r\n lib.packageName,\r\n installedVersionCache,\r\n )\r\n\r\n if (installed !== lib.version) {\r\n if (debug && !loggedMismatch.has(lib.packageName)) {\r\n loggedMismatch.add(lib.packageName)\r\n console.log(\r\n `[Venus Libraries] Skipping embedded ${lib.packageName}: installed=${installed ?? 'unknown'} embedded=${lib.version}`,\r\n )\r\n }\r\n return null\r\n }\r\n\r\n requiredLibraries.add(match.libraryKey)\r\n return `\\0virtual:venus-lib:${match.libraryKey}:${id}`\r\n }\r\n\r\n return null\r\n },\r\n\r\n // 2. Generate virtual module\r\n load(id: string): string | null {\r\n if (!id.startsWith('\\0virtual:venus-lib:')) {\r\n return null\r\n }\r\n\r\n // Parse virtual module ID: '\\0virtual:venus-lib:react@18.3.1:react/jsx-runtime'\r\n const parts = id.split(':')\r\n const libraryKey = parts[2]\r\n const importPath = parts.slice(3).join(':')\r\n\r\n const lib = EMBEDDED_LIBRARY_BY_KEY[libraryKey]\r\n if (!lib) {\r\n const availableKeys = Object.keys(EMBEDDED_LIBRARY_BY_KEY).join(', ')\r\n throw new Error(\r\n `Unknown library: ${libraryKey}. Available libraries: ${availableKeys}`,\r\n )\r\n }\r\n\r\n const spec = lib.moduleSpecifiers.find((s) => {\r\n if (s.match === 'exact') return s.value === importPath\r\n if (s.match === 'prefix') return importPath.startsWith(s.value)\r\n return false\r\n })\r\n if (!spec) {\r\n const validSpecifiers = lib.moduleSpecifiers\r\n .map((s) => s.value)\r\n .join(', ')\r\n throw new Error(\r\n `Unknown module specifier: ${importPath} for ${libraryKey}. Valid specifiers: ${validSpecifiers}`,\r\n )\r\n }\r\n\r\n const virtualModule = generateVirtualModule(lib, spec, importPath)\r\n\r\n return `// Virtual module: ${importPath}\\n${virtualModule}`\r\n },\r\n\r\n // 3. Transform HTML - inject config and shim for web support\r\n transformIndexHtml(html: string): string {\r\n if (!enabled || requiredLibraries.size === 0) {\r\n return html\r\n }\r\n\r\n // Build manifest for config\r\n const manifest: Record<string, any> = {}\r\n requiredLibraries.forEach((libraryKey) => {\r\n const lib = EMBEDDED_LIBRARY_BY_KEY[libraryKey]\r\n manifest[libraryKey] = {\r\n assetKey: lib.assetKey,\r\n cdnPath: lib.cdnPath,\r\n globalVar: lib.globalVar,\r\n loadStage: lib.loadStage,\r\n }\r\n })\r\n\r\n // Inject config + minimal shim for web\r\n // On mobile: Full shim via injectedJavaScriptBeforeContentLoaded (will override this)\r\n // On web: This minimal shim loads from CDN\r\n const embeddedLibsScript = `\r\n<script>\r\n // Set config (may be overridden by Venus host)\r\n if (!window.__venusLibrariesConfig) {\r\n window.__venusLibrariesConfig = {\r\n enabled: true,\r\n required: ${JSON.stringify(Array.from(requiredLibraries))},\r\n manifest: ${JSON.stringify(manifest, null, 2)},\r\n cdnBase: '${DEFAULT_SHARED_LIB_CDN_BASE}',\r\n useHost: false, // Web uses CDN\r\n debug: ${debug}\r\n };\r\n }\r\n \r\n // Minimal shim for web (CDN loading)\r\n if (!window.__venusLibraryShim) {\r\n var bootstrapResolve, bootstrapReject;\r\n var bootstrapPromise = new Promise(function(resolve, reject) {\r\n bootstrapResolve = resolve;\r\n bootstrapReject = reject;\r\n });\r\n \r\n window.__venusLibraryShim = {\r\n ready: function() { return bootstrapPromise; },\r\n __initialized: true\r\n };\r\n \r\n // Auto-load libraries from CDN by stage (respects dependencies)\r\n var config = window.__venusLibrariesConfig;\r\n if (!config.required || config.required.length === 0) {\r\n bootstrapResolve();\r\n } else {\r\n // Group libraries by load stage\r\n var librariesByStage = {};\r\n for (var i = 0; i < config.required.length; i++) {\r\n var libraryKey = config.required[i];\r\n var entry = config.manifest[libraryKey];\r\n var stage = entry.loadStage || 0;\r\n if (!librariesByStage[stage]) librariesByStage[stage] = [];\r\n librariesByStage[stage].push({ libraryKey: libraryKey, entry: entry });\r\n }\r\n \r\n // Load stages sequentially, libraries within each stage in parallel\r\n var stages = Object.keys(librariesByStage).sort(function(a, b) { return parseInt(a, 10) - parseInt(b, 10); });\r\n \r\n (async function loadByStages() {\r\n for (var s = 0; s < stages.length; s++) {\r\n var stage = stages[s];\r\n var libs = librariesByStage[stage];\r\n \r\n // Load all libraries in this stage in parallel\r\n var stagePromises = libs.map(function(lib) {\r\n var base = config.cdnBase || '';\r\n if (!base.endsWith('/')) base += '/';\r\n var path = lib.entry.cdnPath;\r\n if (path.charAt(0) === '/') path = path.substring(1);\r\n var url = base + path;\r\n return fetch(url)\r\n .then(function(r) {\r\n if (!r.ok) throw new Error('HTTP ' + r.status + ' fetching ' + url);\r\n return r.text();\r\n })\r\n .then(function(src) {\r\n try {\r\n (new Function(src)).call(window);\r\n } catch (evalErr) {\r\n throw new Error('Failed to evaluate ' + lib.libraryKey + ': ' + evalErr.message);\r\n }\r\n if (!window.__venusLibraryExports) window.__venusLibraryExports = {};\r\n var exported = window[lib.entry.globalVar];\r\n if (!exported) {\r\n throw new Error(lib.libraryKey + ' loaded but window.' + lib.entry.globalVar + ' is undefined. Check CDN file.');\r\n }\r\n window.__venusLibraryExports[lib.libraryKey] = exported;\r\n })\r\n .catch(function(err) {\r\n throw new Error('[' + lib.libraryKey + '] ' + err.message);\r\n });\r\n });\r\n \r\n await Promise.all(stagePromises);\r\n }\r\n })()\r\n .then(function() {\r\n bootstrapResolve();\r\n })\r\n .catch(function(err) {\r\n console.error('[Venus Libraries] Library loading failed:', err.message || err);\r\n bootstrapReject(err);\r\n });\r\n }\r\n }\r\n</script>`\r\n\r\n return html.replace('<head>', '<head>' + embeddedLibsScript)\r\n },\r\n\r\n // 4. Serve CDN assets in dev mode (only if in H5 folder structure)\r\n configureServer(server: ViteDevServer): void {\r\n if (!enabled || !appName) {\r\n // CDN serving disabled - either plugin disabled or not in H5 structure\r\n // Embedded libraries still work via CDN URLs in production\r\n return\r\n }\r\n\r\n if (debug) {\r\n console.log(\r\n `[Venus Libraries] Dev server will serve /${appName}/* from ${cdnDir}`,\r\n )\r\n }\r\n\r\n server.middlewares.use(\r\n (\r\n req: Connect.IncomingMessage,\r\n res: ServerResponse,\r\n next: Connect.NextFunction,\r\n ) => {\r\n if (!req.url) return next()\r\n\r\n const urlPath = req.url.split('?')[0]\r\n if (!urlPath.startsWith(`/${appName}/`)) return next()\r\n\r\n const relativePath = urlPath.replace(`/${appName}/`, '')\r\n const filePath = path.join(cdnDir, relativePath)\r\n\r\n if (fs.existsSync(filePath) && fs.statSync(filePath).isFile()) {\r\n const ext = path.extname(filePath).toLowerCase()\r\n const contentTypes: Record<string, string> = {\r\n '.png': 'image/png',\r\n '.jpg': 'image/jpeg',\r\n '.jpeg': 'image/jpeg',\r\n '.gif': 'image/gif',\r\n '.webp': 'image/webp',\r\n '.mp3': 'audio/mpeg',\r\n '.mp4': 'video/mp4',\r\n '.ogg': 'audio/ogg',\r\n '.wav': 'audio/wav',\r\n '.json': 'application/json',\r\n }\r\n\r\n res.setHeader(\r\n 'Content-Type',\r\n contentTypes[ext] || 'application/octet-stream',\r\n )\r\n res.setHeader('Cache-Control', 'public, max-age=3600')\r\n return res.end(fs.readFileSync(filePath))\r\n }\r\n\r\n next()\r\n },\r\n )\r\n },\r\n\r\n // 5. Emit manifest for debugging\r\n generateBundle(): void {\r\n if (!enabled || requiredLibraries.size === 0) return\r\n\r\n // Build complete manifest with library details\r\n const libraries: Record<string, any> = {}\r\n const libraryNames: string[] = []\r\n let totalSavingsKB = 0\r\n\r\n requiredLibraries.forEach((libraryKey) => {\r\n const lib = EMBEDDED_LIBRARY_BY_KEY[libraryKey]\r\n libraries[libraryKey] = {\r\n assetKey: lib.assetKey,\r\n cdnPath: lib.cdnPath,\r\n globalVar: lib.globalVar,\r\n packageName: lib.packageName,\r\n version: lib.version,\r\n moduleSpecifiers: lib.moduleSpecifiers.map((s) => s.value),\r\n }\r\n\r\n libraryNames.push(lib.packageName)\r\n\r\n // Estimate savings (approximate sizes)\r\n const sizes: Record<string, number> = {\r\n phaser: 1100,\r\n react: 138,\r\n 'react-dom': 42,\r\n three: 600,\r\n 'matter-js': 100,\r\n inkjs: 50,\r\n }\r\n totalSavingsKB += sizes[lib.packageName] || 0\r\n })\r\n\r\n const manifest = {\r\n enabled: true,\r\n required: Array.from(requiredLibraries),\r\n libraries,\r\n cdnBase: DEFAULT_SHARED_LIB_CDN_BASE,\r\n buildTime: new Date().toISOString(),\r\n plugin: '@series-inc/venus-sdk/vite',\r\n }\r\n\r\n this.emitFile({\r\n type: 'asset',\r\n fileName: 'venus-libraries.manifest.json',\r\n source: JSON.stringify(manifest, null, 2),\r\n })\r\n\r\n // Summary log\r\n const libList = libraryNames.join(', ')\r\n const savingsMsg =\r\n totalSavingsKB > 0 ? ` (~${totalSavingsKB}KB saved)` : ''\r\n console.log(\r\n `\\n[Venus Libraries] Using embedded libraries to reduce bundle size: ${libList}${savingsMsg}`,\r\n )\r\n },\r\n }\r\n}\r\n","import path from 'node:path'\r\nimport fs from 'node:fs'\r\nimport { ResolvedConfig } from 'vite'\r\n\r\nexport function cdnPlugin() {\r\n let config: ResolvedConfig;\r\n return {\r\n name: 'remove-dev-assets',\r\n apply: 'build',\r\n\r\n // Hook to capture the resolved config\r\n configResolved(resolvedConfig: ResolvedConfig) {\r\n config = resolvedConfig;\r\n },\r\n\r\n closeBundle() {\r\n const outDir = config.build.outDir;\r\n const devAssetsDir = path.resolve(config.root, outDir, 'cdn');\r\n\r\n if (fs.existsSync(devAssetsDir)) {\r\n fs.rmSync(devAssetsDir, { recursive: true, force: true });\r\n console.log(`[Cleanup] Removed cdn from: ${devAssetsDir}`);\r\n }\r\n }\r\n };\r\n}","/* Minimal CSS - FAB uses inline styles only for guaranteed floating behavior */\r\n\r\n/* Optional: Override input styling for modal if needed */\r\ninput[style*=\"background: rgba(0, 0, 0, 0.2)\"],\r\nselect[style*=\"background: rgba(0, 0, 0, 0.2)\"] {\r\n box-sizing: border-box;\r\n}\r\n\r\ninput[style*=\"background: rgba(0, 0, 0, 0.2)\"]:focus,\r\nselect[style*=\"background: rgba(0, 0, 0, 0.2)\"]:focus {\r\n outline: none;\r\n border-color: rgba(59, 130, 246, 0.5) !important;\r\n box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.1);\r\n}\r\n\r\nbutton[style*=\"background: #3B82F6\"]:hover {\r\n background: #2563EB !important;\r\n}\r\n\r\nbutton[style*=\"background: #3B82F6\"]:disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n}\r\n","export default \"/**\\r\\n * Venus Sandbox Toolbar\\r\\n *\\r\\n * Floating toolbar that shows auth status and provides sign-in functionality.\\r\\n * Auth state is managed by Firebase Auth and persisted in IndexedDB.\\r\\n */\\r\\n\\r\\nconst LOCAL_STORAGE_POS_KEY = 'venus-sandbox-pos'\\r\\n\\r\\n;(async () => {\\r\\n try {\\r\\n if (!shouldRenderToolbar()) {\\r\\n return\\r\\n }\\r\\n\\r\\n await ensureDomReady()\\r\\n\\r\\n const sandboxConfig = window.__VENUS_SANDBOX__ || {}\\r\\n const sandboxEnabled = isSandboxEnabled(sandboxConfig)\\r\\n\\r\\n if (!sandboxEnabled) {\\r\\n return\\r\\n }\\r\\n\\r\\n // Create minimal FAB with inline styles\\r\\n createFloatingToolbar(sandboxConfig)\\r\\n } catch (error) {\\r\\n console.error('[Venus Sandbox] Failed to render toolbar:', error)\\r\\n }\\r\\n})()\\r\\n\\r\\nfunction shouldRenderToolbar() {\\r\\n if (typeof window === 'undefined') {\\r\\n return false\\r\\n }\\r\\n const host = location.hostname\\r\\n return host === 'localhost' || host === '127.0.0.1' || host.endsWith('.local')\\r\\n}\\r\\n\\r\\nfunction ensureDomReady() {\\r\\n if (document.readyState === 'loading') {\\r\\n return new Promise((resolve) => {\\r\\n document.addEventListener('DOMContentLoaded', resolve, { once: true })\\r\\n })\\r\\n }\\r\\n return Promise.resolve()\\r\\n}\\r\\n\\r\\nfunction isSandboxEnabled(sandboxConfig) {\\r\\n return Boolean(sandboxConfig && sandboxConfig.enabled === true)\\r\\n}\\r\\n\\r\\nfunction createFloatingToolbar(sandboxConfig) {\\r\\n // Create main FAB element with inline styles\\r\\n const fab = document.createElement('div')\\r\\n fab.id = 'venus-sandbox-toolbar'\\r\\n\\r\\n // Get environment for theming\\r\\n const target = String(sandboxConfig?.target || 'local').toLowerCase()\\r\\n const envGradients = {\\r\\n local: 'linear-gradient(120deg, #f59e0b, #d97706)',\\r\\n dev: 'linear-gradient(120deg, #0891b2, #10b981)',\\r\\n staging: 'linear-gradient(120deg, #8b5cf6, #6366f1)',\\r\\n }\\r\\n const envLabels = {\\r\\n local: 'LOCAL',\\r\\n dev: 'DEV',\\r\\n staging: 'STAGING',\\r\\n }\\r\\n const initialGradient = envGradients[target] || envGradients.local\\r\\n const envLabel = envLabels[target] || 'LOCAL'\\r\\n\\r\\n // Get saved position or use defaults\\r\\n const savedPos = localStorage.getItem(LOCAL_STORAGE_POS_KEY)\\r\\n let posRight = 16\\r\\n let posY = Math.round((window.innerHeight - 36) / 2)\\r\\n\\r\\n if (savedPos) {\\r\\n try {\\r\\n const parsed = JSON.parse(savedPos)\\r\\n posRight = parsed.right\\r\\n posY = parsed.y\\r\\n } catch (e) {\\r\\n // Ignore invalid saved position\\r\\n }\\r\\n }\\r\\n\\r\\n // Ensure within bounds\\r\\n posRight = Math.min(Math.max(0, posRight), window.innerWidth - 36)\\r\\n posY = Math.min(Math.max(0, posY), window.innerHeight - 36)\\r\\n\\r\\n // Start with \\\"checking\\\" state using env gradient\\r\\n fab.style.cssText = `\\r\\n position: fixed;\\r\\n right: ${posRight}px;\\r\\n top: ${posY}px;\\r\\n width: auto;\\r\\n min-width: 160px;\\r\\n height: 36px;\\r\\n padding: 0;\\r\\n margin: 0;\\r\\n border: none;\\r\\n border-radius: 999px;\\r\\n background: ${initialGradient};\\r\\n color: #ffffff;\\r\\n font-family: system-ui, -apple-system, sans-serif;\\r\\n font-size: 12px;\\r\\n font-weight: 600;\\r\\n letter-spacing: 0.02em;\\r\\n cursor: grab;\\r\\n user-select: none;\\r\\n z-index: 2147483601;\\r\\n box-shadow: 0 12px 25px rgba(0, 0, 0, 0.35);\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 0;\\r\\n pointer-events: auto;\\r\\n border: 1px solid rgba(255, 255, 255, 0.2);\\r\\n `\\r\\n\\r\\n // Store env config on fab for later use\\r\\n fab.dataset.target = target\\r\\n fab.dataset.envGradient = initialGradient\\r\\n\\r\\n // Create env badge\\r\\n const envBadge = document.createElement('div')\\r\\n envBadge.style.cssText = `\\r\\n padding: 0 10px;\\r\\n height: 100%;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n font-size: 10px;\\r\\n font-weight: 700;\\r\\n letter-spacing: 0.05em;\\r\\n text-transform: uppercase;\\r\\n background: rgba(0, 0, 0, 0.2);\\r\\n border-top-left-radius: 999px;\\r\\n border-bottom-left-radius: 999px;\\r\\n `\\r\\n envBadge.textContent = envLabel\\r\\n\\r\\n // Create label container\\r\\n const labelDiv = document.createElement('div')\\r\\n labelDiv.style.cssText = `\\r\\n padding: 0 8px 0 10px;\\r\\n height: 100%;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n white-space: nowrap;\\r\\n cursor: pointer;\\r\\n `\\r\\n labelDiv.textContent = '🪐 Checking...'\\r\\n\\r\\n // Create handle for dragging\\r\\n const handleDiv = document.createElement('div')\\r\\n handleDiv.style.cssText = `\\r\\n width: 38px;\\r\\n height: 100%;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n font-size: 18px;\\r\\n font-weight: 600;\\r\\n background: rgba(0, 0, 0, 0.25);\\r\\n border-top-right-radius: 999px;\\r\\n border-bottom-right-radius: 999px;\\r\\n cursor: grab;\\r\\n `\\r\\n handleDiv.textContent = '✜'\\r\\n\\r\\n fab.appendChild(envBadge)\\r\\n fab.appendChild(labelDiv)\\r\\n fab.appendChild(handleDiv)\\r\\n\\r\\n const toolbarRoot = document.getElementById('venus-toolbar-root')\\r\\n ;(toolbarRoot || document.body).appendChild(fab)\\r\\n\\r\\n // Set up drag handling\\r\\n setupDragHandling(fab, handleDiv)\\r\\n\\r\\n // Set up collapse/expand behavior\\r\\n setupCollapseExpand(fab, envBadge, labelDiv)\\r\\n\\r\\n // Click handler for label to open modal\\r\\n labelDiv.addEventListener('click', () => {\\r\\n openAuthModal(sandboxConfig, getCurrentAuthState())\\r\\n })\\r\\n\\r\\n // Listen for auth state changes (set up by MockHost)\\r\\n window.addEventListener('venus-auth-state-changed', (e) => {\\r\\n updateToolbarState(fab, labelDiv, e.detail)\\r\\n })\\r\\n\\r\\n // Check initial auth state after a short delay (give Firebase time to restore session)\\r\\n setTimeout(() => {\\r\\n checkInitialAuthState(fab, labelDiv, sandboxConfig)\\r\\n }, 500)\\r\\n}\\r\\n\\r\\nlet currentAuthState = { signedIn: false, user: null }\\r\\n\\r\\nfunction getCurrentAuthState() {\\r\\n return currentAuthState\\r\\n}\\r\\n\\r\\nfunction checkInitialAuthState(fab, labelDiv, sandboxConfig) {\\r\\n // Dispatch event to check auth state (MockHost will respond)\\r\\n window.dispatchEvent(new CustomEvent('venus-check-auth-state'))\\r\\n\\r\\n // Also set a timeout to show sign-in prompt if no response\\r\\n setTimeout(() => {\\r\\n if (!currentAuthState.signedIn) {\\r\\n updateToolbarState(fab, labelDiv, { signedIn: false, user: null })\\r\\n }\\r\\n }, 2000)\\r\\n}\\r\\n\\r\\nfunction updateToolbarState(fab, labelDiv, authState) {\\r\\n currentAuthState = authState\\r\\n\\r\\n // Get stored env gradient\\r\\n const envGradient = fab.dataset.envGradient || 'linear-gradient(120deg, #f59e0b, #d97706)'\\r\\n\\r\\n if (authState.signedIn && authState.user) {\\r\\n // Signed in - use env gradient with full opacity\\r\\n fab.style.background = envGradient\\r\\n fab.style.opacity = '1'\\r\\n const displayName = authState.user.displayName || authState.user.email || 'Signed in'\\r\\n labelDiv.textContent = `✓ ${truncate(displayName, 14)}`\\r\\n } else {\\r\\n // Not signed in - use env gradient but slightly dimmed, with sign-in prompt\\r\\n fab.style.background = envGradient\\r\\n fab.style.opacity = '0.85'\\r\\n labelDiv.textContent = '○ Sign in'\\r\\n }\\r\\n}\\r\\n\\r\\nfunction truncate(str, maxLength) {\\r\\n if (str.length <= maxLength) return str\\r\\n return str.substring(0, maxLength - 1) + '…'\\r\\n}\\r\\n\\r\\nfunction setupCollapseExpand(fab, envBadge, labelDiv) {\\r\\n let collapseTimeout\\r\\n let isCollapsed = false\\r\\n\\r\\n const collapse = () => {\\r\\n fab.style.minWidth = '36px'\\r\\n fab.style.opacity = '0.4'\\r\\n envBadge.style.display = 'none'\\r\\n labelDiv.style.display = 'none'\\r\\n isCollapsed = true\\r\\n }\\r\\n\\r\\n const expand = () => {\\r\\n clearTimeout(collapseTimeout)\\r\\n fab.style.minWidth = '160px'\\r\\n fab.style.opacity = '1'\\r\\n envBadge.style.display = 'flex'\\r\\n labelDiv.style.display = 'flex'\\r\\n isCollapsed = false\\r\\n }\\r\\n\\r\\n const scheduleCollapse = () => {\\r\\n clearTimeout(collapseTimeout)\\r\\n collapseTimeout = setTimeout(collapse, 5000)\\r\\n }\\r\\n\\r\\n // Collapse after 5 seconds\\r\\n scheduleCollapse()\\r\\n\\r\\n fab.addEventListener('mouseenter', expand)\\r\\n fab.addEventListener('mouseleave', () => {\\r\\n if (!isCollapsed) scheduleCollapse()\\r\\n })\\r\\n}\\r\\n\\r\\nfunction setupDragHandling(fab, handleDiv) {\\r\\n let isDragging = false\\r\\n let startX, startY, offsetRight, offsetY\\r\\n\\r\\n fab.addEventListener('mousedown', (e) => {\\r\\n isDragging = true\\r\\n startX = e.clientX\\r\\n startY = e.clientY\\r\\n offsetRight = window.innerWidth - fab.offsetLeft - fab.offsetWidth\\r\\n offsetY = fab.offsetTop\\r\\n fab.style.cursor = 'grabbing'\\r\\n e.preventDefault()\\r\\n })\\r\\n\\r\\n document.addEventListener('mousemove', (e) => {\\r\\n if (!isDragging) return\\r\\n\\r\\n let newRight = offsetRight - (e.clientX - startX)\\r\\n let newTop = offsetY + (e.clientY - startY)\\r\\n\\r\\n newRight = Math.min(Math.max(0, newRight), window.innerWidth - 36)\\r\\n newTop = Math.min(Math.max(0, newTop), window.innerHeight - 36)\\r\\n\\r\\n fab.style.right = `${newRight}px`\\r\\n fab.style.top = `${newTop}px`\\r\\n })\\r\\n\\r\\n document.addEventListener('mouseup', () => {\\r\\n if (!isDragging) return\\r\\n isDragging = false\\r\\n fab.style.cursor = 'grab'\\r\\n const currentRight = window.innerWidth - fab.offsetLeft - fab.offsetWidth\\r\\n localStorage.setItem(LOCAL_STORAGE_POS_KEY, JSON.stringify({\\r\\n right: currentRight,\\r\\n y: fab.offsetTop,\\r\\n }))\\r\\n })\\r\\n}\\r\\n\\r\\nfunction openAuthModal(sandboxConfig, authState) {\\r\\n const overlay = document.createElement('div')\\r\\n overlay.style.cssText = `\\r\\n position: fixed;\\r\\n top: 0;\\r\\n left: 0;\\r\\n right: 0;\\r\\n bottom: 0;\\r\\n background: rgba(0, 0, 0, 0.6);\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n z-index: 2147483602;\\r\\n backdrop-filter: blur(4px);\\r\\n `\\r\\n\\r\\n const content = document.createElement('div')\\r\\n content.style.cssText = `\\r\\n background: #111827;\\r\\n color: #F3F4F6;\\r\\n border: 1px solid rgba(255, 255, 255, 0.1);\\r\\n border-radius: 16px;\\r\\n width: 90%;\\r\\n max-width: 420px;\\r\\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.6);\\r\\n font-family: system-ui, -apple-system, sans-serif;\\r\\n overflow: hidden;\\r\\n `\\r\\n\\r\\n const target = String(sandboxConfig?.target || 'local').toLowerCase()\\r\\n const targetUpper = target.toUpperCase()\\r\\n const gameId = sandboxConfig?.gameId || 'Unknown'\\r\\n const isSignedIn = authState.signedIn\\r\\n const user = authState.user\\r\\n const isLocal = target === 'local'\\r\\n\\r\\n // Environment-specific theming\\r\\n const envConfig = {\\r\\n local: {\\r\\n gradient: 'linear-gradient(120deg, #f59e0b, #d97706)',\\r\\n badge: '#f59e0b',\\r\\n badgeBg: 'rgba(245, 158, 11, 0.15)',\\r\\n label: 'LOCAL',\\r\\n subtitle: 'Firebase Emulator',\\r\\n },\\r\\n dev: {\\r\\n gradient: 'linear-gradient(120deg, #0891b2, #10b981)',\\r\\n badge: '#10b981',\\r\\n badgeBg: 'rgba(16, 185, 129, 0.15)',\\r\\n label: 'DEV',\\r\\n subtitle: 'Development Server',\\r\\n },\\r\\n staging: {\\r\\n gradient: 'linear-gradient(120deg, #8b5cf6, #6366f1)',\\r\\n badge: '#8b5cf6',\\r\\n badgeBg: 'rgba(139, 92, 246, 0.15)',\\r\\n label: 'STAGING',\\r\\n subtitle: 'Staging Server',\\r\\n },\\r\\n }\\r\\n\\r\\n const env = envConfig[target] || envConfig.local\\r\\n const statusIcon = isSignedIn ? '✓' : '○'\\r\\n const statusText = isSignedIn ? 'Signed in' : 'Not signed in'\\r\\n const statusColor = isSignedIn ? '#10b981' : '#6b7280'\\r\\n const userDisplay = user ? (user.displayName || user.email || 'Unknown') : '—'\\r\\n const userIdShort = user?.uid ? user.uid.slice(0, 8) + '...' : ''\\r\\n\\r\\n content.innerHTML = `\\r\\n <div style=\\\"\\r\\n background: ${env.gradient};\\r\\n padding: 20px 24px;\\r\\n display: flex;\\r\\n justify-content: space-between;\\r\\n align-items: center;\\r\\n \\\">\\r\\n <div style=\\\"display: flex; align-items: center; gap: 10px;\\\">\\r\\n <span style=\\\"font-size: 24px;\\\">🪐</span>\\r\\n <div>\\r\\n <div style=\\\"font-size: 16px; font-weight: 700; letter-spacing: 0.02em;\\\">Venus Sandbox</div>\\r\\n <div style=\\\"font-size: 11px; opacity: 0.85; margin-top: 2px;\\\">${env.subtitle}</div>\\r\\n </div>\\r\\n </div>\\r\\n <button id=\\\"close-modal\\\" style=\\\"\\r\\n background: rgba(0, 0, 0, 0.2);\\r\\n border: none;\\r\\n color: white;\\r\\n cursor: pointer;\\r\\n font-size: 18px;\\r\\n width: 32px;\\r\\n height: 32px;\\r\\n border-radius: 8px;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n transition: background 0.2s;\\r\\n \\\">×</button>\\r\\n </div>\\r\\n\\r\\n <div style=\\\"padding: 20px 24px; display: flex; flex-direction: column; gap: 16px;\\\">\\r\\n\\r\\n <div style=\\\"\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 12px;\\r\\n padding: 14px 16px;\\r\\n background: ${env.badgeBg};\\r\\n border: 1px solid ${env.badge}33;\\r\\n border-radius: 10px;\\r\\n \\\">\\r\\n <div style=\\\"\\r\\n width: 10px;\\r\\n height: 10px;\\r\\n border-radius: 50%;\\r\\n background: ${env.badge};\\r\\n box-shadow: 0 0 8px ${env.badge};\\r\\n \\\"></div>\\r\\n <div style=\\\"flex: 1;\\\">\\r\\n <div style=\\\"font-size: 14px; font-weight: 600; color: ${env.badge};\\\">${env.label}${isLocal ? ' (Emulator)' : ''}</div>\\r\\n <div style=\\\"font-size: 11px; color: #9CA3AF; margin-top: 2px;\\\">Game: ${gameId}</div>\\r\\n </div>\\r\\n </div>\\r\\n\\r\\n <div style=\\\"\\r\\n padding: 14px 16px;\\r\\n background: rgba(255, 255, 255, 0.03);\\r\\n border: 1px solid rgba(255, 255, 255, 0.06);\\r\\n border-radius: 10px;\\r\\n \\\">\\r\\n <div style=\\\"display: flex; align-items: center; gap: 8px; margin-bottom: ${isSignedIn ? '10px' : '0'};\\\">\\r\\n <span style=\\\"\\r\\n display: inline-flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n width: 20px;\\r\\n height: 20px;\\r\\n border-radius: 50%;\\r\\n background: ${isSignedIn ? 'rgba(16, 185, 129, 0.2)' : 'rgba(107, 114, 128, 0.2)'};\\r\\n color: ${statusColor};\\r\\n font-size: 12px;\\r\\n font-weight: 600;\\r\\n \\\">${statusIcon}</span>\\r\\n <span style=\\\"font-size: 13px; color: ${statusColor}; font-weight: 500;\\\">${statusText}</span>\\r\\n </div>\\r\\n ${isSignedIn ? `\\r\\n <div style=\\\"\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 10px;\\r\\n padding-top: 10px;\\r\\n border-top: 1px solid rgba(255, 255, 255, 0.06);\\r\\n \\\">\\r\\n <div style=\\\"\\r\\n width: 36px;\\r\\n height: 36px;\\r\\n border-radius: 50%;\\r\\n background: linear-gradient(135deg, #6366f1, #8b5cf6);\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n font-size: 14px;\\r\\n font-weight: 600;\\r\\n color: white;\\r\\n \\\">${(userDisplay[0] || '?').toUpperCase()}</div>\\r\\n <div style=\\\"flex: 1; min-width: 0;\\\">\\r\\n <div style=\\\"font-size: 13px; font-weight: 500; color: #F3F4F6; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\\\">${userDisplay}</div>\\r\\n <div style=\\\"font-size: 11px; color: #6B7280; font-family: monospace;\\\">${userIdShort}</div>\\r\\n </div>\\r\\n </div>\\r\\n ` : `\\r\\n <div style=\\\"font-size: 12px; color: #6B7280; margin-top: 8px; line-height: 1.5;\\\">\\r\\n Sign in to use sandbox features. Your session persists across reloads.\\r\\n </div>\\r\\n `}\\r\\n </div>\\r\\n\\r\\n <div style=\\\"\\r\\n padding: 12px 14px;\\r\\n background: rgba(99, 102, 241, 0.08);\\r\\n border: 1px solid rgba(99, 102, 241, 0.15);\\r\\n border-radius: 8px;\\r\\n font-size: 12px;\\r\\n color: #a5b4fc;\\r\\n line-height: 1.5;\\r\\n \\\">\\r\\n <div style=\\\"font-weight: 600; margin-bottom: 4px; color: #c7d2fe;\\\">💡 Change environment:</div>\\r\\n <code style=\\\"\\r\\n display: block;\\r\\n background: rgba(0, 0, 0, 0.3);\\r\\n padding: 8px 10px;\\r\\n border-radius: 5px;\\r\\n font-family: 'SF Mono', Monaco, monospace;\\r\\n font-size: 11px;\\r\\n color: #e0e7ff;\\r\\n margin-top: 6px;\\r\\n \\\">venus set-env <local|dev|staging></code>\\r\\n </div>\\r\\n\\r\\n ${isLocal ? `\\r\\n <div style=\\\"\\r\\n padding: 10px 14px;\\r\\n background: rgba(245, 158, 11, 0.08);\\r\\n border: 1px solid rgba(245, 158, 11, 0.15);\\r\\n border-radius: 8px;\\r\\n font-size: 11px;\\r\\n color: #fcd34d;\\r\\n line-height: 1.5;\\r\\n \\\">\\r\\n <strong>Emulator mode:</strong> Profiles are auto-created on first sign-in.\\r\\n <a href=\\\"http://localhost:4000\\\" target=\\\"_blank\\\" style=\\\"color: #fbbf24; text-decoration: underline; margin-left: 4px;\\\">Open Emulator UI →</a>\\r\\n </div>\\r\\n ` : ''}\\r\\n\\r\\n ${isSignedIn ? `\\r\\n <div style=\\\"\\r\\n padding: 12px 14px;\\r\\n background: rgba(255, 255, 255, 0.03);\\r\\n border: 1px solid rgba(255, 255, 255, 0.06);\\r\\n border-radius: 8px;\\r\\n \\\">\\r\\n <div style=\\\"font-size: 11px; font-weight: 600; color: #9CA3AF; margin-bottom: 10px; text-transform: uppercase; letter-spacing: 0.05em;\\\">Storage Debug</div>\\r\\n <div style=\\\"display: flex; gap: 8px;\\\">\\r\\n <button id=\\\"copy-app-storage\\\" style=\\\"\\r\\n flex: 1;\\r\\n background: rgba(99, 102, 241, 0.1);\\r\\n color: #a5b4fc;\\r\\n border: 1px solid rgba(99, 102, 241, 0.2);\\r\\n border-radius: 6px;\\r\\n padding: 8px 12px;\\r\\n font-size: 12px;\\r\\n font-weight: 500;\\r\\n cursor: pointer;\\r\\n transition: background 0.2s;\\r\\n \\\">📋 App Storage</button>\\r\\n <button id=\\\"copy-global-storage\\\" style=\\\"\\r\\n flex: 1;\\r\\n background: rgba(99, 102, 241, 0.1);\\r\\n color: #a5b4fc;\\r\\n border: 1px solid rgba(99, 102, 241, 0.2);\\r\\n border-radius: 6px;\\r\\n padding: 8px 12px;\\r\\n font-size: 12px;\\r\\n font-weight: 500;\\r\\n cursor: pointer;\\r\\n transition: background 0.2s;\\r\\n \\\">📋 Global Storage</button>\\r\\n </div>\\r\\n </div>\\r\\n ` : ''}\\r\\n\\r\\n <div style=\\\"display: flex; gap: 10px; margin-top: 4px;\\\">\\r\\n ${!isSignedIn ? `\\r\\n <button id=\\\"sign-in-google\\\" style=\\\"\\r\\n flex: 1;\\r\\n background: ${env.gradient};\\r\\n color: white;\\r\\n border: none;\\r\\n border-radius: 8px;\\r\\n padding: 12px 16px;\\r\\n font-size: 14px;\\r\\n font-weight: 600;\\r\\n cursor: pointer;\\r\\n transition: opacity 0.2s, transform 0.1s;\\r\\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);\\r\\n \\\">Sign In</button>\\r\\n ` : `\\r\\n <button id=\\\"sign-out\\\" style=\\\"\\r\\n flex: 1;\\r\\n background: rgba(239, 68, 68, 0.1);\\r\\n color: #f87171;\\r\\n border: 1px solid rgba(239, 68, 68, 0.2);\\r\\n border-radius: 8px;\\r\\n padding: 12px 16px;\\r\\n font-size: 14px;\\r\\n font-weight: 600;\\r\\n cursor: pointer;\\r\\n transition: background 0.2s;\\r\\n \\\">Sign Out</button>\\r\\n `}\\r\\n <button id=\\\"reload-page\\\" style=\\\"\\r\\n background: rgba(255, 255, 255, 0.05);\\r\\n color: #9CA3AF;\\r\\n border: 1px solid rgba(255, 255, 255, 0.1);\\r\\n border-radius: 8px;\\r\\n padding: 12px 16px;\\r\\n font-size: 14px;\\r\\n font-weight: 600;\\r\\n cursor: pointer;\\r\\n transition: background 0.2s;\\r\\n \\\">↻ Reload</button>\\r\\n </div>\\r\\n </div>\\r\\n `\\r\\n\\r\\n overlay.appendChild(content)\\r\\n document.body.appendChild(overlay)\\r\\n\\r\\n // Event handlers\\r\\n const closeModal = () => overlay.remove()\\r\\n\\r\\n document.getElementById('close-modal').addEventListener('click', closeModal)\\r\\n overlay.addEventListener('click', (e) => {\\r\\n if (e.target === overlay) closeModal()\\r\\n })\\r\\n\\r\\n document.getElementById('reload-page')?.addEventListener('click', () => {\\r\\n window.location.reload()\\r\\n })\\r\\n\\r\\n const signInBtn = document.getElementById('sign-in-google')\\r\\n if (signInBtn) {\\r\\n const originalGradient = env.gradient\\r\\n signInBtn.addEventListener('click', async () => {\\r\\n try {\\r\\n signInBtn.textContent = 'Signing in...'\\r\\n signInBtn.disabled = true\\r\\n\\r\\n if (window.__VENUS_SANDBOX_SIGN_IN__) {\\r\\n await window.__VENUS_SANDBOX_SIGN_IN__()\\r\\n // Sign-in successful - show success and reload\\r\\n signInBtn.textContent = '✓ Success!'\\r\\n signInBtn.style.background = 'linear-gradient(120deg, #10b981, #059669)'\\r\\n setTimeout(() => {\\r\\n closeModal()\\r\\n window.location.reload()\\r\\n }, 500)\\r\\n } else {\\r\\n throw new Error('Sign-in function not available. Is the SDK initialized?')\\r\\n }\\r\\n } catch (error) {\\r\\n console.error('[Venus Sandbox] Sign-in failed:', error)\\r\\n signInBtn.textContent = 'Sign-in failed'\\r\\n signInBtn.style.background = '#ef4444'\\r\\n setTimeout(() => {\\r\\n signInBtn.textContent = 'Sign In'\\r\\n signInBtn.style.background = originalGradient\\r\\n signInBtn.disabled = false\\r\\n }, 2000)\\r\\n }\\r\\n })\\r\\n }\\r\\n\\r\\n const signOutBtn = document.getElementById('sign-out')\\r\\n if (signOutBtn) {\\r\\n signOutBtn.addEventListener('click', async () => {\\r\\n try {\\r\\n signOutBtn.textContent = 'Signing out...'\\r\\n signOutBtn.disabled = true\\r\\n\\r\\n if (window.__VENUS_SANDBOX_SIGN_OUT__) {\\r\\n await window.__VENUS_SANDBOX_SIGN_OUT__()\\r\\n signOutBtn.textContent = '✓ Signed out'\\r\\n setTimeout(() => {\\r\\n closeModal()\\r\\n window.location.reload()\\r\\n }, 500)\\r\\n }\\r\\n } catch (error) {\\r\\n console.error('[Venus Sandbox] Sign-out failed:', error)\\r\\n signOutBtn.textContent = 'Failed'\\r\\n setTimeout(() => {\\r\\n signOutBtn.textContent = 'Sign out'\\r\\n signOutBtn.disabled = false\\r\\n }, 2000)\\r\\n }\\r\\n })\\r\\n }\\r\\n\\r\\n // Storage debug copy handlers\\r\\n const copyAppStorageBtn = document.getElementById('copy-app-storage')\\r\\n if (copyAppStorageBtn) {\\r\\n copyAppStorageBtn.addEventListener('click', async () => {\\r\\n await copyStorageToClipboard(copyAppStorageBtn, 'appStorage')\\r\\n })\\r\\n }\\r\\n\\r\\n const copyGlobalStorageBtn = document.getElementById('copy-global-storage')\\r\\n if (copyGlobalStorageBtn) {\\r\\n copyGlobalStorageBtn.addEventListener('click', async () => {\\r\\n await copyStorageToClipboard(copyGlobalStorageBtn, 'globalStorage')\\r\\n })\\r\\n }\\r\\n}\\r\\n\\r\\nasync function copyStorageToClipboard(btn, storageType) {\\r\\n const originalText = btn.textContent\\r\\n try {\\r\\n btn.textContent = 'Loading...'\\r\\n btn.disabled = true\\r\\n\\r\\n // Call the SDK directly - VenusAPI is available globally\\r\\n const api = window.VenusAPI\\r\\n if (!api) {\\r\\n throw new Error('VenusAPI not available')\\r\\n }\\r\\n\\r\\n const storage = storageType === 'appStorage' ? api.appStorage : api.globalStorage\\r\\n if (!storage?.getAllData) {\\r\\n throw new Error(`${storageType} not available or getAllData not supported`)\\r\\n }\\r\\n\\r\\n const data = await storage.getAllData()\\r\\n const json = JSON.stringify(data, null, 2)\\r\\n\\r\\n await navigator.clipboard.writeText(json)\\r\\n\\r\\n const count = Object.keys(data).length\\r\\n btn.textContent = `✓ Copied (${count} keys)`\\r\\n btn.style.background = 'rgba(16, 185, 129, 0.2)'\\r\\n btn.style.color = '#34d399'\\r\\n btn.style.borderColor = 'rgba(16, 185, 129, 0.3)'\\r\\n\\r\\n setTimeout(() => {\\r\\n btn.textContent = originalText\\r\\n btn.style.background = 'rgba(99, 102, 241, 0.1)'\\r\\n btn.style.color = '#a5b4fc'\\r\\n btn.style.borderColor = 'rgba(99, 102, 241, 0.2)'\\r\\n btn.disabled = false\\r\\n }, 2000)\\r\\n } catch (error) {\\r\\n console.error('[Venus Sandbox] Failed to copy storage:', error)\\r\\n btn.textContent = 'Failed'\\r\\n btn.style.background = 'rgba(239, 68, 68, 0.2)'\\r\\n btn.style.color = '#f87171'\\r\\n\\r\\n setTimeout(() => {\\r\\n btn.textContent = originalText\\r\\n btn.style.background = 'rgba(99, 102, 241, 0.1)'\\r\\n btn.style.color = '#a5b4fc'\\r\\n btn.style.borderColor = 'rgba(99, 102, 241, 0.2)'\\r\\n btn.disabled = false\\r\\n }, 2000)\\r\\n }\\r\\n}\\r\\n\"","import type { HtmlTagDescriptor } from 'vite'\r\nimport sandboxToolbarCss from './sandboxToolbarStyle.css?raw'\r\nimport sandboxToolbarScript from './sandboxToolbarScript.js?raw'\r\n\r\nexport function createSandboxToolbarTags(): HtmlTagDescriptor[] {\r\n const styleTag: HtmlTagDescriptor = {\r\n tag: 'style',\r\n attrs: { id: 'venus-sandbox-style' },\r\n children: sandboxToolbarCss,\r\n injectTo: 'head',\r\n }\r\n\r\n const scriptTag: HtmlTagDescriptor = {\r\n tag: 'script',\r\n attrs: {\r\n type: 'module',\r\n id: 'venus-sandbox-script',\r\n 'data-venus-ignore': 'true',\r\n },\r\n children: sandboxToolbarScript,\r\n injectTo: 'body',\r\n }\r\n\r\n return [styleTag, scriptTag]\r\n}\r\n","/**\r\n * Hardcoded Firebase configurations for each environment.\r\n *\r\n * These configs are used by:\r\n * 1. Vite plugin (Node.js) - to exchange refresh tokens for ID tokens\r\n * 2. Browser SDK - to initialize Firebase for Firestore access\r\n *\r\n * SECURITY NOTE: Firebase web API keys are designed to be public. They are NOT\r\n * secret keys. Security is enforced via:\r\n * - Firebase Security Rules (control read/write access)\r\n * - Authentication (users must sign in)\r\n * - HTTP referrer restrictions (configure in Firebase Console)\r\n *\r\n * These same keys are already shipped in the venus_cli binary (Constants.cs).\r\n * Google's documentation explicitly states that Firebase API keys are safe to\r\n * expose in client-side code.\r\n *\r\n * TODO: Consider reading Firebase config from ~/.venus/config.json instead of\r\n * hardcoding here. This would require updating the venus_cli to write the config\r\n * for the selected environment. Benefits: SDK wouldn't ship with keys, config\r\n * would come from the authenticated CLI.\r\n */\r\n\r\nimport type { SandboxTarget, SandboxFirebaseConfig } from '../config/sandbox'\r\n\r\n/**\r\n * Firebase configuration for each environment.\r\n * These values come from the Firebase console for each project.\r\n */\r\nexport const FIREBASE_CONFIGS: Record<SandboxTarget, SandboxFirebaseConfig> = {\r\n // Local mode uses dev Firebase credentials (auth emulator doesn't support Google OAuth)\r\n local: {\r\n apiKey: 'AIzaSyCSYBs5QrFUeaE8QC2Jfp6834enCzbCJqQ',\r\n authDomain: 'dev-venus-app.firebaseapp.com',\r\n projectId: 'dev-venus-app',\r\n storageBucket: 'dev-venus-app.appspot.com',\r\n },\r\n dev: {\r\n apiKey: 'AIzaSyCSYBs5QrFUeaE8QC2Jfp6834enCzbCJqQ',\r\n authDomain: 'dev-venus-app.firebaseapp.com',\r\n projectId: 'dev-venus-app',\r\n storageBucket: 'dev-venus-app.appspot.com',\r\n },\r\n staging: {\r\n apiKey: 'AIzaSyCfv4HGtNjStUsN0IL-TUNLYSNSZ3KhXN4',\r\n authDomain: 'staging-venus-app.firebaseapp.com',\r\n projectId: 'staging-venus-app',\r\n storageBucket: 'staging-venus-app.appspot.com',\r\n },\r\n}\r\n\r\n/**\r\n * Cloud Functions region for each environment.\r\n */\r\nexport const FUNCTIONS_REGIONS: Record<SandboxTarget, string> = {\r\n local: 'us-central1',\r\n dev: 'us-central1',\r\n staging: 'us-central1',\r\n}\r\n\r\n/**\r\n * Default emulator hosts for local development.\r\n */\r\nexport const DEFAULT_EMULATOR_HOSTS = {\r\n functions: 'localhost:5001',\r\n firestore: 'localhost:8080',\r\n auth: 'localhost:9099',\r\n}\r\n\r\n/**\r\n * Get Firebase config for a target environment.\r\n */\r\nexport function getFirebaseConfig(target: SandboxTarget): SandboxFirebaseConfig {\r\n const config = FIREBASE_CONFIGS[target]\r\n if (!config) {\r\n throw new Error(`[Venus SDK] Unknown target environment: ${target}`)\r\n }\r\n return config\r\n}\r\n\r\n/**\r\n * Get Cloud Functions region for a target environment.\r\n */\r\nexport function getFunctionsRegion(target: SandboxTarget): string {\r\n return FUNCTIONS_REGIONS[target] || 'us-central1'\r\n}\r\n","/**\r\n * Vite plugin for Venus sandbox mode.\r\n *\r\n * This plugin enables H5 apps to communicate with the real Firebase backend\r\n * during local development. It:\r\n * 1. Reads game.config.json for gameId\r\n * 2. Reads ~/.venus/config.json for target environment\r\n * 3. Injects Firebase config and toolbar into the page\r\n *\r\n * Authentication is handled by the browser via Google sign-in (one-time,\r\n * persisted in IndexedDB).\r\n *\r\n * Usage:\r\n * ```typescript\r\n * // vite.config.ts\r\n * import { defineConfig } from 'vite'\r\n * import { venusSandboxPlugin } from '@series-inc/venus-sdk/vite'\r\n *\r\n * export default defineConfig({\r\n * plugins: [\r\n * venusSandboxPlugin(),\r\n * ],\r\n * })\r\n * ```\r\n */\r\n\r\nimport type { Plugin, IndexHtmlTransformResult } from 'vite'\r\nimport { existsSync, readFileSync } from 'fs'\r\nimport { join, dirname, resolve as resolvePath } from 'path'\r\nimport { homedir } from 'os'\r\nimport { createRequire } from 'module'\r\nimport { createSandboxToolbarTags } from './sandboxToolbar'\r\nimport { FIREBASE_CONFIGS, FUNCTIONS_REGIONS, DEFAULT_EMULATOR_HOSTS } from '../firebase/firebaseConfigs'\r\nimport type { SandboxTarget, SandboxConfig } from '../config/sandbox'\r\n\r\nconst REQUIRED_FIREBASE_VERSION = '^11.0.0'\r\n\r\nexport interface VenusSandboxPluginOptions {\r\n /** Override the target environment (default: reads from ~/.venus/config.json) */\r\n target?: SandboxTarget\r\n /** Disable sandbox even if configured */\r\n disabled?: boolean\r\n}\r\n\r\ninterface VenusCliConfig {\r\n activeEnv?: string\r\n sandbox?: Record<string, SandboxEnvConfig | undefined>\r\n}\r\n\r\ninterface SandboxEnvConfig {\r\n enabled?: boolean\r\n backendUrl?: string\r\n pollingInterval?: number\r\n rpcMaxRetries?: number\r\n rpcRetryDelayMs?: number\r\n}\r\n\r\nconst GAME_CONFIG_FILENAME = 'game.config.json'\r\nconst VENUS_CONFIG_PATH = join(homedir(), '.venus', 'config.json')\r\n\r\nexport function venusSandboxPlugin(\r\n options: VenusSandboxPluginOptions = {},\r\n): Plugin {\r\n let projectRoot = process.cwd()\r\n let isServeCommand = false\r\n let warningLogged = false\r\n let firebaseMissing = false\r\n\r\n const logWarning = (message: string): void => {\r\n if (!warningLogged) {\r\n warningLogged = true\r\n console.warn(`[Venus Sandbox] ${message}`)\r\n }\r\n }\r\n\r\n return {\r\n name: 'venus-sandbox',\r\n apply: 'serve',\r\n enforce: 'pre', // Run before other plugins to set up optimizeDeps exclusions\r\n\r\n config(config, env) {\r\n projectRoot = resolveProjectRoot(config)\r\n isServeCommand = env.command === 'serve'\r\n\r\n // Check if Firebase is installed (required for sandbox mode)\r\n if (isServeCommand && !options.disabled) {\r\n const hasFirebase = checkFirebaseDependency(projectRoot)\r\n if (!hasFirebase) {\r\n firebaseMissing = true\r\n logFirebaseMissing()\r\n\r\n // Return config that excludes Firebase and SDK from pre-bundling\r\n // This prevents the cryptic \"Could not resolve firebase/app\" error\r\n // and allows us to show a clear error message in the browser instead\r\n return {\r\n ...config,\r\n optimizeDeps: {\r\n ...config?.optimizeDeps,\r\n exclude: [\r\n ...(config?.optimizeDeps?.exclude || []),\r\n '@series-inc/venus-sdk',\r\n 'firebase',\r\n 'firebase/app',\r\n 'firebase/auth',\r\n 'firebase/firestore',\r\n ],\r\n },\r\n }\r\n } else {\r\n // Firebase is installed - make sure it's pre-bundled so dynamic imports work\r\n // Also set VITE_APP_MODE to 'live' so apps use their live adapter (which calls SDK)\r\n\r\n // Build sandbox config to check target environment\r\n let sandboxConfig: SandboxConfig | null = null\r\n try {\r\n sandboxConfig = buildSandboxConfig(projectRoot, options)\r\n } catch {\r\n // Config errors will be shown in transformIndexHtml\r\n }\r\n\r\n // Set up proxy for non-local targets to avoid CORS issues\r\n // Browser requests go to /__venusapi/functionName, Vite proxies to Cloud Functions\r\n const proxyConfig = buildProxyConfig(sandboxConfig)\r\n\r\n return {\r\n ...config,\r\n define: {\r\n ...config?.define,\r\n 'import.meta.env.VITE_APP_MODE': JSON.stringify('live'),\r\n },\r\n optimizeDeps: {\r\n ...config?.optimizeDeps,\r\n include: [\r\n ...(config?.optimizeDeps?.include || []),\r\n 'firebase/app',\r\n 'firebase/auth',\r\n 'firebase/firestore',\r\n ],\r\n },\r\n server: {\r\n ...config?.server,\r\n proxy: {\r\n ...config?.server?.proxy,\r\n ...proxyConfig,\r\n },\r\n },\r\n }\r\n }\r\n }\r\n\r\n return config\r\n },\r\n\r\n async transformIndexHtml(html): Promise<IndexHtmlTransformResult> {\r\n if (!isServeCommand || options.disabled) {\r\n return html\r\n }\r\n\r\n // If Firebase is missing, show an error overlay\r\n if (firebaseMissing) {\r\n const errorMessage = `Firebase is not installed.\\n\\nAdd \"firebase\": \"${REQUIRED_FIREBASE_VERSION}\" to your package.json devDependencies, then run npm install.\\n\\nFirebase is only needed for sandbox mode (local development) and is excluded from production builds.`\r\n const errorScript = buildErrorOverlayScript(errorMessage, 'local')\r\n return {\r\n html,\r\n tags: [\r\n {\r\n tag: 'script',\r\n attrs: { type: 'module' },\r\n children: errorScript,\r\n injectTo: 'body',\r\n },\r\n ],\r\n }\r\n }\r\n\r\n try {\r\n const config = buildSandboxConfig(projectRoot, options)\r\n if (!config) {\r\n return html\r\n }\r\n\r\n const injectedHtml = injectVenusShell(html)\r\n const configScript = `window.__VENUS_SANDBOX__ = ${JSON.stringify(config)};`\r\n\r\n console.log(`[Venus Sandbox] Enabled for ${config.target} environment (gameId: ${config.gameId})`)\r\n\r\n return {\r\n html: injectedHtml,\r\n tags: [\r\n {\r\n tag: 'script',\r\n attrs: { type: 'module' },\r\n children: configScript,\r\n injectTo: 'head',\r\n },\r\n ...createSandboxToolbarTags(),\r\n ],\r\n }\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error)\r\n logWarning(message)\r\n\r\n // Show error overlay to developer\r\n const target = options.target ?? 'local'\r\n const errorScript = buildErrorOverlayScript(message, target)\r\n return {\r\n html,\r\n tags: [\r\n {\r\n tag: 'script',\r\n attrs: { type: 'module' },\r\n children: errorScript,\r\n injectTo: 'body',\r\n },\r\n ],\r\n }\r\n }\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * Build the sandbox config from project files.\r\n * No CLI session or token exchange needed - auth is handled by browser.\r\n */\r\nfunction buildSandboxConfig(\r\n projectRoot: string,\r\n options: VenusSandboxPluginOptions,\r\n): SandboxConfig | null {\r\n // 1. Read game.config.json for gameId\r\n const gameConfigPath = findGameConfigPath(projectRoot)\r\n if (!gameConfigPath) {\r\n throw new Error(\r\n `Unable to locate ${GAME_CONFIG_FILENAME} starting from ${projectRoot}. ` +\r\n `Run \"venus configure-game\" to generate one.`\r\n )\r\n }\r\n\r\n const gameConfig = readGameConfig(gameConfigPath)\r\n const gameId = gameConfig.gameId?.trim()\r\n if (!gameId) {\r\n throw new Error(\r\n `Missing \"gameId\" inside ${gameConfigPath}. Run \"venus configure-game\" to regenerate it.`\r\n )\r\n }\r\n\r\n // 2. Read ~/.venus/config.json for activeEnv\r\n const cliConfig = readVenusCliConfig()\r\n const target = options.target ?? coerceTarget(cliConfig?.activeEnv)\r\n\r\n // 3. Check if sandbox is enabled for this env\r\n const envConfig = cliConfig?.sandbox?.[target]\r\n if (envConfig?.enabled === false) {\r\n return null\r\n }\r\n\r\n // 4. Build the config (no auth tokens - handled by browser)\r\n const firebaseConfig = FIREBASE_CONFIGS[target]\r\n const config: SandboxConfig = {\r\n enabled: true,\r\n target,\r\n gameId,\r\n firebaseConfig,\r\n functionsRegion: FUNCTIONS_REGIONS[target],\r\n pollingInterval: envConfig?.pollingInterval ?? 2000,\r\n rpcMaxRetries: envConfig?.rpcMaxRetries ?? 0,\r\n rpcRetryDelayMs: envConfig?.rpcRetryDelayMs ?? 1000,\r\n }\r\n\r\n // Add emulator hosts for local development\r\n if (target === 'local') {\r\n config.functionsEmulatorHost = DEFAULT_EMULATOR_HOSTS.functions\r\n config.firestoreEmulatorHost = DEFAULT_EMULATOR_HOSTS.firestore\r\n config.authEmulatorHost = DEFAULT_EMULATOR_HOSTS.auth\r\n }\r\n\r\n // Add backend URL if provided\r\n if (envConfig?.backendUrl) {\r\n config.backendUrl = envConfig.backendUrl\r\n }\r\n\r\n return config\r\n}\r\n\r\n/**\r\n * Read ~/.venus/config.json.\r\n */\r\nfunction readVenusCliConfig(): VenusCliConfig | null {\r\n try {\r\n if (!existsSync(VENUS_CONFIG_PATH)) {\r\n return null\r\n }\r\n const raw = readFileSync(VENUS_CONFIG_PATH, 'utf-8')\r\n return JSON.parse(raw) as VenusCliConfig\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * Read game.config.json.\r\n */\r\nfunction readGameConfig(pathname: string): { gameId?: string } {\r\n try {\r\n const raw = readFileSync(pathname, 'utf-8')\r\n return JSON.parse(raw) as { gameId?: string }\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : 'Unknown error'\r\n throw new Error(`Failed to parse ${pathname}: ${message}`)\r\n }\r\n}\r\n\r\n/**\r\n * Find game.config.json by walking up the directory tree.\r\n */\r\nfunction findGameConfigPath(startDir: string): string | null {\r\n let current = resolvePath(startDir)\r\n const visited = new Set<string>()\r\n\r\n while (true) {\r\n const candidate = join(current, GAME_CONFIG_FILENAME)\r\n if (existsSync(candidate)) {\r\n return candidate\r\n }\r\n\r\n if (visited.has(current)) {\r\n break\r\n }\r\n visited.add(current)\r\n\r\n const parent = dirname(current)\r\n if (parent === current) {\r\n break\r\n }\r\n current = parent\r\n }\r\n\r\n return null\r\n}\r\n\r\n/**\r\n * Resolve project root from Vite config or CWD.\r\n */\r\nfunction resolveProjectRoot(config?: { root?: string }): string {\r\n if (config?.root && config.root.length > 0) {\r\n return resolvePath(config.root)\r\n }\r\n return process.cwd()\r\n}\r\n\r\n/**\r\n * Coerce string to valid target.\r\n */\r\nfunction coerceTarget(value?: string | null): SandboxTarget {\r\n if (value === 'dev' || value === 'staging') {\r\n return value\r\n }\r\n return 'local'\r\n}\r\n\r\n/**\r\n * Inject Venus shell wrapper around body content.\r\n */\r\nfunction injectVenusShell(html: string): string {\r\n const match = html.match(/<body([^>]*)>([\\s\\S]*)<\\/body>/i)\r\n if (!match) {\r\n return html\r\n }\r\n\r\n const [, attrs, contents] = match\r\n const serialized = JSON.stringify(contents).replace(/<\\/script>/gi, '<\\\\/script>')\r\n\r\n const shell = `\r\n <body${attrs}>\r\n <div id=\"venus-toolbar-root\" aria-live=\"polite\"></div>\r\n <div id=\"venus-app-root\" data-venus-app-root style=\"display:contents;\">\r\n ${contents}\r\n </div>\r\n <noscript id=\"venus-app-placeholder\">\r\n Venus sandbox requires JavaScript enabled.\r\n </noscript>\r\n <script id=\"venus-app-capture\">\r\n window.__VENUS_APP_HTML = ${serialized};\r\n </script>\r\n </body>\r\n `\r\n\r\n return html.replace(/<body([\\s\\S]*)<\\/body>/i, shell)\r\n}\r\n\r\n/**\r\n * Check if Firebase is installed in the project.\r\n * Returns true if installed, false otherwise.\r\n */\r\nfunction checkFirebaseDependency(projectRoot: string): boolean {\r\n try {\r\n // Try to resolve firebase from the project's node_modules\r\n const require = createRequire(join(projectRoot, 'package.json'))\r\n require.resolve('firebase/app')\r\n return true\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\n/**\r\n * Log the Firebase missing message to console.\r\n */\r\nfunction logFirebaseMissing(): void {\r\n console.error(`\r\n╔══════════════════════════════════════════════════════════════════════════════╗\r\n║ ║\r\n║ IMPORTANT: The Venus sandbox plugin requires Firebase. ║\r\n║ ║\r\n║ Add the following to your package.json devDependencies: ║\r\n║ ║\r\n║ \"firebase\": \"${REQUIRED_FIREBASE_VERSION}\" ║\r\n║ ║\r\n║ Then run: ║\r\n║ ║\r\n║ npm install ║\r\n║ ║\r\n║ WHY devDependencies? ║\r\n║ Firebase is only used during local development (sandbox mode). It is ║\r\n║ dynamically imported and excluded from production builds, so it should ║\r\n║ be a devDependency to keep production bundles small. ║\r\n║ ║\r\n╚══════════════════════════════════════════════════════════════════════════════╝\r\n`)\r\n}\r\n\r\n/**\r\n * Build error overlay script for display in browser.\r\n */\r\nfunction buildErrorOverlayScript(message: string, target: SandboxTarget): string {\r\n const escapedMessage = message\r\n .replace(/\\\\/g, '\\\\\\\\')\r\n .replace(/'/g, \"\\\\'\")\r\n .replace(/\\n/g, '\\\\n')\r\n\r\n return `\r\n(function() {\r\n var overlay = document.createElement('div');\r\n overlay.id = 'venus-sandbox-error';\r\n overlay.style.cssText = 'position:fixed;inset:0;z-index:999999;background:rgba(0,0,0,0.92);color:#fff;font-family:-apple-system,BlinkMacSystemFont,sans-serif;display:flex;align-items:center;justify-content:center;padding:20px;';\r\n\r\n var content = document.createElement('div');\r\n content.style.cssText = 'max-width:600px;text-align:center;';\r\n\r\n var icon = document.createElement('div');\r\n icon.style.cssText = 'font-size:48px;margin-bottom:16px;';\r\n icon.textContent = '⚠️';\r\n\r\n var title = document.createElement('h1');\r\n title.style.cssText = 'font-size:24px;font-weight:600;margin:0 0 16px;color:#ff6b6b;';\r\n title.textContent = 'Venus Sandbox Error';\r\n\r\n var msg = document.createElement('p');\r\n msg.style.cssText = 'font-size:14px;line-height:1.6;margin:0 0 24px;color:#ccc;';\r\n msg.textContent = '${escapedMessage}';\r\n\r\n var hint = document.createElement('div');\r\n hint.style.cssText = 'background:rgba(255,255,255,0.1);border-radius:8px;padding:16px;font-size:13px;color:#aaa;';\r\n hint.innerHTML = '<strong style=\"color:#fff;\">Environment:</strong> ${target}<br>Check your game.config.json and ~/.venus/config.json';\r\n\r\n content.appendChild(icon);\r\n content.appendChild(title);\r\n content.appendChild(msg);\r\n content.appendChild(hint);\r\n overlay.appendChild(content);\r\n\r\n if (document.body) {\r\n document.body.appendChild(overlay);\r\n } else {\r\n document.addEventListener('DOMContentLoaded', function() {\r\n document.body.appendChild(overlay);\r\n });\r\n }\r\n})();\r\n`\r\n}\r\n\r\n/**\r\n * The proxy path used by the SDK to route requests through Vite.\r\n * This avoids CORS issues when calling Cloud Functions from localhost.\r\n */\r\nexport const VENUS_API_PROXY_PATH = '/__venusapi'\r\n\r\n/**\r\n * Build Vite proxy configuration for non-local sandbox targets.\r\n *\r\n * For dev/staging, Cloud Functions don't allow localhost origins.\r\n * We proxy through Vite to avoid CORS issues:\r\n * - Browser requests: /__venusapi/functionName\r\n * - Vite proxies to: https://us-central1-{project}.cloudfunctions.net/functionName\r\n */\r\nfunction buildProxyConfig(\r\n config: SandboxConfig | null,\r\n): Record<string, { target: string; changeOrigin: boolean; rewrite: (path: string) => string }> {\r\n // No proxy needed for local (emulator) or if config is missing\r\n if (!config || config.target === 'local') {\r\n return {}\r\n }\r\n\r\n // Build the Cloud Functions base URL\r\n const projectId = config.firebaseConfig?.projectId\r\n const region = config.functionsRegion || 'us-central1'\r\n\r\n if (!projectId) {\r\n return {}\r\n }\r\n\r\n const targetUrl = `https://${region}-${projectId}.cloudfunctions.net`\r\n\r\n console.log(`[Venus Sandbox] Setting up CORS proxy: ${VENUS_API_PROXY_PATH}/* -> ${targetUrl}/*`)\r\n\r\n return {\r\n [VENUS_API_PROXY_PATH]: {\r\n target: targetUrl,\r\n changeOrigin: true,\r\n rewrite: (path: string) => path.replace(new RegExp(`^${VENUS_API_PROXY_PATH}`), ''),\r\n },\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/shared-assets/embeddedLibrariesManifest.ts","../../src/shared-assets/generated/threeExports.ts","../../src/vite/venusLibrariesPlugin.ts","../../src/vite/cdnPlugin.ts","raw-loader:/Users/pchan/Development/series/venus/venus-sdk/packages/api/src/vite/sandboxToolbarStyle.css","raw-loader:/Users/pchan/Development/series/venus/venus-sdk/packages/api/src/vite/sandboxToolbarScript.js","../../src/vite/sandboxToolbar.ts","../../src/firebase/firebaseConfigs.ts","../../src/vite/venusSandboxPlugin.ts"],"names":["path","fs","resolvePath","require"],"mappings":"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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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","file":"index.js","sourcesContent":["export type ModuleSpecifierMatch = 'exact' | 'prefix';\r\n\r\nexport interface ModuleSpecifierConfig {\r\n match: ModuleSpecifierMatch;\r\n value: string;\r\n behavior?:\r\n | 'default'\r\n | 'react-jsx-runtime'\r\n | 'react-jsx-dev-runtime'\r\n | 'namespace';\r\n}\r\n\r\nexport interface EmbeddedLibraryDefinition {\r\n libraryKey: string;\r\n assetKey: string;\r\n packageName: string;\r\n version: string;\r\n globalVar: string;\r\n cdnPath: string;\r\n moduleSpecifiers: ModuleSpecifierConfig[];\r\n loadStage: number; // Load order: 0 first, then 1, etc. Enables parallel loading within stages\r\n enabled: boolean; // Whether this library is ready for use\r\n}\r\n\r\nexport const DEFAULT_SHARED_LIB_CDN_BASE =\r\n 'https://venus-static-01293ak.web.app/libs';\r\n\r\nexport const EMBEDDED_LIBRARIES: EmbeddedLibraryDefinition[] = [\r\n {\r\n libraryKey: 'phaser@3.90.0',\r\n assetKey: 'library:phaser@3.90.0',\r\n packageName: 'phaser',\r\n version: '3.90.0',\r\n globalVar: 'Phaser',\r\n cdnPath: 'phaser/3.90.0/phaser.min.js',\r\n moduleSpecifiers: [{ match: 'exact', value: 'phaser' }],\r\n loadStage: 0,\r\n enabled: true,\r\n },\r\n {\r\n libraryKey: 'react@18.3.1',\r\n assetKey: 'library:react@18.3.1',\r\n packageName: 'react',\r\n version: '18.3.1',\r\n globalVar: 'React',\r\n cdnPath: 'react/18.3.1/react.production.min.js',\r\n moduleSpecifiers: [\r\n { match: 'exact', value: 'react', behavior: 'namespace' },\r\n { match: 'exact', value: 'react/jsx-runtime', behavior: 'react-jsx-runtime' },\r\n {\r\n match: 'exact',\r\n value: 'react/jsx-dev-runtime',\r\n behavior: 'react-jsx-dev-runtime',\r\n },\r\n ],\r\n loadStage: 0, // Must load before ReactDOM\r\n enabled: true,\r\n },\r\n {\r\n libraryKey: 'react-dom@18.3.1',\r\n assetKey: 'library:react-dom@18.3.1',\r\n packageName: 'react-dom',\r\n version: '18.3.1',\r\n globalVar: 'ReactDOM',\r\n cdnPath: 'react-dom/18.3.1/react-dom.production.min.js',\r\n moduleSpecifiers: [\r\n { match: 'exact', value: 'react-dom', behavior: 'namespace' },\r\n { match: 'exact', value: 'react-dom/client', behavior: 'namespace' },\r\n ],\r\n loadStage: 1, // Depends on React (stage 0)\r\n enabled: true,\r\n },\r\n {\r\n libraryKey: 'three@0.170.0',\r\n assetKey: 'library:three@0.170.0',\r\n packageName: 'three',\r\n version: '0.170.0',\r\n globalVar: 'THREE',\r\n cdnPath: 'three/r170/three.min.js',\r\n moduleSpecifiers: [\r\n { match: 'exact', value: 'three', behavior: 'namespace' },\r\n ],\r\n loadStage: 0,\r\n enabled: true,\r\n },\r\n {\r\n libraryKey: 'matter-js@0.19.0',\r\n assetKey: 'library:matter-js@0.19.0',\r\n packageName: 'matter-js',\r\n version: '0.19.0',\r\n globalVar: 'Matter',\r\n cdnPath: 'matter-js/0.19.0/matter.min.js',\r\n moduleSpecifiers: [{ match: 'exact', value: 'matter-js' }],\r\n loadStage: 0,\r\n enabled: true,\r\n },\r\n {\r\n libraryKey: 'inkjs@2.2.0',\r\n assetKey: 'library:inkjs@2.2.0',\r\n packageName: 'inkjs',\r\n version: '2.2.0',\r\n globalVar: 'inkjs',\r\n cdnPath: 'inkjs/2.2.0/ink.min.js',\r\n moduleSpecifiers: [{ match: 'exact', value: 'inkjs' }],\r\n loadStage: 0,\r\n enabled: true,\r\n },\r\n {\r\n libraryKey: 'zustand@5.0.3',\r\n assetKey: 'library:zustand@5.0.3',\r\n packageName: 'zustand',\r\n version: '5.0.3',\r\n globalVar: 'zustand',\r\n cdnPath: 'zustand/5.0.3/zustand.min.js',\r\n moduleSpecifiers: [\r\n { match: 'exact', value: 'zustand' },\r\n { match: 'exact', value: 'zustand/middleware' },\r\n ],\r\n loadStage: 1, // Depends on React (stage 0)\r\n enabled: true,\r\n },\r\n {\r\n libraryKey: 'ammo.js@2024.11',\r\n assetKey: 'library:ammo.js@2024.11',\r\n packageName: 'ammo.js',\r\n version: '2024.11',\r\n globalVar: 'Ammo',\r\n cdnPath: 'ammo/2024.11/ammo.js',\r\n moduleSpecifiers: [\r\n { match: 'exact', value: 'ammo.js' },\r\n { match: 'exact', value: 'ammo.js/builds/ammo.wasm.js' },\r\n ],\r\n loadStage: 0,\r\n enabled: false, // Not ready yet - WASM loading needs additional work\r\n },\r\n];\r\n\r\nexport const EMBEDDED_LIBRARY_BY_KEY: Record<string, EmbeddedLibraryDefinition> =\r\n EMBEDDED_LIBRARIES.reduce(\r\n (acc, lib) => {\r\n acc[lib.libraryKey] = lib;\r\n return acc;\r\n },\r\n {} as Record<string, EmbeddedLibraryDefinition>,\r\n );\r\n\r\nexport const MODULE_TO_LIBRARY_SPECIFIERS = EMBEDDED_LIBRARIES.filter(\r\n (lib) => lib.enabled,\r\n).flatMap((lib) =>\r\n lib.moduleSpecifiers.map((specifier) => ({\r\n ...specifier,\r\n libraryKey: lib.libraryKey,\r\n })),\r\n);\r\n\r\n/**\r\n * Get library definition by key, throwing if not found.\r\n * @param libraryKey - Library key (e.g., 'phaser@3.90.0')\r\n * @returns Library definition\r\n * @throws Error if library key is not found\r\n */\r\nexport function getLibraryDefinition(\r\n libraryKey: string,\r\n): EmbeddedLibraryDefinition {\r\n const definition = EMBEDDED_LIBRARY_BY_KEY[libraryKey]\r\n if (!definition) {\r\n const availableKeys = Object.keys(EMBEDDED_LIBRARY_BY_KEY).join(', ')\r\n throw new Error(\r\n `Unsupported embedded library: ${libraryKey}. Available libraries: ${availableKeys}`,\r\n )\r\n }\r\n return definition\r\n}\r\n","/* eslint-disable */\r\n/**\r\n * AUTO-GENERATED FILE — DO NOT EDIT.\r\n *\r\n * Generated by: scripts/generate-embedded-three-exports.mjs\r\n * Source: three@0.170.0 (ESM entry)\r\n * Generated at: 2025-12-12T01:45:19.152Z\r\n */\r\n\r\nexport const EMBEDDED_THREE_VERSION = \"0.170.0\" as const;\r\n\r\nexport const EMBEDDED_THREE_NAMED_EXPORTS = [\r\n \"ACESFilmicToneMapping\",\r\n \"AddEquation\",\r\n \"AdditiveAnimationBlendMode\",\r\n \"AdditiveBlending\",\r\n \"AddOperation\",\r\n \"AgXToneMapping\",\r\n \"AlphaFormat\",\r\n \"AlwaysCompare\",\r\n \"AlwaysDepth\",\r\n \"AlwaysStencilFunc\",\r\n \"AmbientLight\",\r\n \"AnimationAction\",\r\n \"AnimationClip\",\r\n \"AnimationLoader\",\r\n \"AnimationMixer\",\r\n \"AnimationObjectGroup\",\r\n \"AnimationUtils\",\r\n \"ArcCurve\",\r\n \"ArrayCamera\",\r\n \"ArrowHelper\",\r\n \"AttachedBindMode\",\r\n \"Audio\",\r\n \"AudioAnalyser\",\r\n \"AudioContext\",\r\n \"AudioListener\",\r\n \"AudioLoader\",\r\n \"AxesHelper\",\r\n \"BackSide\",\r\n \"BasicDepthPacking\",\r\n \"BasicShadowMap\",\r\n \"BatchedMesh\",\r\n \"Bone\",\r\n \"BooleanKeyframeTrack\",\r\n \"Box2\",\r\n \"Box3\",\r\n \"Box3Helper\",\r\n \"BoxGeometry\",\r\n \"BoxHelper\",\r\n \"BufferAttribute\",\r\n \"BufferGeometry\",\r\n \"BufferGeometryLoader\",\r\n \"ByteType\",\r\n \"Cache\",\r\n \"Camera\",\r\n \"CameraHelper\",\r\n \"CanvasTexture\",\r\n \"CapsuleGeometry\",\r\n \"CatmullRomCurve3\",\r\n \"CineonToneMapping\",\r\n \"CircleGeometry\",\r\n \"ClampToEdgeWrapping\",\r\n \"Clock\",\r\n \"Color\",\r\n \"ColorKeyframeTrack\",\r\n \"ColorManagement\",\r\n \"CompressedArrayTexture\",\r\n \"CompressedCubeTexture\",\r\n \"CompressedTexture\",\r\n \"CompressedTextureLoader\",\r\n \"ConeGeometry\",\r\n \"ConstantAlphaFactor\",\r\n \"ConstantColorFactor\",\r\n \"Controls\",\r\n \"createCanvasElement\",\r\n \"CubeCamera\",\r\n \"CubeReflectionMapping\",\r\n \"CubeRefractionMapping\",\r\n \"CubeTexture\",\r\n \"CubeTextureLoader\",\r\n \"CubeUVReflectionMapping\",\r\n \"CubicBezierCurve\",\r\n \"CubicBezierCurve3\",\r\n \"CubicInterpolant\",\r\n \"CullFaceBack\",\r\n \"CullFaceFront\",\r\n \"CullFaceFrontBack\",\r\n \"CullFaceNone\",\r\n \"Curve\",\r\n \"CurvePath\",\r\n \"CustomBlending\",\r\n \"CustomToneMapping\",\r\n \"CylinderGeometry\",\r\n \"Cylindrical\",\r\n \"Data3DTexture\",\r\n \"DataArrayTexture\",\r\n \"DataTexture\",\r\n \"DataTextureLoader\",\r\n \"DataUtils\",\r\n \"DecrementStencilOp\",\r\n \"DecrementWrapStencilOp\",\r\n \"DefaultLoadingManager\",\r\n \"DepthFormat\",\r\n \"DepthStencilFormat\",\r\n \"DepthTexture\",\r\n \"DetachedBindMode\",\r\n \"DirectionalLight\",\r\n \"DirectionalLightHelper\",\r\n \"DiscreteInterpolant\",\r\n \"DodecahedronGeometry\",\r\n \"DoubleSide\",\r\n \"DstAlphaFactor\",\r\n \"DstColorFactor\",\r\n \"DynamicCopyUsage\",\r\n \"DynamicDrawUsage\",\r\n \"DynamicReadUsage\",\r\n \"EdgesGeometry\",\r\n \"EllipseCurve\",\r\n \"EqualCompare\",\r\n \"EqualDepth\",\r\n \"EqualStencilFunc\",\r\n \"EquirectangularReflectionMapping\",\r\n \"EquirectangularRefractionMapping\",\r\n \"Euler\",\r\n \"EventDispatcher\",\r\n \"ExtrudeGeometry\",\r\n \"FileLoader\",\r\n \"Float16BufferAttribute\",\r\n \"Float32BufferAttribute\",\r\n \"FloatType\",\r\n \"Fog\",\r\n \"FogExp2\",\r\n \"FramebufferTexture\",\r\n \"FrontSide\",\r\n \"Frustum\",\r\n \"GLBufferAttribute\",\r\n \"GLSL1\",\r\n \"GLSL3\",\r\n \"GreaterCompare\",\r\n \"GreaterDepth\",\r\n \"GreaterEqualCompare\",\r\n \"GreaterEqualDepth\",\r\n \"GreaterEqualStencilFunc\",\r\n \"GreaterStencilFunc\",\r\n \"GridHelper\",\r\n \"Group\",\r\n \"HalfFloatType\",\r\n \"HemisphereLight\",\r\n \"HemisphereLightHelper\",\r\n \"IcosahedronGeometry\",\r\n \"ImageBitmapLoader\",\r\n \"ImageLoader\",\r\n \"ImageUtils\",\r\n \"IncrementStencilOp\",\r\n \"IncrementWrapStencilOp\",\r\n \"InstancedBufferAttribute\",\r\n \"InstancedBufferGeometry\",\r\n \"InstancedInterleavedBuffer\",\r\n \"InstancedMesh\",\r\n \"Int16BufferAttribute\",\r\n \"Int32BufferAttribute\",\r\n \"Int8BufferAttribute\",\r\n \"InterleavedBuffer\",\r\n \"InterleavedBufferAttribute\",\r\n \"Interpolant\",\r\n \"InterpolateDiscrete\",\r\n \"InterpolateLinear\",\r\n \"InterpolateSmooth\",\r\n \"IntType\",\r\n \"InvertStencilOp\",\r\n \"KeepStencilOp\",\r\n \"KeyframeTrack\",\r\n \"LatheGeometry\",\r\n \"Layers\",\r\n \"LessCompare\",\r\n \"LessDepth\",\r\n \"LessEqualCompare\",\r\n \"LessEqualDepth\",\r\n \"LessEqualStencilFunc\",\r\n \"LessStencilFunc\",\r\n \"Light\",\r\n \"LightProbe\",\r\n \"Line\",\r\n \"Line3\",\r\n \"LinearFilter\",\r\n \"LinearInterpolant\",\r\n \"LinearMipmapLinearFilter\",\r\n \"LinearMipMapLinearFilter\",\r\n \"LinearMipmapNearestFilter\",\r\n \"LinearMipMapNearestFilter\",\r\n \"LinearSRGBColorSpace\",\r\n \"LinearToneMapping\",\r\n \"LinearTransfer\",\r\n \"LineBasicMaterial\",\r\n \"LineCurve\",\r\n \"LineCurve3\",\r\n \"LineDashedMaterial\",\r\n \"LineLoop\",\r\n \"LineSegments\",\r\n \"Loader\",\r\n \"LoaderUtils\",\r\n \"LoadingManager\",\r\n \"LOD\",\r\n \"LoopOnce\",\r\n \"LoopPingPong\",\r\n \"LoopRepeat\",\r\n \"LuminanceAlphaFormat\",\r\n \"LuminanceFormat\",\r\n \"Material\",\r\n \"MaterialLoader\",\r\n \"MathUtils\",\r\n \"Matrix2\",\r\n \"Matrix3\",\r\n \"Matrix4\",\r\n \"MaxEquation\",\r\n \"Mesh\",\r\n \"MeshBasicMaterial\",\r\n \"MeshDepthMaterial\",\r\n \"MeshDistanceMaterial\",\r\n \"MeshLambertMaterial\",\r\n \"MeshMatcapMaterial\",\r\n \"MeshNormalMaterial\",\r\n \"MeshPhongMaterial\",\r\n \"MeshPhysicalMaterial\",\r\n \"MeshStandardMaterial\",\r\n \"MeshToonMaterial\",\r\n \"MinEquation\",\r\n \"MirroredRepeatWrapping\",\r\n \"MixOperation\",\r\n \"MOUSE\",\r\n \"MultiplyBlending\",\r\n \"MultiplyOperation\",\r\n \"NearestFilter\",\r\n \"NearestMipmapLinearFilter\",\r\n \"NearestMipMapLinearFilter\",\r\n \"NearestMipmapNearestFilter\",\r\n \"NearestMipMapNearestFilter\",\r\n \"NeutralToneMapping\",\r\n \"NeverCompare\",\r\n \"NeverDepth\",\r\n \"NeverStencilFunc\",\r\n \"NoBlending\",\r\n \"NoColorSpace\",\r\n \"NormalAnimationBlendMode\",\r\n \"NormalBlending\",\r\n \"NotEqualCompare\",\r\n \"NotEqualDepth\",\r\n \"NotEqualStencilFunc\",\r\n \"NoToneMapping\",\r\n \"NumberKeyframeTrack\",\r\n \"Object3D\",\r\n \"ObjectLoader\",\r\n \"ObjectSpaceNormalMap\",\r\n \"OctahedronGeometry\",\r\n \"OneFactor\",\r\n \"OneMinusConstantAlphaFactor\",\r\n \"OneMinusConstantColorFactor\",\r\n \"OneMinusDstAlphaFactor\",\r\n \"OneMinusDstColorFactor\",\r\n \"OneMinusSrcAlphaFactor\",\r\n \"OneMinusSrcColorFactor\",\r\n \"OrthographicCamera\",\r\n \"Path\",\r\n \"PCFShadowMap\",\r\n \"PCFSoftShadowMap\",\r\n \"PerspectiveCamera\",\r\n \"Plane\",\r\n \"PlaneGeometry\",\r\n \"PlaneHelper\",\r\n \"PMREMGenerator\",\r\n \"PointLight\",\r\n \"PointLightHelper\",\r\n \"Points\",\r\n \"PointsMaterial\",\r\n \"PolarGridHelper\",\r\n \"PolyhedronGeometry\",\r\n \"PositionalAudio\",\r\n \"PropertyBinding\",\r\n \"PropertyMixer\",\r\n \"QuadraticBezierCurve\",\r\n \"QuadraticBezierCurve3\",\r\n \"Quaternion\",\r\n \"QuaternionKeyframeTrack\",\r\n \"QuaternionLinearInterpolant\",\r\n \"RawShaderMaterial\",\r\n \"Ray\",\r\n \"Raycaster\",\r\n \"RectAreaLight\",\r\n \"RED_GREEN_RGTC2_Format\",\r\n \"RED_RGTC1_Format\",\r\n \"RedFormat\",\r\n \"RedIntegerFormat\",\r\n \"ReinhardToneMapping\",\r\n \"RenderTarget\",\r\n \"RepeatWrapping\",\r\n \"ReplaceStencilOp\",\r\n \"ReverseSubtractEquation\",\r\n \"REVISION\",\r\n \"RGB_BPTC_SIGNED_Format\",\r\n \"RGB_BPTC_UNSIGNED_Format\",\r\n \"RGB_ETC1_Format\",\r\n \"RGB_ETC2_Format\",\r\n \"RGB_PVRTC_2BPPV1_Format\",\r\n \"RGB_PVRTC_4BPPV1_Format\",\r\n \"RGB_S3TC_DXT1_Format\",\r\n \"RGBA_ASTC_10x10_Format\",\r\n \"RGBA_ASTC_10x5_Format\",\r\n \"RGBA_ASTC_10x6_Format\",\r\n \"RGBA_ASTC_10x8_Format\",\r\n \"RGBA_ASTC_12x10_Format\",\r\n \"RGBA_ASTC_12x12_Format\",\r\n \"RGBA_ASTC_4x4_Format\",\r\n \"RGBA_ASTC_5x4_Format\",\r\n \"RGBA_ASTC_5x5_Format\",\r\n \"RGBA_ASTC_6x5_Format\",\r\n \"RGBA_ASTC_6x6_Format\",\r\n \"RGBA_ASTC_8x5_Format\",\r\n \"RGBA_ASTC_8x6_Format\",\r\n \"RGBA_ASTC_8x8_Format\",\r\n \"RGBA_BPTC_Format\",\r\n \"RGBA_ETC2_EAC_Format\",\r\n \"RGBA_PVRTC_2BPPV1_Format\",\r\n \"RGBA_PVRTC_4BPPV1_Format\",\r\n \"RGBA_S3TC_DXT1_Format\",\r\n \"RGBA_S3TC_DXT3_Format\",\r\n \"RGBA_S3TC_DXT5_Format\",\r\n \"RGBADepthPacking\",\r\n \"RGBAFormat\",\r\n \"RGBAIntegerFormat\",\r\n \"RGBDepthPacking\",\r\n \"RGBFormat\",\r\n \"RGBIntegerFormat\",\r\n \"RGDepthPacking\",\r\n \"RGFormat\",\r\n \"RGIntegerFormat\",\r\n \"RingGeometry\",\r\n \"Scene\",\r\n \"ShaderChunk\",\r\n \"ShaderLib\",\r\n \"ShaderMaterial\",\r\n \"ShadowMaterial\",\r\n \"Shape\",\r\n \"ShapeGeometry\",\r\n \"ShapePath\",\r\n \"ShapeUtils\",\r\n \"ShortType\",\r\n \"SIGNED_RED_GREEN_RGTC2_Format\",\r\n \"SIGNED_RED_RGTC1_Format\",\r\n \"Skeleton\",\r\n \"SkeletonHelper\",\r\n \"SkinnedMesh\",\r\n \"Source\",\r\n \"Sphere\",\r\n \"SphereGeometry\",\r\n \"Spherical\",\r\n \"SphericalHarmonics3\",\r\n \"SplineCurve\",\r\n \"SpotLight\",\r\n \"SpotLightHelper\",\r\n \"Sprite\",\r\n \"SpriteMaterial\",\r\n \"SrcAlphaFactor\",\r\n \"SrcAlphaSaturateFactor\",\r\n \"SrcColorFactor\",\r\n \"SRGBColorSpace\",\r\n \"SRGBTransfer\",\r\n \"StaticCopyUsage\",\r\n \"StaticDrawUsage\",\r\n \"StaticReadUsage\",\r\n \"StereoCamera\",\r\n \"StreamCopyUsage\",\r\n \"StreamDrawUsage\",\r\n \"StreamReadUsage\",\r\n \"StringKeyframeTrack\",\r\n \"SubtractEquation\",\r\n \"SubtractiveBlending\",\r\n \"TangentSpaceNormalMap\",\r\n \"TetrahedronGeometry\",\r\n \"Texture\",\r\n \"TextureLoader\",\r\n \"TextureUtils\",\r\n \"TorusGeometry\",\r\n \"TorusKnotGeometry\",\r\n \"TOUCH\",\r\n \"Triangle\",\r\n \"TriangleFanDrawMode\",\r\n \"TrianglesDrawMode\",\r\n \"TriangleStripDrawMode\",\r\n \"TubeGeometry\",\r\n \"Uint16BufferAttribute\",\r\n \"Uint32BufferAttribute\",\r\n \"Uint8BufferAttribute\",\r\n \"Uint8ClampedBufferAttribute\",\r\n \"Uniform\",\r\n \"UniformsGroup\",\r\n \"UniformsLib\",\r\n \"UniformsUtils\",\r\n \"UnsignedByteType\",\r\n \"UnsignedInt248Type\",\r\n \"UnsignedInt5999Type\",\r\n \"UnsignedIntType\",\r\n \"UnsignedShort4444Type\",\r\n \"UnsignedShort5551Type\",\r\n \"UnsignedShortType\",\r\n \"UVMapping\",\r\n \"Vector2\",\r\n \"Vector3\",\r\n \"Vector4\",\r\n \"VectorKeyframeTrack\",\r\n \"VideoTexture\",\r\n \"VSMShadowMap\",\r\n \"WebGL3DRenderTarget\",\r\n \"WebGLArrayRenderTarget\",\r\n \"WebGLCoordinateSystem\",\r\n \"WebGLCubeRenderTarget\",\r\n \"WebGLMultipleRenderTargets\",\r\n \"WebGLRenderer\",\r\n \"WebGLRenderTarget\",\r\n \"WebGLUtils\",\r\n \"WebGPUCoordinateSystem\",\r\n \"WireframeGeometry\",\r\n \"WrapAroundEnding\",\r\n \"ZeroCurvatureEnding\",\r\n \"ZeroFactor\",\r\n \"ZeroSlopeEnding\",\r\n \"ZeroStencilOp\"\r\n] as const;\r\n","import type { Plugin, Connect, ViteDevServer } from 'vite'\r\nimport type { ServerResponse } from 'http'\r\nimport path from 'path'\r\nimport fs from 'fs'\r\nimport {\r\n EMBEDDED_LIBRARY_BY_KEY,\r\n EMBEDDED_LIBRARIES,\r\n MODULE_TO_LIBRARY_SPECIFIERS,\r\n DEFAULT_SHARED_LIB_CDN_BASE,\r\n type EmbeddedLibraryDefinition,\r\n type ModuleSpecifierConfig,\r\n} from '../shared-assets/embeddedLibrariesManifest'\r\nimport {\r\n EMBEDDED_THREE_NAMED_EXPORTS,\r\n EMBEDDED_THREE_VERSION,\r\n} from '../shared-assets/generated/threeExports'\r\n\r\nexport interface VenusLibrariesPluginOptions {\r\n /**\r\n * Your app name (used for CDN asset serving in dev mode)\r\n * Optional - only needed if you have game assets in cdn/ folder\r\n * Example: 'block-breakers', 'fortunes-22'\r\n */\r\n appName?: string\r\n\r\n /**\r\n * Path to local cdn/ folder (relative to vite.config.ts)\r\n * Defaults to './cdn'\r\n */\r\n cdnDir?: string\r\n\r\n /**\r\n * Enable debug logging\r\n * Defaults to false\r\n */\r\n debug?: boolean\r\n}\r\n\r\n/**\r\n * Generate virtual module code based on library and specifier behavior\r\n */\r\nasync function resolveInstalledPackageVersion(\r\n pluginContext: { resolve: Plugin['resolveId'] extends any ? any : any },\r\n packageName: string,\r\n cache: Map<string, string | null>,\r\n): Promise<string | null> {\r\n if (cache.has(packageName)) {\r\n return cache.get(packageName) ?? null\r\n }\r\n\r\n const readVersion = (packageJsonPath: string): string | null => {\r\n const raw = fs.readFileSync(packageJsonPath, 'utf8')\r\n const parsed = JSON.parse(raw)\r\n return typeof parsed?.version === 'string' ? parsed.version : null\r\n }\r\n\r\n const findNearestPackageJson = (fromFilePath: string): string | null => {\r\n let dir = path.dirname(fromFilePath)\r\n while (true) {\r\n const candidate = path.join(dir, 'package.json')\r\n if (fs.existsSync(candidate) && fs.statSync(candidate).isFile()) {\r\n return candidate\r\n }\r\n const parent = path.dirname(dir)\r\n if (parent === dir) return null\r\n dir = parent\r\n }\r\n }\r\n\r\n try {\r\n // Best-case: resolve package.json directly (works when exports allows it).\r\n const pkgJsonResolved = await pluginContext.resolve(\r\n `${packageName}/package.json`,\r\n void 0,\r\n { skipSelf: true },\r\n )\r\n if (pkgJsonResolved?.id && fs.existsSync(pkgJsonResolved.id)) {\r\n const v = readVersion(pkgJsonResolved.id)\r\n cache.set(packageName, v)\r\n return v\r\n }\r\n\r\n // Fallback: resolve package entry, then walk up to nearest package.json.\r\n const entryResolved = await pluginContext.resolve(packageName, void 0, {\r\n skipSelf: true,\r\n })\r\n if (entryResolved?.id) {\r\n const pkgJsonPath = findNearestPackageJson(entryResolved.id)\r\n const v = pkgJsonPath ? readVersion(pkgJsonPath) : null\r\n cache.set(packageName, v)\r\n return v\r\n }\r\n } catch {\r\n // ignore (we'll store null below)\r\n }\r\n\r\n cache.set(packageName, null)\r\n return null\r\n}\r\n\r\nfunction generateVirtualModule(\r\n lib: EmbeddedLibraryDefinition,\r\n spec: ModuleSpecifierConfig,\r\n importPath: string,\r\n): string {\r\n const errorCheck = `\r\n// Wait for shim to complete loading libraries\r\nif (window.__venusLibraryShim && window.__venusLibraryShim.ready) {\r\n try {\r\n await window.__venusLibraryShim.ready();\r\n } catch (error) {\r\n console.error('[Venus Libraries] Shim bootstrap failed:', error);\r\n throw error;\r\n }\r\n} else {\r\n console.warn('[Venus Libraries] No shim found - running without embedded libraries');\r\n}\r\n\r\n// Verify library was loaded\r\nif (!window.__venusLibraryExports || !window.__venusLibraryExports['${lib.libraryKey}']) {\r\n console.error('[Venus Libraries] ${lib.packageName} library not loaded');\r\n console.error('[Venus Libraries] Config:', window.__venusLibrariesConfig);\r\n console.error('[Venus Libraries] Exports:', window.__venusLibraryExports);\r\n throw new Error(\r\n '${lib.packageName} not loaded (${importPath}). Check console for errors.'\r\n );\r\n}\r\n`\r\n\r\n const libVar = `window.__venusLibraryExports['${lib.libraryKey}']`\r\n\r\n const renderForwardedNamedExports = (\r\n names: readonly string[],\r\n chunkSize = 50,\r\n ): string => {\r\n if (names.length === 0) return ''\r\n\r\n const chunks: string[] = []\r\n for (let i = 0; i < names.length; i += chunkSize) {\r\n const slice = names.slice(i, i + chunkSize).join(', ')\r\n chunks.push(`export const { ${slice} } = lib;`)\r\n }\r\n return `\\n${chunks.join('\\n')}\\n`\r\n }\r\n\r\n switch (spec.behavior) {\r\n case 'react-jsx-runtime':\r\n // react/jsx-runtime - Production JSX transform\r\n return `\r\nconst React = await (async function() {\r\n ${errorCheck}\r\n return ${libVar};\r\n})();\r\n\r\nexport const jsx = React.jsx || function(type, props, key) {\r\n return React.createElement(type, { ...props, key });\r\n};\r\nexport const jsxs = React.jsxs || jsx;\r\nexport const Fragment = React.Fragment;\r\n`\r\n\r\n case 'react-jsx-dev-runtime':\r\n // react/jsx-dev-runtime - Development JSX transform\r\n return `\r\nconst React = await (async function() {\r\n ${errorCheck}\r\n return ${libVar};\r\n})();\r\n\r\nexport const jsxDEV = React.jsxDEV || React.createElement;\r\nexport const Fragment = React.Fragment;\r\n`\r\n\r\n case 'namespace':\r\n // Re-export all named exports (React, ReactDOM, Three.js, etc.)\r\n // For each library, we export the commonly used named exports\r\n let namedExports = ''\r\n if (lib.packageName === 'react') {\r\n namedExports = `\r\nexport const {\r\n createElement, createContext, createRef,\r\n Component, PureComponent, Fragment, StrictMode, Suspense, lazy, forwardRef, memo,\r\n useState, useEffect, useContext, useReducer, useCallback, useMemo, useRef, \r\n useLayoutEffect, useImperativeHandle, useDebugValue, useTransition, useDeferredValue,\r\n Children, cloneElement, isValidElement, version\r\n} = lib;`\r\n } else if (lib.packageName === 'react-dom') {\r\n namedExports = `\r\nexport const { createRoot, hydrateRoot, render, unmountComponentAtNode, findDOMNode, version } = lib;`\r\n } else if (lib.packageName === 'three') {\r\n // IMPORTANT:\r\n // - Our embedded Three is loaded as a global (window.THREE) via host/CDN.\r\n // - To support ESM consumers (`import * as THREE from 'three'` / `import { Scene } from 'three'`),\r\n // we must provide static named exports.\r\n // - ESM exports are static, so we generate the export-name list at release time and commit it.\r\n if (lib.version !== EMBEDDED_THREE_VERSION) {\r\n // If the manifest bumps but the generated file wasn't updated, fail loudly with an actionable message.\r\n namedExports = `\r\nthrow new Error('[Venus Libraries] Embedded three version mismatch: manifest has ${lib.version} but generated export list is for ${EMBEDDED_THREE_VERSION}. Run: npm run generate:embedded-three-exports (packages/api)');`\r\n } else {\r\n namedExports = renderForwardedNamedExports(EMBEDDED_THREE_NAMED_EXPORTS)\r\n }\r\n } else {\r\n // For other libraries, they should use default export only\r\n namedExports = ''\r\n }\r\n\r\n return `\r\nconst lib = await (async function() {\r\n ${errorCheck}\r\n return ${libVar};\r\n})();\r\n\r\nexport default lib;\r\n${namedExports}\r\n`\r\n\r\n case 'default':\r\n case undefined:\r\n // Simple default export (Phaser, Matter.js, inkjs, base React, etc.)\r\n return `\r\nconst lib = await (async function() {\r\n ${errorCheck}\r\n return ${libVar};\r\n})();\r\n\r\nexport default lib;\r\n`\r\n\r\n default:\r\n throw new Error(\r\n `Unknown behavior: ${spec.behavior} for ${lib.packageName}. Valid behaviors: default, namespace, react-jsx-runtime, react-jsx-dev-runtime`,\r\n )\r\n }\r\n}\r\n\r\n/**\r\n * Vite plugin for Venus embedded libraries system.\r\n *\r\n * This plugin externalizes supported libraries (Phaser, React, Three.js, etc.)\r\n * and loads them from the Venus host on mobile or CDN on web.\r\n *\r\n * By default, libraries are embedded for optimal bundle size.\r\n * Set VENUS_DISABLE_EMBEDDED_LIBS=true to bundle libraries for standalone export.\r\n *\r\n * @example\r\n * ```typescript\r\n * // vite.config.ts\r\n * import { venusLibrariesPlugin } from '@series-inc/venus-sdk/vite';\r\n *\r\n * export default defineConfig({\r\n * plugins: [\r\n * venusLibrariesPlugin({\r\n * appName: 'my-game',\r\n * cdnDir: './cdn',\r\n * }),\r\n * ],\r\n * });\r\n * ```\r\n *\r\n * Default build: npm run build (embedded libraries)\r\n * Standalone export: VENUS_DISABLE_EMBEDDED_LIBS=true npm run build\r\n */\r\nexport function venusLibrariesPlugin(\r\n options: VenusLibrariesPluginOptions = {},\r\n): Plugin {\r\n const cdnDir = path.resolve(options.cdnDir || './cdn')\r\n const debug = options.debug || false\r\n const requiredLibraries = new Set<string>()\r\n let isServe = false\r\n let enabled = false\r\n let appName = options.appName\r\n const installedVersionCache = new Map<string, string | null>()\r\n const loggedMismatch = new Set<string>()\r\n\r\n return {\r\n name: 'vite-plugin-venus-libraries',\r\n enforce: 'pre', // Run before other plugins to intercept imports\r\n\r\n async buildStart() {\r\n // Prime cache for enabled libraries (fast fail / fewer per-import resolves).\r\n if (!enabled) return\r\n const uniquePackages = Array.from(\r\n new Set(\r\n EMBEDDED_LIBRARIES.filter((l) => l.enabled).map((l) => l.packageName),\r\n ),\r\n )\r\n for (const pkgName of uniquePackages) {\r\n await resolveInstalledPackageVersion(this, pkgName, installedVersionCache)\r\n }\r\n },\r\n\r\n // 0. Configure Vite build options\r\n config(config: any): void {\r\n if (!enabled) return\r\n\r\n // Remove manualChunks for all library packages (conflicts with virtual modules)\r\n if (!config.build) config.build = {}\r\n if (!config.build.rollupOptions) config.build.rollupOptions = {}\r\n\r\n if (config.build.rollupOptions.output) {\r\n const output = config.build.rollupOptions.output\r\n const outputs = Array.isArray(output) ? output : [output]\r\n\r\n outputs.forEach((o) => {\r\n if (o.manualChunks && typeof o.manualChunks === 'object') {\r\n // Remove all enabled library package names from manualChunks\r\n const chunks = o.manualChunks as Record<string, string[]>\r\n EMBEDDED_LIBRARIES.forEach((lib) => {\r\n if (lib.enabled && chunks[lib.packageName]) {\r\n delete chunks[lib.packageName]\r\n }\r\n })\r\n }\r\n })\r\n }\r\n },\r\n\r\n // Log plugin status\r\n configResolved(config: any): void {\r\n isServe = config.command === 'serve'\r\n // Only enable for production builds, not dev server\r\n // Set VENUS_DISABLE_EMBEDDED_LIBS=true to create standalone bundles with libraries included\r\n enabled = !isServe && process.env.VENUS_DISABLE_EMBEDDED_LIBS !== 'true'\r\n\r\n // Auto-detect app name from folder structure if not provided\r\n // Pattern: /path/to/H5/{app-name}/ → use {app-name}\r\n // If not in H5 structure, CDN serving is disabled (embedded libraries still work)\r\n if (!appName && config.root) {\r\n const rootParts = config.root.split(path.sep)\r\n const h5Index = rootParts.indexOf('H5')\r\n if (h5Index >= 0 && h5Index < rootParts.length - 1) {\r\n appName = rootParts[h5Index + 1]\r\n if (debug) {\r\n console.log(\r\n `[Venus Libraries] Auto-detected app name from folder structure: ${appName}`,\r\n )\r\n }\r\n } else if (debug) {\r\n console.log(\r\n '[Venus Libraries] Not in H5 folder structure - CDN asset serving disabled (embedded libraries still work)',\r\n )\r\n }\r\n }\r\n\r\n if (isServe) {\r\n // Dev mode always bundles for fast HMR\r\n return\r\n }\r\n\r\n // Always log bundled mode (so devs know why bundle is large)\r\n if (!enabled) {\r\n console.log(\r\n '\\n[Venus Libraries] Building with bundled libraries (standalone mode)',\r\n )\r\n }\r\n },\r\n\r\n // 1. Intercept library imports\r\n async resolveId(\r\n id: string,\r\n importer: string | undefined,\r\n ): Promise<string | null> {\r\n if (!enabled) return null\r\n\r\n // Check if this import matches any enabled library specifier\r\n // MODULE_TO_LIBRARY_SPECIFIERS is already filtered to only include enabled libraries\r\n const match = MODULE_TO_LIBRARY_SPECIFIERS.find((spec) => {\r\n if (spec.match === 'exact') {\r\n return spec.value === id\r\n } else if (spec.match === 'prefix') {\r\n return id.startsWith(spec.value)\r\n }\r\n return false\r\n })\r\n\r\n if (match) {\r\n const lib = EMBEDDED_LIBRARY_BY_KEY[match.libraryKey]\r\n if (!lib) {\r\n throw new Error(\r\n `[Venus Libraries] Internal error: no embedded library for key ${match.libraryKey}`,\r\n )\r\n }\r\n\r\n // Version gate: only rewrite to embedded libs if the app's installed version\r\n // exactly matches the embedded version.\r\n const installed = await resolveInstalledPackageVersion(\r\n this,\r\n lib.packageName,\r\n installedVersionCache,\r\n )\r\n\r\n if (installed !== lib.version) {\r\n if (debug && !loggedMismatch.has(lib.packageName)) {\r\n loggedMismatch.add(lib.packageName)\r\n console.log(\r\n `[Venus Libraries] Skipping embedded ${lib.packageName}: installed=${installed ?? 'unknown'} embedded=${lib.version}`,\r\n )\r\n }\r\n return null\r\n }\r\n\r\n requiredLibraries.add(match.libraryKey)\r\n return `\\0virtual:venus-lib:${match.libraryKey}:${id}`\r\n }\r\n\r\n return null\r\n },\r\n\r\n // 2. Generate virtual module\r\n load(id: string): string | null {\r\n if (!id.startsWith('\\0virtual:venus-lib:')) {\r\n return null\r\n }\r\n\r\n // Parse virtual module ID: '\\0virtual:venus-lib:react@18.3.1:react/jsx-runtime'\r\n const parts = id.split(':')\r\n const libraryKey = parts[2]\r\n const importPath = parts.slice(3).join(':')\r\n\r\n const lib = EMBEDDED_LIBRARY_BY_KEY[libraryKey]\r\n if (!lib) {\r\n const availableKeys = Object.keys(EMBEDDED_LIBRARY_BY_KEY).join(', ')\r\n throw new Error(\r\n `Unknown library: ${libraryKey}. Available libraries: ${availableKeys}`,\r\n )\r\n }\r\n\r\n const spec = lib.moduleSpecifiers.find((s) => {\r\n if (s.match === 'exact') return s.value === importPath\r\n if (s.match === 'prefix') return importPath.startsWith(s.value)\r\n return false\r\n })\r\n if (!spec) {\r\n const validSpecifiers = lib.moduleSpecifiers\r\n .map((s) => s.value)\r\n .join(', ')\r\n throw new Error(\r\n `Unknown module specifier: ${importPath} for ${libraryKey}. Valid specifiers: ${validSpecifiers}`,\r\n )\r\n }\r\n\r\n const virtualModule = generateVirtualModule(lib, spec, importPath)\r\n\r\n return `// Virtual module: ${importPath}\\n${virtualModule}`\r\n },\r\n\r\n // 3. Transform HTML - inject config and shim for web support\r\n transformIndexHtml(html: string): string {\r\n if (!enabled || requiredLibraries.size === 0) {\r\n return html\r\n }\r\n\r\n // Build manifest for config\r\n const manifest: Record<string, any> = {}\r\n requiredLibraries.forEach((libraryKey) => {\r\n const lib = EMBEDDED_LIBRARY_BY_KEY[libraryKey]\r\n manifest[libraryKey] = {\r\n assetKey: lib.assetKey,\r\n cdnPath: lib.cdnPath,\r\n globalVar: lib.globalVar,\r\n loadStage: lib.loadStage,\r\n }\r\n })\r\n\r\n // Inject config + minimal shim for web\r\n // On mobile: Full shim via injectedJavaScriptBeforeContentLoaded (will override this)\r\n // On web: This minimal shim loads from CDN\r\n const embeddedLibsScript = `\r\n<script>\r\n // Set config (may be overridden by Venus host)\r\n if (!window.__venusLibrariesConfig) {\r\n window.__venusLibrariesConfig = {\r\n enabled: true,\r\n required: ${JSON.stringify(Array.from(requiredLibraries))},\r\n manifest: ${JSON.stringify(manifest, null, 2)},\r\n cdnBase: '${DEFAULT_SHARED_LIB_CDN_BASE}',\r\n useHost: false, // Web uses CDN\r\n debug: ${debug}\r\n };\r\n }\r\n \r\n // Minimal shim for web (CDN loading)\r\n if (!window.__venusLibraryShim) {\r\n var bootstrapResolve, bootstrapReject;\r\n var bootstrapPromise = new Promise(function(resolve, reject) {\r\n bootstrapResolve = resolve;\r\n bootstrapReject = reject;\r\n });\r\n \r\n window.__venusLibraryShim = {\r\n ready: function() { return bootstrapPromise; },\r\n __initialized: true\r\n };\r\n \r\n // Auto-load libraries from CDN by stage (respects dependencies)\r\n var config = window.__venusLibrariesConfig;\r\n if (!config.required || config.required.length === 0) {\r\n bootstrapResolve();\r\n } else {\r\n // Group libraries by load stage\r\n var librariesByStage = {};\r\n for (var i = 0; i < config.required.length; i++) {\r\n var libraryKey = config.required[i];\r\n var entry = config.manifest[libraryKey];\r\n var stage = entry.loadStage || 0;\r\n if (!librariesByStage[stage]) librariesByStage[stage] = [];\r\n librariesByStage[stage].push({ libraryKey: libraryKey, entry: entry });\r\n }\r\n \r\n // Load stages sequentially, libraries within each stage in parallel\r\n var stages = Object.keys(librariesByStage).sort(function(a, b) { return parseInt(a, 10) - parseInt(b, 10); });\r\n \r\n (async function loadByStages() {\r\n for (var s = 0; s < stages.length; s++) {\r\n var stage = stages[s];\r\n var libs = librariesByStage[stage];\r\n \r\n // Load all libraries in this stage in parallel\r\n var stagePromises = libs.map(function(lib) {\r\n var base = config.cdnBase || '';\r\n if (!base.endsWith('/')) base += '/';\r\n var path = lib.entry.cdnPath;\r\n if (path.charAt(0) === '/') path = path.substring(1);\r\n var url = base + path;\r\n return fetch(url)\r\n .then(function(r) {\r\n if (!r.ok) throw new Error('HTTP ' + r.status + ' fetching ' + url);\r\n return r.text();\r\n })\r\n .then(function(src) {\r\n try {\r\n (new Function(src)).call(window);\r\n } catch (evalErr) {\r\n throw new Error('Failed to evaluate ' + lib.libraryKey + ': ' + evalErr.message);\r\n }\r\n if (!window.__venusLibraryExports) window.__venusLibraryExports = {};\r\n var exported = window[lib.entry.globalVar];\r\n if (!exported) {\r\n throw new Error(lib.libraryKey + ' loaded but window.' + lib.entry.globalVar + ' is undefined. Check CDN file.');\r\n }\r\n window.__venusLibraryExports[lib.libraryKey] = exported;\r\n })\r\n .catch(function(err) {\r\n throw new Error('[' + lib.libraryKey + '] ' + err.message);\r\n });\r\n });\r\n \r\n await Promise.all(stagePromises);\r\n }\r\n })()\r\n .then(function() {\r\n bootstrapResolve();\r\n })\r\n .catch(function(err) {\r\n console.error('[Venus Libraries] Library loading failed:', err.message || err);\r\n bootstrapReject(err);\r\n });\r\n }\r\n }\r\n</script>`\r\n\r\n return html.replace('<head>', '<head>' + embeddedLibsScript)\r\n },\r\n\r\n // 4. Serve CDN assets in dev mode (only if in H5 folder structure)\r\n configureServer(server: ViteDevServer): void {\r\n if (!enabled || !appName) {\r\n // CDN serving disabled - either plugin disabled or not in H5 structure\r\n // Embedded libraries still work via CDN URLs in production\r\n return\r\n }\r\n\r\n if (debug) {\r\n console.log(\r\n `[Venus Libraries] Dev server will serve /${appName}/* from ${cdnDir}`,\r\n )\r\n }\r\n\r\n server.middlewares.use(\r\n (\r\n req: Connect.IncomingMessage,\r\n res: ServerResponse,\r\n next: Connect.NextFunction,\r\n ) => {\r\n if (!req.url) return next()\r\n\r\n const urlPath = req.url.split('?')[0]\r\n if (!urlPath.startsWith(`/${appName}/`)) return next()\r\n\r\n const relativePath = urlPath.replace(`/${appName}/`, '')\r\n const filePath = path.join(cdnDir, relativePath)\r\n\r\n if (fs.existsSync(filePath) && fs.statSync(filePath).isFile()) {\r\n const ext = path.extname(filePath).toLowerCase()\r\n const contentTypes: Record<string, string> = {\r\n '.png': 'image/png',\r\n '.jpg': 'image/jpeg',\r\n '.jpeg': 'image/jpeg',\r\n '.gif': 'image/gif',\r\n '.webp': 'image/webp',\r\n '.mp3': 'audio/mpeg',\r\n '.mp4': 'video/mp4',\r\n '.ogg': 'audio/ogg',\r\n '.wav': 'audio/wav',\r\n '.json': 'application/json',\r\n }\r\n\r\n res.setHeader(\r\n 'Content-Type',\r\n contentTypes[ext] || 'application/octet-stream',\r\n )\r\n res.setHeader('Cache-Control', 'public, max-age=3600')\r\n return res.end(fs.readFileSync(filePath))\r\n }\r\n\r\n next()\r\n },\r\n )\r\n },\r\n\r\n // 5. Emit manifest for debugging\r\n generateBundle(): void {\r\n if (!enabled || requiredLibraries.size === 0) return\r\n\r\n // Build complete manifest with library details\r\n const libraries: Record<string, any> = {}\r\n const libraryNames: string[] = []\r\n let totalSavingsKB = 0\r\n\r\n requiredLibraries.forEach((libraryKey) => {\r\n const lib = EMBEDDED_LIBRARY_BY_KEY[libraryKey]\r\n libraries[libraryKey] = {\r\n assetKey: lib.assetKey,\r\n cdnPath: lib.cdnPath,\r\n globalVar: lib.globalVar,\r\n packageName: lib.packageName,\r\n version: lib.version,\r\n moduleSpecifiers: lib.moduleSpecifiers.map((s) => s.value),\r\n }\r\n\r\n libraryNames.push(lib.packageName)\r\n\r\n // Estimate savings (approximate sizes)\r\n const sizes: Record<string, number> = {\r\n phaser: 1100,\r\n react: 138,\r\n 'react-dom': 42,\r\n three: 600,\r\n 'matter-js': 100,\r\n inkjs: 50,\r\n }\r\n totalSavingsKB += sizes[lib.packageName] || 0\r\n })\r\n\r\n const manifest = {\r\n enabled: true,\r\n required: Array.from(requiredLibraries),\r\n libraries,\r\n cdnBase: DEFAULT_SHARED_LIB_CDN_BASE,\r\n buildTime: new Date().toISOString(),\r\n plugin: '@series-inc/venus-sdk/vite',\r\n }\r\n\r\n this.emitFile({\r\n type: 'asset',\r\n fileName: 'venus-libraries.manifest.json',\r\n source: JSON.stringify(manifest, null, 2),\r\n })\r\n\r\n // Summary log\r\n const libList = libraryNames.join(', ')\r\n const savingsMsg =\r\n totalSavingsKB > 0 ? ` (~${totalSavingsKB}KB saved)` : ''\r\n console.log(\r\n `\\n[Venus Libraries] Using embedded libraries to reduce bundle size: ${libList}${savingsMsg}`,\r\n )\r\n },\r\n }\r\n}\r\n","import path from 'node:path'\r\nimport fs from 'node:fs'\r\nimport { ResolvedConfig } from 'vite'\r\n\r\nexport function cdnPlugin() {\r\n let config: ResolvedConfig;\r\n return {\r\n name: 'remove-dev-assets',\r\n apply: 'build',\r\n\r\n // Hook to capture the resolved config\r\n configResolved(resolvedConfig: ResolvedConfig) {\r\n config = resolvedConfig;\r\n },\r\n\r\n closeBundle() {\r\n const outDir = config.build.outDir;\r\n const devAssetsDir = path.resolve(config.root, outDir, 'cdn');\r\n\r\n if (fs.existsSync(devAssetsDir)) {\r\n fs.rmSync(devAssetsDir, { recursive: true, force: true });\r\n console.log(`[Cleanup] Removed cdn from: ${devAssetsDir}`);\r\n }\r\n }\r\n };\r\n}","/* Minimal CSS - FAB uses inline styles only for guaranteed floating behavior */\r\n\r\n/* Optional: Override input styling for modal if needed */\r\ninput[style*=\"background: rgba(0, 0, 0, 0.2)\"],\r\nselect[style*=\"background: rgba(0, 0, 0, 0.2)\"] {\r\n box-sizing: border-box;\r\n}\r\n\r\ninput[style*=\"background: rgba(0, 0, 0, 0.2)\"]:focus,\r\nselect[style*=\"background: rgba(0, 0, 0, 0.2)\"]:focus {\r\n outline: none;\r\n border-color: rgba(59, 130, 246, 0.5) !important;\r\n box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.1);\r\n}\r\n\r\nbutton[style*=\"background: #3B82F6\"]:hover {\r\n background: #2563EB !important;\r\n}\r\n\r\nbutton[style*=\"background: #3B82F6\"]:disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n}\r\n","export default \"/**\\r\\n * Venus Sandbox Toolbar\\r\\n *\\r\\n * Floating toolbar that shows auth status and provides sign-in functionality.\\r\\n * Auth state is managed by Firebase Auth and persisted in IndexedDB.\\r\\n */\\r\\n\\r\\nconst LOCAL_STORAGE_POS_KEY = 'venus-sandbox-pos'\\r\\nconst LOCAL_STORAGE_PLAYER_KEY = 'venus-sandbox-selected-player'\\r\\n\\r\\nfunction getSelectedPlayerId() {\\r\\n try {\\r\\n const raw = localStorage.getItem(LOCAL_STORAGE_PLAYER_KEY)\\r\\n const candidate = (raw || '').trim().toLowerCase()\\r\\n if (!candidate) return 'player1'\\r\\n if (!/^player\\\\\\\\d+$/.test(candidate)) return 'player1'\\r\\n const n = parseInt(candidate.replace('player', ''), 10)\\r\\n if (!Number.isFinite(n) || n < 1) return 'player1'\\r\\n return `player${n}`\\r\\n } catch {\\r\\n return 'player1'\\r\\n }\\r\\n}\\r\\n\\r\\nfunction setSelectedPlayerId(playerId) {\\r\\n const normalized = String(playerId || '').trim().toLowerCase()\\r\\n const safe = /^player\\\\\\\\d+$/.test(normalized) ? normalized : 'player1'\\r\\n try {\\r\\n localStorage.setItem(LOCAL_STORAGE_PLAYER_KEY, safe)\\r\\n } catch {\\r\\n // ignore\\r\\n }\\r\\n return safe\\r\\n}\\r\\n\\r\\nfunction nextPlayerId(currentPlayerId) {\\r\\n const current = String(currentPlayerId || '').trim().toLowerCase()\\r\\n const match = current.match(/^player(\\\\\\\\d+)$/)\\r\\n const n = match ? parseInt(match[1], 10) : 1\\r\\n const next = Number.isFinite(n) && n >= 1 ? n + 1 : 2\\r\\n return `player${next}`\\r\\n}\\r\\n\\r\\n;(async () => {\\r\\n try {\\r\\n if (!shouldRenderToolbar()) {\\r\\n return\\r\\n }\\r\\n\\r\\n await ensureDomReady()\\r\\n\\r\\n const sandboxConfig = window.__VENUS_SANDBOX__ || {}\\r\\n const sandboxEnabled = isSandboxEnabled(sandboxConfig)\\r\\n\\r\\n if (!sandboxEnabled) {\\r\\n return\\r\\n }\\r\\n\\r\\n // Create minimal FAB with inline styles\\r\\n createFloatingToolbar(sandboxConfig)\\r\\n } catch (error) {\\r\\n console.error('[Venus Sandbox] Failed to render toolbar:', error)\\r\\n }\\r\\n})()\\r\\n\\r\\nfunction shouldRenderToolbar() {\\r\\n if (typeof window === 'undefined') {\\r\\n return false\\r\\n }\\r\\n const host = location.hostname\\r\\n return host === 'localhost' || host === '127.0.0.1' || host.endsWith('.local')\\r\\n}\\r\\n\\r\\nfunction ensureDomReady() {\\r\\n if (document.readyState === 'loading') {\\r\\n return new Promise((resolve) => {\\r\\n document.addEventListener('DOMContentLoaded', resolve, { once: true })\\r\\n })\\r\\n }\\r\\n return Promise.resolve()\\r\\n}\\r\\n\\r\\nfunction isSandboxEnabled(sandboxConfig) {\\r\\n return Boolean(sandboxConfig && sandboxConfig.enabled === true)\\r\\n}\\r\\n\\r\\nfunction createFloatingToolbar(sandboxConfig) {\\r\\n // Create main FAB element with inline styles\\r\\n const fab = document.createElement('div')\\r\\n fab.id = 'venus-sandbox-toolbar'\\r\\n\\r\\n // Get environment for theming\\r\\n const target = String(sandboxConfig?.target || 'local').toLowerCase()\\r\\n const envGradients = {\\r\\n local: 'linear-gradient(120deg, #f59e0b, #d97706)',\\r\\n dev: 'linear-gradient(120deg, #0891b2, #10b981)',\\r\\n staging: 'linear-gradient(120deg, #8b5cf6, #6366f1)',\\r\\n }\\r\\n const envLabels = {\\r\\n local: 'LOCAL',\\r\\n dev: 'DEV',\\r\\n staging: 'STAGING',\\r\\n }\\r\\n const initialGradient = envGradients[target] || envGradients.local\\r\\n const envLabel = envLabels[target] || 'LOCAL'\\r\\n\\r\\n // Get saved position or use defaults\\r\\n const savedPos = localStorage.getItem(LOCAL_STORAGE_POS_KEY)\\r\\n let posRight = 16\\r\\n let posY = Math.round((window.innerHeight - 36) / 2)\\r\\n\\r\\n if (savedPos) {\\r\\n try {\\r\\n const parsed = JSON.parse(savedPos)\\r\\n posRight = parsed.right\\r\\n posY = parsed.y\\r\\n } catch (e) {\\r\\n // Ignore invalid saved position\\r\\n }\\r\\n }\\r\\n\\r\\n // Ensure within bounds\\r\\n posRight = Math.min(Math.max(0, posRight), window.innerWidth - 36)\\r\\n posY = Math.min(Math.max(0, posY), window.innerHeight - 36)\\r\\n\\r\\n // Start with \\\"checking\\\" state using env gradient\\r\\n fab.style.cssText = `\\r\\n position: fixed;\\r\\n right: ${posRight}px;\\r\\n top: ${posY}px;\\r\\n width: auto;\\r\\n min-width: 160px;\\r\\n height: 36px;\\r\\n padding: 0;\\r\\n margin: 0;\\r\\n border: none;\\r\\n border-radius: 999px;\\r\\n background: ${initialGradient};\\r\\n color: #ffffff;\\r\\n font-family: system-ui, -apple-system, sans-serif;\\r\\n font-size: 12px;\\r\\n font-weight: 600;\\r\\n letter-spacing: 0.02em;\\r\\n cursor: grab;\\r\\n user-select: none;\\r\\n z-index: 2147483601;\\r\\n box-shadow: 0 12px 25px rgba(0, 0, 0, 0.35);\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 0;\\r\\n pointer-events: auto;\\r\\n border: 1px solid rgba(255, 255, 255, 0.2);\\r\\n `\\r\\n\\r\\n // Store env config on fab for later use\\r\\n fab.dataset.target = target\\r\\n fab.dataset.envGradient = initialGradient\\r\\n\\r\\n // Create env badge\\r\\n const envBadge = document.createElement('div')\\r\\n envBadge.style.cssText = `\\r\\n padding: 0 10px;\\r\\n height: 100%;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n font-size: 10px;\\r\\n font-weight: 700;\\r\\n letter-spacing: 0.05em;\\r\\n text-transform: uppercase;\\r\\n background: rgba(0, 0, 0, 0.2);\\r\\n border-top-left-radius: 999px;\\r\\n border-bottom-left-radius: 999px;\\r\\n `\\r\\n envBadge.textContent = envLabel\\r\\n\\r\\n // Create label container\\r\\n const labelDiv = document.createElement('div')\\r\\n labelDiv.style.cssText = `\\r\\n padding: 0 8px 0 10px;\\r\\n height: 100%;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n white-space: nowrap;\\r\\n cursor: pointer;\\r\\n `\\r\\n labelDiv.textContent = '🪐 Checking...'\\r\\n\\r\\n // Create handle for dragging\\r\\n const handleDiv = document.createElement('div')\\r\\n handleDiv.style.cssText = `\\r\\n width: 38px;\\r\\n height: 100%;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n font-size: 18px;\\r\\n font-weight: 600;\\r\\n background: rgba(0, 0, 0, 0.25);\\r\\n border-top-right-radius: 999px;\\r\\n border-bottom-right-radius: 999px;\\r\\n cursor: grab;\\r\\n `\\r\\n handleDiv.textContent = '✜'\\r\\n\\r\\n fab.appendChild(envBadge)\\r\\n fab.appendChild(labelDiv)\\r\\n fab.appendChild(handleDiv)\\r\\n\\r\\n const toolbarRoot = document.getElementById('venus-toolbar-root')\\r\\n ;(toolbarRoot || document.body).appendChild(fab)\\r\\n\\r\\n // Set up drag handling\\r\\n setupDragHandling(fab, handleDiv)\\r\\n\\r\\n // Set up collapse/expand behavior\\r\\n setupCollapseExpand(fab, envBadge, labelDiv)\\r\\n\\r\\n // Click handler for label to open modal\\r\\n labelDiv.addEventListener('click', () => {\\r\\n openAuthModal(sandboxConfig, getCurrentAuthState())\\r\\n })\\r\\n\\r\\n // Listen for auth state changes (set up by MockHost)\\r\\n window.addEventListener('venus-auth-state-changed', (e) => {\\r\\n updateToolbarState(fab, labelDiv, e.detail)\\r\\n })\\r\\n\\r\\n // Check initial auth state after a short delay (give Firebase time to restore session)\\r\\n setTimeout(() => {\\r\\n checkInitialAuthState(fab, labelDiv, sandboxConfig)\\r\\n }, 500)\\r\\n}\\r\\n\\r\\nlet currentAuthState = { signedIn: false, user: null }\\r\\n\\r\\nfunction getCurrentAuthState() {\\r\\n return currentAuthState\\r\\n}\\r\\n\\r\\nfunction checkInitialAuthState(fab, labelDiv, sandboxConfig) {\\r\\n // Dispatch event to check auth state (MockHost will respond)\\r\\n window.dispatchEvent(new CustomEvent('venus-check-auth-state'))\\r\\n\\r\\n // Also set a timeout to show sign-in prompt if no response\\r\\n setTimeout(() => {\\r\\n if (!currentAuthState.signedIn) {\\r\\n updateToolbarState(fab, labelDiv, { signedIn: false, user: null })\\r\\n }\\r\\n }, 2000)\\r\\n}\\r\\n\\r\\nfunction updateToolbarState(fab, labelDiv, authState) {\\r\\n currentAuthState = authState\\r\\n\\r\\n // Get stored env gradient\\r\\n const envGradient = fab.dataset.envGradient || 'linear-gradient(120deg, #f59e0b, #d97706)'\\r\\n const isLocal = String(fab.dataset.target || '').toLowerCase() === 'local'\\r\\n\\r\\n if (authState.signedIn && authState.user) {\\r\\n // Signed in - use env gradient with full opacity\\r\\n fab.style.background = envGradient\\r\\n fab.style.opacity = '1'\\r\\n const displayName = authState.user.displayName || authState.user.email || 'Signed in'\\r\\n labelDiv.textContent = `✓ ${truncate(displayName, 14)}`\\r\\n } else {\\r\\n // Not signed in - use env gradient but slightly dimmed, with sign-in prompt\\r\\n fab.style.background = envGradient\\r\\n fab.style.opacity = '0.85'\\r\\n labelDiv.textContent = isLocal ? `○ ${getSelectedPlayerId()}` : '○ Sign in'\\r\\n }\\r\\n}\\r\\n\\r\\nfunction truncate(str, maxLength) {\\r\\n if (str.length <= maxLength) return str\\r\\n return str.substring(0, maxLength - 1) + '…'\\r\\n}\\r\\n\\r\\nfunction setupCollapseExpand(fab, envBadge, labelDiv) {\\r\\n let collapseTimeout\\r\\n let isCollapsed = false\\r\\n\\r\\n const collapse = () => {\\r\\n fab.style.minWidth = '36px'\\r\\n fab.style.opacity = '0.4'\\r\\n envBadge.style.display = 'none'\\r\\n labelDiv.style.display = 'none'\\r\\n isCollapsed = true\\r\\n }\\r\\n\\r\\n const expand = () => {\\r\\n clearTimeout(collapseTimeout)\\r\\n fab.style.minWidth = '160px'\\r\\n fab.style.opacity = '1'\\r\\n envBadge.style.display = 'flex'\\r\\n labelDiv.style.display = 'flex'\\r\\n isCollapsed = false\\r\\n }\\r\\n\\r\\n const scheduleCollapse = () => {\\r\\n clearTimeout(collapseTimeout)\\r\\n collapseTimeout = setTimeout(collapse, 5000)\\r\\n }\\r\\n\\r\\n // Collapse after 5 seconds\\r\\n scheduleCollapse()\\r\\n\\r\\n fab.addEventListener('mouseenter', expand)\\r\\n fab.addEventListener('mouseleave', () => {\\r\\n if (!isCollapsed) scheduleCollapse()\\r\\n })\\r\\n}\\r\\n\\r\\nfunction setupDragHandling(fab, handleDiv) {\\r\\n let isDragging = false\\r\\n let startX, startY, offsetRight, offsetY\\r\\n\\r\\n fab.addEventListener('mousedown', (e) => {\\r\\n isDragging = true\\r\\n startX = e.clientX\\r\\n startY = e.clientY\\r\\n offsetRight = window.innerWidth - fab.offsetLeft - fab.offsetWidth\\r\\n offsetY = fab.offsetTop\\r\\n fab.style.cursor = 'grabbing'\\r\\n e.preventDefault()\\r\\n })\\r\\n\\r\\n document.addEventListener('mousemove', (e) => {\\r\\n if (!isDragging) return\\r\\n\\r\\n let newRight = offsetRight - (e.clientX - startX)\\r\\n let newTop = offsetY + (e.clientY - startY)\\r\\n\\r\\n newRight = Math.min(Math.max(0, newRight), window.innerWidth - 36)\\r\\n newTop = Math.min(Math.max(0, newTop), window.innerHeight - 36)\\r\\n\\r\\n fab.style.right = `${newRight}px`\\r\\n fab.style.top = `${newTop}px`\\r\\n })\\r\\n\\r\\n document.addEventListener('mouseup', () => {\\r\\n if (!isDragging) return\\r\\n isDragging = false\\r\\n fab.style.cursor = 'grab'\\r\\n const currentRight = window.innerWidth - fab.offsetLeft - fab.offsetWidth\\r\\n localStorage.setItem(LOCAL_STORAGE_POS_KEY, JSON.stringify({\\r\\n right: currentRight,\\r\\n y: fab.offsetTop,\\r\\n }))\\r\\n })\\r\\n}\\r\\n\\r\\nfunction openAuthModal(sandboxConfig, authState) {\\r\\n const overlay = document.createElement('div')\\r\\n overlay.style.cssText = `\\r\\n position: fixed;\\r\\n top: 0;\\r\\n left: 0;\\r\\n right: 0;\\r\\n bottom: 0;\\r\\n background: rgba(0, 0, 0, 0.6);\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n z-index: 2147483602;\\r\\n backdrop-filter: blur(4px);\\r\\n `\\r\\n\\r\\n const content = document.createElement('div')\\r\\n content.style.cssText = `\\r\\n background: #111827;\\r\\n color: #F3F4F6;\\r\\n border: 1px solid rgba(255, 255, 255, 0.1);\\r\\n border-radius: 16px;\\r\\n width: 90%;\\r\\n max-width: 420px;\\r\\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.6);\\r\\n font-family: system-ui, -apple-system, sans-serif;\\r\\n overflow: hidden;\\r\\n `\\r\\n\\r\\n const target = String(sandboxConfig?.target || 'local').toLowerCase()\\r\\n const targetUpper = target.toUpperCase()\\r\\n const gameId = sandboxConfig?.gameId || 'Unknown'\\r\\n const isSignedIn = authState.signedIn\\r\\n const user = authState.user\\r\\n const isLocal = target === 'local'\\r\\n const selectedPlayerId = isLocal ? getSelectedPlayerId() : null\\r\\n\\r\\n // Environment-specific theming\\r\\n const envConfig = {\\r\\n local: {\\r\\n gradient: 'linear-gradient(120deg, #f59e0b, #d97706)',\\r\\n badge: '#f59e0b',\\r\\n badgeBg: 'rgba(245, 158, 11, 0.15)',\\r\\n label: 'LOCAL',\\r\\n subtitle: 'Firebase Emulator',\\r\\n },\\r\\n dev: {\\r\\n gradient: 'linear-gradient(120deg, #0891b2, #10b981)',\\r\\n badge: '#10b981',\\r\\n badgeBg: 'rgba(16, 185, 129, 0.15)',\\r\\n label: 'DEV',\\r\\n subtitle: 'Development Server',\\r\\n },\\r\\n staging: {\\r\\n gradient: 'linear-gradient(120deg, #8b5cf6, #6366f1)',\\r\\n badge: '#8b5cf6',\\r\\n badgeBg: 'rgba(139, 92, 246, 0.15)',\\r\\n label: 'STAGING',\\r\\n subtitle: 'Staging Server',\\r\\n },\\r\\n }\\r\\n\\r\\n const env = envConfig[target] || envConfig.local\\r\\n const statusIcon = isSignedIn ? '✓' : '○'\\r\\n const statusText = isSignedIn ? 'Signed in' : 'Not signed in'\\r\\n const statusColor = isSignedIn ? '#10b981' : '#6b7280'\\r\\n const userDisplay = user ? (user.displayName || user.email || 'Unknown') : '—'\\r\\n const userIdShort = user?.uid ? user.uid.slice(0, 8) + '...' : ''\\r\\n\\r\\n content.innerHTML = `\\r\\n <div style=\\\"\\r\\n background: ${env.gradient};\\r\\n padding: 20px 24px;\\r\\n display: flex;\\r\\n justify-content: space-between;\\r\\n align-items: center;\\r\\n \\\">\\r\\n <div style=\\\"display: flex; align-items: center; gap: 10px;\\\">\\r\\n <span style=\\\"font-size: 24px;\\\">🪐</span>\\r\\n <div>\\r\\n <div style=\\\"font-size: 16px; font-weight: 700; letter-spacing: 0.02em;\\\">Venus Sandbox</div>\\r\\n <div style=\\\"font-size: 11px; opacity: 0.85; margin-top: 2px;\\\">${env.subtitle}</div>\\r\\n </div>\\r\\n </div>\\r\\n <button id=\\\"close-modal\\\" style=\\\"\\r\\n background: rgba(0, 0, 0, 0.2);\\r\\n border: none;\\r\\n color: white;\\r\\n cursor: pointer;\\r\\n font-size: 18px;\\r\\n width: 32px;\\r\\n height: 32px;\\r\\n border-radius: 8px;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n transition: background 0.2s;\\r\\n \\\">×</button>\\r\\n </div>\\r\\n\\r\\n <div style=\\\"padding: 20px 24px; display: flex; flex-direction: column; gap: 16px;\\\">\\r\\n\\r\\n <div style=\\\"\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 12px;\\r\\n padding: 14px 16px;\\r\\n background: ${env.badgeBg};\\r\\n border: 1px solid ${env.badge}33;\\r\\n border-radius: 10px;\\r\\n \\\">\\r\\n <div style=\\\"\\r\\n width: 10px;\\r\\n height: 10px;\\r\\n border-radius: 50%;\\r\\n background: ${env.badge};\\r\\n box-shadow: 0 0 8px ${env.badge};\\r\\n \\\"></div>\\r\\n <div style=\\\"flex: 1;\\\">\\r\\n <div style=\\\"font-size: 14px; font-weight: 600; color: ${env.badge};\\\">${env.label}${isLocal ? ' (Emulator)' : ''}</div>\\r\\n <div style=\\\"font-size: 11px; color: #9CA3AF; margin-top: 2px;\\\">Game: ${gameId}</div>\\r\\n </div>\\r\\n </div>\\r\\n\\r\\n <div style=\\\"\\r\\n padding: 14px 16px;\\r\\n background: rgba(255, 255, 255, 0.03);\\r\\n border: 1px solid rgba(255, 255, 255, 0.06);\\r\\n border-radius: 10px;\\r\\n \\\">\\r\\n <div style=\\\"display: flex; align-items: center; gap: 8px; margin-bottom: ${isSignedIn ? '10px' : '0'};\\\">\\r\\n <span style=\\\"\\r\\n display: inline-flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n width: 20px;\\r\\n height: 20px;\\r\\n border-radius: 50%;\\r\\n background: ${isSignedIn ? 'rgba(16, 185, 129, 0.2)' : 'rgba(107, 114, 128, 0.2)'};\\r\\n color: ${statusColor};\\r\\n font-size: 12px;\\r\\n font-weight: 600;\\r\\n \\\">${statusIcon}</span>\\r\\n <span style=\\\"font-size: 13px; color: ${statusColor}; font-weight: 500;\\\">${statusText}</span>\\r\\n </div>\\r\\n ${isSignedIn ? `\\r\\n <div style=\\\"\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 10px;\\r\\n padding-top: 10px;\\r\\n border-top: 1px solid rgba(255, 255, 255, 0.06);\\r\\n \\\">\\r\\n <div style=\\\"\\r\\n width: 36px;\\r\\n height: 36px;\\r\\n border-radius: 50%;\\r\\n background: linear-gradient(135deg, #6366f1, #8b5cf6);\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n font-size: 14px;\\r\\n font-weight: 600;\\r\\n color: white;\\r\\n \\\">${(userDisplay[0] || '?').toUpperCase()}</div>\\r\\n <div style=\\\"flex: 1; min-width: 0;\\\">\\r\\n <div style=\\\"font-size: 13px; font-weight: 500; color: #F3F4F6; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\\\">${userDisplay}</div>\\r\\n <div style=\\\"font-size: 11px; color: #6B7280; font-family: monospace;\\\">${userIdShort}</div>\\r\\n </div>\\r\\n </div>\\r\\n ` : `\\r\\n <div style=\\\"font-size: 12px; color: #6B7280; margin-top: 8px; line-height: 1.5;\\\">\\r\\n Sign in to use sandbox features. Your session persists across reloads.\\r\\n </div>\\r\\n `}\\r\\n </div>\\r\\n\\r\\n <div style=\\\"\\r\\n padding: 12px 14px;\\r\\n background: rgba(99, 102, 241, 0.08);\\r\\n border: 1px solid rgba(99, 102, 241, 0.15);\\r\\n border-radius: 8px;\\r\\n font-size: 12px;\\r\\n color: #a5b4fc;\\r\\n line-height: 1.5;\\r\\n \\\">\\r\\n <div style=\\\"font-weight: 600; margin-bottom: 4px; color: #c7d2fe;\\\">💡 Change environment:</div>\\r\\n <code style=\\\"\\r\\n display: block;\\r\\n background: rgba(0, 0, 0, 0.3);\\r\\n padding: 8px 10px;\\r\\n border-radius: 5px;\\r\\n font-family: 'SF Mono', Monaco, monospace;\\r\\n font-size: 11px;\\r\\n color: #e0e7ff;\\r\\n margin-top: 6px;\\r\\n \\\">venus set-env <local|dev|staging></code>\\r\\n </div>\\r\\n\\r\\n ${isLocal ? `\\r\\n <div style=\\\"\\r\\n padding: 10px 14px;\\r\\n background: rgba(245, 158, 11, 0.08);\\r\\n border: 1px solid rgba(245, 158, 11, 0.15);\\r\\n border-radius: 8px;\\r\\n font-size: 11px;\\r\\n color: #fcd34d;\\r\\n line-height: 1.5;\\r\\n \\\">\\r\\n <strong>Emulator mode:</strong> Profiles are auto-created on first sign-in.\\r\\n <a href=\\\"http://localhost:4000\\\" target=\\\"_blank\\\" style=\\\"color: #fbbf24; text-decoration: underline; margin-left: 4px;\\\">Open Emulator UI →</a>\\r\\n </div>\\r\\n ` : ''}\\r\\n\\r\\n ${isLocal ? `\\r\\n <div style=\\\"\\r\\n padding: 12px 14px;\\r\\n background: rgba(255, 255, 255, 0.03);\\r\\n border: 1px solid rgba(255, 255, 255, 0.06);\\r\\n border-radius: 10px;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: space-between;\\r\\n gap: 12px;\\r\\n \\\">\\r\\n <div style=\\\"min-width:0;\\\">\\r\\n <div style=\\\"font-size: 11px; font-weight: 600; color: #9CA3AF; text-transform: uppercase; letter-spacing: 0.05em;\\\">Local Player</div>\\r\\n <div id=\\\"local-player-label\\\" style=\\\"font-size: 14px; font-weight: 700; margin-top: 2px; color: #F3F4F6;\\\">${selectedPlayerId}</div>\\r\\n </div>\\r\\n <button id=\\\"add-player\\\" style=\\\"\\r\\n background: rgba(245, 158, 11, 0.12);\\r\\n color: #fcd34d;\\r\\n border: 1px solid rgba(245, 158, 11, 0.25);\\r\\n border-radius: 8px;\\r\\n padding: 10px 12px;\\r\\n font-size: 12px;\\r\\n font-weight: 700;\\r\\n cursor: pointer;\\r\\n white-space: nowrap;\\r\\n \\\">+ Player</button>\\r\\n </div>\\r\\n ` : ''}\\r\\n\\r\\n ${isSignedIn ? `\\r\\n <div style=\\\"\\r\\n padding: 12px 14px;\\r\\n background: rgba(255, 255, 255, 0.03);\\r\\n border: 1px solid rgba(255, 255, 255, 0.06);\\r\\n border-radius: 8px;\\r\\n \\\">\\r\\n <div style=\\\"font-size: 11px; font-weight: 600; color: #9CA3AF; margin-bottom: 10px; text-transform: uppercase; letter-spacing: 0.05em;\\\">Storage Debug</div>\\r\\n <div style=\\\"display: flex; gap: 8px;\\\">\\r\\n <button id=\\\"copy-app-storage\\\" style=\\\"\\r\\n flex: 1;\\r\\n background: rgba(99, 102, 241, 0.1);\\r\\n color: #a5b4fc;\\r\\n border: 1px solid rgba(99, 102, 241, 0.2);\\r\\n border-radius: 6px;\\r\\n padding: 8px 12px;\\r\\n font-size: 12px;\\r\\n font-weight: 500;\\r\\n cursor: pointer;\\r\\n transition: background 0.2s;\\r\\n \\\">📋 App Storage</button>\\r\\n <button id=\\\"copy-global-storage\\\" style=\\\"\\r\\n flex: 1;\\r\\n background: rgba(99, 102, 241, 0.1);\\r\\n color: #a5b4fc;\\r\\n border: 1px solid rgba(99, 102, 241, 0.2);\\r\\n border-radius: 6px;\\r\\n padding: 8px 12px;\\r\\n font-size: 12px;\\r\\n font-weight: 500;\\r\\n cursor: pointer;\\r\\n transition: background 0.2s;\\r\\n \\\">📋 Global Storage</button>\\r\\n </div>\\r\\n </div>\\r\\n ` : ''}\\r\\n\\r\\n <div style=\\\"display: flex; gap: 10px; margin-top: 4px;\\\">\\r\\n ${!isSignedIn ? `\\r\\n <button id=\\\"sign-in-google\\\" style=\\\"\\r\\n flex: 1;\\r\\n background: ${env.gradient};\\r\\n color: white;\\r\\n border: none;\\r\\n border-radius: 8px;\\r\\n padding: 12px 16px;\\r\\n font-size: 14px;\\r\\n font-weight: 600;\\r\\n cursor: pointer;\\r\\n transition: opacity 0.2s, transform 0.1s;\\r\\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);\\r\\n \\\">Sign In</button>\\r\\n ` : `\\r\\n <button id=\\\"sign-out\\\" style=\\\"\\r\\n flex: 1;\\r\\n background: rgba(239, 68, 68, 0.1);\\r\\n color: #f87171;\\r\\n border: 1px solid rgba(239, 68, 68, 0.2);\\r\\n border-radius: 8px;\\r\\n padding: 12px 16px;\\r\\n font-size: 14px;\\r\\n font-weight: 600;\\r\\n cursor: pointer;\\r\\n transition: background 0.2s;\\r\\n \\\">Sign Out</button>\\r\\n `}\\r\\n <button id=\\\"reload-page\\\" style=\\\"\\r\\n background: rgba(255, 255, 255, 0.05);\\r\\n color: #9CA3AF;\\r\\n border: 1px solid rgba(255, 255, 255, 0.1);\\r\\n border-radius: 8px;\\r\\n padding: 12px 16px;\\r\\n font-size: 14px;\\r\\n font-weight: 600;\\r\\n cursor: pointer;\\r\\n transition: background 0.2s;\\r\\n \\\">↻ Reload</button>\\r\\n </div>\\r\\n </div>\\r\\n `\\r\\n\\r\\n overlay.appendChild(content)\\r\\n document.body.appendChild(overlay)\\r\\n\\r\\n // Event handlers\\r\\n const closeModal = () => overlay.remove()\\r\\n\\r\\n document.getElementById('close-modal').addEventListener('click', closeModal)\\r\\n overlay.addEventListener('click', (e) => {\\r\\n if (e.target === overlay) closeModal()\\r\\n })\\r\\n\\r\\n document.getElementById('reload-page')?.addEventListener('click', () => {\\r\\n window.location.reload()\\r\\n })\\r\\n\\r\\n const addPlayerBtn = document.getElementById('add-player')\\r\\n if (addPlayerBtn) {\\r\\n addPlayerBtn.addEventListener('click', () => {\\r\\n const next = nextPlayerId(getSelectedPlayerId())\\r\\n const saved = setSelectedPlayerId(next)\\r\\n\\r\\n const label = document.getElementById('local-player-label')\\r\\n if (label) {\\r\\n label.textContent = saved\\r\\n }\\r\\n\\r\\n // Update floating toolbar label (if currently signed out)\\r\\n const toolbar = document.getElementById('venus-sandbox-toolbar')\\r\\n const toolbarLabelDiv = toolbar?.children?.[1]\\r\\n const isLocalTarget = (toolbar?.dataset?.target || '').toLowerCase() === 'local'\\r\\n if (toolbarLabelDiv && isLocalTarget && !currentAuthState.signedIn) {\\r\\n toolbarLabelDiv.textContent = `○ ${saved}`\\r\\n }\\r\\n })\\r\\n }\\r\\n\\r\\n const signInBtn = document.getElementById('sign-in-google')\\r\\n if (signInBtn) {\\r\\n const originalGradient = env.gradient\\r\\n signInBtn.addEventListener('click', async () => {\\r\\n try {\\r\\n signInBtn.textContent = 'Signing in...'\\r\\n signInBtn.disabled = true\\r\\n\\r\\n // Local emulator mode: allow selecting playerN identities.\\r\\n if (isLocal && window.__VENUS_SANDBOX_SIGN_IN_AS__) {\\r\\n await window.__VENUS_SANDBOX_SIGN_IN_AS__(getSelectedPlayerId())\\r\\n } else if (window.__VENUS_SANDBOX_SIGN_IN__) {\\r\\n await window.__VENUS_SANDBOX_SIGN_IN__()\\r\\n // Sign-in successful - show success and reload\\r\\n signInBtn.textContent = '✓ Success!'\\r\\n signInBtn.style.background = 'linear-gradient(120deg, #10b981, #059669)'\\r\\n setTimeout(() => {\\r\\n closeModal()\\r\\n window.location.reload()\\r\\n }, 500)\\r\\n } else {\\r\\n throw new Error('Sign-in function not available. Is the SDK initialized?')\\r\\n }\\r\\n } catch (error) {\\r\\n console.error('[Venus Sandbox] Sign-in failed:', error)\\r\\n signInBtn.textContent = 'Sign-in failed'\\r\\n signInBtn.style.background = '#ef4444'\\r\\n setTimeout(() => {\\r\\n signInBtn.textContent = 'Sign In'\\r\\n signInBtn.style.background = originalGradient\\r\\n signInBtn.disabled = false\\r\\n }, 2000)\\r\\n }\\r\\n })\\r\\n }\\r\\n\\r\\n const signOutBtn = document.getElementById('sign-out')\\r\\n if (signOutBtn) {\\r\\n signOutBtn.addEventListener('click', async () => {\\r\\n try {\\r\\n signOutBtn.textContent = 'Signing out...'\\r\\n signOutBtn.disabled = true\\r\\n\\r\\n if (window.__VENUS_SANDBOX_SIGN_OUT__) {\\r\\n await window.__VENUS_SANDBOX_SIGN_OUT__()\\r\\n signOutBtn.textContent = '✓ Signed out'\\r\\n setTimeout(() => {\\r\\n closeModal()\\r\\n window.location.reload()\\r\\n }, 500)\\r\\n }\\r\\n } catch (error) {\\r\\n console.error('[Venus Sandbox] Sign-out failed:', error)\\r\\n signOutBtn.textContent = 'Failed'\\r\\n setTimeout(() => {\\r\\n signOutBtn.textContent = 'Sign out'\\r\\n signOutBtn.disabled = false\\r\\n }, 2000)\\r\\n }\\r\\n })\\r\\n }\\r\\n\\r\\n // Storage debug copy handlers\\r\\n const copyAppStorageBtn = document.getElementById('copy-app-storage')\\r\\n if (copyAppStorageBtn) {\\r\\n copyAppStorageBtn.addEventListener('click', async () => {\\r\\n await copyStorageToClipboard(copyAppStorageBtn, 'appStorage')\\r\\n })\\r\\n }\\r\\n\\r\\n const copyGlobalStorageBtn = document.getElementById('copy-global-storage')\\r\\n if (copyGlobalStorageBtn) {\\r\\n copyGlobalStorageBtn.addEventListener('click', async () => {\\r\\n await copyStorageToClipboard(copyGlobalStorageBtn, 'globalStorage')\\r\\n })\\r\\n }\\r\\n}\\r\\n\\r\\nasync function copyStorageToClipboard(btn, storageType) {\\r\\n const originalText = btn.textContent\\r\\n try {\\r\\n btn.textContent = 'Loading...'\\r\\n btn.disabled = true\\r\\n\\r\\n // Call the SDK directly - VenusAPI is available globally\\r\\n const api = window.VenusAPI\\r\\n if (!api) {\\r\\n throw new Error('VenusAPI not available')\\r\\n }\\r\\n\\r\\n const storage = storageType === 'appStorage' ? api.appStorage : api.globalStorage\\r\\n if (!storage?.getAllData) {\\r\\n throw new Error(`${storageType} not available or getAllData not supported`)\\r\\n }\\r\\n\\r\\n const data = await storage.getAllData()\\r\\n const json = JSON.stringify(data, null, 2)\\r\\n\\r\\n await navigator.clipboard.writeText(json)\\r\\n\\r\\n const count = Object.keys(data).length\\r\\n btn.textContent = `✓ Copied (${count} keys)`\\r\\n btn.style.background = 'rgba(16, 185, 129, 0.2)'\\r\\n btn.style.color = '#34d399'\\r\\n btn.style.borderColor = 'rgba(16, 185, 129, 0.3)'\\r\\n\\r\\n setTimeout(() => {\\r\\n btn.textContent = originalText\\r\\n btn.style.background = 'rgba(99, 102, 241, 0.1)'\\r\\n btn.style.color = '#a5b4fc'\\r\\n btn.style.borderColor = 'rgba(99, 102, 241, 0.2)'\\r\\n btn.disabled = false\\r\\n }, 2000)\\r\\n } catch (error) {\\r\\n console.error('[Venus Sandbox] Failed to copy storage:', error)\\r\\n btn.textContent = 'Failed'\\r\\n btn.style.background = 'rgba(239, 68, 68, 0.2)'\\r\\n btn.style.color = '#f87171'\\r\\n\\r\\n setTimeout(() => {\\r\\n btn.textContent = originalText\\r\\n btn.style.background = 'rgba(99, 102, 241, 0.1)'\\r\\n btn.style.color = '#a5b4fc'\\r\\n btn.style.borderColor = 'rgba(99, 102, 241, 0.2)'\\r\\n btn.disabled = false\\r\\n }, 2000)\\r\\n }\\r\\n}\\r\\n\"","import type { HtmlTagDescriptor } from 'vite'\r\nimport sandboxToolbarCss from './sandboxToolbarStyle.css?raw'\r\nimport sandboxToolbarScript from './sandboxToolbarScript.js?raw'\r\n\r\nexport function createSandboxToolbarTags(): HtmlTagDescriptor[] {\r\n const styleTag: HtmlTagDescriptor = {\r\n tag: 'style',\r\n attrs: { id: 'venus-sandbox-style' },\r\n children: sandboxToolbarCss,\r\n injectTo: 'head',\r\n }\r\n\r\n const scriptTag: HtmlTagDescriptor = {\r\n tag: 'script',\r\n attrs: {\r\n type: 'module',\r\n id: 'venus-sandbox-script',\r\n 'data-venus-ignore': 'true',\r\n },\r\n children: sandboxToolbarScript,\r\n injectTo: 'body',\r\n }\r\n\r\n return [styleTag, scriptTag]\r\n}\r\n","/**\r\n * Hardcoded Firebase configurations for each environment.\r\n *\r\n * These configs are used by:\r\n * 1. Vite plugin (Node.js) - to exchange refresh tokens for ID tokens\r\n * 2. Browser SDK - to initialize Firebase for Firestore access\r\n *\r\n * SECURITY NOTE: Firebase web API keys are designed to be public. They are NOT\r\n * secret keys. Security is enforced via:\r\n * - Firebase Security Rules (control read/write access)\r\n * - Authentication (users must sign in)\r\n * - HTTP referrer restrictions (configure in Firebase Console)\r\n *\r\n * These same keys are already shipped in the venus_cli binary (Constants.cs).\r\n * Google's documentation explicitly states that Firebase API keys are safe to\r\n * expose in client-side code.\r\n *\r\n * TODO: Consider reading Firebase config from ~/.venus/config.json instead of\r\n * hardcoding here. This would require updating the venus_cli to write the config\r\n * for the selected environment. Benefits: SDK wouldn't ship with keys, config\r\n * would come from the authenticated CLI.\r\n */\r\n\r\nimport type { SandboxTarget, SandboxFirebaseConfig } from '../config/sandbox'\r\n\r\n/**\r\n * Firebase configuration for each environment.\r\n * These values come from the Firebase console for each project.\r\n */\r\nexport const FIREBASE_CONFIGS: Record<SandboxTarget, SandboxFirebaseConfig> = {\r\n // Local mode uses dev Firebase credentials (auth emulator doesn't support Google OAuth)\r\n local: {\r\n apiKey: 'AIzaSyCSYBs5QrFUeaE8QC2Jfp6834enCzbCJqQ',\r\n authDomain: 'dev-venus-app.firebaseapp.com',\r\n projectId: 'dev-venus-app',\r\n storageBucket: 'dev-venus-app.appspot.com',\r\n },\r\n dev: {\r\n apiKey: 'AIzaSyCSYBs5QrFUeaE8QC2Jfp6834enCzbCJqQ',\r\n authDomain: 'dev-venus-app.firebaseapp.com',\r\n projectId: 'dev-venus-app',\r\n storageBucket: 'dev-venus-app.appspot.com',\r\n },\r\n staging: {\r\n apiKey: 'AIzaSyCfv4HGtNjStUsN0IL-TUNLYSNSZ3KhXN4',\r\n authDomain: 'staging-venus-app.firebaseapp.com',\r\n projectId: 'staging-venus-app',\r\n storageBucket: 'staging-venus-app.appspot.com',\r\n },\r\n}\r\n\r\n/**\r\n * Cloud Functions region for each environment.\r\n */\r\nexport const FUNCTIONS_REGIONS: Record<SandboxTarget, string> = {\r\n local: 'us-central1',\r\n dev: 'us-central1',\r\n staging: 'us-central1',\r\n}\r\n\r\n/**\r\n * Default emulator hosts for local development.\r\n */\r\nexport const DEFAULT_EMULATOR_HOSTS = {\r\n functions: 'localhost:5001',\r\n firestore: 'localhost:8080',\r\n auth: 'localhost:9099',\r\n}\r\n\r\n/**\r\n * Get Firebase config for a target environment.\r\n */\r\nexport function getFirebaseConfig(target: SandboxTarget): SandboxFirebaseConfig {\r\n const config = FIREBASE_CONFIGS[target]\r\n if (!config) {\r\n throw new Error(`[Venus SDK] Unknown target environment: ${target}`)\r\n }\r\n return config\r\n}\r\n\r\n/**\r\n * Get Cloud Functions region for a target environment.\r\n */\r\nexport function getFunctionsRegion(target: SandboxTarget): string {\r\n return FUNCTIONS_REGIONS[target] || 'us-central1'\r\n}\r\n","/**\r\n * Vite plugin for Venus sandbox mode.\r\n *\r\n * This plugin enables H5 apps to communicate with the real Firebase backend\r\n * during local development. It:\r\n * 1. Reads game.config.json for gameId\r\n * 2. Reads ~/.venus/config.json for target environment\r\n * 3. Injects Firebase config and toolbar into the page\r\n *\r\n * Authentication is handled by the browser via Google sign-in (one-time,\r\n * persisted in IndexedDB).\r\n *\r\n * Usage:\r\n * ```typescript\r\n * // vite.config.ts\r\n * import { defineConfig } from 'vite'\r\n * import { venusSandboxPlugin } from '@series-inc/venus-sdk/vite'\r\n *\r\n * export default defineConfig({\r\n * plugins: [\r\n * venusSandboxPlugin(),\r\n * ],\r\n * })\r\n * ```\r\n */\r\n\r\nimport type { Plugin, IndexHtmlTransformResult } from 'vite'\r\nimport { existsSync, readFileSync } from 'fs'\r\nimport { join, dirname, resolve as resolvePath } from 'path'\r\nimport { homedir } from 'os'\r\nimport { createRequire } from 'module'\r\nimport { createSandboxToolbarTags } from './sandboxToolbar'\r\nimport { FIREBASE_CONFIGS, FUNCTIONS_REGIONS, DEFAULT_EMULATOR_HOSTS } from '../firebase/firebaseConfigs'\r\nimport type { SandboxTarget, SandboxConfig } from '../config/sandbox'\r\n\r\nconst REQUIRED_FIREBASE_VERSION = '^11.0.0'\r\n\r\nexport interface VenusSandboxPluginOptions {\r\n /** Override the target environment (default: reads from ~/.venus/config.json) */\r\n target?: SandboxTarget\r\n /** Disable sandbox even if configured */\r\n disabled?: boolean\r\n}\r\n\r\ninterface VenusCliConfig {\r\n activeEnv?: string\r\n sandbox?: Record<string, SandboxEnvConfig | undefined>\r\n}\r\n\r\ninterface SandboxEnvConfig {\r\n enabled?: boolean\r\n backendUrl?: string\r\n pollingInterval?: number\r\n rpcMaxRetries?: number\r\n rpcRetryDelayMs?: number\r\n}\r\n\r\nconst GAME_CONFIG_FILENAME = 'game.config.json'\r\nconst VENUS_CONFIG_PATH = join(homedir(), '.venus', 'config.json')\r\n\r\nexport function venusSandboxPlugin(\r\n options: VenusSandboxPluginOptions = {},\r\n): Plugin {\r\n let projectRoot = process.cwd()\r\n let isServeCommand = false\r\n let warningLogged = false\r\n let firebaseMissing = false\r\n\r\n const logWarning = (message: string): void => {\r\n if (!warningLogged) {\r\n warningLogged = true\r\n console.warn(`[Venus Sandbox] ${message}`)\r\n }\r\n }\r\n\r\n return {\r\n name: 'venus-sandbox',\r\n apply: 'serve',\r\n enforce: 'pre', // Run before other plugins to set up optimizeDeps exclusions\r\n\r\n config(config, env) {\r\n projectRoot = resolveProjectRoot(config)\r\n isServeCommand = env.command === 'serve'\r\n\r\n // Check if Firebase is installed (required for sandbox mode)\r\n if (isServeCommand && !options.disabled) {\r\n const hasFirebase = checkFirebaseDependency(projectRoot)\r\n if (!hasFirebase) {\r\n firebaseMissing = true\r\n logFirebaseMissing()\r\n\r\n // Return config that excludes Firebase and SDK from pre-bundling\r\n // This prevents the cryptic \"Could not resolve firebase/app\" error\r\n // and allows us to show a clear error message in the browser instead\r\n return {\r\n ...config,\r\n optimizeDeps: {\r\n ...config?.optimizeDeps,\r\n exclude: [\r\n ...(config?.optimizeDeps?.exclude || []),\r\n '@series-inc/venus-sdk',\r\n 'firebase',\r\n 'firebase/app',\r\n 'firebase/auth',\r\n 'firebase/firestore',\r\n ],\r\n },\r\n }\r\n } else {\r\n // Firebase is installed - make sure it's pre-bundled so dynamic imports work\r\n // Also set VITE_APP_MODE to 'live' so apps use their live adapter (which calls SDK)\r\n\r\n // Build sandbox config to check target environment\r\n let sandboxConfig: SandboxConfig | null = null\r\n try {\r\n sandboxConfig = buildSandboxConfig(projectRoot, options)\r\n } catch {\r\n // Config errors will be shown in transformIndexHtml\r\n }\r\n\r\n // Set up proxy for non-local targets to avoid CORS issues\r\n // Browser requests go to /__venusapi/functionName, Vite proxies to Cloud Functions\r\n const proxyConfig = buildProxyConfig(sandboxConfig)\r\n\r\n return {\r\n ...config,\r\n define: {\r\n ...config?.define,\r\n 'import.meta.env.VITE_APP_MODE': JSON.stringify('live'),\r\n },\r\n optimizeDeps: {\r\n ...config?.optimizeDeps,\r\n include: [\r\n ...(config?.optimizeDeps?.include || []),\r\n 'firebase/app',\r\n 'firebase/auth',\r\n 'firebase/firestore',\r\n ],\r\n },\r\n server: {\r\n ...config?.server,\r\n proxy: {\r\n ...config?.server?.proxy,\r\n ...proxyConfig,\r\n },\r\n },\r\n }\r\n }\r\n }\r\n\r\n return config\r\n },\r\n\r\n async transformIndexHtml(html): Promise<IndexHtmlTransformResult> {\r\n if (!isServeCommand || options.disabled) {\r\n return html\r\n }\r\n\r\n // If Firebase is missing, show an error overlay\r\n if (firebaseMissing) {\r\n const errorMessage = `Firebase is not installed.\\n\\nAdd \"firebase\": \"${REQUIRED_FIREBASE_VERSION}\" to your package.json devDependencies, then run npm install.\\n\\nFirebase is only needed for sandbox mode (local development) and is excluded from production builds.`\r\n const errorScript = buildErrorOverlayScript(errorMessage, 'local')\r\n return {\r\n html,\r\n tags: [\r\n {\r\n tag: 'script',\r\n attrs: { type: 'module' },\r\n children: errorScript,\r\n injectTo: 'body',\r\n },\r\n ],\r\n }\r\n }\r\n\r\n try {\r\n const config = buildSandboxConfig(projectRoot, options)\r\n if (!config) {\r\n return html\r\n }\r\n\r\n const injectedHtml = injectVenusShell(html)\r\n const configScript = `window.__VENUS_SANDBOX__ = ${JSON.stringify(config)};`\r\n\r\n console.log(`[Venus Sandbox] Enabled for ${config.target} environment (gameId: ${config.gameId})`)\r\n\r\n return {\r\n html: injectedHtml,\r\n tags: [\r\n {\r\n tag: 'script',\r\n attrs: { type: 'module' },\r\n children: configScript,\r\n injectTo: 'head',\r\n },\r\n ...createSandboxToolbarTags(),\r\n ],\r\n }\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error)\r\n logWarning(message)\r\n\r\n // Show error overlay to developer\r\n const target = options.target ?? 'local'\r\n const errorScript = buildErrorOverlayScript(message, target)\r\n return {\r\n html,\r\n tags: [\r\n {\r\n tag: 'script',\r\n attrs: { type: 'module' },\r\n children: errorScript,\r\n injectTo: 'body',\r\n },\r\n ],\r\n }\r\n }\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * Build the sandbox config from project files.\r\n * No CLI session or token exchange needed - auth is handled by browser.\r\n */\r\nfunction buildSandboxConfig(\r\n projectRoot: string,\r\n options: VenusSandboxPluginOptions,\r\n): SandboxConfig | null {\r\n // 1. Read game.config.json for gameId\r\n const gameConfigPath = findGameConfigPath(projectRoot)\r\n if (!gameConfigPath) {\r\n throw new Error(\r\n `Unable to locate ${GAME_CONFIG_FILENAME} starting from ${projectRoot}. ` +\r\n `Run \"venus configure-game\" to generate one.`\r\n )\r\n }\r\n\r\n const gameConfig = readGameConfig(gameConfigPath)\r\n const gameId = gameConfig.gameId?.trim()\r\n if (!gameId) {\r\n throw new Error(\r\n `Missing \"gameId\" inside ${gameConfigPath}. Run \"venus configure-game\" to regenerate it.`\r\n )\r\n }\r\n\r\n // 2. Read ~/.venus/config.json for activeEnv\r\n const cliConfig = readVenusCliConfig()\r\n const target = options.target ?? coerceTarget(cliConfig?.activeEnv)\r\n\r\n // 3. Check if sandbox is enabled for this env\r\n const envConfig = cliConfig?.sandbox?.[target]\r\n if (envConfig?.enabled === false) {\r\n return null\r\n }\r\n\r\n // 4. Build the config (no auth tokens - handled by browser)\r\n const firebaseConfig = FIREBASE_CONFIGS[target]\r\n const config: SandboxConfig = {\r\n enabled: true,\r\n target,\r\n gameId,\r\n firebaseConfig,\r\n functionsRegion: FUNCTIONS_REGIONS[target],\r\n pollingInterval: envConfig?.pollingInterval ?? 2000,\r\n rpcMaxRetries: envConfig?.rpcMaxRetries ?? 0,\r\n rpcRetryDelayMs: envConfig?.rpcRetryDelayMs ?? 1000,\r\n }\r\n\r\n // Add emulator hosts for local development\r\n if (target === 'local') {\r\n config.functionsEmulatorHost = DEFAULT_EMULATOR_HOSTS.functions\r\n config.firestoreEmulatorHost = DEFAULT_EMULATOR_HOSTS.firestore\r\n config.authEmulatorHost = DEFAULT_EMULATOR_HOSTS.auth\r\n }\r\n\r\n // Add backend URL if provided\r\n if (envConfig?.backendUrl) {\r\n config.backendUrl = envConfig.backendUrl\r\n }\r\n\r\n return config\r\n}\r\n\r\n/**\r\n * Read ~/.venus/config.json.\r\n */\r\nfunction readVenusCliConfig(): VenusCliConfig | null {\r\n try {\r\n if (!existsSync(VENUS_CONFIG_PATH)) {\r\n return null\r\n }\r\n const raw = readFileSync(VENUS_CONFIG_PATH, 'utf-8')\r\n return JSON.parse(raw) as VenusCliConfig\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * Read game.config.json.\r\n */\r\nfunction readGameConfig(pathname: string): { gameId?: string } {\r\n try {\r\n const raw = readFileSync(pathname, 'utf-8')\r\n return JSON.parse(raw) as { gameId?: string }\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : 'Unknown error'\r\n throw new Error(`Failed to parse ${pathname}: ${message}`)\r\n }\r\n}\r\n\r\n/**\r\n * Find game.config.json by walking up the directory tree.\r\n */\r\nfunction findGameConfigPath(startDir: string): string | null {\r\n let current = resolvePath(startDir)\r\n const visited = new Set<string>()\r\n\r\n while (true) {\r\n const candidate = join(current, GAME_CONFIG_FILENAME)\r\n if (existsSync(candidate)) {\r\n return candidate\r\n }\r\n\r\n if (visited.has(current)) {\r\n break\r\n }\r\n visited.add(current)\r\n\r\n const parent = dirname(current)\r\n if (parent === current) {\r\n break\r\n }\r\n current = parent\r\n }\r\n\r\n return null\r\n}\r\n\r\n/**\r\n * Resolve project root from Vite config or CWD.\r\n */\r\nfunction resolveProjectRoot(config?: { root?: string }): string {\r\n if (config?.root && config.root.length > 0) {\r\n return resolvePath(config.root)\r\n }\r\n return process.cwd()\r\n}\r\n\r\n/**\r\n * Coerce string to valid target.\r\n */\r\nfunction coerceTarget(value?: string | null): SandboxTarget {\r\n if (value === 'dev' || value === 'staging') {\r\n return value\r\n }\r\n return 'local'\r\n}\r\n\r\n/**\r\n * Inject Venus shell wrapper around body content.\r\n */\r\nfunction injectVenusShell(html: string): string {\r\n const match = html.match(/<body([^>]*)>([\\s\\S]*)<\\/body>/i)\r\n if (!match) {\r\n return html\r\n }\r\n\r\n const [, attrs, contents] = match\r\n const serialized = JSON.stringify(contents).replace(/<\\/script>/gi, '<\\\\/script>')\r\n\r\n const shell = `\r\n <body${attrs}>\r\n <div id=\"venus-toolbar-root\" aria-live=\"polite\"></div>\r\n <div id=\"venus-app-root\" data-venus-app-root style=\"display:contents;\">\r\n ${contents}\r\n </div>\r\n <noscript id=\"venus-app-placeholder\">\r\n Venus sandbox requires JavaScript enabled.\r\n </noscript>\r\n <script id=\"venus-app-capture\">\r\n window.__VENUS_APP_HTML = ${serialized};\r\n </script>\r\n </body>\r\n `\r\n\r\n return html.replace(/<body([\\s\\S]*)<\\/body>/i, shell)\r\n}\r\n\r\n/**\r\n * Check if Firebase is installed in the project.\r\n * Returns true if installed, false otherwise.\r\n */\r\nfunction checkFirebaseDependency(projectRoot: string): boolean {\r\n try {\r\n // Try to resolve firebase from the project's node_modules\r\n const require = createRequire(join(projectRoot, 'package.json'))\r\n require.resolve('firebase/app')\r\n return true\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\n/**\r\n * Log the Firebase missing message to console.\r\n */\r\nfunction logFirebaseMissing(): void {\r\n console.error(`\r\n╔══════════════════════════════════════════════════════════════════════════════╗\r\n║ ║\r\n║ IMPORTANT: The Venus sandbox plugin requires Firebase. ║\r\n║ ║\r\n║ Add the following to your package.json devDependencies: ║\r\n║ ║\r\n║ \"firebase\": \"${REQUIRED_FIREBASE_VERSION}\" ║\r\n║ ║\r\n║ Then run: ║\r\n║ ║\r\n║ npm install ║\r\n║ ║\r\n║ WHY devDependencies? ║\r\n║ Firebase is only used during local development (sandbox mode). It is ║\r\n║ dynamically imported and excluded from production builds, so it should ║\r\n║ be a devDependency to keep production bundles small. ║\r\n║ ║\r\n╚══════════════════════════════════════════════════════════════════════════════╝\r\n`)\r\n}\r\n\r\n/**\r\n * Build error overlay script for display in browser.\r\n */\r\nfunction buildErrorOverlayScript(message: string, target: SandboxTarget): string {\r\n const escapedMessage = message\r\n .replace(/\\\\/g, '\\\\\\\\')\r\n .replace(/'/g, \"\\\\'\")\r\n .replace(/\\n/g, '\\\\n')\r\n\r\n return `\r\n(function() {\r\n var overlay = document.createElement('div');\r\n overlay.id = 'venus-sandbox-error';\r\n overlay.style.cssText = 'position:fixed;inset:0;z-index:999999;background:rgba(0,0,0,0.92);color:#fff;font-family:-apple-system,BlinkMacSystemFont,sans-serif;display:flex;align-items:center;justify-content:center;padding:20px;';\r\n\r\n var content = document.createElement('div');\r\n content.style.cssText = 'max-width:600px;text-align:center;';\r\n\r\n var icon = document.createElement('div');\r\n icon.style.cssText = 'font-size:48px;margin-bottom:16px;';\r\n icon.textContent = '⚠️';\r\n\r\n var title = document.createElement('h1');\r\n title.style.cssText = 'font-size:24px;font-weight:600;margin:0 0 16px;color:#ff6b6b;';\r\n title.textContent = 'Venus Sandbox Error';\r\n\r\n var msg = document.createElement('p');\r\n msg.style.cssText = 'font-size:14px;line-height:1.6;margin:0 0 24px;color:#ccc;';\r\n msg.textContent = '${escapedMessage}';\r\n\r\n var hint = document.createElement('div');\r\n hint.style.cssText = 'background:rgba(255,255,255,0.1);border-radius:8px;padding:16px;font-size:13px;color:#aaa;';\r\n hint.innerHTML = '<strong style=\"color:#fff;\">Environment:</strong> ${target}<br>Check your game.config.json and ~/.venus/config.json';\r\n\r\n content.appendChild(icon);\r\n content.appendChild(title);\r\n content.appendChild(msg);\r\n content.appendChild(hint);\r\n overlay.appendChild(content);\r\n\r\n if (document.body) {\r\n document.body.appendChild(overlay);\r\n } else {\r\n document.addEventListener('DOMContentLoaded', function() {\r\n document.body.appendChild(overlay);\r\n });\r\n }\r\n})();\r\n`\r\n}\r\n\r\n/**\r\n * The proxy path used by the SDK to route requests through Vite.\r\n * This avoids CORS issues when calling Cloud Functions from localhost.\r\n */\r\nexport const VENUS_API_PROXY_PATH = '/__venusapi'\r\n\r\n/**\r\n * Build Vite proxy configuration for non-local sandbox targets.\r\n *\r\n * For dev/staging, Cloud Functions don't allow localhost origins.\r\n * We proxy through Vite to avoid CORS issues:\r\n * - Browser requests: /__venusapi/functionName\r\n * - Vite proxies to: https://us-central1-{project}.cloudfunctions.net/functionName\r\n */\r\nfunction buildProxyConfig(\r\n config: SandboxConfig | null,\r\n): Record<string, { target: string; changeOrigin: boolean; rewrite: (path: string) => string }> {\r\n // No proxy needed for local (emulator) or if config is missing\r\n if (!config || config.target === 'local') {\r\n return {}\r\n }\r\n\r\n // Build the Cloud Functions base URL\r\n const projectId = config.firebaseConfig?.projectId\r\n const region = config.functionsRegion || 'us-central1'\r\n\r\n if (!projectId) {\r\n return {}\r\n }\r\n\r\n const targetUrl = `https://${region}-${projectId}.cloudfunctions.net`\r\n\r\n console.log(`[Venus Sandbox] Setting up CORS proxy: ${VENUS_API_PROXY_PATH}/* -> ${targetUrl}/*`)\r\n\r\n return {\r\n [VENUS_API_PROXY_PATH]: {\r\n target: targetUrl,\r\n changeOrigin: true,\r\n rewrite: (path: string) => path.replace(new RegExp(`^${VENUS_API_PROXY_PATH}`), ''),\r\n },\r\n }\r\n}\r\n"]}
|