source: frontend/node_modules/enhanced-resolve/lib/ExtensionAliasPlugin.js

Last change on this file was 9af201e, checked in by MBK <marija.karapandzova@…>, 12 days ago

Fix frontend appearance

  • Property mode set to 100644
File size: 4.3 KB
RevLine 
[9af201e]1/*
2 MIT License http://www.opensource.org/licenses/mit-license.php
3 Author Ivan Kopeykin @vankop
4*/
5
6"use strict";
7
8const forEachBail = require("./forEachBail");
9
10/** @typedef {import("./Resolver")} Resolver */
11/** @typedef {import("./Resolver").ResolveRequest} ResolveRequest */
12/** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */
13/** @typedef {{ alias: string | string[], extension: string }} ExtensionAliasOption */
14
15module.exports = class ExtensionAliasPlugin {
16 /**
17 * @param {string | ResolveStepHook} source source
18 * @param {ExtensionAliasOption} options options
19 * @param {string | ResolveStepHook} target target
20 */
21 constructor(source, options, target) {
22 this.source = source;
23 this.options = options;
24 this.target = target;
25 }
26
27 /**
28 * @param {Resolver} resolver the resolver
29 * @returns {void}
30 */
31 apply(resolver) {
32 const target = resolver.ensureHook(this.target);
33 const { extension, alias } = this.options;
34 resolver
35 .getHook(this.source)
36 .tapAsync("ExtensionAliasPlugin", (request, resolveContext, callback) => {
37 // Two modes of operation:
38 // - "request" mode: original request specifier still carries the
39 // extension (e.g. user wrote `./foo.js`). We swap the extension
40 // on `request.request` and re-resolve.
41 // - "path" mode: the specifier has already been joined into an
42 // absolute `request.path` (e.g. produced by the imports field).
43 // We swap the extension on `request.path` and `request.relativePath`.
44 const useRequest = request.request !== undefined;
45 const source = useRequest
46 ? /** @type {string} */ (request.request)
47 : request.path;
48 if (!source || !source.endsWith(extension)) return callback();
49 const isAliasString = typeof alias === "string";
50 // Hoist the base (everything before the old extension) out of the
51 // per-alias `resolve` callback. For an array `alias`, the callback
52 // runs once per candidate extension; the base does not change
53 // between iterations, so there's no reason to recompute it.
54 const sourceBase = source.slice(0, -extension.length);
55 const relativePathBase =
56 !useRequest &&
57 request.relativePath &&
58 request.relativePath.endsWith(extension)
59 ? request.relativePath.slice(0, -extension.length)
60 : null;
61 /**
62 * @param {string} alias extension alias
63 * @param {(err?: null | Error, result?: null | ResolveRequest) => void} callback callback
64 * @param {number=} index index
65 * @returns {void}
66 */
67 const resolve = (alias, callback, index) => {
68 const newValue = `${sourceBase}${alias}`;
69 const nextRequest = useRequest
70 ? {
71 ...request,
72 request: newValue,
73 fullySpecified: true,
74 }
75 : {
76 ...request,
77 path: newValue,
78 relativePath:
79 relativePathBase !== null
80 ? `${relativePathBase}${alias}`
81 : request.relativePath,
82 fullySpecified: true,
83 };
84
85 return resolver.doResolve(
86 target,
87 nextRequest,
88 `aliased from extension alias with mapping '${extension}' to '${alias}'`,
89 resolveContext,
90 (err, result) => {
91 // Throw error if we are on the last alias (for multiple aliases) and it failed, always throw if we are not an array or we have only one alias
92 if (!isAliasString && index) {
93 if (index !== this.options.alias.length) {
94 if (resolveContext.log) {
95 resolveContext.log(
96 `Failed to alias from extension alias with mapping '${extension}' to '${alias}' for '${newValue}': ${err}`,
97 );
98 }
99
100 return callback(null, result);
101 }
102
103 return callback(err, result);
104 }
105 callback(err, result);
106 },
107 );
108 };
109 /**
110 * @param {(null | Error)=} err error
111 * @param {(null | ResolveRequest)=} result result
112 * @returns {void}
113 */
114 const stoppingCallback = (err, result) => {
115 if (err) return callback(err);
116 if (result) return callback(null, result);
117 // Don't allow other aliasing or raw request
118 return callback(null, null);
119 };
120 if (isAliasString) {
121 resolve(alias, stoppingCallback);
122 } else if (alias.length > 1) {
123 forEachBail(alias, resolve, stoppingCallback);
124 } else {
125 resolve(alias[0], stoppingCallback);
126 }
127 });
128 }
129};
Note: See TracBrowser for help on using the repository browser.