@base44-preview/vite-plugin 1.0.31-pr.113.e541ee0 → 1.0.32-pr.114.574de6d

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.
@@ -1 +1 @@
1
- {"version":3,"file":"html-injections-plugin.d.ts","sourceRoot":"","sources":["../src/html-injections-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAqB,MAAM,MAAM,CAAC;AAyEtD,wBAAgB,oBAAoB,CAAC,EACnC,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,gBAAgB,GACjB,EAAE;IACD,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;CAC3B,GAmFM,MAAM,CACZ"}
1
+ {"version":3,"file":"html-injections-plugin.d.ts","sourceRoot":"","sources":["../src/html-injections-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAqB,MAAM,MAAM,CAAC;AA8EtD,wBAAgB,oBAAoB,CAAC,EACnC,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,gBAAgB,GACjB,EAAE;IACD,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;CAC3B,GAsFM,MAAM,CACZ"}
@@ -42,6 +42,11 @@ const INJECTIONS = {
42
42
  injectTo: "body",
43
43
  mode: "dev",
44
44
  },
45
+ staleDepsReloader: {
46
+ src: "/node_modules/@base44/vite-plugin/dist/injections/stale-deps-reloader.js",
47
+ injectTo: "head",
48
+ mode: "dev",
49
+ },
45
50
  hmrNotifier: {
46
51
  src: "/node_modules/@base44/vite-plugin/dist/injections/sandbox-hmr-notifier.js",
47
52
  injectTo: "head",
@@ -62,6 +67,9 @@ export function htmlInjectionsPlugin({ hmrNotifier, navigationNotifier, visualEd
62
67
  const enabledInjections = {
63
68
  unhandledErrors: true,
64
69
  sandboxMount: true,
70
+ // Deliberately not an opt-in option: existing apps must pick this up from a
71
+ // plugin version bump alone, without editing their vite.config.js.
72
+ staleDepsReloader: true,
65
73
  hmrNotifier,
66
74
  navigationNotifier,
67
75
  analyticsTracker,
@@ -1 +1 @@
1
- {"version":3,"file":"html-injections-plugin.js","sourceRoot":"","sources":["../src/html-injections-plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"html-injections-plugin.js","sourceRoot":"","sources":["../src/html-injections-plugin.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,MAAM,CAAC;AAuB/C,MAAM,CAAC,OAAO,UAAU,UAAU,CAChC,IAAI,GAAE;IACJ,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CACvB,iBAkPP"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,MAAM,CAAC;AAuB/C,MAAM,CAAC,OAAO,UAAU,UAAU,CAChC,IAAI,GAAE;IACJ,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CACvB,iBAmPP"}
package/dist/index.js CHANGED
@@ -53,6 +53,7 @@ export default function vitePlugin(opts = {}) {
53
53
  // Allow all hosts - essential for Modal tunnel URLs
54
54
  allowedHosts: true,
55
55
  fs: {
56
+ strict: true,
56
57
  // Vite replaces its default deny list when one is provided, so preserve those defaults here.
57
58
  deny: [
58
59
  ".env",
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ type BudgetStorage = Pick<Storage, "getItem" | "setItem">;
2
+ export type StaleDepsTracker = {
3
+ observe: (url: string) => boolean;
4
+ };
5
+ export type StaleDepsReloaderOptions = {
6
+ reload?: () => void;
7
+ now?: () => number;
8
+ storage?: BudgetStorage | null;
9
+ graceMs?: number;
10
+ };
11
+ /** The `v` param of an optimized-dep URL, or null for anything else. */
12
+ export declare function extractDepHash(url: string): string | null;
13
+ /** Reports true once a dep URL carries a hash different from the first one seen. */
14
+ export declare function createStaleDepsTracker(): StaleDepsTracker;
15
+ /**
16
+ * Consume one reload from the per-window budget. Fails open when storage is
17
+ * unreadable — an unrecoverable white screen is worse than a reload loop we can
18
+ * at least see in the logs.
19
+ */
20
+ export declare function takeReloadBudget(storage: BudgetStorage, now: number): boolean;
21
+ export declare function setupStaleDepsReloader(options?: StaleDepsReloaderOptions): () => void;
22
+ export {};
23
+ //# sourceMappingURL=stale-deps-reloader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stale-deps-reloader.d.ts","sourceRoot":"","sources":["../../src/injections/stale-deps-reloader.ts"],"names":[],"mappings":"AAoBA,KAAK,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,GAAG,SAAS,CAAC,CAAC;AAE1D,MAAM,MAAM,gBAAgB,GAAG;IAAE,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAA;CAAE,CAAC;AAErE,MAAM,MAAM,wBAAwB,GAAG;IACrC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKzD;AAED,oFAAoF;AACpF,wBAAgB,sBAAsB,IAAI,gBAAgB,CAazD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAuB7E;AAkBD,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,wBAA6B,GACrC,MAAM,IAAI,CAuEZ"}
@@ -0,0 +1,161 @@
1
+ /// <reference types="vite/client" />
2
+ // Vite serves every optimized dependency under a single `?v=<browserHash>`. When the
3
+ // optimizer re-runs mid-session — a newly discovered import, or `vite --force` on a
4
+ // dev-server restart — that hash changes, and a page that already fetched chunks under
5
+ // the old one finishes loading with two copies of React. The second resolves to null
6
+ // and the app dies on its first hook: "Cannot read properties of null (reading
7
+ // 'useState')". Vite's own 504-based recovery only covers requests it can still
8
+ // identify as outdated, so it misses the swap that lands between two requests of the
9
+ // same page load. Reloading on the second distinct hash turns a dead preview into a
10
+ // flicker.
11
+ const DEPS_MARKER = "/.vite/deps/";
12
+ const RELOAD_GRACE_MS = 200;
13
+ const RELOAD_BUDGET = 2;
14
+ const RELOAD_WINDOW_MS = 15_000;
15
+ const STORAGE_KEY = "__base44_stale_deps_reload";
16
+ /** The `v` param of an optimized-dep URL, or null for anything else. */
17
+ export function extractDepHash(url) {
18
+ if (!url.includes(DEPS_MARKER))
19
+ return null;
20
+ const query = url.indexOf("?");
21
+ if (query === -1)
22
+ return null;
23
+ return new URLSearchParams(url.slice(query + 1)).get("v");
24
+ }
25
+ /** Reports true once a dep URL carries a hash different from the first one seen. */
26
+ export function createStaleDepsTracker() {
27
+ let firstHash = null;
28
+ return {
29
+ observe(url) {
30
+ const hash = extractDepHash(url);
31
+ if (hash === null)
32
+ return false;
33
+ if (firstHash === null) {
34
+ firstHash = hash;
35
+ return false;
36
+ }
37
+ return hash !== firstHash;
38
+ },
39
+ };
40
+ }
41
+ /**
42
+ * Consume one reload from the per-window budget. Fails open when storage is
43
+ * unreadable — an unrecoverable white screen is worse than a reload loop we can
44
+ * at least see in the logs.
45
+ */
46
+ export function takeReloadBudget(storage, now) {
47
+ let prev = null;
48
+ try {
49
+ const raw = storage.getItem(STORAGE_KEY);
50
+ if (raw)
51
+ prev = JSON.parse(raw);
52
+ }
53
+ catch {
54
+ return true;
55
+ }
56
+ let n = 1;
57
+ let windowStart = now;
58
+ if (prev && typeof prev.n === "number" && now - prev.t < RELOAD_WINDOW_MS) {
59
+ n = prev.n + 1;
60
+ windowStart = prev.t;
61
+ }
62
+ if (n > RELOAD_BUDGET)
63
+ return false;
64
+ try {
65
+ storage.setItem(STORAGE_KEY, JSON.stringify({ n, t: windowStart }));
66
+ }
67
+ catch {
68
+ // Budget can't be persisted; the cap degrades but the reload still helps.
69
+ }
70
+ return true;
71
+ }
72
+ function defaultStorage() {
73
+ try {
74
+ return window.sessionStorage;
75
+ }
76
+ catch {
77
+ return null;
78
+ }
79
+ }
80
+ function notifyParent(type) {
81
+ try {
82
+ window.parent?.postMessage({ type }, "*");
83
+ }
84
+ catch {
85
+ // Parent is cross-origin or gone; observability is best-effort.
86
+ }
87
+ }
88
+ export function setupStaleDepsReloader(options = {}) {
89
+ const reload = options.reload ?? (() => window.location.reload());
90
+ const now = options.now ?? (() => Date.now());
91
+ const graceMs = options.graceMs ?? RELOAD_GRACE_MS;
92
+ const storage = options.storage === undefined ? defaultStorage() : options.storage;
93
+ const Observer = globalThis.PerformanceObserver;
94
+ if (typeof Observer !== "function")
95
+ return () => { };
96
+ const tracker = createStaleDepsTracker();
97
+ let viteIsReloading = false;
98
+ let timer = null;
99
+ let done = false;
100
+ // Vite handles most swaps itself. Stand down rather than reload twice.
101
+ if (import.meta.hot) {
102
+ import.meta.hot.on("vite:beforeFullReload", () => {
103
+ viteIsReloading = true;
104
+ });
105
+ }
106
+ const scheduleReload = () => {
107
+ if (done || timer !== null)
108
+ return;
109
+ // The grace exists to let Vite's own full reload win the race. During the
110
+ // initial load its HMR client may not even be connected yet, and every
111
+ // millisecond of delay is a millisecond of broken preview — so don't wait.
112
+ const delay = document.readyState === "loading" ? 0 : graceMs;
113
+ timer = setTimeout(() => {
114
+ timer = null;
115
+ if (done || viteIsReloading)
116
+ return;
117
+ done = true;
118
+ observer.disconnect();
119
+ if (storage && !takeReloadBudget(storage, now())) {
120
+ notifyParent("sandbox:staleDepsReloadBudgetExhausted");
121
+ return;
122
+ }
123
+ notifyParent("sandbox:staleDepsReload");
124
+ reload();
125
+ }, delay);
126
+ };
127
+ const observer = new Observer((list) => {
128
+ for (const entry of list.getEntries()) {
129
+ if (tracker.observe(entry.name))
130
+ scheduleReload();
131
+ }
132
+ });
133
+ try {
134
+ observer.observe({ type: "resource", buffered: true });
135
+ }
136
+ catch {
137
+ return () => { };
138
+ }
139
+ // `buffered` is not honored everywhere; sweep what already landed.
140
+ try {
141
+ for (const entry of performance.getEntriesByType("resource")) {
142
+ if (tracker.observe(entry.name))
143
+ scheduleReload();
144
+ }
145
+ }
146
+ catch {
147
+ // No resource timing available; the observer above is the only source.
148
+ }
149
+ return () => {
150
+ done = true;
151
+ if (timer !== null) {
152
+ clearTimeout(timer);
153
+ timer = null;
154
+ }
155
+ observer.disconnect();
156
+ };
157
+ }
158
+ if (typeof window !== "undefined") {
159
+ setupStaleDepsReloader();
160
+ }
161
+ //# sourceMappingURL=stale-deps-reloader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stale-deps-reloader.js","sourceRoot":"","sources":["../../src/injections/stale-deps-reloader.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@base44-preview/vite-plugin",
3
- "version": "1.0.31-pr.113.e541ee0",
3
+ "version": "1.0.32-pr.114.574de6d",
4
4
  "description": "The Vite plugin for base44 based applications",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -54,6 +54,11 @@ const INJECTIONS: Record<string, Injection> = {
54
54
  injectTo: "body",
55
55
  mode: "dev",
56
56
  },
57
+ staleDepsReloader: {
58
+ src: "/node_modules/@base44/vite-plugin/dist/injections/stale-deps-reloader.js",
59
+ injectTo: "head",
60
+ mode: "dev",
61
+ },
57
62
  hmrNotifier: {
58
63
  src: "/node_modules/@base44/vite-plugin/dist/injections/sandbox-hmr-notifier.js",
59
64
  injectTo: "head",
@@ -85,6 +90,9 @@ export function htmlInjectionsPlugin({
85
90
  const enabledInjections: Record<string, boolean> = {
86
91
  unhandledErrors: true,
87
92
  sandboxMount: true,
93
+ // Deliberately not an opt-in option: existing apps must pick this up from a
94
+ // plugin version bump alone, without editing their vite.config.js.
95
+ staleDepsReloader: true,
88
96
  hmrNotifier,
89
97
  navigationNotifier,
90
98
  analyticsTracker,
package/src/index.ts CHANGED
@@ -79,6 +79,7 @@ export default function vitePlugin(
79
79
  // Allow all hosts - essential for Modal tunnel URLs
80
80
  allowedHosts: true,
81
81
  fs: {
82
+ strict: true,
82
83
  // Vite replaces its default deny list when one is provided, so preserve those defaults here.
83
84
  deny: [
84
85
  ".env",
@@ -0,0 +1,179 @@
1
+ /// <reference types="vite/client" />
2
+
3
+ // Vite serves every optimized dependency under a single `?v=<browserHash>`. When the
4
+ // optimizer re-runs mid-session — a newly discovered import, or `vite --force` on a
5
+ // dev-server restart — that hash changes, and a page that already fetched chunks under
6
+ // the old one finishes loading with two copies of React. The second resolves to null
7
+ // and the app dies on its first hook: "Cannot read properties of null (reading
8
+ // 'useState')". Vite's own 504-based recovery only covers requests it can still
9
+ // identify as outdated, so it misses the swap that lands between two requests of the
10
+ // same page load. Reloading on the second distinct hash turns a dead preview into a
11
+ // flicker.
12
+
13
+ const DEPS_MARKER = "/.vite/deps/";
14
+ const RELOAD_GRACE_MS = 200;
15
+ const RELOAD_BUDGET = 2;
16
+ const RELOAD_WINDOW_MS = 15_000;
17
+ const STORAGE_KEY = "__base44_stale_deps_reload";
18
+
19
+ type ReloadRecord = { n: number; t: number };
20
+
21
+ type BudgetStorage = Pick<Storage, "getItem" | "setItem">;
22
+
23
+ export type StaleDepsTracker = { observe: (url: string) => boolean };
24
+
25
+ export type StaleDepsReloaderOptions = {
26
+ reload?: () => void;
27
+ now?: () => number;
28
+ storage?: BudgetStorage | null;
29
+ graceMs?: number;
30
+ };
31
+
32
+ /** The `v` param of an optimized-dep URL, or null for anything else. */
33
+ export function extractDepHash(url: string): string | null {
34
+ if (!url.includes(DEPS_MARKER)) return null;
35
+ const query = url.indexOf("?");
36
+ if (query === -1) return null;
37
+ return new URLSearchParams(url.slice(query + 1)).get("v");
38
+ }
39
+
40
+ /** Reports true once a dep URL carries a hash different from the first one seen. */
41
+ export function createStaleDepsTracker(): StaleDepsTracker {
42
+ let firstHash: string | null = null;
43
+ return {
44
+ observe(url: string): boolean {
45
+ const hash = extractDepHash(url);
46
+ if (hash === null) return false;
47
+ if (firstHash === null) {
48
+ firstHash = hash;
49
+ return false;
50
+ }
51
+ return hash !== firstHash;
52
+ },
53
+ };
54
+ }
55
+
56
+ /**
57
+ * Consume one reload from the per-window budget. Fails open when storage is
58
+ * unreadable — an unrecoverable white screen is worse than a reload loop we can
59
+ * at least see in the logs.
60
+ */
61
+ export function takeReloadBudget(storage: BudgetStorage, now: number): boolean {
62
+ let prev: ReloadRecord | null = null;
63
+ try {
64
+ const raw = storage.getItem(STORAGE_KEY);
65
+ if (raw) prev = JSON.parse(raw) as ReloadRecord;
66
+ } catch {
67
+ return true;
68
+ }
69
+
70
+ let n = 1;
71
+ let windowStart = now;
72
+ if (prev && typeof prev.n === "number" && now - prev.t < RELOAD_WINDOW_MS) {
73
+ n = prev.n + 1;
74
+ windowStart = prev.t;
75
+ }
76
+ if (n > RELOAD_BUDGET) return false;
77
+
78
+ try {
79
+ storage.setItem(STORAGE_KEY, JSON.stringify({ n, t: windowStart }));
80
+ } catch {
81
+ // Budget can't be persisted; the cap degrades but the reload still helps.
82
+ }
83
+ return true;
84
+ }
85
+
86
+ function defaultStorage(): BudgetStorage | null {
87
+ try {
88
+ return window.sessionStorage;
89
+ } catch {
90
+ return null;
91
+ }
92
+ }
93
+
94
+ function notifyParent(type: string): void {
95
+ try {
96
+ window.parent?.postMessage({ type }, "*");
97
+ } catch {
98
+ // Parent is cross-origin or gone; observability is best-effort.
99
+ }
100
+ }
101
+
102
+ export function setupStaleDepsReloader(
103
+ options: StaleDepsReloaderOptions = {}
104
+ ): () => void {
105
+ const reload = options.reload ?? ((): void => window.location.reload());
106
+ const now = options.now ?? ((): number => Date.now());
107
+ const graceMs = options.graceMs ?? RELOAD_GRACE_MS;
108
+ const storage =
109
+ options.storage === undefined ? defaultStorage() : options.storage;
110
+
111
+ const Observer = globalThis.PerformanceObserver;
112
+ if (typeof Observer !== "function") return (): void => {};
113
+
114
+ const tracker = createStaleDepsTracker();
115
+ let viteIsReloading = false;
116
+ let timer: ReturnType<typeof setTimeout> | null = null;
117
+ let done = false;
118
+
119
+ // Vite handles most swaps itself. Stand down rather than reload twice.
120
+ if (import.meta.hot) {
121
+ import.meta.hot.on("vite:beforeFullReload", () => {
122
+ viteIsReloading = true;
123
+ });
124
+ }
125
+
126
+ const scheduleReload = (): void => {
127
+ if (done || timer !== null) return;
128
+ // The grace exists to let Vite's own full reload win the race. During the
129
+ // initial load its HMR client may not even be connected yet, and every
130
+ // millisecond of delay is a millisecond of broken preview — so don't wait.
131
+ const delay = document.readyState === "loading" ? 0 : graceMs;
132
+ timer = setTimeout(() => {
133
+ timer = null;
134
+ if (done || viteIsReloading) return;
135
+ done = true;
136
+ observer.disconnect();
137
+ if (storage && !takeReloadBudget(storage, now())) {
138
+ notifyParent("sandbox:staleDepsReloadBudgetExhausted");
139
+ return;
140
+ }
141
+ notifyParent("sandbox:staleDepsReload");
142
+ reload();
143
+ }, delay);
144
+ };
145
+
146
+ const observer = new Observer((list: PerformanceObserverEntryList) => {
147
+ for (const entry of list.getEntries()) {
148
+ if (tracker.observe(entry.name)) scheduleReload();
149
+ }
150
+ });
151
+
152
+ try {
153
+ observer.observe({ type: "resource", buffered: true });
154
+ } catch {
155
+ return (): void => {};
156
+ }
157
+
158
+ // `buffered` is not honored everywhere; sweep what already landed.
159
+ try {
160
+ for (const entry of performance.getEntriesByType("resource")) {
161
+ if (tracker.observe(entry.name)) scheduleReload();
162
+ }
163
+ } catch {
164
+ // No resource timing available; the observer above is the only source.
165
+ }
166
+
167
+ return (): void => {
168
+ done = true;
169
+ if (timer !== null) {
170
+ clearTimeout(timer);
171
+ timer = null;
172
+ }
173
+ observer.disconnect();
174
+ };
175
+ }
176
+
177
+ if (typeof window !== "undefined") {
178
+ setupStaleDepsReloader();
179
+ }