@modern-js/server-core 2.47.0 → 2.47.1-alpha.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/dist/cjs/base/adapters/node/bff.js +69 -0
- package/dist/cjs/base/adapters/node/hono.js +62 -0
- package/dist/cjs/base/adapters/node/index.js +32 -0
- package/dist/cjs/base/adapters/node/loadServer.js +56 -0
- package/dist/cjs/base/adapters/node/middlewares/index.js +26 -0
- package/dist/cjs/base/adapters/node/middlewares/mock.js +113 -0
- package/dist/cjs/base/adapters/node/middlewares/serverStatic.js +105 -0
- package/dist/cjs/base/adapters/node/middlewares/templates.js +65 -0
- package/dist/cjs/base/adapters/node/node.js +121 -0
- package/dist/cjs/base/adapters/node/polyfills/index.js +24 -0
- package/dist/cjs/base/adapters/node/polyfills/install.js +57 -0
- package/dist/cjs/base/adapters/node/polyfills/stream.js +159 -0
- package/dist/cjs/base/constants.js +55 -0
- package/dist/cjs/base/index.js +73 -0
- package/dist/cjs/base/middlewares/customServer/base.js +115 -0
- package/dist/cjs/base/middlewares/customServer/context.js +78 -0
- package/dist/cjs/base/middlewares/customServer/index.js +138 -0
- package/dist/cjs/base/middlewares/customServer/routerApi.js +48 -0
- package/dist/cjs/base/middlewares/customServer/template.js +60 -0
- package/dist/cjs/base/middlewares/dataHandler.js +69 -0
- package/dist/cjs/base/middlewares/faviconFallback.js +34 -0
- package/dist/cjs/base/middlewares/index.js +28 -0
- package/dist/cjs/base/middlewares/monitor.js +75 -0
- package/dist/cjs/base/middlewares/renderHandler/index.js +92 -0
- package/dist/cjs/base/middlewares/renderHandler/render.js +90 -0
- package/dist/cjs/base/middlewares/renderHandler/serverTiming.js +43 -0
- package/dist/cjs/base/middlewares/renderHandler/ssrCache.js +173 -0
- package/dist/cjs/base/middlewares/renderHandler/ssrRender.js +183 -0
- package/dist/cjs/base/serverBase.js +167 -0
- package/dist/cjs/base/utils/debug.js +29 -0
- package/dist/cjs/base/utils/entry.js +30 -0
- package/dist/cjs/base/utils/env.js +45 -0
- package/dist/cjs/base/utils/error.js +65 -0
- package/dist/cjs/base/utils/index.js +40 -0
- package/dist/cjs/base/utils/middlewareCollector.js +54 -0
- package/dist/cjs/base/utils/path.js +46 -0
- package/dist/cjs/base/utils/request.js +65 -0
- package/dist/cjs/base/utils/serverConfig.js +71 -0
- package/dist/cjs/base/utils/transformStream.js +38 -0
- package/dist/cjs/base/utils/warmup.js +43 -0
- package/dist/cjs/core/hono.js +16 -0
- package/dist/cjs/core/index.js +24 -0
- package/dist/cjs/{loadPlugins.js → core/loadPlugins.js} +1 -1
- package/dist/cjs/{plugin.js → core/plugin.js} +1 -3
- package/dist/cjs/core/render.js +16 -0
- package/dist/cjs/core/server.js +22 -0
- package/dist/cjs/index.js +6 -4
- package/dist/esm/base/adapters/node/bff.js +45 -0
- package/dist/esm/base/adapters/node/hono.js +37 -0
- package/dist/esm/base/adapters/node/index.js +6 -0
- package/dist/esm/base/adapters/node/loadServer.js +22 -0
- package/dist/esm/base/adapters/node/middlewares/index.js +3 -0
- package/dist/esm/base/adapters/node/middlewares/mock.js +79 -0
- package/dist/esm/base/adapters/node/middlewares/serverStatic.js +71 -0
- package/dist/esm/base/adapters/node/middlewares/templates.js +31 -0
- package/dist/esm/base/adapters/node/node.js +95 -0
- package/dist/esm/base/adapters/node/polyfills/index.js +2 -0
- package/dist/esm/base/adapters/node/polyfills/install.js +33 -0
- package/dist/esm/base/adapters/node/polyfills/stream.js +132 -0
- package/dist/esm/base/constants.js +29 -0
- package/dist/esm/base/index.js +32 -0
- package/dist/esm/base/middlewares/customServer/base.js +91 -0
- package/dist/esm/base/middlewares/customServer/context.js +51 -0
- package/dist/esm/base/middlewares/customServer/index.js +114 -0
- package/dist/esm/base/middlewares/customServer/routerApi.js +24 -0
- package/dist/esm/base/middlewares/customServer/template.js +36 -0
- package/dist/esm/base/middlewares/dataHandler.js +35 -0
- package/dist/esm/base/middlewares/faviconFallback.js +10 -0
- package/dist/esm/base/middlewares/index.js +4 -0
- package/dist/esm/base/middlewares/monitor.js +49 -0
- package/dist/esm/base/middlewares/renderHandler/index.js +67 -0
- package/dist/esm/base/middlewares/renderHandler/render.js +66 -0
- package/dist/esm/base/middlewares/renderHandler/serverTiming.js +19 -0
- package/dist/esm/base/middlewares/renderHandler/ssrCache.js +149 -0
- package/dist/esm/base/middlewares/renderHandler/ssrRender.js +149 -0
- package/dist/esm/base/serverBase.js +143 -0
- package/dist/esm/base/utils/debug.js +5 -0
- package/dist/esm/base/utils/entry.js +6 -0
- package/dist/esm/base/utils/env.js +20 -0
- package/dist/esm/base/utils/error.js +41 -0
- package/dist/esm/base/utils/index.js +10 -0
- package/dist/esm/base/utils/middlewareCollector.js +29 -0
- package/dist/esm/base/utils/path.js +12 -0
- package/dist/esm/base/utils/request.js +38 -0
- package/dist/esm/base/utils/serverConfig.js +35 -0
- package/dist/esm/base/utils/transformStream.js +14 -0
- package/dist/esm/base/utils/warmup.js +9 -0
- package/dist/esm/core/hono.js +0 -0
- package/dist/esm/core/index.js +2 -0
- package/dist/esm/{loadPlugins.js → core/loadPlugins.js} +1 -1
- package/dist/esm/{plugin.js → core/plugin.js} +1 -3
- package/dist/esm/core/render.js +0 -0
- package/dist/esm/core/server.js +1 -0
- package/dist/esm/index.js +3 -2
- package/dist/types/base/adapters/node/bff.d.ts +4 -0
- package/dist/types/base/adapters/node/hono.d.ts +30 -0
- package/dist/types/base/adapters/node/index.d.ts +6 -0
- package/dist/types/base/adapters/node/loadServer.d.ts +3 -0
- package/dist/types/base/adapters/node/middlewares/index.d.ts +3 -0
- package/dist/types/base/adapters/node/middlewares/mock.d.ts +5 -0
- package/dist/types/base/adapters/node/middlewares/serverStatic.d.ts +9 -0
- package/dist/types/base/adapters/node/middlewares/templates.d.ts +3 -0
- package/dist/types/base/adapters/node/node.d.ts +12 -0
- package/dist/types/base/adapters/node/polyfills/index.d.ts +2 -0
- package/dist/types/base/adapters/node/polyfills/install.d.ts +1 -0
- package/dist/types/base/adapters/node/polyfills/stream.d.ts +18 -0
- package/dist/types/base/constants.d.ts +23 -0
- package/dist/types/base/index.d.ts +9 -0
- package/dist/types/base/middlewares/customServer/base.d.ts +3 -0
- package/dist/types/base/middlewares/customServer/context.d.ts +7 -0
- package/dist/types/base/middlewares/customServer/index.d.ts +13 -0
- package/dist/types/base/middlewares/customServer/routerApi.d.ts +9 -0
- package/dist/types/base/middlewares/customServer/template.d.ts +11 -0
- package/dist/types/base/middlewares/dataHandler.d.ts +3 -0
- package/dist/types/base/middlewares/faviconFallback.d.ts +2 -0
- package/dist/types/base/middlewares/index.d.ts +4 -0
- package/dist/types/base/middlewares/monitor.d.ts +7 -0
- package/dist/types/base/middlewares/renderHandler/index.d.ts +9 -0
- package/dist/types/base/middlewares/renderHandler/render.d.ts +12 -0
- package/dist/types/base/middlewares/renderHandler/serverTiming.d.ts +7 -0
- package/dist/types/base/middlewares/renderHandler/ssrCache.d.ts +17 -0
- package/dist/types/base/middlewares/renderHandler/ssrRender.d.ts +18 -0
- package/dist/types/base/serverBase.d.ts +49 -0
- package/dist/types/base/utils/debug.d.ts +1 -0
- package/dist/types/base/utils/entry.d.ts +2 -0
- package/dist/types/base/utils/env.d.ts +2 -0
- package/dist/types/base/utils/error.d.ts +1 -0
- package/dist/types/base/utils/index.d.ts +10 -0
- package/dist/types/base/utils/middlewareCollector.d.ts +12 -0
- package/dist/types/base/utils/path.d.ts +3 -0
- package/dist/types/base/utils/request.d.ts +12 -0
- package/dist/types/base/utils/serverConfig.d.ts +14 -0
- package/dist/types/base/utils/transformStream.d.ts +2 -0
- package/dist/types/base/utils/warmup.d.ts +1 -0
- package/dist/types/core/hono.d.ts +1 -0
- package/dist/types/core/index.d.ts +2 -0
- package/dist/types/{loadPlugins.d.ts → core/loadPlugins.d.ts} +1 -1
- package/dist/types/{plugin.d.ts → core/plugin.d.ts} +32 -35
- package/dist/types/core/render.d.ts +11 -0
- package/dist/types/core/server.d.ts +71 -0
- package/dist/types/index.d.ts +3 -2
- package/package.json +25 -2
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var ssrCache_exports = {};
|
|
20
|
+
__export(ssrCache_exports, {
|
|
21
|
+
ssrCache: () => ssrCache
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(ssrCache_exports);
|
|
24
|
+
var import_define_property = require("@swc/helpers/_/_define_property");
|
|
25
|
+
var import_stream = require("stream");
|
|
26
|
+
var import_utils = require("@modern-js/utils");
|
|
27
|
+
var import_storer = require("@modern-js/runtime-utils/storer");
|
|
28
|
+
var import_stream2 = require("../../adapters/node/polyfills/stream");
|
|
29
|
+
var import_utils2 = require("../../utils");
|
|
30
|
+
class CacheManager {
|
|
31
|
+
async getCacheResult(req, cacheControl, render, ssrContext) {
|
|
32
|
+
const key = this.computedKey(req, cacheControl);
|
|
33
|
+
const value = await this.container.get(key);
|
|
34
|
+
const { maxAge, staleWhileRevalidate } = cacheControl;
|
|
35
|
+
const ttl = maxAge + staleWhileRevalidate;
|
|
36
|
+
if (value) {
|
|
37
|
+
const cache = JSON.parse(value);
|
|
38
|
+
const interval = Date.now() - cache.cursor;
|
|
39
|
+
if (interval <= maxAge) {
|
|
40
|
+
return cache.val;
|
|
41
|
+
} else if (interval <= staleWhileRevalidate + maxAge) {
|
|
42
|
+
this.processCache(key, render, ssrContext, ttl);
|
|
43
|
+
return cache.val;
|
|
44
|
+
} else {
|
|
45
|
+
return this.processCache(key, render, ssrContext, ttl);
|
|
46
|
+
}
|
|
47
|
+
} else {
|
|
48
|
+
return this.processCache(key, render, ssrContext, ttl);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async processCache(key, render, ssrContext, ttl) {
|
|
52
|
+
const renderResult = await render(ssrContext);
|
|
53
|
+
if (!renderResult) {
|
|
54
|
+
return "";
|
|
55
|
+
} else if (typeof renderResult === "string") {
|
|
56
|
+
const current = Date.now();
|
|
57
|
+
const cache = {
|
|
58
|
+
val: renderResult,
|
|
59
|
+
cursor: current
|
|
60
|
+
};
|
|
61
|
+
await this.container.set(key, JSON.stringify(cache), {
|
|
62
|
+
ttl
|
|
63
|
+
});
|
|
64
|
+
return renderResult;
|
|
65
|
+
} else {
|
|
66
|
+
const body = (
|
|
67
|
+
// TODO: remove node:stream, move it to ssr entry.
|
|
68
|
+
renderResult instanceof import_stream.Readable ? (0, import_stream2.createReadableStreamFromReadable)(renderResult) : renderResult
|
|
69
|
+
);
|
|
70
|
+
let html = "";
|
|
71
|
+
const stream = (0, import_utils2.createTransformStream)((chunk) => {
|
|
72
|
+
html += chunk;
|
|
73
|
+
return chunk;
|
|
74
|
+
});
|
|
75
|
+
stream.readable.getReader().closed.then(() => {
|
|
76
|
+
const current = Date.now();
|
|
77
|
+
const cache = {
|
|
78
|
+
val: html,
|
|
79
|
+
cursor: current
|
|
80
|
+
};
|
|
81
|
+
this.container.set(key, JSON.stringify(cache), {
|
|
82
|
+
ttl
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
body.pipeThrough(stream);
|
|
86
|
+
return stream.readable;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
computedKey(req, cacheControl) {
|
|
90
|
+
const pathname = (0, import_utils2.getPathname)(req);
|
|
91
|
+
const { customKey } = cacheControl;
|
|
92
|
+
const defaultKey = pathname.replace(/.+\/+$/, "");
|
|
93
|
+
if (customKey) {
|
|
94
|
+
if (typeof customKey === "string") {
|
|
95
|
+
return customKey;
|
|
96
|
+
} else {
|
|
97
|
+
return customKey(defaultKey);
|
|
98
|
+
}
|
|
99
|
+
} else {
|
|
100
|
+
return defaultKey;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
constructor(container) {
|
|
104
|
+
(0, import_define_property._)(this, "container", void 0);
|
|
105
|
+
this.container = container;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const CACHE_FILENAME = "cache";
|
|
109
|
+
class ServerCache {
|
|
110
|
+
async loadCacheMod(pwd = process.cwd()) {
|
|
111
|
+
const path = await (0, import_utils2.getPathModule)();
|
|
112
|
+
const serverCacheFilepath = path.resolve(pwd, import_utils.SERVER_DIR, CACHE_FILENAME);
|
|
113
|
+
const mod = (0, import_utils.requireExistModule)(serverCacheFilepath, {
|
|
114
|
+
interop: false
|
|
115
|
+
});
|
|
116
|
+
this.cacheOption = mod === null || mod === void 0 ? void 0 : mod.cacheOption;
|
|
117
|
+
if (this.cacheOption && !(mod === null || mod === void 0 ? void 0 : mod.customContainer)) {
|
|
118
|
+
const cacheStorage = (0, import_storer.createMemoryStorage)("__ssr__cache");
|
|
119
|
+
this.customContainer = cacheStorage;
|
|
120
|
+
} else {
|
|
121
|
+
this.customContainer = mod === null || mod === void 0 ? void 0 : mod.customContainer;
|
|
122
|
+
}
|
|
123
|
+
if (this.customContainer) {
|
|
124
|
+
this.cacheManger = new CacheManager(this.customContainer);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
matchCacheControl(req) {
|
|
128
|
+
const { cacheOption } = this;
|
|
129
|
+
if (!cacheOption || !req) {
|
|
130
|
+
return void 0;
|
|
131
|
+
} else if (isCacheControl(cacheOption)) {
|
|
132
|
+
return cacheOption;
|
|
133
|
+
} else if (isCacheOptionProvider(cacheOption)) {
|
|
134
|
+
return cacheOption(req);
|
|
135
|
+
} else {
|
|
136
|
+
const url = req.url;
|
|
137
|
+
const options = Object.entries(cacheOption);
|
|
138
|
+
for (const [key, option] of options) {
|
|
139
|
+
if (key === "*" || new RegExp(key).test(url)) {
|
|
140
|
+
if (typeof option === "function") {
|
|
141
|
+
return option(req);
|
|
142
|
+
} else {
|
|
143
|
+
return option;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return void 0;
|
|
148
|
+
}
|
|
149
|
+
function isCacheOptionProvider(option) {
|
|
150
|
+
return typeof option === "function";
|
|
151
|
+
}
|
|
152
|
+
function isCacheControl(option) {
|
|
153
|
+
return typeof option === "object" && option !== null && "maxAge" in option;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
getCache(req, cacheControl, render, ssrContext) {
|
|
157
|
+
if (this.cacheManger) {
|
|
158
|
+
return this.cacheManger.getCacheResult(req, cacheControl, render, ssrContext);
|
|
159
|
+
} else {
|
|
160
|
+
return render(ssrContext);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
constructor() {
|
|
164
|
+
(0, import_define_property._)(this, "customContainer", void 0);
|
|
165
|
+
(0, import_define_property._)(this, "cacheOption", void 0);
|
|
166
|
+
(0, import_define_property._)(this, "cacheManger", void 0);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
const ssrCache = new ServerCache();
|
|
170
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
171
|
+
0 && (module.exports = {
|
|
172
|
+
ssrCache
|
|
173
|
+
});
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var ssrRender_exports = {};
|
|
30
|
+
__export(ssrRender_exports, {
|
|
31
|
+
ssrRender: () => ssrRender
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(ssrRender_exports);
|
|
34
|
+
var import_define_property = require("@swc/helpers/_/_define_property");
|
|
35
|
+
var import_stream = require("stream");
|
|
36
|
+
var import_utils = require("@modern-js/utils");
|
|
37
|
+
var isbot = __toESM(require("isbot"));
|
|
38
|
+
var import_utils2 = require("../../utils");
|
|
39
|
+
var import_constants = require("../../constants");
|
|
40
|
+
var import_request = require("../../utils/request");
|
|
41
|
+
var import_stream2 = require("../../adapters/node/polyfills/stream");
|
|
42
|
+
var import_serverTiming = require("./serverTiming");
|
|
43
|
+
var import_ssrCache = require("./ssrCache");
|
|
44
|
+
const defaultReporter = {
|
|
45
|
+
init() {
|
|
46
|
+
},
|
|
47
|
+
reportError() {
|
|
48
|
+
},
|
|
49
|
+
reportTiming() {
|
|
50
|
+
},
|
|
51
|
+
reportInfo() {
|
|
52
|
+
},
|
|
53
|
+
reportWarn() {
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
async function ssrRender(request, { routeInfo, pwd, html, staticGenerate, nonce, metaName, reporter, logger, nodeReq }) {
|
|
57
|
+
const { entryName } = routeInfo;
|
|
58
|
+
const path = await (0, import_utils2.getPathModule)();
|
|
59
|
+
const jsBundlePath = path.join(pwd, routeInfo.bundle);
|
|
60
|
+
const loadableUri = path.join(pwd, import_utils.LOADABLE_STATS_FILE);
|
|
61
|
+
let loadableStats = {};
|
|
62
|
+
try {
|
|
63
|
+
loadableStats = await Promise.resolve().then(() => __toESM(require(loadableUri)));
|
|
64
|
+
} catch (_) {
|
|
65
|
+
}
|
|
66
|
+
const routesManifestUri = path.join(pwd, import_utils.ROUTE_MANIFEST_FILE);
|
|
67
|
+
let routeManifest;
|
|
68
|
+
try {
|
|
69
|
+
routeManifest = await Promise.resolve().then(() => __toESM(require(routesManifestUri)));
|
|
70
|
+
} catch (_) {
|
|
71
|
+
}
|
|
72
|
+
const host = (0, import_request.getHost)(request);
|
|
73
|
+
const isSpider = isbot.default(request.headers.get("user-agent"));
|
|
74
|
+
const responseProxy = new ResponseProxy();
|
|
75
|
+
const query = (0, import_request.parseQuery)(request);
|
|
76
|
+
const headers = (0, import_request.parseHeaders)(request);
|
|
77
|
+
const ssrContext = {
|
|
78
|
+
request: {
|
|
79
|
+
baseUrl: routeInfo.urlPath,
|
|
80
|
+
params: {},
|
|
81
|
+
// eslint-disable-next-line node/no-unsupported-features/node-builtins, node/prefer-global/url
|
|
82
|
+
pathname: new URL(request.url).pathname,
|
|
83
|
+
host,
|
|
84
|
+
query,
|
|
85
|
+
url: request.url,
|
|
86
|
+
headers
|
|
87
|
+
},
|
|
88
|
+
response: {
|
|
89
|
+
setHeader(key, value) {
|
|
90
|
+
responseProxy.headers.set(key, value);
|
|
91
|
+
},
|
|
92
|
+
status(code) {
|
|
93
|
+
responseProxy.status = code;
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
redirection: {},
|
|
97
|
+
template: html,
|
|
98
|
+
loadableStats,
|
|
99
|
+
routeManifest,
|
|
100
|
+
entryName,
|
|
101
|
+
staticGenerate,
|
|
102
|
+
logger,
|
|
103
|
+
serverTiming: new import_serverTiming.ServerTiming(responseProxy.headers, metaName),
|
|
104
|
+
reporter: reporter || defaultReporter,
|
|
105
|
+
/** @deprecated node req */
|
|
106
|
+
req: void 0,
|
|
107
|
+
/** @deprecated node res */
|
|
108
|
+
res: void 0,
|
|
109
|
+
isSpider,
|
|
110
|
+
nonce
|
|
111
|
+
};
|
|
112
|
+
const jsBundle = await Promise.resolve().then(() => __toESM(require(jsBundlePath)));
|
|
113
|
+
const incomingMessage = nodeReq ? nodeReq : new IncomingMessgeProxy(request);
|
|
114
|
+
const cacheControl = await import_ssrCache.ssrCache.matchCacheControl(incomingMessage);
|
|
115
|
+
let ssrResult;
|
|
116
|
+
const render = jsBundle[import_utils.SERVER_RENDER_FUNCTION_NAME];
|
|
117
|
+
if (cacheControl) {
|
|
118
|
+
ssrResult = await import_ssrCache.ssrCache.getCache(request, cacheControl, render, ssrContext);
|
|
119
|
+
} else {
|
|
120
|
+
ssrResult = await render(ssrContext);
|
|
121
|
+
}
|
|
122
|
+
const { redirection } = ssrContext;
|
|
123
|
+
if (redirection.url) {
|
|
124
|
+
const { headers: headers2 } = responseProxy;
|
|
125
|
+
headers2.set("Location", redirection.url);
|
|
126
|
+
return new Response(null, {
|
|
127
|
+
status: redirection.status || 302,
|
|
128
|
+
headers: {
|
|
129
|
+
Location: redirection.url
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
const serverData = {
|
|
134
|
+
router: {
|
|
135
|
+
baseUrl: routeInfo.urlPath,
|
|
136
|
+
// TODO: parse
|
|
137
|
+
params: {}
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
const data = ssrResult instanceof import_stream.Readable ? (0, import_stream2.createReadableStreamFromReadable)(ssrResult) : ssrResult;
|
|
141
|
+
const body = injectServerData(data, serverData);
|
|
142
|
+
return new Response(body, {
|
|
143
|
+
status: responseProxy.status,
|
|
144
|
+
headers: responseProxy.headers
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
function injectServerData(data, serverData) {
|
|
148
|
+
const { head } = import_constants.REPLACE_REG.before;
|
|
149
|
+
const searchValue = new RegExp(head);
|
|
150
|
+
const replcaeCb = (beforeHead) => `${beforeHead}<script type="application/json" id="__MODERN_SERVER_DATA__">${JSON.stringify(serverData)}</script>`;
|
|
151
|
+
if (typeof data === "string") {
|
|
152
|
+
return data.replace(searchValue, replcaeCb);
|
|
153
|
+
} else {
|
|
154
|
+
const stream = (0, import_utils2.createTransformStream)((before) => {
|
|
155
|
+
return before.replace(searchValue, replcaeCb);
|
|
156
|
+
});
|
|
157
|
+
data.pipeThrough(stream);
|
|
158
|
+
return stream.readable;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
class ResponseProxy {
|
|
162
|
+
constructor() {
|
|
163
|
+
(0, import_define_property._)(this, "headers", new Headers());
|
|
164
|
+
(0, import_define_property._)(this, "status", 200);
|
|
165
|
+
this.headers.set("content-type", "text/html; charset=UTF-8");
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
class IncomingMessgeProxy {
|
|
169
|
+
constructor(req) {
|
|
170
|
+
(0, import_define_property._)(this, "headers", {});
|
|
171
|
+
(0, import_define_property._)(this, "method", void 0);
|
|
172
|
+
(0, import_define_property._)(this, "url", void 0);
|
|
173
|
+
req.headers.forEach((value, key) => {
|
|
174
|
+
this.headers[key] = value;
|
|
175
|
+
});
|
|
176
|
+
this.method = req.method;
|
|
177
|
+
this.url = new URL(req.url).pathname;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
181
|
+
0 && (module.exports = {
|
|
182
|
+
ssrRender
|
|
183
|
+
});
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var serverBase_exports = {};
|
|
20
|
+
__export(serverBase_exports, {
|
|
21
|
+
ServerBase: () => ServerBase
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(serverBase_exports);
|
|
24
|
+
var import_define_property = require("@swc/helpers/_/_define_property");
|
|
25
|
+
var import_utils = require("@modern-js/utils");
|
|
26
|
+
var import_hono = require("hono");
|
|
27
|
+
var import_core = require("../core");
|
|
28
|
+
var import_utils2 = require("./utils");
|
|
29
|
+
class ServerBase {
|
|
30
|
+
/**
|
|
31
|
+
* 初始化顺序
|
|
32
|
+
* - 获取 server runtime config
|
|
33
|
+
* - 设置 context
|
|
34
|
+
* - 创建 hooksRunner
|
|
35
|
+
* - 合并插件,内置插件和 serverConfig 中配置的插件
|
|
36
|
+
* - 执行 config hook
|
|
37
|
+
* - 获取最终的配置
|
|
38
|
+
* - 设置配置到 context
|
|
39
|
+
* - 执行 prepare hook
|
|
40
|
+
*/
|
|
41
|
+
async init() {
|
|
42
|
+
const { options } = this;
|
|
43
|
+
await this.initServerConfig(options);
|
|
44
|
+
await this.injectContext(options);
|
|
45
|
+
this.runner = await this.createHookRunner();
|
|
46
|
+
await this.initConfig(this.runner, options);
|
|
47
|
+
await this.injectContext(options);
|
|
48
|
+
await this.runner.prepare();
|
|
49
|
+
return this;
|
|
50
|
+
}
|
|
51
|
+
async createHookRunner() {
|
|
52
|
+
import_core.serverManager.clear();
|
|
53
|
+
const { options } = this;
|
|
54
|
+
const { internalPlugins = import_utils.INTERNAL_SERVER_PLUGINS, pwd, plugins = [] } = options;
|
|
55
|
+
const serverPlugins = this.serverConfig.plugins || [];
|
|
56
|
+
const loadedPlugins = (0, import_core.loadPlugins)(options.appContext.appDirectory || pwd, [
|
|
57
|
+
...serverPlugins,
|
|
58
|
+
...plugins
|
|
59
|
+
], {
|
|
60
|
+
internalPlugins
|
|
61
|
+
});
|
|
62
|
+
(0, import_utils2.debug)("plugins", loadedPlugins);
|
|
63
|
+
loadedPlugins.forEach((p) => {
|
|
64
|
+
import_core.serverManager.usePlugin(p);
|
|
65
|
+
});
|
|
66
|
+
const hooksRunner = await import_core.serverManager.init();
|
|
67
|
+
return hooksRunner;
|
|
68
|
+
}
|
|
69
|
+
async initServerConfig(options) {
|
|
70
|
+
const { pwd, serverConfigFile } = options;
|
|
71
|
+
const serverConfigPath = await (0, import_utils2.getServerConfigPath)(pwd, serverConfigFile);
|
|
72
|
+
const serverConfig = (0, import_utils2.requireConfig)(serverConfigPath);
|
|
73
|
+
this.serverConfig = serverConfig;
|
|
74
|
+
}
|
|
75
|
+
async injectContext(options) {
|
|
76
|
+
const appContext = await this.initAppContext();
|
|
77
|
+
const { config, pwd } = options;
|
|
78
|
+
import_core.ConfigContext.set(config);
|
|
79
|
+
import_core.AppContext.set({
|
|
80
|
+
...appContext,
|
|
81
|
+
serverBase: this,
|
|
82
|
+
distDirectory: pwd
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
async initAppContext() {
|
|
86
|
+
const path = await (0, import_utils2.getPathModule)();
|
|
87
|
+
const { options } = this;
|
|
88
|
+
const { pwd, plugins = [], appContext } = options;
|
|
89
|
+
const serverPlugins = plugins.map((p) => ({
|
|
90
|
+
server: p
|
|
91
|
+
}));
|
|
92
|
+
return {
|
|
93
|
+
appDirectory: (appContext === null || appContext === void 0 ? void 0 : appContext.appDirectory) || "",
|
|
94
|
+
apiDirectory: appContext === null || appContext === void 0 ? void 0 : appContext.apiDirectory,
|
|
95
|
+
lambdaDirectory: appContext === null || appContext === void 0 ? void 0 : appContext.lambdaDirectory,
|
|
96
|
+
sharedDirectory: (appContext === null || appContext === void 0 ? void 0 : appContext.sharedDirectory) || path.resolve(appContext.appDirectory || "", import_utils.SHARED_DIR),
|
|
97
|
+
distDirectory: pwd,
|
|
98
|
+
plugins: serverPlugins
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Execute config hooks
|
|
103
|
+
* @param runner
|
|
104
|
+
* @param options
|
|
105
|
+
*/
|
|
106
|
+
runConfigHook(runner, serverConfig) {
|
|
107
|
+
const newServerConfig = runner.config(serverConfig || {});
|
|
108
|
+
return newServerConfig;
|
|
109
|
+
}
|
|
110
|
+
async initConfig(runner, options) {
|
|
111
|
+
const path = await (0, import_utils2.getPathModule)();
|
|
112
|
+
const { pwd, config } = options;
|
|
113
|
+
const { serverConfig } = this;
|
|
114
|
+
const finalServerConfig = this.runConfigHook(runner, serverConfig);
|
|
115
|
+
const resolvedConfigPath = (0, import_utils.ensureAbsolutePath)(pwd, path.join(config.output.path || "dist", import_utils.OUTPUT_CONFIG_FILE));
|
|
116
|
+
options.config = (0, import_utils2.loadConfig)({
|
|
117
|
+
cliConfig: config,
|
|
118
|
+
serverConfig: finalServerConfig,
|
|
119
|
+
resolvedConfigPath
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
get all() {
|
|
123
|
+
return this.app.all;
|
|
124
|
+
}
|
|
125
|
+
get use() {
|
|
126
|
+
return this.app.use;
|
|
127
|
+
}
|
|
128
|
+
get get() {
|
|
129
|
+
return this.app.get;
|
|
130
|
+
}
|
|
131
|
+
get post() {
|
|
132
|
+
return this.app.post;
|
|
133
|
+
}
|
|
134
|
+
get put() {
|
|
135
|
+
return this.app.put;
|
|
136
|
+
}
|
|
137
|
+
get delete() {
|
|
138
|
+
return this.app.delete;
|
|
139
|
+
}
|
|
140
|
+
get patch() {
|
|
141
|
+
return this.app.patch;
|
|
142
|
+
}
|
|
143
|
+
get handle() {
|
|
144
|
+
return this.app.fetch;
|
|
145
|
+
}
|
|
146
|
+
get request() {
|
|
147
|
+
return this.app.request;
|
|
148
|
+
}
|
|
149
|
+
get notFound() {
|
|
150
|
+
return this.app.notFound;
|
|
151
|
+
}
|
|
152
|
+
get onError() {
|
|
153
|
+
return this.app.onError;
|
|
154
|
+
}
|
|
155
|
+
constructor(options) {
|
|
156
|
+
(0, import_define_property._)(this, "options", void 0);
|
|
157
|
+
(0, import_define_property._)(this, "runner", void 0);
|
|
158
|
+
(0, import_define_property._)(this, "app", void 0);
|
|
159
|
+
(0, import_define_property._)(this, "serverConfig", {});
|
|
160
|
+
this.options = options;
|
|
161
|
+
this.app = new import_hono.Hono();
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
165
|
+
0 && (module.exports = {
|
|
166
|
+
ServerBase
|
|
167
|
+
});
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var debug_exports = {};
|
|
20
|
+
__export(debug_exports, {
|
|
21
|
+
debug: () => debug
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(debug_exports);
|
|
24
|
+
var import_utils = require("@modern-js/utils");
|
|
25
|
+
const debug = (0, import_utils.createDebugger)("prod-server");
|
|
26
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
27
|
+
0 && (module.exports = {
|
|
28
|
+
debug
|
|
29
|
+
});
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var entry_exports = {};
|
|
20
|
+
__export(entry_exports, {
|
|
21
|
+
sortRoutes: () => sortRoutes
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(entry_exports);
|
|
24
|
+
const sortRoutes = (route1, route2) => {
|
|
25
|
+
return route2.urlPath.length - route1.urlPath.length;
|
|
26
|
+
};
|
|
27
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
28
|
+
0 && (module.exports = {
|
|
29
|
+
sortRoutes
|
|
30
|
+
});
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var env_exports = {};
|
|
20
|
+
__export(env_exports, {
|
|
21
|
+
checkIsProd: () => checkIsProd,
|
|
22
|
+
getRuntimeEnv: () => getRuntimeEnv
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(env_exports);
|
|
25
|
+
const getRuntimeEnv = () => {
|
|
26
|
+
var _global_process_release, _global_process, _global;
|
|
27
|
+
if (((_global = global) === null || _global === void 0 ? void 0 : (_global_process = _global.process) === null || _global_process === void 0 ? void 0 : (_global_process_release = _global_process.release) === null || _global_process_release === void 0 ? void 0 : _global_process_release.name) === "node") {
|
|
28
|
+
return "node";
|
|
29
|
+
}
|
|
30
|
+
return "other";
|
|
31
|
+
};
|
|
32
|
+
const checkIsProd = () => {
|
|
33
|
+
const env = getRuntimeEnv();
|
|
34
|
+
switch (env) {
|
|
35
|
+
case "node":
|
|
36
|
+
return process.env.NODE_ENV === "production";
|
|
37
|
+
default:
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
42
|
+
0 && (module.exports = {
|
|
43
|
+
checkIsProd,
|
|
44
|
+
getRuntimeEnv
|
|
45
|
+
});
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var error_exports = {};
|
|
20
|
+
__export(error_exports, {
|
|
21
|
+
createErrorHtml: () => createErrorHtml
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(error_exports);
|
|
24
|
+
const ERROR_PAGE_TEXT = {
|
|
25
|
+
404: "This page could not be found.",
|
|
26
|
+
500: "Internal Server Error."
|
|
27
|
+
};
|
|
28
|
+
const createErrorHtml = (status) => {
|
|
29
|
+
const text = ERROR_PAGE_TEXT[status] || "";
|
|
30
|
+
const title = `${status}: ${text}`;
|
|
31
|
+
return `<!DOCTYPE html>
|
|
32
|
+
<html lang="en">
|
|
33
|
+
<head>
|
|
34
|
+
<meta charset="utf-8">
|
|
35
|
+
<meta name="viewport" content="width=device-width">
|
|
36
|
+
<title>${title}</title>
|
|
37
|
+
<style>
|
|
38
|
+
html,body {
|
|
39
|
+
margin: 0;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.page-container {
|
|
43
|
+
color: #000;
|
|
44
|
+
background: #fff;
|
|
45
|
+
height: 100vh;
|
|
46
|
+
text-align: center;
|
|
47
|
+
display: flex;
|
|
48
|
+
flex-direction: column;
|
|
49
|
+
align-items: center;
|
|
50
|
+
justify-content: center;
|
|
51
|
+
}
|
|
52
|
+
</style>
|
|
53
|
+
</head>
|
|
54
|
+
<body>
|
|
55
|
+
<div class="page-container">
|
|
56
|
+
<h1>${status}</h1>
|
|
57
|
+
<div>${text}</div>
|
|
58
|
+
</body>
|
|
59
|
+
</html>
|
|
60
|
+
`;
|
|
61
|
+
};
|
|
62
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
63
|
+
0 && (module.exports = {
|
|
64
|
+
createErrorHtml
|
|
65
|
+
});
|