@modern-js/utils 2.26.0 → 2.27.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/CHANGELOG.md +12 -0
- package/dist/cjs/universal/formatWebpack.js +0 -4
- package/dist/esm/cli/alias.js +26 -22
- package/dist/esm/cli/applyOptionsChain.js +8 -6
- package/dist/esm/cli/babel.js +50 -35
- package/dist/esm/cli/commands.js +7 -7
- package/dist/esm/cli/common.js +10 -5
- package/dist/esm/cli/constants/chainId.js +1 -1
- package/dist/esm/cli/constants/index.js +33 -37
- package/dist/esm/cli/ensure.js +4 -2
- package/dist/esm/cli/fs.js +56 -9
- package/dist/esm/cli/get/config.js +7 -7
- package/dist/esm/cli/get/data.js +93 -55
- package/dist/esm/cli/get/index.js +21 -6
- package/dist/esm/cli/is/config.js +33 -14
- package/dist/esm/cli/is/env.js +18 -6
- package/dist/esm/cli/is/platform.js +6 -2
- package/dist/esm/cli/is/project.js +73 -36
- package/dist/esm/cli/is/type.js +3 -1
- package/dist/esm/cli/logger.js +49 -38
- package/dist/esm/cli/monorepo.js +49 -36
- package/dist/esm/cli/package.js +156 -38
- package/dist/esm/cli/path.js +44 -20
- package/dist/esm/cli/pathSerializer.js +29 -15
- package/dist/esm/cli/port.js +89 -40
- package/dist/esm/cli/prettyInstructions.js +42 -31
- package/dist/esm/cli/require.js +21 -16
- package/dist/esm/cli/runtimeExports.js +21 -15
- package/dist/esm/cli/watch.js +94 -27
- package/dist/esm/compiled.js +3 -3
- package/dist/esm/import.js +4 -4
- package/dist/esm/runtime/nestedRoutes.js +42 -29
- package/dist/esm/runtime-browser/parsed.js +5 -5
- package/dist/esm/runtime-node/index.js +1 -1
- package/dist/esm/runtime-node/nestedRoutes.js +6 -4
- package/dist/esm/runtime-node/serialize.js +1 -1
- package/dist/esm/runtime-node/storage.js +12 -14
- package/dist/esm/universal/constants.js +3 -3
- package/dist/esm/universal/formatWebpack.js +20 -26
- package/dist/esm/universal/pluginDagSort.js +49 -26
- package/dist/esm-node/cli/alias.js +51 -0
- package/dist/esm-node/cli/applyOptionsChain.js +24 -0
- package/dist/esm-node/cli/babel.js +103 -0
- package/dist/esm-node/cli/commands.js +16 -0
- package/dist/esm-node/cli/common.js +10 -0
- package/dist/esm-node/cli/constants/chainId.js +180 -0
- package/dist/esm-node/cli/constants/index.js +103 -0
- package/dist/esm-node/cli/ensure.js +10 -0
- package/dist/esm-node/cli/fs.js +14 -0
- package/dist/esm-node/cli/get/config.js +16 -0
- package/dist/esm-node/cli/get/data.js +86 -0
- package/dist/esm-node/cli/get/index.js +13 -0
- package/dist/esm-node/cli/index.js +20 -0
- package/dist/esm-node/cli/is/config.js +40 -0
- package/dist/esm-node/cli/is/env.js +6 -0
- package/dist/esm-node/cli/is/index.js +5 -0
- package/dist/esm-node/cli/is/platform.js +2 -0
- package/dist/esm-node/cli/is/project.js +73 -0
- package/dist/esm-node/cli/is/type.js +25 -0
- package/dist/esm-node/cli/logger.js +103 -0
- package/dist/esm-node/cli/monorepo.js +70 -0
- package/dist/esm-node/cli/package.js +43 -0
- package/dist/esm-node/cli/path.js +49 -0
- package/dist/esm-node/cli/pathSerializer.js +46 -0
- package/dist/esm-node/cli/port.js +44 -0
- package/dist/esm-node/cli/prettyInstructions.js +77 -0
- package/dist/esm-node/cli/require.js +52 -0
- package/dist/esm-node/cli/runtimeExports.js +35 -0
- package/dist/esm-node/cli/watch.js +41 -0
- package/dist/esm-node/compiled.js +33 -0
- package/dist/esm-node/import.js +8 -0
- package/dist/esm-node/index.js +3 -0
- package/dist/esm-node/runtime/nestedRoutes.js +112 -0
- package/dist/esm-node/runtime/remixRouter.js +1 -0
- package/dist/esm-node/runtime/router.js +1 -0
- package/dist/esm-node/runtime-browser/index.js +1 -0
- package/dist/esm-node/runtime-browser/parsed.js +17 -0
- package/dist/esm-node/runtime-node/index.js +5 -0
- package/dist/esm-node/runtime-node/nestedRoutes.js +18 -0
- package/dist/esm-node/runtime-node/router.js +1 -0
- package/dist/esm-node/runtime-node/serialize.js +6 -0
- package/dist/esm-node/runtime-node/storage.js +38 -0
- package/dist/esm-node/universal/constants.js +3 -0
- package/dist/esm-node/universal/formatWebpack.js +61 -0
- package/dist/esm-node/universal/pluginDagSort.js +50 -0
- package/package.json +4 -4
@@ -0,0 +1,77 @@
|
|
1
|
+
import os from "os";
|
2
|
+
import { chalk } from "../compiled";
|
3
|
+
import { isDev, isSingleEntry } from "./is";
|
4
|
+
import { DEFAULT_DEV_HOST } from "./constants";
|
5
|
+
const normalizeUrl = (url) => url.replace(/([^:]\/)\/+/g, "$1");
|
6
|
+
const getIpv4Interfaces = () => {
|
7
|
+
const interfaces = os.networkInterfaces();
|
8
|
+
const ipv4Interfaces = [];
|
9
|
+
Object.keys(interfaces).forEach((key) => {
|
10
|
+
interfaces[key].forEach((detail) => {
|
11
|
+
const familyV4Value = typeof detail.family === "string" ? "IPv4" : 4;
|
12
|
+
if (detail.family === familyV4Value) {
|
13
|
+
ipv4Interfaces.push(detail);
|
14
|
+
}
|
15
|
+
});
|
16
|
+
});
|
17
|
+
return ipv4Interfaces;
|
18
|
+
};
|
19
|
+
export const getAddressUrls = (protocol = "http", port, host) => {
|
20
|
+
const LOCAL_LABEL = "Local: ";
|
21
|
+
const NETWORK_LABEL = "Network: ";
|
22
|
+
const isLocalhost = (url) => {
|
23
|
+
return url === null || url === void 0 ? void 0 : url.includes("localhost");
|
24
|
+
};
|
25
|
+
if (host && host !== DEFAULT_DEV_HOST) {
|
26
|
+
return [
|
27
|
+
{
|
28
|
+
label: isLocalhost(host) ? LOCAL_LABEL : NETWORK_LABEL,
|
29
|
+
url: `${protocol}://${host}:${port}`
|
30
|
+
}
|
31
|
+
];
|
32
|
+
}
|
33
|
+
const ipv4Interfaces = getIpv4Interfaces();
|
34
|
+
return ipv4Interfaces.reduce((memo, detail) => {
|
35
|
+
if (isLocalhost(detail.address) || detail.internal) {
|
36
|
+
memo.push({
|
37
|
+
label: LOCAL_LABEL,
|
38
|
+
url: `${protocol}://localhost:${port}`
|
39
|
+
});
|
40
|
+
} else {
|
41
|
+
memo.push({
|
42
|
+
label: NETWORK_LABEL,
|
43
|
+
url: `${protocol}://${detail.address}:${port}`
|
44
|
+
});
|
45
|
+
}
|
46
|
+
return memo;
|
47
|
+
}, []);
|
48
|
+
};
|
49
|
+
export const prettyInstructions = (appContext, config) => {
|
50
|
+
var _appContext_builder_context_devServer, _appContext_builder, _config_dev;
|
51
|
+
const { entrypoints, serverRoutes, port, apiOnly, checkedEntries } = appContext;
|
52
|
+
const isHttps = isDev() && ((_appContext_builder_context_devServer = (_appContext_builder = appContext.builder) === null || _appContext_builder === void 0 ? void 0 : _appContext_builder.context.devServer) === null || _appContext_builder_context_devServer === void 0 ? void 0 : _appContext_builder_context_devServer.https);
|
53
|
+
const urls = getAddressUrls(isHttps ? "https" : "http", port, (_config_dev = config.dev) === null || _config_dev === void 0 ? void 0 : _config_dev.host);
|
54
|
+
const routes = !apiOnly ? serverRoutes.filter((route) => route.entryName) : serverRoutes;
|
55
|
+
let message = "App running at:\n\n";
|
56
|
+
if (isSingleEntry(entrypoints) || apiOnly) {
|
57
|
+
message += urls.map(({ label, url }) => ` ${chalk.bold(`> ${label.padEnd(10)}`)}${chalk.cyanBright(normalizeUrl(`${url}/${routes[0].urlPath}`))}
|
58
|
+
`).join("");
|
59
|
+
} else {
|
60
|
+
const maxNameLength = Math.max(...routes.map((r) => r.entryName.length));
|
61
|
+
urls.forEach(({ label, url }) => {
|
62
|
+
message += ` ${chalk.bold(`> ${label}`)}
|
63
|
+
`;
|
64
|
+
routes.forEach(({ entryName, urlPath, isSSR }) => {
|
65
|
+
if (!checkedEntries.includes(entryName)) {
|
66
|
+
return;
|
67
|
+
}
|
68
|
+
message += ` ${chalk.yellowBright(isSSR ? "λ" : "○")} ${chalk.yellowBright(entryName.padEnd(maxNameLength + 8))}${chalk.cyanBright(normalizeUrl(`${url}/${urlPath}`))}
|
69
|
+
`;
|
70
|
+
});
|
71
|
+
});
|
72
|
+
message += "\n";
|
73
|
+
message += chalk.cyanBright(" λ (Server) server-side renders at runtime\n");
|
74
|
+
message += chalk.cyanBright(" ○ (Static) client-side renders as static HTML\n");
|
75
|
+
}
|
76
|
+
return message;
|
77
|
+
};
|
@@ -0,0 +1,52 @@
|
|
1
|
+
import { findExists } from "./fs";
|
2
|
+
export const compatRequire = (filePath, interop = true) => {
|
3
|
+
const mod = require(filePath);
|
4
|
+
const rtnESMDefault = interop && (mod === null || mod === void 0 ? void 0 : mod.__esModule);
|
5
|
+
return rtnESMDefault ? mod.default : mod;
|
6
|
+
};
|
7
|
+
export const dynamicImport = new Function("modulePath", "return import(modulePath)");
|
8
|
+
export const requireExistModule = (filename, opt) => {
|
9
|
+
const final = {
|
10
|
+
extensions: [
|
11
|
+
".ts",
|
12
|
+
".js"
|
13
|
+
],
|
14
|
+
interop: true,
|
15
|
+
...opt
|
16
|
+
};
|
17
|
+
const exist = findExists(final.extensions.map((ext) => `${filename}${ext}`));
|
18
|
+
if (!exist) {
|
19
|
+
return null;
|
20
|
+
}
|
21
|
+
return compatRequire(exist, final.interop);
|
22
|
+
};
|
23
|
+
export const cleanRequireCache = (filelist) => {
|
24
|
+
filelist.forEach((filepath) => {
|
25
|
+
delete require.cache[filepath];
|
26
|
+
});
|
27
|
+
};
|
28
|
+
export function deleteRequireCache(path) {
|
29
|
+
if (require.cache[path]) {
|
30
|
+
delete require.cache[path];
|
31
|
+
}
|
32
|
+
if (module.children) {
|
33
|
+
module.children = module.children.filter((item) => item.filename !== path);
|
34
|
+
}
|
35
|
+
}
|
36
|
+
export const tryResolve = (name, resolvePath) => {
|
37
|
+
let filePath = "";
|
38
|
+
try {
|
39
|
+
filePath = require.resolve(name, {
|
40
|
+
paths: [
|
41
|
+
resolvePath
|
42
|
+
]
|
43
|
+
});
|
44
|
+
delete require.cache[filePath];
|
45
|
+
} catch (err) {
|
46
|
+
if (err.code === "MODULE_NOT_FOUND") {
|
47
|
+
throw new Error(`Can not find module ${name}.`);
|
48
|
+
}
|
49
|
+
throw err;
|
50
|
+
}
|
51
|
+
return filePath;
|
52
|
+
};
|
@@ -0,0 +1,35 @@
|
|
1
|
+
import path from "path";
|
2
|
+
import { fs } from "../compiled";
|
3
|
+
import { normalizeOutputPath } from "./path";
|
4
|
+
const memo = (fn) => {
|
5
|
+
const cache = /* @__PURE__ */ new Map();
|
6
|
+
return (...params) => {
|
7
|
+
const stringifiedParams = JSON.stringify(params);
|
8
|
+
const cachedResult = cache.get(stringifiedParams);
|
9
|
+
if (cachedResult) {
|
10
|
+
return cachedResult;
|
11
|
+
}
|
12
|
+
const res = fn(...params);
|
13
|
+
cache.set(stringifiedParams, res);
|
14
|
+
return res;
|
15
|
+
};
|
16
|
+
};
|
17
|
+
export const createRuntimeExportsUtils = memo((pwd = "", namespace = "index") => {
|
18
|
+
const entryExportFile = path.join(pwd, `.runtime-exports/${namespace}.js`);
|
19
|
+
const addExport = (statement) => {
|
20
|
+
statement = normalizeOutputPath(statement);
|
21
|
+
try {
|
22
|
+
fs.ensureFileSync(entryExportFile);
|
23
|
+
if (!fs.readFileSync(entryExportFile, "utf8").includes(statement)) {
|
24
|
+
fs.appendFileSync(entryExportFile, `${statement}
|
25
|
+
`);
|
26
|
+
}
|
27
|
+
} catch {
|
28
|
+
}
|
29
|
+
};
|
30
|
+
const getPath = () => entryExportFile;
|
31
|
+
return {
|
32
|
+
addExport,
|
33
|
+
getPath
|
34
|
+
};
|
35
|
+
});
|
@@ -0,0 +1,41 @@
|
|
1
|
+
import path from "path";
|
2
|
+
import { chokidar } from "../compiled";
|
3
|
+
export const WatchChangeType = {
|
4
|
+
ADD: "add",
|
5
|
+
UNLINK: "unlink",
|
6
|
+
CHANGE: "change"
|
7
|
+
};
|
8
|
+
export const watch = (watchDir, runTask, ignored = []) => {
|
9
|
+
let ready = false;
|
10
|
+
const watcher = chokidar.watch(watchDir, {
|
11
|
+
ignored
|
12
|
+
});
|
13
|
+
watcher.on("ready", () => ready = true);
|
14
|
+
watcher.on("change", async (filePath) => {
|
15
|
+
const changedFilePath = path.resolve(filePath);
|
16
|
+
await runTask({
|
17
|
+
changedFilePath,
|
18
|
+
changeType: WatchChangeType.CHANGE
|
19
|
+
});
|
20
|
+
});
|
21
|
+
watcher.on("add", async (filePath) => {
|
22
|
+
const changedFilePath = path.resolve(filePath);
|
23
|
+
if (ready) {
|
24
|
+
await runTask({
|
25
|
+
changedFilePath,
|
26
|
+
changeType: WatchChangeType.ADD
|
27
|
+
});
|
28
|
+
}
|
29
|
+
});
|
30
|
+
watcher.on("unlink", async (filePath) => {
|
31
|
+
const changedFilePath = path.resolve(filePath);
|
32
|
+
await runTask({
|
33
|
+
changedFilePath,
|
34
|
+
changeType: WatchChangeType.UNLINK
|
35
|
+
});
|
36
|
+
});
|
37
|
+
watcher.on("error", (err) => {
|
38
|
+
throw err;
|
39
|
+
});
|
40
|
+
return watcher;
|
41
|
+
};
|
@@ -0,0 +1,33 @@
|
|
1
|
+
import { Import } from "./import";
|
2
|
+
export { default as fs } from "../compiled/fs-extra";
|
3
|
+
export { default as ora } from "../compiled/ora";
|
4
|
+
export { default as glob } from "../compiled/glob";
|
5
|
+
export { default as yaml } from "../compiled/js-yaml";
|
6
|
+
export { default as chalk } from "../compiled/chalk";
|
7
|
+
export { default as debug } from "../compiled/debug";
|
8
|
+
export { default as slash } from "../compiled/slash";
|
9
|
+
export { default as execa } from "../compiled/execa";
|
10
|
+
export { default as json5 } from "../compiled/json5";
|
11
|
+
export { default as upath } from "../compiled/upath";
|
12
|
+
export { default as pkgUp } from "../compiled/pkg-up";
|
13
|
+
export { nanoid } from "../compiled/nanoid";
|
14
|
+
export { default as semver } from "../compiled/semver";
|
15
|
+
export { default as dotenv } from "../compiled/dotenv";
|
16
|
+
export { default as lodash } from "../compiled/lodash";
|
17
|
+
export { default as globby } from "../compiled/globby";
|
18
|
+
export { default as address } from "../compiled/address";
|
19
|
+
export { default as signale } from "../compiled/signale";
|
20
|
+
export { default as urlJoin } from "../compiled/url-join";
|
21
|
+
export { default as minimist } from "../compiled/minimist";
|
22
|
+
export { default as fastGlob } from "../compiled/fast-glob";
|
23
|
+
export { default as filesize } from "../compiled/filesize";
|
24
|
+
export { default as gzipSize } from "../compiled/gzip-size";
|
25
|
+
export { default as stripAnsi } from "../compiled/strip-ansi";
|
26
|
+
export { default as dotenvExpand } from "../compiled/dotenv-expand";
|
27
|
+
export { default as browserslist } from "../compiled/browserslist";
|
28
|
+
export { default as recursiveReaddir } from "../compiled/recursive-readdir";
|
29
|
+
export { program, Command } from "../compiled/commander";
|
30
|
+
export { Signale } from "../compiled/signale";
|
31
|
+
export const mime = Import.lazy("../compiled/mime-types", require);
|
32
|
+
export const chokidar = Import.lazy("../compiled/chokidar", require);
|
33
|
+
export const inquirer = Import.lazy("../compiled/inquirer", require);
|
@@ -0,0 +1,112 @@
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
2
|
+
import { Suspense } from "react";
|
3
|
+
import { createRoutesFromElements, Route } from "react-router-dom";
|
4
|
+
export const transformNestedRoutes = (routes) => {
|
5
|
+
const routeElements = [];
|
6
|
+
for (const route of routes) {
|
7
|
+
const routeElement = renderNestedRoute(route);
|
8
|
+
routeElements.push(routeElement);
|
9
|
+
}
|
10
|
+
return createRoutesFromElements(routeElements);
|
11
|
+
};
|
12
|
+
export const renderNestedRoute = (nestedRoute, options = {}) => {
|
13
|
+
const { children, index, id, component, isRoot, lazyImport, config, handle } = nestedRoute;
|
14
|
+
const Component = component;
|
15
|
+
const { parent, DeferredDataComponent, props = {} } = options;
|
16
|
+
const routeProps = {
|
17
|
+
caseSensitive: nestedRoute.caseSensitive,
|
18
|
+
path: nestedRoute.path,
|
19
|
+
id: nestedRoute.id,
|
20
|
+
loader: createLoader(nestedRoute),
|
21
|
+
action: nestedRoute.action,
|
22
|
+
hasErrorBoundary: nestedRoute.hasErrorBoundary,
|
23
|
+
shouldRevalidate: nestedRoute.shouldRevalidate,
|
24
|
+
handle: {
|
25
|
+
...handle,
|
26
|
+
...typeof config === "object" ? config === null || config === void 0 ? void 0 : config.handle : {}
|
27
|
+
},
|
28
|
+
index: nestedRoute.index,
|
29
|
+
element: nestedRoute.element,
|
30
|
+
errorElement: nestedRoute.errorElement
|
31
|
+
};
|
32
|
+
if (nestedRoute.error) {
|
33
|
+
const errorElement = /* @__PURE__ */ _jsx(nestedRoute.error, {});
|
34
|
+
routeProps.errorElement = errorElement;
|
35
|
+
}
|
36
|
+
let element;
|
37
|
+
if (Component) {
|
38
|
+
if ((parent === null || parent === void 0 ? void 0 : parent.loading) && lazyImport) {
|
39
|
+
const Loading = parent.loading;
|
40
|
+
if (isLoadableComponent(Component)) {
|
41
|
+
element = /* @__PURE__ */ _jsx(Component, {
|
42
|
+
fallback: /* @__PURE__ */ _jsx(Loading, {})
|
43
|
+
});
|
44
|
+
} else {
|
45
|
+
element = /* @__PURE__ */ _jsx(Suspense, {
|
46
|
+
fallback: /* @__PURE__ */ _jsx(Loading, {}),
|
47
|
+
children: /* @__PURE__ */ _jsx(Component, {})
|
48
|
+
});
|
49
|
+
}
|
50
|
+
} else if (isLoadableComponent(Component) && lazyImport) {
|
51
|
+
element = /* @__PURE__ */ _jsx(Component, {});
|
52
|
+
} else if (isRoot) {
|
53
|
+
element = /* @__PURE__ */ _jsxs(_Fragment, {
|
54
|
+
children: [
|
55
|
+
/* @__PURE__ */ _jsx(Component, {
|
56
|
+
...props
|
57
|
+
}),
|
58
|
+
typeof document === "undefined" && DeferredDataComponent && /* @__PURE__ */ _jsx(DeferredDataComponent, {
|
59
|
+
nonce: props === null || props === void 0 ? void 0 : props.nonce
|
60
|
+
})
|
61
|
+
]
|
62
|
+
});
|
63
|
+
} else if (lazyImport) {
|
64
|
+
element = /* @__PURE__ */ _jsx(Suspense, {
|
65
|
+
fallback: null,
|
66
|
+
children: /* @__PURE__ */ _jsx(Component, {})
|
67
|
+
});
|
68
|
+
} else {
|
69
|
+
element = /* @__PURE__ */ _jsx(Component, {});
|
70
|
+
}
|
71
|
+
} else {
|
72
|
+
nestedRoute.loading = parent === null || parent === void 0 ? void 0 : parent.loading;
|
73
|
+
}
|
74
|
+
if (element) {
|
75
|
+
routeProps.element = element;
|
76
|
+
}
|
77
|
+
const childElements = children === null || children === void 0 ? void 0 : children.map((childRoute) => {
|
78
|
+
return renderNestedRoute(childRoute, {
|
79
|
+
parent: nestedRoute
|
80
|
+
});
|
81
|
+
});
|
82
|
+
const routeElement = index ? /* @__PURE__ */ _jsx(Route, {
|
83
|
+
...routeProps,
|
84
|
+
index: true
|
85
|
+
}, id) : /* @__PURE__ */ _jsx(Route, {
|
86
|
+
...routeProps,
|
87
|
+
index: false,
|
88
|
+
children: childElements
|
89
|
+
}, id);
|
90
|
+
return routeElement;
|
91
|
+
};
|
92
|
+
function createLoader(route) {
|
93
|
+
const { loader } = route;
|
94
|
+
if (loader) {
|
95
|
+
return (args) => {
|
96
|
+
if (typeof route.lazyImport === "function") {
|
97
|
+
route.lazyImport();
|
98
|
+
}
|
99
|
+
return loader(args);
|
100
|
+
};
|
101
|
+
} else {
|
102
|
+
return () => {
|
103
|
+
if (typeof route.lazyImport === "function") {
|
104
|
+
route.lazyImport();
|
105
|
+
}
|
106
|
+
return null;
|
107
|
+
};
|
108
|
+
}
|
109
|
+
}
|
110
|
+
function isLoadableComponent(component) {
|
111
|
+
return component && component.displayName === "Loadable" && component.preload && typeof component.preload === "function";
|
112
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
export * from "@remix-run/router";
|
@@ -0,0 +1 @@
|
|
1
|
+
export * from "react-router-dom";
|
@@ -0,0 +1 @@
|
|
1
|
+
export * from "./parsed";
|
@@ -0,0 +1,17 @@
|
|
1
|
+
export const parsedJSONFromElement = (id) => {
|
2
|
+
const elements = document.querySelectorAll(`#${id}`);
|
3
|
+
if (elements.length === 0) {
|
4
|
+
return void 0;
|
5
|
+
}
|
6
|
+
const element = elements[elements.length - 1];
|
7
|
+
if (element) {
|
8
|
+
try {
|
9
|
+
const parsed = JSON.parse((element === null || element === void 0 ? void 0 : element.textContent) || "");
|
10
|
+
return parsed;
|
11
|
+
} catch (e) {
|
12
|
+
console.error(`parse ${id} error`, e);
|
13
|
+
return void 0;
|
14
|
+
}
|
15
|
+
}
|
16
|
+
return void 0;
|
17
|
+
};
|
@@ -0,0 +1,18 @@
|
|
1
|
+
function sortByUrlPath(entries) {
|
2
|
+
entries.sort(function(a, b) {
|
3
|
+
const length1 = a.urlPath.length;
|
4
|
+
const length2 = b.urlPath.length;
|
5
|
+
if (length1 < length2) {
|
6
|
+
return 1;
|
7
|
+
}
|
8
|
+
if (length1 > length2) {
|
9
|
+
return -1;
|
10
|
+
}
|
11
|
+
return 0;
|
12
|
+
});
|
13
|
+
return entries;
|
14
|
+
}
|
15
|
+
export const matchEntry = (pathname, entries) => {
|
16
|
+
sortByUrlPath(entries);
|
17
|
+
return entries.find((entry) => pathname.startsWith(entry.urlPath));
|
18
|
+
};
|
@@ -0,0 +1 @@
|
|
1
|
+
export * from "react-router-dom/server";
|
@@ -0,0 +1,38 @@
|
|
1
|
+
import * as ah from "async_hooks";
|
2
|
+
const createStorage = () => {
|
3
|
+
let storage;
|
4
|
+
if (typeof ah.AsyncLocalStorage !== "undefined") {
|
5
|
+
storage = new ah.AsyncLocalStorage();
|
6
|
+
}
|
7
|
+
const run = (context, cb) => {
|
8
|
+
if (!storage) {
|
9
|
+
throw new Error(`Unable to use async_hook, please confirm the node version >= 12.17
|
10
|
+
`);
|
11
|
+
}
|
12
|
+
return new Promise((resolve, reject) => {
|
13
|
+
storage.run(context, () => {
|
14
|
+
try {
|
15
|
+
return resolve(cb());
|
16
|
+
} catch (error) {
|
17
|
+
return reject(error);
|
18
|
+
}
|
19
|
+
});
|
20
|
+
});
|
21
|
+
};
|
22
|
+
const useContext = () => {
|
23
|
+
if (!storage) {
|
24
|
+
throw new Error(`Unable to use async_hook, please confirm the node version >= 12.17
|
25
|
+
`);
|
26
|
+
}
|
27
|
+
const context = storage.getStore();
|
28
|
+
if (!context) {
|
29
|
+
throw new Error(`Can't call useContext out of scope, make sure @modern-js/utils is a single version in node_modules`);
|
30
|
+
}
|
31
|
+
return context;
|
32
|
+
};
|
33
|
+
return {
|
34
|
+
run,
|
35
|
+
useContext
|
36
|
+
};
|
37
|
+
};
|
38
|
+
export { createStorage };
|
@@ -0,0 +1,61 @@
|
|
1
|
+
const friendlySyntaxErrorLabel = "SyntaxError:";
|
2
|
+
function isLikelyASyntaxError(message) {
|
3
|
+
return message.includes(friendlySyntaxErrorLabel);
|
4
|
+
}
|
5
|
+
function formatMessage(stats) {
|
6
|
+
let lines = [];
|
7
|
+
let message;
|
8
|
+
if (typeof stats === "object") {
|
9
|
+
const fileName = stats.moduleName ? `File: ${stats.moduleName}
|
10
|
+
` : "";
|
11
|
+
const mainMessage = typeof stats.formatted === "string" ? stats.formatted : stats.message;
|
12
|
+
const details = stats.details ? `
|
13
|
+
Details: ${stats.details}
|
14
|
+
` : "";
|
15
|
+
const stack = stats.stack ? `
|
16
|
+
${stats.stack}` : "";
|
17
|
+
message = `${fileName}${mainMessage}${details}${stack}`;
|
18
|
+
} else {
|
19
|
+
message = stats;
|
20
|
+
}
|
21
|
+
lines = message.split("\n");
|
22
|
+
lines = lines.map((line) => {
|
23
|
+
const parsingError = /Line (\d+):(?:(\d+):)?\s*Parsing error: (.+)$/.exec(line);
|
24
|
+
if (!parsingError) {
|
25
|
+
return line;
|
26
|
+
}
|
27
|
+
const [, errorLine, errorColumn, errorMessage] = parsingError;
|
28
|
+
return `${friendlySyntaxErrorLabel} ${errorMessage} (${errorLine}:${errorColumn})`;
|
29
|
+
});
|
30
|
+
message = lines.join("\n");
|
31
|
+
message = message.replace(/SyntaxError\s+\((\d+):(\d+)\)\s*(.+?)\n/g, `${friendlySyntaxErrorLabel} $3 ($1:$2)
|
32
|
+
`);
|
33
|
+
lines = message.split("\n");
|
34
|
+
if (lines.length > 2 && lines[1].trim() === "") {
|
35
|
+
lines.splice(1, 1);
|
36
|
+
}
|
37
|
+
lines[0] = lines[0].replace(/^(.*) \d+:\d+-\d+$/, "$1");
|
38
|
+
if (lines[1] && lines[1].indexOf("Module not found:") !== -1) {
|
39
|
+
lines[1] = lines[1].replace("Error: ", "");
|
40
|
+
}
|
41
|
+
lines = lines.filter((line, index, arr) => index === 0 || line.trim() !== "" || line.trim() !== arr[index - 1].trim());
|
42
|
+
message = lines.join("\n");
|
43
|
+
return message.trim();
|
44
|
+
}
|
45
|
+
function formatWebpackMessages(json) {
|
46
|
+
var _json_errors, _json_warnings, _result_errors;
|
47
|
+
const formattedErrors = json === null || json === void 0 ? void 0 : (_json_errors = json.errors) === null || _json_errors === void 0 ? void 0 : _json_errors.map(formatMessage);
|
48
|
+
const formattedWarnings = json === null || json === void 0 ? void 0 : (_json_warnings = json.warnings) === null || _json_warnings === void 0 ? void 0 : _json_warnings.map(formatMessage);
|
49
|
+
const result = {
|
50
|
+
errors: formattedErrors || [],
|
51
|
+
warnings: formattedWarnings || []
|
52
|
+
};
|
53
|
+
if ((_result_errors = result.errors) === null || _result_errors === void 0 ? void 0 : _result_errors.some(isLikelyASyntaxError)) {
|
54
|
+
result.errors = result.errors.filter(isLikelyASyntaxError);
|
55
|
+
}
|
56
|
+
if (result.errors.length > 1) {
|
57
|
+
result.errors.length = 1;
|
58
|
+
}
|
59
|
+
return result;
|
60
|
+
}
|
61
|
+
export { formatWebpackMessages };
|
@@ -0,0 +1,50 @@
|
|
1
|
+
export const pluginDagSort = (plugins, key = "name", preKey = "pre", postKey = "post") => {
|
2
|
+
let allLines = [];
|
3
|
+
function getPluginByAny(q) {
|
4
|
+
const target = plugins.find((item) => typeof q === "string" ? item[key] === q : item[key] === q[key]);
|
5
|
+
if (!target) {
|
6
|
+
throw new Error(`plugin ${q} not existed`);
|
7
|
+
}
|
8
|
+
return target;
|
9
|
+
}
|
10
|
+
plugins.forEach((item) => {
|
11
|
+
var _item_preKey, _item_postKey;
|
12
|
+
(_item_preKey = item[preKey]) === null || _item_preKey === void 0 ? void 0 : _item_preKey.forEach((p) => {
|
13
|
+
if (plugins.find((ap) => ap.name === p)) {
|
14
|
+
allLines.push([
|
15
|
+
getPluginByAny(p)[key],
|
16
|
+
getPluginByAny(item)[key]
|
17
|
+
]);
|
18
|
+
}
|
19
|
+
});
|
20
|
+
(_item_postKey = item[postKey]) === null || _item_postKey === void 0 ? void 0 : _item_postKey.forEach((pt) => {
|
21
|
+
if (plugins.find((ap) => ap.name === pt)) {
|
22
|
+
allLines.push([
|
23
|
+
getPluginByAny(item)[key],
|
24
|
+
getPluginByAny(pt)[key]
|
25
|
+
]);
|
26
|
+
}
|
27
|
+
});
|
28
|
+
});
|
29
|
+
let zeroEndPoints = plugins.filter((item) => !allLines.find((l) => l[1] === item[key]));
|
30
|
+
const sortedPoint = [];
|
31
|
+
while (zeroEndPoints.length) {
|
32
|
+
const zep = zeroEndPoints.shift();
|
33
|
+
sortedPoint.push(getPluginByAny(zep));
|
34
|
+
allLines = allLines.filter((l) => l[0] !== getPluginByAny(zep)[key]);
|
35
|
+
const restPoints = plugins.filter((item) => !sortedPoint.find((sp) => sp[key] === item[key]));
|
36
|
+
zeroEndPoints = restPoints.filter(
|
37
|
+
// eslint-disable-next-line @typescript-eslint/no-loop-func
|
38
|
+
(item) => !allLines.find((l) => l[1] === item[key])
|
39
|
+
);
|
40
|
+
}
|
41
|
+
if (allLines.length) {
|
42
|
+
const restInRingPoints = {};
|
43
|
+
allLines.forEach((l) => {
|
44
|
+
restInRingPoints[l[0]] = true;
|
45
|
+
restInRingPoints[l[1]] = true;
|
46
|
+
});
|
47
|
+
throw new Error(`plugins dependences has loop: ${Object.keys(restInRingPoints).join(",")}`);
|
48
|
+
}
|
49
|
+
return sortedPoint;
|
50
|
+
};
|
package/package.json
CHANGED
@@ -15,7 +15,7 @@
|
|
15
15
|
"modern",
|
16
16
|
"modern.js"
|
17
17
|
],
|
18
|
-
"version": "2.
|
18
|
+
"version": "2.27.0",
|
19
19
|
"jsnext:source": "./src/index.ts",
|
20
20
|
"types": "./dist/types/index.d.ts",
|
21
21
|
"main": "./dist/cjs/index.js",
|
@@ -235,9 +235,9 @@
|
|
235
235
|
"typescript": "^5",
|
236
236
|
"webpack": "^5.88.1",
|
237
237
|
"@types/serialize-javascript": "^5.0.1",
|
238
|
-
"@modern-js/types": "2.
|
239
|
-
"@scripts/jest-config": "2.
|
240
|
-
"@scripts/build": "2.
|
238
|
+
"@modern-js/types": "2.27.0",
|
239
|
+
"@scripts/jest-config": "2.27.0",
|
240
|
+
"@scripts/build": "2.27.0"
|
241
241
|
},
|
242
242
|
"sideEffects": false,
|
243
243
|
"scripts": {
|