$
This commit is contained in:
20
node_modules/enhanced-resolve/LICENSE
generated
vendored
Normal file
20
node_modules/enhanced-resolve/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
Copyright JS Foundation and other contributors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
'Software'), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
168
node_modules/enhanced-resolve/README.md
generated
vendored
Normal file
168
node_modules/enhanced-resolve/README.md
generated
vendored
Normal file
@@ -0,0 +1,168 @@
|
||||
# enhanced-resolve
|
||||
|
||||
Offers an async require.resolve function. It's highly configurable.
|
||||
|
||||
## Features
|
||||
|
||||
- plugin system
|
||||
- provide a custom filesystem
|
||||
- sync and async node.js filesystems included
|
||||
|
||||
## Getting Started
|
||||
|
||||
### Install
|
||||
|
||||
```sh
|
||||
# npm
|
||||
npm install enhanced-resolve
|
||||
# or Yarn
|
||||
yarn add enhanced-resolve
|
||||
```
|
||||
|
||||
### Resolve
|
||||
|
||||
There is a Node.js API which allows to resolve requests according to the Node.js resolving rules.
|
||||
Sync and async APIs are offered. A `create` method allows to create a custom resolve function.
|
||||
|
||||
```js
|
||||
const resolve = require("enhanced-resolve");
|
||||
|
||||
resolve("/some/path/to/folder", "module/dir", (err, result) => {
|
||||
result; // === "/some/path/node_modules/module/dir/index.js"
|
||||
});
|
||||
|
||||
resolve.sync("/some/path/to/folder", "../../dir");
|
||||
// === "/some/path/dir/index.js"
|
||||
|
||||
const myResolve = resolve.create({
|
||||
// or resolve.create.sync
|
||||
extensions: [".ts", ".js"]
|
||||
// see more options below
|
||||
});
|
||||
|
||||
myResolve("/some/path/to/folder", "ts-module", (err, result) => {
|
||||
result; // === "/some/node_modules/ts-module/index.ts"
|
||||
});
|
||||
```
|
||||
|
||||
### Creating a Resolver
|
||||
|
||||
The easiest way to create a resolver is to use the `createResolver` function on `ResolveFactory`, along with one of the supplied File System implementations.
|
||||
|
||||
```js
|
||||
const fs = require("fs");
|
||||
const { CachedInputFileSystem, ResolverFactory } = require("enhanced-resolve");
|
||||
|
||||
// create a resolver
|
||||
const myResolver = ResolverFactory.createResolver({
|
||||
// Typical usage will consume the `fs` + `CachedInputFileSystem`, which wraps Node.js `fs` to add caching.
|
||||
fileSystem: new CachedInputFileSystem(fs, 4000),
|
||||
extensions: [".js", ".json"]
|
||||
/* any other resolver options here. Options/defaults can be seen below */
|
||||
});
|
||||
|
||||
// resolve a file with the new resolver
|
||||
const context = {};
|
||||
const resolveContext = {};
|
||||
const lookupStartPath = "/Users/webpack/some/root/dir";
|
||||
const request = "./path/to-look-up.js";
|
||||
myResolver.resolve({}, lookupStartPath, request, resolveContext, (
|
||||
err /*Error*/,
|
||||
filepath /*string*/
|
||||
) => {
|
||||
// Do something with the path
|
||||
});
|
||||
```
|
||||
|
||||
#### Resolver Options
|
||||
|
||||
| Field | Default | Description |
|
||||
|------------------|-----------------------------| --------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| alias | [] | A list of module alias configurations or an object which maps key to value |
|
||||
| aliasFields | [] | A list of alias fields in description files |
|
||||
| extensionAlias | {} | An object which maps extension to extension aliases |
|
||||
| cachePredicate | function() { return true }; | A function which decides whether a request should be cached or not. An object is passed to the function with `path` and `request` properties. |
|
||||
| cacheWithContext | true | If unsafe cache is enabled, includes `request.context` in the cache key |
|
||||
| conditionNames | ["node"] | A list of exports field condition names |
|
||||
| descriptionFiles | ["package.json"] | A list of description files to read from |
|
||||
| enforceExtension | false | Enforce that a extension from extensions must be used |
|
||||
| exportsFields | ["exports"] | A list of exports fields in description files |
|
||||
| extensions | [".js", ".json", ".node"] | A list of extensions which should be tried for files |
|
||||
| fallback | [] | Same as `alias`, but only used if default resolving fails |
|
||||
| fileSystem | | The file system which should be used |
|
||||
| fullySpecified | false | Request passed to resolve is already fully specified and extensions or main files are not resolved for it (they are still resolved for internal requests) |
|
||||
| mainFields | ["main"] | A list of main fields in description files |
|
||||
| mainFiles | ["index"] | A list of main files in directories |
|
||||
| modules | ["node_modules"] | A list of directories to resolve modules from, can be absolute path or folder name |
|
||||
| plugins | [] | A list of additional resolve plugins which should be applied |
|
||||
| resolver | undefined | A prepared Resolver to which the plugins are attached |
|
||||
| resolveToContext | false | Resolve to a context instead of a file |
|
||||
| preferRelative | false | Prefer to resolve module requests as relative request and fallback to resolving as module |
|
||||
| preferAbsolute | false | Prefer to resolve server-relative urls as absolute paths before falling back to resolve in roots |
|
||||
| restrictions | [] | A list of resolve restrictions |
|
||||
| roots | [] | A list of root paths |
|
||||
| symlinks | true | Whether to resolve symlinks to their symlinked location |
|
||||
| unsafeCache | false | Use this cache object to unsafely cache the successful requests |
|
||||
|
||||
## Plugins
|
||||
|
||||
Similar to `webpack`, the core of `enhanced-resolve` functionality is implemented as individual plugins that are executed using [`tapable`](https://github.com/webpack/tapable).
|
||||
These plugins can extend the functionality of the library, adding other ways for files/contexts to be resolved.
|
||||
|
||||
A plugin should be a `class` (or its ES5 equivalent) with an `apply` method. The `apply` method will receive a `resolver` instance, that can be used to hook in to the event system.
|
||||
|
||||
### Plugin Boilerplate
|
||||
|
||||
```js
|
||||
class MyResolverPlugin {
|
||||
constructor(source, target) {
|
||||
this.source = source;
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
apply(resolver) {
|
||||
const target = resolver.ensureHook(this.target);
|
||||
resolver
|
||||
.getHook(this.source)
|
||||
.tapAsync("MyResolverPlugin", (request, resolveContext, callback) => {
|
||||
// Any logic you need to create a new `request` can go here
|
||||
resolver.doResolve(target, request, null, resolveContext, callback);
|
||||
});
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Plugins are executed in a pipeline, and register which event they should be executed before/after. In the example above, `source` is the name of the event that starts the pipeline, and `target` is what event this plugin should fire, which is what continues the execution of the pipeline. For an example of how these different plugin events create a chain, see `lib/ResolverFactory.js`, in the `//// pipeline ////` section.
|
||||
|
||||
## Escaping
|
||||
|
||||
It's allowed to escape `#` as `\0#` to avoid parsing it as fragment.
|
||||
|
||||
enhanced-resolve will try to resolve requests containing `#` as path and as fragment, so it will automatically figure out if `./some#thing` means `.../some.js#thing` or `.../some#thing.js`. When a `#` is resolved as path it will be escaped in the result. Here: `.../some\0#thing.js`.
|
||||
|
||||
## Tests
|
||||
|
||||
```javascript
|
||||
yarn test
|
||||
```
|
||||
|
||||
[](http://travis-ci.org/webpack/enhanced-resolve)
|
||||
|
||||
## Passing options from webpack
|
||||
|
||||
If you are using `webpack`, and you want to pass custom options to `enhanced-resolve`, the options are passed from the `resolve` key of your webpack configuration e.g.:
|
||||
|
||||
```
|
||||
resolve: {
|
||||
extensions: ['.js', '.jsx'],
|
||||
modules: [path.resolve(__dirname, 'src'), 'node_modules'],
|
||||
plugins: [new DirectoryNamedWebpackPlugin()]
|
||||
...
|
||||
},
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
Copyright (c) 2012-2019 JS Foundation and other contributors
|
||||
|
||||
MIT (http://www.opensource.org/licenses/mit-license.php)
|
101
node_modules/enhanced-resolve/lib/AliasFieldPlugin.js
generated
vendored
Normal file
101
node_modules/enhanced-resolve/lib/AliasFieldPlugin.js
generated
vendored
Normal file
@@ -0,0 +1,101 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
const DescriptionFileUtils = require("./DescriptionFileUtils");
|
||||
const getInnerRequest = require("./getInnerRequest");
|
||||
|
||||
/** @typedef {import("./Resolver")} Resolver */
|
||||
/** @typedef {import("./Resolver").ResolveRequest} ResolveRequest */
|
||||
/** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */
|
||||
|
||||
module.exports = class AliasFieldPlugin {
|
||||
/**
|
||||
* @param {string | ResolveStepHook} source source
|
||||
* @param {string | Array<string>} field field
|
||||
* @param {string | ResolveStepHook} target target
|
||||
*/
|
||||
constructor(source, field, target) {
|
||||
this.source = source;
|
||||
this.field = field;
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Resolver} resolver the resolver
|
||||
* @returns {void}
|
||||
*/
|
||||
apply(resolver) {
|
||||
const target = resolver.ensureHook(this.target);
|
||||
resolver
|
||||
.getHook(this.source)
|
||||
.tapAsync("AliasFieldPlugin", (request, resolveContext, callback) => {
|
||||
if (!request.descriptionFileData) return callback();
|
||||
const innerRequest = getInnerRequest(resolver, request);
|
||||
if (!innerRequest) return callback();
|
||||
const fieldData = DescriptionFileUtils.getField(
|
||||
request.descriptionFileData,
|
||||
this.field
|
||||
);
|
||||
if (fieldData === null || typeof fieldData !== "object") {
|
||||
if (resolveContext.log)
|
||||
resolveContext.log(
|
||||
"Field '" +
|
||||
this.field +
|
||||
"' doesn't contain a valid alias configuration"
|
||||
);
|
||||
return callback();
|
||||
}
|
||||
const data = Object.prototype.hasOwnProperty.call(
|
||||
fieldData,
|
||||
innerRequest
|
||||
)
|
||||
? fieldData[innerRequest]
|
||||
: innerRequest.startsWith("./")
|
||||
? fieldData[innerRequest.slice(2)]
|
||||
: undefined;
|
||||
if (data === innerRequest) return callback();
|
||||
if (data === undefined) return callback();
|
||||
if (data === false) {
|
||||
/** @type {ResolveRequest} */
|
||||
const ignoreObj = {
|
||||
...request,
|
||||
path: false
|
||||
};
|
||||
if (typeof resolveContext.yield === "function") {
|
||||
resolveContext.yield(ignoreObj);
|
||||
return callback(null, null);
|
||||
}
|
||||
return callback(null, ignoreObj);
|
||||
}
|
||||
const obj = {
|
||||
...request,
|
||||
path: request.descriptionFileRoot,
|
||||
request: data,
|
||||
fullySpecified: false
|
||||
};
|
||||
resolver.doResolve(
|
||||
target,
|
||||
obj,
|
||||
"aliased from description file " +
|
||||
request.descriptionFilePath +
|
||||
" with mapping '" +
|
||||
innerRequest +
|
||||
"' to '" +
|
||||
data +
|
||||
"'",
|
||||
resolveContext,
|
||||
(err, result) => {
|
||||
if (err) return callback(err);
|
||||
|
||||
// Don't allow other aliasing or raw request
|
||||
if (result === undefined) return callback(null, null);
|
||||
callback(null, result);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
};
|
131
node_modules/enhanced-resolve/lib/AliasPlugin.js
generated
vendored
Normal file
131
node_modules/enhanced-resolve/lib/AliasPlugin.js
generated
vendored
Normal file
@@ -0,0 +1,131 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
const forEachBail = require("./forEachBail");
|
||||
const { PathType, getType } = require("./util/path");
|
||||
|
||||
/** @typedef {import("./Resolver")} Resolver */
|
||||
/** @typedef {import("./Resolver").ResolveRequest} ResolveRequest */
|
||||
/** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */
|
||||
/** @typedef {{alias: string|Array<string>|false, name: string, onlyModule?: boolean}} AliasOption */
|
||||
|
||||
module.exports = class AliasPlugin {
|
||||
/**
|
||||
* @param {string | ResolveStepHook} source source
|
||||
* @param {AliasOption | Array<AliasOption>} options options
|
||||
* @param {string | ResolveStepHook} target target
|
||||
*/
|
||||
constructor(source, options, target) {
|
||||
this.source = source;
|
||||
this.options = Array.isArray(options) ? options : [options];
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Resolver} resolver the resolver
|
||||
* @returns {void}
|
||||
*/
|
||||
apply(resolver) {
|
||||
const target = resolver.ensureHook(this.target);
|
||||
const getAbsolutePathWithSlashEnding = maybeAbsolutePath => {
|
||||
const type = getType(maybeAbsolutePath);
|
||||
if (type === PathType.AbsolutePosix || type === PathType.AbsoluteWin) {
|
||||
return resolver.join(maybeAbsolutePath, "_").slice(0, -1);
|
||||
}
|
||||
return null;
|
||||
};
|
||||
const isSubPath = (path, maybeSubPath) => {
|
||||
const absolutePath = getAbsolutePathWithSlashEnding(maybeSubPath);
|
||||
if (!absolutePath) return false;
|
||||
return path.startsWith(absolutePath);
|
||||
};
|
||||
resolver
|
||||
.getHook(this.source)
|
||||
.tapAsync("AliasPlugin", (request, resolveContext, callback) => {
|
||||
const innerRequest = request.request || request.path;
|
||||
if (!innerRequest) return callback();
|
||||
forEachBail(
|
||||
this.options,
|
||||
(item, callback) => {
|
||||
let shouldStop = false;
|
||||
if (
|
||||
innerRequest === item.name ||
|
||||
(!item.onlyModule &&
|
||||
(request.request
|
||||
? innerRequest.startsWith(`${item.name}/`)
|
||||
: isSubPath(innerRequest, item.name)))
|
||||
) {
|
||||
const remainingRequest = innerRequest.substr(item.name.length);
|
||||
const resolveWithAlias = (alias, callback) => {
|
||||
if (alias === false) {
|
||||
/** @type {ResolveRequest} */
|
||||
const ignoreObj = {
|
||||
...request,
|
||||
path: false
|
||||
};
|
||||
if (typeof resolveContext.yield === "function") {
|
||||
resolveContext.yield(ignoreObj);
|
||||
return callback(null, null);
|
||||
}
|
||||
return callback(null, ignoreObj);
|
||||
}
|
||||
if (
|
||||
innerRequest !== alias &&
|
||||
!innerRequest.startsWith(alias + "/")
|
||||
) {
|
||||
shouldStop = true;
|
||||
const newRequestStr = alias + remainingRequest;
|
||||
const obj = {
|
||||
...request,
|
||||
request: newRequestStr,
|
||||
fullySpecified: false
|
||||
};
|
||||
return resolver.doResolve(
|
||||
target,
|
||||
obj,
|
||||
"aliased with mapping '" +
|
||||
item.name +
|
||||
"': '" +
|
||||
alias +
|
||||
"' to '" +
|
||||
newRequestStr +
|
||||
"'",
|
||||
resolveContext,
|
||||
(err, result) => {
|
||||
if (err) return callback(err);
|
||||
if (result) return callback(null, result);
|
||||
return callback();
|
||||
}
|
||||
);
|
||||
}
|
||||
return callback();
|
||||
};
|
||||
const stoppingCallback = (err, result) => {
|
||||
if (err) return callback(err);
|
||||
|
||||
if (result) return callback(null, result);
|
||||
// Don't allow other aliasing or raw request
|
||||
if (shouldStop) return callback(null, null);
|
||||
return callback();
|
||||
};
|
||||
if (Array.isArray(item.alias)) {
|
||||
return forEachBail(
|
||||
item.alias,
|
||||
resolveWithAlias,
|
||||
stoppingCallback
|
||||
);
|
||||
} else {
|
||||
return resolveWithAlias(item.alias, stoppingCallback);
|
||||
}
|
||||
}
|
||||
return callback();
|
||||
},
|
||||
callback
|
||||
);
|
||||
});
|
||||
}
|
||||
};
|
47
node_modules/enhanced-resolve/lib/AppendPlugin.js
generated
vendored
Normal file
47
node_modules/enhanced-resolve/lib/AppendPlugin.js
generated
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
/** @typedef {import("./Resolver")} Resolver */
|
||||
/** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */
|
||||
|
||||
module.exports = class AppendPlugin {
|
||||
/**
|
||||
* @param {string | ResolveStepHook} source source
|
||||
* @param {string} appending appending
|
||||
* @param {string | ResolveStepHook} target target
|
||||
*/
|
||||
constructor(source, appending, target) {
|
||||
this.source = source;
|
||||
this.appending = appending;
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Resolver} resolver the resolver
|
||||
* @returns {void}
|
||||
*/
|
||||
apply(resolver) {
|
||||
const target = resolver.ensureHook(this.target);
|
||||
resolver
|
||||
.getHook(this.source)
|
||||
.tapAsync("AppendPlugin", (request, resolveContext, callback) => {
|
||||
const obj = {
|
||||
...request,
|
||||
path: request.path + this.appending,
|
||||
relativePath:
|
||||
request.relativePath && request.relativePath + this.appending
|
||||
};
|
||||
resolver.doResolve(
|
||||
target,
|
||||
obj,
|
||||
this.appending,
|
||||
resolveContext,
|
||||
callback
|
||||
);
|
||||
});
|
||||
}
|
||||
};
|
477
node_modules/enhanced-resolve/lib/CachedInputFileSystem.js
generated
vendored
Normal file
477
node_modules/enhanced-resolve/lib/CachedInputFileSystem.js
generated
vendored
Normal file
@@ -0,0 +1,477 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
const nextTick = require("process").nextTick;
|
||||
|
||||
/** @typedef {import("./Resolver").FileSystem} FileSystem */
|
||||
/** @typedef {import("./Resolver").SyncFileSystem} SyncFileSystem */
|
||||
|
||||
const dirname = path => {
|
||||
let idx = path.length - 1;
|
||||
while (idx >= 0) {
|
||||
const c = path.charCodeAt(idx);
|
||||
// slash or backslash
|
||||
if (c === 47 || c === 92) break;
|
||||
idx--;
|
||||
}
|
||||
if (idx < 0) return "";
|
||||
return path.slice(0, idx);
|
||||
};
|
||||
|
||||
const runCallbacks = (callbacks, err, result) => {
|
||||
if (callbacks.length === 1) {
|
||||
callbacks[0](err, result);
|
||||
callbacks.length = 0;
|
||||
return;
|
||||
}
|
||||
let error;
|
||||
for (const callback of callbacks) {
|
||||
try {
|
||||
callback(err, result);
|
||||
} catch (e) {
|
||||
if (!error) error = e;
|
||||
}
|
||||
}
|
||||
callbacks.length = 0;
|
||||
if (error) throw error;
|
||||
};
|
||||
|
||||
class OperationMergerBackend {
|
||||
/**
|
||||
* @param {any} provider async method
|
||||
* @param {any} syncProvider sync method
|
||||
* @param {any} providerContext call context for the provider methods
|
||||
*/
|
||||
constructor(provider, syncProvider, providerContext) {
|
||||
this._provider = provider;
|
||||
this._syncProvider = syncProvider;
|
||||
this._providerContext = providerContext;
|
||||
this._activeAsyncOperations = new Map();
|
||||
|
||||
this.provide = this._provider
|
||||
? (path, options, callback) => {
|
||||
if (typeof options === "function") {
|
||||
callback = options;
|
||||
options = undefined;
|
||||
}
|
||||
if (options) {
|
||||
return this._provider.call(
|
||||
this._providerContext,
|
||||
path,
|
||||
options,
|
||||
callback
|
||||
);
|
||||
}
|
||||
if (typeof path !== "string") {
|
||||
callback(new TypeError("path must be a string"));
|
||||
return;
|
||||
}
|
||||
let callbacks = this._activeAsyncOperations.get(path);
|
||||
if (callbacks) {
|
||||
callbacks.push(callback);
|
||||
return;
|
||||
}
|
||||
this._activeAsyncOperations.set(path, (callbacks = [callback]));
|
||||
provider(path, (err, result) => {
|
||||
this._activeAsyncOperations.delete(path);
|
||||
runCallbacks(callbacks, err, result);
|
||||
});
|
||||
}
|
||||
: null;
|
||||
this.provideSync = this._syncProvider
|
||||
? (path, options) => {
|
||||
return this._syncProvider.call(this._providerContext, path, options);
|
||||
}
|
||||
: null;
|
||||
}
|
||||
|
||||
purge() {}
|
||||
purgeParent() {}
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
IDLE:
|
||||
insert data: goto SYNC
|
||||
|
||||
SYNC:
|
||||
before provide: run ticks
|
||||
event loop tick: goto ASYNC_ACTIVE
|
||||
|
||||
ASYNC:
|
||||
timeout: run tick, goto ASYNC_PASSIVE
|
||||
|
||||
ASYNC_PASSIVE:
|
||||
before provide: run ticks
|
||||
|
||||
IDLE --[insert data]--> SYNC --[event loop tick]--> ASYNC_ACTIVE --[interval tick]-> ASYNC_PASSIVE
|
||||
^ |
|
||||
+---------[insert data]-------+
|
||||
*/
|
||||
|
||||
const STORAGE_MODE_IDLE = 0;
|
||||
const STORAGE_MODE_SYNC = 1;
|
||||
const STORAGE_MODE_ASYNC = 2;
|
||||
|
||||
class CacheBackend {
|
||||
/**
|
||||
* @param {number} duration max cache duration of items
|
||||
* @param {any} provider async method
|
||||
* @param {any} syncProvider sync method
|
||||
* @param {any} providerContext call context for the provider methods
|
||||
*/
|
||||
constructor(duration, provider, syncProvider, providerContext) {
|
||||
this._duration = duration;
|
||||
this._provider = provider;
|
||||
this._syncProvider = syncProvider;
|
||||
this._providerContext = providerContext;
|
||||
/** @type {Map<string, (function(Error, any): void)[]>} */
|
||||
this._activeAsyncOperations = new Map();
|
||||
/** @type {Map<string, { err: Error, result: any, level: Set<string> }>} */
|
||||
this._data = new Map();
|
||||
/** @type {Set<string>[]} */
|
||||
this._levels = [];
|
||||
for (let i = 0; i < 10; i++) this._levels.push(new Set());
|
||||
for (let i = 5000; i < duration; i += 500) this._levels.push(new Set());
|
||||
this._currentLevel = 0;
|
||||
this._tickInterval = Math.floor(duration / this._levels.length);
|
||||
/** @type {STORAGE_MODE_IDLE | STORAGE_MODE_SYNC | STORAGE_MODE_ASYNC} */
|
||||
this._mode = STORAGE_MODE_IDLE;
|
||||
|
||||
/** @type {NodeJS.Timeout | undefined} */
|
||||
this._timeout = undefined;
|
||||
/** @type {number | undefined} */
|
||||
this._nextDecay = undefined;
|
||||
|
||||
this.provide = provider ? this.provide.bind(this) : null;
|
||||
this.provideSync = syncProvider ? this.provideSync.bind(this) : null;
|
||||
}
|
||||
|
||||
provide(path, options, callback) {
|
||||
if (typeof options === "function") {
|
||||
callback = options;
|
||||
options = undefined;
|
||||
}
|
||||
if (typeof path !== "string") {
|
||||
callback(new TypeError("path must be a string"));
|
||||
return;
|
||||
}
|
||||
if (options) {
|
||||
return this._provider.call(
|
||||
this._providerContext,
|
||||
path,
|
||||
options,
|
||||
callback
|
||||
);
|
||||
}
|
||||
|
||||
// When in sync mode we can move to async mode
|
||||
if (this._mode === STORAGE_MODE_SYNC) {
|
||||
this._enterAsyncMode();
|
||||
}
|
||||
|
||||
// Check in cache
|
||||
let cacheEntry = this._data.get(path);
|
||||
if (cacheEntry !== undefined) {
|
||||
if (cacheEntry.err) return nextTick(callback, cacheEntry.err);
|
||||
return nextTick(callback, null, cacheEntry.result);
|
||||
}
|
||||
|
||||
// Check if there is already the same operation running
|
||||
let callbacks = this._activeAsyncOperations.get(path);
|
||||
if (callbacks !== undefined) {
|
||||
callbacks.push(callback);
|
||||
return;
|
||||
}
|
||||
this._activeAsyncOperations.set(path, (callbacks = [callback]));
|
||||
|
||||
// Run the operation
|
||||
this._provider.call(this._providerContext, path, (err, result) => {
|
||||
this._activeAsyncOperations.delete(path);
|
||||
this._storeResult(path, err, result);
|
||||
|
||||
// Enter async mode if not yet done
|
||||
this._enterAsyncMode();
|
||||
|
||||
runCallbacks(callbacks, err, result);
|
||||
});
|
||||
}
|
||||
|
||||
provideSync(path, options) {
|
||||
if (typeof path !== "string") {
|
||||
throw new TypeError("path must be a string");
|
||||
}
|
||||
if (options) {
|
||||
return this._syncProvider.call(this._providerContext, path, options);
|
||||
}
|
||||
|
||||
// In sync mode we may have to decay some cache items
|
||||
if (this._mode === STORAGE_MODE_SYNC) {
|
||||
this._runDecays();
|
||||
}
|
||||
|
||||
// Check in cache
|
||||
let cacheEntry = this._data.get(path);
|
||||
if (cacheEntry !== undefined) {
|
||||
if (cacheEntry.err) throw cacheEntry.err;
|
||||
return cacheEntry.result;
|
||||
}
|
||||
|
||||
// Get all active async operations
|
||||
// This sync operation will also complete them
|
||||
const callbacks = this._activeAsyncOperations.get(path);
|
||||
this._activeAsyncOperations.delete(path);
|
||||
|
||||
// Run the operation
|
||||
// When in idle mode, we will enter sync mode
|
||||
let result;
|
||||
try {
|
||||
result = this._syncProvider.call(this._providerContext, path);
|
||||
} catch (err) {
|
||||
this._storeResult(path, err, undefined);
|
||||
this._enterSyncModeWhenIdle();
|
||||
if (callbacks) runCallbacks(callbacks, err, undefined);
|
||||
throw err;
|
||||
}
|
||||
this._storeResult(path, undefined, result);
|
||||
this._enterSyncModeWhenIdle();
|
||||
if (callbacks) runCallbacks(callbacks, undefined, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
purge(what) {
|
||||
if (!what) {
|
||||
if (this._mode !== STORAGE_MODE_IDLE) {
|
||||
this._data.clear();
|
||||
for (const level of this._levels) {
|
||||
level.clear();
|
||||
}
|
||||
this._enterIdleMode();
|
||||
}
|
||||
} else if (typeof what === "string") {
|
||||
for (let [key, data] of this._data) {
|
||||
if (key.startsWith(what)) {
|
||||
this._data.delete(key);
|
||||
data.level.delete(key);
|
||||
}
|
||||
}
|
||||
if (this._data.size === 0) {
|
||||
this._enterIdleMode();
|
||||
}
|
||||
} else {
|
||||
for (let [key, data] of this._data) {
|
||||
for (const item of what) {
|
||||
if (key.startsWith(item)) {
|
||||
this._data.delete(key);
|
||||
data.level.delete(key);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (this._data.size === 0) {
|
||||
this._enterIdleMode();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
purgeParent(what) {
|
||||
if (!what) {
|
||||
this.purge();
|
||||
} else if (typeof what === "string") {
|
||||
this.purge(dirname(what));
|
||||
} else {
|
||||
const set = new Set();
|
||||
for (const item of what) {
|
||||
set.add(dirname(item));
|
||||
}
|
||||
this.purge(set);
|
||||
}
|
||||
}
|
||||
|
||||
_storeResult(path, err, result) {
|
||||
if (this._data.has(path)) return;
|
||||
const level = this._levels[this._currentLevel];
|
||||
this._data.set(path, { err, result, level });
|
||||
level.add(path);
|
||||
}
|
||||
|
||||
_decayLevel() {
|
||||
const nextLevel = (this._currentLevel + 1) % this._levels.length;
|
||||
const decay = this._levels[nextLevel];
|
||||
this._currentLevel = nextLevel;
|
||||
for (let item of decay) {
|
||||
this._data.delete(item);
|
||||
}
|
||||
decay.clear();
|
||||
if (this._data.size === 0) {
|
||||
this._enterIdleMode();
|
||||
} else {
|
||||
// @ts-ignore _nextDecay is always a number in sync mode
|
||||
this._nextDecay += this._tickInterval;
|
||||
}
|
||||
}
|
||||
|
||||
_runDecays() {
|
||||
while (
|
||||
/** @type {number} */ (this._nextDecay) <= Date.now() &&
|
||||
this._mode !== STORAGE_MODE_IDLE
|
||||
) {
|
||||
this._decayLevel();
|
||||
}
|
||||
}
|
||||
|
||||
_enterAsyncMode() {
|
||||
let timeout = 0;
|
||||
switch (this._mode) {
|
||||
case STORAGE_MODE_ASYNC:
|
||||
return;
|
||||
case STORAGE_MODE_IDLE:
|
||||
this._nextDecay = Date.now() + this._tickInterval;
|
||||
timeout = this._tickInterval;
|
||||
break;
|
||||
case STORAGE_MODE_SYNC:
|
||||
this._runDecays();
|
||||
// @ts-ignore _runDecays may change the mode
|
||||
if (this._mode === STORAGE_MODE_IDLE) return;
|
||||
timeout = Math.max(
|
||||
0,
|
||||
/** @type {number} */ (this._nextDecay) - Date.now()
|
||||
);
|
||||
break;
|
||||
}
|
||||
this._mode = STORAGE_MODE_ASYNC;
|
||||
const ref = setTimeout(() => {
|
||||
this._mode = STORAGE_MODE_SYNC;
|
||||
this._runDecays();
|
||||
}, timeout);
|
||||
if (ref.unref) ref.unref();
|
||||
this._timeout = ref;
|
||||
}
|
||||
|
||||
_enterSyncModeWhenIdle() {
|
||||
if (this._mode === STORAGE_MODE_IDLE) {
|
||||
this._mode = STORAGE_MODE_SYNC;
|
||||
this._nextDecay = Date.now() + this._tickInterval;
|
||||
}
|
||||
}
|
||||
|
||||
_enterIdleMode() {
|
||||
this._mode = STORAGE_MODE_IDLE;
|
||||
this._nextDecay = undefined;
|
||||
if (this._timeout) clearTimeout(this._timeout);
|
||||
}
|
||||
}
|
||||
|
||||
const createBackend = (duration, provider, syncProvider, providerContext) => {
|
||||
if (duration > 0) {
|
||||
return new CacheBackend(duration, provider, syncProvider, providerContext);
|
||||
}
|
||||
return new OperationMergerBackend(provider, syncProvider, providerContext);
|
||||
};
|
||||
|
||||
module.exports = class CachedInputFileSystem {
|
||||
constructor(fileSystem, duration) {
|
||||
this.fileSystem = fileSystem;
|
||||
|
||||
this._lstatBackend = createBackend(
|
||||
duration,
|
||||
this.fileSystem.lstat,
|
||||
this.fileSystem.lstatSync,
|
||||
this.fileSystem
|
||||
);
|
||||
const lstat = this._lstatBackend.provide;
|
||||
this.lstat = /** @type {FileSystem["lstat"]} */ (lstat);
|
||||
const lstatSync = this._lstatBackend.provideSync;
|
||||
this.lstatSync = /** @type {SyncFileSystem["lstatSync"]} */ (lstatSync);
|
||||
|
||||
this._statBackend = createBackend(
|
||||
duration,
|
||||
this.fileSystem.stat,
|
||||
this.fileSystem.statSync,
|
||||
this.fileSystem
|
||||
);
|
||||
const stat = this._statBackend.provide;
|
||||
this.stat = /** @type {FileSystem["stat"]} */ (stat);
|
||||
const statSync = this._statBackend.provideSync;
|
||||
this.statSync = /** @type {SyncFileSystem["statSync"]} */ (statSync);
|
||||
|
||||
this._readdirBackend = createBackend(
|
||||
duration,
|
||||
this.fileSystem.readdir,
|
||||
this.fileSystem.readdirSync,
|
||||
this.fileSystem
|
||||
);
|
||||
const readdir = this._readdirBackend.provide;
|
||||
this.readdir = /** @type {FileSystem["readdir"]} */ (readdir);
|
||||
const readdirSync = this._readdirBackend.provideSync;
|
||||
this.readdirSync = /** @type {SyncFileSystem["readdirSync"]} */ (readdirSync);
|
||||
|
||||
this._readFileBackend = createBackend(
|
||||
duration,
|
||||
this.fileSystem.readFile,
|
||||
this.fileSystem.readFileSync,
|
||||
this.fileSystem
|
||||
);
|
||||
const readFile = this._readFileBackend.provide;
|
||||
this.readFile = /** @type {FileSystem["readFile"]} */ (readFile);
|
||||
const readFileSync = this._readFileBackend.provideSync;
|
||||
this.readFileSync = /** @type {SyncFileSystem["readFileSync"]} */ (readFileSync);
|
||||
|
||||
this._readJsonBackend = createBackend(
|
||||
duration,
|
||||
this.fileSystem.readJson ||
|
||||
(this.readFile &&
|
||||
((path, callback) => {
|
||||
// @ts-ignore
|
||||
this.readFile(path, (err, buffer) => {
|
||||
if (err) return callback(err);
|
||||
if (!buffer || buffer.length === 0)
|
||||
return callback(new Error("No file content"));
|
||||
let data;
|
||||
try {
|
||||
data = JSON.parse(buffer.toString("utf-8"));
|
||||
} catch (e) {
|
||||
return callback(e);
|
||||
}
|
||||
callback(null, data);
|
||||
});
|
||||
})),
|
||||
this.fileSystem.readJsonSync ||
|
||||
(this.readFileSync &&
|
||||
(path => {
|
||||
const buffer = this.readFileSync(path);
|
||||
const data = JSON.parse(buffer.toString("utf-8"));
|
||||
return data;
|
||||
})),
|
||||
this.fileSystem
|
||||
);
|
||||
const readJson = this._readJsonBackend.provide;
|
||||
this.readJson = /** @type {FileSystem["readJson"]} */ (readJson);
|
||||
const readJsonSync = this._readJsonBackend.provideSync;
|
||||
this.readJsonSync = /** @type {SyncFileSystem["readJsonSync"]} */ (readJsonSync);
|
||||
|
||||
this._readlinkBackend = createBackend(
|
||||
duration,
|
||||
this.fileSystem.readlink,
|
||||
this.fileSystem.readlinkSync,
|
||||
this.fileSystem
|
||||
);
|
||||
const readlink = this._readlinkBackend.provide;
|
||||
this.readlink = /** @type {FileSystem["readlink"]} */ (readlink);
|
||||
const readlinkSync = this._readlinkBackend.provideSync;
|
||||
this.readlinkSync = /** @type {SyncFileSystem["readlinkSync"]} */ (readlinkSync);
|
||||
}
|
||||
|
||||
purge(what) {
|
||||
this._statBackend.purge(what);
|
||||
this._lstatBackend.purge(what);
|
||||
this._readdirBackend.purgeParent(what);
|
||||
this._readFileBackend.purge(what);
|
||||
this._readlinkBackend.purge(what);
|
||||
this._readJsonBackend.purge(what);
|
||||
}
|
||||
};
|
45
node_modules/enhanced-resolve/lib/CloneBasenamePlugin.js
generated
vendored
Normal file
45
node_modules/enhanced-resolve/lib/CloneBasenamePlugin.js
generated
vendored
Normal file
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
const basename = require("./getPaths").basename;
|
||||
|
||||
/** @typedef {import("./Resolver")} Resolver */
|
||||
|
||||
module.exports = class CloneBasenamePlugin {
|
||||
constructor(source, target) {
|
||||
this.source = source;
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Resolver} resolver the resolver
|
||||
* @returns {void}
|
||||
*/
|
||||
apply(resolver) {
|
||||
const target = resolver.ensureHook(this.target);
|
||||
resolver
|
||||
.getHook(this.source)
|
||||
.tapAsync("CloneBasenamePlugin", (request, resolveContext, callback) => {
|
||||
const filename = basename(request.path);
|
||||
const filePath = resolver.join(request.path, filename);
|
||||
const obj = {
|
||||
...request,
|
||||
path: filePath,
|
||||
relativePath:
|
||||
request.relativePath &&
|
||||
resolver.join(request.relativePath, filename)
|
||||
};
|
||||
resolver.doResolve(
|
||||
target,
|
||||
obj,
|
||||
"using path: " + filePath,
|
||||
resolveContext,
|
||||
callback
|
||||
);
|
||||
});
|
||||
}
|
||||
};
|
59
node_modules/enhanced-resolve/lib/ConditionalPlugin.js
generated
vendored
Normal file
59
node_modules/enhanced-resolve/lib/ConditionalPlugin.js
generated
vendored
Normal file
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
/** @typedef {import("./Resolver")} Resolver */
|
||||
/** @typedef {import("./Resolver").ResolveRequest} ResolveRequest */
|
||||
/** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */
|
||||
|
||||
module.exports = class ConditionalPlugin {
|
||||
/**
|
||||
* @param {string | ResolveStepHook} source source
|
||||
* @param {Partial<ResolveRequest>} test compare object
|
||||
* @param {string | null} message log message
|
||||
* @param {boolean} allowAlternatives when false, do not continue with the current step when "test" matches
|
||||
* @param {string | ResolveStepHook} target target
|
||||
*/
|
||||
constructor(source, test, message, allowAlternatives, target) {
|
||||
this.source = source;
|
||||
this.test = test;
|
||||
this.message = message;
|
||||
this.allowAlternatives = allowAlternatives;
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Resolver} resolver the resolver
|
||||
* @returns {void}
|
||||
*/
|
||||
apply(resolver) {
|
||||
const target = resolver.ensureHook(this.target);
|
||||
const { test, message, allowAlternatives } = this;
|
||||
const keys = Object.keys(test);
|
||||
resolver
|
||||
.getHook(this.source)
|
||||
.tapAsync("ConditionalPlugin", (request, resolveContext, callback) => {
|
||||
for (const prop of keys) {
|
||||
if (request[prop] !== test[prop]) return callback();
|
||||
}
|
||||
resolver.doResolve(
|
||||
target,
|
||||
request,
|
||||
message,
|
||||
resolveContext,
|
||||
allowAlternatives
|
||||
? callback
|
||||
: (err, result) => {
|
||||
if (err) return callback(err);
|
||||
|
||||
// Don't allow other alternatives
|
||||
if (result === undefined) return callback(null, null);
|
||||
callback(null, result);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
};
|
96
node_modules/enhanced-resolve/lib/DescriptionFilePlugin.js
generated
vendored
Normal file
96
node_modules/enhanced-resolve/lib/DescriptionFilePlugin.js
generated
vendored
Normal file
@@ -0,0 +1,96 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
const DescriptionFileUtils = require("./DescriptionFileUtils");
|
||||
|
||||
/** @typedef {import("./Resolver")} Resolver */
|
||||
/** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */
|
||||
|
||||
module.exports = class DescriptionFilePlugin {
|
||||
/**
|
||||
* @param {string | ResolveStepHook} source source
|
||||
* @param {string[]} filenames filenames
|
||||
* @param {boolean} pathIsFile pathIsFile
|
||||
* @param {string | ResolveStepHook} target target
|
||||
*/
|
||||
constructor(source, filenames, pathIsFile, target) {
|
||||
this.source = source;
|
||||
this.filenames = filenames;
|
||||
this.pathIsFile = pathIsFile;
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Resolver} resolver the resolver
|
||||
* @returns {void}
|
||||
*/
|
||||
apply(resolver) {
|
||||
const target = resolver.ensureHook(this.target);
|
||||
resolver
|
||||
.getHook(this.source)
|
||||
.tapAsync(
|
||||
"DescriptionFilePlugin",
|
||||
(request, resolveContext, callback) => {
|
||||
const path = request.path;
|
||||
if (!path) return callback();
|
||||
const directory = this.pathIsFile
|
||||
? DescriptionFileUtils.cdUp(path)
|
||||
: path;
|
||||
if (!directory) return callback();
|
||||
DescriptionFileUtils.loadDescriptionFile(
|
||||
resolver,
|
||||
directory,
|
||||
this.filenames,
|
||||
request.descriptionFilePath
|
||||
? {
|
||||
path: request.descriptionFilePath,
|
||||
content: request.descriptionFileData,
|
||||
directory: /** @type {string} */ (request.descriptionFileRoot)
|
||||
}
|
||||
: undefined,
|
||||
resolveContext,
|
||||
(err, result) => {
|
||||
if (err) return callback(err);
|
||||
if (!result) {
|
||||
if (resolveContext.log)
|
||||
resolveContext.log(
|
||||
`No description file found in ${directory} or above`
|
||||
);
|
||||
return callback();
|
||||
}
|
||||
const relativePath =
|
||||
"." + path.substr(result.directory.length).replace(/\\/g, "/");
|
||||
const obj = {
|
||||
...request,
|
||||
descriptionFilePath: result.path,
|
||||
descriptionFileData: result.content,
|
||||
descriptionFileRoot: result.directory,
|
||||
relativePath: relativePath
|
||||
};
|
||||
resolver.doResolve(
|
||||
target,
|
||||
obj,
|
||||
"using description file: " +
|
||||
result.path +
|
||||
" (relative path: " +
|
||||
relativePath +
|
||||
")",
|
||||
resolveContext,
|
||||
(err, result) => {
|
||||
if (err) return callback(err);
|
||||
|
||||
// Don't allow other processing
|
||||
if (result === undefined) return callback(null, null);
|
||||
callback(null, result);
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
};
|
170
node_modules/enhanced-resolve/lib/DescriptionFileUtils.js
generated
vendored
Normal file
170
node_modules/enhanced-resolve/lib/DescriptionFileUtils.js
generated
vendored
Normal file
@@ -0,0 +1,170 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
const forEachBail = require("./forEachBail");
|
||||
|
||||
/** @typedef {import("./Resolver")} Resolver */
|
||||
/** @typedef {import("./Resolver").ResolveContext} ResolveContext */
|
||||
|
||||
/**
|
||||
* @typedef {Object} DescriptionFileInfo
|
||||
* @property {any=} content
|
||||
* @property {string} path
|
||||
* @property {string} directory
|
||||
*/
|
||||
|
||||
/**
|
||||
* @callback ErrorFirstCallback
|
||||
* @param {Error|null=} error
|
||||
* @param {DescriptionFileInfo=} result
|
||||
*/
|
||||
|
||||
/**
|
||||
* @param {Resolver} resolver resolver
|
||||
* @param {string} directory directory
|
||||
* @param {string[]} filenames filenames
|
||||
* @param {DescriptionFileInfo|undefined} oldInfo oldInfo
|
||||
* @param {ResolveContext} resolveContext resolveContext
|
||||
* @param {ErrorFirstCallback} callback callback
|
||||
*/
|
||||
function loadDescriptionFile(
|
||||
resolver,
|
||||
directory,
|
||||
filenames,
|
||||
oldInfo,
|
||||
resolveContext,
|
||||
callback
|
||||
) {
|
||||
(function findDescriptionFile() {
|
||||
if (oldInfo && oldInfo.directory === directory) {
|
||||
// We already have info for this directory and can reuse it
|
||||
return callback(null, oldInfo);
|
||||
}
|
||||
forEachBail(
|
||||
filenames,
|
||||
(filename, callback) => {
|
||||
const descriptionFilePath = resolver.join(directory, filename);
|
||||
if (resolver.fileSystem.readJson) {
|
||||
resolver.fileSystem.readJson(descriptionFilePath, (err, content) => {
|
||||
if (err) {
|
||||
if (typeof err.code !== "undefined") {
|
||||
if (resolveContext.missingDependencies) {
|
||||
resolveContext.missingDependencies.add(descriptionFilePath);
|
||||
}
|
||||
return callback();
|
||||
}
|
||||
if (resolveContext.fileDependencies) {
|
||||
resolveContext.fileDependencies.add(descriptionFilePath);
|
||||
}
|
||||
return onJson(err);
|
||||
}
|
||||
if (resolveContext.fileDependencies) {
|
||||
resolveContext.fileDependencies.add(descriptionFilePath);
|
||||
}
|
||||
onJson(null, content);
|
||||
});
|
||||
} else {
|
||||
resolver.fileSystem.readFile(descriptionFilePath, (err, content) => {
|
||||
if (err) {
|
||||
if (resolveContext.missingDependencies) {
|
||||
resolveContext.missingDependencies.add(descriptionFilePath);
|
||||
}
|
||||
return callback();
|
||||
}
|
||||
if (resolveContext.fileDependencies) {
|
||||
resolveContext.fileDependencies.add(descriptionFilePath);
|
||||
}
|
||||
let json;
|
||||
|
||||
if (content) {
|
||||
try {
|
||||
json = JSON.parse(content.toString());
|
||||
} catch (e) {
|
||||
return onJson(e);
|
||||
}
|
||||
} else {
|
||||
return onJson(new Error("No content in file"));
|
||||
}
|
||||
|
||||
onJson(null, json);
|
||||
});
|
||||
}
|
||||
|
||||
function onJson(err, content) {
|
||||
if (err) {
|
||||
if (resolveContext.log)
|
||||
resolveContext.log(
|
||||
descriptionFilePath + " (directory description file): " + err
|
||||
);
|
||||
else
|
||||
err.message =
|
||||
descriptionFilePath + " (directory description file): " + err;
|
||||
return callback(err);
|
||||
}
|
||||
callback(null, {
|
||||
content,
|
||||
directory,
|
||||
path: descriptionFilePath
|
||||
});
|
||||
}
|
||||
},
|
||||
(err, result) => {
|
||||
if (err) return callback(err);
|
||||
if (result) {
|
||||
return callback(null, result);
|
||||
} else {
|
||||
const dir = cdUp(directory);
|
||||
if (!dir) {
|
||||
return callback();
|
||||
} else {
|
||||
directory = dir;
|
||||
return findDescriptionFile();
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
})();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {any} content content
|
||||
* @param {string|string[]} field field
|
||||
* @returns {object|string|number|boolean|undefined} field data
|
||||
*/
|
||||
function getField(content, field) {
|
||||
if (!content) return undefined;
|
||||
if (Array.isArray(field)) {
|
||||
let current = content;
|
||||
for (let j = 0; j < field.length; j++) {
|
||||
if (current === null || typeof current !== "object") {
|
||||
current = null;
|
||||
break;
|
||||
}
|
||||
current = current[field[j]];
|
||||
}
|
||||
return current;
|
||||
} else {
|
||||
return content[field];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} directory directory
|
||||
* @returns {string|null} parent directory or null
|
||||
*/
|
||||
function cdUp(directory) {
|
||||
if (directory === "/") return null;
|
||||
const i = directory.lastIndexOf("/"),
|
||||
j = directory.lastIndexOf("\\");
|
||||
const p = i < 0 ? j : j < 0 ? i : i < j ? j : i;
|
||||
if (p < 0) return null;
|
||||
return directory.substr(0, p || 1);
|
||||
}
|
||||
|
||||
exports.loadDescriptionFile = loadDescriptionFile;
|
||||
exports.getField = getField;
|
||||
exports.cdUp = cdUp;
|
63
node_modules/enhanced-resolve/lib/DirectoryExistsPlugin.js
generated
vendored
Normal file
63
node_modules/enhanced-resolve/lib/DirectoryExistsPlugin.js
generated
vendored
Normal file
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
/** @typedef {import("./Resolver")} Resolver */
|
||||
/** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */
|
||||
|
||||
module.exports = class DirectoryExistsPlugin {
|
||||
/**
|
||||
* @param {string | ResolveStepHook} source source
|
||||
* @param {string | ResolveStepHook} target target
|
||||
*/
|
||||
constructor(source, target) {
|
||||
this.source = source;
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Resolver} resolver the resolver
|
||||
* @returns {void}
|
||||
*/
|
||||
apply(resolver) {
|
||||
const target = resolver.ensureHook(this.target);
|
||||
resolver
|
||||
.getHook(this.source)
|
||||
.tapAsync(
|
||||
"DirectoryExistsPlugin",
|
||||
(request, resolveContext, callback) => {
|
||||
const fs = resolver.fileSystem;
|
||||
const directory = request.path;
|
||||
if (!directory) return callback();
|
||||
fs.stat(directory, (err, stat) => {
|
||||
if (err || !stat) {
|
||||
if (resolveContext.missingDependencies)
|
||||
resolveContext.missingDependencies.add(directory);
|
||||
if (resolveContext.log)
|
||||
resolveContext.log(directory + " doesn't exist");
|
||||
return callback();
|
||||
}
|
||||
if (!stat.isDirectory()) {
|
||||
if (resolveContext.missingDependencies)
|
||||
resolveContext.missingDependencies.add(directory);
|
||||
if (resolveContext.log)
|
||||
resolveContext.log(directory + " is not a directory");
|
||||
return callback();
|
||||
}
|
||||
if (resolveContext.fileDependencies)
|
||||
resolveContext.fileDependencies.add(directory);
|
||||
resolver.doResolve(
|
||||
target,
|
||||
request,
|
||||
`existing directory ${directory}`,
|
||||
resolveContext,
|
||||
callback
|
||||
);
|
||||
});
|
||||
}
|
||||
);
|
||||
}
|
||||
};
|
149
node_modules/enhanced-resolve/lib/ExportsFieldPlugin.js
generated
vendored
Normal file
149
node_modules/enhanced-resolve/lib/ExportsFieldPlugin.js
generated
vendored
Normal file
@@ -0,0 +1,149 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Ivan Kopeykin @vankop
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
const path = require("path");
|
||||
const DescriptionFileUtils = require("./DescriptionFileUtils");
|
||||
const forEachBail = require("./forEachBail");
|
||||
const { processExportsField } = require("./util/entrypoints");
|
||||
const { parseIdentifier } = require("./util/identifier");
|
||||
const { checkImportsExportsFieldTarget } = require("./util/path");
|
||||
|
||||
/** @typedef {import("./Resolver")} Resolver */
|
||||
/** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */
|
||||
/** @typedef {import("./util/entrypoints").ExportsField} ExportsField */
|
||||
/** @typedef {import("./util/entrypoints").FieldProcessor} FieldProcessor */
|
||||
|
||||
module.exports = class ExportsFieldPlugin {
|
||||
/**
|
||||
* @param {string | ResolveStepHook} source source
|
||||
* @param {Set<string>} conditionNames condition names
|
||||
* @param {string | string[]} fieldNamePath name path
|
||||
* @param {string | ResolveStepHook} target target
|
||||
*/
|
||||
constructor(source, conditionNames, fieldNamePath, target) {
|
||||
this.source = source;
|
||||
this.target = target;
|
||||
this.conditionNames = conditionNames;
|
||||
this.fieldName = fieldNamePath;
|
||||
/** @type {WeakMap<any, FieldProcessor>} */
|
||||
this.fieldProcessorCache = new WeakMap();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Resolver} resolver the resolver
|
||||
* @returns {void}
|
||||
*/
|
||||
apply(resolver) {
|
||||
const target = resolver.ensureHook(this.target);
|
||||
resolver
|
||||
.getHook(this.source)
|
||||
.tapAsync("ExportsFieldPlugin", (request, resolveContext, callback) => {
|
||||
// When there is no description file, abort
|
||||
if (!request.descriptionFilePath) return callback();
|
||||
if (
|
||||
// When the description file is inherited from parent, abort
|
||||
// (There is no description file inside of this package)
|
||||
request.relativePath !== "." ||
|
||||
request.request === undefined
|
||||
)
|
||||
return callback();
|
||||
|
||||
const remainingRequest =
|
||||
request.query || request.fragment
|
||||
? (request.request === "." ? "./" : request.request) +
|
||||
request.query +
|
||||
request.fragment
|
||||
: request.request;
|
||||
/** @type {ExportsField|null} */
|
||||
const exportsField = DescriptionFileUtils.getField(
|
||||
request.descriptionFileData,
|
||||
this.fieldName
|
||||
);
|
||||
if (!exportsField) return callback();
|
||||
|
||||
if (request.directory) {
|
||||
return callback(
|
||||
new Error(
|
||||
`Resolving to directories is not possible with the exports field (request was ${remainingRequest}/)`
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
let paths;
|
||||
|
||||
try {
|
||||
// We attach the cache to the description file instead of the exportsField value
|
||||
// because we use a WeakMap and the exportsField could be a string too.
|
||||
// Description file is always an object when exports field can be accessed.
|
||||
let fieldProcessor = this.fieldProcessorCache.get(
|
||||
request.descriptionFileData
|
||||
);
|
||||
if (fieldProcessor === undefined) {
|
||||
fieldProcessor = processExportsField(exportsField);
|
||||
this.fieldProcessorCache.set(
|
||||
request.descriptionFileData,
|
||||
fieldProcessor
|
||||
);
|
||||
}
|
||||
paths = fieldProcessor(remainingRequest, this.conditionNames);
|
||||
} catch (err) {
|
||||
if (resolveContext.log) {
|
||||
resolveContext.log(
|
||||
`Exports field in ${request.descriptionFilePath} can't be processed: ${err}`
|
||||
);
|
||||
}
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
if (paths.length === 0) {
|
||||
return callback(
|
||||
new Error(
|
||||
`Package path ${remainingRequest} is not exported from package ${request.descriptionFileRoot} (see exports field in ${request.descriptionFilePath})`
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
forEachBail(
|
||||
paths,
|
||||
(p, callback) => {
|
||||
const parsedIdentifier = parseIdentifier(p);
|
||||
|
||||
if (!parsedIdentifier) return callback();
|
||||
|
||||
const [relativePath, query, fragment] = parsedIdentifier;
|
||||
|
||||
const error = checkImportsExportsFieldTarget(relativePath);
|
||||
|
||||
if (error) {
|
||||
return callback(error);
|
||||
}
|
||||
|
||||
const obj = {
|
||||
...request,
|
||||
request: undefined,
|
||||
path: path.join(
|
||||
/** @type {string} */ (request.descriptionFileRoot),
|
||||
relativePath
|
||||
),
|
||||
relativePath,
|
||||
query,
|
||||
fragment
|
||||
};
|
||||
|
||||
resolver.doResolve(
|
||||
target,
|
||||
obj,
|
||||
"using exports field: " + p,
|
||||
resolveContext,
|
||||
callback
|
||||
);
|
||||
},
|
||||
(err, result) => callback(err, result || null)
|
||||
);
|
||||
});
|
||||
}
|
||||
};
|
68
node_modules/enhanced-resolve/lib/ExtensionAliasPlugin.js
generated
vendored
Normal file
68
node_modules/enhanced-resolve/lib/ExtensionAliasPlugin.js
generated
vendored
Normal file
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Ivan Kopeykin @vankop
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
const forEachBail = require("./forEachBail");
|
||||
|
||||
/** @typedef {import("./Resolver")} Resolver */
|
||||
/** @typedef {import("./Resolver").ResolveRequest} ResolveRequest */
|
||||
/** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */
|
||||
/** @typedef {{ alias: string|string[], extension: string }} ExtensionAliasOption */
|
||||
|
||||
module.exports = class ExtensionAliasPlugin {
|
||||
/**
|
||||
* @param {string | ResolveStepHook} source source
|
||||
* @param {ExtensionAliasOption} options options
|
||||
* @param {string | ResolveStepHook} target target
|
||||
*/
|
||||
constructor(source, options, target) {
|
||||
this.source = source;
|
||||
this.options = options;
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Resolver} resolver the resolver
|
||||
* @returns {void}
|
||||
*/
|
||||
apply(resolver) {
|
||||
const target = resolver.ensureHook(this.target);
|
||||
const { extension, alias } = this.options;
|
||||
resolver
|
||||
.getHook(this.source)
|
||||
.tapAsync("ExtensionAliasPlugin", (request, resolveContext, callback) => {
|
||||
const requestPath = request.request;
|
||||
if (!requestPath || !requestPath.endsWith(extension)) return callback();
|
||||
const resolve = (alias, callback) => {
|
||||
resolver.doResolve(
|
||||
target,
|
||||
{
|
||||
...request,
|
||||
request: `${requestPath.slice(0, -extension.length)}${alias}`,
|
||||
fullySpecified: true
|
||||
},
|
||||
`aliased from extension alias with mapping '${extension}' to '${alias}'`,
|
||||
resolveContext,
|
||||
callback
|
||||
);
|
||||
};
|
||||
|
||||
const stoppingCallback = (err, result) => {
|
||||
if (err) return callback(err);
|
||||
if (result) return callback(null, result);
|
||||
// Don't allow other aliasing or raw request
|
||||
return callback(null, null);
|
||||
};
|
||||
if (typeof alias === "string") {
|
||||
resolve(alias, stoppingCallback);
|
||||
} else if (alias.length > 1) {
|
||||
forEachBail(alias, resolve, stoppingCallback);
|
||||
} else {
|
||||
resolve(alias[0], stoppingCallback);
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
58
node_modules/enhanced-resolve/lib/FileExistsPlugin.js
generated
vendored
Normal file
58
node_modules/enhanced-resolve/lib/FileExistsPlugin.js
generated
vendored
Normal file
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
/** @typedef {import("./Resolver")} Resolver */
|
||||
/** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */
|
||||
|
||||
module.exports = class FileExistsPlugin {
|
||||
/**
|
||||
* @param {string | ResolveStepHook} source source
|
||||
* @param {string | ResolveStepHook} target target
|
||||
*/
|
||||
constructor(source, target) {
|
||||
this.source = source;
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Resolver} resolver the resolver
|
||||
* @returns {void}
|
||||
*/
|
||||
apply(resolver) {
|
||||
const target = resolver.ensureHook(this.target);
|
||||
const fs = resolver.fileSystem;
|
||||
resolver
|
||||
.getHook(this.source)
|
||||
.tapAsync("FileExistsPlugin", (request, resolveContext, callback) => {
|
||||
const file = request.path;
|
||||
if (!file) return callback();
|
||||
fs.stat(file, (err, stat) => {
|
||||
if (err || !stat) {
|
||||
if (resolveContext.missingDependencies)
|
||||
resolveContext.missingDependencies.add(file);
|
||||
if (resolveContext.log) resolveContext.log(file + " doesn't exist");
|
||||
return callback();
|
||||
}
|
||||
if (!stat.isFile()) {
|
||||
if (resolveContext.missingDependencies)
|
||||
resolveContext.missingDependencies.add(file);
|
||||
if (resolveContext.log) resolveContext.log(file + " is not a file");
|
||||
return callback();
|
||||
}
|
||||
if (resolveContext.fileDependencies)
|
||||
resolveContext.fileDependencies.add(file);
|
||||
resolver.doResolve(
|
||||
target,
|
||||
request,
|
||||
"existing file: " + file,
|
||||
resolveContext,
|
||||
callback
|
||||
);
|
||||
});
|
||||
});
|
||||
}
|
||||
};
|
178
node_modules/enhanced-resolve/lib/ImportsFieldPlugin.js
generated
vendored
Normal file
178
node_modules/enhanced-resolve/lib/ImportsFieldPlugin.js
generated
vendored
Normal file
@@ -0,0 +1,178 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Ivan Kopeykin @vankop
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
const path = require("path");
|
||||
const DescriptionFileUtils = require("./DescriptionFileUtils");
|
||||
const forEachBail = require("./forEachBail");
|
||||
const { processImportsField } = require("./util/entrypoints");
|
||||
const { parseIdentifier } = require("./util/identifier");
|
||||
const { checkImportsExportsFieldTarget } = require("./util/path");
|
||||
|
||||
/** @typedef {import("./Resolver")} Resolver */
|
||||
/** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */
|
||||
/** @typedef {import("./util/entrypoints").FieldProcessor} FieldProcessor */
|
||||
/** @typedef {import("./util/entrypoints").ImportsField} ImportsField */
|
||||
|
||||
const dotCode = ".".charCodeAt(0);
|
||||
|
||||
module.exports = class ImportsFieldPlugin {
|
||||
/**
|
||||
* @param {string | ResolveStepHook} source source
|
||||
* @param {Set<string>} conditionNames condition names
|
||||
* @param {string | string[]} fieldNamePath name path
|
||||
* @param {string | ResolveStepHook} targetFile target file
|
||||
* @param {string | ResolveStepHook} targetPackage target package
|
||||
*/
|
||||
constructor(
|
||||
source,
|
||||
conditionNames,
|
||||
fieldNamePath,
|
||||
targetFile,
|
||||
targetPackage
|
||||
) {
|
||||
this.source = source;
|
||||
this.targetFile = targetFile;
|
||||
this.targetPackage = targetPackage;
|
||||
this.conditionNames = conditionNames;
|
||||
this.fieldName = fieldNamePath;
|
||||
/** @type {WeakMap<any, FieldProcessor>} */
|
||||
this.fieldProcessorCache = new WeakMap();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Resolver} resolver the resolver
|
||||
* @returns {void}
|
||||
*/
|
||||
apply(resolver) {
|
||||
const targetFile = resolver.ensureHook(this.targetFile);
|
||||
const targetPackage = resolver.ensureHook(this.targetPackage);
|
||||
|
||||
resolver
|
||||
.getHook(this.source)
|
||||
.tapAsync("ImportsFieldPlugin", (request, resolveContext, callback) => {
|
||||
// When there is no description file, abort
|
||||
if (!request.descriptionFilePath || request.request === undefined) {
|
||||
return callback();
|
||||
}
|
||||
|
||||
const remainingRequest =
|
||||
request.request + request.query + request.fragment;
|
||||
/** @type {ImportsField|null} */
|
||||
const importsField = DescriptionFileUtils.getField(
|
||||
request.descriptionFileData,
|
||||
this.fieldName
|
||||
);
|
||||
if (!importsField) return callback();
|
||||
|
||||
if (request.directory) {
|
||||
return callback(
|
||||
new Error(
|
||||
`Resolving to directories is not possible with the imports field (request was ${remainingRequest}/)`
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
let paths;
|
||||
|
||||
try {
|
||||
// We attach the cache to the description file instead of the importsField value
|
||||
// because we use a WeakMap and the importsField could be a string too.
|
||||
// Description file is always an object when exports field can be accessed.
|
||||
let fieldProcessor = this.fieldProcessorCache.get(
|
||||
request.descriptionFileData
|
||||
);
|
||||
if (fieldProcessor === undefined) {
|
||||
fieldProcessor = processImportsField(importsField);
|
||||
this.fieldProcessorCache.set(
|
||||
request.descriptionFileData,
|
||||
fieldProcessor
|
||||
);
|
||||
}
|
||||
paths = fieldProcessor(remainingRequest, this.conditionNames);
|
||||
} catch (err) {
|
||||
if (resolveContext.log) {
|
||||
resolveContext.log(
|
||||
`Imports field in ${request.descriptionFilePath} can't be processed: ${err}`
|
||||
);
|
||||
}
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
if (paths.length === 0) {
|
||||
return callback(
|
||||
new Error(
|
||||
`Package import ${remainingRequest} is not imported from package ${request.descriptionFileRoot} (see imports field in ${request.descriptionFilePath})`
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
forEachBail(
|
||||
paths,
|
||||
(p, callback) => {
|
||||
const parsedIdentifier = parseIdentifier(p);
|
||||
|
||||
if (!parsedIdentifier) return callback();
|
||||
|
||||
const [path_, query, fragment] = parsedIdentifier;
|
||||
|
||||
const error = checkImportsExportsFieldTarget(path_);
|
||||
|
||||
if (error) {
|
||||
return callback(error);
|
||||
}
|
||||
|
||||
switch (path_.charCodeAt(0)) {
|
||||
// should be relative
|
||||
case dotCode: {
|
||||
const obj = {
|
||||
...request,
|
||||
request: undefined,
|
||||
path: path.join(
|
||||
/** @type {string} */ (request.descriptionFileRoot),
|
||||
path_
|
||||
),
|
||||
relativePath: path_,
|
||||
query,
|
||||
fragment
|
||||
};
|
||||
|
||||
resolver.doResolve(
|
||||
targetFile,
|
||||
obj,
|
||||
"using imports field: " + p,
|
||||
resolveContext,
|
||||
callback
|
||||
);
|
||||
break;
|
||||
}
|
||||
|
||||
// package resolving
|
||||
default: {
|
||||
const obj = {
|
||||
...request,
|
||||
request: path_,
|
||||
relativePath: path_,
|
||||
fullySpecified: true,
|
||||
query,
|
||||
fragment
|
||||
};
|
||||
|
||||
resolver.doResolve(
|
||||
targetPackage,
|
||||
obj,
|
||||
"using imports field: " + p,
|
||||
resolveContext,
|
||||
callback
|
||||
);
|
||||
}
|
||||
}
|
||||
},
|
||||
(err, result) => callback(err, result || null)
|
||||
);
|
||||
});
|
||||
}
|
||||
};
|
64
node_modules/enhanced-resolve/lib/JoinRequestPartPlugin.js
generated
vendored
Normal file
64
node_modules/enhanced-resolve/lib/JoinRequestPartPlugin.js
generated
vendored
Normal file
@@ -0,0 +1,64 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
/** @typedef {import("./Resolver")} Resolver */
|
||||
/** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */
|
||||
|
||||
const namespaceStartCharCode = "@".charCodeAt(0);
|
||||
|
||||
module.exports = class JoinRequestPartPlugin {
|
||||
/**
|
||||
* @param {string | ResolveStepHook} source source
|
||||
* @param {string | ResolveStepHook} target target
|
||||
*/
|
||||
constructor(source, target) {
|
||||
this.source = source;
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Resolver} resolver the resolver
|
||||
* @returns {void}
|
||||
*/
|
||||
apply(resolver) {
|
||||
const target = resolver.ensureHook(this.target);
|
||||
resolver
|
||||
.getHook(this.source)
|
||||
.tapAsync(
|
||||
"JoinRequestPartPlugin",
|
||||
(request, resolveContext, callback) => {
|
||||
const req = request.request || "";
|
||||
let i = req.indexOf("/", 3);
|
||||
|
||||
if (i >= 0 && req.charCodeAt(2) === namespaceStartCharCode) {
|
||||
i = req.indexOf("/", i + 1);
|
||||
}
|
||||
|
||||
let moduleName, remainingRequest, fullySpecified;
|
||||
if (i < 0) {
|
||||
moduleName = req;
|
||||
remainingRequest = ".";
|
||||
fullySpecified = false;
|
||||
} else {
|
||||
moduleName = req.slice(0, i);
|
||||
remainingRequest = "." + req.slice(i);
|
||||
fullySpecified = request.fullySpecified;
|
||||
}
|
||||
const obj = {
|
||||
...request,
|
||||
path: resolver.join(request.path, moduleName),
|
||||
relativePath:
|
||||
request.relativePath &&
|
||||
resolver.join(request.relativePath, moduleName),
|
||||
request: remainingRequest,
|
||||
fullySpecified
|
||||
};
|
||||
resolver.doResolve(target, obj, null, resolveContext, callback);
|
||||
}
|
||||
);
|
||||
}
|
||||
};
|
41
node_modules/enhanced-resolve/lib/JoinRequestPlugin.js
generated
vendored
Normal file
41
node_modules/enhanced-resolve/lib/JoinRequestPlugin.js
generated
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
/** @typedef {import("./Resolver")} Resolver */
|
||||
/** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */
|
||||
|
||||
module.exports = class JoinRequestPlugin {
|
||||
/**
|
||||
* @param {string | ResolveStepHook} source source
|
||||
* @param {string | ResolveStepHook} target target
|
||||
*/
|
||||
constructor(source, target) {
|
||||
this.source = source;
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Resolver} resolver the resolver
|
||||
* @returns {void}
|
||||
*/
|
||||
apply(resolver) {
|
||||
const target = resolver.ensureHook(this.target);
|
||||
resolver
|
||||
.getHook(this.source)
|
||||
.tapAsync("JoinRequestPlugin", (request, resolveContext, callback) => {
|
||||
const obj = {
|
||||
...request,
|
||||
path: resolver.join(request.path, request.request),
|
||||
relativePath:
|
||||
request.relativePath &&
|
||||
resolver.join(request.relativePath, request.request),
|
||||
request: undefined
|
||||
};
|
||||
resolver.doResolve(target, obj, null, resolveContext, callback);
|
||||
});
|
||||
}
|
||||
};
|
50
node_modules/enhanced-resolve/lib/LogInfoPlugin.js
generated
vendored
Normal file
50
node_modules/enhanced-resolve/lib/LogInfoPlugin.js
generated
vendored
Normal file
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
/** @typedef {import("./Resolver")} Resolver */
|
||||
|
||||
module.exports = class LogInfoPlugin {
|
||||
constructor(source) {
|
||||
this.source = source;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Resolver} resolver the resolver
|
||||
* @returns {void}
|
||||
*/
|
||||
apply(resolver) {
|
||||
const source = this.source;
|
||||
resolver
|
||||
.getHook(this.source)
|
||||
.tapAsync("LogInfoPlugin", (request, resolveContext, callback) => {
|
||||
if (!resolveContext.log) return callback();
|
||||
const log = resolveContext.log;
|
||||
const prefix = "[" + source + "] ";
|
||||
if (request.path)
|
||||
log(prefix + "Resolving in directory: " + request.path);
|
||||
if (request.request)
|
||||
log(prefix + "Resolving request: " + request.request);
|
||||
if (request.module) log(prefix + "Request is an module request.");
|
||||
if (request.directory) log(prefix + "Request is a directory request.");
|
||||
if (request.query)
|
||||
log(prefix + "Resolving request query: " + request.query);
|
||||
if (request.fragment)
|
||||
log(prefix + "Resolving request fragment: " + request.fragment);
|
||||
if (request.descriptionFilePath)
|
||||
log(
|
||||
prefix + "Has description data from " + request.descriptionFilePath
|
||||
);
|
||||
if (request.relativePath)
|
||||
log(
|
||||
prefix +
|
||||
"Relative path from description file is: " +
|
||||
request.relativePath
|
||||
);
|
||||
callback();
|
||||
});
|
||||
}
|
||||
};
|
81
node_modules/enhanced-resolve/lib/MainFieldPlugin.js
generated
vendored
Normal file
81
node_modules/enhanced-resolve/lib/MainFieldPlugin.js
generated
vendored
Normal file
@@ -0,0 +1,81 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
const path = require("path");
|
||||
const DescriptionFileUtils = require("./DescriptionFileUtils");
|
||||
|
||||
/** @typedef {import("./Resolver")} Resolver */
|
||||
/** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */
|
||||
/** @typedef {{name: string|Array<string>, forceRelative: boolean}} MainFieldOptions */
|
||||
|
||||
const alreadyTriedMainField = Symbol("alreadyTriedMainField");
|
||||
|
||||
module.exports = class MainFieldPlugin {
|
||||
/**
|
||||
* @param {string | ResolveStepHook} source source
|
||||
* @param {MainFieldOptions} options options
|
||||
* @param {string | ResolveStepHook} target target
|
||||
*/
|
||||
constructor(source, options, target) {
|
||||
this.source = source;
|
||||
this.options = options;
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Resolver} resolver the resolver
|
||||
* @returns {void}
|
||||
*/
|
||||
apply(resolver) {
|
||||
const target = resolver.ensureHook(this.target);
|
||||
resolver
|
||||
.getHook(this.source)
|
||||
.tapAsync("MainFieldPlugin", (request, resolveContext, callback) => {
|
||||
if (
|
||||
request.path !== request.descriptionFileRoot ||
|
||||
request[alreadyTriedMainField] === request.descriptionFilePath ||
|
||||
!request.descriptionFilePath
|
||||
)
|
||||
return callback();
|
||||
const filename = path.basename(request.descriptionFilePath);
|
||||
let mainModule = DescriptionFileUtils.getField(
|
||||
request.descriptionFileData,
|
||||
this.options.name
|
||||
);
|
||||
|
||||
if (
|
||||
!mainModule ||
|
||||
typeof mainModule !== "string" ||
|
||||
mainModule === "." ||
|
||||
mainModule === "./"
|
||||
) {
|
||||
return callback();
|
||||
}
|
||||
if (this.options.forceRelative && !/^\.\.?\//.test(mainModule))
|
||||
mainModule = "./" + mainModule;
|
||||
const obj = {
|
||||
...request,
|
||||
request: mainModule,
|
||||
module: false,
|
||||
directory: mainModule.endsWith("/"),
|
||||
[alreadyTriedMainField]: request.descriptionFilePath
|
||||
};
|
||||
return resolver.doResolve(
|
||||
target,
|
||||
obj,
|
||||
"use " +
|
||||
mainModule +
|
||||
" from " +
|
||||
this.options.name +
|
||||
" in " +
|
||||
filename,
|
||||
resolveContext,
|
||||
callback
|
||||
);
|
||||
});
|
||||
}
|
||||
};
|
9
node_modules/enhanced-resolve/lib/ModulesInHierachicDirectoriesPlugin.js
generated
vendored
Normal file
9
node_modules/enhanced-resolve/lib/ModulesInHierachicDirectoriesPlugin.js
generated
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
// TODO remove in next major
|
||||
module.exports = require("./ModulesInHierarchicalDirectoriesPlugin");
|
80
node_modules/enhanced-resolve/lib/ModulesInHierarchicalDirectoriesPlugin.js
generated
vendored
Normal file
80
node_modules/enhanced-resolve/lib/ModulesInHierarchicalDirectoriesPlugin.js
generated
vendored
Normal file
@@ -0,0 +1,80 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
const forEachBail = require("./forEachBail");
|
||||
const getPaths = require("./getPaths");
|
||||
|
||||
/** @typedef {import("./Resolver")} Resolver */
|
||||
/** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */
|
||||
|
||||
module.exports = class ModulesInHierarchicalDirectoriesPlugin {
|
||||
/**
|
||||
* @param {string | ResolveStepHook} source source
|
||||
* @param {string | Array<string>} directories directories
|
||||
* @param {string | ResolveStepHook} target target
|
||||
*/
|
||||
constructor(source, directories, target) {
|
||||
this.source = source;
|
||||
this.directories = /** @type {Array<string>} */ ([]).concat(directories);
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Resolver} resolver the resolver
|
||||
* @returns {void}
|
||||
*/
|
||||
apply(resolver) {
|
||||
const target = resolver.ensureHook(this.target);
|
||||
resolver
|
||||
.getHook(this.source)
|
||||
.tapAsync(
|
||||
"ModulesInHierarchicalDirectoriesPlugin",
|
||||
(request, resolveContext, callback) => {
|
||||
const fs = resolver.fileSystem;
|
||||
const addrs = getPaths(request.path)
|
||||
.paths.map(p => {
|
||||
return this.directories.map(d => resolver.join(p, d));
|
||||
})
|
||||
.reduce((array, p) => {
|
||||
array.push.apply(array, p);
|
||||
return array;
|
||||
}, []);
|
||||
forEachBail(
|
||||
addrs,
|
||||
(addr, callback) => {
|
||||
fs.stat(addr, (err, stat) => {
|
||||
if (!err && stat && stat.isDirectory()) {
|
||||
const obj = {
|
||||
...request,
|
||||
path: addr,
|
||||
request: "./" + request.request,
|
||||
module: false
|
||||
};
|
||||
const message = "looking for modules in " + addr;
|
||||
return resolver.doResolve(
|
||||
target,
|
||||
obj,
|
||||
message,
|
||||
resolveContext,
|
||||
callback
|
||||
);
|
||||
}
|
||||
if (resolveContext.log)
|
||||
resolveContext.log(
|
||||
addr + " doesn't exist or is not a directory"
|
||||
);
|
||||
if (resolveContext.missingDependencies)
|
||||
resolveContext.missingDependencies.add(addr);
|
||||
return callback();
|
||||
});
|
||||
},
|
||||
callback
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
};
|
47
node_modules/enhanced-resolve/lib/ModulesInRootPlugin.js
generated
vendored
Normal file
47
node_modules/enhanced-resolve/lib/ModulesInRootPlugin.js
generated
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
/** @typedef {import("./Resolver")} Resolver */
|
||||
/** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */
|
||||
|
||||
module.exports = class ModulesInRootPlugin {
|
||||
/**
|
||||
* @param {string | ResolveStepHook} source source
|
||||
* @param {string} path path
|
||||
* @param {string | ResolveStepHook} target target
|
||||
*/
|
||||
constructor(source, path, target) {
|
||||
this.source = source;
|
||||
this.path = path;
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Resolver} resolver the resolver
|
||||
* @returns {void}
|
||||
*/
|
||||
apply(resolver) {
|
||||
const target = resolver.ensureHook(this.target);
|
||||
resolver
|
||||
.getHook(this.source)
|
||||
.tapAsync("ModulesInRootPlugin", (request, resolveContext, callback) => {
|
||||
const obj = {
|
||||
...request,
|
||||
path: this.path,
|
||||
request: "./" + request.request,
|
||||
module: false
|
||||
};
|
||||
resolver.doResolve(
|
||||
target,
|
||||
obj,
|
||||
"looking for modules in " + this.path,
|
||||
resolveContext,
|
||||
callback
|
||||
);
|
||||
});
|
||||
}
|
||||
};
|
33
node_modules/enhanced-resolve/lib/NextPlugin.js
generated
vendored
Normal file
33
node_modules/enhanced-resolve/lib/NextPlugin.js
generated
vendored
Normal file
@@ -0,0 +1,33 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
/** @typedef {import("./Resolver")} Resolver */
|
||||
/** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */
|
||||
|
||||
module.exports = class NextPlugin {
|
||||
/**
|
||||
* @param {string | ResolveStepHook} source source
|
||||
* @param {string | ResolveStepHook} target target
|
||||
*/
|
||||
constructor(source, target) {
|
||||
this.source = source;
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Resolver} resolver the resolver
|
||||
* @returns {void}
|
||||
*/
|
||||
apply(resolver) {
|
||||
const target = resolver.ensureHook(this.target);
|
||||
resolver
|
||||
.getHook(this.source)
|
||||
.tapAsync("NextPlugin", (request, resolveContext, callback) => {
|
||||
resolver.doResolve(target, request, null, resolveContext, callback);
|
||||
});
|
||||
}
|
||||
};
|
74
node_modules/enhanced-resolve/lib/ParsePlugin.js
generated
vendored
Normal file
74
node_modules/enhanced-resolve/lib/ParsePlugin.js
generated
vendored
Normal file
@@ -0,0 +1,74 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
/** @typedef {import("./Resolver")} Resolver */
|
||||
/** @typedef {import("./Resolver").ResolveRequest} ResolveRequest */
|
||||
/** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */
|
||||
|
||||
module.exports = class ParsePlugin {
|
||||
/**
|
||||
* @param {string | ResolveStepHook} source source
|
||||
* @param {Partial<ResolveRequest>} requestOptions request options
|
||||
* @param {string | ResolveStepHook} target target
|
||||
*/
|
||||
constructor(source, requestOptions, target) {
|
||||
this.source = source;
|
||||
this.requestOptions = requestOptions;
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Resolver} resolver the resolver
|
||||
* @returns {void}
|
||||
*/
|
||||
apply(resolver) {
|
||||
const target = resolver.ensureHook(this.target);
|
||||
resolver
|
||||
.getHook(this.source)
|
||||
.tapAsync("ParsePlugin", (request, resolveContext, callback) => {
|
||||
const parsed = resolver.parse(/** @type {string} */ (request.request));
|
||||
const obj = { ...request, ...parsed, ...this.requestOptions };
|
||||
if (request.query && !parsed.query) {
|
||||
obj.query = request.query;
|
||||
}
|
||||
if (request.fragment && !parsed.fragment) {
|
||||
obj.fragment = request.fragment;
|
||||
}
|
||||
if (parsed && resolveContext.log) {
|
||||
if (parsed.module) resolveContext.log("Parsed request is a module");
|
||||
if (parsed.directory)
|
||||
resolveContext.log("Parsed request is a directory");
|
||||
}
|
||||
// There is an edge-case where a request with # can be a path or a fragment -> try both
|
||||
if (obj.request && !obj.query && obj.fragment) {
|
||||
const directory = obj.fragment.endsWith("/");
|
||||
const alternative = {
|
||||
...obj,
|
||||
directory,
|
||||
request:
|
||||
obj.request +
|
||||
(obj.directory ? "/" : "") +
|
||||
(directory ? obj.fragment.slice(0, -1) : obj.fragment),
|
||||
fragment: ""
|
||||
};
|
||||
resolver.doResolve(
|
||||
target,
|
||||
alternative,
|
||||
null,
|
||||
resolveContext,
|
||||
(err, result) => {
|
||||
if (err) return callback(err);
|
||||
if (result) return callback(null, result);
|
||||
resolver.doResolve(target, obj, null, resolveContext, callback);
|
||||
}
|
||||
);
|
||||
return;
|
||||
}
|
||||
resolver.doResolve(target, obj, null, resolveContext, callback);
|
||||
});
|
||||
}
|
||||
};
|
103
node_modules/enhanced-resolve/lib/PnpPlugin.js
generated
vendored
Normal file
103
node_modules/enhanced-resolve/lib/PnpPlugin.js
generated
vendored
Normal file
@@ -0,0 +1,103 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Maël Nison @arcanis
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
/** @typedef {import("./Resolver")} Resolver */
|
||||
/** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */
|
||||
/**
|
||||
* @typedef {Object} PnpApiImpl
|
||||
* @property {function(string, string, object): string} resolveToUnqualified
|
||||
*/
|
||||
|
||||
module.exports = class PnpPlugin {
|
||||
/**
|
||||
* @param {string | ResolveStepHook} source source
|
||||
* @param {PnpApiImpl} pnpApi pnpApi
|
||||
* @param {string | ResolveStepHook} target target
|
||||
*/
|
||||
constructor(source, pnpApi, target) {
|
||||
this.source = source;
|
||||
this.pnpApi = pnpApi;
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Resolver} resolver the resolver
|
||||
* @returns {void}
|
||||
*/
|
||||
apply(resolver) {
|
||||
const target = resolver.ensureHook(this.target);
|
||||
resolver
|
||||
.getHook(this.source)
|
||||
.tapAsync("PnpPlugin", (request, resolveContext, callback) => {
|
||||
const req = request.request;
|
||||
if (!req) return callback();
|
||||
|
||||
// The trailing slash indicates to PnP that this value is a folder rather than a file
|
||||
const issuer = `${request.path}/`;
|
||||
|
||||
const packageMatch = /^(@[^/]+\/)?[^/]+/.exec(req);
|
||||
if (!packageMatch) return callback();
|
||||
|
||||
const packageName = packageMatch[0];
|
||||
const innerRequest = `.${req.slice(packageName.length)}`;
|
||||
|
||||
let resolution;
|
||||
let apiResolution;
|
||||
try {
|
||||
resolution = this.pnpApi.resolveToUnqualified(packageName, issuer, {
|
||||
considerBuiltins: false
|
||||
});
|
||||
if (resolveContext.fileDependencies) {
|
||||
apiResolution = this.pnpApi.resolveToUnqualified("pnpapi", issuer, {
|
||||
considerBuiltins: false
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
if (
|
||||
error.code === "MODULE_NOT_FOUND" &&
|
||||
error.pnpCode === "UNDECLARED_DEPENDENCY"
|
||||
) {
|
||||
// This is not a PnP managed dependency.
|
||||
// Try to continue resolving with our alternatives
|
||||
if (resolveContext.log) {
|
||||
resolveContext.log(`request is not managed by the pnpapi`);
|
||||
for (const line of error.message.split("\n").filter(Boolean))
|
||||
resolveContext.log(` ${line}`);
|
||||
}
|
||||
return callback();
|
||||
}
|
||||
return callback(error);
|
||||
}
|
||||
|
||||
if (resolution === packageName) return callback();
|
||||
|
||||
if (apiResolution && resolveContext.fileDependencies) {
|
||||
resolveContext.fileDependencies.add(apiResolution);
|
||||
}
|
||||
|
||||
const obj = {
|
||||
...request,
|
||||
path: resolution,
|
||||
request: innerRequest,
|
||||
ignoreSymlinks: true,
|
||||
fullySpecified: request.fullySpecified && innerRequest !== "."
|
||||
};
|
||||
resolver.doResolve(
|
||||
target,
|
||||
obj,
|
||||
`resolved by pnp to ${resolution}`,
|
||||
resolveContext,
|
||||
(err, result) => {
|
||||
if (err) return callback(err);
|
||||
if (result) return callback(null, result);
|
||||
// Skip alternatives
|
||||
return callback(null, null);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
};
|
500
node_modules/enhanced-resolve/lib/Resolver.js
generated
vendored
Normal file
500
node_modules/enhanced-resolve/lib/Resolver.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
684
node_modules/enhanced-resolve/lib/ResolverFactory.js
generated
vendored
Normal file
684
node_modules/enhanced-resolve/lib/ResolverFactory.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
65
node_modules/enhanced-resolve/lib/RestrictionsPlugin.js
generated
vendored
Normal file
65
node_modules/enhanced-resolve/lib/RestrictionsPlugin.js
generated
vendored
Normal file
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Ivan Kopeykin @vankop
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
/** @typedef {import("./Resolver")} Resolver */
|
||||
/** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */
|
||||
|
||||
const slashCode = "/".charCodeAt(0);
|
||||
const backslashCode = "\\".charCodeAt(0);
|
||||
|
||||
const isInside = (path, parent) => {
|
||||
if (!path.startsWith(parent)) return false;
|
||||
if (path.length === parent.length) return true;
|
||||
const charCode = path.charCodeAt(parent.length);
|
||||
return charCode === slashCode || charCode === backslashCode;
|
||||
};
|
||||
|
||||
module.exports = class RestrictionsPlugin {
|
||||
/**
|
||||
* @param {string | ResolveStepHook} source source
|
||||
* @param {Set<string | RegExp>} restrictions restrictions
|
||||
*/
|
||||
constructor(source, restrictions) {
|
||||
this.source = source;
|
||||
this.restrictions = restrictions;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Resolver} resolver the resolver
|
||||
* @returns {void}
|
||||
*/
|
||||
apply(resolver) {
|
||||
resolver
|
||||
.getHook(this.source)
|
||||
.tapAsync("RestrictionsPlugin", (request, resolveContext, callback) => {
|
||||
if (typeof request.path === "string") {
|
||||
const path = request.path;
|
||||
for (const rule of this.restrictions) {
|
||||
if (typeof rule === "string") {
|
||||
if (!isInside(path, rule)) {
|
||||
if (resolveContext.log) {
|
||||
resolveContext.log(
|
||||
`${path} is not inside of the restriction ${rule}`
|
||||
);
|
||||
}
|
||||
return callback(null, null);
|
||||
}
|
||||
} else if (!rule.test(path)) {
|
||||
if (resolveContext.log) {
|
||||
resolveContext.log(
|
||||
`${path} doesn't match the restriction ${rule}`
|
||||
);
|
||||
}
|
||||
return callback(null, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
callback();
|
||||
});
|
||||
}
|
||||
};
|
42
node_modules/enhanced-resolve/lib/ResultPlugin.js
generated
vendored
Normal file
42
node_modules/enhanced-resolve/lib/ResultPlugin.js
generated
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
/** @typedef {import("./Resolver")} Resolver */
|
||||
/** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */
|
||||
|
||||
module.exports = class ResultPlugin {
|
||||
/**
|
||||
* @param {ResolveStepHook} source source
|
||||
*/
|
||||
constructor(source) {
|
||||
this.source = source;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Resolver} resolver the resolver
|
||||
* @returns {void}
|
||||
*/
|
||||
apply(resolver) {
|
||||
this.source.tapAsync(
|
||||
"ResultPlugin",
|
||||
(request, resolverContext, callback) => {
|
||||
const obj = { ...request };
|
||||
if (resolverContext.log)
|
||||
resolverContext.log("reporting result " + obj.path);
|
||||
resolver.hooks.result.callAsync(obj, resolverContext, err => {
|
||||
if (err) return callback(err);
|
||||
if (typeof resolverContext.yield === "function") {
|
||||
resolverContext.yield(obj);
|
||||
callback(null, null);
|
||||
} else {
|
||||
callback(null, obj);
|
||||
}
|
||||
});
|
||||
}
|
||||
);
|
||||
}
|
||||
};
|
62
node_modules/enhanced-resolve/lib/RootsPlugin.js
generated
vendored
Normal file
62
node_modules/enhanced-resolve/lib/RootsPlugin.js
generated
vendored
Normal file
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Ivan Kopeykin @vankop
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
const forEachBail = require("./forEachBail");
|
||||
|
||||
/** @typedef {import("./Resolver")} Resolver */
|
||||
/** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */
|
||||
|
||||
class RootsPlugin {
|
||||
/**
|
||||
* @param {string | ResolveStepHook} source source hook
|
||||
* @param {Set<string>} roots roots
|
||||
* @param {string | ResolveStepHook} target target hook
|
||||
*/
|
||||
constructor(source, roots, target) {
|
||||
this.roots = Array.from(roots);
|
||||
this.source = source;
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Resolver} resolver the resolver
|
||||
* @returns {void}
|
||||
*/
|
||||
apply(resolver) {
|
||||
const target = resolver.ensureHook(this.target);
|
||||
|
||||
resolver
|
||||
.getHook(this.source)
|
||||
.tapAsync("RootsPlugin", (request, resolveContext, callback) => {
|
||||
const req = request.request;
|
||||
if (!req) return callback();
|
||||
if (!req.startsWith("/")) return callback();
|
||||
|
||||
forEachBail(
|
||||
this.roots,
|
||||
(root, callback) => {
|
||||
const path = resolver.join(root, req.slice(1));
|
||||
const obj = {
|
||||
...request,
|
||||
path,
|
||||
relativePath: request.relativePath && path
|
||||
};
|
||||
resolver.doResolve(
|
||||
target,
|
||||
obj,
|
||||
`root path ${root}`,
|
||||
resolveContext,
|
||||
callback
|
||||
);
|
||||
},
|
||||
callback
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = RootsPlugin;
|
80
node_modules/enhanced-resolve/lib/SelfReferencePlugin.js
generated
vendored
Normal file
80
node_modules/enhanced-resolve/lib/SelfReferencePlugin.js
generated
vendored
Normal file
@@ -0,0 +1,80 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
const DescriptionFileUtils = require("./DescriptionFileUtils");
|
||||
|
||||
/** @typedef {import("./Resolver")} Resolver */
|
||||
/** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */
|
||||
|
||||
const slashCode = "/".charCodeAt(0);
|
||||
|
||||
module.exports = class SelfReferencePlugin {
|
||||
/**
|
||||
* @param {string | ResolveStepHook} source source
|
||||
* @param {string | string[]} fieldNamePath name path
|
||||
* @param {string | ResolveStepHook} target target
|
||||
*/
|
||||
constructor(source, fieldNamePath, target) {
|
||||
this.source = source;
|
||||
this.target = target;
|
||||
this.fieldName = fieldNamePath;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Resolver} resolver the resolver
|
||||
* @returns {void}
|
||||
*/
|
||||
apply(resolver) {
|
||||
const target = resolver.ensureHook(this.target);
|
||||
resolver
|
||||
.getHook(this.source)
|
||||
.tapAsync("SelfReferencePlugin", (request, resolveContext, callback) => {
|
||||
if (!request.descriptionFilePath) return callback();
|
||||
|
||||
const req = request.request;
|
||||
if (!req) return callback();
|
||||
|
||||
// Feature is only enabled when an exports field is present
|
||||
const exportsField = DescriptionFileUtils.getField(
|
||||
request.descriptionFileData,
|
||||
this.fieldName
|
||||
);
|
||||
if (!exportsField) return callback();
|
||||
|
||||
const name = DescriptionFileUtils.getField(
|
||||
request.descriptionFileData,
|
||||
"name"
|
||||
);
|
||||
if (typeof name !== "string") return callback();
|
||||
|
||||
if (
|
||||
req.startsWith(name) &&
|
||||
(req.length === name.length ||
|
||||
req.charCodeAt(name.length) === slashCode)
|
||||
) {
|
||||
const remainingRequest = `.${req.slice(name.length)}`;
|
||||
|
||||
const obj = {
|
||||
...request,
|
||||
request: remainingRequest,
|
||||
path: /** @type {string} */ (request.descriptionFileRoot),
|
||||
relativePath: "."
|
||||
};
|
||||
|
||||
resolver.doResolve(
|
||||
target,
|
||||
obj,
|
||||
"self reference",
|
||||
resolveContext,
|
||||
callback
|
||||
);
|
||||
} else {
|
||||
return callback();
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
88
node_modules/enhanced-resolve/lib/SymlinkPlugin.js
generated
vendored
Normal file
88
node_modules/enhanced-resolve/lib/SymlinkPlugin.js
generated
vendored
Normal file
@@ -0,0 +1,88 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
const forEachBail = require("./forEachBail");
|
||||
const getPaths = require("./getPaths");
|
||||
const { getType, PathType } = require("./util/path");
|
||||
|
||||
/** @typedef {import("./Resolver")} Resolver */
|
||||
/** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */
|
||||
|
||||
module.exports = class SymlinkPlugin {
|
||||
/**
|
||||
* @param {string | ResolveStepHook} source source
|
||||
* @param {string | ResolveStepHook} target target
|
||||
*/
|
||||
constructor(source, target) {
|
||||
this.source = source;
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Resolver} resolver the resolver
|
||||
* @returns {void}
|
||||
*/
|
||||
apply(resolver) {
|
||||
const target = resolver.ensureHook(this.target);
|
||||
const fs = resolver.fileSystem;
|
||||
resolver
|
||||
.getHook(this.source)
|
||||
.tapAsync("SymlinkPlugin", (request, resolveContext, callback) => {
|
||||
if (request.ignoreSymlinks) return callback();
|
||||
const pathsResult = getPaths(request.path);
|
||||
const pathSegments = pathsResult.segments;
|
||||
const paths = pathsResult.paths;
|
||||
|
||||
let containsSymlink = false;
|
||||
let idx = -1;
|
||||
forEachBail(
|
||||
paths,
|
||||
(path, callback) => {
|
||||
idx++;
|
||||
if (resolveContext.fileDependencies)
|
||||
resolveContext.fileDependencies.add(path);
|
||||
fs.readlink(path, (err, result) => {
|
||||
if (!err && result) {
|
||||
pathSegments[idx] = result;
|
||||
containsSymlink = true;
|
||||
// Shortcut when absolute symlink found
|
||||
const resultType = getType(result.toString());
|
||||
if (
|
||||
resultType === PathType.AbsoluteWin ||
|
||||
resultType === PathType.AbsolutePosix
|
||||
) {
|
||||
return callback(null, idx);
|
||||
}
|
||||
}
|
||||
callback();
|
||||
});
|
||||
},
|
||||
(err, idx) => {
|
||||
if (!containsSymlink) return callback();
|
||||
const resultSegments =
|
||||
typeof idx === "number"
|
||||
? pathSegments.slice(0, idx + 1)
|
||||
: pathSegments.slice();
|
||||
const result = resultSegments.reduceRight((a, b) => {
|
||||
return resolver.join(a, b);
|
||||
});
|
||||
const obj = {
|
||||
...request,
|
||||
path: result
|
||||
};
|
||||
resolver.doResolve(
|
||||
target,
|
||||
obj,
|
||||
"resolved symlink to " + result,
|
||||
resolveContext,
|
||||
callback
|
||||
);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
};
|
95
node_modules/enhanced-resolve/lib/SyncAsyncFileSystemDecorator.js
generated
vendored
Normal file
95
node_modules/enhanced-resolve/lib/SyncAsyncFileSystemDecorator.js
generated
vendored
Normal file
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
/** @typedef {import("./Resolver").FileSystem} FileSystem */
|
||||
/** @typedef {import("./Resolver").SyncFileSystem} SyncFileSystem */
|
||||
|
||||
/**
|
||||
* @param {SyncFileSystem} fs file system implementation
|
||||
* @constructor
|
||||
*/
|
||||
function SyncAsyncFileSystemDecorator(fs) {
|
||||
this.fs = fs;
|
||||
|
||||
this.lstat = undefined;
|
||||
this.lstatSync = undefined;
|
||||
const lstatSync = fs.lstatSync;
|
||||
if (lstatSync) {
|
||||
this.lstat = (arg, options, callback) => {
|
||||
let result;
|
||||
try {
|
||||
result = lstatSync.call(fs, arg);
|
||||
} catch (e) {
|
||||
return (callback || options)(e);
|
||||
}
|
||||
(callback || options)(null, result);
|
||||
};
|
||||
this.lstatSync = (arg, options) => lstatSync.call(fs, arg, options);
|
||||
}
|
||||
|
||||
this.stat = (arg, options, callback) => {
|
||||
let result;
|
||||
try {
|
||||
result = callback ? fs.statSync(arg, options) : fs.statSync(arg);
|
||||
} catch (e) {
|
||||
return (callback || options)(e);
|
||||
}
|
||||
(callback || options)(null, result);
|
||||
};
|
||||
this.statSync = (arg, options) => fs.statSync(arg, options);
|
||||
|
||||
this.readdir = (arg, options, callback) => {
|
||||
let result;
|
||||
try {
|
||||
result = fs.readdirSync(arg);
|
||||
} catch (e) {
|
||||
return (callback || options)(e);
|
||||
}
|
||||
(callback || options)(null, result);
|
||||
};
|
||||
this.readdirSync = (arg, options) => fs.readdirSync(arg, options);
|
||||
|
||||
this.readFile = (arg, options, callback) => {
|
||||
let result;
|
||||
try {
|
||||
result = fs.readFileSync(arg);
|
||||
} catch (e) {
|
||||
return (callback || options)(e);
|
||||
}
|
||||
(callback || options)(null, result);
|
||||
};
|
||||
this.readFileSync = (arg, options) => fs.readFileSync(arg, options);
|
||||
|
||||
this.readlink = (arg, options, callback) => {
|
||||
let result;
|
||||
try {
|
||||
result = fs.readlinkSync(arg);
|
||||
} catch (e) {
|
||||
return (callback || options)(e);
|
||||
}
|
||||
(callback || options)(null, result);
|
||||
};
|
||||
this.readlinkSync = (arg, options) => fs.readlinkSync(arg, options);
|
||||
|
||||
this.readJson = undefined;
|
||||
this.readJsonSync = undefined;
|
||||
const readJsonSync = fs.readJsonSync;
|
||||
if (readJsonSync) {
|
||||
this.readJson = (arg, options, callback) => {
|
||||
let result;
|
||||
try {
|
||||
result = readJsonSync.call(fs, arg);
|
||||
} catch (e) {
|
||||
return (callback || options)(e);
|
||||
}
|
||||
(callback || options)(null, result);
|
||||
};
|
||||
|
||||
this.readJsonSync = (arg, options) => readJsonSync.call(fs, arg, options);
|
||||
}
|
||||
}
|
||||
module.exports = SyncAsyncFileSystemDecorator;
|
41
node_modules/enhanced-resolve/lib/TryNextPlugin.js
generated
vendored
Normal file
41
node_modules/enhanced-resolve/lib/TryNextPlugin.js
generated
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
/** @typedef {import("./Resolver")} Resolver */
|
||||
/** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */
|
||||
|
||||
module.exports = class TryNextPlugin {
|
||||
/**
|
||||
* @param {string | ResolveStepHook} source source
|
||||
* @param {string} message message
|
||||
* @param {string | ResolveStepHook} target target
|
||||
*/
|
||||
constructor(source, message, target) {
|
||||
this.source = source;
|
||||
this.message = message;
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Resolver} resolver the resolver
|
||||
* @returns {void}
|
||||
*/
|
||||
apply(resolver) {
|
||||
const target = resolver.ensureHook(this.target);
|
||||
resolver
|
||||
.getHook(this.source)
|
||||
.tapAsync("TryNextPlugin", (request, resolveContext, callback) => {
|
||||
resolver.doResolve(
|
||||
target,
|
||||
request,
|
||||
this.message,
|
||||
resolveContext,
|
||||
callback
|
||||
);
|
||||
});
|
||||
}
|
||||
};
|
99
node_modules/enhanced-resolve/lib/UnsafeCachePlugin.js
generated
vendored
Normal file
99
node_modules/enhanced-resolve/lib/UnsafeCachePlugin.js
generated
vendored
Normal file
@@ -0,0 +1,99 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
/** @typedef {import("./Resolver")} Resolver */
|
||||
/** @typedef {import("./Resolver").ResolveRequest} ResolveRequest */
|
||||
/** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */
|
||||
/** @typedef {{[k: string]: any}} Cache */
|
||||
|
||||
function getCacheId(type, request, withContext) {
|
||||
return JSON.stringify({
|
||||
type,
|
||||
context: withContext ? request.context : "",
|
||||
path: request.path,
|
||||
query: request.query,
|
||||
fragment: request.fragment,
|
||||
request: request.request
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = class UnsafeCachePlugin {
|
||||
/**
|
||||
* @param {string | ResolveStepHook} source source
|
||||
* @param {function(ResolveRequest): boolean} filterPredicate filterPredicate
|
||||
* @param {Cache} cache cache
|
||||
* @param {boolean} withContext withContext
|
||||
* @param {string | ResolveStepHook} target target
|
||||
*/
|
||||
constructor(source, filterPredicate, cache, withContext, target) {
|
||||
this.source = source;
|
||||
this.filterPredicate = filterPredicate;
|
||||
this.withContext = withContext;
|
||||
this.cache = cache;
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Resolver} resolver the resolver
|
||||
* @returns {void}
|
||||
*/
|
||||
apply(resolver) {
|
||||
const target = resolver.ensureHook(this.target);
|
||||
resolver
|
||||
.getHook(this.source)
|
||||
.tapAsync("UnsafeCachePlugin", (request, resolveContext, callback) => {
|
||||
if (!this.filterPredicate(request)) return callback();
|
||||
const isYield = typeof resolveContext.yield === "function";
|
||||
const cacheId = getCacheId(
|
||||
isYield ? "yield" : "default",
|
||||
request,
|
||||
this.withContext
|
||||
);
|
||||
const cacheEntry = this.cache[cacheId];
|
||||
if (cacheEntry) {
|
||||
if (isYield) {
|
||||
const yield_ = /** @type {Function} */ (resolveContext.yield);
|
||||
if (Array.isArray(cacheEntry)) {
|
||||
for (const result of cacheEntry) yield_(result);
|
||||
} else {
|
||||
yield_(cacheEntry);
|
||||
}
|
||||
return callback(null, null);
|
||||
}
|
||||
return callback(null, cacheEntry);
|
||||
}
|
||||
|
||||
let yieldFn;
|
||||
let yield_;
|
||||
const yieldResult = [];
|
||||
if (isYield) {
|
||||
yieldFn = resolveContext.yield;
|
||||
yield_ = result => {
|
||||
yieldResult.push(result);
|
||||
};
|
||||
}
|
||||
|
||||
resolver.doResolve(
|
||||
target,
|
||||
request,
|
||||
null,
|
||||
yield_ ? { ...resolveContext, yield: yield_ } : resolveContext,
|
||||
(err, result) => {
|
||||
if (err) return callback(err);
|
||||
if (isYield) {
|
||||
if (result) yieldResult.push(result);
|
||||
for (const result of yieldResult) yieldFn(result);
|
||||
this.cache[cacheId] = yieldResult;
|
||||
return callback(null, null);
|
||||
}
|
||||
if (result) return callback(null, (this.cache[cacheId] = result));
|
||||
callback();
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
};
|
49
node_modules/enhanced-resolve/lib/UseFilePlugin.js
generated
vendored
Normal file
49
node_modules/enhanced-resolve/lib/UseFilePlugin.js
generated
vendored
Normal file
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
/** @typedef {import("./Resolver")} Resolver */
|
||||
/** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */
|
||||
|
||||
module.exports = class UseFilePlugin {
|
||||
/**
|
||||
* @param {string | ResolveStepHook} source source
|
||||
* @param {string} filename filename
|
||||
* @param {string | ResolveStepHook} target target
|
||||
*/
|
||||
constructor(source, filename, target) {
|
||||
this.source = source;
|
||||
this.filename = filename;
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Resolver} resolver the resolver
|
||||
* @returns {void}
|
||||
*/
|
||||
apply(resolver) {
|
||||
const target = resolver.ensureHook(this.target);
|
||||
resolver
|
||||
.getHook(this.source)
|
||||
.tapAsync("UseFilePlugin", (request, resolveContext, callback) => {
|
||||
const filePath = resolver.join(request.path, this.filename);
|
||||
const obj = {
|
||||
...request,
|
||||
path: filePath,
|
||||
relativePath:
|
||||
request.relativePath &&
|
||||
resolver.join(request.relativePath, this.filename)
|
||||
};
|
||||
resolver.doResolve(
|
||||
target,
|
||||
obj,
|
||||
"using path: " + filePath,
|
||||
resolveContext,
|
||||
callback
|
||||
);
|
||||
});
|
||||
}
|
||||
};
|
37
node_modules/enhanced-resolve/lib/createInnerContext.js
generated
vendored
Normal file
37
node_modules/enhanced-resolve/lib/createInnerContext.js
generated
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
module.exports = function createInnerContext(
|
||||
options,
|
||||
message,
|
||||
messageOptional
|
||||
) {
|
||||
let messageReported = false;
|
||||
let innerLog = undefined;
|
||||
if (options.log) {
|
||||
if (message) {
|
||||
innerLog = msg => {
|
||||
if (!messageReported) {
|
||||
options.log(message);
|
||||
messageReported = true;
|
||||
}
|
||||
options.log(" " + msg);
|
||||
};
|
||||
} else {
|
||||
innerLog = options.log;
|
||||
}
|
||||
}
|
||||
const childContext = {
|
||||
log: innerLog,
|
||||
yield: options.yield,
|
||||
fileDependencies: options.fileDependencies,
|
||||
contextDependencies: options.contextDependencies,
|
||||
missingDependencies: options.missingDependencies,
|
||||
stack: options.stack
|
||||
};
|
||||
return childContext;
|
||||
};
|
25
node_modules/enhanced-resolve/lib/forEachBail.js
generated
vendored
Normal file
25
node_modules/enhanced-resolve/lib/forEachBail.js
generated
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
module.exports = function forEachBail(array, iterator, callback) {
|
||||
if (array.length === 0) return callback();
|
||||
|
||||
let i = 0;
|
||||
const next = () => {
|
||||
let loop = undefined;
|
||||
iterator(array[i++], (err, result) => {
|
||||
if (err || result !== undefined || i >= array.length) {
|
||||
return callback(err, result);
|
||||
}
|
||||
if (loop === false) while (next());
|
||||
loop = true;
|
||||
});
|
||||
if (!loop) loop = false;
|
||||
return loop;
|
||||
};
|
||||
while (next());
|
||||
};
|
27
node_modules/enhanced-resolve/lib/getInnerRequest.js
generated
vendored
Normal file
27
node_modules/enhanced-resolve/lib/getInnerRequest.js
generated
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
module.exports = function getInnerRequest(resolver, request) {
|
||||
if (
|
||||
typeof request.__innerRequest === "string" &&
|
||||
request.__innerRequest_request === request.request &&
|
||||
request.__innerRequest_relativePath === request.relativePath
|
||||
)
|
||||
return request.__innerRequest;
|
||||
let innerRequest;
|
||||
if (request.request) {
|
||||
innerRequest = request.request;
|
||||
if (/^\.\.?(?:\/|$)/.test(innerRequest) && request.relativePath) {
|
||||
innerRequest = resolver.join(request.relativePath, innerRequest);
|
||||
}
|
||||
} else {
|
||||
innerRequest = request.relativePath;
|
||||
}
|
||||
request.__innerRequest_request = request.request;
|
||||
request.__innerRequest_relativePath = request.relativePath;
|
||||
return (request.__innerRequest = innerRequest);
|
||||
};
|
37
node_modules/enhanced-resolve/lib/getPaths.js
generated
vendored
Normal file
37
node_modules/enhanced-resolve/lib/getPaths.js
generated
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
module.exports = function getPaths(path) {
|
||||
if (path === "/") return { paths: ["/"], segments: [""] };
|
||||
const parts = path.split(/(.*?[\\/]+)/);
|
||||
const paths = [path];
|
||||
const segments = [parts[parts.length - 1]];
|
||||
let part = parts[parts.length - 1];
|
||||
path = path.substr(0, path.length - part.length - 1);
|
||||
for (let i = parts.length - 2; i > 2; i -= 2) {
|
||||
paths.push(path);
|
||||
part = parts[i];
|
||||
path = path.substr(0, path.length - part.length) || "/";
|
||||
segments.push(part.substr(0, part.length - 1));
|
||||
}
|
||||
part = parts[1];
|
||||
segments.push(part);
|
||||
paths.push(part);
|
||||
return {
|
||||
paths: paths,
|
||||
segments: segments
|
||||
};
|
||||
};
|
||||
|
||||
module.exports.basename = function basename(path) {
|
||||
const i = path.lastIndexOf("/"),
|
||||
j = path.lastIndexOf("\\");
|
||||
const p = i < 0 ? j : j < 0 ? i : i < j ? j : i;
|
||||
if (p < 0) return null;
|
||||
const s = path.substr(p + 1);
|
||||
return s;
|
||||
};
|
131
node_modules/enhanced-resolve/lib/index.js
generated
vendored
Normal file
131
node_modules/enhanced-resolve/lib/index.js
generated
vendored
Normal file
@@ -0,0 +1,131 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
const fs = require("graceful-fs");
|
||||
const CachedInputFileSystem = require("./CachedInputFileSystem");
|
||||
const ResolverFactory = require("./ResolverFactory");
|
||||
|
||||
/** @typedef {import("./PnpPlugin").PnpApiImpl} PnpApi */
|
||||
/** @typedef {import("./Resolver")} Resolver */
|
||||
/** @typedef {import("./Resolver").FileSystem} FileSystem */
|
||||
/** @typedef {import("./Resolver").ResolveContext} ResolveContext */
|
||||
/** @typedef {import("./Resolver").ResolveRequest} ResolveRequest */
|
||||
/** @typedef {import("./ResolverFactory").Plugin} Plugin */
|
||||
/** @typedef {import("./ResolverFactory").UserResolveOptions} ResolveOptions */
|
||||
|
||||
const nodeFileSystem = new CachedInputFileSystem(fs, 4000);
|
||||
|
||||
const nodeContext = {
|
||||
environments: ["node+es3+es5+process+native"]
|
||||
};
|
||||
|
||||
const asyncResolver = ResolverFactory.createResolver({
|
||||
conditionNames: ["node"],
|
||||
extensions: [".js", ".json", ".node"],
|
||||
fileSystem: nodeFileSystem
|
||||
});
|
||||
function resolve(context, path, request, resolveContext, callback) {
|
||||
if (typeof context === "string") {
|
||||
callback = resolveContext;
|
||||
resolveContext = request;
|
||||
request = path;
|
||||
path = context;
|
||||
context = nodeContext;
|
||||
}
|
||||
if (typeof callback !== "function") {
|
||||
callback = resolveContext;
|
||||
}
|
||||
asyncResolver.resolve(context, path, request, resolveContext, callback);
|
||||
}
|
||||
|
||||
const syncResolver = ResolverFactory.createResolver({
|
||||
conditionNames: ["node"],
|
||||
extensions: [".js", ".json", ".node"],
|
||||
useSyncFileSystemCalls: true,
|
||||
fileSystem: nodeFileSystem
|
||||
});
|
||||
function resolveSync(context, path, request) {
|
||||
if (typeof context === "string") {
|
||||
request = path;
|
||||
path = context;
|
||||
context = nodeContext;
|
||||
}
|
||||
return syncResolver.resolveSync(context, path, request);
|
||||
}
|
||||
|
||||
function create(options) {
|
||||
options = {
|
||||
fileSystem: nodeFileSystem,
|
||||
...options
|
||||
};
|
||||
const resolver = ResolverFactory.createResolver(options);
|
||||
return function (context, path, request, resolveContext, callback) {
|
||||
if (typeof context === "string") {
|
||||
callback = resolveContext;
|
||||
resolveContext = request;
|
||||
request = path;
|
||||
path = context;
|
||||
context = nodeContext;
|
||||
}
|
||||
if (typeof callback !== "function") {
|
||||
callback = resolveContext;
|
||||
}
|
||||
resolver.resolve(context, path, request, resolveContext, callback);
|
||||
};
|
||||
}
|
||||
|
||||
function createSync(options) {
|
||||
options = {
|
||||
useSyncFileSystemCalls: true,
|
||||
fileSystem: nodeFileSystem,
|
||||
...options
|
||||
};
|
||||
const resolver = ResolverFactory.createResolver(options);
|
||||
return function (context, path, request) {
|
||||
if (typeof context === "string") {
|
||||
request = path;
|
||||
path = context;
|
||||
context = nodeContext;
|
||||
}
|
||||
return resolver.resolveSync(context, path, request);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @template A
|
||||
* @template B
|
||||
* @param {A} obj input a
|
||||
* @param {B} exports input b
|
||||
* @returns {A & B} merged
|
||||
*/
|
||||
const mergeExports = (obj, exports) => {
|
||||
const descriptors = Object.getOwnPropertyDescriptors(exports);
|
||||
Object.defineProperties(obj, descriptors);
|
||||
return /** @type {A & B} */ (Object.freeze(obj));
|
||||
};
|
||||
|
||||
module.exports = mergeExports(resolve, {
|
||||
get sync() {
|
||||
return resolveSync;
|
||||
},
|
||||
create: mergeExports(create, {
|
||||
get sync() {
|
||||
return createSync;
|
||||
}
|
||||
}),
|
||||
ResolverFactory,
|
||||
CachedInputFileSystem,
|
||||
get CloneBasenamePlugin() {
|
||||
return require("./CloneBasenamePlugin");
|
||||
},
|
||||
get LogInfoPlugin() {
|
||||
return require("./LogInfoPlugin");
|
||||
},
|
||||
get forEachBail() {
|
||||
return require("./forEachBail");
|
||||
}
|
||||
});
|
667
node_modules/enhanced-resolve/lib/util/entrypoints.js
generated
vendored
Normal file
667
node_modules/enhanced-resolve/lib/util/entrypoints.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
26
node_modules/enhanced-resolve/lib/util/identifier.js
generated
vendored
Normal file
26
node_modules/enhanced-resolve/lib/util/identifier.js
generated
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Ivan Kopeykin @vankop
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
const PATH_QUERY_FRAGMENT_REGEXP = /^(#?(?:\0.|[^?#\0])*)(\?(?:\0.|[^#\0])*)?(#.*)?$/;
|
||||
|
||||
/**
|
||||
* @param {string} identifier identifier
|
||||
* @returns {[string, string, string]|null} parsed identifier
|
||||
*/
|
||||
function parseIdentifier(identifier) {
|
||||
const match = PATH_QUERY_FRAGMENT_REGEXP.exec(identifier);
|
||||
|
||||
if (!match) return null;
|
||||
|
||||
return [
|
||||
match[1].replace(/\0(.)/g, "$1"),
|
||||
match[2] ? match[2].replace(/\0(.)/g, "$1") : "",
|
||||
match[3] || ""
|
||||
];
|
||||
}
|
||||
|
||||
module.exports.parseIdentifier = parseIdentifier;
|
223
node_modules/enhanced-resolve/lib/util/path.js
generated
vendored
Normal file
223
node_modules/enhanced-resolve/lib/util/path.js
generated
vendored
Normal file
@@ -0,0 +1,223 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
const path = require("path");
|
||||
|
||||
const CHAR_HASH = "#".charCodeAt(0);
|
||||
const CHAR_SLASH = "/".charCodeAt(0);
|
||||
const CHAR_BACKSLASH = "\\".charCodeAt(0);
|
||||
const CHAR_A = "A".charCodeAt(0);
|
||||
const CHAR_Z = "Z".charCodeAt(0);
|
||||
const CHAR_LOWER_A = "a".charCodeAt(0);
|
||||
const CHAR_LOWER_Z = "z".charCodeAt(0);
|
||||
const CHAR_DOT = ".".charCodeAt(0);
|
||||
const CHAR_COLON = ":".charCodeAt(0);
|
||||
|
||||
const posixNormalize = path.posix.normalize;
|
||||
const winNormalize = path.win32.normalize;
|
||||
|
||||
/**
|
||||
* @enum {number}
|
||||
*/
|
||||
const PathType = Object.freeze({
|
||||
Empty: 0,
|
||||
Normal: 1,
|
||||
Relative: 2,
|
||||
AbsoluteWin: 3,
|
||||
AbsolutePosix: 4,
|
||||
Internal: 5
|
||||
});
|
||||
exports.PathType = PathType;
|
||||
|
||||
/**
|
||||
* @param {string} p a path
|
||||
* @returns {PathType} type of path
|
||||
*/
|
||||
const getType = p => {
|
||||
switch (p.length) {
|
||||
case 0:
|
||||
return PathType.Empty;
|
||||
case 1: {
|
||||
const c0 = p.charCodeAt(0);
|
||||
switch (c0) {
|
||||
case CHAR_DOT:
|
||||
return PathType.Relative;
|
||||
case CHAR_SLASH:
|
||||
return PathType.AbsolutePosix;
|
||||
case CHAR_HASH:
|
||||
return PathType.Internal;
|
||||
}
|
||||
return PathType.Normal;
|
||||
}
|
||||
case 2: {
|
||||
const c0 = p.charCodeAt(0);
|
||||
switch (c0) {
|
||||
case CHAR_DOT: {
|
||||
const c1 = p.charCodeAt(1);
|
||||
switch (c1) {
|
||||
case CHAR_DOT:
|
||||
case CHAR_SLASH:
|
||||
return PathType.Relative;
|
||||
}
|
||||
return PathType.Normal;
|
||||
}
|
||||
case CHAR_SLASH:
|
||||
return PathType.AbsolutePosix;
|
||||
case CHAR_HASH:
|
||||
return PathType.Internal;
|
||||
}
|
||||
const c1 = p.charCodeAt(1);
|
||||
if (c1 === CHAR_COLON) {
|
||||
if (
|
||||
(c0 >= CHAR_A && c0 <= CHAR_Z) ||
|
||||
(c0 >= CHAR_LOWER_A && c0 <= CHAR_LOWER_Z)
|
||||
) {
|
||||
return PathType.AbsoluteWin;
|
||||
}
|
||||
}
|
||||
return PathType.Normal;
|
||||
}
|
||||
}
|
||||
const c0 = p.charCodeAt(0);
|
||||
switch (c0) {
|
||||
case CHAR_DOT: {
|
||||
const c1 = p.charCodeAt(1);
|
||||
switch (c1) {
|
||||
case CHAR_SLASH:
|
||||
return PathType.Relative;
|
||||
case CHAR_DOT: {
|
||||
const c2 = p.charCodeAt(2);
|
||||
if (c2 === CHAR_SLASH) return PathType.Relative;
|
||||
return PathType.Normal;
|
||||
}
|
||||
}
|
||||
return PathType.Normal;
|
||||
}
|
||||
case CHAR_SLASH:
|
||||
return PathType.AbsolutePosix;
|
||||
case CHAR_HASH:
|
||||
return PathType.Internal;
|
||||
}
|
||||
const c1 = p.charCodeAt(1);
|
||||
if (c1 === CHAR_COLON) {
|
||||
const c2 = p.charCodeAt(2);
|
||||
if (
|
||||
(c2 === CHAR_BACKSLASH || c2 === CHAR_SLASH) &&
|
||||
((c0 >= CHAR_A && c0 <= CHAR_Z) ||
|
||||
(c0 >= CHAR_LOWER_A && c0 <= CHAR_LOWER_Z))
|
||||
) {
|
||||
return PathType.AbsoluteWin;
|
||||
}
|
||||
}
|
||||
return PathType.Normal;
|
||||
};
|
||||
exports.getType = getType;
|
||||
|
||||
/**
|
||||
* @param {string} p a path
|
||||
* @returns {string} the normalized path
|
||||
*/
|
||||
const normalize = p => {
|
||||
switch (getType(p)) {
|
||||
case PathType.Empty:
|
||||
return p;
|
||||
case PathType.AbsoluteWin:
|
||||
return winNormalize(p);
|
||||
case PathType.Relative: {
|
||||
const r = posixNormalize(p);
|
||||
return getType(r) === PathType.Relative ? r : `./${r}`;
|
||||
}
|
||||
}
|
||||
return posixNormalize(p);
|
||||
};
|
||||
exports.normalize = normalize;
|
||||
|
||||
/**
|
||||
* @param {string} rootPath the root path
|
||||
* @param {string | undefined} request the request path
|
||||
* @returns {string} the joined path
|
||||
*/
|
||||
const join = (rootPath, request) => {
|
||||
if (!request) return normalize(rootPath);
|
||||
const requestType = getType(request);
|
||||
switch (requestType) {
|
||||
case PathType.AbsolutePosix:
|
||||
return posixNormalize(request);
|
||||
case PathType.AbsoluteWin:
|
||||
return winNormalize(request);
|
||||
}
|
||||
switch (getType(rootPath)) {
|
||||
case PathType.Normal:
|
||||
case PathType.Relative:
|
||||
case PathType.AbsolutePosix:
|
||||
return posixNormalize(`${rootPath}/${request}`);
|
||||
case PathType.AbsoluteWin:
|
||||
return winNormalize(`${rootPath}\\${request}`);
|
||||
}
|
||||
switch (requestType) {
|
||||
case PathType.Empty:
|
||||
return rootPath;
|
||||
case PathType.Relative: {
|
||||
const r = posixNormalize(rootPath);
|
||||
return getType(r) === PathType.Relative ? r : `./${r}`;
|
||||
}
|
||||
}
|
||||
return posixNormalize(rootPath);
|
||||
};
|
||||
exports.join = join;
|
||||
|
||||
const joinCache = new Map();
|
||||
|
||||
/**
|
||||
* @param {string} rootPath the root path
|
||||
* @param {string | undefined} request the request path
|
||||
* @returns {string} the joined path
|
||||
*/
|
||||
const cachedJoin = (rootPath, request) => {
|
||||
let cacheEntry;
|
||||
let cache = joinCache.get(rootPath);
|
||||
if (cache === undefined) {
|
||||
joinCache.set(rootPath, (cache = new Map()));
|
||||
} else {
|
||||
cacheEntry = cache.get(request);
|
||||
if (cacheEntry !== undefined) return cacheEntry;
|
||||
}
|
||||
cacheEntry = join(rootPath, request);
|
||||
cache.set(request, cacheEntry);
|
||||
return cacheEntry;
|
||||
};
|
||||
exports.cachedJoin = cachedJoin;
|
||||
|
||||
const checkImportsExportsFieldTarget = relativePath => {
|
||||
let lastNonSlashIndex = 0;
|
||||
let slashIndex = relativePath.indexOf("/", 1);
|
||||
let cd = 0;
|
||||
|
||||
while (slashIndex !== -1) {
|
||||
const folder = relativePath.slice(lastNonSlashIndex, slashIndex);
|
||||
|
||||
switch (folder) {
|
||||
case "..": {
|
||||
cd--;
|
||||
if (cd < 0)
|
||||
return new Error(
|
||||
`Trying to access out of package scope. Requesting ${relativePath}`
|
||||
);
|
||||
break;
|
||||
}
|
||||
case ".":
|
||||
break;
|
||||
default:
|
||||
cd++;
|
||||
break;
|
||||
}
|
||||
|
||||
lastNonSlashIndex = slashIndex + 1;
|
||||
slashIndex = relativePath.indexOf("/", lastNonSlashIndex);
|
||||
}
|
||||
};
|
||||
exports.checkImportsExportsFieldTarget = checkImportsExportsFieldTarget;
|
16
node_modules/enhanced-resolve/lib/util/process-browser.js
generated
vendored
Normal file
16
node_modules/enhanced-resolve/lib/util/process-browser.js
generated
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
module.exports = {
|
||||
versions: {},
|
||||
nextTick(fn) {
|
||||
const args = Array.prototype.slice.call(arguments, 1);
|
||||
Promise.resolve().then(function () {
|
||||
fn.apply(null, args);
|
||||
});
|
||||
}
|
||||
};
|
70
node_modules/enhanced-resolve/package.json
generated
vendored
Normal file
70
node_modules/enhanced-resolve/package.json
generated
vendored
Normal file
@@ -0,0 +1,70 @@
|
||||
{
|
||||
"name": "enhanced-resolve",
|
||||
"version": "5.10.0",
|
||||
"author": "Tobias Koppers @sokra",
|
||||
"description": "Offers a async require.resolve function. It's highly configurable.",
|
||||
"files": [
|
||||
"lib",
|
||||
"types.d.ts",
|
||||
"LICENSE"
|
||||
],
|
||||
"browser": {
|
||||
"pnpapi": false,
|
||||
"process": "./lib/util/process-browser.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"graceful-fs": "^4.2.4",
|
||||
"tapable": "^2.2.0"
|
||||
},
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"@types/mocha": "^8.0.3",
|
||||
"@types/node": "^14.11.1",
|
||||
"cspell": "4.2.8",
|
||||
"eslint": "^7.9.0",
|
||||
"eslint-config-prettier": "^6.11.0",
|
||||
"eslint-plugin-jsdoc": "^30.5.1",
|
||||
"eslint-plugin-node": "^11.1.0",
|
||||
"eslint-plugin-prettier": "^3.1.4",
|
||||
"husky": "^6.0.0",
|
||||
"lint-staged": "^10.4.0",
|
||||
"memfs": "^3.2.0",
|
||||
"mocha": "^8.1.3",
|
||||
"nyc": "^15.1.0",
|
||||
"prettier": "^2.1.2",
|
||||
"should": "^13.2.3",
|
||||
"tooling": "webpack/tooling#v1.14.0",
|
||||
"typescript": "^4.2.0-beta"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10.13.0"
|
||||
},
|
||||
"main": "lib/index.js",
|
||||
"types": "types.d.ts",
|
||||
"homepage": "http://github.com/webpack/enhanced-resolve",
|
||||
"scripts": {
|
||||
"lint": "yarn run code-lint && yarn run type-lint && yarn run special-lint && yarn run spelling",
|
||||
"fix": "yarn run code-lint-fix && yarn run special-lint-fix",
|
||||
"code-lint": "eslint --cache lib test",
|
||||
"code-lint-fix": "eslint --cache lib test --fix",
|
||||
"type-lint": "tsc",
|
||||
"special-lint": "node node_modules/tooling/lockfile-lint && node node_modules/tooling/inherit-types && node node_modules/tooling/format-file-header && node node_modules/tooling/generate-types",
|
||||
"special-lint-fix": "node node_modules/tooling/inherit-types --write && node node_modules/tooling/format-file-header --write && node node_modules/tooling/generate-types --write",
|
||||
"pretty": "prettier --loglevel warn --write \"lib/**/*.{js,json}\" \"test/*.js\"",
|
||||
"pretest": "yarn lint",
|
||||
"spelling": "cspell \"**/*.*\"",
|
||||
"test": "mocha --full-trace --check-leaks",
|
||||
"test:only": "mocha --full-trace --check-leaks",
|
||||
"precover": "yarn lint",
|
||||
"cover": "nyc --reporter=html node node_modules/mocha/bin/_mocha --full-trace --check-leaks",
|
||||
"cover:ci": "nyc --reporter=lcovonly node node_modules/mocha/bin/_mocha --full-trace --check-leaks",
|
||||
"prepare": "husky install"
|
||||
},
|
||||
"lint-staged": {
|
||||
"*.js": "eslint --cache"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/webpack/enhanced-resolve.git"
|
||||
}
|
||||
}
|
519
node_modules/enhanced-resolve/types.d.ts
generated
vendored
Normal file
519
node_modules/enhanced-resolve/types.d.ts
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user