@shuvi/platform-web 0.0.1-rc.34 → 1.0.0-rc.2
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/esm/shared/appTypes.d.ts +15 -0
- package/esm/shared/appTypes.js +1 -0
- package/esm/shared/configTypes.d.ts +14 -0
- package/esm/shared/configTypes.js +1 -0
- package/esm/shared/index.d.ts +5 -0
- package/esm/shared/index.js +5 -0
- package/esm/shared/renderTypes.d.ts +44 -0
- package/esm/shared/renderTypes.js +1 -0
- package/esm/shared/routeTypes.d.ts +47 -0
- package/esm/shared/routeTypes.js +1 -0
- package/esm/shared/serverTypes.d.ts +6 -0
- package/esm/shared/serverTypes.js +1 -0
- package/esm/shuvi-app/app/client.d.ts +2 -0
- package/esm/shuvi-app/app/client.js +125 -0
- package/esm/shuvi-app/app/server.d.ts +2 -0
- package/esm/shuvi-app/app/server.js +67 -0
- package/{shuvi-app → esm/shuvi-app}/dev/webpackHotDevClient.d.ts +0 -0
- package/{shuvi-app → esm/shuvi-app}/dev/webpackHotDevClient.js +2 -1
- package/esm/shuvi-app/entry/client/app.d.ts +2 -0
- package/esm/shuvi-app/entry/client/app.js +57 -0
- package/esm/shuvi-app/entry/client/index.d.ts +2 -0
- package/esm/shuvi-app/entry/client/index.js +12 -0
- package/{shuvi-app → esm/shuvi-app}/entry/client/run.dev.d.ts +0 -0
- package/{shuvi-app → esm/shuvi-app}/entry/client/run.dev.js +2 -2
- package/{shuvi-app → esm/shuvi-app}/entry/client/run.prod.d.ts +0 -0
- package/esm/shuvi-app/entry/client/run.prod.js +3 -0
- package/{shuvi-app → esm/shuvi-app}/entry/client/setup-env.d.ts +1 -1
- package/esm/shuvi-app/entry/client/setup-env.js +17 -0
- package/esm/shuvi-app/entry/server/index.d.ts +6 -0
- package/esm/shuvi-app/entry/server/index.js +7 -0
- package/esm/shuvi-app/react/AppComponent.d.ts +4 -0
- package/esm/shuvi-app/react/AppComponent.jsx +6 -0
- package/esm/shuvi-app/react/AppContainer.d.ts +6 -0
- package/esm/shuvi-app/react/AppContainer.jsx +23 -0
- package/esm/shuvi-app/react/Error.d.ts +5 -0
- package/esm/shuvi-app/react/Error.jsx +38 -0
- package/esm/shuvi-app/react/ErrorBoundary.d.ts +16 -0
- package/esm/shuvi-app/react/ErrorBoundary.jsx +25 -0
- package/esm/shuvi-app/react/ErrorPage.d.ts +5 -0
- package/esm/shuvi-app/react/ErrorPage.jsx +7 -0
- package/esm/shuvi-app/react/Link.d.ts +7 -0
- package/esm/shuvi-app/react/Link.jsx +115 -0
- package/esm/shuvi-app/react/applicationContext.d.ts +7 -0
- package/esm/shuvi-app/react/applicationContext.jsx +10 -0
- package/esm/shuvi-app/react/dynamic.d.ts +31 -0
- package/esm/shuvi-app/react/dynamic.jsx +62 -0
- package/esm/shuvi-app/react/getRoutes.d.ts +2 -0
- package/esm/shuvi-app/react/getRoutes.js +31 -0
- package/esm/shuvi-app/react/head/head-manager-context.d.ts +2 -0
- package/esm/shuvi-app/react/head/head-manager-context.js +2 -0
- package/esm/shuvi-app/react/head/head-manager.d.ts +10 -0
- package/esm/shuvi-app/react/head/head-manager.js +93 -0
- package/esm/shuvi-app/react/head/head.d.ts +33 -0
- package/esm/shuvi-app/react/head/head.jsx +178 -0
- package/esm/shuvi-app/react/head/index.d.ts +4 -0
- package/esm/shuvi-app/react/head/index.js +4 -0
- package/esm/shuvi-app/react/head/side-effect.d.ts +30 -0
- package/esm/shuvi-app/react/head/side-effect.jsx +44 -0
- package/esm/shuvi-app/react/head/types.d.ts +15 -0
- package/esm/shuvi-app/react/head/types.js +1 -0
- package/esm/shuvi-app/react/index.d.ts +4 -0
- package/esm/shuvi-app/react/index.js +4 -0
- package/esm/shuvi-app/react/loadRouteComponent.d.ts +4 -0
- package/esm/shuvi-app/react/loadRouteComponent.jsx +9 -0
- package/esm/shuvi-app/react/loadable/index.d.ts +2 -0
- package/esm/shuvi-app/react/loadable/index.js +2 -0
- package/esm/shuvi-app/react/loadable/loadable-context.d.ts +4 -0
- package/esm/shuvi-app/react/loadable/loadable-context.js +3 -0
- package/esm/shuvi-app/react/loadable/loadable.d.ts +30 -0
- package/esm/shuvi-app/react/loadable/loadable.js +277 -0
- package/esm/shuvi-app/react/redox-react/RedoxWrapper.d.ts +8 -0
- package/esm/shuvi-app/react/redox-react/RedoxWrapper.jsx +11 -0
- package/esm/shuvi-app/react/redox-react/runtime.d.ts +2 -0
- package/esm/shuvi-app/react/redox-react/runtime.js +16 -0
- package/esm/shuvi-app/react/shuvi-runtime-api.d.ts +5 -0
- package/esm/shuvi-app/react/shuvi-runtime-api.js +5 -0
- package/esm/shuvi-app/react/types.d.ts +14 -0
- package/esm/shuvi-app/react/types.js +1 -0
- package/esm/shuvi-app/react/useLoaderData.d.ts +2 -0
- package/esm/shuvi-app/react/useLoaderData.js +27 -0
- package/esm/shuvi-app/react/utils/getDisplayName.d.ts +2 -0
- package/esm/shuvi-app/react/utils/getDisplayName.js +3 -0
- package/esm/shuvi-app/react/utils/requestIdleCallback.d.ts +2 -0
- package/esm/shuvi-app/react/utils/requestIdleCallback.js +20 -0
- package/esm/shuvi-app/react/utils/useIntersection.d.ts +8 -0
- package/esm/shuvi-app/react/utils/useIntersection.jsx +91 -0
- package/esm/shuvi-app/react/view/ReactView.client.d.ts +5 -0
- package/esm/shuvi-app/react/view/ReactView.client.jsx +64 -0
- package/esm/shuvi-app/react/view/ReactView.server.d.ts +4 -0
- package/esm/shuvi-app/react/view/ReactView.server.jsx +109 -0
- package/esm/shuvi-app/react/view/clientView.d.ts +3 -0
- package/esm/shuvi-app/react/view/clientView.js +2 -0
- package/esm/shuvi-app/react/view/index.d.ts +2 -0
- package/esm/shuvi-app/react/view/index.js +7 -0
- package/esm/shuvi-app/react/view/render-action.d.ts +10 -0
- package/esm/shuvi-app/react/view/render-action.js +29 -0
- package/esm/shuvi-app/react/view/serverView.d.ts +3 -0
- package/esm/shuvi-app/react/view/serverView.js +2 -0
- package/esm/shuvi-app/react/view/transformRoutes.d.ts +2 -0
- package/esm/shuvi-app/react/view/transformRoutes.js +3 -0
- package/esm/shuvi-app/shuvi-runtime-index.d.ts +4 -0
- package/esm/shuvi-app/shuvi-runtime-index.js +2 -0
- package/esm/shuvi-app/shuvi-runtime-server.d.ts +6 -0
- package/esm/shuvi-app/shuvi-runtime-server.js +1 -0
- package/lib/node/features/custom-server/index.d.ts +4 -0
- package/lib/node/features/custom-server/index.js +9 -0
- package/lib/node/features/custom-server/server.d.ts +2 -0
- package/lib/node/features/custom-server/server.js +28 -0
- package/lib/node/features/filesystem-routes/api/apiRouteHandler.d.ts +51 -0
- package/lib/node/features/filesystem-routes/api/apiRouteHandler.js +237 -0
- package/lib/node/features/filesystem-routes/api/apiRoutes.d.ts +7 -0
- package/lib/node/features/filesystem-routes/api/apiRoutes.js +35 -0
- package/lib/node/features/filesystem-routes/api/index.d.ts +3 -0
- package/lib/node/features/filesystem-routes/api/index.js +7 -0
- package/lib/node/features/filesystem-routes/api/middleware.d.ts +2 -0
- package/lib/node/features/filesystem-routes/api/middleware.js +44 -0
- package/lib/node/features/filesystem-routes/hooks.d.ts +3 -0
- package/lib/node/features/filesystem-routes/hooks.js +6 -0
- package/lib/node/features/filesystem-routes/index.d.ts +20 -0
- package/lib/node/features/filesystem-routes/index.js +180 -0
- package/lib/node/features/filesystem-routes/middleware/index.d.ts +2 -0
- package/lib/node/features/filesystem-routes/middleware/index.js +7 -0
- package/lib/node/features/filesystem-routes/middleware/middleware.d.ts +2 -0
- package/lib/node/features/filesystem-routes/middleware/middleware.js +42 -0
- package/lib/node/features/filesystem-routes/middleware/routes.d.ts +9 -0
- package/lib/node/features/filesystem-routes/middleware/routes.js +34 -0
- package/lib/node/features/filesystem-routes/page/index.d.ts +2 -0
- package/lib/node/features/filesystem-routes/page/index.js +21 -0
- package/lib/node/features/filesystem-routes/page/routes.d.ts +8 -0
- package/lib/node/features/filesystem-routes/page/routes.js +83 -0
- package/lib/node/features/filesystem-routes/page/store.d.ts +3 -0
- package/lib/node/features/filesystem-routes/page/store.js +10 -0
- package/lib/node/features/html-render/index.d.ts +19 -0
- package/lib/node/features/html-render/index.js +28 -0
- package/lib/node/features/html-render/lib/generateFilesByRoutId.d.ts +3 -0
- package/lib/node/features/html-render/lib/generateFilesByRoutId.js +13 -0
- package/lib/node/features/html-render/lib/getPageMiddleware.d.ts +2 -0
- package/lib/node/features/html-render/lib/getPageMiddleware.js +56 -0
- package/lib/node/features/html-render/lib/index.d.ts +4 -0
- package/lib/node/features/html-render/lib/index.js +23 -0
- package/lib/node/features/html-render/lib/pageLoader.d.ts +1 -0
- package/lib/node/features/html-render/lib/pageLoader.js +42 -0
- package/lib/node/features/html-render/lib/renderToHTML.d.ts +6 -0
- package/lib/node/features/html-render/lib/renderToHTML.js +81 -0
- package/lib/node/features/html-render/lib/renderer/base.d.ts +17 -0
- package/lib/node/features/html-render/lib/renderer/base.js +70 -0
- package/lib/node/features/html-render/lib/renderer/htmlTag.d.ts +4 -0
- package/lib/node/features/html-render/lib/renderer/htmlTag.js +70 -0
- package/lib/node/features/html-render/lib/renderer/index.d.ts +15 -0
- package/lib/node/features/html-render/lib/renderer/index.js +48 -0
- package/lib/node/features/html-render/lib/renderer/spa.d.ts +5 -0
- package/lib/node/features/html-render/lib/renderer/spa.js +26 -0
- package/lib/node/features/html-render/lib/renderer/ssr.d.ts +5 -0
- package/lib/node/features/html-render/lib/renderer/ssr.js +70 -0
- package/lib/node/features/html-render/lib/renderer/types.d.ts +20 -0
- package/lib/node/features/html-render/lib/renderer/types.js +2 -0
- package/lib/node/features/html-render/lib/viewTemplate.d.ts +5 -0
- package/lib/node/features/html-render/lib/viewTemplate.js +37 -0
- package/lib/node/features/html-render/server.d.ts +2 -0
- package/lib/node/features/html-render/server.js +9 -0
- package/lib/node/features/html-render/serverHooks.d.ts +10 -0
- package/lib/node/features/html-render/serverHooks.js +13 -0
- package/lib/node/features/html-render/shuvi-app.d.ts +6 -0
- package/lib/node/features/html-render/shuvi-app.js +2 -0
- package/lib/node/features/index.d.ts +32 -0
- package/lib/node/features/index.js +25 -0
- package/lib/node/features/main/buildHtml.d.ts +8 -0
- package/lib/node/features/main/buildHtml.js +64 -0
- package/lib/node/features/main/generateResource.d.ts +3 -0
- package/lib/node/features/main/generateResource.js +56 -0
- package/lib/node/features/main/index.d.ts +3 -0
- package/lib/node/features/main/index.js +82 -0
- package/lib/node/features/middlewares.d.ts +4 -0
- package/lib/node/features/middlewares.js +23 -0
- package/lib/node/features/model/index.d.ts +21 -0
- package/lib/node/features/model/index.js +54 -0
- package/lib/node/features/model/runtime.d.ts +13 -0
- package/lib/node/features/model/runtime.js +47 -0
- package/lib/node/features/model/server.d.ts +3 -0
- package/lib/node/features/model/server.js +12 -0
- package/lib/node/features/model/shuvi-app.d.ts +6 -0
- package/lib/node/features/model/shuvi-app.js +2 -0
- package/lib/node/features/on-demand-compile-page/emptyComponent.d.ts +1 -0
- package/lib/node/features/on-demand-compile-page/emptyComponent.js +7 -0
- package/lib/node/features/on-demand-compile-page/index.d.ts +15 -0
- package/lib/node/features/on-demand-compile-page/index.js +36 -0
- package/lib/node/features/on-demand-compile-page/onDemandRouteManager.d.ts +11 -0
- package/lib/node/features/on-demand-compile-page/onDemandRouteManager.js +104 -0
- package/lib/node/index.d.ts +6 -0
- package/lib/node/index.js +38 -0
- package/lib/{paths.d.ts → node/paths.d.ts} +1 -2
- package/lib/node/paths.js +36 -0
- package/lib/node/shuvi-type-extensions-node.d.ts +42 -0
- package/lib/node/shuvi-type-extensions-node.js +3 -0
- package/lib/node/targets/react/bundler/index.d.ts +16 -0
- package/lib/node/targets/react/bundler/index.js +102 -0
- package/lib/node/targets/react/index.d.ts +32 -0
- package/lib/node/targets/react/index.js +28 -0
- package/lib/node/targets/react/redox-react/index.d.ts +18 -0
- package/lib/node/targets/react/redox-react/index.js +50 -0
- package/lib/shared/appTypes.d.ts +15 -0
- package/lib/shared/appTypes.js +2 -0
- package/lib/shared/configTypes.d.ts +14 -0
- package/lib/shared/configTypes.js +2 -0
- package/lib/shared/index.d.ts +5 -0
- package/lib/shared/index.js +21 -0
- package/lib/shared/renderTypes.d.ts +44 -0
- package/lib/shared/renderTypes.js +2 -0
- package/lib/shared/routeTypes.d.ts +47 -0
- package/lib/shared/routeTypes.js +2 -0
- package/lib/shared/serverTypes.d.ts +6 -0
- package/lib/shared/serverTypes.js +2 -0
- package/package.json +78 -15
- package/shuvi-type-extensions-node.d.ts +2 -0
- package/shuvi-type-extensions-runtime.d.ts +36 -0
- package/lib/index.d.ts +0 -3
- package/lib/index.js +0 -44
- package/lib/paths.js +0 -7
- package/shuvi-app/application/client/create-application-factory.d.ts +0 -3
- package/shuvi-app/application/client/create-application-factory.js +0 -70
- package/shuvi-app/application/client/create-application-history-browser.d.ts +0 -1
- package/shuvi-app/application/client/create-application-history-browser.js +0 -3
- package/shuvi-app/application/client/create-application-history-hash.d.ts +0 -1
- package/shuvi-app/application/client/create-application-history-hash.js +0 -3
- package/shuvi-app/application/client/create-application-history-memory.d.ts +0 -1
- package/shuvi-app/application/client/create-application-history-memory.js +0 -3
- package/shuvi-app/application/server/create-application-spa.d.ts +0 -2
- package/shuvi-app/application/server/create-application-spa.js +0 -8
- package/shuvi-app/application/server/create-application.d.ts +0 -2
- package/shuvi-app/application/server/create-application.js +0 -25
- package/shuvi-app/entry/client/index.d.ts +0 -1
- package/shuvi-app/entry/client/index.js +0 -11
- package/shuvi-app/entry/client/run.prod.js +0 -3
- package/shuvi-app/entry/client/setup-app.d.ts +0 -3
- package/shuvi-app/entry/client/setup-app.js +0 -38
- package/shuvi-app/entry/client/setup-env.js +0 -27
- package/shuvi-app/entry/server/index.d.ts +0 -6
- package/shuvi-app/entry/server/index.js +0 -7
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
28
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
29
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
30
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
31
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
|
+
exports.ApiError = exports.sendJson = exports.sendData = exports.redirect = exports.sendStatusCode = exports.getCookieParser = exports.parseBody = exports.apiRouteHandler = void 0;
|
|
36
|
+
const stream_1 = require("stream");
|
|
37
|
+
const querystring = __importStar(require("querystring"));
|
|
38
|
+
const cookie = __importStar(require("cookie"));
|
|
39
|
+
const getRawBody = require('raw-body');
|
|
40
|
+
const contentType = __importStar(require("content-type"));
|
|
41
|
+
function apiRouteHandler(req, res, resolver, apiRoutesConfig) {
|
|
42
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
43
|
+
try {
|
|
44
|
+
const { bodyParser } = apiRoutesConfig || {};
|
|
45
|
+
const { pathname, query, params } = req;
|
|
46
|
+
const apiReq = {
|
|
47
|
+
pathname,
|
|
48
|
+
query,
|
|
49
|
+
params,
|
|
50
|
+
// Parsing of cookies
|
|
51
|
+
cookies: getCookieParser(req)
|
|
52
|
+
};
|
|
53
|
+
// Parsing of body
|
|
54
|
+
if (bodyParser && !apiReq.body) {
|
|
55
|
+
apiReq.body = yield parseBody(req, bodyParser && bodyParser.sizeLimit ? bodyParser.sizeLimit : '1mb');
|
|
56
|
+
}
|
|
57
|
+
const apiRes = {
|
|
58
|
+
status: (statusCode) => sendStatusCode(res, statusCode),
|
|
59
|
+
send: (data) => sendData(req, res, data),
|
|
60
|
+
json: (data) => sendJson(req, res, data),
|
|
61
|
+
redirect: (statusOrUrl, url) => redirect(res, statusOrUrl, url)
|
|
62
|
+
};
|
|
63
|
+
let wasPiped = false;
|
|
64
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
65
|
+
// listen for pipe event and don't show resolve warning
|
|
66
|
+
res.once('pipe', () => (wasPiped = true));
|
|
67
|
+
}
|
|
68
|
+
// Call API route method
|
|
69
|
+
yield resolver(Object.assign(req, apiReq), Object.assign(res, apiRes));
|
|
70
|
+
if (process.env.NODE_ENV !== 'production' &&
|
|
71
|
+
!(res.finished || res.headersSent) &&
|
|
72
|
+
!wasPiped) {
|
|
73
|
+
console.warn(`API resolved without sending a response for ${req.url}, this may result in stalled requests.`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
throw err;
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
exports.apiRouteHandler = apiRouteHandler;
|
|
82
|
+
/**
|
|
83
|
+
* Parse incoming message like `json` or `urlencoded`
|
|
84
|
+
* @param req request object
|
|
85
|
+
*/
|
|
86
|
+
function parseBody(req, limit) {
|
|
87
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
88
|
+
let contentTypeObj;
|
|
89
|
+
try {
|
|
90
|
+
contentTypeObj = contentType.parse(req.headers['content-type'] || 'text/plain');
|
|
91
|
+
}
|
|
92
|
+
catch (_a) {
|
|
93
|
+
contentTypeObj = contentType.parse('text/plain');
|
|
94
|
+
}
|
|
95
|
+
const { type, parameters } = contentTypeObj;
|
|
96
|
+
const encoding = (parameters.charset && parameters.charset.toLowerCase()) || 'utf-8';
|
|
97
|
+
let buffer;
|
|
98
|
+
try {
|
|
99
|
+
buffer = yield getRawBody(req, { encoding, limit });
|
|
100
|
+
}
|
|
101
|
+
catch (e) {
|
|
102
|
+
if (e.type === 'entity.too.large') {
|
|
103
|
+
throw new ApiError(413, `Body exceeded ${limit} limit`);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
throw new ApiError(400, 'Invalid body');
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
const body = buffer.toString();
|
|
110
|
+
if (type === 'application/json' || type === 'application/ld+json') {
|
|
111
|
+
return parseJson(body);
|
|
112
|
+
}
|
|
113
|
+
else if (type === 'application/x-www-form-urlencoded') {
|
|
114
|
+
return querystring.decode(body);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
return body;
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
exports.parseBody = parseBody;
|
|
122
|
+
/**
|
|
123
|
+
* Parse `JSON` and handles invalid `JSON` strings
|
|
124
|
+
* @param str `JSON` string
|
|
125
|
+
*/
|
|
126
|
+
function parseJson(str) {
|
|
127
|
+
if (str.length === 0) {
|
|
128
|
+
// special-case empty json body, as it's a common client-side mistake
|
|
129
|
+
return {};
|
|
130
|
+
}
|
|
131
|
+
try {
|
|
132
|
+
return JSON.parse(str);
|
|
133
|
+
}
|
|
134
|
+
catch (e) {
|
|
135
|
+
throw new ApiError(400, 'Invalid JSON');
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Parse cookies from `req` header
|
|
140
|
+
* @param req request object
|
|
141
|
+
*/
|
|
142
|
+
function getCookieParser(req) {
|
|
143
|
+
const header = req.headers.cookie;
|
|
144
|
+
if (!header) {
|
|
145
|
+
return {};
|
|
146
|
+
}
|
|
147
|
+
return cookie.parse(Array.isArray(header) ? header.join(';') : header);
|
|
148
|
+
}
|
|
149
|
+
exports.getCookieParser = getCookieParser;
|
|
150
|
+
/**
|
|
151
|
+
*
|
|
152
|
+
* @param res ServerResponse object
|
|
153
|
+
* @param statusCode `HTTP` status code of response
|
|
154
|
+
*/
|
|
155
|
+
function sendStatusCode(res, statusCode) {
|
|
156
|
+
res.statusCode = statusCode;
|
|
157
|
+
return res;
|
|
158
|
+
}
|
|
159
|
+
exports.sendStatusCode = sendStatusCode;
|
|
160
|
+
/**
|
|
161
|
+
*
|
|
162
|
+
* @param res response object
|
|
163
|
+
* @param [statusOrUrl] `HTTP` status code of redirect
|
|
164
|
+
* @param url URL of redirect
|
|
165
|
+
*/
|
|
166
|
+
function redirect(res, statusOrUrl, url) {
|
|
167
|
+
if (typeof statusOrUrl === 'string') {
|
|
168
|
+
url = statusOrUrl;
|
|
169
|
+
statusOrUrl = 307;
|
|
170
|
+
}
|
|
171
|
+
if (typeof statusOrUrl !== 'number' || typeof url !== 'string') {
|
|
172
|
+
throw new Error(`Invalid redirect arguments. Please use a single argument URL, e.g. res.redirect('/destination') or use a status code and URL, e.g. res.redirect(307, '/destination').`);
|
|
173
|
+
}
|
|
174
|
+
res.writeHead(statusOrUrl, { Location: url });
|
|
175
|
+
res.write('');
|
|
176
|
+
res.end();
|
|
177
|
+
return res;
|
|
178
|
+
}
|
|
179
|
+
exports.redirect = redirect;
|
|
180
|
+
/**
|
|
181
|
+
* Send `any` body to response
|
|
182
|
+
* @param req request object
|
|
183
|
+
* @param res response object
|
|
184
|
+
* @param body of response
|
|
185
|
+
*/
|
|
186
|
+
function sendData(req, res, body) {
|
|
187
|
+
if (body === null || body === undefined) {
|
|
188
|
+
res.end();
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
const contentType = res.getHeader('Content-Type');
|
|
192
|
+
if (body instanceof stream_1.Stream) {
|
|
193
|
+
if (!contentType) {
|
|
194
|
+
res.setHeader('Content-Type', 'application/octet-stream');
|
|
195
|
+
}
|
|
196
|
+
body.pipe(res);
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
const isJSONLike = ['object', 'number', 'boolean'].includes(typeof body);
|
|
200
|
+
const stringifiedBody = isJSONLike ? JSON.stringify(body) : body;
|
|
201
|
+
if (Buffer.isBuffer(body)) {
|
|
202
|
+
if (!contentType) {
|
|
203
|
+
res.setHeader('Content-Type', 'application/octet-stream');
|
|
204
|
+
}
|
|
205
|
+
res.setHeader('Content-Length', body.length);
|
|
206
|
+
res.end(body);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
if (isJSONLike) {
|
|
210
|
+
res.setHeader('Content-Type', 'application/json; charset=utf-8');
|
|
211
|
+
}
|
|
212
|
+
res.setHeader('Content-Length', Buffer.byteLength(stringifiedBody));
|
|
213
|
+
res.end(stringifiedBody);
|
|
214
|
+
}
|
|
215
|
+
exports.sendData = sendData;
|
|
216
|
+
/**
|
|
217
|
+
* Send `JSON` object
|
|
218
|
+
* @param res response object
|
|
219
|
+
* @param jsonBody of data
|
|
220
|
+
*/
|
|
221
|
+
function sendJson(req, res, jsonBody) {
|
|
222
|
+
// Set header to application/json
|
|
223
|
+
res.setHeader('Content-Type', 'application/json; charset=utf-8');
|
|
224
|
+
// Use send to handle request
|
|
225
|
+
return sendData(req, res, jsonBody);
|
|
226
|
+
}
|
|
227
|
+
exports.sendJson = sendJson;
|
|
228
|
+
/**
|
|
229
|
+
* Custom error class
|
|
230
|
+
*/
|
|
231
|
+
class ApiError extends Error {
|
|
232
|
+
constructor(statusCode, message) {
|
|
233
|
+
super(message);
|
|
234
|
+
this.statusCode = statusCode;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
exports.ApiError = ApiError;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { IApiRouteConfig } from '@shuvi/platform-shared/node';
|
|
2
|
+
export { IApiRouteConfig };
|
|
3
|
+
export declare function serializeApiRoutes(apiRoutes: IApiRouteConfig[]): string;
|
|
4
|
+
export declare function normalizeApiRoutes(apiRoutes: IApiRouteConfig[], option: {
|
|
5
|
+
apisDir: string;
|
|
6
|
+
}): IApiRouteConfig[];
|
|
7
|
+
export declare const generateRoutesContent: (apiRoutes: IApiRouteConfig[], apisDir: string) => string;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateRoutesContent = exports.normalizeApiRoutes = exports.serializeApiRoutes = void 0;
|
|
4
|
+
const file_1 = require("@shuvi/utils/lib/file");
|
|
5
|
+
function serializeApiRoutes(apiRoutes) {
|
|
6
|
+
let res = '';
|
|
7
|
+
for (let index = 0; index < apiRoutes.length; index++) {
|
|
8
|
+
const { api, path } = apiRoutes[index];
|
|
9
|
+
let strRoute = `\n{
|
|
10
|
+
path: "${path}",
|
|
11
|
+
${api ? `api: require("${api}"),` : ''}
|
|
12
|
+
},`;
|
|
13
|
+
res += strRoute;
|
|
14
|
+
}
|
|
15
|
+
return `[${res}]`;
|
|
16
|
+
}
|
|
17
|
+
exports.serializeApiRoutes = serializeApiRoutes;
|
|
18
|
+
function normalizeApiRoutes(apiRoutes, option) {
|
|
19
|
+
const res = [];
|
|
20
|
+
for (let index = 0; index < apiRoutes.length; index++) {
|
|
21
|
+
const apiRoute = Object.assign({}, apiRoutes[index]);
|
|
22
|
+
if (apiRoute.api) {
|
|
23
|
+
apiRoute.api = (0, file_1.normalizePath)(apiRoute.api, option.apisDir);
|
|
24
|
+
}
|
|
25
|
+
res.push(apiRoute);
|
|
26
|
+
}
|
|
27
|
+
return res;
|
|
28
|
+
}
|
|
29
|
+
exports.normalizeApiRoutes = normalizeApiRoutes;
|
|
30
|
+
const generateRoutesContent = (apiRoutes, apisDir) => {
|
|
31
|
+
const normalizedRoutes = normalizeApiRoutes(apiRoutes, { apisDir });
|
|
32
|
+
const serialized = serializeApiRoutes(normalizedRoutes);
|
|
33
|
+
return `export default ${serialized}`;
|
|
34
|
+
};
|
|
35
|
+
exports.generateRoutesContent = generateRoutesContent;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateRoutesContent = exports.middleware = void 0;
|
|
4
|
+
var middleware_1 = require("./middleware");
|
|
5
|
+
Object.defineProperty(exports, "middleware", { enumerable: true, get: function () { return middleware_1.middleware; } });
|
|
6
|
+
var apiRoutes_1 = require("./apiRoutes");
|
|
7
|
+
Object.defineProperty(exports, "generateRoutesContent", { enumerable: true, get: function () { return apiRoutes_1.generateRoutesContent; } });
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.middleware = void 0;
|
|
13
|
+
const router_1 = require("@shuvi/router");
|
|
14
|
+
const resources_1 = require("@shuvi/service/lib/resources");
|
|
15
|
+
const apiRouteHandler_1 = require("./apiRouteHandler");
|
|
16
|
+
function middleware(_ctx) {
|
|
17
|
+
return function (req, res, next) {
|
|
18
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
19
|
+
const { apiRoutes } = resources_1.server;
|
|
20
|
+
let tempApiModule;
|
|
21
|
+
for (const { path, api } of apiRoutes) {
|
|
22
|
+
const match = (0, router_1.matchPathname)(path, req.pathname);
|
|
23
|
+
if (match) {
|
|
24
|
+
req.params = match.params;
|
|
25
|
+
tempApiModule = api;
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (tempApiModule) {
|
|
30
|
+
try {
|
|
31
|
+
const { config, default: resolver } = tempApiModule;
|
|
32
|
+
yield (0, apiRouteHandler_1.apiRouteHandler)(req, res, resolver, (config === null || config === void 0 ? void 0 : config.api) || { bodyParser: true });
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
next(error);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
next();
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
exports.middleware = middleware;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { IPageRouteConfig, IMiddlewareRouteConfig } from '@shuvi/platform-shared/shared';
|
|
2
|
+
export declare const addRoutes: import("@shuvi/hook").AsyncParallelHook<void, void, IPageRouteConfig[]>;
|
|
3
|
+
export declare const addMiddlewareRoutes: import("@shuvi/hook").AsyncParallelHook<void, void, IMiddlewareRouteConfig[]>;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.addMiddlewareRoutes = exports.addRoutes = void 0;
|
|
4
|
+
const hook_1 = require("@shuvi/hook");
|
|
5
|
+
exports.addRoutes = (0, hook_1.createAsyncParallelHook)();
|
|
6
|
+
exports.addMiddlewareRoutes = (0, hook_1.createAsyncParallelHook)();
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { getRoutes } from './page';
|
|
2
|
+
import { middleware as getMiddlewareMiddleware } from './middleware';
|
|
3
|
+
import { IApiRequestHandler, middleware as getApiMiddleware } from './api';
|
|
4
|
+
export { IApiRequestHandler, getRoutes, getMiddlewareMiddleware, getApiMiddleware };
|
|
5
|
+
declare const _default: {
|
|
6
|
+
core: import("@shuvi/platform-shared/shared").IPluginInstance<{
|
|
7
|
+
extendConfig: import("@shuvi/hook").SyncWaterfallHook<import("@shuvi/service").Config, void>;
|
|
8
|
+
afterInit: import("@shuvi/hook").AsyncParallelHook<void, void, void>;
|
|
9
|
+
afterBuild: import("@shuvi/hook").AsyncParallelHook<void, void, void>;
|
|
10
|
+
afterDestroy: import("@shuvi/hook").AsyncParallelHook<void, void, void>;
|
|
11
|
+
afterBundlerDone: import("@shuvi/hook").AsyncParallelHook<import("@shuvi/service/lib/core/lifecycleTypes").BundlerDoneExtra, void, void>;
|
|
12
|
+
afterBundlerTargetDone: import("@shuvi/hook").AsyncParallelHook<import("@shuvi/service/lib/core/lifecycleTypes").BundlerTargetDoneExtra, void, void>;
|
|
13
|
+
configWebpack: import("@shuvi/hook").AsyncSeriesWaterfallHook<import("@shuvi/service/lib/core/lifecycleTypes").WebpackChainType, import("@shuvi/service/lib/core/lifecycleTypes").ConfigWebpackAssistant>;
|
|
14
|
+
addExtraTarget: import("@shuvi/hook").AsyncParallelHook<import("@shuvi/service/lib/core/lifecycleTypes").ExtraTargetAssistant, void, import("@shuvi/service/lib/core/lifecycleTypes").TargetChain>;
|
|
15
|
+
addResource: import("@shuvi/hook").AsyncParallelHook<void, void, import("@shuvi/service/lib/core/lifecycleTypes").Resources | import("@shuvi/service/lib/core/lifecycleTypes").Resources[]>;
|
|
16
|
+
addRuntimeFile: import("@shuvi/hook").AsyncParallelHook<void, import("@shuvi/service/lib/core/lifecycleTypes").AddRuntimeFileUtils, import("@shuvi/service/lib/project/index").FileOptions<any, any> | import("@shuvi/service/lib/project/index").FileOptions<any, any>[]>;
|
|
17
|
+
addRuntimeService: import("@shuvi/hook").AsyncParallelHook<void, void, import("@shuvi/service/lib/core/lifecycleTypes").RuntimeService | import("@shuvi/service/lib/core/lifecycleTypes").RuntimeService[]>;
|
|
18
|
+
} & import("@shuvi/service/lib/core/apiTypes").CustomCorePluginHooks, import("@shuvi/service").IPluginContext>;
|
|
19
|
+
};
|
|
20
|
+
export default _default;
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
28
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
29
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
30
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
31
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
|
+
exports.getApiMiddleware = exports.getMiddlewareMiddleware = exports.getRoutes = void 0;
|
|
36
|
+
const fs = __importStar(require("fs"));
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const build_loaders_1 = require("@shuvi/toolpack/lib/utils/build-loaders");
|
|
39
|
+
const service_1 = require("@shuvi/service");
|
|
40
|
+
const node_1 = require("@shuvi/platform-shared/node");
|
|
41
|
+
const lib_1 = require("../html-render/lib");
|
|
42
|
+
const hooks_1 = require("./hooks");
|
|
43
|
+
const page_1 = require("./page");
|
|
44
|
+
Object.defineProperty(exports, "getRoutes", { enumerable: true, get: function () { return page_1.getRoutes; } });
|
|
45
|
+
const middleware_1 = require("./middleware");
|
|
46
|
+
Object.defineProperty(exports, "getMiddlewareMiddleware", { enumerable: true, get: function () { return middleware_1.middleware; } });
|
|
47
|
+
const api_1 = require("./api");
|
|
48
|
+
Object.defineProperty(exports, "getApiMiddleware", { enumerable: true, get: function () { return api_1.middleware; } });
|
|
49
|
+
const plugin = (0, service_1.createPlugin)({
|
|
50
|
+
setup: ({ addHooks }) => {
|
|
51
|
+
addHooks({ addRoutes: hooks_1.addRoutes, addMiddlewareRoutes: hooks_1.addMiddlewareRoutes });
|
|
52
|
+
},
|
|
53
|
+
addRuntimeFile: ({ defineFile }, context) => __awaiter(void 0, void 0, void 0, function* () {
|
|
54
|
+
const { config: { routes: pageRoutes, middlewareRoutes, apiRoutes, conventionRoutes }, paths, pluginRunner, phase } = context;
|
|
55
|
+
const isBuildPhase = phase === 'PHASE_PRODUCTION_BUILD';
|
|
56
|
+
const pageRoutesFile = defineFile({
|
|
57
|
+
name: 'routes.js',
|
|
58
|
+
content: () => __awaiter(void 0, void 0, void 0, function* () {
|
|
59
|
+
let routes;
|
|
60
|
+
const hasConfigRoutes = Array.isArray(pageRoutes);
|
|
61
|
+
if (hasConfigRoutes) {
|
|
62
|
+
routes = pageRoutes;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
const { routes: _routes, warnings } = yield (0, node_1.getPageRoutes)(paths.routesDir, conventionRoutes.exclude);
|
|
66
|
+
if (isBuildPhase) {
|
|
67
|
+
warnings.forEach(warning => {
|
|
68
|
+
console.warn(warning.msg);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
routes = _routes;
|
|
72
|
+
}
|
|
73
|
+
const extraRoutes = (yield pluginRunner.addRoutes()).flat();
|
|
74
|
+
const normalizedRoutes = (0, page_1.normalizeRoutes)(
|
|
75
|
+
// user routes come later
|
|
76
|
+
extraRoutes.concat(routes), paths.routesDir);
|
|
77
|
+
(0, page_1.setRoutes)(normalizedRoutes);
|
|
78
|
+
return (0, page_1.generateRoutesContent)(normalizedRoutes);
|
|
79
|
+
}),
|
|
80
|
+
dependencies: [paths.routesDir]
|
|
81
|
+
});
|
|
82
|
+
const apiRoutesFile = defineFile({
|
|
83
|
+
name: 'apiRoutes.js',
|
|
84
|
+
content: () => __awaiter(void 0, void 0, void 0, function* () {
|
|
85
|
+
let routes;
|
|
86
|
+
const hasConfigRoutes = Array.isArray(apiRoutes);
|
|
87
|
+
if (hasConfigRoutes) {
|
|
88
|
+
routes = apiRoutes;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
const { routes: _routes, warnings } = yield (0, node_1.getApiRoutes)(paths.routesDir, conventionRoutes.exclude);
|
|
92
|
+
if (isBuildPhase) {
|
|
93
|
+
warnings.forEach(warning => {
|
|
94
|
+
console.warn(warning);
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
routes = _routes;
|
|
98
|
+
}
|
|
99
|
+
return (0, api_1.generateRoutesContent)(routes, paths.routesDir);
|
|
100
|
+
}),
|
|
101
|
+
dependencies: [paths.routesDir]
|
|
102
|
+
});
|
|
103
|
+
const middlewareRoutesFile = defineFile({
|
|
104
|
+
name: 'middlewareRoutes.js',
|
|
105
|
+
content: () => __awaiter(void 0, void 0, void 0, function* () {
|
|
106
|
+
let routes;
|
|
107
|
+
const hasConfigRoutes = Array.isArray(middlewareRoutes);
|
|
108
|
+
if (hasConfigRoutes) {
|
|
109
|
+
routes = middlewareRoutes;
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
const { routes: _routes, warnings } = yield (0, node_1.getMiddlewareRoutes)(paths.routesDir, conventionRoutes.exclude);
|
|
113
|
+
if (isBuildPhase) {
|
|
114
|
+
warnings.forEach(warning => {
|
|
115
|
+
console.warn(warning);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
routes = _routes;
|
|
119
|
+
}
|
|
120
|
+
const extraRoutes = (yield pluginRunner.addMiddlewareRoutes()).flat();
|
|
121
|
+
return (0, middleware_1.generateRoutesContent)(extraRoutes.concat(routes), {
|
|
122
|
+
baseDir: paths.routesDir
|
|
123
|
+
});
|
|
124
|
+
}),
|
|
125
|
+
dependencies: [paths.routesDir]
|
|
126
|
+
});
|
|
127
|
+
const loadersFile = defineFile({
|
|
128
|
+
name: 'loaders.js',
|
|
129
|
+
content: () => __awaiter(void 0, void 0, void 0, function* () {
|
|
130
|
+
const routes = (0, page_1.getRoutes)();
|
|
131
|
+
const loaders = {};
|
|
132
|
+
const traverseRoutes = (routes) => {
|
|
133
|
+
routes.forEach(r => {
|
|
134
|
+
const { component, id, children } = r;
|
|
135
|
+
if (component && id) {
|
|
136
|
+
const hasLoader = (0, lib_1.ifComponentHasLoader)(component);
|
|
137
|
+
if (hasLoader) {
|
|
138
|
+
loaders[id] = component;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (children) {
|
|
142
|
+
traverseRoutes(children);
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
};
|
|
146
|
+
traverseRoutes(routes);
|
|
147
|
+
let imports = '';
|
|
148
|
+
let exports = '';
|
|
149
|
+
Object.entries(loaders).forEach((loader, index) => {
|
|
150
|
+
const [id, component] = loader;
|
|
151
|
+
imports += `import { loader as loader_${index} } from '${component}'\n`;
|
|
152
|
+
exports += `'${id}': loader_${index},\n`;
|
|
153
|
+
});
|
|
154
|
+
return `${imports} export default {\n ${exports}\n}`;
|
|
155
|
+
}),
|
|
156
|
+
dependencies: [pageRoutesFile]
|
|
157
|
+
});
|
|
158
|
+
const loadersFileName = path.join(context.paths.appDir, 'files', 'loaders.js');
|
|
159
|
+
const pageLoadersFile = defineFile({
|
|
160
|
+
name: 'page-loaders.js',
|
|
161
|
+
content: () => __awaiter(void 0, void 0, void 0, function* () {
|
|
162
|
+
if (fs.existsSync(loadersFileName)) {
|
|
163
|
+
return yield (0, build_loaders_1.buildToString)(loadersFileName);
|
|
164
|
+
}
|
|
165
|
+
return '';
|
|
166
|
+
}),
|
|
167
|
+
dependencies: [loadersFile]
|
|
168
|
+
});
|
|
169
|
+
return [
|
|
170
|
+
pageRoutesFile,
|
|
171
|
+
apiRoutesFile,
|
|
172
|
+
middlewareRoutesFile,
|
|
173
|
+
loadersFile,
|
|
174
|
+
pageLoadersFile
|
|
175
|
+
];
|
|
176
|
+
})
|
|
177
|
+
});
|
|
178
|
+
exports.default = {
|
|
179
|
+
core: plugin
|
|
180
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateRoutesContent = exports.middleware = void 0;
|
|
4
|
+
var middleware_1 = require("./middleware");
|
|
5
|
+
Object.defineProperty(exports, "middleware", { enumerable: true, get: function () { return middleware_1.middleware; } });
|
|
6
|
+
var routes_1 = require("./routes");
|
|
7
|
+
Object.defineProperty(exports, "generateRoutesContent", { enumerable: true, get: function () { return routes_1.generateRoutesContent; } });
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.middleware = void 0;
|
|
13
|
+
const router_1 = require("@shuvi/router");
|
|
14
|
+
const resources_1 = require("@shuvi/service/lib/resources");
|
|
15
|
+
function middleware(_api) {
|
|
16
|
+
return function (req, res, next) {
|
|
17
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
18
|
+
const { middlewareRoutes = [] } = resources_1.server;
|
|
19
|
+
// match path for get middlewares
|
|
20
|
+
let middlewares = [];
|
|
21
|
+
for (let i = 0; i < middlewareRoutes.length; i++) {
|
|
22
|
+
const middlewareRoute = middlewareRoutes[i];
|
|
23
|
+
const match = (0, router_1.matchPathname)(middlewareRoute.path, req.pathname);
|
|
24
|
+
if (match) {
|
|
25
|
+
req.params = match.params;
|
|
26
|
+
middlewares.push(middlewareRoutes[i].middleware.default);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// run middlewares
|
|
30
|
+
let i = 0;
|
|
31
|
+
const runNext = () => runMiddleware(middlewares[++i]);
|
|
32
|
+
const runMiddleware = (middleware) => __awaiter(this, void 0, void 0, function* () {
|
|
33
|
+
if (i === middlewares.length) {
|
|
34
|
+
return next();
|
|
35
|
+
}
|
|
36
|
+
yield middleware(req, res, runNext);
|
|
37
|
+
});
|
|
38
|
+
return yield runMiddleware(middlewares[i]);
|
|
39
|
+
});
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
exports.middleware = middleware;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { IMiddlewareRouteConfig } from '@shuvi/platform-shared/node';
|
|
2
|
+
export { IMiddlewareRouteConfig };
|
|
3
|
+
export declare function normalizeMiddlewareRoutes(middlewareRoutes: IMiddlewareRouteConfig[], option: {
|
|
4
|
+
baseDir: string;
|
|
5
|
+
}): IMiddlewareRouteConfig[];
|
|
6
|
+
export declare function serializeMiddlewareRoutes(middlewareRoutes: IMiddlewareRouteConfig[]): string;
|
|
7
|
+
export declare function generateRoutesContent(rawRoutes: IMiddlewareRouteConfig[], { baseDir }: {
|
|
8
|
+
baseDir: string;
|
|
9
|
+
}): string;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateRoutesContent = exports.serializeMiddlewareRoutes = exports.normalizeMiddlewareRoutes = void 0;
|
|
4
|
+
const file_1 = require("@shuvi/utils/lib/file");
|
|
5
|
+
function normalizeMiddlewareRoutes(middlewareRoutes, option) {
|
|
6
|
+
const res = [];
|
|
7
|
+
for (let index = 0; index < middlewareRoutes.length; index++) {
|
|
8
|
+
const middlewareRoute = Object.assign({}, middlewareRoutes[index]);
|
|
9
|
+
if (middlewareRoute.middleware) {
|
|
10
|
+
middlewareRoute.middleware = (0, file_1.normalizePath)(middlewareRoute.middleware, option.baseDir);
|
|
11
|
+
}
|
|
12
|
+
res.push(middlewareRoute);
|
|
13
|
+
}
|
|
14
|
+
return res;
|
|
15
|
+
}
|
|
16
|
+
exports.normalizeMiddlewareRoutes = normalizeMiddlewareRoutes;
|
|
17
|
+
function serializeMiddlewareRoutes(middlewareRoutes) {
|
|
18
|
+
let res = '';
|
|
19
|
+
for (let index = 0; index < middlewareRoutes.length; index++) {
|
|
20
|
+
const { middleware, path } = middlewareRoutes[index];
|
|
21
|
+
let strRoute = `\n{
|
|
22
|
+
path: "${path}",
|
|
23
|
+
${middleware ? `middleware: require("${middleware}"),` : ''}
|
|
24
|
+
},`;
|
|
25
|
+
res += strRoute;
|
|
26
|
+
}
|
|
27
|
+
return `[${res}]`;
|
|
28
|
+
}
|
|
29
|
+
exports.serializeMiddlewareRoutes = serializeMiddlewareRoutes;
|
|
30
|
+
function generateRoutesContent(rawRoutes, { baseDir }) {
|
|
31
|
+
const serialized = serializeMiddlewareRoutes(normalizeMiddlewareRoutes(rawRoutes, { baseDir }));
|
|
32
|
+
return `export default ${serialized}`;
|
|
33
|
+
}
|
|
34
|
+
exports.generateRoutesContent = generateRoutesContent;
|