@iteraai/vite-plugin-react-inspector 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,75 @@
1
+ # `@iteraai/vite-plugin-react-inspector`
2
+
3
+ Vite plugin for injecting the Itera React component inspector runtime into React-Vite apps.
4
+
5
+ This package is the React-Vite integration surface for the Itera inspector. It reuses `@iteraai/react-component-inspector` and `@iteraai/inspector-protocol`; it does not replace the existing bridge or iteration runtime.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm install @iteraai/vite-plugin-react-inspector @vitejs/plugin-react
11
+ ```
12
+
13
+ Your app should already provide React and React DOM:
14
+
15
+ - `react`: `^18.3.0 || ^19.0.0`
16
+ - `react-dom`: `^18.3.0 || ^19.0.0`
17
+
18
+ ## Manual React-Vite Usage
19
+
20
+ ```ts
21
+ import react from '@vitejs/plugin-react';
22
+ import { defineConfig } from 'vite';
23
+ import { createIteraReactInspectorVitePlugin } from '@iteraai/vite-plugin-react-inspector';
24
+
25
+ export default defineConfig({
26
+ plugins: [createIteraReactInspectorVitePlugin(), react()],
27
+ });
28
+ ```
29
+
30
+ Enable it for local testing with Vite environment variables:
31
+
32
+ ```bash
33
+ VITE_ITERA_COMPONENT_INSPECTOR_ENABLED=true \
34
+ VITE_ITERA_COMPONENT_INSPECTOR_HOST_ORIGINS=https://app.iteradev.ai \
35
+ npm run dev
36
+ ```
37
+
38
+ You can also configure it directly:
39
+
40
+ ```ts
41
+ createIteraReactInspectorVitePlugin({
42
+ enabled: true,
43
+ hostOrigins: ['https://app.iteradev.ai'],
44
+ });
45
+ ```
46
+
47
+ By default, the plugin only injects the runtime for Vite serve/dev mode. For an explicit local preview build, opt in to build HTML injection:
48
+
49
+ ```ts
50
+ createIteraReactInspectorVitePlugin({
51
+ enabled: true,
52
+ hostOrigins: ['https://app.iteradev.ai'],
53
+ includeInBuild: true,
54
+ });
55
+ ```
56
+
57
+ Do not enable `includeInBuild` for normal production builds unless the build output is specifically intended to carry the inspector runtime.
58
+
59
+ ## API
60
+
61
+ ```ts
62
+ createIteraReactInspectorVitePlugin(options?: {
63
+ enabled?: boolean;
64
+ hostOrigins?: readonly string[] | string;
65
+ includeInBuild?: boolean;
66
+ })
67
+ ```
68
+
69
+ The package also exports `iteraReactInspector` as a shorter alias for the same factory.
70
+
71
+ The plugin-generated virtual module imports `@iteraai/vite-plugin-react-inspector/client` as a small browser runtime support entry. Application code should normally use the plugin factory instead of importing the client entry directly.
72
+
73
+ When `enabled` is omitted, the plugin enables only when `VITE_ITERA_COMPONENT_INSPECTOR_ENABLED` is exactly `true`. Host origins can come from `hostOrigins` or the comma-separated `VITE_ITERA_COMPONENT_INSPECTOR_HOST_ORIGINS` value.
74
+
75
+ If the inspector is enabled but no trusted host origins are available, the plugin warns and does not inject or start the bridge.
@@ -0,0 +1,8 @@
1
+ export type IteraReactInspectorViteRuntimeOptions = {
2
+ enabled: boolean;
3
+ hostOrigins: readonly string[];
4
+ stateKey?: string;
5
+ warningPrefix?: string;
6
+ };
7
+ export declare const bootIteraReactInspectorViteRuntime: (options: IteraReactInspectorViteRuntimeOptions) => () => void;
8
+ export declare const stopIteraReactInspectorViteRuntime: (options?: Pick<IteraReactInspectorViteRuntimeOptions, "stateKey">) => void;
package/dist/client.js ADDED
@@ -0,0 +1,135 @@
1
+ import { INSPECTOR_CHANNEL as y } from "@iteraai/inspector-protocol";
2
+ import { bootstrapEmbeddedInspectorBridge as m } from "@iteraai/react-component-inspector/embeddedBootstrap";
3
+ const g = "__ITERA_REACT_INSPECTOR_VITE_BOOTSTRAP__", h = "[itera-vite-plugin-react-inspector]", c = (e) => e, A = (e) => ({
4
+ enabled: e.enabled,
5
+ hostOrigins: e.hostOrigins,
6
+ stateKey: e.stateKey ?? g,
7
+ warningPrefix: e.warningPrefix ?? h
8
+ }), E = (e, t) => c(e)[t], f = (e, t, n) => {
9
+ c(e)[t] = n;
10
+ }, T = (e, t) => {
11
+ delete c(e)[t];
12
+ }, p = (e, t, n = void 0) => {
13
+ if (n === void 0) {
14
+ console.warn(`${e} ${t}`);
15
+ return;
16
+ }
17
+ console.warn(`${e} ${t}`, n);
18
+ }, v = (e, t, n) => {
19
+ const r = E(e, t);
20
+ if (!(n !== void 0 && (r == null ? void 0 : r.ownerToken) !== n)) {
21
+ if (typeof (r == null ? void 0 : r.stop) == "function") {
22
+ r.stop();
23
+ return;
24
+ }
25
+ (r == null ? void 0 : r.starting) === !0 && T(e, t);
26
+ }
27
+ }, R = (e) => {
28
+ try {
29
+ return new URL(e).origin;
30
+ } catch {
31
+ return;
32
+ }
33
+ }, N = (e, t) => {
34
+ const n = R(e);
35
+ return n !== void 0 && t.some((r) => R(r) === n);
36
+ }, _ = (e) => typeof e == "object" && e !== null, b = (e) => {
37
+ if (typeof e == "string")
38
+ try {
39
+ const t = JSON.parse(e);
40
+ return _(t) ? t : void 0;
41
+ } catch {
42
+ return;
43
+ }
44
+ return _(e) ? e : void 0;
45
+ }, P = (e) => {
46
+ const t = b(e);
47
+ return (t == null ? void 0 : t.channel) === y;
48
+ }, S = (e) => new MessageEvent("message", {
49
+ data: e.data,
50
+ origin: e.origin,
51
+ lastEventId: e.lastEventId,
52
+ source: e.source,
53
+ ports: [...e.ports]
54
+ }), K = (e, t) => {
55
+ const n = [], r = (o) => {
56
+ !N(o.origin, t) || !P(o.data) || n.push(o);
57
+ };
58
+ return e.addEventListener("message", r), {
59
+ dispose: () => {
60
+ e.removeEventListener("message", r);
61
+ },
62
+ replay: () => {
63
+ e.removeEventListener("message", r), n.forEach((o) => {
64
+ e.dispatchEvent(S(o));
65
+ }), n.length = 0;
66
+ }
67
+ };
68
+ }, L = async (e, t, n, r) => {
69
+ const o = E(e, t.stateKey);
70
+ if ((o == null ? void 0 : o.started) === !0 || (o == null ? void 0 : o.starting) === !0 || !t.enabled)
71
+ return;
72
+ if (t.hostOrigins.length === 0) {
73
+ p(
74
+ t.warningPrefix,
75
+ "Inspector is enabled but no trusted host origins are configured."
76
+ );
77
+ return;
78
+ }
79
+ const I = K(
80
+ e,
81
+ t.hostOrigins
82
+ );
83
+ let d, s, u = !1, l = !1;
84
+ const i = () => {
85
+ var a;
86
+ l || (l = !0, I.dispose(), e.removeEventListener("beforeunload", i), u && (s == null || s.stop()), u && s !== null && s !== void 0 && c(e).__ITERA_ITERATION_INSPECTOR_RUNTIME__ === s && delete c(e).__ITERA_ITERATION_INSPECTOR_RUNTIME__, d == null || d.destroy(), ((a = E(e, t.stateKey)) == null ? void 0 : a.stop) === i && T(e, t.stateKey));
87
+ };
88
+ f(e, t.stateKey, {
89
+ starting: !0,
90
+ ownerToken: n,
91
+ stop: i
92
+ }), e.addEventListener("beforeunload", i);
93
+ try {
94
+ d = m({
95
+ enabled: !0,
96
+ hostOrigins: t.hostOrigins
97
+ }), I.replay();
98
+ const a = await import("@iteraai/react-component-inspector/iterationInspector");
99
+ if (r() || l) {
100
+ i();
101
+ return;
102
+ }
103
+ const O = c(e).__ITERA_ITERATION_INSPECTOR_RUNTIME__;
104
+ s = a.bootIterationInspectorRuntime(), u = s != null && s !== O, f(e, t.stateKey, {
105
+ started: !0,
106
+ ownerToken: n,
107
+ stop: i
108
+ });
109
+ } catch (a) {
110
+ i(), p(
111
+ t.warningPrefix,
112
+ "Failed to start the React inspector runtime.",
113
+ a
114
+ );
115
+ }
116
+ }, C = (e) => {
117
+ if (typeof window > "u")
118
+ return () => {
119
+ };
120
+ const t = A(e), n = Symbol("iteraReactInspectorViteBootstrap");
121
+ let r = !1;
122
+ return L(window, t, n, () => r), () => {
123
+ r = !0, v(window, t.stateKey, n);
124
+ };
125
+ }, w = (e = {}) => {
126
+ typeof window > "u" || v(
127
+ window,
128
+ e.stateKey ?? g
129
+ );
130
+ };
131
+ export {
132
+ C as bootIteraReactInspectorViteRuntime,
133
+ w as stopIteraReactInspectorViteRuntime
134
+ };
135
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sources":["../src/client.ts"],"sourcesContent":["import { INSPECTOR_CHANNEL } from '@iteraai/inspector-protocol';\nimport { bootstrapEmbeddedInspectorBridge } from '@iteraai/react-component-inspector/embeddedBootstrap';\nimport type { IterationInspectorRuntime } from '@iteraai/react-component-inspector/iterationInspector';\n\nexport type IteraReactInspectorViteRuntimeOptions = {\n enabled: boolean;\n hostOrigins: readonly string[];\n stateKey?: string;\n warningPrefix?: string;\n};\n\ntype InspectorBridge = {\n destroy: () => void;\n};\n\ntype BootstrapOwnerToken = symbol;\n\ntype BootstrapState =\n | {\n starting: true;\n started?: false;\n ownerToken: BootstrapOwnerToken;\n stop: () => void;\n }\n | {\n starting?: false;\n started: true;\n ownerToken: BootstrapOwnerToken;\n stop: () => void;\n };\n\ntype WindowWithInspectorRuntimeState = Window &\n Record<string, BootstrapState | undefined> & {\n __ITERA_ITERATION_INSPECTOR_RUNTIME__?: IterationInspectorRuntime;\n };\n\nconst DEFAULT_BOOTSTRAP_STATE_KEY = '__ITERA_REACT_INSPECTOR_VITE_BOOTSTRAP__';\nconst DEFAULT_WARNING_PREFIX = '[itera-vite-plugin-react-inspector]';\n\nconst toRuntimeWindow = (win: Window): WindowWithInspectorRuntimeState => {\n return win as WindowWithInspectorRuntimeState;\n};\n\nconst resolveRuntimeOptions = (\n options: IteraReactInspectorViteRuntimeOptions,\n) => {\n return {\n enabled: options.enabled,\n hostOrigins: options.hostOrigins,\n stateKey: options.stateKey ?? DEFAULT_BOOTSTRAP_STATE_KEY,\n warningPrefix: options.warningPrefix ?? DEFAULT_WARNING_PREFIX,\n };\n};\n\nconst readBootstrapState = (\n win: Window,\n stateKey: string,\n): BootstrapState | undefined => {\n return toRuntimeWindow(win)[stateKey];\n};\n\nconst writeBootstrapState = (\n win: Window,\n stateKey: string,\n state: BootstrapState,\n) => {\n toRuntimeWindow(win)[stateKey] = state;\n};\n\nconst clearBootstrapState = (win: Window, stateKey: string) => {\n delete toRuntimeWindow(win)[stateKey];\n};\n\nconst warn = (\n warningPrefix: string,\n message: string,\n error: unknown = undefined,\n) => {\n if (error === undefined) {\n console.warn(`${warningPrefix} ${message}`);\n return;\n }\n\n console.warn(`${warningPrefix} ${message}`, error);\n};\n\nconst stopActiveBootstrap = (\n win: Window,\n stateKey: string,\n ownerToken?: BootstrapOwnerToken,\n) => {\n const state = readBootstrapState(win, stateKey);\n\n if (ownerToken !== undefined && state?.ownerToken !== ownerToken) {\n return;\n }\n\n if (typeof state?.stop === 'function') {\n state.stop();\n return;\n }\n\n if (state?.starting === true) {\n clearBootstrapState(win, stateKey);\n }\n};\n\nconst resolveOrigin = (originOrUrl: string) => {\n try {\n return new URL(originOrUrl).origin;\n } catch {\n return undefined;\n }\n};\n\nconst isTrustedOrigin = (\n origin: string,\n trustedOrigins: readonly string[],\n) => {\n const resolvedOrigin = resolveOrigin(origin);\n\n return (\n resolvedOrigin !== undefined &&\n trustedOrigins.some((trustedOrigin) => {\n return resolveOrigin(trustedOrigin) === resolvedOrigin;\n })\n );\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return typeof value === 'object' && value !== null;\n};\n\nconst toRawMessageObject = (\n rawMessage: unknown,\n): Record<string, unknown> | undefined => {\n if (typeof rawMessage === 'string') {\n try {\n const parsedMessage = JSON.parse(rawMessage) as unknown;\n\n return isRecord(parsedMessage) ? parsedMessage : undefined;\n } catch {\n return undefined;\n }\n }\n\n return isRecord(rawMessage) ? rawMessage : undefined;\n};\n\nconst isInspectorChannelMessage = (data: unknown) => {\n const messageObject = toRawMessageObject(data);\n\n return messageObject?.channel === INSPECTOR_CHANNEL;\n};\n\nconst cloneMessageEvent = (event: MessageEvent) => {\n return new MessageEvent('message', {\n data: event.data,\n origin: event.origin,\n lastEventId: event.lastEventId,\n source: event.source,\n ports: [...event.ports],\n });\n};\n\nconst createEarlyInspectorMessageQueue = (\n win: Window,\n trustedOrigins: readonly string[],\n) => {\n const queuedEvents: MessageEvent[] = [];\n\n const onMessage = (event: MessageEvent) => {\n if (\n !isTrustedOrigin(event.origin, trustedOrigins) ||\n !isInspectorChannelMessage(event.data)\n ) {\n return;\n }\n\n queuedEvents.push(event);\n };\n\n win.addEventListener('message', onMessage);\n\n return {\n dispose: () => {\n win.removeEventListener('message', onMessage);\n },\n replay: () => {\n win.removeEventListener('message', onMessage);\n\n queuedEvents.forEach((event) => {\n win.dispatchEvent(cloneMessageEvent(event));\n });\n queuedEvents.length = 0;\n },\n };\n};\n\nconst startRuntime = async (\n win: Window,\n options: ReturnType<typeof resolveRuntimeOptions>,\n ownerToken: BootstrapOwnerToken,\n isDisposed: () => boolean,\n) => {\n const existingState = readBootstrapState(win, options.stateKey);\n\n if (existingState?.started === true || existingState?.starting === true) {\n return;\n }\n\n if (!options.enabled) {\n return;\n }\n\n if (options.hostOrigins.length === 0) {\n warn(\n options.warningPrefix,\n 'Inspector is enabled but no trusted host origins are configured.',\n );\n return;\n }\n\n const earlyInspectorMessages = createEarlyInspectorMessageQueue(\n win,\n options.hostOrigins,\n );\n let bridge: InspectorBridge | undefined;\n let runtime: IterationInspectorRuntime | null | undefined;\n let ownsIterationRuntime = false;\n let stopped = false;\n\n const stop = () => {\n if (stopped) {\n return;\n }\n\n stopped = true;\n earlyInspectorMessages.dispose();\n win.removeEventListener('beforeunload', stop);\n if (ownsIterationRuntime) {\n runtime?.stop();\n }\n\n if (\n ownsIterationRuntime &&\n runtime !== null &&\n runtime !== undefined &&\n toRuntimeWindow(win).__ITERA_ITERATION_INSPECTOR_RUNTIME__ === runtime\n ) {\n delete toRuntimeWindow(win).__ITERA_ITERATION_INSPECTOR_RUNTIME__;\n }\n\n bridge?.destroy();\n\n if (readBootstrapState(win, options.stateKey)?.stop === stop) {\n clearBootstrapState(win, options.stateKey);\n }\n };\n\n writeBootstrapState(win, options.stateKey, {\n starting: true,\n ownerToken,\n stop,\n });\n win.addEventListener('beforeunload', stop);\n\n try {\n bridge = bootstrapEmbeddedInspectorBridge({\n enabled: true,\n hostOrigins: options.hostOrigins,\n });\n earlyInspectorMessages.replay();\n\n const iterationModule = await import(\n '@iteraai/react-component-inspector/iterationInspector'\n );\n\n if (isDisposed() || stopped) {\n stop();\n return;\n }\n\n const existingIterationRuntime =\n toRuntimeWindow(win).__ITERA_ITERATION_INSPECTOR_RUNTIME__;\n\n runtime = iterationModule.bootIterationInspectorRuntime();\n ownsIterationRuntime =\n runtime !== null &&\n runtime !== undefined &&\n runtime !== existingIterationRuntime;\n\n writeBootstrapState(win, options.stateKey, {\n started: true,\n ownerToken,\n stop,\n });\n } catch (error) {\n stop();\n\n warn(\n options.warningPrefix,\n 'Failed to start the React inspector runtime.',\n error,\n );\n }\n};\n\nexport const bootIteraReactInspectorViteRuntime = (\n options: IteraReactInspectorViteRuntimeOptions,\n) => {\n if (typeof window === 'undefined') {\n return () => undefined;\n }\n\n const resolvedOptions = resolveRuntimeOptions(options);\n const ownerToken = Symbol('iteraReactInspectorViteBootstrap');\n let disposed = false;\n\n void startRuntime(window, resolvedOptions, ownerToken, () => disposed);\n\n return () => {\n disposed = true;\n stopActiveBootstrap(window, resolvedOptions.stateKey, ownerToken);\n };\n};\n\nexport const stopIteraReactInspectorViteRuntime = (\n options: Pick<IteraReactInspectorViteRuntimeOptions, 'stateKey'> = {},\n) => {\n if (typeof window === 'undefined') {\n return;\n }\n\n stopActiveBootstrap(\n window,\n options.stateKey ?? DEFAULT_BOOTSTRAP_STATE_KEY,\n );\n};\n"],"names":["DEFAULT_BOOTSTRAP_STATE_KEY","DEFAULT_WARNING_PREFIX","toRuntimeWindow","win","resolveRuntimeOptions","options","readBootstrapState","stateKey","writeBootstrapState","state","clearBootstrapState","warn","warningPrefix","message","error","stopActiveBootstrap","ownerToken","resolveOrigin","originOrUrl","isTrustedOrigin","origin","trustedOrigins","resolvedOrigin","trustedOrigin","isRecord","value","toRawMessageObject","rawMessage","parsedMessage","isInspectorChannelMessage","data","messageObject","INSPECTOR_CHANNEL","cloneMessageEvent","event","createEarlyInspectorMessageQueue","queuedEvents","onMessage","startRuntime","isDisposed","existingState","earlyInspectorMessages","bridge","runtime","ownsIterationRuntime","stopped","stop","_a","bootstrapEmbeddedInspectorBridge","iterationModule","existingIterationRuntime","bootIteraReactInspectorViteRuntime","resolvedOptions","disposed","stopIteraReactInspectorViteRuntime"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export { createIteraReactInspectorVitePlugin, iteraReactInspector, type IteraReactInspectorVitePluginOptions, } from './plugin';
package/dist/index.js ADDED
@@ -0,0 +1,112 @@
1
+ import { normalizeOrigin as _ } from "@iteraai/inspector-protocol";
2
+ const i = "virtual:itera-react-inspector-runtime", a = `\0${i}`, R = "VITE_ITERA_COMPONENT_INSPECTOR_ENABLED", u = "VITE_ITERA_COMPONENT_INSPECTOR_HOST_ORIGINS", E = "__ITERA_REACT_INSPECTOR_VITE_BOOTSTRAP__", l = "[itera-vite-plugin-react-inspector]", p = `/@id/__x00__${i}`, m = {
3
+ enabled: !1,
4
+ hostOrigins: []
5
+ }, d = (t) => Array.isArray(t) ? [...t] : typeof t == "string" ? t.split(",") : [], T = (t, e) => t ?? e === "true", f = (t, e) => {
6
+ const r = [], n = [];
7
+ return [
8
+ ...d(t),
9
+ ...d(e)
10
+ ].forEach((I) => {
11
+ const o = I.trim();
12
+ if (o.length === 0)
13
+ return;
14
+ const c = _(o);
15
+ if (c === void 0) {
16
+ n.push(o);
17
+ return;
18
+ }
19
+ r.includes(c) || r.push(c);
20
+ }), {
21
+ hostOrigins: r,
22
+ invalidHostOrigins: n
23
+ };
24
+ }, g = (t, e) => {
25
+ const r = t.env[e];
26
+ return typeof r == "string" ? r : void 0;
27
+ }, O = (t, e) => e.command !== "build" || t.includeInBuild === !0, h = (t, e) => {
28
+ const r = T(
29
+ t.enabled,
30
+ g(e, R)
31
+ ), n = f(
32
+ t.hostOrigins,
33
+ g(e, u)
34
+ );
35
+ return r ? O(t, e) ? (n.invalidHostOrigins.length > 0 && e.logger.warn(
36
+ `${l} Ignoring invalid host origin values: ${n.invalidHostOrigins.join(", ")}`
37
+ ), n.hostOrigins.length === 0 && e.logger.warn(
38
+ `${l} Inspector is enabled but no trusted host origins are configured. Set hostOrigins in createIteraReactInspectorVitePlugin(...) or ${u}.`
39
+ ), {
40
+ enabled: r,
41
+ hostOrigins: n.hostOrigins
42
+ }) : {
43
+ enabled: r,
44
+ hostOrigins: n.hostOrigins
45
+ } : {
46
+ enabled: !1,
47
+ hostOrigins: n.hostOrigins
48
+ };
49
+ }, v = (t, e, r) => r !== void 0 && O(e, r) && t.enabled && t.hostOrigins.length > 0, S = (t, e) => t.length === 0 || t === "/" ? e : `${t.endsWith("/") ? t.slice(0, -1) : t}${e}`, A = (t) => {
50
+ try {
51
+ return new URL(t), !0;
52
+ } catch {
53
+ return !1;
54
+ }
55
+ }, N = (t, e) => t === void 0 || t.length === 0 || A(e) ? e : new URL(e, `${t.replace(/\/$/, "")}/`).toString(), V = (t) => N(
56
+ t.server.origin,
57
+ S(t.base, p)
58
+ ), H = (t) => t.command === "serve" ? {
59
+ tag: "script",
60
+ attrs: {
61
+ type: "module",
62
+ src: V(t)
63
+ },
64
+ injectTo: "head-prepend"
65
+ } : {
66
+ tag: "script",
67
+ attrs: {
68
+ type: "module"
69
+ },
70
+ children: `import ${JSON.stringify(i)};`,
71
+ injectTo: "head-prepend"
72
+ }, P = (t) => `
73
+ import { bootIteraReactInspectorViteRuntime } from '@iteraai/vite-plugin-react-inspector/client';
74
+
75
+ const stop = bootIteraReactInspectorViteRuntime(${JSON.stringify({
76
+ enabled: t.enabled,
77
+ hostOrigins: t.hostOrigins,
78
+ stateKey: E,
79
+ warningPrefix: l
80
+ })});
81
+
82
+ if (import.meta.hot) {
83
+ import.meta.hot.dispose(stop);
84
+ }
85
+
86
+ export {};
87
+ `, b = (t = {}) => {
88
+ let e, r = m;
89
+ return {
90
+ name: "itera-react-inspector-vite-plugin",
91
+ enforce: "pre",
92
+ configResolved(n) {
93
+ e = n, r = h(t, n);
94
+ },
95
+ resolveId(n) {
96
+ return n === i ? a : null;
97
+ },
98
+ load(n) {
99
+ return n !== a ? null : P(r);
100
+ },
101
+ transformIndexHtml(n) {
102
+ const s = e;
103
+ if (s !== void 0 && !(n.includes(i) || !v(r, t, s)))
104
+ return [H(s)];
105
+ }
106
+ };
107
+ }, $ = b;
108
+ export {
109
+ b as createIteraReactInspectorVitePlugin,
110
+ $ as iteraReactInspector
111
+ };
112
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/plugin.ts"],"sourcesContent":["import { normalizeOrigin } from '@iteraai/inspector-protocol';\nimport type { HtmlTagDescriptor, Plugin, ResolvedConfig } from 'vite';\n\nexport type IteraReactInspectorVitePluginOptions = {\n enabled?: boolean;\n hostOrigins?: readonly string[] | string;\n includeInBuild?: boolean;\n};\n\ntype RuntimeOptions = {\n enabled: boolean;\n hostOrigins: readonly string[];\n};\n\ntype HostOriginResolution = {\n hostOrigins: string[];\n invalidHostOrigins: string[];\n};\n\nexport const ITERA_REACT_INSPECTOR_VIRTUAL_MODULE_ID =\n 'virtual:itera-react-inspector-runtime';\nexport const ITERA_REACT_INSPECTOR_RESOLVED_VIRTUAL_MODULE_ID = `\\0${ITERA_REACT_INSPECTOR_VIRTUAL_MODULE_ID}`;\n\nconst ENABLED_ENV_KEY = 'VITE_ITERA_COMPONENT_INSPECTOR_ENABLED';\nconst HOST_ORIGINS_ENV_KEY = 'VITE_ITERA_COMPONENT_INSPECTOR_HOST_ORIGINS';\nconst BOOTSTRAP_STATE_KEY = '__ITERA_REACT_INSPECTOR_VITE_BOOTSTRAP__';\nconst WARNING_PREFIX = '[itera-vite-plugin-react-inspector]';\nconst VITE_BROWSER_RESOLVED_ID_PATH = `/@id/__x00__${ITERA_REACT_INSPECTOR_VIRTUAL_MODULE_ID}`;\n\nconst disabledRuntimeOptions: RuntimeOptions = {\n enabled: false,\n hostOrigins: [],\n};\n\nconst toHostOriginItems = (\n hostOrigins: IteraReactInspectorVitePluginOptions['hostOrigins'],\n) => {\n if (Array.isArray(hostOrigins)) {\n return [...hostOrigins];\n }\n\n if (typeof hostOrigins === 'string') {\n return hostOrigins.split(',');\n }\n\n return [];\n};\n\nexport const resolveInspectorEnabled = (\n optionEnabled: boolean | undefined,\n envEnabled: string | undefined,\n) => {\n return optionEnabled ?? envEnabled === 'true';\n};\n\nexport const resolveInspectorHostOrigins = (\n optionHostOrigins: IteraReactInspectorVitePluginOptions['hostOrigins'],\n envHostOrigins: string | undefined,\n): HostOriginResolution => {\n const hostOrigins: string[] = [];\n const invalidHostOrigins: string[] = [];\n const configuredHostOrigins = [\n ...toHostOriginItems(optionHostOrigins),\n ...toHostOriginItems(envHostOrigins),\n ];\n\n configuredHostOrigins.forEach((hostOrigin) => {\n const trimmedHostOrigin = hostOrigin.trim();\n\n if (trimmedHostOrigin.length === 0) {\n return;\n }\n\n const normalizedHostOrigin = normalizeOrigin(trimmedHostOrigin);\n\n if (normalizedHostOrigin === undefined) {\n invalidHostOrigins.push(trimmedHostOrigin);\n return;\n }\n\n if (!hostOrigins.includes(normalizedHostOrigin)) {\n hostOrigins.push(normalizedHostOrigin);\n }\n });\n\n return {\n hostOrigins,\n invalidHostOrigins,\n };\n};\n\nconst getEnvString = (config: ResolvedConfig, key: string) => {\n const value = config.env[key];\n\n return typeof value === 'string' ? value : undefined;\n};\n\nconst allowsHtmlInjection = (\n options: IteraReactInspectorVitePluginOptions,\n config: ResolvedConfig,\n) => {\n return config.command !== 'build' || options.includeInBuild === true;\n};\n\nexport const resolveRuntimeOptions = (\n options: IteraReactInspectorVitePluginOptions,\n config: ResolvedConfig,\n): RuntimeOptions => {\n const enabled = resolveInspectorEnabled(\n options.enabled,\n getEnvString(config, ENABLED_ENV_KEY),\n );\n const hostOriginResolution = resolveInspectorHostOrigins(\n options.hostOrigins,\n getEnvString(config, HOST_ORIGINS_ENV_KEY),\n );\n\n if (!enabled) {\n return {\n enabled: false,\n hostOrigins: hostOriginResolution.hostOrigins,\n };\n }\n\n if (!allowsHtmlInjection(options, config)) {\n return {\n enabled,\n hostOrigins: hostOriginResolution.hostOrigins,\n };\n }\n\n if (hostOriginResolution.invalidHostOrigins.length > 0) {\n config.logger.warn(\n `${WARNING_PREFIX} Ignoring invalid host origin values: ${hostOriginResolution.invalidHostOrigins.join(', ')}`,\n );\n }\n\n if (hostOriginResolution.hostOrigins.length === 0) {\n config.logger.warn(\n `${WARNING_PREFIX} Inspector is enabled but no trusted host origins are configured. Set hostOrigins in createIteraReactInspectorVitePlugin(...) or ${HOST_ORIGINS_ENV_KEY}.`,\n );\n }\n\n return {\n enabled,\n hostOrigins: hostOriginResolution.hostOrigins,\n };\n};\n\nconst shouldInjectRuntime = (\n runtimeOptions: RuntimeOptions,\n pluginOptions: IteraReactInspectorVitePluginOptions,\n config: ResolvedConfig | undefined,\n) => {\n return (\n config !== undefined &&\n allowsHtmlInjection(pluginOptions, config) &&\n runtimeOptions.enabled &&\n runtimeOptions.hostOrigins.length > 0\n );\n};\n\nconst prefixViteBase = (base: string, path: string) => {\n if (base.length === 0 || base === '/') {\n return path;\n }\n\n const normalizedBase = base.endsWith('/') ? base.slice(0, -1) : base;\n\n return `${normalizedBase}${path}`;\n};\n\nconst isAbsoluteUrl = (value: string) => {\n try {\n new URL(value);\n\n return true;\n } catch {\n return false;\n }\n};\n\nconst prefixViteServerOrigin = (\n serverOrigin: string | undefined,\n path: string,\n) => {\n if (\n serverOrigin === undefined ||\n serverOrigin.length === 0 ||\n isAbsoluteUrl(path)\n ) {\n return path;\n }\n\n return new URL(path, `${serverOrigin.replace(/\\/$/, '')}/`).toString();\n};\n\nconst resolveDevRuntimeModuleSrc = (config: ResolvedConfig) => {\n return prefixViteServerOrigin(\n config.server.origin,\n prefixViteBase(config.base, VITE_BROWSER_RESOLVED_ID_PATH),\n );\n};\n\nconst createRuntimeHtmlTag = (config: ResolvedConfig): HtmlTagDescriptor => {\n if (config.command === 'serve') {\n return {\n tag: 'script',\n attrs: {\n type: 'module',\n src: resolveDevRuntimeModuleSrc(config),\n },\n injectTo: 'head-prepend',\n };\n }\n\n return {\n tag: 'script',\n attrs: {\n type: 'module',\n },\n children: `import ${JSON.stringify(ITERA_REACT_INSPECTOR_VIRTUAL_MODULE_ID)};`,\n injectTo: 'head-prepend',\n };\n};\n\nexport const createRuntimeModuleCode = (runtimeOptions: RuntimeOptions) => {\n const serializedOptions = JSON.stringify({\n enabled: runtimeOptions.enabled,\n hostOrigins: runtimeOptions.hostOrigins,\n stateKey: BOOTSTRAP_STATE_KEY,\n warningPrefix: WARNING_PREFIX,\n });\n\n return `\nimport { bootIteraReactInspectorViteRuntime } from '@iteraai/vite-plugin-react-inspector/client';\n\nconst stop = bootIteraReactInspectorViteRuntime(${serializedOptions});\n\nif (import.meta.hot) {\n import.meta.hot.dispose(stop);\n}\n\nexport {};\n`;\n};\n\nexport const createIteraReactInspectorVitePlugin = (\n options: IteraReactInspectorVitePluginOptions = {},\n): Plugin => {\n let resolvedConfig: ResolvedConfig | undefined;\n let runtimeOptions = disabledRuntimeOptions;\n\n return {\n name: 'itera-react-inspector-vite-plugin',\n enforce: 'pre',\n configResolved(config) {\n resolvedConfig = config;\n runtimeOptions = resolveRuntimeOptions(options, config);\n },\n resolveId(id) {\n if (id === ITERA_REACT_INSPECTOR_VIRTUAL_MODULE_ID) {\n return ITERA_REACT_INSPECTOR_RESOLVED_VIRTUAL_MODULE_ID;\n }\n\n return null;\n },\n load(id) {\n if (id !== ITERA_REACT_INSPECTOR_RESOLVED_VIRTUAL_MODULE_ID) {\n return null;\n }\n\n return createRuntimeModuleCode(runtimeOptions);\n },\n transformIndexHtml(html) {\n const config = resolvedConfig;\n\n if (config === undefined) {\n return;\n }\n\n if (\n html.includes(ITERA_REACT_INSPECTOR_VIRTUAL_MODULE_ID) ||\n !shouldInjectRuntime(runtimeOptions, options, config)\n ) {\n return;\n }\n\n return [createRuntimeHtmlTag(config)];\n },\n };\n};\n\nexport const iteraReactInspector = createIteraReactInspectorVitePlugin;\n"],"names":["ITERA_REACT_INSPECTOR_VIRTUAL_MODULE_ID","ITERA_REACT_INSPECTOR_RESOLVED_VIRTUAL_MODULE_ID","ENABLED_ENV_KEY","HOST_ORIGINS_ENV_KEY","BOOTSTRAP_STATE_KEY","WARNING_PREFIX","VITE_BROWSER_RESOLVED_ID_PATH","disabledRuntimeOptions","toHostOriginItems","hostOrigins","resolveInspectorEnabled","optionEnabled","envEnabled","resolveInspectorHostOrigins","optionHostOrigins","envHostOrigins","invalidHostOrigins","hostOrigin","trimmedHostOrigin","normalizedHostOrigin","normalizeOrigin","getEnvString","config","key","value","allowsHtmlInjection","options","resolveRuntimeOptions","enabled","hostOriginResolution","shouldInjectRuntime","runtimeOptions","pluginOptions","prefixViteBase","base","path","isAbsoluteUrl","prefixViteServerOrigin","serverOrigin","resolveDevRuntimeModuleSrc","createRuntimeHtmlTag","createRuntimeModuleCode","createIteraReactInspectorVitePlugin","resolvedConfig","id","html","iteraReactInspector"],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { Plugin, ResolvedConfig } from 'vite';
2
+ export type IteraReactInspectorVitePluginOptions = {
3
+ enabled?: boolean;
4
+ hostOrigins?: readonly string[] | string;
5
+ includeInBuild?: boolean;
6
+ };
7
+ type RuntimeOptions = {
8
+ enabled: boolean;
9
+ hostOrigins: readonly string[];
10
+ };
11
+ type HostOriginResolution = {
12
+ hostOrigins: string[];
13
+ invalidHostOrigins: string[];
14
+ };
15
+ export declare const ITERA_REACT_INSPECTOR_VIRTUAL_MODULE_ID = "virtual:itera-react-inspector-runtime";
16
+ export declare const ITERA_REACT_INSPECTOR_RESOLVED_VIRTUAL_MODULE_ID = "\0virtual:itera-react-inspector-runtime";
17
+ export declare const resolveInspectorEnabled: (optionEnabled: boolean | undefined, envEnabled: string | undefined) => boolean;
18
+ export declare const resolveInspectorHostOrigins: (optionHostOrigins: IteraReactInspectorVitePluginOptions["hostOrigins"], envHostOrigins: string | undefined) => HostOriginResolution;
19
+ export declare const resolveRuntimeOptions: (options: IteraReactInspectorVitePluginOptions, config: ResolvedConfig) => RuntimeOptions;
20
+ export declare const createRuntimeModuleCode: (runtimeOptions: RuntimeOptions) => string;
21
+ export declare const createIteraReactInspectorVitePlugin: (options?: IteraReactInspectorVitePluginOptions) => Plugin;
22
+ export declare const iteraReactInspector: (options?: IteraReactInspectorVitePluginOptions) => Plugin;
23
+ export {};
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@iteraai/vite-plugin-react-inspector",
3
+ "version": "0.1.0",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "description": "Vite plugin that injects the Itera React component inspector runtime into React-Vite apps.",
7
+ "main": "./dist/index.js",
8
+ "module": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "sideEffects": false,
11
+ "files": [
12
+ "dist",
13
+ "README.md"
14
+ ],
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/index.d.ts",
18
+ "import": "./dist/index.js"
19
+ },
20
+ "./client": {
21
+ "types": "./dist/client.d.ts",
22
+ "import": "./dist/client.js"
23
+ }
24
+ },
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "git+https://github.com/iteraai/component-inspector.git",
28
+ "directory": "packages/vite-plugin-react-inspector"
29
+ },
30
+ "bugs": {
31
+ "url": "https://github.com/iteraai/component-inspector/issues"
32
+ },
33
+ "homepage": "https://github.com/iteraai/component-inspector/tree/main/packages/vite-plugin-react-inspector#readme",
34
+ "publishConfig": {
35
+ "access": "public"
36
+ },
37
+ "scripts": {
38
+ "build": "vite build",
39
+ "prepack": "npm run build",
40
+ "type-check": "tsc --noEmit",
41
+ "test": "vitest run",
42
+ "test:watch": "vitest watch",
43
+ "lint": "eslint . --fix",
44
+ "lint:ci": "eslint . --max-warnings=0"
45
+ },
46
+ "dependencies": {
47
+ "@iteraai/inspector-protocol": "0.1.0",
48
+ "@iteraai/react-component-inspector": "0.4.1"
49
+ },
50
+ "peerDependencies": {
51
+ "react": "^18.3.0 || ^19.0.0",
52
+ "react-dom": "^18.3.0 || ^19.0.0",
53
+ "vite": "^5.0.0 || ^6.0.0"
54
+ },
55
+ "devDependencies": {
56
+ "@eslint/js": "^9.19.0",
57
+ "@stylistic/eslint-plugin-ts": "^4.2.0",
58
+ "@types/node": "^22.13.1",
59
+ "eslint": "^9.20.1",
60
+ "eslint-config-prettier": "^10.0.1",
61
+ "eslint-plugin-unicorn": "^58.0.0",
62
+ "globals": "^15.14.0",
63
+ "typescript": "~5.6.2",
64
+ "typescript-eslint": "^8.23.0",
65
+ "vite": "^6.0.5",
66
+ "vite-plugin-dts": "^4.5.4",
67
+ "vitest": "^3.0.8"
68
+ }
69
+ }