@lumal/vite 0.0.5-beta → 0.0.6-beta
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/CHANGELOG.md +9 -0
- package/README.md +37 -0
- package/dist/index.cjs +1 -1
- package/dist/index.js +160 -14
- package/dist/src/aliases.d.ts +1 -1
- package/dist/src/aliases.d.ts.map +1 -1
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/viewport-transform.d.ts +22 -0
- package/dist/src/viewport-transform.d.ts.map +1 -0
- package/package.json +11 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# @lumal/vite
|
|
2
2
|
|
|
3
|
+
## 0.0.6-beta (2026-10-25)
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 新增默认关闭的 createViewportTransformPlugin / createViewportPostcssPlugin,显式限定 CSS 转换范围。
|
|
8
|
+
- Dev/Build 使用同一转换逻辑,默认排除依赖;支持显式依赖白名单、字体和自定义属性策略。
|
|
9
|
+
- 保护 Windows/pnpm 路径、SFC/SCSS/CSS 来源边界,不转换脚本普通数字、内联 style 或 URL。
|
|
10
|
+
- 工作区 alias 增加 @lumal/viewport;公共包版本同步为 0.0.6-beta。
|
|
11
|
+
|
|
3
12
|
## 0.0.5-beta (2026-10-20)
|
|
4
13
|
|
|
5
14
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -1,5 +1,42 @@
|
|
|
1
1
|
# @lumal/vite
|
|
2
2
|
|
|
3
|
+
## 可选的局部 px → vw
|
|
4
|
+
|
|
5
|
+
以下 API 属于 `0.0.6-beta`,实际版本可用性以 registry 为准;发布核验前使用候选 tarball:
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
import { createViewportTransformPlugin } from '@lumal/vite'
|
|
9
|
+
|
|
10
|
+
const viewport = createViewportTransformPlugin({
|
|
11
|
+
enabled: true,
|
|
12
|
+
include: ['src/screen/**'],
|
|
13
|
+
exclude: ['**/map/**'],
|
|
14
|
+
viewportWidth: 1920,
|
|
15
|
+
fontSize: false,
|
|
16
|
+
customProperties: false,
|
|
17
|
+
})
|
|
18
|
+
// 将 viewport 加入已有 Vite plugins。
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
默认 `enabled=false`,开启必须指定 include。Dev/Build 共用 PostCSS 声明转换,
|
|
22
|
+
保留已有 inline 或文件 PostCSS 配置;SCSS 在预处理后转换,SFC仅转换style。
|
|
23
|
+
默认不转换 node_modules,仅 `dependencies: ['明确的包名']` 可白名单加入。
|
|
24
|
+
默认保留 <=1px、font/font-size 和 CSS 自定义属性;已有vw、URL、var引用、
|
|
25
|
+
引号字符串和普通数字不变,重复执行幂等。
|
|
26
|
+
|
|
27
|
+
预处理器有原始 source map 时,按每条声明的真实来源判断范围,而非入口文件名。
|
|
28
|
+
没有可靠 source map 时,跨文件 `@use` / `@forward` / Sass `@import`、
|
|
29
|
+
无法解析的预处理语法或函数形式 `additionalData` 会使该 style 整体跳过并警告。
|
|
30
|
+
这是对转换边界的保护:请把第三方/Shared 样式与需要转换的 Screen 声明分开;
|
|
31
|
+
同一 SFC 的独立安全 style 块仍可转换。纯 SCSS 声明不受此限制。
|
|
32
|
+
直接使用 `createViewportPostcssPlugin` 处理预编译的 SCSS/SFC 输出时,
|
|
33
|
+
必须传入原始 source map,否则保守保留 px,不能根据入口路径猜测来源。
|
|
34
|
+
|
|
35
|
+
不转换模板内联 style、TS/JS 字符串或坐标;动态数值布局使用响应式 viewport Composable。
|
|
36
|
+
不提供旧插件的全依赖/全脚本扫描开关。不要将本插件与同一画布的 transform 双重缩放,
|
|
37
|
+
也不要让转换范围覆盖 Admin、Element Plus 或地图引擎样式。
|
|
38
|
+
解析依赖仅供 Node 构建工具使用,不进入应用运行时。
|
|
39
|
+
|
|
3
40
|
Lumal 的轻量 Vite 配置助手,提供组件 resolver、工作区源码/产物 alias 和可选 Devtools 接线。
|
|
4
41
|
|
|
5
42
|
```ts
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require("node:path"),l=require("node:process");l=s(l,1);let u=require("picomatch");u=s(u,1);let d=require("postcss"),f=require("postcss-load-config");f=s(f,1);let p=require("postcss-value-parser");p=s(p,1);var m=[{dist:`packages/viewport/dist/index.js`,packageName:`viewport`,source:`packages/viewport/src/index.ts`,specifier:`@lumal/viewport`},...[`auth`,`components`,`composables`,`dictionary`,`directives`,`layout`,`minimal`,`permission`,`request`,`router`,`theme`,`utils`].map(e=>({dist:`packages/core/dist/${e}.js`,packageName:`core`,source:e===`components`?`packages/core/src/exports/components.ts`:`packages/core/src/${e}/index.ts`,specifier:`@lumal/core/${e}`})),{dist:`packages/core/dist/core.css`,packageName:`core`,source:`packages/core/src/source-style.css`,specifier:`@lumal/core/style.css`},{dist:`packages/core/theme-chalk/index.scss`,packageName:`core`,source:`packages/core/theme-chalk/index.scss`,specifier:`@lumal/core/theme-chalk/index.scss`},{dist:`packages/icons/dist/vite.js`,packageName:`icons`,source:`packages/icons/src/vite/index.ts`,specifier:`@lumal/icons/vite`},{dist:`packages/icons/dist/morph.js`,packageName:`icons`,source:`packages/icons/src/morph/index.ts`,specifier:`@lumal/icons/morph`},{dist:`packages/icons-vue/dist/icons-vue.css`,packageName:`icons-vue`,source:`packages/icons-vue/src/source-style.css`,specifier:`@lumal/icons-vue/style.css`},{dist:`packages/charts/dist/charts.css`,packageName:`charts`,source:`packages/charts/src/source-style.css`,specifier:`@lumal/charts/style.css`},{dist:`packages/datav/dist/datav.css`,packageName:`datav`,source:`packages/datav/src/source-style.css`,specifier:`@lumal/datav/style.css`},{dist:`packages/cockpit/dist/designer.js`,packageName:`cockpit`,source:`packages/cockpit/src/designer/index.ts`,specifier:`@lumal/cockpit/designer`},{dist:`packages/cockpit/dist/registry.js`,packageName:`cockpit`,source:`packages/cockpit/src/registry/index.ts`,specifier:`@lumal/cockpit/registry`},{dist:`packages/cockpit/dist/runtime.js`,packageName:`cockpit`,source:`packages/cockpit/src/runtime/index.ts`,specifier:`@lumal/cockpit/runtime`},{dist:`packages/cockpit/dist/cockpit.css`,packageName:`cockpit`,source:`packages/cockpit/src/source-style.scss`,specifier:`@lumal/cockpit/style.css`},{dist:`packages/vben-compat/dist/v5-router.js`,packageName:`vben-compat`,source:`packages/vben-compat/src/v5/router.ts`,specifier:`@lumal/vben-compat/v5/router`},{dist:`packages/vben-compat/dist/v5.js`,packageName:`vben-compat`,source:`packages/vben-compat/src/v5/index.ts`,specifier:`@lumal/vben-compat/v5`},{dist:`packages/vben-compat/dist/legacy.js`,packageName:`vben-compat`,source:`packages/vben-compat/src/legacy.ts`,specifier:`@lumal/vben-compat/legacy`},{dist:`packages/vben-compat/dist/vben-compat.css`,packageName:`vben-compat`,source:`packages/vben-compat/src/source-style.css`,specifier:`@lumal/vben-compat/style.css`},{dist:`packages/vben-compat/dist/index.js`,packageName:`vben-compat`,source:`packages/vben-compat/src/index.ts`,specifier:`@lumal/vben-compat`},{dist:`packages/charts/dist/index.js`,packageName:`charts`,source:`packages/charts/src/index.ts`,specifier:`@lumal/charts`},{dist:`packages/datav/dist/index.js`,packageName:`datav`,source:`packages/datav/src/index.ts`,specifier:`@lumal/datav`},{dist:`packages/icons/dist/index.js`,packageName:`icons`,source:`packages/icons/src/index.ts`,specifier:`@lumal/icons`},{dist:`packages/icons-vue/dist/index.js`,packageName:`icons-vue`,source:`packages/icons-vue/src/index.ts`,specifier:`@lumal/icons-vue`},{dist:`packages/core/dist/index.js`,packageName:`core`,source:`packages/core/src/index.ts`,specifier:`@lumal/core`},{dist:`packages/cockpit/dist/index.js`,packageName:`cockpit`,source:`packages/cockpit/src/index.ts`,specifier:`@lumal/cockpit`}];function h(e){let t=e.target??`source`,n=new Set(e.packages??[`charts`,`cockpit`,`core`,`datav`,`icons`,`icons-vue`,`vben-compat`,`viewport`]);return m.filter(e=>n.has(e.packageName)).map(n=>({find:n.specifier,replacement:(0,c.resolve)(e.workspaceRoot,n[t])})).sort((e,t)=>t.find.length-e.find.length)}var g=new Map([[`LumalAccessControl`,`@lumal/core/permission`],[`LumalBreadcrumb`,`@lumal/core/layout`],[`LumalChart`,`@lumal/charts`],[`LumalChartPanel`,`@lumal/charts`],[`LumalContent`,`@lumal/core/layout`],[`LumalCrudTable`,`@lumal/core/components`],[`LumalHeader`,`@lumal/core/layout`],[`LumalGlobalSearch`,`@lumal/core/layout`],[`LumalIcon`,`@lumal/icons-vue`],[`LumalIconPicker`,`@lumal/icons-vue`],[`LumalIconPickerDialog`,`@lumal/icons-vue`],[`LumalInfoTable`,`@lumal/core/components`],[`LumalLayout`,`@lumal/core/layout`],[`LumalPage`,`@lumal/core/components`],[`LumalPageLayout`,`@lumal/core/components`],[`LumalPagination`,`@lumal/core/components`],[`LumalRouterView`,`@lumal/core/layout`],[`LumalSchemaForm`,`@lumal/core/components`],[`LumalSchemaTable`,`@lumal/core/components`],[`LumalSidebar`,`@lumal/core/layout`],[`LumalTabs`,`@lumal/core/layout`],[`LumalThemeSettingsPanel`,`@lumal/core/theme`],[`LumalTopNav`,`@lumal/core/layout`]]);function _(e){if(e.startsWith(`@lumal/core`))return`@lumal/core/style.css`;if(e===`@lumal/icons-vue`||e===`@lumal/charts`)return`${e}/style.css`}function v(e={}){let t=new Map(g);for(let[n,r]of Object.entries(e.customComponents??{}))t.set(n,r);return{type:`component`,resolve(n){let r=t.get(n);if(r)return{from:r,name:n,sideEffects:e.importStyle?_(r):void 0}}}}function y(e={}){if(e.enabled!==!1)return e.factory?.()??e.plugin}function b(e){if(e.startsWith(`file:`)){let t=new URL(e);e=`${t.host?`//${t.host}`:``}${decodeURIComponent(t.pathname)}`}let t=e.replaceAll(`\\`,`/`).split(`?`)[0];return t.match(/(?:^|\/)([a-z]:\/.*)$/i)?.[1]??t}var x=[`scss`,`sass`,`less`,`styl`,`stylus`];function S(e){return e.match(/\.(scss|sass|less|styl|stylus)(?:$|[?&])/i)?.[1]?.toLowerCase()}function C(e,t){let n=b(/^[a-z]:[/\\]/i.test(t)?t:(0,c.resolve)(t)).replace(/\/$/,``),r=(0,u.default)(e.include??[],{dot:!0}),i=(0,u.default)(e.exclude??[],{dot:!0});return t=>{if(!t||!e.enabled)return!1;let a=b(t),o=a.toLowerCase().startsWith(`${n.toLowerCase()}/`)?a.slice(n.length+1):a;if(i(a)||i(o))return!1;let s=a.split(`/node_modules/`).at(-1);if(s!==a){let t=s.split(`/`),n=t[0].startsWith(`@`)?t.slice(0,2).join(`/`):t[0];return e.dependencies?.includes(n)??!1}return r(o)||r(a)}}function w(e,t,n){let r=e.viewportWidth??1920,i=e.precision??6;if(!(r>0)||!Number.isFinite(r))throw Error(`viewportWidth 必须为正数`);if(!Number.isInteger(i)||i<0||i>10)throw Error(`precision 必须为0到10的整数`);if(e.enabled&&!e.include?.length)throw Error(`视口转换必须显式指定 include 范围`);let a=C(e,t);function o(e){let t=e.source;if(!t)return;if(t.input.map){let e=t.start&&t.input.origin(t.start.line,t.start.column);return e?e.file??e.url:void 0}let r=t.input.file;if(!r)return;if(n)return n(r)?r:void 0;let i=/\.vue(?:$|\?)/i.test(r)&&!/[?&]lang\.css(?:&|$)/i.test(r);return S(r)||i?void 0:r}return{postcssPlugin:`lumal-scoped-viewport`,Declaration(t){if(!a(o(t))||!e.customProperties&&t.prop.startsWith(`--`)||!e.fontSize&&/^(?:font|font-size)$/i.test(t.prop))return;let n=(0,p.default)(t.value),s=!1;n.walk(t=>{if(t.type===`function`&&/^(?:url|var)$/i.test(t.value))return!1;if(t.type!==`word`||!/^-?(?:\d+(?:\.\d*)?|\.\d+)px$/i.test(t.value))return;let n=Number.parseFloat(t.value);Math.abs(n)<=(e.minPixelValue??1)||(t.value=`${Number((n/r*100).toFixed(i))}vw`,s=!0)}),s&&(t.value=n.toString())}}}function T(e,t=l.default.cwd()){return w(e,t)}function E(e){return new URLSearchParams(e.split(`?`)[1]).get(`index`)??``}function D(e,t){try{let n=!1;return(0,d.parse)(e,{from:t}).walkAtRules(/^(?:use|forward|import)$/i,e=>{let t=(0,p.default)(e.params).nodes,r=t.filter(e=>e.type===`string`);if(!r.length){let r=e.name.toLowerCase()===`import`&&t.some(e=>e.type===`function`&&e.value.toLowerCase()===`url`);n||=!r;return}for(let t of r){let r=t.value.startsWith(`sass:`),i=e.name.toLowerCase()===`import`&&/^(?:https?:)?\/\/|\.css(?:[?#]|$)/i.test(t.value);n||=!r&&!i}}),n}catch{return!0}}function O(e){let t=new Map,n=new Map,r=()=>!1;function i(e){let n=t.get(b(e));return n?.get(E(e))??[...n?.values()??[]].every(Boolean)}return{name:`lumal-scoped-viewport`,enforce:`pre`,transform(e,i){let a=S(i);if(!r(i)||!a)return;let o=n.get(a)!==!1&&!D(e,i),s=b(i),c=t.get(s)??new Map;c.set(E(i),o),t.set(s,c),o||this.warn(`跳过视口转换 ${s}:预处理样式含跨文件导入或无法可靠解析的语法;请将外部样式与 Screen 声明分离,避免无原始 source map 时越过转换边界。`)},configResolved(e){for(let t of x){let r=e.css.preprocessorOptions?.[t]?.additionalData;n.set(t,r===void 0||typeof r==`string`&&!D(r,`${e.root}/injected.${t}`))}},async config(t){if(!e.enabled)return;let n=(0,c.resolve)(t.root??l.default.cwd());r=C(e,n);let a=t.css?.postcss,o=typeof a==`object`?a:void 0;if(!o)try{let e=await(0,f.default)({},typeof a==`string`?(0,c.resolve)(n,a):n);o={...e.options,plugins:e.plugins}}catch(e){if(a||!(e instanceof Error)||!e.message.startsWith(`No PostCSS Config found`))throw e}t.css??={},t.css.postcss={...o,plugins:[...o?.plugins??[],w(e,n,i)]}}}}exports.createLumalAliases=h,exports.createLumalComponentResolver=v,exports.createViewportPostcssPlugin=T,exports.createViewportTransformPlugin=O,exports.resolveLumalDevtoolsPlugin=y;
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
import { resolve as e } from "node:path";
|
|
2
|
+
import t from "node:process";
|
|
3
|
+
import n from "picomatch";
|
|
4
|
+
import { parse as r } from "postcss";
|
|
5
|
+
import i from "postcss-load-config";
|
|
6
|
+
import a from "postcss-value-parser";
|
|
2
7
|
//#region src/aliases.ts
|
|
3
|
-
var
|
|
8
|
+
var o = [
|
|
9
|
+
{
|
|
10
|
+
dist: "packages/viewport/dist/index.js",
|
|
11
|
+
packageName: "viewport",
|
|
12
|
+
source: "packages/viewport/src/index.ts",
|
|
13
|
+
specifier: "@lumal/viewport"
|
|
14
|
+
},
|
|
4
15
|
...[
|
|
5
16
|
"auth",
|
|
6
17
|
"components",
|
|
@@ -153,24 +164,25 @@ var t = [
|
|
|
153
164
|
specifier: "@lumal/cockpit"
|
|
154
165
|
}
|
|
155
166
|
];
|
|
156
|
-
function
|
|
157
|
-
let
|
|
167
|
+
function s(t) {
|
|
168
|
+
let n = t.target ?? "source", r = new Set(t.packages ?? [
|
|
158
169
|
"charts",
|
|
159
170
|
"cockpit",
|
|
160
171
|
"core",
|
|
161
172
|
"datav",
|
|
162
173
|
"icons",
|
|
163
174
|
"icons-vue",
|
|
164
|
-
"vben-compat"
|
|
175
|
+
"vben-compat",
|
|
176
|
+
"viewport"
|
|
165
177
|
]);
|
|
166
|
-
return
|
|
167
|
-
find:
|
|
168
|
-
replacement: e(
|
|
178
|
+
return o.filter((e) => r.has(e.packageName)).map((r) => ({
|
|
179
|
+
find: r.specifier,
|
|
180
|
+
replacement: e(t.workspaceRoot, r[n])
|
|
169
181
|
})).sort((e, t) => t.find.length - e.find.length);
|
|
170
182
|
}
|
|
171
183
|
//#endregion
|
|
172
184
|
//#region src/component-resolver.ts
|
|
173
|
-
var
|
|
185
|
+
var c = /* @__PURE__ */ new Map([
|
|
174
186
|
["LumalAccessControl", "@lumal/core/permission"],
|
|
175
187
|
["LumalBreadcrumb", "@lumal/core/layout"],
|
|
176
188
|
["LumalChart", "@lumal/charts"],
|
|
@@ -195,12 +207,12 @@ var r = /* @__PURE__ */ new Map([
|
|
|
195
207
|
["LumalThemeSettingsPanel", "@lumal/core/theme"],
|
|
196
208
|
["LumalTopNav", "@lumal/core/layout"]
|
|
197
209
|
]);
|
|
198
|
-
function
|
|
210
|
+
function l(e) {
|
|
199
211
|
if (e.startsWith("@lumal/core")) return "@lumal/core/style.css";
|
|
200
212
|
if (e === "@lumal/icons-vue" || e === "@lumal/charts") return `${e}/style.css`;
|
|
201
213
|
}
|
|
202
|
-
function
|
|
203
|
-
let t = new Map(
|
|
214
|
+
function u(e = {}) {
|
|
215
|
+
let t = new Map(c);
|
|
204
216
|
for (let [n, r] of Object.entries(e.customComponents ?? {})) t.set(n, r);
|
|
205
217
|
return {
|
|
206
218
|
type: "component",
|
|
@@ -209,15 +221,149 @@ function a(e = {}) {
|
|
|
209
221
|
if (r) return {
|
|
210
222
|
from: r,
|
|
211
223
|
name: n,
|
|
212
|
-
sideEffects: e.importStyle ?
|
|
224
|
+
sideEffects: e.importStyle ? l(r) : void 0
|
|
213
225
|
};
|
|
214
226
|
}
|
|
215
227
|
};
|
|
216
228
|
}
|
|
217
229
|
//#endregion
|
|
218
230
|
//#region src/devtools.ts
|
|
219
|
-
function
|
|
231
|
+
function d(e = {}) {
|
|
220
232
|
if (e.enabled !== !1) return e.factory?.() ?? e.plugin;
|
|
221
233
|
}
|
|
222
234
|
//#endregion
|
|
223
|
-
|
|
235
|
+
//#region src/viewport-transform.ts
|
|
236
|
+
function f(e) {
|
|
237
|
+
if (e.startsWith("file:")) {
|
|
238
|
+
let t = new URL(e);
|
|
239
|
+
e = `${t.host ? `//${t.host}` : ""}${decodeURIComponent(t.pathname)}`;
|
|
240
|
+
}
|
|
241
|
+
let t = e.replaceAll("\\", "/").split("?")[0];
|
|
242
|
+
return t.match(/(?:^|\/)([a-z]:\/.*)$/i)?.[1] ?? t;
|
|
243
|
+
}
|
|
244
|
+
var p = [
|
|
245
|
+
"scss",
|
|
246
|
+
"sass",
|
|
247
|
+
"less",
|
|
248
|
+
"styl",
|
|
249
|
+
"stylus"
|
|
250
|
+
];
|
|
251
|
+
function m(e) {
|
|
252
|
+
return e.match(/\.(scss|sass|less|styl|stylus)(?:$|[?&])/i)?.[1]?.toLowerCase();
|
|
253
|
+
}
|
|
254
|
+
function h(t, r) {
|
|
255
|
+
let i = f(/^[a-z]:[/\\]/i.test(r) ? r : e(r)).replace(/\/$/, ""), a = n(t.include ?? [], { dot: !0 }), o = n(t.exclude ?? [], { dot: !0 });
|
|
256
|
+
return (e) => {
|
|
257
|
+
if (!e || !t.enabled) return !1;
|
|
258
|
+
let n = f(e), r = n.toLowerCase().startsWith(`${i.toLowerCase()}/`) ? n.slice(i.length + 1) : n;
|
|
259
|
+
if (o(n) || o(r)) return !1;
|
|
260
|
+
let s = n.split("/node_modules/").at(-1);
|
|
261
|
+
if (s !== n) {
|
|
262
|
+
let e = s.split("/"), n = e[0].startsWith("@") ? e.slice(0, 2).join("/") : e[0];
|
|
263
|
+
return t.dependencies?.includes(n) ?? !1;
|
|
264
|
+
}
|
|
265
|
+
return a(r) || a(n);
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
function g(e, t, n) {
|
|
269
|
+
let r = e.viewportWidth ?? 1920, i = e.precision ?? 6;
|
|
270
|
+
if (!(r > 0) || !Number.isFinite(r)) throw Error("viewportWidth 必须为正数");
|
|
271
|
+
if (!Number.isInteger(i) || i < 0 || i > 10) throw Error("precision 必须为0到10的整数");
|
|
272
|
+
if (e.enabled && !e.include?.length) throw Error("视口转换必须显式指定 include 范围");
|
|
273
|
+
let o = h(e, t);
|
|
274
|
+
function s(e) {
|
|
275
|
+
let t = e.source;
|
|
276
|
+
if (!t) return;
|
|
277
|
+
if (t.input.map) {
|
|
278
|
+
let e = t.start && t.input.origin(t.start.line, t.start.column);
|
|
279
|
+
return e ? e.file ?? e.url : void 0;
|
|
280
|
+
}
|
|
281
|
+
let r = t.input.file;
|
|
282
|
+
if (!r) return;
|
|
283
|
+
if (n) return n(r) ? r : void 0;
|
|
284
|
+
let i = /\.vue(?:$|\?)/i.test(r) && !/[?&]lang\.css(?:&|$)/i.test(r);
|
|
285
|
+
return m(r) || i ? void 0 : r;
|
|
286
|
+
}
|
|
287
|
+
return {
|
|
288
|
+
postcssPlugin: "lumal-scoped-viewport",
|
|
289
|
+
Declaration(t) {
|
|
290
|
+
if (!o(s(t)) || !e.customProperties && t.prop.startsWith("--") || !e.fontSize && /^(?:font|font-size)$/i.test(t.prop)) return;
|
|
291
|
+
let n = a(t.value), c = !1;
|
|
292
|
+
n.walk((t) => {
|
|
293
|
+
if (t.type === "function" && /^(?:url|var)$/i.test(t.value)) return !1;
|
|
294
|
+
if (t.type !== "word" || !/^-?(?:\d+(?:\.\d*)?|\.\d+)px$/i.test(t.value)) return;
|
|
295
|
+
let n = Number.parseFloat(t.value);
|
|
296
|
+
Math.abs(n) <= (e.minPixelValue ?? 1) || (t.value = `${Number((n / r * 100).toFixed(i))}vw`, c = !0);
|
|
297
|
+
}), c && (t.value = n.toString());
|
|
298
|
+
}
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
function _(e, n = t.cwd()) {
|
|
302
|
+
return g(e, n);
|
|
303
|
+
}
|
|
304
|
+
function v(e) {
|
|
305
|
+
return new URLSearchParams(e.split("?")[1]).get("index") ?? "";
|
|
306
|
+
}
|
|
307
|
+
function y(e, t) {
|
|
308
|
+
try {
|
|
309
|
+
let n = !1;
|
|
310
|
+
return r(e, { from: t }).walkAtRules(/^(?:use|forward|import)$/i, (e) => {
|
|
311
|
+
let t = a(e.params).nodes, r = t.filter((e) => e.type === "string");
|
|
312
|
+
if (!r.length) {
|
|
313
|
+
let r = e.name.toLowerCase() === "import" && t.some((e) => e.type === "function" && e.value.toLowerCase() === "url");
|
|
314
|
+
n ||= !r;
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
for (let t of r) {
|
|
318
|
+
let r = t.value.startsWith("sass:"), i = e.name.toLowerCase() === "import" && /^(?:https?:)?\/\/|\.css(?:[?#]|$)/i.test(t.value);
|
|
319
|
+
n ||= !r && !i;
|
|
320
|
+
}
|
|
321
|
+
}), n;
|
|
322
|
+
} catch {
|
|
323
|
+
return !0;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
function b(n) {
|
|
327
|
+
let r = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Map(), o = () => !1;
|
|
328
|
+
function s(e) {
|
|
329
|
+
let t = r.get(f(e));
|
|
330
|
+
return t?.get(v(e)) ?? [...t?.values() ?? []].every(Boolean);
|
|
331
|
+
}
|
|
332
|
+
return {
|
|
333
|
+
name: "lumal-scoped-viewport",
|
|
334
|
+
enforce: "pre",
|
|
335
|
+
transform(e, t) {
|
|
336
|
+
let n = m(t);
|
|
337
|
+
if (!o(t) || !n) return;
|
|
338
|
+
let i = a.get(n) !== !1 && !y(e, t), s = f(t), c = r.get(s) ?? /* @__PURE__ */ new Map();
|
|
339
|
+
c.set(v(t), i), r.set(s, c), i || this.warn(`跳过视口转换 ${s}:预处理样式含跨文件导入或无法可靠解析的语法;请将外部样式与 Screen 声明分离,避免无原始 source map 时越过转换边界。`);
|
|
340
|
+
},
|
|
341
|
+
configResolved(e) {
|
|
342
|
+
for (let t of p) {
|
|
343
|
+
let n = e.css.preprocessorOptions?.[t]?.additionalData;
|
|
344
|
+
a.set(t, n === void 0 || typeof n == "string" && !y(n, `${e.root}/injected.${t}`));
|
|
345
|
+
}
|
|
346
|
+
},
|
|
347
|
+
async config(r) {
|
|
348
|
+
if (!n.enabled) return;
|
|
349
|
+
let a = e(r.root ?? t.cwd());
|
|
350
|
+
o = h(n, a);
|
|
351
|
+
let c = r.css?.postcss, l = typeof c == "object" ? c : void 0;
|
|
352
|
+
if (!l) try {
|
|
353
|
+
let t = await i({}, typeof c == "string" ? e(a, c) : a);
|
|
354
|
+
l = {
|
|
355
|
+
...t.options,
|
|
356
|
+
plugins: t.plugins
|
|
357
|
+
};
|
|
358
|
+
} catch (e) {
|
|
359
|
+
if (c || !(e instanceof Error) || !e.message.startsWith("No PostCSS Config found")) throw e;
|
|
360
|
+
}
|
|
361
|
+
r.css ??= {}, r.css.postcss = {
|
|
362
|
+
...l,
|
|
363
|
+
plugins: [...l?.plugins ?? [], g(n, a, s)]
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
//#endregion
|
|
369
|
+
export { s as createLumalAliases, u as createLumalComponentResolver, _ as createViewportPostcssPlugin, b as createViewportTransformPlugin, d as resolveLumalDevtoolsPlugin };
|
package/dist/src/aliases.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export type LumalAliasTarget = 'dist' | 'source';
|
|
2
|
-
export type LumalAliasPackage = 'charts' | 'cockpit' | 'core' | 'datav' | 'icons' | 'icons-vue' | 'vben-compat';
|
|
2
|
+
export type LumalAliasPackage = 'charts' | 'cockpit' | 'core' | 'datav' | 'icons' | 'icons-vue' | 'vben-compat' | 'viewport';
|
|
3
3
|
export interface LumalAliasEntry {
|
|
4
4
|
find: string;
|
|
5
5
|
replacement: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aliases.d.ts","sourceRoot":"","sources":["../../src/aliases.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,QAAQ,CAAA;AAChD,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,WAAW,GAAG,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"aliases.d.ts","sourceRoot":"","sources":["../../src/aliases.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,QAAQ,CAAA;AAChD,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,WAAW,GAAG,aAAa,GAAG,UAAU,CAAA;AAE5H,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,EAAE,iBAAiB,EAAE,CAAA;IAC9B,MAAM,CAAC,EAAE,gBAAgB,CAAA;IACzB,aAAa,EAAE,MAAM,CAAA;CACtB;AA6JD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,eAAe,EAAE,CAWxF"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -4,4 +4,6 @@ export { createLumalComponentResolver, } from './component-resolver';
|
|
|
4
4
|
export type { CreateLumalComponentResolverOptions, LumalComponentResolver, LumalComponentResolverResult, } from './component-resolver';
|
|
5
5
|
export { resolveLumalDevtoolsPlugin, } from './devtools';
|
|
6
6
|
export type { ResolveLumalDevtoolsPluginOptions, } from './devtools';
|
|
7
|
+
export { createViewportPostcssPlugin, createViewportTransformPlugin } from './viewport-transform';
|
|
8
|
+
export type { ViewportTransformOptions } from './viewport-transform';
|
|
7
9
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,GACnB,MAAM,WAAW,CAAA;AAClB,YAAY,EACV,yBAAyB,EACzB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,WAAW,CAAA;AAClB,OAAO,EACL,4BAA4B,GAC7B,MAAM,sBAAsB,CAAA;AAC7B,YAAY,EACV,mCAAmC,EACnC,sBAAsB,EACtB,4BAA4B,GAC7B,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,0BAA0B,GAC3B,MAAM,YAAY,CAAA;AACnB,YAAY,EACV,iCAAiC,GAClC,MAAM,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,GACnB,MAAM,WAAW,CAAA;AAClB,YAAY,EACV,yBAAyB,EACzB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,WAAW,CAAA;AAClB,OAAO,EACL,4BAA4B,GAC7B,MAAM,sBAAsB,CAAA;AAC7B,YAAY,EACV,mCAAmC,EACnC,sBAAsB,EACtB,4BAA4B,GAC7B,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,0BAA0B,GAC3B,MAAM,YAAY,CAAA;AACnB,YAAY,EACV,iCAAiC,GAClC,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,2BAA2B,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAA;AACjG,YAAY,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Plugin as PostcssPlugin } from 'postcss';
|
|
2
|
+
import type { Plugin as VitePlugin } from 'vite';
|
|
3
|
+
export interface ViewportTransformOptions {
|
|
4
|
+
/** 必须显式开启;不设置时不修改配置。 */
|
|
5
|
+
enabled?: boolean;
|
|
6
|
+
/** 相对 Vite root 的 glob,例如 src/screen/**,不允许隐式全项目转换。 */
|
|
7
|
+
include: string[];
|
|
8
|
+
exclude?: string[];
|
|
9
|
+
viewportWidth?: number;
|
|
10
|
+
precision?: number;
|
|
11
|
+
/** 默认保留 <=1px,避免细边框消失。 */
|
|
12
|
+
minPixelValue?: number;
|
|
13
|
+
fontSize?: boolean;
|
|
14
|
+
customProperties?: boolean;
|
|
15
|
+
/** 默认排除全部依赖;仅此处显式列出的包可以转换。 */
|
|
16
|
+
dependencies?: string[];
|
|
17
|
+
}
|
|
18
|
+
/** 在预处理后的 CSS AST 上操作,不扫描脚本、模板数字或任意文本。 */
|
|
19
|
+
export declare function createViewportPostcssPlugin(options: ViewportTransformOptions, root?: string): PostcssPlugin;
|
|
20
|
+
/** 保留已有 inline/file PostCSS 配置,开发和构建都在同一 CSS 管线上执行。 */
|
|
21
|
+
export declare function createViewportTransformPlugin(options: ViewportTransformOptions): VitePlugin;
|
|
22
|
+
//# sourceMappingURL=viewport-transform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewport-transform.d.ts","sourceRoot":"","sources":["../../src/viewport-transform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,MAAM,IAAI,aAAa,EAAE,MAAM,SAAS,CAAA;AACnE,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,MAAM,CAAA;AAQhD,MAAM,WAAW,wBAAwB;IACvC,wBAAwB;IACxB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,uDAAuD;IACvD,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,0BAA0B;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,8BAA8B;IAC9B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;CACxB;AA8FD,0CAA0C;AAC1C,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,wBAAwB,EAAE,IAAI,SAAgB,GAAG,aAAa,CAElH;AA+BD,uDAAuD;AACvD,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,wBAAwB,GAAG,UAAU,CAwD3F"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lumal/vite",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.
|
|
5
|
-
"description": "Lumal Vite
|
|
4
|
+
"version": "0.0.6-beta",
|
|
5
|
+
"description": "Lumal Vite resolvers, workspace aliases, devtools helpers and scoped optional CSS viewport transforms.",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"keywords": [
|
|
8
8
|
"lumal",
|
|
@@ -29,6 +29,15 @@
|
|
|
29
29
|
"README.md",
|
|
30
30
|
"dist"
|
|
31
31
|
],
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"picomatch": "^4.0.5",
|
|
34
|
+
"postcss": "^8.5.16",
|
|
35
|
+
"postcss-load-config": "^6.0.1",
|
|
36
|
+
"postcss-value-parser": "^4.2.0"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@types/picomatch": "^4.0.3"
|
|
40
|
+
},
|
|
32
41
|
"scripts": {
|
|
33
42
|
"build": "vite build --config vite.config.ts && tsc -p tsconfig.json --emitDeclarationOnly && node ../../scripts/clean-package-dist.mjs dist",
|
|
34
43
|
"typecheck": "tsc --noEmit -p tsconfig.json",
|