@gridland/web 0.2.16 → 0.2.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.js +99 -10
  3. package/dist/index.js.map +4 -4
  4. package/dist/vite-plugin.js +68 -37
  5. package/dist/vite-plugin.js.map +1 -1
  6. package/package.json +5 -4
  7. package/src/browser-buffer.ts +715 -0
  8. package/src/core-shims/index.ts +269 -0
  9. package/src/core-shims/renderable-types.ts +4 -0
  10. package/src/core-shims/rgba.ts +195 -0
  11. package/src/core-shims/types.ts +132 -0
  12. package/src/shims/bun-ffi-structs.ts +20 -0
  13. package/src/shims/bun-ffi.ts +28 -0
  14. package/src/shims/console-stub.ts +13 -0
  15. package/src/shims/console.ts +3 -0
  16. package/src/shims/devtools-polyfill-stub.ts +3 -0
  17. package/src/shims/edit-buffer-stub.ts +475 -0
  18. package/src/shims/editor-view-stub.ts +388 -0
  19. package/src/shims/events-shim.ts +81 -0
  20. package/src/shims/filters-stub.ts +4 -0
  21. package/src/shims/hast-stub.ts +8 -0
  22. package/src/shims/native-span-feed-stub.ts +7 -0
  23. package/src/shims/node-buffer.ts +39 -0
  24. package/src/shims/node-fs.ts +20 -0
  25. package/src/shims/node-os.ts +6 -0
  26. package/src/shims/node-path.ts +35 -0
  27. package/src/shims/node-stream.ts +10 -0
  28. package/src/shims/node-url.ts +8 -0
  29. package/src/shims/node-util.ts +33 -0
  30. package/src/shims/renderer-stub.ts +21 -0
  31. package/src/shims/slider-deps.ts +8 -0
  32. package/src/shims/syntax-style-shim.ts +23 -0
  33. package/src/shims/text-buffer-shim.ts +3 -0
  34. package/src/shims/text-buffer-view-shim.ts +2 -0
  35. package/src/shims/timeline-stub.ts +43 -0
  36. package/src/shims/tree-sitter-stub.ts +47 -0
  37. package/src/shims/tree-sitter-styled-text-stub.ts +8 -0
  38. package/src/shims/zig-stub.ts +20 -0
@@ -1,5 +1,6 @@
1
1
  // src/vite-plugin.ts
2
2
  import path from "path";
3
+ import { existsSync } from "fs";
3
4
  import { createRequire } from "module";
4
5
  import { fileURLToPath } from "url";
5
6
  var __filename = fileURLToPath(import.meta.url);
@@ -7,17 +8,30 @@ var __dirname = path.dirname(__filename);
7
8
  function gridlandWebPlugin() {
8
9
  const pkgRoot = path.resolve(__dirname, "..");
9
10
  const _require = createRequire(path.resolve(pkgRoot, "package.json"));
11
+ const _projectRequire = createRequire(path.resolve(process.cwd(), "package.json"));
10
12
  function resolvePackageRoot(pkg, fallbackRelative) {
11
- try {
12
- const pkgJson = _require.resolve(`${pkg}/package.json`);
13
- return path.dirname(pkgJson);
14
- } catch {
15
- return path.resolve(pkgRoot, fallbackRelative);
13
+ for (const req of [_projectRequire, _require]) {
14
+ try {
15
+ const pkgJson = req.resolve(`${pkg}/package.json`);
16
+ return path.dirname(pkgJson);
17
+ } catch {
18
+ try {
19
+ const entry = req.resolve(pkg);
20
+ let dir = path.dirname(entry);
21
+ for (let i = 0; i < 5; i++) {
22
+ if (existsSync(path.join(dir, "package.json"))) return dir;
23
+ dir = path.dirname(dir);
24
+ }
25
+ } catch {
26
+ }
27
+ }
16
28
  }
29
+ return path.resolve(pkgRoot, fallbackRelative);
17
30
  }
18
31
  const coreRoot = resolvePackageRoot("@opentui/core", "../../opentui/packages/core");
19
32
  const reactRoot = resolvePackageRoot("@opentui/react", "../../opentui/packages/react");
20
33
  const uiRoot = resolvePackageRoot("@opentui/ui", "../../opentui/packages/ui");
34
+ const hasSource = existsSync(path.resolve(reactRoot, "src/index.ts"));
21
35
  const coreShims = path.resolve(pkgRoot, "src/core-shims/index.ts");
22
36
  const opentuiCoreBarrel = path.resolve(coreRoot, "src/index.ts");
23
37
  const sliderDeps = path.resolve(pkgRoot, "src/shims/slider-deps.ts");
@@ -59,6 +73,7 @@ function gridlandWebPlugin() {
59
73
  "node:stream": "src/shims/node-stream.ts",
60
74
  url: "src/shims/node-url.ts",
61
75
  "node:url": "src/shims/node-url.ts",
76
+ console: "src/shims/console.ts",
62
77
  bun: "src/shims/bun-ffi.ts"
63
78
  };
64
79
  const NPM_REDIRECT = "\0npm-redirect:";
@@ -68,29 +83,31 @@ function gridlandWebPlugin() {
68
83
  resolveId(source, importer) {
69
84
  if (!importer) return null;
70
85
  if (importer.startsWith(NPM_REDIRECT)) return null;
71
- const isExternalOpentui = importer.startsWith(coreRoot + path.sep) || importer.startsWith(reactRoot + path.sep) || importer.startsWith(uiRoot + path.sep);
72
- if (source === "../index" && importer === sliderFile) {
86
+ const isExternalOpentui = importer.startsWith(coreRoot + path.sep) || importer.startsWith(reactRoot + path.sep) || importer.startsWith(uiRoot + path.sep) || importer.includes("/@opentui/core/") || importer.includes("/@opentui/react/") || importer.includes("/@opentui/ui/");
87
+ if (hasSource && source === "../index" && importer === sliderFile) {
73
88
  return sliderDeps;
74
89
  }
75
- if (source === "@opentui/ui") {
76
- return path.resolve(uiRoot, "src/index.ts");
77
- }
78
- if (source === "@opentui/react") {
79
- return path.resolve(reactRoot, "src/index.ts");
80
- }
81
- if (source === "@opentui/core") {
82
- if (importer.startsWith(reactRoot + path.sep)) {
83
- return opentuiCoreBarrel;
90
+ if (hasSource) {
91
+ if (source === "@opentui/ui") {
92
+ return path.resolve(uiRoot, "src/index.ts");
84
93
  }
85
- return coreShims;
86
- }
87
- if (source.startsWith("@opentui/")) {
88
- const parts = source.split("/");
89
- const pkgName = parts[1];
90
- const subpath = parts.slice(2).join("/");
91
- if (subpath) {
92
- const root = pkgRoots[pkgName];
93
- if (root) return path.resolve(root, subpath + ".js");
94
+ if (source === "@opentui/react") {
95
+ return path.resolve(reactRoot, "src/index.ts");
96
+ }
97
+ if (source === "@opentui/core") {
98
+ if (importer.startsWith(reactRoot + path.sep)) {
99
+ return opentuiCoreBarrel;
100
+ }
101
+ return coreShims;
102
+ }
103
+ if (source.startsWith("@opentui/")) {
104
+ const parts = source.split("/");
105
+ const pkgName = parts[1];
106
+ const subpath = parts.slice(2).join("/");
107
+ if (subpath) {
108
+ const root = pkgRoots[pkgName];
109
+ if (root) return path.resolve(root, subpath + ".js");
110
+ }
94
111
  }
95
112
  }
96
113
  if (source.startsWith(".") && isExternalOpentui) {
@@ -99,17 +116,24 @@ function gridlandWebPlugin() {
99
116
  if (resolved.endsWith("devtools-polyfill")) {
100
117
  return path.resolve(pkgRoot, "src/shims/devtools-polyfill-stub.ts");
101
118
  }
102
- const shim = resolvedCoreShims.get(resolved) || resolvedCoreShims.get(resolved + ".ts");
103
- if (shim) return shim;
104
- const indexShim = resolvedCoreShims.get(resolved + "/index.ts");
105
- if (indexShim) return indexShim;
106
- }
107
- if (source.includes("tree-sitter") && isExternalOpentui) {
108
- if (source.includes("tree-sitter-styled-text")) return styledTextStub;
109
- return treeStub;
119
+ if (hasSource) {
120
+ const shim = resolvedCoreShims.get(resolved) || resolvedCoreShims.get(resolved + ".ts");
121
+ if (shim) return shim;
122
+ const indexShim = resolvedCoreShims.get(resolved + "/index.ts");
123
+ if (indexShim) return indexShim;
124
+ }
110
125
  }
111
- if (source.includes("hast-styled-text") && isExternalOpentui) {
112
- return path.resolve(pkgRoot, "src/shims/hast-stub.ts");
126
+ if (isExternalOpentui) {
127
+ if (source.endsWith(".scm") || source.endsWith(".wasm")) {
128
+ return "\0opentui-asset-stub";
129
+ }
130
+ if (source.includes("tree-sitter")) {
131
+ if (source.includes("tree-sitter-styled-text")) return styledTextStub;
132
+ return treeStub;
133
+ }
134
+ if (source.includes("hast-styled-text")) {
135
+ return path.resolve(pkgRoot, "src/shims/hast-stub.ts");
136
+ }
113
137
  }
114
138
  if (source === "events") {
115
139
  return path.resolve(pkgRoot, "src/shims/events-shim.ts");
@@ -117,12 +141,15 @@ function gridlandWebPlugin() {
117
141
  if (nodeShims[source] && isExternalOpentui) {
118
142
  return path.resolve(pkgRoot, nodeShims[source]);
119
143
  }
120
- if (!source.startsWith(".") && !source.startsWith("/") && !source.startsWith("@opentui/") && isExternalOpentui) {
144
+ if (hasSource && !source.startsWith(".") && !source.startsWith("/") && !source.startsWith("@opentui/") && isExternalOpentui) {
121
145
  return NPM_REDIRECT + source;
122
146
  }
123
147
  return null;
124
148
  },
125
149
  load(id) {
150
+ if (id === "\0opentui-asset-stub") {
151
+ return "export default null;";
152
+ }
126
153
  if (id.startsWith(NPM_REDIRECT)) {
127
154
  const pkg = id.slice(NPM_REDIRECT.length);
128
155
  try {
@@ -180,7 +207,8 @@ function gridlandWebPlugin() {
180
207
  // Pre-bundle npm packages imported by external opentui monorepo code.
181
208
  // These are resolved via virtual module redirects, so Vite's initial
182
209
  // crawl won't discover them — they must be listed explicitly.
183
- include: [
210
+ // Only needed in source mode; compiled npm packages are discovered normally.
211
+ include: hasSource ? [
184
212
  "react",
185
213
  "react-dom",
186
214
  "react-reconciler",
@@ -188,6 +216,9 @@ function gridlandWebPlugin() {
188
216
  "diff",
189
217
  "yoga-layout",
190
218
  "marked"
219
+ ] : [
220
+ "react",
221
+ "react-dom"
191
222
  ]
192
223
  },
193
224
  server: {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/vite-plugin.ts"],"sourcesContent":["import { type Plugin } from \"vite\"\nimport path from \"path\"\nimport { createRequire } from \"module\"\nimport { fileURLToPath } from \"url\"\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = path.dirname(__filename)\n\n/**\n * Vite plugin that sets up module resolution for Gridland.\n * Handles:\n * - Redirecting Zig/FFI imports to browser shims\n * - Resolving @opentui/core, @opentui/react, @opentui/ui\n * - Shimming Node.js built-ins\n * - Breaking circular dependencies\n *\n * Requires @opentui/core, @opentui/react, and @opentui/ui as peer dependencies.\n */\nexport function gridlandWebPlugin(): Plugin[] {\n const pkgRoot = path.resolve(__dirname, \"..\")\n const _require = createRequire(path.resolve(pkgRoot, \"package.json\"))\n\n // Resolve opentui package roots — try installed packages first,\n // fall back to git submodule for monorepo development\n function resolvePackageRoot(pkg: string, fallbackRelative: string): string {\n try {\n const pkgJson = _require.resolve(`${pkg}/package.json`)\n return path.dirname(pkgJson)\n } catch {\n return path.resolve(pkgRoot, fallbackRelative)\n }\n }\n const coreRoot = resolvePackageRoot(\"@opentui/core\", \"../../opentui/packages/core\")\n const reactRoot = resolvePackageRoot(\"@opentui/react\", \"../../opentui/packages/react\")\n const uiRoot = resolvePackageRoot(\"@opentui/ui\", \"../../opentui/packages/ui\")\n\n const coreShims = path.resolve(pkgRoot, \"src/core-shims/index.ts\")\n const opentuiCoreBarrel = path.resolve(coreRoot, \"src/index.ts\")\n const sliderDeps = path.resolve(pkgRoot, \"src/shims/slider-deps.ts\")\n const sliderFile = path.resolve(coreRoot, \"src/renderables/Slider.ts\")\n\n // Map of opentui source files that need browser shims\n const coreFileShims: Record<string, string> = {\n zig: \"src/shims/zig-stub.ts\",\n buffer: \"src/browser-buffer.ts\",\n \"text-buffer\": \"src/shims/text-buffer-shim.ts\",\n \"text-buffer-view\": \"src/shims/text-buffer-view-shim.ts\",\n \"syntax-style\": \"src/shims/syntax-style-shim.ts\",\n renderer: \"src/shims/renderer-stub.ts\",\n console: \"src/shims/console-stub.ts\",\n \"edit-buffer\": \"src/shims/edit-buffer-stub.ts\",\n \"editor-view\": \"src/shims/editor-view-stub.ts\",\n NativeSpanFeed: \"src/shims/native-span-feed-stub.ts\",\n \"post/filters\": \"src/shims/filters-stub.ts\",\n \"animation/Timeline\": \"src/shims/timeline-stub.ts\",\n }\n\n const resolvedCoreShims = new Map<string, string>()\n for (const [key, shimPath] of Object.entries(coreFileShims)) {\n const absoluteTarget = path.resolve(coreRoot, \"src\", key + \".ts\")\n resolvedCoreShims.set(absoluteTarget, path.resolve(pkgRoot, shimPath))\n }\n\n const treeStub = path.resolve(pkgRoot, \"src/shims/tree-sitter-stub.ts\")\n const styledTextStub = path.resolve(pkgRoot, \"src/shims/tree-sitter-styled-text-stub.ts\")\n\n // Lookup tables hoisted out of resolveId to avoid per-call allocation\n const pkgRoots: Record<string, string> = { core: coreRoot, react: reactRoot, ui: uiRoot }\n\n const nodeShims: Record<string, string> = {\n \"node:buffer\": \"src/shims/node-buffer.ts\",\n \"node:path\": \"src/shims/node-path.ts\",\n path: \"src/shims/node-path.ts\",\n \"node:fs\": \"src/shims/node-fs.ts\",\n fs: \"src/shims/node-fs.ts\",\n \"fs/promises\": \"src/shims/node-fs.ts\",\n \"node:util\": \"src/shims/node-util.ts\",\n util: \"src/shims/node-util.ts\",\n os: \"src/shims/node-os.ts\",\n \"node:os\": \"src/shims/node-os.ts\",\n stream: \"src/shims/node-stream.ts\",\n \"node:stream\": \"src/shims/node-stream.ts\",\n url: \"src/shims/node-url.ts\",\n \"node:url\": \"src/shims/node-url.ts\",\n bun: \"src/shims/bun-ffi.ts\",\n }\n\n // Virtual module prefix for npm package redirects.\n // When external opentui code imports a bare npm package (e.g. \"react\"),\n // we can't return the raw file path because Vite would serve it via /@fs/\n // without CJS-to-ESM conversion. Instead, we return a virtual module that\n // re-exports from the bare package name, which Vite processes through its\n // normal pre-bundling pipeline (including CJS conversion).\n const NPM_REDIRECT = \"\\0npm-redirect:\"\n\n const shimPlugin: Plugin = {\n name: \"gridland-web-shims\",\n enforce: \"pre\",\n resolveId(source, importer) {\n if (!importer) return null\n\n // Virtual module redirects should not be re-intercepted\n if (importer.startsWith(NPM_REDIRECT)) return null\n\n // Check if importer is in an opentui package\n const isExternalOpentui =\n importer.startsWith(coreRoot + path.sep) ||\n importer.startsWith(reactRoot + path.sep) ||\n importer.startsWith(uiRoot + path.sep)\n\n // Slider circular dep fix\n if (source === \"../index\" && importer === sliderFile) {\n return sliderDeps\n }\n\n // Resolve @opentui packages\n if (source === \"@opentui/ui\") {\n return path.resolve(uiRoot, \"src/index.ts\")\n }\n if (source === \"@opentui/react\") {\n return path.resolve(reactRoot, \"src/index.ts\")\n }\n\n // @opentui/core routing\n if (source === \"@opentui/core\") {\n if (importer.startsWith(reactRoot + path.sep)) {\n return opentuiCoreBarrel\n }\n return coreShims\n }\n\n // @opentui/* subpath imports (e.g. @opentui/react/jsx-dev-runtime)\n if (source.startsWith(\"@opentui/\")) {\n const parts = source.split(\"/\")\n const pkgName = parts[1] // \"react\", \"core\", \"ui\"\n const subpath = parts.slice(2).join(\"/\") // \"jsx-dev-runtime\"\n if (subpath) {\n const root = pkgRoots[pkgName]\n if (root) return path.resolve(root, subpath + \".js\")\n }\n }\n\n // Relative imports from opentui tree → check shims\n if (source.startsWith(\".\") && isExternalOpentui) {\n const importerDir = path.dirname(importer)\n const resolved = path.resolve(importerDir, source)\n // Devtools polyfill stub (uses top-level await for ws import)\n if (resolved.endsWith(\"devtools-polyfill\")) {\n return path.resolve(pkgRoot, \"src/shims/devtools-polyfill-stub.ts\")\n }\n const shim = resolvedCoreShims.get(resolved) || resolvedCoreShims.get(resolved + \".ts\")\n if (shim) return shim\n const indexShim = resolvedCoreShims.get(resolved + \"/index.ts\")\n if (indexShim) return indexShim\n }\n\n // Tree-sitter stubs\n if (source.includes(\"tree-sitter\") && isExternalOpentui) {\n if (source.includes(\"tree-sitter-styled-text\")) return styledTextStub\n return treeStub\n }\n if (source.includes(\"hast-styled-text\") && isExternalOpentui) {\n return path.resolve(pkgRoot, \"src/shims/hast-stub.ts\")\n }\n\n // Events shim — applies to ALL importers (browser-compatible EventEmitter)\n if (source === \"events\") {\n return path.resolve(pkgRoot, \"src/shims/events-shim.ts\")\n }\n\n // Node.js built-in stubs (only for imports from the opentui monorepo,\n // since our own workspace code doesn't import these)\n if (nodeShims[source] && isExternalOpentui) {\n return path.resolve(pkgRoot, nodeShims[source])\n }\n\n // Redirect bare npm imports from external opentui to virtual modules.\n // The virtual module re-exports from the bare package name, which lets\n // Vite's normal resolver + pre-bundler handle CJS-to-ESM conversion.\n // Skip @opentui/* since those are resolved above to monorepo source files.\n if (!source.startsWith(\".\") && !source.startsWith(\"/\") && !source.startsWith(\"@opentui/\") && isExternalOpentui) {\n return NPM_REDIRECT + source\n }\n\n return null\n },\n load(id) {\n if (id.startsWith(NPM_REDIRECT)) {\n const pkg = id.slice(NPM_REDIRECT.length)\n // Discover export names by require()-ing the module at build time.\n // We use `import * as __ns` (namespace import) which works for both\n // ESM packages (named exports on namespace) and CJS packages\n // (pre-bundled with only a default export, properties on __ns.default).\n // Each property checks both locations with a fallback.\n // NOTE: We use bare specifiers (not resolved paths) so Vite routes\n // these through its pre-bundling pipeline for CJS-to-ESM conversion.\n try {\n const mod = _require(pkg)\n if (typeof mod === \"object\" && mod !== null) {\n const names = Object.keys(mod).filter(\n (k) => k !== \"default\" && k !== \"__esModule\" && /^[a-zA-Z_$][\\w$]*$/.test(k),\n )\n if (names.length > 0) {\n return [\n `import * as __ns from \"${pkg}\";`,\n `export default __ns.default ?? __ns;`,\n ...names.map(\n (n) => `export const ${n} = __ns[\"${n}\"] ?? __ns.default?.[\"${n}\"];`,\n ),\n ].join(\"\\n\")\n }\n }\n } catch {\n // Fall through to generic approach\n }\n // Fallback for packages we can't introspect\n return [\n `export * from \"${pkg}\";`,\n `import * as __ns from \"${pkg}\";`,\n `export default __ns.default ?? __ns;`,\n ].join(\"\\n\")\n }\n },\n }\n\n const aliasPlugin: Plugin = {\n name: \"gridland-web-aliases\",\n config() {\n const aliases: Record<string, string> = {}\n\n // FFI shims\n aliases[\"bun:ffi\"] = path.resolve(pkgRoot, \"src/shims/bun-ffi.ts\")\n aliases[\"bun-ffi-structs\"] = path.resolve(pkgRoot, \"src/shims/bun-ffi-structs.ts\")\n aliases[\"node:console\"] = path.resolve(pkgRoot, \"src/shims/console.ts\")\n\n // Core file shims as aliases too\n for (const [key, shimPath] of Object.entries(coreFileShims)) {\n aliases[path.resolve(coreRoot, \"src\", key)] = path.resolve(pkgRoot, shimPath)\n }\n\n // Resolve npm packages from @gridland/web's dependency tree so\n // consuming projects don't need them as direct dependencies.\n // Uses _require to find the actual installed location (handles\n // hoisted node_modules). Directory aliases let subpath imports\n // (e.g. react-reconciler/constants) work via Vite's prefix\n // matching, and ensure CJS packages go through pre-bundling.\n for (const pkg of [\"react-reconciler\", \"yoga-layout\", \"diff\", \"marked\"]) {\n try {\n aliases[pkg] = path.dirname(_require.resolve(pkg + \"/package.json\"))\n } catch {\n aliases[pkg] = path.resolve(pkgRoot, \"node_modules\", pkg)\n }\n }\n\n return {\n define: {\n \"process.env\": JSON.stringify({}),\n },\n resolve: {\n alias: aliases,\n dedupe: [\"react\", \"react-dom\", \"react-reconciler\", \"yoga-layout\", \"events\"],\n },\n optimizeDeps: {\n // Pre-bundle npm packages imported by external opentui monorepo code.\n // These are resolved via virtual module redirects, so Vite's initial\n // crawl won't discover them — they must be listed explicitly.\n include: [\n \"react\",\n \"react-dom\",\n \"react-reconciler\",\n \"react-reconciler/constants\",\n \"diff\",\n \"yoga-layout\",\n \"marked\",\n ],\n },\n server: {\n fs: {\n // Allow serving from opentui source dirs (for dev-from-source).\n // Use strict: false so Vite's default allow list (project root) is preserved.\n strict: false,\n },\n },\n }\n },\n }\n\n return [shimPlugin, aliasPlugin]\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/vite-plugin.ts"],"sourcesContent":["import { type Plugin } from \"vite\"\nimport path from \"path\"\nimport { existsSync } from \"fs\"\nimport { createRequire } from \"module\"\nimport { fileURLToPath } from \"url\"\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = path.dirname(__filename)\n\n/**\n * Vite plugin that sets up module resolution for Gridland.\n * Handles:\n * - Redirecting Zig/FFI imports to browser shims\n * - Resolving @opentui/core, @opentui/react, @opentui/ui\n * - Shimming Node.js built-ins\n * - Breaking circular dependencies\n *\n * Requires @opentui/core, @opentui/react, and @opentui/ui as peer dependencies.\n */\nexport function gridlandWebPlugin(): Plugin[] {\n const pkgRoot = path.resolve(__dirname, \"..\")\n const _require = createRequire(path.resolve(pkgRoot, \"package.json\"))\n // Separate require for resolving opentui packages from the consumer project's\n // node_modules (not from @gridland/web's location, which may differ when\n // using file: links or in monorepo setups).\n const _projectRequire = createRequire(path.resolve(process.cwd(), \"package.json\"))\n\n // Resolve opentui package roots — try installed packages first,\n // fall back to git submodule for monorepo development.\n // Some packages restrict their exports map (no ./package.json),\n // so we try the main entry point as a fallback.\n function resolvePackageRoot(pkg: string, fallbackRelative: string): string {\n // Try multiple require contexts: project-level first (for consumer apps),\n // then @gridland/web-level (for monorepo dev). This ensures we find\n // packages in the consumer's node_modules, not just our own.\n for (const req of [_projectRequire, _require]) {\n try {\n const pkgJson = req.resolve(`${pkg}/package.json`)\n return path.dirname(pkgJson)\n } catch {\n try {\n // Package exists but doesn't expose package.json in exports map.\n // Resolve the main entry and derive the root from it.\n const entry = req.resolve(pkg)\n let dir = path.dirname(entry)\n for (let i = 0; i < 5; i++) {\n if (existsSync(path.join(dir, \"package.json\"))) return dir\n dir = path.dirname(dir)\n }\n } catch {\n // Package not installed in this context\n }\n }\n }\n return path.resolve(pkgRoot, fallbackRelative)\n }\n const coreRoot = resolvePackageRoot(\"@opentui/core\", \"../../opentui/packages/core\")\n const reactRoot = resolvePackageRoot(\"@opentui/react\", \"../../opentui/packages/react\")\n const uiRoot = resolvePackageRoot(\"@opentui/ui\", \"../../opentui/packages/ui\")\n\n // Detect whether opentui packages have TypeScript source (monorepo/submodule)\n // or only compiled JS (npm install). When source is available, we resolve\n // imports to .ts files and apply shims. Otherwise, let Vite handle them normally.\n const hasSource = existsSync(path.resolve(reactRoot, \"src/index.ts\"))\n\n const coreShims = path.resolve(pkgRoot, \"src/core-shims/index.ts\")\n const opentuiCoreBarrel = path.resolve(coreRoot, \"src/index.ts\")\n const sliderDeps = path.resolve(pkgRoot, \"src/shims/slider-deps.ts\")\n const sliderFile = path.resolve(coreRoot, \"src/renderables/Slider.ts\")\n\n // Map of opentui source files that need browser shims\n const coreFileShims: Record<string, string> = {\n zig: \"src/shims/zig-stub.ts\",\n buffer: \"src/browser-buffer.ts\",\n \"text-buffer\": \"src/shims/text-buffer-shim.ts\",\n \"text-buffer-view\": \"src/shims/text-buffer-view-shim.ts\",\n \"syntax-style\": \"src/shims/syntax-style-shim.ts\",\n renderer: \"src/shims/renderer-stub.ts\",\n console: \"src/shims/console-stub.ts\",\n \"edit-buffer\": \"src/shims/edit-buffer-stub.ts\",\n \"editor-view\": \"src/shims/editor-view-stub.ts\",\n NativeSpanFeed: \"src/shims/native-span-feed-stub.ts\",\n \"post/filters\": \"src/shims/filters-stub.ts\",\n \"animation/Timeline\": \"src/shims/timeline-stub.ts\",\n }\n\n const resolvedCoreShims = new Map<string, string>()\n for (const [key, shimPath] of Object.entries(coreFileShims)) {\n const absoluteTarget = path.resolve(coreRoot, \"src\", key + \".ts\")\n resolvedCoreShims.set(absoluteTarget, path.resolve(pkgRoot, shimPath))\n }\n\n const treeStub = path.resolve(pkgRoot, \"src/shims/tree-sitter-stub.ts\")\n const styledTextStub = path.resolve(pkgRoot, \"src/shims/tree-sitter-styled-text-stub.ts\")\n\n // Lookup tables hoisted out of resolveId to avoid per-call allocation\n const pkgRoots: Record<string, string> = { core: coreRoot, react: reactRoot, ui: uiRoot }\n\n const nodeShims: Record<string, string> = {\n \"node:buffer\": \"src/shims/node-buffer.ts\",\n \"node:path\": \"src/shims/node-path.ts\",\n path: \"src/shims/node-path.ts\",\n \"node:fs\": \"src/shims/node-fs.ts\",\n fs: \"src/shims/node-fs.ts\",\n \"fs/promises\": \"src/shims/node-fs.ts\",\n \"node:util\": \"src/shims/node-util.ts\",\n util: \"src/shims/node-util.ts\",\n os: \"src/shims/node-os.ts\",\n \"node:os\": \"src/shims/node-os.ts\",\n stream: \"src/shims/node-stream.ts\",\n \"node:stream\": \"src/shims/node-stream.ts\",\n url: \"src/shims/node-url.ts\",\n \"node:url\": \"src/shims/node-url.ts\",\n console: \"src/shims/console.ts\",\n bun: \"src/shims/bun-ffi.ts\",\n }\n\n // Virtual module prefix for npm package redirects.\n // When external opentui code imports a bare npm package (e.g. \"react\"),\n // we can't return the raw file path because Vite would serve it via /@fs/\n // without CJS-to-ESM conversion. Instead, we return a virtual module that\n // re-exports from the bare package name, which Vite processes through its\n // normal pre-bundling pipeline (including CJS conversion).\n const NPM_REDIRECT = \"\\0npm-redirect:\"\n\n const shimPlugin: Plugin = {\n name: \"gridland-web-shims\",\n enforce: \"pre\",\n resolveId(source, importer) {\n if (!importer) return null\n\n // Virtual module redirects should not be re-intercepted\n if (importer.startsWith(NPM_REDIRECT)) return null\n\n // Check if importer is in an opentui package.\n // Use both resolved root paths AND path-based matching to handle\n // multiple copies (e.g. bun's cache when using file: links).\n const isExternalOpentui =\n importer.startsWith(coreRoot + path.sep) ||\n importer.startsWith(reactRoot + path.sep) ||\n importer.startsWith(uiRoot + path.sep) ||\n importer.includes(\"/@opentui/core/\") ||\n importer.includes(\"/@opentui/react/\") ||\n importer.includes(\"/@opentui/ui/\")\n\n // Source-mode-only shims: slider circular dep fix, relative import\n // shims, tree-sitter stubs, and node built-in stubs only apply when\n // processing opentui TypeScript source (monorepo/submodule).\n // Compiled npm packages have these already resolved.\n\n // Slider circular dep fix\n if (hasSource && source === \"../index\" && importer === sliderFile) {\n return sliderDeps\n }\n\n // Resolve @opentui packages — only intercept when we have source files.\n // When using npm-installed packages (compiled JS), let Vite resolve normally.\n if (hasSource) {\n if (source === \"@opentui/ui\") {\n return path.resolve(uiRoot, \"src/index.ts\")\n }\n if (source === \"@opentui/react\") {\n return path.resolve(reactRoot, \"src/index.ts\")\n }\n\n // @opentui/core routing\n if (source === \"@opentui/core\") {\n if (importer.startsWith(reactRoot + path.sep)) {\n return opentuiCoreBarrel\n }\n return coreShims\n }\n\n // @opentui/* subpath imports (e.g. @opentui/react/jsx-dev-runtime)\n if (source.startsWith(\"@opentui/\")) {\n const parts = source.split(\"/\")\n const pkgName = parts[1] // \"react\", \"core\", \"ui\"\n const subpath = parts.slice(2).join(\"/\") // \"jsx-dev-runtime\"\n if (subpath) {\n const root = pkgRoots[pkgName]\n if (root) return path.resolve(root, subpath + \".js\")\n }\n }\n }\n\n // Relative imports from opentui tree → check shims\n if (source.startsWith(\".\") && isExternalOpentui) {\n const importerDir = path.dirname(importer)\n const resolved = path.resolve(importerDir, source)\n // Devtools polyfill stub (uses top-level await for ws import)\n if (resolved.endsWith(\"devtools-polyfill\")) {\n return path.resolve(pkgRoot, \"src/shims/devtools-polyfill-stub.ts\")\n }\n // Source-mode shims for core files (only when processing TS source)\n if (hasSource) {\n const shim = resolvedCoreShims.get(resolved) || resolvedCoreShims.get(resolved + \".ts\")\n if (shim) return shim\n const indexShim = resolvedCoreShims.get(resolved + \"/index.ts\")\n if (indexShim) return indexShim\n }\n }\n\n // Tree-sitter and related stubs — needed in both source and npm mode\n // since the compiled @opentui/core still imports these\n if (isExternalOpentui) {\n // Stub .scm and .wasm asset imports first (before tree-sitter name match)\n if (source.endsWith(\".scm\") || source.endsWith(\".wasm\")) {\n return \"\\0opentui-asset-stub\"\n }\n if (source.includes(\"tree-sitter\")) {\n if (source.includes(\"tree-sitter-styled-text\")) return styledTextStub\n return treeStub\n }\n if (source.includes(\"hast-styled-text\")) {\n return path.resolve(pkgRoot, \"src/shims/hast-stub.ts\")\n }\n }\n\n // Events shim — applies to ALL importers (browser-compatible EventEmitter)\n if (source === \"events\") {\n return path.resolve(pkgRoot, \"src/shims/events-shim.ts\")\n }\n\n // Node.js built-in stubs — needed in both modes since compiled\n // @opentui/core still imports node builtins\n if (nodeShims[source] && isExternalOpentui) {\n return path.resolve(pkgRoot, nodeShims[source])\n }\n\n // Redirect bare npm imports from external opentui to virtual modules (source mode only)\n if (hasSource && !source.startsWith(\".\") && !source.startsWith(\"/\") && !source.startsWith(\"@opentui/\") && isExternalOpentui) {\n return NPM_REDIRECT + source\n }\n\n return null\n },\n load(id) {\n // Stub for .scm/.wasm asset imports from compiled opentui packages\n if (id === \"\\0opentui-asset-stub\") {\n return \"export default null;\"\n }\n if (id.startsWith(NPM_REDIRECT)) {\n const pkg = id.slice(NPM_REDIRECT.length)\n // Discover export names by require()-ing the module at build time.\n // We use `import * as __ns` (namespace import) which works for both\n // ESM packages (named exports on namespace) and CJS packages\n // (pre-bundled with only a default export, properties on __ns.default).\n // Each property checks both locations with a fallback.\n // NOTE: We use bare specifiers (not resolved paths) so Vite routes\n // these through its pre-bundling pipeline for CJS-to-ESM conversion.\n try {\n const mod = _require(pkg)\n if (typeof mod === \"object\" && mod !== null) {\n const names = Object.keys(mod).filter(\n (k) => k !== \"default\" && k !== \"__esModule\" && /^[a-zA-Z_$][\\w$]*$/.test(k),\n )\n if (names.length > 0) {\n return [\n `import * as __ns from \"${pkg}\";`,\n `export default __ns.default ?? __ns;`,\n ...names.map(\n (n) => `export const ${n} = __ns[\"${n}\"] ?? __ns.default?.[\"${n}\"];`,\n ),\n ].join(\"\\n\")\n }\n }\n } catch {\n // Fall through to generic approach\n }\n // Fallback for packages we can't introspect\n return [\n `export * from \"${pkg}\";`,\n `import * as __ns from \"${pkg}\";`,\n `export default __ns.default ?? __ns;`,\n ].join(\"\\n\")\n }\n },\n }\n\n const aliasPlugin: Plugin = {\n name: \"gridland-web-aliases\",\n config() {\n const aliases: Record<string, string> = {}\n\n // FFI shims\n aliases[\"bun:ffi\"] = path.resolve(pkgRoot, \"src/shims/bun-ffi.ts\")\n aliases[\"bun-ffi-structs\"] = path.resolve(pkgRoot, \"src/shims/bun-ffi-structs.ts\")\n aliases[\"node:console\"] = path.resolve(pkgRoot, \"src/shims/console.ts\")\n\n // Core file shims as aliases too\n for (const [key, shimPath] of Object.entries(coreFileShims)) {\n aliases[path.resolve(coreRoot, \"src\", key)] = path.resolve(pkgRoot, shimPath)\n }\n\n // Resolve npm packages from @gridland/web's dependency tree so\n // consuming projects don't need them as direct dependencies.\n // Uses _require to find the actual installed location (handles\n // hoisted node_modules). Directory aliases let subpath imports\n // (e.g. react-reconciler/constants) work via Vite's prefix\n // matching, and ensure CJS packages go through pre-bundling.\n for (const pkg of [\"react-reconciler\", \"yoga-layout\", \"diff\", \"marked\"]) {\n try {\n aliases[pkg] = path.dirname(_require.resolve(pkg + \"/package.json\"))\n } catch {\n aliases[pkg] = path.resolve(pkgRoot, \"node_modules\", pkg)\n }\n }\n\n return {\n define: {\n \"process.env\": JSON.stringify({}),\n },\n resolve: {\n alias: aliases,\n dedupe: [\"react\", \"react-dom\", \"react-reconciler\", \"yoga-layout\", \"events\"],\n },\n optimizeDeps: {\n // Pre-bundle npm packages imported by external opentui monorepo code.\n // These are resolved via virtual module redirects, so Vite's initial\n // crawl won't discover them — they must be listed explicitly.\n // Only needed in source mode; compiled npm packages are discovered normally.\n include: hasSource ? [\n \"react\",\n \"react-dom\",\n \"react-reconciler\",\n \"react-reconciler/constants\",\n \"diff\",\n \"yoga-layout\",\n \"marked\",\n ] : [\n \"react\",\n \"react-dom\",\n ],\n },\n server: {\n fs: {\n // Allow serving from opentui source dirs (for dev-from-source).\n // Use strict: false so Vite's default allow list (project root) is preserved.\n strict: false,\n },\n },\n }\n },\n }\n\n return [shimPlugin, aliasPlugin]\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gridland/web",
3
- "version": "0.2.16",
3
+ "version": "0.2.18",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -28,7 +28,10 @@
28
28
  "main": "./dist/index.js",
29
29
  "types": "./dist/index.d.ts",
30
30
  "files": [
31
- "dist"
31
+ "dist",
32
+ "src/shims",
33
+ "src/core-shims",
34
+ "src/browser-buffer.ts"
32
35
  ],
33
36
  "scripts": {
34
37
  "build": "tsup; node build-browser.mjs",
@@ -37,8 +40,6 @@
37
40
  "test:ci": "bun test --preload ./test/preload.ts --randomize --rerun-each 3"
38
41
  },
39
42
  "dependencies": {
40
- "@opentui/core": "^0.1.87",
41
- "@opentui/react": "^0.1.87",
42
43
  "diff": "^8.0.3",
43
44
  "events": "^3.3.0",
44
45
  "marked": "^17.0.3",