@vizejs/rspack-plugin 0.58.0 → 0.59.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.
@@ -0,0 +1,145 @@
1
+ //#region src/types/index.d.ts
2
+ /** Type definitions for @vizejs/rspack-plugin. */
3
+ interface SfcCompileOptionsNapi {
4
+ filename?: string;
5
+ sourceMap?: boolean;
6
+ ssr?: boolean;
7
+ /** Enable Vapor mode compilation */
8
+ vapor?: boolean;
9
+ /** Preserve TypeScript in output when true */
10
+ isTs?: boolean;
11
+ /** Scope ID for scoped CSS (e.g., "data-v-abc123") */
12
+ scopeId?: string;
13
+ }
14
+ interface SfcCompileResultNapi {
15
+ code: string;
16
+ css?: string;
17
+ /** Source map JSON (when implemented) */
18
+ map?: string;
19
+ errors: string[];
20
+ warnings: string[];
21
+ }
22
+ interface StyleBlockInfo {
23
+ /** Raw style content */
24
+ content: string;
25
+ /** External source from `<style src="...">` */
26
+ src?: string | null;
27
+ /** Language of the style block (e.g., "css", "scss", "less", "sass", "stylus") */
28
+ lang: string | null;
29
+ /** Whether scoped */
30
+ scoped: boolean;
31
+ /** CSS Modules: true for unnamed, or binding name for named */
32
+ module: boolean | string;
33
+ /** Block index in the SFC */
34
+ index: number;
35
+ }
36
+ interface CustomBlockInfo {
37
+ /** Tag name (e.g., "i18n", "docs") */
38
+ type: string;
39
+ /** Raw content */
40
+ content: string;
41
+ /** External source from `<block src="...">` */
42
+ src?: string | null;
43
+ /** All attributes on the tag */
44
+ attrs: Record<string, string | true>;
45
+ /** Block index in the SFC */
46
+ index: number;
47
+ }
48
+ interface SfcSrcInfo {
49
+ /** <script src> path, or null */
50
+ scriptSrc?: string | null;
51
+ /** <template src> path, or null */
52
+ templateSrc?: string | null;
53
+ }
54
+ /** Static asset URL in template to be rewritten as an import binding. */
55
+ interface TemplateAssetUrl {
56
+ /** Raw URL as in template (e.g., "./logo.png") */
57
+ url: string;
58
+ /** JS identifier for the import (e.g., "_imports_0") */
59
+ varName: string;
60
+ }
61
+ interface CompiledModule {
62
+ code: string;
63
+ css?: string;
64
+ errors: string[];
65
+ warnings: string[];
66
+ scopeId: string;
67
+ hasScoped: boolean;
68
+ /** Per-block style metadata */
69
+ styles: StyleBlockInfo[];
70
+ /** Custom blocks from the SFC */
71
+ customBlocks: CustomBlockInfo[];
72
+ /** Whether custom element (e.g., .ce.vue) */
73
+ isCustomElement: boolean;
74
+ /** Static asset URLs needing import rewrite. Empty when transformAssetUrls is false. */
75
+ templateAssetUrls: TemplateAssetUrl[];
76
+ }
77
+ interface VizeLoaderOptions {
78
+ /** Source maps @default true */
79
+ sourceMap?: boolean;
80
+ /** SSR mode @default false */
81
+ ssr?: boolean;
82
+ /** Project root */
83
+ root?: string;
84
+ /** Include filter */
85
+ include?: string | RegExp | (string | RegExp)[];
86
+ /** Exclude filter */
87
+ exclude?: string | RegExp | (string | RegExp)[];
88
+ /** Low-level compiler options for @vizejs/native compileSfc */
89
+ compilerOptions?: SfcCompileOptionsNapi;
90
+ /** Custom element mode. true=all, RegExp=matched. @default /\.ce\.vue$/ */
91
+ customElement?: boolean | RegExp;
92
+ /** Vapor mode @default false */
93
+ vapor?: boolean;
94
+ /** HMR. false to disable in dev. @default true (dev), false (prod/SSR) */
95
+ hotReload?: boolean;
96
+ /**
97
+ * Transform static asset URLs in templates into import bindings.
98
+ * true=built-in tags, false=disabled, object=custom map. @default true
99
+ */
100
+ transformAssetUrls?: boolean | Record<string, string[]>;
101
+ }
102
+ interface VizeStyleLoaderOptions {
103
+ /** Native CSS mode (experiments.css) @default false */
104
+ native?: boolean;
105
+ }
106
+ interface VizeRspackPluginOptions {
107
+ /** Include filter @default /\.vue$/ */
108
+ include?: string | RegExp | (string | RegExp)[];
109
+ /** Exclude filter @default /node_modules/ */
110
+ exclude?: string | RegExp | (string | RegExp)[];
111
+ /** Force production mode @default auto-detected */
112
+ isProduction?: boolean;
113
+ /** SSR mode @default false */
114
+ ssr?: boolean;
115
+ /** Source maps @default true (dev), false (prod) */
116
+ sourceMap?: boolean;
117
+ /** Vapor mode @default false */
118
+ vapor?: boolean;
119
+ /** Root directory @default Rspack's root */
120
+ root?: string;
121
+ /** CSS config */
122
+ css?: {
123
+ /** Native CSS (experiments.css), uses LightningCSS @default false */native?: boolean;
124
+ };
125
+ /** Compiler options */
126
+ compilerOptions?: SfcCompileOptionsNapi;
127
+ /** Debug logging @default false */
128
+ debug?: boolean;
129
+ /** Auto-clone CSS rules for Vue style sub-requests (like VueLoaderPlugin). @default true */
130
+ autoRules?: boolean;
131
+ /**
132
+ * Auto-inject a `builtin:swc-loader` post-processing rule to strip TypeScript
133
+ * annotations from compiled `.vue` output. Safe for non-TS SFCs (SWC passes
134
+ * plain JS through unchanged). Set to `false` to handle TS stripping yourself.
135
+ * @default true
136
+ */
137
+ typescript?: boolean;
138
+ }
139
+ /** Loader entry: either a string (loader name/path) or an object with loader + options */
140
+ type LoaderEntry = string | {
141
+ loader: string;
142
+ options?: Record<string, unknown>;
143
+ };
144
+ //#endregion
145
+ export { SfcCompileResultNapi as a, VizeLoaderOptions as c, SfcCompileOptionsNapi as i, VizeRspackPluginOptions as l, CustomBlockInfo as n, SfcSrcInfo as o, LoaderEntry as r, StyleBlockInfo as s, CompiledModule as t, VizeStyleLoaderOptions as u };
@@ -0,0 +1,74 @@
1
+ import { a as SfcCompileResultNapi, c as VizeLoaderOptions, i as SfcCompileOptionsNapi, l as VizeRspackPluginOptions, n as CustomBlockInfo, o as SfcSrcInfo, r as LoaderEntry, s as StyleBlockInfo, t as CompiledModule, u as VizeStyleLoaderOptions } from "./index-CrdHfSbU.mjs";
2
+ import vizeLoader from "./loader/index.mjs";
3
+ import vizeStyleLoader from "./loader/style-loader.mjs";
4
+ import vizeScopeLoader from "./loader/scope-loader.mjs";
5
+ import { Compiler, RuleSetRule } from "@rspack/core";
6
+
7
+ //#region src/plugin/index.d.ts
8
+ declare class VizePlugin {
9
+ static readonly name = "VizePlugin";
10
+ private options;
11
+ constructor(options?: VizeRspackPluginOptions);
12
+ apply(compiler: Compiler): void;
13
+ private shouldHandleFile;
14
+ }
15
+ //#endregion
16
+ //#region src/plugin/ruleCloning.d.ts
17
+ interface RuleCloningResult {
18
+ /** Whether rule cloning was performed */
19
+ applied: boolean;
20
+ /** Number of CSS rules cloned */
21
+ clonedCount: number;
22
+ /** Warnings to emit through the infrastructure logger */
23
+ warnings: string[];
24
+ }
25
+ /**
26
+ * Mutates `rules` in-place: wraps .vue rule into `oneOf`, clones CSS rules for style sub-requests.
27
+ */
28
+ declare function applyRuleCloning(rules: (RuleSetRule | "...")[], nativeCss: boolean): RuleCloningResult;
29
+ //#endregion
30
+ //#region src/shared/utils.d.ts
31
+ /** Generate scope ID (8-char SHA256 prefix). Uses relative path for cross-env consistency. */
32
+ declare function generateScopeId(filename: string, rootContext?: string, isProduction?: boolean, source?: string): string;
33
+ /** Extract style block metadata from SFC source. */
34
+ declare function extractStyleBlocks(source: string): StyleBlockInfo[];
35
+ /** Fallback scoped CSS transformer using regex. Does not support @media nesting, :deep()/:global()/:slotted(). */
36
+ declare function addScopeToCssFallback(css: string, scopeId: string): string;
37
+ /** Extract custom block metadata from SFC source (non-script/template/style tags). */
38
+ declare function extractCustomBlocks(source: string): CustomBlockInfo[];
39
+ /** Extract <script src> and <template src> references from SFC source. */
40
+ declare function extractSrcInfo(source: string): SfcSrcInfo;
41
+ /** Replace <script src> or <template src> with inline content from external files. */
42
+ declare function inlineSrcBlocks(source: string, scriptContent: string | null, templateContent: string | null): string;
43
+ /** Match a file path against include/exclude patterns. Normalizes backslashes. */
44
+ declare function matchesPattern(file: string, pattern: string | RegExp | (string | RegExp)[] | undefined, defaultValue: boolean): boolean;
45
+ //#endregion
46
+ //#region src/shared/hotReload.d.ts
47
+ /** HMR code generation for Vue SFCs using `module.hot` (Rspack/webpack CJS API). */
48
+ /** Generate `module.hot` HMR boilerplate for a Vue SFC. */
49
+ declare function genHotReloadCode(id: string): string;
50
+ //#endregion
51
+ //#region src/shared/compiler.d.ts
52
+ /** Clear the compilation cache. Exposed for testing. */
53
+ declare function clearCompilationCache(): void;
54
+ /** Compile a .vue file with content-hash caching. */
55
+ declare function compileFile(filePath: string, source: string, options?: {
56
+ sourceMap?: boolean;
57
+ ssr?: boolean;
58
+ vapor?: boolean;
59
+ compilerOptions?: SfcCompileOptionsNapi;
60
+ isCustomElement?: boolean;
61
+ rootContext?: string;
62
+ isProduction?: boolean; /** @see VizeLoaderOptions.transformAssetUrls */
63
+ transformAssetUrls?: boolean | Record<string, string[]>;
64
+ }): CompiledModule;
65
+ /** Generate JS output with style/custom-block imports and optional HMR code. */
66
+ declare function generateOutput(compiled: CompiledModule, options: {
67
+ requestPath: string; /** Inject HMR boilerplate using `module.hot` (Rspack/webpack CJS API) */
68
+ hmr?: boolean; /** Original file path (for __file exposure in dev mode) */
69
+ filePath?: string; /** Whether this is a production build */
70
+ isProduction?: boolean; /** Project root context (for computing relative __file path) */
71
+ rootContext?: string;
72
+ }): string;
73
+ //#endregion
74
+ export { type CompiledModule, type CustomBlockInfo, type LoaderEntry, type RuleCloningResult, type SfcCompileOptionsNapi, type SfcCompileResultNapi, type SfcSrcInfo, type StyleBlockInfo, type VizeLoaderOptions, VizePlugin, type VizeRspackPluginOptions, type VizeStyleLoaderOptions, addScopeToCssFallback, applyRuleCloning, clearCompilationCache, compileFile, extractCustomBlocks, extractSrcInfo, extractStyleBlocks, genHotReloadCode, generateOutput, generateScopeId, inlineSrcBlocks, matchesPattern, vizeLoader, vizeScopeLoader, vizeStyleLoader };
package/dist/index.mjs ADDED
@@ -0,0 +1 @@
1
+ import{a as e,c as t,i as n,o as r,r as i,s as a,t as o}from"./utils-DDd2p4Wp.mjs";import{a as s,i as c,n as l,r as u,t as d}from"./loader-BGVyAZvr.mjs";import f from"./loader/style-loader.mjs";import p from"./loader/scope-loader.mjs";const m=`@vizejs/rspack-plugin/style-loader`,h=`@vizejs/rspack-plugin/scope-loader`,g={"\\.css$":`css`,"\\.scss$":`scss`,"\\.sass$":`sass`,"\\.less$":`less`,"\\.styl(us)?$":`styl`};function _(e,t){let n=[],r=e.findIndex(e=>e!==`...`&&v(e));if(r===-1)return{applied:!1,clonedCount:0,warnings:n};let i=e[r];if(i.oneOf)return{applied:!1,clonedCount:0,warnings:n};let a=[];for(let t=0;t<e.length;t++){if(t===r)continue;let n=e[t];if(n===`...`)continue;let i=x(n);i&&a.push({index:t,rule:n,lang:i})}let o=[];for(let e of a){let n=S(e.rule,e.lang,t);n&&o.push(n)}o.some(e=>e.resourceQuery instanceof RegExp&&e.resourceQuery.test(`vue&type=style&index=0&lang=css`))||o.push(C(t));let s={use:E(i)},c=[...o,s];e[r]={test:i.test,oneOf:c};for(let e of a)w(e.rule);return{applied:!0,clonedCount:o.length,warnings:n}}function v(e){return b(e.test)?E(e).some(e=>{let t=typeof e==`string`?e:e.loader;return t?y(t):!1}):!1}function y(e){return e===`@vizejs/rspack-plugin/loader`||e.includes(`rspack-vize-plugin`)&&e.includes(`loader`)&&!e.includes(`style-loader`)&&!e.includes(`scope-loader`)}function b(e){return e?e instanceof RegExp?e.test(`App.vue`)||e.test(`foo.vue`):typeof e==`string`?e.includes(`.vue`):!1:!1}function x(e){let t=e.test;if(!t||!(t instanceof RegExp))return null;let n=t.source;for(let[e,t]of Object.entries(g))if(n.includes(e)||n===e)return t;return t.test(`foo.css`)&&!t.test(`foo.vue`)?`css`:t.test(`foo.scss`)&&!t.test(`foo.vue`)?`scss`:t.test(`foo.sass`)&&!t.test(`foo.vue`)?`sass`:t.test(`foo.less`)&&!t.test(`foo.vue`)?`less`:t.test(`foo.styl`)&&!t.test(`foo.vue`)?`styl`:null}function S(e,t,n){let r=E(e);if(r.length===0)return null;let i={resourceQuery:RegExp(`(?=.*type=style)(?=.*lang=${t})`),use:[{loader:h},...D(r),{loader:m}]};return e.type?i.type=e.type:n&&(i.type=`css/auto`),i}function C(e){let t=/(?=.*type=style)(?=.*lang=css)/;return e?{resourceQuery:t,type:`css/auto`,use:[{loader:h},{loader:m}]}:{resourceQuery:t,type:`javascript/auto`,use:[{loader:h},{loader:m}]}}function w(e){let t=e.resourceQuery;if(t)return typeof t==`object`&&!Array.isArray(t)&&!(t instanceof RegExp)&&`not`in t,void 0;e.resourceQuery={not:[/vue/]}}function T(e){return e?Array.isArray(e)?e:[e]:[]}function E(e){let t=T(e.use);if(t.length>0)return t;let n=e.loader;if(n){let t=e.options;return t?[{loader:n,options:t}]:[n]}return[]}function D(e){return e.map(e=>{if(typeof e==`string`)return e;if(typeof e==`object`&&e){let t={...e};return`options`in e&&e.options&&typeof e.options==`object`&&(t.options={...e.options}),t}return e})}var O=class e{static name=`VizePlugin`;options;constructor(e={}){this.options=e}apply(t){let n=t.getInfrastructureLogger(e.name),r=this.options.isProduction??t.options.mode===`production`;this.options.vapor&&!r&&n.debug(`Vapor mode is enabled.`);let i=!!t.options.experiments?.css;if(this.options.css?.native&&!i&&n.warn("`css.native: true` is set but `experiments.css` is not enabled in rspack config."),this.options.autoRules??!0){let e=t.options.module?.rules;if(e){let t=_(e,i);t.applied&&n.debug(`Auto-injected ${t.clonedCount} style rule(s) for Vue SFC sub-requests.`);for(let e of t.warnings)n.warn(e)}}if(this.options.typescript??!0){let e=t.options.module?.rules;e&&(e.some(e=>{if(e===`...`||typeof e!=`object`||!e)return!1;let t=e;if(t.enforce!==`post`)return!1;let n=t.test;return n instanceof RegExp?n.test(`App.vue`):typeof n==`string`?n.includes(`.vue`):!1})||(e.push({test:/\.vue$/,resourceQuery:{not:[/type=/]},enforce:`post`,loader:`builtin:swc-loader`,options:{jsc:{parser:{syntax:`typescript`}}},type:`javascript/auto`}),n.debug(`Auto-injected TypeScript post-processing rule for .vue files.`)))}let{DefinePlugin:a}=t.webpack,o=new Set;for(let e of t.options.plugins??[]){let t=e?.definitions;if(t)for(let e of Object.keys(t))o.add(e)}let s={};o.has(`__VUE_OPTIONS_API__`)||(s.__VUE_OPTIONS_API__=JSON.stringify(!0)),o.has(`__VUE_PROD_DEVTOOLS__`)||(s.__VUE_PROD_DEVTOOLS__=JSON.stringify(!r)),o.has(`__VUE_PROD_HYDRATION_MISMATCH_DETAILS__`)||(s.__VUE_PROD_HYDRATION_MISMATCH_DETAILS__=JSON.stringify(!r)),Object.keys(s).length>0&&new a(s).apply(t),r||t.hooks.watchRun.tap(e.name,e=>{let t=e.modifiedFiles,r=e.removedFiles;if(t)for(let e of t)e.endsWith(`.vue`)&&this.shouldHandleFile(e)&&n.debug(`Vue file changed: ${e}`);if(r)for(let e of r)e.endsWith(`.vue`)&&this.shouldHandleFile(e)&&n.debug(`Vue file removed: ${e}`)})}shouldHandleFile(e){return!(!t(e,this.options.include,!0)||t(e,this.options.exclude,!1))}};export{O as VizePlugin,o as addScopeToCssFallback,_ as applyRuleCloning,l as clearCompilationCache,u as compileFile,i as extractCustomBlocks,n as extractSrcInfo,e as extractStyleBlocks,s as genHotReloadCode,c as generateOutput,r as generateScopeId,a as inlineSrcBlocks,t as matchesPattern,d as vizeLoader,p as vizeScopeLoader,f as vizeStyleLoader};
@@ -0,0 +1,7 @@
1
+ import { c as VizeLoaderOptions } from "../index-CrdHfSbU.mjs";
2
+ import { LoaderContext } from "@rspack/core";
3
+
4
+ //#region src/loader/index.d.ts
5
+ declare function vizeLoader(this: LoaderContext<VizeLoaderOptions>, source: string): void;
6
+ //#endregion
7
+ export { vizeLoader as default };
@@ -0,0 +1 @@
1
+ import{t as e}from"../loader-BGVyAZvr.mjs";export{e as default};
@@ -0,0 +1,7 @@
1
+ import { LoaderContext } from "@rspack/core";
2
+
3
+ //#region src/loader/scope-loader.d.ts
4
+ interface VizeScopeLoaderOptions {}
5
+ declare function vizeScopeLoader(this: LoaderContext<VizeScopeLoaderOptions>, source: string): void;
6
+ //#endregion
7
+ export { VizeScopeLoaderOptions, vizeScopeLoader as default };
@@ -0,0 +1 @@
1
+ import{l as e}from"../utils-DDd2p4Wp.mjs";import*as t from"@vizejs/native";const{compileCss:n}=t;function r(t){let r=this.async(),{resourceQuery:i,resourcePath:a}=this;if(!i){r(null,t);return}let o=new URLSearchParams(i.slice(1)).get(`scoped`);if(!o){r(null,t);return}let s=`data-v-${o}`,c=n(e(t),{filename:a,scoped:!0,scopeId:s});for(let e of c.errors)this.emitError(Error(`[vize] ${e}`));for(let e of c.warnings)this.emitWarning(Error(`[vize] ${e}`));r(null,c.code)}export{r as default};
@@ -0,0 +1,7 @@
1
+ import { u as VizeStyleLoaderOptions } from "../index-CrdHfSbU.mjs";
2
+ import { LoaderContext } from "@rspack/core";
3
+
4
+ //#region src/loader/style-loader.d.ts
5
+ declare function vizeStyleLoader(this: LoaderContext<VizeStyleLoaderOptions>, source: string): void;
6
+ //#endregion
7
+ export { vizeStyleLoader as default };
@@ -0,0 +1 @@
1
+ import{a as e}from"../utils-DDd2p4Wp.mjs";import t from"node:path";import n from"node:fs/promises";function r(r){let i=this.async(),{resourceQuery:a,resourcePath:o}=this;if(!a){i(null,r);return}let s=new URLSearchParams(a.slice(1));if(s.get(`type`)!==`style`){i(null,r);return}let c=parseInt(s.get(`index`)||`0`,10);this.addDependency(o);let l=e(r)[c];if(!l){this.emitError(Error(`[vize] Style block at index ${c} not found in ${o}`)),i(null,``);return}if(l.src){let e=t.resolve(t.dirname(o),l.src);this.addDependency(e),n.readFile(e,`utf-8`).then(e=>{i(null,e)}).catch(()=>{this.emitWarning(Error(`[vize] <style src> target not found: ${l.src} (resolved: ${e}) in ${o}`)),i(null,``)});return}i(null,l.content)}export{r as default};
@@ -0,0 +1,24 @@
1
+ import{a as e,c as t,i as n,n as r,o as i,r as a,s as o}from"./utils-DDd2p4Wp.mjs";import{createHash as s}from"node:crypto";import c from"node:path";import l from"node:fs";import*as u from"@vizejs/native";function d(e){return`
2
+ /* hot reload */
3
+ if (module.hot) {
4
+ _sfc_main.__hmrId = "${e}"
5
+ const api = __VUE_HMR_RUNTIME__
6
+ module.hot.accept()
7
+ if (!api.createRecord('${e}', _sfc_main)) {
8
+ api.reload('${e}', _sfc_main)
9
+ }
10
+ }`}function f(e,t,n,r){return`
11
+ if (module.hot) {
12
+ module.hot.accept(${t}, () => {
13
+ _sfc_main.__cssModules[${JSON.stringify(r)}] = ${n}
14
+ __VUE_HMR_RUNTIME__.rerender("${e}")
15
+ })
16
+ }`}const{compileSfc:p}=u,m=new Map;function h(e){return s(`sha256`).update(e).digest(`hex`).slice(0,16)}function g(){m.clear()}function _(t,n,o={}){let s=o.compilerOptions?.isTs??/<script[^>]*\blang=["']ts["']/.test(n),c=o.ssr??o.compilerOptions?.ssr??!1,l=o.vapor??o.compilerOptions?.vapor??!1,u=o.sourceMap??o.compilerOptions?.sourceMap??!0,d=o.isCustomElement??!1,f=o.rootContext??``,g=o.isProduction??!1,_=o.transformAssetUrls??!0,v=`${t}:ssr=${c}:vapor=${l}:ts=${s}:map=${u}:ce=${d}:root=${f}:prod=${g}:${_===!1?`tau=false`:_===!0?`tau=true`:`tau=${JSON.stringify(_)}`}`,y=h(n),b=m.get(v);if(b&&b.contentHash===y)return b.result;let x=i(t,o.rootContext,o.isProduction,n),S=/<style[^>]*\bscoped\b/.test(n),C=p(n,{...o.compilerOptions,filename:t,sourceMap:o.sourceMap??o.compilerOptions?.sourceMap??!0,ssr:c,vapor:l,isTs:s,scopeId:S?`data-v-${x}`:void 0}),w=e(n),T=a(n),E=r(n,_),D={code:C.code,css:C.css,errors:C.errors,warnings:C.warnings,scopeId:x,hasScoped:S,styles:w,customBlocks:T,isCustomElement:d,templateAssetUrls:E};return D.errors.length===0&&m.set(v,{contentHash:y,result:D}),D}function v(e,t){let n=e.code,r=e.isCustomElement;if(e.templateAssetUrls.length>0)for(let{url:t,varName:r}of e.templateAssetUrls){let e=t.indexOf(`#`),i=e>=0?t.slice(e):``,a=i?`${r} + ${JSON.stringify(i)}`:r,o=t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);n=n.replace(RegExp(`"${o}"`,`g`),a),n=n.replace(RegExp(`'${o}'`,`g`),a)}let i=/^export default /m,a=i.test(n),o=/\bconst\s+_sfc_main\s*=/.test(n);if(a&&!o?(n=n.replace(i,`const _sfc_main = `),e.hasScoped&&e.scopeId&&(n+=`\n_sfc_main.__scopeId = "data-v-${e.scopeId}";`),n+=`
17
+ export default _sfc_main;`):a&&o&&e.hasScoped&&e.scopeId&&(n=n.replace(/^export default _sfc_main/m,`_sfc_main.__scopeId = "data-v-${e.scopeId}";\nexport default _sfc_main`)),e.styles.length>0){if(r&&e.styles.some(e=>e.module))throw Error(`[vize] <style module> is not supported in custom elements mode.`);let i=e.styles.filter(e=>e.module===!0).length;if(i>1)throw Error(`[vize] Found ${i} unnamed <style module> blocks. Only one unnamed <style module> is allowed per SFC. Use named modules instead: <style module="name">`);let a=e.styles.filter(e=>e.src||/\S/.test(e.content)),o=[];if(n=a.map(n=>{let i=[`vue`,`type=style`,`index=${n.index}`,`lang=${n.lang||`css`}`,...n.scoped?[`scoped=${e.scopeId}`]:[],...n.module?[`module=${typeof n.module==`string`?n.module:`true`}`]:[],...r?[`inline`]:[]].join(`&`),a=`${t.requestPath}?${i}`;if(r)return`import _style_${n.index} from ${JSON.stringify(a)};`;if(n.module){let e=typeof n.module==`string`?n.module:`$style`,t=`_cssModule_${n.index}`;return o.push({request:a,varName:t,bindingName:e}),`import ${t} from ${JSON.stringify(a)};`}return`import ${JSON.stringify(a)};`}).join(`
18
+ `)+`
19
+ `+n,r){let e=a.map(e=>`_style_${e.index}`).join(`,`);n=n.replace(/^export default _sfc_main;/m,`_sfc_main.styles = [${e}];\nexport default _sfc_main;`)}if(!r&&o.length>0){let r=o.map(e=>`_sfc_main.__cssModules = _sfc_main.__cssModules || {};\n_sfc_main.__cssModules[${JSON.stringify(e.bindingName)}] = ${e.varName};`).join(`
20
+ `),i=t.hmr&&e.scopeId?o.map(t=>f(e.scopeId,JSON.stringify(t.request),t.varName,t.bindingName)).join(`
21
+ `):``;n=n.replace(/^export default _sfc_main;/m,`${r}\n${i}\nexport default _sfc_main;`)}}if(t.filePath&&!t.isProduction){let e=t.rootContext?c.relative(t.rootContext,t.filePath).replace(/\\/g,`/`):c.basename(t.filePath);n=n.replace(/^export default _sfc_main;/m,`_sfc_main.__file = ${JSON.stringify(e)};\nexport default _sfc_main;`)}if(t.hmr&&e.scopeId&&(n=n.replace(/^export default _sfc_main;/m,`${d(e.scopeId)}\nexport default _sfc_main;`)),e.customBlocks.length>0){let r=e.customBlocks.map((e,n)=>{let r=[`vue`,`type=${e.type}`,`index=${n}`,...e.src?[`src=true`]:[]];for(let[t,n]of Object.entries(e.attrs))t!==`src`&&(n===!0?r.push(t):r.push(`${t}=${n}`));let i=r.join(`&`),a=t.requestPath;return`import block${n} from ${JSON.stringify(`${a}?${i}`)};\nif (typeof block${n} === 'function') block${n}(_sfc_main);`}).join(`
22
+ `);n=n.replace(/^export default _sfc_main;/m,`${r}\nexport default _sfc_main;`)}return e.templateAssetUrls.length>0&&(n=e.templateAssetUrls.map(({url:e,varName:t})=>{let n=e.startsWith(`~`)?e.slice(1):e,r=n.indexOf(`#`);return r>=0&&(n=n.slice(0,r)),`import ${t} from ${JSON.stringify(n)};`}).join(`
23
+ `)+`
24
+ `+n),n}const y=/\.ce\.vue$/;function b(e){let t=this.async(),r=this.getOptions(),i=this.resourcePath,s=this.resourceQuery,u=C(this,i),d=this.mode===`production`||process.env.NODE_ENV===`production`,f=!(r.ssr??!1)&&!d&&r.hotReload!==!1;if(this.addDependency(i),s?.includes(`type=style`)){t(Error(`[vize] Main loader received style sub-request: ${i}${s}. Use module.rules[].oneOf with resourceQuery branches so style requests are handled by @vizejs/rspack-plugin/style-loader.`));return}if(s&&s.includes(`vue`)&&s.includes(`type=`)&&!s.includes(`type=style`)){let n=new URLSearchParams(s.slice(1)),r=n.get(`type`);if(r&&r!==`style`){let o=parseInt(n.get(`index`)||`0`,10),s=a(e)[o];if(s){if(s.src){let e=c.resolve(c.dirname(i),s.src);this.addDependency(e);try{t(null,l.readFileSync(e,`utf-8`))}catch{t(Error(`[vize] Custom block <${r} src="${s.src}"> not found (resolved: ${e}) in ${i}`))}return}t(null,s.content)}else t(null,``);return}}if(!x(i,r)){this.emitWarning(Error(`[vize] File is filtered out by loader options include/exclude: ${i}. Passing through source unchanged.`)),t(null,e);return}try{let a=S(i,r.customElement),s=n(e),p=e;if(s.scriptSrc){let e=c.resolve(c.dirname(i),s.scriptSrc);this.addDependency(e);try{let t=l.readFileSync(e,`utf-8`);p=o(p,t,null)}catch{t(Error(`[vize] <script src="${s.scriptSrc}"> not found (resolved: ${e}) in ${i}`));return}}if(s.templateSrc){let e=c.resolve(c.dirname(i),s.templateSrc);this.addDependency(e);try{let t=l.readFileSync(e,`utf-8`);p=o(p,null,t)}catch{t(Error(`[vize] <template src="${s.templateSrc}"> not found (resolved: ${e}) in ${i}`));return}}let m=_(i,p,{sourceMap:r.sourceMap??this.sourceMap??!0,ssr:r.ssr??!1,vapor:r.vapor??!1,compilerOptions:r.compilerOptions,isCustomElement:a,rootContext:this.rootContext,isProduction:d,transformAssetUrls:r.transformAssetUrls});for(let e of m.warnings)this.emitWarning(Error(`[vize] ${e}`));if(m.errors.length>0){for(let e of m.errors)this.emitError(Error(`[vize] ${e}`));let e=m.errors.join(`\\n`);t(Error(`[vize] Compilation failed for ${i}:\n${e}`));return}t(null,v(m,{requestPath:u,hmr:f,filePath:i,isProduction:d,rootContext:this.rootContext}))}catch(e){t(e)}}function x(e,n){return!(!t(e,n.include,!0)||t(e,n.exclude,!1))}function S(e,t){return t===!0?!0:t===!1||t===void 0?y.test(e):t.test(e)}function C(e,t){return`./${c.basename(t)}`}export{d as a,v as i,g as n,_ as r,b as t};
@@ -0,0 +1,4 @@
1
+ import{createHash as e}from"node:crypto";import t from"node:path";function n(n,r,i,a){let o;if(r){let e=t.relative(r,n).replace(/^(\.\.[/\\])+/,``).replace(/\\/g,`/`);o=i&&a?e+`
2
+ `+a.replace(/\r\n/g,`
3
+ `):e}else o=n;return e(`sha256`).update(o).digest(`hex`).slice(0,8)}function r(e){let t=[],n=/<style([^>]*)>([\s\S]*?)<\/style>/gi,r,i=0;for(;(r=n.exec(e))!==null;){let e=r[1],n=r[2],a=e.match(/\bsrc=["']([^"']+)["']/)?.[1]??null,o=e.match(/\blang=["']([^"']+)["']/)?.[1]??null,s=/\bscoped\b/.test(e),c=e.match(/\bmodule(?:=["']([^"']+)["'])?/),l=c?c[1]||!0:!1;t.push({content:n,src:a,lang:o,scoped:s,module:l,index:i}),i++}return t}function i(e,t){let n=`[data-v-${t}]`,r=``,i=0,a=0,s=0;for(;a<e.length;){let t=e[a];if(t===`{`){if(i===0){let t=e.slice(s,a);r+=o(t,n),r+=`{`}else r+=t;i++,a++,s=a}else t===`}`?(i--,r+=t,a++,s=a):(i>0&&(r+=t),a++)}return s<e.length&&i===0&&(r+=e.slice(s)),r}function a(e){if(!e.includes(`/*`))return e;let t=e.length,n=[],r=0,i=0;for(;i<t;){let a=e.charCodeAt(i);if(a===34||a===39){let n=a;for(i++;i<t;){let t=e.charCodeAt(i);if(t===92){i+=2;continue}if(i++,t===n)break}continue}if(a===47&&i+1<t&&e.charCodeAt(i+1)===42){i>r&&n.push(e.slice(r,i)),i+=2;let a=` `;for(;i<t;){if(e.charCodeAt(i)===42&&i+1<t&&e.charCodeAt(i+1)===47){a+=` `,i+=2;break}a+=e.charCodeAt(i)===10?`
4
+ `:` `,i++}n.push(a),r=i;continue}i++}return r===0?e:(r<t&&n.push(e.slice(r)),n.join(``))}function o(e,t){return e.trim().startsWith(`@`)?e:e.split(`,`).map(e=>{let n=e.trim();return!n||n.startsWith(`@`)?e:`${e.match(/^(\s*)/)?.[1]??``}${n}${t}`}).join(`,`)}function s(e){let t=[],n=new Set([`script`,`template`,`style`]),r=0,i=0;for(;i<e.length;){let a=e.indexOf(`<`,i);if(a===-1)break;if(e.startsWith(`<!--`,a)){let t=e.indexOf(`-->`,a+4);i=t===-1?e.length:t+3;continue}if(e[a+1]===`/`){let t=e.indexOf(`>`,a+2);i=t===-1?e.length:t+1;continue}let o=/^<([a-zA-Z][a-zA-Z0-9-]*)(\s[^>]*)?\s*\/?>/.exec(e.slice(a));if(!o){i=a+1;continue}let s=o[1],l=(o[2]||``).trim(),u=o[0].trimEnd().endsWith(`/>`),d=a+o[0].length;if(u){n.has(s.toLowerCase())||t.push({type:s,content:``,src:l.match(/\bsrc=["']([^"']+)["']/)?.[1]??null,attrs:c(l),index:r++}),i=d;continue}let f=s.toLowerCase(),p=1,m=d;for(;m<e.length&&p>0;){let i=e.indexOf(`<`,m);if(i===-1){m=e.length;break}let a=RegExp(`^</${s}\\s*>`,`i`).exec(e.slice(i));if(a){if(p--,p===0){let o=e.slice(d,i);n.has(f)||t.push({type:s,content:o,src:l.match(/\bsrc=["']([^"']+)["']/)?.[1]??null,attrs:c(l),index:r++}),m=i+a[0].length;break}m=i+a[0].length;continue}let o=RegExp(`^<${s}\\b[^>]*>`,`i`).exec(e.slice(i));if(o&&!o[0].trimEnd().endsWith(`/>`)){p++,m=i+o[0].length;continue}m=i+1}i=m}return t}function c(e){let t={},n=/\b([a-z][a-z0-9-]*)(?:=["']([^"']*)["'])?/gi,r;for(;(r=n.exec(e))!==null;)t[r[1]]=r[2]??!0;return t}function l(e){let t=e.match(/<script([^>]*)>/i),n=e.match(/<template([^>]*)>/i);return{scriptSrc:t?.[1]?.match(/\bsrc=["']([^"']+)["']/)?.[1]??null,templateSrc:n?.[1]?.match(/\bsrc=["']([^"']+)["']/)?.[1]??null}}function u(e,t,n){let r=e;return t!==null&&(r=r.replace(/(<script)([^>]*)\bsrc=["'][^"']+["']([^>]*>)[\s\S]*?(<\/script>)/i,(e,n,r,i,a)=>`${n}${(r+i).replace(/\bsrc=["'][^"']+["']\s*/g,``)}\n${t}\n${a}`)),n!==null&&(r=r.replace(/(<template)([^>]*)\bsrc=["'][^"']+["']([^>]*>)[\s\S]*?(<\/template>)/i,(e,t,r,i,a)=>`${t}${(r+i).replace(/\bsrc=["'][^"']+["']\s*/g,``)}\n${n}\n${a}`)),r}function d(e,t,n){if(!t)return n;let r=e.replace(/\\/g,`/`);return(Array.isArray(t)?t:[t]).some(t=>typeof t==`string`?r.includes(t)||e.includes(t):t.test(r))}const f=Object.freeze({img:[`src`],video:[`src`,`poster`],source:[`src`],image:[`xlink:href`,`href`],use:[`xlink:href`,`href`]});function p(e){return!e||/^(https?:)?\/\//.test(e)||e.startsWith(`data:`)?!1:!!(e.startsWith(`./`)||e.startsWith(`../`)||e.startsWith(`@/`)||e.startsWith(`~`))}function m(e){let t=0;for(;t<e.length;){let n=e.indexOf(`<`,t);if(n===-1)break;if(e.startsWith(`<!--`,n)){let r=e.indexOf(`-->`,n+4);t=r===-1?e.length:r+3;continue}if(e[n+1]===`/`){let r=e.indexOf(`>`,n+2);t=r===-1?e.length:r+1;continue}let r=/^<template(\s[^>]*)?>/.exec(e.slice(n));if(!r){t=n+1;continue}let i=n+r[0].length,a=1,o=i;for(;o<e.length&&a>0;){let t=e.indexOf(`<`,o);if(t===-1)break;let n=/^<\/template\s*>/i.exec(e.slice(t));if(n){if(a--,a===0)return e.slice(i,t);o=t+n[0].length;continue}let r=/^<template\b[^>]*>/i.exec(e.slice(t));if(r&&!r[0].trimEnd().endsWith(`/>`)){a++,o=t+r[0].length;continue}o=t+1}return null}return null}function h(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function g(e,t){if(t===!1)return[];let n=t==null||t===!0?f:t,r=m(e);if(!r)return[];let i=new Map,a=0;for(let[e,t]of Object.entries(n)){let n=RegExp(`<${h(e)}((?:\\s+[^>]*)?)(?:/>|>)`,`gi`),o;for(;(o=n.exec(r))!==null;){let e=o[1]??``;for(let n of t){let t=RegExp(`(?:^|\\s)${h(n)}="([^"]+)"`,`i`),r=RegExp(`(?:^|\\s)${h(n)}='([^']+)'`,`i`),o=t.exec(e)??r.exec(e);if(o){let e=o[1];p(e)&&!i.has(e)&&i.set(e,`_imports_${a++}`)}}}}return Array.from(i.entries()).map(([e,t])=>({url:e,varName:t}))}export{r as a,d as c,l as i,a as l,g as n,n as o,s as r,u as s,i as t};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vizejs/rspack-plugin",
3
- "version": "0.58.0",
3
+ "version": "0.59.0",
4
4
  "description": "High-performance Rspack plugin for Vue SFC compilation powered by Vize",
5
5
  "keywords": [
6
6
  "compiler",
@@ -50,7 +50,7 @@
50
50
  "access": "public"
51
51
  },
52
52
  "dependencies": {
53
- "@vizejs/native": "0.58.0"
53
+ "@vizejs/native": "0.59.0"
54
54
  },
55
55
  "devDependencies": {
56
56
  "@rspack/core": "1.7.11",