vite-plugin-veloz 0.1.0 → 0.1.2

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 CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  Vite plugin for [Veloz](https://github.com/juliocarneiro/veloz): configures JSX for `@velozjs/dom`, and during SSR (dev `ssrLoadModule` and `vite build --ssr`) resolves your app's imports of `@velozjs/dom` to `@velozjs/ssr`, so the same components render to HTML.
4
4
 
5
+ [Documentation](https://veloz-site.vercel.app) · [GitHub](https://github.com/juliocarneiro/veloz)
6
+
5
7
  ```bash
6
8
  npm install -D vite-plugin-veloz
7
9
  ```
package/dist/index.js CHANGED
@@ -1,7 +1,12 @@
1
1
  import { existsSync, readFileSync } from 'fs';
2
2
  import { dirname, join } from 'path';
3
+ import { version } from 'vite';
3
4
 
4
5
  // src/index.ts
6
+ function majorOf(version) {
7
+ return Number.parseInt(version ?? "", 10) || 0;
8
+ }
9
+ var JSX_IMPORT_SOURCE = "@velozjs/dom";
5
10
  var SSR_REDIRECTS = {
6
11
  "@velozjs/dom": "@velozjs/ssr",
7
12
  "@velozjs/dom/jsx-runtime": "@velozjs/ssr/jsx-runtime",
@@ -47,9 +52,15 @@ function velozPlugin(options = {}) {
47
52
  name: "vite-plugin-veloz",
48
53
  enforce: "pre",
49
54
  config() {
55
+ const running = this?.meta?.viteVersion;
56
+ const jsx = majorOf(running ?? version) >= 8 ? { oxc: { jsx: { runtime: "automatic", importSource: JSX_IMPORT_SOURCE } } } : { esbuild: { jsx: "automatic", jsxImportSource: JSX_IMPORT_SOURCE } };
50
57
  return {
51
- esbuild: { jsx: "automatic", jsxImportSource: "@velozjs/dom" },
52
- resolve: { dedupe: ["@velozjs/core", "@velozjs/dom", "@velozjs/css", "@velozjs/ssr"] }
58
+ ...jsx,
59
+ resolve: { dedupe: ["@velozjs/core", "@velozjs/dom", "@velozjs/css", "@velozjs/ssr"] },
60
+ // Externalized dependencies are loaded by Node directly and never reach
61
+ // resolveId, so @velozjs/dom imports could not be redirected. Processing
62
+ // dom and ssr through Vite also keeps a single copy of the SSR runtime.
63
+ ssr: { noExternal: ["@velozjs/dom", "@velozjs/ssr"] }
53
64
  };
54
65
  },
55
66
  async resolveId(source, importer, resolveOptions) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;AAaA,IAAM,aAAA,GAAwC;AAAA,EAC5C,cAAA,EAAgB,cAAA;AAAA,EAChB,0BAAA,EAA4B,0BAAA;AAAA,EAC5B,8BAAA,EAAgC;AAClC,CAAA;AAEA,IAAM,gBAAA,uBAAuB,GAAA,EAA2B;AAGxD,SAAS,cAAc,IAAA,EAA6B;AAClD,EAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACjD,EAAA,IAAI,GAAA,GAAM,QAAQ,IAAI,CAAA;AACtB,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,IAAI,IAAA,GAAsB,IAAA;AAE1B,EAAA,WAAS;AACP,IAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,GAAA,CAAI,GAAG,CAAA;AACvC,IAAA,IAAI,WAAW,MAAA,EAAW;AACxB,MAAA,IAAA,GAAO,MAAA;AACP,MAAA;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAChB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,EAAK,cAAc,CAAA;AACpC,IAAA,IAAI,UAAA,CAAW,GAAG,CAAA,EAAG;AACnB,MAAA,IAAI;AACF,QAAA,IAAA,GAAQ,KAAK,KAAA,CAAM,YAAA,CAAa,KAAK,MAAM,CAAC,EAAwB,IAAA,IAAQ,IAAA;AAAA,MAC9E,CAAA,CAAA,MAAQ;AACN,QAAA,IAAA,GAAO,IAAA;AAAA,MACT;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,QAAQ,GAAG,CAAA;AAC1B,IAAA,IAAI,WAAW,GAAA,EAAK;AACpB,IAAA,GAAA,GAAM,MAAA;AAAA,EACR;AAEA,EAAA,KAAA,MAAW,CAAA,IAAK,OAAA,EAAS,gBAAA,CAAiB,GAAA,CAAI,GAAG,IAAI,CAAA;AACrD,EAAA,OAAO,IAAA;AACT;AAOe,SAAR,WAAA,CAA6B,OAAA,GAA8B,EAAC,EAAW;AAC5E,EAAA,MAAM,UAAU,IAAI,GAAA,CAAI,OAAA,CAAQ,OAAA,IAAW,EAAE,CAAA;AAE7C,EAAA,MAAM,iBAAA,GAAoB,CAAC,QAAA,KAA0C;AACnE,IAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AACtB,IAAA,MAAM,IAAA,GAAO,cAAc,QAAQ,CAAA;AACnC,IAAA,OAAO,IAAA,IAAQ,SAAS,IAAA,CAAK,UAAA,CAAW,WAAW,CAAA,IAAK,OAAA,CAAQ,IAAI,IAAI,CAAA,CAAA;AAAA,EAC1E,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,mBAAA;AAAA,IACN,OAAA,EAAS,KAAA;AAAA,IAET,MAAA,GAAS;AACP,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,EAAE,GAAA,EAAK,WAAA,EAAa,iBAAiB,cAAA,EAAe;AAAA,QAC7D,OAAA,EAAS,EAAE,MAAA,EAAQ,CAAC,iBAAiB,cAAA,EAAgB,cAAA,EAAgB,cAAc,CAAA;AAAE,OACvF;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,SAAA,CAAU,MAAA,EAAQ,QAAA,EAAU,cAAA,EAAgB;AAChD,MAAA,IAAI,CAAC,cAAA,EAAgB,GAAA,EAAK,OAAO,IAAA;AACjC,MAAA,MAAM,MAAA,GAAS,cAAc,MAAM,CAAA;AACnC,MAAA,IAAI,CAAC,MAAA,IAAU,iBAAA,CAAkB,QAAQ,GAAG,OAAO,IAAA;AACnD,MAAA,OAAO,IAAA,CAAK,QAAQ,MAAA,EAAQ,QAAA,EAAU,EAAE,GAAG,cAAA,EAAgB,QAAA,EAAU,IAAA,EAAM,CAAA;AAAA,IAC7E;AAAA,GACF;AACF","file":"index.js","sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\r\nimport { dirname, join } from 'node:path';\r\nimport type { Plugin } from 'vite';\r\n\r\nexport interface VelozPluginOptions {\r\n /**\r\n * Package names whose imports of `@velozjs/dom` are left alone during SSR.\r\n * Packages named `@velozjs/*` are always excluded.\r\n */\r\n exclude?: string[];\r\n}\r\n\r\n/** During SSR, these client modules resolve to their server counterparts. */\r\nconst SSR_REDIRECTS: Record<string, string> = {\r\n '@velozjs/dom': '@velozjs/ssr',\r\n '@velozjs/dom/jsx-runtime': '@velozjs/ssr/jsx-runtime',\r\n '@velozjs/dom/jsx-dev-runtime': '@velozjs/ssr/jsx-dev-runtime',\r\n};\r\n\r\nconst packageNameCache = new Map<string, string | null>();\r\n\r\n/** Name of the nearest package.json above `file` (cached per directory). */\r\nfunction packageNameOf(file: string): string | null {\r\n const path = file.split('?')[0].replace(/^\\0/, '');\r\n let dir = dirname(path);\r\n const visited: string[] = [];\r\n let name: string | null = null;\r\n\r\n for (;;) {\r\n const cached = packageNameCache.get(dir);\r\n if (cached !== undefined) {\r\n name = cached;\r\n break;\r\n }\r\n visited.push(dir);\r\n const pkg = join(dir, 'package.json');\r\n if (existsSync(pkg)) {\r\n try {\r\n name = (JSON.parse(readFileSync(pkg, 'utf8')) as { name?: string }).name ?? null;\r\n } catch {\r\n name = null;\r\n }\r\n break;\r\n }\r\n const parent = dirname(dir);\r\n if (parent === dir) break;\r\n dir = parent;\r\n }\r\n\r\n for (const d of visited) packageNameCache.set(d, name);\r\n return name;\r\n}\r\n\r\n/**\r\n * Veloz for Vite: compiles JSX with the `@velozjs/dom` runtime, and during SSR\r\n * (dev `ssrLoadModule` and `vite build --ssr`) resolves app imports of\r\n * `@velozjs/dom` to `@velozjs/ssr`, so the same components render to HTML.\r\n */\r\nexport default function velozPlugin(options: VelozPluginOptions = {}): Plugin {\r\n const exclude = new Set(options.exclude ?? []);\r\n\r\n const isFrameworkModule = (importer: string | undefined): boolean => {\r\n if (!importer) return false;\r\n const name = packageNameOf(importer);\r\n return name != null && (name.startsWith('@velozjs/') || exclude.has(name));\r\n };\r\n\r\n return {\r\n name: 'vite-plugin-veloz',\r\n enforce: 'pre',\r\n\r\n config() {\r\n return {\r\n esbuild: { jsx: 'automatic', jsxImportSource: '@velozjs/dom' },\r\n resolve: { dedupe: ['@velozjs/core', '@velozjs/dom', '@velozjs/css', '@velozjs/ssr'] },\r\n };\r\n },\r\n\r\n async resolveId(source, importer, resolveOptions) {\r\n if (!resolveOptions?.ssr) return null;\r\n const target = SSR_REDIRECTS[source];\r\n if (!target || isFrameworkModule(importer)) return null;\r\n return this.resolve(target, importer, { ...resolveOptions, skipSelf: true });\r\n },\r\n };\r\n}\r\n\r\nexport { velozPlugin };\r\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":["viteVersion"],"mappings":"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","file":"index.js","sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\r\nimport { dirname, join } from 'node:path';\r\nimport { version as viteVersion, type Plugin, type UserConfig } from 'vite';\r\n\r\nfunction majorOf(version: string | undefined): number {\r\n return Number.parseInt(version ?? '', 10) || 0;\r\n}\r\nconst JSX_IMPORT_SOURCE = '@velozjs/dom';\r\n\r\nexport interface VelozPluginOptions {\r\n /**\r\n * Package names whose imports of `@velozjs/dom` are left alone during SSR.\r\n * Packages named `@velozjs/*` are always excluded.\r\n */\r\n exclude?: string[];\r\n}\r\n\r\n/** During SSR, these client modules resolve to their server counterparts. */\r\nconst SSR_REDIRECTS: Record<string, string> = {\r\n '@velozjs/dom': '@velozjs/ssr',\r\n '@velozjs/dom/jsx-runtime': '@velozjs/ssr/jsx-runtime',\r\n '@velozjs/dom/jsx-dev-runtime': '@velozjs/ssr/jsx-dev-runtime',\r\n};\r\n\r\nconst packageNameCache = new Map<string, string | null>();\r\n\r\n/** Name of the nearest package.json above `file` (cached per directory). */\r\nfunction packageNameOf(file: string): string | null {\r\n const path = file.split('?')[0].replace(/^\\0/, '');\r\n let dir = dirname(path);\r\n const visited: string[] = [];\r\n let name: string | null = null;\r\n\r\n for (;;) {\r\n const cached = packageNameCache.get(dir);\r\n if (cached !== undefined) {\r\n name = cached;\r\n break;\r\n }\r\n visited.push(dir);\r\n const pkg = join(dir, 'package.json');\r\n if (existsSync(pkg)) {\r\n try {\r\n name = (JSON.parse(readFileSync(pkg, 'utf8')) as { name?: string }).name ?? null;\r\n } catch {\r\n name = null;\r\n }\r\n break;\r\n }\r\n const parent = dirname(dir);\r\n if (parent === dir) break;\r\n dir = parent;\r\n }\r\n\r\n for (const d of visited) packageNameCache.set(d, name);\r\n return name;\r\n}\r\n\r\n/**\r\n * Veloz for Vite: compiles JSX with the `@velozjs/dom` runtime, and during SSR\r\n * (dev `ssrLoadModule` and `vite build --ssr`) resolves app imports of\r\n * `@velozjs/dom` to `@velozjs/ssr`, so the same components render to HTML.\r\n */\r\nexport default function velozPlugin(options: VelozPluginOptions = {}): Plugin {\r\n const exclude = new Set(options.exclude ?? []);\r\n\r\n const isFrameworkModule = (importer: string | undefined): boolean => {\r\n if (!importer) return false;\r\n const name = packageNameOf(importer);\r\n return name != null && (name.startsWith('@velozjs/') || exclude.has(name));\r\n };\r\n\r\n return {\r\n name: 'vite-plugin-veloz',\r\n enforce: 'pre',\r\n\r\n config() {\r\n // Vite 8 transforms with Oxc; earlier versions with esbuild. Ask the Vite\r\n // that is running (this.meta, Vite 7+): the imported `vite` can be another\r\n // copy, e.g. in a monorepo or when this plugin is linked.\r\n const running = (this as { meta?: { viteVersion?: string } } | undefined)?.meta?.viteVersion;\r\n const jsx =\r\n majorOf(running ?? viteVersion) >= 8\r\n ? { oxc: { jsx: { runtime: 'automatic', importSource: JSX_IMPORT_SOURCE } } }\r\n : { esbuild: { jsx: 'automatic', jsxImportSource: JSX_IMPORT_SOURCE } };\r\n return {\r\n ...jsx,\r\n resolve: { dedupe: ['@velozjs/core', '@velozjs/dom', '@velozjs/css', '@velozjs/ssr'] },\r\n // Externalized dependencies are loaded by Node directly and never reach\r\n // resolveId, so @velozjs/dom imports could not be redirected. Processing\r\n // dom and ssr through Vite also keeps a single copy of the SSR runtime.\r\n ssr: { noExternal: ['@velozjs/dom', '@velozjs/ssr'] },\r\n } as UserConfig;\r\n },\r\n\r\n async resolveId(source, importer, resolveOptions) {\r\n if (!resolveOptions?.ssr) return null;\r\n const target = SSR_REDIRECTS[source];\r\n if (!target || isFrameworkModule(importer)) return null;\r\n return this.resolve(target, importer, { ...resolveOptions, skipSelf: true });\r\n },\r\n };\r\n}\r\n\r\nexport { velozPlugin };\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vite-plugin-veloz",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Vite plugin for Veloz: JSX setup and SSR module resolution.",
5
5
  "keywords": [
6
6
  "vite",
@@ -40,7 +40,7 @@
40
40
  },
41
41
  "author": "Julio Carneiro (https://juliocarneiro.dev)",
42
42
  "license": "MIT",
43
- "homepage": "https://github.com/juliocarneiro/veloz#readme",
43
+ "homepage": "https://veloz-site.vercel.app",
44
44
  "repository": {
45
45
  "type": "git",
46
46
  "url": "git+https://github.com/juliocarneiro/veloz.git",