unplugin-env 1.0.2 → 1.0.4

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/dist/vite.cjs CHANGED
@@ -1147,7 +1147,7 @@ var require_parse = __commonJS({
1147
1147
  CHAR_NO_BREAK_SPACE,
1148
1148
  CHAR_ZERO_WIDTH_NOBREAK_SPACE
1149
1149
  } = require_constants();
1150
- var parse = (input, options = {}) => {
1150
+ var parse2 = (input, options = {}) => {
1151
1151
  if (typeof input !== "string") {
1152
1152
  throw new TypeError("Expected a string");
1153
1153
  }
@@ -1347,7 +1347,7 @@ var require_parse = __commonJS({
1347
1347
  push({ type: "eos" });
1348
1348
  return ast;
1349
1349
  };
1350
- module2.exports = parse;
1350
+ module2.exports = parse2;
1351
1351
  }
1352
1352
  });
1353
1353
 
@@ -1358,7 +1358,7 @@ var require_braces = __commonJS({
1358
1358
  var stringify = require_stringify();
1359
1359
  var compile = require_compile();
1360
1360
  var expand = require_expand();
1361
- var parse = require_parse();
1361
+ var parse2 = require_parse();
1362
1362
  var braces = (input, options = {}) => {
1363
1363
  let output = [];
1364
1364
  if (Array.isArray(input)) {
@@ -1378,7 +1378,7 @@ var require_braces = __commonJS({
1378
1378
  }
1379
1379
  return output;
1380
1380
  };
1381
- braces.parse = (input, options = {}) => parse(input, options);
1381
+ braces.parse = (input, options = {}) => parse2(input, options);
1382
1382
  braces.stringify = (input, options = {}) => {
1383
1383
  if (typeof input === "string") {
1384
1384
  return stringify(braces.parse(input, options), options);
@@ -1914,7 +1914,7 @@ var require_scan = __commonJS({
1914
1914
  isExtglob = false;
1915
1915
  isGlob = false;
1916
1916
  }
1917
- let base2 = str;
1917
+ let base = str;
1918
1918
  let prefix = "";
1919
1919
  let glob = "";
1920
1920
  if (start > 0) {
@@ -1922,31 +1922,31 @@ var require_scan = __commonJS({
1922
1922
  str = str.slice(start);
1923
1923
  lastIndex -= start;
1924
1924
  }
1925
- if (base2 && isGlob === true && lastIndex > 0) {
1926
- base2 = str.slice(0, lastIndex);
1925
+ if (base && isGlob === true && lastIndex > 0) {
1926
+ base = str.slice(0, lastIndex);
1927
1927
  glob = str.slice(lastIndex);
1928
1928
  } else if (isGlob === true) {
1929
- base2 = "";
1929
+ base = "";
1930
1930
  glob = str;
1931
1931
  } else {
1932
- base2 = str;
1932
+ base = str;
1933
1933
  }
1934
- if (base2 && base2 !== "" && base2 !== "/" && base2 !== str) {
1935
- if (isPathSeparator(base2.charCodeAt(base2.length - 1))) {
1936
- base2 = base2.slice(0, -1);
1934
+ if (base && base !== "" && base !== "/" && base !== str) {
1935
+ if (isPathSeparator(base.charCodeAt(base.length - 1))) {
1936
+ base = base.slice(0, -1);
1937
1937
  }
1938
1938
  }
1939
1939
  if (opts.unescape === true) {
1940
1940
  if (glob) glob = utils.removeBackslashes(glob);
1941
- if (base2 && backslashes === true) {
1942
- base2 = utils.removeBackslashes(base2);
1941
+ if (base && backslashes === true) {
1942
+ base = utils.removeBackslashes(base);
1943
1943
  }
1944
1944
  }
1945
1945
  const state = {
1946
1946
  prefix,
1947
1947
  input,
1948
1948
  start,
1949
- base: base2,
1949
+ base,
1950
1950
  glob,
1951
1951
  isBrace,
1952
1952
  isBracket,
@@ -2031,7 +2031,7 @@ var require_parse2 = __commonJS({
2031
2031
  var syntaxError = (type, char) => {
2032
2032
  return `Missing ${type}: "${char}" - use "\\\\${char}" to match literal characters`;
2033
2033
  };
2034
- var parse = (input, options) => {
2034
+ var parse2 = (input, options) => {
2035
2035
  if (typeof input !== "string") {
2036
2036
  throw new TypeError("Expected a string");
2037
2037
  }
@@ -2180,7 +2180,7 @@ var require_parse2 = __commonJS({
2180
2180
  output = token.close = `)$))${extglobStar}`;
2181
2181
  }
2182
2182
  if (token.inner.includes("*") && (rest = remaining()) && /^\.[^\\/.]+$/.test(rest)) {
2183
- const expression = parse(rest, { ...options, fastpaths: false }).output;
2183
+ const expression = parse2(rest, { ...options, fastpaths: false }).output;
2184
2184
  output = token.close = `)${expression})${extglobStar})`;
2185
2185
  }
2186
2186
  if (token.prev.type === "bos") {
@@ -2705,7 +2705,7 @@ var require_parse2 = __commonJS({
2705
2705
  }
2706
2706
  return state;
2707
2707
  };
2708
- parse.fastpaths = (input, options) => {
2708
+ parse2.fastpaths = (input, options) => {
2709
2709
  const opts = { ...options };
2710
2710
  const max = typeof opts.maxLength === "number" ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;
2711
2711
  const len = input.length;
@@ -2771,7 +2771,7 @@ var require_parse2 = __commonJS({
2771
2771
  }
2772
2772
  return source;
2773
2773
  };
2774
- module2.exports = parse;
2774
+ module2.exports = parse2;
2775
2775
  }
2776
2776
  });
2777
2777
 
@@ -2781,7 +2781,7 @@ var require_picomatch = __commonJS({
2781
2781
  "use strict";
2782
2782
  var path3 = require("path");
2783
2783
  var scan = require_scan();
2784
- var parse = require_parse2();
2784
+ var parse2 = require_parse2();
2785
2785
  var utils = require_utils2();
2786
2786
  var constants = require_constants2();
2787
2787
  var isObject = (val) => val && typeof val === "object" && !Array.isArray(val);
@@ -2869,7 +2869,7 @@ var require_picomatch = __commonJS({
2869
2869
  picomatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str);
2870
2870
  picomatch.parse = (pattern, options) => {
2871
2871
  if (Array.isArray(pattern)) return pattern.map((p) => picomatch.parse(p, options));
2872
- return parse(pattern, { ...options, fastpaths: false });
2872
+ return parse2(pattern, { ...options, fastpaths: false });
2873
2873
  };
2874
2874
  picomatch.scan = (input, options) => scan(input, options);
2875
2875
  picomatch.compileRe = (state, options, returnOutput = false, returnState = false) => {
@@ -2895,10 +2895,10 @@ var require_picomatch = __commonJS({
2895
2895
  }
2896
2896
  let parsed = { negated: false, fastpaths: true };
2897
2897
  if (options.fastpaths !== false && (input[0] === "." || input[0] === "*")) {
2898
- parsed.output = parse.fastpaths(input, options);
2898
+ parsed.output = parse2.fastpaths(input, options);
2899
2899
  }
2900
2900
  if (!parsed.output) {
2901
- parsed = parse(input, options);
2901
+ parsed = parse2(input, options);
2902
2902
  }
2903
2903
  return picomatch.compileRe(parsed, options, returnOutput, returnState);
2904
2904
  };
@@ -3499,28 +3499,28 @@ var require_tasks = __commonJS({
3499
3499
  function groupPatternsByBaseDirectory(patterns) {
3500
3500
  const group = {};
3501
3501
  return patterns.reduce((collection, pattern) => {
3502
- const base2 = utils.pattern.getBaseDirectory(pattern);
3503
- if (base2 in collection) {
3504
- collection[base2].push(pattern);
3502
+ const base = utils.pattern.getBaseDirectory(pattern);
3503
+ if (base in collection) {
3504
+ collection[base].push(pattern);
3505
3505
  } else {
3506
- collection[base2] = [pattern];
3506
+ collection[base] = [pattern];
3507
3507
  }
3508
3508
  return collection;
3509
3509
  }, group);
3510
3510
  }
3511
3511
  exports2.groupPatternsByBaseDirectory = groupPatternsByBaseDirectory;
3512
3512
  function convertPatternGroupsToTasks(positive, negative, dynamic) {
3513
- return Object.keys(positive).map((base2) => {
3514
- return convertPatternGroupToTask(base2, positive[base2], negative, dynamic);
3513
+ return Object.keys(positive).map((base) => {
3514
+ return convertPatternGroupToTask(base, positive[base], negative, dynamic);
3515
3515
  });
3516
3516
  }
3517
3517
  exports2.convertPatternGroupsToTasks = convertPatternGroupsToTasks;
3518
- function convertPatternGroupToTask(base2, positive, negative, dynamic) {
3518
+ function convertPatternGroupToTask(base, positive, negative, dynamic) {
3519
3519
  return {
3520
3520
  dynamic,
3521
3521
  positive,
3522
3522
  negative,
3523
- base: base2,
3523
+ base,
3524
3524
  patterns: [].concat(positive, negative.map(utils.pattern.convertToNegativePattern))
3525
3525
  };
3526
3526
  }
@@ -4460,8 +4460,8 @@ var require_async3 = __commonJS({
4460
4460
  onEnd(callback) {
4461
4461
  this._emitter.once("end", callback);
4462
4462
  }
4463
- _pushToQueue(directory, base2) {
4464
- const queueItem = { directory, base: base2 };
4463
+ _pushToQueue(directory, base) {
4464
+ const queueItem = { directory, base };
4465
4465
  this._queue.push(queueItem, (error) => {
4466
4466
  if (error !== null) {
4467
4467
  this._handleError(error);
@@ -4488,19 +4488,19 @@ var require_async3 = __commonJS({
4488
4488
  this._isDestroyed = true;
4489
4489
  this._emitter.emit("error", error);
4490
4490
  }
4491
- _handleEntry(entry, base2) {
4491
+ _handleEntry(entry, base) {
4492
4492
  if (this._isDestroyed || this._isFatalError) {
4493
4493
  return;
4494
4494
  }
4495
4495
  const fullpath = entry.path;
4496
- if (base2 !== void 0) {
4497
- entry.path = common.joinPathSegments(base2, entry.name, this._settings.pathSegmentSeparator);
4496
+ if (base !== void 0) {
4497
+ entry.path = common.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator);
4498
4498
  }
4499
4499
  if (common.isAppliedFilter(this._settings.entryFilter, entry)) {
4500
4500
  this._emitEntry(entry);
4501
4501
  }
4502
4502
  if (entry.dirent.isDirectory() && common.isAppliedFilter(this._settings.deepFilter, entry)) {
4503
- this._pushToQueue(fullpath, base2 === void 0 ? void 0 : entry.path);
4503
+ this._pushToQueue(fullpath, base === void 0 ? void 0 : entry.path);
4504
4504
  }
4505
4505
  }
4506
4506
  _emitEntry(entry) {
@@ -4608,19 +4608,19 @@ var require_sync3 = __commonJS({
4608
4608
  this._handleQueue();
4609
4609
  return this._storage;
4610
4610
  }
4611
- _pushToQueue(directory, base2) {
4612
- this._queue.add({ directory, base: base2 });
4611
+ _pushToQueue(directory, base) {
4612
+ this._queue.add({ directory, base });
4613
4613
  }
4614
4614
  _handleQueue() {
4615
4615
  for (const item of this._queue.values()) {
4616
4616
  this._handleDirectory(item.directory, item.base);
4617
4617
  }
4618
4618
  }
4619
- _handleDirectory(directory, base2) {
4619
+ _handleDirectory(directory, base) {
4620
4620
  try {
4621
4621
  const entries = this._scandir(directory, this._settings.fsScandirSettings);
4622
4622
  for (const entry of entries) {
4623
- this._handleEntry(entry, base2);
4623
+ this._handleEntry(entry, base);
4624
4624
  }
4625
4625
  } catch (error) {
4626
4626
  this._handleError(error);
@@ -4632,16 +4632,16 @@ var require_sync3 = __commonJS({
4632
4632
  }
4633
4633
  throw error;
4634
4634
  }
4635
- _handleEntry(entry, base2) {
4635
+ _handleEntry(entry, base) {
4636
4636
  const fullpath = entry.path;
4637
- if (base2 !== void 0) {
4638
- entry.path = common.joinPathSegments(base2, entry.name, this._settings.pathSegmentSeparator);
4637
+ if (base !== void 0) {
4638
+ entry.path = common.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator);
4639
4639
  }
4640
4640
  if (common.isAppliedFilter(this._settings.entryFilter, entry)) {
4641
4641
  this._pushToStorage(entry);
4642
4642
  }
4643
4643
  if (entry.dirent.isDirectory() && common.isAppliedFilter(this._settings.deepFilter, entry)) {
4644
- this._pushToQueue(fullpath, base2 === void 0 ? void 0 : entry.path);
4644
+ this._pushToQueue(fullpath, base === void 0 ? void 0 : entry.path);
4645
4645
  }
4646
4646
  }
4647
4647
  _pushToStorage(entry) {
@@ -5538,14 +5538,14 @@ var import_unplugin2 = require("unplugin");
5538
5538
 
5539
5539
  // src/index.ts
5540
5540
  var import_node_fs3 = require("fs");
5541
- var import_node_process4 = __toESM(require("process"), 1);
5541
+ var import_node_process5 = __toESM(require("process"), 1);
5542
5542
  var import_unplugin = require("unplugin");
5543
5543
 
5544
5544
  // src/core/compress.ts
5545
5545
  var import_node_fs = __toESM(require("fs"), 1);
5546
5546
  var import_node_path = __toESM(require("path"), 1);
5547
5547
  var import_node_process2 = __toESM(require("process"), 1);
5548
- var import_archiver = __toESM(require("archiver"), 1);
5548
+ var import_zip_lib = require("zip-lib");
5549
5549
 
5550
5550
  // node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/vendor/ansi-styles/index.js
5551
5551
  var ANSI_BACKGROUND_OFFSET = 10;
@@ -6057,48 +6057,45 @@ var Log = class {
6057
6057
  };
6058
6058
 
6059
6059
  // src/core/compress.ts
6060
- async function createCompress(options, outDir2) {
6061
- const { ignoreBase } = options;
6062
- const zipFilePath = import_node_path.default.resolve(import_node_process2.default.cwd(), `${import_node_path.default.basename(outDir2)}.zip`);
6063
- Log.log("Compressing the directory", outDir2);
6064
- return new Promise((resolve, reject) => {
6065
- try {
6066
- const output = import_node_fs.default.createWriteStream(zipFilePath);
6067
- const archive = (0, import_archiver.default)("zip");
6068
- output.on("close", () => {
6069
- const size = archive.pointer();
6070
- const sizeInMB = size > 1024 * 1024 ? `${(size / 1024 / 1024).toFixed(1)} MB` : `${(size / 1024).toFixed(1)} KB`;
6071
- Log.success("Successfully compressed to", `${zipFilePath} (${sizeInMB})`);
6072
- resolve(null);
6073
- });
6074
- archive.on("warning", (err) => {
6075
- if (err.code === "ENOENT")
6076
- Log.log("File not found during compression:", err.message);
6077
- else
6078
- Log.log("Compression warning:", err.message);
6079
- });
6080
- archive.on("error", (err) => {
6081
- Log.error("Compression error:", err);
6082
- reject(err);
6083
- });
6084
- archive.pipe(output);
6085
- const absoluteOutDir = import_node_path.default.resolve(outDir2);
6086
- archive.directory(absoluteOutDir, ignoreBase ? false : import_node_path.default.basename(outDir2));
6087
- archive.finalize();
6088
- } catch (error) {
6089
- Log.error("Error compressing the directory", error);
6090
- throw error;
6091
- }
6092
- });
6060
+ async function createCompress(options, outDir) {
6061
+ const { includeBaseDir } = options;
6062
+ const zipFilePath = import_node_path.default.resolve(import_node_process2.default.cwd(), `${import_node_path.default.basename(outDir)}.zip`);
6063
+ const absoluteOutDir = import_node_path.default.resolve(outDir);
6064
+ Log.log("Compressing directory:", absoluteOutDir);
6065
+ try {
6066
+ const zip = new import_zip_lib.Zip();
6067
+ if (!includeBaseDir) {
6068
+ zip.addFolder(absoluteOutDir);
6069
+ } else {
6070
+ zip.addFolder(absoluteOutDir, import_node_path.default.basename(outDir));
6071
+ }
6072
+ await zip.archive(zipFilePath);
6073
+ const stat = import_node_fs.default.statSync(zipFilePath);
6074
+ const size = stat.size;
6075
+ const readableSize = size > 1024 * 1024 ? `${(size / 1024 / 1024).toFixed(1)} MB` : `${(size / 1024).toFixed(1)} KB`;
6076
+ Log.success(
6077
+ "Successfully compressed to:",
6078
+ `${zipFilePath} (${readableSize})`
6079
+ );
6080
+ return null;
6081
+ } catch (error) {
6082
+ Log.error("Compression error:", error);
6083
+ throw error;
6084
+ }
6093
6085
  }
6094
6086
 
6087
+ // src/core/options.ts
6088
+ var import_node_process4 = __toESM(require("process"), 1);
6089
+ var import_utils = require("@antfu/utils");
6090
+
6095
6091
  // src/core/generate.ts
6092
+ var import_node_child_process = require("child_process");
6096
6093
  var import_node_fs2 = require("fs");
6097
6094
  var import_node_path2 = __toESM(require("path"), 1);
6098
6095
  var import_node_process3 = __toESM(require("process"), 1);
6099
6096
  var import_fast_glob = __toESM(require_out4(), 1);
6100
- var import_local_pkg = require("local-pkg");
6101
- var import_recast = __toESM(require("recast"), 1);
6097
+ var recast = __toESM(require("recast"), 1);
6098
+ var import_typescript = __toESM(require("recast/parsers/typescript"), 1);
6102
6099
  function mergeObjects(prodObj, devObj) {
6103
6100
  const prodProps = new Map(prodObj.properties.map((p) => [p.key.name || p.key.value, p]));
6104
6101
  for (const prop of devObj.properties) {
@@ -6112,90 +6109,264 @@ function mergeObjects(prodObj, devObj) {
6112
6109
  }
6113
6110
  }
6114
6111
  }
6115
- async function generateScript(options, mode, base2) {
6116
- const { dir, fileName, globalName, serve, build } = options.env;
6117
- const folder = await findFolder(import_node_process3.default.cwd(), dir);
6118
- const files = await (0, import_fast_glob.default)("*.+(js|ts)", {
6112
+ async function generateScript(options, context) {
6113
+ const { configDir, emitFileName, emitDir, globalName, devMatch, buildMatch } = options.env;
6114
+ const folder = await resolveConfigFolder(import_node_process3.default.cwd(), configDir);
6115
+ if (!folder)
6116
+ throw new Error(`[unplugin-env] Config directory "${configDir}" not found from ${import_node_process3.default.cwd()}`);
6117
+ const files = await (0, import_fast_glob.default)("*.{js,ts}", {
6119
6118
  absolute: true,
6120
6119
  cwd: folder
6121
6120
  });
6122
- const testReg = mode === "serve" ? serve : build;
6121
+ if (!files.length)
6122
+ throw new Error(`[unplugin-env] No config files found in ${folder}`);
6123
+ const { mode, base } = context;
6124
+ const testReg = mode === "dev" ? devMatch : buildMatch;
6123
6125
  let target = "";
6124
6126
  let source = "";
6125
6127
  let code = "";
6126
- const name = fileName;
6128
+ let targetFile = "";
6129
+ let sourceFile = "";
6130
+ const resolvedEmitFileName = resolveEmitFileName(emitDir, emitFileName);
6127
6131
  for (const file of files) {
6128
6132
  try {
6129
6133
  const mod = await import_node_fs2.promises.readFile(file, "utf-8");
6130
- if (testReg?.test(file))
6134
+ if (testReg?.test(file)) {
6131
6135
  target = mod;
6132
- else
6136
+ targetFile = file;
6137
+ } else {
6133
6138
  source = mod;
6139
+ sourceFile = file;
6140
+ }
6134
6141
  } catch (error) {
6135
6142
  console.error(`Error loading file ${file}:`, error);
6136
6143
  }
6137
6144
  }
6138
- const targetAst = import_recast.default.parse(target);
6139
- const sourceAst = import_recast.default.parse(source);
6140
- const targetExport = targetAst.program.body.find((n) => n.type === "ExportDefaultDeclaration").declaration;
6141
- const sourceExport = sourceAst.program.body.find((n) => n.type === "ExportDefaultDeclaration").declaration;
6145
+ if (files.length === 1) {
6146
+ if (!target) {
6147
+ target = source;
6148
+ targetFile = sourceFile;
6149
+ }
6150
+ if (!source) {
6151
+ source = target;
6152
+ sourceFile = targetFile;
6153
+ }
6154
+ }
6155
+ if (!target || !targetFile)
6156
+ throw new Error(`[unplugin-env] No file matched "${testReg}" in ${folder}`);
6157
+ if (!source || !sourceFile)
6158
+ throw new Error(`[unplugin-env] No base config file found in ${folder}`);
6159
+ const targetAst = parseConfig(target, targetFile);
6160
+ const sourceAst = parseConfig(source, sourceFile);
6161
+ const targetExport = getDefaultExportObject(targetAst, targetFile);
6162
+ const sourceExport = getDefaultExportObject(sourceAst, sourceFile);
6142
6163
  mergeObjects(sourceExport, targetExport);
6143
- const mergedCode = import_recast.default.print(sourceExport).code;
6164
+ const mergedCode = recast.print(sourceExport).code;
6144
6165
  const returnedTarget = mergedCode;
6145
6166
  const versionInfo = await generateVersion(options, mode);
6146
6167
  code = `window.${globalName}=${returnedTarget};
6147
6168
  ${versionInfo}`;
6148
6169
  const formatCode = code;
6170
+ const viteIgnoreAttr = context.framework === "vite" ? " vite-ignore" : "";
6171
+ const scriptSrc = joinBasePath(base, resolvedEmitFileName);
6149
6172
  return {
6150
6173
  code,
6151
- script: ` <script type="text/javascript" src="${base2}${fileName}"></script>
6174
+ script: ` <script type="text/javascript"${viteIgnoreAttr} src="${scriptSrc}"></script>
6152
6175
  </head>`,
6153
6176
  emit: {
6154
6177
  type: "asset",
6155
- fileName: name,
6178
+ fileName: resolvedEmitFileName,
6156
6179
  source: formatCode
6157
6180
  },
6158
6181
  watchFiles: files
6159
6182
  };
6160
6183
  }
6184
+ async function getFullPackageJson(cwd = import_node_process3.default.cwd()) {
6185
+ const pkgPath = import_node_path2.default.resolve(cwd, "package.json");
6186
+ const content = await import_node_fs2.promises.readFile(pkgPath, "utf-8");
6187
+ return JSON.parse(content);
6188
+ }
6189
+ function wrapText(text, maxLen) {
6190
+ const lines = [];
6191
+ let current = "";
6192
+ for (const char of text) {
6193
+ current += char;
6194
+ if (current.length >= maxLen) {
6195
+ lines.push(current);
6196
+ current = "";
6197
+ }
6198
+ }
6199
+ if (current)
6200
+ lines.push(current);
6201
+ return lines;
6202
+ }
6203
+ function parseConfig(code, filePath) {
6204
+ const parser = filePath.endsWith(".ts") ? import_typescript.default : void 0;
6205
+ return parser ? recast.parse(code, { parser }) : recast.parse(code);
6206
+ }
6207
+ function getDefaultExportObject(ast, filePath) {
6208
+ const exportNode = ast?.program?.body?.find((node) => node.type === "ExportDefaultDeclaration");
6209
+ if (!exportNode?.declaration)
6210
+ throw new Error(`[unplugin-env] ${filePath} must have a default export of an object`);
6211
+ let decl = exportNode.declaration;
6212
+ if (decl.type === "TSAsExpression" || decl.type === "TSTypeAssertion")
6213
+ decl = decl.expression;
6214
+ if (decl.type === "CallExpression" && decl.arguments?.[0]?.type === "ObjectExpression")
6215
+ decl = decl.arguments[0];
6216
+ if (decl.type !== "ObjectExpression")
6217
+ throw new Error(`[unplugin-env] ${filePath} default export must be an object literal`);
6218
+ return decl;
6219
+ }
6220
+ function joinBasePath(base, resourcePath) {
6221
+ const safeBase = base && base.endsWith("/") ? base : `${base || "/"}`.replace(/\/?$/, "/");
6222
+ const safeFile = resourcePath.replace(/^\/+/, "");
6223
+ return `${safeBase}${safeFile}`;
6224
+ }
6225
+ function resolveEmitFileName(emitDir, emitFileName) {
6226
+ const normalizedFile = emitFileName.replace(/\\/g, "/").replace(/^\/+/, "");
6227
+ if (!emitDir)
6228
+ return normalizedFile;
6229
+ const normalizedDir = emitDir.replace(/\\/g, "/").replace(/^\/+|\/+$/g, "");
6230
+ if (!normalizedDir)
6231
+ return normalizedFile;
6232
+ const prefix = `${normalizedDir}/`;
6233
+ if (normalizedFile === normalizedDir || normalizedFile.startsWith(prefix))
6234
+ return normalizedFile;
6235
+ return import_node_path2.default.posix.join(normalizedDir, normalizedFile);
6236
+ }
6237
+ async function resolveConfigFolder(root, configDir) {
6238
+ if (!configDir)
6239
+ return "";
6240
+ const candidate = import_node_path2.default.isAbsolute(configDir) ? configDir : import_node_path2.default.resolve(root, configDir);
6241
+ try {
6242
+ const stat = await import_node_fs2.promises.stat(candidate);
6243
+ if (stat.isDirectory())
6244
+ return candidate;
6245
+ } catch {
6246
+ }
6247
+ return findFolder(root, configDir);
6248
+ }
6161
6249
  async function generateVersion(options, mode) {
6162
- const pkg = await (0, import_local_pkg.getPackageInfo)(import_node_process3.default.cwd());
6163
- return `console.info("Version: %c${pkg?.version}%c - ${mode === "serve" ? "runtime" : "built"} on %c${options.datetime}%c", "color: green;", '', "color: blue;", '')`;
6250
+ const pkg = await getFullPackageJson(import_node_process3.default.cwd());
6251
+ const name = pkg?.name ?? "Unknown App";
6252
+ const version = `v${pkg?.version ?? "0.0.0"}`;
6253
+ const branchName = getBranchName() || "unknown";
6254
+ const commitHash = getCommitHash() || "unknown";
6255
+ const datetime = options.datetime;
6256
+ const stateLabel = mode === "dev" ? "runtime" : "built";
6257
+ const stateColor = mode === "dev" ? "#059669" : "#2563EB";
6258
+ const MAX_DESC_LINE_LEN = 36;
6259
+ const rawDesc = pkg?.description ?? "unknown";
6260
+ const descLines = wrapText(rawDesc, MAX_DESC_LINE_LEN);
6261
+ const baseLines = [
6262
+ `${name} ${version} ${stateLabel}`,
6263
+ `Branch : ${branchName}`,
6264
+ `Commit : ${commitHash}`,
6265
+ `Time : ${datetime}`,
6266
+ `Desc : ${descLines[0]}`,
6267
+ ...descLines.slice(1).map((l) => ` ${l}`)
6268
+ ];
6269
+ const maxLen = Math.max(...baseLines.map((l) => l.length));
6270
+ const divider = "-".repeat(maxLen + 4);
6271
+ const textParts = [
6272
+ `${divider}
6273
+ `,
6274
+ ` ${name} `,
6275
+ ` ${version} `,
6276
+ ` ${stateLabel}
6277
+ `,
6278
+ `${divider}
6279
+ `,
6280
+ ` Branch :`,
6281
+ ` ${branchName}
6282
+ `,
6283
+ ` Commit :`,
6284
+ ` ${commitHash}
6285
+ `,
6286
+ ` Time :`,
6287
+ ` ${datetime}
6288
+ `,
6289
+ ` Desc :`,
6290
+ ` ${descLines[0]}
6291
+ `,
6292
+ ...descLines.slice(1).map((l) => ` ${l}
6293
+ `),
6294
+ `${divider}`
6295
+ ];
6296
+ const styles3 = [
6297
+ "color:#9CA3AF",
6298
+ // divider
6299
+ "color:#111827;font-weight:600",
6300
+ // name
6301
+ "color:#2563EB;font-weight:600",
6302
+ // version
6303
+ `color:${stateColor};font-weight:600`,
6304
+ // state
6305
+ "color:#9CA3AF",
6306
+ // divider
6307
+ "color:#6B7280",
6308
+ // Branch label
6309
+ "color:#111827",
6310
+ "color:#6B7280",
6311
+ // Commit label
6312
+ "color:#111827",
6313
+ "color:#6B7280",
6314
+ // Time label
6315
+ "color:#2563EB",
6316
+ "color:#6B7280",
6317
+ // Desc label
6318
+ "color:#4B5563",
6319
+ ...descLines.slice(1).map(() => "color:#4B5563"),
6320
+ "color:#9CA3AF"
6321
+ // divider
6322
+ ];
6323
+ return `
6324
+ console.log(
6325
+ ${JSON.stringify(`%c${textParts.join("%c")}`)},
6326
+ ${styles3.map((s) => JSON.stringify(s)).join(",\n ")}
6327
+ )
6328
+ `.trim();
6164
6329
  }
6165
6330
  async function findFolder(directoryPath, dir) {
6166
6331
  const ignore = /* @__PURE__ */ new Set(["dist", "node_modules", "playground", "example", "test", "jest", "tests", "locales", "public", ".git", ".github", ".vscode"]);
6167
- const files = await import_node_fs2.promises.readdir(directoryPath);
6168
- const filePaths = files.filter((item) => !ignore.has(item));
6332
+ const entries = await import_node_fs2.promises.readdir(directoryPath, { withFileTypes: true });
6333
+ const dirLower = dir.toLowerCase();
6334
+ const filePaths = entries.filter((entry) => !ignore.has(entry.name));
6169
6335
  let nestedFolder = "";
6170
- for (const file of filePaths) {
6171
- const fullFilePath = import_node_path2.default.join(directoryPath, file);
6172
- const stat = await import_node_fs2.promises.stat(fullFilePath);
6173
- if (stat.isDirectory()) {
6174
- if (file.toLowerCase() === dir) {
6175
- return fullFilePath;
6176
- } else {
6177
- nestedFolder = await findFolder(fullFilePath, dir);
6178
- if (nestedFolder)
6179
- return nestedFolder;
6180
- }
6181
- }
6336
+ for (const entry of filePaths) {
6337
+ if (!entry.isDirectory())
6338
+ continue;
6339
+ const fullFilePath = import_node_path2.default.join(directoryPath, entry.name);
6340
+ if (entry.name.toLowerCase() === dirLower)
6341
+ return fullFilePath;
6342
+ nestedFolder = await findFolder(fullFilePath, dir);
6343
+ if (nestedFolder)
6344
+ return nestedFolder;
6182
6345
  }
6183
6346
  return "";
6184
6347
  }
6348
+ function getBranchName() {
6349
+ const branchName = (0, import_node_child_process.execSync)("git rev-parse --abbrev-ref HEAD").toString().trim();
6350
+ return branchName;
6351
+ }
6352
+ function getCommitHash() {
6353
+ const commitHash = (0, import_node_child_process.execSync)("git rev-parse HEAD").toString().trim();
6354
+ return commitHash.slice(0, 8);
6355
+ }
6185
6356
 
6186
6357
  // src/core/options.ts
6187
- var import_utils = require("@antfu/utils");
6188
6358
  function resolveOptions(options) {
6189
6359
  const defaults = {
6190
6360
  env: {
6191
- dir: "config",
6192
- fileName: "manifest.js",
6361
+ configDir: "config",
6362
+ emitFileName: "manifest.js",
6363
+ emitDir: "",
6193
6364
  globalName: "manifest",
6194
- serve: /dev/i,
6195
- build: /prod/i
6365
+ devMatch: /dev/i,
6366
+ buildMatch: /prod/i
6196
6367
  },
6197
6368
  compress: {
6198
- ignoreBase: false
6369
+ includeBaseDir: true
6199
6370
  }
6200
6371
  };
6201
6372
  const mergeOptions = (0, import_utils.deepMerge)(defaults, options);
@@ -6208,67 +6379,273 @@ function resolveOptions(options) {
6208
6379
  datetime: formatter.format(/* @__PURE__ */ new Date())
6209
6380
  };
6210
6381
  }
6382
+ function createUnifiedContext(resolved) {
6383
+ const ctx = {
6384
+ framework: "",
6385
+ base: "/",
6386
+ outDir: "dist",
6387
+ mode: "build",
6388
+ scriptInfo: {
6389
+ code: "",
6390
+ script: "",
6391
+ emit: {
6392
+ type: "asset",
6393
+ source: "",
6394
+ fileName: ""
6395
+ },
6396
+ watchFiles: []
6397
+ },
6398
+ get isDev() {
6399
+ return this.mode === "dev";
6400
+ },
6401
+ get isBuild() {
6402
+ return this.mode === "build";
6403
+ },
6404
+ // --- VITE ---
6405
+ async setVite(config) {
6406
+ this.framework = "vite";
6407
+ this.base = config.base || "/";
6408
+ this.outDir = config.build?.outDir || "dist";
6409
+ this.mode = config.command === "serve" ? "dev" : "build";
6410
+ ctx.scriptInfo = await generateScript(resolved, ctx);
6411
+ },
6412
+ // --- ROLLUP ---
6413
+ async setRollup(options) {
6414
+ this.framework = "rollup";
6415
+ this.outDir = options.dir || "dist";
6416
+ this.mode = import_node_process4.default.env.ROLLUP_WATCH ? "dev" : "build";
6417
+ ctx.scriptInfo = await generateScript(resolved, ctx);
6418
+ },
6419
+ // --- WEBPACK ---
6420
+ async setWebpack(compiler) {
6421
+ this.framework = "webpack";
6422
+ this.base = compiler.options.output?.publicPath || "/";
6423
+ this.outDir = compiler.options.output?.path || "dist";
6424
+ const raw = compiler.options.mode || "production";
6425
+ this.mode = raw === "development" ? "dev" : "build";
6426
+ ctx.scriptInfo = await generateScript(resolved, ctx);
6427
+ },
6428
+ // --- RSPACK ---
6429
+ async setRspack(compiler) {
6430
+ this.framework = "rspack";
6431
+ this.base = compiler.options.output?.publicPath || "/";
6432
+ this.outDir = compiler.options.output?.path || "dist";
6433
+ const raw = compiler.options.mode || "production";
6434
+ this.mode = raw === "development" ? "dev" : "build";
6435
+ ctx.scriptInfo = await generateScript(resolved, ctx);
6436
+ },
6437
+ // --- ESBUILD ---
6438
+ async setEsbuild(build) {
6439
+ this.framework = "esbuild";
6440
+ this.outDir = build.initialOptions.outdir || "dist";
6441
+ this.mode = build.initialOptions.watch ? "dev" : "build";
6442
+ ctx.scriptInfo = await generateScript(resolved, ctx);
6443
+ },
6444
+ // --- FARM ---
6445
+ async setFarm(compiler) {
6446
+ this.framework = "farm";
6447
+ this.base = compiler.config.output?.publicPath || "/";
6448
+ this.outDir = compiler.config.output?.path || "dist";
6449
+ const raw = compiler.config.mode || "production";
6450
+ this.mode = raw === "development" ? "dev" : "build";
6451
+ ctx.scriptInfo = await generateScript(resolved, ctx);
6452
+ },
6453
+ // --- ROLLDOWN ---
6454
+ async setRolldown(options) {
6455
+ this.framework = "rolldown";
6456
+ this.outDir = options.dir || "dist";
6457
+ this.mode = import_node_process4.default.env.ROLLDOWN_WATCH ? "dev" : "build";
6458
+ ctx.scriptInfo = await generateScript(resolved, ctx);
6459
+ }
6460
+ };
6461
+ return ctx;
6462
+ }
6211
6463
 
6212
6464
  // src/index.ts
6213
6465
  var virtualEnvId = "virtual:env";
6466
+ var virtualEnvAliasId = "virtual-env";
6214
6467
  var resolvedVirtualEnvId = `\0${virtualEnvId}`;
6215
- var base = "";
6216
- var outDir = "";
6468
+ var resolvedVirtualEnvAliasId = `\0${virtualEnvAliasId}`;
6469
+ function isVirtualEnvId(id) {
6470
+ return id.startsWith(virtualEnvId) || id.startsWith(virtualEnvAliasId);
6471
+ }
6472
+ function resolveVirtualEnvId(id) {
6473
+ return id.startsWith(virtualEnvAliasId) ? resolvedVirtualEnvAliasId : resolvedVirtualEnvId;
6474
+ }
6475
+ function isResolvedVirtualEnvId(id) {
6476
+ return id.startsWith(resolvedVirtualEnvId) || id.startsWith(resolvedVirtualEnvAliasId);
6477
+ }
6217
6478
  var unpluginFactory = (options = {}) => {
6218
6479
  const resolved = resolveOptions(options);
6480
+ const ctx = createUnifiedContext(resolved);
6481
+ let frameworkReady = null;
6482
+ let legacyEmitHooked = false;
6219
6483
  return [{
6220
- name: "plugin-env-serve",
6221
- apply: "serve",
6484
+ name: "plugin-env",
6222
6485
  enforce: "post",
6223
- configResolved(config) {
6224
- outDir = config.build.outDir;
6225
- base = config.base;
6486
+ rollup: {
6487
+ async buildStart() {
6488
+ const outputOptions = { dir: ctx.outDir };
6489
+ await ctx.setRollup(outputOptions);
6490
+ },
6491
+ outputOptions(outputOptions) {
6492
+ ctx.outDir = outputOptions.dir || ctx.outDir;
6493
+ return outputOptions;
6494
+ }
6226
6495
  },
6227
- async resolveId(id) {
6228
- if (id.startsWith(virtualEnvId))
6229
- return resolvedVirtualEnvId;
6496
+ vite: {
6497
+ async configResolved(config) {
6498
+ await ctx.setVite(config);
6499
+ }
6230
6500
  },
6231
- async load(id) {
6232
- if (id.startsWith(resolvedVirtualEnvId)) {
6233
- const { code, watchFiles } = await generateScript(resolved, "serve", base);
6234
- watchFiles.forEach((file) => {
6235
- this.addWatchFile(file);
6236
- });
6237
- return code;
6501
+ async webpack(compiler) {
6502
+ frameworkReady = ctx.setWebpack(compiler);
6503
+ const webpackLib = compiler.webpack;
6504
+ const RawSource = webpackLib?.sources?.RawSource;
6505
+ compiler.hooks.thisCompilation.tap("plugin-env", (compilation) => {
6506
+ if (webpackLib?.Compilation?.PROCESS_ASSETS_STAGE_PRE_PROCESS) {
6507
+ const { Compilation, sources } = webpackLib;
6508
+ compilation.hooks.processAssets.tapPromise(
6509
+ { name: "plugin-env", stage: Compilation.PROCESS_ASSETS_STAGE_PRE_PROCESS },
6510
+ async () => {
6511
+ await frameworkReady;
6512
+ const manifestName = ctx.scriptInfo.emit.fileName;
6513
+ if (!manifestName)
6514
+ return;
6515
+ const asset = compilation.getAsset(manifestName);
6516
+ if (!asset || asset.info?.minimized)
6517
+ return;
6518
+ compilation.updateAsset(manifestName, asset.source, { ...asset.info, minimized: true });
6519
+ }
6520
+ );
6521
+ compilation.hooks.processAssets.tapPromise(
6522
+ { name: "plugin-env", stage: Compilation.PROCESS_ASSETS_STAGE_SUMMARIZE },
6523
+ async (assets) => {
6524
+ await frameworkReady;
6525
+ const { script } = ctx.scriptInfo;
6526
+ if (!script)
6527
+ return;
6528
+ const scriptTag = script.replace(/<\/head>\s*$/i, "").trim();
6529
+ for (const name of Object.keys(assets)) {
6530
+ if (!name.endsWith(".html"))
6531
+ continue;
6532
+ const asset = compilation.getAsset(name);
6533
+ const html = asset?.source.source().toString() || "";
6534
+ if (!html || html.includes(scriptTag))
6535
+ continue;
6536
+ const nextHtml = html.replace(/<\/head>/i, script);
6537
+ if (nextHtml !== html)
6538
+ compilation.updateAsset(name, new sources.RawSource(nextHtml));
6539
+ }
6540
+ }
6541
+ );
6542
+ } else if (!legacyEmitHooked) {
6543
+ legacyEmitHooked = true;
6544
+ compiler.hooks.emit.tapAsync("plugin-env", (comp, cb) => {
6545
+ const run = () => {
6546
+ const { script } = ctx.scriptInfo;
6547
+ if (!script)
6548
+ return cb();
6549
+ const scriptTag = script.replace(/<\/head>\s*$/i, "").trim();
6550
+ for (const name of Object.keys(comp.assets)) {
6551
+ if (!name.endsWith(".html"))
6552
+ continue;
6553
+ const asset = comp.assets[name];
6554
+ const html = asset?.source().toString() || "";
6555
+ if (!html || html.includes(scriptTag))
6556
+ continue;
6557
+ const nextHtml = html.replace(/<\/head>/i, script);
6558
+ if (nextHtml !== html) {
6559
+ comp.assets[name] = RawSource ? new RawSource(nextHtml) : {
6560
+ source: () => nextHtml,
6561
+ size: () => nextHtml.length
6562
+ };
6563
+ }
6564
+ }
6565
+ cb();
6566
+ };
6567
+ if (frameworkReady) {
6568
+ frameworkReady.then(run).catch((error) => cb(error));
6569
+ } else {
6570
+ run();
6571
+ }
6572
+ });
6573
+ }
6574
+ });
6575
+ },
6576
+ rspack: async (compiler) => {
6577
+ frameworkReady = ctx.setRspack(compiler);
6578
+ },
6579
+ esbuild: {
6580
+ async setup(build) {
6581
+ await ctx.setEsbuild(build);
6238
6582
  }
6239
- }
6240
- }, {
6241
- name: "unplugin-env-build",
6242
- apply: "build",
6243
- enforce: "post",
6244
- configResolved(config) {
6245
- base = config.base;
6246
- outDir = config.build.outDir;
6247
6583
  },
6248
- resolveId(id) {
6249
- if (id.startsWith(virtualEnvId))
6250
- return resolvedVirtualEnvId;
6584
+ async farm(compiler) {
6585
+ await ctx.setFarm(compiler);
6251
6586
  },
6252
- async load(id) {
6253
- const { emit, script } = await generateScript(resolved, "build", base);
6254
- if (id.startsWith(resolvedVirtualEnvId)) {
6255
- this.emitFile(emit);
6256
- return "";
6587
+ rolldown: {
6588
+ async outputOptions(outputOptions) {
6589
+ await ctx.setRolldown(outputOptions);
6257
6590
  }
6591
+ },
6592
+ async resolveId(id) {
6593
+ if (isVirtualEnvId(id))
6594
+ return resolveVirtualEnvId(id);
6595
+ },
6596
+ loadInclude(id) {
6597
+ if (isResolvedVirtualEnvId(id) || isVirtualEnvId(id))
6598
+ return true;
6258
6599
  if (id.endsWith(".html")) {
6259
- let code = await import_node_fs3.promises.readFile(id, "utf8");
6260
- code = code.replace(/<\/head>/g, script);
6261
- return {
6262
- code
6263
- };
6600
+ return ctx.framework === "vite" || ctx.framework === "rollup" || ctx.framework === "rolldown";
6264
6601
  }
6265
- return null;
6602
+ return false;
6603
+ },
6604
+ async load(id) {
6605
+ if (frameworkReady)
6606
+ await frameworkReady;
6607
+ const { code, watchFiles, emit, script } = ctx.scriptInfo;
6608
+ if (ctx.isDev) {
6609
+ if (isResolvedVirtualEnvId(id)) {
6610
+ watchFiles.forEach((file) => {
6611
+ this.addWatchFile(file);
6612
+ });
6613
+ return code;
6614
+ }
6615
+ } else {
6616
+ if (isResolvedVirtualEnvId(id)) {
6617
+ this.emitFile(emit);
6618
+ return "";
6619
+ }
6620
+ const canTransformHtml = ctx.framework === "vite" || ctx.framework === "rollup" || ctx.framework === "rolldown";
6621
+ if (canTransformHtml && id.endsWith(".html")) {
6622
+ let code2 = await import_node_fs3.promises.readFile(id, "utf-8");
6623
+ code2 = code2.replace(/<\/head>/g, script);
6624
+ return { code: code2 };
6625
+ }
6626
+ }
6627
+ },
6628
+ transformInclude(id) {
6629
+ return /\.(?:c|m)?(?:j|t)sx?$/.test(id);
6630
+ },
6631
+ async transform(code, id) {
6632
+ if (ctx.framework !== "webpack" && ctx.framework !== "rspack")
6633
+ return;
6634
+ if (!id.match(/\.(?:c|m)?(?:j|t)sx?$/))
6635
+ return;
6636
+ if (!code.includes(virtualEnvId))
6637
+ return;
6638
+ return code.replaceAll(virtualEnvId, virtualEnvAliasId);
6266
6639
  },
6267
6640
  buildEnd: () => {
6268
- import_node_process4.default.on("beforeExit", async () => {
6641
+ import_node_process5.default.on("beforeExit", () => {
6269
6642
  const { compress } = resolved;
6270
- await createCompress(compress, outDir);
6271
- import_node_process4.default.exit(0);
6643
+ createCompress(compress, ctx.outDir).then(() => {
6644
+ import_node_process5.default.exit(0);
6645
+ }).catch((error) => {
6646
+ import_node_process5.default.exitCode = 1;
6647
+ throw error;
6648
+ });
6272
6649
  });
6273
6650
  }
6274
6651
  }];