@es-pkg/compile 1.0.4 → 1.0.6

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/cjs/index.js CHANGED
@@ -1,190 +1,232 @@
1
1
  'use strict';
2
2
 
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- var gulp = require('@es-pkg/gulp');
6
- var utils = require('@es-pkg/utils');
7
- var config = require('@es-pkg/config');
8
- var rollup = require('rollup');
9
- var resolve = require('@rollup/plugin-node-resolve');
10
- var commonjs = require('@rollup/plugin-commonjs');
11
- var typescript = require('@rollup/plugin-typescript');
12
- var json = require('@rollup/plugin-json');
13
- var postcss = require('rollup-plugin-postcss');
14
- var autoprefixer = require('autoprefixer');
15
- var cssnano = require('cssnano');
16
- var path = require('node:path');
17
- var fs = require('node:fs');
18
-
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __export = (target, all) => {
10
+ for (var name2 in all)
11
+ __defProp(target, name2, { get: all[name2], enumerable: true });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(to, key) && key !== except)
17
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
+ }
19
+ return to;
20
+ };
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
+ // If the importer is in node compatibility mode or this is not an ESM
23
+ // file that has been converted to a CommonJS file using a Babel-
24
+ // compatible transform (i.e. "__esModule" has not been set), then set
25
+ // "default" to the CommonJS "module.exports" for node compatibility.
26
+ !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
+ mod
28
+ ));
29
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
+ var src_exports = {};
31
+ __export(src_exports, {
32
+ default: () => src_default
33
+ });
34
+ module.exports = __toCommonJS(src_exports);
35
+ var import_gulp = __toESM(require("@es-pkg/gulp"));
36
+ var import_utils = require("@es-pkg/utils");
37
+ var import_config = require("@es-pkg/config");
38
+ var import_rollup = require("rollup");
39
+ var import_plugin_node_resolve = __toESM(require("@rollup/plugin-node-resolve"));
40
+ var import_plugin_commonjs = __toESM(require("@rollup/plugin-commonjs"));
41
+ var import_plugin_typescript = __toESM(require("@rollup/plugin-typescript"));
42
+ var import_plugin_json = __toESM(require("@rollup/plugin-json"));
43
+ var import_rollup_plugin_postcss = __toESM(require("rollup-plugin-postcss"));
44
+ var import_autoprefixer = __toESM(require("autoprefixer"));
45
+ var import_cssnano = __toESM(require("cssnano"));
46
+ var import_node_path = __toESM(require("node:path"));
47
+ var import_node_fs = __toESM(require("node:fs"));
48
+ var import_rollup_plugin_esbuild = __toESM(require("rollup-plugin-esbuild"));
49
+ var import_node_module = require("node:module");
19
50
  const clean = () => {
20
- utils.log(`清除 ${config.relativeToApp(config.config.es)} & ${config.relativeToApp(config.config.cjs)} 目录---开始`);
21
- const promises = [
22
- utils.remove(config.config.publishDir, true),
23
- utils.remove(config.config.es, true),
24
- utils.remove(config.config.cjs, true),
25
- utils.remove(config.config.iife, true),
26
- ];
27
- return Promise.all(promises).then(res => {
28
- utils.log(`清除 ${config.relativeToApp(config.config.es)} & ${config.relativeToApp(config.config.cjs)} 目录---结束`);
29
- });
51
+ (0, import_utils.log)(`\u6E05\u9664 ${(0, import_config.relativeToApp)(import_config.config.es)} & ${(0, import_config.relativeToApp)(import_config.config.cjs)} \u76EE\u5F55---\u5F00\u59CB`);
52
+ const promises = [
53
+ (0, import_utils.remove)(import_config.config.publishDir, true),
54
+ (0, import_utils.remove)(import_config.config.es, true),
55
+ (0, import_utils.remove)(import_config.config.cjs, true),
56
+ (0, import_utils.remove)(import_config.config.iife, true)
57
+ ];
58
+ return Promise.all(promises).then((res) => {
59
+ (0, import_utils.log)(`\u6E05\u9664 ${(0, import_config.relativeToApp)(import_config.config.es)} & ${(0, import_config.relativeToApp)(import_config.config.cjs)} \u76EE\u5F55---\u7ED3\u675F`);
60
+ });
30
61
  };
31
62
  function getPostcss(extract) {
32
- return postcss({
33
- // 处理 Less(需安装 less)
34
- extensions: ['.less', '.scss', '.sass'], // 识别 less 扩展名
35
- // 为不同类型的文件指定对应的编译器(关键修改)
36
- use: {
37
- "stylus": ['sass'],
38
- 'less': ['less'], //.less 文件用 less 编译
39
- 'sass': ['sass'] //.sass 文件用 sass 编译(缩进语法)
40
- },
41
- // 配置 PostCSS 插件(自动前缀、压缩)
42
- plugins: [
43
- autoprefixer({ overrideBrowserslist: config.config.css.browserslist }),
44
- cssnano() // 生产环境压缩 CSS
45
- ],
46
- // 输出配置:提取为单独的 CSS 文件(推荐)
47
- extract, // 提取到 ${name}.min.css
48
- // 可选:不提取,嵌入到 JS 中(通过 import 会生成 style 标签)
49
- // extract: false
50
- });
63
+ return (0, import_rollup_plugin_postcss.default)({
64
+ // 处理 Less(需安装 less)
65
+ extensions: [".less", ".scss", ".sass"],
66
+ // 识别 less 扩展名
67
+ // 为不同类型的文件指定对应的编译器(关键修改)
68
+ use: {
69
+ "stylus": ["sass"],
70
+ "less": ["less"],
71
+ //.less 文件用 less 编译
72
+ "sass": ["sass"]
73
+ //.sass 文件用 sass 编译(缩进语法)
74
+ },
75
+ // 配置 PostCSS 插件(自动前缀、压缩)
76
+ plugins: [
77
+ (0, import_autoprefixer.default)({ overrideBrowserslist: import_config.config.css.browserslist }),
78
+ (0, import_cssnano.default)()
79
+ // 生产环境压缩 CSS
80
+ ],
81
+ // 输出配置:提取为单独的 CSS 文件(推荐)
82
+ extract
83
+ // 提取到 ${name}.min.css
84
+ // 可选:不提取,嵌入到 JS 中(通过 import 会生成 style 标签)
85
+ // extract: false
86
+ });
51
87
  }
52
- const name = utils.getValidPkgName(config.pkg.name);
53
- // 1. 配置输入选项
54
- function getInputOptions(isIIFE, declarationDir) {
55
- function isNodeModule(id) {
56
- // 获取模块绝对路径
57
- try {
58
- const resolved = require.resolve(id, { paths: [process.cwd()] });
59
- return resolved.includes('node_modules');
60
- }
61
- catch {
62
- // 无法 resolve 的,认为是本地模块
63
- return false;
64
- }
88
+ const name = (0, import_utils.getValidPkgName)(import_config.pkg.name);
89
+ function getInputOptions(format, declarationDir) {
90
+ function isNodeModule(id) {
91
+ try {
92
+ const resolved = require.resolve(id, { paths: [process.cwd()] });
93
+ return resolved.includes("node_modules");
94
+ } catch {
95
+ return false;
65
96
  }
66
- return ({
67
- input: config.shallowInputs,
68
- external: id => {
69
- // 排除本地相对路径和绝对路径,别名映射到本地也不会 external
70
- if (id.startsWith('.') || path.isAbsolute(id))
71
- return false;
72
- // node_modules 下的模块才 external
73
- return isNodeModule(id);
74
- },
75
- plugins: [
76
- json(),
77
- isIIFE && resolve(), // 解析 node_modules
78
- commonjs(), // 转换 CommonJS 模块
79
- typescript({
80
- tsconfig: config.resolveApp('tsconfig.json'), // 可选,指定 tsconfig
81
- compilerOptions: {
82
- noImplicitAny: true,
83
- isolatedModules: false,
84
- declaration: !!declarationDir,
85
- allowImportingTsExtensions: false,
86
- declarationDir,
87
- noEmit: false,
88
- emitDeclarationOnly: !!declarationDir,
89
- esModuleInterop: true,
90
- resolveJsonModule: true,
91
- skipLibCheck: true,
92
- removeComments: false,
93
- rootDir: config.resolveApp('src'), // ✅ 指定源代码根目录
94
- }
95
- }),
96
- getPostcss(config.config.css.extract)
97
- ].filter(Boolean)
98
- });
97
+ }
98
+ return {
99
+ input: import_config.shallowInputs.filter((item) => !item.endsWith(".d.ts")),
100
+ external: (id) => {
101
+ if (import_node_module.builtinModules.includes(id))
102
+ return true;
103
+ if (id.startsWith(".") || import_node_path.default.isAbsolute(id))
104
+ return false;
105
+ return isNodeModule(id);
106
+ },
107
+ plugins: [
108
+ (0, import_plugin_json.default)(),
109
+ format === "iife" && (0, import_plugin_node_resolve.default)(),
110
+ // 解析 node_modules
111
+ format === "iife" && (0, import_plugin_commonjs.default)({ defaultIsModuleExports: true }),
112
+ // 转换 CommonJS 模块
113
+ (0, import_plugin_typescript.default)({
114
+ tsconfig: (0, import_config.resolveApp)("tsconfig.json"),
115
+ // 可选,指定 tsconfig
116
+ compilerOptions: {
117
+ module: "esnext",
118
+ importHelpers: false,
119
+ esModuleInterop: true,
120
+ allowSyntheticDefaultImports: true,
121
+ noImplicitAny: true,
122
+ isolatedModules: false,
123
+ declaration: !!declarationDir,
124
+ allowImportingTsExtensions: false,
125
+ declarationDir,
126
+ noEmit: false,
127
+ emitDeclarationOnly: !!declarationDir,
128
+ resolveJsonModule: true,
129
+ skipLibCheck: true,
130
+ removeComments: false,
131
+ rootDir: (0, import_config.resolveApp)("src")
132
+ // ✅ 指定源代码根目录
133
+ }
134
+ }),
135
+ ["cjs", "commonjs"].includes(format) && (0, import_rollup_plugin_esbuild.default)({
136
+ target: "esnext",
137
+ format: "cjs"
138
+ }),
139
+ getPostcss(import_config.config.css.extract)
140
+ ].filter(Boolean)
141
+ };
99
142
  }
100
143
  async function buildExtraCss() {
101
- const extras = config.config.css.extra;
102
- if (!extras?.length)
103
- return;
104
- const srcRoot = config.resolveApp('src');
105
- const esRoot = config.resolveApp(config.config.es);
106
- const tasks = extras.map(async (v) => {
107
- try {
108
- const absPath = config.resolveApp(v); // 源文件绝对路径
109
- const relativePath = path.relative(srcRoot, absPath); // 相对于 src 的路径
110
- const dirname = path.dirname(relativePath); // 相对目录
111
- const filename = path.basename(v, path.extname(v)); // 文件名去掉扩展名
112
- // rollup 打包
113
- const bundle = await rollup.rollup({
114
- input: [v],
115
- plugins: getPostcss(path.join(dirname, `${filename}.min.css`))
116
- });
117
- await bundle.write({
118
- dir: config.config.es,
119
- format: 'es',
120
- sourcemap: false,
121
- preserveModules: true,
122
- preserveModulesRoot: srcRoot
123
- });
124
- // 删除生成的 JS 文件
125
- const jsFile = path.join(esRoot, dirname, `${filename}${path.extname(v)}.js`);
126
- if (fs.existsSync(jsFile))
127
- fs.unlinkSync(jsFile);
128
- // 复制到其他目标目录
129
- [config.config.cjs, config.config.iife].forEach(targetRoot => {
130
- const dest = path.join(config.resolveApp(targetRoot), dirname, `${filename}.min.css`);
131
- fs.mkdirSync(path.dirname(dest), { recursive: true });
132
- fs.copyFileSync(path.join(esRoot, dirname, `${filename}.min.css`), dest);
133
- });
134
- utils.log.success(`✅ 编译完成: ${v}`);
135
- }
136
- catch (err) {
137
- utils.log.error(`❌ 编译失败: ${v}`, err);
138
- }
139
- });
140
- await Promise.all(tasks);
141
- utils.log.success('✅ 所有额外 CSS 编译完成');
144
+ const extras = import_config.config.css.extra;
145
+ if (!extras?.length)
146
+ return;
147
+ const srcRoot = (0, import_config.resolveApp)("src");
148
+ const esRoot = (0, import_config.resolveApp)(import_config.config.es);
149
+ const tasks = extras.map(async (v) => {
150
+ try {
151
+ const absPath = (0, import_config.resolveApp)(v);
152
+ const relativePath = import_node_path.default.relative(srcRoot, absPath);
153
+ const dirname = import_node_path.default.dirname(relativePath);
154
+ const filename = import_node_path.default.basename(v, import_node_path.default.extname(v));
155
+ const bundle = await (0, import_rollup.rollup)({
156
+ input: [v],
157
+ plugins: getPostcss(import_node_path.default.join(dirname, `${filename}.min.css`))
158
+ });
159
+ await bundle.write({
160
+ dir: import_config.config.es,
161
+ format: "es",
162
+ sourcemap: false,
163
+ preserveModules: true,
164
+ preserveModulesRoot: srcRoot
165
+ });
166
+ const jsFile = import_node_path.default.join(esRoot, dirname, `${filename}${import_node_path.default.extname(v)}.js`);
167
+ if (import_node_fs.default.existsSync(jsFile))
168
+ import_node_fs.default.unlinkSync(jsFile);
169
+ [import_config.config.cjs, import_config.config.iife].forEach((targetRoot) => {
170
+ const dest = import_node_path.default.join((0, import_config.resolveApp)(targetRoot), dirname, `${filename}.min.css`);
171
+ import_node_fs.default.mkdirSync(import_node_path.default.dirname(dest), { recursive: true });
172
+ import_node_fs.default.copyFileSync(import_node_path.default.join(esRoot, dirname, `${filename}.min.css`), dest);
173
+ });
174
+ import_utils.log.success(`\u2705 \u7F16\u8BD1\u5B8C\u6210: ${v}`);
175
+ } catch (err) {
176
+ import_utils.log.error(`\u274C \u7F16\u8BD1\u5931\u8D25: ${v}`, err);
177
+ }
178
+ });
179
+ await Promise.all(tasks);
180
+ import_utils.log.success("\u2705 \u6240\u6709\u989D\u5916 CSS \u7F16\u8BD1\u5B8C\u6210");
142
181
  }
143
182
  async function build() {
144
- // 2. 配置输出选项
145
- let outputOptions = [
146
- {
147
- dir: config.config.es,
148
- format: 'es', // 输出 ES Module
149
- sourcemap: false,
150
- preserveModules: true,
151
- preserveModulesRoot: config.resolveApp('src'), // ✅ 指定源代码根目录
152
- },
153
- {
154
- dir: config.config.cjs,
155
- format: 'cjs', // 输出 COMMONJS
156
- sourcemap: false,
157
- preserveModules: true,
158
- preserveModulesRoot: config.resolveApp('src'), // ✅ 指定源代码根目录
159
- exports: "named",
160
- },
161
- {
162
- dir: config.config.iife,
163
- format: 'iife', // 输出 iife
164
- sourcemap: false,
165
- exports: "named",
166
- name: utils.toPascalCase(name)
167
- }
168
- ];
169
- if (!config.config.iife) {
170
- outputOptions = outputOptions.filter(op => op.format !== 'iife');
171
- }
172
- for (const output of outputOptions) {
173
- // 3. 调用 rollup 打包
174
- const bundle = await rollup.rollup(getInputOptions(output.format === 'iife'));
175
- // 4. 写入文件
176
- await bundle.write(output);
177
- }
183
+ let outputOptions = [
178
184
  {
179
- const bundle = await rollup.rollup(getInputOptions(false, config.config.es));
180
- await bundle.write(outputOptions[0]);
185
+ dir: import_config.config.es,
186
+ format: "es",
187
+ // 输出 ES Module
188
+ sourcemap: false,
189
+ preserveModules: true,
190
+ preserveModulesRoot: (0, import_config.resolveApp)("src")
191
+ // ✅ 指定源代码根目录
192
+ },
193
+ {
194
+ dir: import_config.config.cjs,
195
+ format: "cjs",
196
+ // 输出 COMMONJS
197
+ sourcemap: false,
198
+ preserveModules: true,
199
+ preserveModulesRoot: (0, import_config.resolveApp)("src"),
200
+ // ✅ 指定源代码根目录
201
+ exports: "named"
202
+ },
203
+ {
204
+ dir: import_config.config.iife,
205
+ format: "iife",
206
+ // 输出 iife
207
+ sourcemap: false,
208
+ exports: "named",
209
+ name: (0, import_utils.toPascalCase)(name)
181
210
  }
182
- await buildExtraCss();
183
- utils.log.success('✅ Build complete!');
211
+ ];
212
+ if (!import_config.config.iife) {
213
+ outputOptions = outputOptions.filter((op) => op.format !== "iife");
214
+ }
215
+ for (const output of outputOptions) {
216
+ const bundle = await (0, import_rollup.rollup)(getInputOptions(output.format));
217
+ await bundle.write(output);
218
+ }
219
+ {
220
+ const bundle = await (0, import_rollup.rollup)(getInputOptions("es", import_config.config.es));
221
+ await bundle.write(outputOptions[0]);
222
+ }
223
+ await buildExtraCss();
224
+ import_utils.log.success("\u2705 Build complete!");
184
225
  }
226
+ const copySrcTds = () => {
227
+ return import_gulp.default.src(import_config.config.include.map((t) => `${t}/**/*.d.ts`)).pipe(import_gulp.default.dest(import_config.config.es));
228
+ };
185
229
  const copyTds = () => {
186
- return gulp.src([`${config.config.es}/**/*.d.ts`]).pipe(gulp.dest(config.config.cjs));
230
+ return import_gulp.default.src([`${import_config.config.es}/**/*.d.ts`]).pipe(import_gulp.default.dest(import_config.config.cjs));
187
231
  };
188
- var index = gulp.series(clean, build, copyTds);
189
-
190
- exports.default = index;
232
+ var src_default = (0, import_gulp.series)(clean, build, copySrcTds, copyTds);
package/esm/index.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ /// <reference types="undertaker" />
2
+ declare const _default: import("undertaker").TaskFunction;
3
+ export default _default;
@@ -1,210 +1,201 @@
1
- import gulp, {series} from "@es-pkg/gulp";
2
- import {remove, log, getValidPkgName, toPascalCase} from "@es-pkg/utils";
3
- import {config, shallowInputs, pkg, relativeToApp, resolveApp} from "@es-pkg/config";
4
- import {OutputOptions, rollup, RollupOptions} from 'rollup';
5
- import resolve from '@rollup/plugin-node-resolve';
6
- import commonjs from '@rollup/plugin-commonjs';
7
- import typescript from '@rollup/plugin-typescript';
8
- import json from '@rollup/plugin-json';
9
- import postcss from 'rollup-plugin-postcss';
10
- import autoprefixer from 'autoprefixer';
11
- import cssnano from 'cssnano';
12
- import path from 'node:path';
13
- import fs from 'node:fs'
14
- import {builtinModules} from 'node:module';
15
-
16
- const clean = () => {
17
- log(`清除 ${relativeToApp(config.es)} & ${relativeToApp(config.cjs)} 目录---开始`);
18
- const promises = [
19
- remove(config.publishDir, true),
20
- remove(config.es, true),
21
- remove(config.cjs, true),
22
- remove(config.iife, true),
23
- ]
24
- return Promise.all(promises).then(res => {
25
- log(`清除 ${relativeToApp(config.es)} & ${relativeToApp(config.cjs)} 目录---结束`)
26
- })
27
- }
28
-
29
- function getPostcss(extract?: string | boolean) {
30
- return postcss({
31
- // 处理 Less(需安装 less)
32
- extensions: ['.less', '.scss', '.sass'], // 识别 less 扩展名
33
- // 为不同类型的文件指定对应的编译器(关键修改)
34
- use: {
35
- "stylus": ['sass'],
36
- 'less': ['less'], //.less 文件用 less 编译
37
- 'sass': ['sass'] //.sass 文件用 sass 编译(缩进语法)
38
- },
39
-
40
- // 配置 PostCSS 插件(自动前缀、压缩)
41
- plugins: [
42
- autoprefixer({overrideBrowserslist: config.css.browserslist}),
43
- cssnano() // 生产环境压缩 CSS
44
- ],
45
-
46
- // 输出配置:提取为单独的 CSS 文件(推荐)
47
- extract, // 提取到 ${name}.min.css
48
-
49
- // 可选:不提取,嵌入到 JS 中(通过 import 会生成 style 标签)
50
- // extract: false
51
- })
52
- }
53
-
54
- const name = getValidPkgName(pkg.name);
55
-
56
- // 1. 配置输入选项
57
- function getInputOptions(isIIFE?: boolean, declarationDir?: string): RollupOptions {
58
- function isNodeModule(id: string) {
59
- // 获取模块绝对路径
60
- try {
61
- const resolved = require.resolve(id, {paths: [process.cwd()]});
62
- return resolved.includes('node_modules');
63
- } catch {
64
- // 无法 resolve 的,认为是本地模块
65
- return false;
66
- }
67
- }
68
-
69
- return ({
70
- input: shallowInputs.filter(item => !item.endsWith('.d.ts')),
71
- external: id => {
72
- // Node 内置模块或者 npm 包都 external
73
- if (builtinModules.includes(id)) return true;
74
- // 排除本地相对路径和绝对路径,别名映射到本地也不会 external
75
- if (id.startsWith('.') || path.isAbsolute(id)) return false;
76
- // node_modules 下的模块才 external
77
- return isNodeModule(id);
78
- },
79
- plugins: [
80
- json(),
81
- isIIFE && resolve(), // 解析 node_modules
82
- commonjs(), // 转换 CommonJS 模块
83
- typescript({
84
- tsconfig: resolveApp('tsconfig.json'), // 可选,指定 tsconfig
85
- compilerOptions: {
86
- noImplicitAny: true,
87
- isolatedModules: false,
88
- declaration: !!declarationDir,
89
- allowImportingTsExtensions: false,
90
- declarationDir,
91
- noEmit: false,
92
- emitDeclarationOnly: !!declarationDir,
93
- esModuleInterop: true,
94
- resolveJsonModule: true,
95
- skipLibCheck: true,
96
- removeComments: false,
97
- rootDir: resolveApp('src'), // ✅ 指定源代码根目录
98
- }
99
- }),
100
- getPostcss(config.css.extract)
101
- ].filter(Boolean)
102
- })
103
- }
104
-
105
- async function buildExtraCss() {
106
- const extras = config.css.extra;
107
- if (!extras?.length) return;
108
-
109
- const srcRoot = resolveApp('src');
110
- const esRoot = resolveApp(config.es);
111
-
112
- const tasks = extras.map(async (v) => {
113
- try {
114
- const absPath = resolveApp(v); // 源文件绝对路径
115
- const relativePath = path.relative(srcRoot, absPath); // 相对于 src 的路径
116
- const dirname = path.dirname(relativePath); // 相对目录
117
- const filename = path.basename(v, path.extname(v)); // 文件名去掉扩展名
118
-
119
- // rollup 打包
120
- const bundle = await rollup({
121
- input: [v],
122
- plugins: getPostcss(path.join(dirname, `${filename}.min.css`))
123
- });
124
-
125
- await bundle.write({
126
- dir: config.es,
127
- format: 'es',
128
- sourcemap: false,
129
- preserveModules: true,
130
- preserveModulesRoot: srcRoot
131
- });
132
-
133
- // 删除生成的 JS 文件
134
- const jsFile = path.join(esRoot, dirname, `${filename}${path.extname(v)}.js`);
135
- if (fs.existsSync(jsFile)) fs.unlinkSync(jsFile);
136
-
137
- // 复制到其他目标目录
138
- [config.cjs, config.iife].forEach(targetRoot => {
139
- const dest = path.join(resolveApp(targetRoot), dirname, `${filename}.min.css`);
140
- fs.mkdirSync(path.dirname(dest), {recursive: true});
141
- fs.copyFileSync(
142
- path.join(esRoot, dirname, `${filename}.min.css`),
143
- dest
144
- );
145
- });
146
-
147
- log.success(`✅ 编译完成: ${v}`);
148
- } catch (err) {
149
- log.error(`❌ 编译失败: ${v}`, err);
150
- }
151
- });
152
-
153
- await Promise.all(tasks);
154
- log.success('✅ 所有额外 CSS 编译完成');
155
- }
156
-
157
- async function build() {
158
-
159
- // 2. 配置输出选项
160
- let outputOptions: OutputOptions[] = [
161
- {
162
- dir: config.es,
163
- format: 'es', // 输出 ES Module
164
- sourcemap: false,
165
- preserveModules: true,
166
- preserveModulesRoot: resolveApp('src'), // ✅ 指定源代码根目录
167
- },
168
- {
169
- dir: config.cjs,
170
- format: 'cjs', // 输出 COMMONJS
171
- sourcemap: false,
172
- preserveModules: true,
173
- preserveModulesRoot: resolveApp('src'), // ✅ 指定源代码根目录
174
- exports: "named",
175
- },
176
- {
177
- dir: config.iife,
178
- format: 'iife', // 输出 iife
179
- sourcemap: false,
180
- exports: "named",
181
- name: toPascalCase(name)
182
- }
183
- ];
184
- if (!config.iife) {
185
- outputOptions = outputOptions.filter(op => op.format !== 'iife')
186
- }
187
-
188
- for (const output of outputOptions) {
189
- // 3. 调用 rollup 打包
190
- const bundle = await rollup(getInputOptions(output.format === 'iife'));
191
- // 4. 写入文件
192
- await bundle.write(output);
193
- }
194
- {
195
- const bundle = await rollup(getInputOptions(false, config.es));
196
- await bundle.write(outputOptions[0]);
197
- }
198
- await buildExtraCss();
199
- log.success('✅ Build complete!');
200
- }
201
-
202
-
203
- const copySrcTds = () => {
204
- return gulp.src(config.include.map(t=>`${t}/**/*.d.ts`)).pipe(gulp.dest(config.es));
205
- }
206
-
207
- const copyTds = () => {
208
- return gulp.src([`${config.es}/**/*.d.ts`]).pipe(gulp.dest(config.cjs));
209
- }
210
- export default series(clean, build, copySrcTds, copyTds)
1
+ import gulp, { series } from '@es-pkg/gulp';
2
+ import { getValidPkgName, log, remove, toPascalCase } from '@es-pkg/utils';
3
+ import { pkg, relativeToApp, config, resolveApp, shallowInputs } from '@es-pkg/config';
4
+ import { rollup } from 'rollup';
5
+ import resolve from '@rollup/plugin-node-resolve';
6
+ import commonjs from '@rollup/plugin-commonjs';
7
+ import typescript from '@rollup/plugin-typescript';
8
+ import json from '@rollup/plugin-json';
9
+ import postcss from 'rollup-plugin-postcss';
10
+ import autoprefixer from 'autoprefixer';
11
+ import cssnano from 'cssnano';
12
+ import path from 'node:path';
13
+ import fs from 'node:fs';
14
+ import esbuild from 'rollup-plugin-esbuild';
15
+ import { builtinModules } from 'node:module';
16
+
17
+ const clean = () => {
18
+ log(`清除 ${relativeToApp(config.es)} & ${relativeToApp(config.cjs)} 目录---开始`);
19
+ const promises = [
20
+ remove(config.publishDir, true),
21
+ remove(config.es, true),
22
+ remove(config.cjs, true),
23
+ remove(config.iife, true),
24
+ ];
25
+ return Promise.all(promises).then(res => {
26
+ log(`清除 ${relativeToApp(config.es)} & ${relativeToApp(config.cjs)} 目录---结束`);
27
+ });
28
+ };
29
+ function getPostcss(extract) {
30
+ return postcss({
31
+ // 处理 Less(需安装 less)
32
+ extensions: ['.less', '.scss', '.sass'], // 识别 less 扩展名
33
+ // 为不同类型的文件指定对应的编译器(关键修改)
34
+ use: {
35
+ "stylus": ['sass'],
36
+ 'less': ['less'], //.less 文件用 less 编译
37
+ 'sass': ['sass'] //.sass 文件用 sass 编译(缩进语法)
38
+ },
39
+ // 配置 PostCSS 插件(自动前缀、压缩)
40
+ plugins: [
41
+ autoprefixer({ overrideBrowserslist: config.css.browserslist }),
42
+ cssnano() // 生产环境压缩 CSS
43
+ ],
44
+ // 输出配置:提取为单独的 CSS 文件(推荐)
45
+ extract, // 提取到 ${name}.min.css
46
+ // 可选:不提取,嵌入到 JS 中(通过 import 会生成 style 标签)
47
+ // extract: false
48
+ });
49
+ }
50
+ const name = getValidPkgName(pkg.name);
51
+ // 1. 配置输入选项
52
+ function getInputOptions(format, declarationDir) {
53
+ function isNodeModule(id) {
54
+ // 获取模块绝对路径
55
+ try {
56
+ const resolved = require.resolve(id, { paths: [process.cwd()] });
57
+ return resolved.includes('node_modules');
58
+ }
59
+ catch {
60
+ // 无法 resolve 的,认为是本地模块
61
+ return false;
62
+ }
63
+ }
64
+ return ({
65
+ input: shallowInputs.filter(item => !item.endsWith('.d.ts')),
66
+ external: id => {
67
+ // Node 内置模块或者 npm 包都 external
68
+ if (builtinModules.includes(id))
69
+ return true;
70
+ // 排除本地相对路径和绝对路径,别名映射到本地也不会 external
71
+ if (id.startsWith('.') || path.isAbsolute(id))
72
+ return false;
73
+ // node_modules 下的模块才 external
74
+ return isNodeModule(id);
75
+ },
76
+ plugins: [
77
+ json(),
78
+ format === 'iife' && resolve(), // 解析 node_modules
79
+ format === 'iife' && commonjs({ defaultIsModuleExports: true }), // 转换 CommonJS 模块
80
+ typescript({
81
+ tsconfig: resolveApp('tsconfig.json'), // 可选,指定 tsconfig
82
+ compilerOptions: {
83
+ module: 'esnext',
84
+ importHelpers: false,
85
+ esModuleInterop: true,
86
+ allowSyntheticDefaultImports: true,
87
+ noImplicitAny: true,
88
+ isolatedModules: false,
89
+ declaration: !!declarationDir,
90
+ allowImportingTsExtensions: false,
91
+ declarationDir,
92
+ noEmit: false,
93
+ emitDeclarationOnly: !!declarationDir,
94
+ resolveJsonModule: true,
95
+ skipLibCheck: true,
96
+ removeComments: false,
97
+ rootDir: resolveApp('src'), // ✅ 指定源代码根目录
98
+ }
99
+ }),
100
+ ["cjs", "commonjs"].includes(format) && esbuild({
101
+ target: 'esnext',
102
+ format: "cjs",
103
+ }),
104
+ getPostcss(config.css.extract)
105
+ ].filter(Boolean)
106
+ });
107
+ }
108
+ async function buildExtraCss() {
109
+ const extras = config.css.extra;
110
+ if (!extras?.length)
111
+ return;
112
+ const srcRoot = resolveApp('src');
113
+ const esRoot = resolveApp(config.es);
114
+ const tasks = extras.map(async (v) => {
115
+ try {
116
+ const absPath = resolveApp(v); // 源文件绝对路径
117
+ const relativePath = path.relative(srcRoot, absPath); // 相对于 src 的路径
118
+ const dirname = path.dirname(relativePath); // 相对目录
119
+ const filename = path.basename(v, path.extname(v)); // 文件名去掉扩展名
120
+ // rollup 打包
121
+ const bundle = await rollup({
122
+ input: [v],
123
+ plugins: getPostcss(path.join(dirname, `${filename}.min.css`))
124
+ });
125
+ await bundle.write({
126
+ dir: config.es,
127
+ format: 'es',
128
+ sourcemap: false,
129
+ preserveModules: true,
130
+ preserveModulesRoot: srcRoot
131
+ });
132
+ // 删除生成的 JS 文件
133
+ const jsFile = path.join(esRoot, dirname, `${filename}${path.extname(v)}.js`);
134
+ if (fs.existsSync(jsFile))
135
+ fs.unlinkSync(jsFile);
136
+ // 复制到其他目标目录
137
+ [config.cjs, config.iife].forEach(targetRoot => {
138
+ const dest = path.join(resolveApp(targetRoot), dirname, `${filename}.min.css`);
139
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
140
+ fs.copyFileSync(path.join(esRoot, dirname, `${filename}.min.css`), dest);
141
+ });
142
+ log.success(`✅ 编译完成: ${v}`);
143
+ }
144
+ catch (err) {
145
+ log.error(`❌ 编译失败: ${v}`, err);
146
+ }
147
+ });
148
+ await Promise.all(tasks);
149
+ log.success('✅ 所有额外 CSS 编译完成');
150
+ }
151
+ async function build() {
152
+ // 2. 配置输出选项
153
+ let outputOptions = [
154
+ {
155
+ dir: config.es,
156
+ format: 'es', // 输出 ES Module
157
+ sourcemap: false,
158
+ preserveModules: true,
159
+ preserveModulesRoot: resolveApp('src'), // 指定源代码根目录
160
+ },
161
+ {
162
+ dir: config.cjs,
163
+ format: 'cjs', // 输出 COMMONJS
164
+ sourcemap: false,
165
+ preserveModules: true,
166
+ preserveModulesRoot: resolveApp('src'), // ✅ 指定源代码根目录
167
+ exports: "named",
168
+ },
169
+ {
170
+ dir: config.iife,
171
+ format: 'iife', // 输出 iife
172
+ sourcemap: false,
173
+ exports: "named",
174
+ name: toPascalCase(name)
175
+ }
176
+ ];
177
+ if (!config.iife) {
178
+ outputOptions = outputOptions.filter(op => op.format !== 'iife');
179
+ }
180
+ for (const output of outputOptions) {
181
+ // 3. 调用 rollup 打包
182
+ const bundle = await rollup(getInputOptions(output.format));
183
+ // 4. 写入文件
184
+ await bundle.write(output);
185
+ }
186
+ {
187
+ const bundle = await rollup(getInputOptions('es', config.es));
188
+ await bundle.write(outputOptions[0]);
189
+ }
190
+ await buildExtraCss();
191
+ log.success('✅ Build complete!');
192
+ }
193
+ const copySrcTds = () => {
194
+ return gulp.src(config.include.map(t => `${t}/**/*.d.ts`)).pipe(gulp.dest(config.es));
195
+ };
196
+ const copyTds = () => {
197
+ return gulp.src([`${config.es}/**/*.d.ts`]).pipe(gulp.dest(config.cjs));
198
+ };
199
+ var index = series(clean, build, copySrcTds, copyTds);
200
+
201
+ export { index as default };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@es-pkg/compile",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "description": "组件打包工具",
5
5
  "main": "cjs/index.js",
6
6
  "keywords": [
@@ -25,6 +25,7 @@
25
25
  "@rollup/plugin-node-resolve": "^16.0.3",
26
26
  "rollup": "^4.52.5",
27
27
  "rollup-plugin-postcss": "^4.0.2",
28
+ "rollup-plugin-esbuild": "latest",
28
29
  "@rollup/plugin-typescript": "^12.3.0",
29
30
  "@rollup/plugin-json": "^6.1.0",
30
31
  "autoprefixer": "^10.4.21",
@@ -39,10 +40,10 @@
39
40
  "access": "public",
40
41
  "registry": "https://registry.npmjs.org"
41
42
  },
42
- "module": "src/index.ts",
43
- "types": "src/index.ts",
43
+ "module": "esm/index.js",
44
+ "types": "esm/index.d.ts",
44
45
  "files": [
45
- "src",
46
+ "esm",
46
47
  "cjs"
47
48
  ]
48
49
  }