8889841cPK>[8$ (=(= README.mdnuW+A
[![npm][npm]][npm-url] [![node][node]][node-url] [![deps][deps]][deps-url] [![tests][tests]][tests-url] [![coverage][cover]][cover-url] [![chat][chat]][chat-url] [![size][size]][size-url] # file-loader The `file-loader` resolves `import`/`require()` on a file into a url and emits the file into the output directory. ## Getting Started To begin, you'll need to install `file-loader`: ```console $ npm install file-loader --save-dev ``` Import (or `require`) the target file(s) in one of the bundle's files: **file.js** ```js import img from './file.png'; ``` Then add the loader to your `webpack` config. For example: **webpack.config.js** ```js module.exports = { module: { rules: [ { test: /\.(png|jpe?g|gif)$/i, use: [ { loader: 'file-loader', }, ], }, ], }, }; ``` And run `webpack` via your preferred method. This will emit `file.png` as a file in the output directory (with the specified naming convention, if options are specified to do so) and returns the public URI of the file. > ℹ️ By default the filename of the resulting file is the hash of the file's contents with the original extension of the required resource. ## Options ### `name` Type: `String|Function` Default: `'[contenthash].[ext]'` Specifies a custom filename template for the target file(s) using the query parameter `name`. For example, to emit a file from your `context` directory into the output directory retaining the full directory structure, you might use: #### `String` **webpack.config.js** ```js module.exports = { module: { rules: [ { test: /\.(png|jpe?g|gif)$/i, loader: 'file-loader', options: { name: '[path][name].[ext]', }, }, ], }, }; ``` #### `Function` **webpack.config.js** ```js module.exports = { module: { rules: [ { test: /\.(png|jpe?g|gif)$/i, loader: 'file-loader', options: { name(resourcePath, resourceQuery) { // `resourcePath` - `/absolute/path/to/file.js` // `resourceQuery` - `?foo=bar` if (process.env.NODE_ENV === 'development') { return '[path][name].[ext]'; } return '[contenthash].[ext]'; }, }, }, ], }, }; ``` > ℹ️ By default the path and name you specify will output the file in that same directory, and will also use the same URI path to access the file. ### `outputPath` Type: `String|Function` Default: `undefined` Specify a filesystem path where the target file(s) will be placed. #### `String` **webpack.config.js** ```js module.exports = { module: { rules: [ { test: /\.(png|jpe?g|gif)$/i, loader: 'file-loader', options: { outputPath: 'images', }, }, ], }, }; ``` #### `Function` **webpack.config.js** ```js module.exports = { module: { rules: [ { test: /\.(png|jpe?g|gif)$/i, loader: 'file-loader', options: { outputPath: (url, resourcePath, context) => { // `resourcePath` is original absolute path to asset // `context` is directory where stored asset (`rootContext`) or `context` option // To get relative path you can use // const relativePath = path.relative(context, resourcePath); if (/my-custom-image\.png/.test(resourcePath)) { return `other_output_path/${url}`; } if (/images/.test(context)) { return `image_output_path/${url}`; } return `output_path/${url}`; }, }, }, ], }, }; ``` ### `publicPath` Type: `String|Function` Default: [`__webpack_public_path__`](https://webpack.js.org/api/module-variables/#__webpack_public_path__-webpack-specific-)+outputPath Specifies a custom public path for the target file(s). #### `String` **webpack.config.js** ```js module.exports = { module: { rules: [ { test: /\.(png|jpe?g|gif)$/i, loader: 'file-loader', options: { publicPath: 'assets', }, }, ], }, }; ``` #### `Function` **webpack.config.js** ```js module.exports = { module: { rules: [ { test: /\.(png|jpe?g|gif)$/i, loader: 'file-loader', options: { publicPath: (url, resourcePath, context) => { // `resourcePath` is original absolute path to asset // `context` is directory where stored asset (`rootContext`) or `context` option // To get relative path you can use // const relativePath = path.relative(context, resourcePath); if (/my-custom-image\.png/.test(resourcePath)) { return `other_public_path/${url}`; } if (/images/.test(context)) { return `image_output_path/${url}`; } return `public_path/${url}`; }, }, }, ], }, }; ``` ### `postTransformPublicPath` Type: `Function` Default: `undefined` Specifies a custom function to post-process the generated public path. This can be used to prepend or append dynamic global variables that are only available at runtime, like `__webpack_public_path__`. This would not be possible with just `publicPath`, since it stringifies the values. **webpack.config.js** ```js module.exports = { module: { rules: [ { test: /\.(png|jpg|gif)$/i, loader: 'file-loader', options: { publicPath: '/some/path/', postTransformPublicPath: (p) => `__webpack_public_path__ + ${p}`, }, }, ], }, }; ``` ### `context` Type: `String` Default: [`context`](https://webpack.js.org/configuration/entry-context/#context) Specifies a custom file context. ```js module.exports = { module: { rules: [ { test: /\.(png|jpe?g|gif)$/i, use: [ { loader: 'file-loader', options: { context: 'project', }, }, ], }, ], }, }; ``` ### `emitFile` Type: `Boolean` Default: `true` If true, emits a file (writes a file to the filesystem). If false, the loader will return a public URI but **will not** emit the file. It is often useful to disable this option for server-side packages. **file.js** ```js // bundle file import img from './file.png'; ``` **webpack.config.js** ```js module.exports = { module: { rules: [ { test: /\.css$/i, use: [ { loader: 'file-loader', options: { emitFile: false, }, }, ], }, ], }, }; ``` ### `regExp` Type: `RegExp` Default: `undefined` Specifies a Regular Expression to one or many parts of the target file path. The capture groups can be reused in the `name` property using `[N]` [placeholder](https://github.com/webpack-contrib/file-loader#placeholders). **file.js** ```js import img from './customer01/file.png'; ``` **webpack.config.js** ```js module.exports = { module: { rules: [ { test: /\.(png|jpe?g|gif)$/i, use: [ { loader: 'file-loader', options: { regExp: /\/([a-z0-9]+)\/[a-z0-9]+\.png$/i, name: '[1]-[name].[ext]', }, }, ], }, ], }, }; ``` > ℹ️ If `[0]` is used, it will be replaced by the entire tested string, whereas `[1]` will contain the first capturing parenthesis of your regex and so on... ### `esModule` Type: `Boolean` Default: `true` By default, `file-loader` generates JS modules that use the ES modules syntax. There are some cases in which using ES modules is beneficial, like in the case of [module concatenation](https://webpack.js.org/plugins/module-concatenation-plugin/) and [tree shaking](https://webpack.js.org/guides/tree-shaking/). You can enable a CommonJS module syntax using: **webpack.config.js** ```js module.exports = { module: { rules: [ { test: /\.css$/, use: [ { loader: 'file-loader', options: { esModule: false, }, }, ], }, ], }, }; ``` ## Placeholders Full information about placeholders you can find [here](https://github.com/webpack/loader-utils#interpolatename). ### `[ext]` Type: `String` Default: `file.extname` The file extension of the target file/resource. ### `[name]` Type: `String` Default: `file.basename` The basename of the file/resource. ### `[path]` Type: `String` Default: `file.directory` The path of the resource relative to the webpack/config `context`. ### `[folder]` Type: `String` Default: `file.folder` The folder of the resource is in. ### `[query]` Type: `String` Default: `file.query` The query of the resource, i.e. `?foo=bar`. ### `[emoji]` Type: `String` Default: `undefined` A random emoji representation of `content`. ### `[emoji:]` Type: `String` Default: `undefined` Same as above, but with a customizable number of emojis ### `[hash]` Type: `String` Default: `md4` Specifies the hash method to use for hashing the file content. ### `[contenthash]` Type: `String` Default: `md4` Specifies the hash method to use for hashing the file content. ### `[:hash::]` Type: `String` The hash of options.content (Buffer) (by default it's the hex digest of the hash). #### `digestType` Type: `String` Default: `'hex'` The [digest](https://en.wikipedia.org/wiki/Cryptographic_hash_function) that the hash function should use. Valid values include: base26, base32, base36, base49, base52, base58, base62, base64, and hex. #### `hashType` Type: `String` Default: `'md4'` The type of hash that the has function should use. Valid values include: `md4`, `md5`, `sha1`, `sha256`, and `sha512`. #### `length` Type: `Number` Default: `undefined` Users may also specify a length for the computed hash. ### `[N]` Type: `String` Default: `undefined` The n-th match obtained from matching the current file name against the `regExp`. ## Examples ### Names The following examples show how one might use `file-loader` and what the result would be. **file.js** ```js import png from './image.png'; ``` **webpack.config.js** ```js module.exports = { module: { rules: [ { test: /\.(png|jpe?g|gif)$/i, use: [ { loader: 'file-loader', options: { name: 'dirname/[contenthash].[ext]', }, }, ], }, ], }, }; ``` Result: ```bash # result dirname/0dcbbaa701328ae351f.png ``` --- **file.js** ```js import png from './image.png'; ``` **webpack.config.js** ```js module.exports = { module: { rules: [ { test: /\.(png|jpe?g|gif)$/i, use: [ { loader: 'file-loader', options: { name: '[sha512:hash:base64:7].[ext]', }, }, ], }, ], }, }; ``` Result: ```bash # result gdyb21L.png ``` --- **file.js** ```js import png from './path/to/file.png'; ``` **webpack.config.js** ```js module.exports = { module: { rules: [ { test: /\.(png|jpe?g|gif)$/i, use: [ { loader: 'file-loader', options: { name: '[path][name].[ext]?[contenthash]', }, }, ], }, ], }, }; ``` Result: ```bash # result path/to/file.png?e43b20c069c4a01867c31e98cbce33c9 ``` ### CDN The following examples show how to use `file-loader` for CDN uses query params. **file.js** ```js import png from './directory/image.png?width=300&height=300'; ``` **webpack.config.js** ```js module.exports = { output: { publicPath: 'https://cdn.example.com/', }, module: { rules: [ { test: /\.(png|jpe?g|gif)$/i, use: [ { loader: 'file-loader', options: { name: '[path][name].[ext][query]', }, }, ], }, ], }, }; ``` Result: ```bash # result https://cdn.example.com/directory/image.png?width=300&height=300 ``` ### Dynamic public path depending on environment variable at run time An application might want to configure different CDN hosts depending on an environment variable that is only available when running the application. This can be an advantage, as only one build of the application is necessary, which behaves differently depending on environment variables of the deployment environment. Since file-loader is applied when compiling the application, and not when running it, the environment variable cannot be used in the file-loader configuration. A way around this is setting the `__webpack_public_path__` to the desired CDN host depending on the environment variable at the entrypoint of the application. The option `postTransformPublicPath` can be used to configure a custom path depending on a variable like `__webpack_public_path__`. **main.js** ```js const assetPrefixForNamespace = (namespace) => { switch (namespace) { case 'prod': return 'https://cache.myserver.net/web'; case 'uat': return 'https://cache-uat.myserver.net/web'; case 'st': return 'https://cache-st.myserver.net/web'; case 'dev': return 'https://cache-dev.myserver.net/web'; default: return ''; } }; const namespace = process.env.NAMESPACE; __webpack_public_path__ = `${assetPrefixForNamespace(namespace)}/`; ``` **file.js** ```js import png from './image.png'; ``` **webpack.config.js** ```js module.exports = { module: { rules: [ { test: /\.(png|jpg|gif)$/i, loader: 'file-loader', options: { name: '[name].[contenthash].[ext]', outputPath: 'static/assets/', publicPath: 'static/assets/', postTransformPublicPath: (p) => `__webpack_public_path__ + ${p}`, }, }, ], }, }; ``` Result when run with `NAMESPACE=prod` env variable: ```bash # result https://cache.myserver.net/web/static/assets/image.somehash.png ``` Result when run with `NAMESPACE=dev` env variable: ```bash # result https://cache-dev.myserver.net/web/static/assets/image.somehash.png ``` ## Contributing Please take a moment to read our contributing guidelines if you haven't yet done so. [CONTRIBUTING](./.github/CONTRIBUTING.md) ## License [MIT](./LICENSE) [npm]: https://img.shields.io/npm/v/file-loader.svg [npm-url]: https://npmjs.com/package/file-loader [node]: https://img.shields.io/node/v/file-loader.svg [node-url]: https://nodejs.org [deps]: https://david-dm.org/webpack-contrib/file-loader.svg [deps-url]: https://david-dm.org/webpack-contrib/file-loader [tests]: https://github.com/webpack-contrib/file-loader/workflows/file-loader/badge.svg [tests-url]: https://github.com/webpack-contrib/file-loader/actions [cover]: https://codecov.io/gh/webpack-contrib/file-loader/branch/master/graph/badge.svg [cover-url]: https://codecov.io/gh/webpack-contrib/file-loader [chat]: https://img.shields.io/badge/gitter-webpack%2Fwebpack-brightgreen.svg [chat-url]: https://gitter.im/webpack/webpack [size]: https://packagephobia.now.sh/badge?p=file-loader [size-url]: https://packagephobia.now.sh/result?p=file-loader PK>[b#node_modules/schema-utils/README.mdnuW+A
[![npm][npm]][npm-url] [![node][node]][node-url] [![deps][deps]][deps-url] [![tests][tests]][tests-url] [![coverage][cover]][cover-url] [![chat][chat]][chat-url] [![size][size]][size-url] # schema-utils Package for validate options in loaders and plugins. ## Getting Started To begin, you'll need to install `schema-utils`: ```console npm install schema-utils ``` ## API **schema.json** ```json { "type": "object", "properties": { "option": { "type": "boolean" } }, "additionalProperties": false } ``` ```js import schema from "./path/to/schema.json"; import { validate } from "schema-utils"; const options = { option: true }; const configuration = { name: "Loader Name/Plugin Name/Name" }; validate(schema, options, configuration); ``` ### `schema` Type: `String` JSON schema. Simple example of schema: ```json { "type": "object", "properties": { "name": { "description": "This is description of option.", "type": "string" } }, "additionalProperties": false } ``` ### `options` Type: `Object` Object with options. ```js import schema from "./path/to/schema.json"; import { validate } from "schema-utils"; const options = { foo: "bar" }; validate(schema, { name: 123 }, { name: "MyPlugin" }); ``` ### `configuration` Allow to configure validator. There is an alternative method to configure the `name` and`baseDataPath` options via the `title` property in the schema. For example: ```json { "title": "My Loader options", "type": "object", "properties": { "name": { "description": "This is description of option.", "type": "string" } }, "additionalProperties": false } ``` The last word used for the `baseDataPath` option, other words used for the `name` option. Based on the example above the `name` option equals `My Loader`, the `baseDataPath` option equals `options`. #### `name` Type: `Object` Default: `"Object"` Allow to setup name in validation errors. ```js import schema from "./path/to/schema.json"; import { validate } from "schema-utils"; const options = { foo: "bar" }; validate(schema, options, { name: "MyPlugin" }); ``` ```shell Invalid configuration object. MyPlugin has been initialised using a configuration object that does not match the API schema. - configuration.optionName should be a integer. ``` #### `baseDataPath` Type: `String` Default: `"configuration"` Allow to setup base data path in validation errors. ```js import schema from "./path/to/schema.json"; import { validate } from "schema-utils"; const options = { foo: "bar" }; validate(schema, options, { name: "MyPlugin", baseDataPath: "options" }); ``` ```shell Invalid options object. MyPlugin has been initialised using an options object that does not match the API schema. - options.optionName should be a integer. ``` #### `postFormatter` Type: `Function` Default: `undefined` Allow to reformat errors. ```js import schema from "./path/to/schema.json"; import { validate } from "schema-utils"; const options = { foo: "bar" }; validate(schema, options, { name: "MyPlugin", postFormatter: (formattedError, error) => { if (error.keyword === "type") { return `${formattedError}\nAdditional Information.`; } return formattedError; }, }); ``` ```shell Invalid options object. MyPlugin has been initialized using an options object that does not match the API schema. - options.optionName should be a integer. Additional Information. ``` ## Examples **schema.json** ```json { "type": "object", "properties": { "name": { "type": "string" }, "test": { "anyOf": [ { "type": "array" }, { "type": "string" }, { "instanceof": "RegExp" } ] }, "transform": { "instanceof": "Function" }, "sourceMap": { "type": "boolean" } }, "additionalProperties": false } ``` ### `Loader` ```js import { getOptions } from "loader-utils"; import { validate } from "schema-utils"; import schema from "path/to/schema.json"; function loader(src, map) { const options = getOptions(this); validate(schema, options, { name: "Loader Name", baseDataPath: "options", }); // Code... } export default loader; ``` ### `Plugin` ```js import { validate } from "schema-utils"; import schema from "path/to/schema.json"; class Plugin { constructor(options) { validate(schema, options, { name: "Plugin Name", baseDataPath: "options", }); this.options = options; } apply(compiler) { // Code... } } export default Plugin; ``` ## Contributing Please take a moment to read our contributing guidelines if you haven't yet done so. [CONTRIBUTING](./.github/CONTRIBUTING.md) ## License [MIT](./LICENSE) [npm]: https://img.shields.io/npm/v/schema-utils.svg [npm-url]: https://npmjs.com/package/schema-utils [node]: https://img.shields.io/node/v/schema-utils.svg [node-url]: https://nodejs.org [deps]: https://david-dm.org/webpack/schema-utils.svg [deps-url]: https://david-dm.org/webpack/schema-utils [tests]: https://github.com/webpack/schema-utils/workflows/schema-utils/badge.svg [tests-url]: https://github.com/webpack/schema-utils/actions [cover]: https://codecov.io/gh/webpack/schema-utils/branch/master/graph/badge.svg [cover-url]: https://codecov.io/gh/webpack/schema-utils [chat]: https://badges.gitter.im/webpack/webpack.svg [chat-url]: https://gitter.im/webpack/webpack [size]: https://packagephobia.com/badge?p=schema-utils [size-url]: https://packagephobia.com/result?p=schema-utils PK>[fEEAnode_modules/schema-utils/declarations/keywords/absolutePath.d.tsnuW+Aexport default addAbsolutePathKeyword; export type Ajv = import("ajv").Ajv; export type ValidateFunction = import("ajv").ValidateFunction; export type SchemaUtilErrorObject = import("../validate").SchemaUtilErrorObject; /** * * @param {Ajv} ajv * @returns {Ajv} */ declare function addAbsolutePathKeyword(ajv: Ajv): Ajv; PK>[n%6node_modules/schema-utils/declarations/util/hints.d.tsnuW+Aexport function stringHints(schema: Schema, logic: boolean): string[]; export function numberHints(schema: Schema, logic: boolean): string[]; export type Schema = import("../validate").Schema; PK>[ַ`  6node_modules/schema-utils/declarations/util/Range.d.tsnuW+Aexport = Range; /** * @typedef {[number, boolean]} RangeValue */ /** * @callback RangeValueCallback * @param {RangeValue} rangeValue * @returns {boolean} */ declare class Range { /** * @param {"left" | "right"} side * @param {boolean} exclusive * @returns {">" | ">=" | "<" | "<="} */ static getOperator( side: "left" | "right", exclusive: boolean ): ">" | ">=" | "<" | "<="; /** * @param {number} value * @param {boolean} logic is not logic applied * @param {boolean} exclusive is range exclusive * @returns {string} */ static formatRight(value: number, logic: boolean, exclusive: boolean): string; /** * @param {number} value * @param {boolean} logic is not logic applied * @param {boolean} exclusive is range exclusive * @returns {string} */ static formatLeft(value: number, logic: boolean, exclusive: boolean): string; /** * @param {number} start left side value * @param {number} end right side value * @param {boolean} startExclusive is range exclusive from left side * @param {boolean} endExclusive is range exclusive from right side * @param {boolean} logic is not logic applied * @returns {string} */ static formatRange( start: number, end: number, startExclusive: boolean, endExclusive: boolean, logic: boolean ): string; /** * @param {Array} values * @param {boolean} logic is not logic applied * @return {RangeValue} computed value and it's exclusive flag */ static getRangeValue(values: Array, logic: boolean): RangeValue; /** @type {Array} */ _left: Array; /** @type {Array} */ _right: Array; /** * @param {number} value * @param {boolean=} exclusive */ left(value: number, exclusive?: boolean | undefined): void; /** * @param {number} value * @param {boolean=} exclusive */ right(value: number, exclusive?: boolean | undefined): void; /** * @param {boolean} logic is not logic applied * @return {string} "smart" range string representation */ format(logic?: boolean): string; } declare namespace Range { export { RangeValue, RangeValueCallback }; } type RangeValue = [number, boolean]; type RangeValueCallback = (rangeValue: RangeValue) => boolean; PK>[64node_modules/schema-utils/declarations/validate.d.tsnuW+Aexport type JSONSchema4 = import("json-schema").JSONSchema4; export type JSONSchema6 = import("json-schema").JSONSchema6; export type JSONSchema7 = import("json-schema").JSONSchema7; export type ErrorObject = import("ajv").ErrorObject; export type Extend = { formatMinimum?: number | undefined; formatMaximum?: number | undefined; formatExclusiveMinimum?: boolean | undefined; formatExclusiveMaximum?: boolean | undefined; link?: string | undefined; }; export type Schema = (JSONSchema4 | JSONSchema6 | JSONSchema7) & Extend; export type SchemaUtilErrorObject = ErrorObject & { children?: Array; }; export type PostFormatter = ( formattedError: string, error: SchemaUtilErrorObject ) => string; export type ValidationErrorConfiguration = { name?: string | undefined; baseDataPath?: string | undefined; postFormatter?: PostFormatter | undefined; }; /** * @param {Schema} schema * @param {Array | object} options * @param {ValidationErrorConfiguration=} configuration * @returns {void} */ export function validate( schema: Schema, options: Array | object, configuration?: ValidationErrorConfiguration | undefined ): void; import ValidationError from "./ValidationError"; export { ValidationError }; PK>[o;node_modules/schema-utils/declarations/ValidationError.d.tsnuW+Aexport default ValidationError; export type JSONSchema6 = import("json-schema").JSONSchema6; export type JSONSchema7 = import("json-schema").JSONSchema7; export type Schema = import("./validate").Schema; export type ValidationErrorConfiguration = import("./validate").ValidationErrorConfiguration; export type PostFormatter = import("./validate").PostFormatter; export type SchemaUtilErrorObject = import("./validate").SchemaUtilErrorObject; declare class ValidationError extends Error { /** * @param {Array} errors * @param {Schema} schema * @param {ValidationErrorConfiguration} configuration */ constructor( errors: Array, schema: Schema, configuration?: ValidationErrorConfiguration ); /** @type {Array} */ errors: Array; /** @type {Schema} */ schema: Schema; /** @type {string} */ headerName: string; /** @type {string} */ baseDataPath: string; /** @type {PostFormatter | null} */ postFormatter: PostFormatter | null; /** * @param {string} path * @returns {Schema} */ getSchemaPart(path: string): Schema; /** * @param {Schema} schema * @param {boolean} logic * @param {Array} prevSchemas * @returns {string} */ formatSchema( schema: Schema, logic?: boolean, prevSchemas?: Array ): string; /** * @param {Schema=} schemaPart * @param {(boolean | Array)=} additionalPath * @param {boolean=} needDot * @param {boolean=} logic * @returns {string} */ getSchemaPartText( schemaPart?: Schema | undefined, additionalPath?: (boolean | Array) | undefined, needDot?: boolean | undefined, logic?: boolean | undefined ): string; /** * @param {Schema=} schemaPart * @returns {string} */ getSchemaPartDescription(schemaPart?: Schema | undefined): string; /** * @param {SchemaUtilErrorObject} error * @returns {string} */ formatValidationError(error: SchemaUtilErrorObject): string; /** * @param {Array} errors * @returns {string} */ formatValidationErrors(errors: Array): string; } PK>[,]&{{1node_modules/schema-utils/declarations/index.d.tsnuW+Aimport { validate } from "./validate"; import { ValidationError } from "./validate"; export { validate, ValidationError }; PK>[K 'node_modules/schema-utils/dist/index.jsnuW+A"use strict"; const { validate, ValidationError } = require("./validate"); module.exports = { validate, ValidationError };PK>[jx*node_modules/schema-utils/dist/validate.jsnuW+A"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validate = validate; Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function () { return _ValidationError.default; } }); var _absolutePath = _interopRequireDefault(require("./keywords/absolutePath")); var _ValidationError = _interopRequireDefault(require("./ValidationError")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } // Use CommonJS require for ajv libs so TypeScript consumers aren't locked into esModuleInterop (see #110). const Ajv = require("ajv"); const ajvKeywords = require("ajv-keywords"); /** @typedef {import("json-schema").JSONSchema4} JSONSchema4 */ /** @typedef {import("json-schema").JSONSchema6} JSONSchema6 */ /** @typedef {import("json-schema").JSONSchema7} JSONSchema7 */ /** @typedef {import("ajv").ErrorObject} ErrorObject */ /** * @typedef {Object} Extend * @property {number=} formatMinimum * @property {number=} formatMaximum * @property {boolean=} formatExclusiveMinimum * @property {boolean=} formatExclusiveMaximum * @property {string=} link */ /** @typedef {(JSONSchema4 | JSONSchema6 | JSONSchema7) & Extend} Schema */ /** @typedef {ErrorObject & { children?: Array}} SchemaUtilErrorObject */ /** * @callback PostFormatter * @param {string} formattedError * @param {SchemaUtilErrorObject} error * @returns {string} */ /** * @typedef {Object} ValidationErrorConfiguration * @property {string=} name * @property {string=} baseDataPath * @property {PostFormatter=} postFormatter */ const ajv = new Ajv({ allErrors: true, verbose: true, $data: true }); ajvKeywords(ajv, ["instanceof", "formatMinimum", "formatMaximum", "patternRequired"]); // Custom keywords (0, _absolutePath.default)(ajv); /** * @param {Schema} schema * @param {Array | object} options * @param {ValidationErrorConfiguration=} configuration * @returns {void} */ function validate(schema, options, configuration) { let errors = []; if (Array.isArray(options)) { errors = Array.from(options, nestedOptions => validateObject(schema, nestedOptions)); errors.forEach((list, idx) => { const applyPrefix = /** * @param {SchemaUtilErrorObject} error */ error => { // eslint-disable-next-line no-param-reassign error.dataPath = `[${idx}]${error.dataPath}`; if (error.children) { error.children.forEach(applyPrefix); } }; list.forEach(applyPrefix); }); errors = errors.reduce((arr, items) => { arr.push(...items); return arr; }, []); } else { errors = validateObject(schema, options); } if (errors.length > 0) { throw new _ValidationError.default(errors, schema, configuration); } } /** * @param {Schema} schema * @param {Array | object} options * @returns {Array} */ function validateObject(schema, options) { const compiledSchema = ajv.compile(schema); const valid = compiledSchema(options); if (valid) return []; return compiledSchema.errors ? filterErrors(compiledSchema.errors) : []; } /** * @param {Array} errors * @returns {Array} */ function filterErrors(errors) { /** @type {Array} */ let newErrors = []; for (const error of /** @type {Array} */ errors) { const { dataPath } = error; /** @type {Array} */ let children = []; newErrors = newErrors.filter(oldError => { if (oldError.dataPath.includes(dataPath)) { if (oldError.children) { children = children.concat(oldError.children.slice(0)); } // eslint-disable-next-line no-undefined, no-param-reassign oldError.children = undefined; children.push(oldError); return false; } return true; }); if (children.length) { error.children = children; } newErrors.push(error); } return newErrors; }PK>[Uc/5s s 7node_modules/schema-utils/dist/keywords/absolutePath.jsnuW+A"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; /** @typedef {import("ajv").Ajv} Ajv */ /** @typedef {import("ajv").ValidateFunction} ValidateFunction */ /** @typedef {import("../validate").SchemaUtilErrorObject} SchemaUtilErrorObject */ /** * @param {string} message * @param {object} schema * @param {string} data * @returns {SchemaUtilErrorObject} */ function errorMessage(message, schema, data) { return { // @ts-ignore // eslint-disable-next-line no-undefined dataPath: undefined, // @ts-ignore // eslint-disable-next-line no-undefined schemaPath: undefined, keyword: "absolutePath", params: { absolutePath: data }, message, parentSchema: schema }; } /** * @param {boolean} shouldBeAbsolute * @param {object} schema * @param {string} data * @returns {SchemaUtilErrorObject} */ function getErrorFor(shouldBeAbsolute, schema, data) { const message = shouldBeAbsolute ? `The provided value ${JSON.stringify(data)} is not an absolute path!` : `A relative path is expected. However, the provided value ${JSON.stringify(data)} is an absolute path!`; return errorMessage(message, schema, data); } /** * * @param {Ajv} ajv * @returns {Ajv} */ function addAbsolutePathKeyword(ajv) { ajv.addKeyword("absolutePath", { errors: true, type: "string", compile(schema, parentSchema) { /** @type {ValidateFunction} */ const callback = data => { let passes = true; const isExclamationMarkPresent = data.includes("!"); if (isExclamationMarkPresent) { callback.errors = [errorMessage(`The provided value ${JSON.stringify(data)} contains exclamation mark (!) which is not allowed because it's reserved for loader syntax.`, parentSchema, data)]; passes = false; } // ?:[A-Za-z]:\\ - Windows absolute path // \\\\ - Windows network absolute path // \/ - Unix-like OS absolute path const isCorrectAbsolutePath = schema === /^(?:[A-Za-z]:(\\|\/)|\\\\|\/)/.test(data); if (!isCorrectAbsolutePath) { callback.errors = [getErrorFor(schema, parentSchema, data)]; passes = false; } return passes; }; callback.errors = []; return callback; } }); return ajv; } var _default = addAbsolutePathKeyword; exports.default = _default;PK>[=,node_modules/schema-utils/dist/util/Range.jsnuW+A"use strict"; /** * @typedef {[number, boolean]} RangeValue */ /** * @callback RangeValueCallback * @param {RangeValue} rangeValue * @returns {boolean} */ class Range { /** * @param {"left" | "right"} side * @param {boolean} exclusive * @returns {">" | ">=" | "<" | "<="} */ static getOperator(side, exclusive) { if (side === "left") { return exclusive ? ">" : ">="; } return exclusive ? "<" : "<="; } /** * @param {number} value * @param {boolean} logic is not logic applied * @param {boolean} exclusive is range exclusive * @returns {string} */ static formatRight(value, logic, exclusive) { if (logic === false) { return Range.formatLeft(value, !logic, !exclusive); } return `should be ${Range.getOperator("right", exclusive)} ${value}`; } /** * @param {number} value * @param {boolean} logic is not logic applied * @param {boolean} exclusive is range exclusive * @returns {string} */ static formatLeft(value, logic, exclusive) { if (logic === false) { return Range.formatRight(value, !logic, !exclusive); } return `should be ${Range.getOperator("left", exclusive)} ${value}`; } /** * @param {number} start left side value * @param {number} end right side value * @param {boolean} startExclusive is range exclusive from left side * @param {boolean} endExclusive is range exclusive from right side * @param {boolean} logic is not logic applied * @returns {string} */ static formatRange(start, end, startExclusive, endExclusive, logic) { let result = "should be"; result += ` ${Range.getOperator(logic ? "left" : "right", logic ? startExclusive : !startExclusive)} ${start} `; result += logic ? "and" : "or"; result += ` ${Range.getOperator(logic ? "right" : "left", logic ? endExclusive : !endExclusive)} ${end}`; return result; } /** * @param {Array} values * @param {boolean} logic is not logic applied * @return {RangeValue} computed value and it's exclusive flag */ static getRangeValue(values, logic) { let minMax = logic ? Infinity : -Infinity; let j = -1; const predicate = logic ? /** @type {RangeValueCallback} */ ([value]) => value <= minMax : /** @type {RangeValueCallback} */ ([value]) => value >= minMax; for (let i = 0; i < values.length; i++) { if (predicate(values[i])) { [minMax] = values[i]; j = i; } } if (j > -1) { return values[j]; } return [Infinity, true]; } constructor() { /** @type {Array} */ this._left = []; /** @type {Array} */ this._right = []; } /** * @param {number} value * @param {boolean=} exclusive */ left(value, exclusive = false) { this._left.push([value, exclusive]); } /** * @param {number} value * @param {boolean=} exclusive */ right(value, exclusive = false) { this._right.push([value, exclusive]); } /** * @param {boolean} logic is not logic applied * @return {string} "smart" range string representation */ format(logic = true) { const [start, leftExclusive] = Range.getRangeValue(this._left, logic); const [end, rightExclusive] = Range.getRangeValue(this._right, !logic); if (!Number.isFinite(start) && !Number.isFinite(end)) { return ""; } const realStart = leftExclusive ? start + 1 : start; const realEnd = rightExclusive ? end - 1 : end; // e.g. 5 < x < 7, 5 < x <= 6, 6 <= x <= 6 if (realStart === realEnd) { return `should be ${logic ? "" : "!"}= ${realStart}`; } // e.g. 4 < x < ∞ if (Number.isFinite(start) && !Number.isFinite(end)) { return Range.formatLeft(start, logic, leftExclusive); } // e.g. ∞ < x < 4 if (!Number.isFinite(start) && Number.isFinite(end)) { return Range.formatRight(end, logic, rightExclusive); } return Range.formatRange(start, end, leftExclusive, rightExclusive, logic); } } module.exports = Range;PK>[;>K ,node_modules/schema-utils/dist/util/hints.jsnuW+A"use strict"; const Range = require("./Range"); /** @typedef {import("../validate").Schema} Schema */ /** * @param {Schema} schema * @param {boolean} logic * @return {string[]} */ module.exports.stringHints = function stringHints(schema, logic) { const hints = []; let type = "string"; const currentSchema = { ...schema }; if (!logic) { const tmpLength = currentSchema.minLength; const tmpFormat = currentSchema.formatMinimum; const tmpExclusive = currentSchema.formatExclusiveMaximum; currentSchema.minLength = currentSchema.maxLength; currentSchema.maxLength = tmpLength; currentSchema.formatMinimum = currentSchema.formatMaximum; currentSchema.formatMaximum = tmpFormat; currentSchema.formatExclusiveMaximum = !currentSchema.formatExclusiveMinimum; currentSchema.formatExclusiveMinimum = !tmpExclusive; } if (typeof currentSchema.minLength === "number") { if (currentSchema.minLength === 1) { type = "non-empty string"; } else { const length = Math.max(currentSchema.minLength - 1, 0); hints.push(`should be longer than ${length} character${length > 1 ? "s" : ""}`); } } if (typeof currentSchema.maxLength === "number") { if (currentSchema.maxLength === 0) { type = "empty string"; } else { const length = currentSchema.maxLength + 1; hints.push(`should be shorter than ${length} character${length > 1 ? "s" : ""}`); } } if (currentSchema.pattern) { hints.push(`should${logic ? "" : " not"} match pattern ${JSON.stringify(currentSchema.pattern)}`); } if (currentSchema.format) { hints.push(`should${logic ? "" : " not"} match format ${JSON.stringify(currentSchema.format)}`); } if (currentSchema.formatMinimum) { hints.push(`should be ${currentSchema.formatExclusiveMinimum ? ">" : ">="} ${JSON.stringify(currentSchema.formatMinimum)}`); } if (currentSchema.formatMaximum) { hints.push(`should be ${currentSchema.formatExclusiveMaximum ? "<" : "<="} ${JSON.stringify(currentSchema.formatMaximum)}`); } return [type].concat(hints); }; /** * @param {Schema} schema * @param {boolean} logic * @return {string[]} */ module.exports.numberHints = function numberHints(schema, logic) { const hints = [schema.type === "integer" ? "integer" : "number"]; const range = new Range(); if (typeof schema.minimum === "number") { range.left(schema.minimum); } if (typeof schema.exclusiveMinimum === "number") { range.left(schema.exclusiveMinimum, true); } if (typeof schema.maximum === "number") { range.right(schema.maximum); } if (typeof schema.exclusiveMaximum === "number") { range.right(schema.exclusiveMaximum, true); } const rangeFormat = range.format(logic); if (rangeFormat) { hints.push(rangeFormat); } if (typeof schema.multipleOf === "number") { hints.push(`should${logic ? "" : " not"} be multiple of ${schema.multipleOf}`); } return hints; };PK>[__1node_modules/schema-utils/dist/ValidationError.jsnuW+A"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; const { stringHints, numberHints } = require("./util/hints"); /** @typedef {import("json-schema").JSONSchema6} JSONSchema6 */ /** @typedef {import("json-schema").JSONSchema7} JSONSchema7 */ /** @typedef {import("./validate").Schema} Schema */ /** @typedef {import("./validate").ValidationErrorConfiguration} ValidationErrorConfiguration */ /** @typedef {import("./validate").PostFormatter} PostFormatter */ /** @typedef {import("./validate").SchemaUtilErrorObject} SchemaUtilErrorObject */ /** @enum {number} */ const SPECIFICITY = { type: 1, not: 1, oneOf: 1, anyOf: 1, if: 1, enum: 1, const: 1, instanceof: 1, required: 2, pattern: 2, patternRequired: 2, format: 2, formatMinimum: 2, formatMaximum: 2, minimum: 2, exclusiveMinimum: 2, maximum: 2, exclusiveMaximum: 2, multipleOf: 2, uniqueItems: 2, contains: 2, minLength: 2, maxLength: 2, minItems: 2, maxItems: 2, minProperties: 2, maxProperties: 2, dependencies: 2, propertyNames: 2, additionalItems: 2, additionalProperties: 2, absolutePath: 2 }; /** * * @param {Array} array * @param {(item: SchemaUtilErrorObject) => number} fn * @returns {Array} */ function filterMax(array, fn) { const evaluatedMax = array.reduce((max, item) => Math.max(max, fn(item)), 0); return array.filter(item => fn(item) === evaluatedMax); } /** * * @param {Array} children * @returns {Array} */ function filterChildren(children) { let newChildren = children; newChildren = filterMax(newChildren, /** * * @param {SchemaUtilErrorObject} error * @returns {number} */ error => error.dataPath ? error.dataPath.length : 0); newChildren = filterMax(newChildren, /** * @param {SchemaUtilErrorObject} error * @returns {number} */ error => SPECIFICITY[ /** @type {keyof typeof SPECIFICITY} */ error.keyword] || 2); return newChildren; } /** * Find all children errors * @param {Array} children * @param {Array} schemaPaths * @return {number} returns index of first child */ function findAllChildren(children, schemaPaths) { let i = children.length - 1; const predicate = /** * @param {string} schemaPath * @returns {boolean} */ schemaPath => children[i].schemaPath.indexOf(schemaPath) !== 0; while (i > -1 && !schemaPaths.every(predicate)) { if (children[i].keyword === "anyOf" || children[i].keyword === "oneOf") { const refs = extractRefs(children[i]); const childrenStart = findAllChildren(children.slice(0, i), refs.concat(children[i].schemaPath)); i = childrenStart - 1; } else { i -= 1; } } return i + 1; } /** * Extracts all refs from schema * @param {SchemaUtilErrorObject} error * @return {Array} */ function extractRefs(error) { const { schema } = error; if (!Array.isArray(schema)) { return []; } return schema.map(({ $ref }) => $ref).filter(s => s); } /** * Groups children by their first level parent (assuming that error is root) * @param {Array} children * @return {Array} */ function groupChildrenByFirstChild(children) { const result = []; let i = children.length - 1; while (i > 0) { const child = children[i]; if (child.keyword === "anyOf" || child.keyword === "oneOf") { const refs = extractRefs(child); const childrenStart = findAllChildren(children.slice(0, i), refs.concat(child.schemaPath)); if (childrenStart !== i) { result.push(Object.assign({}, child, { children: children.slice(childrenStart, i) })); i = childrenStart; } else { result.push(child); } } else { result.push(child); } i -= 1; } if (i === 0) { result.push(children[i]); } return result.reverse(); } /** * @param {string} str * @param {string} prefix * @returns {string} */ function indent(str, prefix) { return str.replace(/\n(?!$)/g, `\n${prefix}`); } /** * @param {Schema} schema * @returns {schema is (Schema & {not: Schema})} */ function hasNotInSchema(schema) { return !!schema.not; } /** * @param {Schema} schema * @return {Schema} */ function findFirstTypedSchema(schema) { if (hasNotInSchema(schema)) { return findFirstTypedSchema(schema.not); } return schema; } /** * @param {Schema} schema * @return {boolean} */ function canApplyNot(schema) { const typedSchema = findFirstTypedSchema(schema); return likeNumber(typedSchema) || likeInteger(typedSchema) || likeString(typedSchema) || likeNull(typedSchema) || likeBoolean(typedSchema); } /** * @param {any} maybeObj * @returns {boolean} */ function isObject(maybeObj) { return typeof maybeObj === "object" && maybeObj !== null; } /** * @param {Schema} schema * @returns {boolean} */ function likeNumber(schema) { return schema.type === "number" || typeof schema.minimum !== "undefined" || typeof schema.exclusiveMinimum !== "undefined" || typeof schema.maximum !== "undefined" || typeof schema.exclusiveMaximum !== "undefined" || typeof schema.multipleOf !== "undefined"; } /** * @param {Schema} schema * @returns {boolean} */ function likeInteger(schema) { return schema.type === "integer" || typeof schema.minimum !== "undefined" || typeof schema.exclusiveMinimum !== "undefined" || typeof schema.maximum !== "undefined" || typeof schema.exclusiveMaximum !== "undefined" || typeof schema.multipleOf !== "undefined"; } /** * @param {Schema} schema * @returns {boolean} */ function likeString(schema) { return schema.type === "string" || typeof schema.minLength !== "undefined" || typeof schema.maxLength !== "undefined" || typeof schema.pattern !== "undefined" || typeof schema.format !== "undefined" || typeof schema.formatMinimum !== "undefined" || typeof schema.formatMaximum !== "undefined"; } /** * @param {Schema} schema * @returns {boolean} */ function likeBoolean(schema) { return schema.type === "boolean"; } /** * @param {Schema} schema * @returns {boolean} */ function likeArray(schema) { return schema.type === "array" || typeof schema.minItems === "number" || typeof schema.maxItems === "number" || typeof schema.uniqueItems !== "undefined" || typeof schema.items !== "undefined" || typeof schema.additionalItems !== "undefined" || typeof schema.contains !== "undefined"; } /** * @param {Schema & {patternRequired?: Array}} schema * @returns {boolean} */ function likeObject(schema) { return schema.type === "object" || typeof schema.minProperties !== "undefined" || typeof schema.maxProperties !== "undefined" || typeof schema.required !== "undefined" || typeof schema.properties !== "undefined" || typeof schema.patternProperties !== "undefined" || typeof schema.additionalProperties !== "undefined" || typeof schema.dependencies !== "undefined" || typeof schema.propertyNames !== "undefined" || typeof schema.patternRequired !== "undefined"; } /** * @param {Schema} schema * @returns {boolean} */ function likeNull(schema) { return schema.type === "null"; } /** * @param {string} type * @returns {string} */ function getArticle(type) { if (/^[aeiou]/i.test(type)) { return "an"; } return "a"; } /** * @param {Schema=} schema * @returns {string} */ function getSchemaNonTypes(schema) { if (!schema) { return ""; } if (!schema.type) { if (likeNumber(schema) || likeInteger(schema)) { return " | should be any non-number"; } if (likeString(schema)) { return " | should be any non-string"; } if (likeArray(schema)) { return " | should be any non-array"; } if (likeObject(schema)) { return " | should be any non-object"; } } return ""; } /** * @param {Array} hints * @returns {string} */ function formatHints(hints) { return hints.length > 0 ? `(${hints.join(", ")})` : ""; } /** * @param {Schema} schema * @param {boolean} logic * @returns {string[]} */ function getHints(schema, logic) { if (likeNumber(schema) || likeInteger(schema)) { return numberHints(schema, logic); } else if (likeString(schema)) { return stringHints(schema, logic); } return []; } class ValidationError extends Error { /** * @param {Array} errors * @param {Schema} schema * @param {ValidationErrorConfiguration} configuration */ constructor(errors, schema, configuration = {}) { super(); /** @type {string} */ this.name = "ValidationError"; /** @type {Array} */ this.errors = errors; /** @type {Schema} */ this.schema = schema; let headerNameFromSchema; let baseDataPathFromSchema; if (schema.title && (!configuration.name || !configuration.baseDataPath)) { const splittedTitleFromSchema = schema.title.match(/^(.+) (.+)$/); if (splittedTitleFromSchema) { if (!configuration.name) { [, headerNameFromSchema] = splittedTitleFromSchema; } if (!configuration.baseDataPath) { [,, baseDataPathFromSchema] = splittedTitleFromSchema; } } } /** @type {string} */ this.headerName = configuration.name || headerNameFromSchema || "Object"; /** @type {string} */ this.baseDataPath = configuration.baseDataPath || baseDataPathFromSchema || "configuration"; /** @type {PostFormatter | null} */ this.postFormatter = configuration.postFormatter || null; const header = `Invalid ${this.baseDataPath} object. ${this.headerName} has been initialized using ${getArticle(this.baseDataPath)} ${this.baseDataPath} object that does not match the API schema.\n`; /** @type {string} */ this.message = `${header}${this.formatValidationErrors(errors)}`; Error.captureStackTrace(this, this.constructor); } /** * @param {string} path * @returns {Schema} */ getSchemaPart(path) { const newPath = path.split("/"); let schemaPart = this.schema; for (let i = 1; i < newPath.length; i++) { const inner = schemaPart[ /** @type {keyof Schema} */ newPath[i]]; if (!inner) { break; } schemaPart = inner; } return schemaPart; } /** * @param {Schema} schema * @param {boolean} logic * @param {Array} prevSchemas * @returns {string} */ formatSchema(schema, logic = true, prevSchemas = []) { let newLogic = logic; const formatInnerSchema = /** * * @param {Object} innerSchema * @param {boolean=} addSelf * @returns {string} */ (innerSchema, addSelf) => { if (!addSelf) { return this.formatSchema(innerSchema, newLogic, prevSchemas); } if (prevSchemas.includes(innerSchema)) { return "(recursive)"; } return this.formatSchema(innerSchema, newLogic, prevSchemas.concat(schema)); }; if (hasNotInSchema(schema) && !likeObject(schema)) { if (canApplyNot(schema.not)) { newLogic = !logic; return formatInnerSchema(schema.not); } const needApplyLogicHere = !schema.not.not; const prefix = logic ? "" : "non "; newLogic = !logic; return needApplyLogicHere ? prefix + formatInnerSchema(schema.not) : formatInnerSchema(schema.not); } if ( /** @type {Schema & {instanceof: string | Array}} */ schema.instanceof) { const { instanceof: value } = /** @type {Schema & {instanceof: string | Array}} */ schema; const values = !Array.isArray(value) ? [value] : value; return values.map( /** * @param {string} item * @returns {string} */ item => item === "Function" ? "function" : item).join(" | "); } if (schema.enum) { return ( /** @type {Array} */ schema.enum.map(item => JSON.stringify(item)).join(" | ") ); } if (typeof schema.const !== "undefined") { return JSON.stringify(schema.const); } if (schema.oneOf) { return ( /** @type {Array} */ schema.oneOf.map(item => formatInnerSchema(item, true)).join(" | ") ); } if (schema.anyOf) { return ( /** @type {Array} */ schema.anyOf.map(item => formatInnerSchema(item, true)).join(" | ") ); } if (schema.allOf) { return ( /** @type {Array} */ schema.allOf.map(item => formatInnerSchema(item, true)).join(" & ") ); } if ( /** @type {JSONSchema7} */ schema.if) { const { if: ifValue, then: thenValue, else: elseValue } = /** @type {JSONSchema7} */ schema; return `${ifValue ? `if ${formatInnerSchema(ifValue)}` : ""}${thenValue ? ` then ${formatInnerSchema(thenValue)}` : ""}${elseValue ? ` else ${formatInnerSchema(elseValue)}` : ""}`; } if (schema.$ref) { return formatInnerSchema(this.getSchemaPart(schema.$ref), true); } if (likeNumber(schema) || likeInteger(schema)) { const [type, ...hints] = getHints(schema, logic); const str = `${type}${hints.length > 0 ? ` ${formatHints(hints)}` : ""}`; return logic ? str : hints.length > 0 ? `non-${type} | ${str}` : `non-${type}`; } if (likeString(schema)) { const [type, ...hints] = getHints(schema, logic); const str = `${type}${hints.length > 0 ? ` ${formatHints(hints)}` : ""}`; return logic ? str : str === "string" ? "non-string" : `non-string | ${str}`; } if (likeBoolean(schema)) { return `${logic ? "" : "non-"}boolean`; } if (likeArray(schema)) { // not logic already applied in formatValidationError newLogic = true; const hints = []; if (typeof schema.minItems === "number") { hints.push(`should not have fewer than ${schema.minItems} item${schema.minItems > 1 ? "s" : ""}`); } if (typeof schema.maxItems === "number") { hints.push(`should not have more than ${schema.maxItems} item${schema.maxItems > 1 ? "s" : ""}`); } if (schema.uniqueItems) { hints.push("should not have duplicate items"); } const hasAdditionalItems = typeof schema.additionalItems === "undefined" || Boolean(schema.additionalItems); let items = ""; if (schema.items) { if (Array.isArray(schema.items) && schema.items.length > 0) { items = `${ /** @type {Array} */ schema.items.map(item => formatInnerSchema(item)).join(", ")}`; if (hasAdditionalItems) { if (schema.additionalItems && isObject(schema.additionalItems) && Object.keys(schema.additionalItems).length > 0) { hints.push(`additional items should be ${formatInnerSchema(schema.additionalItems)}`); } } } else if (schema.items && Object.keys(schema.items).length > 0) { // "additionalItems" is ignored items = `${formatInnerSchema(schema.items)}`; } else { // Fallback for empty `items` value items = "any"; } } else { // "additionalItems" is ignored items = "any"; } if (schema.contains && Object.keys(schema.contains).length > 0) { hints.push(`should contains at least one ${this.formatSchema(schema.contains)} item`); } return `[${items}${hasAdditionalItems ? ", ..." : ""}]${hints.length > 0 ? ` (${hints.join(", ")})` : ""}`; } if (likeObject(schema)) { // not logic already applied in formatValidationError newLogic = true; const hints = []; if (typeof schema.minProperties === "number") { hints.push(`should not have fewer than ${schema.minProperties} ${schema.minProperties > 1 ? "properties" : "property"}`); } if (typeof schema.maxProperties === "number") { hints.push(`should not have more than ${schema.maxProperties} ${schema.minProperties && schema.minProperties > 1 ? "properties" : "property"}`); } if (schema.patternProperties && Object.keys(schema.patternProperties).length > 0) { const patternProperties = Object.keys(schema.patternProperties); hints.push(`additional property names should match pattern${patternProperties.length > 1 ? "s" : ""} ${patternProperties.map(pattern => JSON.stringify(pattern)).join(" | ")}`); } const properties = schema.properties ? Object.keys(schema.properties) : []; const required = schema.required ? schema.required : []; const allProperties = [...new Set( /** @type {Array} */ [].concat(required).concat(properties))]; const objectStructure = allProperties.map(property => { const isRequired = required.includes(property); // Some properties need quotes, maybe we should add check // Maybe we should output type of property (`foo: string`), but it is looks very unreadable return `${property}${isRequired ? "" : "?"}`; }).concat(typeof schema.additionalProperties === "undefined" || Boolean(schema.additionalProperties) ? schema.additionalProperties && isObject(schema.additionalProperties) ? [`: ${formatInnerSchema(schema.additionalProperties)}`] : ["…"] : []).join(", "); const { dependencies, propertyNames, patternRequired } = /** @type {Schema & {patternRequired?: Array;}} */ schema; if (dependencies) { Object.keys(dependencies).forEach(dependencyName => { const dependency = dependencies[dependencyName]; if (Array.isArray(dependency)) { hints.push(`should have ${dependency.length > 1 ? "properties" : "property"} ${dependency.map(dep => `'${dep}'`).join(", ")} when property '${dependencyName}' is present`); } else { hints.push(`should be valid according to the schema ${formatInnerSchema(dependency)} when property '${dependencyName}' is present`); } }); } if (propertyNames && Object.keys(propertyNames).length > 0) { hints.push(`each property name should match format ${JSON.stringify(schema.propertyNames.format)}`); } if (patternRequired && patternRequired.length > 0) { hints.push(`should have property matching pattern ${patternRequired.map( /** * @param {string} item * @returns {string} */ item => JSON.stringify(item))}`); } return `object {${objectStructure ? ` ${objectStructure} ` : ""}}${hints.length > 0 ? ` (${hints.join(", ")})` : ""}`; } if (likeNull(schema)) { return `${logic ? "" : "non-"}null`; } if (Array.isArray(schema.type)) { // not logic already applied in formatValidationError return `${schema.type.join(" | ")}`; } // Fallback for unknown keywords // not logic already applied in formatValidationError /* istanbul ignore next */ return JSON.stringify(schema, null, 2); } /** * @param {Schema=} schemaPart * @param {(boolean | Array)=} additionalPath * @param {boolean=} needDot * @param {boolean=} logic * @returns {string} */ getSchemaPartText(schemaPart, additionalPath, needDot = false, logic = true) { if (!schemaPart) { return ""; } if (Array.isArray(additionalPath)) { for (let i = 0; i < additionalPath.length; i++) { /** @type {Schema | undefined} */ const inner = schemaPart[ /** @type {keyof Schema} */ additionalPath[i]]; if (inner) { // eslint-disable-next-line no-param-reassign schemaPart = inner; } else { break; } } } while (schemaPart.$ref) { // eslint-disable-next-line no-param-reassign schemaPart = this.getSchemaPart(schemaPart.$ref); } let schemaText = `${this.formatSchema(schemaPart, logic)}${needDot ? "." : ""}`; if (schemaPart.description) { schemaText += `\n-> ${schemaPart.description}`; } if (schemaPart.link) { schemaText += `\n-> Read more at ${schemaPart.link}`; } return schemaText; } /** * @param {Schema=} schemaPart * @returns {string} */ getSchemaPartDescription(schemaPart) { if (!schemaPart) { return ""; } while (schemaPart.$ref) { // eslint-disable-next-line no-param-reassign schemaPart = this.getSchemaPart(schemaPart.$ref); } let schemaText = ""; if (schemaPart.description) { schemaText += `\n-> ${schemaPart.description}`; } if (schemaPart.link) { schemaText += `\n-> Read more at ${schemaPart.link}`; } return schemaText; } /** * @param {SchemaUtilErrorObject} error * @returns {string} */ formatValidationError(error) { const { keyword, dataPath: errorDataPath } = error; const dataPath = `${this.baseDataPath}${errorDataPath}`; switch (keyword) { case "type": { const { parentSchema, params } = error; // eslint-disable-next-line default-case switch ( /** @type {import("ajv").TypeParams} */ params.type) { case "number": return `${dataPath} should be a ${this.getSchemaPartText(parentSchema, false, true)}`; case "integer": return `${dataPath} should be an ${this.getSchemaPartText(parentSchema, false, true)}`; case "string": return `${dataPath} should be a ${this.getSchemaPartText(parentSchema, false, true)}`; case "boolean": return `${dataPath} should be a ${this.getSchemaPartText(parentSchema, false, true)}`; case "array": return `${dataPath} should be an array:\n${this.getSchemaPartText(parentSchema)}`; case "object": return `${dataPath} should be an object:\n${this.getSchemaPartText(parentSchema)}`; case "null": return `${dataPath} should be a ${this.getSchemaPartText(parentSchema, false, true)}`; default: return `${dataPath} should be:\n${this.getSchemaPartText(parentSchema)}`; } } case "instanceof": { const { parentSchema } = error; return `${dataPath} should be an instance of ${this.getSchemaPartText(parentSchema, false, true)}`; } case "pattern": { const { params, parentSchema } = error; const { pattern } = /** @type {import("ajv").PatternParams} */ params; return `${dataPath} should match pattern ${JSON.stringify(pattern)}${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`; } case "format": { const { params, parentSchema } = error; const { format } = /** @type {import("ajv").FormatParams} */ params; return `${dataPath} should match format ${JSON.stringify(format)}${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`; } case "formatMinimum": case "formatMaximum": { const { params, parentSchema } = error; const { comparison, limit } = /** @type {import("ajv").ComparisonParams} */ params; return `${dataPath} should be ${comparison} ${JSON.stringify(limit)}${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`; } case "minimum": case "maximum": case "exclusiveMinimum": case "exclusiveMaximum": { const { parentSchema, params } = error; const { comparison, limit } = /** @type {import("ajv").ComparisonParams} */ params; const [, ...hints] = getHints( /** @type {Schema} */ parentSchema, true); if (hints.length === 0) { hints.push(`should be ${comparison} ${limit}`); } return `${dataPath} ${hints.join(" ")}${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`; } case "multipleOf": { const { params, parentSchema } = error; const { multipleOf } = /** @type {import("ajv").MultipleOfParams} */ params; return `${dataPath} should be multiple of ${multipleOf}${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`; } case "patternRequired": { const { params, parentSchema } = error; const { missingPattern } = /** @type {import("ajv").PatternRequiredParams} */ params; return `${dataPath} should have property matching pattern ${JSON.stringify(missingPattern)}${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`; } case "minLength": { const { params, parentSchema } = error; const { limit } = /** @type {import("ajv").LimitParams} */ params; if (limit === 1) { return `${dataPath} should be a non-empty string${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`; } const length = limit - 1; return `${dataPath} should be longer than ${length} character${length > 1 ? "s" : ""}${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`; } case "minItems": { const { params, parentSchema } = error; const { limit } = /** @type {import("ajv").LimitParams} */ params; if (limit === 1) { return `${dataPath} should be a non-empty array${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`; } return `${dataPath} should not have fewer than ${limit} items${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`; } case "minProperties": { const { params, parentSchema } = error; const { limit } = /** @type {import("ajv").LimitParams} */ params; if (limit === 1) { return `${dataPath} should be a non-empty object${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`; } return `${dataPath} should not have fewer than ${limit} properties${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`; } case "maxLength": { const { params, parentSchema } = error; const { limit } = /** @type {import("ajv").LimitParams} */ params; const max = limit + 1; return `${dataPath} should be shorter than ${max} character${max > 1 ? "s" : ""}${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`; } case "maxItems": { const { params, parentSchema } = error; const { limit } = /** @type {import("ajv").LimitParams} */ params; return `${dataPath} should not have more than ${limit} items${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`; } case "maxProperties": { const { params, parentSchema } = error; const { limit } = /** @type {import("ajv").LimitParams} */ params; return `${dataPath} should not have more than ${limit} properties${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`; } case "uniqueItems": { const { params, parentSchema } = error; const { i } = /** @type {import("ajv").UniqueItemsParams} */ params; return `${dataPath} should not contain the item '${error.data[i]}' twice${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`; } case "additionalItems": { const { params, parentSchema } = error; const { limit } = /** @type {import("ajv").LimitParams} */ params; return `${dataPath} should not have more than ${limit} items${getSchemaNonTypes(parentSchema)}. These items are valid:\n${this.getSchemaPartText(parentSchema)}`; } case "contains": { const { parentSchema } = error; return `${dataPath} should contains at least one ${this.getSchemaPartText(parentSchema, ["contains"])} item${getSchemaNonTypes(parentSchema)}.`; } case "required": { const { parentSchema, params } = error; const missingProperty = /** @type {import("ajv").DependenciesParams} */ params.missingProperty.replace(/^\./, ""); const hasProperty = parentSchema && Boolean( /** @type {Schema} */ parentSchema.properties && /** @type {Schema} */ parentSchema.properties[missingProperty]); return `${dataPath} misses the property '${missingProperty}'${getSchemaNonTypes(parentSchema)}.${hasProperty ? ` Should be:\n${this.getSchemaPartText(parentSchema, ["properties", missingProperty])}` : this.getSchemaPartDescription(parentSchema)}`; } case "additionalProperties": { const { params, parentSchema } = error; const { additionalProperty } = /** @type {import("ajv").AdditionalPropertiesParams} */ params; return `${dataPath} has an unknown property '${additionalProperty}'${getSchemaNonTypes(parentSchema)}. These properties are valid:\n${this.getSchemaPartText(parentSchema)}`; } case "dependencies": { const { params, parentSchema } = error; const { property, deps } = /** @type {import("ajv").DependenciesParams} */ params; const dependencies = deps.split(",").map( /** * @param {string} dep * @returns {string} */ dep => `'${dep.trim()}'`).join(", "); return `${dataPath} should have properties ${dependencies} when property '${property}' is present${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`; } case "propertyNames": { const { params, parentSchema, schema } = error; const { propertyName } = /** @type {import("ajv").PropertyNamesParams} */ params; return `${dataPath} property name '${propertyName}' is invalid${getSchemaNonTypes(parentSchema)}. Property names should be match format ${JSON.stringify(schema.format)}.${this.getSchemaPartDescription(parentSchema)}`; } case "enum": { const { parentSchema } = error; if (parentSchema && /** @type {Schema} */ parentSchema.enum && /** @type {Schema} */ parentSchema.enum.length === 1) { return `${dataPath} should be ${this.getSchemaPartText(parentSchema, false, true)}`; } return `${dataPath} should be one of these:\n${this.getSchemaPartText(parentSchema)}`; } case "const": { const { parentSchema } = error; return `${dataPath} should be equal to constant ${this.getSchemaPartText(parentSchema, false, true)}`; } case "not": { const postfix = likeObject( /** @type {Schema} */ error.parentSchema) ? `\n${this.getSchemaPartText(error.parentSchema)}` : ""; const schemaOutput = this.getSchemaPartText(error.schema, false, false, false); if (canApplyNot(error.schema)) { return `${dataPath} should be any ${schemaOutput}${postfix}.`; } const { schema, parentSchema } = error; return `${dataPath} should not be ${this.getSchemaPartText(schema, false, true)}${parentSchema && likeObject(parentSchema) ? `\n${this.getSchemaPartText(parentSchema)}` : ""}`; } case "oneOf": case "anyOf": { const { parentSchema, children } = error; if (children && children.length > 0) { if (error.schema.length === 1) { const lastChild = children[children.length - 1]; const remainingChildren = children.slice(0, children.length - 1); return this.formatValidationError(Object.assign({}, lastChild, { children: remainingChildren, parentSchema: Object.assign({}, parentSchema, lastChild.parentSchema) })); } let filteredChildren = filterChildren(children); if (filteredChildren.length === 1) { return this.formatValidationError(filteredChildren[0]); } filteredChildren = groupChildrenByFirstChild(filteredChildren); return `${dataPath} should be one of these:\n${this.getSchemaPartText(parentSchema)}\nDetails:\n${filteredChildren.map( /** * @param {SchemaUtilErrorObject} nestedError * @returns {string} */ nestedError => ` * ${indent(this.formatValidationError(nestedError), " ")}`).join("\n")}`; } return `${dataPath} should be one of these:\n${this.getSchemaPartText(parentSchema)}`; } case "if": { const { params, parentSchema } = error; const { failingKeyword } = /** @type {import("ajv").IfParams} */ params; return `${dataPath} should match "${failingKeyword}" schema:\n${this.getSchemaPartText(parentSchema, [failingKeyword])}`; } case "absolutePath": { const { message, parentSchema } = error; return `${dataPath}: ${message}${this.getSchemaPartDescription(parentSchema)}`; } /* istanbul ignore next */ default: { const { message, parentSchema } = error; const ErrorInJSON = JSON.stringify(error, null, 2); // For `custom`, `false schema`, `$ref` keywords // Fallback for unknown keywords return `${dataPath} ${message} (${ErrorInJSON}).\n${this.getSchemaPartText(parentSchema, false)}`; } } } /** * @param {Array} errors * @returns {string} */ formatValidationErrors(errors) { return errors.map(error => { let formattedError = this.formatValidationError(error); if (this.postFormatter) { formattedError = this.postFormatter(formattedError, error); } return ` - ${indent(formattedError, " ")}`; }).join("\n"); } } var _default = ValidationError; exports.default = _default;PK>[c//!node_modules/schema-utils/LICENSEnuW+ACopyright 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. PK>[f  &node_modules/schema-utils/package.jsonnuW+A{ "name": "schema-utils", "version": "3.1.1", "description": "webpack Validation Utils", "license": "MIT", "repository": "webpack/schema-utils", "author": "webpack Contrib (https://github.com/webpack-contrib)", "homepage": "https://github.com/webpack/schema-utils", "bugs": "https://github.com/webpack/schema-utils/issues", "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "main": "dist/index.js", "types": "declarations/index.d.ts", "engines": { "node": ">= 10.13.0" }, "scripts": { "start": "npm run build -- -w", "clean": "del-cli dist declarations", "prebuild": "npm run clean", "build:types": "tsc --declaration --emitDeclarationOnly --outDir declarations && prettier \"declarations/**/*.ts\" --write", "build:code": "cross-env NODE_ENV=production babel src -d dist --copy-files", "build": "npm-run-all -p \"build:**\"", "commitlint": "commitlint --from=master", "security": "npm audit --production", "fmt:check": "prettier \"{**/*,*}.{js,json,md,yml,css,ts}\" --list-different", "lint:js": "eslint --cache .", "lint:types": "tsc --pretty --noEmit", "lint": "npm-run-all lint:js lint:types fmt:check", "fmt": "npm run fmt:check -- --write", "fix:js": "npm run lint:js -- --fix", "fix": "npm-run-all fix:js fmt", "test:only": "cross-env NODE_ENV=test jest", "test:watch": "npm run test:only -- --watch", "test:coverage": "npm run test:only -- --collectCoverageFrom=\"src/**/*.js\" --coverage", "pretest": "npm run lint", "test": "npm run test:coverage", "prepare": "npm run build && husky install", "release": "standard-version" }, "files": [ "dist", "declarations" ], "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, "devDependencies": { "@babel/cli": "^7.14.3", "@babel/core": "^7.14.6", "@babel/preset-env": "^7.14.7", "@commitlint/cli": "^12.1.4", "@commitlint/config-conventional": "^12.1.4", "@webpack-contrib/eslint-config-webpack": "^3.0.0", "babel-jest": "^27.0.6", "cross-env": "^7.0.3", "del": "^6.0.0", "del-cli": "^3.0.1", "eslint": "^7.31.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-import": "^2.23.4", "husky": "^6.0.0", "jest": "^27.0.6", "lint-staged": "^11.0.1", "npm-run-all": "^4.1.5", "prettier": "^2.3.2", "standard-version": "^9.3.1", "typescript": "^4.3.5", "webpack": "^5.45.1" }, "keywords": [ "webpack" ] } PK>[1 dist/index.jsnuW+A"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = loader; exports.raw = void 0; var _path = _interopRequireDefault(require("path")); var _loaderUtils = require("loader-utils"); var _schemaUtils = require("schema-utils"); var _options = _interopRequireDefault(require("./options.json")); var _utils = require("./utils"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function loader(content) { const options = (0, _loaderUtils.getOptions)(this); (0, _schemaUtils.validate)(_options.default, options, { name: 'File Loader', baseDataPath: 'options' }); const context = options.context || this.rootContext; const name = options.name || '[contenthash].[ext]'; const url = (0, _loaderUtils.interpolateName)(this, name, { context, content, regExp: options.regExp }); let outputPath = url; if (options.outputPath) { if (typeof options.outputPath === 'function') { outputPath = options.outputPath(url, this.resourcePath, context); } else { outputPath = _path.default.posix.join(options.outputPath, url); } } let publicPath = `__webpack_public_path__ + ${JSON.stringify(outputPath)}`; if (options.publicPath) { if (typeof options.publicPath === 'function') { publicPath = options.publicPath(url, this.resourcePath, context); } else { publicPath = `${options.publicPath.endsWith('/') ? options.publicPath : `${options.publicPath}/`}${url}`; } publicPath = JSON.stringify(publicPath); } if (options.postTransformPublicPath) { publicPath = options.postTransformPublicPath(publicPath); } if (typeof options.emitFile === 'undefined' || options.emitFile) { const assetInfo = {}; if (typeof name === 'string') { let normalizedName = name; const idx = normalizedName.indexOf('?'); if (idx >= 0) { normalizedName = normalizedName.substr(0, idx); } const isImmutable = /\[([^:\]]+:)?(hash|contenthash)(:[^\]]+)?]/gi.test(normalizedName); if (isImmutable === true) { assetInfo.immutable = true; } } assetInfo.sourceFilename = (0, _utils.normalizePath)(_path.default.relative(this.rootContext, this.resourcePath)); this.emitFile(outputPath, content, null, assetInfo); } const esModule = typeof options.esModule !== 'undefined' ? options.esModule : true; return `${esModule ? 'export default' : 'module.exports ='} ${publicPath};`; } const raw = true; exports.raw = raw;PK>[Utt dist/cjs.jsnuW+A"use strict"; const loader = require('./index'); module.exports = loader.default; module.exports.raw = loader.raw;PK>[ 44 dist/utils.jsnuW+A"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.normalizePath = normalizePath; function normalizePath(path, stripTrailing) { if (path === '\\' || path === '/') { return '/'; } const len = path.length; if (len <= 1) { return path; } // ensure that win32 namespaces has two leading slashes, so that the path is // handled properly by the win32 version of path.parse() after being normalized // https://msdn.microsoft.com/library/windows/desktop/aa365247(v=vs.85).aspx#namespaces let prefix = ''; if (len > 4 && path[3] === '\\') { // eslint-disable-next-line prefer-destructuring const ch = path[2]; if ((ch === '?' || ch === '.') && path.slice(0, 2) === '\\\\') { // eslint-disable-next-line no-param-reassign path = path.slice(2); prefix = '//'; } } const segs = path.split(/[/\\]+/); if (stripTrailing !== false && segs[segs.length - 1] === '') { segs.pop(); } return prefix + segs.join('/'); } // eslint-disable-next-line import/prefer-default-exportPK>['_dist/options.jsonnuW+A{ "additionalProperties": true, "properties": { "name": { "description": "The filename template for the target file(s) (https://github.com/webpack-contrib/file-loader#name).", "anyOf": [ { "type": "string" }, { "instanceof": "Function" } ] }, "outputPath": { "description": "A filesystem path where the target file(s) will be placed (https://github.com/webpack-contrib/file-loader#outputpath).", "anyOf": [ { "type": "string" }, { "instanceof": "Function" } ] }, "publicPath": { "description": "A custom public path for the target file(s) (https://github.com/webpack-contrib/file-loader#publicpath).", "anyOf": [ { "type": "string" }, { "instanceof": "Function" } ] }, "postTransformPublicPath": { "description": "A custom transformation function for post-processing the publicPath (https://github.com/webpack-contrib/file-loader#posttransformpublicpath).", "instanceof": "Function" }, "context": { "description": "A custom file context (https://github.com/webpack-contrib/file-loader#context).", "type": "string" }, "emitFile": { "description": "Enables/Disables emit files (https://github.com/webpack-contrib/file-loader#emitfile).", "type": "boolean" }, "regExp": { "description": "A Regular Expression to one or many parts of the target file path. The capture groups can be reused in the name property using [N] placeholder (https://github.com/webpack-contrib/file-loader#regexp).", "anyOf": [ { "type": "string" }, { "instanceof": "RegExp" } ] }, "esModule": { "description": "By default, file-loader generates JS modules that use the ES modules syntax.", "type": "boolean" } }, "type": "object" } PK>[3sg4g4 CHANGELOG.mdnuW+A# Changelog All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. ## [6.2.0](https://github.com/webpack-contrib/file-loader/compare/v6.1.1...v6.2.0) (2020-10-27) ### Features * added the `sourceFilename` property to asset info with original filename ([#393](https://github.com/webpack-contrib/file-loader/issues/393)) ([654e0d6](https://github.com/webpack-contrib/file-loader/commit/654e0d641ec067089f6a2d12e30ec3520f00d808)) ### Bug Fixes * immutable flag when the `name` option have hash in query string ([#392](https://github.com/webpack-contrib/file-loader/issues/392)) ([381d8bd](https://github.com/webpack-contrib/file-loader/commit/381d8bda3f2494487bfe840386e365b97b6025fe)) ### [6.1.1](https://github.com/webpack-contrib/file-loader/compare/v6.1.0...v6.1.1) (2020-10-09) ### Chore * update `schema-utils` ## [6.1.0](https://github.com/webpack-contrib/file-loader/compare/v6.0.0...v6.1.0) (2020-08-31) ### Features * pass immutable flag to asset info ([#383](https://github.com/webpack-contrib/file-loader/issues/383)) ([40fcde8](https://github.com/webpack-contrib/file-loader/commit/40fcde81681d4f8ee19d2ee3845fd34e24459195)) ## [6.0.0](https://github.com/webpack-contrib/file-loader/compare/v5.1.0...v6.0.0) (2020-03-17) ### ⚠ BREAKING CHANGES * use `md4` by default for hashing ([#369](https://github.com/webpack-contrib/file-loader/issues/369)) ([ad39022](https://github.com/webpack-contrib/file-loader/commit/ad3902284d28adeddf667212a39faa4c6bfb2964)) ## [5.1.0](https://github.com/webpack-contrib/file-loader/compare/v5.0.2...v5.1.0) (2020-02-19) ### Features * support the `query` template for the `name` option ([#366](https://github.com/webpack-contrib/file-loader/issues/366)) ([cd8698b](https://github.com/webpack-contrib/file-loader/commit/cd8698b1d9fd560d85e912acca9a1e24f00e18f8)) ### [5.0.2](https://github.com/webpack-contrib/file-loader/compare/v5.0.1...v5.0.2) (2019-11-25) ### Chore * add the `funding` field in `package.json` ### [5.0.1](https://github.com/webpack-contrib/file-loader/compare/v5.0.0...v5.0.1) (2019-11-25) ### Bug Fixes * name of `esModule` option in source code ([#346](https://github.com/webpack-contrib/file-loader/issues/346)) ([31d6589](https://github.com/webpack-contrib/file-loader/commit/31d6589b71b471f83908e80380dff9b9eada2d06)) ## [5.0.0](https://github.com/webpack-contrib/file-loader/compare/v4.2.0...v5.0.0) (2019-11-22) ### BREAKING CHANGES * minimum required nodejs version is `10.13.0` * rename the `esModules` option to `esModule` * switch to ES modules by default (the option `esModule` is `true` by default) ## [4.3.0](https://github.com/webpack-contrib/file-loader/compare/v4.2.0...v4.3.0) (2019-11-21) ### Features * new `esModules` option to output ES modules ([#340](https://github.com/webpack-contrib/file-loader/issues/340)) ([9b9cd8d](https://github.com/webpack-contrib/file-loader/commit/9b9cd8d22b3dbe4677be9bdd0bf5fbe07815df54)) ## [4.2.0](https://github.com/webpack-contrib/file-loader/compare/v4.1.0...v4.2.0) (2019-08-07) ### Features * `postTransformPublicPath` option ([#334](https://github.com/webpack-contrib/file-loader/issues/334)) ([c136f44](https://github.com/webpack-contrib/file-loader/commit/c136f44)) ## [4.1.0](https://github.com/webpack-contrib/file-loader/compare/v4.0.0...v4.1.0) (2019-07-18) ### Features * improved validation error messages ([#339](https://github.com/webpack-contrib/file-loader/issues/339)) ([705eed4](https://github.com/webpack-contrib/file-loader/commit/705eed4)) ## [4.0.0](https://github.com/webpack-contrib/file-loader/compare/v3.0.1...v4.0.0) (2019-06-05) ### chore * **deps:** update ([#333](https://github.com/webpack-contrib/file-loader/issues/333)) ([0d2f9b8](https://github.com/webpack-contrib/file-loader/commit/0d2f9b8)) ### BREAKING CHANGES * **deps:** minimum required nodejs version is `8.9.0` ## [3.0.1](https://github.com/webpack-contrib/file-loader/compare/v3.0.0...v3.0.1) (2018-12-20) ### Bug Fixes * relax options validation for additional properties ([#309](https://github.com/webpack-contrib/file-loader/issues/309)) ([c74d44e](https://github.com/webpack-contrib/file-loader/commit/c74d44e)) # [3.0.0](https://github.com/webpack-contrib/file-loader/compare/v2.0.0...v3.0.0) (2018-12-20) ### Code Refactoring * drop support for webpack < 4 ([#303](https://github.com/webpack-contrib/file-loader/issues/303)) ([203a4ee](https://github.com/webpack-contrib/file-loader/commit/203a4ee)) * more validations in `options` schema ### Features * `resourcePath` is now available in `outputPath` and `publicPath` ([#304](https://github.com/webpack-contrib/file-loader/issues/304)) ([0d66e64](https://github.com/webpack-contrib/file-loader/commit/0d66e64)) * `context` is now available in `outputPath` and `publicPath` ([#305](https://github.com/webpack-contrib/file-loader/issues/305)) ([d5eb823](https://github.com/webpack-contrib/file-loader/commit/d5eb823)) ### BREAKING CHANGES * removed the `useRelativePath` option. It is dangerously and break url when you use multiple entry points. * drop support for webpack < 4 # [2.0.0](https://github.com/webpack-contrib/file-loader/compare/v1.1.11...v2.0.0) (2018-08-21) ### Code Refactoring * **defaults:** update to latest webpack-defaults ([#268](https://github.com/webpack-contrib/file-loader/issues/268)) ([687f422](https://github.com/webpack-contrib/file-loader/commit/687f422)) ### BREAKING CHANGES * **defaults:** Enforces `engines` of `"node": ">=6.9.0 < 7.0.0 || >= 8.9.0"` ## [1.1.11](https://github.com/webpack/file-loader/compare/v1.1.10...v1.1.11) (2018-03-01) ### Reverts * **index:** `context` takes precedence over `issuer.context` (`options.useRelativePath`) ([#260](https://github.com/webpack/file-loader/issues/260)) ([e73131f](https://github.com/webpack/file-loader/commit/e73131f)) ## [1.1.10](https://github.com/webpack/file-loader/compare/v1.1.9...v1.1.10) (2018-02-26) ### Bug Fixes * **package:** add `webpack >= 4` (`peerDependencies`) ([#255](https://github.com/webpack/file-loader/issues/255)) ([3a6a7a1](https://github.com/webpack/file-loader/commit/3a6a7a1)) ## [1.1.9](https://github.com/webpack/file-loader/compare/v1.1.8...v1.1.9) (2018-02-21) ### Bug Fixes * **index:** handle protocol URL's correctly (`options.publicPath`) ([#253](https://github.com/webpack/file-loader/issues/253)) ([54fa5a3](https://github.com/webpack/file-loader/commit/54fa5a3)) * **index:** use `path.posix` for platform consistency ([#254](https://github.com/webpack/file-loader/issues/254)) ([2afe0af](https://github.com/webpack/file-loader/commit/2afe0af)) ## [1.1.8](https://github.com/webpack/file-loader/compare/v1.1.7...v1.1.8) (2018-02-20) ### Bug Fixes * **index:** `context` takes precedence over `issuer.context` (`options.useRelativePath`) ([3b071f5](https://github.com/webpack/file-loader/commit/3b071f5)) * **index:** don't append `outputPath` to the original `url` (`options.outputPath` `{Function}`) ([4c1ccaa](https://github.com/webpack/file-loader/commit/4c1ccaa)) * **index:** normalize and concat paths via `path.join()` ([26e47ca](https://github.com/webpack/file-loader/commit/26e47ca)) ## [1.1.7](https://github.com/webpack/file-loader/compare/v1.1.6...v1.1.7) (2018-02-19) ### Bug Fixes * **index:** don't concat `options.outputPath` and `options.publicPath` ([#246](https://github.com/webpack/file-loader/issues/246)) ([98bf052](https://github.com/webpack/file-loader/commit/98bf052)) ## [1.1.6](https://github.com/webpack/file-loader/compare/v1.1.5...v1.1.6) (2017-12-16) ### Bug Fixes * rootContext compatibility fix for legacy / v4 (#237) ([1e4b7cf](https://github.com/webpack/file-loader/commit/1e4b7cf)), closes [#237](https://github.com/webpack/file-loader/issues/237) ## [1.1.5](https://github.com/webpack/file-loader/compare/v1.1.4...v1.1.5) (2017-10-05) ### Bug Fixes * **schema:** allow `name` to be a `{Function}` (`options.name`) ([#216](https://github.com/webpack/file-loader/issues/216)) ([fbfb160](https://github.com/webpack/file-loader/commit/fbfb160)) ## [1.1.4](https://github.com/webpack/file-loader/compare/v1.1.3...v1.1.4) (2017-09-30) ### Bug Fixes * **index:** revert to CJS exports ([#212](https://github.com/webpack/file-loader/issues/212)) ([f412b3e](https://github.com/webpack/file-loader/commit/f412b3e)) ## [1.1.3](https://github.com/webpack/file-loader/compare/v1.1.2...v1.1.3) (2017-09-30) ## [1.1.2](https://github.com/webpack/file-loader/compare/v1.1.1...v1.1.2) (2017-09-30) ### Bug Fixes * **cjs:** export `raw` value ([#183](https://github.com/webpack/file-loader/issues/183)) ([daeff0e](https://github.com/webpack/file-loader/commit/daeff0e)) ## [1.1.1](https://github.com/webpack/file-loader/compare/v1.1.0...v1.1.1) (2017-09-30) ### Bug Fixes * **schema:** allow `additionalProperties` ([#207](https://github.com/webpack/file-loader/issues/207)) ([cf7c85a](https://github.com/webpack/file-loader/commit/cf7c85a)) # [1.1.0](https://github.com/webpack/file-loader/compare/v1.0.0...v1.1.0) (2017-09-29) ### Features * add `options` validation (`schema-utils`) ([#184](https://github.com/webpack/file-loader/issues/184)) ([696ca77](https://github.com/webpack/file-loader/commit/696ca77)) # [1.0.0](https://github.com/webpack/file-loader/compare/v1.0.0-rc.0...v1.0.0) (2017-07-26) ### Bug Fixes * remove `=` from default export (`SyntaxError`) ([#178](https://github.com/webpack/file-loader/issues/178)) ([3fe2d12](https://github.com/webpack/file-loader/commit/3fe2d12)) ### Code Refactoring * Upgrade to defaults 1.3.0 ([#170](https://github.com/webpack-contrib/file-loader/pull/170)) ([632ed72](https://github.com/webpack/file-loader/commit/acd6c2f)) * Apply webpack-defaults ([#167](https://github.com/webpack/file-loader/issues/167)) ([632ed72](https://github.com/webpack/file-loader/commit/632ed72)) ### BREAKING CHANGES * Enforces Webpack standard NodeJS engines range. at the time of merge `>= 4.3 < 5.0.0 || >= 5.10`. # [1.0.0-rc.0](https://github.com/webpack/file-loader/compare/v1.0.0-beta.1...v1.0.0-rc.0) (2017-07-26) ### Bug Fixes * remove `=` from default export (`SyntaxError`) ([#178](https://github.com/webpack/file-loader/issues/178)) ([3fe2d12](https://github.com/webpack/file-loader/commit/3fe2d12)) # [1.0.0-beta.1](https://github.com/webpack/file-loader/compare/v1.0.0-beta.0...v1.0.0-beta.1) (2017-06-09) ### Code Refactoring * Upgrade to defaults 1.3.0 ([#170](https://github.com/webpack-contrib/file-loader/pull/170)) ([632ed72](https://github.com/webpack/file-loader/commit/acd6c2f)) # [1.0.0-beta.0](https://github.com/webpack/file-loader/compare/v0.11.2...v1.0.0-beta.0) (2017-06-07) ### Code Refactoring * Apply webpack-defaults ([#167](https://github.com/webpack/file-loader/issues/167)) ([632ed72](https://github.com/webpack/file-loader/commit/632ed72)) ### BREAKING CHANGES * Enforces Webpack standard NodeJS engines range. at the time of merge `>= 4.3 < 5.0.0 || >= 5.10`. ## [0.11.2](https://github.com/webpack/file-loader/compare/v0.11.1...v0.11.2) (2017-06-05) ### Bug Fixes * **index:** allow to override publicPath with an empty string ([#145](https://github.com/webpack/file-loader/issues/145)) ([26ab81a](https://github.com/webpack/file-loader/commit/26ab81a)) * init `publicPath` to undefined ([#159](https://github.com/webpack/file-loader/issues/159)) ([e4c0b2a](https://github.com/webpack/file-loader/commit/e4c0b2a)) ## [0.11.1](https://github.com/webpack/file-loader/compare/v0.11.0...v0.11.1) (2017-04-01) ### Bug Fixes * outputPath function overriden by useRelativePath ([#139](https://github.com/webpack/file-loader/issues/139)) ([80cdee2](https://github.com/webpack/file-loader/commit/80cdee2)) # [0.11.0](https://github.com/webpack/file-loader/compare/v0.10.1...v0.11.0) (2017-03-31) ### Features * Emit files with relative urls ([#135](https://github.com/webpack/file-loader/issues/135)) ([dbcd6cc](https://github.com/webpack/file-loader/commit/dbcd6cc)) ## [0.10.1](https://github.com/webpack/file-loader/compare/v0.10.0...v0.10.1) (2017-02-25) ### Bug Fixes * **getOptions:** deprecation warn in loaderUtils ([#129](https://github.com/webpack/file-loader/issues/129)) ([a8358a0](https://github.com/webpack/file-loader/commit/a8358a0)) # [0.10.0](https://github.com/webpack/file-loader/compare/v0.9.0...v0.10.0) (2017-01-28) ### Features * **resources:** specify custom public file name ([6833c70](https://github.com/webpack/file-loader/commit/6833c70)) # Change Log All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. PK>[c//LICENSEnuW+ACopyright 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. PK>[ǘ! package.jsonnuW+A{ "name": "file-loader", "version": "6.2.0", "description": "A file loader module for webpack", "license": "MIT", "repository": "webpack-contrib/file-loader", "author": "Tobias Koppers @sokra", "homepage": "https://github.com/webpack-contrib/file-loader", "bugs": "https://github.com/webpack-contrib/file-loader/issues", "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "main": "dist/cjs.js", "engines": { "node": ">= 10.13.0" }, "scripts": { "start": "npm run build -- -w", "clean": "del-cli dist", "prebuild": "npm run clean", "build": "cross-env NODE_ENV=production babel src -d dist --copy-files", "commitlint": "commitlint --from=master", "security": "npm audit", "lint:prettier": "prettier --list-different .", "lint:js": "eslint --cache .", "lint": "npm-run-all -l -p \"lint:**\"", "test:only": "cross-env NODE_ENV=test jest", "test:watch": "npm run test:only -- --watch", "test:coverage": "npm run test:only -- --collectCoverageFrom=\"src/**/*.js\" --coverage", "pretest": "npm run lint", "test": "npm run test:coverage", "prepare": "npm run build", "release": "standard-version", "defaults": "webpack-defaults" }, "files": [ "dist" ], "peerDependencies": { "webpack": "^4.0.0 || ^5.0.0" }, "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" }, "devDependencies": { "@babel/cli": "^7.11.6", "@babel/core": "^7.11.6", "@babel/preset-env": "^7.11.5", "@commitlint/cli": "^11.0.0", "@commitlint/config-conventional": "^11.0.0", "@webpack-contrib/defaults": "^6.3.0", "@webpack-contrib/eslint-config-webpack": "^3.0.0", "babel-jest": "^26.5.2", "cross-env": "^7.0.2", "del": "^6.0.0", "del-cli": "^3.0.1", "eslint": "^7.10.0", "eslint-config-prettier": "^6.12.0", "eslint-plugin-import": "^2.22.1", "husky": "^4.3.0", "jest": "^26.5.2", "lint-staged": "^10.4.0", "memfs": "^3.2.0", "npm-run-all": "^4.1.5", "prettier": "^2.1.2", "standard-version": "^9.0.0", "url-loader": "^4.1.0", "webpack": "^4.44.2" }, "keywords": [ "webpack" ] } PK>[8$ (=(= README.mdnuW+APK>[b#a=node_modules/schema-utils/README.mdnuW+APK>[fEEATnode_modules/schema-utils/declarations/keywords/absolutePath.d.tsnuW+APK>[n%6Vnode_modules/schema-utils/declarations/util/hints.d.tsnuW+APK>[ַ`  6Wnode_modules/schema-utils/declarations/util/Range.d.tsnuW+APK>[64#anode_modules/schema-utils/declarations/validate.d.tsnuW+APK>[o;rfnode_modules/schema-utils/declarations/ValidationError.d.tsnuW+APK>[,]&{{1onode_modules/schema-utils/declarations/index.d.tsnuW+APK>[K 'cpnode_modules/schema-utils/dist/index.jsnuW+APK>[jx*>qnode_modules/schema-utils/dist/validate.jsnuW+APK>[Uc/5s s 7node_modules/schema-utils/dist/keywords/absolutePath.jsnuW+APK>[=,node_modules/schema-utils/dist/util/Range.jsnuW+APK>[;>K ,ƛnode_modules/schema-utils/dist/util/hints.jsnuW+APK>[__1ŧnode_modules/schema-utils/dist/ValidationError.jsnuW+APK>[c//!6node_modules/schema-utils/LICENSEnuW+APK>[f  &;node_modules/schema-utils/package.jsonnuW+APK>[1 xEdist/index.jsnuW+APK>[Utt Odist/cjs.jsnuW+APK>[ 44 aPdist/utils.jsnuW+APK>['_Tdist/options.jsonnuW+APK>[3sg4g4 \CHANGELOG.mdnuW+APK>[c//LICENSEnuW+APK>[ǘ! package.jsonnuW+APK