@gridland/web 0.2.30 → 0.2.32

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.
@@ -58,6 +58,11 @@ function withGridland(nextConfig = {}) {
58
58
  const userWebpack = nextConfig.webpack;
59
59
  return {
60
60
  ...nextConfig,
61
+ // Ensure Next.js compiles .ts shim files from @gridland/web with SWC
62
+ transpilePackages: [
63
+ ...nextConfig.transpilePackages || [],
64
+ "@gridland/web"
65
+ ],
61
66
  webpack: (config, context) => {
62
67
  const { isServer, webpack } = context;
63
68
  if (userWebpack) {
@@ -117,6 +122,7 @@ function withGridland(nextConfig = {}) {
117
122
  if (!isServer) {
118
123
  const clientAliases = {
119
124
  "node:console": shimPath("src/shims/console.ts"),
125
+ "console$": shimPath("src/shims/console.ts"),
120
126
  "events$": shimPath("src/shims/events-shim.ts"),
121
127
  "fs/promises": shimPath("src/shims/node-fs.ts"),
122
128
  "fs$": shimPath("src/shims/node-fs.ts"),
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/next-plugin.ts"],"sourcesContent":["import path from \"path\"\nimport { existsSync } from \"fs\"\n\ntype WebpackConfig = any\ntype WebpackInstance = any\n\ninterface NextConfig {\n webpack?: (config: WebpackConfig, context: { isServer: boolean; webpack: WebpackInstance }) => WebpackConfig\n [key: string]: any\n}\n\n/**\n * Next.js plugin that configures webpack for Gridland.\n * Equivalent to `gridlandWebPlugin()` for Vite — handles module aliases,\n * FFI shims, tree-sitter stubs, Node.js built-in stubs, and circular\n * dependency fixes.\n *\n * In **npm mode**, @gridland/core resolves via package.json conditional exports\n * (\"import\" → dist/browser.js). No aliasing needed.\n *\n * In **source mode**, the plugin handles @opentui/* resolution and file-level\n * browser shims for native-backed classes.\n */\nexport function withGridland(nextConfig: NextConfig = {}): NextConfig {\n // __dirname works natively in CJS; tsup shims it for ESM via import.meta.url\n const pkgRoot = path.resolve(__dirname, \"..\")\n\n // Resolve opentui package roots from the git submodule\n const opentuiRoot = path.resolve(pkgRoot, \"../../opentui\")\n const coreRoot = path.resolve(opentuiRoot, \"packages/core\")\n const reactRoot = path.resolve(opentuiRoot, \"packages/react\")\n const uiRoot = path.resolve(opentuiRoot, \"packages/ui\")\n\n // Detect whether opentui source is available (monorepo/submodule)\n const hasSource = existsSync(path.resolve(reactRoot, \"src/index.ts\"))\n\n function shimPath(p: string) {\n return path.resolve(pkgRoot, p)\n }\n\n // File-level shims — browser replacements for native-backed classes.\n // NOT needed for: zig (zig-registry.ts is browser-safe), renderer, console,\n // NativeSpanFeed (no longer in browser barrel).\n const coreFileShims: Record<string, string> = {\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 \"edit-buffer\": \"src/shims/edit-buffer-stub.ts\",\n \"editor-view\": \"src/shims/editor-view-stub.ts\",\n \"post/filters\": \"src/shims/filters-stub.ts\",\n \"animation/Timeline\": \"src/shims/timeline-stub.ts\",\n }\n\n const userWebpack = nextConfig.webpack\n\n return {\n ...nextConfig,\n webpack: (config: WebpackConfig, context: { isServer: boolean; webpack: WebpackInstance }) => {\n const { isServer, webpack } = context\n\n // Chain user's webpack config first if provided\n if (userWebpack) {\n config = userWebpack(config, context)\n }\n\n const sharedAliases: Record<string, string> = {\n // npm mode: @gridland/core resolves via package.json conditional exports.\n // No alias needed.\n\n // @opentui packages — source mode only (monorepo dev)\n ...(hasSource ? {\n \"@opentui/core\": path.resolve(coreRoot, \"src/index.ts\"),\n \"@opentui/react\": path.resolve(reactRoot, \"src/index.ts\"),\n \"@opentui/ui\": path.resolve(uiRoot, \"src/index.ts\"),\n } : {}),\n\n // FFI shims (no Zig/Bun on server or client in browser context)\n \"bun:ffi\": shimPath(\"src/shims/bun-ffi.ts\"),\n \"bun-ffi-structs\": shimPath(\"src/shims/bun-ffi-structs.ts\"),\n bun: shimPath(\"src/shims/bun-ffi.ts\"),\n\n // Tree-sitter stubs\n \"tree-sitter-styled-text\": shimPath(\"src/shims/tree-sitter-styled-text-stub.ts\"),\n \"web-tree-sitter\": shimPath(\"src/shims/tree-sitter-stub.ts\"),\n \"hast-styled-text\": shimPath(\"src/shims/hast-stub.ts\"),\n\n // Source-mode-only aliases\n ...(hasSource ? {\n [path.resolve(coreRoot, \"src/lib/tree-sitter-styled-text\")]:\n shimPath(\"src/shims/tree-sitter-styled-text-stub.ts\"),\n [path.resolve(coreRoot, \"src/lib/tree-sitter\")]:\n shimPath(\"src/shims/tree-sitter-stub.ts\"),\n [path.resolve(coreRoot, \"src/lib/hast-styled-text\")]:\n shimPath(\"src/shims/hast-stub.ts\"),\n [path.resolve(reactRoot, \"src/reconciler/devtools-polyfill\")]:\n shimPath(\"src/shims/devtools-polyfill-stub.ts\"),\n } : {}),\n }\n\n // Core file shims (opentui source → browser shim) — source mode only\n if (hasSource) {\n for (const [key, shimFile] of Object.entries(coreFileShims)) {\n sharedAliases[path.resolve(coreRoot, \"src\", key)] = shimPath(shimFile)\n }\n }\n\n config.resolve = config.resolve || {}\n config.resolve.alias = {\n ...config.resolve.alias,\n ...sharedAliases,\n }\n\n // Allow webpack to resolve workspace packages\n config.resolve.modules = [\n ...(config.resolve.modules || []),\n path.resolve(process.cwd(), \"node_modules\"),\n path.resolve(pkgRoot, \"node_modules\"),\n path.resolve(pkgRoot, \"../../node_modules\"),\n ]\n\n // Slider circular dependency fix — source mode only\n if (hasSource) {\n const renderablesDir = path.resolve(coreRoot, \"src/renderables\")\n config.plugins.push(\n new webpack.NormalModuleReplacementPlugin(/^\\.\\.\\/index$/, (resource: any) => {\n if (resource.context === renderablesDir) {\n resource.request = shimPath(\"src/shims/slider-deps.ts\")\n }\n }),\n )\n }\n\n if (!isServer) {\n // Client-only: Node.js built-in stubs, events shim, console shim.\n const clientAliases: Record<string, string> = {\n \"node:console\": shimPath(\"src/shims/console.ts\"),\n \"events$\": shimPath(\"src/shims/events-shim.ts\"),\n \"fs/promises\": shimPath(\"src/shims/node-fs.ts\"),\n \"fs$\": shimPath(\"src/shims/node-fs.ts\"),\n \"path$\": shimPath(\"src/shims/node-path.ts\"),\n \"util$\": shimPath(\"src/shims/node-util.ts\"),\n \"os$\": shimPath(\"src/shims/node-os.ts\"),\n \"stream$\": shimPath(\"src/shims/node-stream.ts\"),\n \"url$\": shimPath(\"src/shims/node-url.ts\"),\n }\n\n config.resolve.alias = {\n ...config.resolve.alias,\n ...clientAliases,\n }\n\n // Strip `node:` and `bun:` prefixes from imports\n config.plugins.push(\n new webpack.NormalModuleReplacementPlugin(/^node:/, (resource: any) => {\n resource.request = resource.request.replace(/^node:/, \"\")\n }),\n new webpack.NormalModuleReplacementPlugin(/^bun:/, (resource: any) => {\n resource.request = resource.request.replace(/^bun:/, \"\")\n }),\n )\n }\n\n // Enable top-level await (used by opentui source code)\n config.experiments = {\n ...config.experiments,\n topLevelAwait: true,\n }\n\n return config\n },\n }\n}\n"],"mappings":"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","names":["path"]}
1
+ {"version":3,"sources":["../src/next-plugin.ts"],"sourcesContent":["import path from \"path\"\nimport { existsSync } from \"fs\"\n\ntype WebpackConfig = any\ntype WebpackInstance = any\n\ninterface NextConfig {\n webpack?: (config: WebpackConfig, context: { isServer: boolean; webpack: WebpackInstance }) => WebpackConfig\n [key: string]: any\n}\n\n/**\n * Next.js plugin that configures webpack for Gridland.\n * Equivalent to `gridlandWebPlugin()` for Vite — handles module aliases,\n * FFI shims, tree-sitter stubs, Node.js built-in stubs, and circular\n * dependency fixes.\n *\n * In **npm mode**, @gridland/core resolves via package.json conditional exports\n * (\"import\" → dist/browser.js). No aliasing needed.\n *\n * In **source mode**, the plugin handles @opentui/* resolution and file-level\n * browser shims for native-backed classes.\n */\nexport function withGridland(nextConfig: NextConfig = {}): NextConfig {\n // __dirname works natively in CJS; tsup shims it for ESM via import.meta.url\n const pkgRoot = path.resolve(__dirname, \"..\")\n\n // Resolve opentui package roots from the git submodule\n const opentuiRoot = path.resolve(pkgRoot, \"../../opentui\")\n const coreRoot = path.resolve(opentuiRoot, \"packages/core\")\n const reactRoot = path.resolve(opentuiRoot, \"packages/react\")\n const uiRoot = path.resolve(opentuiRoot, \"packages/ui\")\n\n // Detect whether opentui source is available (monorepo/submodule)\n const hasSource = existsSync(path.resolve(reactRoot, \"src/index.ts\"))\n\n function shimPath(p: string) {\n return path.resolve(pkgRoot, p)\n }\n\n // File-level shims — browser replacements for native-backed classes.\n // NOT needed for: zig (zig-registry.ts is browser-safe), renderer, console,\n // NativeSpanFeed (no longer in browser barrel).\n const coreFileShims: Record<string, string> = {\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 \"edit-buffer\": \"src/shims/edit-buffer-stub.ts\",\n \"editor-view\": \"src/shims/editor-view-stub.ts\",\n \"post/filters\": \"src/shims/filters-stub.ts\",\n \"animation/Timeline\": \"src/shims/timeline-stub.ts\",\n }\n\n const userWebpack = nextConfig.webpack\n\n return {\n ...nextConfig,\n // Ensure Next.js compiles .ts shim files from @gridland/web with SWC\n transpilePackages: [\n ...(nextConfig.transpilePackages || []),\n \"@gridland/web\",\n ],\n webpack: (config: WebpackConfig, context: { isServer: boolean; webpack: WebpackInstance }) => {\n const { isServer, webpack } = context\n\n // Chain user's webpack config first if provided\n if (userWebpack) {\n config = userWebpack(config, context)\n }\n\n const sharedAliases: Record<string, string> = {\n // npm mode: @gridland/core resolves via package.json conditional exports.\n // No alias needed.\n\n // @opentui packages — source mode only (monorepo dev)\n ...(hasSource ? {\n \"@opentui/core\": path.resolve(coreRoot, \"src/index.ts\"),\n \"@opentui/react\": path.resolve(reactRoot, \"src/index.ts\"),\n \"@opentui/ui\": path.resolve(uiRoot, \"src/index.ts\"),\n } : {}),\n\n // FFI shims (no Zig/Bun on server or client in browser context)\n \"bun:ffi\": shimPath(\"src/shims/bun-ffi.ts\"),\n \"bun-ffi-structs\": shimPath(\"src/shims/bun-ffi-structs.ts\"),\n bun: shimPath(\"src/shims/bun-ffi.ts\"),\n\n // Tree-sitter stubs\n \"tree-sitter-styled-text\": shimPath(\"src/shims/tree-sitter-styled-text-stub.ts\"),\n \"web-tree-sitter\": shimPath(\"src/shims/tree-sitter-stub.ts\"),\n \"hast-styled-text\": shimPath(\"src/shims/hast-stub.ts\"),\n\n // Source-mode-only aliases\n ...(hasSource ? {\n [path.resolve(coreRoot, \"src/lib/tree-sitter-styled-text\")]:\n shimPath(\"src/shims/tree-sitter-styled-text-stub.ts\"),\n [path.resolve(coreRoot, \"src/lib/tree-sitter\")]:\n shimPath(\"src/shims/tree-sitter-stub.ts\"),\n [path.resolve(coreRoot, \"src/lib/hast-styled-text\")]:\n shimPath(\"src/shims/hast-stub.ts\"),\n [path.resolve(reactRoot, \"src/reconciler/devtools-polyfill\")]:\n shimPath(\"src/shims/devtools-polyfill-stub.ts\"),\n } : {}),\n }\n\n // Core file shims (opentui source → browser shim) — source mode only\n if (hasSource) {\n for (const [key, shimFile] of Object.entries(coreFileShims)) {\n sharedAliases[path.resolve(coreRoot, \"src\", key)] = shimPath(shimFile)\n }\n }\n\n config.resolve = config.resolve || {}\n config.resolve.alias = {\n ...config.resolve.alias,\n ...sharedAliases,\n }\n\n // Allow webpack to resolve workspace packages\n config.resolve.modules = [\n ...(config.resolve.modules || []),\n path.resolve(process.cwd(), \"node_modules\"),\n path.resolve(pkgRoot, \"node_modules\"),\n path.resolve(pkgRoot, \"../../node_modules\"),\n ]\n\n // Slider circular dependency fix — source mode only\n if (hasSource) {\n const renderablesDir = path.resolve(coreRoot, \"src/renderables\")\n config.plugins.push(\n new webpack.NormalModuleReplacementPlugin(/^\\.\\.\\/index$/, (resource: any) => {\n if (resource.context === renderablesDir) {\n resource.request = shimPath(\"src/shims/slider-deps.ts\")\n }\n }),\n )\n }\n\n if (!isServer) {\n // Client-only: Node.js built-in stubs, events shim, console shim.\n // Both node:-prefixed and bare forms are needed because\n // NormalModuleReplacementPlugin strips the node: prefix.\n const clientAliases: Record<string, string> = {\n \"node:console\": shimPath(\"src/shims/console.ts\"),\n \"console$\": shimPath(\"src/shims/console.ts\"),\n \"events$\": shimPath(\"src/shims/events-shim.ts\"),\n \"fs/promises\": shimPath(\"src/shims/node-fs.ts\"),\n \"fs$\": shimPath(\"src/shims/node-fs.ts\"),\n \"path$\": shimPath(\"src/shims/node-path.ts\"),\n \"util$\": shimPath(\"src/shims/node-util.ts\"),\n \"os$\": shimPath(\"src/shims/node-os.ts\"),\n \"stream$\": shimPath(\"src/shims/node-stream.ts\"),\n \"url$\": shimPath(\"src/shims/node-url.ts\"),\n }\n\n config.resolve.alias = {\n ...config.resolve.alias,\n ...clientAliases,\n }\n\n // Strip `node:` and `bun:` prefixes from imports\n config.plugins.push(\n new webpack.NormalModuleReplacementPlugin(/^node:/, (resource: any) => {\n resource.request = resource.request.replace(/^node:/, \"\")\n }),\n new webpack.NormalModuleReplacementPlugin(/^bun:/, (resource: any) => {\n resource.request = resource.request.replace(/^bun:/, \"\")\n }),\n )\n }\n\n // Enable top-level await (used by opentui source code)\n config.experiments = {\n ...config.experiments,\n topLevelAwait: true,\n }\n\n return config\n },\n }\n}\n"],"mappings":"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","names":["path"]}
@@ -24,6 +24,11 @@ function withGridland(nextConfig = {}) {
24
24
  const userWebpack = nextConfig.webpack;
25
25
  return {
26
26
  ...nextConfig,
27
+ // Ensure Next.js compiles .ts shim files from @gridland/web with SWC
28
+ transpilePackages: [
29
+ ...nextConfig.transpilePackages || [],
30
+ "@gridland/web"
31
+ ],
27
32
  webpack: (config, context) => {
28
33
  const { isServer, webpack } = context;
29
34
  if (userWebpack) {
@@ -83,6 +88,7 @@ function withGridland(nextConfig = {}) {
83
88
  if (!isServer) {
84
89
  const clientAliases = {
85
90
  "node:console": shimPath("src/shims/console.ts"),
91
+ "console$": shimPath("src/shims/console.ts"),
86
92
  "events$": shimPath("src/shims/events-shim.ts"),
87
93
  "fs/promises": shimPath("src/shims/node-fs.ts"),
88
94
  "fs$": shimPath("src/shims/node-fs.ts"),
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/next-plugin.ts"],"sourcesContent":["import path from \"path\"\nimport { existsSync } from \"fs\"\n\ntype WebpackConfig = any\ntype WebpackInstance = any\n\ninterface NextConfig {\n webpack?: (config: WebpackConfig, context: { isServer: boolean; webpack: WebpackInstance }) => WebpackConfig\n [key: string]: any\n}\n\n/**\n * Next.js plugin that configures webpack for Gridland.\n * Equivalent to `gridlandWebPlugin()` for Vite — handles module aliases,\n * FFI shims, tree-sitter stubs, Node.js built-in stubs, and circular\n * dependency fixes.\n *\n * In **npm mode**, @gridland/core resolves via package.json conditional exports\n * (\"import\" → dist/browser.js). No aliasing needed.\n *\n * In **source mode**, the plugin handles @opentui/* resolution and file-level\n * browser shims for native-backed classes.\n */\nexport function withGridland(nextConfig: NextConfig = {}): NextConfig {\n // __dirname works natively in CJS; tsup shims it for ESM via import.meta.url\n const pkgRoot = path.resolve(__dirname, \"..\")\n\n // Resolve opentui package roots from the git submodule\n const opentuiRoot = path.resolve(pkgRoot, \"../../opentui\")\n const coreRoot = path.resolve(opentuiRoot, \"packages/core\")\n const reactRoot = path.resolve(opentuiRoot, \"packages/react\")\n const uiRoot = path.resolve(opentuiRoot, \"packages/ui\")\n\n // Detect whether opentui source is available (monorepo/submodule)\n const hasSource = existsSync(path.resolve(reactRoot, \"src/index.ts\"))\n\n function shimPath(p: string) {\n return path.resolve(pkgRoot, p)\n }\n\n // File-level shims — browser replacements for native-backed classes.\n // NOT needed for: zig (zig-registry.ts is browser-safe), renderer, console,\n // NativeSpanFeed (no longer in browser barrel).\n const coreFileShims: Record<string, string> = {\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 \"edit-buffer\": \"src/shims/edit-buffer-stub.ts\",\n \"editor-view\": \"src/shims/editor-view-stub.ts\",\n \"post/filters\": \"src/shims/filters-stub.ts\",\n \"animation/Timeline\": \"src/shims/timeline-stub.ts\",\n }\n\n const userWebpack = nextConfig.webpack\n\n return {\n ...nextConfig,\n webpack: (config: WebpackConfig, context: { isServer: boolean; webpack: WebpackInstance }) => {\n const { isServer, webpack } = context\n\n // Chain user's webpack config first if provided\n if (userWebpack) {\n config = userWebpack(config, context)\n }\n\n const sharedAliases: Record<string, string> = {\n // npm mode: @gridland/core resolves via package.json conditional exports.\n // No alias needed.\n\n // @opentui packages — source mode only (monorepo dev)\n ...(hasSource ? {\n \"@opentui/core\": path.resolve(coreRoot, \"src/index.ts\"),\n \"@opentui/react\": path.resolve(reactRoot, \"src/index.ts\"),\n \"@opentui/ui\": path.resolve(uiRoot, \"src/index.ts\"),\n } : {}),\n\n // FFI shims (no Zig/Bun on server or client in browser context)\n \"bun:ffi\": shimPath(\"src/shims/bun-ffi.ts\"),\n \"bun-ffi-structs\": shimPath(\"src/shims/bun-ffi-structs.ts\"),\n bun: shimPath(\"src/shims/bun-ffi.ts\"),\n\n // Tree-sitter stubs\n \"tree-sitter-styled-text\": shimPath(\"src/shims/tree-sitter-styled-text-stub.ts\"),\n \"web-tree-sitter\": shimPath(\"src/shims/tree-sitter-stub.ts\"),\n \"hast-styled-text\": shimPath(\"src/shims/hast-stub.ts\"),\n\n // Source-mode-only aliases\n ...(hasSource ? {\n [path.resolve(coreRoot, \"src/lib/tree-sitter-styled-text\")]:\n shimPath(\"src/shims/tree-sitter-styled-text-stub.ts\"),\n [path.resolve(coreRoot, \"src/lib/tree-sitter\")]:\n shimPath(\"src/shims/tree-sitter-stub.ts\"),\n [path.resolve(coreRoot, \"src/lib/hast-styled-text\")]:\n shimPath(\"src/shims/hast-stub.ts\"),\n [path.resolve(reactRoot, \"src/reconciler/devtools-polyfill\")]:\n shimPath(\"src/shims/devtools-polyfill-stub.ts\"),\n } : {}),\n }\n\n // Core file shims (opentui source → browser shim) — source mode only\n if (hasSource) {\n for (const [key, shimFile] of Object.entries(coreFileShims)) {\n sharedAliases[path.resolve(coreRoot, \"src\", key)] = shimPath(shimFile)\n }\n }\n\n config.resolve = config.resolve || {}\n config.resolve.alias = {\n ...config.resolve.alias,\n ...sharedAliases,\n }\n\n // Allow webpack to resolve workspace packages\n config.resolve.modules = [\n ...(config.resolve.modules || []),\n path.resolve(process.cwd(), \"node_modules\"),\n path.resolve(pkgRoot, \"node_modules\"),\n path.resolve(pkgRoot, \"../../node_modules\"),\n ]\n\n // Slider circular dependency fix — source mode only\n if (hasSource) {\n const renderablesDir = path.resolve(coreRoot, \"src/renderables\")\n config.plugins.push(\n new webpack.NormalModuleReplacementPlugin(/^\\.\\.\\/index$/, (resource: any) => {\n if (resource.context === renderablesDir) {\n resource.request = shimPath(\"src/shims/slider-deps.ts\")\n }\n }),\n )\n }\n\n if (!isServer) {\n // Client-only: Node.js built-in stubs, events shim, console shim.\n const clientAliases: Record<string, string> = {\n \"node:console\": shimPath(\"src/shims/console.ts\"),\n \"events$\": shimPath(\"src/shims/events-shim.ts\"),\n \"fs/promises\": shimPath(\"src/shims/node-fs.ts\"),\n \"fs$\": shimPath(\"src/shims/node-fs.ts\"),\n \"path$\": shimPath(\"src/shims/node-path.ts\"),\n \"util$\": shimPath(\"src/shims/node-util.ts\"),\n \"os$\": shimPath(\"src/shims/node-os.ts\"),\n \"stream$\": shimPath(\"src/shims/node-stream.ts\"),\n \"url$\": shimPath(\"src/shims/node-url.ts\"),\n }\n\n config.resolve.alias = {\n ...config.resolve.alias,\n ...clientAliases,\n }\n\n // Strip `node:` and `bun:` prefixes from imports\n config.plugins.push(\n new webpack.NormalModuleReplacementPlugin(/^node:/, (resource: any) => {\n resource.request = resource.request.replace(/^node:/, \"\")\n }),\n new webpack.NormalModuleReplacementPlugin(/^bun:/, (resource: any) => {\n resource.request = resource.request.replace(/^bun:/, \"\")\n }),\n )\n }\n\n // Enable top-level await (used by opentui source code)\n config.experiments = {\n ...config.experiments,\n topLevelAwait: true,\n }\n\n return config\n },\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/next-plugin.ts"],"sourcesContent":["import path from \"path\"\nimport { existsSync } from \"fs\"\n\ntype WebpackConfig = any\ntype WebpackInstance = any\n\ninterface NextConfig {\n webpack?: (config: WebpackConfig, context: { isServer: boolean; webpack: WebpackInstance }) => WebpackConfig\n [key: string]: any\n}\n\n/**\n * Next.js plugin that configures webpack for Gridland.\n * Equivalent to `gridlandWebPlugin()` for Vite — handles module aliases,\n * FFI shims, tree-sitter stubs, Node.js built-in stubs, and circular\n * dependency fixes.\n *\n * In **npm mode**, @gridland/core resolves via package.json conditional exports\n * (\"import\" → dist/browser.js). No aliasing needed.\n *\n * In **source mode**, the plugin handles @opentui/* resolution and file-level\n * browser shims for native-backed classes.\n */\nexport function withGridland(nextConfig: NextConfig = {}): NextConfig {\n // __dirname works natively in CJS; tsup shims it for ESM via import.meta.url\n const pkgRoot = path.resolve(__dirname, \"..\")\n\n // Resolve opentui package roots from the git submodule\n const opentuiRoot = path.resolve(pkgRoot, \"../../opentui\")\n const coreRoot = path.resolve(opentuiRoot, \"packages/core\")\n const reactRoot = path.resolve(opentuiRoot, \"packages/react\")\n const uiRoot = path.resolve(opentuiRoot, \"packages/ui\")\n\n // Detect whether opentui source is available (monorepo/submodule)\n const hasSource = existsSync(path.resolve(reactRoot, \"src/index.ts\"))\n\n function shimPath(p: string) {\n return path.resolve(pkgRoot, p)\n }\n\n // File-level shims — browser replacements for native-backed classes.\n // NOT needed for: zig (zig-registry.ts is browser-safe), renderer, console,\n // NativeSpanFeed (no longer in browser barrel).\n const coreFileShims: Record<string, string> = {\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 \"edit-buffer\": \"src/shims/edit-buffer-stub.ts\",\n \"editor-view\": \"src/shims/editor-view-stub.ts\",\n \"post/filters\": \"src/shims/filters-stub.ts\",\n \"animation/Timeline\": \"src/shims/timeline-stub.ts\",\n }\n\n const userWebpack = nextConfig.webpack\n\n return {\n ...nextConfig,\n // Ensure Next.js compiles .ts shim files from @gridland/web with SWC\n transpilePackages: [\n ...(nextConfig.transpilePackages || []),\n \"@gridland/web\",\n ],\n webpack: (config: WebpackConfig, context: { isServer: boolean; webpack: WebpackInstance }) => {\n const { isServer, webpack } = context\n\n // Chain user's webpack config first if provided\n if (userWebpack) {\n config = userWebpack(config, context)\n }\n\n const sharedAliases: Record<string, string> = {\n // npm mode: @gridland/core resolves via package.json conditional exports.\n // No alias needed.\n\n // @opentui packages — source mode only (monorepo dev)\n ...(hasSource ? {\n \"@opentui/core\": path.resolve(coreRoot, \"src/index.ts\"),\n \"@opentui/react\": path.resolve(reactRoot, \"src/index.ts\"),\n \"@opentui/ui\": path.resolve(uiRoot, \"src/index.ts\"),\n } : {}),\n\n // FFI shims (no Zig/Bun on server or client in browser context)\n \"bun:ffi\": shimPath(\"src/shims/bun-ffi.ts\"),\n \"bun-ffi-structs\": shimPath(\"src/shims/bun-ffi-structs.ts\"),\n bun: shimPath(\"src/shims/bun-ffi.ts\"),\n\n // Tree-sitter stubs\n \"tree-sitter-styled-text\": shimPath(\"src/shims/tree-sitter-styled-text-stub.ts\"),\n \"web-tree-sitter\": shimPath(\"src/shims/tree-sitter-stub.ts\"),\n \"hast-styled-text\": shimPath(\"src/shims/hast-stub.ts\"),\n\n // Source-mode-only aliases\n ...(hasSource ? {\n [path.resolve(coreRoot, \"src/lib/tree-sitter-styled-text\")]:\n shimPath(\"src/shims/tree-sitter-styled-text-stub.ts\"),\n [path.resolve(coreRoot, \"src/lib/tree-sitter\")]:\n shimPath(\"src/shims/tree-sitter-stub.ts\"),\n [path.resolve(coreRoot, \"src/lib/hast-styled-text\")]:\n shimPath(\"src/shims/hast-stub.ts\"),\n [path.resolve(reactRoot, \"src/reconciler/devtools-polyfill\")]:\n shimPath(\"src/shims/devtools-polyfill-stub.ts\"),\n } : {}),\n }\n\n // Core file shims (opentui source → browser shim) — source mode only\n if (hasSource) {\n for (const [key, shimFile] of Object.entries(coreFileShims)) {\n sharedAliases[path.resolve(coreRoot, \"src\", key)] = shimPath(shimFile)\n }\n }\n\n config.resolve = config.resolve || {}\n config.resolve.alias = {\n ...config.resolve.alias,\n ...sharedAliases,\n }\n\n // Allow webpack to resolve workspace packages\n config.resolve.modules = [\n ...(config.resolve.modules || []),\n path.resolve(process.cwd(), \"node_modules\"),\n path.resolve(pkgRoot, \"node_modules\"),\n path.resolve(pkgRoot, \"../../node_modules\"),\n ]\n\n // Slider circular dependency fix — source mode only\n if (hasSource) {\n const renderablesDir = path.resolve(coreRoot, \"src/renderables\")\n config.plugins.push(\n new webpack.NormalModuleReplacementPlugin(/^\\.\\.\\/index$/, (resource: any) => {\n if (resource.context === renderablesDir) {\n resource.request = shimPath(\"src/shims/slider-deps.ts\")\n }\n }),\n )\n }\n\n if (!isServer) {\n // Client-only: Node.js built-in stubs, events shim, console shim.\n // Both node:-prefixed and bare forms are needed because\n // NormalModuleReplacementPlugin strips the node: prefix.\n const clientAliases: Record<string, string> = {\n \"node:console\": shimPath(\"src/shims/console.ts\"),\n \"console$\": shimPath(\"src/shims/console.ts\"),\n \"events$\": shimPath(\"src/shims/events-shim.ts\"),\n \"fs/promises\": shimPath(\"src/shims/node-fs.ts\"),\n \"fs$\": shimPath(\"src/shims/node-fs.ts\"),\n \"path$\": shimPath(\"src/shims/node-path.ts\"),\n \"util$\": shimPath(\"src/shims/node-util.ts\"),\n \"os$\": shimPath(\"src/shims/node-os.ts\"),\n \"stream$\": shimPath(\"src/shims/node-stream.ts\"),\n \"url$\": shimPath(\"src/shims/node-url.ts\"),\n }\n\n config.resolve.alias = {\n ...config.resolve.alias,\n ...clientAliases,\n }\n\n // Strip `node:` and `bun:` prefixes from imports\n config.plugins.push(\n new webpack.NormalModuleReplacementPlugin(/^node:/, (resource: any) => {\n resource.request = resource.request.replace(/^node:/, \"\")\n }),\n new webpack.NormalModuleReplacementPlugin(/^bun:/, (resource: any) => {\n resource.request = resource.request.replace(/^bun:/, \"\")\n }),\n )\n }\n\n // Enable top-level await (used by opentui source code)\n config.experiments = {\n ...config.experiments,\n topLevelAwait: true,\n }\n\n return config\n },\n }\n}\n"],"mappings":";AAAA,OAAO,UAAU;AACjB,SAAS,kBAAkB;AAsBpB,SAAS,aAAa,aAAyB,CAAC,GAAe;AAEpE,QAAM,UAAU,KAAK,QAAQ,WAAW,IAAI;AAG5C,QAAM,cAAc,KAAK,QAAQ,SAAS,eAAe;AACzD,QAAM,WAAW,KAAK,QAAQ,aAAa,eAAe;AAC1D,QAAM,YAAY,KAAK,QAAQ,aAAa,gBAAgB;AAC5D,QAAM,SAAS,KAAK,QAAQ,aAAa,aAAa;AAGtD,QAAM,YAAY,WAAW,KAAK,QAAQ,WAAW,cAAc,CAAC;AAEpE,WAAS,SAAS,GAAW;AAC3B,WAAO,KAAK,QAAQ,SAAS,CAAC;AAAA,EAChC;AAKA,QAAM,gBAAwC;AAAA,IAC5C,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,oBAAoB;AAAA,IACpB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,sBAAsB;AAAA,EACxB;AAEA,QAAM,cAAc,WAAW;AAE/B,SAAO;AAAA,IACL,GAAG;AAAA;AAAA,IAEH,mBAAmB;AAAA,MACjB,GAAI,WAAW,qBAAqB,CAAC;AAAA,MACrC;AAAA,IACF;AAAA,IACA,SAAS,CAAC,QAAuB,YAA6D;AAC5F,YAAM,EAAE,UAAU,QAAQ,IAAI;AAG9B,UAAI,aAAa;AACf,iBAAS,YAAY,QAAQ,OAAO;AAAA,MACtC;AAEA,YAAM,gBAAwC;AAAA;AAAA;AAAA;AAAA,QAK5C,GAAI,YAAY;AAAA,UACd,iBAAiB,KAAK,QAAQ,UAAU,cAAc;AAAA,UACtD,kBAAkB,KAAK,QAAQ,WAAW,cAAc;AAAA,UACxD,eAAe,KAAK,QAAQ,QAAQ,cAAc;AAAA,QACpD,IAAI,CAAC;AAAA;AAAA,QAGL,WAAW,SAAS,sBAAsB;AAAA,QAC1C,mBAAmB,SAAS,8BAA8B;AAAA,QAC1D,KAAK,SAAS,sBAAsB;AAAA;AAAA,QAGpC,2BAA2B,SAAS,2CAA2C;AAAA,QAC/E,mBAAmB,SAAS,+BAA+B;AAAA,QAC3D,oBAAoB,SAAS,wBAAwB;AAAA;AAAA,QAGrD,GAAI,YAAY;AAAA,UACd,CAAC,KAAK,QAAQ,UAAU,iCAAiC,CAAC,GACxD,SAAS,2CAA2C;AAAA,UACtD,CAAC,KAAK,QAAQ,UAAU,qBAAqB,CAAC,GAC5C,SAAS,+BAA+B;AAAA,UAC1C,CAAC,KAAK,QAAQ,UAAU,0BAA0B,CAAC,GACjD,SAAS,wBAAwB;AAAA,UACnC,CAAC,KAAK,QAAQ,WAAW,kCAAkC,CAAC,GAC1D,SAAS,qCAAqC;AAAA,QAClD,IAAI,CAAC;AAAA,MACP;AAGA,UAAI,WAAW;AACb,mBAAW,CAAC,KAAK,QAAQ,KAAK,OAAO,QAAQ,aAAa,GAAG;AAC3D,wBAAc,KAAK,QAAQ,UAAU,OAAO,GAAG,CAAC,IAAI,SAAS,QAAQ;AAAA,QACvE;AAAA,MACF;AAEA,aAAO,UAAU,OAAO,WAAW,CAAC;AACpC,aAAO,QAAQ,QAAQ;AAAA,QACrB,GAAG,OAAO,QAAQ;AAAA,QAClB,GAAG;AAAA,MACL;AAGA,aAAO,QAAQ,UAAU;AAAA,QACvB,GAAI,OAAO,QAAQ,WAAW,CAAC;AAAA,QAC/B,KAAK,QAAQ,QAAQ,IAAI,GAAG,cAAc;AAAA,QAC1C,KAAK,QAAQ,SAAS,cAAc;AAAA,QACpC,KAAK,QAAQ,SAAS,oBAAoB;AAAA,MAC5C;AAGA,UAAI,WAAW;AACb,cAAM,iBAAiB,KAAK,QAAQ,UAAU,iBAAiB;AAC/D,eAAO,QAAQ;AAAA,UACb,IAAI,QAAQ,8BAA8B,iBAAiB,CAAC,aAAkB;AAC5E,gBAAI,SAAS,YAAY,gBAAgB;AACvC,uBAAS,UAAU,SAAS,0BAA0B;AAAA,YACxD;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAEA,UAAI,CAAC,UAAU;AAIb,cAAM,gBAAwC;AAAA,UAC5C,gBAAgB,SAAS,sBAAsB;AAAA,UAC/C,YAAY,SAAS,sBAAsB;AAAA,UAC3C,WAAW,SAAS,0BAA0B;AAAA,UAC9C,eAAe,SAAS,sBAAsB;AAAA,UAC9C,OAAO,SAAS,sBAAsB;AAAA,UACtC,SAAS,SAAS,wBAAwB;AAAA,UAC1C,SAAS,SAAS,wBAAwB;AAAA,UAC1C,OAAO,SAAS,sBAAsB;AAAA,UACtC,WAAW,SAAS,0BAA0B;AAAA,UAC9C,QAAQ,SAAS,uBAAuB;AAAA,QAC1C;AAEA,eAAO,QAAQ,QAAQ;AAAA,UACrB,GAAG,OAAO,QAAQ;AAAA,UAClB,GAAG;AAAA,QACL;AAGA,eAAO,QAAQ;AAAA,UACb,IAAI,QAAQ,8BAA8B,UAAU,CAAC,aAAkB;AACrE,qBAAS,UAAU,SAAS,QAAQ,QAAQ,UAAU,EAAE;AAAA,UAC1D,CAAC;AAAA,UACD,IAAI,QAAQ,8BAA8B,SAAS,CAAC,aAAkB;AACpE,qBAAS,UAAU,SAAS,QAAQ,QAAQ,SAAS,EAAE;AAAA,UACzD,CAAC;AAAA,QACH;AAAA,MACF;AAGA,aAAO,cAAc;AAAA,QACnB,GAAG,OAAO;AAAA,QACV,eAAe;AAAA,MACjB;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AACF;","names":[]}
package/dist/next.js CHANGED
@@ -1764,17 +1764,141 @@ function parseWrap(value) {
1764
1764
  }
1765
1765
  }
1766
1766
 
1767
- // ../../opentui/packages/core/src/renderable-brand.ts
1768
- var BrandedRenderable = /* @__PURE__ */ Symbol.for("@opentui/core/Renderable");
1769
- function isRenderable2(obj) {
1770
- return !!obj?.[BrandedRenderable];
1767
+ // src/shims/node-util.ts
1768
+ function inspect(obj, _options) {
1769
+ try {
1770
+ return JSON.stringify(obj, null, 2);
1771
+ } catch {
1772
+ return String(obj);
1773
+ }
1774
+ }
1775
+ function format(fmt, ...args) {
1776
+ let i = 0;
1777
+ return fmt.replace(/%[sdjifoO%]/g, (match) => {
1778
+ if (match === "%%") return "%";
1779
+ if (i >= args.length) return match;
1780
+ return String(args[i++]);
1781
+ });
1771
1782
  }
1772
- var _maybeMakeRenderable = null;
1773
- function registerMaybeMakeRenderable(fn) {
1774
- _maybeMakeRenderable = fn;
1783
+ function promisify(fn) {
1784
+ return (...args) => new Promise((resolve, reject) => {
1785
+ fn(...args, (err, result) => {
1786
+ if (err) reject(err);
1787
+ else resolve(result);
1788
+ });
1789
+ });
1790
+ }
1791
+ function isDeepStrictEqual(a, b2) {
1792
+ return JSON.stringify(a) === JSON.stringify(b2);
1793
+ }
1794
+ var node_util_default = { inspect, format, promisify, isDeepStrictEqual };
1795
+
1796
+ // ../../opentui/packages/core/src/renderables/composition/vnode.ts
1797
+ var BrandedVNode = /* @__PURE__ */ Symbol.for("@opentui/core/VNode");
1798
+ function isRenderableConstructor(value) {
1799
+ return typeof value === "function" && value.prototype && Renderable.prototype.isPrototypeOf(value.prototype);
1800
+ }
1801
+ function flattenChildren(children) {
1802
+ const result = [];
1803
+ for (const child of children) {
1804
+ if (Array.isArray(child)) {
1805
+ result.push(...flattenChildren(child));
1806
+ } else if (child !== null && child !== void 0 && child !== false) {
1807
+ result.push(child);
1808
+ }
1809
+ }
1810
+ return result;
1811
+ }
1812
+ function isVNode(node) {
1813
+ return node && node[BrandedVNode];
1775
1814
  }
1776
1815
  function maybeMakeRenderable(ctx, node) {
1777
- return _maybeMakeRenderable?.(ctx, node) ?? null;
1816
+ if (isRenderable(node)) return node;
1817
+ if (isVNode(node)) return instantiate(ctx, node);
1818
+ if (process.env.NODE_ENV !== "production") {
1819
+ console.warn("maybeMakeRenderable received an invalid node", node_util_default.inspect(node, { depth: 2 }));
1820
+ }
1821
+ return null;
1822
+ }
1823
+ function wrapWithDelegates(instance, delegateMap) {
1824
+ if (!delegateMap || Object.keys(delegateMap).length === 0) return instance;
1825
+ const descendantCache = /* @__PURE__ */ new Map();
1826
+ const getDescendant = (id) => {
1827
+ if (descendantCache.has(id)) {
1828
+ const cached = descendantCache.get(id);
1829
+ if (cached !== void 0) {
1830
+ return cached;
1831
+ }
1832
+ }
1833
+ const descendant = instance.findDescendantById(id);
1834
+ if (descendant) {
1835
+ descendantCache.set(id, descendant);
1836
+ }
1837
+ return descendant;
1838
+ };
1839
+ const proxy = new Proxy(instance, {
1840
+ get(target, prop, receiver) {
1841
+ if (typeof prop === "string" && delegateMap[prop]) {
1842
+ const host = getDescendant(delegateMap[prop]);
1843
+ if (host) {
1844
+ const value = host[prop];
1845
+ if (typeof value === "function") {
1846
+ return value.bind(host);
1847
+ }
1848
+ return value;
1849
+ }
1850
+ }
1851
+ return Reflect.get(target, prop, receiver);
1852
+ },
1853
+ set(target, prop, value, receiver) {
1854
+ if (typeof prop === "string" && delegateMap[prop]) {
1855
+ const host = getDescendant(delegateMap[prop]);
1856
+ if (host) {
1857
+ return Reflect.set(host, prop, value);
1858
+ }
1859
+ }
1860
+ return Reflect.set(target, prop, value, receiver);
1861
+ }
1862
+ });
1863
+ return proxy;
1864
+ }
1865
+ function instantiate(ctx, node) {
1866
+ if (isRenderable(node)) return node;
1867
+ if (!node || typeof node !== "object") {
1868
+ throw new TypeError("mount() received an invalid vnode");
1869
+ }
1870
+ const vnode = node;
1871
+ const { type, props } = vnode;
1872
+ const children = flattenChildren(vnode.children || []);
1873
+ const delegateMap = vnode.__delegateMap;
1874
+ if (isRenderableConstructor(type)) {
1875
+ const instance = new type(ctx, props || {});
1876
+ for (const child of children) {
1877
+ if (isRenderable(child)) {
1878
+ instance.add(child);
1879
+ } else {
1880
+ const mounted = instantiate(ctx, child);
1881
+ instance.add(mounted);
1882
+ }
1883
+ }
1884
+ const delegatedInstance = wrapWithDelegates(instance, delegateMap);
1885
+ const pendingCalls = vnode.__pendingCalls;
1886
+ if (pendingCalls) {
1887
+ for (const call of pendingCalls) {
1888
+ if (call.isProperty) {
1889
+ ;
1890
+ delegatedInstance[call.method] = call.args[0];
1891
+ } else {
1892
+ ;
1893
+ delegatedInstance[call.method].apply(delegatedInstance, call.args);
1894
+ }
1895
+ }
1896
+ }
1897
+ return delegatedInstance;
1898
+ }
1899
+ const resolved = type(props || {}, children);
1900
+ const inst = instantiate(ctx, resolved);
1901
+ return wrapWithDelegates(inst, delegateMap);
1778
1902
  }
1779
1903
 
1780
1904
  // ../../opentui/packages/core/src/lib/renderable.validations.ts
@@ -1851,6 +1975,10 @@ function isSizeType(value) {
1851
1975
  }
1852
1976
 
1853
1977
  // ../../opentui/packages/core/src/Renderable.ts
1978
+ var BrandedRenderable = /* @__PURE__ */ Symbol.for("@opentui/core/Renderable");
1979
+ function isRenderable(obj) {
1980
+ return !!obj?.[BrandedRenderable];
1981
+ }
1854
1982
  var BaseRenderable = class _BaseRenderable extends EventEmitter {
1855
1983
  [BrandedRenderable] = true;
1856
1984
  static renderableNumber = 1;
@@ -4494,144 +4622,6 @@ var TextNodeRenderable = class _TextNodeRenderable extends BaseRenderable {
4494
4622
  }
4495
4623
  };
4496
4624
 
4497
- // src/shims/node-util.ts
4498
- function inspect(obj, _options) {
4499
- try {
4500
- return JSON.stringify(obj, null, 2);
4501
- } catch {
4502
- return String(obj);
4503
- }
4504
- }
4505
- function format(fmt, ...args) {
4506
- let i = 0;
4507
- return fmt.replace(/%[sdjifoO%]/g, (match) => {
4508
- if (match === "%%") return "%";
4509
- if (i >= args.length) return match;
4510
- return String(args[i++]);
4511
- });
4512
- }
4513
- function promisify(fn) {
4514
- return (...args) => new Promise((resolve, reject) => {
4515
- fn(...args, (err, result) => {
4516
- if (err) reject(err);
4517
- else resolve(result);
4518
- });
4519
- });
4520
- }
4521
- function isDeepStrictEqual(a, b2) {
4522
- return JSON.stringify(a) === JSON.stringify(b2);
4523
- }
4524
- var node_util_default = { inspect, format, promisify, isDeepStrictEqual };
4525
-
4526
- // ../../opentui/packages/core/src/renderables/composition/vnode.ts
4527
- var BrandedVNode = /* @__PURE__ */ Symbol.for("@opentui/core/VNode");
4528
- function isRenderableConstructor(value) {
4529
- return typeof value === "function" && value.prototype && !!value.prototype[BrandedRenderable];
4530
- }
4531
- function flattenChildren(children) {
4532
- const result = [];
4533
- for (const child of children) {
4534
- if (Array.isArray(child)) {
4535
- result.push(...flattenChildren(child));
4536
- } else if (child !== null && child !== void 0 && child !== false) {
4537
- result.push(child);
4538
- }
4539
- }
4540
- return result;
4541
- }
4542
- function isVNode(node) {
4543
- return node && node[BrandedVNode];
4544
- }
4545
- function maybeMakeRenderable2(ctx, node) {
4546
- if (isRenderable2(node)) return node;
4547
- if (isVNode(node)) return instantiate(ctx, node);
4548
- if (process.env.NODE_ENV !== "production") {
4549
- console.warn("maybeMakeRenderable received an invalid node", node_util_default.inspect(node, { depth: 2 }));
4550
- }
4551
- return null;
4552
- }
4553
- registerMaybeMakeRenderable(maybeMakeRenderable2);
4554
- function wrapWithDelegates(instance, delegateMap) {
4555
- if (!delegateMap || Object.keys(delegateMap).length === 0) return instance;
4556
- const descendantCache = /* @__PURE__ */ new Map();
4557
- const getDescendant = (id) => {
4558
- if (descendantCache.has(id)) {
4559
- const cached = descendantCache.get(id);
4560
- if (cached !== void 0) {
4561
- return cached;
4562
- }
4563
- }
4564
- const descendant = instance.findDescendantById(id);
4565
- if (descendant) {
4566
- descendantCache.set(id, descendant);
4567
- }
4568
- return descendant;
4569
- };
4570
- const proxy = new Proxy(instance, {
4571
- get(target, prop, receiver) {
4572
- if (typeof prop === "string" && delegateMap[prop]) {
4573
- const host = getDescendant(delegateMap[prop]);
4574
- if (host) {
4575
- const value = host[prop];
4576
- if (typeof value === "function") {
4577
- return value.bind(host);
4578
- }
4579
- return value;
4580
- }
4581
- }
4582
- return Reflect.get(target, prop, receiver);
4583
- },
4584
- set(target, prop, value, receiver) {
4585
- if (typeof prop === "string" && delegateMap[prop]) {
4586
- const host = getDescendant(delegateMap[prop]);
4587
- if (host) {
4588
- return Reflect.set(host, prop, value);
4589
- }
4590
- }
4591
- return Reflect.set(target, prop, value, receiver);
4592
- }
4593
- });
4594
- return proxy;
4595
- }
4596
- function instantiate(ctx, node) {
4597
- if (isRenderable2(node)) return node;
4598
- if (!node || typeof node !== "object") {
4599
- throw new TypeError("mount() received an invalid vnode");
4600
- }
4601
- const vnode = node;
4602
- const { type, props } = vnode;
4603
- const children = flattenChildren(vnode.children || []);
4604
- const delegateMap = vnode.__delegateMap;
4605
- if (isRenderableConstructor(type)) {
4606
- const instance = new type(ctx, props || {});
4607
- for (const child of children) {
4608
- if (isRenderable2(child)) {
4609
- instance.add(child);
4610
- } else {
4611
- const mounted = instantiate(ctx, child);
4612
- instance.add(mounted);
4613
- }
4614
- }
4615
- const delegatedInstance = wrapWithDelegates(instance, delegateMap);
4616
- const pendingCalls = vnode.__pendingCalls;
4617
- if (pendingCalls) {
4618
- for (const call of pendingCalls) {
4619
- if (call.isProperty) {
4620
- ;
4621
- delegatedInstance[call.method] = call.args[0];
4622
- } else {
4623
- ;
4624
- delegatedInstance[call.method].apply(delegatedInstance, call.args);
4625
- }
4626
- }
4627
- }
4628
- return delegatedInstance;
4629
- }
4630
- const resolved = type(props || {}, children);
4631
- const inst = instantiate(ctx, resolved);
4632
- return wrapWithDelegates(inst, delegateMap);
4633
- }
4634
-
4635
4625
  // ../../opentui/node_modules/.bun/marked@17.0.1/node_modules/marked/lib/marked.esm.js
4636
4626
  function L() {
4637
4627
  return { async: false, breaks: false, extensions: null, gfm: true, hooks: null, pedantic: false, renderer: null, silent: false, tokenizer: null, walkTokens: null };