@nasti-toolchain/nasti 1.3.1 → 1.3.3

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/cli.js CHANGED
@@ -628,7 +628,6 @@ __export(middleware_exports, {
628
628
  });
629
629
  import path4 from "path";
630
630
  import fs4 from "fs";
631
- import { createRequire } from "module";
632
631
  function transformMiddleware(ctx) {
633
632
  ctx.envDefine = buildEnvDefine(
634
633
  loadEnv(ctx.config.mode, ctx.config.root, ctx.config.envPrefix),
@@ -704,6 +703,13 @@ async function transformRequest(url, ctx) {
704
703
  if (!filePath || !fs4.existsSync(filePath)) return null;
705
704
  const mod = await moduleGraph.ensureEntryFromUrl(url);
706
705
  moduleGraph.registerModule(mod, filePath);
706
+ const cleanReqUrl = url.split("?")[0];
707
+ if (cleanReqUrl.startsWith("/@modules/")) {
708
+ const code2 = await bundlePackageAsEsm(filePath);
709
+ const transformResult2 = { code: code2 };
710
+ mod.transformResult = transformResult2;
711
+ return transformResult2;
712
+ }
707
713
  let code = fs4.readFileSync(filePath, "utf-8");
708
714
  const pluginResult = await pluginContainer.transform(code, filePath);
709
715
  if (pluginResult) {
@@ -728,6 +734,67 @@ async function transformRequest(url, ctx) {
728
734
  mod.transformResult = transformResult;
729
735
  return transformResult;
730
736
  }
737
+ async function bundlePackageAsEsm(entryFile) {
738
+ if (!esmBundleCache.has(entryFile)) {
739
+ esmBundleCache.set(entryFile, doBundlePackage(entryFile));
740
+ }
741
+ return esmBundleCache.get(entryFile);
742
+ }
743
+ async function doBundlePackage(entryFile) {
744
+ const { rolldown: rolldown2 } = await import("rolldown");
745
+ const bundle = await rolldown2({
746
+ input: entryFile,
747
+ // 仅将其他 npm 包外部化;相对路径(包内部文件)全部内联打包
748
+ external: (id) => {
749
+ if (id.startsWith(".") || id.startsWith("/") || /^[A-Za-z]:\\/.test(id)) return false;
750
+ return true;
751
+ },
752
+ define: {
753
+ // CJS 包(如 react)通过 process.env.NODE_ENV 判断环境,需在打包时替换
754
+ "process.env.NODE_ENV": '"development"'
755
+ }
756
+ });
757
+ const result = await bundle.generate({ format: "esm", exports: "named" });
758
+ await bundle.close();
759
+ let code = result.output[0].code;
760
+ code = code.replace(/process\.env\.NODE_ENV/g, '"development"');
761
+ code = code.replace(
762
+ /^(import\b[^;'"]*?\bfrom\s+)(['"])([^'"./][^'"]*)(\2)/gm,
763
+ (_, prefix, q, spec) => `${prefix}${q}/@modules/${spec}${q}`
764
+ ).replace(
765
+ /^(export\b[^;'"]*?\bfrom\s+)(['"])([^'"./][^'"]*)(\2)/gm,
766
+ (_, prefix, q, spec) => `${prefix}${q}/@modules/${spec}${q}`
767
+ ).replace(
768
+ /^(import\s+)(['"])([^'"./][^'"]*)(\2)/gm,
769
+ (_, prefix, q, spec) => `${prefix}${q}/@modules/${spec}${q}`
770
+ );
771
+ if (code.includes("__commonJSMin")) {
772
+ code = await injectCjsNamedExports(code, entryFile);
773
+ }
774
+ return code;
775
+ }
776
+ async function injectCjsNamedExports(code, entryFile) {
777
+ try {
778
+ const { createRequire: createRequire2 } = await import("module");
779
+ const req = createRequire2(entryFile);
780
+ const cjsExports = req(entryFile);
781
+ if (!cjsExports || typeof cjsExports !== "object" || Array.isArray(cjsExports)) return code;
782
+ const namedKeys = Object.keys(cjsExports).filter(
783
+ (k) => k !== "__esModule" && k !== "default" && VALID_IDENT.test(k)
784
+ );
785
+ if (namedKeys.length === 0) return code;
786
+ return code.replace(
787
+ /^export default (\w+\(\));?\s*$/m,
788
+ (_, call) => [
789
+ `const __cjsMod = ${call};`,
790
+ `export default __cjsMod;`,
791
+ ...namedKeys.map((k) => `export const ${k} = __cjsMod[${JSON.stringify(k)}];`)
792
+ ].join("\n")
793
+ );
794
+ } catch {
795
+ return code;
796
+ }
797
+ }
731
798
  function rewriteImports(code, _config) {
732
799
  return code.replace(
733
800
  /\bfrom\s+(['"])([^'"./][^'"]*)\1/g,
@@ -748,16 +815,92 @@ function rewriteImports(code, _config) {
748
815
  }
749
816
  );
750
817
  }
818
+ function resolveNodeModule(root, moduleName) {
819
+ let pkgName;
820
+ let subpath;
821
+ if (moduleName.startsWith("@")) {
822
+ const parts = moduleName.split("/");
823
+ pkgName = parts.slice(0, 2).join("/");
824
+ subpath = parts.slice(2).join("/");
825
+ } else {
826
+ const slash = moduleName.indexOf("/");
827
+ pkgName = slash === -1 ? moduleName : moduleName.slice(0, slash);
828
+ subpath = slash === -1 ? "" : moduleName.slice(slash + 1);
829
+ }
830
+ let pkgDir = null;
831
+ let dir = root;
832
+ for (; ; ) {
833
+ const candidate = path4.join(dir, "node_modules", pkgName);
834
+ if (fs4.existsSync(candidate)) {
835
+ pkgDir = candidate;
836
+ break;
837
+ }
838
+ const parent = path4.dirname(dir);
839
+ if (parent === dir) break;
840
+ dir = parent;
841
+ }
842
+ if (!pkgDir) return null;
843
+ const pkgJsonPath = path4.join(pkgDir, "package.json");
844
+ if (!fs4.existsSync(pkgJsonPath)) return null;
845
+ let pkg;
846
+ try {
847
+ pkg = JSON.parse(fs4.readFileSync(pkgJsonPath, "utf-8"));
848
+ } catch {
849
+ return null;
850
+ }
851
+ if (pkg.exports) {
852
+ const exportKey = subpath ? `./${subpath}` : ".";
853
+ const resolved = resolvePackageExports(pkg.exports, exportKey, pkgDir);
854
+ if (resolved) return resolved;
855
+ }
856
+ if (subpath) {
857
+ const direct = path4.join(pkgDir, subpath);
858
+ if (fs4.existsSync(direct) && fs4.statSync(direct).isFile()) return direct;
859
+ for (const ext of RESOLVE_EXTENSIONS) {
860
+ if (fs4.existsSync(direct + ext)) return direct + ext;
861
+ }
862
+ return null;
863
+ }
864
+ for (const field of ["module", "jsnext:main", "jsnext", "main"]) {
865
+ if (typeof pkg[field] === "string") {
866
+ const entry = path4.join(pkgDir, pkg[field]);
867
+ if (fs4.existsSync(entry)) return entry;
868
+ }
869
+ }
870
+ return null;
871
+ }
872
+ function resolvePackageExports(exports, key, pkgDir) {
873
+ if (typeof exports === "string") {
874
+ return key === "." ? path4.join(pkgDir, exports) : null;
875
+ }
876
+ const entry = exports[key];
877
+ if (entry === void 0) return null;
878
+ return resolveExportValue(entry, pkgDir);
879
+ }
880
+ function resolveExportValue(value, pkgDir) {
881
+ if (typeof value === "string") return path4.join(pkgDir, value);
882
+ if (Array.isArray(value)) {
883
+ for (const item of value) {
884
+ const r = resolveExportValue(item, pkgDir);
885
+ if (r) return r;
886
+ }
887
+ return null;
888
+ }
889
+ if (value && typeof value === "object") {
890
+ for (const cond of ESM_CONDITIONS) {
891
+ if (cond in value) {
892
+ const r = resolveExportValue(value[cond], pkgDir);
893
+ if (r) return r;
894
+ }
895
+ }
896
+ }
897
+ return null;
898
+ }
751
899
  function resolveUrlToFile(url, root) {
752
900
  const cleanUrl = url.split("?")[0];
753
901
  if (cleanUrl.startsWith("/@modules/")) {
754
902
  const moduleName = cleanUrl.slice("/@modules/".length);
755
- try {
756
- const req = createRequire(path4.resolve(root, "package.json"));
757
- return req.resolve(moduleName);
758
- } catch {
759
- return null;
760
- }
903
+ return resolveNodeModule(root, moduleName);
761
904
  }
762
905
  const filePath = path4.resolve(root, cleanUrl.replace(/^\//, ""));
763
906
  if (fs4.existsSync(filePath) && fs4.statSync(filePath).isFile()) {
@@ -878,14 +1021,17 @@ if (!window.__nasti_hot_map) window.__nasti_hot_map = new Map();
878
1021
  window.__NASTI_HMR__ = { createHotContext };
879
1022
  `;
880
1023
  }
881
- var RESOLVE_EXTENSIONS;
1024
+ var esmBundleCache, VALID_IDENT, RESOLVE_EXTENSIONS, ESM_CONDITIONS;
882
1025
  var init_middleware = __esm({
883
1026
  "src/server/middleware.ts"() {
884
1027
  "use strict";
885
1028
  init_transformer();
886
1029
  init_html();
887
1030
  init_env();
1031
+ esmBundleCache = /* @__PURE__ */ new Map();
1032
+ VALID_IDENT = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;
888
1033
  RESOLVE_EXTENSIONS = [".tsx", ".ts", ".jsx", ".js", ".mjs", ".json", ".vue"];
1034
+ ESM_CONDITIONS = ["import", "browser", "module", "default"];
889
1035
  }
890
1036
  });
891
1037
 
@@ -948,10 +1094,10 @@ var init_hmr = __esm({
948
1094
  // src/plugins/resolve.ts
949
1095
  import path6 from "path";
950
1096
  import fs6 from "fs";
951
- import { createRequire as createRequire2 } from "module";
1097
+ import { createRequire } from "module";
952
1098
  function resolvePlugin(config) {
953
1099
  const { alias, extensions } = config.resolve;
954
- const require2 = createRequire2(path6.resolve(config.root, "package.json"));
1100
+ const require2 = createRequire(path6.resolve(config.root, "package.json"));
955
1101
  return {
956
1102
  name: "nasti:resolve",
957
1103
  enforce: "pre",
@@ -1226,7 +1372,7 @@ async function createServer(inlineConfig = {}) {
1226
1372
  const localUrl = `http://localhost:${actualPort}`;
1227
1373
  const networkUrl = host === "0.0.0.0" ? `http://${getNetworkAddress()}:${actualPort}` : null;
1228
1374
  console.log();
1229
- console.log(pc.cyan(" nasti dev server") + pc.dim(` v${"1.3.1"}`));
1375
+ console.log(pc.cyan(" nasti dev server") + pc.dim(` v${"1.3.3"}`));
1230
1376
  console.log();
1231
1377
  console.log(` ${pc.green(">")} Local: ${pc.cyan(localUrl)}`);
1232
1378
  if (networkUrl) {
@@ -1300,7 +1446,7 @@ import pc2 from "picocolors";
1300
1446
  async function build(inlineConfig = {}) {
1301
1447
  const config = await resolveConfig(inlineConfig, "build");
1302
1448
  const startTime = performance.now();
1303
- console.log(pc2.cyan("\n\u{1F528} nasti build") + pc2.dim(` v${"1.3.1"}`));
1449
+ console.log(pc2.cyan("\n\u{1F528} nasti build") + pc2.dim(` v${"1.3.3"}`));
1304
1450
  console.log(pc2.dim(` root: ${config.root}`));
1305
1451
  console.log(pc2.dim(` mode: ${config.mode}`));
1306
1452
  const outDir = path10.resolve(config.root, config.build.outDir);
@@ -1520,6 +1666,6 @@ cli.command("preview [root]", "Preview production build").option("--port <port>"
1520
1666
  }
1521
1667
  });
1522
1668
  cli.help();
1523
- cli.version("1.3.1");
1669
+ cli.version("1.3.3");
1524
1670
  cli.parse();
1525
1671
  //# sourceMappingURL=cli.js.map