lvyjs 0.1.3 → 0.2.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.
- package/bin/index.js +17 -11
- package/lib/build/rullup.js +75 -76
- package/lib/loader/esbuild.js +8 -5
- package/lib/loader/plugins.d.ts +1 -5
- package/lib/loader/plugins.js +34 -38
- package/lib/loader/store.d.ts +28 -30
- package/lib/loader/store.js +6 -1
- package/lib/main.js +2 -2
- package/lib/plugins/loader-css.d.ts +1 -8
- package/package.json +1 -1
package/bin/index.js
CHANGED
|
@@ -12,17 +12,20 @@ if (args.includes('build')) {
|
|
|
12
12
|
const jsFile = join(currentDirPath, '../lib/index.js')
|
|
13
13
|
const jsdir = relative(process.cwd(), jsFile)
|
|
14
14
|
const argsx = args.filter(arg => arg !== 'build')
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
|
|
15
|
+
let tsxDir = join(currentDirPath, '../../tsx/dist/cli.mjs')
|
|
16
|
+
if (!existsSync(tsxDir)) {
|
|
17
|
+
tsxDir = join(currentDirPath, '../node_modules/tsx/dist/cli.mjs')
|
|
18
|
+
}
|
|
19
|
+
if (!existsSync(tsxDir)) {
|
|
20
|
+
tsxDir = join(process.cwd(), 'node_modules/tsx/dist/cli.mjs')
|
|
21
|
+
}
|
|
22
|
+
const msg = fork(tsxDir, [jsdir, '--lvy-build', ...argsx], {
|
|
23
|
+
stdio: 'inherit',
|
|
24
|
+
env: Object.assign({}, process.env, {
|
|
25
|
+
PKG_DIR: pkgFilr
|
|
26
|
+
}),
|
|
27
|
+
shell: process.platform === 'win32'
|
|
28
|
+
})
|
|
26
29
|
if (msg.error) {
|
|
27
30
|
console.error(msg.error)
|
|
28
31
|
process.exit()
|
|
@@ -40,6 +43,9 @@ if (args.includes('build')) {
|
|
|
40
43
|
if (!existsSync(tsxDir)) {
|
|
41
44
|
tsxDir = join(currentDirPath, '../node_modules/tsx/dist/cli.mjs')
|
|
42
45
|
}
|
|
46
|
+
if (!existsSync(tsxDir)) {
|
|
47
|
+
tsxDir = join(process.cwd(), 'node_modules/tsx/dist/cli.mjs')
|
|
48
|
+
}
|
|
43
49
|
const msg = fork(tsxDir, [...argv, ...argsx], {
|
|
44
50
|
stdio: 'inherit',
|
|
45
51
|
env: Object.assign({}, process.env, {
|
package/lib/build/rullup.js
CHANGED
|
@@ -35,94 +35,93 @@ const buildJS = async (inputs, output) => {
|
|
|
35
35
|
global.lvyConfig.build = {};
|
|
36
36
|
// 插件
|
|
37
37
|
const plugins = [];
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
continue;
|
|
41
|
-
}
|
|
42
|
-
if (key === 'alias' && !global.lvyConfig.build['@rollup/plugin-alias']) {
|
|
43
|
-
plugins.push(alias(global.lvyConfig.build[key]));
|
|
44
|
-
}
|
|
45
|
-
else if (key === 'assets') {
|
|
46
|
-
plugins.push(rollupAssets(global.lvyConfig.build[key]));
|
|
47
|
-
}
|
|
48
|
-
else if (key === 'styles') {
|
|
49
|
-
plugins.push(styles({
|
|
50
|
-
mode: ['inject', () => '']
|
|
51
|
-
}));
|
|
52
|
-
plugins.push(rollupStylesCSSImport(global.lvyConfig.build[key]));
|
|
53
|
-
}
|
|
54
|
-
else if (key === 'commonjs' && !global.lvyConfig.build['@rollup/plugin-commonjs']) {
|
|
55
|
-
plugins.push(commonjs(global.lvyConfig.build[key]));
|
|
56
|
-
}
|
|
57
|
-
else if (key === 'json' && !global.lvyConfig.build['@rollup/plugin-json']) {
|
|
58
|
-
plugins.push(json(global.lvyConfig.build[key]));
|
|
59
|
-
}
|
|
60
|
-
else if (key === 'typescript' && !global.lvyConfig.build['@rollup/plugin-typescript']) {
|
|
61
|
-
plugins.push(typescript(global.lvyConfig.build[key]));
|
|
62
|
-
}
|
|
63
|
-
else if (key === 'plugins') {
|
|
64
|
-
if (Array.isArray(global.lvyConfig.build[key])) {
|
|
65
|
-
for (const plugin of global.lvyConfig.build[key]) {
|
|
66
|
-
plugins.push(plugin);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
const plugin = (await import(key)).default;
|
|
72
|
-
plugins.push(plugin(global.lvyConfig.build[key]));
|
|
73
|
-
}
|
|
38
|
+
if (global.lvyConfig.alias) {
|
|
39
|
+
plugins.push(alias(global.lvyConfig.alias));
|
|
74
40
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
// 存在这些配置
|
|
83
|
-
if (global.lvyConfig.build[key]) {
|
|
84
|
-
continue;
|
|
85
|
-
}
|
|
41
|
+
if (global.lvyConfig.assets) {
|
|
42
|
+
plugins.push(rollupAssets(global.lvyConfig.assets));
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
plugins.push(rollupAssets());
|
|
46
|
+
}
|
|
47
|
+
if (typeof global.lvyConfig.build != 'boolean') {
|
|
86
48
|
//
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
49
|
+
for (const key in global.lvyConfig.build) {
|
|
50
|
+
if (typeof global.lvyConfig.build[key] == 'boolean') {
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (key === 'styles') {
|
|
54
|
+
plugins.push(styles({
|
|
55
|
+
mode: ['inject', () => '']
|
|
56
|
+
}));
|
|
57
|
+
plugins.push(rollupStylesCSSImport(global.lvyConfig.build[key]));
|
|
58
|
+
}
|
|
59
|
+
else if (key === 'commonjs' && !global.lvyConfig.build['@rollup/plugin-commonjs']) {
|
|
60
|
+
plugins.push(commonjs(global.lvyConfig.build[key]));
|
|
61
|
+
}
|
|
62
|
+
else if (key === 'json' && !global.lvyConfig.build['@rollup/plugin-json']) {
|
|
63
|
+
plugins.push(json(global.lvyConfig.build[key]));
|
|
64
|
+
}
|
|
65
|
+
else if (key === 'typescript' && !global.lvyConfig.build['@rollup/plugin-typescript']) {
|
|
66
|
+
plugins.push(typescript(global.lvyConfig.build[key]));
|
|
67
|
+
}
|
|
68
|
+
else if (key === 'plugins') {
|
|
69
|
+
if (Array.isArray(global.lvyConfig.build[key])) {
|
|
70
|
+
for (const plugin of global.lvyConfig.build[key]) {
|
|
71
|
+
plugins.push(plugin);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
const plugin = (await import(key)).default;
|
|
77
|
+
plugins.push(plugin(global.lvyConfig.build[key]));
|
|
78
|
+
}
|
|
104
79
|
}
|
|
105
|
-
|
|
106
|
-
|
|
80
|
+
// 如果不存在这些配置
|
|
81
|
+
const keys = ['styles', 'commonjs', 'json', 'typescript'];
|
|
82
|
+
for (const key of keys) {
|
|
83
|
+
// 如果是布尔值
|
|
84
|
+
if (typeof global.lvyConfig.build[key] == 'boolean') {
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
// 存在这些配置
|
|
88
|
+
if (global.lvyConfig.build[key]) {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
//
|
|
92
|
+
if (key == 'styles') {
|
|
93
|
+
plugins.push(styles({
|
|
94
|
+
mode: ['inject', () => '']
|
|
95
|
+
}));
|
|
96
|
+
plugins.push(rollupStylesCSSImport());
|
|
97
|
+
}
|
|
98
|
+
else if (key === 'commonjs') {
|
|
99
|
+
plugins.push(commonjs());
|
|
100
|
+
}
|
|
101
|
+
else if (key === 'json') {
|
|
102
|
+
plugins.push(json());
|
|
103
|
+
}
|
|
104
|
+
else if (key === 'typescript') {
|
|
105
|
+
plugins.push(typescript());
|
|
106
|
+
}
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
109
|
// rollup 配置
|
|
110
|
-
const
|
|
111
|
-
|
|
112
|
-
const rollupOptions = {
|
|
113
|
-
input: inputs,
|
|
114
|
-
plugins: plugins,
|
|
115
|
-
onwarn: onwarn,
|
|
116
|
-
...Options
|
|
117
|
-
};
|
|
110
|
+
const rollupOptions = global.lvyConfig?.rollupOptions ?? {};
|
|
111
|
+
const rollupPlugins = global.lvyConfig?.rollupPlugins ?? [];
|
|
118
112
|
// build
|
|
119
|
-
const bundle = await rollup(
|
|
113
|
+
const bundle = await rollup({
|
|
114
|
+
input: inputs,
|
|
115
|
+
plugins: [...plugins, ...rollupPlugins],
|
|
116
|
+
onwarn: onwarn
|
|
117
|
+
});
|
|
120
118
|
// 写入输出文件
|
|
121
119
|
await bundle.write({
|
|
122
120
|
dir: output,
|
|
123
121
|
format: 'es',
|
|
124
122
|
sourcemap: false,
|
|
125
|
-
preserveModules: true
|
|
123
|
+
preserveModules: true,
|
|
124
|
+
...rollupOptions
|
|
126
125
|
});
|
|
127
126
|
};
|
|
128
127
|
/**
|
package/lib/loader/esbuild.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import esbuild from 'esbuild';
|
|
2
|
-
import { esBuildAsstes, esBuildCSS } from './plugins.js';
|
|
2
|
+
import { esBuildAlias, esBuildAsstes, esBuildCSS } from './plugins.js';
|
|
3
3
|
|
|
4
4
|
// 插件
|
|
5
5
|
const plugins = [];
|
|
6
6
|
/**
|
|
7
7
|
*
|
|
8
8
|
*/
|
|
9
|
-
const initPlugins =
|
|
10
|
-
if (typeof global.lvyConfig?.
|
|
11
|
-
plugins.push(esBuildAsstes(global.lvyConfig.
|
|
9
|
+
const initPlugins = () => {
|
|
10
|
+
if (typeof global.lvyConfig?.assets != 'boolean') {
|
|
11
|
+
plugins.push(esBuildAsstes(global.lvyConfig.assets));
|
|
12
12
|
}
|
|
13
13
|
if (typeof global.lvyConfig?.esbuild?.styles != 'boolean') {
|
|
14
14
|
plugins.push(esBuildCSS(global.lvyConfig.esbuild.styles));
|
|
@@ -25,13 +25,16 @@ const ESBuild = async (input) => {
|
|
|
25
25
|
global.lvyConfig = {};
|
|
26
26
|
if (!global.lvyConfig.esbuild)
|
|
27
27
|
global.lvyConfig.esbuild = {};
|
|
28
|
+
// alias
|
|
29
|
+
if (global.lvyConfig.alias)
|
|
30
|
+
esBuildAlias(global.lvyConfig.alias);
|
|
28
31
|
// 没有插件时,检查是否有可用插件。
|
|
29
32
|
if (plugins.length === 0) {
|
|
30
33
|
// init plugisn
|
|
31
34
|
await initPlugins();
|
|
32
35
|
}
|
|
33
36
|
//
|
|
34
|
-
const options = global.lvyConfig
|
|
37
|
+
const options = global.lvyConfig?.esBuildOptions || {};
|
|
35
38
|
// 构建
|
|
36
39
|
const result = await esbuild.build({
|
|
37
40
|
// 入口文件
|
package/lib/loader/plugins.d.ts
CHANGED
package/lib/loader/plugins.js
CHANGED
|
@@ -1,32 +1,9 @@
|
|
|
1
1
|
import { resolve, relative, dirname, join } from 'path';
|
|
2
|
-
import { existsSync, readFileSync } from 'fs';
|
|
3
2
|
import { spawn } from 'child_process';
|
|
4
3
|
import crypto from 'node:crypto';
|
|
5
|
-
import JSON5 from 'json5';
|
|
6
4
|
|
|
7
|
-
let tsconfig = null;
|
|
8
|
-
let aliases = {};
|
|
9
5
|
const assetsReg = /\.(png|jpg|jpeg|gif|svg|webp|ico)$/;
|
|
10
6
|
const cssReg = /\.(css|scss)$/;
|
|
11
|
-
// 初始化函数,读取并解析 tsconfig.json 文件
|
|
12
|
-
const init = () => {
|
|
13
|
-
try {
|
|
14
|
-
const tsconfigPath = resolve(process.cwd(), 'tsconfig.json');
|
|
15
|
-
if (existsSync(tsconfigPath)) {
|
|
16
|
-
const tsconfigContent = readFileSync(tsconfigPath, 'utf-8');
|
|
17
|
-
tsconfig = JSON5.parse(tsconfigContent);
|
|
18
|
-
aliases = tsconfig.compilerOptions?.paths || {};
|
|
19
|
-
}
|
|
20
|
-
else {
|
|
21
|
-
tsconfig = 'error';
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
catch {
|
|
25
|
-
tsconfig = 'error';
|
|
26
|
-
}
|
|
27
|
-
};
|
|
28
|
-
// 初始化配置
|
|
29
|
-
init();
|
|
30
7
|
/**
|
|
31
8
|
*
|
|
32
9
|
* @param input
|
|
@@ -79,13 +56,25 @@ const getHash = (str) => {
|
|
|
79
56
|
hash.update(str);
|
|
80
57
|
return hash.digest('hex');
|
|
81
58
|
};
|
|
59
|
+
let entries = null;
|
|
60
|
+
const esBuildAlias = (alias) => {
|
|
61
|
+
if (!entries) {
|
|
62
|
+
entries = alias?.entries ?? [];
|
|
63
|
+
}
|
|
64
|
+
};
|
|
82
65
|
const handleAsstesFile = (url) => {
|
|
83
|
-
for (const
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
66
|
+
for (const { find, replacement } of entries) {
|
|
67
|
+
if (typeof find === 'string') {
|
|
68
|
+
// 使用 startsWith 处理字符串类型
|
|
69
|
+
if (url.startsWith(find)) {
|
|
70
|
+
const fileUrl = join(replacement, url.replace(find, ''));
|
|
71
|
+
return `export default "${convertPath(fileUrl)}";`;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else if (find instanceof RegExp) {
|
|
75
|
+
// 使用 test 方法处理正则表达式类型
|
|
76
|
+
if (find.test(url)) {
|
|
77
|
+
const fileUrl = join(replacement, url.replace(find, ''));
|
|
89
78
|
return `export default "${convertPath(fileUrl)}";`;
|
|
90
79
|
}
|
|
91
80
|
}
|
|
@@ -109,15 +98,22 @@ const handleCSS = (fileUrl) => {
|
|
|
109
98
|
/**
|
|
110
99
|
* 处理路径别名的加载
|
|
111
100
|
* @param {string} url URL
|
|
112
|
-
* @returns {
|
|
101
|
+
* @returns {string|null} 加载结果
|
|
113
102
|
*/
|
|
114
103
|
const handleCSSPath = (url) => {
|
|
115
|
-
for (const
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
const
|
|
104
|
+
for (const { find, replacement } of entries) {
|
|
105
|
+
if (typeof find === 'string') {
|
|
106
|
+
// 使用 startsWith 处理字符串类型
|
|
107
|
+
if (url.startsWith(find)) {
|
|
108
|
+
const fileUrl = join(replacement, url.replace(find, ''));
|
|
109
|
+
const outputDir = handleCSS(fileUrl);
|
|
110
|
+
return `export default "${convertPath(outputDir)}";`;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
else if (find instanceof RegExp) {
|
|
114
|
+
// 使用 test 方法处理正则表达式类型
|
|
115
|
+
if (find.test(url)) {
|
|
116
|
+
const fileUrl = join(replacement, url.replace(find, ''));
|
|
121
117
|
const outputDir = handleCSS(fileUrl);
|
|
122
118
|
return `export default "${convertPath(outputDir)}";`;
|
|
123
119
|
}
|
|
@@ -132,7 +128,7 @@ const handleCSSPath = (url) => {
|
|
|
132
128
|
const esBuildAsstes = (optoins = {}) => {
|
|
133
129
|
// 默认配置
|
|
134
130
|
const filter = optoins?.filter ?? assetsReg;
|
|
135
|
-
const namespace =
|
|
131
|
+
const namespace = 'assets';
|
|
136
132
|
// 返回插件
|
|
137
133
|
return {
|
|
138
134
|
name: 'assets-loader',
|
|
@@ -215,4 +211,4 @@ const esBuildCSS = (optoins = {}) => {
|
|
|
215
211
|
};
|
|
216
212
|
};
|
|
217
213
|
|
|
218
|
-
export { esBuildAsstes, esBuildCSS };
|
|
214
|
+
export { esBuildAlias, esBuildAsstes, esBuildCSS };
|
package/lib/loader/store.d.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { RollupAliasOptions } from '@rollup/plugin-alias';
|
|
2
|
-
import { RollupOptions } from 'rollup';
|
|
3
2
|
import { RollupStylesCSSImportOptions } from '../plugins/loader-css.js';
|
|
4
3
|
import { RollupCommonJSOptions } from '@rollup/plugin-commonjs';
|
|
5
4
|
import { RollupJsonOptions } from '@rollup/plugin-json';
|
|
6
5
|
import { RollupTypescriptOptions } from '@rollup/plugin-typescript';
|
|
7
6
|
import { SameShape, BuildOptions } from 'esbuild';
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
7
|
+
import { ESBuildCSSOptions } from './plugins.js';
|
|
8
|
+
import { RollupBuild } from 'rollup';
|
|
10
9
|
|
|
10
|
+
type RollupBuildOptions = Parameters<RollupBuild['write']>['0'];
|
|
11
11
|
type Options = {
|
|
12
12
|
/**
|
|
13
13
|
* 配置调整机及其回调插件
|
|
@@ -28,37 +28,45 @@ type Options = {
|
|
|
28
28
|
*/
|
|
29
29
|
useApp?: () => void;
|
|
30
30
|
}[];
|
|
31
|
+
/**
|
|
32
|
+
* 别名
|
|
33
|
+
*/
|
|
34
|
+
alias?: {
|
|
35
|
+
entries?: RollupAliasOptions['entries'];
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* 静态资源识别
|
|
39
|
+
*/
|
|
40
|
+
assets?: {
|
|
41
|
+
filter?: RegExp;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
*
|
|
45
|
+
*/
|
|
46
|
+
esBuildOptions?: SameShape<BuildOptions, BuildOptions>;
|
|
31
47
|
/**
|
|
32
48
|
* 运行时配置
|
|
33
49
|
*/
|
|
34
50
|
esbuild?: {
|
|
35
51
|
[key: string]: any;
|
|
36
|
-
/**
|
|
37
|
-
* 资源
|
|
38
|
-
*/
|
|
39
|
-
assets?: ESBuildAsstesOptions | false;
|
|
40
52
|
/**
|
|
41
53
|
* 样式处理
|
|
42
54
|
*/
|
|
43
55
|
styles?: ESBuildCSSOptions | false;
|
|
44
|
-
/**
|
|
45
|
-
* ⚠️ 直接覆盖esbuild配置
|
|
46
|
-
*/
|
|
47
|
-
options?: SameShape<BuildOptions, BuildOptions>;
|
|
48
56
|
};
|
|
57
|
+
/**
|
|
58
|
+
* ⚠️ RollupBuild['write'] 配置
|
|
59
|
+
*/
|
|
60
|
+
rollupOptions?: RollupBuildOptions;
|
|
61
|
+
/**
|
|
62
|
+
*使用插件
|
|
63
|
+
*/
|
|
64
|
+
rollupPlugins?: any[];
|
|
49
65
|
/**
|
|
50
66
|
* 打包时配置
|
|
51
67
|
*/
|
|
52
68
|
build?: {
|
|
53
69
|
[key: string]: any;
|
|
54
|
-
/**
|
|
55
|
-
* 别名
|
|
56
|
-
*/
|
|
57
|
-
alias?: RollupAliasOptions | false;
|
|
58
|
-
/**
|
|
59
|
-
* 文件过滤
|
|
60
|
-
*/
|
|
61
|
-
assets?: RollupAssetsOptions | false;
|
|
62
70
|
/**
|
|
63
71
|
* 样式处理配置
|
|
64
72
|
*/
|
|
@@ -75,17 +83,7 @@ type Options = {
|
|
|
75
83
|
* ts配置
|
|
76
84
|
*/
|
|
77
85
|
typescript?: RollupTypescriptOptions | false;
|
|
78
|
-
|
|
79
|
-
*
|
|
80
|
-
*/
|
|
81
|
-
plugins?: any[];
|
|
82
|
-
/**
|
|
83
|
-
* ⚠️ 直接覆盖build配置
|
|
84
|
-
*/
|
|
85
|
-
rollupOptions?: {
|
|
86
|
-
input?: string | string[];
|
|
87
|
-
} & RollupOptions;
|
|
88
|
-
};
|
|
86
|
+
} | false;
|
|
89
87
|
};
|
|
90
88
|
/**
|
|
91
89
|
*
|
package/lib/loader/store.js
CHANGED
package/lib/main.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { register } from 'node:module'
|
|
1
|
+
import { register } from 'node:module';
|
|
2
2
|
|
|
3
|
-
register('./loader.js', import.meta.url)
|
|
3
|
+
register('./loader.js', import.meta.url);
|
|
@@ -1,12 +1,5 @@
|
|
|
1
|
-
import { InputPluginOption } from 'rollup';
|
|
2
|
-
|
|
3
1
|
type RollupStylesCSSImportOptions = {
|
|
4
2
|
include?: RegExp;
|
|
5
3
|
};
|
|
6
|
-
/**
|
|
7
|
-
*
|
|
8
|
-
* @returns
|
|
9
|
-
*/
|
|
10
|
-
declare const rollupStylesCSSImport: ({ include }?: RollupStylesCSSImportOptions) => InputPluginOption;
|
|
11
4
|
|
|
12
|
-
export {
|
|
5
|
+
export type { RollupStylesCSSImportOptions };
|