@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.cjs +160 -14
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +159 -13
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +156 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +156 -10
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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
|
-
|
|
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
|
|
1097
|
+
import { createRequire } from "module";
|
|
952
1098
|
function resolvePlugin(config) {
|
|
953
1099
|
const { alias, extensions } = config.resolve;
|
|
954
|
-
const require2 =
|
|
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.
|
|
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.
|
|
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.
|
|
1669
|
+
cli.version("1.3.3");
|
|
1524
1670
|
cli.parse();
|
|
1525
1671
|
//# sourceMappingURL=cli.js.map
|