@modern-js/plugin-data-loader 2.0.0-beta.1 → 2.0.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,6 +3,7 @@
3
3
  // eslint-disable-next-line eslint-comments/disable-enable-pair
4
4
  /* eslint-disable node/no-unsupported-features/node-builtins */
5
5
  import { compile } from 'path-to-regexp';
6
+ import { redirect } from 'react-router-dom';
6
7
  export const getRequestUrl = ({
7
8
  params,
8
9
  request,
@@ -17,6 +18,16 @@ export const getRequestUrl = ({
17
18
  url.searchParams.append('_loader', routeId);
18
19
  return url;
19
20
  };
21
+ const handleRedirectResponse = res => {
22
+ const {
23
+ headers
24
+ } = res;
25
+ const location = headers.get('X-Modernjs-Redirect');
26
+ if (location) {
27
+ return redirect(location);
28
+ }
29
+ return res;
30
+ };
20
31
  export const createRequest = (routeId, method = 'get') => {
21
32
  return async ({
22
33
  params,
@@ -32,7 +43,7 @@ export const createRequest = (routeId, method = 'get') => {
32
43
  method,
33
44
  signal: request.signal
34
45
  });
35
- return res;
46
+ return handleRedirectResponse(res);
36
47
  } catch (error) {
37
48
  console.error(error);
38
49
  throw error;
@@ -1,24 +1,26 @@
1
1
  import path from 'path';
2
- import { getRouteId } from '@modern-js/utils';
3
2
  export const generateClient = ({
4
- basedir,
5
- filename,
6
- entryName
3
+ mapFile
7
4
  }) => {
8
- // TODO: loader 的约定变更
9
- const componentPath = path.join(path.dirname(filename), 'layout.ts');
10
- const routeId = getRouteId(componentPath, basedir, entryName);
5
+ const loadersMap = require(mapFile);
6
+ const requestCode = Object.keys(loadersMap).map(loaderId => {
7
+ const routeId = loadersMap[loaderId];
8
+ return `
9
+ const ${loaderId} = createRequest('${routeId}');
10
+ `;
11
+ }).join('');
12
+ let exportsCode = `export {`;
13
+ for (const loader of Object.keys(loadersMap)) {
14
+ exportsCode += `${loader},`;
15
+ }
16
+ exportsCode += '}';
11
17
  const requestCreatorPath = path.join(__dirname, './create-request').replace('node', 'treeshaking').replace(/\\/g, '/');
12
18
  const importCode = `
13
19
  import { createRequest } from '${requestCreatorPath}';
14
20
  `;
15
- const requestCode = `
16
- const loader = createRequest('${routeId}');
17
- export default loader;
18
- export { loader };
19
- `;
20
21
  return `
21
22
  ${importCode}
22
23
  ${requestCode}
24
+ ${exportsCode}
23
25
  `;
24
26
  };
@@ -11,9 +11,7 @@ export default async function loader(source) {
11
11
  }
12
12
  const options = this.getOptions();
13
13
  const code = generateClient({
14
- basedir: options.routesDir,
15
- filename: this.resourcePath,
16
- entryName: options.entryName
14
+ mapFile: options.mapFile
17
15
  });
18
16
  return code;
19
17
  }
@@ -3,6 +3,7 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
3
3
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
4
4
  import { installGlobals, writeReadableStreamToWritable, Response as NodeResponse } from '@remix-run/node';
5
5
  import { matchRoutes } from 'react-router-dom';
6
+ import { LOADER_ROUTES_DIR } from '@modern-js/utils';
6
7
  // Polyfill Web Fetch API
7
8
  installGlobals();
8
9
  const LOADER_SEARCH_PARAM = '_loader';
@@ -122,7 +123,7 @@ export const handleRequest = async ({
122
123
  }
123
124
  const {
124
125
  routes
125
- } = await import(`${distDir}/loader-routes/${entry.entryName}`);
126
+ } = await import(`${distDir}/${LOADER_ROUTES_DIR}/${entry.entryName}`);
126
127
  if (!routes) {
127
128
  return;
128
129
  }
@@ -152,7 +153,15 @@ export const handleRequest = async ({
152
153
  request,
153
154
  loadContext: {}
154
155
  });
155
- // TODO: 处理 redirect
156
+ if (isRedirectResponse(response)) {
157
+ const headers = new Headers(response.headers);
158
+ headers.set('X-Modernjs-Redirect', headers.get('Location'));
159
+ headers.delete('Location');
160
+ response = new NodeResponse(null, {
161
+ status: 204,
162
+ headers
163
+ });
164
+ }
156
165
  } catch (error) {
157
166
  const message = String(error);
158
167
  response = new NodeResponse(message, {
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.getRequestUrl = exports.createRequest = void 0;
7
7
  var _pathToRegexp = require("path-to-regexp");
8
+ var _reactRouterDom = require("react-router-dom");
8
9
  // eslint-disable-next-line eslint-comments/disable-enable-pair
9
10
  /* eslint-disable node/prefer-global/url */
10
11
  // eslint-disable-next-line eslint-comments/disable-enable-pair
@@ -25,6 +26,16 @@ const getRequestUrl = ({
25
26
  return url;
26
27
  };
27
28
  exports.getRequestUrl = getRequestUrl;
29
+ const handleRedirectResponse = res => {
30
+ const {
31
+ headers
32
+ } = res;
33
+ const location = headers.get('X-Modernjs-Redirect');
34
+ if (location) {
35
+ return (0, _reactRouterDom.redirect)(location);
36
+ }
37
+ return res;
38
+ };
28
39
  const createRequest = (routeId, method = 'get') => {
29
40
  return async ({
30
41
  params,
@@ -40,7 +51,7 @@ const createRequest = (routeId, method = 'get') => {
40
51
  method,
41
52
  signal: request.signal
42
53
  });
43
- return res;
54
+ return handleRedirectResponse(res);
44
55
  } catch (error) {
45
56
  console.error(error);
46
57
  throw error;
@@ -5,28 +5,30 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.generateClient = void 0;
7
7
  var _path = _interopRequireDefault(require("path"));
8
- var _utils = require("@modern-js/utils");
9
8
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
9
  const generateClient = ({
11
- basedir,
12
- filename,
13
- entryName
10
+ mapFile
14
11
  }) => {
15
- // TODO: loader 的约定变更
16
- const componentPath = _path.default.join(_path.default.dirname(filename), 'layout.ts');
17
- const routeId = (0, _utils.getRouteId)(componentPath, basedir, entryName);
12
+ const loadersMap = require(mapFile);
13
+ const requestCode = Object.keys(loadersMap).map(loaderId => {
14
+ const routeId = loadersMap[loaderId];
15
+ return `
16
+ const ${loaderId} = createRequest('${routeId}');
17
+ `;
18
+ }).join('');
19
+ let exportsCode = `export {`;
20
+ for (const loader of Object.keys(loadersMap)) {
21
+ exportsCode += `${loader},`;
22
+ }
23
+ exportsCode += '}';
18
24
  const requestCreatorPath = _path.default.join(__dirname, './create-request').replace('node', 'treeshaking').replace(/\\/g, '/');
19
25
  const importCode = `
20
26
  import { createRequest } from '${requestCreatorPath}';
21
27
  `;
22
- const requestCode = `
23
- const loader = createRequest('${routeId}');
24
- export default loader;
25
- export { loader };
26
- `;
27
28
  return `
28
29
  ${importCode}
29
30
  ${requestCode}
31
+ ${exportsCode}
30
32
  `;
31
33
  };
32
34
  exports.generateClient = generateClient;
@@ -17,9 +17,7 @@ async function loader(source) {
17
17
  }
18
18
  const options = this.getOptions();
19
19
  const code = (0, _generateClient.generateClient)({
20
- basedir: options.routesDir,
21
- filename: this.resourcePath,
22
- entryName: options.entryName
20
+ mapFile: options.mapFile
23
21
  });
24
22
  return code;
25
23
  }
@@ -8,6 +8,7 @@ exports.isRedirectResponse = isRedirectResponse;
8
8
  exports.isResponse = isResponse;
9
9
  var _node = require("@remix-run/node");
10
10
  var _reactRouterDom = require("react-router-dom");
11
+ var _utils = require("@modern-js/utils");
11
12
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
12
13
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
13
14
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
@@ -133,7 +134,7 @@ const handleRequest = async ({
133
134
  }
134
135
  const {
135
136
  routes
136
- } = await Promise.resolve(`${distDir}/loader-routes/${entry.entryName}`).then(s => _interopRequireWildcard(require(s)));
137
+ } = await Promise.resolve(`${distDir}/${_utils.LOADER_ROUTES_DIR}/${entry.entryName}`).then(s => _interopRequireWildcard(require(s)));
137
138
  if (!routes) {
138
139
  return;
139
140
  }
@@ -163,7 +164,15 @@ const handleRequest = async ({
163
164
  request,
164
165
  loadContext: {}
165
166
  });
166
- // TODO: 处理 redirect
167
+ if (isRedirectResponse(response)) {
168
+ const headers = new Headers(response.headers);
169
+ headers.set('X-Modernjs-Redirect', headers.get('Location'));
170
+ headers.delete('Location');
171
+ response = new _node.Response(null, {
172
+ status: 204,
173
+ headers
174
+ });
175
+ }
167
176
  } catch (error) {
168
177
  const message = String(error);
169
178
  response = new _node.Response(message, {
@@ -5,6 +5,7 @@ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
5
5
  // eslint-disable-next-line eslint-comments/disable-enable-pair
6
6
  /* eslint-disable node/no-unsupported-features/node-builtins */
7
7
  import { compile } from 'path-to-regexp';
8
+ import { redirect } from 'react-router-dom';
8
9
  export var getRequestUrl = function getRequestUrl(_ref) {
9
10
  var params = _ref.params,
10
11
  request = _ref.request,
@@ -18,6 +19,14 @@ export var getRequestUrl = function getRequestUrl(_ref) {
18
19
  url.searchParams.append('_loader', routeId);
19
20
  return url;
20
21
  };
22
+ var handleRedirectResponse = function handleRedirectResponse(res) {
23
+ var headers = res.headers;
24
+ var location = headers.get('X-Modernjs-Redirect');
25
+ if (location) {
26
+ return redirect(location);
27
+ }
28
+ return res;
29
+ };
21
30
  export var createRequest = function createRequest(routeId) {
22
31
  var method = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'get';
23
32
  return /*#__PURE__*/function () {
@@ -41,7 +50,7 @@ export var createRequest = function createRequest(routeId) {
41
50
  });
42
51
  case 5:
43
52
  res = _context.sent;
44
- return _context.abrupt("return", res);
53
+ return _context.abrupt("return", handleRedirectResponse(res));
45
54
  case 9:
46
55
  _context.prev = 9;
47
56
  _context.t0 = _context["catch"](2);
@@ -1,14 +1,18 @@
1
1
  import path from 'path';
2
- import { getRouteId } from '@modern-js/utils';
3
2
  export var generateClient = function generateClient(_ref) {
4
- var basedir = _ref.basedir,
5
- filename = _ref.filename,
6
- entryName = _ref.entryName;
7
- // TODO: loader 的约定变更
8
- var componentPath = path.join(path.dirname(filename), 'layout.ts');
9
- var routeId = getRouteId(componentPath, basedir, entryName);
3
+ var mapFile = _ref.mapFile;
4
+ var loadersMap = require(mapFile);
5
+ var requestCode = Object.keys(loadersMap).map(function (loaderId) {
6
+ var routeId = loadersMap[loaderId];
7
+ return "\n const ".concat(loaderId, " = createRequest('").concat(routeId, "');\n ");
8
+ }).join('');
9
+ var exportsCode = "export {";
10
+ for (var _i = 0, _Object$keys = Object.keys(loadersMap); _i < _Object$keys.length; _i++) {
11
+ var loader = _Object$keys[_i];
12
+ exportsCode += "".concat(loader, ",");
13
+ }
14
+ exportsCode += '}';
10
15
  var requestCreatorPath = path.join(__dirname, './create-request').replace('node', 'treeshaking').replace(/\\/g, '/');
11
16
  var importCode = "\n import { createRequest } from '".concat(requestCreatorPath, "';\n ");
12
- var requestCode = "\n const loader = createRequest('".concat(routeId, "');\n export default loader;\n export { loader };\n ");
13
- return "\n ".concat(importCode, "\n ").concat(requestCode, "\n ");
17
+ return "\n ".concat(importCode, "\n ").concat(requestCode, "\n ").concat(exportsCode, "\n ");
14
18
  };
@@ -25,9 +25,7 @@ function _loader() {
25
25
  case 4:
26
26
  options = this.getOptions();
27
27
  code = generateClient({
28
- basedir: options.routesDir,
29
- filename: this.resourcePath,
30
- entryName: options.entryName
28
+ mapFile: options.mapFile
31
29
  });
32
30
  return _context.abrupt("return", code);
33
31
  case 7:
@@ -6,6 +6,7 @@ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
6
6
  import _typeof from "@babel/runtime/helpers/esm/typeof";
7
7
  import { installGlobals, writeReadableStreamToWritable, Response as NodeResponse } from '@remix-run/node';
8
8
  import { matchRoutes } from 'react-router-dom';
9
+ import { LOADER_ROUTES_DIR } from '@modern-js/utils';
9
10
  // Polyfill Web Fetch API
10
11
  installGlobals();
11
12
  var LOADER_SEARCH_PARAM = '_loader';
@@ -178,7 +179,7 @@ var matchEntry = function matchEntry(pathname, entries) {
178
179
  };
179
180
  export var handleRequest = /*#__PURE__*/function () {
180
181
  var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(_ref4) {
181
- var context, serverRoutes, distDir, method, query, routeId, entry, _yield$import, routes, res, pathname, matches, match, request, response, message;
182
+ var context, serverRoutes, distDir, method, query, routeId, entry, _yield$import, routes, res, pathname, matches, match, request, response, headers, message;
182
183
  return _regeneratorRuntime().wrap(function _callee3$(_context3) {
183
184
  while (1) {
184
185
  switch (_context3.prev = _context3.next) {
@@ -200,7 +201,7 @@ export var handleRequest = /*#__PURE__*/function () {
200
201
  return _context3.abrupt("return");
201
202
  case 8:
202
203
  _context3.next = 10;
203
- return import("".concat(distDir, "/loader-routes/").concat(entry.entryName));
204
+ return import("".concat(distDir, "/").concat(LOADER_ROUTES_DIR, "/").concat(entry.entryName));
204
205
  case 10:
205
206
  _yield$import = _context3.sent;
206
207
  routes = _yield$import.routes;
@@ -244,10 +245,19 @@ export var handleRequest = /*#__PURE__*/function () {
244
245
  });
245
246
  case 30:
246
247
  response = _context3.sent;
247
- _context3.next = 37;
248
+ if (isRedirectResponse(response)) {
249
+ headers = new Headers(response.headers);
250
+ headers.set('X-Modernjs-Redirect', headers.get('Location'));
251
+ headers["delete"]('Location');
252
+ response = new NodeResponse(null, {
253
+ status: 204,
254
+ headers: headers
255
+ });
256
+ }
257
+ _context3.next = 38;
248
258
  break;
249
- case 33:
250
- _context3.prev = 33;
259
+ case 34:
260
+ _context3.prev = 34;
251
261
  _context3.t0 = _context3["catch"](27);
252
262
  message = String(_context3.t0);
253
263
  response = new NodeResponse(message, {
@@ -256,14 +266,14 @@ export var handleRequest = /*#__PURE__*/function () {
256
266
  'Content-Type': 'text/plain'
257
267
  }
258
268
  });
259
- case 37:
260
- sendLoaderResponse(res, response);
261
269
  case 38:
270
+ sendLoaderResponse(res, response);
271
+ case 39:
262
272
  case "end":
263
273
  return _context3.stop();
264
274
  }
265
275
  }
266
- }, _callee3, null, [[27, 33]]);
276
+ }, _callee3, null, [[27, 34]]);
267
277
  }));
268
278
  return function handleRequest(_x4) {
269
279
  return _ref5.apply(this, arguments);
@@ -1,9 +1,5 @@
1
1
  export declare const generateClient: ({
2
- basedir,
3
- filename,
4
- entryName
2
+ mapFile
5
3
  }: {
6
- basedir: string;
7
- filename: string;
8
- entryName: string;
4
+ mapFile: string;
9
5
  }) => string;
@@ -2,4 +2,5 @@ import type { LoaderContext } from 'webpack';
2
2
  export default function loader(this: LoaderContext<{
3
3
  routesDir: string;
4
4
  entryName: string;
5
+ mapFile: string;
5
6
  }>, source: string): Promise<string>;
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "modern",
12
12
  "modern.js"
13
13
  ],
14
- "version": "2.0.0-beta.1",
14
+ "version": "2.0.0-beta.3",
15
15
  "jsnext:source": "./src/index.ts",
16
16
  "types": "./dist/types/index.d.ts",
17
17
  "main": "./dist/js/node/index.js",
@@ -42,9 +42,9 @@
42
42
  "@babel/runtime": "^7.18.0",
43
43
  "@remix-run/node": "^1.7.0",
44
44
  "path-to-regexp": "^6.2.0",
45
- "react-router-dom": "^6.4.2",
46
- "@modern-js/babel-compiler": "2.0.0-beta.1",
47
- "@modern-js/utils": "2.0.0-beta.1"
45
+ "react-router-dom": "^6.4.4",
46
+ "@modern-js/babel-compiler": "2.0.0-beta.3",
47
+ "@modern-js/utils": "2.0.0-beta.3"
48
48
  },
49
49
  "devDependencies": {
50
50
  "@types/babel__core": "^7.1.15",
@@ -57,14 +57,13 @@
57
57
  "supertest": "^6.1.6",
58
58
  "ts-jest": "^27.0.5",
59
59
  "typescript": "^4",
60
- "webpack": "^5.74.0",
60
+ "webpack": "^5.75.0",
61
61
  "webpack-chain": "^6.5.1",
62
- "@modern-js/core": "2.0.0-beta.1",
63
- "@modern-js/runtime": "2.0.0-beta.1",
64
- "@modern-js/server-core": "2.0.0-beta.1",
65
- "@modern-js/types": "2.0.0-beta.1",
66
- "@scripts/build": "2.0.0-beta.1",
67
- "@scripts/jest-config": "2.0.0-beta.1"
62
+ "@modern-js/core": "2.0.0-beta.3",
63
+ "@modern-js/server-core": "2.0.0-beta.3",
64
+ "@modern-js/types": "2.0.0-beta.3",
65
+ "@scripts/build": "2.0.0-beta.3",
66
+ "@scripts/jest-config": "2.0.0-beta.3"
68
67
  },
69
68
  "sideEffects": false,
70
69
  "publishConfig": {
@@ -72,9 +71,9 @@
72
71
  "access": "public"
73
72
  },
74
73
  "scripts": {
75
- "new": "modern new",
76
- "build": "modern build",
77
- "dev": "modern build --watch",
74
+ "new": "modern-lib new",
75
+ "build": "modern-lib build",
76
+ "dev": "modern-lib build --watch",
78
77
  "test": "jest --passWithNoTests"
79
78
  }
80
79
  }