@shuvi/platform-web 1.0.0-rc.3 → 1.0.0-rc.6

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.
Files changed (108) hide show
  1. package/esm/shared/appTypes.d.ts +5 -3
  2. package/esm/shared/renderTypes.d.ts +6 -5
  3. package/esm/shared/routeTypes.d.ts +4 -9
  4. package/esm/shuvi-app/app/client.d.ts +2 -0
  5. package/esm/shuvi-app/app/client.js +13 -17
  6. package/esm/shuvi-app/app/server.js +10 -9
  7. package/esm/shuvi-app/dev/eventsource.d.ts +1 -0
  8. package/esm/shuvi-app/dev/eventsource.js +60 -0
  9. package/esm/shuvi-app/dev/hotDevClient.d.ts +32 -0
  10. package/esm/shuvi-app/dev/hotDevClient.js +327 -0
  11. package/esm/shuvi-app/dev/index.d.ts +3 -0
  12. package/esm/shuvi-app/dev/index.js +27 -0
  13. package/esm/shuvi-app/dev/websocket.d.ts +16 -0
  14. package/esm/shuvi-app/dev/websocket.js +61 -0
  15. package/esm/shuvi-app/entry/client/app.d.ts +2 -1
  16. package/esm/shuvi-app/entry/client/app.js +2 -2
  17. package/esm/shuvi-app/entry/client/run.dev.js +4 -4
  18. package/esm/shuvi-app/entry/server/index.d.ts +5 -4
  19. package/esm/shuvi-app/entry/server/index.js +5 -4
  20. package/esm/shuvi-app/helper/serializeServerError.d.ts +2 -0
  21. package/esm/shuvi-app/helper/serializeServerError.js +21 -0
  22. package/esm/shuvi-app/react/AppContainer.d.ts +2 -3
  23. package/esm/shuvi-app/react/AppContainer.jsx +3 -4
  24. package/esm/shuvi-app/react/getRoutes.d.ts +2 -2
  25. package/esm/shuvi-app/react/getRoutes.js +9 -8
  26. package/esm/shuvi-app/react/{redox-react → model}/RedoxWrapper.d.ts +3 -3
  27. package/esm/shuvi-app/react/{redox-react → model}/RedoxWrapper.jsx +3 -3
  28. package/esm/shuvi-app/react/model/runtime.d.ts +8 -0
  29. package/esm/shuvi-app/react/{redox-react → model}/runtime.js +8 -3
  30. package/esm/shuvi-app/react/store.d.ts +5 -0
  31. package/esm/shuvi-app/react/store.js +3 -0
  32. package/esm/shuvi-app/react/types.d.ts +0 -7
  33. package/esm/shuvi-app/react/useLoaderData.js +9 -20
  34. package/esm/shuvi-app/react/view/ReactView.client.jsx +25 -4
  35. package/esm/shuvi-app/react/view/ReactView.server.jsx +17 -14
  36. package/esm/shuvi-app/shuvi-runtime-index.d.ts +3 -3
  37. package/esm/shuvi-app/shuvi-runtime-index.js +1 -1
  38. package/lib/node/features/custom-server/index.d.ts +1 -1
  39. package/lib/node/features/custom-server/server.d.ts +1 -1
  40. package/lib/node/features/filesystem-routes/api/apiRouteHandler.d.ts +7 -7
  41. package/lib/node/features/filesystem-routes/api/apiRouteHandler.js +0 -4
  42. package/lib/node/features/filesystem-routes/api/middleware.d.ts +2 -2
  43. package/lib/node/features/filesystem-routes/index.d.ts +1 -13
  44. package/lib/node/features/filesystem-routes/index.js +20 -48
  45. package/lib/node/features/filesystem-routes/middleware/middleware.d.ts +2 -2
  46. package/lib/node/features/filesystem-routes/page/routes.d.ts +2 -2
  47. package/lib/node/features/filesystem-routes/page/routes.js +29 -11
  48. package/lib/node/features/html-render/index.d.ts +3 -18
  49. package/lib/node/features/html-render/index.js +87 -16
  50. package/lib/node/features/{main → html-render/lib}/buildHtml.d.ts +0 -0
  51. package/lib/node/features/{main → html-render/lib}/buildHtml.js +0 -0
  52. package/lib/node/features/html-render/lib/generateFilesByRoutId.d.ts +2 -2
  53. package/lib/node/features/html-render/lib/generateFilesByRoutId.js +3 -3
  54. package/lib/node/features/{main → html-render/lib}/generateResource.d.ts +0 -0
  55. package/lib/node/features/{main → html-render/lib}/generateResource.js +0 -0
  56. package/lib/node/features/html-render/lib/getPageMiddleware.d.ts +2 -2
  57. package/lib/node/features/html-render/lib/index.d.ts +0 -1
  58. package/lib/node/features/html-render/lib/index.js +1 -3
  59. package/lib/node/features/html-render/lib/renderToHTML.d.ts +2 -2
  60. package/lib/node/features/html-render/lib/renderToHTML.js +7 -48
  61. package/lib/node/features/html-render/lib/renderer/base.d.ts +6 -6
  62. package/lib/node/features/html-render/lib/renderer/base.js +5 -5
  63. package/lib/node/features/html-render/lib/renderer/index.d.ts +5 -4
  64. package/lib/node/features/html-render/lib/renderer/index.js +69 -6
  65. package/lib/node/features/html-render/lib/renderer/spa.d.ts +2 -2
  66. package/lib/node/features/html-render/lib/renderer/spa.js +4 -6
  67. package/lib/node/features/html-render/lib/renderer/ssr.d.ts +2 -2
  68. package/lib/node/features/html-render/lib/renderer/ssr.js +5 -6
  69. package/lib/node/features/html-render/lib/renderer/types.d.ts +8 -5
  70. package/lib/node/features/html-render/server.d.ts +1 -1
  71. package/lib/node/features/index.d.ts +3 -31
  72. package/lib/node/features/index.js +6 -7
  73. package/lib/node/features/model/index.d.ts +1 -13
  74. package/lib/node/features/model/runtime.d.ts +3 -8
  75. package/lib/node/features/model/runtime.js +13 -17
  76. package/lib/node/features/model/server.js +2 -3
  77. package/lib/node/features/model/shuvi-app.d.ts +2 -2
  78. package/lib/node/features/on-demand-compile-page/index.d.ts +3 -13
  79. package/lib/node/features/on-demand-compile-page/index.js +4 -1
  80. package/lib/node/features/on-demand-compile-page/onDemandRouteManager.d.ts +3 -3
  81. package/lib/node/features/on-demand-compile-page/onDemandRouteManager.js +2 -4
  82. package/lib/node/index.js +1 -3
  83. package/lib/node/paths.js +0 -2
  84. package/lib/node/shuvi-runtime-server.d.ts +18 -0
  85. package/lib/node/shuvi-runtime-server.js +2 -0
  86. package/lib/node/shuvi-type-extensions-node.d.ts +2 -6
  87. package/lib/node/targets/react/bundler/index.d.ts +1 -13
  88. package/lib/node/targets/react/bundler/index.js +5 -0
  89. package/lib/node/targets/react/index.d.ts +2 -26
  90. package/lib/node/targets/react/index.js +2 -2
  91. package/lib/node/targets/react/model/index.d.ts +6 -0
  92. package/lib/node/targets/react/{redox-react → model}/index.js +7 -6
  93. package/lib/shared/appTypes.d.ts +5 -3
  94. package/lib/shared/renderTypes.d.ts +6 -5
  95. package/lib/shared/routeTypes.d.ts +4 -9
  96. package/package.json +20 -15
  97. package/shuvi-env.d.ts +10 -0
  98. package/shuvi-image.d.ts +54 -0
  99. package/shuvi-type-extensions-node.js +1 -0
  100. package/shuvi-type-extensions-runtime.d.ts +2 -2
  101. package/esm/shuvi-app/dev/webpackHotDevClient.d.ts +0 -5
  102. package/esm/shuvi-app/dev/webpackHotDevClient.js +0 -34
  103. package/esm/shuvi-app/react/redox-react/runtime.d.ts +0 -2
  104. package/esm/shuvi-app/shuvi-runtime-server.d.ts +0 -6
  105. package/esm/shuvi-app/shuvi-runtime-server.js +0 -1
  106. package/lib/node/features/main/index.d.ts +0 -3
  107. package/lib/node/features/main/index.js +0 -82
  108. package/lib/node/targets/react/redox-react/index.d.ts +0 -18
@@ -1,2 +1,2 @@
1
- import { IServerPluginContext, IRequestHandlerWithNext } from '@shuvi/service';
2
- export declare function middleware(_ctx: IServerPluginContext): IRequestHandlerWithNext;
1
+ import { IServerPluginContext, ShuviRequestHandler } from '@shuvi/service';
2
+ export declare function middleware(_ctx: IServerPluginContext): ShuviRequestHandler;
@@ -3,18 +3,6 @@ import { middleware as getMiddlewareMiddleware } from './middleware';
3
3
  import { IApiRequestHandler, middleware as getApiMiddleware } from './api';
4
4
  export { IApiRequestHandler, getRoutes, getMiddlewareMiddleware, getApiMiddleware };
5
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>;
6
+ core: import("@shuvi/platform-shared/shared").IPluginInstance<import("@shuvi/service/lib/core/plugin").PluginHooks, import("@shuvi/service").IPluginContext>;
19
7
  };
20
8
  export default _default;
@@ -1,27 +1,4 @@
1
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
2
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
3
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
4
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -33,9 +10,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
33
10
  };
34
11
  Object.defineProperty(exports, "__esModule", { value: true });
35
12
  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
13
  const service_1 = require("@shuvi/service");
40
14
  const node_1 = require("@shuvi/platform-shared/node");
41
15
  const lib_1 = require("../html-render/lib");
@@ -50,9 +24,18 @@ const plugin = (0, service_1.createPlugin)({
50
24
  setup: ({ addHooks }) => {
51
25
  addHooks({ addRoutes: hooks_1.addRoutes, addMiddlewareRoutes: hooks_1.addMiddlewareRoutes });
52
26
  },
53
- addRuntimeFile: ({ defineFile }, context) => __awaiter(void 0, void 0, void 0, function* () {
27
+ addRuntimeFile: ({ defineFile, getContent }, context) => __awaiter(void 0, void 0, void 0, function* () {
54
28
  const { config: { routes: pageRoutes, middlewareRoutes, apiRoutes, conventionRoutes }, paths, pluginRunner, phase } = context;
55
29
  const isBuildPhase = phase === 'PHASE_PRODUCTION_BUILD';
30
+ const rawRoutes = defineFile({
31
+ name: 'virtual-raw-routes.js',
32
+ virtual: true,
33
+ content: () => __awaiter(void 0, void 0, void 0, function* () {
34
+ const rawRoutes = yield (0, node_1.getRawRoutesFromDir)(paths.routesDir, conventionRoutes.exclude);
35
+ return rawRoutes;
36
+ }),
37
+ dependencies: [paths.routesDir]
38
+ });
56
39
  const pageRoutesFile = defineFile({
57
40
  name: 'routes.js',
58
41
  content: () => __awaiter(void 0, void 0, void 0, function* () {
@@ -62,7 +45,7 @@ const plugin = (0, service_1.createPlugin)({
62
45
  routes = pageRoutes;
63
46
  }
64
47
  else {
65
- const { routes: _routes, warnings } = yield (0, node_1.getPageRoutes)(paths.routesDir, conventionRoutes.exclude);
48
+ const { routes: _routes, warnings } = yield (0, node_1.getPageRoutes)(getContent(rawRoutes), conventionRoutes.exclude);
66
49
  if (isBuildPhase) {
67
50
  warnings.forEach(warning => {
68
51
  console.warn(warning.msg);
@@ -77,7 +60,7 @@ const plugin = (0, service_1.createPlugin)({
77
60
  (0, page_1.setRoutes)(normalizedRoutes);
78
61
  return (0, page_1.generateRoutesContent)(normalizedRoutes);
79
62
  }),
80
- dependencies: [paths.routesDir]
63
+ dependencies: [rawRoutes]
81
64
  });
82
65
  const apiRoutesFile = defineFile({
83
66
  name: 'apiRoutes.js',
@@ -88,7 +71,7 @@ const plugin = (0, service_1.createPlugin)({
88
71
  routes = apiRoutes;
89
72
  }
90
73
  else {
91
- const { routes: _routes, warnings } = yield (0, node_1.getApiRoutes)(paths.routesDir, conventionRoutes.exclude);
74
+ const { routes: _routes, warnings } = yield (0, node_1.getApiRoutes)(getContent(rawRoutes), conventionRoutes.exclude);
92
75
  if (isBuildPhase) {
93
76
  warnings.forEach(warning => {
94
77
  console.warn(warning);
@@ -98,7 +81,7 @@ const plugin = (0, service_1.createPlugin)({
98
81
  }
99
82
  return (0, api_1.generateRoutesContent)(routes, paths.routesDir);
100
83
  }),
101
- dependencies: [paths.routesDir]
84
+ dependencies: [rawRoutes]
102
85
  });
103
86
  const middlewareRoutesFile = defineFile({
104
87
  name: 'middlewareRoutes.js',
@@ -109,7 +92,7 @@ const plugin = (0, service_1.createPlugin)({
109
92
  routes = middlewareRoutes;
110
93
  }
111
94
  else {
112
- const { routes: _routes, warnings } = yield (0, node_1.getMiddlewareRoutes)(paths.routesDir, conventionRoutes.exclude);
95
+ const { routes: _routes, warnings } = yield (0, node_1.getMiddlewareRoutes)(getContent(rawRoutes), conventionRoutes.exclude);
113
96
  if (isBuildPhase) {
114
97
  warnings.forEach(warning => {
115
98
  console.warn(warning);
@@ -122,10 +105,10 @@ const plugin = (0, service_1.createPlugin)({
122
105
  baseDir: paths.routesDir
123
106
  });
124
107
  }),
125
- dependencies: [paths.routesDir]
108
+ dependencies: [rawRoutes]
126
109
  });
127
- const loadersFile = defineFile({
128
- name: 'loaders.js',
110
+ const pageLoadersFile = defineFile({
111
+ name: 'page-loaders.js',
129
112
  content: () => __awaiter(void 0, void 0, void 0, function* () {
130
113
  const routes = (0, page_1.getRoutes)();
131
114
  const loaders = {};
@@ -148,29 +131,18 @@ const plugin = (0, service_1.createPlugin)({
148
131
  let exports = '';
149
132
  Object.entries(loaders).forEach((loader, index) => {
150
133
  const [id, component] = loader;
151
- imports += `import { loader as loader_${index} } from '${component}'\n`;
134
+ imports += `import { loader as loader_${index} } from '${component}?keep=loader'\n`;
152
135
  exports += `'${id}': loader_${index},\n`;
153
136
  });
154
137
  return `${imports} export default {\n ${exports}\n}`;
155
138
  }),
156
139
  dependencies: [pageRoutesFile]
157
140
  });
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
141
  return [
142
+ rawRoutes,
170
143
  pageRoutesFile,
171
144
  apiRoutesFile,
172
145
  middlewareRoutesFile,
173
- loadersFile,
174
146
  pageLoadersFile
175
147
  ];
176
148
  })
@@ -1,2 +1,2 @@
1
- import { IServerPluginContext, IRequestHandlerWithNext } from '@shuvi/service';
2
- export declare function middleware(_api: IServerPluginContext): IRequestHandlerWithNext;
1
+ import { IServerPluginContext, ShuviRequestHandler } from '@shuvi/service';
2
+ export declare function middleware(_api: IServerPluginContext): ShuviRequestHandler;
@@ -1,8 +1,8 @@
1
1
  import { IPageRouteConfig, IPageRouteConfigWithId } from '@shuvi/platform-shared/shared';
2
2
  export { IPageRouteConfig };
3
3
  /**
4
- * returns JSON string of IRawPageRouteRecord
4
+ * returns JSON string of IPageRouteConfigWithId
5
5
  */
6
- export declare function serializeRoutes(routes: IPageRouteConfigWithId[]): string;
6
+ export declare function serializeRoutes(routes: IPageRouteConfigWithId[], isServer: boolean): string;
7
7
  export declare function normalizeRoutes(routes: IPageRouteConfig[], componentDir: string, parentPath?: string): IPageRouteConfigWithId[];
8
8
  export declare const generateRoutesContent: (routes: IPageRouteConfigWithId[]) => string;
@@ -10,18 +10,23 @@ var __rest = (this && this.__rest) || function (s, e) {
10
10
  }
11
11
  return t;
12
12
  };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
13
16
  Object.defineProperty(exports, "__esModule", { value: true });
14
17
  exports.generateRoutesContent = exports.normalizeRoutes = exports.serializeRoutes = void 0;
15
18
  const crypto_1 = require("crypto");
19
+ const querystring_1 = __importDefault(require("querystring"));
16
20
  const constants_1 = require("@shuvi/shared/lib/constants");
17
21
  const file_1 = require("@shuvi/utils/lib/file");
18
22
  function genRouteId(filepath) {
19
23
  return (0, crypto_1.createHash)('md4').update(filepath).digest('hex').substr(0, 4);
20
24
  }
25
+ const KEEP_SYMBOL = querystring_1.default.stringify({ keep: ['default'] });
21
26
  /**
22
- * returns JSON string of IRawPageRouteRecord
27
+ * returns JSON string of IPageRouteConfigWithId
23
28
  */
24
- function serializeRoutes(routes) {
29
+ function serializeRoutes(routes, isServer) {
25
30
  let res = '';
26
31
  for (let index = 0; index < routes.length; index++) {
27
32
  const _a = routes[index], { children: childRoutes } = _a, route = __rest(_a, ["children"]);
@@ -33,16 +38,18 @@ function serializeRoutes(routes) {
33
38
  if (key === 'component') {
34
39
  const { component } = route;
35
40
  const componentSource = component;
36
- const componentSourceWithAffix = `${componentSource}?${constants_1.ROUTE_RESOURCE_QUERYSTRING}`;
41
+ const componentRequest = `${componentSource}?${constants_1.ROUTE_RESOURCE_QUERYSTRING}&${KEEP_SYMBOL}`;
37
42
  // `webpackExports` works with production and optimization.minimize, check compiled dist
38
- strRoute +=
39
- `__componentSourceWithAffix__: "${componentSourceWithAffix}",
40
- __componentSource__: "${componentSource}",
43
+ if (isServer) {
44
+ strRoute += `__componentRawRequest__: "${componentRequest}",\n`;
45
+ strRoute += `__componentSource__: "${componentSource}",\n`;
46
+ }
47
+ strRoute += `
41
48
  __import__: () => import(
42
49
  /* webpackChunkName: "page-${id}" */
43
50
  /* webpackExports: "default" */
44
- "${componentSourceWithAffix}"),
45
- __resolveWeak__: () => [require.resolveWeak("${componentSourceWithAffix}")]`.trim();
51
+ "${componentRequest}"),
52
+ __resolveWeak__: () => [require.resolveWeak("${componentRequest}")]`.trim();
46
53
  }
47
54
  else {
48
55
  strRoute += `${key}: ${JSON.stringify(route[key])}`;
@@ -50,7 +57,7 @@ __resolveWeak__: () => [require.resolveWeak("${componentSourceWithAffix}")]`.tri
50
57
  strRoute += `,\n`;
51
58
  }
52
59
  if (childRoutes && childRoutes.length > 0) {
53
- strRoute += `children: ${serializeRoutes(childRoutes)},\n`;
60
+ strRoute += `children: ${serializeRoutes(childRoutes, isServer)},\n`;
54
61
  }
55
62
  res += `{${strRoute}},\n`;
56
63
  }
@@ -77,7 +84,18 @@ function normalizeRoutes(routes, componentDir, parentPath = '') {
77
84
  }
78
85
  exports.normalizeRoutes = normalizeRoutes;
79
86
  const generateRoutesContent = (routes) => {
80
- const serialized = serializeRoutes(routes);
81
- return `export default ${serialized}`;
87
+ const serverRoutes = serializeRoutes(routes, true);
88
+ const clientRoutes = serializeRoutes(routes, false);
89
+ return `
90
+ let routes;
91
+
92
+ if (typeof window === 'undefined') {
93
+ routes = ${serverRoutes}
94
+ } else {
95
+ routes = ${clientRoutes}
96
+ }
97
+
98
+ export default routes
99
+ `;
82
100
  };
83
101
  exports.generateRoutesContent = generateRoutesContent;
@@ -1,19 +1,4 @@
1
+ import { IPlatformContext, ResolvedPlugin } from '@shuvi/service/lib/core';
1
2
  export { getPageMiddleware, IHtmlDocument, ITemplateData, IViewServer, IViewClient } from './lib';
2
- declare const _default: {
3
- core: import("@shuvi/hook").IPluginInstance<{
4
- extendConfig: import("@shuvi/hook").SyncWaterfallHook<import("@shuvi/service").Config, void>;
5
- afterInit: import("@shuvi/hook").AsyncParallelHook<void, void, void>;
6
- afterBuild: import("@shuvi/hook").AsyncParallelHook<void, void, void>;
7
- afterDestroy: import("@shuvi/hook").AsyncParallelHook<void, void, void>;
8
- afterBundlerDone: import("@shuvi/hook").AsyncParallelHook<import("@shuvi/service/lib/core/lifecycleTypes").BundlerDoneExtra, void, void>;
9
- afterBundlerTargetDone: import("@shuvi/hook").AsyncParallelHook<import("@shuvi/service/lib/core/lifecycleTypes").BundlerTargetDoneExtra, void, void>;
10
- configWebpack: import("@shuvi/hook").AsyncSeriesWaterfallHook<import("@shuvi/service/lib/core/lifecycleTypes").WebpackChainType, import("@shuvi/service/lib/core/lifecycleTypes").ConfigWebpackAssistant>;
11
- addExtraTarget: import("@shuvi/hook").AsyncParallelHook<import("@shuvi/service/lib/core/lifecycleTypes").ExtraTargetAssistant, void, import("@shuvi/service/lib/core/lifecycleTypes").TargetChain>;
12
- addResource: import("@shuvi/hook").AsyncParallelHook<void, void, import("@shuvi/service/lib/core/lifecycleTypes").Resources | import("@shuvi/service/lib/core/lifecycleTypes").Resources[]>;
13
- 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>[]>;
14
- addRuntimeService: import("@shuvi/hook").AsyncParallelHook<void, void, import("@shuvi/service/lib/core/lifecycleTypes").RuntimeService | import("@shuvi/service/lib/core/lifecycleTypes").RuntimeService[]>;
15
- } & import("@shuvi/service/lib/core/apiTypes").CustomCorePluginHooks, import("@shuvi/service").IPluginContext>;
16
- server: import("@shuvi/hook").IPluginInstance<import("@shuvi/service/lib/server/plugin").BuiltInServerPluginHooks & import("@shuvi/service/lib/server/pluginTypes").CustomServerPluginHooks, import("@shuvi/service").IServerPluginContext>;
17
- types: string;
18
- };
19
- export default _default;
3
+ /** This plugin uses `platformContext` so that it is set to a plugin getter */
4
+ export declare const getPlugin: (platformContext: IPlatformContext) => ResolvedPlugin;
@@ -1,28 +1,99 @@
1
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
+ };
2
11
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
13
  };
5
14
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getPageMiddleware = void 0;
15
+ exports.getPlugin = exports.getPageMiddleware = void 0;
7
16
  const service_1 = require("@shuvi/service");
17
+ const constants_1 = require("@shuvi/shared/lib/constants");
18
+ const config_1 = require("@shuvi/toolpack/lib/webpack/config");
8
19
  const paths_1 = require("../../paths");
20
+ const middlewares_1 = require("../middlewares");
21
+ const generateResource_1 = __importDefault(require("./lib/generateResource"));
22
+ const buildHtml_1 = require("./lib/buildHtml");
9
23
  const server_1 = __importDefault(require("./server"));
24
+ function getServerEntry() {
25
+ return {
26
+ [service_1.BUILD_SERVER_FILE_SERVER]: [(0, paths_1.resolvePkgFile)('esm/shuvi-app/entry/server')]
27
+ };
28
+ }
10
29
  var lib_1 = require("./lib");
11
30
  Object.defineProperty(exports, "getPageMiddleware", { enumerable: true, get: function () { return lib_1.getPageMiddleware; } });
12
- const core = (0, service_1.createPlugin)({
13
- addRuntimeFile: ({ defineFile }, context) => {
14
- const { config: { router: { history } } } = context;
15
- const routerConfigFile = defineFile({
16
- name: 'routerConfig.js',
17
- content: () => {
18
- return `export const historyMode = "${history}";`;
31
+ /** This plugin uses `platformContext` so that it is set to a plugin getter */
32
+ const getPlugin = (platformContext) => {
33
+ const core = (0, service_1.createPlugin)({
34
+ configWebpack: (chain, { name }) => {
35
+ if (name === constants_1.BUNDLER_DEFAULT_TARGET) {
36
+ chain.merge({
37
+ entry: {
38
+ [service_1.BUILD_CLIENT_RUNTIME_POLYFILL]: ['@shuvi/app/core/polyfill'],
39
+ [service_1.BUILD_CLIENT_RUNTIME_MAIN]: [
40
+ (0, paths_1.resolvePkgFile)('esm/shuvi-app/entry/client')
41
+ ]
42
+ }
43
+ });
44
+ }
45
+ return chain;
46
+ },
47
+ addExtraTarget: ({ createConfig }, context) => {
48
+ const serverWebpackHelpers = (0, config_1.webpackHelpers)();
49
+ const serverChain = createConfig({
50
+ name: constants_1.BUNDLER_TARGET_SERVER,
51
+ node: true,
52
+ entry: getServerEntry(),
53
+ outputDir: service_1.BUILD_SERVER_DIR,
54
+ webpackHelpers: serverWebpackHelpers
55
+ });
56
+ return {
57
+ name: constants_1.BUNDLER_TARGET_SERVER,
58
+ chain: serverChain
59
+ };
60
+ },
61
+ addRuntimeFile: ({ defineFile }, context) => {
62
+ const { config: { router: { history } } } = context;
63
+ const routerConfigFile = defineFile({
64
+ name: 'routerConfig.js',
65
+ content: () => {
66
+ return `export const historyMode = "${history}";`;
67
+ }
68
+ });
69
+ return [routerConfigFile];
70
+ },
71
+ addRuntimeService: () => [
72
+ {
73
+ source: (0, paths_1.resolvePkgFile)('esm/shuvi-app/shuvi-runtime-index'),
74
+ exported: '*'
75
+ },
76
+ {
77
+ source: (0, paths_1.resolvePkgFile)('lib/node/shuvi-runtime-server'),
78
+ filepath: 'server.ts',
79
+ exported: '*'
19
80
  }
20
- });
21
- return [routerConfigFile];
22
- }
23
- });
24
- exports.default = {
25
- core,
26
- server: server_1.default,
27
- types: (0, paths_1.resolvePkgFile)('lib/node/features/html-render/shuvi-app.d.ts')
81
+ ],
82
+ addResource: context => (0, generateResource_1.default)(context),
83
+ afterBuild: (context) => __awaiter(void 0, void 0, void 0, function* () {
84
+ yield (0, buildHtml_1.buildHtml)({
85
+ context,
86
+ serverPlugins: platformContext.serverPlugins,
87
+ getMiddlewares: middlewares_1.getMiddlewares,
88
+ pathname: '/',
89
+ filename: 'index.html'
90
+ });
91
+ })
92
+ });
93
+ return {
94
+ core,
95
+ server: server_1.default,
96
+ types: (0, paths_1.resolvePkgFile)('lib/node/features/html-render/shuvi-app.d.ts')
97
+ };
28
98
  };
99
+ exports.getPlugin = getPlugin;
@@ -1,3 +1,3 @@
1
1
  import { IManifest } from '@shuvi/toolpack/lib/webpack/types';
2
- import { IRouteRecord } from '@shuvi/router';
3
- export default function generateFilesByRoutId(assetMap: IManifest, routes: IRouteRecord[]): Record<string, string[]>;
2
+ import { IPageRouteRecord } from '@shuvi/platform-shared/shared';
3
+ export default function generateFilesByRoutId(assetMap: IManifest, routes: IPageRouteRecord[]): Record<string, string[]>;
@@ -3,9 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  function generateFilesByRoutId(assetMap, routes) {
4
4
  let filesByRoutId = {};
5
5
  const loadable = assetMap.loadble;
6
- routes.forEach(({ id, __componentSourceWithAffix__ }) => {
7
- if (id && __componentSourceWithAffix__) {
8
- filesByRoutId[id] = loadable[__componentSourceWithAffix__].files;
6
+ routes.forEach(({ id, __componentRawRequest__ }) => {
7
+ if (__componentRawRequest__) {
8
+ filesByRoutId[id] = loadable[__componentRawRequest__].files;
9
9
  }
10
10
  });
11
11
  return filesByRoutId;
@@ -1,2 +1,2 @@
1
- import { IRequestHandlerWithNext, IServerPluginContext } from '@shuvi/service';
2
- export declare function getPageMiddleware(api: IServerPluginContext): IRequestHandlerWithNext;
1
+ import { ShuviRequestHandler, IServerPluginContext } from '@shuvi/service';
2
+ export declare function getPageMiddleware(api: IServerPluginContext): ShuviRequestHandler;
@@ -1,4 +1,3 @@
1
1
  export { getPageMiddleware } from './getPageMiddleware';
2
- export { renderToHTML } from './renderToHTML';
3
2
  export * from './renderer';
4
3
  export * from './pageLoader';
@@ -14,10 +14,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.renderToHTML = exports.getPageMiddleware = void 0;
17
+ exports.getPageMiddleware = void 0;
18
18
  var getPageMiddleware_1 = require("./getPageMiddleware");
19
19
  Object.defineProperty(exports, "getPageMiddleware", { enumerable: true, get: function () { return getPageMiddleware_1.getPageMiddleware; } });
20
- var renderToHTML_1 = require("./renderToHTML");
21
- Object.defineProperty(exports, "renderToHTML", { enumerable: true, get: function () { return renderToHTML_1.renderToHTML; } });
22
20
  __exportStar(require("./renderer"), exports);
23
21
  __exportStar(require("./pageLoader"), exports);
@@ -1,6 +1,6 @@
1
- import { IRequest, IServerPluginContext } from '@shuvi/service';
1
+ import { ShuviRequest, IServerPluginContext } from '@shuvi/service';
2
2
  import { Response } from '@shuvi/platform-shared/shared';
3
3
  export declare function renderToHTML({ req, serverPluginContext }: {
4
- req: IRequest;
4
+ req: ShuviRequest;
5
5
  serverPluginContext: IServerPluginContext;
6
6
  }): Promise<Response>;
@@ -11,38 +11,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.renderToHTML = void 0;
13
13
  const resources_1 = require("@shuvi/service/lib/resources");
14
- const shared_1 = require("@shuvi/platform-shared/shared");
15
14
  const renderer_1 = require("./renderer");
16
- const htmlTag_1 = require("./renderer/htmlTag");
17
- function addEssentialTagsIfMissing(document) {
18
- let hasMetaCharset = false;
19
- let hasMetaViewport = false;
20
- for (const { tagName, attrs } of document.headTags) {
21
- if (hasMetaCharset && hasMetaViewport) {
22
- break;
23
- }
24
- if (tagName === 'meta') {
25
- if (attrs.charset) {
26
- hasMetaCharset = true;
27
- }
28
- else if (attrs.name === 'viewport') {
29
- hasMetaViewport = true;
30
- }
31
- }
32
- }
33
- if (!hasMetaCharset) {
34
- document.headTags.unshift((0, htmlTag_1.tag)('meta', {
35
- charset: 'utf-8'
36
- }));
37
- }
38
- if (!hasMetaViewport) {
39
- document.headTags.unshift((0, htmlTag_1.tag)('meta', {
40
- name: 'viewport',
41
- content: 'width=device-width,minimum-scale=1,initial-scale=1'
42
- }));
43
- }
44
- return document;
45
- }
46
15
  function renderToHTML({ req, serverPluginContext }) {
47
16
  return __awaiter(this, void 0, void 0, function* () {
48
17
  let result;
@@ -50,27 +19,17 @@ function renderToHTML({ req, serverPluginContext }) {
50
19
  const { application } = resources_1.server;
51
20
  const app = application.createApp({
52
21
  req,
53
- ssr: serverPluginContext.config.ssr
22
+ ssr: serverPluginContext.config.ssr,
23
+ isDev: serverPluginContext.mode === 'development'
54
24
  });
55
25
  try {
56
26
  yield app.init();
57
- const publicApp = app.getPublicAPI();
58
- let doc = yield renderer.renderDocument({
59
- app: publicApp,
60
- req
27
+ result = yield renderer.renderView({
28
+ req,
29
+ app: app.getPublicAPI(),
30
+ ssr: serverPluginContext.config.ssr,
31
+ isDev: serverPluginContext.mode === 'development'
61
32
  });
62
- if ((0, shared_1.isResponse)(doc)) {
63
- result = doc;
64
- }
65
- else {
66
- addEssentialTagsIfMissing(doc);
67
- yield serverPluginContext.serverPluginRunner.modifyHtml(doc, app.context);
68
- const htmlStr = renderer.renderDocumentToString(doc);
69
- const appError = app.error.getError;
70
- result = (0, shared_1.text)(htmlStr, {
71
- status: appError && typeof appError.code !== 'undefined' ? appError.code : 200
72
- });
73
- }
74
33
  }
75
34
  finally {
76
35
  yield app.dispose();
@@ -1,14 +1,14 @@
1
- import { IAppData, Response } from '@shuvi/platform-shared/shared';
2
- import { IServerPluginContext } from '@shuvi/service';
3
- import { IHtmlDocument, IHtmlTag, IApplication } from './types';
4
- import { IRendererConstructorOptions, IRenderDocumentOptions } from './types';
1
+ import { IAppData } from '@shuvi/platform-shared/shared';
2
+ import { ShuviRequest, IServerPluginContext } from '@shuvi/service';
3
+ import { IHtmlTag, IApplication } from './types';
4
+ import { IRendererConstructorOptions, IRenderViewOptions, IRenderDocumentResult } from './types';
5
5
  export declare type AppData = Omit<IAppData, 'filesByRoutId' | 'publicPath'>;
6
6
  export declare abstract class BaseRenderer {
7
7
  protected _serverPluginContext: IServerPluginContext;
8
8
  protected _app?: IApplication;
9
9
  constructor({ serverPluginContext }: IRendererConstructorOptions);
10
- abstract renderDocument({ app, req }: IRenderDocumentOptions): Promise<IHtmlDocument | Response> | IHtmlDocument | Response;
11
- protected _getMainAssetTags(): {
10
+ abstract renderDocument({ app, req }: IRenderViewOptions): IRenderDocumentResult;
11
+ protected _getMainAssetTags(req: ShuviRequest): {
12
12
  styles: IHtmlTag<any>[];
13
13
  scripts: IHtmlTag<any>[];
14
14
  };
@@ -14,24 +14,24 @@ class BaseRenderer {
14
14
  constructor({ serverPluginContext }) {
15
15
  this._serverPluginContext = serverPluginContext;
16
16
  }
17
- _getMainAssetTags() {
17
+ _getMainAssetTags(req) {
18
18
  const styles = [];
19
19
  const scripts = [];
20
20
  const entrypoints = resources_1.clientManifest.entries[service_1.BUILD_CLIENT_RUNTIME_MAIN];
21
21
  const polyfill = resources_1.clientManifest.bundles[service_1.BUILD_CLIENT_RUNTIME_POLYFILL];
22
22
  scripts.push((0, htmlTag_1.tag)('script', {
23
- src: this._serverPluginContext.getAssetPublicUrl(polyfill)
23
+ src: req.getAssetUrl(polyfill)
24
24
  }));
25
25
  entrypoints.js.forEach((asset) => {
26
26
  scripts.push((0, htmlTag_1.tag)('script', {
27
- src: this._serverPluginContext.getAssetPublicUrl(asset)
27
+ src: req.getAssetUrl(asset)
28
28
  }));
29
29
  });
30
30
  if (entrypoints.css) {
31
31
  entrypoints.css.forEach((asset) => {
32
32
  styles.push((0, htmlTag_1.tag)('link', {
33
33
  rel: 'stylesheet',
34
- href: this._serverPluginContext.getAssetPublicUrl(asset)
34
+ href: req.getAssetUrl(asset)
35
35
  }));
36
36
  });
37
37
  }
@@ -60,7 +60,7 @@ class BaseRenderer {
60
60
  }
61
61
  _getInlineAppData(app, appData) {
62
62
  const routes = app.router.routes || [];
63
- const data = JSON.stringify(Object.assign(Object.assign({}, appData), { filesByRoutId: (0, generateFilesByRoutId_1.default)(resources_1.clientManifest, routes), publicPath: this._serverPluginContext.getAssetPublicUrl() }));
63
+ const data = JSON.stringify(Object.assign(Object.assign({}, appData), { filesByRoutId: (0, generateFilesByRoutId_1.default)(resources_1.clientManifest, routes), publicPath: this._serverPluginContext.assetPublicPath }));
64
64
  return (0, htmlTag_1.tag)('script', {
65
65
  id: constants_1.CLIENT_APPDATA_ID,
66
66
  type: 'application/json'
@@ -1,5 +1,5 @@
1
- import { IRendererConstructorOptions, IRenderDocumentOptions } from './types';
2
- import { IHtmlDocument } from './types';
1
+ import { Response } from '@shuvi/platform-shared/shared';
2
+ import { IRendererConstructorOptions, IRenderViewOptions } from './types';
3
3
  export * from './types';
4
4
  export interface ITemplateData {
5
5
  [x: string]: any;
@@ -10,6 +10,7 @@ export declare class Renderer {
10
10
  private _ssrRenderer;
11
11
  private _spaRenderer;
12
12
  constructor(options: IRendererConstructorOptions);
13
- renderDocument(options: IRenderDocumentOptions): import("@shuvi/platform-shared/shared").Response | IHtmlDocument | Promise<import("@shuvi/platform-shared/shared").Response | IHtmlDocument>;
14
- renderDocumentToString(document: IHtmlDocument, templateData?: ITemplateData): string;
13
+ renderView(options: IRenderViewOptions): Promise<Response>;
14
+ private _renderDocument;
15
+ private _renderDocumentToString;
15
16
  }