@freshpack/webpack 1.0.0 → 1.0.1
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 +10 -0
- package/LICENSE +13 -12
- package/denoEnv.d.ts +12 -0
- package/denoEnv.js +61 -0
- package/fresh.d.ts +39 -0
- package/fresh.js +268 -0
- package/mod.d.ts +7 -0
- package/mod.js +7 -0
- package/package.json +60 -8
- package/prefresh-forked/index.d.ts +15 -0
- package/prefresh-forked/index.js +57 -0
- package/prefresh-forked/loader/index.d.ts +2 -0
- package/prefresh-forked/loader/index.js +4 -0
- package/prefresh-forked/utils/Runtime.d.ts +5 -0
- package/prefresh-forked/utils/Runtime.js +52 -0
- package/prefresh-forked/utils/constants.d.ts +8 -0
- package/prefresh-forked/utils/{constants.ts → constants.js} +8 -20
- package/prefresh-forked/utils/prefresh.d.ts +5 -0
- package/prefresh-forked/utils/prefresh.js +47 -0
- package/quasiquote.d.ts +9 -0
- package/quasiquote.js +30 -0
- package/rawBytesLoader.d.ts +5 -0
- package/rawBytesLoader.js +12 -0
- package/rawImports.d.ts +13 -0
- package/rawImports.js +44 -0
- package/requireHook.d.ts +1 -0
- package/requireHook.js +16 -0
- package/resolve.d.ts +11 -0
- package/resolve.js +405 -0
- package/transpileLoader.d.ts +9 -0
- package/transpileLoader.js +38 -0
- package/unmap.d.ts +9 -0
- package/unmap.js +96 -0
- package/util.d.ts +9 -0
- package/util.js +54 -0
- package/viteComment.d.ts +8 -0
- package/viteComment.js +30 -0
- package/buildCacheUtil.ts +0 -11
- package/denoEnv.ts +0 -78
- package/fresh.ts +0 -391
- package/mod.ts +0 -7
- package/prefresh-forked/index.ts +0 -114
- package/prefresh-forked/loader/index.ts +0 -10
- package/prefresh-forked/utils/Runtime.ts +0 -79
- package/prefresh-forked/utils/createTemplate.ts +0 -76
- package/prefresh-forked/utils/injectEntry.ts +0 -28
- package/prefresh-forked/utils/prefresh.ts +0 -59
- package/quasiquote.ts +0 -44
- package/rawBytesLoader.ts +0 -17
- package/rawImports.ts +0 -85
- package/requireHook.ts +0 -22
- package/resolve.ts +0 -588
- package/transpileLoader.ts +0 -59
- package/unmap.ts +0 -154
- package/util.ts +0 -58
- package/viteComment.ts +0 -41
package/resolve.ts
DELETED
|
@@ -1,588 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
type Loader,
|
|
3
|
-
RequestedModuleType,
|
|
4
|
-
ResolutionMode,
|
|
5
|
-
Workspace,
|
|
6
|
-
type WorkspaceOptions,
|
|
7
|
-
} from "@deno/loader";
|
|
8
|
-
import { assert, unreachable } from "@std/assert";
|
|
9
|
-
import Webpack, { type Compiler } from "webpack";
|
|
10
|
-
import { Buffer } from "node:buffer";
|
|
11
|
-
import { ensureModPath, stripFileUrl } from "./util.ts";
|
|
12
|
-
import { dirname } from "@std/path";
|
|
13
|
-
import { defineRequire } from "./requireHook.ts";
|
|
14
|
-
import { registerDenoLoader } from "./transpileLoader.ts";
|
|
15
|
-
|
|
16
|
-
const internalTranspileLoader = defineRequire(
|
|
17
|
-
"@freshpack/webpack/internal-deno-transpile-loader",
|
|
18
|
-
await import("./transpileLoader.ts"),
|
|
19
|
-
);
|
|
20
|
-
|
|
21
|
-
function resolverSpan(
|
|
22
|
-
logSuccess: boolean | undefined,
|
|
23
|
-
name: string,
|
|
24
|
-
...args: unknown[]
|
|
25
|
-
) {
|
|
26
|
-
let isResolved: undefined | unknown[];
|
|
27
|
-
let timeoutId: NodeJS.Timeout | undefined = setTimeout(() => {
|
|
28
|
-
console.error("[RESOLVE]", "possibly stuck at", name, ...args);
|
|
29
|
-
if (isResolved !== undefined) {
|
|
30
|
-
console.error(" ", "...but it was resolved:", ...isResolved);
|
|
31
|
-
}
|
|
32
|
-
}, 5000);
|
|
33
|
-
const cancelStuck = () => {
|
|
34
|
-
if (timeoutId !== undefined) {
|
|
35
|
-
clearTimeout(timeoutId);
|
|
36
|
-
timeoutId = undefined;
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
let postponed = false;
|
|
40
|
-
return {
|
|
41
|
-
simplify(...newArgs: unknown[]) {
|
|
42
|
-
args = newArgs;
|
|
43
|
-
},
|
|
44
|
-
errored(e: unknown, ...err: unknown[]) {
|
|
45
|
-
cancelStuck();
|
|
46
|
-
console.error("[RESOLVE]", "errored", name, ...args, "=>", e, ...err);
|
|
47
|
-
},
|
|
48
|
-
resolved(...out: unknown[]) {
|
|
49
|
-
cancelStuck();
|
|
50
|
-
if (isResolved === undefined) {
|
|
51
|
-
isResolved = out;
|
|
52
|
-
if (logSuccess) {
|
|
53
|
-
console.info("[RESOLVE]", name, ...args, "=>", ...out);
|
|
54
|
-
}
|
|
55
|
-
} else {
|
|
56
|
-
console.error(
|
|
57
|
-
"[RESOLVE]",
|
|
58
|
-
"resolved twice",
|
|
59
|
-
name,
|
|
60
|
-
...args,
|
|
61
|
-
"=>",
|
|
62
|
-
...out,
|
|
63
|
-
);
|
|
64
|
-
console.error(" ", "...previously resolved to:", ...isResolved);
|
|
65
|
-
}
|
|
66
|
-
},
|
|
67
|
-
[Symbol.dispose]() {
|
|
68
|
-
if (postponed) return;
|
|
69
|
-
cancelStuck();
|
|
70
|
-
if (isResolved === undefined) {
|
|
71
|
-
console.error("[RESOLVE]", "missing resolved() call!", name, ...args);
|
|
72
|
-
}
|
|
73
|
-
},
|
|
74
|
-
postpone() {
|
|
75
|
-
postponed = true;
|
|
76
|
-
},
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
const MATCH_RESOURCE = /^([^!]+)!=!/;
|
|
81
|
-
|
|
82
|
-
function requestedModuleType(type: string): RequestedModuleType {
|
|
83
|
-
if (type === "asset/source") return RequestedModuleType.Text;
|
|
84
|
-
if (type.startsWith("asset/")) return RequestedModuleType.Bytes;
|
|
85
|
-
return RequestedModuleType.Default;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
async function simpleDenoResolve(
|
|
89
|
-
loader: Loader,
|
|
90
|
-
issuer: string,
|
|
91
|
-
request: string,
|
|
92
|
-
esm: boolean,
|
|
93
|
-
): Promise<string> {
|
|
94
|
-
const matchResource = MATCH_RESOURCE.exec(request);
|
|
95
|
-
if (matchResource) {
|
|
96
|
-
const resolved = await simpleDenoResolve(
|
|
97
|
-
loader,
|
|
98
|
-
issuer,
|
|
99
|
-
request.slice(matchResource[0].length),
|
|
100
|
-
esm,
|
|
101
|
-
);
|
|
102
|
-
return `${matchResource[0]}${resolved}`;
|
|
103
|
-
}
|
|
104
|
-
let resolution: string | undefined;
|
|
105
|
-
if (request.startsWith("/") && issuer.startsWith("https://")) {
|
|
106
|
-
resolution = new URL(request, new URL(issuer).origin).href;
|
|
107
|
-
} else if (request.startsWith("/")) {
|
|
108
|
-
resolution = `file://${request}`;
|
|
109
|
-
} else if (request === ".") {
|
|
110
|
-
resolution = `file://${dirname(issuer)}`;
|
|
111
|
-
} else {
|
|
112
|
-
resolution = await loader.resolve(
|
|
113
|
-
request,
|
|
114
|
-
issuer,
|
|
115
|
-
esm ? ResolutionMode.Import : ResolutionMode.Require,
|
|
116
|
-
);
|
|
117
|
-
}
|
|
118
|
-
if (resolution.startsWith("node:")) {
|
|
119
|
-
// PASS: Fallback or external
|
|
120
|
-
} else if (
|
|
121
|
-
resolution.startsWith("https:")
|
|
122
|
-
) {
|
|
123
|
-
// PASS: https loader
|
|
124
|
-
} else if (resolution.startsWith("file:")) {
|
|
125
|
-
if (issuer.startsWith("https://")) {
|
|
126
|
-
// PASS: Disambiguate origin-relative,
|
|
127
|
-
// we don't want to convert /home/user/.cache/deno/npm/.../file.ts imported from
|
|
128
|
-
// https://esm.sh to become https://esm.sh/home/user/...
|
|
129
|
-
} else {
|
|
130
|
-
resolution = stripFileUrl(resolution);
|
|
131
|
-
}
|
|
132
|
-
} else {
|
|
133
|
-
assert(false, `unexpected resolution: ${resolution}`);
|
|
134
|
-
}
|
|
135
|
-
return resolution;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
class FixupResolvePlugin {
|
|
139
|
-
apply(resolver: Webpack.Resolver) {
|
|
140
|
-
const resolved = resolver.getHook("resolved");
|
|
141
|
-
for (const hook of ["resolve", "internal-resolve"]) {
|
|
142
|
-
resolver.getHook(hook).tapAsync({
|
|
143
|
-
name: "Ignore https requests",
|
|
144
|
-
stage: -100000,
|
|
145
|
-
}, (req, ctx, cb) => {
|
|
146
|
-
if (
|
|
147
|
-
req.path && req.path.startsWith("https://") && req.request === "." ||
|
|
148
|
-
req.request && req.request.startsWith("https://")
|
|
149
|
-
) {
|
|
150
|
-
return resolver.doResolve(resolved, req, "context resolve", ctx, cb);
|
|
151
|
-
}
|
|
152
|
-
// console.log("DIR RESOLVE!!!", req);
|
|
153
|
-
return cb(null);
|
|
154
|
-
// return cb(null, ...args);
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
// resolver.hooks.result.tap({
|
|
158
|
-
// name: "resolvers in https requests",
|
|
159
|
-
// stage: -100000,
|
|
160
|
-
// }, (req, ctx) => {
|
|
161
|
-
// console.log("post resolve", req);
|
|
162
|
-
// return;
|
|
163
|
-
// });
|
|
164
|
-
// resolver.hooks.resolve.tap({ name: "Fixup" }, (req) => {
|
|
165
|
-
// console.log('fixup resolver', req.request);
|
|
166
|
-
// return req;
|
|
167
|
-
// });
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
class DenoResolvePlugin {
|
|
172
|
-
constructor(
|
|
173
|
-
public jsr: DenoLoaderPlugin,
|
|
174
|
-
) {
|
|
175
|
-
}
|
|
176
|
-
apply(resolver: Webpack.Resolver) {
|
|
177
|
-
// console.log("HOOKS", resolver.hooks);
|
|
178
|
-
const source = resolver.getHook("resolve");
|
|
179
|
-
const target = resolver.getHook("resolved");
|
|
180
|
-
source.tapAsync(
|
|
181
|
-
{ name: "Deno" },
|
|
182
|
-
async (request, ctx, cb) => {
|
|
183
|
-
using span = resolverSpan(
|
|
184
|
-
this.jsr.opts.debug,
|
|
185
|
-
"deno resolver",
|
|
186
|
-
request,
|
|
187
|
-
ctx,
|
|
188
|
-
);
|
|
189
|
-
try {
|
|
190
|
-
const loader = await this.jsr.loader;
|
|
191
|
-
let requestIssuer: string | undefined;
|
|
192
|
-
if (request.context && "issuer" in request.context) {
|
|
193
|
-
const issuer = request.context.issuer;
|
|
194
|
-
assert(
|
|
195
|
-
typeof issuer === "string" || issuer === null,
|
|
196
|
-
"invalid context issuer",
|
|
197
|
-
);
|
|
198
|
-
if (issuer !== "" && issuer !== null) {
|
|
199
|
-
requestIssuer = issuer;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
if (requestIssuer === undefined && request.path) {
|
|
203
|
-
requestIssuer = ensureModPath(request.path);
|
|
204
|
-
}
|
|
205
|
-
assert(
|
|
206
|
-
requestIssuer !== undefined,
|
|
207
|
-
"failed to determine requestIssuer",
|
|
208
|
-
);
|
|
209
|
-
const requestRequest = request.request;
|
|
210
|
-
assert(
|
|
211
|
-
requestRequest !== undefined,
|
|
212
|
-
"failed to determine requestRequest",
|
|
213
|
-
);
|
|
214
|
-
span.simplify(requestIssuer, requestRequest);
|
|
215
|
-
const resolution = await simpleDenoResolve(
|
|
216
|
-
loader,
|
|
217
|
-
requestIssuer,
|
|
218
|
-
requestRequest,
|
|
219
|
-
request.module ?? true,
|
|
220
|
-
);
|
|
221
|
-
const resolvedPath = resolution.startsWith("file://")
|
|
222
|
-
? stripFileUrl(resolution)
|
|
223
|
-
: resolution;
|
|
224
|
-
return resolver.doResolve(
|
|
225
|
-
target,
|
|
226
|
-
Object.assign({}, request, {
|
|
227
|
-
path: resolvedPath,
|
|
228
|
-
request: undefined,
|
|
229
|
-
}),
|
|
230
|
-
`resolved by deno ${request.request} (from ${request.path})`,
|
|
231
|
-
ctx,
|
|
232
|
-
(err, result) => {
|
|
233
|
-
span.resolved("doResolve result", resolution, err, result);
|
|
234
|
-
if (err !== undefined || result !== undefined) {
|
|
235
|
-
return cb(err, result);
|
|
236
|
-
}
|
|
237
|
-
cb(null, null);
|
|
238
|
-
},
|
|
239
|
-
);
|
|
240
|
-
} catch (e: unknown) {
|
|
241
|
-
span.errored(e, request, ctx);
|
|
242
|
-
cb(e as Error, null);
|
|
243
|
-
}
|
|
244
|
-
},
|
|
245
|
-
);
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
type ResourceData = {
|
|
250
|
-
path?: string;
|
|
251
|
-
context?: string;
|
|
252
|
-
resource?: string;
|
|
253
|
-
query?: string;
|
|
254
|
-
fragment?: string;
|
|
255
|
-
type?: string;
|
|
256
|
-
data: { path?: string | false; query?: string };
|
|
257
|
-
};
|
|
258
|
-
async function fillResourceData(data: ResourceData, loader: Loader, url: URL) {
|
|
259
|
-
(data as any).__resolvedByFreshpack = { data, url, loaded: undefined };
|
|
260
|
-
if (url.protocol === "file:") {
|
|
261
|
-
data.resource = url.pathname;
|
|
262
|
-
data.path = url.pathname;
|
|
263
|
-
data.data.path = url.pathname;
|
|
264
|
-
data.context = dirname(url.pathname);
|
|
265
|
-
} else {
|
|
266
|
-
const loaded = await loader.load(url.href, RequestedModuleType.Default);
|
|
267
|
-
(data as any).__resolvedByFreshpack.loaded = loaded;
|
|
268
|
-
data.resource = loaded.specifier;
|
|
269
|
-
data.path = loaded.specifier;
|
|
270
|
-
data.data.path = loaded.specifier;
|
|
271
|
-
data.context = new URL(".", url).href.slice(0, -1);
|
|
272
|
-
}
|
|
273
|
-
data.query = url.search;
|
|
274
|
-
data.data.query = url.search;
|
|
275
|
-
data.fragment = url.hash;
|
|
276
|
-
|
|
277
|
-
// data.type = "application/javascript";
|
|
278
|
-
}
|
|
279
|
-
function breakResourceData(data: ResourceData) {
|
|
280
|
-
data.path = "error";
|
|
281
|
-
data.context = "error";
|
|
282
|
-
data.resource = "error";
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
function ensurePluginList(
|
|
286
|
-
resolver: Record<string, unknown>,
|
|
287
|
-
list: string,
|
|
288
|
-
append: unknown,
|
|
289
|
-
) {
|
|
290
|
-
if (resolver[list] === undefined) {
|
|
291
|
-
resolver[list] = [];
|
|
292
|
-
}
|
|
293
|
-
assert(Array.isArray(resolver[list]));
|
|
294
|
-
resolver[list].push(append);
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
export class DenoLoaderPlugin {
|
|
298
|
-
workspace: Workspace;
|
|
299
|
-
#transpileLoaderId: number;
|
|
300
|
-
#loader?: Promise<Loader>;
|
|
301
|
-
get loader(): Promise<Loader> {
|
|
302
|
-
return (this.#loader ??= this.workspace.createLoader());
|
|
303
|
-
}
|
|
304
|
-
constructor(
|
|
305
|
-
public opts: WorkspaceOptions,
|
|
306
|
-
public patchImport: (f: string, v: string) => string = (_, v) => v,
|
|
307
|
-
) {
|
|
308
|
-
opts.noTranspile = false;
|
|
309
|
-
opts.preserveJsx = false;
|
|
310
|
-
opts.platform = "browser";
|
|
311
|
-
this.workspace = new Workspace(opts);
|
|
312
|
-
this.#transpileLoaderId = registerDenoLoader(() => this.loader);
|
|
313
|
-
}
|
|
314
|
-
apply(compiler: Compiler) {
|
|
315
|
-
if (compiler.options.resolve.plugins === undefined) {
|
|
316
|
-
compiler.options.resolve.plugins = [];
|
|
317
|
-
}
|
|
318
|
-
assert(Array.isArray(compiler.options.resolve.plugins));
|
|
319
|
-
compiler.options.resolve.plugins.push(new FixupResolvePlugin());
|
|
320
|
-
|
|
321
|
-
if (compiler.options.resolveLoader.plugins === undefined) {
|
|
322
|
-
compiler.options.resolveLoader.plugins = [];
|
|
323
|
-
}
|
|
324
|
-
assert(Array.isArray(compiler.options.resolveLoader.plugins));
|
|
325
|
-
compiler.options.resolveLoader.plugins.push(new DenoResolvePlugin(this));
|
|
326
|
-
|
|
327
|
-
compiler.options.resolve.modules = [];
|
|
328
|
-
compiler.options.resolve.roots = [];
|
|
329
|
-
compiler.options.resolve.descriptionFiles = [];
|
|
330
|
-
compiler.options.resolveLoader.modules = [];
|
|
331
|
-
compiler.options.resolveLoader.descriptionFiles = [];
|
|
332
|
-
|
|
333
|
-
compiler.options.externalsPresets.web = false;
|
|
334
|
-
compiler.options.externalsPresets.webAsync = false;
|
|
335
|
-
|
|
336
|
-
if (!compiler.options.output.enabledLibraryTypes) {
|
|
337
|
-
compiler.options.output.enabledLibraryTypes = [];
|
|
338
|
-
}
|
|
339
|
-
if (!compiler.options.output.enabledLibraryTypes.includes("module")) {
|
|
340
|
-
compiler.options.output.enabledLibraryTypes.push("module");
|
|
341
|
-
}
|
|
342
|
-
compiler.options.output.library = { type: "module" };
|
|
343
|
-
|
|
344
|
-
compiler.options.output.module = true;
|
|
345
|
-
(compiler.options.experiments as { outputModule: boolean }).outputModule =
|
|
346
|
-
true;
|
|
347
|
-
|
|
348
|
-
// Deno provides its own type-stripping when no ts loader is present
|
|
349
|
-
// It is not required since deno-loader handles typescript.
|
|
350
|
-
compiler.options.experiments.typescript = false;
|
|
351
|
-
|
|
352
|
-
compiler.hooks.compilation.tap(
|
|
353
|
-
"JsrPlugin",
|
|
354
|
-
(compilation, { normalModuleFactory }) => {
|
|
355
|
-
normalModuleFactory.hooks.afterResolve.tap(
|
|
356
|
-
"JsrPlugin",
|
|
357
|
-
({ createData: data }) => {
|
|
358
|
-
const resource = data.resource;
|
|
359
|
-
if (
|
|
360
|
-
resource === undefined || resource.includes("://") ||
|
|
361
|
-
!/\.[cm]?[jt]sx?$/.test(resource)
|
|
362
|
-
) {
|
|
363
|
-
return;
|
|
364
|
-
}
|
|
365
|
-
data.loaders!.push({
|
|
366
|
-
loader: internalTranspileLoader,
|
|
367
|
-
options: { id: this.#transpileLoaderId },
|
|
368
|
-
ident: null,
|
|
369
|
-
type: null,
|
|
370
|
-
});
|
|
371
|
-
},
|
|
372
|
-
);
|
|
373
|
-
normalModuleFactory.hooks.beforeResolve.tapPromise(
|
|
374
|
-
"JsrPlugin",
|
|
375
|
-
async (resolveData) => {
|
|
376
|
-
using span = resolverSpan(
|
|
377
|
-
this.opts.debug,
|
|
378
|
-
"jsr beforeResolve",
|
|
379
|
-
resolveData,
|
|
380
|
-
);
|
|
381
|
-
|
|
382
|
-
try {
|
|
383
|
-
// try {
|
|
384
|
-
const loader = await this.loader;
|
|
385
|
-
let requestIssuer: string | undefined | null;
|
|
386
|
-
if (resolveData.contextInfo.issuer !== "") {
|
|
387
|
-
requestIssuer = resolveData.contextInfo.issuer;
|
|
388
|
-
}
|
|
389
|
-
if (requestIssuer === undefined || requestIssuer === null) {
|
|
390
|
-
requestIssuer = ensureModPath(resolveData.context);
|
|
391
|
-
}
|
|
392
|
-
assert(
|
|
393
|
-
requestIssuer != undefined,
|
|
394
|
-
"failed to determine request issuer",
|
|
395
|
-
);
|
|
396
|
-
let requestRequest = resolveData.request;
|
|
397
|
-
const dependencyType = resolveData.dependencyType;
|
|
398
|
-
span.simplify({
|
|
399
|
-
requestIssuer,
|
|
400
|
-
requestRequest,
|
|
401
|
-
dependencyType,
|
|
402
|
-
});
|
|
403
|
-
|
|
404
|
-
if (
|
|
405
|
-
requestRequest.startsWith("data:") ||
|
|
406
|
-
requestRequest.startsWith("https:") &&
|
|
407
|
-
!requestRequest.startsWith("https://jsr.io/")
|
|
408
|
-
) {
|
|
409
|
-
// IDK why those requests even land in this method in some circumstances, returning false
|
|
410
|
-
// here makes them being processed by the handlers below. Most probably I'm missing something,
|
|
411
|
-
// or this webpack api is not intended for such huge loaded replacements.
|
|
412
|
-
span.resolved("delegate-builtin");
|
|
413
|
-
return false;
|
|
414
|
-
}
|
|
415
|
-
if (
|
|
416
|
-
dependencyType === "url" &&
|
|
417
|
-
// new URL() references are always relative, but import.meta.resolve() takes import specifiers.
|
|
418
|
-
resolveData.dependencies[0]?.type !== "import.meta.resolve()"
|
|
419
|
-
) {
|
|
420
|
-
requestRequest = "./" + requestRequest;
|
|
421
|
-
}
|
|
422
|
-
requestRequest = this.patchImport(requestIssuer, requestRequest);
|
|
423
|
-
|
|
424
|
-
const resolution = await simpleDenoResolve(
|
|
425
|
-
loader,
|
|
426
|
-
requestIssuer,
|
|
427
|
-
requestRequest,
|
|
428
|
-
true,
|
|
429
|
-
);
|
|
430
|
-
span.resolved(resolution);
|
|
431
|
-
resolveData.request = this.patchImport(requestIssuer, resolution);
|
|
432
|
-
} catch (e) {
|
|
433
|
-
span.errored(e);
|
|
434
|
-
throw e;
|
|
435
|
-
}
|
|
436
|
-
},
|
|
437
|
-
);
|
|
438
|
-
|
|
439
|
-
normalModuleFactory.hooks.resolveForScheme.for("node").tapPromise(
|
|
440
|
-
"JsrPlugin",
|
|
441
|
-
async (resourceData, resolveData) => {
|
|
442
|
-
using span = resolverSpan(
|
|
443
|
-
this.opts.debug,
|
|
444
|
-
"node resolveForScheme",
|
|
445
|
-
resolveData.request,
|
|
446
|
-
);
|
|
447
|
-
resourceData.path = false as any;
|
|
448
|
-
resourceData.data.path = false;
|
|
449
|
-
span.resolved("stubbed: empty module");
|
|
450
|
-
return true;
|
|
451
|
-
},
|
|
452
|
-
);
|
|
453
|
-
normalModuleFactory.hooks.resolveForScheme.for("jsr").tapPromise(
|
|
454
|
-
"JsrPlugin",
|
|
455
|
-
async (resourceData, resolveData) => {
|
|
456
|
-
using span = resolverSpan(
|
|
457
|
-
this.opts.debug,
|
|
458
|
-
"jsr resolveForScheme",
|
|
459
|
-
resolveData,
|
|
460
|
-
);
|
|
461
|
-
breakResourceData(resourceData);
|
|
462
|
-
unreachable("jsr should be resolved to https by deno resolver");
|
|
463
|
-
},
|
|
464
|
-
);
|
|
465
|
-
normalModuleFactory.hooks.resolveForScheme.for("npm").tapPromise(
|
|
466
|
-
"JsrPlugin",
|
|
467
|
-
async (resourceData, resolveData) => {
|
|
468
|
-
using span = resolverSpan(
|
|
469
|
-
this.opts.debug,
|
|
470
|
-
"npm resolveForScheme",
|
|
471
|
-
resolveData,
|
|
472
|
-
);
|
|
473
|
-
breakResourceData(resourceData);
|
|
474
|
-
unreachable("npm should be resolved to files by deno resolver");
|
|
475
|
-
},
|
|
476
|
-
);
|
|
477
|
-
normalModuleFactory.hooks.resolveForScheme.for("https").tapPromise(
|
|
478
|
-
"JsrPlugin",
|
|
479
|
-
async (resourceData, resolveData) => {
|
|
480
|
-
using span = resolverSpan(
|
|
481
|
-
this.opts.debug,
|
|
482
|
-
"https resolveForScheme",
|
|
483
|
-
resolveData.request,
|
|
484
|
-
);
|
|
485
|
-
const loader = await this.loader;
|
|
486
|
-
// const newResourceData = {...resourceData};
|
|
487
|
-
await fillResourceData(
|
|
488
|
-
resourceData,
|
|
489
|
-
loader,
|
|
490
|
-
new URL(resolveData.request),
|
|
491
|
-
);
|
|
492
|
-
span.resolved("done");
|
|
493
|
-
return true;
|
|
494
|
-
},
|
|
495
|
-
);
|
|
496
|
-
normalModuleFactory.hooks.resolveInScheme.for("https").tapPromise(
|
|
497
|
-
"JsrPlugin",
|
|
498
|
-
async (resourceData, data) => {
|
|
499
|
-
using span = resolverSpan(
|
|
500
|
-
this.opts.debug,
|
|
501
|
-
"https resolveInScheme",
|
|
502
|
-
resourceData,
|
|
503
|
-
data.contextInfo,
|
|
504
|
-
data.request,
|
|
505
|
-
);
|
|
506
|
-
try {
|
|
507
|
-
const loader = await this.loader;
|
|
508
|
-
const requestRequest = data.request;
|
|
509
|
-
if (requestRequest.startsWith("/")) {
|
|
510
|
-
const requestIssuer = data.contextInfo.issuer;
|
|
511
|
-
assert(
|
|
512
|
-
requestIssuer && requestIssuer.startsWith("https://"),
|
|
513
|
-
`unexpected /-prefixed request without https:// issuer: ${requestRequest}`,
|
|
514
|
-
);
|
|
515
|
-
const issuerUrl = new URL(requestIssuer);
|
|
516
|
-
const resolved = new URL(requestRequest, issuerUrl.origin);
|
|
517
|
-
span.resolved("origin-relative url", resolved.href);
|
|
518
|
-
await fillResourceData(resourceData, loader, resolved);
|
|
519
|
-
return true;
|
|
520
|
-
} else {
|
|
521
|
-
const requestIssuer = data.contextInfo.issuer;
|
|
522
|
-
assert(requestIssuer !== "");
|
|
523
|
-
const resolved = await loader.resolve(
|
|
524
|
-
requestRequest,
|
|
525
|
-
requestIssuer,
|
|
526
|
-
ResolutionMode.Import,
|
|
527
|
-
);
|
|
528
|
-
span.resolved("url resolved", resolved);
|
|
529
|
-
assert(resolved.startsWith("https:"));
|
|
530
|
-
await fillResourceData(resourceData, loader, new URL(resolved));
|
|
531
|
-
return true;
|
|
532
|
-
}
|
|
533
|
-
} catch (e) {
|
|
534
|
-
span.errored(e);
|
|
535
|
-
breakResourceData(resourceData);
|
|
536
|
-
}
|
|
537
|
-
},
|
|
538
|
-
);
|
|
539
|
-
const hooks = Webpack.NormalModule.getCompilationHooks(compilation);
|
|
540
|
-
|
|
541
|
-
hooks.readResourceForScheme.for("node").tapAsync(
|
|
542
|
-
"JsrPlugin",
|
|
543
|
-
async (_resource, _module, cb) => {
|
|
544
|
-
cb(null, Buffer.from("module.exports = {};"));
|
|
545
|
-
},
|
|
546
|
-
);
|
|
547
|
-
hooks.readResourceForScheme.for("jsr").tapPromise(
|
|
548
|
-
"JsrPlugin",
|
|
549
|
-
async (resource, module) => {
|
|
550
|
-
using span = resolverSpan(
|
|
551
|
-
this.opts.debug,
|
|
552
|
-
"jsr loadResourceForScheme",
|
|
553
|
-
resource,
|
|
554
|
-
);
|
|
555
|
-
unreachable("jsr should be resolved to https by deno resolver");
|
|
556
|
-
},
|
|
557
|
-
);
|
|
558
|
-
hooks.readResourceForScheme.for("https").tapAsync(
|
|
559
|
-
"JsrPlugin",
|
|
560
|
-
async (resource, module, cb) => {
|
|
561
|
-
using span = resolverSpan(
|
|
562
|
-
this.opts.debug,
|
|
563
|
-
"https readResourceForScheme",
|
|
564
|
-
resource,
|
|
565
|
-
module.type,
|
|
566
|
-
);
|
|
567
|
-
try {
|
|
568
|
-
const loader = await this.loader;
|
|
569
|
-
const loaded = await loader.load(
|
|
570
|
-
resource,
|
|
571
|
-
requestedModuleType(module.type),
|
|
572
|
-
);
|
|
573
|
-
// TODO: Should import assertions be handled somehow?
|
|
574
|
-
span.resolved(loaded);
|
|
575
|
-
cb(
|
|
576
|
-
null,
|
|
577
|
-
Buffer.from((loaded as { code: Uint8Array | string }).code),
|
|
578
|
-
);
|
|
579
|
-
} catch (e) {
|
|
580
|
-
span.errored(e);
|
|
581
|
-
cb(e as Error);
|
|
582
|
-
}
|
|
583
|
-
},
|
|
584
|
-
);
|
|
585
|
-
},
|
|
586
|
-
);
|
|
587
|
-
}
|
|
588
|
-
}
|
package/transpileLoader.ts
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { type Loader, RequestedModuleType } from "@deno/loader";
|
|
2
|
-
import { toFileUrl } from "@std/path";
|
|
3
|
-
import type { LoaderContext } from "webpack";
|
|
4
|
-
|
|
5
|
-
type Options = { id: number };
|
|
6
|
-
type Context = LoaderContext<Options>;
|
|
7
|
-
type SourceMap = Exclude<
|
|
8
|
-
Parameters<Context["callback"]>[2],
|
|
9
|
-
null | string | undefined
|
|
10
|
-
>;
|
|
11
|
-
|
|
12
|
-
const registry = new Map<number, () => Promise<Loader>>();
|
|
13
|
-
let nextId = 0;
|
|
14
|
-
|
|
15
|
-
export function registerDenoLoader(get: () => Promise<Loader>): number {
|
|
16
|
-
const id = nextId++;
|
|
17
|
-
registry.set(id, get);
|
|
18
|
-
return id;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const INLINE_SOURCE_MAP =
|
|
22
|
-
/\n?\/\/# sourceMappingURL=data:application\/json;base64,([A-Za-z0-9+/=]+)[\t ]*$/;
|
|
23
|
-
|
|
24
|
-
function splitSourceMap(
|
|
25
|
-
code: string,
|
|
26
|
-
): { code: string; map: SourceMap | undefined } {
|
|
27
|
-
const match = INLINE_SOURCE_MAP.exec(code);
|
|
28
|
-
if (!match) return { code, map: undefined };
|
|
29
|
-
return {
|
|
30
|
-
code: code.slice(0, match.index),
|
|
31
|
-
map: JSON.parse(atob(match[1])) as SourceMap,
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export default function denoTranspileLoader(
|
|
36
|
-
this: Context,
|
|
37
|
-
_source: string,
|
|
38
|
-
): void {
|
|
39
|
-
const callback = this.async();
|
|
40
|
-
const { id } = this.getOptions();
|
|
41
|
-
const get = registry.get(id);
|
|
42
|
-
if (!get) {
|
|
43
|
-
callback(new Error(`deno loader ${id} is not registered`));
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
const resourcePath = this.resourcePath;
|
|
47
|
-
(async () => {
|
|
48
|
-
const loader = await get();
|
|
49
|
-
const specifier = toFileUrl(resourcePath).href;
|
|
50
|
-
const loaded = await loader.load(specifier, RequestedModuleType.Default);
|
|
51
|
-
if (loaded.kind !== "module") {
|
|
52
|
-
throw new Error(`deno loader returned ${loaded.kind} for ${specifier}`);
|
|
53
|
-
}
|
|
54
|
-
return splitSourceMap(new TextDecoder().decode(loaded.code));
|
|
55
|
-
})().then(
|
|
56
|
-
({ code, map }) => callback(null, code, map),
|
|
57
|
-
(e) => callback(e),
|
|
58
|
-
);
|
|
59
|
-
}
|