@freshpack/webpack 1.0.1 → 1.0.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/resolve.js CHANGED
@@ -1,4 +1,4 @@
1
- import { RequestedModuleType, ResolutionMode, Workspace, } from "@deno/loader";
1
+ import { RequestedModuleType, ResolutionMode, Workspace } from "@deno/loader";
2
2
  import { assert, unreachable } from "@std/assert";
3
3
  import Webpack from "webpack";
4
4
  import { Buffer } from "node:buffer";
@@ -8,398 +8,388 @@ import { defineRequire } from "./requireHook.js";
8
8
  import { registerDenoLoader } from "./transpileLoader.js";
9
9
  const internalTranspileLoader = defineRequire("@freshpack/webpack/internal-deno-transpile-loader", await import("./transpileLoader.js"));
10
10
  function resolverSpan(logSuccess, name, ...args) {
11
- let isResolved;
12
- let timeoutId = setTimeout(() => {
13
- console.error("[RESOLVE]", "possibly stuck at", name, ...args);
14
- if (isResolved !== undefined) {
15
- console.error(" ", "...but it was resolved:", ...isResolved);
16
- }
17
- }, 5000);
18
- const cancelStuck = () => {
19
- if (timeoutId !== undefined) {
20
- clearTimeout(timeoutId);
21
- timeoutId = undefined;
11
+ let isResolved;
12
+ let timeoutId = setTimeout(() => {
13
+ console.error("[RESOLVE]", "possibly stuck at", name, ...args);
14
+ if (isResolved !== undefined) {
15
+ console.error(" ", "...but it was resolved:", ...isResolved);
16
+ }
17
+ }, 5000);
18
+ const cancelStuck = () => {
19
+ if (timeoutId !== undefined) {
20
+ clearTimeout(timeoutId);
21
+ timeoutId = undefined;
22
+ }
23
+ };
24
+ let postponed = false;
25
+ return {
26
+ simplify(...newArgs) {
27
+ args = newArgs;
28
+ },
29
+ errored(e, ...err) {
30
+ cancelStuck();
31
+ console.error("[RESOLVE]", "errored", name, ...args, "=>", e, ...err);
32
+ },
33
+ resolved(...out) {
34
+ cancelStuck();
35
+ if (isResolved === undefined) {
36
+ isResolved = out;
37
+ if (logSuccess) {
38
+ console.info("[RESOLVE]", name, ...args, "=>", ...out);
22
39
  }
23
- };
24
- let postponed = false;
25
- return {
26
- simplify(...newArgs) {
27
- args = newArgs;
28
- },
29
- errored(e, ...err) {
30
- cancelStuck();
31
- console.error("[RESOLVE]", "errored", name, ...args, "=>", e, ...err);
32
- },
33
- resolved(...out) {
34
- cancelStuck();
35
- if (isResolved === undefined) {
36
- isResolved = out;
37
- if (logSuccess) {
38
- console.info("[RESOLVE]", name, ...args, "=>", ...out);
39
- }
40
- }
41
- else {
42
- console.error("[RESOLVE]", "resolved twice", name, ...args, "=>", ...out);
43
- console.error(" ", "...previously resolved to:", ...isResolved);
44
- }
45
- },
46
- [Symbol.dispose]() {
47
- if (postponed)
48
- return;
49
- cancelStuck();
50
- if (isResolved === undefined) {
51
- console.error("[RESOLVE]", "missing resolved() call!", name, ...args);
52
- }
53
- },
54
- postpone() {
55
- postponed = true;
56
- },
57
- };
40
+ } else {
41
+ console.error("[RESOLVE]", "resolved twice", name, ...args, "=>", ...out);
42
+ console.error(" ", "...previously resolved to:", ...isResolved);
43
+ }
44
+ },
45
+ [Symbol.dispose]() {
46
+ if (postponed) return;
47
+ cancelStuck();
48
+ if (isResolved === undefined) {
49
+ console.error("[RESOLVE]", "missing resolved() call!", name, ...args);
50
+ }
51
+ },
52
+ postpone() {
53
+ postponed = true;
54
+ }
55
+ };
58
56
  }
59
57
  const MATCH_RESOURCE = /^([^!]+)!=!/;
60
58
  function requestedModuleType(type) {
61
- if (type === "asset/source")
62
- return RequestedModuleType.Text;
63
- if (type.startsWith("asset/"))
64
- return RequestedModuleType.Bytes;
65
- return RequestedModuleType.Default;
59
+ if (type === "asset/source") return RequestedModuleType.Text;
60
+ if (type.startsWith("asset/")) return RequestedModuleType.Bytes;
61
+ return RequestedModuleType.Default;
66
62
  }
67
63
  async function simpleDenoResolve(loader, issuer, request, esm) {
68
- const matchResource = MATCH_RESOURCE.exec(request);
69
- if (matchResource) {
70
- const resolved = await simpleDenoResolve(loader, issuer, request.slice(matchResource[0].length), esm);
71
- return `${matchResource[0]}${resolved}`;
72
- }
73
- let resolution;
74
- if (request.startsWith("/") && issuer.startsWith("https://")) {
75
- resolution = new URL(request, new URL(issuer).origin).href;
76
- }
77
- else if (request.startsWith("/")) {
78
- resolution = `file://${request}`;
79
- }
80
- else if (request === ".") {
81
- resolution = `file://${dirname(issuer)}`;
82
- }
83
- else {
84
- resolution = await loader.resolve(request, issuer, esm ? ResolutionMode.Import : ResolutionMode.Require);
85
- }
86
- if (resolution.startsWith("node:")) {
87
- // PASS: Fallback or external
88
- }
89
- else if (resolution.startsWith("https:")) {
90
- // PASS: https loader
91
- }
92
- else if (resolution.startsWith("file:")) {
93
- if (issuer.startsWith("https://")) {
94
- // PASS: Disambiguate origin-relative,
95
- // we don't want to convert /home/user/.cache/deno/npm/.../file.ts imported from
96
- // https://esm.sh to become https://esm.sh/home/user/...
97
- }
98
- else {
99
- resolution = stripFileUrl(resolution);
100
- }
64
+ const matchResource = MATCH_RESOURCE.exec(request);
65
+ if (matchResource) {
66
+ const resolved = await simpleDenoResolve(loader, issuer, request.slice(matchResource[0].length), esm);
67
+ return `${matchResource[0]}${resolved}`;
68
+ }
69
+ let resolution;
70
+ if (request.startsWith("/") && issuer.startsWith("https://")) {
71
+ resolution = new URL(request, new URL(issuer).origin).href;
72
+ } else if (request.startsWith("/")) {
73
+ resolution = `file://${request}`;
74
+ } else if (request === ".") {
75
+ resolution = `file://${dirname(issuer)}`;
76
+ } else {
77
+ resolution = await loader.resolve(request, issuer, esm ? ResolutionMode.Import : ResolutionMode.Require);
78
+ }
79
+ if (resolution.startsWith("node:")) {
80
+ // PASS: Fallback or external
81
+ } else if (resolution.startsWith("https:")) {
82
+ // PASS: https loader
83
+ } else if (resolution.startsWith("file:")) {
84
+ if (issuer.startsWith("https://")) {
85
+ // PASS: Disambiguate origin-relative,
86
+ // we don't want to convert /home/user/.cache/deno/npm/.../file.ts imported from
87
+ // https://esm.sh to become https://esm.sh/home/user/...
88
+ } else {
89
+ resolution = stripFileUrl(resolution);
101
90
  }
102
- else {
103
- assert(false, `unexpected resolution: ${resolution}`);
104
- }
105
- return resolution;
91
+ } else {
92
+ assert(false, `unexpected resolution: ${resolution}`);
93
+ }
94
+ return resolution;
106
95
  }
107
96
  class FixupResolvePlugin {
108
- apply(resolver) {
109
- const resolved = resolver.getHook("resolved");
110
- for (const hook of ["resolve", "internal-resolve"]) {
111
- resolver.getHook(hook).tapAsync({
112
- name: "Ignore https requests",
113
- stage: -100000,
114
- }, (req, ctx, cb) => {
115
- if (req.path && req.path.startsWith("https://") && req.request === "." ||
116
- req.request && req.request.startsWith("https://")) {
117
- return resolver.doResolve(resolved, req, "context resolve", ctx, cb);
118
- }
119
- // console.log("DIR RESOLVE!!!", req);
120
- return cb(null);
121
- // return cb(null, ...args);
122
- });
97
+ apply(resolver) {
98
+ const resolved = resolver.getHook("resolved");
99
+ for (const hook of ["resolve", "internal-resolve"]) {
100
+ resolver.getHook(hook).tapAsync({
101
+ name: "Ignore https requests",
102
+ stage: -100000
103
+ }, (req, ctx, cb) => {
104
+ if (req.path && req.path.startsWith("https://") && req.request === "." || req.request && req.request.startsWith("https://")) {
105
+ return resolver.doResolve(resolved, req, "context resolve", ctx, cb);
123
106
  }
124
- // resolver.hooks.result.tap({
125
- // name: "resolvers in https requests",
126
- // stage: -100000,
127
- // }, (req, ctx) => {
128
- // console.log("post resolve", req);
129
- // return;
130
- // });
131
- // resolver.hooks.resolve.tap({ name: "Fixup" }, (req) => {
132
- // console.log('fixup resolver', req.request);
133
- // return req;
134
- // });
107
+ // console.log("DIR RESOLVE!!!", req);
108
+ return cb(null);
109
+ // return cb(null, ...args);
110
+ });
135
111
  }
112
+ // resolver.hooks.result.tap({
113
+ // name: "resolvers in https requests",
114
+ // stage: -100000,
115
+ // }, (req, ctx) => {
116
+ // console.log("post resolve", req);
117
+ // return;
118
+ // });
119
+ // resolver.hooks.resolve.tap({ name: "Fixup" }, (req) => {
120
+ // console.log('fixup resolver', req.request);
121
+ // return req;
122
+ // });
123
+ }
136
124
  }
137
125
  class DenoResolvePlugin {
138
- jsr;
139
- constructor(jsr) {
140
- this.jsr = jsr;
141
- }
142
- apply(resolver) {
143
- // console.log("HOOKS", resolver.hooks);
144
- const source = resolver.getHook("resolve");
145
- const target = resolver.getHook("resolved");
146
- source.tapAsync({ name: "Deno" }, async (request, ctx, cb) => {
147
- using span = resolverSpan(this.jsr.opts.debug, "deno resolver", request, ctx);
148
- try {
149
- const loader = await this.jsr.loader;
150
- let requestIssuer;
151
- if (request.context && "issuer" in request.context) {
152
- const issuer = request.context.issuer;
153
- assert(typeof issuer === "string" || issuer === null, "invalid context issuer");
154
- if (issuer !== "" && issuer !== null) {
155
- requestIssuer = issuer;
156
- }
157
- }
158
- if (requestIssuer === undefined && request.path) {
159
- requestIssuer = ensureModPath(request.path);
160
- }
161
- assert(requestIssuer !== undefined, "failed to determine requestIssuer");
162
- const requestRequest = request.request;
163
- assert(requestRequest !== undefined, "failed to determine requestRequest");
164
- span.simplify(requestIssuer, requestRequest);
165
- const resolution = await simpleDenoResolve(loader, requestIssuer, requestRequest, request.module ?? true);
166
- const resolvedPath = resolution.startsWith("file://")
167
- ? stripFileUrl(resolution)
168
- : resolution;
169
- return resolver.doResolve(target, Object.assign({}, request, {
170
- path: resolvedPath,
171
- request: undefined,
172
- }), `resolved by deno ${request.request} (from ${request.path})`, ctx, (err, result) => {
173
- span.resolved("doResolve result", resolution, err, result);
174
- if (err !== undefined || result !== undefined) {
175
- return cb(err, result);
176
- }
177
- cb(null, null);
178
- });
179
- }
180
- catch (e) {
181
- span.errored(e, request, ctx);
182
- cb(e, null);
183
- }
126
+ constructor(jsr) {
127
+ this.jsr = jsr;
128
+ }
129
+ apply(resolver) {
130
+ // console.log("HOOKS", resolver.hooks);
131
+ const source = resolver.getHook("resolve");
132
+ const target = resolver.getHook("resolved");
133
+ source.tapAsync({
134
+ name: "Deno"
135
+ }, async (request, ctx, cb) => {
136
+ using span = resolverSpan(this.jsr.opts.debug, "deno resolver", request, ctx);
137
+ try {
138
+ const loader = await this.jsr.loader;
139
+ let requestIssuer;
140
+ if (request.context && "issuer" in request.context) {
141
+ const issuer = request.context.issuer;
142
+ assert(typeof issuer === "string" || issuer === null, "invalid context issuer");
143
+ if (issuer !== "" && issuer !== null) {
144
+ requestIssuer = issuer;
145
+ }
146
+ }
147
+ if (requestIssuer === undefined && request.path) {
148
+ requestIssuer = ensureModPath(request.path);
149
+ }
150
+ assert(requestIssuer !== undefined, "failed to determine requestIssuer");
151
+ const requestRequest = request.request;
152
+ assert(requestRequest !== undefined, "failed to determine requestRequest");
153
+ span.simplify(requestIssuer, requestRequest);
154
+ const resolution = await simpleDenoResolve(loader, requestIssuer, requestRequest, request.module ?? true);
155
+ const resolvedPath = resolution.startsWith("file://") ? stripFileUrl(resolution) : resolution;
156
+ return resolver.doResolve(target, Object.assign({}, request, {
157
+ path: resolvedPath,
158
+ request: undefined
159
+ }), `resolved by deno ${request.request} (from ${request.path})`, ctx, (err, result) => {
160
+ span.resolved("doResolve result", resolution, err, result);
161
+ if (err !== undefined || result !== undefined) {
162
+ return cb(err, result);
163
+ }
164
+ cb(null, null);
184
165
  });
185
- }
166
+ } catch (e) {
167
+ span.errored(e, request, ctx);
168
+ cb(e, null);
169
+ }
170
+ });
171
+ }
186
172
  }
187
173
  async function fillResourceData(data, loader, url) {
188
- data.__resolvedByFreshpack = { data, url, loaded: undefined };
189
- if (url.protocol === "file:") {
190
- data.resource = url.pathname;
191
- data.path = url.pathname;
192
- data.data.path = url.pathname;
193
- data.context = dirname(url.pathname);
194
- }
195
- else {
196
- const loaded = await loader.load(url.href, RequestedModuleType.Default);
197
- data.__resolvedByFreshpack.loaded = loaded;
198
- data.resource = loaded.specifier;
199
- data.path = loaded.specifier;
200
- data.data.path = loaded.specifier;
201
- data.context = new URL(".", url).href.slice(0, -1);
202
- }
203
- data.query = url.search;
204
- data.data.query = url.search;
205
- data.fragment = url.hash;
206
- // data.type = "application/javascript";
174
+ data.__resolvedByFreshpack = {
175
+ data,
176
+ url,
177
+ loaded: undefined
178
+ };
179
+ if (url.protocol === "file:") {
180
+ data.resource = url.pathname;
181
+ data.path = url.pathname;
182
+ data.data.path = url.pathname;
183
+ data.context = dirname(url.pathname);
184
+ } else {
185
+ const loaded = await loader.load(url.href, RequestedModuleType.Default);
186
+ data.__resolvedByFreshpack.loaded = loaded;
187
+ data.resource = loaded.specifier;
188
+ data.path = loaded.specifier;
189
+ data.data.path = loaded.specifier;
190
+ data.context = new URL(".", url).href.slice(0, -1);
191
+ }
192
+ data.query = url.search;
193
+ data.data.query = url.search;
194
+ data.fragment = url.hash;
195
+
196
+ // data.type = "application/javascript";
207
197
  }
208
198
  function breakResourceData(data) {
209
- data.path = "error";
210
- data.context = "error";
211
- data.resource = "error";
199
+ data.path = "error";
200
+ data.context = "error";
201
+ data.resource = "error";
212
202
  }
213
203
  function ensurePluginList(resolver, list, append) {
214
- if (resolver[list] === undefined) {
215
- resolver[list] = [];
216
- }
217
- assert(Array.isArray(resolver[list]));
218
- resolver[list].push(append);
204
+ if (resolver[list] === undefined) {
205
+ resolver[list] = [];
206
+ }
207
+ assert(Array.isArray(resolver[list]));
208
+ resolver[list].push(append);
219
209
  }
220
210
  export class DenoLoaderPlugin {
221
- opts;
222
- patchImport;
223
- workspace;
224
- #transpileLoaderId;
225
- #loader;
226
- get loader() {
227
- return (this.#loader ??= this.workspace.createLoader());
211
+ workspace;
212
+ #transpileLoaderId;
213
+ #loader;
214
+ get loader() {
215
+ return this.#loader ??= this.workspace.createLoader();
216
+ }
217
+ constructor(opts, patchImport = (_, v) => v) {
218
+ this.opts = opts;
219
+ this.patchImport = patchImport;
220
+ opts.noTranspile = false;
221
+ opts.preserveJsx = false;
222
+ opts.platform = "browser";
223
+ this.workspace = new Workspace(opts);
224
+ this.#transpileLoaderId = registerDenoLoader(() => this.loader);
225
+ }
226
+ apply(compiler) {
227
+ if (compiler.options.resolve.plugins === undefined) {
228
+ compiler.options.resolve.plugins = [];
229
+ }
230
+ assert(Array.isArray(compiler.options.resolve.plugins));
231
+ compiler.options.resolve.plugins.push(new FixupResolvePlugin());
232
+ if (compiler.options.resolveLoader.plugins === undefined) {
233
+ compiler.options.resolveLoader.plugins = [];
228
234
  }
229
- constructor(opts, patchImport = (_, v) => v) {
230
- this.opts = opts;
231
- this.patchImport = patchImport;
232
- opts.noTranspile = false;
233
- opts.preserveJsx = false;
234
- opts.platform = "browser";
235
- this.workspace = new Workspace(opts);
236
- this.#transpileLoaderId = registerDenoLoader(() => this.loader);
235
+ assert(Array.isArray(compiler.options.resolveLoader.plugins));
236
+ compiler.options.resolveLoader.plugins.push(new DenoResolvePlugin(this));
237
+ compiler.options.resolve.modules = [];
238
+ compiler.options.resolve.roots = [];
239
+ compiler.options.resolve.descriptionFiles = [];
240
+ compiler.options.resolveLoader.modules = [];
241
+ compiler.options.resolveLoader.descriptionFiles = [];
242
+ compiler.options.externalsPresets.web = false;
243
+ compiler.options.externalsPresets.webAsync = false;
244
+ if (!compiler.options.output.enabledLibraryTypes) {
245
+ compiler.options.output.enabledLibraryTypes = [];
237
246
  }
238
- apply(compiler) {
239
- if (compiler.options.resolve.plugins === undefined) {
240
- compiler.options.resolve.plugins = [];
247
+ if (!compiler.options.output.enabledLibraryTypes.includes("module")) {
248
+ compiler.options.output.enabledLibraryTypes.push("module");
249
+ }
250
+ compiler.options.output.library = {
251
+ type: "module"
252
+ };
253
+ compiler.options.output.module = true;
254
+ compiler.options.experiments.outputModule = true;
255
+
256
+ // Deno provides its own type-stripping when no ts loader is present
257
+ // It is not required since deno-loader handles typescript.
258
+ compiler.options.experiments.typescript = false;
259
+ compiler.hooks.compilation.tap("JsrPlugin", (compilation, {
260
+ normalModuleFactory
261
+ }) => {
262
+ normalModuleFactory.hooks.afterResolve.tap("JsrPlugin", ({
263
+ createData: data
264
+ }) => {
265
+ const resource = data.resource;
266
+ if (resource === undefined || resource.includes("://") || !/\.[cm]?[jt]sx?$/.test(resource)) {
267
+ return;
241
268
  }
242
- assert(Array.isArray(compiler.options.resolve.plugins));
243
- compiler.options.resolve.plugins.push(new FixupResolvePlugin());
244
- if (compiler.options.resolveLoader.plugins === undefined) {
245
- compiler.options.resolveLoader.plugins = [];
269
+ data.loaders.push({
270
+ loader: internalTranspileLoader,
271
+ options: {
272
+ id: this.#transpileLoaderId
273
+ },
274
+ ident: null,
275
+ type: null
276
+ });
277
+ });
278
+ normalModuleFactory.hooks.beforeResolve.tapPromise("JsrPlugin", async resolveData => {
279
+ using span = resolverSpan(this.opts.debug, "jsr beforeResolve", resolveData);
280
+ try {
281
+ // try {
282
+ const loader = await this.loader;
283
+ let requestIssuer;
284
+ if (resolveData.contextInfo.issuer !== "") {
285
+ requestIssuer = resolveData.contextInfo.issuer;
286
+ }
287
+ if (requestIssuer === undefined || requestIssuer === null) {
288
+ requestIssuer = ensureModPath(resolveData.context);
289
+ }
290
+ assert(requestIssuer != undefined, "failed to determine request issuer");
291
+ let requestRequest = resolveData.request;
292
+ const dependencyType = resolveData.dependencyType;
293
+ span.simplify({
294
+ requestIssuer,
295
+ requestRequest,
296
+ dependencyType
297
+ });
298
+ if (requestRequest.startsWith("data:") || requestRequest.startsWith("https:") && !requestRequest.startsWith("https://jsr.io/")) {
299
+ // IDK why those requests even land in this method in some circumstances, returning false
300
+ // here makes them being processed by the handlers below. Most probably I'm missing something,
301
+ // or this webpack api is not intended for such huge loaded replacements.
302
+ span.resolved("delegate-builtin");
303
+ return false;
304
+ }
305
+ if (dependencyType === "url" &&
306
+ // new URL() references are always relative, but import.meta.resolve() takes import specifiers.
307
+ resolveData.dependencies[0]?.type !== "import.meta.resolve()") {
308
+ requestRequest = "./" + requestRequest;
309
+ }
310
+ requestRequest = this.patchImport(requestIssuer, requestRequest);
311
+ const resolution = await simpleDenoResolve(loader, requestIssuer, requestRequest, true);
312
+ span.resolved(resolution);
313
+ resolveData.request = this.patchImport(requestIssuer, resolution);
314
+ } catch (e) {
315
+ span.errored(e);
316
+ throw e;
246
317
  }
247
- assert(Array.isArray(compiler.options.resolveLoader.plugins));
248
- compiler.options.resolveLoader.plugins.push(new DenoResolvePlugin(this));
249
- compiler.options.resolve.modules = [];
250
- compiler.options.resolve.roots = [];
251
- compiler.options.resolve.descriptionFiles = [];
252
- compiler.options.resolveLoader.modules = [];
253
- compiler.options.resolveLoader.descriptionFiles = [];
254
- compiler.options.externalsPresets.web = false;
255
- compiler.options.externalsPresets.webAsync = false;
256
- if (!compiler.options.output.enabledLibraryTypes) {
257
- compiler.options.output.enabledLibraryTypes = [];
318
+ });
319
+ normalModuleFactory.hooks.resolveForScheme.for("node").tapPromise("JsrPlugin", async (resourceData, resolveData) => {
320
+ using span = resolverSpan(this.opts.debug, "node resolveForScheme", resolveData.request);
321
+ resourceData.path = false;
322
+ resourceData.data.path = false;
323
+ span.resolved("stubbed: empty module");
324
+ return true;
325
+ });
326
+ normalModuleFactory.hooks.resolveForScheme.for("jsr").tapPromise("JsrPlugin", async (resourceData, resolveData) => {
327
+ using span = resolverSpan(this.opts.debug, "jsr resolveForScheme", resolveData);
328
+ breakResourceData(resourceData);
329
+ unreachable("jsr should be resolved to https by deno resolver");
330
+ });
331
+ normalModuleFactory.hooks.resolveForScheme.for("npm").tapPromise("JsrPlugin", async (resourceData, resolveData) => {
332
+ using span = resolverSpan(this.opts.debug, "npm resolveForScheme", resolveData);
333
+ breakResourceData(resourceData);
334
+ unreachable("npm should be resolved to files by deno resolver");
335
+ });
336
+ normalModuleFactory.hooks.resolveForScheme.for("https").tapPromise("JsrPlugin", async (resourceData, resolveData) => {
337
+ using span = resolverSpan(this.opts.debug, "https resolveForScheme", resolveData.request);
338
+ const loader = await this.loader;
339
+ // const newResourceData = {...resourceData};
340
+ await fillResourceData(resourceData, loader, new URL(resolveData.request));
341
+ span.resolved("done");
342
+ return true;
343
+ });
344
+ normalModuleFactory.hooks.resolveInScheme.for("https").tapPromise("JsrPlugin", async (resourceData, data) => {
345
+ using span = resolverSpan(this.opts.debug, "https resolveInScheme", resourceData, data.contextInfo, data.request);
346
+ try {
347
+ const loader = await this.loader;
348
+ const requestRequest = data.request;
349
+ if (requestRequest.startsWith("/")) {
350
+ const requestIssuer = data.contextInfo.issuer;
351
+ assert(requestIssuer && requestIssuer.startsWith("https://"), `unexpected /-prefixed request without https:// issuer: ${requestRequest}`);
352
+ const issuerUrl = new URL(requestIssuer);
353
+ const resolved = new URL(requestRequest, issuerUrl.origin);
354
+ span.resolved("origin-relative url", resolved.href);
355
+ await fillResourceData(resourceData, loader, resolved);
356
+ return true;
357
+ } else {
358
+ const requestIssuer = data.contextInfo.issuer;
359
+ assert(requestIssuer !== "");
360
+ const resolved = await loader.resolve(requestRequest, requestIssuer, ResolutionMode.Import);
361
+ span.resolved("url resolved", resolved);
362
+ assert(resolved.startsWith("https:"));
363
+ await fillResourceData(resourceData, loader, new URL(resolved));
364
+ return true;
365
+ }
366
+ } catch (e) {
367
+ span.errored(e);
368
+ breakResourceData(resourceData);
258
369
  }
259
- if (!compiler.options.output.enabledLibraryTypes.includes("module")) {
260
- compiler.options.output.enabledLibraryTypes.push("module");
370
+ });
371
+ const hooks = compiler.webpack.NormalModule.getCompilationHooks(compilation);
372
+ hooks.readResourceForScheme.for("node").tapAsync("JsrPlugin", async (_resource, _module, cb) => {
373
+ cb(null, Buffer.from("module.exports = {};"));
374
+ });
375
+ hooks.readResourceForScheme.for("jsr").tapPromise("JsrPlugin", async (resource, module) => {
376
+ using span = resolverSpan(this.opts.debug, "jsr loadResourceForScheme", resource);
377
+ unreachable("jsr should be resolved to https by deno resolver");
378
+ });
379
+ hooks.readResourceForScheme.for("https").tapAsync("JsrPlugin", async (resource, module, cb) => {
380
+ using span = resolverSpan(this.opts.debug, "https readResourceForScheme", resource, module.type);
381
+ try {
382
+ const loader = await this.loader;
383
+ const loaded = await loader.load(resource, requestedModuleType(module.type));
384
+ // TODO: Should import assertions be handled somehow?
385
+ span.resolved(loaded);
386
+ cb(null, Buffer.from(loaded.code));
387
+ } catch (e) {
388
+ span.errored(e);
389
+ cb(e);
261
390
  }
262
- compiler.options.output.library = { type: "module" };
263
- compiler.options.output.module = true;
264
- compiler.options.experiments.outputModule =
265
- true;
266
- // Deno provides its own type-stripping when no ts loader is present
267
- // It is not required since deno-loader handles typescript.
268
- compiler.options.experiments.typescript = false;
269
- compiler.hooks.compilation.tap("JsrPlugin", (compilation, { normalModuleFactory }) => {
270
- normalModuleFactory.hooks.afterResolve.tap("JsrPlugin", ({ createData: data }) => {
271
- const resource = data.resource;
272
- if (resource === undefined || resource.includes("://") ||
273
- !/\.[cm]?[jt]sx?$/.test(resource)) {
274
- return;
275
- }
276
- data.loaders.push({
277
- loader: internalTranspileLoader,
278
- options: { id: this.#transpileLoaderId },
279
- ident: null,
280
- type: null,
281
- });
282
- });
283
- normalModuleFactory.hooks.beforeResolve.tapPromise("JsrPlugin", async (resolveData) => {
284
- using span = resolverSpan(this.opts.debug, "jsr beforeResolve", resolveData);
285
- try {
286
- // try {
287
- const loader = await this.loader;
288
- let requestIssuer;
289
- if (resolveData.contextInfo.issuer !== "") {
290
- requestIssuer = resolveData.contextInfo.issuer;
291
- }
292
- if (requestIssuer === undefined || requestIssuer === null) {
293
- requestIssuer = ensureModPath(resolveData.context);
294
- }
295
- assert(requestIssuer != undefined, "failed to determine request issuer");
296
- let requestRequest = resolveData.request;
297
- const dependencyType = resolveData.dependencyType;
298
- span.simplify({
299
- requestIssuer,
300
- requestRequest,
301
- dependencyType,
302
- });
303
- if (requestRequest.startsWith("data:") ||
304
- requestRequest.startsWith("https:") &&
305
- !requestRequest.startsWith("https://jsr.io/")) {
306
- // IDK why those requests even land in this method in some circumstances, returning false
307
- // here makes them being processed by the handlers below. Most probably I'm missing something,
308
- // or this webpack api is not intended for such huge loaded replacements.
309
- span.resolved("delegate-builtin");
310
- return false;
311
- }
312
- if (dependencyType === "url" &&
313
- // new URL() references are always relative, but import.meta.resolve() takes import specifiers.
314
- resolveData.dependencies[0]?.type !== "import.meta.resolve()") {
315
- requestRequest = "./" + requestRequest;
316
- }
317
- requestRequest = this.patchImport(requestIssuer, requestRequest);
318
- const resolution = await simpleDenoResolve(loader, requestIssuer, requestRequest, true);
319
- span.resolved(resolution);
320
- resolveData.request = this.patchImport(requestIssuer, resolution);
321
- }
322
- catch (e) {
323
- span.errored(e);
324
- throw e;
325
- }
326
- });
327
- normalModuleFactory.hooks.resolveForScheme.for("node").tapPromise("JsrPlugin", async (resourceData, resolveData) => {
328
- using span = resolverSpan(this.opts.debug, "node resolveForScheme", resolveData.request);
329
- resourceData.path = false;
330
- resourceData.data.path = false;
331
- span.resolved("stubbed: empty module");
332
- return true;
333
- });
334
- normalModuleFactory.hooks.resolveForScheme.for("jsr").tapPromise("JsrPlugin", async (resourceData, resolveData) => {
335
- using span = resolverSpan(this.opts.debug, "jsr resolveForScheme", resolveData);
336
- breakResourceData(resourceData);
337
- unreachable("jsr should be resolved to https by deno resolver");
338
- });
339
- normalModuleFactory.hooks.resolveForScheme.for("npm").tapPromise("JsrPlugin", async (resourceData, resolveData) => {
340
- using span = resolverSpan(this.opts.debug, "npm resolveForScheme", resolveData);
341
- breakResourceData(resourceData);
342
- unreachable("npm should be resolved to files by deno resolver");
343
- });
344
- normalModuleFactory.hooks.resolveForScheme.for("https").tapPromise("JsrPlugin", async (resourceData, resolveData) => {
345
- using span = resolverSpan(this.opts.debug, "https resolveForScheme", resolveData.request);
346
- const loader = await this.loader;
347
- // const newResourceData = {...resourceData};
348
- await fillResourceData(resourceData, loader, new URL(resolveData.request));
349
- span.resolved("done");
350
- return true;
351
- });
352
- normalModuleFactory.hooks.resolveInScheme.for("https").tapPromise("JsrPlugin", async (resourceData, data) => {
353
- using span = resolverSpan(this.opts.debug, "https resolveInScheme", resourceData, data.contextInfo, data.request);
354
- try {
355
- const loader = await this.loader;
356
- const requestRequest = data.request;
357
- if (requestRequest.startsWith("/")) {
358
- const requestIssuer = data.contextInfo.issuer;
359
- assert(requestIssuer && requestIssuer.startsWith("https://"), `unexpected /-prefixed request without https:// issuer: ${requestRequest}`);
360
- const issuerUrl = new URL(requestIssuer);
361
- const resolved = new URL(requestRequest, issuerUrl.origin);
362
- span.resolved("origin-relative url", resolved.href);
363
- await fillResourceData(resourceData, loader, resolved);
364
- return true;
365
- }
366
- else {
367
- const requestIssuer = data.contextInfo.issuer;
368
- assert(requestIssuer !== "");
369
- const resolved = await loader.resolve(requestRequest, requestIssuer, ResolutionMode.Import);
370
- span.resolved("url resolved", resolved);
371
- assert(resolved.startsWith("https:"));
372
- await fillResourceData(resourceData, loader, new URL(resolved));
373
- return true;
374
- }
375
- }
376
- catch (e) {
377
- span.errored(e);
378
- breakResourceData(resourceData);
379
- }
380
- });
381
- const hooks = Webpack.NormalModule.getCompilationHooks(compilation);
382
- hooks.readResourceForScheme.for("node").tapAsync("JsrPlugin", async (_resource, _module, cb) => {
383
- cb(null, Buffer.from("module.exports = {};"));
384
- });
385
- hooks.readResourceForScheme.for("jsr").tapPromise("JsrPlugin", async (resource, module) => {
386
- using span = resolverSpan(this.opts.debug, "jsr loadResourceForScheme", resource);
387
- unreachable("jsr should be resolved to https by deno resolver");
388
- });
389
- hooks.readResourceForScheme.for("https").tapAsync("JsrPlugin", async (resource, module, cb) => {
390
- using span = resolverSpan(this.opts.debug, "https readResourceForScheme", resource, module.type);
391
- try {
392
- const loader = await this.loader;
393
- const loaded = await loader.load(resource, requestedModuleType(module.type));
394
- // TODO: Should import assertions be handled somehow?
395
- span.resolved(loaded);
396
- cb(null, Buffer.from(loaded.code));
397
- }
398
- catch (e) {
399
- span.errored(e);
400
- cb(e);
401
- }
402
- });
403
- });
404
- }
391
+ });
392
+ });
393
+ }
405
394
  }
395
+ //# sourceMappingURL=resolve.js.map