@modern-js/plugin-data-loader 2.31.2 → 2.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,33 @@
1
1
  # @modern-js/plugin-data-loader
2
2
 
3
+ ## 2.32.0
4
+
5
+ ### Minor Changes
6
+
7
+ - a030aff: feat: support loader context
8
+ feat: 支持 loader context
9
+ - 4323e68: feat: support client-data file
10
+ feat: 支持 client-data 文件
11
+
12
+ ### Patch Changes
13
+
14
+ - 6076166: fix: packaging errors found by publint
15
+
16
+ fix: 修复 publint 检测到的 packaging 问题
17
+
18
+ - 3c91100: chore(builder): using unified version of webpack-chain
19
+
20
+ chore(builder): 使用统一的 webpack-chain 版本
21
+
22
+ - 5255eba: feat: report time for server loader
23
+ feat: 上报 server loader 执行的时间
24
+ - Updated dependencies [e5a3fb4]
25
+ - Updated dependencies [6076166]
26
+ - Updated dependencies [a030aff]
27
+ - Updated dependencies [3c91100]
28
+ - Updated dependencies [5255eba]
29
+ - @modern-js/utils@2.32.0
30
+
3
31
  ## 2.31.2
4
32
 
5
33
  ### Patch Changes
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2021 Modern.js
3
+ Copyright (c) 2021-present Modern.js
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -8,6 +8,8 @@ Object.defineProperty(exports, "default", {
8
8
  return loader;
9
9
  }
10
10
  });
11
+ const _util = require("util");
12
+ const _logger = require("@modern-js/utils/logger");
11
13
  const _generateClient = require("./generateClient");
12
14
  async function loader(source) {
13
15
  var _this__compiler;
@@ -33,6 +35,18 @@ async function loader(source) {
33
35
  if (!options.mapFile) {
34
36
  return source;
35
37
  }
38
+ if (options.clientData) {
39
+ const readFile = (0, _util.promisify)(this.fs.readFile);
40
+ try {
41
+ const clientDataPath = this.resourcePath.includes(".loader.") ? this.resourcePath.replace(".loader.", ".data.client.") : this.resourcePath.replace(".data.", ".data.client.");
42
+ const clientDataContent = await readFile(clientDataPath);
43
+ return clientDataContent;
44
+ } catch (error) {
45
+ if (process.env.NODE_ENV === "development") {
46
+ _logger.logger.error(`Failed to read the clientData file ${options.clientData}`);
47
+ }
48
+ }
49
+ }
36
50
  const code = (0, _generateClient.generateClient)({
37
51
  mapFile: options.mapFile,
38
52
  loaderId: options.loaderId
@@ -25,7 +25,9 @@ const _remixrouter = require("@modern-js/utils/runtime/remix-router");
25
25
  const _nestedroutes = require("@modern-js/utils/runtime/nested-routes");
26
26
  const _lodash = require("@modern-js/utils/lodash");
27
27
  const _runtimenode = require("@modern-js/utils/runtime-node");
28
- const _constants = require("../common/constants");
28
+ const _time = require("@modern-js/utils/universal/time");
29
+ const _constants = require("@modern-js/utils/universal/constants");
30
+ const _constants1 = require("../common/constants");
29
31
  const _response = require("./response");
30
32
  (0, _node.installGlobals)();
31
33
  const redirectStatusCodes = /* @__PURE__ */ new Set([
@@ -94,7 +96,7 @@ const sendLoaderResponse = async (res, nodeResponse) => {
94
96
  };
95
97
  const handleRequest = async ({ context, serverRoutes, routes: routesConfig }) => {
96
98
  const { method, query } = context;
97
- const routeId = query[_constants.LOADER_ID_PARAM];
99
+ const routeId = query[_constants1.LOADER_ID_PARAM];
98
100
  const entry = (0, _runtimenode.matchEntry)(context.path, serverRoutes);
99
101
  if (!routeId || !entry) {
100
102
  return;
@@ -103,16 +105,20 @@ const handleRequest = async ({ context, serverRoutes, routes: routesConfig }) =>
103
105
  throw new Error("CSR data loader request only support http GET method");
104
106
  }
105
107
  const basename = entry.urlPath;
106
- const routes = (0, _nestedroutes.transformNestedRoutes)(routesConfig);
108
+ const end = (0, _time.time)();
109
+ const { res, logger, reporter } = context;
110
+ const routes = (0, _nestedroutes.transformNestedRoutes)(routesConfig, reporter);
107
111
  const { queryRoute } = (0, _remixrouter.createStaticHandler)(routes, {
108
112
  basename
109
113
  });
110
- const { res, logger } = context;
111
114
  const request = createLoaderRequest(context);
115
+ const requestContext = (0, _runtimenode.createRequestContext)();
116
+ requestContext.set(_runtimenode.reporterCtx, reporter);
112
117
  let response;
113
118
  try {
114
119
  response = await queryRoute(request, {
115
- routeId
120
+ routeId,
121
+ requestContext
116
122
  });
117
123
  if (isResponse(response) && isRedirectResponse(response.status)) {
118
124
  response = convertModernRedirectResponse(response.headers, basename);
@@ -127,7 +133,7 @@ const handleRequest = async ({ context, serverRoutes, routes: routesConfig }) =>
127
133
  response = convertModernRedirectResponse(new Headers(init.headers), basename);
128
134
  } else {
129
135
  const headers = new Headers(init.headers);
130
- headers.set("Content-Type", `${_constants.CONTENT_TYPE_DEFERRED}; charset=UTF-8`);
136
+ headers.set("Content-Type", `${_constants1.CONTENT_TYPE_DEFERRED}; charset=UTF-8`);
131
137
  init.headers = headers;
132
138
  response = new _node.Response(body, init);
133
139
  }
@@ -149,5 +155,7 @@ const handleRequest = async ({ context, serverRoutes, routes: routesConfig }) =>
149
155
  }
150
156
  });
151
157
  }
158
+ const cost = end();
159
+ reporter.reportTiming(`${_constants.LOADER_REPORTER_NAME}-navigation`, cost);
152
160
  await sendLoaderResponse(res, response);
153
161
  };
@@ -1,53 +1,93 @@
1
1
  import { _ as _async_to_generator } from "@swc/helpers/_/_async_to_generator";
2
2
  import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array";
3
3
  import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
4
+ import { promisify } from "util";
5
+ import { logger } from "@modern-js/utils/logger";
4
6
  import { generateClient } from "./generateClient";
5
7
  export default function loader(source) {
6
8
  return _loader.apply(this, arguments);
7
9
  }
8
10
  function _loader() {
9
11
  _loader = _async_to_generator(function(source) {
10
- var _this__compiler, target, resourceQuery, options, code;
12
+ var _this__compiler, target, resourceQuery, options, readFile, clientDataPath, clientDataContent, error, code;
11
13
  return _ts_generator(this, function(_state) {
12
- this.cacheable();
13
- target = (_this__compiler = this._compiler) === null || _this__compiler === void 0 ? void 0 : _this__compiler.options.target;
14
- if (target === "node") {
15
- return [
16
- 2,
17
- source
18
- ];
14
+ switch (_state.label) {
15
+ case 0:
16
+ this.cacheable();
17
+ target = (_this__compiler = this._compiler) === null || _this__compiler === void 0 ? void 0 : _this__compiler.options.target;
18
+ if (target === "node") {
19
+ return [
20
+ 2,
21
+ source
22
+ ];
23
+ }
24
+ if (target === "webworker") {
25
+ return [
26
+ 2,
27
+ source
28
+ ];
29
+ }
30
+ resourceQuery = this.resourceQuery;
31
+ options = resourceQuery.slice(1).split("&").map(function(item) {
32
+ return item.split("=");
33
+ }).reduce(function(pre, cur) {
34
+ var _cur = _sliced_to_array(cur, 2), key = _cur[0], value = _cur[1];
35
+ if (!key || !value) {
36
+ return pre;
37
+ }
38
+ pre[key] = value;
39
+ return pre;
40
+ }, {});
41
+ if (!options.mapFile) {
42
+ return [
43
+ 2,
44
+ source
45
+ ];
46
+ }
47
+ if (!options.clientData)
48
+ return [
49
+ 3,
50
+ 4
51
+ ];
52
+ readFile = promisify(this.fs.readFile);
53
+ _state.label = 1;
54
+ case 1:
55
+ _state.trys.push([
56
+ 1,
57
+ 3,
58
+ ,
59
+ 4
60
+ ]);
61
+ clientDataPath = this.resourcePath.includes(".loader.") ? this.resourcePath.replace(".loader.", ".data.client.") : this.resourcePath.replace(".data.", ".data.client.");
62
+ return [
63
+ 4,
64
+ readFile(clientDataPath)
65
+ ];
66
+ case 2:
67
+ clientDataContent = _state.sent();
68
+ return [
69
+ 2,
70
+ clientDataContent
71
+ ];
72
+ case 3:
73
+ error = _state.sent();
74
+ if (process.env.NODE_ENV === "development") {
75
+ logger.error("Failed to read the clientData file ".concat(options.clientData));
76
+ }
77
+ return [
78
+ 3,
79
+ 4
80
+ ];
81
+ case 4:
82
+ code = generateClient({
83
+ mapFile: options.mapFile,
84
+ loaderId: options.loaderId
85
+ });
86
+ return [
87
+ 2,
88
+ code
89
+ ];
19
90
  }
20
- if (target === "webworker") {
21
- return [
22
- 2,
23
- source
24
- ];
25
- }
26
- resourceQuery = this.resourceQuery;
27
- options = resourceQuery.slice(1).split("&").map(function(item) {
28
- return item.split("=");
29
- }).reduce(function(pre, cur) {
30
- var _cur = _sliced_to_array(cur, 2), key = _cur[0], value = _cur[1];
31
- if (!key || !value) {
32
- return pre;
33
- }
34
- pre[key] = value;
35
- return pre;
36
- }, {});
37
- if (!options.mapFile) {
38
- return [
39
- 2,
40
- source
41
- ];
42
- }
43
- code = generateClient({
44
- mapFile: options.mapFile,
45
- loaderId: options.loaderId
46
- });
47
- return [
48
- 2,
49
- code
50
- ];
51
91
  });
52
92
  });
53
93
  return _loader.apply(this, arguments);
@@ -6,7 +6,9 @@ import { installGlobals, writeReadableStreamToWritable, Response as NodeResponse
6
6
  import { createStaticHandler, ErrorResponse, UNSAFE_DEFERRED_SYMBOL as DEFERRED_SYMBOL } from "@modern-js/utils/runtime/remix-router";
7
7
  import { transformNestedRoutes } from "@modern-js/utils/runtime/nested-routes";
8
8
  import { isPlainObject } from "@modern-js/utils/lodash";
9
- import { matchEntry } from "@modern-js/utils/runtime-node";
9
+ import { matchEntry, createRequestContext, reporterCtx } from "@modern-js/utils/runtime-node";
10
+ import { time } from "@modern-js/utils/universal/time";
11
+ import { LOADER_REPORTER_NAME } from "@modern-js/utils/universal/constants";
10
12
  import { CONTENT_TYPE_DEFERRED, LOADER_ID_PARAM } from "../common/constants";
11
13
  import { createDeferredReadableStream } from "./response";
12
14
  installGlobals();
@@ -155,7 +157,7 @@ var sendLoaderResponse = function() {
155
157
  }();
156
158
  export var handleRequest = function() {
157
159
  var _ref = _async_to_generator(function(param) {
158
- var context, serverRoutes, routesConfig, method, query, routeId, entry, basename, routes, queryRoute, res, logger, request, response, deferredData, body, init, headers, error, _logger, message;
160
+ var context, serverRoutes, routesConfig, method, query, routeId, entry, basename, end, res, logger, reporter, routes, queryRoute, request, requestContext, response, deferredData, body, init, headers, error, _logger, message, cost;
159
161
  return _ts_generator(this, function(_state) {
160
162
  switch (_state.label) {
161
163
  case 0:
@@ -172,12 +174,15 @@ export var handleRequest = function() {
172
174
  throw new Error("CSR data loader request only support http GET method");
173
175
  }
174
176
  basename = entry.urlPath;
175
- routes = transformNestedRoutes(routesConfig);
177
+ end = time();
178
+ res = context.res, logger = context.logger, reporter = context.reporter;
179
+ routes = transformNestedRoutes(routesConfig, reporter);
176
180
  queryRoute = createStaticHandler(routes, {
177
181
  basename: basename
178
182
  }).queryRoute;
179
- res = context.res, logger = context.logger;
180
183
  request = createLoaderRequest(context);
184
+ requestContext = createRequestContext();
185
+ requestContext.set(reporterCtx, reporter);
181
186
  _state.label = 1;
182
187
  case 1:
183
188
  _state.trys.push([
@@ -189,7 +194,8 @@ export var handleRequest = function() {
189
194
  return [
190
195
  4,
191
196
  queryRoute(request, {
192
- routeId: routeId
197
+ routeId: routeId,
198
+ requestContext: requestContext
193
199
  })
194
200
  ];
195
201
  case 2:
@@ -237,6 +243,8 @@ export var handleRequest = function() {
237
243
  4
238
244
  ];
239
245
  case 4:
246
+ cost = end();
247
+ reporter.reportTiming("".concat(LOADER_REPORTER_NAME, "-navigation"), cost);
240
248
  return [
241
249
  4,
242
250
  sendLoaderResponse(res, response)
@@ -1,3 +1,5 @@
1
+ import { promisify } from "util";
2
+ import { logger } from "@modern-js/utils/logger";
1
3
  import { generateClient } from "./generateClient";
2
4
  export default async function loader(source) {
3
5
  var _this__compiler;
@@ -23,6 +25,18 @@ export default async function loader(source) {
23
25
  if (!options.mapFile) {
24
26
  return source;
25
27
  }
28
+ if (options.clientData) {
29
+ const readFile = promisify(this.fs.readFile);
30
+ try {
31
+ const clientDataPath = this.resourcePath.includes(".loader.") ? this.resourcePath.replace(".loader.", ".data.client.") : this.resourcePath.replace(".data.", ".data.client.");
32
+ const clientDataContent = await readFile(clientDataPath);
33
+ return clientDataContent;
34
+ } catch (error) {
35
+ if (process.env.NODE_ENV === "development") {
36
+ logger.error(`Failed to read the clientData file ${options.clientData}`);
37
+ }
38
+ }
39
+ }
26
40
  const code = generateClient({
27
41
  mapFile: options.mapFile,
28
42
  loaderId: options.loaderId
@@ -2,7 +2,9 @@ import { installGlobals, writeReadableStreamToWritable, Response as NodeResponse
2
2
  import { createStaticHandler, ErrorResponse, UNSAFE_DEFERRED_SYMBOL as DEFERRED_SYMBOL } from "@modern-js/utils/runtime/remix-router";
3
3
  import { transformNestedRoutes } from "@modern-js/utils/runtime/nested-routes";
4
4
  import { isPlainObject } from "@modern-js/utils/lodash";
5
- import { matchEntry } from "@modern-js/utils/runtime-node";
5
+ import { matchEntry, createRequestContext, reporterCtx } from "@modern-js/utils/runtime-node";
6
+ import { time } from "@modern-js/utils/universal/time";
7
+ import { LOADER_REPORTER_NAME } from "@modern-js/utils/universal/constants";
6
8
  import { CONTENT_TYPE_DEFERRED, LOADER_ID_PARAM } from "../common/constants";
7
9
  import { createDeferredReadableStream } from "./response";
8
10
  installGlobals();
@@ -81,16 +83,20 @@ export const handleRequest = async ({ context, serverRoutes, routes: routesConfi
81
83
  throw new Error("CSR data loader request only support http GET method");
82
84
  }
83
85
  const basename = entry.urlPath;
84
- const routes = transformNestedRoutes(routesConfig);
86
+ const end = time();
87
+ const { res, logger, reporter } = context;
88
+ const routes = transformNestedRoutes(routesConfig, reporter);
85
89
  const { queryRoute } = createStaticHandler(routes, {
86
90
  basename
87
91
  });
88
- const { res, logger } = context;
89
92
  const request = createLoaderRequest(context);
93
+ const requestContext = createRequestContext();
94
+ requestContext.set(reporterCtx, reporter);
90
95
  let response;
91
96
  try {
92
97
  response = await queryRoute(request, {
93
- routeId
98
+ routeId,
99
+ requestContext
94
100
  });
95
101
  if (isResponse(response) && isRedirectResponse(response.status)) {
96
102
  response = convertModernRedirectResponse(response.headers, basename);
@@ -127,5 +133,7 @@ export const handleRequest = async ({ context, serverRoutes, routes: routesConfi
127
133
  }
128
134
  });
129
135
  }
136
+ const cost = end();
137
+ reporter.reportTiming(`${LOADER_REPORTER_NAME}-navigation`, cost);
130
138
  await sendLoaderResponse(res, response);
131
139
  };
@@ -1,5 +1,9 @@
1
+ /// <reference types="node" />
1
2
  import type { LoaderContext } from 'webpack';
2
- export default function loader(this: LoaderContext<{
3
+ type Context = {
3
4
  mapFile: string;
4
5
  loaderId?: string;
5
- }>, source: string): Promise<string>;
6
+ clientData?: boolean;
7
+ };
8
+ export default function loader(this: LoaderContext<Context>, source: string): Promise<string | Buffer | undefined>;
9
+ export {};
package/package.json CHANGED
@@ -15,28 +15,28 @@
15
15
  "modern",
16
16
  "modern.js"
17
17
  ],
18
- "version": "2.31.2",
18
+ "version": "2.32.0",
19
19
  "engines": {
20
20
  "node": ">=14.17.6"
21
21
  },
22
- "jsnext:source": "./src/index.ts",
23
- "types": "./dist/types/index.d.ts",
24
- "main": "./dist/cjs/index.js",
25
- "module": "./dist/esm/index.js",
22
+ "jsnext:source": "./src/runtime/index.ts",
23
+ "types": "./dist/types/runtime/index.d.ts",
24
+ "main": "./dist/cjs/runtime/index.js",
25
+ "module": "./dist/esm/runtime/index.js",
26
26
  "exports": {
27
27
  "./loader": {
28
- "jsnext:source": "./src/cli/loader.ts",
29
28
  "types": "./dist/types/cli/loader.d.ts",
29
+ "jsnext:source": "./src/cli/loader.ts",
30
30
  "default": "./dist/cjs/cli/loader.js"
31
31
  },
32
32
  "./server": {
33
- "jsnext:source": "./src/server/index.ts",
34
33
  "types": "./dist/types/server/index.d.ts",
34
+ "jsnext:source": "./src/server/index.ts",
35
35
  "default": "./dist/cjs/server/index.js"
36
36
  },
37
37
  "./runtime": {
38
- "jsnext:source": "./src/runtime/index.ts",
39
38
  "types": "./dist/types/runtime/index.d.ts",
39
+ "jsnext:source": "./src/runtime/index.ts",
40
40
  "default": "./dist/esm/runtime/index.js"
41
41
  }
42
42
  },
@@ -58,7 +58,7 @@
58
58
  "@remix-run/node": "^1.12.0",
59
59
  "path-to-regexp": "^6.2.0",
60
60
  "@swc/helpers": "0.5.1",
61
- "@modern-js/utils": "2.31.2"
61
+ "@modern-js/utils": "2.32.0"
62
62
  },
63
63
  "devDependencies": {
64
64
  "@types/babel__core": "^7.20.0",
@@ -72,14 +72,13 @@
72
72
  "ts-jest": "^29.1.0",
73
73
  "typescript": "^5",
74
74
  "webpack": "^5.88.1",
75
- "webpack-chain": "^6.5.1",
76
75
  "react": "^18",
77
76
  "react-dom": "^18",
78
- "@modern-js/types": "2.31.2",
79
- "@modern-js/server-core": "2.31.2",
80
- "@modern-js/core": "2.31.2",
81
- "@scripts/build": "2.31.1",
82
- "@scripts/jest-config": "2.31.1"
77
+ "@modern-js/types": "2.32.0",
78
+ "@modern-js/core": "2.32.0",
79
+ "@modern-js/server-core": "2.32.0",
80
+ "@scripts/build": "2.32.0",
81
+ "@scripts/jest-config": "2.32.0"
83
82
  },
84
83
  "peerDependencies": {
85
84
  "react": ">=17.0.0"