on-zero 0.8.0 → 0.8.1
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/cjs/createZeroClient.cjs +22 -2
- package/dist/cjs/createZeroClient.native.js +25 -3
- package/dist/cjs/createZeroClient.native.js.map +1 -1
- package/dist/cjs/generate-helpers.cjs +30 -9
- package/dist/cjs/generate-helpers.native.js +59 -9
- package/dist/cjs/generate-helpers.native.js.map +1 -1
- package/dist/cjs/generate-helpers.test.cjs +70 -0
- package/dist/cjs/generate-helpers.test.native.js +94 -0
- package/dist/cjs/generate-helpers.test.native.js.map +1 -0
- package/dist/cjs/generate-layout.cjs +22 -7
- package/dist/cjs/generate-layout.native.js +22 -7
- package/dist/cjs/generate-layout.native.js.map +1 -1
- package/dist/cjs/generate.test.cjs +4 -2
- package/dist/cjs/generate.test.native.js +4 -2
- package/dist/cjs/generate.test.native.js.map +1 -1
- package/dist/cjs/helpers/hostStorageScope.cjs +37 -0
- package/dist/cjs/helpers/hostStorageScope.native.js +41 -0
- package/dist/cjs/helpers/hostStorageScope.native.js.map +1 -0
- package/dist/cjs/helpers/recoverZeroClient.cjs +8 -0
- package/dist/cjs/helpers/recoverZeroClient.native.js +9 -0
- package/dist/cjs/helpers/recoverZeroClient.native.js.map +1 -1
- package/dist/esm/createZeroClient.mjs +22 -2
- package/dist/esm/createZeroClient.mjs.map +1 -1
- package/dist/esm/createZeroClient.native.js +25 -3
- package/dist/esm/createZeroClient.native.js.map +1 -1
- package/dist/esm/generate-helpers.mjs +29 -9
- package/dist/esm/generate-helpers.mjs.map +1 -1
- package/dist/esm/generate-helpers.native.js +58 -9
- package/dist/esm/generate-helpers.native.js.map +1 -1
- package/dist/esm/generate-helpers.test.mjs +71 -0
- package/dist/esm/generate-helpers.test.mjs.map +1 -0
- package/dist/esm/generate-helpers.test.native.js +92 -0
- package/dist/esm/generate-helpers.test.native.js.map +1 -0
- package/dist/esm/generate-layout.mjs +22 -7
- package/dist/esm/generate-layout.mjs.map +1 -1
- package/dist/esm/generate-layout.native.js +22 -7
- package/dist/esm/generate-layout.native.js.map +1 -1
- package/dist/esm/generate.test.mjs +4 -2
- package/dist/esm/generate.test.mjs.map +1 -1
- package/dist/esm/generate.test.native.js +4 -2
- package/dist/esm/generate.test.native.js.map +1 -1
- package/dist/esm/helpers/hostStorageScope.mjs +12 -0
- package/dist/esm/helpers/hostStorageScope.mjs.map +1 -0
- package/dist/esm/helpers/hostStorageScope.native.js +13 -0
- package/dist/esm/helpers/hostStorageScope.native.js.map +1 -0
- package/dist/esm/helpers/recoverZeroClient.mjs +8 -0
- package/dist/esm/helpers/recoverZeroClient.mjs.map +1 -1
- package/dist/esm/helpers/recoverZeroClient.native.js +9 -0
- package/dist/esm/helpers/recoverZeroClient.native.js.map +1 -1
- package/package.json +1 -1
- package/src/createZeroClient.tsx +32 -2
- package/src/generate-helpers.test.ts +81 -0
- package/src/generate-helpers.ts +46 -9
- package/src/generate-layout.ts +27 -8
- package/src/generate.test.ts +6 -4
- package/src/helpers/hostStorageScope.ts +19 -0
- package/src/helpers/recoverZeroClient.ts +8 -0
- package/types/createZeroClient.d.ts.map +1 -1
- package/types/generate-helpers.d.ts +11 -0
- package/types/generate-helpers.d.ts.map +1 -1
- package/types/generate-helpers.test.d.ts +2 -0
- package/types/generate-helpers.test.d.ts.map +1 -0
- package/types/generate-layout.d.ts.map +1 -1
- package/types/helpers/hostStorageScope.d.ts +2 -0
- package/types/helpers/hostStorageScope.d.ts.map +1 -0
- package/types/helpers/recoverZeroClient.d.ts.map +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["readHostStorageScope","runtime","globalThis","window","top","__on_zero_storage_scope"],"sources":["../../../src/helpers/hostStorageScope.ts"],"sourcesContent":[null],"mappings":"AAOO,SAASA,qBAAA,EAA2C;EACzD,MAAMC,OAAA,GAAUC,UAAA;EAChB,IAAI,OAAOC,MAAA,KAAW,aAAa;IACjC,IAAI;MACF,MAAMC,GAAA,GAAOD,MAAA,CAAOC,GAAA,IAAOD,MAAA;MAC3B,IAAIC,GAAA,CAAIC,uBAAA,EAAyB,OAAOD,GAAA,CAAIC,uBAAA;IAC9C,QAAQ,CAER;EACF;EACA,OAAOJ,OAAA,CAAQI,uBAAA;AACjB","ignoreList":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
function readHostStorageScope() {
|
|
2
|
+
var runtime = globalThis;
|
|
3
|
+
if (typeof window !== "undefined") {
|
|
4
|
+
try {
|
|
5
|
+
var _window_top;
|
|
6
|
+
var top = (_window_top = window.top) !== null && _window_top !== void 0 ? _window_top : window;
|
|
7
|
+
if (top.__on_zero_storage_scope) return top.__on_zero_storage_scope;
|
|
8
|
+
} catch (unused) {}
|
|
9
|
+
}
|
|
10
|
+
return runtime.__on_zero_storage_scope;
|
|
11
|
+
}
|
|
12
|
+
export { readHostStorageScope };
|
|
13
|
+
//# sourceMappingURL=hostStorageScope.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["readHostStorageScope","runtime","globalThis","window","_window_top","top","__on_zero_storage_scope","unused"],"sources":["../../../src/helpers/hostStorageScope.ts"],"sourcesContent":[null],"mappings":"AAOO,SAASA,qBAAA,EAA2C;EACzD,IAAAC,OAAM,GAAAC,UAAU;EAChB,IAAI,OAAOC,MAAA,KAAW,aAAa;IACjC,IAAI;MACF,IAAAC,WAAa;MACb,IAAIC,GAAA,GAAI,CAAAD,WAAA,GAAAD,MAAA,CAAyBE,GAAA,MAAO,IAAI,IAAAD,WAAA,cAAAA,WAAA,GAAAD,MAAA;MAC9C,IAAAE,GAAQ,CAAAC,uBAAA,SAAAD,GAAA,CAAAC,uBAAA;IAER,SAAAC,MAAA,GACF;EACA;EACF,OAAAN,OAAA,CAAAK,uBAAA","ignoreList":[]}
|
|
@@ -77,6 +77,14 @@ function recover(deps, reasonKey, message, dropLocalState) {
|
|
|
77
77
|
reasonKey,
|
|
78
78
|
reason: message
|
|
79
79
|
});
|
|
80
|
+
try {
|
|
81
|
+
globalThis.dispatchEvent?.(new CustomEvent("on-zero-fatal", {
|
|
82
|
+
detail: {
|
|
83
|
+
reasonKey,
|
|
84
|
+
reason: message
|
|
85
|
+
}
|
|
86
|
+
}));
|
|
87
|
+
} catch {}
|
|
80
88
|
return;
|
|
81
89
|
}
|
|
82
90
|
reloadScheduled = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["RECOVER_GUARD_MS","RELOAD_LATCH_TIMEOUT_MS","LOCAL_STORE_LOST","SQLITE_ERROR_NAME","SQLITE_STATEMENT_FINALIZED","STORE_CLOSED","STORE_CLOSED_REPEAT_MIN_MS","STORE_CLOSED_REPEAT_MAX_MS","reloadScheduled","reloadInProgress","reloadLatchTimer","pendingDeletes","inMemoryGuard","Map","defaultGuardStorage","window","sessionStorage","recoveryGuardOpen","reasonKey","guardStorage","key","now","Date","memLast","get","storage","rawLast","getItem","last","Number","setItem","String","set","lastStoreClosedAtMs","armReloadLatchTimeout","setTimeout","clearTimeout","unref","disarmReloadLatchTimeout","performReload","deps","Promise","resolve","doReload","reload","globalThis","location","then","allSettled","splice","map","run","beforeReload","catch","recover","message","dropLocalState","onRecovery","push","deleteLocalState","console","error","zeroEvents","emit","type","reason","warn","runReload","scheduleReload","makeZeroRecovery","onUpdateNeeded","onClientStateNotFound","onServerAckTimeout","input","label","consecutiveTimeouts","timeoutMs","logToConsole","level","context","args","prefix","Object","entries","value","join","method","logArgText","arg","Error","name","stack","isBenignStoreClosedLog","text","test","classifyMutationDesync","includes","classifyZeroRecoveryLog","nowMs","desync","prevMs","composeRecoveryLogSink","consumerLogSink","consumerFlush","flush","log","recovery","benignLogPatterns","some","pattern","matchesLogPattern","call","lastIndex","isRecoverableZeroStalePokeMessage","resetRecoveryStateForTests","length","clear"],"sources":["../../../src/helpers/recoverZeroClient.ts"],"sourcesContent":[null],"mappings":"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
|
|
1
|
+
{"version":3,"names":["RECOVER_GUARD_MS","RELOAD_LATCH_TIMEOUT_MS","LOCAL_STORE_LOST","SQLITE_ERROR_NAME","SQLITE_STATEMENT_FINALIZED","STORE_CLOSED","STORE_CLOSED_REPEAT_MIN_MS","STORE_CLOSED_REPEAT_MAX_MS","reloadScheduled","reloadInProgress","reloadLatchTimer","pendingDeletes","inMemoryGuard","Map","defaultGuardStorage","window","sessionStorage","recoveryGuardOpen","reasonKey","guardStorage","key","now","Date","memLast","get","storage","rawLast","getItem","last","Number","setItem","String","set","lastStoreClosedAtMs","armReloadLatchTimeout","setTimeout","clearTimeout","unref","disarmReloadLatchTimeout","performReload","deps","Promise","resolve","doReload","reload","globalThis","location","then","allSettled","splice","map","run","beforeReload","catch","recover","message","dropLocalState","onRecovery","push","deleteLocalState","console","error","zeroEvents","emit","type","reason","dispatchEvent","CustomEvent","detail","warn","runReload","scheduleReload","makeZeroRecovery","onUpdateNeeded","onClientStateNotFound","onServerAckTimeout","input","label","consecutiveTimeouts","timeoutMs","logToConsole","level","context","args","prefix","Object","entries","value","join","method","logArgText","arg","Error","name","stack","isBenignStoreClosedLog","text","test","classifyMutationDesync","includes","classifyZeroRecoveryLog","nowMs","desync","prevMs","composeRecoveryLogSink","consumerLogSink","consumerFlush","flush","log","recovery","benignLogPatterns","some","pattern","matchesLogPattern","call","lastIndex","isRecoverableZeroStalePokeMessage","resetRecoveryStateForTests","length","clear"],"sources":["../../../src/helpers/recoverZeroClient.ts"],"sourcesContent":[null],"mappings":"AAMA,MAAMA,gBAAA,GAAmB;AAQzB,MAAMC,uBAAA,GAA0B;AAIhC,MAAMC,gBAAA,GAAmB;AACzB,MAAMC,iBAAA,GAAoB;AAC1B,MAAMC,0BAAA,GAA6B;AACnC,MAAMC,YAAA,GAAe;AACrB,MAAMC,0BAAA,GAA6B;AACnC,MAAMC,0BAAA,GAA6B;AAsEnC,IAAIC,eAAA,GAAkB;AACtB,IAAIC,gBAAA,GAAmB;AACvB,IAAIC,gBAAA;AACJ,MAAMC,cAAA,GAAgD,EAAC;AAKvD,MAAMC,aAAA,GAAgB,mBAAIC,GAAA,CAAoB;AAE9C,SAASC,oBAAA,EAAwD;EAC/D,IAAI;IACF,IAAI,OAAOC,MAAA,KAAW,eAAe,CAACA,MAAA,CAAOC,cAAA,EAAgB,OAAO;IACpE,OAAOD,MAAA,CAAOC,cAAA;EAChB,QAAQ;IAEN,OAAO;EACT;AACF;AAOA,SAASC,kBACPC,SAAA,EACAC,YAAA,EACS;EACT,MAAMC,GAAA,GAAM,mBAAmBF,SAAS;EACxC,MAAMG,GAAA,GAAMC,IAAA,CAAKD,GAAA,CAAI;EAErB,MAAME,OAAA,GAAUX,aAAA,CAAcY,GAAA,CAAIJ,GAAG,KAAK;EAC1C,IAAIG,OAAA,GAAU,KAAKF,GAAA,GAAME,OAAA,GAAUvB,gBAAA,EAAkB,OAAO;EAE5D,MAAMyB,OAAA,GAAUN,YAAA,IAAgBL,mBAAA,CAAoB;EACpD,IAAIW,OAAA,EAAS;IACX,IAAI;MACF,MAAMC,OAAA,GAAUD,OAAA,CAAQE,OAAA,CAAQP,GAAG;MACnC,MAAMQ,IAAA,GAAOF,OAAA,GAAUG,MAAA,CAAOH,OAAO,IAAI;MACzC,IAAIE,IAAA,GAAO,KAAKP,GAAA,GAAMO,IAAA,GAAO5B,gBAAA,EAAkB,OAAO;MACtDyB,OAAA,CAAQK,OAAA,CAAQV,GAAA,EAAKW,MAAA,CAAOV,GAAG,CAAC;IAClC,QAAQ,CAER;EACF;EAEAT,aAAA,CAAcoB,GAAA,CAAIZ,GAAA,EAAKC,GAAG;EAC1B,OAAO;AACT;AAKA,IAAIY,mBAAA,GAAsB;AAE1B,SAASC,sBAAA,EAAwB;EAC/B,IAAI,OAAOC,UAAA,KAAe,YAAY;EACtC,IAAIzB,gBAAA,EAAkB0B,YAAA,CAAa1B,gBAAgB;EACnDA,gBAAA,GAAmByB,UAAA,CAAW,MAAM;IAClCzB,gBAAA,GAAmB;IAQnBF,eAAA,GAAkB;EACpB,GAAGP,uBAAuB;EAE1B,IACES,gBAAA,IACA,OAAOA,gBAAA,KAAqB,YAC5B,WAAWA,gBAAA,EACX;IACAA,gBAAA,CAAiB2B,KAAA,CAAM;EACzB;AACF;AAEA,SAASC,yBAAA,EAA2B;EAClC,IAAI5B,gBAAA,EAAkB;IACpB0B,YAAA,CAAa1B,gBAAgB;IAC7BA,gBAAA,GAAmB;EACrB;AACF;AAMA,SAAS6B,cAAcC,IAAA,EAAuC;EAC5D,IAAI/B,gBAAA,EAAkB,OAAOgC,OAAA,CAAQC,OAAA,CAAQ;EAC7CjC,gBAAA,GAAmB;EAInB6B,wBAAA,CAAyB;EAOzB,MAAMK,QAAA,GAAWH,IAAA,CAAKI,MAAA,KAAW,MAAMC,UAAA,CAAWC,QAAA,EAAUF,MAAA,GAAS;EACrE,OAAOH,OAAA,CAAQC,OAAA,CAAQ,EACpBK,IAAA,CAAK,MAAMN,OAAA,CAAQO,UAAA,CAAWrC,cAAA,CAAesC,MAAA,CAAO,CAAC,EAAEC,GAAA,CAAKC,GAAA,IAAQA,GAAA,CAAI,CAAC,CAAC,CAAC,EAC3EJ,IAAA,CAAK,MAAMP,IAAA,CAAKY,YAAA,GAAe,CAAC,EAChCC,KAAA,CAAM,MAAM,CAAC,CAAC,EACdN,IAAA,CAAK,MAAM;IACVJ,QAAA,CAAS;EACX,CAAC;AACL;AAEA,SAASW,QACPd,IAAA,EACAtB,SAAA,EACAqC,OAAA,EACAC,cAAA,EACM;EACN,IAAI,OAAOzC,MAAA,KAAW,aAAa;EACnCyB,IAAA,CAAKiB,UAAA,GAAavC,SAAS;EAI3B,IAAIsC,cAAA,EAAgB;IAClB7C,cAAA,CAAe+C,IAAA,CAAK,MAAMjB,OAAA,CAAQC,OAAA,CAAQ,EAAEK,IAAA,CAAKP,IAAA,CAAKmB,gBAAgB,CAAC;EACzE;EAEA,IAAInD,eAAA,EAAiB;EACrB,IAAI,CAACS,iBAAA,CAAkBC,SAAA,EAAWsB,IAAA,CAAKrB,YAAY,GAAG;IACpDyC,OAAA,CAAQC,KAAA,CAAM,aAAaN,OAAO,+CAA0C;IAC5Ef,IAAA,CAAKsB,UAAA,CAAWC,IAAA,CAAK;MAAEC,IAAA,EAAM;MAAS9C,SAAA;MAAW+C,MAAA,EAAQV;IAAQ,CAAC;IAIlE,IAAI;MACFV,UAAA,CAAWqB,aAAA,GACT,IAAIC,WAAA,CAAY,iBAAiB;QAAEC,MAAA,EAAQ;UAAElD,SAAA;UAAW+C,MAAA,EAAQV;QAAQ;MAAE,CAAC,CAC7E;IACF,QAAQ,CAAC;IACT;EACF;EACA/C,eAAA,GAAkB;EAClB0B,qBAAA,CAAsB;EACtB0B,OAAA,CAAQS,IAAA,CAAK,aAAad,OAAO,oBAAe;EAChDf,IAAA,CAAKsB,UAAA,CAAWC,IAAA,CAAK;IAAEC,IAAA,EAAM;IAAc9C,SAAA;IAAW+C,MAAA,EAAQV;EAAQ,CAAC;EAEvE,MAAMe,SAAA,GAAYA,CAAA,KAAM/B,aAAA,CAAcC,IAAI;EAC1C,IAAIA,IAAA,CAAK+B,cAAA,EAAgB;IACvB/B,IAAA,CAAK+B,cAAA,CAAe;MAClBN,MAAA,EAAQV,OAAA;MACRrC,SAAA;MACAsC,cAAA;MACAjB,aAAA,EAAe+B;IACjB,CAAC;EACH,OAAO;IACL,KAAKA,SAAA,CAAU;EACjB;AACF;AAKO,SAASE,iBAAiBhC,IAAA,EAAwB;EACvD,OAAO;IACLiC,eAAeR,MAAA,EAA4B;MAQzC,MAAMT,cAAA,GAAiBS,MAAA,CAAOD,IAAA,KAAS;MACvCV,OAAA,CACEd,IAAA,EACAyB,MAAA,CAAOD,IAAA,EACP,kBAAkBC,MAAA,CAAOV,OAAA,IAAWU,MAAA,CAAOD,IAAI,KAC/CR,cACF;IACF;IACAkB,sBAAA,EAAwB;MAGtBpB,OAAA,CAAQd,IAAA,EAAM,0BAA0B,0BAA0B,IAAI;IACxE;IACAmC,mBAAmBC,KAAA,EAIhB;MACDtB,OAAA,CACEd,IAAA,EACA,sBACA,GAAGoC,KAAA,CAAMC,KAAK,qCAAqCD,KAAA,CAAME,mBAAmB,uBAAuBF,KAAA,CAAMG,SAAS,YAClH,IACF;IACF;EACF;AACF;AAMA,SAASC,aACPC,KAAA,EACAC,OAAA,KACGC,IAAA,EACG;EACN,MAAMC,MAAA,GAASF,OAAA,GACXG,MAAA,CAAOC,OAAA,CAAQJ,OAAO,EACnBhC,GAAA,CAAI,CAAC,CAAC9B,GAAA,EAAKmE,KAAK,MAAOA,KAAA,KAAU,SAAYnE,GAAA,GAAM,GAAGA,GAAG,IAAImE,KAAK,EAAG,EACrEC,IAAA,CAAK,GAAG,IACX;EACJ,MAAMC,MAAA,GAASR,KAAA,KAAU,UAAU,UAAUA,KAAA;EAC7CrB,OAAA,CAAQ6B,MAAM,EAAE,IAAIL,MAAA,GAAS,CAACA,MAAM,IAAI,EAAC,GAAI,GAAGD,IAAI;AACtD;AAEA,SAASO,WAAWC,GAAA,EAAsB;EACxC,IAAI,OAAOA,GAAA,KAAQ,UAAU,OAAOA,GAAA;EACpC,IAAIA,GAAA,YAAeC,KAAA,EAAO,OAAO,GAAGD,GAAA,CAAIE,IAAI,IAAIF,GAAA,CAAIpC,OAAO,IAAIoC,GAAA,CAAIG,KAAA,IAAS,EAAE;EAC9E,IAAIH,GAAA,IAAO,OAAOA,GAAA,KAAQ,UAAU;IAClC,MAAMpC,OAAA,GAAU,aAAaoC,GAAA,GAAOA,GAAA,CAA8BpC,OAAA,GAAU;IAC5E,MAAMsC,IAAA,GAAO,UAAUF,GAAA,GAAOA,GAAA,CAA2BE,IAAA,GAAO;IAChE,IAAI,OAAOtC,OAAA,KAAY,UACrB,OAAO,GAAG,OAAOsC,IAAA,KAAS,WAAWA,IAAA,GAAO,EAAE,IAAItC,OAAO;EAC7D;EACA,OAAO;AACT;AAEA,SAASwC,uBAAuBC,IAAA,EAAuB;EACrD,IAAI,oCAAoCC,IAAA,CAAKD,IAAI,GAAG,OAAO;EAC3D,IAAI,wCAAwCC,IAAA,CAAKD,IAAI,GAAG,OAAO;EAC/D,OAAO;AACT;AAQA,SAASE,uBACPF,IAAA,EAC0E;EAC1E,IAAIA,IAAA,CAAKG,QAAA,CAAS,kBAAkB,KAAKH,IAAA,CAAKG,QAAA,CAAS,cAAc,GAAG;IACtE,OAAO;MACLjF,SAAA,EAAW;MACXqC,OAAA,EAAS;IACX;EACF;EACA,IACEyC,IAAA,CAAKG,QAAA,CAAS,aAAa,KAC3BH,IAAA,CAAKG,QAAA,CAAS,0CAA0C,GACxD;IACA,OAAO;MACLjF,SAAA,EAAW;MACXqC,OAAA,EAAS;IACX;EACF;EACA,IAAIyC,IAAA,CAAKG,QAAA,CAAS,mBAAmB,GAAG;IACtC,OAAO;MACLjF,SAAA,EAAW;MACXqC,OAAA,EAAS;IACX;EACF;EACA,IAAIyC,IAAA,CAAKG,QAAA,CAAS,wCAAwC,GAAG;IAC3D,OAAO;MACLjF,SAAA,EAAW;MACXqC,OAAA,EAAS;IACX;EACF;EACA,IAAIyC,IAAA,CAAKG,QAAA,CAAS,oCAAoC,GAAG;IACvD,OAAO;MACLjF,SAAA,EAAW;MACXqC,OAAA,EAAS;IACX;EACF;EACA,IAAIyC,IAAA,CAAKG,QAAA,CAAS,gBAAgB,KAAKH,IAAA,CAAKG,QAAA,CAAS,kBAAkB,GAAG;IACxE,OAAO;MACLjF,SAAA,EAAW;MACXqC,OAAA,EAAS;IACX;EACF;EACA,IAAIyC,IAAA,CAAKG,QAAA,CAAS,4BAA4B,GAAG;IAC/C,OAAO;MACLjF,SAAA,EAAW;MACXqC,OAAA,EAAS;IACX;EACF;EACA,OAAO;AACT;AAEO,SAAS6C,wBACdnB,KAAA,EACAE,IAAA,EACAkB,KAAA,GAAQ/E,IAAA,CAAKD,GAAA,CAAI,GAC0B;EAC3C,IAAI4D,KAAA,KAAU,SAAS,OAAO;EAC9B,MAAMe,IAAA,GAAOb,IAAA,CAAKjC,GAAA,CAAIwC,UAAU,EAAEF,IAAA,CAAK,GAAG;EAC1C,IAAIQ,IAAA,CAAKG,QAAA,CAASjG,gBAAgB,GAAG;IACnC,OAAO;MACLgB,SAAA,EAAW;MACXqC,OAAA,EAAS;MACTC,cAAA,EAAgB;IAClB;EACF;EACA,IAAIwC,IAAA,CAAKG,QAAA,CAAShG,iBAAiB,KAAK6F,IAAA,CAAKG,QAAA,CAAS/F,0BAA0B,GAAG;IACjF,OAAO;MACLc,SAAA,EAAW;MACXqC,OAAA,EAAS;MACTC,cAAA,EAAgB;IAClB;EACF;EACA,MAAM8C,MAAA,GAASJ,sBAAA,CAAuBF,IAAI;EAC1C,IAAIM,MAAA,EAAQ;IACV,OAAO;MAAE,GAAGA,MAAA;MAAQ9C,cAAA,EAAgB;IAAK;EAC3C;EACA,IAAIwC,IAAA,CAAKG,QAAA,CAAS9F,YAAY,KAAK,CAAC0F,sBAAA,CAAuBC,IAAI,GAAG;IAChE,MAAMO,MAAA,GAAStE,mBAAA;IACfA,mBAAA,GAAsBoE,KAAA;IACtB,IACEE,MAAA,GAAS,KACTF,KAAA,GAAQE,MAAA,IAAUjG,0BAAA,IAClB+F,KAAA,GAAQE,MAAA,IAAUhG,0BAAA,EAClB;MACA,OAAO;QACLW,SAAA,EAAW;QACXqC,OAAA,EAAS;QACTC,cAAA,EAAgB;MAClB;IACF;EACF;EACA,OAAO;AACT;AAOO,SAASgD,uBACdhE,IAAA,EACAiE,eAAA,EACS;EACT,MAAMC,aAAA,GAAgBD,eAAA,EAAiBE,KAAA;EACvC,OAAO;IACLC,IAAI3B,KAAA,EAAiBC,OAAA,KAAiCC,IAAA,EAAuB;MAC3E,IAAIsB,eAAA,EAAiBA,eAAA,CAAgBG,GAAA,CAAI3B,KAAA,EAAOC,OAAA,EAAS,GAAGC,IAAI,OAC3DH,YAAA,CAAaC,KAAA,EAAOC,OAAA,EAAS,GAAGC,IAAI;MACzC,MAAM0B,QAAA,GAAWT,uBAAA,CAAwBnB,KAAA,EAAOE,IAAI;MACpD,IAAI,CAAC0B,QAAA,EAAU;MACf,MAAMb,IAAA,GAAOb,IAAA,CAAKjC,GAAA,CAAIwC,UAAU,EAAEF,IAAA,CAAK,GAAG;MAC1C,IAAIhD,IAAA,CAAKsE,iBAAA,EAAmBC,IAAA,CAAMC,OAAA,IAAYC,iBAAA,CAAkBjB,IAAA,EAAMgB,OAAO,CAAC,GAC5E;MACF1D,OAAA,CAAQd,IAAA,EAAMqE,QAAA,CAAS3F,SAAA,EAAW2F,QAAA,CAAStD,OAAA,EAASsD,QAAA,CAASrD,cAAc;IAC7E;IAAA;IAAA;IAGAmD,KAAA,EAAOD,aAAA,GAAgB,MAAMA,aAAA,CAAcQ,IAAA,CAAKT,eAAe,IAAI;EACrE;AACF;AAEA,SAASQ,kBAAkB1D,OAAA,EAAiByD,OAAA,EAAkC;EAC5E,IAAI,OAAOA,OAAA,KAAY,UAAU,OAAOzD,OAAA,CAAQ4C,QAAA,CAASa,OAAO;EAChEA,OAAA,CAAQG,SAAA,GAAY;EACpB,OAAOH,OAAA,CAAQf,IAAA,CAAK1C,OAAO;AAC7B;AAKO,SAAS6D,kCAAkC7D,OAAA,EAA0B;EAC1E,OACEA,OAAA,CAAQ4C,QAAA,CAAS,oDAAoD,KACpE5C,OAAA,CAAQ4C,QAAA,CAAS,iBAAiB,KACjC5C,OAAA,CAAQ4C,QAAA,CAAS,gCAAgC,KACjD5C,OAAA,CAAQ4C,QAAA,CAAS,sBAAsB;AAE7C;AAMO,SAASkB,2BAAA,EAA6B;EAC3C7G,eAAA,GAAkB;EAClBC,gBAAA,GAAmB;EACnB,IAAIC,gBAAA,EAAkB;IACpB0B,YAAA,CAAa1B,gBAAgB;IAC7BA,gBAAA,GAAmB;EACrB;EACAC,cAAA,CAAe2G,MAAA,GAAS;EACxBrF,mBAAA,GAAsB;EACtBrB,aAAA,CAAc2G,KAAA,CAAM;AACtB","ignoreList":[]}
|
|
@@ -104,6 +104,15 @@ function recover(deps, reasonKey, message, dropLocalState) {
|
|
|
104
104
|
reasonKey,
|
|
105
105
|
reason: message
|
|
106
106
|
});
|
|
107
|
+
try {
|
|
108
|
+
var _globalThis_dispatchEvent, _globalThis;
|
|
109
|
+
(_globalThis_dispatchEvent = (_globalThis = globalThis).dispatchEvent) === null || _globalThis_dispatchEvent === void 0 ? void 0 : _globalThis_dispatchEvent.call(_globalThis, new CustomEvent("on-zero-fatal", {
|
|
110
|
+
detail: {
|
|
111
|
+
reasonKey,
|
|
112
|
+
reason: message
|
|
113
|
+
}
|
|
114
|
+
}));
|
|
115
|
+
} catch (unused) {}
|
|
107
116
|
return;
|
|
108
117
|
}
|
|
109
118
|
reloadScheduled = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_instanceof","left","right","Symbol","hasInstance","_type_of","obj","constructor","RECOVER_GUARD_MS","RELOAD_LATCH_TIMEOUT_MS","LOCAL_STORE_LOST","SQLITE_ERROR_NAME","SQLITE_STATEMENT_FINALIZED","STORE_CLOSED","STORE_CLOSED_REPEAT_MIN_MS","STORE_CLOSED_REPEAT_MAX_MS","reloadScheduled","reloadInProgress","reloadLatchTimer","pendingDeletes","inMemoryGuard","Map","defaultGuardStorage","window","sessionStorage","unused","recoveryGuardOpen","reasonKey","guardStorage","_inMemoryGuard_get","key","now","Date","memLast","get","storage","rawLast","getItem","last","Number","setItem","String","set","lastStoreClosedAtMs","armReloadLatchTimeout","setTimeout","clearTimeout","unref","disarmReloadLatchTimeout","performReload","deps","_deps_reload","Promise","resolve","doReload","reload","_globalThis_location_reload","_globalThis_location","globalThis","location","call","then","allSettled","splice","map","run","_deps_beforeReload","beforeReload","catch","recover","message","dropLocalState","_deps_onRecovery","onRecovery","push","deleteLocalState","console","error","zeroEvents","emit","type","reason","warn","runReload","runReload2","scheduleReload","makeZeroRecovery","onUpdateNeeded","onClientStateNotFound","onServerAckTimeout","input","label","consecutiveTimeouts","timeoutMs","logToConsole","level","context","_len","arguments","length","args","Array","_key","prefix","Object","entries","param","value","join","method","logArgText","arg","Error","name","stack","isBenignStoreClosedLog","text","test","classifyMutationDesync","includes","classifyZeroRecoveryLog","nowMs","desync","prevMs"
|
|
1
|
+
{"version":3,"names":["_instanceof","left","right","Symbol","hasInstance","_type_of","obj","constructor","RECOVER_GUARD_MS","RELOAD_LATCH_TIMEOUT_MS","LOCAL_STORE_LOST","SQLITE_ERROR_NAME","SQLITE_STATEMENT_FINALIZED","STORE_CLOSED","STORE_CLOSED_REPEAT_MIN_MS","STORE_CLOSED_REPEAT_MAX_MS","reloadScheduled","reloadInProgress","reloadLatchTimer","pendingDeletes","inMemoryGuard","Map","defaultGuardStorage","window","sessionStorage","unused","recoveryGuardOpen","reasonKey","guardStorage","_inMemoryGuard_get","key","now","Date","memLast","get","storage","rawLast","getItem","last","Number","setItem","String","set","lastStoreClosedAtMs","armReloadLatchTimeout","setTimeout","clearTimeout","unref","disarmReloadLatchTimeout","performReload","deps","_deps_reload","Promise","resolve","doReload","reload","_globalThis_location_reload","_globalThis_location","globalThis","location","call","then","allSettled","splice","map","run","_deps_beforeReload","beforeReload","catch","recover","message","dropLocalState","_deps_onRecovery","onRecovery","push","deleteLocalState","console","error","zeroEvents","emit","type","reason","_globalThis_dispatchEvent","_globalThis","dispatchEvent","CustomEvent","detail","warn","runReload","runReload2","scheduleReload","makeZeroRecovery","onUpdateNeeded","onClientStateNotFound","onServerAckTimeout","input","label","consecutiveTimeouts","timeoutMs","logToConsole","level","context","_len","arguments","length","args","Array","_key","prefix","Object","entries","param","value","join","method","logArgText","arg","Error","name","stack","isBenignStoreClosedLog","text","test","classifyMutationDesync","includes","classifyZeroRecoveryLog","nowMs","desync","prevMs"],"sources":["../../../src/helpers/recoverZeroClient.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
package/src/createZeroClient.tsx
CHANGED
|
@@ -29,9 +29,11 @@ import {
|
|
|
29
29
|
type QueryControlMode,
|
|
30
30
|
type UseQueryHook,
|
|
31
31
|
} from './createUseQuery'
|
|
32
|
+
import { clearZeroClientData } from './helpers/clearZeroClientData'
|
|
32
33
|
import { createMutators } from './helpers/createMutators'
|
|
33
34
|
import { createEmitter, type Emitter } from './helpers/emitter'
|
|
34
35
|
import { getAuth } from './helpers/getAuth'
|
|
36
|
+
import { readHostStorageScope } from './helpers/hostStorageScope'
|
|
35
37
|
import { createMutationLifecycle } from './helpers/mutationLifecycle'
|
|
36
38
|
import { IS_SERVER_RUNTIME } from './helpers/platform'
|
|
37
39
|
import {
|
|
@@ -713,6 +715,34 @@ export function createZeroClientInternal<
|
|
|
713
715
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
714
716
|
}, [])
|
|
715
717
|
|
|
718
|
+
// host-scoped storage: composed here so embedding hosts isolate co-located
|
|
719
|
+
// apps without app code carrying host globals. static per page load — the
|
|
720
|
+
// host injects the scope before the app's module graph evaluates.
|
|
721
|
+
const hostScope = readHostStorageScope()
|
|
722
|
+
const scopedProps = hostScope
|
|
723
|
+
? { ...props, storageKey: `${hostScope}-${props.storageKey ?? 'zero'}` }
|
|
724
|
+
: props
|
|
725
|
+
|
|
726
|
+
// expose the client proxy for harnesses/tests — set from the mounted
|
|
727
|
+
// provider (not module scope) so hot-reloaded trees always point at the
|
|
728
|
+
// live client.
|
|
729
|
+
;(globalThis as { __testZero?: unknown }).__testZero = zero
|
|
730
|
+
|
|
731
|
+
// `?reset` on any URL clears local zero state, then reloads without the
|
|
732
|
+
// param — a universal escape hatch for corrupt local data.
|
|
733
|
+
useEffect(() => {
|
|
734
|
+
if (typeof window === 'undefined' || typeof window.location === 'undefined') return
|
|
735
|
+
if (!new URLSearchParams(window.location.search).has('reset')) return
|
|
736
|
+
const url = new URL(window.location.href)
|
|
737
|
+
url.searchParams.delete('reset')
|
|
738
|
+
void clearZeroClientData({
|
|
739
|
+
closeZero: async () => zero.close(),
|
|
740
|
+
reload: false,
|
|
741
|
+
}).then(() => {
|
|
742
|
+
window.location.replace(url.toString())
|
|
743
|
+
})
|
|
744
|
+
}, [])
|
|
745
|
+
|
|
716
746
|
// remint() reconstructs the client in place by bumping this counter, which
|
|
717
747
|
// changes instanceKey and drives the rotate effect exactly as a real
|
|
718
748
|
// identity change does. register the bump so the imperative remint() API can
|
|
@@ -731,7 +761,7 @@ export function createZeroClientInternal<
|
|
|
731
761
|
// props (callbacks, logSink, batchViewUpdates) are bound at construction.
|
|
732
762
|
// remintGeneration is included so remint() forces a fresh instance.
|
|
733
763
|
const instanceKey = JSON.stringify([
|
|
734
|
-
Object.entries({ kvStore: 'mem', ...
|
|
764
|
+
Object.entries({ kvStore: 'mem', ...scopedProps })
|
|
735
765
|
.filter(
|
|
736
766
|
([key, value]) =>
|
|
737
767
|
key !== 'auth' && typeof value !== 'function' && value !== undefined
|
|
@@ -773,7 +803,7 @@ export function createZeroClientInternal<
|
|
|
773
803
|
return
|
|
774
804
|
}
|
|
775
805
|
let cached = cachedZero
|
|
776
|
-
const options =
|
|
806
|
+
const options = scopedProps as Omit<
|
|
777
807
|
ZeroOptions<Schema, ZeroMutators>,
|
|
778
808
|
'schema' | 'mutators'
|
|
779
809
|
>
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { describe, expect, test } from 'vitest'
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
generateGroupedQueriesFile,
|
|
5
|
+
generateModelsFile,
|
|
6
|
+
generateTablesFile,
|
|
7
|
+
} from './generate-helpers'
|
|
8
|
+
|
|
9
|
+
// the emitted files are modules, so every identifier they declare has to be
|
|
10
|
+
// unique. these cases all come from namespace names that are individually legal
|
|
11
|
+
// but previously aliased onto each other, producing output that did not compile.
|
|
12
|
+
function declaredIdentifiers(source: string): string[] {
|
|
13
|
+
const names: string[] = []
|
|
14
|
+
for (const line of source.split('\n')) {
|
|
15
|
+
const imported = line.match(/^import \* as ([$\w]+) from /)
|
|
16
|
+
if (imported) names.push(imported[1]!)
|
|
17
|
+
const declared = line.match(/^export const ([$\w]+) = /)
|
|
18
|
+
if (declared) names.push(declared[1]!)
|
|
19
|
+
const reexported = line.match(/^export \{ \w+ as ([$\w]+) \} from /)
|
|
20
|
+
if (reexported) names.push(reexported[1]!)
|
|
21
|
+
}
|
|
22
|
+
return names
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function expectNoDuplicates(source: string) {
|
|
26
|
+
const names = declaredIdentifiers(source)
|
|
27
|
+
const duplicates = names.filter((name, index) => names.indexOf(name) !== index)
|
|
28
|
+
expect(duplicates).toEqual([])
|
|
29
|
+
return names
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
describe('generated module identifiers', () => {
|
|
33
|
+
test('grouped queries keep distinct aliases when one namespace is another plus Source', () => {
|
|
34
|
+
const source = generateGroupedQueriesFile([
|
|
35
|
+
{ name: 'appById', sourceFile: 'app', importPath: '../app/queries' },
|
|
36
|
+
{
|
|
37
|
+
name: 'appSourceByAppId',
|
|
38
|
+
sourceFile: 'appSource',
|
|
39
|
+
importPath: '../appSource/queries',
|
|
40
|
+
},
|
|
41
|
+
])
|
|
42
|
+
|
|
43
|
+
expectNoDuplicates(source)
|
|
44
|
+
// each namespace still exports its own queries, reading from its own module
|
|
45
|
+
const appExport = source.match(/export const app = \{([^}]*)\}/)![1]!
|
|
46
|
+
const appSourceExport = source.match(/export const appSource = \{([^}]*)\}/)![1]!
|
|
47
|
+
expect(appExport).toContain('appById')
|
|
48
|
+
expect(appSourceExport).toContain('appSourceByAppId')
|
|
49
|
+
expect(appExport).not.toContain('appSourceByAppId')
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
test('models keep distinct aliases when user and userPublic both exist', () => {
|
|
53
|
+
const source = generateModelsFile([
|
|
54
|
+
{ name: 'user', importPath: '../user' },
|
|
55
|
+
{ name: 'userPublic', importPath: '../userPublic' },
|
|
56
|
+
] as Parameters<typeof generateModelsFile>[0])
|
|
57
|
+
|
|
58
|
+
expectNoDuplicates(source)
|
|
59
|
+
// both namespaces survive as distinct keys bound to their own module
|
|
60
|
+
const modelsObject = source.match(/export const models = \{([\s\S]*)\}/)![1]!
|
|
61
|
+
expect(modelsObject).toMatch(/\buser:/)
|
|
62
|
+
expect(modelsObject).toMatch(/\buserPublic\b/)
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
test('table re-exports keep distinct names when user and userPublic both exist', () => {
|
|
66
|
+
const source = generateTablesFile([
|
|
67
|
+
{ name: 'user', importPath: '../user' },
|
|
68
|
+
{ name: 'userPublic', importPath: '../userPublic' },
|
|
69
|
+
] as Parameters<typeof generateTablesFile>[0])
|
|
70
|
+
|
|
71
|
+
expectNoDuplicates(source)
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
test('a namespace with no collision keeps its plain alias', () => {
|
|
75
|
+
const source = generateGroupedQueriesFile([
|
|
76
|
+
{ name: 'todoById', sourceFile: 'todo', importPath: '../todo/queries' },
|
|
77
|
+
])
|
|
78
|
+
|
|
79
|
+
expect(source).toContain(`import * as todoSource from '../todo/queries'`)
|
|
80
|
+
})
|
|
81
|
+
})
|
package/src/generate-helpers.ts
CHANGED
|
@@ -47,6 +47,32 @@ export function getModelImportName(name: string): string {
|
|
|
47
47
|
return name === 'user' ? 'userPublic' : name
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
+
/**
|
|
51
|
+
* Assigns each name a module alias that cannot collide with another namespace's
|
|
52
|
+
* name or with another alias. `app` and `appSource` are both legal namespaces,
|
|
53
|
+
* so a plain `${name}Source` suffix is not safe on its own; the same is true of
|
|
54
|
+
* the `user` → `userPublic` rename above when both namespaces exist. Emitting a
|
|
55
|
+
* duplicate identifier produces a generated file that does not compile, so the
|
|
56
|
+
* disambiguation has to happen here rather than in the consuming app.
|
|
57
|
+
*
|
|
58
|
+
* Iteration order is the caller's, so output stays deterministic.
|
|
59
|
+
*/
|
|
60
|
+
export function uniqueModuleAliases(
|
|
61
|
+
names: readonly string[],
|
|
62
|
+
alias: (name: string) => string
|
|
63
|
+
): Map<string, string> {
|
|
64
|
+
const taken = new Set<string>(names)
|
|
65
|
+
const aliases = new Map<string, string>()
|
|
66
|
+
for (const name of names) {
|
|
67
|
+
let candidate = alias(name)
|
|
68
|
+
// a candidate equal to its own name is the identity alias and always fine
|
|
69
|
+
while (candidate !== name && taken.has(candidate)) candidate += '_'
|
|
70
|
+
taken.add(candidate)
|
|
71
|
+
aliases.set(name, candidate)
|
|
72
|
+
}
|
|
73
|
+
return aliases
|
|
74
|
+
}
|
|
75
|
+
|
|
50
76
|
// string-based type parser
|
|
51
77
|
|
|
52
78
|
function splitTopLevelTypeUnion(type: string): string[] {
|
|
@@ -324,20 +350,23 @@ export type GeneratedInstance = {
|
|
|
324
350
|
|
|
325
351
|
export function generateModelsFile(modules: GeneratedModule[]): string {
|
|
326
352
|
const sorted = [...modules].sort((a, b) => a.name.localeCompare(b.name))
|
|
353
|
+
const aliases = uniqueModuleAliases(
|
|
354
|
+
sorted.map(({ name }) => name),
|
|
355
|
+
getModelImportName
|
|
356
|
+
)
|
|
327
357
|
|
|
328
358
|
const imports = sorted
|
|
329
359
|
.map(
|
|
330
|
-
({ name, importPath }) =>
|
|
331
|
-
`import * as ${getModelImportName(name)} from '${importPath}'`
|
|
360
|
+
({ name, importPath }) => `import * as ${aliases.get(name)!} from '${importPath}'`
|
|
332
361
|
)
|
|
333
362
|
.join('\n')
|
|
334
363
|
|
|
335
364
|
const sortedByImportName = [...sorted].sort((a, b) =>
|
|
336
|
-
|
|
365
|
+
aliases.get(a.name)!.localeCompare(aliases.get(b.name)!)
|
|
337
366
|
)
|
|
338
367
|
const modelsObj = `export const models = {\n${sortedByImportName
|
|
339
368
|
.map(({ name }) => {
|
|
340
|
-
const importName =
|
|
369
|
+
const importName = aliases.get(name)!
|
|
341
370
|
return importName === name ? ` ${name},` : ` ${name}: ${importName},`
|
|
342
371
|
})
|
|
343
372
|
.join('\n')}\n}`
|
|
@@ -346,12 +375,14 @@ export function generateModelsFile(modules: GeneratedModule[]): string {
|
|
|
346
375
|
}
|
|
347
376
|
|
|
348
377
|
export function generateTypesFile(modelNames: string[]): string {
|
|
349
|
-
const sorted = [...modelNames].sort()
|
|
378
|
+
const sorted = [...modelNames].sort((a, b) => a.localeCompare(b))
|
|
379
|
+
// must match generateTablesFile: these types index into the schema names it exports
|
|
380
|
+
const aliases = uniqueModuleAliases(sorted, getModelImportName)
|
|
350
381
|
|
|
351
382
|
const typeExports = sorted
|
|
352
383
|
.map((name) => {
|
|
353
384
|
const pascalName = name.charAt(0).toUpperCase() + name.slice(1)
|
|
354
|
-
const schemaName =
|
|
385
|
+
const schemaName = aliases.get(name)!
|
|
355
386
|
return `export type ${pascalName} = TableInsertRow<typeof schema.${schemaName}>\nexport type ${pascalName}Update = TableUpdateRow<typeof schema.${schemaName}>`
|
|
356
387
|
})
|
|
357
388
|
.join('\n\n')
|
|
@@ -361,11 +392,15 @@ export function generateTypesFile(modelNames: string[]): string {
|
|
|
361
392
|
|
|
362
393
|
export function generateTablesFile(modules: GeneratedModule[]): string {
|
|
363
394
|
const sorted = [...modules].sort((a, b) => a.name.localeCompare(b.name))
|
|
395
|
+
const aliases = uniqueModuleAliases(
|
|
396
|
+
sorted.map(({ name }) => name),
|
|
397
|
+
getModelImportName
|
|
398
|
+
)
|
|
364
399
|
|
|
365
400
|
const exports = sorted
|
|
366
401
|
.map(
|
|
367
402
|
({ name, importPath }) =>
|
|
368
|
-
`export { schema as ${
|
|
403
|
+
`export { schema as ${aliases.get(name)!} } from '${importPath}'`
|
|
369
404
|
)
|
|
370
405
|
.join('\n')
|
|
371
406
|
|
|
@@ -445,19 +480,21 @@ export function generateGroupedQueriesFile(
|
|
|
445
480
|
}
|
|
446
481
|
|
|
447
482
|
const sortedFiles = [...queryByFile.keys()].sort()
|
|
483
|
+
const aliases = uniqueModuleAliases(sortedFiles, (file) => `${file}Source`)
|
|
448
484
|
const imports = sortedFiles
|
|
449
485
|
.map(
|
|
450
486
|
(file) =>
|
|
451
|
-
`import * as ${file}
|
|
487
|
+
`import * as ${aliases.get(file)!} from '${queryByFile.get(file)![0]!.importPath}'`
|
|
452
488
|
)
|
|
453
489
|
.join('\n')
|
|
454
490
|
const exports = sortedFiles
|
|
455
491
|
.map((file) => {
|
|
492
|
+
const alias = aliases.get(file)!
|
|
456
493
|
const names = queryByFile
|
|
457
494
|
.get(file)!
|
|
458
495
|
.map((query) => query.name)
|
|
459
496
|
.sort()
|
|
460
|
-
return `export const ${file} = {\n${names.map((name) => ` ${name}: ${
|
|
497
|
+
return `export const ${file} = {\n${names.map((name) => ` ${name}: ${alias}.${name},`).join('\n')}\n}`
|
|
461
498
|
})
|
|
462
499
|
.join('\n\n')
|
|
463
500
|
|
package/src/generate-layout.ts
CHANGED
|
@@ -224,11 +224,25 @@ function hasParseErrors(source: ts.SourceFile): boolean {
|
|
|
224
224
|
)
|
|
225
225
|
}
|
|
226
226
|
|
|
227
|
-
|
|
227
|
+
/**
|
|
228
|
+
* Which kinds of data exports a single-file namespace declares.
|
|
229
|
+
*
|
|
230
|
+
* `model` covers the exports that belong in generated `models.ts`: `mutate`,
|
|
231
|
+
* `where`, and a `schema` table declaration. `query` covers exported functions
|
|
232
|
+
* that reach a query builder. The two are reported separately because a
|
|
233
|
+
* query-only file must NOT enter models — a models entry with no `mutate` makes
|
|
234
|
+
* `GetZeroMutators` fail its constraint, which silently degrades EVERY
|
|
235
|
+
* `zero.mutate.*` call site in the app to an untyped error. Folder namespaces
|
|
236
|
+
* already get this right by construction (no `mutations.ts` means no model).
|
|
237
|
+
*/
|
|
238
|
+
type NamespaceExportKinds = { model: boolean; query: boolean }
|
|
239
|
+
|
|
240
|
+
function namespaceExportKinds(
|
|
228
241
|
ts: typeof import('typescript'),
|
|
229
242
|
baseDir: string,
|
|
230
243
|
path: string
|
|
231
|
-
):
|
|
244
|
+
): NamespaceExportKinds {
|
|
245
|
+
const none: NamespaceExportKinds = { model: false, query: false }
|
|
232
246
|
const source = ts.createSourceFile(
|
|
233
247
|
path,
|
|
234
248
|
readFileSync(path, 'utf8'),
|
|
@@ -238,7 +252,7 @@ function hasNamespaceExports(
|
|
|
238
252
|
if (hasParseErrors(source)) {
|
|
239
253
|
const displayPath = relative(dirname(baseDir), path).split(sep).join('/')
|
|
240
254
|
console.warn(`[on-zero] ignoring ${displayPath}: no recognized data exports`)
|
|
241
|
-
return
|
|
255
|
+
return none
|
|
242
256
|
}
|
|
243
257
|
const functions = new Map<string, ts.ConciseBody>()
|
|
244
258
|
const exported = new Set<string>()
|
|
@@ -259,7 +273,7 @@ function hasNamespaceExports(
|
|
|
259
273
|
(name === 'where' && initializerText.startsWith('serverWhere(')) ||
|
|
260
274
|
(name === 'schema' && initializerText.startsWith('table('))
|
|
261
275
|
) {
|
|
262
|
-
return true
|
|
276
|
+
return { model: true, query: false }
|
|
263
277
|
}
|
|
264
278
|
}
|
|
265
279
|
if (ts.isArrowFunction(initializer) || ts.isFunctionExpression(initializer)) {
|
|
@@ -308,7 +322,8 @@ function hasNamespaceExports(
|
|
|
308
322
|
return found
|
|
309
323
|
}
|
|
310
324
|
|
|
311
|
-
|
|
325
|
+
const query = [...exported].some((name) => reachesQuery(functions.get(name)!))
|
|
326
|
+
return { model: false, query }
|
|
312
327
|
}
|
|
313
328
|
|
|
314
329
|
function discoverNamespaces(
|
|
@@ -324,13 +339,16 @@ function discoverNamespaces(
|
|
|
324
339
|
if (entry.isFile()) {
|
|
325
340
|
if (!isSourceFile(entry.name) || entry.name === 'on-zero.config.ts') continue
|
|
326
341
|
const path = resolve(instance.dir, entry.name)
|
|
327
|
-
|
|
342
|
+
const kinds = namespaceExportKinds(ts, baseDir, path)
|
|
343
|
+
if (!kinds.model && !kinds.query) continue
|
|
328
344
|
const name = basename(entry.name, '.ts')
|
|
329
345
|
namespaces.push({
|
|
330
346
|
name,
|
|
331
347
|
instance: instance.name,
|
|
332
348
|
queryPath: path,
|
|
333
|
-
|
|
349
|
+
// a query-only file is not a model, matching the folder layout where a
|
|
350
|
+
// missing mutations.ts leaves modelPath null
|
|
351
|
+
modelPath: kinds.model ? path : null,
|
|
334
352
|
sourcePaths: [path],
|
|
335
353
|
})
|
|
336
354
|
continue
|
|
@@ -719,7 +737,8 @@ function assertNoUnclaimedNamespaces(
|
|
|
719
737
|
) {
|
|
720
738
|
continue
|
|
721
739
|
}
|
|
722
|
-
|
|
740
|
+
const kinds = namespaceExportKinds(ts, baseDir, path)
|
|
741
|
+
if (kinds.model || kinds.query) {
|
|
723
742
|
throw new Error(
|
|
724
743
|
`[on-zero] data namespace ${path} is outside every instance directory declared in ${configPath}`
|
|
725
744
|
)
|
package/src/generate.test.ts
CHANGED
|
@@ -611,16 +611,18 @@ export const messages = () => zql.message.related('author')
|
|
|
611
611
|
allTables: ['account', 'audit', 'message'],
|
|
612
612
|
})
|
|
613
613
|
|
|
614
|
+
// only message.ts is a model: account.ts exports a query and no mutate,
|
|
615
|
+
// where, or table declaration, so it must not enter models.ts
|
|
614
616
|
await expect(
|
|
615
617
|
generate({
|
|
616
618
|
dir: dataDir(),
|
|
617
619
|
config: join(dataDir(), 'on-zero.config.ts'),
|
|
618
620
|
silent: true,
|
|
619
621
|
})
|
|
620
|
-
).resolves.toMatchObject({ modelCount:
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
)
|
|
622
|
+
).resolves.toMatchObject({ modelCount: 1, schemaCount: 1 })
|
|
623
|
+
const models = readFileSync(join(dataDir(), 'generated/models.ts'), 'utf8')
|
|
624
|
+
expect(models).toContain("from '../../project-data/message'")
|
|
625
|
+
expect(models).not.toContain('account')
|
|
624
626
|
})
|
|
625
627
|
|
|
626
628
|
test('rejects missing configured instance directories', async () => {
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// an embedding host that runs many apps on one origin (a preview shell, a
|
|
2
|
+
// multi-app runner) injects a storage scope before the app's module graph
|
|
3
|
+
// evaluates; on-zero folds it into every storage key so co-located apps never
|
|
4
|
+
// share local zero state. same-origin iframes read the top window so the host
|
|
5
|
+
// sets it in exactly one place. standalone apps have no scope.
|
|
6
|
+
type ScopedGlobal = { __on_zero_storage_scope?: string }
|
|
7
|
+
|
|
8
|
+
export function readHostStorageScope(): string | undefined {
|
|
9
|
+
const runtime = globalThis as ScopedGlobal
|
|
10
|
+
if (typeof window !== 'undefined') {
|
|
11
|
+
try {
|
|
12
|
+
const top = (window.top ?? window) as unknown as ScopedGlobal
|
|
13
|
+
if (top.__on_zero_storage_scope) return top.__on_zero_storage_scope
|
|
14
|
+
} catch {
|
|
15
|
+
// cross-origin top window: not an embedding host
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return runtime.__on_zero_storage_scope
|
|
19
|
+
}
|
|
@@ -224,6 +224,14 @@ function recover(
|
|
|
224
224
|
if (!recoveryGuardOpen(reasonKey, deps.guardStorage)) {
|
|
225
225
|
console.error(`[on-zero] ${message} — already recovered once, not reloading`)
|
|
226
226
|
deps.zeroEvents.emit({ type: 'fatal', reasonKey, reason: message })
|
|
227
|
+
// hosts embedding this app (preview shells, test harnesses) observe the
|
|
228
|
+
// terminal state without sharing the module instance: a plain event on the
|
|
229
|
+
// realm's global scope.
|
|
230
|
+
try {
|
|
231
|
+
globalThis.dispatchEvent?.(
|
|
232
|
+
new CustomEvent('on-zero-fatal', { detail: { reasonKey, reason: message } })
|
|
233
|
+
)
|
|
234
|
+
} catch {}
|
|
227
235
|
return
|
|
228
236
|
}
|
|
229
237
|
reloadScheduled = true
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createZeroClient.d.ts","sourceRoot":"","sources":["../src/createZeroClient.tsx"],"names":[],"mappings":"AAAA,OAAO,EAIL,IAAI,IAAI,UAAU,EACnB,MAAM,gBAAgB,CAAA;AAOvB,OAAO,EASL,KAAK,OAAO,EACZ,KAAK,SAAS,EACf,MAAM,OAAO,CAAA;AAGd,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"createZeroClient.d.ts","sourceRoot":"","sources":["../src/createZeroClient.tsx"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,17 @@ export type ModelMutations = {
|
|
|
19
19
|
export declare function shouldSkipObjectKey(name: string): boolean;
|
|
20
20
|
export declare function formatObjectKey(name: string): string;
|
|
21
21
|
export declare function getModelImportName(name: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* Assigns each name a module alias that cannot collide with another namespace's
|
|
24
|
+
* name or with another alias. `app` and `appSource` are both legal namespaces,
|
|
25
|
+
* so a plain `${name}Source` suffix is not safe on its own; the same is true of
|
|
26
|
+
* the `user` → `userPublic` rename above when both namespaces exist. Emitting a
|
|
27
|
+
* duplicate identifier produces a generated file that does not compile, so the
|
|
28
|
+
* disambiguation has to happen here rather than in the consuming app.
|
|
29
|
+
*
|
|
30
|
+
* Iteration order is the caller's, so output stays deterministic.
|
|
31
|
+
*/
|
|
32
|
+
export declare function uniqueModuleAliases(names: readonly string[], alias: (name: string) => string): Map<string, string>;
|
|
22
33
|
export declare function parseTypeString(type: string): string | null;
|
|
23
34
|
export type GeneratedModule = {
|
|
24
35
|
name: string;
|