init
This commit is contained in:
		
							
								
								
									
										36
									
								
								node_modules/@rushstack/node-core-library/lib/AlreadyReportedError.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								node_modules/@rushstack/node-core-library/lib/AlreadyReportedError.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,36 @@
 | 
			
		||||
/**
 | 
			
		||||
 * This exception can be thrown to indicate that an operation failed and an error message has already
 | 
			
		||||
 * been reported appropriately. Thus, the catch handler does not have responsibility for reporting
 | 
			
		||||
 * the error.
 | 
			
		||||
 *
 | 
			
		||||
 * @remarks
 | 
			
		||||
 * For example, suppose a tool writes interactive output to `console.log()`.  When an exception is thrown,
 | 
			
		||||
 * the `catch` handler will typically provide simplistic reporting such as this:
 | 
			
		||||
 *
 | 
			
		||||
 * ```ts
 | 
			
		||||
 * catch (error) {
 | 
			
		||||
 *   console.log("ERROR: " + error.message);
 | 
			
		||||
 * }
 | 
			
		||||
 * ```
 | 
			
		||||
 *
 | 
			
		||||
 * Suppose that the code performing the operation normally prints rich output to the console.  It may be able to
 | 
			
		||||
 * present an error message more nicely (for example, as part of a table, or structured log format).  Throwing
 | 
			
		||||
 * `AlreadyReportedError` provides a way to use exception handling to abort the operation, but instruct the `catch`
 | 
			
		||||
 * handler not to print an error a second time:
 | 
			
		||||
 *
 | 
			
		||||
 * ```ts
 | 
			
		||||
 * catch (error) {
 | 
			
		||||
 *   if (error instanceof AlreadyReportedError) {
 | 
			
		||||
 *     return;
 | 
			
		||||
 *   }
 | 
			
		||||
 *   console.log("ERROR: " + error.message);
 | 
			
		||||
 * }
 | 
			
		||||
 * ```
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export declare class AlreadyReportedError extends Error {
 | 
			
		||||
    constructor();
 | 
			
		||||
    static [Symbol.hasInstance](instance: object): boolean;
 | 
			
		||||
}
 | 
			
		||||
//# sourceMappingURL=AlreadyReportedError.d.ts.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/AlreadyReportedError.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/AlreadyReportedError.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"AlreadyReportedError.d.ts","sourceRoot":"","sources":["../src/AlreadyReportedError.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;;WAW/B,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;CAG9D"}
 | 
			
		||||
							
								
								
									
										54
									
								
								node_modules/@rushstack/node-core-library/lib/AlreadyReportedError.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								node_modules/@rushstack/node-core-library/lib/AlreadyReportedError.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,54 @@
 | 
			
		||||
"use strict";
 | 
			
		||||
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 | 
			
		||||
// See LICENSE in the project root for license information.
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.AlreadyReportedError = void 0;
 | 
			
		||||
const TypeUuid_1 = require("./TypeUuid");
 | 
			
		||||
const uuidAlreadyReportedError = 'f26b0640-a49b-49d1-9ead-1a516d5920c7';
 | 
			
		||||
/**
 | 
			
		||||
 * This exception can be thrown to indicate that an operation failed and an error message has already
 | 
			
		||||
 * been reported appropriately. Thus, the catch handler does not have responsibility for reporting
 | 
			
		||||
 * the error.
 | 
			
		||||
 *
 | 
			
		||||
 * @remarks
 | 
			
		||||
 * For example, suppose a tool writes interactive output to `console.log()`.  When an exception is thrown,
 | 
			
		||||
 * the `catch` handler will typically provide simplistic reporting such as this:
 | 
			
		||||
 *
 | 
			
		||||
 * ```ts
 | 
			
		||||
 * catch (error) {
 | 
			
		||||
 *   console.log("ERROR: " + error.message);
 | 
			
		||||
 * }
 | 
			
		||||
 * ```
 | 
			
		||||
 *
 | 
			
		||||
 * Suppose that the code performing the operation normally prints rich output to the console.  It may be able to
 | 
			
		||||
 * present an error message more nicely (for example, as part of a table, or structured log format).  Throwing
 | 
			
		||||
 * `AlreadyReportedError` provides a way to use exception handling to abort the operation, but instruct the `catch`
 | 
			
		||||
 * handler not to print an error a second time:
 | 
			
		||||
 *
 | 
			
		||||
 * ```ts
 | 
			
		||||
 * catch (error) {
 | 
			
		||||
 *   if (error instanceof AlreadyReportedError) {
 | 
			
		||||
 *     return;
 | 
			
		||||
 *   }
 | 
			
		||||
 *   console.log("ERROR: " + error.message);
 | 
			
		||||
 * }
 | 
			
		||||
 * ```
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
class AlreadyReportedError extends Error {
 | 
			
		||||
    constructor() {
 | 
			
		||||
        super('An error occurred.');
 | 
			
		||||
        // Manually set the prototype, as we can no longer extend built-in classes like Error, Array, Map, etc
 | 
			
		||||
        // [https://github.com/microsoft/TypeScript-wiki/blob/main/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work](https://github.com/microsoft/TypeScript-wiki/blob/main/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work)
 | 
			
		||||
        //
 | 
			
		||||
        // Note: the prototype must also be set on any classes which extend this one
 | 
			
		||||
        this.__proto__ = AlreadyReportedError.prototype; // eslint-disable-line @typescript-eslint/no-explicit-any
 | 
			
		||||
    }
 | 
			
		||||
    static [Symbol.hasInstance](instance) {
 | 
			
		||||
        return TypeUuid_1.TypeUuid.isInstanceOf(instance, uuidAlreadyReportedError);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
exports.AlreadyReportedError = AlreadyReportedError;
 | 
			
		||||
TypeUuid_1.TypeUuid.registerClass(AlreadyReportedError, uuidAlreadyReportedError);
 | 
			
		||||
//# sourceMappingURL=AlreadyReportedError.js.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/AlreadyReportedError.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/AlreadyReportedError.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"AlreadyReportedError.js","sourceRoot":"","sources":["../src/AlreadyReportedError.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,yCAAsC;AAEtC,MAAM,wBAAwB,GAAW,sCAAsC,CAAC;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAa,oBAAqB,SAAQ,KAAK;IAC7C;QACE,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAE5B,sGAAsG;QACtG,2RAA2R;QAC3R,EAAE;QACF,4EAA4E;QAC3E,IAAY,CAAC,SAAS,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC,yDAAyD;IACrH,CAAC;IAEM,MAAM,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,QAAgB;QACjD,OAAO,mBAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,wBAAwB,CAAC,CAAC;IACnE,CAAC;CACF;AAdD,oDAcC;AAED,mBAAQ,CAAC,aAAa,CAAC,oBAAoB,EAAE,wBAAwB,CAAC,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport { TypeUuid } from './TypeUuid';\n\nconst uuidAlreadyReportedError: string = 'f26b0640-a49b-49d1-9ead-1a516d5920c7';\n\n/**\n * This exception can be thrown to indicate that an operation failed and an error message has already\n * been reported appropriately. Thus, the catch handler does not have responsibility for reporting\n * the error.\n *\n * @remarks\n * For example, suppose a tool writes interactive output to `console.log()`.  When an exception is thrown,\n * the `catch` handler will typically provide simplistic reporting such as this:\n *\n * ```ts\n * catch (error) {\n *   console.log(\"ERROR: \" + error.message);\n * }\n * ```\n *\n * Suppose that the code performing the operation normally prints rich output to the console.  It may be able to\n * present an error message more nicely (for example, as part of a table, or structured log format).  Throwing\n * `AlreadyReportedError` provides a way to use exception handling to abort the operation, but instruct the `catch`\n * handler not to print an error a second time:\n *\n * ```ts\n * catch (error) {\n *   if (error instanceof AlreadyReportedError) {\n *     return;\n *   }\n *   console.log(\"ERROR: \" + error.message);\n * }\n * ```\n *\n * @public\n */\nexport class AlreadyReportedError extends Error {\n  public constructor() {\n    super('An error occurred.');\n\n    // Manually set the prototype, as we can no longer extend built-in classes like Error, Array, Map, etc\n    // [https://github.com/microsoft/TypeScript-wiki/blob/main/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work](https://github.com/microsoft/TypeScript-wiki/blob/main/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work)\n    //\n    // Note: the prototype must also be set on any classes which extend this one\n    (this as any).__proto__ = AlreadyReportedError.prototype; // eslint-disable-line @typescript-eslint/no-explicit-any\n  }\n\n  public static [Symbol.hasInstance](instance: object): boolean {\n    return TypeUuid.isInstanceOf(instance, uuidAlreadyReportedError);\n  }\n}\n\nTypeUuid.registerClass(AlreadyReportedError, uuidAlreadyReportedError);\n"]}
 | 
			
		||||
							
								
								
									
										106
									
								
								node_modules/@rushstack/node-core-library/lib/Async.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								node_modules/@rushstack/node-core-library/lib/Async.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,106 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Options for controlling the parallelism of asynchronous operations.
 | 
			
		||||
 *
 | 
			
		||||
 * @remarks
 | 
			
		||||
 * Used with {@link Async.mapAsync} and {@link Async.forEachAsync}.
 | 
			
		||||
 *
 | 
			
		||||
 * @beta
 | 
			
		||||
 */
 | 
			
		||||
export interface IAsyncParallelismOptions {
 | 
			
		||||
    /**
 | 
			
		||||
     * Optionally used with the  {@link Async.mapAsync} and {@link Async.forEachAsync}
 | 
			
		||||
     * to limit the maximum number of concurrent promises to the specified number.
 | 
			
		||||
     */
 | 
			
		||||
    concurrency?: number;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * @remarks
 | 
			
		||||
 * Used with {@link Async.runWithRetriesAsync}.
 | 
			
		||||
 *
 | 
			
		||||
 * @beta
 | 
			
		||||
 */
 | 
			
		||||
export interface IRunWithRetriesOptions<TResult> {
 | 
			
		||||
    action: () => Promise<TResult> | TResult;
 | 
			
		||||
    maxRetries: number;
 | 
			
		||||
    retryDelayMs?: number;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * Utilities for parallel asynchronous operations, for use with the system `Promise` APIs.
 | 
			
		||||
 *
 | 
			
		||||
 * @beta
 | 
			
		||||
 */
 | 
			
		||||
export declare class Async {
 | 
			
		||||
    /**
 | 
			
		||||
     * Given an input array and a `callback` function, invoke the callback to start a
 | 
			
		||||
     * promise for each element in the array.  Returns an array containing the results.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * This API is similar to the system `Array#map`, except that the loop is asynchronous,
 | 
			
		||||
     * and the maximum number of concurrent promises can be throttled
 | 
			
		||||
     * using {@link IAsyncParallelismOptions.concurrency}.
 | 
			
		||||
     *
 | 
			
		||||
     * If `callback` throws a synchronous exception, or if it returns a promise that rejects,
 | 
			
		||||
     * then the loop stops immediately.  Any remaining array items will be skipped, and
 | 
			
		||||
     * overall operation will reject with the first error that was encountered.
 | 
			
		||||
     *
 | 
			
		||||
     * @param iterable - the array of inputs for the callback function
 | 
			
		||||
     * @param callback - a function that starts an asynchronous promise for an element
 | 
			
		||||
     *   from the array
 | 
			
		||||
     * @param options - options for customizing the control flow
 | 
			
		||||
     * @returns an array containing the result for each callback, in the same order
 | 
			
		||||
     *   as the original input `array`
 | 
			
		||||
     */
 | 
			
		||||
    static mapAsync<TEntry, TRetVal>(iterable: Iterable<TEntry> | AsyncIterable<TEntry>, callback: (entry: TEntry, arrayIndex: number) => Promise<TRetVal>, options?: IAsyncParallelismOptions | undefined): Promise<TRetVal[]>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Given an input array and a `callback` function, invoke the callback to start a
 | 
			
		||||
     * promise for each element in the array.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * This API is similar to the system `Array#forEach`, except that the loop is asynchronous,
 | 
			
		||||
     * and the maximum number of concurrent promises can be throttled
 | 
			
		||||
     * using {@link IAsyncParallelismOptions.concurrency}.
 | 
			
		||||
     *
 | 
			
		||||
     * If `callback` throws a synchronous exception, or if it returns a promise that rejects,
 | 
			
		||||
     * then the loop stops immediately.  Any remaining array items will be skipped, and
 | 
			
		||||
     * overall operation will reject with the first error that was encountered.
 | 
			
		||||
     *
 | 
			
		||||
     * @param iterable - the array of inputs for the callback function
 | 
			
		||||
     * @param callback - a function that starts an asynchronous promise for an element
 | 
			
		||||
     *   from the array
 | 
			
		||||
     * @param options - options for customizing the control flow
 | 
			
		||||
     */
 | 
			
		||||
    static forEachAsync<TEntry>(iterable: Iterable<TEntry> | AsyncIterable<TEntry>, callback: (entry: TEntry, arrayIndex: number) => Promise<void>, options?: IAsyncParallelismOptions | undefined): Promise<void>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Return a promise that resolves after the specified number of milliseconds.
 | 
			
		||||
     */
 | 
			
		||||
    static sleep(ms: number): Promise<void>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Executes an async function and optionally retries it if it fails.
 | 
			
		||||
     */
 | 
			
		||||
    static runWithRetriesAsync<TResult>({ action, maxRetries, retryDelayMs }: IRunWithRetriesOptions<TResult>): Promise<TResult>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns a Signal, a.k.a. a "deferred promise".
 | 
			
		||||
     */
 | 
			
		||||
    static getSignal(): [Promise<void>, () => void, (err: Error) => void];
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * A queue that allows for asynchronous iteration. During iteration, the queue will wait until
 | 
			
		||||
 * the next item is pushed into the queue before yielding. If instead all queue items are consumed
 | 
			
		||||
 * and all callbacks have been called, the queue will return.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export declare class AsyncQueue<T> implements AsyncIterable<[T, () => void]> {
 | 
			
		||||
    private _queue;
 | 
			
		||||
    private _onPushSignal;
 | 
			
		||||
    private _onPushResolve;
 | 
			
		||||
    constructor(iterable?: Iterable<T>);
 | 
			
		||||
    [Symbol.asyncIterator](): AsyncIterableIterator<[T, () => void]>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Adds an item to the queue.
 | 
			
		||||
     *
 | 
			
		||||
     * @param item - The item to push into the queue.
 | 
			
		||||
     */
 | 
			
		||||
    push(item: T): void;
 | 
			
		||||
}
 | 
			
		||||
//# sourceMappingURL=Async.d.ts.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/Async.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/Async.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"Async.d.ts","sourceRoot":"","sources":["../src/Async.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB,CAAC,OAAO;IAC7C,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,qBAAa,KAAK;IAChB;;;;;;;;;;;;;;;;;;;OAmBG;WACiB,QAAQ,CAAC,MAAM,EAAE,OAAO,EAC1C,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,EAClD,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EACjE,OAAO,CAAC,EAAE,wBAAwB,GAAG,SAAS,GAC7C,OAAO,CAAC,OAAO,EAAE,CAAC;IAcrB;;;;;;;;;;;;;;;;;OAiBG;WACiB,YAAY,CAAC,MAAM,EACrC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,EAClD,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,EAC9D,OAAO,CAAC,EAAE,wBAAwB,GAAG,SAAS,GAC7C,OAAO,CAAC,IAAI,CAAC;IA+DhB;;OAEG;WACiB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMpD;;OAEG;WACiB,mBAAmB,CAAC,OAAO,EAAE,EAC/C,MAAM,EACN,UAAU,EACV,YAAgB,EACjB,EAAE,sBAAsB,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBrD;;OAEG;WACW,SAAS,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CAG7E;AAeD;;;;;;GAMG;AACH,qBAAa,UAAU,CAAC,CAAC,CAAE,YAAW,aAAa,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;IAClE,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,cAAc,CAAa;gBAEhB,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IAO3B,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,qBAAqB,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;IA4B9E;;;;OAIG;IACI,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;CAO3B"}
 | 
			
		||||
							
								
								
									
										228
									
								
								node_modules/@rushstack/node-core-library/lib/Async.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										228
									
								
								node_modules/@rushstack/node-core-library/lib/Async.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,228 @@
 | 
			
		||||
"use strict";
 | 
			
		||||
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 | 
			
		||||
// See LICENSE in the project root for license information.
 | 
			
		||||
var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }
 | 
			
		||||
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
 | 
			
		||||
    if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
 | 
			
		||||
    var g = generator.apply(thisArg, _arguments || []), i, q = [];
 | 
			
		||||
    return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
 | 
			
		||||
    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
 | 
			
		||||
    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
 | 
			
		||||
    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
 | 
			
		||||
    function fulfill(value) { resume("next", value); }
 | 
			
		||||
    function reject(value) { resume("throw", value); }
 | 
			
		||||
    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
 | 
			
		||||
};
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.AsyncQueue = exports.Async = void 0;
 | 
			
		||||
/**
 | 
			
		||||
 * Utilities for parallel asynchronous operations, for use with the system `Promise` APIs.
 | 
			
		||||
 *
 | 
			
		||||
 * @beta
 | 
			
		||||
 */
 | 
			
		||||
class Async {
 | 
			
		||||
    /**
 | 
			
		||||
     * Given an input array and a `callback` function, invoke the callback to start a
 | 
			
		||||
     * promise for each element in the array.  Returns an array containing the results.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * This API is similar to the system `Array#map`, except that the loop is asynchronous,
 | 
			
		||||
     * and the maximum number of concurrent promises can be throttled
 | 
			
		||||
     * using {@link IAsyncParallelismOptions.concurrency}.
 | 
			
		||||
     *
 | 
			
		||||
     * If `callback` throws a synchronous exception, or if it returns a promise that rejects,
 | 
			
		||||
     * then the loop stops immediately.  Any remaining array items will be skipped, and
 | 
			
		||||
     * overall operation will reject with the first error that was encountered.
 | 
			
		||||
     *
 | 
			
		||||
     * @param iterable - the array of inputs for the callback function
 | 
			
		||||
     * @param callback - a function that starts an asynchronous promise for an element
 | 
			
		||||
     *   from the array
 | 
			
		||||
     * @param options - options for customizing the control flow
 | 
			
		||||
     * @returns an array containing the result for each callback, in the same order
 | 
			
		||||
     *   as the original input `array`
 | 
			
		||||
     */
 | 
			
		||||
    static async mapAsync(iterable, callback, options) {
 | 
			
		||||
        const result = [];
 | 
			
		||||
        await Async.forEachAsync(iterable, async (item, arrayIndex) => {
 | 
			
		||||
            result[arrayIndex] = await callback(item, arrayIndex);
 | 
			
		||||
        }, options);
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Given an input array and a `callback` function, invoke the callback to start a
 | 
			
		||||
     * promise for each element in the array.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * This API is similar to the system `Array#forEach`, except that the loop is asynchronous,
 | 
			
		||||
     * and the maximum number of concurrent promises can be throttled
 | 
			
		||||
     * using {@link IAsyncParallelismOptions.concurrency}.
 | 
			
		||||
     *
 | 
			
		||||
     * If `callback` throws a synchronous exception, or if it returns a promise that rejects,
 | 
			
		||||
     * then the loop stops immediately.  Any remaining array items will be skipped, and
 | 
			
		||||
     * overall operation will reject with the first error that was encountered.
 | 
			
		||||
     *
 | 
			
		||||
     * @param iterable - the array of inputs for the callback function
 | 
			
		||||
     * @param callback - a function that starts an asynchronous promise for an element
 | 
			
		||||
     *   from the array
 | 
			
		||||
     * @param options - options for customizing the control flow
 | 
			
		||||
     */
 | 
			
		||||
    static async forEachAsync(iterable, callback, options) {
 | 
			
		||||
        await new Promise((resolve, reject) => {
 | 
			
		||||
            const concurrency = (options === null || options === void 0 ? void 0 : options.concurrency) && options.concurrency > 0 ? options.concurrency : Infinity;
 | 
			
		||||
            let operationsInProgress = 0;
 | 
			
		||||
            const iterator = (iterable[Symbol.iterator] ||
 | 
			
		||||
                iterable[Symbol.asyncIterator]).call(iterable);
 | 
			
		||||
            let arrayIndex = 0;
 | 
			
		||||
            let iteratorIsComplete = false;
 | 
			
		||||
            let promiseHasResolvedOrRejected = false;
 | 
			
		||||
            async function queueOperationsAsync() {
 | 
			
		||||
                while (operationsInProgress < concurrency && !iteratorIsComplete && !promiseHasResolvedOrRejected) {
 | 
			
		||||
                    // Increment the concurrency while waiting for the iterator.
 | 
			
		||||
                    // This function is reentrant, so this ensures that at most `concurrency` executions are waiting
 | 
			
		||||
                    operationsInProgress++;
 | 
			
		||||
                    const currentIteratorResult = await iterator.next();
 | 
			
		||||
                    // eslint-disable-next-line require-atomic-updates
 | 
			
		||||
                    iteratorIsComplete = !!currentIteratorResult.done;
 | 
			
		||||
                    if (!iteratorIsComplete) {
 | 
			
		||||
                        Promise.resolve(callback(currentIteratorResult.value, arrayIndex++))
 | 
			
		||||
                            .then(async () => {
 | 
			
		||||
                            operationsInProgress--;
 | 
			
		||||
                            await onOperationCompletionAsync();
 | 
			
		||||
                        })
 | 
			
		||||
                            .catch((error) => {
 | 
			
		||||
                            promiseHasResolvedOrRejected = true;
 | 
			
		||||
                            reject(error);
 | 
			
		||||
                        });
 | 
			
		||||
                    }
 | 
			
		||||
                    else {
 | 
			
		||||
                        // The iterator is complete and there wasn't a value, so untrack the waiting state.
 | 
			
		||||
                        operationsInProgress--;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                if (iteratorIsComplete) {
 | 
			
		||||
                    await onOperationCompletionAsync();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            async function onOperationCompletionAsync() {
 | 
			
		||||
                if (!promiseHasResolvedOrRejected) {
 | 
			
		||||
                    if (operationsInProgress === 0 && iteratorIsComplete) {
 | 
			
		||||
                        promiseHasResolvedOrRejected = true;
 | 
			
		||||
                        resolve();
 | 
			
		||||
                    }
 | 
			
		||||
                    else if (!iteratorIsComplete) {
 | 
			
		||||
                        await queueOperationsAsync();
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            queueOperationsAsync().catch((error) => {
 | 
			
		||||
                promiseHasResolvedOrRejected = true;
 | 
			
		||||
                reject(error);
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Return a promise that resolves after the specified number of milliseconds.
 | 
			
		||||
     */
 | 
			
		||||
    static async sleep(ms) {
 | 
			
		||||
        await new Promise((resolve) => {
 | 
			
		||||
            setTimeout(resolve, ms);
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Executes an async function and optionally retries it if it fails.
 | 
			
		||||
     */
 | 
			
		||||
    static async runWithRetriesAsync({ action, maxRetries, retryDelayMs = 0 }) {
 | 
			
		||||
        let retryCounter = 0;
 | 
			
		||||
        // eslint-disable-next-line no-constant-condition
 | 
			
		||||
        while (true) {
 | 
			
		||||
            try {
 | 
			
		||||
                return await action();
 | 
			
		||||
            }
 | 
			
		||||
            catch (e) {
 | 
			
		||||
                if (++retryCounter > maxRetries) {
 | 
			
		||||
                    throw e;
 | 
			
		||||
                }
 | 
			
		||||
                else if (retryDelayMs > 0) {
 | 
			
		||||
                    await Async.sleep(retryDelayMs);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns a Signal, a.k.a. a "deferred promise".
 | 
			
		||||
     */
 | 
			
		||||
    static getSignal() {
 | 
			
		||||
        return getSignal();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
exports.Async = Async;
 | 
			
		||||
/**
 | 
			
		||||
 * Returns an unwrapped promise.
 | 
			
		||||
 */
 | 
			
		||||
function getSignal() {
 | 
			
		||||
    let resolver;
 | 
			
		||||
    let rejecter;
 | 
			
		||||
    const promise = new Promise((resolve, reject) => {
 | 
			
		||||
        resolver = resolve;
 | 
			
		||||
        rejecter = reject;
 | 
			
		||||
    });
 | 
			
		||||
    return [promise, resolver, rejecter];
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * A queue that allows for asynchronous iteration. During iteration, the queue will wait until
 | 
			
		||||
 * the next item is pushed into the queue before yielding. If instead all queue items are consumed
 | 
			
		||||
 * and all callbacks have been called, the queue will return.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
class AsyncQueue {
 | 
			
		||||
    constructor(iterable) {
 | 
			
		||||
        this._queue = iterable ? Array.from(iterable) : [];
 | 
			
		||||
        const [promise, resolver] = getSignal();
 | 
			
		||||
        this._onPushSignal = promise;
 | 
			
		||||
        this._onPushResolve = resolver;
 | 
			
		||||
    }
 | 
			
		||||
    [Symbol.asyncIterator]() {
 | 
			
		||||
        return __asyncGenerator(this, arguments, function* _a() {
 | 
			
		||||
            let activeIterations = 0;
 | 
			
		||||
            let [callbackSignal, callbackResolve] = getSignal();
 | 
			
		||||
            const callback = () => {
 | 
			
		||||
                if (--activeIterations === 0) {
 | 
			
		||||
                    // Resolve whatever the latest callback promise is and create a new one
 | 
			
		||||
                    callbackResolve();
 | 
			
		||||
                    const [newCallbackSignal, newCallbackResolve] = getSignal();
 | 
			
		||||
                    callbackSignal = newCallbackSignal;
 | 
			
		||||
                    callbackResolve = newCallbackResolve;
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
            let position = 0;
 | 
			
		||||
            while (this._queue.length > position || activeIterations > 0) {
 | 
			
		||||
                if (this._queue.length > position) {
 | 
			
		||||
                    activeIterations++;
 | 
			
		||||
                    yield yield __await([this._queue[position++], callback]);
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    // On push, the item will be added to the queue and the onPushSignal will be resolved.
 | 
			
		||||
                    // On calling the callback, active iterations will be decremented by the callback and the
 | 
			
		||||
                    // callbackSignal will be resolved. This means that the loop will continue if there are
 | 
			
		||||
                    // active iterations or if there are items in the queue that haven't been yielded yet.
 | 
			
		||||
                    yield __await(Promise.race([this._onPushSignal, callbackSignal]));
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Adds an item to the queue.
 | 
			
		||||
     *
 | 
			
		||||
     * @param item - The item to push into the queue.
 | 
			
		||||
     */
 | 
			
		||||
    push(item) {
 | 
			
		||||
        this._queue.push(item);
 | 
			
		||||
        this._onPushResolve();
 | 
			
		||||
        const [onPushSignal, onPushResolve] = getSignal();
 | 
			
		||||
        this._onPushSignal = onPushSignal;
 | 
			
		||||
        this._onPushResolve = onPushResolve;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
exports.AsyncQueue = AsyncQueue;
 | 
			
		||||
//# sourceMappingURL=Async.js.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/Async.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/Async.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										27
									
								
								node_modules/@rushstack/node-core-library/lib/Constants.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								node_modules/@rushstack/node-core-library/lib/Constants.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
			
		||||
/**
 | 
			
		||||
 * String constants for common filenames and parts of filenames.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export declare enum FileConstants {
 | 
			
		||||
    /**
 | 
			
		||||
     * "package.json" - the configuration file that defines an NPM package
 | 
			
		||||
     */
 | 
			
		||||
    PackageJson = "package.json"
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * String constants for common folder names.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export declare enum FolderConstants {
 | 
			
		||||
    /**
 | 
			
		||||
     * ".git" - the data storage for a Git working folder
 | 
			
		||||
     */
 | 
			
		||||
    Git = ".git",
 | 
			
		||||
    /**
 | 
			
		||||
     * "node_modules" - the folder where package managers install their files
 | 
			
		||||
     */
 | 
			
		||||
    NodeModules = "node_modules"
 | 
			
		||||
}
 | 
			
		||||
//# sourceMappingURL=Constants.d.ts.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/Constants.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/Constants.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"Constants.d.ts","sourceRoot":"","sources":["../src/Constants.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,oBAAY,aAAa;IACvB;;OAEG;IACH,WAAW,iBAAiB;CAC7B;AAED;;;;GAIG;AACH,oBAAY,eAAe;IACzB;;OAEG;IACH,GAAG,SAAS;IAEZ;;OAEG;IACH,WAAW,iBAAiB;CAC7B"}
 | 
			
		||||
							
								
								
									
										34
									
								
								node_modules/@rushstack/node-core-library/lib/Constants.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								node_modules/@rushstack/node-core-library/lib/Constants.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
"use strict";
 | 
			
		||||
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 | 
			
		||||
// See LICENSE in the project root for license information.
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.FolderConstants = exports.FileConstants = void 0;
 | 
			
		||||
/**
 | 
			
		||||
 * String constants for common filenames and parts of filenames.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
var FileConstants;
 | 
			
		||||
(function (FileConstants) {
 | 
			
		||||
    /**
 | 
			
		||||
     * "package.json" - the configuration file that defines an NPM package
 | 
			
		||||
     */
 | 
			
		||||
    FileConstants["PackageJson"] = "package.json";
 | 
			
		||||
})(FileConstants = exports.FileConstants || (exports.FileConstants = {}));
 | 
			
		||||
/**
 | 
			
		||||
 * String constants for common folder names.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
var FolderConstants;
 | 
			
		||||
(function (FolderConstants) {
 | 
			
		||||
    /**
 | 
			
		||||
     * ".git" - the data storage for a Git working folder
 | 
			
		||||
     */
 | 
			
		||||
    FolderConstants["Git"] = ".git";
 | 
			
		||||
    /**
 | 
			
		||||
     * "node_modules" - the folder where package managers install their files
 | 
			
		||||
     */
 | 
			
		||||
    FolderConstants["NodeModules"] = "node_modules";
 | 
			
		||||
})(FolderConstants = exports.FolderConstants || (exports.FolderConstants = {}));
 | 
			
		||||
//# sourceMappingURL=Constants.js.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/Constants.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/Constants.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"Constants.js","sourceRoot":"","sources":["../src/Constants.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D;;;;GAIG;AACH,IAAY,aAKX;AALD,WAAY,aAAa;IACvB;;OAEG;IACH,6CAA4B,CAAA;AAC9B,CAAC,EALW,aAAa,GAAb,qBAAa,KAAb,qBAAa,QAKxB;AAED;;;;GAIG;AACH,IAAY,eAUX;AAVD,WAAY,eAAe;IACzB;;OAEG;IACH,+BAAY,CAAA;IAEZ;;OAEG;IACH,+CAA4B,CAAA;AAC9B,CAAC,EAVW,eAAe,GAAf,uBAAe,KAAf,uBAAe,QAU1B","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\n/**\n * String constants for common filenames and parts of filenames.\n *\n * @public\n */\nexport enum FileConstants {\n  /**\n   * \"package.json\" - the configuration file that defines an NPM package\n   */\n  PackageJson = 'package.json'\n}\n\n/**\n * String constants for common folder names.\n *\n * @public\n */\nexport enum FolderConstants {\n  /**\n   * \".git\" - the data storage for a Git working folder\n   */\n  Git = '.git',\n\n  /**\n   * \"node_modules\" - the folder where package managers install their files\n   */\n  NodeModules = 'node_modules'\n}\n"]}
 | 
			
		||||
							
								
								
									
										120
									
								
								node_modules/@rushstack/node-core-library/lib/Enum.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								node_modules/@rushstack/node-core-library/lib/Enum.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,120 @@
 | 
			
		||||
/**
 | 
			
		||||
 * A helper for looking up TypeScript `enum` keys/values.
 | 
			
		||||
 *
 | 
			
		||||
 * @remarks
 | 
			
		||||
 * TypeScript enums implement a lookup table for mapping between their keys and values:
 | 
			
		||||
 *
 | 
			
		||||
 * ```ts
 | 
			
		||||
 * enum Colors {
 | 
			
		||||
 *   Red = 1
 | 
			
		||||
 * }
 | 
			
		||||
 *
 | 
			
		||||
 * // Prints "Red"
 | 
			
		||||
 * console.log(Colors[1]);
 | 
			
		||||
 *
 | 
			
		||||
 * // Prints "1"
 | 
			
		||||
 * console.log(Colors["Red]);
 | 
			
		||||
 * ```
 | 
			
		||||
 *
 | 
			
		||||
 * However the compiler's "noImplicitAny" validation has trouble with these mappings, because
 | 
			
		||||
 * there are so many possible types for the map elements:
 | 
			
		||||
 *
 | 
			
		||||
 * ```ts
 | 
			
		||||
 * function f(s: string): Colors | undefined {
 | 
			
		||||
 *   // (TS 7015) Element implicitly has an 'any' type because
 | 
			
		||||
 *   // index expression is not of type 'number'.
 | 
			
		||||
 *   return Colors[s];
 | 
			
		||||
 * }
 | 
			
		||||
 * ```
 | 
			
		||||
 *
 | 
			
		||||
 * The `Enum` helper provides a more specific, strongly typed way to access members:
 | 
			
		||||
 *
 | 
			
		||||
 * ```ts
 | 
			
		||||
 * function f(s: string): Colors | undefined {
 | 
			
		||||
 *   return Enum.tryGetValueByKey(Colors, s);
 | 
			
		||||
 * }
 | 
			
		||||
 * ```
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export declare class Enum {
 | 
			
		||||
    private constructor();
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns an enum value, given its key. Returns `undefined` if no matching key is found.
 | 
			
		||||
     *
 | 
			
		||||
     * @example
 | 
			
		||||
     *
 | 
			
		||||
     * Example usage:
 | 
			
		||||
     * ```ts
 | 
			
		||||
     * enum Colors {
 | 
			
		||||
     *   Red = 1
 | 
			
		||||
     * }
 | 
			
		||||
     *
 | 
			
		||||
     * // Prints "1"
 | 
			
		||||
     * console.log(Enum.tryGetValueByKey(Colors, "Red"));
 | 
			
		||||
     *
 | 
			
		||||
     * // Prints "undefined"
 | 
			
		||||
     * console.log(Enum.tryGetValueByKey(Colors, "Black"));
 | 
			
		||||
     * ```
 | 
			
		||||
     */
 | 
			
		||||
    static tryGetValueByKey<TEnumValue>(enumObject: {
 | 
			
		||||
        [key: string]: TEnumValue | string;
 | 
			
		||||
        [key: number]: TEnumValue | string;
 | 
			
		||||
    }, key: string): TEnumValue | undefined;
 | 
			
		||||
    /**
 | 
			
		||||
     * This API is similar to {@link Enum.tryGetValueByKey}, except that it throws an exception
 | 
			
		||||
     * if the key is undefined.
 | 
			
		||||
     */
 | 
			
		||||
    static getValueByKey<TEnumValue>(enumObject: {
 | 
			
		||||
        [key: string]: TEnumValue | string;
 | 
			
		||||
        [key: number]: TEnumValue | string;
 | 
			
		||||
    }, key: string): TEnumValue;
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns an enum string key, given its numeric value.  Returns `undefined` if no matching value
 | 
			
		||||
     * is found.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * The TypeScript compiler only creates a reverse mapping for enum members whose value is numeric.
 | 
			
		||||
     * For example:
 | 
			
		||||
     *
 | 
			
		||||
     * ```ts
 | 
			
		||||
     * enum E {
 | 
			
		||||
     *   A = 1,
 | 
			
		||||
     *   B = 'c'
 | 
			
		||||
     * }
 | 
			
		||||
     *
 | 
			
		||||
     * // Prints "A"
 | 
			
		||||
     * console.log(E[1]);
 | 
			
		||||
     *
 | 
			
		||||
     * // Prints "undefined"
 | 
			
		||||
     * console.log(E["c"]);
 | 
			
		||||
     * ```
 | 
			
		||||
     *
 | 
			
		||||
     * @example
 | 
			
		||||
     *
 | 
			
		||||
     * Example usage:
 | 
			
		||||
     * ```ts
 | 
			
		||||
     * enum Colors {
 | 
			
		||||
     *   Red = 1,
 | 
			
		||||
     *   Blue = 'blue'
 | 
			
		||||
     * }
 | 
			
		||||
     *
 | 
			
		||||
     * // Prints "Red"
 | 
			
		||||
     * console.log(Enum.tryGetKeyByNumber(Colors, 1));
 | 
			
		||||
     *
 | 
			
		||||
     * // Prints "undefined"
 | 
			
		||||
     * console.log(Enum.tryGetKeyByNumber(Colors, -1));
 | 
			
		||||
     * ```
 | 
			
		||||
     */
 | 
			
		||||
    static tryGetKeyByNumber<TEnumValue, TEnumObject extends {
 | 
			
		||||
        [key: string]: TEnumValue;
 | 
			
		||||
    }>(enumObject: TEnumObject, value: number): keyof typeof enumObject | undefined;
 | 
			
		||||
    /**
 | 
			
		||||
     * This API is similar to {@link Enum.tryGetKeyByNumber}, except that it throws an exception
 | 
			
		||||
     * if the key is undefined.
 | 
			
		||||
     */
 | 
			
		||||
    static getKeyByNumber<TEnumValue, TEnumObject extends {
 | 
			
		||||
        [key: string]: TEnumValue;
 | 
			
		||||
    }>(enumObject: TEnumObject, value: number): keyof typeof enumObject;
 | 
			
		||||
}
 | 
			
		||||
//# sourceMappingURL=Enum.d.ts.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/Enum.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/Enum.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"Enum.d.ts","sourceRoot":"","sources":["../src/Enum.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,qBAAa,IAAI;IACf,OAAO;IAEP;;;;;;;;;;;;;;;;;OAiBG;WACW,gBAAgB,CAAC,UAAU,EACvC,UAAU,EAAE;QACV,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;QACnC,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;KACpC,EACD,GAAG,EAAE,MAAM,GACV,UAAU,GAAG,SAAS;IAKzB;;;OAGG;WACW,aAAa,CAAC,UAAU,EACpC,UAAU,EAAE;QACV,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;QACnC,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;KACpC,EACD,GAAG,EAAE,MAAM,GACV,UAAU;IASb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCG;WACW,iBAAiB,CAAC,UAAU,EAAE,WAAW,SAAS;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAA;KAAE,EAC3F,UAAU,EAAE,WAAW,EACvB,KAAK,EAAE,MAAM,GACZ,MAAM,OAAO,UAAU,GAAG,SAAS;IAKtC;;;OAGG;WACW,cAAc,CAAC,UAAU,EAAE,WAAW,SAAS;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAA;KAAE,EACxF,UAAU,EAAE,WAAW,EACvB,KAAK,EAAE,MAAM,GACZ,MAAM,OAAO,UAAU;CAQ3B"}
 | 
			
		||||
							
								
								
									
										136
									
								
								node_modules/@rushstack/node-core-library/lib/Enum.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										136
									
								
								node_modules/@rushstack/node-core-library/lib/Enum.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,136 @@
 | 
			
		||||
"use strict";
 | 
			
		||||
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 | 
			
		||||
// See LICENSE in the project root for license information.
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.Enum = void 0;
 | 
			
		||||
/**
 | 
			
		||||
 * A helper for looking up TypeScript `enum` keys/values.
 | 
			
		||||
 *
 | 
			
		||||
 * @remarks
 | 
			
		||||
 * TypeScript enums implement a lookup table for mapping between their keys and values:
 | 
			
		||||
 *
 | 
			
		||||
 * ```ts
 | 
			
		||||
 * enum Colors {
 | 
			
		||||
 *   Red = 1
 | 
			
		||||
 * }
 | 
			
		||||
 *
 | 
			
		||||
 * // Prints "Red"
 | 
			
		||||
 * console.log(Colors[1]);
 | 
			
		||||
 *
 | 
			
		||||
 * // Prints "1"
 | 
			
		||||
 * console.log(Colors["Red]);
 | 
			
		||||
 * ```
 | 
			
		||||
 *
 | 
			
		||||
 * However the compiler's "noImplicitAny" validation has trouble with these mappings, because
 | 
			
		||||
 * there are so many possible types for the map elements:
 | 
			
		||||
 *
 | 
			
		||||
 * ```ts
 | 
			
		||||
 * function f(s: string): Colors | undefined {
 | 
			
		||||
 *   // (TS 7015) Element implicitly has an 'any' type because
 | 
			
		||||
 *   // index expression is not of type 'number'.
 | 
			
		||||
 *   return Colors[s];
 | 
			
		||||
 * }
 | 
			
		||||
 * ```
 | 
			
		||||
 *
 | 
			
		||||
 * The `Enum` helper provides a more specific, strongly typed way to access members:
 | 
			
		||||
 *
 | 
			
		||||
 * ```ts
 | 
			
		||||
 * function f(s: string): Colors | undefined {
 | 
			
		||||
 *   return Enum.tryGetValueByKey(Colors, s);
 | 
			
		||||
 * }
 | 
			
		||||
 * ```
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
class Enum {
 | 
			
		||||
    constructor() { }
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns an enum value, given its key. Returns `undefined` if no matching key is found.
 | 
			
		||||
     *
 | 
			
		||||
     * @example
 | 
			
		||||
     *
 | 
			
		||||
     * Example usage:
 | 
			
		||||
     * ```ts
 | 
			
		||||
     * enum Colors {
 | 
			
		||||
     *   Red = 1
 | 
			
		||||
     * }
 | 
			
		||||
     *
 | 
			
		||||
     * // Prints "1"
 | 
			
		||||
     * console.log(Enum.tryGetValueByKey(Colors, "Red"));
 | 
			
		||||
     *
 | 
			
		||||
     * // Prints "undefined"
 | 
			
		||||
     * console.log(Enum.tryGetValueByKey(Colors, "Black"));
 | 
			
		||||
     * ```
 | 
			
		||||
     */
 | 
			
		||||
    static tryGetValueByKey(enumObject, key) {
 | 
			
		||||
        // eslint-disable-next-line @typescript-eslint/no-explicit-any
 | 
			
		||||
        return enumObject[key];
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * This API is similar to {@link Enum.tryGetValueByKey}, except that it throws an exception
 | 
			
		||||
     * if the key is undefined.
 | 
			
		||||
     */
 | 
			
		||||
    static getValueByKey(enumObject, key) {
 | 
			
		||||
        // eslint-disable-next-line @typescript-eslint/no-explicit-any
 | 
			
		||||
        const result = enumObject[key];
 | 
			
		||||
        if (result === undefined) {
 | 
			
		||||
            throw new Error(`The lookup key ${JSON.stringify(key)} is not defined`);
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns an enum string key, given its numeric value.  Returns `undefined` if no matching value
 | 
			
		||||
     * is found.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * The TypeScript compiler only creates a reverse mapping for enum members whose value is numeric.
 | 
			
		||||
     * For example:
 | 
			
		||||
     *
 | 
			
		||||
     * ```ts
 | 
			
		||||
     * enum E {
 | 
			
		||||
     *   A = 1,
 | 
			
		||||
     *   B = 'c'
 | 
			
		||||
     * }
 | 
			
		||||
     *
 | 
			
		||||
     * // Prints "A"
 | 
			
		||||
     * console.log(E[1]);
 | 
			
		||||
     *
 | 
			
		||||
     * // Prints "undefined"
 | 
			
		||||
     * console.log(E["c"]);
 | 
			
		||||
     * ```
 | 
			
		||||
     *
 | 
			
		||||
     * @example
 | 
			
		||||
     *
 | 
			
		||||
     * Example usage:
 | 
			
		||||
     * ```ts
 | 
			
		||||
     * enum Colors {
 | 
			
		||||
     *   Red = 1,
 | 
			
		||||
     *   Blue = 'blue'
 | 
			
		||||
     * }
 | 
			
		||||
     *
 | 
			
		||||
     * // Prints "Red"
 | 
			
		||||
     * console.log(Enum.tryGetKeyByNumber(Colors, 1));
 | 
			
		||||
     *
 | 
			
		||||
     * // Prints "undefined"
 | 
			
		||||
     * console.log(Enum.tryGetKeyByNumber(Colors, -1));
 | 
			
		||||
     * ```
 | 
			
		||||
     */
 | 
			
		||||
    static tryGetKeyByNumber(enumObject, value) {
 | 
			
		||||
        // eslint-disable-next-line @typescript-eslint/no-explicit-any
 | 
			
		||||
        return enumObject[value];
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * This API is similar to {@link Enum.tryGetKeyByNumber}, except that it throws an exception
 | 
			
		||||
     * if the key is undefined.
 | 
			
		||||
     */
 | 
			
		||||
    static getKeyByNumber(enumObject, value) {
 | 
			
		||||
        // eslint-disable-next-line @typescript-eslint/no-explicit-any
 | 
			
		||||
        const result = enumObject[value];
 | 
			
		||||
        if (result === undefined) {
 | 
			
		||||
            throw new Error(`The value ${value} does not exist in the mapping`);
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
exports.Enum = Enum;
 | 
			
		||||
//# sourceMappingURL=Enum.js.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/Enum.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/Enum.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										72
									
								
								node_modules/@rushstack/node-core-library/lib/EnvironmentMap.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								node_modules/@rushstack/node-core-library/lib/EnvironmentMap.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,72 @@
 | 
			
		||||
/**
 | 
			
		||||
 * A process environment variable name and its value.  Used by {@link EnvironmentMap}.
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IEnvironmentEntry {
 | 
			
		||||
    /**
 | 
			
		||||
     * The name of the environment variable.
 | 
			
		||||
     */
 | 
			
		||||
    name: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * The value of the environment variable.
 | 
			
		||||
     */
 | 
			
		||||
    value: string;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * A map data structure that stores process environment variables.  On Windows
 | 
			
		||||
 * operating system, the variable names are case-insensitive.
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export declare class EnvironmentMap {
 | 
			
		||||
    private readonly _map;
 | 
			
		||||
    /**
 | 
			
		||||
     * Whether the environment variable names are case-sensitive.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * On Windows operating system, environment variables are case-insensitive.
 | 
			
		||||
     * The map will preserve the variable name casing from the most recent assignment operation.
 | 
			
		||||
     */
 | 
			
		||||
    readonly caseSensitive: boolean;
 | 
			
		||||
    constructor(environmentObject?: Record<string, string | undefined>);
 | 
			
		||||
    /**
 | 
			
		||||
     * Clears all entries, resulting in an empty map.
 | 
			
		||||
     */
 | 
			
		||||
    clear(): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * Assigns the variable to the specified value.  A previous value will be overwritten.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * The value can be an empty string.  To completely remove the entry, use
 | 
			
		||||
     * {@link EnvironmentMap.unset} instead.
 | 
			
		||||
     */
 | 
			
		||||
    set(name: string, value: string): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * Removes the key from the map, if present.
 | 
			
		||||
     */
 | 
			
		||||
    unset(name: string): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the value of the specified variable, or `undefined` if the map does not contain that name.
 | 
			
		||||
     */
 | 
			
		||||
    get(name: string): string | undefined;
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the map keys, which are environment variable names.
 | 
			
		||||
     */
 | 
			
		||||
    names(): IterableIterator<string>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the map entries.
 | 
			
		||||
     */
 | 
			
		||||
    entries(): IterableIterator<IEnvironmentEntry>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Adds each entry from `environmentMap` to this map.
 | 
			
		||||
     */
 | 
			
		||||
    mergeFrom(environmentMap: EnvironmentMap): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * Merges entries from a plain JavaScript object, such as would be used with the `process.env` API.
 | 
			
		||||
     */
 | 
			
		||||
    mergeFromObject(environmentObject?: Record<string, string | undefined>): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the keys as a plain JavaScript object similar to the object returned by the `process.env` API.
 | 
			
		||||
     */
 | 
			
		||||
    toObject(): Record<string, string>;
 | 
			
		||||
}
 | 
			
		||||
//# sourceMappingURL=EnvironmentMap.d.ts.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/EnvironmentMap.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/EnvironmentMap.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"EnvironmentMap.d.ts","sourceRoot":"","sources":["../src/EnvironmentMap.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA6C;IAElE;;;;;;OAMG;IACH,SAAgB,aAAa,EAAE,OAAO,CAAC;gBAEpB,iBAAiB,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAM;IAe7E;;OAEG;IACI,KAAK,IAAI,IAAI;IAIpB;;;;;;OAMG;IACI,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAK7C;;OAEG;IACI,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKhC;;OAEG;IACI,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAS5C;;OAEG;IACI,KAAK,IAAI,gBAAgB,CAAC,MAAM,CAAC;IAIxC;;OAEG;IACI,OAAO,IAAI,gBAAgB,CAAC,iBAAiB,CAAC;IAIrD;;OAEG;IACI,SAAS,CAAC,cAAc,EAAE,cAAc,GAAG,IAAI;IAMtD;;OAEG;IACI,eAAe,CAAC,iBAAiB,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAM,GAAG,IAAI;IAQxF;;OAEG;IACI,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAO1C"}
 | 
			
		||||
							
								
								
									
										108
									
								
								node_modules/@rushstack/node-core-library/lib/EnvironmentMap.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								node_modules/@rushstack/node-core-library/lib/EnvironmentMap.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,108 @@
 | 
			
		||||
"use strict";
 | 
			
		||||
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 | 
			
		||||
// See LICENSE in the project root for license information.
 | 
			
		||||
var __importDefault = (this && this.__importDefault) || function (mod) {
 | 
			
		||||
    return (mod && mod.__esModule) ? mod : { "default": mod };
 | 
			
		||||
};
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.EnvironmentMap = void 0;
 | 
			
		||||
const process_1 = __importDefault(require("process"));
 | 
			
		||||
const InternalError_1 = require("./InternalError");
 | 
			
		||||
/**
 | 
			
		||||
 * A map data structure that stores process environment variables.  On Windows
 | 
			
		||||
 * operating system, the variable names are case-insensitive.
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
class EnvironmentMap {
 | 
			
		||||
    constructor(environmentObject = {}) {
 | 
			
		||||
        this._map = new Map();
 | 
			
		||||
        // This property helps catch a mistake where an instance of `EnvironmentMap` is accidentally passed to
 | 
			
		||||
        // a function that expects a `Record<string, string>` (as would be used with the `process.env` API).
 | 
			
		||||
        // The property getter will throw an exception if that function tries to enumerate the object values.
 | 
			
		||||
        Object.defineProperty(this, '_sanityCheck', {
 | 
			
		||||
            enumerable: true,
 | 
			
		||||
            get: function () {
 | 
			
		||||
                throw new InternalError_1.InternalError('Attempt to read EnvironmentMap class as an object');
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        this.caseSensitive = process_1.default.platform !== 'win32';
 | 
			
		||||
        this.mergeFromObject(environmentObject);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Clears all entries, resulting in an empty map.
 | 
			
		||||
     */
 | 
			
		||||
    clear() {
 | 
			
		||||
        this._map.clear();
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Assigns the variable to the specified value.  A previous value will be overwritten.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * The value can be an empty string.  To completely remove the entry, use
 | 
			
		||||
     * {@link EnvironmentMap.unset} instead.
 | 
			
		||||
     */
 | 
			
		||||
    set(name, value) {
 | 
			
		||||
        const key = this.caseSensitive ? name : name.toUpperCase();
 | 
			
		||||
        this._map.set(key, { name: name, value });
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Removes the key from the map, if present.
 | 
			
		||||
     */
 | 
			
		||||
    unset(name) {
 | 
			
		||||
        const key = this.caseSensitive ? name : name.toUpperCase();
 | 
			
		||||
        this._map.delete(key);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the value of the specified variable, or `undefined` if the map does not contain that name.
 | 
			
		||||
     */
 | 
			
		||||
    get(name) {
 | 
			
		||||
        const key = this.caseSensitive ? name : name.toUpperCase();
 | 
			
		||||
        const entry = this._map.get(key);
 | 
			
		||||
        if (entry === undefined) {
 | 
			
		||||
            return undefined;
 | 
			
		||||
        }
 | 
			
		||||
        return entry.value;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the map keys, which are environment variable names.
 | 
			
		||||
     */
 | 
			
		||||
    names() {
 | 
			
		||||
        return this._map.keys();
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the map entries.
 | 
			
		||||
     */
 | 
			
		||||
    entries() {
 | 
			
		||||
        return this._map.values();
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Adds each entry from `environmentMap` to this map.
 | 
			
		||||
     */
 | 
			
		||||
    mergeFrom(environmentMap) {
 | 
			
		||||
        for (const entry of environmentMap.entries()) {
 | 
			
		||||
            this.set(entry.name, entry.value);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Merges entries from a plain JavaScript object, such as would be used with the `process.env` API.
 | 
			
		||||
     */
 | 
			
		||||
    mergeFromObject(environmentObject = {}) {
 | 
			
		||||
        for (const [name, value] of Object.entries(environmentObject)) {
 | 
			
		||||
            if (value !== undefined) {
 | 
			
		||||
                this.set(name, value);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the keys as a plain JavaScript object similar to the object returned by the `process.env` API.
 | 
			
		||||
     */
 | 
			
		||||
    toObject() {
 | 
			
		||||
        const result = {};
 | 
			
		||||
        for (const entry of this.entries()) {
 | 
			
		||||
            result[entry.name] = entry.value;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
exports.EnvironmentMap = EnvironmentMap;
 | 
			
		||||
//# sourceMappingURL=EnvironmentMap.js.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/EnvironmentMap.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/EnvironmentMap.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										341
									
								
								node_modules/@rushstack/node-core-library/lib/Executable.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										341
									
								
								node_modules/@rushstack/node-core-library/lib/Executable.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,341 @@
 | 
			
		||||
/// <reference types="node" />
 | 
			
		||||
/// <reference types="node" />
 | 
			
		||||
/// <reference types="node" />
 | 
			
		||||
/// <reference types="node" />
 | 
			
		||||
import * as child_process from 'child_process';
 | 
			
		||||
import { EnvironmentMap } from './EnvironmentMap';
 | 
			
		||||
/**
 | 
			
		||||
 * Typings for one of the streams inside IExecutableSpawnSyncOptions.stdio.
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export type ExecutableStdioStreamMapping = 'pipe' | 'ignore' | 'inherit' | NodeJS.WritableStream | NodeJS.ReadableStream | number | undefined;
 | 
			
		||||
/**
 | 
			
		||||
 * Types for {@link IExecutableSpawnSyncOptions.stdio}
 | 
			
		||||
 * and {@link IExecutableSpawnOptions.stdio}
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export type ExecutableStdioMapping = 'pipe' | 'ignore' | 'inherit' | ExecutableStdioStreamMapping[];
 | 
			
		||||
/**
 | 
			
		||||
 * Options for Executable.tryResolve().
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IExecutableResolveOptions {
 | 
			
		||||
    /**
 | 
			
		||||
     * The current working directory.  If omitted, process.cwd() will be used.
 | 
			
		||||
     */
 | 
			
		||||
    currentWorkingDirectory?: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * The environment variables for the child process.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * If `environment` and `environmentMap` are both omitted, then `process.env` will be used.
 | 
			
		||||
     * If `environment` and `environmentMap` cannot both be specified.
 | 
			
		||||
     */
 | 
			
		||||
    environment?: NodeJS.ProcessEnv;
 | 
			
		||||
    /**
 | 
			
		||||
     * The environment variables for the child process.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * If `environment` and `environmentMap` are both omitted, then `process.env` will be used.
 | 
			
		||||
     * If `environment` and `environmentMap` cannot both be specified.
 | 
			
		||||
     */
 | 
			
		||||
    environmentMap?: EnvironmentMap;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * Options for {@link Executable.spawnSync}
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IExecutableSpawnSyncOptions extends IExecutableResolveOptions {
 | 
			
		||||
    /**
 | 
			
		||||
     * The content to be passed to the child process's stdin.
 | 
			
		||||
     *
 | 
			
		||||
     * NOTE: If specified, this content replaces any IExecutableSpawnSyncOptions.stdio[0]
 | 
			
		||||
     * mapping for stdin.
 | 
			
		||||
     */
 | 
			
		||||
    input?: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * The stdio mappings for the child process.
 | 
			
		||||
     *
 | 
			
		||||
     * NOTE: If IExecutableSpawnSyncOptions.input is provided, it will take precedence
 | 
			
		||||
     * over the stdin mapping (stdio[0]).
 | 
			
		||||
     */
 | 
			
		||||
    stdio?: ExecutableStdioMapping;
 | 
			
		||||
    /**
 | 
			
		||||
     * The maximum time the process is allowed to run before it will be terminated.
 | 
			
		||||
     */
 | 
			
		||||
    timeoutMs?: number;
 | 
			
		||||
    /**
 | 
			
		||||
     * The largest amount of bytes allowed on stdout or stderr for this synchronous operation.
 | 
			
		||||
     * If exceeded, the child process will be terminated.  The default is 200 * 1024.
 | 
			
		||||
     */
 | 
			
		||||
    maxBuffer?: number;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * Options for {@link Executable.spawn}
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IExecutableSpawnOptions extends IExecutableResolveOptions {
 | 
			
		||||
    /**
 | 
			
		||||
     * The stdio mappings for the child process.
 | 
			
		||||
     *
 | 
			
		||||
     * NOTE: If IExecutableSpawnSyncOptions.input is provided, it will take precedence
 | 
			
		||||
     * over the stdin mapping (stdio[0]).
 | 
			
		||||
     */
 | 
			
		||||
    stdio?: ExecutableStdioMapping;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * The options for running a process to completion using {@link Executable.(waitForExitAsync:3)}.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IWaitForExitOptions {
 | 
			
		||||
    /**
 | 
			
		||||
     * Whether or not to throw when the process completes with a non-zero exit code. Defaults to false.
 | 
			
		||||
     */
 | 
			
		||||
    throwOnNonZeroExitCode?: boolean;
 | 
			
		||||
    /**
 | 
			
		||||
     * The encoding of the output. If not provided, the output will not be collected.
 | 
			
		||||
     */
 | 
			
		||||
    encoding?: BufferEncoding | 'buffer';
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * {@inheritDoc IWaitForExitOptions}
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IWaitForExitWithStringOptions extends IWaitForExitOptions {
 | 
			
		||||
    /**
 | 
			
		||||
     * {@inheritDoc IWaitForExitOptions.encoding}
 | 
			
		||||
     */
 | 
			
		||||
    encoding: BufferEncoding;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * {@inheritDoc IWaitForExitOptions}
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IWaitForExitWithBufferOptions extends IWaitForExitOptions {
 | 
			
		||||
    /**
 | 
			
		||||
     * {@inheritDoc IWaitForExitOptions.encoding}
 | 
			
		||||
     */
 | 
			
		||||
    encoding: 'buffer';
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * The result of running a process to completion using {@link Executable.(waitForExitAsync:3)}.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IWaitForExitResult<T extends Buffer | string | never = never> {
 | 
			
		||||
    /**
 | 
			
		||||
     * The process stdout output, if encoding was specified.
 | 
			
		||||
     */
 | 
			
		||||
    stdout: T;
 | 
			
		||||
    /**
 | 
			
		||||
     * The process stderr output, if encoding was specified.
 | 
			
		||||
     */
 | 
			
		||||
    stderr: T;
 | 
			
		||||
    /**
 | 
			
		||||
     * The process exit code. If the process was terminated, this will be null.
 | 
			
		||||
     */
 | 
			
		||||
    exitCode: number | null;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * Process information sourced from the system. This process info is sourced differently depending
 | 
			
		||||
 * on the operating system:
 | 
			
		||||
 * - On Windows, this uses the `wmic.exe` utility.
 | 
			
		||||
 * - On Unix, this uses the `ps` utility.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IProcessInfo {
 | 
			
		||||
    /**
 | 
			
		||||
     * The name of the process.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks On Windows, the process name will be empty if the process is a kernel process.
 | 
			
		||||
     * On Unix, the process name will be empty if the process is the root process.
 | 
			
		||||
     */
 | 
			
		||||
    processName: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * The process ID.
 | 
			
		||||
     */
 | 
			
		||||
    processId: number;
 | 
			
		||||
    /**
 | 
			
		||||
     * The parent process info.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks On Windows, the parent process info will be undefined if the process is a kernel process.
 | 
			
		||||
     * On Unix, the parent process info will be undefined if the process is the root process.
 | 
			
		||||
     */
 | 
			
		||||
    parentProcessInfo: IProcessInfo | undefined;
 | 
			
		||||
    /**
 | 
			
		||||
     * The child process infos.
 | 
			
		||||
     */
 | 
			
		||||
    childProcessInfos: IProcessInfo[];
 | 
			
		||||
}
 | 
			
		||||
export declare function parseProcessListOutputAsync(stream: NodeJS.ReadableStream): Promise<Map<number, IProcessInfo>>;
 | 
			
		||||
export declare function parseProcessListOutput(output: Iterable<string | null>): Map<number, IProcessInfo>;
 | 
			
		||||
/**
 | 
			
		||||
 * The Executable class provides a safe, portable, recommended solution for tools that need
 | 
			
		||||
 * to launch child processes.
 | 
			
		||||
 *
 | 
			
		||||
 * @remarks
 | 
			
		||||
 * The NodeJS child_process API provides a solution for launching child processes, however
 | 
			
		||||
 * its design encourages reliance on the operating system shell for certain features.
 | 
			
		||||
 * Invoking the OS shell is not safe, not portable, and generally not recommended:
 | 
			
		||||
 *
 | 
			
		||||
 * - Different shells have different behavior and command-line syntax, and which shell you
 | 
			
		||||
 *   will get with NodeJS is unpredictable.  There is no universal shell guaranteed to be
 | 
			
		||||
 *   available on all platforms.
 | 
			
		||||
 *
 | 
			
		||||
 * - If a command parameter contains symbol characters, a shell may interpret them, which
 | 
			
		||||
 *   can introduce a security vulnerability
 | 
			
		||||
 *
 | 
			
		||||
 * - Each shell has different rules for escaping these symbols.  On Windows, the default
 | 
			
		||||
 *   shell is incapable of escaping certain character sequences.
 | 
			
		||||
 *
 | 
			
		||||
 * The Executable API provides a pure JavaScript implementation of primitive shell-like
 | 
			
		||||
 * functionality for searching the default PATH, appending default file extensions on Windows,
 | 
			
		||||
 * and executing a file that may contain a POSIX shebang.  This primitive functionality
 | 
			
		||||
 * is sufficient (and recommended) for most tooling scenarios.
 | 
			
		||||
 *
 | 
			
		||||
 * If you need additional shell features such as wildcard globbing, environment variable
 | 
			
		||||
 * expansion, piping, or built-in commands, then we recommend to use the `@microsoft/rushell`
 | 
			
		||||
 * library instead.  Rushell is a pure JavaScript shell with a standard syntax that is
 | 
			
		||||
 * guaranteed to work consistently across all platforms.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export declare class Executable {
 | 
			
		||||
    /**
 | 
			
		||||
     * Synchronously create a child process and optionally capture its output.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * This function is similar to child_process.spawnSync().  The main differences are:
 | 
			
		||||
     *
 | 
			
		||||
     * - It does not invoke the OS shell unless the executable file is a shell script.
 | 
			
		||||
     * - Command-line arguments containing special characters are more accurately passed
 | 
			
		||||
     *   through to the child process.
 | 
			
		||||
     * - If the filename is missing a path, then the shell's default PATH will be searched.
 | 
			
		||||
     * - If the filename is missing a file extension, then Windows default file extensions
 | 
			
		||||
     *   will be searched.
 | 
			
		||||
     *
 | 
			
		||||
     * @param filename - The name of the executable file.  This string must not contain any
 | 
			
		||||
     * command-line arguments.  If the name contains any path delimiters, then the shell's
 | 
			
		||||
     * default PATH will not be searched.
 | 
			
		||||
     * @param args - The command-line arguments to be passed to the process.
 | 
			
		||||
     * @param options - Additional options
 | 
			
		||||
     * @returns the same data type as returned by the NodeJS child_process.spawnSync() API
 | 
			
		||||
     *
 | 
			
		||||
     * @privateRemarks
 | 
			
		||||
     *
 | 
			
		||||
     * NOTE: The NodeJS spawnSync() returns SpawnSyncReturns<string> or SpawnSyncReturns<Buffer>
 | 
			
		||||
     * polymorphically based on the options.encoding parameter value.  This is a fairly confusing
 | 
			
		||||
     * design.  In most cases, developers want string with the default encoding.  If/when someone
 | 
			
		||||
     * wants binary output or a non-default text encoding, we will introduce a separate API function
 | 
			
		||||
     * with a name like "spawnWithBufferSync".
 | 
			
		||||
     */
 | 
			
		||||
    static spawnSync(filename: string, args: string[], options?: IExecutableSpawnSyncOptions): child_process.SpawnSyncReturns<string>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Start a child process.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * This function is similar to child_process.spawn().  The main differences are:
 | 
			
		||||
     *
 | 
			
		||||
     * - It does not invoke the OS shell unless the executable file is a shell script.
 | 
			
		||||
     * - Command-line arguments containing special characters are more accurately passed
 | 
			
		||||
     *   through to the child process.
 | 
			
		||||
     * - If the filename is missing a path, then the shell's default PATH will be searched.
 | 
			
		||||
     * - If the filename is missing a file extension, then Windows default file extensions
 | 
			
		||||
     *   will be searched.
 | 
			
		||||
     *
 | 
			
		||||
     * This command is asynchronous, but it does not return a `Promise`.  Instead it returns
 | 
			
		||||
     * a Node.js `ChildProcess` supporting event notifications.
 | 
			
		||||
     *
 | 
			
		||||
     * @param filename - The name of the executable file.  This string must not contain any
 | 
			
		||||
     * command-line arguments.  If the name contains any path delimiters, then the shell's
 | 
			
		||||
     * default PATH will not be searched.
 | 
			
		||||
     * @param args - The command-line arguments to be passed to the process.
 | 
			
		||||
     * @param options - Additional options
 | 
			
		||||
     * @returns the same data type as returned by the NodeJS child_process.spawnSync() API
 | 
			
		||||
     */
 | 
			
		||||
    static spawn(filename: string, args: string[], options?: IExecutableSpawnOptions): child_process.ChildProcess;
 | 
			
		||||
    /** {@inheritDoc Executable.(waitForExitAsync:3)} */
 | 
			
		||||
    static waitForExitAsync(childProcess: child_process.ChildProcess, options: IWaitForExitWithStringOptions): Promise<IWaitForExitResult<string>>;
 | 
			
		||||
    /** {@inheritDoc Executable.(waitForExitAsync:3)} */
 | 
			
		||||
    static waitForExitAsync(childProcess: child_process.ChildProcess, options: IWaitForExitWithBufferOptions): Promise<IWaitForExitResult<Buffer>>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Wait for a child process to exit and return the result.
 | 
			
		||||
     *
 | 
			
		||||
     * @param childProcess - The child process to wait for.
 | 
			
		||||
     * @param options - Options for waiting for the process to exit.
 | 
			
		||||
     */
 | 
			
		||||
    static waitForExitAsync(childProcess: child_process.ChildProcess, options?: IWaitForExitOptions): Promise<IWaitForExitResult<never>>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the list of processes currently running on the system, keyed by the process ID.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks The underlying implementation depends on the operating system:
 | 
			
		||||
     * - On Windows, this uses the `wmic.exe` utility.
 | 
			
		||||
     * - On Unix, this uses the `ps` utility.
 | 
			
		||||
     */
 | 
			
		||||
    static getProcessInfoByIdAsync(): Promise<Map<number, IProcessInfo>>;
 | 
			
		||||
    /**
 | 
			
		||||
     * {@inheritDoc Executable.getProcessInfoByIdAsync}
 | 
			
		||||
     */
 | 
			
		||||
    static getProcessInfoById(): Map<number, IProcessInfo>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the list of processes currently running on the system, keyed by the process name. All processes
 | 
			
		||||
     * with the same name will be grouped.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks The underlying implementation depends on the operating system:
 | 
			
		||||
     * - On Windows, this uses the `wmic.exe` utility.
 | 
			
		||||
     * - On Unix, this uses the `ps` utility.
 | 
			
		||||
     */
 | 
			
		||||
    static getProcessInfoByNameAsync(): Promise<Map<string, IProcessInfo[]>>;
 | 
			
		||||
    /**
 | 
			
		||||
     * {@inheritDoc Executable.getProcessInfoByNameAsync}
 | 
			
		||||
     */
 | 
			
		||||
    static getProcessInfoByName(): Map<string, IProcessInfo[]>;
 | 
			
		||||
    private static _buildCommandLineFixup;
 | 
			
		||||
    /**
 | 
			
		||||
     * Given a filename, this determines the absolute path of the executable file that would
 | 
			
		||||
     * be executed by a shell:
 | 
			
		||||
     *
 | 
			
		||||
     * - If the filename is missing a path, then the shell's default PATH will be searched.
 | 
			
		||||
     * - If the filename is missing a file extension, then Windows default file extensions
 | 
			
		||||
     *   will be searched.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     *
 | 
			
		||||
     * @param filename - The name of the executable file.  This string must not contain any
 | 
			
		||||
     * command-line arguments.  If the name contains any path delimiters, then the shell's
 | 
			
		||||
     * default PATH will not be searched.
 | 
			
		||||
     * @param options - optional other parameters
 | 
			
		||||
     * @returns the absolute path of the executable, or undefined if it was not found
 | 
			
		||||
     */
 | 
			
		||||
    static tryResolve(filename: string, options?: IExecutableResolveOptions): string | undefined;
 | 
			
		||||
    private static _tryResolve;
 | 
			
		||||
    private static _tryResolveFileExtension;
 | 
			
		||||
    private static _buildEnvironmentMap;
 | 
			
		||||
    /**
 | 
			
		||||
     * This is used when searching the shell PATH for an executable, to determine
 | 
			
		||||
     * whether a match should be skipped or not.  If it returns true, this does not
 | 
			
		||||
     * guarantee that the file can be successfully executed.
 | 
			
		||||
     */
 | 
			
		||||
    private static _canExecute;
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the list of folders where we will search for an executable,
 | 
			
		||||
     * based on the PATH environment variable.
 | 
			
		||||
     */
 | 
			
		||||
    private static _getSearchFolders;
 | 
			
		||||
    private static _getExecutableContext;
 | 
			
		||||
    /**
 | 
			
		||||
     * Given an input string containing special symbol characters, this inserts the "^" escape
 | 
			
		||||
     * character to ensure the symbols are interpreted literally by the Windows shell.
 | 
			
		||||
     */
 | 
			
		||||
    private static _getEscapedForWindowsShell;
 | 
			
		||||
    /**
 | 
			
		||||
     * Checks for characters that are unsafe to pass to a Windows batch file
 | 
			
		||||
     * due to the way that cmd.exe implements escaping.
 | 
			
		||||
     */
 | 
			
		||||
    private static _validateArgsForWindowsShell;
 | 
			
		||||
}
 | 
			
		||||
//# sourceMappingURL=Executable.d.ts.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/Executable.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/Executable.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"Executable.d.ts","sourceRoot":"","sources":["../src/Executable.ts"],"names":[],"mappings":";;;;AAGA,OAAO,KAAK,aAAa,MAAM,eAAe,CAAC;AAG/C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAOlD;;;GAGG;AACH,MAAM,MAAM,4BAA4B,GACpC,MAAM,GACN,QAAQ,GACR,SAAS,GACT,MAAM,CAAC,cAAc,GACrB,MAAM,CAAC,cAAc,GACrB,MAAM,GACN,SAAS,CAAC;AAEd;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,4BAA4B,EAAE,CAAC;AAEpG;;;GAGG;AACH,MAAM,WAAW,yBAAyB;IACxC;;OAEG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAEjC;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAEhC;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED;;;GAGG;AACH,MAAM,WAAW,2BAA4B,SAAQ,yBAAyB;IAC5E;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;;;OAKG;IACH,KAAK,CAAC,EAAE,sBAAsB,CAAC;IAE/B;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAwB,SAAQ,yBAAyB;IACxE;;;;;OAKG;IACH,KAAK,CAAC,EAAE,sBAAsB,CAAC;CAChC;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAEjC;;OAEG;IACH,QAAQ,CAAC,EAAE,cAAc,GAAG,QAAQ,CAAC;CACtC;AAED;;;;GAIG;AACH,MAAM,WAAW,6BAA8B,SAAQ,mBAAmB;IACxE;;OAEG;IACH,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED;;;;GAIG;AACH,MAAM,WAAW,6BAA8B,SAAQ,mBAAmB;IACxE;;OAEG;IACH,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK;IAC3E;;OAEG;IACH,MAAM,EAAE,CAAC,CAAC;IAEV;;OAEG;IACH,MAAM,EAAE,CAAC,CAAC;IAEV;;OAEG;IAEH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAeD;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;;OAKG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;;;;OAKG;IACH,iBAAiB,EAAE,YAAY,GAAG,SAAS,CAAC;IAE5C;;OAEG;IACH,iBAAiB,EAAE,YAAY,EAAE,CAAC;CACnC;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,MAAM,CAAC,cAAc,GAC5B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAWpC;AAGD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAWjG;AAmGD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,qBAAa,UAAU;IACrB;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;WACW,SAAS,CACrB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE,2BAA2B,GACpC,aAAa,CAAC,gBAAgB,CAAC,MAAM,CAAC;IAqCzC;;;;;;;;;;;;;;;;;;;;;;OAsBG;WACW,KAAK,CACjB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE,uBAAuB,GAChC,aAAa,CAAC,YAAY;IA+B7B,oDAAoD;WAChC,gBAAgB,CAClC,YAAY,EAAE,aAAa,CAAC,YAAY,EACxC,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAEtC,oDAAoD;WAChC,gBAAgB,CAClC,YAAY,EAAE,aAAa,CAAC,YAAY,EACxC,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAEtC;;;;;OAKG;WACiB,gBAAgB,CAClC,YAAY,EAAE,aAAa,CAAC,YAAY,EACxC,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAsErC;;;;;;OAMG;WACiB,uBAAuB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAgBjF;;OAEG;WACW,kBAAkB,IAAI,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC;IAY7D;;;;;;;OAOG;WACiB,yBAAyB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IAKrF;;OAEG;WACW,oBAAoB,IAAI,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC;IAoBjE,OAAO,CAAC,MAAM,CAAC,sBAAsB;IA0DrC;;;;;;;;;;;;;;;OAeG;WACW,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,yBAAyB,GAAG,MAAM,GAAG,SAAS;IAInG,OAAO,CAAC,MAAM,CAAC,WAAW;IAgC1B,OAAO,CAAC,MAAM,CAAC,wBAAwB;IAoBvC,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAkBnC;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IAgC1B;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAsChC,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAqCpC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,0BAA0B;IAKzC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,4BAA4B;CAwB5C"}
 | 
			
		||||
							
								
								
									
										680
									
								
								node_modules/@rushstack/node-core-library/lib/Executable.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										680
									
								
								node_modules/@rushstack/node-core-library/lib/Executable.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,680 @@
 | 
			
		||||
"use strict";
 | 
			
		||||
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 | 
			
		||||
// See LICENSE in the project root for license information.
 | 
			
		||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    var desc = Object.getOwnPropertyDescriptor(m, k);
 | 
			
		||||
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
 | 
			
		||||
      desc = { enumerable: true, get: function() { return m[k]; } };
 | 
			
		||||
    }
 | 
			
		||||
    Object.defineProperty(o, k2, desc);
 | 
			
		||||
}) : (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    o[k2] = m[k];
 | 
			
		||||
}));
 | 
			
		||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
 | 
			
		||||
    Object.defineProperty(o, "default", { enumerable: true, value: v });
 | 
			
		||||
}) : function(o, v) {
 | 
			
		||||
    o["default"] = v;
 | 
			
		||||
});
 | 
			
		||||
var __importStar = (this && this.__importStar) || function (mod) {
 | 
			
		||||
    if (mod && mod.__esModule) return mod;
 | 
			
		||||
    var result = {};
 | 
			
		||||
    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
 | 
			
		||||
    __setModuleDefault(result, mod);
 | 
			
		||||
    return result;
 | 
			
		||||
};
 | 
			
		||||
var __asyncValues = (this && this.__asyncValues) || function (o) {
 | 
			
		||||
    if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
 | 
			
		||||
    var m = o[Symbol.asyncIterator], i;
 | 
			
		||||
    return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
 | 
			
		||||
    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
 | 
			
		||||
    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
 | 
			
		||||
};
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.Executable = exports.parseProcessListOutput = exports.parseProcessListOutputAsync = void 0;
 | 
			
		||||
const child_process = __importStar(require("child_process"));
 | 
			
		||||
const os = __importStar(require("os"));
 | 
			
		||||
const path = __importStar(require("path"));
 | 
			
		||||
const EnvironmentMap_1 = require("./EnvironmentMap");
 | 
			
		||||
const FileSystem_1 = require("./FileSystem");
 | 
			
		||||
const PosixModeBits_1 = require("./PosixModeBits");
 | 
			
		||||
const Text_1 = require("./Text");
 | 
			
		||||
const InternalError_1 = require("./InternalError");
 | 
			
		||||
async function parseProcessListOutputAsync(stream) {
 | 
			
		||||
    var _a, e_1, _b, _c;
 | 
			
		||||
    const processInfoById = new Map();
 | 
			
		||||
    let seenHeaders = false;
 | 
			
		||||
    try {
 | 
			
		||||
        for (var _d = true, _e = __asyncValues(Text_1.Text.readLinesFromIterableAsync(stream, { ignoreEmptyLines: true })), _f; _f = await _e.next(), _a = _f.done, !_a;) {
 | 
			
		||||
            _c = _f.value;
 | 
			
		||||
            _d = false;
 | 
			
		||||
            try {
 | 
			
		||||
                const line = _c;
 | 
			
		||||
                if (!seenHeaders) {
 | 
			
		||||
                    seenHeaders = true;
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    parseProcessInfoEntry(line, processInfoById);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            finally {
 | 
			
		||||
                _d = true;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    catch (e_1_1) { e_1 = { error: e_1_1 }; }
 | 
			
		||||
    finally {
 | 
			
		||||
        try {
 | 
			
		||||
            if (!_d && !_a && (_b = _e.return)) await _b.call(_e);
 | 
			
		||||
        }
 | 
			
		||||
        finally { if (e_1) throw e_1.error; }
 | 
			
		||||
    }
 | 
			
		||||
    return processInfoById;
 | 
			
		||||
}
 | 
			
		||||
exports.parseProcessListOutputAsync = parseProcessListOutputAsync;
 | 
			
		||||
// eslint-disable-next-line @rushstack/no-new-null
 | 
			
		||||
function parseProcessListOutput(output) {
 | 
			
		||||
    const processInfoById = new Map();
 | 
			
		||||
    let seenHeaders = false;
 | 
			
		||||
    for (const line of Text_1.Text.readLinesFromIterable(output, { ignoreEmptyLines: true })) {
 | 
			
		||||
        if (!seenHeaders) {
 | 
			
		||||
            seenHeaders = true;
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            parseProcessInfoEntry(line, processInfoById);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return processInfoById;
 | 
			
		||||
}
 | 
			
		||||
exports.parseProcessListOutput = parseProcessListOutput;
 | 
			
		||||
// win32 format:
 | 
			
		||||
// Name             ParentProcessId   ProcessId
 | 
			
		||||
// process name     1234              5678
 | 
			
		||||
// unix format:
 | 
			
		||||
// COMMAND             PPID     PID
 | 
			
		||||
// process name       51234   56784
 | 
			
		||||
const NAME_GROUP = 'name';
 | 
			
		||||
const PROCESS_ID_GROUP = 'pid';
 | 
			
		||||
const PARENT_PROCESS_ID_GROUP = 'ppid';
 | 
			
		||||
// eslint-disable-next-line @rushstack/security/no-unsafe-regexp
 | 
			
		||||
const PROCESS_LIST_ENTRY_REGEX = new RegExp(`^(?<${NAME_GROUP}>.+?)\\s+(?<${PARENT_PROCESS_ID_GROUP}>\\d+)\\s+(?<${PROCESS_ID_GROUP}>\\d+)\\s*$`);
 | 
			
		||||
function parseProcessInfoEntry(line, existingProcessInfoById) {
 | 
			
		||||
    const match = line.match(PROCESS_LIST_ENTRY_REGEX);
 | 
			
		||||
    if (!(match === null || match === void 0 ? void 0 : match.groups)) {
 | 
			
		||||
        throw new InternalError_1.InternalError(`Invalid process list entry: ${line}`);
 | 
			
		||||
    }
 | 
			
		||||
    const processName = match.groups[NAME_GROUP];
 | 
			
		||||
    const processId = parseInt(match.groups[PROCESS_ID_GROUP], 10);
 | 
			
		||||
    const parentProcessId = parseInt(match.groups[PARENT_PROCESS_ID_GROUP], 10);
 | 
			
		||||
    // Only care about the parent process if it is not the same as the current process.
 | 
			
		||||
    let parentProcessInfo;
 | 
			
		||||
    if (parentProcessId !== processId) {
 | 
			
		||||
        parentProcessInfo = existingProcessInfoById.get(parentProcessId);
 | 
			
		||||
        if (!parentProcessInfo) {
 | 
			
		||||
            // Create a new placeholder entry for the parent with the information we have so far
 | 
			
		||||
            parentProcessInfo = {
 | 
			
		||||
                processName: '',
 | 
			
		||||
                processId: parentProcessId,
 | 
			
		||||
                parentProcessInfo: undefined,
 | 
			
		||||
                childProcessInfos: []
 | 
			
		||||
            };
 | 
			
		||||
            existingProcessInfoById.set(parentProcessId, parentProcessInfo);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    let processInfo = existingProcessInfoById.get(processId);
 | 
			
		||||
    if (!processInfo) {
 | 
			
		||||
        // Create a new entry
 | 
			
		||||
        processInfo = {
 | 
			
		||||
            processName,
 | 
			
		||||
            processId,
 | 
			
		||||
            parentProcessInfo,
 | 
			
		||||
            childProcessInfos: []
 | 
			
		||||
        };
 | 
			
		||||
        existingProcessInfoById.set(processId, processInfo);
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        // Update placeholder entry
 | 
			
		||||
        processInfo.processName = processName;
 | 
			
		||||
        processInfo.parentProcessInfo = parentProcessInfo;
 | 
			
		||||
    }
 | 
			
		||||
    // Add the process as a child of the parent process
 | 
			
		||||
    parentProcessInfo === null || parentProcessInfo === void 0 ? void 0 : parentProcessInfo.childProcessInfos.push(processInfo);
 | 
			
		||||
}
 | 
			
		||||
function convertToProcessInfoByNameMap(processInfoById) {
 | 
			
		||||
    const processInfoByNameMap = new Map();
 | 
			
		||||
    for (const processInfo of processInfoById.values()) {
 | 
			
		||||
        let processInfoNameEntries = processInfoByNameMap.get(processInfo.processName);
 | 
			
		||||
        if (!processInfoNameEntries) {
 | 
			
		||||
            processInfoNameEntries = [];
 | 
			
		||||
            processInfoByNameMap.set(processInfo.processName, processInfoNameEntries);
 | 
			
		||||
        }
 | 
			
		||||
        processInfoNameEntries.push(processInfo);
 | 
			
		||||
    }
 | 
			
		||||
    return processInfoByNameMap;
 | 
			
		||||
}
 | 
			
		||||
const OS_PLATFORM = os.platform();
 | 
			
		||||
function getProcessListProcessOptions() {
 | 
			
		||||
    let command;
 | 
			
		||||
    let args;
 | 
			
		||||
    if (OS_PLATFORM === 'win32') {
 | 
			
		||||
        command = 'wmic.exe';
 | 
			
		||||
        // Order of declared properties does not impact the order of the output
 | 
			
		||||
        args = ['process', 'get', 'Name,ParentProcessId,ProcessId'];
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        command = 'ps';
 | 
			
		||||
        // -A: Select all processes
 | 
			
		||||
        // -o: User-defined format
 | 
			
		||||
        // Order of declared properties impacts the order of the output, so match
 | 
			
		||||
        // the order of wmic.exe output
 | 
			
		||||
        args = ['-Ao', 'comm,ppid,pid'];
 | 
			
		||||
    }
 | 
			
		||||
    return { path: command, args };
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * The Executable class provides a safe, portable, recommended solution for tools that need
 | 
			
		||||
 * to launch child processes.
 | 
			
		||||
 *
 | 
			
		||||
 * @remarks
 | 
			
		||||
 * The NodeJS child_process API provides a solution for launching child processes, however
 | 
			
		||||
 * its design encourages reliance on the operating system shell for certain features.
 | 
			
		||||
 * Invoking the OS shell is not safe, not portable, and generally not recommended:
 | 
			
		||||
 *
 | 
			
		||||
 * - Different shells have different behavior and command-line syntax, and which shell you
 | 
			
		||||
 *   will get with NodeJS is unpredictable.  There is no universal shell guaranteed to be
 | 
			
		||||
 *   available on all platforms.
 | 
			
		||||
 *
 | 
			
		||||
 * - If a command parameter contains symbol characters, a shell may interpret them, which
 | 
			
		||||
 *   can introduce a security vulnerability
 | 
			
		||||
 *
 | 
			
		||||
 * - Each shell has different rules for escaping these symbols.  On Windows, the default
 | 
			
		||||
 *   shell is incapable of escaping certain character sequences.
 | 
			
		||||
 *
 | 
			
		||||
 * The Executable API provides a pure JavaScript implementation of primitive shell-like
 | 
			
		||||
 * functionality for searching the default PATH, appending default file extensions on Windows,
 | 
			
		||||
 * and executing a file that may contain a POSIX shebang.  This primitive functionality
 | 
			
		||||
 * is sufficient (and recommended) for most tooling scenarios.
 | 
			
		||||
 *
 | 
			
		||||
 * If you need additional shell features such as wildcard globbing, environment variable
 | 
			
		||||
 * expansion, piping, or built-in commands, then we recommend to use the `@microsoft/rushell`
 | 
			
		||||
 * library instead.  Rushell is a pure JavaScript shell with a standard syntax that is
 | 
			
		||||
 * guaranteed to work consistently across all platforms.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
class Executable {
 | 
			
		||||
    /**
 | 
			
		||||
     * Synchronously create a child process and optionally capture its output.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * This function is similar to child_process.spawnSync().  The main differences are:
 | 
			
		||||
     *
 | 
			
		||||
     * - It does not invoke the OS shell unless the executable file is a shell script.
 | 
			
		||||
     * - Command-line arguments containing special characters are more accurately passed
 | 
			
		||||
     *   through to the child process.
 | 
			
		||||
     * - If the filename is missing a path, then the shell's default PATH will be searched.
 | 
			
		||||
     * - If the filename is missing a file extension, then Windows default file extensions
 | 
			
		||||
     *   will be searched.
 | 
			
		||||
     *
 | 
			
		||||
     * @param filename - The name of the executable file.  This string must not contain any
 | 
			
		||||
     * command-line arguments.  If the name contains any path delimiters, then the shell's
 | 
			
		||||
     * default PATH will not be searched.
 | 
			
		||||
     * @param args - The command-line arguments to be passed to the process.
 | 
			
		||||
     * @param options - Additional options
 | 
			
		||||
     * @returns the same data type as returned by the NodeJS child_process.spawnSync() API
 | 
			
		||||
     *
 | 
			
		||||
     * @privateRemarks
 | 
			
		||||
     *
 | 
			
		||||
     * NOTE: The NodeJS spawnSync() returns SpawnSyncReturns<string> or SpawnSyncReturns<Buffer>
 | 
			
		||||
     * polymorphically based on the options.encoding parameter value.  This is a fairly confusing
 | 
			
		||||
     * design.  In most cases, developers want string with the default encoding.  If/when someone
 | 
			
		||||
     * wants binary output or a non-default text encoding, we will introduce a separate API function
 | 
			
		||||
     * with a name like "spawnWithBufferSync".
 | 
			
		||||
     */
 | 
			
		||||
    static spawnSync(filename, args, options) {
 | 
			
		||||
        if (!options) {
 | 
			
		||||
            options = {};
 | 
			
		||||
        }
 | 
			
		||||
        const context = Executable._getExecutableContext(options);
 | 
			
		||||
        const resolvedPath = Executable._tryResolve(filename, options, context);
 | 
			
		||||
        if (!resolvedPath) {
 | 
			
		||||
            throw new Error(`The executable file was not found: "${filename}"`);
 | 
			
		||||
        }
 | 
			
		||||
        const spawnOptions = {
 | 
			
		||||
            cwd: context.currentWorkingDirectory,
 | 
			
		||||
            env: context.environmentMap.toObject(),
 | 
			
		||||
            input: options.input,
 | 
			
		||||
            stdio: options.stdio,
 | 
			
		||||
            timeout: options.timeoutMs,
 | 
			
		||||
            maxBuffer: options.maxBuffer,
 | 
			
		||||
            // Contrary to what the NodeJS typings imply, we must explicitly specify "utf8" here
 | 
			
		||||
            // if we want the result to be SpawnSyncReturns<string> instead of SpawnSyncReturns<Buffer>.
 | 
			
		||||
            encoding: 'utf8',
 | 
			
		||||
            // NOTE: This is always false, because Rushell will be recommended instead of relying on the OS shell.
 | 
			
		||||
            shell: false
 | 
			
		||||
        };
 | 
			
		||||
        const normalizedCommandLine = Executable._buildCommandLineFixup(resolvedPath, args, context);
 | 
			
		||||
        return child_process.spawnSync(normalizedCommandLine.path, normalizedCommandLine.args, spawnOptions);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Start a child process.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * This function is similar to child_process.spawn().  The main differences are:
 | 
			
		||||
     *
 | 
			
		||||
     * - It does not invoke the OS shell unless the executable file is a shell script.
 | 
			
		||||
     * - Command-line arguments containing special characters are more accurately passed
 | 
			
		||||
     *   through to the child process.
 | 
			
		||||
     * - If the filename is missing a path, then the shell's default PATH will be searched.
 | 
			
		||||
     * - If the filename is missing a file extension, then Windows default file extensions
 | 
			
		||||
     *   will be searched.
 | 
			
		||||
     *
 | 
			
		||||
     * This command is asynchronous, but it does not return a `Promise`.  Instead it returns
 | 
			
		||||
     * a Node.js `ChildProcess` supporting event notifications.
 | 
			
		||||
     *
 | 
			
		||||
     * @param filename - The name of the executable file.  This string must not contain any
 | 
			
		||||
     * command-line arguments.  If the name contains any path delimiters, then the shell's
 | 
			
		||||
     * default PATH will not be searched.
 | 
			
		||||
     * @param args - The command-line arguments to be passed to the process.
 | 
			
		||||
     * @param options - Additional options
 | 
			
		||||
     * @returns the same data type as returned by the NodeJS child_process.spawnSync() API
 | 
			
		||||
     */
 | 
			
		||||
    static spawn(filename, args, options) {
 | 
			
		||||
        if (!options) {
 | 
			
		||||
            options = {};
 | 
			
		||||
        }
 | 
			
		||||
        const context = Executable._getExecutableContext(options);
 | 
			
		||||
        const resolvedPath = Executable._tryResolve(filename, options, context);
 | 
			
		||||
        if (!resolvedPath) {
 | 
			
		||||
            throw new Error(`The executable file was not found: "${filename}"`);
 | 
			
		||||
        }
 | 
			
		||||
        const spawnOptions = {
 | 
			
		||||
            cwd: context.currentWorkingDirectory,
 | 
			
		||||
            env: context.environmentMap.toObject(),
 | 
			
		||||
            stdio: options.stdio,
 | 
			
		||||
            // NOTE: This is always false, because Rushell will be recommended instead of relying on the OS shell.
 | 
			
		||||
            shell: false
 | 
			
		||||
        };
 | 
			
		||||
        const normalizedCommandLine = Executable._buildCommandLineFixup(resolvedPath, args, context);
 | 
			
		||||
        return child_process.spawn(normalizedCommandLine.path, normalizedCommandLine.args, spawnOptions);
 | 
			
		||||
    }
 | 
			
		||||
    static async waitForExitAsync(childProcess, options = {}) {
 | 
			
		||||
        const { throwOnNonZeroExitCode = false, encoding } = options;
 | 
			
		||||
        if (encoding && (!childProcess.stdout || !childProcess.stderr)) {
 | 
			
		||||
            throw new Error('An encoding was specified, but stdout and/or stderr on the child process are not defined');
 | 
			
		||||
        }
 | 
			
		||||
        const collectedStdout = [];
 | 
			
		||||
        const collectedStderr = [];
 | 
			
		||||
        const useBufferEncoding = encoding === 'buffer';
 | 
			
		||||
        function normalizeChunk(chunk) {
 | 
			
		||||
            if (typeof chunk === 'string') {
 | 
			
		||||
                return (useBufferEncoding ? Buffer.from(chunk) : chunk);
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                return (useBufferEncoding ? chunk : chunk.toString(encoding));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        let errorThrown = false;
 | 
			
		||||
        const exitCode = await new Promise((resolve, reject) => {
 | 
			
		||||
            if (encoding) {
 | 
			
		||||
                childProcess.stdout.on('data', (chunk) => {
 | 
			
		||||
                    collectedStdout.push(normalizeChunk(chunk));
 | 
			
		||||
                });
 | 
			
		||||
                childProcess.stderr.on('data', (chunk) => {
 | 
			
		||||
                    collectedStderr.push(normalizeChunk(chunk));
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
            childProcess.on('error', (error) => {
 | 
			
		||||
                errorThrown = true;
 | 
			
		||||
                reject(error);
 | 
			
		||||
            });
 | 
			
		||||
            childProcess.on('exit', (code) => {
 | 
			
		||||
                if (errorThrown) {
 | 
			
		||||
                    // We've already rejected the promise
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                if (code !== 0 && throwOnNonZeroExitCode) {
 | 
			
		||||
                    reject(new Error(`Process exited with code ${code}`));
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    resolve(code);
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
        const result = {
 | 
			
		||||
            exitCode
 | 
			
		||||
        };
 | 
			
		||||
        if (encoding === 'buffer') {
 | 
			
		||||
            result.stdout = Buffer.concat(collectedStdout);
 | 
			
		||||
            result.stderr = Buffer.concat(collectedStderr);
 | 
			
		||||
        }
 | 
			
		||||
        else if (encoding) {
 | 
			
		||||
            result.stdout = collectedStdout.join('');
 | 
			
		||||
            result.stderr = collectedStderr.join('');
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
    /* eslint-enable @rushstack/no-new-null */
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the list of processes currently running on the system, keyed by the process ID.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks The underlying implementation depends on the operating system:
 | 
			
		||||
     * - On Windows, this uses the `wmic.exe` utility.
 | 
			
		||||
     * - On Unix, this uses the `ps` utility.
 | 
			
		||||
     */
 | 
			
		||||
    static async getProcessInfoByIdAsync() {
 | 
			
		||||
        const { path: command, args } = getProcessListProcessOptions();
 | 
			
		||||
        const process = Executable.spawn(command, args, {
 | 
			
		||||
            stdio: ['ignore', 'pipe', 'ignore']
 | 
			
		||||
        });
 | 
			
		||||
        if (process.stdout === null) {
 | 
			
		||||
            throw new InternalError_1.InternalError('Child process did not provide stdout');
 | 
			
		||||
        }
 | 
			
		||||
        const [processInfoByIdMap] = await Promise.all([
 | 
			
		||||
            parseProcessListOutputAsync(process.stdout),
 | 
			
		||||
            // Don't collect output in the result since we process it directly
 | 
			
		||||
            Executable.waitForExitAsync(process, { throwOnNonZeroExitCode: true })
 | 
			
		||||
        ]);
 | 
			
		||||
        return processInfoByIdMap;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * {@inheritDoc Executable.getProcessInfoByIdAsync}
 | 
			
		||||
     */
 | 
			
		||||
    static getProcessInfoById() {
 | 
			
		||||
        const { path: command, args } = getProcessListProcessOptions();
 | 
			
		||||
        const processOutput = Executable.spawnSync(command, args);
 | 
			
		||||
        if (processOutput.error) {
 | 
			
		||||
            throw new Error(`Unable to list processes: ${command} failed with error ${processOutput.error}`);
 | 
			
		||||
        }
 | 
			
		||||
        if (processOutput.status !== 0) {
 | 
			
		||||
            throw new Error(`Unable to list processes: ${command} exited with code ${processOutput.status}`);
 | 
			
		||||
        }
 | 
			
		||||
        return parseProcessListOutput(processOutput.output);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the list of processes currently running on the system, keyed by the process name. All processes
 | 
			
		||||
     * with the same name will be grouped.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks The underlying implementation depends on the operating system:
 | 
			
		||||
     * - On Windows, this uses the `wmic.exe` utility.
 | 
			
		||||
     * - On Unix, this uses the `ps` utility.
 | 
			
		||||
     */
 | 
			
		||||
    static async getProcessInfoByNameAsync() {
 | 
			
		||||
        const processInfoById = await Executable.getProcessInfoByIdAsync();
 | 
			
		||||
        return convertToProcessInfoByNameMap(processInfoById);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * {@inheritDoc Executable.getProcessInfoByNameAsync}
 | 
			
		||||
     */
 | 
			
		||||
    static getProcessInfoByName() {
 | 
			
		||||
        const processInfoByIdMap = Executable.getProcessInfoById();
 | 
			
		||||
        return convertToProcessInfoByNameMap(processInfoByIdMap);
 | 
			
		||||
    }
 | 
			
		||||
    // PROBLEM: Given an "args" array of strings that may contain special characters (e.g. spaces,
 | 
			
		||||
    // backslashes, quotes), ensure that these strings pass through to the child process's ARGV array
 | 
			
		||||
    // without anything getting corrupted along the way.
 | 
			
		||||
    //
 | 
			
		||||
    // On Unix you just pass the array to spawnSync().  But on Windows, this is a very complex problem:
 | 
			
		||||
    // - The Win32 CreateProcess() API expects the args to be encoded as a single text string
 | 
			
		||||
    // - The decoding of this string is up to the application (not the OS), and there are 3 different
 | 
			
		||||
    //   algorithms in common usage:  the cmd.exe shell, the Microsoft CRT library init code, and
 | 
			
		||||
    //   the Win32 CommandLineToArgvW()
 | 
			
		||||
    // - The encodings are counterintuitive and have lots of special cases
 | 
			
		||||
    // - NodeJS spawnSync() tries do the encoding without knowing which decoder will be used
 | 
			
		||||
    //
 | 
			
		||||
    // See these articles for a full analysis:
 | 
			
		||||
    // http://www.windowsinspired.com/understanding-the-command-line-string-and-arguments-received-by-a-windows-program/
 | 
			
		||||
    // http://www.windowsinspired.com/how-a-windows-programs-splits-its-command-line-into-individual-arguments/
 | 
			
		||||
    static _buildCommandLineFixup(resolvedPath, args, context) {
 | 
			
		||||
        const fileExtension = path.extname(resolvedPath);
 | 
			
		||||
        if (OS_PLATFORM === 'win32') {
 | 
			
		||||
            // Do we need a custom handler for this file type?
 | 
			
		||||
            switch (fileExtension.toUpperCase()) {
 | 
			
		||||
                case '.EXE':
 | 
			
		||||
                case '.COM':
 | 
			
		||||
                    // okay to execute directly
 | 
			
		||||
                    break;
 | 
			
		||||
                case '.BAT':
 | 
			
		||||
                case '.CMD': {
 | 
			
		||||
                    Executable._validateArgsForWindowsShell(args);
 | 
			
		||||
                    // These file types must be invoked via the Windows shell
 | 
			
		||||
                    let shellPath = context.environmentMap.get('COMSPEC');
 | 
			
		||||
                    if (!shellPath || !Executable._canExecute(shellPath, context)) {
 | 
			
		||||
                        shellPath = Executable.tryResolve('cmd.exe');
 | 
			
		||||
                    }
 | 
			
		||||
                    if (!shellPath) {
 | 
			
		||||
                        throw new Error(`Unable to execute "${path.basename(resolvedPath)}" ` +
 | 
			
		||||
                            `because CMD.exe was not found in the PATH`);
 | 
			
		||||
                    }
 | 
			
		||||
                    const shellArgs = [];
 | 
			
		||||
                    // /D: Disable execution of AutoRun commands when starting the new shell context
 | 
			
		||||
                    shellArgs.push('/d');
 | 
			
		||||
                    // /S: Disable Cmd.exe's parsing of double-quote characters inside the command-line
 | 
			
		||||
                    shellArgs.push('/s');
 | 
			
		||||
                    // /C: Execute the following command and then exit immediately
 | 
			
		||||
                    shellArgs.push('/c');
 | 
			
		||||
                    // If the path contains special charactrers (e.g. spaces), escape them so that
 | 
			
		||||
                    // they don't get interpreted by the shell
 | 
			
		||||
                    shellArgs.push(Executable._getEscapedForWindowsShell(resolvedPath));
 | 
			
		||||
                    shellArgs.push(...args);
 | 
			
		||||
                    return { path: shellPath, args: shellArgs };
 | 
			
		||||
                }
 | 
			
		||||
                default:
 | 
			
		||||
                    throw new Error(`Cannot execute "${path.basename(resolvedPath)}" because the file type is not supported`);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return {
 | 
			
		||||
            path: resolvedPath,
 | 
			
		||||
            args: args
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Given a filename, this determines the absolute path of the executable file that would
 | 
			
		||||
     * be executed by a shell:
 | 
			
		||||
     *
 | 
			
		||||
     * - If the filename is missing a path, then the shell's default PATH will be searched.
 | 
			
		||||
     * - If the filename is missing a file extension, then Windows default file extensions
 | 
			
		||||
     *   will be searched.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     *
 | 
			
		||||
     * @param filename - The name of the executable file.  This string must not contain any
 | 
			
		||||
     * command-line arguments.  If the name contains any path delimiters, then the shell's
 | 
			
		||||
     * default PATH will not be searched.
 | 
			
		||||
     * @param options - optional other parameters
 | 
			
		||||
     * @returns the absolute path of the executable, or undefined if it was not found
 | 
			
		||||
     */
 | 
			
		||||
    static tryResolve(filename, options) {
 | 
			
		||||
        return Executable._tryResolve(filename, options || {}, Executable._getExecutableContext(options));
 | 
			
		||||
    }
 | 
			
		||||
    static _tryResolve(filename, options, context) {
 | 
			
		||||
        // NOTE: Since "filename" cannot contain command-line arguments, the "/" here
 | 
			
		||||
        // must be interpreted as a path delimiter
 | 
			
		||||
        const hasPathSeparators = filename.indexOf('/') >= 0 || (OS_PLATFORM === 'win32' && filename.indexOf('\\') >= 0);
 | 
			
		||||
        // Are there any path separators?
 | 
			
		||||
        if (hasPathSeparators) {
 | 
			
		||||
            // If so, then don't search the PATH.  Just resolve relative to the current working directory
 | 
			
		||||
            const resolvedPath = path.resolve(context.currentWorkingDirectory, filename);
 | 
			
		||||
            return Executable._tryResolveFileExtension(resolvedPath, context);
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            // Otherwise if it's a bare name, then try everything in the shell PATH
 | 
			
		||||
            const pathsToSearch = Executable._getSearchFolders(context);
 | 
			
		||||
            for (const pathToSearch of pathsToSearch) {
 | 
			
		||||
                const resolvedPath = path.join(pathToSearch, filename);
 | 
			
		||||
                const result = Executable._tryResolveFileExtension(resolvedPath, context);
 | 
			
		||||
                if (result) {
 | 
			
		||||
                    return result;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            // No match was found
 | 
			
		||||
            return undefined;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    static _tryResolveFileExtension(resolvedPath, context) {
 | 
			
		||||
        if (Executable._canExecute(resolvedPath, context)) {
 | 
			
		||||
            return resolvedPath;
 | 
			
		||||
        }
 | 
			
		||||
        // Try the default file extensions
 | 
			
		||||
        for (const shellExtension of context.windowsExecutableExtensions) {
 | 
			
		||||
            const resolvedNameWithExtension = resolvedPath + shellExtension;
 | 
			
		||||
            if (Executable._canExecute(resolvedNameWithExtension, context)) {
 | 
			
		||||
                return resolvedNameWithExtension;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return undefined;
 | 
			
		||||
    }
 | 
			
		||||
    static _buildEnvironmentMap(options) {
 | 
			
		||||
        const environmentMap = new EnvironmentMap_1.EnvironmentMap();
 | 
			
		||||
        if (options.environment !== undefined && options.environmentMap !== undefined) {
 | 
			
		||||
            throw new Error('IExecutableResolveOptions.environment and IExecutableResolveOptions.environmentMap' +
 | 
			
		||||
                ' cannot both be specified');
 | 
			
		||||
        }
 | 
			
		||||
        if (options.environment !== undefined) {
 | 
			
		||||
            environmentMap.mergeFromObject(options.environment);
 | 
			
		||||
        }
 | 
			
		||||
        else if (options.environmentMap !== undefined) {
 | 
			
		||||
            environmentMap.mergeFrom(options.environmentMap);
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            environmentMap.mergeFromObject(process.env);
 | 
			
		||||
        }
 | 
			
		||||
        return environmentMap;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * This is used when searching the shell PATH for an executable, to determine
 | 
			
		||||
     * whether a match should be skipped or not.  If it returns true, this does not
 | 
			
		||||
     * guarantee that the file can be successfully executed.
 | 
			
		||||
     */
 | 
			
		||||
    static _canExecute(filePath, context) {
 | 
			
		||||
        if (!FileSystem_1.FileSystem.exists(filePath)) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        if (OS_PLATFORM === 'win32') {
 | 
			
		||||
            // NOTE: For Windows, we don't validate that the file extension appears in PATHEXT.
 | 
			
		||||
            // That environment variable determines which extensions can be appended if the
 | 
			
		||||
            // extension is missing, but it does not affect whether a file may be executed or not.
 | 
			
		||||
            // Windows does have a (seldom used) ACL that can be used to deny execution permissions
 | 
			
		||||
            // for a file, but NodeJS doesn't expose that API, so we don't bother checking it.
 | 
			
		||||
            // However, Windows *does* require that the file has some kind of file extension
 | 
			
		||||
            if (path.extname(filePath) === '') {
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            // For Unix, check whether any of the POSIX execute bits are set
 | 
			
		||||
            try {
 | 
			
		||||
                // eslint-disable-next-line no-bitwise
 | 
			
		||||
                if ((FileSystem_1.FileSystem.getPosixModeBits(filePath) & PosixModeBits_1.PosixModeBits.AllExecute) === 0) {
 | 
			
		||||
                    return false; // not executable
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            catch (error) {
 | 
			
		||||
                // If we have trouble accessing the file, ignore the error and consider it "not executable"
 | 
			
		||||
                // since that's what a shell would do
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the list of folders where we will search for an executable,
 | 
			
		||||
     * based on the PATH environment variable.
 | 
			
		||||
     */
 | 
			
		||||
    static _getSearchFolders(context) {
 | 
			
		||||
        const pathList = context.environmentMap.get('PATH') || '';
 | 
			
		||||
        const folders = [];
 | 
			
		||||
        // Avoid processing duplicates
 | 
			
		||||
        const seenPaths = new Set();
 | 
			
		||||
        // NOTE: Cmd.exe on Windows always searches the current working directory first.
 | 
			
		||||
        // PowerShell and Unix shells do NOT do that, because it's a security concern.
 | 
			
		||||
        // We follow their behavior.
 | 
			
		||||
        for (const splitPath of pathList.split(path.delimiter)) {
 | 
			
		||||
            const trimmedPath = splitPath.trim();
 | 
			
		||||
            if (trimmedPath !== '') {
 | 
			
		||||
                if (!seenPaths.has(trimmedPath)) {
 | 
			
		||||
                    // Fun fact: If you put relative paths in your PATH environment variable,
 | 
			
		||||
                    // all shells will dynamically match them against the current working directory.
 | 
			
		||||
                    // This is a terrible design, and in practice nobody does that, but it is supported...
 | 
			
		||||
                    // so we allow it here.
 | 
			
		||||
                    const resolvedPath = path.resolve(context.currentWorkingDirectory, trimmedPath);
 | 
			
		||||
                    if (!seenPaths.has(resolvedPath)) {
 | 
			
		||||
                        if (FileSystem_1.FileSystem.exists(resolvedPath)) {
 | 
			
		||||
                            folders.push(resolvedPath);
 | 
			
		||||
                        }
 | 
			
		||||
                        seenPaths.add(resolvedPath);
 | 
			
		||||
                    }
 | 
			
		||||
                    seenPaths.add(trimmedPath);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return folders;
 | 
			
		||||
    }
 | 
			
		||||
    static _getExecutableContext(options) {
 | 
			
		||||
        if (!options) {
 | 
			
		||||
            options = {};
 | 
			
		||||
        }
 | 
			
		||||
        const environment = Executable._buildEnvironmentMap(options);
 | 
			
		||||
        let currentWorkingDirectory;
 | 
			
		||||
        if (options.currentWorkingDirectory) {
 | 
			
		||||
            currentWorkingDirectory = path.resolve(options.currentWorkingDirectory);
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            currentWorkingDirectory = process.cwd();
 | 
			
		||||
        }
 | 
			
		||||
        const windowsExecutableExtensions = [];
 | 
			
		||||
        if (OS_PLATFORM === 'win32') {
 | 
			
		||||
            const pathExtVariable = environment.get('PATHEXT') || '';
 | 
			
		||||
            for (const splitValue of pathExtVariable.split(';')) {
 | 
			
		||||
                const trimmed = splitValue.trim().toLowerCase();
 | 
			
		||||
                // Ignore malformed extensions
 | 
			
		||||
                if (/^\.[a-z0-9\.]*[a-z0-9]$/i.test(trimmed)) {
 | 
			
		||||
                    // Don't add the same extension twice
 | 
			
		||||
                    if (windowsExecutableExtensions.indexOf(trimmed) < 0) {
 | 
			
		||||
                        windowsExecutableExtensions.push(trimmed);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return {
 | 
			
		||||
            environmentMap: environment,
 | 
			
		||||
            currentWorkingDirectory,
 | 
			
		||||
            windowsExecutableExtensions
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Given an input string containing special symbol characters, this inserts the "^" escape
 | 
			
		||||
     * character to ensure the symbols are interpreted literally by the Windows shell.
 | 
			
		||||
     */
 | 
			
		||||
    static _getEscapedForWindowsShell(text) {
 | 
			
		||||
        const escapableCharRegExp = /[%\^&|<> ]/g;
 | 
			
		||||
        return text.replace(escapableCharRegExp, (value) => '^' + value);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Checks for characters that are unsafe to pass to a Windows batch file
 | 
			
		||||
     * due to the way that cmd.exe implements escaping.
 | 
			
		||||
     */
 | 
			
		||||
    static _validateArgsForWindowsShell(args) {
 | 
			
		||||
        const specialCharRegExp = /[%\^&|<>\r\n]/g;
 | 
			
		||||
        for (const arg of args) {
 | 
			
		||||
            const match = arg.match(specialCharRegExp);
 | 
			
		||||
            if (match) {
 | 
			
		||||
                // NOTE: It is possible to escape some of these characters by prefixing them
 | 
			
		||||
                // with a caret (^), which allows these characters to be successfully passed
 | 
			
		||||
                // through to the batch file %1 variables.  But they will be expanded again
 | 
			
		||||
                // whenever they are used.  For example, NPM's binary wrapper batch files
 | 
			
		||||
                // use "%*" to pass their arguments to Node.exe, which causes them to be expanded
 | 
			
		||||
                // again.  Unfortunately the Cmd.exe batch language provides native escaping
 | 
			
		||||
                // function (that could be used to insert the carets again).
 | 
			
		||||
                //
 | 
			
		||||
                // We could work around that by adding double carets, but in general there
 | 
			
		||||
                // is no way to predict how many times the variable will get expanded.
 | 
			
		||||
                // Thus, there is no generally reliable way to pass these characters.
 | 
			
		||||
                throw new Error(`The command line argument ${JSON.stringify(arg)} contains a` +
 | 
			
		||||
                    ` special character ${JSON.stringify(match[0])} that cannot be escaped for the Windows shell`);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
exports.Executable = Executable;
 | 
			
		||||
//# sourceMappingURL=Executable.js.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/Executable.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/Executable.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										81
									
								
								node_modules/@rushstack/node-core-library/lib/FileError.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								node_modules/@rushstack/node-core-library/lib/FileError.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,81 @@
 | 
			
		||||
import { type FileLocationStyle } from './Path';
 | 
			
		||||
/**
 | 
			
		||||
 * Provides options for the creation of a FileError.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IFileErrorOptions {
 | 
			
		||||
    /**
 | 
			
		||||
     * The absolute path to the file that contains the error.
 | 
			
		||||
     */
 | 
			
		||||
    absolutePath: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * The root folder for the project that the error is in relation to.
 | 
			
		||||
     */
 | 
			
		||||
    projectFolder: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * The line number of the error in the target file. Minimum value is 1.
 | 
			
		||||
     */
 | 
			
		||||
    line?: number;
 | 
			
		||||
    /**
 | 
			
		||||
     * The column number of the error in the target file. Minimum value is 1.
 | 
			
		||||
     */
 | 
			
		||||
    column?: number;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * Provides options for the output message of a file error.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IFileErrorFormattingOptions {
 | 
			
		||||
    /**
 | 
			
		||||
     * The format for the error message. If no format is provided, format 'Unix' is used by default.
 | 
			
		||||
     */
 | 
			
		||||
    format?: FileLocationStyle;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * An `Error` subclass that should be thrown to report an unexpected state that specifically references
 | 
			
		||||
 * a location in a file.
 | 
			
		||||
 *
 | 
			
		||||
 * @remarks The file path provided to the FileError constructor is expected to exist on disk. FileError
 | 
			
		||||
 * should not be used for reporting errors that are not in reference to an existing file.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export declare class FileError extends Error {
 | 
			
		||||
    /** @internal */
 | 
			
		||||
    static _sanitizedEnvironmentVariable: string | undefined;
 | 
			
		||||
    /** @internal */
 | 
			
		||||
    static _environmentVariableIsAbsolutePath: boolean;
 | 
			
		||||
    private static _environmentVariableBasePathFnMap;
 | 
			
		||||
    /** {@inheritdoc IFileErrorOptions.absolutePath} */
 | 
			
		||||
    readonly absolutePath: string;
 | 
			
		||||
    /** {@inheritdoc IFileErrorOptions.projectFolder} */
 | 
			
		||||
    readonly projectFolder: string;
 | 
			
		||||
    /** {@inheritdoc IFileErrorOptions.line} */
 | 
			
		||||
    readonly line: number | undefined;
 | 
			
		||||
    /** {@inheritdoc IFileErrorOptions.column} */
 | 
			
		||||
    readonly column: number | undefined;
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs a new instance of the {@link FileError} class.
 | 
			
		||||
     *
 | 
			
		||||
     * @param message - A message describing the error.
 | 
			
		||||
     * @param options - Options for the error.
 | 
			
		||||
     */
 | 
			
		||||
    constructor(message: string, options: IFileErrorOptions);
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the Unix-formatted the error message.
 | 
			
		||||
     *
 | 
			
		||||
     * @override
 | 
			
		||||
     */
 | 
			
		||||
    toString(): string;
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the formatted error message.
 | 
			
		||||
     *
 | 
			
		||||
     * @param options - Options for the error message format.
 | 
			
		||||
     */
 | 
			
		||||
    getFormattedErrorMessage(options?: IFileErrorFormattingOptions): string;
 | 
			
		||||
    private _evaluateBaseFolder;
 | 
			
		||||
    static [Symbol.hasInstance](instance: object): boolean;
 | 
			
		||||
}
 | 
			
		||||
//# sourceMappingURL=FileError.d.ts.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/FileError.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/FileError.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"FileError.d.ts","sourceRoot":"","sources":["../src/FileError.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,iBAAiB,EAAQ,MAAM,QAAQ,CAAC;AAGtD;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,2BAA2B;IAC1C;;OAEG;IACH,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC5B;AAMD;;;;;;;;GAQG;AACH,qBAAa,SAAU,SAAQ,KAAK;IAClC,gBAAgB;IAChB,OAAc,6BAA6B,EAAE,MAAM,GAAG,SAAS,CAAC;IAChE,gBAAgB;IAChB,OAAc,kCAAkC,EAAE,OAAO,CAAS;IAElE,OAAO,CAAC,MAAM,CAAC,iCAAiC,CAO7C;IAEH,mDAAmD;IACnD,SAAgB,YAAY,EAAE,MAAM,CAAC;IACrC,oDAAoD;IACpD,SAAgB,aAAa,EAAE,MAAM,CAAC;IACtC,2CAA2C;IAC3C,SAAgB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,6CAA6C;IAC7C,SAAgB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAE3C;;;;;OAKG;gBACgB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB;IAe9D;;;;OAIG;IACI,QAAQ,IAAI,MAAM;IAKzB;;;;OAIG;IACI,wBAAwB,CAAC,OAAO,CAAC,EAAE,2BAA2B,GAAG,MAAM;IAW9E,OAAO,CAAC,mBAAmB;WAgDb,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;CAG9D"}
 | 
			
		||||
							
								
								
									
										113
									
								
								node_modules/@rushstack/node-core-library/lib/FileError.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								node_modules/@rushstack/node-core-library/lib/FileError.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,113 @@
 | 
			
		||||
"use strict";
 | 
			
		||||
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 | 
			
		||||
// See LICENSE in the project root for license information.
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.FileError = void 0;
 | 
			
		||||
const Path_1 = require("./Path");
 | 
			
		||||
const TypeUuid_1 = require("./TypeUuid");
 | 
			
		||||
const uuidFileError = '37a4c772-2dc8-4c66-89ae-262f8cc1f0c1';
 | 
			
		||||
const baseFolderEnvVar = 'RUSHSTACK_FILE_ERROR_BASE_FOLDER';
 | 
			
		||||
/**
 | 
			
		||||
 * An `Error` subclass that should be thrown to report an unexpected state that specifically references
 | 
			
		||||
 * a location in a file.
 | 
			
		||||
 *
 | 
			
		||||
 * @remarks The file path provided to the FileError constructor is expected to exist on disk. FileError
 | 
			
		||||
 * should not be used for reporting errors that are not in reference to an existing file.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
class FileError extends Error {
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs a new instance of the {@link FileError} class.
 | 
			
		||||
     *
 | 
			
		||||
     * @param message - A message describing the error.
 | 
			
		||||
     * @param options - Options for the error.
 | 
			
		||||
     */
 | 
			
		||||
    constructor(message, options) {
 | 
			
		||||
        super(message);
 | 
			
		||||
        this.absolutePath = options.absolutePath;
 | 
			
		||||
        this.projectFolder = options.projectFolder;
 | 
			
		||||
        this.line = options.line;
 | 
			
		||||
        this.column = options.column;
 | 
			
		||||
        // Manually set the prototype, as we can no longer extend built-in classes like Error, Array, Map, etc.
 | 
			
		||||
        // https://github.com/microsoft/TypeScript-wiki/blob/main/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work
 | 
			
		||||
        //
 | 
			
		||||
        // Note: the prototype must also be set on any classes which extend this one
 | 
			
		||||
        this.__proto__ = FileError.prototype; // eslint-disable-line @typescript-eslint/no-explicit-any
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the Unix-formatted the error message.
 | 
			
		||||
     *
 | 
			
		||||
     * @override
 | 
			
		||||
     */
 | 
			
		||||
    toString() {
 | 
			
		||||
        // Default to formatting in 'Unix' format, for consistency.
 | 
			
		||||
        return this.getFormattedErrorMessage();
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the formatted error message.
 | 
			
		||||
     *
 | 
			
		||||
     * @param options - Options for the error message format.
 | 
			
		||||
     */
 | 
			
		||||
    getFormattedErrorMessage(options) {
 | 
			
		||||
        return Path_1.Path.formatFileLocation({
 | 
			
		||||
            format: (options === null || options === void 0 ? void 0 : options.format) || 'Unix',
 | 
			
		||||
            baseFolder: this._evaluateBaseFolder(),
 | 
			
		||||
            pathToFormat: this.absolutePath,
 | 
			
		||||
            message: this.message,
 | 
			
		||||
            line: this.line,
 | 
			
		||||
            column: this.column
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
    _evaluateBaseFolder() {
 | 
			
		||||
        // Cache the sanitized environment variable. This means that we don't support changing
 | 
			
		||||
        // the environment variable mid-execution. This is a reasonable tradeoff for the benefit
 | 
			
		||||
        // of being able to cache absolute paths, since that is only able to be determined after
 | 
			
		||||
        // running the regex, which is expensive. Since this would be a common execution path for
 | 
			
		||||
        // tools like Rush, we should optimize for that.
 | 
			
		||||
        if (!FileError._sanitizedEnvironmentVariable && process.env[baseFolderEnvVar]) {
 | 
			
		||||
            // Strip leading and trailing quotes, if present.
 | 
			
		||||
            FileError._sanitizedEnvironmentVariable = process.env[baseFolderEnvVar].replace(/^("|')|("|')$/g, '');
 | 
			
		||||
        }
 | 
			
		||||
        if (FileError._environmentVariableIsAbsolutePath) {
 | 
			
		||||
            return FileError._sanitizedEnvironmentVariable;
 | 
			
		||||
        }
 | 
			
		||||
        // undefined environment variable has a mapping to the project folder
 | 
			
		||||
        const baseFolderFn = FileError._environmentVariableBasePathFnMap.get(FileError._sanitizedEnvironmentVariable);
 | 
			
		||||
        if (baseFolderFn) {
 | 
			
		||||
            return baseFolderFn(this);
 | 
			
		||||
        }
 | 
			
		||||
        const baseFolderTokenRegex = /{([^}]+)}/g;
 | 
			
		||||
        const result = baseFolderTokenRegex.exec(FileError._sanitizedEnvironmentVariable);
 | 
			
		||||
        if (!result) {
 | 
			
		||||
            // No tokens, assume absolute path
 | 
			
		||||
            FileError._environmentVariableIsAbsolutePath = true;
 | 
			
		||||
            return FileError._sanitizedEnvironmentVariable;
 | 
			
		||||
        }
 | 
			
		||||
        else if (result.index !== 0) {
 | 
			
		||||
            // Currently only support the token being first in the string.
 | 
			
		||||
            throw new Error(`The ${baseFolderEnvVar} environment variable contains text before the token "${result[0]}".`);
 | 
			
		||||
        }
 | 
			
		||||
        else if (result[0].length !== FileError._sanitizedEnvironmentVariable.length) {
 | 
			
		||||
            // Currently only support the token being the entire string.
 | 
			
		||||
            throw new Error(`The ${baseFolderEnvVar} environment variable contains text after the token "${result[0]}".`);
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            throw new Error(`The ${baseFolderEnvVar} environment variable contains a token "${result[0]}", which is not ` +
 | 
			
		||||
                'supported.');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    static [Symbol.hasInstance](instance) {
 | 
			
		||||
        return TypeUuid_1.TypeUuid.isInstanceOf(instance, uuidFileError);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
/** @internal */
 | 
			
		||||
FileError._environmentVariableIsAbsolutePath = false;
 | 
			
		||||
FileError._environmentVariableBasePathFnMap = new Map([
 | 
			
		||||
    [undefined, (fileError) => fileError.projectFolder],
 | 
			
		||||
    ['{PROJECT_FOLDER}', (fileError) => fileError.projectFolder],
 | 
			
		||||
    ['{ABSOLUTE_PATH}', (fileError) => undefined]
 | 
			
		||||
]);
 | 
			
		||||
exports.FileError = FileError;
 | 
			
		||||
TypeUuid_1.TypeUuid.registerClass(FileError, uuidFileError);
 | 
			
		||||
//# sourceMappingURL=FileError.js.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/FileError.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/FileError.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										676
									
								
								node_modules/@rushstack/node-core-library/lib/FileSystem.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										676
									
								
								node_modules/@rushstack/node-core-library/lib/FileSystem.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,676 @@
 | 
			
		||||
/// <reference types="node" />
 | 
			
		||||
/// <reference types="node" />
 | 
			
		||||
/// <reference types="node" />
 | 
			
		||||
import * as fs from 'fs';
 | 
			
		||||
import { type NewlineKind, Encoding } from './Text';
 | 
			
		||||
import { PosixModeBits } from './PosixModeBits';
 | 
			
		||||
/**
 | 
			
		||||
 * An alias for the Node.js `fs.Stats` object.
 | 
			
		||||
 *
 | 
			
		||||
 * @remarks
 | 
			
		||||
 * This avoids the need to import the `fs` package when using the {@link FileSystem} API.
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export type FileSystemStats = fs.Stats;
 | 
			
		||||
/**
 | 
			
		||||
 * An alias for the Node.js `fs.Dirent` object.
 | 
			
		||||
 *
 | 
			
		||||
 * @remarks
 | 
			
		||||
 * This avoids the need to import the `fs` package when using the {@link FileSystem} API.
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export type FolderItem = fs.Dirent;
 | 
			
		||||
/**
 | 
			
		||||
 * The options for {@link FileSystem.readFolder}
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IFileSystemReadFolderOptions {
 | 
			
		||||
    /**
 | 
			
		||||
     * If true, returns the absolute paths of the files in the folder.
 | 
			
		||||
     * @defaultValue false
 | 
			
		||||
     */
 | 
			
		||||
    absolutePaths?: boolean;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * The options for {@link FileSystem.writeFile}
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IFileSystemWriteFileOptions {
 | 
			
		||||
    /**
 | 
			
		||||
     * If true, will ensure the folder is created before writing the file.
 | 
			
		||||
     * @defaultValue false
 | 
			
		||||
     */
 | 
			
		||||
    ensureFolderExists?: boolean;
 | 
			
		||||
    /**
 | 
			
		||||
     * If specified, will normalize line endings to the specified style of newline.
 | 
			
		||||
     * @defaultValue `undefined` which means no conversion will be performed
 | 
			
		||||
     */
 | 
			
		||||
    convertLineEndings?: NewlineKind;
 | 
			
		||||
    /**
 | 
			
		||||
     * If specified, will change the encoding of the file that will be written.
 | 
			
		||||
     * @defaultValue "utf8"
 | 
			
		||||
     */
 | 
			
		||||
    encoding?: Encoding;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * The options for {@link FileSystem.readFile}
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IFileSystemReadFileOptions {
 | 
			
		||||
    /**
 | 
			
		||||
     * If specified, will change the encoding of the file that will be written.
 | 
			
		||||
     * @defaultValue Encoding.Utf8
 | 
			
		||||
     */
 | 
			
		||||
    encoding?: Encoding;
 | 
			
		||||
    /**
 | 
			
		||||
     * If specified, will normalize line endings to the specified style of newline.
 | 
			
		||||
     * @defaultValue `undefined` which means no conversion will be performed
 | 
			
		||||
     */
 | 
			
		||||
    convertLineEndings?: NewlineKind;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * The options for {@link FileSystem.move}
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IFileSystemMoveOptions {
 | 
			
		||||
    /**
 | 
			
		||||
     * The path of the existing object to be moved.
 | 
			
		||||
     * The path may be absolute or relative.
 | 
			
		||||
     */
 | 
			
		||||
    sourcePath: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * The new path for the object.
 | 
			
		||||
     * The path may be absolute or relative.
 | 
			
		||||
     */
 | 
			
		||||
    destinationPath: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * If true, will overwrite the file if it already exists.
 | 
			
		||||
     * @defaultValue true
 | 
			
		||||
     */
 | 
			
		||||
    overwrite?: boolean;
 | 
			
		||||
    /**
 | 
			
		||||
     * If true, will ensure the folder is created before writing the file.
 | 
			
		||||
     * @defaultValue false
 | 
			
		||||
     */
 | 
			
		||||
    ensureFolderExists?: boolean;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IFileSystemCopyFileBaseOptions {
 | 
			
		||||
    /**
 | 
			
		||||
     * The path of the existing object to be copied.
 | 
			
		||||
     * The path may be absolute or relative.
 | 
			
		||||
     */
 | 
			
		||||
    sourcePath: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * Specifies what to do if the destination path already exists.
 | 
			
		||||
     * @defaultValue {@link AlreadyExistsBehavior.Overwrite}
 | 
			
		||||
     */
 | 
			
		||||
    alreadyExistsBehavior?: AlreadyExistsBehavior;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * The options for {@link FileSystem.copyFile}
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IFileSystemCopyFileOptions extends IFileSystemCopyFileBaseOptions {
 | 
			
		||||
    /**
 | 
			
		||||
     * The path that the object will be copied to.
 | 
			
		||||
     * The path may be absolute or relative.
 | 
			
		||||
     */
 | 
			
		||||
    destinationPath: string;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * Specifies the behavior of APIs such as {@link FileSystem.copyFile} or
 | 
			
		||||
 * {@link FileSystem.createSymbolicLinkFile} when the output file path already exists.
 | 
			
		||||
 *
 | 
			
		||||
 * @remarks
 | 
			
		||||
 * For {@link FileSystem.copyFile} and related APIs, the "output file path" is
 | 
			
		||||
 * {@link IFileSystemCopyFileOptions.destinationPath}.
 | 
			
		||||
 *
 | 
			
		||||
 * For {@link FileSystem.createSymbolicLinkFile} and related APIs, the "output file path" is
 | 
			
		||||
 * {@link IFileSystemCreateLinkOptions.newLinkPath}.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export declare enum AlreadyExistsBehavior {
 | 
			
		||||
    /**
 | 
			
		||||
     * If the output file path already exists, try to overwrite the existing object.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * If overwriting the object would require recursively deleting a folder tree,
 | 
			
		||||
     * then the operation will fail.  As an example, suppose {@link FileSystem.copyFile}
 | 
			
		||||
     * is copying a single file `/a/b/c` to the destination path `/d/e`, and `/d/e` is a
 | 
			
		||||
     * nonempty folder.  In this situation, an error will be reported; specifying
 | 
			
		||||
     * `AlreadyExistsBehavior.Overwrite` does not help.  Empty folders can be overwritten
 | 
			
		||||
     * depending on the details of the implementation.
 | 
			
		||||
     */
 | 
			
		||||
    Overwrite = "overwrite",
 | 
			
		||||
    /**
 | 
			
		||||
     * If the output file path already exists, the operation will fail, and an error
 | 
			
		||||
     * will be reported.
 | 
			
		||||
     */
 | 
			
		||||
    Error = "error",
 | 
			
		||||
    /**
 | 
			
		||||
     * If the output file path already exists, skip this item, and continue the operation.
 | 
			
		||||
     */
 | 
			
		||||
    Ignore = "ignore"
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * Callback function type for {@link IFileSystemCopyFilesAsyncOptions.filter}
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export type FileSystemCopyFilesAsyncFilter = (sourcePath: string, destinationPath: string) => Promise<boolean>;
 | 
			
		||||
/**
 | 
			
		||||
 * Callback function type for {@link IFileSystemCopyFilesOptions.filter}
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export type FileSystemCopyFilesFilter = (sourcePath: string, destinationPath: string) => boolean;
 | 
			
		||||
/**
 | 
			
		||||
 * The options for {@link FileSystem.copyFilesAsync}
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IFileSystemCopyFilesAsyncOptions {
 | 
			
		||||
    /**
 | 
			
		||||
     * The starting path of the file or folder to be copied.
 | 
			
		||||
     * The path may be absolute or relative.
 | 
			
		||||
     */
 | 
			
		||||
    sourcePath: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * The path that the files will be copied to.
 | 
			
		||||
     * The path may be absolute or relative.
 | 
			
		||||
     */
 | 
			
		||||
    destinationPath: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * If true, then when copying symlinks, copy the target object instead of copying the link.
 | 
			
		||||
     */
 | 
			
		||||
    dereferenceSymlinks?: boolean;
 | 
			
		||||
    /**
 | 
			
		||||
     * Specifies what to do if a destination path already exists.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * This setting is applied individually for each file being copied.
 | 
			
		||||
     * For example, `AlreadyExistsBehavior.Overwrite` will not recursively delete a folder
 | 
			
		||||
     * whose path corresponds to an individual file that is being copied to that location.
 | 
			
		||||
     */
 | 
			
		||||
    alreadyExistsBehavior?: AlreadyExistsBehavior;
 | 
			
		||||
    /**
 | 
			
		||||
     * If true, then the target object will be assigned "last modification" and "last access" timestamps
 | 
			
		||||
     * that are the same as the source.  Otherwise, the OS default timestamps are assigned.
 | 
			
		||||
     */
 | 
			
		||||
    preserveTimestamps?: boolean;
 | 
			
		||||
    /**
 | 
			
		||||
     * A callback that will be invoked for each path that is copied.  The callback can return `false`
 | 
			
		||||
     * to cause the object to be excluded from the operation.
 | 
			
		||||
     */
 | 
			
		||||
    filter?: FileSystemCopyFilesAsyncFilter | FileSystemCopyFilesFilter;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * The options for {@link FileSystem.copyFiles}
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IFileSystemCopyFilesOptions extends IFileSystemCopyFilesAsyncOptions {
 | 
			
		||||
    /**  {@inheritdoc IFileSystemCopyFilesAsyncOptions.filter} */
 | 
			
		||||
    filter?: FileSystemCopyFilesFilter;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * The options for {@link FileSystem.deleteFile}
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IFileSystemDeleteFileOptions {
 | 
			
		||||
    /**
 | 
			
		||||
     * If true, will throw an exception if the file did not exist before `deleteFile()` was called.
 | 
			
		||||
     * @defaultValue false
 | 
			
		||||
     */
 | 
			
		||||
    throwIfNotExists?: boolean;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * The options for {@link FileSystem.updateTimes}
 | 
			
		||||
 * Both times must be specified.
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IFileSystemUpdateTimeParameters {
 | 
			
		||||
    /**
 | 
			
		||||
     * The POSIX epoch time or Date when this was last accessed.
 | 
			
		||||
     */
 | 
			
		||||
    accessedTime: number | Date;
 | 
			
		||||
    /**
 | 
			
		||||
     * The POSIX epoch time or Date when this was last modified
 | 
			
		||||
     */
 | 
			
		||||
    modifiedTime: number | Date;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * The options for {@link FileSystem.createSymbolicLinkJunction}, {@link FileSystem.createSymbolicLinkFile},
 | 
			
		||||
 * {@link FileSystem.createSymbolicLinkFolder}, and {@link FileSystem.createHardLink}.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IFileSystemCreateLinkOptions {
 | 
			
		||||
    /**
 | 
			
		||||
     * The newly created symbolic link will point to `linkTargetPath` as its target.
 | 
			
		||||
     */
 | 
			
		||||
    linkTargetPath: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * The newly created symbolic link will have this path.
 | 
			
		||||
     */
 | 
			
		||||
    newLinkPath: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * Specifies what to do if the path to create already exists.
 | 
			
		||||
     * The default is `AlreadyExistsBehavior.Error`.
 | 
			
		||||
     */
 | 
			
		||||
    alreadyExistsBehavior?: AlreadyExistsBehavior;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * The FileSystem API provides a complete set of recommended operations for interacting with the file system.
 | 
			
		||||
 *
 | 
			
		||||
 * @remarks
 | 
			
		||||
 * We recommend to use this instead of the native `fs` API, because `fs` is a minimal set of low-level
 | 
			
		||||
 * primitives that must be mapped for each supported operating system. The FileSystem API takes a
 | 
			
		||||
 * philosophical approach of providing "one obvious way" to do each operation. We also prefer synchronous
 | 
			
		||||
 * operations except in cases where there would be a clear performance benefit for using async, since synchronous
 | 
			
		||||
 * code is much easier to read and debug. Also, indiscriminate parallelism has been seen to actually worsen
 | 
			
		||||
 * performance, versus improving it.
 | 
			
		||||
 *
 | 
			
		||||
 * Note that in the documentation, we refer to "filesystem objects", this can be a
 | 
			
		||||
 * file, folder, symbolic link, hard link, directory junction, etc.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export declare class FileSystem {
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns true if the path exists on disk.
 | 
			
		||||
     * Behind the scenes it uses `fs.existsSync()`.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * There is a debate about the fact that after `fs.existsSync()` returns true,
 | 
			
		||||
     * the file might be deleted before fs.readSync() is called, which would imply that everybody
 | 
			
		||||
     * should catch a `readSync()` exception, and nobody should ever use `fs.existsSync()`.
 | 
			
		||||
     * We find this to be unpersuasive, since "unexceptional exceptions" really hinder the
 | 
			
		||||
     * break-on-exception debugging experience. Also, throwing/catching is generally slow.
 | 
			
		||||
     * @param path - The absolute or relative path to the filesystem object.
 | 
			
		||||
     */
 | 
			
		||||
    static exists(path: string): boolean;
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link FileSystem.exists}.
 | 
			
		||||
     */
 | 
			
		||||
    static existsAsync(path: string): Promise<boolean>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets the statistics for a particular filesystem object.
 | 
			
		||||
     * If the path is a link, this function follows the link and returns statistics about the link target.
 | 
			
		||||
     * Behind the scenes it uses `fs.statSync()`.
 | 
			
		||||
     * @param path - The absolute or relative path to the filesystem object.
 | 
			
		||||
     */
 | 
			
		||||
    static getStatistics(path: string): FileSystemStats;
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link FileSystem.getStatistics}.
 | 
			
		||||
     */
 | 
			
		||||
    static getStatisticsAsync(path: string): Promise<FileSystemStats>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Updates the accessed and modified timestamps of the filesystem object referenced by path.
 | 
			
		||||
     * Behind the scenes it uses `fs.utimesSync()`.
 | 
			
		||||
     * The caller should specify both times in the `times` parameter.
 | 
			
		||||
     * @param path - The path of the file that should be modified.
 | 
			
		||||
     * @param times - The times that the object should be updated to reflect.
 | 
			
		||||
     */
 | 
			
		||||
    static updateTimes(path: string, times: IFileSystemUpdateTimeParameters): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link FileSystem.updateTimes}.
 | 
			
		||||
     */
 | 
			
		||||
    static updateTimesAsync(path: string, times: IFileSystemUpdateTimeParameters): Promise<void>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Changes the permissions (i.e. file mode bits) for a filesystem object.
 | 
			
		||||
     * Behind the scenes it uses `fs.chmodSync()`.
 | 
			
		||||
     * @param path - The absolute or relative path to the object that should be updated.
 | 
			
		||||
     * @param modeBits - POSIX-style file mode bits specified using the {@link PosixModeBits} enum
 | 
			
		||||
     */
 | 
			
		||||
    static changePosixModeBits(path: string, modeBits: PosixModeBits): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link FileSystem.changePosixModeBits}.
 | 
			
		||||
     */
 | 
			
		||||
    static changePosixModeBitsAsync(path: string, mode: PosixModeBits): Promise<void>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Retrieves the permissions (i.e. file mode bits) for a filesystem object.
 | 
			
		||||
     * Behind the scenes it uses `fs.chmodSync()`.
 | 
			
		||||
     * @param path - The absolute or relative path to the object that should be updated.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * This calls {@link FileSystem.getStatistics} to get the POSIX mode bits.
 | 
			
		||||
     * If statistics in addition to the mode bits are needed, it is more efficient
 | 
			
		||||
     * to call {@link FileSystem.getStatistics} directly instead.
 | 
			
		||||
     */
 | 
			
		||||
    static getPosixModeBits(path: string): PosixModeBits;
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link FileSystem.getPosixModeBits}.
 | 
			
		||||
     */
 | 
			
		||||
    static getPosixModeBitsAsync(path: string): Promise<PosixModeBits>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns a 10-character string representation of a PosixModeBits value similar to what
 | 
			
		||||
     * would be displayed by a command such as "ls -l" on a POSIX-like operating system.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * For example, `PosixModeBits.AllRead | PosixModeBits.AllWrite` would be formatted as "-rw-rw-rw-".
 | 
			
		||||
     * @param modeBits - POSIX-style file mode bits specified using the {@link PosixModeBits} enum
 | 
			
		||||
     */
 | 
			
		||||
    static formatPosixModeBits(modeBits: PosixModeBits): string;
 | 
			
		||||
    /**
 | 
			
		||||
     * Moves a file. The folder must exist, unless the `ensureFolderExists` option is provided.
 | 
			
		||||
     * Behind the scenes it uses `fs-extra.moveSync()`
 | 
			
		||||
     */
 | 
			
		||||
    static move(options: IFileSystemMoveOptions): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link FileSystem.move}.
 | 
			
		||||
     */
 | 
			
		||||
    static moveAsync(options: IFileSystemMoveOptions): Promise<void>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Recursively creates a folder at a given path.
 | 
			
		||||
     * Behind the scenes is uses `fs-extra.ensureDirSync()`.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * Throws an exception if anything in the folderPath is not a folder.
 | 
			
		||||
     * @param folderPath - The absolute or relative path of the folder which should be created.
 | 
			
		||||
     */
 | 
			
		||||
    static ensureFolder(folderPath: string): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link FileSystem.ensureFolder}.
 | 
			
		||||
     */
 | 
			
		||||
    static ensureFolderAsync(folderPath: string): Promise<void>;
 | 
			
		||||
    /**
 | 
			
		||||
     * @deprecated
 | 
			
		||||
     * Use {@link FileSystem.readFolderItemNames} instead.
 | 
			
		||||
     */
 | 
			
		||||
    static readFolder(folderPath: string, options?: IFileSystemReadFolderOptions): string[];
 | 
			
		||||
    /**
 | 
			
		||||
     * @deprecated
 | 
			
		||||
     * Use {@link FileSystem.readFolderItemNamesAsync} instead.
 | 
			
		||||
     */
 | 
			
		||||
    static readFolderAsync(folderPath: string, options?: IFileSystemReadFolderOptions): Promise<string[]>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Reads the names of folder entries, not including "." or "..".
 | 
			
		||||
     * Behind the scenes it uses `fs.readdirSync()`.
 | 
			
		||||
     * @param folderPath - The absolute or relative path to the folder which should be read.
 | 
			
		||||
     * @param options - Optional settings that can change the behavior. Type: `IReadFolderOptions`
 | 
			
		||||
     */
 | 
			
		||||
    static readFolderItemNames(folderPath: string, options?: IFileSystemReadFolderOptions): string[];
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link FileSystem.readFolderItemNames}.
 | 
			
		||||
     */
 | 
			
		||||
    static readFolderItemNamesAsync(folderPath: string, options?: IFileSystemReadFolderOptions): Promise<string[]>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Reads the contents of the folder, not including "." or "..", returning objects including the
 | 
			
		||||
     * entry names and types.
 | 
			
		||||
     * Behind the scenes it uses `fs.readdirSync()`.
 | 
			
		||||
     * @param folderPath - The absolute or relative path to the folder which should be read.
 | 
			
		||||
     * @param options - Optional settings that can change the behavior. Type: `IReadFolderOptions`
 | 
			
		||||
     */
 | 
			
		||||
    static readFolderItems(folderPath: string, options?: IFileSystemReadFolderOptions): FolderItem[];
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link FileSystem.readFolderItems}.
 | 
			
		||||
     */
 | 
			
		||||
    static readFolderItemsAsync(folderPath: string, options?: IFileSystemReadFolderOptions): Promise<FolderItem[]>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Deletes a folder, including all of its contents.
 | 
			
		||||
     * Behind the scenes is uses `fs-extra.removeSync()`.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * Does not throw if the folderPath does not exist.
 | 
			
		||||
     * @param folderPath - The absolute or relative path to the folder which should be deleted.
 | 
			
		||||
     */
 | 
			
		||||
    static deleteFolder(folderPath: string): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link FileSystem.deleteFolder}.
 | 
			
		||||
     */
 | 
			
		||||
    static deleteFolderAsync(folderPath: string): Promise<void>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Deletes the content of a folder, but not the folder itself. Also ensures the folder exists.
 | 
			
		||||
     * Behind the scenes it uses `fs-extra.emptyDirSync()`.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * This is a workaround for a common race condition, where the virus scanner holds a lock on the folder
 | 
			
		||||
     * for a brief period after it was deleted, causing EBUSY errors for any code that tries to recreate the folder.
 | 
			
		||||
     * @param folderPath - The absolute or relative path to the folder which should have its contents deleted.
 | 
			
		||||
     */
 | 
			
		||||
    static ensureEmptyFolder(folderPath: string): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link FileSystem.ensureEmptyFolder}.
 | 
			
		||||
     */
 | 
			
		||||
    static ensureEmptyFolderAsync(folderPath: string): Promise<void>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Writes a text string to a file on disk, overwriting the file if it already exists.
 | 
			
		||||
     * Behind the scenes it uses `fs.writeFileSync()`.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * Throws an error if the folder doesn't exist, unless ensureFolder=true.
 | 
			
		||||
     * @param filePath - The absolute or relative path of the file.
 | 
			
		||||
     * @param contents - The text that should be written to the file.
 | 
			
		||||
     * @param options - Optional settings that can change the behavior. Type: `IWriteFileOptions`
 | 
			
		||||
     */
 | 
			
		||||
    static writeFile(filePath: string, contents: string | Buffer, options?: IFileSystemWriteFileOptions): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link FileSystem.writeFile}.
 | 
			
		||||
     */
 | 
			
		||||
    static writeFileAsync(filePath: string, contents: string | Buffer, options?: IFileSystemWriteFileOptions): Promise<void>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Writes a text string to a file on disk, appending to the file if it already exists.
 | 
			
		||||
     * Behind the scenes it uses `fs.appendFileSync()`.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * Throws an error if the folder doesn't exist, unless ensureFolder=true.
 | 
			
		||||
     * @param filePath - The absolute or relative path of the file.
 | 
			
		||||
     * @param contents - The text that should be written to the file.
 | 
			
		||||
     * @param options - Optional settings that can change the behavior. Type: `IWriteFileOptions`
 | 
			
		||||
     */
 | 
			
		||||
    static appendToFile(filePath: string, contents: string | Buffer, options?: IFileSystemWriteFileOptions): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link FileSystem.appendToFile}.
 | 
			
		||||
     */
 | 
			
		||||
    static appendToFileAsync(filePath: string, contents: string | Buffer, options?: IFileSystemWriteFileOptions): Promise<void>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Reads the contents of a file into a string.
 | 
			
		||||
     * Behind the scenes it uses `fs.readFileSync()`.
 | 
			
		||||
     * @param filePath - The relative or absolute path to the file whose contents should be read.
 | 
			
		||||
     * @param options - Optional settings that can change the behavior. Type: `IReadFileOptions`
 | 
			
		||||
     */
 | 
			
		||||
    static readFile(filePath: string, options?: IFileSystemReadFileOptions): string;
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link FileSystem.readFile}.
 | 
			
		||||
     */
 | 
			
		||||
    static readFileAsync(filePath: string, options?: IFileSystemReadFileOptions): Promise<string>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Reads the contents of a file into a buffer.
 | 
			
		||||
     * Behind the scenes is uses `fs.readFileSync()`.
 | 
			
		||||
     * @param filePath - The relative or absolute path to the file whose contents should be read.
 | 
			
		||||
     */
 | 
			
		||||
    static readFileToBuffer(filePath: string): Buffer;
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link FileSystem.readFileToBuffer}.
 | 
			
		||||
     */
 | 
			
		||||
    static readFileToBufferAsync(filePath: string): Promise<Buffer>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Copies a single file from one location to another.
 | 
			
		||||
     * By default, destinationPath is overwritten if it already exists.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * The `copyFile()` API cannot be used to copy folders.  It copies at most one file.
 | 
			
		||||
     * Use {@link FileSystem.copyFiles} if you need to recursively copy a tree of folders.
 | 
			
		||||
     *
 | 
			
		||||
     * The implementation is based on `copySync()` from the `fs-extra` package.
 | 
			
		||||
     */
 | 
			
		||||
    static copyFile(options: IFileSystemCopyFileOptions): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link FileSystem.copyFile}.
 | 
			
		||||
     */
 | 
			
		||||
    static copyFileAsync(options: IFileSystemCopyFileOptions): Promise<void>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Copies a file or folder from one location to another, recursively copying any folder contents.
 | 
			
		||||
     * By default, destinationPath is overwritten if it already exists.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * If you only intend to copy a single file, it is recommended to use {@link FileSystem.copyFile}
 | 
			
		||||
     * instead to more clearly communicate the intended operation.
 | 
			
		||||
     *
 | 
			
		||||
     * The implementation is based on `copySync()` from the `fs-extra` package.
 | 
			
		||||
     */
 | 
			
		||||
    static copyFiles(options: IFileSystemCopyFilesOptions): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link FileSystem.copyFiles}.
 | 
			
		||||
     */
 | 
			
		||||
    static copyFilesAsync(options: IFileSystemCopyFilesAsyncOptions): Promise<void>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Deletes a file. Can optionally throw if the file doesn't exist.
 | 
			
		||||
     * Behind the scenes it uses `fs.unlinkSync()`.
 | 
			
		||||
     * @param filePath - The absolute or relative path to the file that should be deleted.
 | 
			
		||||
     * @param options - Optional settings that can change the behavior. Type: `IDeleteFileOptions`
 | 
			
		||||
     */
 | 
			
		||||
    static deleteFile(filePath: string, options?: IFileSystemDeleteFileOptions): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link FileSystem.deleteFile}.
 | 
			
		||||
     */
 | 
			
		||||
    static deleteFileAsync(filePath: string, options?: IFileSystemDeleteFileOptions): Promise<void>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets the statistics of a filesystem object. Does NOT follow the link to its target.
 | 
			
		||||
     * Behind the scenes it uses `fs.lstatSync()`.
 | 
			
		||||
     * @param path - The absolute or relative path to the filesystem object.
 | 
			
		||||
     */
 | 
			
		||||
    static getLinkStatistics(path: string): FileSystemStats;
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link FileSystem.getLinkStatistics}.
 | 
			
		||||
     */
 | 
			
		||||
    static getLinkStatisticsAsync(path: string): Promise<FileSystemStats>;
 | 
			
		||||
    /**
 | 
			
		||||
     * If `path` refers to a symbolic link, this returns the path of the link target, which may be
 | 
			
		||||
     * an absolute or relative path.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * If `path` refers to a filesystem object that is not a symbolic link, then an `ErrnoException` is thrown
 | 
			
		||||
     * with code 'UNKNOWN'.  If `path` does not exist, then an `ErrnoException` is thrown with code `ENOENT`.
 | 
			
		||||
     *
 | 
			
		||||
     * @param path - The absolute or relative path to the symbolic link.
 | 
			
		||||
     * @returns the path of the link target
 | 
			
		||||
     */
 | 
			
		||||
    static readLink(path: string): string;
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link FileSystem.readLink}.
 | 
			
		||||
     */
 | 
			
		||||
    static readLinkAsync(path: string): Promise<string>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates an NTFS "directory junction" on Windows operating systems; for other operating systems, it
 | 
			
		||||
     * creates a regular symbolic link.  The link target must be a folder, not a file.
 | 
			
		||||
     * Behind the scenes it uses `fs.symlinkSync()`.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * For security reasons, Windows operating systems by default require administrator elevation to create
 | 
			
		||||
     * symbolic links.  As a result, on Windows it's generally recommended for Node.js tools to use hard links
 | 
			
		||||
     * (for files) or NTFS directory junctions (for folders), since regular users are allowed to create them.
 | 
			
		||||
     * Hard links and junctions are less vulnerable to symlink attacks because they cannot reference a network share,
 | 
			
		||||
     * and their target must exist at the time of link creation.  Non-Windows operating systems generally don't
 | 
			
		||||
     * restrict symlink creation, and as such are more vulnerable to symlink attacks.  Note that Windows can be
 | 
			
		||||
     * configured to permit regular users to create symlinks, for example by enabling Windows 10 "developer mode."
 | 
			
		||||
     *
 | 
			
		||||
     * A directory junction requires the link source and target to both be located on local disk volumes;
 | 
			
		||||
     * if not, use a symbolic link instead.
 | 
			
		||||
     */
 | 
			
		||||
    static createSymbolicLinkJunction(options: IFileSystemCreateLinkOptions): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link FileSystem.createSymbolicLinkJunction}.
 | 
			
		||||
     */
 | 
			
		||||
    static createSymbolicLinkJunctionAsync(options: IFileSystemCreateLinkOptions): Promise<void>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a symbolic link to a file.  On Windows operating systems, this may require administrator elevation.
 | 
			
		||||
     * Behind the scenes it uses `fs.symlinkSync()`.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * To avoid administrator elevation on Windows, use {@link FileSystem.createHardLink} instead.
 | 
			
		||||
     *
 | 
			
		||||
     * On Windows operating systems, the NTFS file system distinguishes file symlinks versus directory symlinks:
 | 
			
		||||
     * If the target is not the correct type, the symlink will be created successfully, but will fail to resolve.
 | 
			
		||||
     * Other operating systems do not make this distinction, in which case {@link FileSystem.createSymbolicLinkFile}
 | 
			
		||||
     * and {@link FileSystem.createSymbolicLinkFolder} can be used interchangeably, but doing so will make your
 | 
			
		||||
     * tool incompatible with Windows.
 | 
			
		||||
     */
 | 
			
		||||
    static createSymbolicLinkFile(options: IFileSystemCreateLinkOptions): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link FileSystem.createSymbolicLinkFile}.
 | 
			
		||||
     */
 | 
			
		||||
    static createSymbolicLinkFileAsync(options: IFileSystemCreateLinkOptions): Promise<void>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a symbolic link to a folder.  On Windows operating systems, this may require administrator elevation.
 | 
			
		||||
     * Behind the scenes it uses `fs.symlinkSync()`.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * To avoid administrator elevation on Windows, use {@link FileSystem.createSymbolicLinkJunction} instead.
 | 
			
		||||
     *
 | 
			
		||||
     * On Windows operating systems, the NTFS file system distinguishes file symlinks versus directory symlinks:
 | 
			
		||||
     * If the target is not the correct type, the symlink will be created successfully, but will fail to resolve.
 | 
			
		||||
     * Other operating systems do not make this distinction, in which case {@link FileSystem.createSymbolicLinkFile}
 | 
			
		||||
     * and {@link FileSystem.createSymbolicLinkFolder} can be used interchangeably, but doing so will make your
 | 
			
		||||
     * tool incompatible with Windows.
 | 
			
		||||
     */
 | 
			
		||||
    static createSymbolicLinkFolder(options: IFileSystemCreateLinkOptions): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link FileSystem.createSymbolicLinkFolder}.
 | 
			
		||||
     */
 | 
			
		||||
    static createSymbolicLinkFolderAsync(options: IFileSystemCreateLinkOptions): Promise<void>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a hard link.  The link target must be a file, not a folder.
 | 
			
		||||
     * Behind the scenes it uses `fs.linkSync()`.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * For security reasons, Windows operating systems by default require administrator elevation to create
 | 
			
		||||
     * symbolic links.  As a result, on Windows it's generally recommended for Node.js tools to use hard links
 | 
			
		||||
     * (for files) or NTFS directory junctions (for folders), since regular users are allowed to create them.
 | 
			
		||||
     * Hard links and junctions are less vulnerable to symlink attacks because they cannot reference a network share,
 | 
			
		||||
     * and their target must exist at the time of link creation.  Non-Windows operating systems generally don't
 | 
			
		||||
     * restrict symlink creation, and as such are more vulnerable to symlink attacks.  Note that Windows can be
 | 
			
		||||
     * configured to permit regular users to create symlinks, for example by enabling Windows 10 "developer mode."
 | 
			
		||||
     *
 | 
			
		||||
     * A hard link requires the link source and target to both be located on same disk volume;
 | 
			
		||||
     * if not, use a symbolic link instead.
 | 
			
		||||
     */
 | 
			
		||||
    static createHardLink(options: IFileSystemCreateLinkOptions): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link FileSystem.createHardLink}.
 | 
			
		||||
     */
 | 
			
		||||
    static createHardLinkAsync(options: IFileSystemCreateLinkOptions): Promise<void>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Follows a link to its destination and returns the absolute path to the final target of the link.
 | 
			
		||||
     * Behind the scenes it uses `fs.realpathSync()`.
 | 
			
		||||
     * @param linkPath - The path to the link.
 | 
			
		||||
     */
 | 
			
		||||
    static getRealPath(linkPath: string): string;
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link FileSystem.getRealPath}.
 | 
			
		||||
     */
 | 
			
		||||
    static getRealPathAsync(linkPath: string): Promise<string>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns true if the error object indicates the file or folder already exists (`EEXIST`).
 | 
			
		||||
     */
 | 
			
		||||
    static isExistError(error: Error): boolean;
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns true if the error object indicates the file or folder does not exist (`ENOENT` or `ENOTDIR`)
 | 
			
		||||
     */
 | 
			
		||||
    static isNotExistError(error: Error): boolean;
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns true if the error object indicates the file does not exist (`ENOENT`).
 | 
			
		||||
     */
 | 
			
		||||
    static isFileDoesNotExistError(error: Error): boolean;
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns true if the error object indicates the folder does not exist (`ENOTDIR`).
 | 
			
		||||
     */
 | 
			
		||||
    static isFolderDoesNotExistError(error: Error): boolean;
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns true if the error object indicates the target is a directory (`EISDIR`).
 | 
			
		||||
     */
 | 
			
		||||
    static isDirectoryError(error: Error): boolean;
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns true if the error object indicates the target is not a directory (`ENOTDIR`).
 | 
			
		||||
     */
 | 
			
		||||
    static isNotDirectoryError(error: Error): boolean;
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns true if the error object indicates that the `unlink` system call failed
 | 
			
		||||
     * due to a permissions issue (`EPERM`).
 | 
			
		||||
     */
 | 
			
		||||
    static isUnlinkNotPermittedError(error: Error): boolean;
 | 
			
		||||
    /**
 | 
			
		||||
     * Detects if the provided error object is a `NodeJS.ErrnoException`
 | 
			
		||||
     */
 | 
			
		||||
    static isErrnoException(error: Error): error is NodeJS.ErrnoException;
 | 
			
		||||
    private static _handleLink;
 | 
			
		||||
    private static _handleLinkAsync;
 | 
			
		||||
    private static _wrapException;
 | 
			
		||||
    private static _wrapExceptionAsync;
 | 
			
		||||
    private static _updateErrorMessage;
 | 
			
		||||
}
 | 
			
		||||
//# sourceMappingURL=FileSystem.d.ts.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/FileSystem.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/FileSystem.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										1099
									
								
								node_modules/@rushstack/node-core-library/lib/FileSystem.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1099
									
								
								node_modules/@rushstack/node-core-library/lib/FileSystem.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/FileSystem.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/FileSystem.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										61
									
								
								node_modules/@rushstack/node-core-library/lib/FileWriter.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								node_modules/@rushstack/node-core-library/lib/FileWriter.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,61 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Interface which represents the flags about which mode the file should be opened in.
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IFileWriterFlags {
 | 
			
		||||
    /**
 | 
			
		||||
     * Open file for appending.
 | 
			
		||||
     */
 | 
			
		||||
    append?: boolean;
 | 
			
		||||
    /**
 | 
			
		||||
     * Fails if path exists. The exclusive flag ensures that path is newly created.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * On POSIX-like operating systems, path is considered to exist even if it is a symlink to a
 | 
			
		||||
     * non-existent file.  The exclusive flag may or may not work with network file systems.
 | 
			
		||||
     *
 | 
			
		||||
     * POSIX is a registered trademark of the Institute of Electrical and Electronic Engineers, Inc.
 | 
			
		||||
     */
 | 
			
		||||
    exclusive?: boolean;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * API for interacting with file handles.
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export declare class FileWriter {
 | 
			
		||||
    /**
 | 
			
		||||
     * The `filePath` that was passed to {@link FileWriter.open}.
 | 
			
		||||
     */
 | 
			
		||||
    readonly filePath: string;
 | 
			
		||||
    private _fileDescriptor;
 | 
			
		||||
    private constructor();
 | 
			
		||||
    /**
 | 
			
		||||
     * Opens a new file handle to the file at the specified path and given mode.
 | 
			
		||||
     * Behind the scenes it uses `fs.openSync()`.
 | 
			
		||||
     * The behaviour of this function is platform specific.
 | 
			
		||||
     * See: https://nodejs.org/docs/latest-v8.x/api/fs.html#fs_fs_open_path_flags_mode_callback
 | 
			
		||||
     * @param filePath - The absolute or relative path to the file handle that should be opened.
 | 
			
		||||
     * @param flags - The flags for opening the handle
 | 
			
		||||
     */
 | 
			
		||||
    static open(filePath: string, flags?: IFileWriterFlags): FileWriter;
 | 
			
		||||
    /**
 | 
			
		||||
     * Helper function to convert the file writer array to a Node.js style string (e.g. "wx" or "a").
 | 
			
		||||
     * @param flags - The flags that should be converted.
 | 
			
		||||
     */
 | 
			
		||||
    private static _convertFlagsForNode;
 | 
			
		||||
    /**
 | 
			
		||||
     * Writes some text to the given file handle. Throws if the file handle has been closed.
 | 
			
		||||
     * Behind the scenes it uses `fs.writeSync()`.
 | 
			
		||||
     * @param text - The text to write to the file.
 | 
			
		||||
     */
 | 
			
		||||
    write(text: string): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * Closes the file handle permanently. No operations can be made on this file handle after calling this.
 | 
			
		||||
     * Behind the scenes it uses `fs.closeSync()` and releases the file descriptor to be re-used.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * The `close()` method can be called more than once; additional calls are ignored.
 | 
			
		||||
     */
 | 
			
		||||
    close(): void;
 | 
			
		||||
}
 | 
			
		||||
//# sourceMappingURL=FileWriter.d.ts.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/FileWriter.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/FileWriter.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"FileWriter.d.ts","sourceRoot":"","sources":["../src/FileWriter.ts"],"names":[],"mappings":"AAaA;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,qBAAa,UAAU;IACrB;;OAEG;IACH,SAAgB,QAAQ,EAAE,MAAM,CAAC;IAEjC,OAAO,CAAC,eAAe,CAAqB;IAE5C,OAAO;IAKP;;;;;;;OAOG;WACW,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,gBAAgB,GAAG,UAAU;IAI1E;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,oBAAoB;IASnC;;;;OAIG;IACI,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQhC;;;;;;OAMG;IACI,KAAK,IAAI,IAAI;CAOrB"}
 | 
			
		||||
							
								
								
									
										63
									
								
								node_modules/@rushstack/node-core-library/lib/FileWriter.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								node_modules/@rushstack/node-core-library/lib/FileWriter.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,63 @@
 | 
			
		||||
"use strict";
 | 
			
		||||
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 | 
			
		||||
// See LICENSE in the project root for license information.
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.FileWriter = void 0;
 | 
			
		||||
const Import_1 = require("./Import");
 | 
			
		||||
const fsx = Import_1.Import.lazy('fs-extra', require);
 | 
			
		||||
/**
 | 
			
		||||
 * API for interacting with file handles.
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
class FileWriter {
 | 
			
		||||
    constructor(fileDescriptor, filePath) {
 | 
			
		||||
        this._fileDescriptor = fileDescriptor;
 | 
			
		||||
        this.filePath = filePath;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Opens a new file handle to the file at the specified path and given mode.
 | 
			
		||||
     * Behind the scenes it uses `fs.openSync()`.
 | 
			
		||||
     * The behaviour of this function is platform specific.
 | 
			
		||||
     * See: https://nodejs.org/docs/latest-v8.x/api/fs.html#fs_fs_open_path_flags_mode_callback
 | 
			
		||||
     * @param filePath - The absolute or relative path to the file handle that should be opened.
 | 
			
		||||
     * @param flags - The flags for opening the handle
 | 
			
		||||
     */
 | 
			
		||||
    static open(filePath, flags) {
 | 
			
		||||
        return new FileWriter(fsx.openSync(filePath, FileWriter._convertFlagsForNode(flags)), filePath);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Helper function to convert the file writer array to a Node.js style string (e.g. "wx" or "a").
 | 
			
		||||
     * @param flags - The flags that should be converted.
 | 
			
		||||
     */
 | 
			
		||||
    static _convertFlagsForNode(flags) {
 | 
			
		||||
        flags = Object.assign({ append: false, exclusive: false }, flags);
 | 
			
		||||
        return [flags.append ? 'a' : 'w', flags.exclusive ? 'x' : ''].join('');
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Writes some text to the given file handle. Throws if the file handle has been closed.
 | 
			
		||||
     * Behind the scenes it uses `fs.writeSync()`.
 | 
			
		||||
     * @param text - The text to write to the file.
 | 
			
		||||
     */
 | 
			
		||||
    write(text) {
 | 
			
		||||
        if (!this._fileDescriptor) {
 | 
			
		||||
            throw new Error(`Cannot write to file, file descriptor has already been released.`);
 | 
			
		||||
        }
 | 
			
		||||
        fsx.writeSync(this._fileDescriptor, text);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Closes the file handle permanently. No operations can be made on this file handle after calling this.
 | 
			
		||||
     * Behind the scenes it uses `fs.closeSync()` and releases the file descriptor to be re-used.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * The `close()` method can be called more than once; additional calls are ignored.
 | 
			
		||||
     */
 | 
			
		||||
    close() {
 | 
			
		||||
        const fd = this._fileDescriptor;
 | 
			
		||||
        if (fd) {
 | 
			
		||||
            this._fileDescriptor = undefined;
 | 
			
		||||
            fsx.closeSync(fd);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
exports.FileWriter = FileWriter;
 | 
			
		||||
//# sourceMappingURL=FileWriter.js.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/FileWriter.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/FileWriter.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"FileWriter.js","sourceRoot":"","sources":["../src/FileWriter.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,qCAAkC;AAElC,MAAM,GAAG,GAA8B,eAAM,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AA8BxE;;;GAGG;AACH,MAAa,UAAU;IAQrB,YAAoB,cAAsB,EAAE,QAAgB;QAC1D,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;QACtC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED;;;;;;;OAOG;IACI,MAAM,CAAC,IAAI,CAAC,QAAgB,EAAE,KAAwB;QAC3D,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAClG,CAAC;IAED;;;OAGG;IACK,MAAM,CAAC,oBAAoB,CAAC,KAAmC;QACrE,KAAK,mBACH,MAAM,EAAE,KAAK,EACb,SAAS,EAAE,KAAK,IACb,KAAK,CACT,CAAC;QACF,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAkB,CAAC;IAC1F,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,IAAY;QACvB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YACzB,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;SACrF;QAED,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED;;;;;;OAMG;IACI,KAAK;QACV,MAAM,EAAE,GAAuB,IAAI,CAAC,eAAe,CAAC;QACpD,IAAI,EAAE,EAAE;YACN,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;YACjC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;SACnB;IACH,CAAC;CACF;AAjED,gCAiEC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport { Import } from './Import';\n\nconst fsx: typeof import('fs-extra') = Import.lazy('fs-extra', require);\n\n/**\n * Available file handle opening flags.\n * @public\n */\ntype NodeFileFlags = 'r' | 'r+' | 'rs+' | 'w' | 'wx' | 'w+' | 'wx+' | 'a' | 'ax' | 'a+' | 'ax+';\n\n/**\n * Interface which represents the flags about which mode the file should be opened in.\n * @public\n */\nexport interface IFileWriterFlags {\n  /**\n   * Open file for appending.\n   */\n  append?: boolean;\n\n  /**\n   * Fails if path exists. The exclusive flag ensures that path is newly created.\n   *\n   * @remarks\n   * On POSIX-like operating systems, path is considered to exist even if it is a symlink to a\n   * non-existent file.  The exclusive flag may or may not work with network file systems.\n   *\n   * POSIX is a registered trademark of the Institute of Electrical and Electronic Engineers, Inc.\n   */\n  exclusive?: boolean;\n}\n\n/**\n * API for interacting with file handles.\n * @public\n */\nexport class FileWriter {\n  /**\n   * The `filePath` that was passed to {@link FileWriter.open}.\n   */\n  public readonly filePath: string;\n\n  private _fileDescriptor: number | undefined;\n\n  private constructor(fileDescriptor: number, filePath: string) {\n    this._fileDescriptor = fileDescriptor;\n    this.filePath = filePath;\n  }\n\n  /**\n   * Opens a new file handle to the file at the specified path and given mode.\n   * Behind the scenes it uses `fs.openSync()`.\n   * The behaviour of this function is platform specific.\n   * See: https://nodejs.org/docs/latest-v8.x/api/fs.html#fs_fs_open_path_flags_mode_callback\n   * @param filePath - The absolute or relative path to the file handle that should be opened.\n   * @param flags - The flags for opening the handle\n   */\n  public static open(filePath: string, flags?: IFileWriterFlags): FileWriter {\n    return new FileWriter(fsx.openSync(filePath, FileWriter._convertFlagsForNode(flags)), filePath);\n  }\n\n  /**\n   * Helper function to convert the file writer array to a Node.js style string (e.g. \"wx\" or \"a\").\n   * @param flags - The flags that should be converted.\n   */\n  private static _convertFlagsForNode(flags: IFileWriterFlags | undefined): NodeFileFlags {\n    flags = {\n      append: false,\n      exclusive: false,\n      ...flags\n    };\n    return [flags.append ? 'a' : 'w', flags.exclusive ? 'x' : ''].join('') as NodeFileFlags;\n  }\n\n  /**\n   * Writes some text to the given file handle. Throws if the file handle has been closed.\n   * Behind the scenes it uses `fs.writeSync()`.\n   * @param text - The text to write to the file.\n   */\n  public write(text: string): void {\n    if (!this._fileDescriptor) {\n      throw new Error(`Cannot write to file, file descriptor has already been released.`);\n    }\n\n    fsx.writeSync(this._fileDescriptor, text);\n  }\n\n  /**\n   * Closes the file handle permanently. No operations can be made on this file handle after calling this.\n   * Behind the scenes it uses `fs.closeSync()` and releases the file descriptor to be re-used.\n   *\n   * @remarks\n   * The `close()` method can be called more than once; additional calls are ignored.\n   */\n  public close(): void {\n    const fd: number | undefined = this._fileDescriptor;\n    if (fd) {\n      this._fileDescriptor = undefined;\n      fsx.closeSync(fd);\n    }\n  }\n}\n"]}
 | 
			
		||||
							
								
								
									
										179
									
								
								node_modules/@rushstack/node-core-library/lib/IPackageJson.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										179
									
								
								node_modules/@rushstack/node-core-library/lib/IPackageJson.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,179 @@
 | 
			
		||||
/**
 | 
			
		||||
 * This interface is part of the {@link IPackageJson} file format.  It is used for the
 | 
			
		||||
 * "dependencies", "optionalDependencies", and "devDependencies" fields.
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IPackageJsonDependencyTable {
 | 
			
		||||
    /**
 | 
			
		||||
     * The key is the name of a dependency.  The value is a Semantic Versioning (SemVer)
 | 
			
		||||
     * range specifier.
 | 
			
		||||
     */
 | 
			
		||||
    [dependencyName: string]: string;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * This interface is part of the {@link IPackageJson} file format.  It is used for the
 | 
			
		||||
 * "scripts" field.
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IPackageJsonScriptTable {
 | 
			
		||||
    /**
 | 
			
		||||
     * The key is the name of the script hook.  The value is the script body which may
 | 
			
		||||
     * be a file path or shell script command.
 | 
			
		||||
     */
 | 
			
		||||
    [scriptName: string]: string;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * This interface is part of the {@link IPackageJson} file format.  It is used for the
 | 
			
		||||
 * "repository" field.
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IPackageJsonRepository {
 | 
			
		||||
    /**
 | 
			
		||||
     * The source control type for the repository that hosts the project. This is typically "git".
 | 
			
		||||
     */
 | 
			
		||||
    type: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * The URL of the repository that hosts the project.
 | 
			
		||||
     */
 | 
			
		||||
    url: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * If the project does not exist at the root of the repository, its path is specified here.
 | 
			
		||||
     */
 | 
			
		||||
    directory?: string;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * This interface is part of the {@link IPackageJson} file format. It is used for the
 | 
			
		||||
 * "peerDependenciesMeta" field.
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IPeerDependenciesMetaTable {
 | 
			
		||||
    [dependencyName: string]: {
 | 
			
		||||
        optional?: boolean;
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * An interface for accessing common fields from a package.json file whose version field may be missing.
 | 
			
		||||
 *
 | 
			
		||||
 * @remarks
 | 
			
		||||
 * This interface is the same as {@link IPackageJson}, except that the `version` field is optional.
 | 
			
		||||
 * According to the {@link https://docs.npmjs.com/files/package.json | NPM documentation}
 | 
			
		||||
 * and {@link http://wiki.commonjs.org/wiki/Packages/1.0 | CommonJS Packages specification}, the `version` field
 | 
			
		||||
 * is normally a required field for package.json files.
 | 
			
		||||
 *
 | 
			
		||||
 * However, NodeJS relaxes this requirement for its `require()` API.  The
 | 
			
		||||
 * {@link https://nodejs.org/dist/latest-v10.x/docs/api/modules.html#modules_folders_as_modules
 | 
			
		||||
 * | "Folders as Modules" section} from the NodeJS documentation gives an example of a package.json file
 | 
			
		||||
 * that has only the `name` and `main` fields.  NodeJS does not consider the `version` field during resolution,
 | 
			
		||||
 * so it can be omitted.  Some libraries do this.
 | 
			
		||||
 *
 | 
			
		||||
 * Use the `INodePackageJson` interface when loading such files.  Use `IPackageJson` for package.json files
 | 
			
		||||
 * that are installed from an NPM registry, or are otherwise known to have a `version` field.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface INodePackageJson {
 | 
			
		||||
    /**
 | 
			
		||||
     * The name of the package.
 | 
			
		||||
     */
 | 
			
		||||
    name: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * A version number conforming to the Semantic Versioning (SemVer) standard.
 | 
			
		||||
     */
 | 
			
		||||
    version?: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * Indicates whether this package is allowed to be published or not.
 | 
			
		||||
     */
 | 
			
		||||
    private?: boolean;
 | 
			
		||||
    /**
 | 
			
		||||
     * A brief description of the package.
 | 
			
		||||
     */
 | 
			
		||||
    description?: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * The URL of the project's repository.
 | 
			
		||||
     */
 | 
			
		||||
    repository?: string | IPackageJsonRepository;
 | 
			
		||||
    /**
 | 
			
		||||
     * The URL to the project's web page.
 | 
			
		||||
     */
 | 
			
		||||
    homepage?: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * The name of the license.
 | 
			
		||||
     */
 | 
			
		||||
    license?: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * The path to the module file that will act as the main entry point.
 | 
			
		||||
     */
 | 
			
		||||
    main?: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * The path to the TypeScript *.d.ts file describing the module file
 | 
			
		||||
     * that will act as the main entry point.
 | 
			
		||||
     */
 | 
			
		||||
    types?: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * Alias for `types`
 | 
			
		||||
     */
 | 
			
		||||
    typings?: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * The path to the TSDoc metadata file.
 | 
			
		||||
     * This is still being standardized: https://github.com/microsoft/tsdoc/issues/7#issuecomment-442271815
 | 
			
		||||
     * @beta
 | 
			
		||||
     */
 | 
			
		||||
    tsdocMetadata?: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * The main entry point for the package.
 | 
			
		||||
     */
 | 
			
		||||
    bin?: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * An array of dependencies that must always be installed for this package.
 | 
			
		||||
     */
 | 
			
		||||
    dependencies?: IPackageJsonDependencyTable;
 | 
			
		||||
    /**
 | 
			
		||||
     * An array of optional dependencies that may be installed for this package.
 | 
			
		||||
     */
 | 
			
		||||
    optionalDependencies?: IPackageJsonDependencyTable;
 | 
			
		||||
    /**
 | 
			
		||||
     * An array of dependencies that must only be installed for developers who will
 | 
			
		||||
     * build this package.
 | 
			
		||||
     */
 | 
			
		||||
    devDependencies?: IPackageJsonDependencyTable;
 | 
			
		||||
    /**
 | 
			
		||||
     * An array of dependencies that must be installed by a consumer of this package,
 | 
			
		||||
     * but which will not be automatically installed by this package.
 | 
			
		||||
     */
 | 
			
		||||
    peerDependencies?: IPackageJsonDependencyTable;
 | 
			
		||||
    /**
 | 
			
		||||
     * An array of metadata about peer dependencies.
 | 
			
		||||
     */
 | 
			
		||||
    peerDependenciesMeta?: IPeerDependenciesMetaTable;
 | 
			
		||||
    /**
 | 
			
		||||
     * A table of script hooks that a package manager or build tool may invoke.
 | 
			
		||||
     */
 | 
			
		||||
    scripts?: IPackageJsonScriptTable;
 | 
			
		||||
    /**
 | 
			
		||||
     * A table of package version resolutions. This feature is only implemented by the Yarn package manager.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * See the {@link https://github.com/yarnpkg/rfcs/blob/master/implemented/0000-selective-versions-resolutions.md
 | 
			
		||||
     * | 0000-selective-versions-resolutions.md RFC} for details.
 | 
			
		||||
     */
 | 
			
		||||
    resolutions?: Record<string, string>;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * An interface for accessing common fields from a package.json file.
 | 
			
		||||
 *
 | 
			
		||||
 * @remarks
 | 
			
		||||
 * This interface describes a package.json file format whose `name` and `version` field are required.
 | 
			
		||||
 * In some situations, the `version` field is optional; in that case, use the {@link INodePackageJson}
 | 
			
		||||
 * interface instead.
 | 
			
		||||
 *
 | 
			
		||||
 * More fields may be added to this interface in the future.  For documentation about the package.json file format,
 | 
			
		||||
 * see the {@link http://wiki.commonjs.org/wiki/Packages/1.0 | CommonJS Packages specification}
 | 
			
		||||
 * and the {@link https://docs.npmjs.com/files/package.json | NPM manual page}.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IPackageJson extends INodePackageJson {
 | 
			
		||||
    /** {@inheritDoc INodePackageJson.version} */
 | 
			
		||||
    version: string;
 | 
			
		||||
}
 | 
			
		||||
//# sourceMappingURL=IPackageJson.d.ts.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/IPackageJson.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/IPackageJson.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"IPackageJson.d.ts","sourceRoot":"","sources":["../src/IPackageJson.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,MAAM,WAAW,2BAA2B;IAC1C;;;OAGG;IACH,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAAC;CAClC;AAED;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACtC;;;OAGG;IACH,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;CAC9B;AAED;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,0BAA0B;IACzC,CAAC,cAAc,EAAE,MAAM,GAAG;QACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC;CACH;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,sBAAsB,CAAC;IAE7C;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,YAAY,CAAC,EAAE,2BAA2B,CAAC;IAE3C;;OAEG;IACH,oBAAoB,CAAC,EAAE,2BAA2B,CAAC;IAEnD;;;OAGG;IACH,eAAe,CAAC,EAAE,2BAA2B,CAAC;IAE9C;;;OAGG;IACH,gBAAgB,CAAC,EAAE,2BAA2B,CAAC;IAE/C;;OAEG;IACH,oBAAoB,CAAC,EAAE,0BAA0B,CAAC;IAElD;;OAEG;IACH,OAAO,CAAC,EAAE,uBAAuB,CAAC;IAElC;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,YAAa,SAAQ,gBAAgB;IAEpD,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;CACjB"}
 | 
			
		||||
							
								
								
									
										5
									
								
								node_modules/@rushstack/node-core-library/lib/IPackageJson.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								node_modules/@rushstack/node-core-library/lib/IPackageJson.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
"use strict";
 | 
			
		||||
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 | 
			
		||||
// See LICENSE in the project root for license information.
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
//# sourceMappingURL=IPackageJson.js.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/IPackageJson.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/IPackageJson.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										247
									
								
								node_modules/@rushstack/node-core-library/lib/Import.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										247
									
								
								node_modules/@rushstack/node-core-library/lib/Import.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,247 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Common options shared by {@link IImportResolveModuleOptions} and {@link IImportResolvePackageOptions}
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IImportResolveOptions {
 | 
			
		||||
    /**
 | 
			
		||||
     * The path from which {@link IImportResolveModuleOptions.modulePath} or
 | 
			
		||||
     * {@link IImportResolvePackageOptions.packageName} should be resolved.
 | 
			
		||||
     */
 | 
			
		||||
    baseFolderPath: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * If true, if the package name matches a Node.js system module, then the return
 | 
			
		||||
     * value will be the package name without any path.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * This will take precedence over an installed NPM package of the same name.
 | 
			
		||||
     *
 | 
			
		||||
     * Example:
 | 
			
		||||
     * ```ts
 | 
			
		||||
     * // Returns the string "fs" indicating the Node.js system module
 | 
			
		||||
     * Import.resolveModulePath({
 | 
			
		||||
     *   resolvePath: "fs",
 | 
			
		||||
     *   basePath: process.cwd()
 | 
			
		||||
     * })
 | 
			
		||||
     * ```
 | 
			
		||||
     */
 | 
			
		||||
    includeSystemModules?: boolean;
 | 
			
		||||
    /**
 | 
			
		||||
     * If true, then resolvePath is allowed to refer to the package.json of the active project.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * This will take precedence over any installed dependency with the same name.
 | 
			
		||||
     * Note that this requires an additional PackageJsonLookup calculation.
 | 
			
		||||
     *
 | 
			
		||||
     * Example:
 | 
			
		||||
     * ```ts
 | 
			
		||||
     * // Returns an absolute path to the current package
 | 
			
		||||
     * Import.resolveModulePath({
 | 
			
		||||
     *   resolvePath: "current-project",
 | 
			
		||||
     *   basePath: process.cwd(),
 | 
			
		||||
     *   allowSelfReference: true
 | 
			
		||||
     * })
 | 
			
		||||
     * ```
 | 
			
		||||
     */
 | 
			
		||||
    allowSelfReference?: boolean;
 | 
			
		||||
    /**
 | 
			
		||||
     * A function used to resolve the realpath of a provided file path.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * This is used to resolve symlinks and other non-standard file paths. By default, this uses the
 | 
			
		||||
     * {@link FileSystem.getRealPath} function. However, it can be overridden to use a custom implementation
 | 
			
		||||
     * which may be faster, more accurate, or provide support for additional non-standard file paths.
 | 
			
		||||
     */
 | 
			
		||||
    getRealPath?: (filePath: string) => string;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * Common options shared by {@link IImportResolveModuleAsyncOptions} and {@link IImportResolvePackageAsyncOptions}
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IImportResolveAsyncOptions extends IImportResolveOptions {
 | 
			
		||||
    /**
 | 
			
		||||
     * A function used to resolve the realpath of a provided file path.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * This is used to resolve symlinks and other non-standard file paths. By default, this uses the
 | 
			
		||||
     * {@link FileSystem.getRealPath} function. However, it can be overridden to use a custom implementation
 | 
			
		||||
     * which may be faster, more accurate, or provide support for additional non-standard file paths.
 | 
			
		||||
     */
 | 
			
		||||
    getRealPathAsync?: (filePath: string) => Promise<string>;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * Options for {@link Import.resolveModule}
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IImportResolveModuleOptions extends IImportResolveOptions {
 | 
			
		||||
    /**
 | 
			
		||||
     * The module identifier to resolve. For example "\@rushstack/node-core-library" or
 | 
			
		||||
     * "\@rushstack/node-core-library/lib/index.js"
 | 
			
		||||
     */
 | 
			
		||||
    modulePath: string;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * Options for {@link Import.resolveModuleAsync}
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IImportResolveModuleAsyncOptions extends IImportResolveAsyncOptions {
 | 
			
		||||
    /**
 | 
			
		||||
     * The module identifier to resolve. For example "\@rushstack/node-core-library" or
 | 
			
		||||
     * "\@rushstack/node-core-library/lib/index.js"
 | 
			
		||||
     */
 | 
			
		||||
    modulePath: string;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * Options for {@link Import.resolvePackage}
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IImportResolvePackageOptions extends IImportResolveOptions {
 | 
			
		||||
    /**
 | 
			
		||||
     * The package name to resolve. For example "\@rushstack/node-core-library"
 | 
			
		||||
     */
 | 
			
		||||
    packageName: string;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * Options for {@link Import.resolvePackageAsync}
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IImportResolvePackageAsyncOptions extends IImportResolveAsyncOptions {
 | 
			
		||||
    /**
 | 
			
		||||
     * The package name to resolve. For example "\@rushstack/node-core-library"
 | 
			
		||||
     */
 | 
			
		||||
    packageName: string;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * Helpers for resolving and importing Node.js modules.
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export declare class Import {
 | 
			
		||||
    private static __builtInModules;
 | 
			
		||||
    private static get _builtInModules();
 | 
			
		||||
    /**
 | 
			
		||||
     * Provides a way to improve process startup times by lazy-loading imported modules.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * This is a more structured wrapper for the {@link https://www.npmjs.com/package/import-lazy|import-lazy}
 | 
			
		||||
     * package.  It enables you to replace an import like this:
 | 
			
		||||
     *
 | 
			
		||||
     * ```ts
 | 
			
		||||
     * import * as example from 'example'; // <-- 100ms load time
 | 
			
		||||
     *
 | 
			
		||||
     * if (condition) {
 | 
			
		||||
     *   example.doSomething();
 | 
			
		||||
     * }
 | 
			
		||||
     * ```
 | 
			
		||||
     *
 | 
			
		||||
     * ...with a pattern like this:
 | 
			
		||||
     *
 | 
			
		||||
     * ```ts
 | 
			
		||||
     * const example: typeof import('example') = Import.lazy('example', require);
 | 
			
		||||
     *
 | 
			
		||||
     * if (condition) {
 | 
			
		||||
     *   example.doSomething(); // <-- 100ms load time occurs here, only if needed
 | 
			
		||||
     * }
 | 
			
		||||
     * ```
 | 
			
		||||
     *
 | 
			
		||||
     * The implementation relies on JavaScript's `Proxy` feature to intercept access to object members.  Thus
 | 
			
		||||
     * it will only work correctly with certain types of module exports.  If a particular export isn't well behaved,
 | 
			
		||||
     * you may need to find (or introduce) some other module in your dependency graph to apply the optimization to.
 | 
			
		||||
     *
 | 
			
		||||
     * Usage guidelines:
 | 
			
		||||
     *
 | 
			
		||||
     * - Always specify types using `typeof` as shown above.
 | 
			
		||||
     *
 | 
			
		||||
     * - Never apply lazy-loading in a way that would convert the module's type to `any`. Losing type safety
 | 
			
		||||
     *   seriously impacts the maintainability of the code base.
 | 
			
		||||
     *
 | 
			
		||||
     * - In cases where the non-runtime types are needed, import them separately using the `Types` suffix:
 | 
			
		||||
     *
 | 
			
		||||
     * ```ts
 | 
			
		||||
     * const example: typeof import('example') = Import.lazy('example', require);
 | 
			
		||||
     * import type * as exampleTypes from 'example';
 | 
			
		||||
     * ```
 | 
			
		||||
     *
 | 
			
		||||
     * - If the imported module confusingly has the same name as its export, then use the Module suffix:
 | 
			
		||||
     *
 | 
			
		||||
     * ```ts
 | 
			
		||||
     * const exampleModule: typeof import('../../logic/Example') = Import.lazy(
 | 
			
		||||
     *   '../../logic/Example', require);
 | 
			
		||||
     * import type * as exampleTypes from '../../logic/Example';
 | 
			
		||||
     * ```
 | 
			
		||||
     *
 | 
			
		||||
     * - If the exports cause a lot of awkwardness (e.g. too many expressions need to have `exampleModule.` inserted
 | 
			
		||||
     *   into them), or if some exports cannot be proxied (e.g. `Import.lazy('example', require)` returns a function
 | 
			
		||||
     *   signature), then do not lazy-load that module.  Instead, apply lazy-loading to some other module which is
 | 
			
		||||
     *   better behaved.
 | 
			
		||||
     *
 | 
			
		||||
     * - It's recommended to sort imports in a standard ordering:
 | 
			
		||||
     *
 | 
			
		||||
     * ```ts
 | 
			
		||||
     * // 1. external imports
 | 
			
		||||
     * import * as path from 'path';
 | 
			
		||||
     * import { Import, JsonFile, JsonObject } from '@rushstack/node-core-library';
 | 
			
		||||
     *
 | 
			
		||||
     * // 2. local imports
 | 
			
		||||
     * import { LocalFile } from './path/LocalFile';
 | 
			
		||||
     *
 | 
			
		||||
     * // 3. lazy-imports (which are technically variables, not imports)
 | 
			
		||||
     * const semver: typeof import('semver') = Import.lazy('semver', require);
 | 
			
		||||
     * ```
 | 
			
		||||
     */
 | 
			
		||||
    static lazy(moduleName: string, require: (id: string) => unknown): any;
 | 
			
		||||
    /**
 | 
			
		||||
     * This resolves a module path using similar logic as the Node.js `require.resolve()` API,
 | 
			
		||||
     * but supporting extra features such as specifying the base folder.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * A module path is a text string that might appear in a statement such as
 | 
			
		||||
     * `import { X } from "____";` or `const x = require("___");`.  The implementation is based
 | 
			
		||||
     * on the popular `resolve` NPM package.
 | 
			
		||||
     *
 | 
			
		||||
     * Suppose `example` is an NPM package whose entry point is `lib/index.js`:
 | 
			
		||||
     * ```ts
 | 
			
		||||
     * // Returns "/path/to/project/node_modules/example/lib/index.js"
 | 
			
		||||
     * Import.resolveModule({ modulePath: 'example' });
 | 
			
		||||
     *
 | 
			
		||||
     * // Returns "/path/to/project/node_modules/example/lib/other.js"
 | 
			
		||||
     * Import.resolveModule({ modulePath: 'example/lib/other' });
 | 
			
		||||
     * ```
 | 
			
		||||
     * If you need to determine the containing package folder
 | 
			
		||||
     * (`/path/to/project/node_modules/example`), use {@link Import.resolvePackage} instead.
 | 
			
		||||
     *
 | 
			
		||||
     * @returns the absolute path of the resolved module.
 | 
			
		||||
     * If {@link IImportResolveOptions.includeSystemModules} is specified
 | 
			
		||||
     * and a system module is found, then its name is returned without any file path.
 | 
			
		||||
     */
 | 
			
		||||
    static resolveModule(options: IImportResolveModuleOptions): string;
 | 
			
		||||
    /**
 | 
			
		||||
     * Async version of {@link Import.resolveModule}.
 | 
			
		||||
     */
 | 
			
		||||
    static resolveModuleAsync(options: IImportResolveModuleAsyncOptions): Promise<string>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Performs module resolution to determine the folder where a package is installed.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * Suppose `example` is an NPM package whose entry point is `lib/index.js`:
 | 
			
		||||
     * ```ts
 | 
			
		||||
     * // Returns "/path/to/project/node_modules/example"
 | 
			
		||||
     * Import.resolvePackage({ packageName: 'example' });
 | 
			
		||||
     * ```
 | 
			
		||||
     *
 | 
			
		||||
     * If you need to resolve a module path, use {@link Import.resolveModule} instead:
 | 
			
		||||
     * ```ts
 | 
			
		||||
     * // Returns "/path/to/project/node_modules/example/lib/index.js"
 | 
			
		||||
     * Import.resolveModule({ modulePath: 'example' });
 | 
			
		||||
     * ```
 | 
			
		||||
     *
 | 
			
		||||
     * @returns the absolute path of the package folder.
 | 
			
		||||
     * If {@link IImportResolveOptions.includeSystemModules} is specified
 | 
			
		||||
     * and a system module is found, then its name is returned without any file path.
 | 
			
		||||
     */
 | 
			
		||||
    static resolvePackage(options: IImportResolvePackageOptions): string;
 | 
			
		||||
    /**
 | 
			
		||||
     * Async version of {@link Import.resolvePackage}.
 | 
			
		||||
     */
 | 
			
		||||
    static resolvePackageAsync(options: IImportResolvePackageAsyncOptions): Promise<string>;
 | 
			
		||||
    private static _getPackageName;
 | 
			
		||||
}
 | 
			
		||||
//# sourceMappingURL=Import.d.ts.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/Import.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/Import.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"Import.d.ts","sourceRoot":"","sources":["../src/Import.ts"],"names":[],"mappings":"AAeA;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;;;;;;;;;;;;;;OAeG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAE/B;;;;;;;;;;;;;;;;OAgBG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;CAC5C;AAED;;;GAGG;AACH,MAAM,WAAW,0BAA2B,SAAQ,qBAAqB;IACvE;;;;;;;OAOG;IACH,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC1D;AAED;;;GAGG;AACH,MAAM,WAAW,2BAA4B,SAAQ,qBAAqB;IACxE;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,gCAAiC,SAAQ,0BAA0B;IAClF;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,4BAA6B,SAAQ,qBAAqB;IACzE;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,iCAAkC,SAAQ,0BAA0B;IACnF;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;CACrB;AAOD;;;GAGG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAA0B;IACzD,OAAO,CAAC,MAAM,KAAK,eAAe,GAMjC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAqEG;WAEW,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,GAAG,GAAG;IAK7E;;;;;;;;;;;;;;;;;;;;;;;OAuBG;WACW,aAAa,CAAC,OAAO,EAAE,2BAA2B,GAAG,MAAM;IA4CzE;;OAEG;WACiB,kBAAkB,CAAC,OAAO,EAAE,gCAAgC,GAAG,OAAO,CAAC,MAAM,CAAC;IAwFlG;;;;;;;;;;;;;;;;;;;OAmBG;WACW,cAAc,CAAC,OAAO,EAAE,4BAA4B,GAAG,MAAM;IAyC3E;;OAEG;WACiB,mBAAmB,CAAC,OAAO,EAAE,iCAAiC,GAAG,OAAO,CAAC,MAAM,CAAC;IAyFpG,OAAO,CAAC,MAAM,CAAC,eAAe;CAa/B"}
 | 
			
		||||
							
								
								
									
										390
									
								
								node_modules/@rushstack/node-core-library/lib/Import.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										390
									
								
								node_modules/@rushstack/node-core-library/lib/Import.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,390 @@
 | 
			
		||||
"use strict";
 | 
			
		||||
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 | 
			
		||||
// See LICENSE in the project root for license information.
 | 
			
		||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    var desc = Object.getOwnPropertyDescriptor(m, k);
 | 
			
		||||
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
 | 
			
		||||
      desc = { enumerable: true, get: function() { return m[k]; } };
 | 
			
		||||
    }
 | 
			
		||||
    Object.defineProperty(o, k2, desc);
 | 
			
		||||
}) : (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    o[k2] = m[k];
 | 
			
		||||
}));
 | 
			
		||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
 | 
			
		||||
    Object.defineProperty(o, "default", { enumerable: true, value: v });
 | 
			
		||||
}) : function(o, v) {
 | 
			
		||||
    o["default"] = v;
 | 
			
		||||
});
 | 
			
		||||
var __importStar = (this && this.__importStar) || function (mod) {
 | 
			
		||||
    if (mod && mod.__esModule) return mod;
 | 
			
		||||
    var result = {};
 | 
			
		||||
    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
 | 
			
		||||
    __setModuleDefault(result, mod);
 | 
			
		||||
    return result;
 | 
			
		||||
};
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.Import = void 0;
 | 
			
		||||
const path = __importStar(require("path"));
 | 
			
		||||
const importLazy = require("import-lazy");
 | 
			
		||||
const Resolve = __importStar(require("resolve"));
 | 
			
		||||
const nodeModule = require("module");
 | 
			
		||||
const PackageJsonLookup_1 = require("./PackageJsonLookup");
 | 
			
		||||
const FileSystem_1 = require("./FileSystem");
 | 
			
		||||
const PackageName_1 = require("./PackageName");
 | 
			
		||||
/**
 | 
			
		||||
 * Helpers for resolving and importing Node.js modules.
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
class Import {
 | 
			
		||||
    static get _builtInModules() {
 | 
			
		||||
        if (!Import.__builtInModules) {
 | 
			
		||||
            Import.__builtInModules = new Set(nodeModule.builtinModules);
 | 
			
		||||
        }
 | 
			
		||||
        return Import.__builtInModules;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Provides a way to improve process startup times by lazy-loading imported modules.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * This is a more structured wrapper for the {@link https://www.npmjs.com/package/import-lazy|import-lazy}
 | 
			
		||||
     * package.  It enables you to replace an import like this:
 | 
			
		||||
     *
 | 
			
		||||
     * ```ts
 | 
			
		||||
     * import * as example from 'example'; // <-- 100ms load time
 | 
			
		||||
     *
 | 
			
		||||
     * if (condition) {
 | 
			
		||||
     *   example.doSomething();
 | 
			
		||||
     * }
 | 
			
		||||
     * ```
 | 
			
		||||
     *
 | 
			
		||||
     * ...with a pattern like this:
 | 
			
		||||
     *
 | 
			
		||||
     * ```ts
 | 
			
		||||
     * const example: typeof import('example') = Import.lazy('example', require);
 | 
			
		||||
     *
 | 
			
		||||
     * if (condition) {
 | 
			
		||||
     *   example.doSomething(); // <-- 100ms load time occurs here, only if needed
 | 
			
		||||
     * }
 | 
			
		||||
     * ```
 | 
			
		||||
     *
 | 
			
		||||
     * The implementation relies on JavaScript's `Proxy` feature to intercept access to object members.  Thus
 | 
			
		||||
     * it will only work correctly with certain types of module exports.  If a particular export isn't well behaved,
 | 
			
		||||
     * you may need to find (or introduce) some other module in your dependency graph to apply the optimization to.
 | 
			
		||||
     *
 | 
			
		||||
     * Usage guidelines:
 | 
			
		||||
     *
 | 
			
		||||
     * - Always specify types using `typeof` as shown above.
 | 
			
		||||
     *
 | 
			
		||||
     * - Never apply lazy-loading in a way that would convert the module's type to `any`. Losing type safety
 | 
			
		||||
     *   seriously impacts the maintainability of the code base.
 | 
			
		||||
     *
 | 
			
		||||
     * - In cases where the non-runtime types are needed, import them separately using the `Types` suffix:
 | 
			
		||||
     *
 | 
			
		||||
     * ```ts
 | 
			
		||||
     * const example: typeof import('example') = Import.lazy('example', require);
 | 
			
		||||
     * import type * as exampleTypes from 'example';
 | 
			
		||||
     * ```
 | 
			
		||||
     *
 | 
			
		||||
     * - If the imported module confusingly has the same name as its export, then use the Module suffix:
 | 
			
		||||
     *
 | 
			
		||||
     * ```ts
 | 
			
		||||
     * const exampleModule: typeof import('../../logic/Example') = Import.lazy(
 | 
			
		||||
     *   '../../logic/Example', require);
 | 
			
		||||
     * import type * as exampleTypes from '../../logic/Example';
 | 
			
		||||
     * ```
 | 
			
		||||
     *
 | 
			
		||||
     * - If the exports cause a lot of awkwardness (e.g. too many expressions need to have `exampleModule.` inserted
 | 
			
		||||
     *   into them), or if some exports cannot be proxied (e.g. `Import.lazy('example', require)` returns a function
 | 
			
		||||
     *   signature), then do not lazy-load that module.  Instead, apply lazy-loading to some other module which is
 | 
			
		||||
     *   better behaved.
 | 
			
		||||
     *
 | 
			
		||||
     * - It's recommended to sort imports in a standard ordering:
 | 
			
		||||
     *
 | 
			
		||||
     * ```ts
 | 
			
		||||
     * // 1. external imports
 | 
			
		||||
     * import * as path from 'path';
 | 
			
		||||
     * import { Import, JsonFile, JsonObject } from '@rushstack/node-core-library';
 | 
			
		||||
     *
 | 
			
		||||
     * // 2. local imports
 | 
			
		||||
     * import { LocalFile } from './path/LocalFile';
 | 
			
		||||
     *
 | 
			
		||||
     * // 3. lazy-imports (which are technically variables, not imports)
 | 
			
		||||
     * const semver: typeof import('semver') = Import.lazy('semver', require);
 | 
			
		||||
     * ```
 | 
			
		||||
     */
 | 
			
		||||
    // eslint-disable-next-line @typescript-eslint/no-explicit-any
 | 
			
		||||
    static lazy(moduleName, require) {
 | 
			
		||||
        const importLazyLocal = importLazy(require);
 | 
			
		||||
        return importLazyLocal(moduleName);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * This resolves a module path using similar logic as the Node.js `require.resolve()` API,
 | 
			
		||||
     * but supporting extra features such as specifying the base folder.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * A module path is a text string that might appear in a statement such as
 | 
			
		||||
     * `import { X } from "____";` or `const x = require("___");`.  The implementation is based
 | 
			
		||||
     * on the popular `resolve` NPM package.
 | 
			
		||||
     *
 | 
			
		||||
     * Suppose `example` is an NPM package whose entry point is `lib/index.js`:
 | 
			
		||||
     * ```ts
 | 
			
		||||
     * // Returns "/path/to/project/node_modules/example/lib/index.js"
 | 
			
		||||
     * Import.resolveModule({ modulePath: 'example' });
 | 
			
		||||
     *
 | 
			
		||||
     * // Returns "/path/to/project/node_modules/example/lib/other.js"
 | 
			
		||||
     * Import.resolveModule({ modulePath: 'example/lib/other' });
 | 
			
		||||
     * ```
 | 
			
		||||
     * If you need to determine the containing package folder
 | 
			
		||||
     * (`/path/to/project/node_modules/example`), use {@link Import.resolvePackage} instead.
 | 
			
		||||
     *
 | 
			
		||||
     * @returns the absolute path of the resolved module.
 | 
			
		||||
     * If {@link IImportResolveOptions.includeSystemModules} is specified
 | 
			
		||||
     * and a system module is found, then its name is returned without any file path.
 | 
			
		||||
     */
 | 
			
		||||
    static resolveModule(options) {
 | 
			
		||||
        const { modulePath, baseFolderPath, includeSystemModules, allowSelfReference, getRealPath } = options;
 | 
			
		||||
        if (path.isAbsolute(modulePath)) {
 | 
			
		||||
            return modulePath;
 | 
			
		||||
        }
 | 
			
		||||
        const normalizedRootPath = (getRealPath || FileSystem_1.FileSystem.getRealPath)(baseFolderPath);
 | 
			
		||||
        if (modulePath.startsWith('.')) {
 | 
			
		||||
            // This looks like a conventional relative path
 | 
			
		||||
            return path.resolve(normalizedRootPath, modulePath);
 | 
			
		||||
        }
 | 
			
		||||
        // Built-in modules do not have a scope, so if there is a slash, then we need to check
 | 
			
		||||
        // against the first path segment
 | 
			
		||||
        const slashIndex = modulePath.indexOf('/');
 | 
			
		||||
        const moduleName = slashIndex === -1 ? modulePath : modulePath.slice(0, slashIndex);
 | 
			
		||||
        if (!includeSystemModules && Import._builtInModules.has(moduleName)) {
 | 
			
		||||
            throw new Error(`Cannot find module "${modulePath}" from "${options.baseFolderPath}".`);
 | 
			
		||||
        }
 | 
			
		||||
        if (allowSelfReference === true) {
 | 
			
		||||
            const ownPackage = Import._getPackageName(normalizedRootPath);
 | 
			
		||||
            if (ownPackage &&
 | 
			
		||||
                (modulePath === ownPackage.packageName || modulePath.startsWith(`${ownPackage.packageName}/`))) {
 | 
			
		||||
                const packagePath = modulePath.slice(ownPackage.packageName.length + 1);
 | 
			
		||||
                return path.resolve(ownPackage.packageRootPath, packagePath);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        try {
 | 
			
		||||
            return Resolve.sync(modulePath, {
 | 
			
		||||
                basedir: normalizedRootPath,
 | 
			
		||||
                preserveSymlinks: false,
 | 
			
		||||
                realpathSync: getRealPath
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        catch (e) {
 | 
			
		||||
            throw new Error(`Cannot find module "${modulePath}" from "${options.baseFolderPath}": ${e}`);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Async version of {@link Import.resolveModule}.
 | 
			
		||||
     */
 | 
			
		||||
    static async resolveModuleAsync(options) {
 | 
			
		||||
        const { modulePath, baseFolderPath, includeSystemModules, allowSelfReference, getRealPath, getRealPathAsync } = options;
 | 
			
		||||
        if (path.isAbsolute(modulePath)) {
 | 
			
		||||
            return modulePath;
 | 
			
		||||
        }
 | 
			
		||||
        const normalizedRootPath = await (getRealPathAsync || getRealPath || FileSystem_1.FileSystem.getRealPathAsync)(baseFolderPath);
 | 
			
		||||
        if (modulePath.startsWith('.')) {
 | 
			
		||||
            // This looks like a conventional relative path
 | 
			
		||||
            return path.resolve(normalizedRootPath, modulePath);
 | 
			
		||||
        }
 | 
			
		||||
        // Built-in modules do not have a scope, so if there is a slash, then we need to check
 | 
			
		||||
        // against the first path segment
 | 
			
		||||
        const slashIndex = modulePath.indexOf('/');
 | 
			
		||||
        const moduleName = slashIndex === -1 ? modulePath : modulePath.slice(0, slashIndex);
 | 
			
		||||
        if (!includeSystemModules && Import._builtInModules.has(moduleName)) {
 | 
			
		||||
            throw new Error(`Cannot find module "${modulePath}" from "${options.baseFolderPath}".`);
 | 
			
		||||
        }
 | 
			
		||||
        if (allowSelfReference === true) {
 | 
			
		||||
            const ownPackage = Import._getPackageName(normalizedRootPath);
 | 
			
		||||
            if (ownPackage &&
 | 
			
		||||
                (modulePath === ownPackage.packageName || modulePath.startsWith(`${ownPackage.packageName}/`))) {
 | 
			
		||||
                const packagePath = modulePath.slice(ownPackage.packageName.length + 1);
 | 
			
		||||
                return path.resolve(ownPackage.packageRootPath, packagePath);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        try {
 | 
			
		||||
            const resolvePromise = new Promise((resolve, reject) => {
 | 
			
		||||
                const realPathFn = getRealPathAsync || getRealPath
 | 
			
		||||
                    ? (filePath, callback) => {
 | 
			
		||||
                        if (getRealPathAsync) {
 | 
			
		||||
                            getRealPathAsync(filePath)
 | 
			
		||||
                                .then((resolvedPath) => callback(null, resolvedPath))
 | 
			
		||||
                                .catch((error) => callback(error));
 | 
			
		||||
                        }
 | 
			
		||||
                        else {
 | 
			
		||||
                            try {
 | 
			
		||||
                                const resolvedPath = getRealPath(filePath);
 | 
			
		||||
                                callback(null, resolvedPath);
 | 
			
		||||
                            }
 | 
			
		||||
                            catch (error) {
 | 
			
		||||
                                callback(error);
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    : undefined;
 | 
			
		||||
                Resolve.default(modulePath, {
 | 
			
		||||
                    basedir: normalizedRootPath,
 | 
			
		||||
                    preserveSymlinks: false,
 | 
			
		||||
                    realpath: realPathFn
 | 
			
		||||
                }, (error, resolvedPath) => {
 | 
			
		||||
                    if (error) {
 | 
			
		||||
                        reject(error);
 | 
			
		||||
                    }
 | 
			
		||||
                    else {
 | 
			
		||||
                        // Resolve docs state that either an error will be returned, or the resolved path.
 | 
			
		||||
                        // In this case, the resolved path should always be populated.
 | 
			
		||||
                        resolve(resolvedPath);
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
            });
 | 
			
		||||
            return await resolvePromise;
 | 
			
		||||
        }
 | 
			
		||||
        catch (e) {
 | 
			
		||||
            throw new Error(`Cannot find module "${modulePath}" from "${options.baseFolderPath}": ${e}`);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Performs module resolution to determine the folder where a package is installed.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * Suppose `example` is an NPM package whose entry point is `lib/index.js`:
 | 
			
		||||
     * ```ts
 | 
			
		||||
     * // Returns "/path/to/project/node_modules/example"
 | 
			
		||||
     * Import.resolvePackage({ packageName: 'example' });
 | 
			
		||||
     * ```
 | 
			
		||||
     *
 | 
			
		||||
     * If you need to resolve a module path, use {@link Import.resolveModule} instead:
 | 
			
		||||
     * ```ts
 | 
			
		||||
     * // Returns "/path/to/project/node_modules/example/lib/index.js"
 | 
			
		||||
     * Import.resolveModule({ modulePath: 'example' });
 | 
			
		||||
     * ```
 | 
			
		||||
     *
 | 
			
		||||
     * @returns the absolute path of the package folder.
 | 
			
		||||
     * If {@link IImportResolveOptions.includeSystemModules} is specified
 | 
			
		||||
     * and a system module is found, then its name is returned without any file path.
 | 
			
		||||
     */
 | 
			
		||||
    static resolvePackage(options) {
 | 
			
		||||
        const { packageName, includeSystemModules, baseFolderPath, allowSelfReference, getRealPath } = options;
 | 
			
		||||
        if (includeSystemModules && Import._builtInModules.has(packageName)) {
 | 
			
		||||
            return packageName;
 | 
			
		||||
        }
 | 
			
		||||
        const normalizedRootPath = (getRealPath || FileSystem_1.FileSystem.getRealPath)(baseFolderPath);
 | 
			
		||||
        if (allowSelfReference) {
 | 
			
		||||
            const ownPackage = Import._getPackageName(normalizedRootPath);
 | 
			
		||||
            if (ownPackage && ownPackage.packageName === packageName) {
 | 
			
		||||
                return ownPackage.packageRootPath;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        PackageName_1.PackageName.parse(packageName); // Ensure the package name is valid and doesn't contain a path
 | 
			
		||||
        try {
 | 
			
		||||
            // Append a slash to the package name to ensure `resolve.sync` doesn't attempt to return a system package
 | 
			
		||||
            const resolvedPath = Resolve.sync(`${packageName}/`, {
 | 
			
		||||
                basedir: normalizedRootPath,
 | 
			
		||||
                preserveSymlinks: false,
 | 
			
		||||
                packageFilter: (pkg, pkgFile, dir) => {
 | 
			
		||||
                    // Hardwire "main" to point to a file that is guaranteed to exist.
 | 
			
		||||
                    // This helps resolve packages such as @types/node that have no entry point.
 | 
			
		||||
                    // And then we can use path.dirname() below to locate the package folder,
 | 
			
		||||
                    // even if the real entry point was in an subfolder with arbitrary nesting.
 | 
			
		||||
                    pkg.main = 'package.json';
 | 
			
		||||
                    return pkg;
 | 
			
		||||
                },
 | 
			
		||||
                realpathSync: getRealPath
 | 
			
		||||
            });
 | 
			
		||||
            const packagePath = path.dirname(resolvedPath);
 | 
			
		||||
            return packagePath;
 | 
			
		||||
        }
 | 
			
		||||
        catch (e) {
 | 
			
		||||
            throw new Error(`Cannot find package "${packageName}" from "${baseFolderPath}": ${e}.`);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Async version of {@link Import.resolvePackage}.
 | 
			
		||||
     */
 | 
			
		||||
    static async resolvePackageAsync(options) {
 | 
			
		||||
        const { packageName, includeSystemModules, baseFolderPath, allowSelfReference, getRealPath, getRealPathAsync } = options;
 | 
			
		||||
        if (includeSystemModules && Import._builtInModules.has(packageName)) {
 | 
			
		||||
            return packageName;
 | 
			
		||||
        }
 | 
			
		||||
        const normalizedRootPath = await (getRealPathAsync || getRealPath || FileSystem_1.FileSystem.getRealPathAsync)(baseFolderPath);
 | 
			
		||||
        if (allowSelfReference) {
 | 
			
		||||
            const ownPackage = Import._getPackageName(normalizedRootPath);
 | 
			
		||||
            if (ownPackage && ownPackage.packageName === packageName) {
 | 
			
		||||
                return ownPackage.packageRootPath;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        PackageName_1.PackageName.parse(packageName); // Ensure the package name is valid and doesn't contain a path
 | 
			
		||||
        try {
 | 
			
		||||
            const resolvePromise = new Promise((resolve, reject) => {
 | 
			
		||||
                const realPathFn = getRealPathAsync || getRealPath
 | 
			
		||||
                    ? (filePath, callback) => {
 | 
			
		||||
                        if (getRealPathAsync) {
 | 
			
		||||
                            getRealPathAsync(filePath)
 | 
			
		||||
                                .then((resolvedPath) => callback(null, resolvedPath))
 | 
			
		||||
                                .catch((error) => callback(error));
 | 
			
		||||
                        }
 | 
			
		||||
                        else {
 | 
			
		||||
                            try {
 | 
			
		||||
                                const resolvedPath = getRealPath(filePath);
 | 
			
		||||
                                callback(null, resolvedPath);
 | 
			
		||||
                            }
 | 
			
		||||
                            catch (error) {
 | 
			
		||||
                                callback(error);
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    : undefined;
 | 
			
		||||
                Resolve.default(
 | 
			
		||||
                // Append a slash to the package name to ensure `resolve` doesn't attempt to return a system package
 | 
			
		||||
                `${packageName}/`, {
 | 
			
		||||
                    basedir: normalizedRootPath,
 | 
			
		||||
                    preserveSymlinks: false,
 | 
			
		||||
                    packageFilter: (pkg, pkgFile, dir) => {
 | 
			
		||||
                        // Hardwire "main" to point to a file that is guaranteed to exist.
 | 
			
		||||
                        // This helps resolve packages such as @types/node that have no entry point.
 | 
			
		||||
                        // And then we can use path.dirname() below to locate the package folder,
 | 
			
		||||
                        // even if the real entry point was in an subfolder with arbitrary nesting.
 | 
			
		||||
                        pkg.main = 'package.json';
 | 
			
		||||
                        return pkg;
 | 
			
		||||
                    },
 | 
			
		||||
                    realpath: realPathFn
 | 
			
		||||
                }, (error, resolvedPath) => {
 | 
			
		||||
                    if (error) {
 | 
			
		||||
                        reject(error);
 | 
			
		||||
                    }
 | 
			
		||||
                    else {
 | 
			
		||||
                        // Resolve docs state that either an error will be returned, or the resolved path.
 | 
			
		||||
                        // In this case, the resolved path should always be populated.
 | 
			
		||||
                        resolve(resolvedPath);
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
            });
 | 
			
		||||
            const resolvedPath = await resolvePromise;
 | 
			
		||||
            const packagePath = path.dirname(resolvedPath);
 | 
			
		||||
            return packagePath;
 | 
			
		||||
        }
 | 
			
		||||
        catch (e) {
 | 
			
		||||
            throw new Error(`Cannot find package "${packageName}" from "${baseFolderPath}": ${e}`);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    static _getPackageName(rootPath) {
 | 
			
		||||
        const packageJsonPath = PackageJsonLookup_1.PackageJsonLookup.instance.tryGetPackageJsonFilePathFor(rootPath);
 | 
			
		||||
        if (packageJsonPath) {
 | 
			
		||||
            const packageJson = PackageJsonLookup_1.PackageJsonLookup.instance.loadPackageJson(packageJsonPath);
 | 
			
		||||
            return {
 | 
			
		||||
                packageRootPath: path.dirname(packageJsonPath),
 | 
			
		||||
                packageName: packageJson.name
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            return undefined;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
exports.Import = Import;
 | 
			
		||||
//# sourceMappingURL=Import.js.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/Import.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/Import.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										36
									
								
								node_modules/@rushstack/node-core-library/lib/InternalError.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								node_modules/@rushstack/node-core-library/lib/InternalError.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,36 @@
 | 
			
		||||
/**
 | 
			
		||||
 * An `Error` subclass that should be thrown to report an unexpected state that may indicate a software defect.
 | 
			
		||||
 * An application may handle this error by instructing the end user to report an issue to the application maintainers.
 | 
			
		||||
 *
 | 
			
		||||
 * @remarks
 | 
			
		||||
 * Do not use this class unless you intend to solicit bug reports from end users.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export declare class InternalError extends Error {
 | 
			
		||||
    /**
 | 
			
		||||
     * If true, a JavScript `debugger;` statement will be invoked whenever the `InternalError` constructor is called.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * Generally applications should not be catching and ignoring an `InternalError`.  Instead, the error should
 | 
			
		||||
     * be reported and typically the application will terminate.  Thus, if `InternalError` is constructed, it's
 | 
			
		||||
     * almost always something we want to examine in a debugger.
 | 
			
		||||
     */
 | 
			
		||||
    static breakInDebugger: boolean;
 | 
			
		||||
    /**
 | 
			
		||||
     * The underlying error message, without the additional boilerplate for an `InternalError`.
 | 
			
		||||
     */
 | 
			
		||||
    readonly unformattedMessage: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs a new instance of the {@link InternalError} class.
 | 
			
		||||
     *
 | 
			
		||||
     * @param message - A message describing the error.  This will be assigned to
 | 
			
		||||
     * {@link InternalError.unformattedMessage}.  The `Error.message` field will have additional boilerplate
 | 
			
		||||
     * explaining that the user has encountered a software defect.
 | 
			
		||||
     */
 | 
			
		||||
    constructor(message: string);
 | 
			
		||||
    private static _formatMessage;
 | 
			
		||||
    /** @override */
 | 
			
		||||
    toString(): string;
 | 
			
		||||
}
 | 
			
		||||
//# sourceMappingURL=InternalError.d.ts.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/InternalError.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/InternalError.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"InternalError.d.ts","sourceRoot":"","sources":["../src/InternalError.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AACH,qBAAa,aAAc,SAAQ,KAAK;IACtC;;;;;;;OAOG;IACH,OAAc,eAAe,EAAE,OAAO,CAAQ;IAE9C;;OAEG;IACH,SAAgB,kBAAkB,EAAE,MAAM,CAAC;IAE3C;;;;;;OAMG;gBACgB,OAAO,EAAE,MAAM;IAiBlC,OAAO,CAAC,MAAM,CAAC,cAAc;IAO7B,gBAAgB;IACT,QAAQ,IAAI,MAAM;CAG1B"}
 | 
			
		||||
							
								
								
									
										55
									
								
								node_modules/@rushstack/node-core-library/lib/InternalError.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								node_modules/@rushstack/node-core-library/lib/InternalError.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,55 @@
 | 
			
		||||
"use strict";
 | 
			
		||||
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 | 
			
		||||
// See LICENSE in the project root for license information.
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.InternalError = void 0;
 | 
			
		||||
/**
 | 
			
		||||
 * An `Error` subclass that should be thrown to report an unexpected state that may indicate a software defect.
 | 
			
		||||
 * An application may handle this error by instructing the end user to report an issue to the application maintainers.
 | 
			
		||||
 *
 | 
			
		||||
 * @remarks
 | 
			
		||||
 * Do not use this class unless you intend to solicit bug reports from end users.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
class InternalError extends Error {
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs a new instance of the {@link InternalError} class.
 | 
			
		||||
     *
 | 
			
		||||
     * @param message - A message describing the error.  This will be assigned to
 | 
			
		||||
     * {@link InternalError.unformattedMessage}.  The `Error.message` field will have additional boilerplate
 | 
			
		||||
     * explaining that the user has encountered a software defect.
 | 
			
		||||
     */
 | 
			
		||||
    constructor(message) {
 | 
			
		||||
        super(InternalError._formatMessage(message));
 | 
			
		||||
        // Manually set the prototype, as we can no longer extend built-in classes like Error, Array, Map, etc.
 | 
			
		||||
        // https://github.com/microsoft/TypeScript-wiki/blob/main/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work
 | 
			
		||||
        //
 | 
			
		||||
        // Note: the prototype must also be set on any classes which extend this one
 | 
			
		||||
        this.__proto__ = InternalError.prototype; // eslint-disable-line @typescript-eslint/no-explicit-any
 | 
			
		||||
        this.unformattedMessage = message;
 | 
			
		||||
        if (InternalError.breakInDebugger) {
 | 
			
		||||
            // eslint-disable-next-line no-debugger
 | 
			
		||||
            debugger;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    static _formatMessage(unformattedMessage) {
 | 
			
		||||
        return (`Internal Error: ${unformattedMessage}\n\nYou have encountered a software defect. Please consider` +
 | 
			
		||||
            ` reporting the issue to the maintainers of this application.`);
 | 
			
		||||
    }
 | 
			
		||||
    /** @override */
 | 
			
		||||
    toString() {
 | 
			
		||||
        return this.message; // Avoid adding the "Error:" prefix
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * If true, a JavScript `debugger;` statement will be invoked whenever the `InternalError` constructor is called.
 | 
			
		||||
 *
 | 
			
		||||
 * @remarks
 | 
			
		||||
 * Generally applications should not be catching and ignoring an `InternalError`.  Instead, the error should
 | 
			
		||||
 * be reported and typically the application will terminate.  Thus, if `InternalError` is constructed, it's
 | 
			
		||||
 * almost always something we want to examine in a debugger.
 | 
			
		||||
 */
 | 
			
		||||
InternalError.breakInDebugger = true;
 | 
			
		||||
exports.InternalError = InternalError;
 | 
			
		||||
//# sourceMappingURL=InternalError.js.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/InternalError.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/InternalError.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"InternalError.js","sourceRoot":"","sources":["../src/InternalError.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D;;;;;;;;GAQG;AACH,MAAa,aAAc,SAAQ,KAAK;IAgBtC;;;;;;OAMG;IACH,YAAmB,OAAe;QAChC,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;QAE7C,uGAAuG;QACvG,6IAA6I;QAC7I,EAAE;QACF,4EAA4E;QAC3E,IAAY,CAAC,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC,yDAAyD;QAE5G,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC;QAElC,IAAI,aAAa,CAAC,eAAe,EAAE;YACjC,uCAAuC;YACvC,QAAQ,CAAC;SACV;IACH,CAAC;IAEO,MAAM,CAAC,cAAc,CAAC,kBAA0B;QACtD,OAAO,CACL,mBAAmB,kBAAkB,6DAA6D;YAClG,8DAA8D,CAC/D,CAAC;IACJ,CAAC;IAED,gBAAgB;IACT,QAAQ;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,mCAAmC;IAC1D,CAAC;;AAjDD;;;;;;;GAOG;AACW,6BAAe,GAAY,IAAI,CAAC;AATnC,sCAAa","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\n/**\n * An `Error` subclass that should be thrown to report an unexpected state that may indicate a software defect.\n * An application may handle this error by instructing the end user to report an issue to the application maintainers.\n *\n * @remarks\n * Do not use this class unless you intend to solicit bug reports from end users.\n *\n * @public\n */\nexport class InternalError extends Error {\n  /**\n   * If true, a JavScript `debugger;` statement will be invoked whenever the `InternalError` constructor is called.\n   *\n   * @remarks\n   * Generally applications should not be catching and ignoring an `InternalError`.  Instead, the error should\n   * be reported and typically the application will terminate.  Thus, if `InternalError` is constructed, it's\n   * almost always something we want to examine in a debugger.\n   */\n  public static breakInDebugger: boolean = true;\n\n  /**\n   * The underlying error message, without the additional boilerplate for an `InternalError`.\n   */\n  public readonly unformattedMessage: string;\n\n  /**\n   * Constructs a new instance of the {@link InternalError} class.\n   *\n   * @param message - A message describing the error.  This will be assigned to\n   * {@link InternalError.unformattedMessage}.  The `Error.message` field will have additional boilerplate\n   * explaining that the user has encountered a software defect.\n   */\n  public constructor(message: string) {\n    super(InternalError._formatMessage(message));\n\n    // Manually set the prototype, as we can no longer extend built-in classes like Error, Array, Map, etc.\n    // https://github.com/microsoft/TypeScript-wiki/blob/main/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\n    //\n    // Note: the prototype must also be set on any classes which extend this one\n    (this as any).__proto__ = InternalError.prototype; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n    this.unformattedMessage = message;\n\n    if (InternalError.breakInDebugger) {\n      // eslint-disable-next-line no-debugger\n      debugger;\n    }\n  }\n\n  private static _formatMessage(unformattedMessage: string): string {\n    return (\n      `Internal Error: ${unformattedMessage}\\n\\nYou have encountered a software defect. Please consider` +\n      ` reporting the issue to the maintainers of this application.`\n    );\n  }\n\n  /** @override */\n  public toString(): string {\n    return this.message; // Avoid adding the \"Error:\" prefix\n  }\n}\n"]}
 | 
			
		||||
							
								
								
									
										250
									
								
								node_modules/@rushstack/node-core-library/lib/JsonFile.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										250
									
								
								node_modules/@rushstack/node-core-library/lib/JsonFile.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,250 @@
 | 
			
		||||
import type { JsonSchema, IJsonSchemaErrorInfo, IJsonSchemaValidateOptions } from './JsonSchema';
 | 
			
		||||
import { type NewlineKind } from './Text';
 | 
			
		||||
/**
 | 
			
		||||
 * Represents a JSON-serializable object whose type has not been determined yet.
 | 
			
		||||
 *
 | 
			
		||||
 * @remarks
 | 
			
		||||
 *
 | 
			
		||||
 * This type is similar to `any`, except that it communicates that the object is serializable JSON.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export type JsonObject = any;
 | 
			
		||||
/**
 | 
			
		||||
 * The Rush Stack lint rules discourage usage of `null`.  However, JSON parsers always return JavaScript's
 | 
			
		||||
 * `null` to keep the two syntaxes consistent.  When creating interfaces that describe JSON structures,
 | 
			
		||||
 * use `JsonNull` to avoid triggering the lint rule.  Do not use `JsonNull` for any other purpose.
 | 
			
		||||
 *
 | 
			
		||||
 * @remarks
 | 
			
		||||
 * If you are designing a new JSON file format, it's a good idea to avoid `null` entirely.  In most cases
 | 
			
		||||
 * there are better representations that convey more information about an item that is unknown, omitted, or disabled.
 | 
			
		||||
 *
 | 
			
		||||
 * To understand why `null` is deprecated, please see the `@rushstack/eslint-plugin` documentation here:
 | 
			
		||||
 *
 | 
			
		||||
 * {@link https://www.npmjs.com/package/@rushstack/eslint-plugin#rushstackno-null}
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export type JsonNull = null;
 | 
			
		||||
/**
 | 
			
		||||
 * Specifies the variant of JSON syntax to be used.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export declare enum JsonSyntax {
 | 
			
		||||
    /**
 | 
			
		||||
     * Specifies the exact RFC 8259 format as implemented by the `JSON.parse()` system API.
 | 
			
		||||
     * This format was designed for machine generated inputs such as an HTTP payload.
 | 
			
		||||
     * It is not a recommend choice for human-authored files, because it does not support
 | 
			
		||||
     * code comments.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     *
 | 
			
		||||
     * A well-known quote from Douglas Crockford, the inventor of JSON:
 | 
			
		||||
     *
 | 
			
		||||
     * "I removed comments from JSON because I saw people were using them to hold parsing directives,
 | 
			
		||||
     * a practice which would have destroyed interoperability.  I know that the lack of comments makes
 | 
			
		||||
     * some people sad, but it shouldn't.  Suppose you are using JSON to keep configuration files,
 | 
			
		||||
     * which you would like to annotate.  Go ahead and insert all the comments you like.
 | 
			
		||||
     * Then pipe it through JSMin before handing it to your JSON parser."
 | 
			
		||||
     *
 | 
			
		||||
     * @see {@link https://datatracker.ietf.org/doc/html/rfc8259 | RFC 8259}
 | 
			
		||||
     */
 | 
			
		||||
    Strict = "strict",
 | 
			
		||||
    /**
 | 
			
		||||
     * `JsonSyntax.JsonWithComments` is the recommended format for human-authored config files.
 | 
			
		||||
     * It is a minimal extension to `JsonSyntax.Strict` adding support for code comments
 | 
			
		||||
     * using `//` and `/*`.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     *
 | 
			
		||||
     * VS Code calls this format `jsonc`, but it should not be confused with unrelated file formats
 | 
			
		||||
     * and libraries that also use the name "JSONC".
 | 
			
		||||
     *
 | 
			
		||||
     * To fix VS Code syntax highlighting, add this setting:
 | 
			
		||||
     * `"files.associations": { "*.json": "jsonc" }`
 | 
			
		||||
     *
 | 
			
		||||
     * To fix GitHub syntax highlighting, add this to your `.gitattributes`:
 | 
			
		||||
     * `*.json linguist-language=JSON-with-Comments`
 | 
			
		||||
     */
 | 
			
		||||
    JsonWithComments = "jsonWithComments",
 | 
			
		||||
    /**
 | 
			
		||||
     * JSON5 is a project that proposes a JSON-like format supplemented with ECMAScript 5.1
 | 
			
		||||
     * notations for objects, numbers, comments, and more.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * Files using this format should use the `.json5` file extension instead of `.json`.
 | 
			
		||||
     *
 | 
			
		||||
     * JSON5 has substantial differences from JSON: object keys may be unquoted, trailing commas
 | 
			
		||||
     * are allowed, and strings may span multiple lines.  Whereas `JsonSyntax.JsonWithComments` can
 | 
			
		||||
     * be cheaply converted to standard JSON by stripping comments, parsing JSON5 requires a
 | 
			
		||||
     * nontrivial algorithm that may not be easily available in some contexts or programming languages.
 | 
			
		||||
     *
 | 
			
		||||
     * @see {@link https://json5.org/ | JSON5 project website}
 | 
			
		||||
     */
 | 
			
		||||
    Json5 = "json5"
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * Options for {@link JsonFile.parseString}, {@link JsonFile.load}, and {@link JsonFile.loadAsync}.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IJsonFileParseOptions {
 | 
			
		||||
    /**
 | 
			
		||||
     * Specifies the variant of JSON syntax to be used.
 | 
			
		||||
     *
 | 
			
		||||
     * @defaultValue
 | 
			
		||||
     * `JsonSyntax.Json5`
 | 
			
		||||
     *
 | 
			
		||||
     * NOTE: This default will be changed to `JsonSyntax.JsonWithComments` in a future release.
 | 
			
		||||
     */
 | 
			
		||||
    jsonSyntax?: JsonSyntax;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * Options for {@link JsonFile.loadAndValidate} and {@link JsonFile.loadAndValidateAsync}
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IJsonFileLoadAndValidateOptions extends IJsonFileParseOptions, IJsonSchemaValidateOptions {
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * Options for {@link JsonFile.stringify}
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IJsonFileStringifyOptions {
 | 
			
		||||
    /**
 | 
			
		||||
     * If provided, the specified newline type will be used instead of the default `\r\n`.
 | 
			
		||||
     */
 | 
			
		||||
    newlineConversion?: NewlineKind;
 | 
			
		||||
    /**
 | 
			
		||||
     * By default, `JsonFile.stringify()` validates that the object does not contain any
 | 
			
		||||
     * keys whose value is `undefined`.  To disable this validation, set `ignoreUndefinedValues=true`
 | 
			
		||||
     * which causes such keys to be silently discarded, consistent with the system `JSON.stringify()`.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     *
 | 
			
		||||
     * The JSON file format can represent `null` values ({@link JsonNull}) but not `undefined` values.
 | 
			
		||||
     * In ECMAScript code however, we generally avoid `null` and always represent empty states
 | 
			
		||||
     * as `undefined`, because it is the default value of missing/uninitialized variables.
 | 
			
		||||
     * (In practice, distinguishing "null" versus "uninitialized" has more drawbacks than benefits.)
 | 
			
		||||
     * This poses a problem when serializing ECMAScript objects that contain `undefined` members.
 | 
			
		||||
     * As a safeguard, `JsonFile` will report an error if any `undefined` values are encountered
 | 
			
		||||
     * during serialization.  Set `ignoreUndefinedValues=true` to disable this safeguard.
 | 
			
		||||
     */
 | 
			
		||||
    ignoreUndefinedValues?: boolean;
 | 
			
		||||
    /**
 | 
			
		||||
     * If true, then the "jju" library will be used to improve the text formatting.
 | 
			
		||||
     * Note that this is slightly slower than the native JSON.stringify() implementation.
 | 
			
		||||
     */
 | 
			
		||||
    prettyFormatting?: boolean;
 | 
			
		||||
    /**
 | 
			
		||||
     * If specified, this header will be prepended to the start of the file.  The header must consist
 | 
			
		||||
     * of lines prefixed by "//" characters.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * When used with {@link IJsonFileSaveOptions.updateExistingFile}
 | 
			
		||||
     * or {@link JsonFile.updateString}, the header will ONLY be added for a newly created file.
 | 
			
		||||
     */
 | 
			
		||||
    headerComment?: string;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * Options for {@link JsonFile.save} and {@link JsonFile.saveAsync}.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IJsonFileSaveOptions extends IJsonFileStringifyOptions {
 | 
			
		||||
    /**
 | 
			
		||||
     * If there is an existing file, and the contents have not changed, then
 | 
			
		||||
     * don't write anything; this preserves the old timestamp.
 | 
			
		||||
     */
 | 
			
		||||
    onlyIfChanged?: boolean;
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates the folder recursively using FileSystem.ensureFolder()
 | 
			
		||||
     * Defaults to false.
 | 
			
		||||
     */
 | 
			
		||||
    ensureFolderExists?: boolean;
 | 
			
		||||
    /**
 | 
			
		||||
     * If true, use the "jju" library to preserve the existing JSON formatting:  The file will be loaded
 | 
			
		||||
     * from the target filename, the new content will be merged in (preserving whitespace and comments),
 | 
			
		||||
     * and then the file will be overwritten with the merged contents.  If the target file does not exist,
 | 
			
		||||
     * then the file is saved normally.
 | 
			
		||||
     */
 | 
			
		||||
    updateExistingFile?: boolean;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * Utilities for reading/writing JSON files.
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export declare class JsonFile {
 | 
			
		||||
    /**
 | 
			
		||||
     * @internal
 | 
			
		||||
     */
 | 
			
		||||
    static _formatPathForError: (path: string) => string;
 | 
			
		||||
    /**
 | 
			
		||||
     * Loads a JSON file.
 | 
			
		||||
     */
 | 
			
		||||
    static load(jsonFilename: string, options?: IJsonFileParseOptions): JsonObject;
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link JsonFile.load}.
 | 
			
		||||
     */
 | 
			
		||||
    static loadAsync(jsonFilename: string, options?: IJsonFileParseOptions): Promise<JsonObject>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Parses a JSON file's contents.
 | 
			
		||||
     */
 | 
			
		||||
    static parseString(jsonContents: string, options?: IJsonFileParseOptions): JsonObject;
 | 
			
		||||
    /**
 | 
			
		||||
     * Loads a JSON file and validate its schema.
 | 
			
		||||
     */
 | 
			
		||||
    static loadAndValidate(jsonFilename: string, jsonSchema: JsonSchema, options?: IJsonFileLoadAndValidateOptions): JsonObject;
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link JsonFile.loadAndValidate}.
 | 
			
		||||
     */
 | 
			
		||||
    static loadAndValidateAsync(jsonFilename: string, jsonSchema: JsonSchema, options?: IJsonFileLoadAndValidateOptions): Promise<JsonObject>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Loads a JSON file and validate its schema, reporting errors using a callback
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * See JsonSchema.validateObjectWithCallback() for more info.
 | 
			
		||||
     */
 | 
			
		||||
    static loadAndValidateWithCallback(jsonFilename: string, jsonSchema: JsonSchema, errorCallback: (errorInfo: IJsonSchemaErrorInfo) => void, options?: IJsonFileLoadAndValidateOptions): JsonObject;
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link JsonFile.loadAndValidateWithCallback}.
 | 
			
		||||
     */
 | 
			
		||||
    static loadAndValidateWithCallbackAsync(jsonFilename: string, jsonSchema: JsonSchema, errorCallback: (errorInfo: IJsonSchemaErrorInfo) => void, options?: IJsonFileLoadAndValidateOptions): Promise<JsonObject>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Serializes the specified JSON object to a string buffer.
 | 
			
		||||
     * @param jsonObject - the object to be serialized
 | 
			
		||||
     * @param options - other settings that control serialization
 | 
			
		||||
     * @returns a JSON string, with newlines, and indented with two spaces
 | 
			
		||||
     */
 | 
			
		||||
    static stringify(jsonObject: JsonObject, options?: IJsonFileStringifyOptions): string;
 | 
			
		||||
    /**
 | 
			
		||||
     * Serializes the specified JSON object to a string buffer.
 | 
			
		||||
     * @param previousJson - the previous JSON string, which will be updated
 | 
			
		||||
     * @param newJsonObject - the object to be serialized
 | 
			
		||||
     * @param options - other settings that control serialization
 | 
			
		||||
     * @returns a JSON string, with newlines, and indented with two spaces
 | 
			
		||||
     */
 | 
			
		||||
    static updateString(previousJson: string, newJsonObject: JsonObject, options?: IJsonFileStringifyOptions): string;
 | 
			
		||||
    /**
 | 
			
		||||
     * Saves the file to disk.  Returns false if nothing was written due to options.onlyIfChanged.
 | 
			
		||||
     * @param jsonObject - the object to be saved
 | 
			
		||||
     * @param jsonFilename - the file path to write
 | 
			
		||||
     * @param options - other settings that control how the file is saved
 | 
			
		||||
     * @returns false if ISaveJsonFileOptions.onlyIfChanged didn't save anything; true otherwise
 | 
			
		||||
     */
 | 
			
		||||
    static save(jsonObject: JsonObject, jsonFilename: string, options?: IJsonFileSaveOptions): boolean;
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link JsonFile.save}.
 | 
			
		||||
     */
 | 
			
		||||
    static saveAsync(jsonObject: JsonObject, jsonFilename: string, options?: IJsonFileSaveOptions): Promise<boolean>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Used to validate a data structure before writing.  Reports an error if there
 | 
			
		||||
     * are any undefined members.
 | 
			
		||||
     */
 | 
			
		||||
    static validateNoUndefinedMembers(jsonObject: JsonObject): void;
 | 
			
		||||
    private static _validateNoUndefinedMembers;
 | 
			
		||||
    private static _formatKeyPath;
 | 
			
		||||
    private static _formatJsonHeaderComment;
 | 
			
		||||
    private static _buildJjuParseOptions;
 | 
			
		||||
}
 | 
			
		||||
//# sourceMappingURL=JsonFile.d.ts.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/JsonFile.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/JsonFile.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"JsonFile.d.ts","sourceRoot":"","sources":["../src/JsonFile.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AACjG,OAAO,EAAQ,KAAK,WAAW,EAAE,MAAM,QAAQ,CAAC;AAGhD;;;;;;;;GAQG;AAEH,MAAM,MAAM,UAAU,GAAG,GAAG,CAAC;AAE7B;;;;;;;;;;;;;;GAcG;AAEH,MAAM,MAAM,QAAQ,GAAG,IAAI,CAAC;AAE5B;;;;GAIG;AACH,oBAAY,UAAU;IACpB;;;;;;;;;;;;;;;;;OAiBG;IACH,MAAM,WAAW;IAEjB;;;;;;;;;;;;;;;OAeG;IACH,gBAAgB,qBAAqB;IAErC;;;;;;;;;;;;;OAaG;IACH,KAAK,UAAU;CAChB;AAED;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED;;;;GAIG;AACH,MAAM,WAAW,+BAAgC,SAAQ,qBAAqB,EAAE,0BAA0B;CAAG;AAE7G;;;;GAIG;AACH,MAAM,WAAW,yBAAyB;IACxC;;OAEG;IACH,iBAAiB,CAAC,EAAE,WAAW,CAAC;IAEhC;;;;;;;;;;;;;;OAcG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAqB,SAAQ,yBAAyB;IACrE;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAID;;;GAGG;AACH,qBAAa,QAAQ;IACnB;;OAEG;IACH,OAAc,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAA0B;IAErF;;OAEG;WACW,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,UAAU;IAkBrF;;OAEG;WACiB,SAAS,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC;IAkBzG;;OAEG;WACW,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,UAAU;IAK5F;;OAEG;WACW,eAAe,CAC3B,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,UAAU,EACtB,OAAO,CAAC,EAAE,+BAA+B,GACxC,UAAU;IAOb;;OAEG;WACiB,oBAAoB,CACtC,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,UAAU,EACtB,OAAO,CAAC,EAAE,+BAA+B,GACxC,OAAO,CAAC,UAAU,CAAC;IAOtB;;;;OAIG;WACW,2BAA2B,CACvC,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,CAAC,SAAS,EAAE,oBAAoB,KAAK,IAAI,EACxD,OAAO,CAAC,EAAE,+BAA+B,GACxC,UAAU;IAOb;;OAEG;WACiB,gCAAgC,CAClD,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,CAAC,SAAS,EAAE,oBAAoB,KAAK,IAAI,EACxD,OAAO,CAAC,EAAE,+BAA+B,GACxC,OAAO,CAAC,UAAU,CAAC;IAOtB;;;;;OAKG;WACW,SAAS,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,yBAAyB,GAAG,MAAM;IAI5F;;;;;;OAMG;WACW,YAAY,CACxB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,UAAU,EACzB,OAAO,CAAC,EAAE,yBAAyB,GAClC,MAAM;IA6CT;;;;;;OAMG;WACW,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO;IAmDzG;;OAEG;WACiB,SAAS,CAC3B,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,OAAO,CAAC;IAmDnB;;;OAGG;WACW,0BAA0B,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IAKtE,OAAO,CAAC,MAAM,CAAC,2BAA2B;IAuB1C,OAAO,CAAC,MAAM,CAAC,cAAc;IA2B7B,OAAO,CAAC,MAAM,CAAC,wBAAwB;IAmBvC,OAAO,CAAC,MAAM,CAAC,qBAAqB;CAoBrC"}
 | 
			
		||||
							
								
								
									
										426
									
								
								node_modules/@rushstack/node-core-library/lib/JsonFile.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										426
									
								
								node_modules/@rushstack/node-core-library/lib/JsonFile.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,426 @@
 | 
			
		||||
"use strict";
 | 
			
		||||
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 | 
			
		||||
// See LICENSE in the project root for license information.
 | 
			
		||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    var desc = Object.getOwnPropertyDescriptor(m, k);
 | 
			
		||||
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
 | 
			
		||||
      desc = { enumerable: true, get: function() { return m[k]; } };
 | 
			
		||||
    }
 | 
			
		||||
    Object.defineProperty(o, k2, desc);
 | 
			
		||||
}) : (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    o[k2] = m[k];
 | 
			
		||||
}));
 | 
			
		||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
 | 
			
		||||
    Object.defineProperty(o, "default", { enumerable: true, value: v });
 | 
			
		||||
}) : function(o, v) {
 | 
			
		||||
    o["default"] = v;
 | 
			
		||||
});
 | 
			
		||||
var __importStar = (this && this.__importStar) || function (mod) {
 | 
			
		||||
    if (mod && mod.__esModule) return mod;
 | 
			
		||||
    var result = {};
 | 
			
		||||
    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
 | 
			
		||||
    __setModuleDefault(result, mod);
 | 
			
		||||
    return result;
 | 
			
		||||
};
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.JsonFile = exports.JsonSyntax = void 0;
 | 
			
		||||
const os = __importStar(require("os"));
 | 
			
		||||
const jju = __importStar(require("jju"));
 | 
			
		||||
const Text_1 = require("./Text");
 | 
			
		||||
const FileSystem_1 = require("./FileSystem");
 | 
			
		||||
/**
 | 
			
		||||
 * Specifies the variant of JSON syntax to be used.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
var JsonSyntax;
 | 
			
		||||
(function (JsonSyntax) {
 | 
			
		||||
    /**
 | 
			
		||||
     * Specifies the exact RFC 8259 format as implemented by the `JSON.parse()` system API.
 | 
			
		||||
     * This format was designed for machine generated inputs such as an HTTP payload.
 | 
			
		||||
     * It is not a recommend choice for human-authored files, because it does not support
 | 
			
		||||
     * code comments.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     *
 | 
			
		||||
     * A well-known quote from Douglas Crockford, the inventor of JSON:
 | 
			
		||||
     *
 | 
			
		||||
     * "I removed comments from JSON because I saw people were using them to hold parsing directives,
 | 
			
		||||
     * a practice which would have destroyed interoperability.  I know that the lack of comments makes
 | 
			
		||||
     * some people sad, but it shouldn't.  Suppose you are using JSON to keep configuration files,
 | 
			
		||||
     * which you would like to annotate.  Go ahead and insert all the comments you like.
 | 
			
		||||
     * Then pipe it through JSMin before handing it to your JSON parser."
 | 
			
		||||
     *
 | 
			
		||||
     * @see {@link https://datatracker.ietf.org/doc/html/rfc8259 | RFC 8259}
 | 
			
		||||
     */
 | 
			
		||||
    JsonSyntax["Strict"] = "strict";
 | 
			
		||||
    /**
 | 
			
		||||
     * `JsonSyntax.JsonWithComments` is the recommended format for human-authored config files.
 | 
			
		||||
     * It is a minimal extension to `JsonSyntax.Strict` adding support for code comments
 | 
			
		||||
     * using `//` and `/*`.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     *
 | 
			
		||||
     * VS Code calls this format `jsonc`, but it should not be confused with unrelated file formats
 | 
			
		||||
     * and libraries that also use the name "JSONC".
 | 
			
		||||
     *
 | 
			
		||||
     * To fix VS Code syntax highlighting, add this setting:
 | 
			
		||||
     * `"files.associations": { "*.json": "jsonc" }`
 | 
			
		||||
     *
 | 
			
		||||
     * To fix GitHub syntax highlighting, add this to your `.gitattributes`:
 | 
			
		||||
     * `*.json linguist-language=JSON-with-Comments`
 | 
			
		||||
     */
 | 
			
		||||
    JsonSyntax["JsonWithComments"] = "jsonWithComments";
 | 
			
		||||
    /**
 | 
			
		||||
     * JSON5 is a project that proposes a JSON-like format supplemented with ECMAScript 5.1
 | 
			
		||||
     * notations for objects, numbers, comments, and more.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * Files using this format should use the `.json5` file extension instead of `.json`.
 | 
			
		||||
     *
 | 
			
		||||
     * JSON5 has substantial differences from JSON: object keys may be unquoted, trailing commas
 | 
			
		||||
     * are allowed, and strings may span multiple lines.  Whereas `JsonSyntax.JsonWithComments` can
 | 
			
		||||
     * be cheaply converted to standard JSON by stripping comments, parsing JSON5 requires a
 | 
			
		||||
     * nontrivial algorithm that may not be easily available in some contexts or programming languages.
 | 
			
		||||
     *
 | 
			
		||||
     * @see {@link https://json5.org/ | JSON5 project website}
 | 
			
		||||
     */
 | 
			
		||||
    JsonSyntax["Json5"] = "json5";
 | 
			
		||||
})(JsonSyntax = exports.JsonSyntax || (exports.JsonSyntax = {}));
 | 
			
		||||
const DEFAULT_ENCODING = 'utf8';
 | 
			
		||||
/**
 | 
			
		||||
 * Utilities for reading/writing JSON files.
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
class JsonFile {
 | 
			
		||||
    /**
 | 
			
		||||
     * Loads a JSON file.
 | 
			
		||||
     */
 | 
			
		||||
    static load(jsonFilename, options) {
 | 
			
		||||
        try {
 | 
			
		||||
            const contents = FileSystem_1.FileSystem.readFile(jsonFilename);
 | 
			
		||||
            const parseOptions = JsonFile._buildJjuParseOptions(options);
 | 
			
		||||
            return jju.parse(contents, parseOptions);
 | 
			
		||||
        }
 | 
			
		||||
        catch (error) {
 | 
			
		||||
            if (FileSystem_1.FileSystem.isNotExistError(error)) {
 | 
			
		||||
                throw error;
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                throw new Error(`Error reading "${JsonFile._formatPathForError(jsonFilename)}":` +
 | 
			
		||||
                    os.EOL +
 | 
			
		||||
                    `  ${error.message}`);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link JsonFile.load}.
 | 
			
		||||
     */
 | 
			
		||||
    static async loadAsync(jsonFilename, options) {
 | 
			
		||||
        try {
 | 
			
		||||
            const contents = await FileSystem_1.FileSystem.readFileAsync(jsonFilename);
 | 
			
		||||
            const parseOptions = JsonFile._buildJjuParseOptions(options);
 | 
			
		||||
            return jju.parse(contents, parseOptions);
 | 
			
		||||
        }
 | 
			
		||||
        catch (error) {
 | 
			
		||||
            if (FileSystem_1.FileSystem.isNotExistError(error)) {
 | 
			
		||||
                throw error;
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                throw new Error(`Error reading "${JsonFile._formatPathForError(jsonFilename)}":` +
 | 
			
		||||
                    os.EOL +
 | 
			
		||||
                    `  ${error.message}`);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Parses a JSON file's contents.
 | 
			
		||||
     */
 | 
			
		||||
    static parseString(jsonContents, options) {
 | 
			
		||||
        const parseOptions = JsonFile._buildJjuParseOptions(options);
 | 
			
		||||
        return jju.parse(jsonContents, parseOptions);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Loads a JSON file and validate its schema.
 | 
			
		||||
     */
 | 
			
		||||
    static loadAndValidate(jsonFilename, jsonSchema, options) {
 | 
			
		||||
        const jsonObject = JsonFile.load(jsonFilename, options);
 | 
			
		||||
        jsonSchema.validateObject(jsonObject, jsonFilename, options);
 | 
			
		||||
        return jsonObject;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link JsonFile.loadAndValidate}.
 | 
			
		||||
     */
 | 
			
		||||
    static async loadAndValidateAsync(jsonFilename, jsonSchema, options) {
 | 
			
		||||
        const jsonObject = await JsonFile.loadAsync(jsonFilename, options);
 | 
			
		||||
        jsonSchema.validateObject(jsonObject, jsonFilename, options);
 | 
			
		||||
        return jsonObject;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Loads a JSON file and validate its schema, reporting errors using a callback
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * See JsonSchema.validateObjectWithCallback() for more info.
 | 
			
		||||
     */
 | 
			
		||||
    static loadAndValidateWithCallback(jsonFilename, jsonSchema, errorCallback, options) {
 | 
			
		||||
        const jsonObject = JsonFile.load(jsonFilename, options);
 | 
			
		||||
        jsonSchema.validateObjectWithCallback(jsonObject, errorCallback);
 | 
			
		||||
        return jsonObject;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link JsonFile.loadAndValidateWithCallback}.
 | 
			
		||||
     */
 | 
			
		||||
    static async loadAndValidateWithCallbackAsync(jsonFilename, jsonSchema, errorCallback, options) {
 | 
			
		||||
        const jsonObject = await JsonFile.loadAsync(jsonFilename, options);
 | 
			
		||||
        jsonSchema.validateObjectWithCallback(jsonObject, errorCallback);
 | 
			
		||||
        return jsonObject;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Serializes the specified JSON object to a string buffer.
 | 
			
		||||
     * @param jsonObject - the object to be serialized
 | 
			
		||||
     * @param options - other settings that control serialization
 | 
			
		||||
     * @returns a JSON string, with newlines, and indented with two spaces
 | 
			
		||||
     */
 | 
			
		||||
    static stringify(jsonObject, options) {
 | 
			
		||||
        return JsonFile.updateString('', jsonObject, options);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Serializes the specified JSON object to a string buffer.
 | 
			
		||||
     * @param previousJson - the previous JSON string, which will be updated
 | 
			
		||||
     * @param newJsonObject - the object to be serialized
 | 
			
		||||
     * @param options - other settings that control serialization
 | 
			
		||||
     * @returns a JSON string, with newlines, and indented with two spaces
 | 
			
		||||
     */
 | 
			
		||||
    static updateString(previousJson, newJsonObject, options) {
 | 
			
		||||
        if (!options) {
 | 
			
		||||
            options = {};
 | 
			
		||||
        }
 | 
			
		||||
        if (!options.ignoreUndefinedValues) {
 | 
			
		||||
            // Standard handling of `undefined` in JSON stringification is to discard the key.
 | 
			
		||||
            JsonFile.validateNoUndefinedMembers(newJsonObject);
 | 
			
		||||
        }
 | 
			
		||||
        let stringified;
 | 
			
		||||
        if (previousJson !== '') {
 | 
			
		||||
            // NOTE: We don't use mode=json here because comments aren't allowed by strict JSON
 | 
			
		||||
            stringified = jju.update(previousJson, newJsonObject, {
 | 
			
		||||
                mode: 'cjson',
 | 
			
		||||
                indent: 2
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        else if (options.prettyFormatting) {
 | 
			
		||||
            stringified = jju.stringify(newJsonObject, {
 | 
			
		||||
                mode: 'json',
 | 
			
		||||
                indent: 2
 | 
			
		||||
            });
 | 
			
		||||
            if (options.headerComment !== undefined) {
 | 
			
		||||
                stringified = JsonFile._formatJsonHeaderComment(options.headerComment) + stringified;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            stringified = JSON.stringify(newJsonObject, undefined, 2);
 | 
			
		||||
            if (options.headerComment !== undefined) {
 | 
			
		||||
                stringified = JsonFile._formatJsonHeaderComment(options.headerComment) + stringified;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        // Add the trailing newline
 | 
			
		||||
        stringified = Text_1.Text.ensureTrailingNewline(stringified);
 | 
			
		||||
        if (options && options.newlineConversion) {
 | 
			
		||||
            stringified = Text_1.Text.convertTo(stringified, options.newlineConversion);
 | 
			
		||||
        }
 | 
			
		||||
        return stringified;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Saves the file to disk.  Returns false if nothing was written due to options.onlyIfChanged.
 | 
			
		||||
     * @param jsonObject - the object to be saved
 | 
			
		||||
     * @param jsonFilename - the file path to write
 | 
			
		||||
     * @param options - other settings that control how the file is saved
 | 
			
		||||
     * @returns false if ISaveJsonFileOptions.onlyIfChanged didn't save anything; true otherwise
 | 
			
		||||
     */
 | 
			
		||||
    static save(jsonObject, jsonFilename, options) {
 | 
			
		||||
        if (!options) {
 | 
			
		||||
            options = {};
 | 
			
		||||
        }
 | 
			
		||||
        // Do we need to read the previous file contents?
 | 
			
		||||
        let oldBuffer = undefined;
 | 
			
		||||
        if (options.updateExistingFile || options.onlyIfChanged) {
 | 
			
		||||
            try {
 | 
			
		||||
                oldBuffer = FileSystem_1.FileSystem.readFileToBuffer(jsonFilename);
 | 
			
		||||
            }
 | 
			
		||||
            catch (error) {
 | 
			
		||||
                if (!FileSystem_1.FileSystem.isNotExistError(error)) {
 | 
			
		||||
                    throw error;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        let jsonToUpdate = '';
 | 
			
		||||
        if (options.updateExistingFile && oldBuffer) {
 | 
			
		||||
            jsonToUpdate = oldBuffer.toString(DEFAULT_ENCODING);
 | 
			
		||||
        }
 | 
			
		||||
        const newJson = JsonFile.updateString(jsonToUpdate, jsonObject, options);
 | 
			
		||||
        const newBuffer = Buffer.from(newJson, DEFAULT_ENCODING);
 | 
			
		||||
        if (options.onlyIfChanged) {
 | 
			
		||||
            // Has the file changed?
 | 
			
		||||
            if (oldBuffer && Buffer.compare(newBuffer, oldBuffer) === 0) {
 | 
			
		||||
                // Nothing has changed, so don't touch the file
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        FileSystem_1.FileSystem.writeFile(jsonFilename, newBuffer, {
 | 
			
		||||
            ensureFolderExists: options.ensureFolderExists
 | 
			
		||||
        });
 | 
			
		||||
        // TEST CODE: Used to verify that onlyIfChanged isn't broken by a hidden transformation during saving.
 | 
			
		||||
        /*
 | 
			
		||||
        const oldBuffer2: Buffer = FileSystem.readFileToBuffer(jsonFilename);
 | 
			
		||||
        if (Buffer.compare(buffer, oldBuffer2) !== 0) {
 | 
			
		||||
          console.log('new:' + buffer.toString('hex'));
 | 
			
		||||
          console.log('old:' + oldBuffer2.toString('hex'));
 | 
			
		||||
    
 | 
			
		||||
          throw new Error('onlyIfChanged logic is broken');
 | 
			
		||||
        }
 | 
			
		||||
        */
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * An async version of {@link JsonFile.save}.
 | 
			
		||||
     */
 | 
			
		||||
    static async saveAsync(jsonObject, jsonFilename, options) {
 | 
			
		||||
        if (!options) {
 | 
			
		||||
            options = {};
 | 
			
		||||
        }
 | 
			
		||||
        // Do we need to read the previous file contents?
 | 
			
		||||
        let oldBuffer = undefined;
 | 
			
		||||
        if (options.updateExistingFile || options.onlyIfChanged) {
 | 
			
		||||
            try {
 | 
			
		||||
                oldBuffer = await FileSystem_1.FileSystem.readFileToBufferAsync(jsonFilename);
 | 
			
		||||
            }
 | 
			
		||||
            catch (error) {
 | 
			
		||||
                if (!FileSystem_1.FileSystem.isNotExistError(error)) {
 | 
			
		||||
                    throw error;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        let jsonToUpdate = '';
 | 
			
		||||
        if (options.updateExistingFile && oldBuffer) {
 | 
			
		||||
            jsonToUpdate = oldBuffer.toString(DEFAULT_ENCODING);
 | 
			
		||||
        }
 | 
			
		||||
        const newJson = JsonFile.updateString(jsonToUpdate, jsonObject, options);
 | 
			
		||||
        const newBuffer = Buffer.from(newJson, DEFAULT_ENCODING);
 | 
			
		||||
        if (options.onlyIfChanged) {
 | 
			
		||||
            // Has the file changed?
 | 
			
		||||
            if (oldBuffer && Buffer.compare(newBuffer, oldBuffer) === 0) {
 | 
			
		||||
                // Nothing has changed, so don't touch the file
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        await FileSystem_1.FileSystem.writeFileAsync(jsonFilename, newBuffer, {
 | 
			
		||||
            ensureFolderExists: options.ensureFolderExists
 | 
			
		||||
        });
 | 
			
		||||
        // TEST CODE: Used to verify that onlyIfChanged isn't broken by a hidden transformation during saving.
 | 
			
		||||
        /*
 | 
			
		||||
        const oldBuffer2: Buffer = await FileSystem.readFileToBufferAsync(jsonFilename);
 | 
			
		||||
        if (Buffer.compare(buffer, oldBuffer2) !== 0) {
 | 
			
		||||
          console.log('new:' + buffer.toString('hex'));
 | 
			
		||||
          console.log('old:' + oldBuffer2.toString('hex'));
 | 
			
		||||
    
 | 
			
		||||
          throw new Error('onlyIfChanged logic is broken');
 | 
			
		||||
        }
 | 
			
		||||
        */
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Used to validate a data structure before writing.  Reports an error if there
 | 
			
		||||
     * are any undefined members.
 | 
			
		||||
     */
 | 
			
		||||
    static validateNoUndefinedMembers(jsonObject) {
 | 
			
		||||
        return JsonFile._validateNoUndefinedMembers(jsonObject, []);
 | 
			
		||||
    }
 | 
			
		||||
    // Private implementation of validateNoUndefinedMembers()
 | 
			
		||||
    static _validateNoUndefinedMembers(jsonObject, keyPath) {
 | 
			
		||||
        if (!jsonObject) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        if (typeof jsonObject === 'object') {
 | 
			
		||||
            for (const key of Object.keys(jsonObject)) {
 | 
			
		||||
                keyPath.push(key);
 | 
			
		||||
                // eslint-disable-next-line @typescript-eslint/no-explicit-any
 | 
			
		||||
                const value = jsonObject[key];
 | 
			
		||||
                if (value === undefined) {
 | 
			
		||||
                    const fullPath = JsonFile._formatKeyPath(keyPath);
 | 
			
		||||
                    throw new Error(`The value for ${fullPath} is "undefined" and cannot be serialized as JSON`);
 | 
			
		||||
                }
 | 
			
		||||
                JsonFile._validateNoUndefinedMembers(value, keyPath);
 | 
			
		||||
                keyPath.pop();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    // Given this input:    ['items', '4', 'syntax', 'parameters', 'string "with" symbols", 'type']
 | 
			
		||||
    // Return this string:  items[4].syntax.parameters["string \"with\" symbols"].type
 | 
			
		||||
    static _formatKeyPath(keyPath) {
 | 
			
		||||
        let result = '';
 | 
			
		||||
        for (const key of keyPath) {
 | 
			
		||||
            if (/^[0-9]+$/.test(key)) {
 | 
			
		||||
                // It's an integer, so display like this:  parent[123]
 | 
			
		||||
                result += `[${key}]`;
 | 
			
		||||
            }
 | 
			
		||||
            else if (/^[a-z_][a-z_0-9]*$/i.test(key)) {
 | 
			
		||||
                // It's an alphanumeric identifier, so display like this:  parent.name
 | 
			
		||||
                if (result) {
 | 
			
		||||
                    result += '.';
 | 
			
		||||
                }
 | 
			
		||||
                result += `${key}`;
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                // It's a freeform string, so display like this:  parent["A path: \"C:\\file\""]
 | 
			
		||||
                // Convert this:     A path: "C:\file"
 | 
			
		||||
                // To this:          A path: \"C:\\file\"
 | 
			
		||||
                const escapedKey = key
 | 
			
		||||
                    .replace(/[\\]/g, '\\\\') // escape backslashes
 | 
			
		||||
                    .replace(/["]/g, '\\'); // escape quotes
 | 
			
		||||
                result += `["${escapedKey}"]`;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
    static _formatJsonHeaderComment(headerComment) {
 | 
			
		||||
        if (headerComment === '') {
 | 
			
		||||
            return '';
 | 
			
		||||
        }
 | 
			
		||||
        const lines = headerComment.split('\n');
 | 
			
		||||
        const result = [];
 | 
			
		||||
        for (const line of lines) {
 | 
			
		||||
            if (!/^\s*$/.test(line) && !/^\s*\/\//.test(line)) {
 | 
			
		||||
                throw new Error('The headerComment lines must be blank or start with the "//" prefix.\n' +
 | 
			
		||||
                    'Invalid line' +
 | 
			
		||||
                    JSON.stringify(line));
 | 
			
		||||
            }
 | 
			
		||||
            result.push(Text_1.Text.replaceAll(line, '\r', ''));
 | 
			
		||||
        }
 | 
			
		||||
        return lines.join('\n') + '\n';
 | 
			
		||||
    }
 | 
			
		||||
    static _buildJjuParseOptions(options) {
 | 
			
		||||
        if (!options) {
 | 
			
		||||
            options = {};
 | 
			
		||||
        }
 | 
			
		||||
        const parseOptions = {};
 | 
			
		||||
        switch (options.jsonSyntax) {
 | 
			
		||||
            case JsonSyntax.Strict:
 | 
			
		||||
                parseOptions.mode = 'json';
 | 
			
		||||
                break;
 | 
			
		||||
            case JsonSyntax.JsonWithComments:
 | 
			
		||||
                parseOptions.mode = 'cjson';
 | 
			
		||||
                break;
 | 
			
		||||
            case JsonSyntax.Json5:
 | 
			
		||||
            default:
 | 
			
		||||
                parseOptions.mode = 'json5';
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
        return parseOptions;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * @internal
 | 
			
		||||
 */
 | 
			
		||||
JsonFile._formatPathForError = (path) => path;
 | 
			
		||||
exports.JsonFile = JsonFile;
 | 
			
		||||
//# sourceMappingURL=JsonFile.js.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/JsonFile.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/JsonFile.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										113
									
								
								node_modules/@rushstack/node-core-library/lib/JsonSchema.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								node_modules/@rushstack/node-core-library/lib/JsonSchema.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,113 @@
 | 
			
		||||
import { type JsonObject } from './JsonFile';
 | 
			
		||||
/**
 | 
			
		||||
 * Callback function arguments for JsonSchema.validateObjectWithCallback();
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IJsonSchemaErrorInfo {
 | 
			
		||||
    /**
 | 
			
		||||
     * The z-schema error tree, formatted as an indented text string.
 | 
			
		||||
     */
 | 
			
		||||
    details: string;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * Options for JsonSchema.validateObject()
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IJsonSchemaValidateOptions {
 | 
			
		||||
    /**
 | 
			
		||||
     * A custom header that will be used to report schema errors.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * If omitted, the default header is "JSON validation failed:".  The error message starts with
 | 
			
		||||
     * the header, followed by the full input filename, followed by the z-schema error tree.
 | 
			
		||||
     * If you wish to customize all aspects of the error message, use JsonFile.loadAndValidateWithCallback()
 | 
			
		||||
     * or JsonSchema.validateObjectWithCallback().
 | 
			
		||||
     */
 | 
			
		||||
    customErrorHeader?: string;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * Options for JsonSchema.fromFile()
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IJsonSchemaFromFileOptions {
 | 
			
		||||
    /**
 | 
			
		||||
     * Other schemas that this schema references, e.g. via the "$ref" directive.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * The tree of dependent schemas may reference the same schema more than once.
 | 
			
		||||
     * However, if the same schema "id" is used by two different JsonSchema instances,
 | 
			
		||||
     * an error will be reported.  This means you cannot load the same filename twice
 | 
			
		||||
     * and use them both together, and you cannot have diamond dependencies on different
 | 
			
		||||
     * versions of the same schema.  Although technically this would be possible to support,
 | 
			
		||||
     * it normally indicates an error or design problem.
 | 
			
		||||
     *
 | 
			
		||||
     * JsonSchema also does not allow circular references between schema dependencies.
 | 
			
		||||
     */
 | 
			
		||||
    dependentSchemas?: JsonSchema[];
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * Represents a JSON schema that can be used to validate JSON data files loaded by the JsonFile class.
 | 
			
		||||
 * @remarks
 | 
			
		||||
 * The schema itself is normally loaded and compiled later, only if it is actually required to validate
 | 
			
		||||
 * an input.  To avoid schema errors at runtime, it's recommended to create a unit test that calls
 | 
			
		||||
 * JsonSchema.ensureCompiled() for each of your schema objects.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export declare class JsonSchema {
 | 
			
		||||
    private _dependentSchemas;
 | 
			
		||||
    private _filename;
 | 
			
		||||
    private _validator;
 | 
			
		||||
    private _schemaObject;
 | 
			
		||||
    private constructor();
 | 
			
		||||
    /**
 | 
			
		||||
     * Registers a JsonSchema that will be loaded from a file on disk.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * NOTE: An error occurs if the file does not exist; however, the file itself is not loaded or validated
 | 
			
		||||
     * until it the schema is actually used.
 | 
			
		||||
     */
 | 
			
		||||
    static fromFile(filename: string, options?: IJsonSchemaFromFileOptions): JsonSchema;
 | 
			
		||||
    /**
 | 
			
		||||
     * Registers a JsonSchema that will be loaded from a file on disk.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * NOTE: An error occurs if the file does not exist; however, the file itself is not loaded or validated
 | 
			
		||||
     * until it the schema is actually used.
 | 
			
		||||
     */
 | 
			
		||||
    static fromLoadedObject(schemaObject: JsonObject): JsonSchema;
 | 
			
		||||
    private static _collectDependentSchemas;
 | 
			
		||||
    /**
 | 
			
		||||
     * Used to nicely format the ZSchema error tree.
 | 
			
		||||
     */
 | 
			
		||||
    private static _formatErrorDetails;
 | 
			
		||||
    /**
 | 
			
		||||
     * Used by _formatErrorDetails.
 | 
			
		||||
     */
 | 
			
		||||
    private static _formatErrorDetailsHelper;
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns a short name for this schema, for use in error messages.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * If the schema was loaded from a file, then the base filename is used.  Otherwise, the "id"
 | 
			
		||||
     * field is used if available.
 | 
			
		||||
     */
 | 
			
		||||
    get shortName(): string;
 | 
			
		||||
    /**
 | 
			
		||||
     * If not already done, this loads the schema from disk and compiles it.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * Any dependencies will be compiled as well.
 | 
			
		||||
     */
 | 
			
		||||
    ensureCompiled(): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * Validates the specified JSON object against this JSON schema.  If the validation fails,
 | 
			
		||||
     * an exception will be thrown.
 | 
			
		||||
     * @param jsonObject - The JSON data to be validated
 | 
			
		||||
     * @param filenameForErrors - The filename that the JSON data was available, or an empty string
 | 
			
		||||
     *    if not applicable
 | 
			
		||||
     * @param options - Other options that control the validation
 | 
			
		||||
     */
 | 
			
		||||
    validateObject(jsonObject: JsonObject, filenameForErrors: string, options?: IJsonSchemaValidateOptions): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * Validates the specified JSON object against this JSON schema.  If the validation fails,
 | 
			
		||||
     * a callback is called for each validation error.
 | 
			
		||||
     */
 | 
			
		||||
    validateObjectWithCallback(jsonObject: JsonObject, errorCallback: (errorInfo: IJsonSchemaErrorInfo) => void): void;
 | 
			
		||||
    private _ensureLoaded;
 | 
			
		||||
}
 | 
			
		||||
//# sourceMappingURL=JsonSchema.d.ts.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/JsonSchema.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/JsonSchema.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"JsonSchema.d.ts","sourceRoot":"","sources":["../src/JsonSchema.ts"],"names":[],"mappings":"AAMA,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAUvD;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,0BAA0B;IACzC;;;;;;;OAOG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,MAAM,WAAW,0BAA0B;IACzC;;;;;;;;;;;OAWG;IACH,gBAAgB,CAAC,EAAE,UAAU,EAAE,CAAC;CACjC;AAED;;;;;;;;GAQG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,UAAU,CAAwC;IAC1D,OAAO,CAAC,aAAa,CAAqC;IAE1D,OAAO;IAEP;;;;;OAKG;WACW,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,0BAA0B,GAAG,UAAU;IAiB1F;;;;;OAKG;WACW,gBAAgB,CAAC,YAAY,EAAE,UAAU,GAAG,UAAU;IAMpE,OAAO,CAAC,MAAM,CAAC,wBAAwB;IAuCvC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAIlC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,yBAAyB;IA4BxC;;;;;OAKG;IACH,IAAW,SAAS,IAAI,MAAM,CAY7B;IAED;;;;OAIG;IACI,cAAc,IAAI,IAAI;IAwC7B;;;;;;;OAOG;IACI,cAAc,CACnB,UAAU,EAAE,UAAU,EACtB,iBAAiB,EAAE,MAAM,EACzB,OAAO,CAAC,EAAE,0BAA0B,GACnC,IAAI;IASP;;;OAGG;IACI,0BAA0B,CAC/B,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,CAAC,SAAS,EAAE,oBAAoB,KAAK,IAAI,GACvD,IAAI;IAaP,OAAO,CAAC,aAAa;CAMtB"}
 | 
			
		||||
							
								
								
									
										218
									
								
								node_modules/@rushstack/node-core-library/lib/JsonSchema.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										218
									
								
								node_modules/@rushstack/node-core-library/lib/JsonSchema.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,218 @@
 | 
			
		||||
"use strict";
 | 
			
		||||
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 | 
			
		||||
// See LICENSE in the project root for license information.
 | 
			
		||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    var desc = Object.getOwnPropertyDescriptor(m, k);
 | 
			
		||||
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
 | 
			
		||||
      desc = { enumerable: true, get: function() { return m[k]; } };
 | 
			
		||||
    }
 | 
			
		||||
    Object.defineProperty(o, k2, desc);
 | 
			
		||||
}) : (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    o[k2] = m[k];
 | 
			
		||||
}));
 | 
			
		||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
 | 
			
		||||
    Object.defineProperty(o, "default", { enumerable: true, value: v });
 | 
			
		||||
}) : function(o, v) {
 | 
			
		||||
    o["default"] = v;
 | 
			
		||||
});
 | 
			
		||||
var __importStar = (this && this.__importStar) || function (mod) {
 | 
			
		||||
    if (mod && mod.__esModule) return mod;
 | 
			
		||||
    var result = {};
 | 
			
		||||
    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
 | 
			
		||||
    __setModuleDefault(result, mod);
 | 
			
		||||
    return result;
 | 
			
		||||
};
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.JsonSchema = void 0;
 | 
			
		||||
const os = __importStar(require("os"));
 | 
			
		||||
const path = __importStar(require("path"));
 | 
			
		||||
const JsonFile_1 = require("./JsonFile");
 | 
			
		||||
const FileSystem_1 = require("./FileSystem");
 | 
			
		||||
const Validator = require('z-schema/dist/ZSchema-browser-min');
 | 
			
		||||
/**
 | 
			
		||||
 * Represents a JSON schema that can be used to validate JSON data files loaded by the JsonFile class.
 | 
			
		||||
 * @remarks
 | 
			
		||||
 * The schema itself is normally loaded and compiled later, only if it is actually required to validate
 | 
			
		||||
 * an input.  To avoid schema errors at runtime, it's recommended to create a unit test that calls
 | 
			
		||||
 * JsonSchema.ensureCompiled() for each of your schema objects.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
class JsonSchema {
 | 
			
		||||
    constructor() {
 | 
			
		||||
        this._dependentSchemas = [];
 | 
			
		||||
        this._filename = '';
 | 
			
		||||
        this._validator = undefined;
 | 
			
		||||
        this._schemaObject = undefined;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Registers a JsonSchema that will be loaded from a file on disk.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * NOTE: An error occurs if the file does not exist; however, the file itself is not loaded or validated
 | 
			
		||||
     * until it the schema is actually used.
 | 
			
		||||
     */
 | 
			
		||||
    static fromFile(filename, options) {
 | 
			
		||||
        // This is a quick and inexpensive test to avoid the catch the most common errors early.
 | 
			
		||||
        // Full validation will happen later in JsonSchema.compile().
 | 
			
		||||
        if (!FileSystem_1.FileSystem.exists(filename)) {
 | 
			
		||||
            throw new Error('Schema file not found: ' + filename);
 | 
			
		||||
        }
 | 
			
		||||
        const schema = new JsonSchema();
 | 
			
		||||
        schema._filename = filename;
 | 
			
		||||
        if (options) {
 | 
			
		||||
            schema._dependentSchemas = options.dependentSchemas || [];
 | 
			
		||||
        }
 | 
			
		||||
        return schema;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Registers a JsonSchema that will be loaded from a file on disk.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * NOTE: An error occurs if the file does not exist; however, the file itself is not loaded or validated
 | 
			
		||||
     * until it the schema is actually used.
 | 
			
		||||
     */
 | 
			
		||||
    static fromLoadedObject(schemaObject) {
 | 
			
		||||
        const schema = new JsonSchema();
 | 
			
		||||
        schema._schemaObject = schemaObject;
 | 
			
		||||
        return schema;
 | 
			
		||||
    }
 | 
			
		||||
    static _collectDependentSchemas(collectedSchemas, dependentSchemas, seenObjects, seenIds) {
 | 
			
		||||
        for (const dependentSchema of dependentSchemas) {
 | 
			
		||||
            // It's okay for the same schema to appear multiple times in the tree, but we only process it once
 | 
			
		||||
            if (seenObjects.has(dependentSchema)) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            seenObjects.add(dependentSchema);
 | 
			
		||||
            const schemaId = dependentSchema._ensureLoaded();
 | 
			
		||||
            if (schemaId === '') {
 | 
			
		||||
                throw new Error(`This schema ${dependentSchema.shortName} cannot be referenced` +
 | 
			
		||||
                    ' because is missing the "id" field');
 | 
			
		||||
            }
 | 
			
		||||
            if (seenIds.has(schemaId)) {
 | 
			
		||||
                throw new Error(`This schema ${dependentSchema.shortName} has the same "id" as another schema in this set`);
 | 
			
		||||
            }
 | 
			
		||||
            seenIds.add(schemaId);
 | 
			
		||||
            collectedSchemas.push(dependentSchema);
 | 
			
		||||
            JsonSchema._collectDependentSchemas(collectedSchemas, dependentSchema._dependentSchemas, seenObjects, seenIds);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Used to nicely format the ZSchema error tree.
 | 
			
		||||
     */
 | 
			
		||||
    static _formatErrorDetails(errorDetails) {
 | 
			
		||||
        return JsonSchema._formatErrorDetailsHelper(errorDetails, '', '');
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Used by _formatErrorDetails.
 | 
			
		||||
     */
 | 
			
		||||
    static _formatErrorDetailsHelper(errorDetails, indent, buffer) {
 | 
			
		||||
        for (const errorDetail of errorDetails) {
 | 
			
		||||
            buffer += os.EOL + indent + `Error: ${errorDetail.path}`;
 | 
			
		||||
            if (errorDetail.description) {
 | 
			
		||||
                const MAX_LENGTH = 40;
 | 
			
		||||
                let truncatedDescription = errorDetail.description.trim();
 | 
			
		||||
                if (truncatedDescription.length > MAX_LENGTH) {
 | 
			
		||||
                    truncatedDescription = truncatedDescription.substr(0, MAX_LENGTH - 3) + '...';
 | 
			
		||||
                }
 | 
			
		||||
                buffer += ` (${truncatedDescription})`;
 | 
			
		||||
            }
 | 
			
		||||
            buffer += os.EOL + indent + `       ${errorDetail.message}`;
 | 
			
		||||
            if (errorDetail.inner) {
 | 
			
		||||
                buffer = JsonSchema._formatErrorDetailsHelper(errorDetail.inner, indent + '  ', buffer);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return buffer;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns a short name for this schema, for use in error messages.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * If the schema was loaded from a file, then the base filename is used.  Otherwise, the "id"
 | 
			
		||||
     * field is used if available.
 | 
			
		||||
     */
 | 
			
		||||
    get shortName() {
 | 
			
		||||
        if (!this._filename) {
 | 
			
		||||
            if (this._schemaObject) {
 | 
			
		||||
                const schemaWithId = this._schemaObject;
 | 
			
		||||
                if (schemaWithId.id) {
 | 
			
		||||
                    return schemaWithId.id;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            return '(anonymous schema)';
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            return path.basename(this._filename);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * If not already done, this loads the schema from disk and compiles it.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * Any dependencies will be compiled as well.
 | 
			
		||||
     */
 | 
			
		||||
    ensureCompiled() {
 | 
			
		||||
        this._ensureLoaded();
 | 
			
		||||
        if (!this._validator) {
 | 
			
		||||
            // Don't assign this to _validator until we're sure everything was successful
 | 
			
		||||
            const newValidator = new Validator({
 | 
			
		||||
                breakOnFirstError: false,
 | 
			
		||||
                noTypeless: true,
 | 
			
		||||
                noExtraKeywords: true
 | 
			
		||||
            });
 | 
			
		||||
            const anythingSchema = {
 | 
			
		||||
                type: ['array', 'boolean', 'integer', 'number', 'object', 'string']
 | 
			
		||||
            };
 | 
			
		||||
            // eslint-disable-next-line @typescript-eslint/no-explicit-any
 | 
			
		||||
            newValidator.setRemoteReference('http://json-schema.org/draft-04/schema', anythingSchema);
 | 
			
		||||
            const collectedSchemas = [];
 | 
			
		||||
            const seenObjects = new Set();
 | 
			
		||||
            const seenIds = new Set();
 | 
			
		||||
            JsonSchema._collectDependentSchemas(collectedSchemas, this._dependentSchemas, seenObjects, seenIds);
 | 
			
		||||
            // Validate each schema in order.  We specifically do not supply them all together, because we want
 | 
			
		||||
            // to make sure that circular references will fail to validate.
 | 
			
		||||
            for (const collectedSchema of collectedSchemas) {
 | 
			
		||||
                if (!newValidator.validateSchema(collectedSchema._schemaObject)) {
 | 
			
		||||
                    throw new Error(`Failed to validate schema "${collectedSchema.shortName}":` +
 | 
			
		||||
                        os.EOL +
 | 
			
		||||
                        JsonSchema._formatErrorDetails(newValidator.getLastErrors()));
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            this._validator = newValidator;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Validates the specified JSON object against this JSON schema.  If the validation fails,
 | 
			
		||||
     * an exception will be thrown.
 | 
			
		||||
     * @param jsonObject - The JSON data to be validated
 | 
			
		||||
     * @param filenameForErrors - The filename that the JSON data was available, or an empty string
 | 
			
		||||
     *    if not applicable
 | 
			
		||||
     * @param options - Other options that control the validation
 | 
			
		||||
     */
 | 
			
		||||
    validateObject(jsonObject, filenameForErrors, options) {
 | 
			
		||||
        this.validateObjectWithCallback(jsonObject, (errorInfo) => {
 | 
			
		||||
            const prefix = options && options.customErrorHeader ? options.customErrorHeader : 'JSON validation failed:';
 | 
			
		||||
            throw new Error(prefix + os.EOL + filenameForErrors + os.EOL + errorInfo.details);
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Validates the specified JSON object against this JSON schema.  If the validation fails,
 | 
			
		||||
     * a callback is called for each validation error.
 | 
			
		||||
     */
 | 
			
		||||
    validateObjectWithCallback(jsonObject, errorCallback) {
 | 
			
		||||
        this.ensureCompiled();
 | 
			
		||||
        if (!this._validator.validate(jsonObject, this._schemaObject)) {
 | 
			
		||||
            const errorDetails = JsonSchema._formatErrorDetails(this._validator.getLastErrors());
 | 
			
		||||
            const args = {
 | 
			
		||||
                details: errorDetails
 | 
			
		||||
            };
 | 
			
		||||
            errorCallback(args);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    _ensureLoaded() {
 | 
			
		||||
        if (!this._schemaObject) {
 | 
			
		||||
            this._schemaObject = JsonFile_1.JsonFile.load(this._filename);
 | 
			
		||||
        }
 | 
			
		||||
        return this._schemaObject.id || '';
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
exports.JsonSchema = JsonSchema;
 | 
			
		||||
//# sourceMappingURL=JsonSchema.js.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/JsonSchema.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/JsonSchema.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										34
									
								
								node_modules/@rushstack/node-core-library/lib/LegacyAdapters.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								node_modules/@rushstack/node-core-library/lib/LegacyAdapters.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Callback used by {@link LegacyAdapters}.
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export type LegacyCallback<TResult, TError> = (error: TError | null | undefined, result: TResult) => void;
 | 
			
		||||
/**
 | 
			
		||||
 * Helper functions used when interacting with APIs that do not follow modern coding practices.
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export declare class LegacyAdapters {
 | 
			
		||||
    /**
 | 
			
		||||
     * This function wraps a function with a callback in a promise.
 | 
			
		||||
     */
 | 
			
		||||
    static convertCallbackToPromise<TResult, TError>(fn: (cb: LegacyCallback<TResult, TError>) => void): Promise<TResult>;
 | 
			
		||||
    static convertCallbackToPromise<TResult, TError, TArg1>(fn: (arg1: TArg1, cb: LegacyCallback<TResult, TError>) => void, arg1: TArg1): Promise<TResult>;
 | 
			
		||||
    static convertCallbackToPromise<TResult, TError, TArg1, TArg2>(fn: (arg1: TArg1, arg2: TArg2, cb: LegacyCallback<TResult, TError>) => void, arg1: TArg1, arg2: TArg2): Promise<TResult>;
 | 
			
		||||
    static convertCallbackToPromise<TResult, TError, TArg1, TArg2, TArg3>(fn: (arg1: TArg1, arg2: TArg2, arg3: TArg3, cb: LegacyCallback<TResult, TError>) => void, arg1: TArg1, arg2: TArg2, arg3: TArg3): Promise<TResult>;
 | 
			
		||||
    static convertCallbackToPromise<TResult, TError, TArg1, TArg2, TArg3, TArg4>(fn: (arg1: TArg1, arg2: TArg2, arg3: TArg3, arg4: TArg4, cb: LegacyCallback<TResult, TError>) => void, arg1: TArg1, arg2: TArg2, arg3: TArg3, arg4: TArg4): Promise<TResult>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Normalizes an object into an `Error` object.
 | 
			
		||||
     */
 | 
			
		||||
    static scrubError(error: Error | string | any): Error;
 | 
			
		||||
    /**
 | 
			
		||||
     * Prior to Node 11.x, the `Array.sort()` algorithm is not guaranteed to be stable.
 | 
			
		||||
     * If you need a stable sort, you can use `sortStable()` as a workaround.
 | 
			
		||||
     *
 | 
			
		||||
     * @deprecated
 | 
			
		||||
     * Use native Array.sort(), since Node < 14 is no longer supported
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * On NodeJS 11.x and later, this method simply calls the native `Array.sort()`.
 | 
			
		||||
     */
 | 
			
		||||
    static sortStable<T>(array: T[], compare?: (a: T, b: T) => number): void;
 | 
			
		||||
}
 | 
			
		||||
//# sourceMappingURL=LegacyAdapters.d.ts.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/LegacyAdapters.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/LegacyAdapters.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"LegacyAdapters.d.ts","sourceRoot":"","sources":["../src/LegacyAdapters.ts"],"names":[],"mappings":"AAGA;;;GAGG;AAEH,MAAM,MAAM,cAAc,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;AAE1G;;;GAGG;AACH,qBAAa,cAAc;IACzB;;OAEG;WACW,wBAAwB,CAAC,OAAO,EAAE,MAAM,EACpD,EAAE,EAAE,CAAC,EAAE,EAAE,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,IAAI,GAChD,OAAO,CAAC,OAAO,CAAC;WACL,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAC3D,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,IAAI,EAC9D,IAAI,EAAE,KAAK,GACV,OAAO,CAAC,OAAO,CAAC;WACL,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAClE,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,IAAI,EAC3E,IAAI,EAAE,KAAK,EACX,IAAI,EAAE,KAAK,GACV,OAAO,CAAC,OAAO,CAAC;WACL,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EACzE,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,IAAI,EACxF,IAAI,EAAE,KAAK,EACX,IAAI,EAAE,KAAK,EACX,IAAI,EAAE,KAAK,GACV,OAAO,CAAC,OAAO,CAAC;WACL,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAChF,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,IAAI,EACrG,IAAI,EAAE,KAAK,EACX,IAAI,EAAE,KAAK,EACX,IAAI,EAAE,KAAK,EACX,IAAI,EAAE,KAAK,GACV,OAAO,CAAC,OAAO,CAAC;IAyCnB;;OAEG;WAEW,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,GAAG,GAAG,KAAK;IAY5D;;;;;;;;OAQG;WACW,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,MAAM,GAAG,IAAI;CAGhF"}
 | 
			
		||||
							
								
								
									
										74
									
								
								node_modules/@rushstack/node-core-library/lib/LegacyAdapters.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								node_modules/@rushstack/node-core-library/lib/LegacyAdapters.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,74 @@
 | 
			
		||||
"use strict";
 | 
			
		||||
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 | 
			
		||||
// See LICENSE in the project root for license information.
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.LegacyAdapters = void 0;
 | 
			
		||||
/**
 | 
			
		||||
 * Helper functions used when interacting with APIs that do not follow modern coding practices.
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
class LegacyAdapters {
 | 
			
		||||
    static convertCallbackToPromise(fn, arg1, arg2, arg3, arg4) {
 | 
			
		||||
        return new Promise((resolve, reject) => {
 | 
			
		||||
            const cb = (error, result) => {
 | 
			
		||||
                if (error) {
 | 
			
		||||
                    reject(LegacyAdapters.scrubError(error));
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    resolve(result);
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
            try {
 | 
			
		||||
                if (arg1 !== undefined && arg2 !== undefined && arg3 !== undefined && arg4 !== undefined) {
 | 
			
		||||
                    fn(arg1, arg2, arg3, arg4, cb);
 | 
			
		||||
                }
 | 
			
		||||
                else if (arg1 !== undefined && arg2 !== undefined && arg3 !== undefined) {
 | 
			
		||||
                    fn(arg1, arg2, arg3, cb);
 | 
			
		||||
                }
 | 
			
		||||
                else if (arg1 !== undefined && arg2 !== undefined) {
 | 
			
		||||
                    fn(arg1, arg2, cb);
 | 
			
		||||
                }
 | 
			
		||||
                else if (arg1 !== undefined) {
 | 
			
		||||
                    fn(arg1, cb);
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    fn(cb);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            catch (e) {
 | 
			
		||||
                reject(e);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Normalizes an object into an `Error` object.
 | 
			
		||||
     */
 | 
			
		||||
    // eslint-disable-next-line @typescript-eslint/no-explicit-any
 | 
			
		||||
    static scrubError(error) {
 | 
			
		||||
        if (error instanceof Error) {
 | 
			
		||||
            return error;
 | 
			
		||||
        }
 | 
			
		||||
        else if (typeof error === 'string') {
 | 
			
		||||
            return new Error(error);
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            const errorObject = new Error('An error occurred.');
 | 
			
		||||
            errorObject.errorData = error; // eslint-disable-line @typescript-eslint/no-explicit-any
 | 
			
		||||
            return errorObject;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Prior to Node 11.x, the `Array.sort()` algorithm is not guaranteed to be stable.
 | 
			
		||||
     * If you need a stable sort, you can use `sortStable()` as a workaround.
 | 
			
		||||
     *
 | 
			
		||||
     * @deprecated
 | 
			
		||||
     * Use native Array.sort(), since Node < 14 is no longer supported
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * On NodeJS 11.x and later, this method simply calls the native `Array.sort()`.
 | 
			
		||||
     */
 | 
			
		||||
    static sortStable(array, compare) {
 | 
			
		||||
        Array.prototype.sort.call(array, compare);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
exports.LegacyAdapters = LegacyAdapters;
 | 
			
		||||
//# sourceMappingURL=LegacyAdapters.js.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/LegacyAdapters.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/LegacyAdapters.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										89
									
								
								node_modules/@rushstack/node-core-library/lib/LockFile.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								node_modules/@rushstack/node-core-library/lib/LockFile.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,89 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Parses the process start time from the contents of a linux /proc/[pid]/stat file.
 | 
			
		||||
 * @param stat - The contents of a linux /proc/[pid]/stat file.
 | 
			
		||||
 * @returns The process start time in jiffies, or undefined if stat has an unexpected format.
 | 
			
		||||
 */
 | 
			
		||||
export declare function getProcessStartTimeFromProcStat(stat: string): string | undefined;
 | 
			
		||||
/**
 | 
			
		||||
 * Helper function that is exported for unit tests only.
 | 
			
		||||
 * Returns undefined if the process doesn't exist with that pid.
 | 
			
		||||
 */
 | 
			
		||||
export declare function getProcessStartTime(pid: number): string | undefined;
 | 
			
		||||
/**
 | 
			
		||||
 * The `LockFile` implements a file-based mutex for synchronizing access to a shared resource
 | 
			
		||||
 * between multiple Node.js processes.  It is not recommended for synchronization solely within
 | 
			
		||||
 * a single Node.js process.
 | 
			
		||||
 * @remarks
 | 
			
		||||
 * The implementation works on Windows, Mac, and Linux without requiring any native helpers.
 | 
			
		||||
 * On non-Windows systems, the algorithm requires access to the `ps` shell command.  On Linux,
 | 
			
		||||
 * it requires access the `/proc/${pidString}/stat` filesystem.
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export declare class LockFile {
 | 
			
		||||
    private static _getStartTime;
 | 
			
		||||
    private _fileWriter;
 | 
			
		||||
    private _filePath;
 | 
			
		||||
    private _dirtyWhenAcquired;
 | 
			
		||||
    private constructor();
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the path of the lockfile that will be created when a lock is successfully acquired.
 | 
			
		||||
     * @param resourceFolder - The folder where the lock file will be created
 | 
			
		||||
     * @param resourceName - An alphanumeric name that describes the resource being locked.  This will become
 | 
			
		||||
     *   the filename of the temporary file created to manage the lock.
 | 
			
		||||
     * @param pid - The PID for the current Node.js process (`process.pid`), which is used by the locking algorithm.
 | 
			
		||||
     */
 | 
			
		||||
    static getLockFilePath(resourceFolder: string, resourceName: string, pid?: number): string;
 | 
			
		||||
    /**
 | 
			
		||||
     * Attempts to create a lockfile with the given filePath.
 | 
			
		||||
     * @param resourceFolder - The folder where the lock file will be created
 | 
			
		||||
     * @param resourceName - An alphanumeric name that describes the resource being locked.  This will become
 | 
			
		||||
     *   the filename of the temporary file created to manage the lock.
 | 
			
		||||
     * @returns If successful, returns a `LockFile` instance.  If unable to get a lock, returns `undefined`.
 | 
			
		||||
     */
 | 
			
		||||
    static tryAcquire(resourceFolder: string, resourceName: string): LockFile | undefined;
 | 
			
		||||
    /**
 | 
			
		||||
     * Attempts to create the lockfile.  Will continue to loop at every 100ms until the lock becomes available
 | 
			
		||||
     * or the maxWaitMs is surpassed.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * This function is subject to starvation, whereby it does not ensure that the process that has been
 | 
			
		||||
     * waiting the longest to acquire the lock will get it first. This means that a process could theoretically
 | 
			
		||||
     * wait for the lock forever, while other processes skipped it in line and acquired the lock first.
 | 
			
		||||
     *
 | 
			
		||||
     * @param resourceFolder - The folder where the lock file will be created
 | 
			
		||||
     * @param resourceName - An alphanumeric name that describes the resource being locked.  This will become
 | 
			
		||||
     *   the filename of the temporary file created to manage the lock.
 | 
			
		||||
     * @param maxWaitMs - The maximum number of milliseconds to wait for the lock before reporting an error
 | 
			
		||||
     */
 | 
			
		||||
    static acquire(resourceFolder: string, resourceName: string, maxWaitMs?: number): Promise<LockFile>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Attempts to acquire the lock on a Linux or OSX machine
 | 
			
		||||
     */
 | 
			
		||||
    private static _tryAcquireMacOrLinux;
 | 
			
		||||
    /**
 | 
			
		||||
     * Attempts to acquire the lock using Windows
 | 
			
		||||
     * This algorithm is much simpler since we can rely on the operating system
 | 
			
		||||
     */
 | 
			
		||||
    private static _tryAcquireWindows;
 | 
			
		||||
    /**
 | 
			
		||||
     * Unlocks a file and optionally removes it from disk.
 | 
			
		||||
     * This can only be called once.
 | 
			
		||||
     *
 | 
			
		||||
     * @param deleteFile - Whether to delete the lockfile from disk. Defaults to true.
 | 
			
		||||
     */
 | 
			
		||||
    release(deleteFile?: boolean): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the initial state of the lock.
 | 
			
		||||
     * This can be used to detect if the previous process was terminated before releasing the resource.
 | 
			
		||||
     */
 | 
			
		||||
    get dirtyWhenAcquired(): boolean;
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the absolute path to the lockfile
 | 
			
		||||
     */
 | 
			
		||||
    get filePath(): string;
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns true if this lock is currently being held.
 | 
			
		||||
     */
 | 
			
		||||
    get isReleased(): boolean;
 | 
			
		||||
}
 | 
			
		||||
//# sourceMappingURL=LockFile.d.ts.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/LockFile.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/LockFile.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"LockFile.d.ts","sourceRoot":"","sources":["../src/LockFile.ts"],"names":[],"mappings":"AAmBA;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAsChF;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAoEnE;AAED;;;;;;;;;GASG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAC,aAAa,CAA4D;IAExF,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,kBAAkB,CAAU;IAEpC,OAAO;IAMP;;;;;;OAMG;WACW,eAAe,CAC3B,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,EACpB,GAAG,GAAE,MAAoB,GACxB,MAAM;IAiBT;;;;;;OAMG;WACW,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAU5F;;;;;;;;;;;;;OAaG;WACW,OAAO,CAAC,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAoB1G;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAuIpC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAwCjC;;;;;OAKG;IACI,OAAO,CAAC,UAAU,GAAE,OAAc,GAAG,IAAI;IAYhD;;;OAGG;IACH,IAAW,iBAAiB,IAAI,OAAO,CAEtC;IAED;;OAEG;IACH,IAAW,QAAQ,IAAI,MAAM,CAE5B;IAED;;OAEG;IACH,IAAW,UAAU,IAAI,OAAO,CAE/B;CACF"}
 | 
			
		||||
							
								
								
									
										424
									
								
								node_modules/@rushstack/node-core-library/lib/LockFile.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										424
									
								
								node_modules/@rushstack/node-core-library/lib/LockFile.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,424 @@
 | 
			
		||||
"use strict";
 | 
			
		||||
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 | 
			
		||||
// See LICENSE in the project root for license information.
 | 
			
		||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    var desc = Object.getOwnPropertyDescriptor(m, k);
 | 
			
		||||
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
 | 
			
		||||
      desc = { enumerable: true, get: function() { return m[k]; } };
 | 
			
		||||
    }
 | 
			
		||||
    Object.defineProperty(o, k2, desc);
 | 
			
		||||
}) : (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    o[k2] = m[k];
 | 
			
		||||
}));
 | 
			
		||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
 | 
			
		||||
    Object.defineProperty(o, "default", { enumerable: true, value: v });
 | 
			
		||||
}) : function(o, v) {
 | 
			
		||||
    o["default"] = v;
 | 
			
		||||
});
 | 
			
		||||
var __importStar = (this && this.__importStar) || function (mod) {
 | 
			
		||||
    if (mod && mod.__esModule) return mod;
 | 
			
		||||
    var result = {};
 | 
			
		||||
    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
 | 
			
		||||
    __setModuleDefault(result, mod);
 | 
			
		||||
    return result;
 | 
			
		||||
};
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.LockFile = exports.getProcessStartTime = exports.getProcessStartTimeFromProcStat = void 0;
 | 
			
		||||
const path = __importStar(require("path"));
 | 
			
		||||
const child_process = __importStar(require("child_process"));
 | 
			
		||||
const FileSystem_1 = require("./FileSystem");
 | 
			
		||||
const FileWriter_1 = require("./FileWriter");
 | 
			
		||||
const Async_1 = require("./Async");
 | 
			
		||||
/**
 | 
			
		||||
 * http://man7.org/linux/man-pages/man5/proc.5.html
 | 
			
		||||
 * (22) starttime  %llu
 | 
			
		||||
 * The time the process started after system boot. In kernels before Linux 2.6, this value was
 | 
			
		||||
 * expressed in jiffies. Since Linux 2.6, the value is expressed in clock ticks (divide by
 | 
			
		||||
 * sysconf(_SC_CLK_TCK)).
 | 
			
		||||
 * The format for this field was %lu before Linux 2.6.
 | 
			
		||||
 */
 | 
			
		||||
const procStatStartTimePos = 22;
 | 
			
		||||
/**
 | 
			
		||||
 * Parses the process start time from the contents of a linux /proc/[pid]/stat file.
 | 
			
		||||
 * @param stat - The contents of a linux /proc/[pid]/stat file.
 | 
			
		||||
 * @returns The process start time in jiffies, or undefined if stat has an unexpected format.
 | 
			
		||||
 */
 | 
			
		||||
function getProcessStartTimeFromProcStat(stat) {
 | 
			
		||||
    // Parse the value at position procStatStartTimePos.
 | 
			
		||||
    // We cannot just split stat on spaces, because value 2 may contain spaces.
 | 
			
		||||
    // For example, when running the following Shell commands:
 | 
			
		||||
    // > cp "$(which bash)" ./'bash 2)('
 | 
			
		||||
    // > ./'bash 2)(' -c 'OWNPID=$BASHPID;cat /proc/$OWNPID/stat'
 | 
			
		||||
    // 59389 (bash 2)() S 59358 59389 59358 34818 59389 4202496 329 0 0 0 0 0 0 0 20 0 1 0
 | 
			
		||||
    // > rm -rf ./'bash 2)('
 | 
			
		||||
    // The output shows a stat file such that value 2 contains spaces.
 | 
			
		||||
    // To still umambiguously parse such output we assume no values after the second ends with a right parenthesis...
 | 
			
		||||
    // trimRight to remove the trailing line terminator.
 | 
			
		||||
    let values = stat.trimRight().split(' ');
 | 
			
		||||
    let i = values.length - 1;
 | 
			
		||||
    while (i >= 0 &&
 | 
			
		||||
        // charAt returns an empty string if the index is out of bounds.
 | 
			
		||||
        values[i].charAt(values[i].length - 1) !== ')') {
 | 
			
		||||
        i -= 1;
 | 
			
		||||
    }
 | 
			
		||||
    // i is the index of the last part of the second value (but i need not be 1).
 | 
			
		||||
    if (i < 1) {
 | 
			
		||||
        // Format of stat has changed.
 | 
			
		||||
        return undefined;
 | 
			
		||||
    }
 | 
			
		||||
    const value2 = values.slice(1, i + 1).join(' ');
 | 
			
		||||
    values = [values[0], value2].concat(values.slice(i + 1));
 | 
			
		||||
    if (values.length < procStatStartTimePos) {
 | 
			
		||||
        // Older version of linux, or non-standard configuration of linux.
 | 
			
		||||
        return undefined;
 | 
			
		||||
    }
 | 
			
		||||
    const startTimeJiffies = values[procStatStartTimePos - 1];
 | 
			
		||||
    // In theory, the representations of start time returned by `cat /proc/[pid]/stat` and `ps -o lstart` can change
 | 
			
		||||
    // while the system is running, but we assume this does not happen.
 | 
			
		||||
    // So the caller can safely use this value as part of a unique process id (on the machine, without comparing
 | 
			
		||||
    // accross reboots).
 | 
			
		||||
    return startTimeJiffies;
 | 
			
		||||
}
 | 
			
		||||
exports.getProcessStartTimeFromProcStat = getProcessStartTimeFromProcStat;
 | 
			
		||||
/**
 | 
			
		||||
 * Helper function that is exported for unit tests only.
 | 
			
		||||
 * Returns undefined if the process doesn't exist with that pid.
 | 
			
		||||
 */
 | 
			
		||||
function getProcessStartTime(pid) {
 | 
			
		||||
    const pidString = pid.toString();
 | 
			
		||||
    if (pid < 0 || pidString.indexOf('e') >= 0 || pidString.indexOf('E') >= 0) {
 | 
			
		||||
        throw new Error(`"pid" is negative or too large`);
 | 
			
		||||
    }
 | 
			
		||||
    let args;
 | 
			
		||||
    if (process.platform === 'darwin') {
 | 
			
		||||
        args = [`-p ${pidString}`, '-o lstart'];
 | 
			
		||||
    }
 | 
			
		||||
    else if (process.platform === 'linux') {
 | 
			
		||||
        args = ['-p', pidString, '-o', 'lstart'];
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        throw new Error(`Unsupported system: ${process.platform}`);
 | 
			
		||||
    }
 | 
			
		||||
    const psResult = child_process.spawnSync('ps', args, {
 | 
			
		||||
        encoding: 'utf8'
 | 
			
		||||
    });
 | 
			
		||||
    const psStdout = psResult.stdout;
 | 
			
		||||
    // If no process with PID pid exists then the exit code is non-zero on linux but stdout is not empty.
 | 
			
		||||
    // But if no process exists we do not want to fall back on /proc/*/stat to determine the process
 | 
			
		||||
    // start time, so we we additionally test for !psStdout. NOTE: !psStdout evaluates to true if
 | 
			
		||||
    // zero bytes are written to stdout.
 | 
			
		||||
    if (psResult.status !== 0 && !psStdout && process.platform === 'linux') {
 | 
			
		||||
        // Try to read /proc/[pid]/stat and get the value at position procStatStartTimePos.
 | 
			
		||||
        let stat;
 | 
			
		||||
        try {
 | 
			
		||||
            stat = FileSystem_1.FileSystem.readFile(`/proc/${pidString}/stat`);
 | 
			
		||||
        }
 | 
			
		||||
        catch (error) {
 | 
			
		||||
            if (error.code !== 'ENOENT') {
 | 
			
		||||
                throw error;
 | 
			
		||||
            }
 | 
			
		||||
            // Either no process with PID pid exists, or this version/configuration of linux is non-standard.
 | 
			
		||||
            // We assume the former.
 | 
			
		||||
            return undefined;
 | 
			
		||||
        }
 | 
			
		||||
        if (stat !== undefined) {
 | 
			
		||||
            const startTimeJiffies = getProcessStartTimeFromProcStat(stat);
 | 
			
		||||
            if (startTimeJiffies === undefined) {
 | 
			
		||||
                throw new Error(`Could not retrieve the start time of process ${pidString} from the OS because the ` +
 | 
			
		||||
                    `contents of /proc/${pidString}/stat have an unexpected format`);
 | 
			
		||||
            }
 | 
			
		||||
            return startTimeJiffies;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    // there was an error executing ps (zero bytes were written to stdout).
 | 
			
		||||
    if (!psStdout) {
 | 
			
		||||
        throw new Error(`Unexpected output from "ps" command`);
 | 
			
		||||
    }
 | 
			
		||||
    const psSplit = psStdout.split('\n');
 | 
			
		||||
    // successfuly able to run "ps", but no process was found
 | 
			
		||||
    if (psSplit[1] === '') {
 | 
			
		||||
        return undefined;
 | 
			
		||||
    }
 | 
			
		||||
    if (psSplit[1]) {
 | 
			
		||||
        const trimmed = psSplit[1].trim();
 | 
			
		||||
        if (trimmed.length > 10) {
 | 
			
		||||
            return trimmed;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    throw new Error(`Unexpected output from the "ps" command`);
 | 
			
		||||
}
 | 
			
		||||
exports.getProcessStartTime = getProcessStartTime;
 | 
			
		||||
/**
 | 
			
		||||
 * The `LockFile` implements a file-based mutex for synchronizing access to a shared resource
 | 
			
		||||
 * between multiple Node.js processes.  It is not recommended for synchronization solely within
 | 
			
		||||
 * a single Node.js process.
 | 
			
		||||
 * @remarks
 | 
			
		||||
 * The implementation works on Windows, Mac, and Linux without requiring any native helpers.
 | 
			
		||||
 * On non-Windows systems, the algorithm requires access to the `ps` shell command.  On Linux,
 | 
			
		||||
 * it requires access the `/proc/${pidString}/stat` filesystem.
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
class LockFile {
 | 
			
		||||
    constructor(fileWriter, filePath, dirtyWhenAcquired) {
 | 
			
		||||
        this._fileWriter = fileWriter;
 | 
			
		||||
        this._filePath = filePath;
 | 
			
		||||
        this._dirtyWhenAcquired = dirtyWhenAcquired;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the path of the lockfile that will be created when a lock is successfully acquired.
 | 
			
		||||
     * @param resourceFolder - The folder where the lock file will be created
 | 
			
		||||
     * @param resourceName - An alphanumeric name that describes the resource being locked.  This will become
 | 
			
		||||
     *   the filename of the temporary file created to manage the lock.
 | 
			
		||||
     * @param pid - The PID for the current Node.js process (`process.pid`), which is used by the locking algorithm.
 | 
			
		||||
     */
 | 
			
		||||
    static getLockFilePath(resourceFolder, resourceName, pid = process.pid) {
 | 
			
		||||
        if (!resourceName.match(/^[a-zA-Z0-9][a-zA-Z0-9-.]+[a-zA-Z0-9]$/)) {
 | 
			
		||||
            throw new Error(`The resource name "${resourceName}" is invalid.` +
 | 
			
		||||
                ` It must be an alphanumberic string with only "-" or "." It must start with an alphanumeric character.`);
 | 
			
		||||
        }
 | 
			
		||||
        if (process.platform === 'win32') {
 | 
			
		||||
            return path.join(path.resolve(resourceFolder), `${resourceName}.lock`);
 | 
			
		||||
        }
 | 
			
		||||
        else if (process.platform === 'linux' || process.platform === 'darwin') {
 | 
			
		||||
            return path.join(path.resolve(resourceFolder), `${resourceName}#${pid}.lock`);
 | 
			
		||||
        }
 | 
			
		||||
        throw new Error(`File locking not implemented for platform: "${process.platform}"`);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Attempts to create a lockfile with the given filePath.
 | 
			
		||||
     * @param resourceFolder - The folder where the lock file will be created
 | 
			
		||||
     * @param resourceName - An alphanumeric name that describes the resource being locked.  This will become
 | 
			
		||||
     *   the filename of the temporary file created to manage the lock.
 | 
			
		||||
     * @returns If successful, returns a `LockFile` instance.  If unable to get a lock, returns `undefined`.
 | 
			
		||||
     */
 | 
			
		||||
    static tryAcquire(resourceFolder, resourceName) {
 | 
			
		||||
        FileSystem_1.FileSystem.ensureFolder(resourceFolder);
 | 
			
		||||
        if (process.platform === 'win32') {
 | 
			
		||||
            return LockFile._tryAcquireWindows(resourceFolder, resourceName);
 | 
			
		||||
        }
 | 
			
		||||
        else if (process.platform === 'linux' || process.platform === 'darwin') {
 | 
			
		||||
            return LockFile._tryAcquireMacOrLinux(resourceFolder, resourceName);
 | 
			
		||||
        }
 | 
			
		||||
        throw new Error(`File locking not implemented for platform: "${process.platform}"`);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Attempts to create the lockfile.  Will continue to loop at every 100ms until the lock becomes available
 | 
			
		||||
     * or the maxWaitMs is surpassed.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * This function is subject to starvation, whereby it does not ensure that the process that has been
 | 
			
		||||
     * waiting the longest to acquire the lock will get it first. This means that a process could theoretically
 | 
			
		||||
     * wait for the lock forever, while other processes skipped it in line and acquired the lock first.
 | 
			
		||||
     *
 | 
			
		||||
     * @param resourceFolder - The folder where the lock file will be created
 | 
			
		||||
     * @param resourceName - An alphanumeric name that describes the resource being locked.  This will become
 | 
			
		||||
     *   the filename of the temporary file created to manage the lock.
 | 
			
		||||
     * @param maxWaitMs - The maximum number of milliseconds to wait for the lock before reporting an error
 | 
			
		||||
     */
 | 
			
		||||
    static acquire(resourceFolder, resourceName, maxWaitMs) {
 | 
			
		||||
        const interval = 100;
 | 
			
		||||
        const startTime = Date.now();
 | 
			
		||||
        const retryLoop = async () => {
 | 
			
		||||
            const lock = LockFile.tryAcquire(resourceFolder, resourceName);
 | 
			
		||||
            if (lock) {
 | 
			
		||||
                return lock;
 | 
			
		||||
            }
 | 
			
		||||
            if (maxWaitMs && Date.now() > startTime + maxWaitMs) {
 | 
			
		||||
                throw new Error(`Exceeded maximum wait time to acquire lock for resource "${resourceName}"`);
 | 
			
		||||
            }
 | 
			
		||||
            await Async_1.Async.sleep(interval);
 | 
			
		||||
            return retryLoop();
 | 
			
		||||
        };
 | 
			
		||||
        return retryLoop();
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Attempts to acquire the lock on a Linux or OSX machine
 | 
			
		||||
     */
 | 
			
		||||
    static _tryAcquireMacOrLinux(resourceFolder, resourceName) {
 | 
			
		||||
        let dirtyWhenAcquired = false;
 | 
			
		||||
        // get the current process' pid
 | 
			
		||||
        const pid = process.pid;
 | 
			
		||||
        const startTime = LockFile._getStartTime(pid);
 | 
			
		||||
        if (!startTime) {
 | 
			
		||||
            throw new Error(`Unable to calculate start time for current process.`);
 | 
			
		||||
        }
 | 
			
		||||
        const pidLockFilePath = LockFile.getLockFilePath(resourceFolder, resourceName);
 | 
			
		||||
        let lockFileHandle;
 | 
			
		||||
        let lockFile;
 | 
			
		||||
        try {
 | 
			
		||||
            // open in write mode since if this file exists, it cannot be from the current process
 | 
			
		||||
            // TODO: This will malfunction if the same process tries to acquire two locks on the same file.
 | 
			
		||||
            // We should ideally maintain a dictionary of normalized acquired filenames
 | 
			
		||||
            lockFileHandle = FileWriter_1.FileWriter.open(pidLockFilePath);
 | 
			
		||||
            lockFileHandle.write(startTime);
 | 
			
		||||
            const currentBirthTimeMs = FileSystem_1.FileSystem.getStatistics(pidLockFilePath).birthtime.getTime();
 | 
			
		||||
            let smallestBirthTimeMs = currentBirthTimeMs;
 | 
			
		||||
            let smallestBirthTimePid = pid.toString();
 | 
			
		||||
            // now, scan the directory for all lockfiles
 | 
			
		||||
            const files = FileSystem_1.FileSystem.readFolderItemNames(resourceFolder);
 | 
			
		||||
            // look for anything ending with # then numbers and ".lock"
 | 
			
		||||
            const lockFileRegExp = /^(.+)#([0-9]+)\.lock$/;
 | 
			
		||||
            let match;
 | 
			
		||||
            let otherPid;
 | 
			
		||||
            for (const fileInFolder of files) {
 | 
			
		||||
                if ((match = fileInFolder.match(lockFileRegExp)) &&
 | 
			
		||||
                    match[1] === resourceName &&
 | 
			
		||||
                    (otherPid = match[2]) !== pid.toString()) {
 | 
			
		||||
                    // we found at least one lockfile hanging around that isn't ours
 | 
			
		||||
                    const fileInFolderPath = path.join(resourceFolder, fileInFolder);
 | 
			
		||||
                    dirtyWhenAcquired = true;
 | 
			
		||||
                    // console.log(`FOUND OTHER LOCKFILE: ${otherPid}`);
 | 
			
		||||
                    const otherPidCurrentStartTime = LockFile._getStartTime(parseInt(otherPid, 10));
 | 
			
		||||
                    let otherPidOldStartTime;
 | 
			
		||||
                    let otherBirthtimeMs;
 | 
			
		||||
                    try {
 | 
			
		||||
                        otherPidOldStartTime = FileSystem_1.FileSystem.readFile(fileInFolderPath);
 | 
			
		||||
                        // check the timestamp of the file
 | 
			
		||||
                        otherBirthtimeMs = FileSystem_1.FileSystem.getStatistics(fileInFolderPath).birthtime.getTime();
 | 
			
		||||
                    }
 | 
			
		||||
                    catch (err) {
 | 
			
		||||
                        // this means the file is probably deleted already
 | 
			
		||||
                    }
 | 
			
		||||
                    // if the otherPidOldStartTime is invalid, then we should look at the timestamp,
 | 
			
		||||
                    // if this file was created after us, ignore it
 | 
			
		||||
                    // if it was created within 1 second before us, then it could be good, so we
 | 
			
		||||
                    //  will conservatively fail
 | 
			
		||||
                    // otherwise it is an old lock file and will be deleted
 | 
			
		||||
                    if (otherPidOldStartTime === '' && otherBirthtimeMs !== undefined) {
 | 
			
		||||
                        if (otherBirthtimeMs > currentBirthTimeMs) {
 | 
			
		||||
                            // ignore this file, he will be unable to get the lock since this process
 | 
			
		||||
                            // will hold it
 | 
			
		||||
                            // console.log(`Ignoring lock for pid ${otherPid} because its lockfile is newer than ours.`);
 | 
			
		||||
                            continue;
 | 
			
		||||
                        }
 | 
			
		||||
                        else if (otherBirthtimeMs - currentBirthTimeMs < 0 && // it was created before us AND
 | 
			
		||||
                            otherBirthtimeMs - currentBirthTimeMs > -1000) {
 | 
			
		||||
                            // it was created less than a second before
 | 
			
		||||
                            // conservatively be unable to keep the lock
 | 
			
		||||
                            return undefined;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    // console.log(`Other pid ${otherPid} lockfile has start time: "${otherPidOldStartTime}"`);
 | 
			
		||||
                    // console.log(`Other pid ${otherPid} actually has start time: "${otherPidCurrentStartTime}"`);
 | 
			
		||||
                    // this means the process is no longer executing, delete the file
 | 
			
		||||
                    if (!otherPidCurrentStartTime || otherPidOldStartTime !== otherPidCurrentStartTime) {
 | 
			
		||||
                        // console.log(`Other pid ${otherPid} is no longer executing!`);
 | 
			
		||||
                        FileSystem_1.FileSystem.deleteFile(fileInFolderPath);
 | 
			
		||||
                        continue;
 | 
			
		||||
                    }
 | 
			
		||||
                    // console.log(`Pid ${otherPid} lockfile has birth time: ${otherBirthtimeMs}`);
 | 
			
		||||
                    // console.log(`Pid ${pid} lockfile has birth time: ${currentBirthTimeMs}`);
 | 
			
		||||
                    // this is a lockfile pointing at something valid
 | 
			
		||||
                    if (otherBirthtimeMs !== undefined) {
 | 
			
		||||
                        // the other lock file was created before the current earliest lock file
 | 
			
		||||
                        // or the other lock file was created at the same exact time, but has earlier pid
 | 
			
		||||
                        // note that it is acceptable to do a direct comparison of the PIDs in this case
 | 
			
		||||
                        // since we are establishing a consistent order to apply to the lock files in all
 | 
			
		||||
                        // execution instances.
 | 
			
		||||
                        // it doesn't matter that the PIDs roll over, we've already
 | 
			
		||||
                        // established that these processes all started at the same time, so we just
 | 
			
		||||
                        // need to get all instances of the lock test to agree which one won.
 | 
			
		||||
                        if (otherBirthtimeMs < smallestBirthTimeMs ||
 | 
			
		||||
                            (otherBirthtimeMs === smallestBirthTimeMs && otherPid < smallestBirthTimePid)) {
 | 
			
		||||
                            smallestBirthTimeMs = otherBirthtimeMs;
 | 
			
		||||
                            smallestBirthTimePid = otherPid;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            if (smallestBirthTimePid !== pid.toString()) {
 | 
			
		||||
                // we do not have the lock
 | 
			
		||||
                return undefined;
 | 
			
		||||
            }
 | 
			
		||||
            // we have the lock!
 | 
			
		||||
            lockFile = new LockFile(lockFileHandle, pidLockFilePath, dirtyWhenAcquired);
 | 
			
		||||
            lockFileHandle = undefined; // we have handed the descriptor off to the instance
 | 
			
		||||
        }
 | 
			
		||||
        finally {
 | 
			
		||||
            if (lockFileHandle) {
 | 
			
		||||
                // ensure our lock is closed
 | 
			
		||||
                lockFileHandle.close();
 | 
			
		||||
                FileSystem_1.FileSystem.deleteFile(pidLockFilePath);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return lockFile;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Attempts to acquire the lock using Windows
 | 
			
		||||
     * This algorithm is much simpler since we can rely on the operating system
 | 
			
		||||
     */
 | 
			
		||||
    static _tryAcquireWindows(resourceFolder, resourceName) {
 | 
			
		||||
        const lockFilePath = LockFile.getLockFilePath(resourceFolder, resourceName);
 | 
			
		||||
        let dirtyWhenAcquired = false;
 | 
			
		||||
        let fileHandle;
 | 
			
		||||
        let lockFile;
 | 
			
		||||
        try {
 | 
			
		||||
            if (FileSystem_1.FileSystem.exists(lockFilePath)) {
 | 
			
		||||
                dirtyWhenAcquired = true;
 | 
			
		||||
                // If the lockfile is held by an process with an exclusive lock, then removing it will
 | 
			
		||||
                // silently fail. OpenSync() below will then fail and we will be unable to create a lock.
 | 
			
		||||
                // Otherwise, the lockfile is sitting on disk, but nothing is holding it, implying that
 | 
			
		||||
                // the last process to hold it died.
 | 
			
		||||
                FileSystem_1.FileSystem.deleteFile(lockFilePath);
 | 
			
		||||
            }
 | 
			
		||||
            try {
 | 
			
		||||
                // Attempt to open an exclusive lockfile
 | 
			
		||||
                fileHandle = FileWriter_1.FileWriter.open(lockFilePath, { exclusive: true });
 | 
			
		||||
            }
 | 
			
		||||
            catch (error) {
 | 
			
		||||
                // we tried to delete the lock, but something else is holding it,
 | 
			
		||||
                // (probably an active process), therefore we are unable to create a lock
 | 
			
		||||
                return undefined;
 | 
			
		||||
            }
 | 
			
		||||
            // Ensure we can hand off the file descriptor to the lockfile
 | 
			
		||||
            lockFile = new LockFile(fileHandle, lockFilePath, dirtyWhenAcquired);
 | 
			
		||||
            fileHandle = undefined;
 | 
			
		||||
        }
 | 
			
		||||
        finally {
 | 
			
		||||
            if (fileHandle) {
 | 
			
		||||
                fileHandle.close();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return lockFile;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Unlocks a file and optionally removes it from disk.
 | 
			
		||||
     * This can only be called once.
 | 
			
		||||
     *
 | 
			
		||||
     * @param deleteFile - Whether to delete the lockfile from disk. Defaults to true.
 | 
			
		||||
     */
 | 
			
		||||
    release(deleteFile = true) {
 | 
			
		||||
        if (this.isReleased) {
 | 
			
		||||
            throw new Error(`The lock for file "${path.basename(this._filePath)}" has already been released.`);
 | 
			
		||||
        }
 | 
			
		||||
        this._fileWriter.close();
 | 
			
		||||
        if (deleteFile) {
 | 
			
		||||
            FileSystem_1.FileSystem.deleteFile(this._filePath);
 | 
			
		||||
        }
 | 
			
		||||
        this._fileWriter = undefined;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the initial state of the lock.
 | 
			
		||||
     * This can be used to detect if the previous process was terminated before releasing the resource.
 | 
			
		||||
     */
 | 
			
		||||
    get dirtyWhenAcquired() {
 | 
			
		||||
        return this._dirtyWhenAcquired;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the absolute path to the lockfile
 | 
			
		||||
     */
 | 
			
		||||
    get filePath() {
 | 
			
		||||
        return this._filePath;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns true if this lock is currently being held.
 | 
			
		||||
     */
 | 
			
		||||
    get isReleased() {
 | 
			
		||||
        return this._fileWriter === undefined;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
LockFile._getStartTime = getProcessStartTime;
 | 
			
		||||
exports.LockFile = LockFile;
 | 
			
		||||
//# sourceMappingURL=LockFile.js.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/LockFile.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/LockFile.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										26
									
								
								node_modules/@rushstack/node-core-library/lib/MapExtensions.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								node_modules/@rushstack/node-core-library/lib/MapExtensions.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,26 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Helper functions for working with the `Map<K, V>` data type.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export declare class MapExtensions {
 | 
			
		||||
    /**
 | 
			
		||||
     * Adds all the (key, value) pairs from the source map into the target map.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * This function modifies targetMap.  Any existing keys will be overwritten.
 | 
			
		||||
     * @param targetMap - The map that entries will be added to
 | 
			
		||||
     * @param sourceMap - The map containing the entries to be added
 | 
			
		||||
     */
 | 
			
		||||
    static mergeFromMap<K, V>(targetMap: Map<K, V>, sourceMap: ReadonlyMap<K, V>): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * Converts a string-keyed map to an object.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * This function has the same effect as Object.fromEntries(map.entries())
 | 
			
		||||
     * in supported versions of Node (\>= 12.0.0).
 | 
			
		||||
     * @param map - The map that the object properties will be sourced from
 | 
			
		||||
     */
 | 
			
		||||
    static toObject<TValue>(map: Map<string, TValue>): {
 | 
			
		||||
        [key: string]: TValue;
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
//# sourceMappingURL=MapExtensions.d.ts.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/MapExtensions.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/MapExtensions.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"MapExtensions.d.ts","sourceRoot":"","sources":["../src/MapExtensions.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,qBAAa,aAAa;IACxB;;;;;;OAMG;WACW,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI;IAM1F;;;;;;OAMG;WACW,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE;CAOpF"}
 | 
			
		||||
							
								
								
									
										40
									
								
								node_modules/@rushstack/node-core-library/lib/MapExtensions.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								node_modules/@rushstack/node-core-library/lib/MapExtensions.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,40 @@
 | 
			
		||||
"use strict";
 | 
			
		||||
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 | 
			
		||||
// See LICENSE in the project root for license information.
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.MapExtensions = void 0;
 | 
			
		||||
/**
 | 
			
		||||
 * Helper functions for working with the `Map<K, V>` data type.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
class MapExtensions {
 | 
			
		||||
    /**
 | 
			
		||||
     * Adds all the (key, value) pairs from the source map into the target map.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * This function modifies targetMap.  Any existing keys will be overwritten.
 | 
			
		||||
     * @param targetMap - The map that entries will be added to
 | 
			
		||||
     * @param sourceMap - The map containing the entries to be added
 | 
			
		||||
     */
 | 
			
		||||
    static mergeFromMap(targetMap, sourceMap) {
 | 
			
		||||
        for (const pair of sourceMap.entries()) {
 | 
			
		||||
            targetMap.set(pair[0], pair[1]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Converts a string-keyed map to an object.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * This function has the same effect as Object.fromEntries(map.entries())
 | 
			
		||||
     * in supported versions of Node (\>= 12.0.0).
 | 
			
		||||
     * @param map - The map that the object properties will be sourced from
 | 
			
		||||
     */
 | 
			
		||||
    static toObject(map) {
 | 
			
		||||
        const object = {};
 | 
			
		||||
        for (const [key, value] of map.entries()) {
 | 
			
		||||
            object[key] = value;
 | 
			
		||||
        }
 | 
			
		||||
        return object;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
exports.MapExtensions = MapExtensions;
 | 
			
		||||
//# sourceMappingURL=MapExtensions.js.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/MapExtensions.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/MapExtensions.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"MapExtensions.js","sourceRoot":"","sources":["../src/MapExtensions.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D;;;;GAIG;AACH,MAAa,aAAa;IACxB;;;;;;OAMG;IACI,MAAM,CAAC,YAAY,CAAO,SAAoB,EAAE,SAA4B;QACjF,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,OAAO,EAAE,EAAE;YACtC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;SACjC;IACH,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,QAAQ,CAAS,GAAwB;QACrD,MAAM,MAAM,GAA8B,EAAE,CAAC;QAC7C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,EAAE;YACxC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;SACrB;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AA5BD,sCA4BC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\n/**\n * Helper functions for working with the `Map<K, V>` data type.\n *\n * @public\n */\nexport class MapExtensions {\n  /**\n   * Adds all the (key, value) pairs from the source map into the target map.\n   * @remarks\n   * This function modifies targetMap.  Any existing keys will be overwritten.\n   * @param targetMap - The map that entries will be added to\n   * @param sourceMap - The map containing the entries to be added\n   */\n  public static mergeFromMap<K, V>(targetMap: Map<K, V>, sourceMap: ReadonlyMap<K, V>): void {\n    for (const pair of sourceMap.entries()) {\n      targetMap.set(pair[0], pair[1]);\n    }\n  }\n\n  /**\n   * Converts a string-keyed map to an object.\n   * @remarks\n   * This function has the same effect as Object.fromEntries(map.entries())\n   * in supported versions of Node (\\>= 12.0.0).\n   * @param map - The map that the object properties will be sourced from\n   */\n  public static toObject<TValue>(map: Map<string, TValue>): { [key: string]: TValue } {\n    const object: { [key: string]: TValue } = {};\n    for (const [key, value] of map.entries()) {\n      object[key] = value;\n    }\n    return object;\n  }\n}\n"]}
 | 
			
		||||
							
								
								
									
										39
									
								
								node_modules/@rushstack/node-core-library/lib/MinimumHeap.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								node_modules/@rushstack/node-core-library/lib/MinimumHeap.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Implements a standard heap data structure for items of type T and a custom comparator.
 | 
			
		||||
 * The root will always be the minimum value as determined by the comparator.
 | 
			
		||||
 *
 | 
			
		||||
 * @beta
 | 
			
		||||
 */
 | 
			
		||||
export declare class MinimumHeap<T> {
 | 
			
		||||
    private readonly _items;
 | 
			
		||||
    private readonly _comparator;
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs a new MinimumHeap instance.
 | 
			
		||||
     * @param comparator - a comparator function that determines the order of the items in the heap.
 | 
			
		||||
     *   If the comparator returns a value less than zero, then `a` will be considered less than `b`.
 | 
			
		||||
     *   If the comparator returns zero, then `a` and `b` are considered equal.
 | 
			
		||||
     *   Otherwise, `a` will be considered greater than `b`.
 | 
			
		||||
     */
 | 
			
		||||
    constructor(comparator: (a: T, b: T) => number);
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the number of items in the heap.
 | 
			
		||||
     * @returns the number of items in the heap.
 | 
			
		||||
     */
 | 
			
		||||
    get size(): number;
 | 
			
		||||
    /**
 | 
			
		||||
     * Retrieves the root item from the heap without removing it.
 | 
			
		||||
     * @returns the root item, or `undefined` if the heap is empty
 | 
			
		||||
     */
 | 
			
		||||
    peek(): T | undefined;
 | 
			
		||||
    /**
 | 
			
		||||
     * Retrieves and removes the root item from the heap. The next smallest item will become the new root.
 | 
			
		||||
     * @returns the root item, or `undefined` if the heap is empty
 | 
			
		||||
     */
 | 
			
		||||
    poll(): T | undefined;
 | 
			
		||||
    /**
 | 
			
		||||
     * Pushes an item into the heap.
 | 
			
		||||
     * @param item - the item to push
 | 
			
		||||
     */
 | 
			
		||||
    push(item: T): void;
 | 
			
		||||
}
 | 
			
		||||
//# sourceMappingURL=MinimumHeap.d.ts.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/MinimumHeap.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/MinimumHeap.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"MinimumHeap.d.ts","sourceRoot":"","sources":["../src/MinimumHeap.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,qBAAa,WAAW,CAAC,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAyB;IAErD;;;;;;OAMG;gBACgB,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,MAAM;IAIrD;;;OAGG;IACH,IAAW,IAAI,IAAI,MAAM,CAExB;IAED;;;OAGG;IACI,IAAI,IAAI,CAAC,GAAG,SAAS;IAI5B;;;OAGG;IACI,IAAI,IAAI,CAAC,GAAG,SAAS;IA4C5B;;;OAGG;IACI,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;CAe3B"}
 | 
			
		||||
							
								
								
									
										99
									
								
								node_modules/@rushstack/node-core-library/lib/MinimumHeap.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								node_modules/@rushstack/node-core-library/lib/MinimumHeap.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,99 @@
 | 
			
		||||
"use strict";
 | 
			
		||||
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 | 
			
		||||
// See LICENSE in the project root for license information.
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.MinimumHeap = void 0;
 | 
			
		||||
/**
 | 
			
		||||
 * Implements a standard heap data structure for items of type T and a custom comparator.
 | 
			
		||||
 * The root will always be the minimum value as determined by the comparator.
 | 
			
		||||
 *
 | 
			
		||||
 * @beta
 | 
			
		||||
 */
 | 
			
		||||
class MinimumHeap {
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs a new MinimumHeap instance.
 | 
			
		||||
     * @param comparator - a comparator function that determines the order of the items in the heap.
 | 
			
		||||
     *   If the comparator returns a value less than zero, then `a` will be considered less than `b`.
 | 
			
		||||
     *   If the comparator returns zero, then `a` and `b` are considered equal.
 | 
			
		||||
     *   Otherwise, `a` will be considered greater than `b`.
 | 
			
		||||
     */
 | 
			
		||||
    constructor(comparator) {
 | 
			
		||||
        this._items = [];
 | 
			
		||||
        this._comparator = comparator;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the number of items in the heap.
 | 
			
		||||
     * @returns the number of items in the heap.
 | 
			
		||||
     */
 | 
			
		||||
    get size() {
 | 
			
		||||
        return this._items.length;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Retrieves the root item from the heap without removing it.
 | 
			
		||||
     * @returns the root item, or `undefined` if the heap is empty
 | 
			
		||||
     */
 | 
			
		||||
    peek() {
 | 
			
		||||
        return this._items[0];
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Retrieves and removes the root item from the heap. The next smallest item will become the new root.
 | 
			
		||||
     * @returns the root item, or `undefined` if the heap is empty
 | 
			
		||||
     */
 | 
			
		||||
    poll() {
 | 
			
		||||
        if (this.size > 0) {
 | 
			
		||||
            const result = this._items[0];
 | 
			
		||||
            const item = this._items.pop();
 | 
			
		||||
            const size = this.size;
 | 
			
		||||
            if (size === 0) {
 | 
			
		||||
                // Short circuit in the trivial case
 | 
			
		||||
                return result;
 | 
			
		||||
            }
 | 
			
		||||
            let index = 0;
 | 
			
		||||
            let smallerChildIndex = 1;
 | 
			
		||||
            while (smallerChildIndex < size) {
 | 
			
		||||
                let smallerChild = this._items[smallerChildIndex];
 | 
			
		||||
                const rightChildIndex = smallerChildIndex + 1;
 | 
			
		||||
                if (rightChildIndex < size) {
 | 
			
		||||
                    const rightChild = this._items[rightChildIndex];
 | 
			
		||||
                    if (this._comparator(rightChild, smallerChild) < 0) {
 | 
			
		||||
                        smallerChildIndex = rightChildIndex;
 | 
			
		||||
                        smallerChild = rightChild;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                if (this._comparator(smallerChild, item) < 0) {
 | 
			
		||||
                    this._items[index] = smallerChild;
 | 
			
		||||
                    index = smallerChildIndex;
 | 
			
		||||
                    smallerChildIndex = index * 2 + 1;
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            // Place the item in its final location satisfying the heap property
 | 
			
		||||
            this._items[index] = item;
 | 
			
		||||
            return result;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Pushes an item into the heap.
 | 
			
		||||
     * @param item - the item to push
 | 
			
		||||
     */
 | 
			
		||||
    push(item) {
 | 
			
		||||
        let index = this.size;
 | 
			
		||||
        while (index > 0) {
 | 
			
		||||
            // Due to zero-based indexing the parent is not exactly a bit shift
 | 
			
		||||
            const parentIndex = ((index + 1) >> 1) - 1;
 | 
			
		||||
            const parent = this._items[parentIndex];
 | 
			
		||||
            if (this._comparator(item, parent) < 0) {
 | 
			
		||||
                this._items[index] = parent;
 | 
			
		||||
                index = parentIndex;
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        this._items[index] = item;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
exports.MinimumHeap = MinimumHeap;
 | 
			
		||||
//# sourceMappingURL=MinimumHeap.js.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/MinimumHeap.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/MinimumHeap.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										142
									
								
								node_modules/@rushstack/node-core-library/lib/PackageJsonLookup.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								node_modules/@rushstack/node-core-library/lib/PackageJsonLookup.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,142 @@
 | 
			
		||||
import type { IPackageJson, INodePackageJson } from './IPackageJson';
 | 
			
		||||
/**
 | 
			
		||||
 * Constructor parameters for {@link PackageJsonLookup}
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IPackageJsonLookupParameters {
 | 
			
		||||
    /**
 | 
			
		||||
     * Certain package.json fields such as "contributors" can be very large, and may
 | 
			
		||||
     * significantly increase the memory footprint for the PackageJsonLookup cache.
 | 
			
		||||
     * By default, PackageJsonLookup only loads a subset of standard commonly used
 | 
			
		||||
     * fields names.  Set loadExtraFields=true to always return all fields.
 | 
			
		||||
     */
 | 
			
		||||
    loadExtraFields?: boolean;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * This class provides methods for finding the nearest "package.json" for a folder
 | 
			
		||||
 * and retrieving the name of the package.  The results are cached.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export declare class PackageJsonLookup {
 | 
			
		||||
    private static _instance;
 | 
			
		||||
    /**
 | 
			
		||||
     * A singleton instance of `PackageJsonLookup`, which is useful for short-lived processes
 | 
			
		||||
     * that can reasonably assume that the file system will not be modified after the cache
 | 
			
		||||
     * is populated.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * For long-running processes that need to clear the cache at appropriate times,
 | 
			
		||||
     * it is recommended to create your own instance of `PackageJsonLookup` instead
 | 
			
		||||
     * of relying on this instance.
 | 
			
		||||
     */
 | 
			
		||||
    static get instance(): PackageJsonLookup;
 | 
			
		||||
    private _loadExtraFields;
 | 
			
		||||
    private _packageFolderCache;
 | 
			
		||||
    private _packageJsonCache;
 | 
			
		||||
    constructor(parameters?: IPackageJsonLookupParameters);
 | 
			
		||||
    /**
 | 
			
		||||
     * A helper for loading the caller's own package.json file.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     *
 | 
			
		||||
     * This function provides a concise and efficient way for an NPM package to report metadata about itself.
 | 
			
		||||
     * For example, a tool might want to report its version.
 | 
			
		||||
     *
 | 
			
		||||
     * The `loadOwnPackageJson()` probes upwards from the caller's folder, expecting to find a package.json file,
 | 
			
		||||
     * which is assumed to be the caller's package.  The result is cached, under the assumption that a tool's
 | 
			
		||||
     * own package.json (and intermediary folders) will never change during the lifetime of the process.
 | 
			
		||||
     *
 | 
			
		||||
     * @example
 | 
			
		||||
     * ```ts
 | 
			
		||||
     * // Report the version of our NPM package
 | 
			
		||||
     * const myPackageVersion: string = PackageJsonLookup.loadOwnPackageJson(__dirname).version;
 | 
			
		||||
     * console.log(`Cool Tool - Version ${myPackageVersion}`);
 | 
			
		||||
     * ```
 | 
			
		||||
     *
 | 
			
		||||
     * @param dirnameOfCaller - The NodeJS `__dirname` macro for the caller.
 | 
			
		||||
     * @returns This function always returns a valid `IPackageJson` object.  If any problems are encountered during
 | 
			
		||||
     * loading, an exception will be thrown instead.
 | 
			
		||||
     */
 | 
			
		||||
    static loadOwnPackageJson(dirnameOfCaller: string): IPackageJson;
 | 
			
		||||
    /**
 | 
			
		||||
     * Clears the internal file cache.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * Call this method if changes have been made to the package.json files on disk.
 | 
			
		||||
     */
 | 
			
		||||
    clearCache(): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the absolute path of a folder containing a package.json file, by looking
 | 
			
		||||
     * upwards from the specified fileOrFolderPath.  If no package.json can be found,
 | 
			
		||||
     * undefined is returned.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * The fileOrFolderPath is not required to actually exist on disk.
 | 
			
		||||
     * The fileOrFolderPath itself can be the return value, if it is a folder containing
 | 
			
		||||
     * a package.json file.
 | 
			
		||||
     * Both positive and negative lookup results are cached.
 | 
			
		||||
     *
 | 
			
		||||
     * @param fileOrFolderPath - a relative or absolute path to a source file or folder
 | 
			
		||||
     * that may be part of a package
 | 
			
		||||
     * @returns an absolute path to a folder containing a package.json file
 | 
			
		||||
     */
 | 
			
		||||
    tryGetPackageFolderFor(fileOrFolderPath: string): string | undefined;
 | 
			
		||||
    /**
 | 
			
		||||
     * If the specified file or folder is part of a package, this returns the absolute path
 | 
			
		||||
     * to the associated package.json file.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * The package folder is determined using the same algorithm
 | 
			
		||||
     * as {@link PackageJsonLookup.tryGetPackageFolderFor}.
 | 
			
		||||
     *
 | 
			
		||||
     * @param fileOrFolderPath - a relative or absolute path to a source file or folder
 | 
			
		||||
     * that may be part of a package
 | 
			
		||||
     * @returns an absolute path to * package.json file
 | 
			
		||||
     */
 | 
			
		||||
    tryGetPackageJsonFilePathFor(fileOrFolderPath: string): string | undefined;
 | 
			
		||||
    /**
 | 
			
		||||
     * If the specified file or folder is part of a package, this loads and returns the
 | 
			
		||||
     * associated package.json file.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * The package folder is determined using the same algorithm
 | 
			
		||||
     * as {@link PackageJsonLookup.tryGetPackageFolderFor}.
 | 
			
		||||
     *
 | 
			
		||||
     * @param fileOrFolderPath - a relative or absolute path to a source file or folder
 | 
			
		||||
     * that may be part of a package
 | 
			
		||||
     * @returns an IPackageJson object, or undefined if the fileOrFolderPath does not
 | 
			
		||||
     * belong to a package
 | 
			
		||||
     */
 | 
			
		||||
    tryLoadPackageJsonFor(fileOrFolderPath: string): IPackageJson | undefined;
 | 
			
		||||
    /**
 | 
			
		||||
     * This function is similar to {@link PackageJsonLookup.tryLoadPackageJsonFor}, except that it does not report
 | 
			
		||||
     * an error if the `version` field is missing from the package.json file.
 | 
			
		||||
     */
 | 
			
		||||
    tryLoadNodePackageJsonFor(fileOrFolderPath: string): INodePackageJson | undefined;
 | 
			
		||||
    /**
 | 
			
		||||
     * Loads the specified package.json file, if it is not already present in the cache.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * Unless {@link IPackageJsonLookupParameters.loadExtraFields} was specified,
 | 
			
		||||
     * the returned IPackageJson object will contain a subset of essential fields.
 | 
			
		||||
     * The returned object should be considered to be immutable; the caller must never
 | 
			
		||||
     * modify it.
 | 
			
		||||
     *
 | 
			
		||||
     * @param jsonFilename - a relative or absolute path to a package.json file
 | 
			
		||||
     */
 | 
			
		||||
    loadPackageJson(jsonFilename: string): IPackageJson;
 | 
			
		||||
    /**
 | 
			
		||||
     * This function is similar to {@link PackageJsonLookup.loadPackageJson}, except that it does not report an error
 | 
			
		||||
     * if the `version` field is missing from the package.json file.
 | 
			
		||||
     */
 | 
			
		||||
    loadNodePackageJson(jsonFilename: string): INodePackageJson;
 | 
			
		||||
    private _loadPackageJsonInner;
 | 
			
		||||
    /**
 | 
			
		||||
     * Try to load a package.json file as an INodePackageJson,
 | 
			
		||||
     * returning undefined if the found file does not contain a `name` field.
 | 
			
		||||
     */
 | 
			
		||||
    private _tryLoadNodePackageJsonInner;
 | 
			
		||||
    private _tryGetPackageFolderFor;
 | 
			
		||||
}
 | 
			
		||||
//# sourceMappingURL=PackageJsonLookup.d.ts.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/PackageJsonLookup.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/PackageJsonLookup.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"PackageJsonLookup.d.ts","sourceRoot":"","sources":["../src/PackageJsonLookup.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAIrE;;;;GAIG;AACH,MAAM,WAAW,4BAA4B;IAC3C;;;;;OAKG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AA8BD;;;;;GAKG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAgC;IAExD;;;;;;;;;OASG;IACH,WAAkB,QAAQ,IAAI,iBAAiB,CAM9C;IAED,OAAO,CAAC,gBAAgB,CAAkB;IAI1C,OAAO,CAAC,mBAAmB,CAAmC;IAI9D,OAAO,CAAC,iBAAiB,CAA6B;gBAEnC,UAAU,CAAC,EAAE,4BAA4B;IAS5D;;;;;;;;;;;;;;;;;;;;;;OAsBG;WACW,kBAAkB,CAAC,eAAe,EAAE,MAAM,GAAG,YAAY;IAuBvE;;;;OAIG;IACI,UAAU,IAAI,IAAI;IAKzB;;;;;;;;;;;;;;OAcG;IACI,sBAAsB,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAiB3E;;;;;;;;;;;OAWG;IACI,4BAA4B,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAQjF;;;;;;;;;;;;OAYG;IACI,qBAAqB,CAAC,gBAAgB,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAQhF;;;OAGG;IACI,yBAAyB,CAAC,gBAAgB,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAQxF;;;;;;;;;;OAUG;IACI,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,YAAY;IAU1D;;;OAGG;IACI,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,gBAAgB;IAIlE,OAAO,CAAC,qBAAqB;IAkC7B;;;OAGG;IACH,OAAO,CAAC,4BAA4B;IAiEpC,OAAO,CAAC,uBAAuB;CAkChC"}
 | 
			
		||||
							
								
								
									
										327
									
								
								node_modules/@rushstack/node-core-library/lib/PackageJsonLookup.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										327
									
								
								node_modules/@rushstack/node-core-library/lib/PackageJsonLookup.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,327 @@
 | 
			
		||||
"use strict";
 | 
			
		||||
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 | 
			
		||||
// See LICENSE in the project root for license information.
 | 
			
		||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    var desc = Object.getOwnPropertyDescriptor(m, k);
 | 
			
		||||
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
 | 
			
		||||
      desc = { enumerable: true, get: function() { return m[k]; } };
 | 
			
		||||
    }
 | 
			
		||||
    Object.defineProperty(o, k2, desc);
 | 
			
		||||
}) : (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    o[k2] = m[k];
 | 
			
		||||
}));
 | 
			
		||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
 | 
			
		||||
    Object.defineProperty(o, "default", { enumerable: true, value: v });
 | 
			
		||||
}) : function(o, v) {
 | 
			
		||||
    o["default"] = v;
 | 
			
		||||
});
 | 
			
		||||
var __importStar = (this && this.__importStar) || function (mod) {
 | 
			
		||||
    if (mod && mod.__esModule) return mod;
 | 
			
		||||
    var result = {};
 | 
			
		||||
    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
 | 
			
		||||
    __setModuleDefault(result, mod);
 | 
			
		||||
    return result;
 | 
			
		||||
};
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.PackageJsonLookup = void 0;
 | 
			
		||||
const path = __importStar(require("path"));
 | 
			
		||||
const JsonFile_1 = require("./JsonFile");
 | 
			
		||||
const Constants_1 = require("./Constants");
 | 
			
		||||
const FileSystem_1 = require("./FileSystem");
 | 
			
		||||
/**
 | 
			
		||||
 * This class provides methods for finding the nearest "package.json" for a folder
 | 
			
		||||
 * and retrieving the name of the package.  The results are cached.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
class PackageJsonLookup {
 | 
			
		||||
    /**
 | 
			
		||||
     * A singleton instance of `PackageJsonLookup`, which is useful for short-lived processes
 | 
			
		||||
     * that can reasonably assume that the file system will not be modified after the cache
 | 
			
		||||
     * is populated.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * For long-running processes that need to clear the cache at appropriate times,
 | 
			
		||||
     * it is recommended to create your own instance of `PackageJsonLookup` instead
 | 
			
		||||
     * of relying on this instance.
 | 
			
		||||
     */
 | 
			
		||||
    static get instance() {
 | 
			
		||||
        if (!PackageJsonLookup._instance) {
 | 
			
		||||
            PackageJsonLookup._instance = new PackageJsonLookup({ loadExtraFields: true });
 | 
			
		||||
        }
 | 
			
		||||
        return PackageJsonLookup._instance;
 | 
			
		||||
    }
 | 
			
		||||
    constructor(parameters) {
 | 
			
		||||
        this._loadExtraFields = false;
 | 
			
		||||
        if (parameters) {
 | 
			
		||||
            if (parameters.loadExtraFields) {
 | 
			
		||||
                this._loadExtraFields = parameters.loadExtraFields;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        this.clearCache();
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * A helper for loading the caller's own package.json file.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     *
 | 
			
		||||
     * This function provides a concise and efficient way for an NPM package to report metadata about itself.
 | 
			
		||||
     * For example, a tool might want to report its version.
 | 
			
		||||
     *
 | 
			
		||||
     * The `loadOwnPackageJson()` probes upwards from the caller's folder, expecting to find a package.json file,
 | 
			
		||||
     * which is assumed to be the caller's package.  The result is cached, under the assumption that a tool's
 | 
			
		||||
     * own package.json (and intermediary folders) will never change during the lifetime of the process.
 | 
			
		||||
     *
 | 
			
		||||
     * @example
 | 
			
		||||
     * ```ts
 | 
			
		||||
     * // Report the version of our NPM package
 | 
			
		||||
     * const myPackageVersion: string = PackageJsonLookup.loadOwnPackageJson(__dirname).version;
 | 
			
		||||
     * console.log(`Cool Tool - Version ${myPackageVersion}`);
 | 
			
		||||
     * ```
 | 
			
		||||
     *
 | 
			
		||||
     * @param dirnameOfCaller - The NodeJS `__dirname` macro for the caller.
 | 
			
		||||
     * @returns This function always returns a valid `IPackageJson` object.  If any problems are encountered during
 | 
			
		||||
     * loading, an exception will be thrown instead.
 | 
			
		||||
     */
 | 
			
		||||
    static loadOwnPackageJson(dirnameOfCaller) {
 | 
			
		||||
        const packageJson = PackageJsonLookup.instance.tryLoadPackageJsonFor(dirnameOfCaller);
 | 
			
		||||
        if (packageJson === undefined) {
 | 
			
		||||
            throw new Error(`PackageJsonLookup.loadOwnPackageJson() failed to find the caller's package.json.` +
 | 
			
		||||
                `  The __dirname was: ${dirnameOfCaller}`);
 | 
			
		||||
        }
 | 
			
		||||
        if (packageJson.version !== undefined) {
 | 
			
		||||
            return packageJson;
 | 
			
		||||
        }
 | 
			
		||||
        const errorPath = PackageJsonLookup.instance.tryGetPackageJsonFilePathFor(dirnameOfCaller) || 'package.json';
 | 
			
		||||
        throw new Error(`PackageJsonLookup.loadOwnPackageJson() failed because the "version" field is missing in` +
 | 
			
		||||
            ` ${errorPath}`);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Clears the internal file cache.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * Call this method if changes have been made to the package.json files on disk.
 | 
			
		||||
     */
 | 
			
		||||
    clearCache() {
 | 
			
		||||
        this._packageFolderCache = new Map();
 | 
			
		||||
        this._packageJsonCache = new Map();
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the absolute path of a folder containing a package.json file, by looking
 | 
			
		||||
     * upwards from the specified fileOrFolderPath.  If no package.json can be found,
 | 
			
		||||
     * undefined is returned.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * The fileOrFolderPath is not required to actually exist on disk.
 | 
			
		||||
     * The fileOrFolderPath itself can be the return value, if it is a folder containing
 | 
			
		||||
     * a package.json file.
 | 
			
		||||
     * Both positive and negative lookup results are cached.
 | 
			
		||||
     *
 | 
			
		||||
     * @param fileOrFolderPath - a relative or absolute path to a source file or folder
 | 
			
		||||
     * that may be part of a package
 | 
			
		||||
     * @returns an absolute path to a folder containing a package.json file
 | 
			
		||||
     */
 | 
			
		||||
    tryGetPackageFolderFor(fileOrFolderPath) {
 | 
			
		||||
        // Convert it to an absolute path
 | 
			
		||||
        const resolvedFileOrFolderPath = path.resolve(fileOrFolderPath);
 | 
			
		||||
        // Optimistically hope that the starting string is already in the cache,
 | 
			
		||||
        // in which case we can avoid disk access entirely.
 | 
			
		||||
        //
 | 
			
		||||
        // (Two lookups are required, because get() cannot distinguish the undefined value
 | 
			
		||||
        // versus a missing key.)
 | 
			
		||||
        if (this._packageFolderCache.has(resolvedFileOrFolderPath)) {
 | 
			
		||||
            return this._packageFolderCache.get(resolvedFileOrFolderPath);
 | 
			
		||||
        }
 | 
			
		||||
        // Now call the recursive part of the algorithm
 | 
			
		||||
        return this._tryGetPackageFolderFor(resolvedFileOrFolderPath);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * If the specified file or folder is part of a package, this returns the absolute path
 | 
			
		||||
     * to the associated package.json file.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * The package folder is determined using the same algorithm
 | 
			
		||||
     * as {@link PackageJsonLookup.tryGetPackageFolderFor}.
 | 
			
		||||
     *
 | 
			
		||||
     * @param fileOrFolderPath - a relative or absolute path to a source file or folder
 | 
			
		||||
     * that may be part of a package
 | 
			
		||||
     * @returns an absolute path to * package.json file
 | 
			
		||||
     */
 | 
			
		||||
    tryGetPackageJsonFilePathFor(fileOrFolderPath) {
 | 
			
		||||
        const packageJsonFolder = this.tryGetPackageFolderFor(fileOrFolderPath);
 | 
			
		||||
        if (!packageJsonFolder) {
 | 
			
		||||
            return undefined;
 | 
			
		||||
        }
 | 
			
		||||
        return path.join(packageJsonFolder, Constants_1.FileConstants.PackageJson);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * If the specified file or folder is part of a package, this loads and returns the
 | 
			
		||||
     * associated package.json file.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * The package folder is determined using the same algorithm
 | 
			
		||||
     * as {@link PackageJsonLookup.tryGetPackageFolderFor}.
 | 
			
		||||
     *
 | 
			
		||||
     * @param fileOrFolderPath - a relative or absolute path to a source file or folder
 | 
			
		||||
     * that may be part of a package
 | 
			
		||||
     * @returns an IPackageJson object, or undefined if the fileOrFolderPath does not
 | 
			
		||||
     * belong to a package
 | 
			
		||||
     */
 | 
			
		||||
    tryLoadPackageJsonFor(fileOrFolderPath) {
 | 
			
		||||
        const packageJsonFilePath = this.tryGetPackageJsonFilePathFor(fileOrFolderPath);
 | 
			
		||||
        if (!packageJsonFilePath) {
 | 
			
		||||
            return undefined;
 | 
			
		||||
        }
 | 
			
		||||
        return this.loadPackageJson(packageJsonFilePath);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * This function is similar to {@link PackageJsonLookup.tryLoadPackageJsonFor}, except that it does not report
 | 
			
		||||
     * an error if the `version` field is missing from the package.json file.
 | 
			
		||||
     */
 | 
			
		||||
    tryLoadNodePackageJsonFor(fileOrFolderPath) {
 | 
			
		||||
        const packageJsonFilePath = this.tryGetPackageJsonFilePathFor(fileOrFolderPath);
 | 
			
		||||
        if (!packageJsonFilePath) {
 | 
			
		||||
            return undefined;
 | 
			
		||||
        }
 | 
			
		||||
        return this.loadNodePackageJson(packageJsonFilePath);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Loads the specified package.json file, if it is not already present in the cache.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * Unless {@link IPackageJsonLookupParameters.loadExtraFields} was specified,
 | 
			
		||||
     * the returned IPackageJson object will contain a subset of essential fields.
 | 
			
		||||
     * The returned object should be considered to be immutable; the caller must never
 | 
			
		||||
     * modify it.
 | 
			
		||||
     *
 | 
			
		||||
     * @param jsonFilename - a relative or absolute path to a package.json file
 | 
			
		||||
     */
 | 
			
		||||
    loadPackageJson(jsonFilename) {
 | 
			
		||||
        const packageJson = this.loadNodePackageJson(jsonFilename);
 | 
			
		||||
        if (!packageJson.version) {
 | 
			
		||||
            throw new Error(`Error reading "${jsonFilename}":\n  The required field "version" was not found`);
 | 
			
		||||
        }
 | 
			
		||||
        return packageJson;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * This function is similar to {@link PackageJsonLookup.loadPackageJson}, except that it does not report an error
 | 
			
		||||
     * if the `version` field is missing from the package.json file.
 | 
			
		||||
     */
 | 
			
		||||
    loadNodePackageJson(jsonFilename) {
 | 
			
		||||
        return this._loadPackageJsonInner(jsonFilename);
 | 
			
		||||
    }
 | 
			
		||||
    _loadPackageJsonInner(jsonFilename, errorsToIgnore) {
 | 
			
		||||
        const loadResult = this._tryLoadNodePackageJsonInner(jsonFilename);
 | 
			
		||||
        if (loadResult.error && (errorsToIgnore === null || errorsToIgnore === void 0 ? void 0 : errorsToIgnore.has(loadResult.error))) {
 | 
			
		||||
            return undefined;
 | 
			
		||||
        }
 | 
			
		||||
        switch (loadResult.error) {
 | 
			
		||||
            case 'FILE_NOT_FOUND': {
 | 
			
		||||
                throw new Error(`Input file not found: ${jsonFilename}`);
 | 
			
		||||
            }
 | 
			
		||||
            case 'MISSING_NAME_FIELD': {
 | 
			
		||||
                throw new Error(`Error reading "${jsonFilename}":\n  The required field "name" was not found`);
 | 
			
		||||
            }
 | 
			
		||||
            case 'OTHER_ERROR': {
 | 
			
		||||
                throw loadResult.errorObject;
 | 
			
		||||
            }
 | 
			
		||||
            default: {
 | 
			
		||||
                return loadResult.packageJson;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Try to load a package.json file as an INodePackageJson,
 | 
			
		||||
     * returning undefined if the found file does not contain a `name` field.
 | 
			
		||||
     */
 | 
			
		||||
    _tryLoadNodePackageJsonInner(jsonFilename) {
 | 
			
		||||
        // Since this will be a cache key, follow any symlinks and get an absolute path
 | 
			
		||||
        // to minimize duplication.  (Note that duplication can still occur due to e.g. character case.)
 | 
			
		||||
        let normalizedFilePath;
 | 
			
		||||
        try {
 | 
			
		||||
            normalizedFilePath = FileSystem_1.FileSystem.getRealPath(jsonFilename);
 | 
			
		||||
        }
 | 
			
		||||
        catch (e) {
 | 
			
		||||
            if (FileSystem_1.FileSystem.isNotExistError(e)) {
 | 
			
		||||
                return {
 | 
			
		||||
                    error: 'FILE_NOT_FOUND'
 | 
			
		||||
                };
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                return {
 | 
			
		||||
                    error: 'OTHER_ERROR',
 | 
			
		||||
                    errorObject: e
 | 
			
		||||
                };
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        let packageJson = this._packageJsonCache.get(normalizedFilePath);
 | 
			
		||||
        if (!packageJson) {
 | 
			
		||||
            const loadedPackageJson = JsonFile_1.JsonFile.load(normalizedFilePath);
 | 
			
		||||
            // Make sure this is really a package.json file.  CommonJS has fairly strict requirements,
 | 
			
		||||
            // but NPM only requires "name" and "version"
 | 
			
		||||
            if (!loadedPackageJson.name) {
 | 
			
		||||
                return {
 | 
			
		||||
                    error: 'MISSING_NAME_FIELD'
 | 
			
		||||
                };
 | 
			
		||||
            }
 | 
			
		||||
            if (this._loadExtraFields) {
 | 
			
		||||
                packageJson = loadedPackageJson;
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                packageJson = {};
 | 
			
		||||
                // Unless "loadExtraFields" was requested, copy over the essential fields only
 | 
			
		||||
                packageJson.bin = loadedPackageJson.bin;
 | 
			
		||||
                packageJson.dependencies = loadedPackageJson.dependencies;
 | 
			
		||||
                packageJson.description = loadedPackageJson.description;
 | 
			
		||||
                packageJson.devDependencies = loadedPackageJson.devDependencies;
 | 
			
		||||
                packageJson.homepage = loadedPackageJson.homepage;
 | 
			
		||||
                packageJson.license = loadedPackageJson.license;
 | 
			
		||||
                packageJson.main = loadedPackageJson.main;
 | 
			
		||||
                packageJson.name = loadedPackageJson.name;
 | 
			
		||||
                packageJson.optionalDependencies = loadedPackageJson.optionalDependencies;
 | 
			
		||||
                packageJson.peerDependencies = loadedPackageJson.peerDependencies;
 | 
			
		||||
                packageJson.private = loadedPackageJson.private;
 | 
			
		||||
                packageJson.scripts = loadedPackageJson.scripts;
 | 
			
		||||
                packageJson.typings = loadedPackageJson.typings || loadedPackageJson.types;
 | 
			
		||||
                packageJson.tsdocMetadata = loadedPackageJson.tsdocMetadata;
 | 
			
		||||
                packageJson.version = loadedPackageJson.version;
 | 
			
		||||
            }
 | 
			
		||||
            Object.freeze(packageJson);
 | 
			
		||||
            this._packageJsonCache.set(normalizedFilePath, packageJson);
 | 
			
		||||
        }
 | 
			
		||||
        return {
 | 
			
		||||
            packageJson
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
    // Recursive part of the algorithm from tryGetPackageFolderFor()
 | 
			
		||||
    _tryGetPackageFolderFor(resolvedFileOrFolderPath) {
 | 
			
		||||
        // Two lookups are required, because get() cannot distinguish the undefined value
 | 
			
		||||
        // versus a missing key.
 | 
			
		||||
        if (this._packageFolderCache.has(resolvedFileOrFolderPath)) {
 | 
			
		||||
            return this._packageFolderCache.get(resolvedFileOrFolderPath);
 | 
			
		||||
        }
 | 
			
		||||
        // Is resolvedFileOrFolderPath itself a folder with a valid package.json file?  If so, return it.
 | 
			
		||||
        const packageJsonFilePath = `${resolvedFileOrFolderPath}/${Constants_1.FileConstants.PackageJson}`;
 | 
			
		||||
        const packageJson = this._loadPackageJsonInner(packageJsonFilePath, new Set(['FILE_NOT_FOUND', 'MISSING_NAME_FIELD']));
 | 
			
		||||
        if (packageJson) {
 | 
			
		||||
            this._packageFolderCache.set(resolvedFileOrFolderPath, resolvedFileOrFolderPath);
 | 
			
		||||
            return resolvedFileOrFolderPath;
 | 
			
		||||
        }
 | 
			
		||||
        // Otherwise go up one level
 | 
			
		||||
        const parentFolder = path.dirname(resolvedFileOrFolderPath);
 | 
			
		||||
        if (!parentFolder || parentFolder === resolvedFileOrFolderPath) {
 | 
			
		||||
            // We reached the root directory without finding a package.json file,
 | 
			
		||||
            // so cache the negative result
 | 
			
		||||
            this._packageFolderCache.set(resolvedFileOrFolderPath, undefined);
 | 
			
		||||
            return undefined; // no match
 | 
			
		||||
        }
 | 
			
		||||
        // Recurse upwards, caching every step along the way
 | 
			
		||||
        const parentResult = this._tryGetPackageFolderFor(parentFolder);
 | 
			
		||||
        // Cache the parent's answer as well
 | 
			
		||||
        this._packageFolderCache.set(resolvedFileOrFolderPath, parentResult);
 | 
			
		||||
        return parentResult;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
exports.PackageJsonLookup = PackageJsonLookup;
 | 
			
		||||
//# sourceMappingURL=PackageJsonLookup.js.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/PackageJsonLookup.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/PackageJsonLookup.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										142
									
								
								node_modules/@rushstack/node-core-library/lib/PackageName.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								node_modules/@rushstack/node-core-library/lib/PackageName.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,142 @@
 | 
			
		||||
/**
 | 
			
		||||
 * A package name that has been separated into its scope and unscoped name.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IParsedPackageName {
 | 
			
		||||
    /**
 | 
			
		||||
     * The parsed NPM scope, or an empty string if there was no scope.  The scope value will
 | 
			
		||||
     * always include the at-sign.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * For example, if the parsed input was "\@scope/example", then scope would be "\@scope".
 | 
			
		||||
     */
 | 
			
		||||
    scope: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * The parsed NPM package name without the scope.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * For example, if the parsed input was "\@scope/example", then the name would be "example".
 | 
			
		||||
     */
 | 
			
		||||
    unscopedName: string;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * Result object returned by {@link PackageName.tryParse}
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IParsedPackageNameOrError extends IParsedPackageName {
 | 
			
		||||
    /**
 | 
			
		||||
     * If the input string could not be parsed, then this string will contain a nonempty
 | 
			
		||||
     * error message.  Otherwise it will be an empty string.
 | 
			
		||||
     */
 | 
			
		||||
    error: string;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * Options that configure the validation rules used by a {@link PackageNameParser} instance.
 | 
			
		||||
 *
 | 
			
		||||
 * @remarks
 | 
			
		||||
 * The default validation is based on the npmjs.com registry's policy for published packages, and includes these
 | 
			
		||||
 * restrictions:
 | 
			
		||||
 *
 | 
			
		||||
 * - The package name cannot be longer than 214 characters.
 | 
			
		||||
 *
 | 
			
		||||
 * - The package name must not be empty.
 | 
			
		||||
 *
 | 
			
		||||
 * - Other than the `@` and `/` delimiters used for scopes, the only allowed characters
 | 
			
		||||
 *   are letters, numbers, `-`, `_`, and `.`.
 | 
			
		||||
 *
 | 
			
		||||
 * - The name must not start with a `.` or `_`.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IPackageNameParserOptions {
 | 
			
		||||
    /**
 | 
			
		||||
     * If true, allows upper-case letters in package names.
 | 
			
		||||
     * This improves compatibility with some legacy private registries that still allow that.
 | 
			
		||||
     */
 | 
			
		||||
    allowUpperCase?: boolean;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * A configurable parser for validating and manipulating NPM package names such as `my-package` or `@scope/my-package`.
 | 
			
		||||
 *
 | 
			
		||||
 * @remarks
 | 
			
		||||
 * If you do not need to customize the parser configuration, it is recommended to use {@link PackageName}
 | 
			
		||||
 * which exposes these operations as a simple static class.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export declare class PackageNameParser {
 | 
			
		||||
    private static readonly _invalidNameCharactersRegExp;
 | 
			
		||||
    private readonly _options;
 | 
			
		||||
    constructor(options?: IPackageNameParserOptions);
 | 
			
		||||
    /**
 | 
			
		||||
     * This attempts to parse a package name that may include a scope component.
 | 
			
		||||
     * The packageName must not be an empty string.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * This function will not throw an exception.
 | 
			
		||||
     *
 | 
			
		||||
     * @returns an {@link IParsedPackageNameOrError} structure whose `error` property will be
 | 
			
		||||
     * nonempty if the string could not be parsed.
 | 
			
		||||
     */
 | 
			
		||||
    tryParse(packageName: string): IParsedPackageNameOrError;
 | 
			
		||||
    /**
 | 
			
		||||
     * Same as {@link PackageName.tryParse}, except this throws an exception if the input
 | 
			
		||||
     * cannot be parsed.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * The packageName must not be an empty string.
 | 
			
		||||
     */
 | 
			
		||||
    parse(packageName: string): IParsedPackageName;
 | 
			
		||||
    /**
 | 
			
		||||
     * {@inheritDoc IParsedPackageName.scope}
 | 
			
		||||
     */
 | 
			
		||||
    getScope(packageName: string): string;
 | 
			
		||||
    /**
 | 
			
		||||
     * {@inheritDoc IParsedPackageName.unscopedName}
 | 
			
		||||
     */
 | 
			
		||||
    getUnscopedName(packageName: string): string;
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns true if the specified package name is valid, or false otherwise.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * This function will not throw an exception.
 | 
			
		||||
     */
 | 
			
		||||
    isValidName(packageName: string): boolean;
 | 
			
		||||
    /**
 | 
			
		||||
     * Throws an exception if the specified name is not a valid package name.
 | 
			
		||||
     * The packageName must not be an empty string.
 | 
			
		||||
     */
 | 
			
		||||
    validate(packageName: string): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * Combines an optional package scope with an unscoped root name.
 | 
			
		||||
     * @param scope - Must be either an empty string, or a scope name such as "\@example"
 | 
			
		||||
     * @param unscopedName - Must be a nonempty package name that does not contain a scope
 | 
			
		||||
     * @returns A full package name such as "\@example/some-library".
 | 
			
		||||
     */
 | 
			
		||||
    combineParts(scope: string, unscopedName: string): string;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * Provides basic operations for validating and manipulating NPM package names such as `my-package`
 | 
			
		||||
 * or `@scope/my-package`.
 | 
			
		||||
 *
 | 
			
		||||
 * @remarks
 | 
			
		||||
 * This is the default implementation of {@link PackageNameParser}, exposed as a convenient static class.
 | 
			
		||||
 * If you need to configure the parsing rules, use `PackageNameParser` instead.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export declare class PackageName {
 | 
			
		||||
    private static readonly _parser;
 | 
			
		||||
    /** {@inheritDoc PackageNameParser.tryParse} */
 | 
			
		||||
    static tryParse(packageName: string): IParsedPackageNameOrError;
 | 
			
		||||
    /** {@inheritDoc PackageNameParser.parse} */
 | 
			
		||||
    static parse(packageName: string): IParsedPackageName;
 | 
			
		||||
    /** {@inheritDoc PackageNameParser.getScope} */
 | 
			
		||||
    static getScope(packageName: string): string;
 | 
			
		||||
    /** {@inheritDoc PackageNameParser.getUnscopedName} */
 | 
			
		||||
    static getUnscopedName(packageName: string): string;
 | 
			
		||||
    /** {@inheritDoc PackageNameParser.isValidName} */
 | 
			
		||||
    static isValidName(packageName: string): boolean;
 | 
			
		||||
    /** {@inheritDoc PackageNameParser.validate} */
 | 
			
		||||
    static validate(packageName: string): void;
 | 
			
		||||
    /** {@inheritDoc PackageNameParser.combineParts} */
 | 
			
		||||
    static combineParts(scope: string, unscopedName: string): string;
 | 
			
		||||
}
 | 
			
		||||
//# sourceMappingURL=PackageName.d.ts.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/PackageName.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/PackageName.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"PackageName.d.ts","sourceRoot":"","sources":["../src/PackageName.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;;OAKG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;;OAIG;IACH,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,MAAM,WAAW,yBAA0B,SAAQ,kBAAkB;IACnE;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,yBAAyB;IACxC;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;;;GAQG;AACH,qBAAa,iBAAiB;IAG5B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,4BAA4B,CAA+B;IAEnF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4B;gBAElC,OAAO,GAAE,yBAA8B;IAI1D;;;;;;;;OAQG;IACI,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,yBAAyB;IAmF/D;;;;;OAKG;IACI,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB;IAQrD;;OAEG;IACI,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAI5C;;OAEG;IACI,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAInD;;;;OAIG;IACI,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAKhD;;;OAGG;IACI,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAI1C;;;;;OAKG;IACI,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM;CA6BjE;AAED;;;;;;;;;GASG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAA8C;IAE7E,+CAA+C;WACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,yBAAyB;IAItE,4CAA4C;WAC9B,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB;IAI5D,+CAA+C;WACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAInD,sDAAsD;WACxC,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAI1D,kDAAkD;WACpC,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAIvD,+CAA+C;WACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAIjD,mDAAmD;WACrC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM;CAGxE"}
 | 
			
		||||
							
								
								
									
										213
									
								
								node_modules/@rushstack/node-core-library/lib/PackageName.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										213
									
								
								node_modules/@rushstack/node-core-library/lib/PackageName.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,213 @@
 | 
			
		||||
"use strict";
 | 
			
		||||
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 | 
			
		||||
// See LICENSE in the project root for license information.
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.PackageName = exports.PackageNameParser = void 0;
 | 
			
		||||
/**
 | 
			
		||||
 * A configurable parser for validating and manipulating NPM package names such as `my-package` or `@scope/my-package`.
 | 
			
		||||
 *
 | 
			
		||||
 * @remarks
 | 
			
		||||
 * If you do not need to customize the parser configuration, it is recommended to use {@link PackageName}
 | 
			
		||||
 * which exposes these operations as a simple static class.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
class PackageNameParser {
 | 
			
		||||
    constructor(options = {}) {
 | 
			
		||||
        this._options = Object.assign({}, options);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * This attempts to parse a package name that may include a scope component.
 | 
			
		||||
     * The packageName must not be an empty string.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * This function will not throw an exception.
 | 
			
		||||
     *
 | 
			
		||||
     * @returns an {@link IParsedPackageNameOrError} structure whose `error` property will be
 | 
			
		||||
     * nonempty if the string could not be parsed.
 | 
			
		||||
     */
 | 
			
		||||
    tryParse(packageName) {
 | 
			
		||||
        const result = {
 | 
			
		||||
            scope: '',
 | 
			
		||||
            unscopedName: '',
 | 
			
		||||
            error: ''
 | 
			
		||||
        };
 | 
			
		||||
        let input = packageName;
 | 
			
		||||
        if (input === null || input === undefined) {
 | 
			
		||||
            result.error = 'The package name must not be null or undefined';
 | 
			
		||||
            return result;
 | 
			
		||||
        }
 | 
			
		||||
        // Rule from npmjs.com:
 | 
			
		||||
        // "The name must be less than or equal to 214 characters. This includes the scope for scoped packages."
 | 
			
		||||
        if (packageName.length > 214) {
 | 
			
		||||
            // Don't attempt to parse a ridiculously long input
 | 
			
		||||
            result.error = 'The package name cannot be longer than 214 characters';
 | 
			
		||||
            return result;
 | 
			
		||||
        }
 | 
			
		||||
        if (input[0] === '@') {
 | 
			
		||||
            const indexOfScopeSlash = input.indexOf('/');
 | 
			
		||||
            if (indexOfScopeSlash <= 0) {
 | 
			
		||||
                result.scope = input;
 | 
			
		||||
                result.error = `Error parsing "${packageName}": The scope must be followed by a slash`;
 | 
			
		||||
                return result;
 | 
			
		||||
            }
 | 
			
		||||
            // Extract the scope substring
 | 
			
		||||
            result.scope = input.substr(0, indexOfScopeSlash);
 | 
			
		||||
            input = input.substr(indexOfScopeSlash + 1);
 | 
			
		||||
        }
 | 
			
		||||
        result.unscopedName = input;
 | 
			
		||||
        if (result.scope === '@') {
 | 
			
		||||
            result.error = `Error parsing "${packageName}": The scope name cannot be empty`;
 | 
			
		||||
            return result;
 | 
			
		||||
        }
 | 
			
		||||
        if (result.unscopedName === '') {
 | 
			
		||||
            result.error = 'The package name must not be empty';
 | 
			
		||||
            return result;
 | 
			
		||||
        }
 | 
			
		||||
        // Rule from npmjs.com:
 | 
			
		||||
        // "The name can't start with a dot or an underscore."
 | 
			
		||||
        if (result.unscopedName[0] === '.' || result.unscopedName[0] === '_') {
 | 
			
		||||
            result.error = `The package name "${packageName}" starts with an invalid character`;
 | 
			
		||||
            return result;
 | 
			
		||||
        }
 | 
			
		||||
        // Convert "@scope/unscoped-name" --> "scopeunscoped-name"
 | 
			
		||||
        const nameWithoutScopeSymbols = (result.scope ? result.scope.slice(1, -1) : '') + result.unscopedName;
 | 
			
		||||
        if (!this._options.allowUpperCase) {
 | 
			
		||||
            // "New packages must not have uppercase letters in the name."
 | 
			
		||||
            // This can't be enforced because "old" packages are still actively maintained.
 | 
			
		||||
            // Example: https://www.npmjs.com/package/Base64
 | 
			
		||||
            // However it's pretty reasonable to require the scope to be lower case
 | 
			
		||||
            if (result.scope !== result.scope.toLowerCase()) {
 | 
			
		||||
                result.error = `The package scope "${result.scope}" must not contain upper case characters`;
 | 
			
		||||
                return result;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        // "The name ends up being part of a URL, an argument on the command line, and a folder name.
 | 
			
		||||
        // Therefore, the name can't contain any non-URL-safe characters"
 | 
			
		||||
        const match = nameWithoutScopeSymbols.match(PackageNameParser._invalidNameCharactersRegExp);
 | 
			
		||||
        if (match) {
 | 
			
		||||
            result.error = `The package name "${packageName}" contains an invalid character: "${match[0]}"`;
 | 
			
		||||
            return result;
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Same as {@link PackageName.tryParse}, except this throws an exception if the input
 | 
			
		||||
     * cannot be parsed.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * The packageName must not be an empty string.
 | 
			
		||||
     */
 | 
			
		||||
    parse(packageName) {
 | 
			
		||||
        const result = this.tryParse(packageName);
 | 
			
		||||
        if (result.error) {
 | 
			
		||||
            throw new Error(result.error);
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * {@inheritDoc IParsedPackageName.scope}
 | 
			
		||||
     */
 | 
			
		||||
    getScope(packageName) {
 | 
			
		||||
        return this.parse(packageName).scope;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * {@inheritDoc IParsedPackageName.unscopedName}
 | 
			
		||||
     */
 | 
			
		||||
    getUnscopedName(packageName) {
 | 
			
		||||
        return this.parse(packageName).unscopedName;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns true if the specified package name is valid, or false otherwise.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * This function will not throw an exception.
 | 
			
		||||
     */
 | 
			
		||||
    isValidName(packageName) {
 | 
			
		||||
        const result = this.tryParse(packageName);
 | 
			
		||||
        return !result.error;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Throws an exception if the specified name is not a valid package name.
 | 
			
		||||
     * The packageName must not be an empty string.
 | 
			
		||||
     */
 | 
			
		||||
    validate(packageName) {
 | 
			
		||||
        this.parse(packageName);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Combines an optional package scope with an unscoped root name.
 | 
			
		||||
     * @param scope - Must be either an empty string, or a scope name such as "\@example"
 | 
			
		||||
     * @param unscopedName - Must be a nonempty package name that does not contain a scope
 | 
			
		||||
     * @returns A full package name such as "\@example/some-library".
 | 
			
		||||
     */
 | 
			
		||||
    combineParts(scope, unscopedName) {
 | 
			
		||||
        if (scope !== '') {
 | 
			
		||||
            if (scope[0] !== '@') {
 | 
			
		||||
                throw new Error('The scope must start with an "@" character');
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (scope.indexOf('/') >= 0) {
 | 
			
		||||
            throw new Error('The scope must not contain a "/" character');
 | 
			
		||||
        }
 | 
			
		||||
        if (unscopedName[0] === '@') {
 | 
			
		||||
            throw new Error('The unscopedName cannot start with an "@" character');
 | 
			
		||||
        }
 | 
			
		||||
        if (unscopedName.indexOf('/') >= 0) {
 | 
			
		||||
            throw new Error('The unscopedName must not contain a "/" character');
 | 
			
		||||
        }
 | 
			
		||||
        let result;
 | 
			
		||||
        if (scope === '') {
 | 
			
		||||
            result = unscopedName;
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            result = scope + '/' + unscopedName;
 | 
			
		||||
        }
 | 
			
		||||
        // Make sure the result is a valid package name
 | 
			
		||||
        this.validate(result);
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
// encodeURIComponent() escapes all characters except:  A-Z a-z 0-9 - _ . ! ~ * ' ( )
 | 
			
		||||
// However, these are disallowed because they are shell characters:       ! ~ * ' ( )
 | 
			
		||||
PackageNameParser._invalidNameCharactersRegExp = /[^A-Za-z0-9\-_\.]/;
 | 
			
		||||
exports.PackageNameParser = PackageNameParser;
 | 
			
		||||
/**
 | 
			
		||||
 * Provides basic operations for validating and manipulating NPM package names such as `my-package`
 | 
			
		||||
 * or `@scope/my-package`.
 | 
			
		||||
 *
 | 
			
		||||
 * @remarks
 | 
			
		||||
 * This is the default implementation of {@link PackageNameParser}, exposed as a convenient static class.
 | 
			
		||||
 * If you need to configure the parsing rules, use `PackageNameParser` instead.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
class PackageName {
 | 
			
		||||
    /** {@inheritDoc PackageNameParser.tryParse} */
 | 
			
		||||
    static tryParse(packageName) {
 | 
			
		||||
        return PackageName._parser.tryParse(packageName);
 | 
			
		||||
    }
 | 
			
		||||
    /** {@inheritDoc PackageNameParser.parse} */
 | 
			
		||||
    static parse(packageName) {
 | 
			
		||||
        return this._parser.parse(packageName);
 | 
			
		||||
    }
 | 
			
		||||
    /** {@inheritDoc PackageNameParser.getScope} */
 | 
			
		||||
    static getScope(packageName) {
 | 
			
		||||
        return this._parser.getScope(packageName);
 | 
			
		||||
    }
 | 
			
		||||
    /** {@inheritDoc PackageNameParser.getUnscopedName} */
 | 
			
		||||
    static getUnscopedName(packageName) {
 | 
			
		||||
        return this._parser.getUnscopedName(packageName);
 | 
			
		||||
    }
 | 
			
		||||
    /** {@inheritDoc PackageNameParser.isValidName} */
 | 
			
		||||
    static isValidName(packageName) {
 | 
			
		||||
        return this._parser.isValidName(packageName);
 | 
			
		||||
    }
 | 
			
		||||
    /** {@inheritDoc PackageNameParser.validate} */
 | 
			
		||||
    static validate(packageName) {
 | 
			
		||||
        return this._parser.validate(packageName);
 | 
			
		||||
    }
 | 
			
		||||
    /** {@inheritDoc PackageNameParser.combineParts} */
 | 
			
		||||
    static combineParts(scope, unscopedName) {
 | 
			
		||||
        return this._parser.combineParts(scope, unscopedName);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
PackageName._parser = new PackageNameParser();
 | 
			
		||||
exports.PackageName = PackageName;
 | 
			
		||||
//# sourceMappingURL=PackageName.js.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/PackageName.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/PackageName.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										155
									
								
								node_modules/@rushstack/node-core-library/lib/Path.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										155
									
								
								node_modules/@rushstack/node-core-library/lib/Path.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,155 @@
 | 
			
		||||
/**
 | 
			
		||||
 * The format that the FileError message should conform to. The supported formats are:
 | 
			
		||||
 *  - Unix: `<path>:<line>:<column> - <message>`
 | 
			
		||||
 *  - VisualStudio: `<path>(<line>,<column>) - <message>`
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export type FileLocationStyle = 'Unix' | 'VisualStudio';
 | 
			
		||||
/**
 | 
			
		||||
 * Options for {@link Path.formatFileLocation}.
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IPathFormatFileLocationOptions {
 | 
			
		||||
    /**
 | 
			
		||||
     * The base path to use when converting `pathToFormat` to a relative path. If not specified,
 | 
			
		||||
     * `pathToFormat` will be used as-is.
 | 
			
		||||
     */
 | 
			
		||||
    baseFolder?: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * The path that will be used to specify the file location.
 | 
			
		||||
     */
 | 
			
		||||
    pathToFormat: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * The message related to the file location.
 | 
			
		||||
     */
 | 
			
		||||
    message: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * The style of file location formatting to use.
 | 
			
		||||
     */
 | 
			
		||||
    format: FileLocationStyle;
 | 
			
		||||
    /**
 | 
			
		||||
     * The optional line number. If not specified, the line number will not be included
 | 
			
		||||
     * in the formatted string.
 | 
			
		||||
     */
 | 
			
		||||
    line?: number;
 | 
			
		||||
    /**
 | 
			
		||||
     * The optional column number. If not specified, the column number will not be included
 | 
			
		||||
     * in the formatted string.
 | 
			
		||||
     */
 | 
			
		||||
    column?: number;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * Options for {@link Path.formatConcisely}.
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IPathFormatConciselyOptions {
 | 
			
		||||
    /**
 | 
			
		||||
     * The path to be converted.
 | 
			
		||||
     */
 | 
			
		||||
    pathToConvert: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * The base path to use when converting `pathToConvert` to a relative path.
 | 
			
		||||
     */
 | 
			
		||||
    baseFolder: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * If set to true, don't include the leading `./` if the path is under the base folder.
 | 
			
		||||
     */
 | 
			
		||||
    trimLeadingDotSlash?: boolean;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * Common operations for manipulating file and directory paths.
 | 
			
		||||
 * @remarks
 | 
			
		||||
 * This API is intended to eventually be a complete replacement for the NodeJS "path" API.
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export declare class Path {
 | 
			
		||||
    private static _relativePathRegex;
 | 
			
		||||
    private static _upwardPathSegmentRegex;
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns true if "childPath" is located inside the "parentFolderPath" folder
 | 
			
		||||
     * or one of its child folders.  Note that "parentFolderPath" is not considered to be
 | 
			
		||||
     * under itself.  The "childPath" can refer to any type of file system object.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * The indicated file/folder objects are not required to actually exist on disk.
 | 
			
		||||
     * For example, "parentFolderPath" is interpreted as a folder name even if it refers to a file.
 | 
			
		||||
     * If the paths are relative, they will first be resolved using path.resolve().
 | 
			
		||||
     */
 | 
			
		||||
    static isUnder(childPath: string, parentFolderPath: string): boolean;
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns true if "childPath" is equal to "parentFolderPath", or if it is inside that folder
 | 
			
		||||
     * or one of its children.  The "childPath" can refer to any type of file system object.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * The indicated file/folder objects are not required to actually exist on disk.
 | 
			
		||||
     * For example, "parentFolderPath" is interpreted as a folder name even if it refers to a file.
 | 
			
		||||
     * If the paths are relative, they will first be resolved using path.resolve().
 | 
			
		||||
     */
 | 
			
		||||
    static isUnderOrEqual(childPath: string, parentFolderPath: string): boolean;
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns true if `path1` and `path2` refer to the same underlying path.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     *
 | 
			
		||||
     * The comparison is performed using `path.relative()`.
 | 
			
		||||
     */
 | 
			
		||||
    static isEqual(path1: string, path2: string): boolean;
 | 
			
		||||
    /**
 | 
			
		||||
     * Formats a path to look nice for reporting purposes.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * If `pathToConvert` is under the `baseFolder`, then it will be converted to a relative with the `./` prefix
 | 
			
		||||
     * unless the {@link IPathFormatConciselyOptions.trimLeadingDotSlash} option is set to `true`.
 | 
			
		||||
     * Otherwise, it will be converted to an absolute path.
 | 
			
		||||
     *
 | 
			
		||||
     * Backslashes will be converted to slashes, unless the path starts with an OS-specific string like `C:\`.
 | 
			
		||||
     */
 | 
			
		||||
    static formatConcisely(options: IPathFormatConciselyOptions): string;
 | 
			
		||||
    /**
 | 
			
		||||
     * Formats a file location to look nice for reporting purposes.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * If `pathToFormat` is under the `baseFolder`, then it will be converted to a relative with the `./` prefix.
 | 
			
		||||
     * Otherwise, it will be converted to an absolute path.
 | 
			
		||||
     *
 | 
			
		||||
     * Backslashes will be converted to slashes, unless the path starts with an OS-specific string like `C:\`.
 | 
			
		||||
     */
 | 
			
		||||
    static formatFileLocation(options: IPathFormatFileLocationOptions): string;
 | 
			
		||||
    /**
 | 
			
		||||
     * Replaces Windows-style backslashes with POSIX-style slashes.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * POSIX is a registered trademark of the Institute of Electrical and Electronic Engineers, Inc.
 | 
			
		||||
     */
 | 
			
		||||
    static convertToSlashes(inputPath: string): string;
 | 
			
		||||
    /**
 | 
			
		||||
     * Replaces POSIX-style slashes with Windows-style backslashes
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * POSIX is a registered trademark of the Institute of Electrical and Electronic Engineers, Inc.
 | 
			
		||||
     */
 | 
			
		||||
    static convertToBackslashes(inputPath: string): string;
 | 
			
		||||
    /**
 | 
			
		||||
     * Replaces slashes or backslashes with the appropriate slash for the current operating system.
 | 
			
		||||
     */
 | 
			
		||||
    static convertToPlatformDefault(inputPath: string): string;
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns true if the specified path is a relative path and does not use `..` to walk upwards.
 | 
			
		||||
     *
 | 
			
		||||
     * @example
 | 
			
		||||
     * ```ts
 | 
			
		||||
     * // These evaluate to true
 | 
			
		||||
     * isDownwardRelative('folder');
 | 
			
		||||
     * isDownwardRelative('file');
 | 
			
		||||
     * isDownwardRelative('folder/');
 | 
			
		||||
     * isDownwardRelative('./folder/');
 | 
			
		||||
     * isDownwardRelative('./folder/file');
 | 
			
		||||
     *
 | 
			
		||||
     * // These evaluate to false
 | 
			
		||||
     * isDownwardRelative('../folder');
 | 
			
		||||
     * isDownwardRelative('folder/../file');
 | 
			
		||||
     * isDownwardRelative('/folder/file');
 | 
			
		||||
     * ```
 | 
			
		||||
     */
 | 
			
		||||
    static isDownwardRelative(inputPath: string): boolean;
 | 
			
		||||
}
 | 
			
		||||
//# sourceMappingURL=Path.d.ts.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/Path.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/Path.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"Path.d.ts","sourceRoot":"","sources":["../src/Path.ts"],"names":[],"mappings":"AAKA;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,cAAc,CAAC;AAExD;;;GAGG;AACH,MAAM,WAAW,8BAA8B;IAC7C;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,MAAM,EAAE,iBAAiB,CAAC;IAC1B;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,2BAA2B;IAC1C;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED;;;;;GAKG;AACH,qBAAa,IAAI;IAGf,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAwB;IAIzD,OAAO,CAAC,MAAM,CAAC,uBAAuB,CAAsC;IAE5E;;;;;;;;;OASG;WACW,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO;IAQ3E;;;;;;;;OAQG;WACW,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO;IAKlF;;;;;;OAMG;WACW,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAI5D;;;;;;;;OAQG;WACW,eAAe,CAAC,OAAO,EAAE,2BAA2B,GAAG,MAAM;IAqB3E;;;;;;;OAOG;WACW,kBAAkB,CAAC,OAAO,EAAE,8BAA8B,GAAG,MAAM;IA+CjF;;;;;OAKG;WACW,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAIzD;;;;;OAKG;WACW,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAG7D;;OAEG;WACW,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAIjE;;;;;;;;;;;;;;;;;OAiBG;WACW,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;CAU7D"}
 | 
			
		||||
							
								
								
									
										214
									
								
								node_modules/@rushstack/node-core-library/lib/Path.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										214
									
								
								node_modules/@rushstack/node-core-library/lib/Path.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,214 @@
 | 
			
		||||
"use strict";
 | 
			
		||||
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 | 
			
		||||
// See LICENSE in the project root for license information.
 | 
			
		||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    var desc = Object.getOwnPropertyDescriptor(m, k);
 | 
			
		||||
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
 | 
			
		||||
      desc = { enumerable: true, get: function() { return m[k]; } };
 | 
			
		||||
    }
 | 
			
		||||
    Object.defineProperty(o, k2, desc);
 | 
			
		||||
}) : (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    o[k2] = m[k];
 | 
			
		||||
}));
 | 
			
		||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
 | 
			
		||||
    Object.defineProperty(o, "default", { enumerable: true, value: v });
 | 
			
		||||
}) : function(o, v) {
 | 
			
		||||
    o["default"] = v;
 | 
			
		||||
});
 | 
			
		||||
var __importStar = (this && this.__importStar) || function (mod) {
 | 
			
		||||
    if (mod && mod.__esModule) return mod;
 | 
			
		||||
    var result = {};
 | 
			
		||||
    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
 | 
			
		||||
    __setModuleDefault(result, mod);
 | 
			
		||||
    return result;
 | 
			
		||||
};
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.Path = void 0;
 | 
			
		||||
const path = __importStar(require("path"));
 | 
			
		||||
/**
 | 
			
		||||
 * Common operations for manipulating file and directory paths.
 | 
			
		||||
 * @remarks
 | 
			
		||||
 * This API is intended to eventually be a complete replacement for the NodeJS "path" API.
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
class Path {
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns true if "childPath" is located inside the "parentFolderPath" folder
 | 
			
		||||
     * or one of its child folders.  Note that "parentFolderPath" is not considered to be
 | 
			
		||||
     * under itself.  The "childPath" can refer to any type of file system object.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * The indicated file/folder objects are not required to actually exist on disk.
 | 
			
		||||
     * For example, "parentFolderPath" is interpreted as a folder name even if it refers to a file.
 | 
			
		||||
     * If the paths are relative, they will first be resolved using path.resolve().
 | 
			
		||||
     */
 | 
			
		||||
    static isUnder(childPath, parentFolderPath) {
 | 
			
		||||
        // If childPath is under parentPath, then relativePath will be something like
 | 
			
		||||
        // "../.." or "..\\..", which consists entirely of periods and slashes.
 | 
			
		||||
        // (Note that something like "....t" is actually a valid filename, but "...." is not.)
 | 
			
		||||
        const relativePath = path.relative(childPath, parentFolderPath);
 | 
			
		||||
        return Path._relativePathRegex.test(relativePath);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns true if "childPath" is equal to "parentFolderPath", or if it is inside that folder
 | 
			
		||||
     * or one of its children.  The "childPath" can refer to any type of file system object.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * The indicated file/folder objects are not required to actually exist on disk.
 | 
			
		||||
     * For example, "parentFolderPath" is interpreted as a folder name even if it refers to a file.
 | 
			
		||||
     * If the paths are relative, they will first be resolved using path.resolve().
 | 
			
		||||
     */
 | 
			
		||||
    static isUnderOrEqual(childPath, parentFolderPath) {
 | 
			
		||||
        const relativePath = path.relative(childPath, parentFolderPath);
 | 
			
		||||
        return relativePath === '' || Path._relativePathRegex.test(relativePath);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns true if `path1` and `path2` refer to the same underlying path.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     *
 | 
			
		||||
     * The comparison is performed using `path.relative()`.
 | 
			
		||||
     */
 | 
			
		||||
    static isEqual(path1, path2) {
 | 
			
		||||
        return path.relative(path1, path2) === '';
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Formats a path to look nice for reporting purposes.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * If `pathToConvert` is under the `baseFolder`, then it will be converted to a relative with the `./` prefix
 | 
			
		||||
     * unless the {@link IPathFormatConciselyOptions.trimLeadingDotSlash} option is set to `true`.
 | 
			
		||||
     * Otherwise, it will be converted to an absolute path.
 | 
			
		||||
     *
 | 
			
		||||
     * Backslashes will be converted to slashes, unless the path starts with an OS-specific string like `C:\`.
 | 
			
		||||
     */
 | 
			
		||||
    static formatConcisely(options) {
 | 
			
		||||
        // Same logic as Path.isUnderOrEqual()
 | 
			
		||||
        const relativePath = path.relative(options.pathToConvert, options.baseFolder);
 | 
			
		||||
        const isUnderOrEqual = relativePath === '' || Path._relativePathRegex.test(relativePath);
 | 
			
		||||
        if (isUnderOrEqual) {
 | 
			
		||||
            // Note that isUnderOrEqual()'s relativePath is the reverse direction
 | 
			
		||||
            const convertedPath = Path.convertToSlashes(path.relative(options.baseFolder, options.pathToConvert));
 | 
			
		||||
            if (options.trimLeadingDotSlash) {
 | 
			
		||||
                return convertedPath;
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                return `./${convertedPath}`;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        const absolutePath = path.resolve(options.pathToConvert);
 | 
			
		||||
        return absolutePath;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Formats a file location to look nice for reporting purposes.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * If `pathToFormat` is under the `baseFolder`, then it will be converted to a relative with the `./` prefix.
 | 
			
		||||
     * Otherwise, it will be converted to an absolute path.
 | 
			
		||||
     *
 | 
			
		||||
     * Backslashes will be converted to slashes, unless the path starts with an OS-specific string like `C:\`.
 | 
			
		||||
     */
 | 
			
		||||
    static formatFileLocation(options) {
 | 
			
		||||
        const { message, format, pathToFormat, baseFolder, line, column } = options;
 | 
			
		||||
        // Convert the path to be relative to the base folder, if specified. Otherwise, use
 | 
			
		||||
        // the path as-is.
 | 
			
		||||
        const filePath = baseFolder
 | 
			
		||||
            ? Path.formatConcisely({
 | 
			
		||||
                pathToConvert: pathToFormat,
 | 
			
		||||
                baseFolder,
 | 
			
		||||
                trimLeadingDotSlash: true
 | 
			
		||||
            })
 | 
			
		||||
            : path.resolve(pathToFormat);
 | 
			
		||||
        let formattedFileLocation;
 | 
			
		||||
        switch (format) {
 | 
			
		||||
            case 'Unix': {
 | 
			
		||||
                if (line !== undefined && column !== undefined) {
 | 
			
		||||
                    formattedFileLocation = `:${line}:${column}`;
 | 
			
		||||
                }
 | 
			
		||||
                else if (line !== undefined) {
 | 
			
		||||
                    formattedFileLocation = `:${line}`;
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    formattedFileLocation = '';
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
            case 'VisualStudio': {
 | 
			
		||||
                if (line !== undefined && column !== undefined) {
 | 
			
		||||
                    formattedFileLocation = `(${line},${column})`;
 | 
			
		||||
                }
 | 
			
		||||
                else if (line !== undefined) {
 | 
			
		||||
                    formattedFileLocation = `(${line})`;
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    formattedFileLocation = '';
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
            default: {
 | 
			
		||||
                throw new Error(`Unknown format: ${format}`);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return `${filePath}${formattedFileLocation} - ${message}`;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Replaces Windows-style backslashes with POSIX-style slashes.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * POSIX is a registered trademark of the Institute of Electrical and Electronic Engineers, Inc.
 | 
			
		||||
     */
 | 
			
		||||
    static convertToSlashes(inputPath) {
 | 
			
		||||
        return inputPath.replace(/\\/g, '/');
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Replaces POSIX-style slashes with Windows-style backslashes
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * POSIX is a registered trademark of the Institute of Electrical and Electronic Engineers, Inc.
 | 
			
		||||
     */
 | 
			
		||||
    static convertToBackslashes(inputPath) {
 | 
			
		||||
        return inputPath.replace(/\//g, '\\');
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Replaces slashes or backslashes with the appropriate slash for the current operating system.
 | 
			
		||||
     */
 | 
			
		||||
    static convertToPlatformDefault(inputPath) {
 | 
			
		||||
        return path.sep === '/' ? Path.convertToSlashes(inputPath) : Path.convertToBackslashes(inputPath);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns true if the specified path is a relative path and does not use `..` to walk upwards.
 | 
			
		||||
     *
 | 
			
		||||
     * @example
 | 
			
		||||
     * ```ts
 | 
			
		||||
     * // These evaluate to true
 | 
			
		||||
     * isDownwardRelative('folder');
 | 
			
		||||
     * isDownwardRelative('file');
 | 
			
		||||
     * isDownwardRelative('folder/');
 | 
			
		||||
     * isDownwardRelative('./folder/');
 | 
			
		||||
     * isDownwardRelative('./folder/file');
 | 
			
		||||
     *
 | 
			
		||||
     * // These evaluate to false
 | 
			
		||||
     * isDownwardRelative('../folder');
 | 
			
		||||
     * isDownwardRelative('folder/../file');
 | 
			
		||||
     * isDownwardRelative('/folder/file');
 | 
			
		||||
     * ```
 | 
			
		||||
     */
 | 
			
		||||
    static isDownwardRelative(inputPath) {
 | 
			
		||||
        if (path.isAbsolute(inputPath)) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        // Does it contain ".."
 | 
			
		||||
        if (Path._upwardPathSegmentRegex.test(inputPath)) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
// Matches a relative path consisting entirely of periods and slashes
 | 
			
		||||
// Example: ".", "..", "../..", etc
 | 
			
		||||
Path._relativePathRegex = /^[.\/\\]+$/;
 | 
			
		||||
// Matches a relative path segment that traverses upwards
 | 
			
		||||
// Example: "a/../b"
 | 
			
		||||
Path._upwardPathSegmentRegex = /([\/\\]|^)\.\.([\/\\]|$)/;
 | 
			
		||||
exports.Path = Path;
 | 
			
		||||
//# sourceMappingURL=Path.js.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/Path.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/Path.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										73
									
								
								node_modules/@rushstack/node-core-library/lib/PosixModeBits.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								node_modules/@rushstack/node-core-library/lib/PosixModeBits.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,73 @@
 | 
			
		||||
/**
 | 
			
		||||
 * An integer value used to specify file permissions for POSIX-like operating systems.
 | 
			
		||||
 *
 | 
			
		||||
 * @remarks
 | 
			
		||||
 *
 | 
			
		||||
 * This bitfield corresponds to the "mode_t" structure described in this document:
 | 
			
		||||
 * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_stat.h.html
 | 
			
		||||
 *
 | 
			
		||||
 * It is used with NodeJS APIs such as fs.Stat.mode and fs.chmodSync().  These values
 | 
			
		||||
 * represent a set of permissions and can be combined using bitwise arithmetic.
 | 
			
		||||
 *
 | 
			
		||||
 * POSIX is a registered trademark of the Institute of Electrical and Electronic Engineers, Inc.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export declare enum PosixModeBits {
 | 
			
		||||
    /**
 | 
			
		||||
     * Indicates that the item's owner can read the item.
 | 
			
		||||
     */
 | 
			
		||||
    UserRead = 256,
 | 
			
		||||
    /**
 | 
			
		||||
     * Indicates that the item's owner can modify the item.
 | 
			
		||||
     */
 | 
			
		||||
    UserWrite = 128,
 | 
			
		||||
    /**
 | 
			
		||||
     * Indicates that the item's owner can execute the item (if it is a file)
 | 
			
		||||
     * or search the item (if it is a directory).
 | 
			
		||||
     */
 | 
			
		||||
    UserExecute = 64,
 | 
			
		||||
    /**
 | 
			
		||||
     * Indicates that users belonging to the item's group can read the item.
 | 
			
		||||
     */
 | 
			
		||||
    GroupRead = 32,
 | 
			
		||||
    /**
 | 
			
		||||
     * Indicates that users belonging to the item's group can modify the item.
 | 
			
		||||
     */
 | 
			
		||||
    GroupWrite = 16,
 | 
			
		||||
    /**
 | 
			
		||||
     * Indicates that users belonging to the item's group can execute the item (if it is a file)
 | 
			
		||||
     * or search the item (if it is a directory).
 | 
			
		||||
     */
 | 
			
		||||
    GroupExecute = 8,
 | 
			
		||||
    /**
 | 
			
		||||
     * Indicates that other users (besides the item's owner user or group) can read the item.
 | 
			
		||||
     */
 | 
			
		||||
    OthersRead = 4,
 | 
			
		||||
    /**
 | 
			
		||||
     * Indicates that other users (besides the item's owner user or group) can modify the item.
 | 
			
		||||
     */
 | 
			
		||||
    OthersWrite = 2,
 | 
			
		||||
    /**
 | 
			
		||||
     * Indicates that other users (besides the item's owner user or group) can execute the item (if it is a file)
 | 
			
		||||
     * or search the item (if it is a directory).
 | 
			
		||||
     */
 | 
			
		||||
    OthersExecute = 1,
 | 
			
		||||
    /**
 | 
			
		||||
     * A zero value where no permissions bits are set.
 | 
			
		||||
     */
 | 
			
		||||
    None = 0,
 | 
			
		||||
    /**
 | 
			
		||||
     * An alias combining OthersRead, GroupRead, and UserRead permission bits.
 | 
			
		||||
     */
 | 
			
		||||
    AllRead = 292,
 | 
			
		||||
    /**
 | 
			
		||||
     * An alias combining OthersWrite, GroupWrite, and UserWrite permission bits.
 | 
			
		||||
     */
 | 
			
		||||
    AllWrite = 146,
 | 
			
		||||
    /**
 | 
			
		||||
     * An alias combining OthersExecute, GroupExecute, and UserExecute permission bits.
 | 
			
		||||
     */
 | 
			
		||||
    AllExecute = 73
 | 
			
		||||
}
 | 
			
		||||
//# sourceMappingURL=PosixModeBits.d.ts.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/PosixModeBits.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/PosixModeBits.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"PosixModeBits.d.ts","sourceRoot":"","sources":["../src/PosixModeBits.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;GAcG;AACH,oBAAY,aAAa;IAGvB;;OAEG;IACH,QAAQ,MAAS;IAEjB;;OAEG;IACH,SAAS,MAAS;IAElB;;;OAGG;IACH,WAAW,KAAS;IAEpB;;OAEG;IACH,SAAS,KAAS;IAElB;;OAEG;IACH,UAAU,KAAS;IAEnB;;;OAGG;IACH,YAAY,IAAS;IAErB;;OAEG;IACH,UAAU,IAAS;IAEnB;;OAEG;IACH,WAAW,IAAS;IAEpB;;;OAGG;IACH,aAAa,IAAS;IAItB;;OAEG;IACH,IAAI,IAAI;IAER;;OAEG;IACH,OAAO,MAAoC;IAE3C;;OAEG;IACH,QAAQ,MAAuC;IAE/C;;OAEG;IACH,UAAU,KAA6C;CACxD"}
 | 
			
		||||
							
								
								
									
										83
									
								
								node_modules/@rushstack/node-core-library/lib/PosixModeBits.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								node_modules/@rushstack/node-core-library/lib/PosixModeBits.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,83 @@
 | 
			
		||||
"use strict";
 | 
			
		||||
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 | 
			
		||||
// See LICENSE in the project root for license information.
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.PosixModeBits = void 0;
 | 
			
		||||
// The PosixModeBits are intended to be used with bitwise operations.
 | 
			
		||||
/* eslint-disable no-bitwise */
 | 
			
		||||
/**
 | 
			
		||||
 * An integer value used to specify file permissions for POSIX-like operating systems.
 | 
			
		||||
 *
 | 
			
		||||
 * @remarks
 | 
			
		||||
 *
 | 
			
		||||
 * This bitfield corresponds to the "mode_t" structure described in this document:
 | 
			
		||||
 * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_stat.h.html
 | 
			
		||||
 *
 | 
			
		||||
 * It is used with NodeJS APIs such as fs.Stat.mode and fs.chmodSync().  These values
 | 
			
		||||
 * represent a set of permissions and can be combined using bitwise arithmetic.
 | 
			
		||||
 *
 | 
			
		||||
 * POSIX is a registered trademark of the Institute of Electrical and Electronic Engineers, Inc.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
var PosixModeBits;
 | 
			
		||||
(function (PosixModeBits) {
 | 
			
		||||
    // The bits
 | 
			
		||||
    /**
 | 
			
		||||
     * Indicates that the item's owner can read the item.
 | 
			
		||||
     */
 | 
			
		||||
    PosixModeBits[PosixModeBits["UserRead"] = 256] = "UserRead";
 | 
			
		||||
    /**
 | 
			
		||||
     * Indicates that the item's owner can modify the item.
 | 
			
		||||
     */
 | 
			
		||||
    PosixModeBits[PosixModeBits["UserWrite"] = 128] = "UserWrite";
 | 
			
		||||
    /**
 | 
			
		||||
     * Indicates that the item's owner can execute the item (if it is a file)
 | 
			
		||||
     * or search the item (if it is a directory).
 | 
			
		||||
     */
 | 
			
		||||
    PosixModeBits[PosixModeBits["UserExecute"] = 64] = "UserExecute";
 | 
			
		||||
    /**
 | 
			
		||||
     * Indicates that users belonging to the item's group can read the item.
 | 
			
		||||
     */
 | 
			
		||||
    PosixModeBits[PosixModeBits["GroupRead"] = 32] = "GroupRead";
 | 
			
		||||
    /**
 | 
			
		||||
     * Indicates that users belonging to the item's group can modify the item.
 | 
			
		||||
     */
 | 
			
		||||
    PosixModeBits[PosixModeBits["GroupWrite"] = 16] = "GroupWrite";
 | 
			
		||||
    /**
 | 
			
		||||
     * Indicates that users belonging to the item's group can execute the item (if it is a file)
 | 
			
		||||
     * or search the item (if it is a directory).
 | 
			
		||||
     */
 | 
			
		||||
    PosixModeBits[PosixModeBits["GroupExecute"] = 8] = "GroupExecute";
 | 
			
		||||
    /**
 | 
			
		||||
     * Indicates that other users (besides the item's owner user or group) can read the item.
 | 
			
		||||
     */
 | 
			
		||||
    PosixModeBits[PosixModeBits["OthersRead"] = 4] = "OthersRead";
 | 
			
		||||
    /**
 | 
			
		||||
     * Indicates that other users (besides the item's owner user or group) can modify the item.
 | 
			
		||||
     */
 | 
			
		||||
    PosixModeBits[PosixModeBits["OthersWrite"] = 2] = "OthersWrite";
 | 
			
		||||
    /**
 | 
			
		||||
     * Indicates that other users (besides the item's owner user or group) can execute the item (if it is a file)
 | 
			
		||||
     * or search the item (if it is a directory).
 | 
			
		||||
     */
 | 
			
		||||
    PosixModeBits[PosixModeBits["OthersExecute"] = 1] = "OthersExecute";
 | 
			
		||||
    // Helpful aliases
 | 
			
		||||
    /**
 | 
			
		||||
     * A zero value where no permissions bits are set.
 | 
			
		||||
     */
 | 
			
		||||
    PosixModeBits[PosixModeBits["None"] = 0] = "None";
 | 
			
		||||
    /**
 | 
			
		||||
     * An alias combining OthersRead, GroupRead, and UserRead permission bits.
 | 
			
		||||
     */
 | 
			
		||||
    PosixModeBits[PosixModeBits["AllRead"] = 292] = "AllRead";
 | 
			
		||||
    /**
 | 
			
		||||
     * An alias combining OthersWrite, GroupWrite, and UserWrite permission bits.
 | 
			
		||||
     */
 | 
			
		||||
    PosixModeBits[PosixModeBits["AllWrite"] = 146] = "AllWrite";
 | 
			
		||||
    /**
 | 
			
		||||
     * An alias combining OthersExecute, GroupExecute, and UserExecute permission bits.
 | 
			
		||||
     */
 | 
			
		||||
    PosixModeBits[PosixModeBits["AllExecute"] = 73] = "AllExecute";
 | 
			
		||||
})(PosixModeBits = exports.PosixModeBits || (exports.PosixModeBits = {}));
 | 
			
		||||
//# sourceMappingURL=PosixModeBits.js.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/PosixModeBits.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/PosixModeBits.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"PosixModeBits.js","sourceRoot":"","sources":["../src/PosixModeBits.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,qEAAqE;AACrE,+BAA+B;AAE/B;;;;;;;;;;;;;;GAcG;AACH,IAAY,aAwEX;AAxED,WAAY,aAAa;IACvB,WAAW;IAEX;;OAEG;IACH,2DAAiB,CAAA;IAEjB;;OAEG;IACH,6DAAkB,CAAA;IAElB;;;OAGG;IACH,gEAAoB,CAAA;IAEpB;;OAEG;IACH,4DAAkB,CAAA;IAElB;;OAEG;IACH,8DAAmB,CAAA;IAEnB;;;OAGG;IACH,iEAAqB,CAAA;IAErB;;OAEG;IACH,6DAAmB,CAAA;IAEnB;;OAEG;IACH,+DAAoB,CAAA;IAEpB;;;OAGG;IACH,mEAAsB,CAAA;IAEtB,kBAAkB;IAElB;;OAEG;IACH,iDAAQ,CAAA;IAER;;OAEG;IACH,yDAA2C,CAAA;IAE3C;;OAEG;IACH,2DAA+C,CAAA;IAE/C;;OAEG;IACH,8DAAuD,CAAA;AACzD,CAAC,EAxEW,aAAa,GAAb,qBAAa,KAAb,qBAAa,QAwExB","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\n// The PosixModeBits are intended to be used with bitwise operations.\n/* eslint-disable no-bitwise */\n\n/**\n * An integer value used to specify file permissions for POSIX-like operating systems.\n *\n * @remarks\n *\n * This bitfield corresponds to the \"mode_t\" structure described in this document:\n * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_stat.h.html\n *\n * It is used with NodeJS APIs such as fs.Stat.mode and fs.chmodSync().  These values\n * represent a set of permissions and can be combined using bitwise arithmetic.\n *\n * POSIX is a registered trademark of the Institute of Electrical and Electronic Engineers, Inc.\n *\n * @public\n */\nexport enum PosixModeBits {\n  // The bits\n\n  /**\n   * Indicates that the item's owner can read the item.\n   */\n  UserRead = 1 << 8,\n\n  /**\n   * Indicates that the item's owner can modify the item.\n   */\n  UserWrite = 1 << 7,\n\n  /**\n   * Indicates that the item's owner can execute the item (if it is a file)\n   * or search the item (if it is a directory).\n   */\n  UserExecute = 1 << 6,\n\n  /**\n   * Indicates that users belonging to the item's group can read the item.\n   */\n  GroupRead = 1 << 5,\n\n  /**\n   * Indicates that users belonging to the item's group can modify the item.\n   */\n  GroupWrite = 1 << 4,\n\n  /**\n   * Indicates that users belonging to the item's group can execute the item (if it is a file)\n   * or search the item (if it is a directory).\n   */\n  GroupExecute = 1 << 3,\n\n  /**\n   * Indicates that other users (besides the item's owner user or group) can read the item.\n   */\n  OthersRead = 1 << 2,\n\n  /**\n   * Indicates that other users (besides the item's owner user or group) can modify the item.\n   */\n  OthersWrite = 1 << 1,\n\n  /**\n   * Indicates that other users (besides the item's owner user or group) can execute the item (if it is a file)\n   * or search the item (if it is a directory).\n   */\n  OthersExecute = 1 << 0,\n\n  // Helpful aliases\n\n  /**\n   * A zero value where no permissions bits are set.\n   */\n  None = 0,\n\n  /**\n   * An alias combining OthersRead, GroupRead, and UserRead permission bits.\n   */\n  AllRead = OthersRead | GroupRead | UserRead,\n\n  /**\n   * An alias combining OthersWrite, GroupWrite, and UserWrite permission bits.\n   */\n  AllWrite = OthersWrite | GroupWrite | UserWrite,\n\n  /**\n   * An alias combining OthersExecute, GroupExecute, and UserExecute permission bits.\n   */\n  AllExecute = OthersExecute | GroupExecute | UserExecute\n}\n"]}
 | 
			
		||||
							
								
								
									
										41
									
								
								node_modules/@rushstack/node-core-library/lib/PrimitiveTypes.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								node_modules/@rushstack/node-core-library/lib/PrimitiveTypes.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,41 @@
 | 
			
		||||
/**
 | 
			
		||||
 * A "branded type" is a primitive type with a compile-type key that makes it incompatible with other
 | 
			
		||||
 * aliases for the primitive type.
 | 
			
		||||
 *
 | 
			
		||||
 * @remarks
 | 
			
		||||
 *
 | 
			
		||||
 * Example usage:
 | 
			
		||||
 *
 | 
			
		||||
 * ```ts
 | 
			
		||||
 * // PhoneNumber is a branded type based on the "string" primitive.
 | 
			
		||||
 * type PhoneNumber = Brand<string, 'PhoneNumber'>;
 | 
			
		||||
 *
 | 
			
		||||
 * function createPhoneNumber(input: string): PhoneNumber {
 | 
			
		||||
 *   if (!/\d+(\-\d+)+/.test(input)) {
 | 
			
		||||
 *     throw new Error('Invalid phone number: ' + JSON.stringify(input));
 | 
			
		||||
 *   }
 | 
			
		||||
 *   return input as PhoneNumber;
 | 
			
		||||
 * }
 | 
			
		||||
 *
 | 
			
		||||
 * const p1: PhoneNumber = createPhoneNumber('123-456-7890');
 | 
			
		||||
 *
 | 
			
		||||
 * // PhoneNumber is a string and can be used as one:
 | 
			
		||||
 * const p2: string = p1;
 | 
			
		||||
 *
 | 
			
		||||
 * // But an arbitrary string cannot be implicitly type cast as PhoneNumber.
 | 
			
		||||
 * // ERROR: Type 'string' is not assignable to type 'PhoneNumber'
 | 
			
		||||
 * const p3: PhoneNumber = '123-456-7890';
 | 
			
		||||
 * ```
 | 
			
		||||
 *
 | 
			
		||||
 * For more information about this pattern, see {@link
 | 
			
		||||
 * https://github.com/Microsoft/TypeScript/blob/7b48a182c05ea4dea81bab73ecbbe9e013a79e99/src/compiler/types.ts#L693-L698
 | 
			
		||||
 * | this comment} explaining the TypeScript compiler's introduction of this pattern, and
 | 
			
		||||
 * {@link https://spin.atomicobject.com/2018/01/15/typescript-flexible-nominal-typing/ | this article}
 | 
			
		||||
 * explaining the technique in depth.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export type Brand<T, BrandTag extends string> = T & {
 | 
			
		||||
    __brand: BrandTag;
 | 
			
		||||
};
 | 
			
		||||
//# sourceMappingURL=PrimitiveTypes.d.ts.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/PrimitiveTypes.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/PrimitiveTypes.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"PrimitiveTypes.d.ts","sourceRoot":"","sources":["../src/PrimitiveTypes.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,MAAM,MAAM,KAAK,CAAC,CAAC,EAAE,QAAQ,SAAS,MAAM,IAAI,CAAC,GAAG;IAAE,OAAO,EAAE,QAAQ,CAAA;CAAE,CAAC"}
 | 
			
		||||
							
								
								
									
										5
									
								
								node_modules/@rushstack/node-core-library/lib/PrimitiveTypes.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								node_modules/@rushstack/node-core-library/lib/PrimitiveTypes.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
"use strict";
 | 
			
		||||
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 | 
			
		||||
// See LICENSE in the project root for license information.
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
//# sourceMappingURL=PrimitiveTypes.js.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/PrimitiveTypes.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/PrimitiveTypes.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"PrimitiveTypes.js","sourceRoot":"","sources":["../src/PrimitiveTypes.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\n/**\n * A \"branded type\" is a primitive type with a compile-type key that makes it incompatible with other\n * aliases for the primitive type.\n *\n * @remarks\n *\n * Example usage:\n *\n * ```ts\n * // PhoneNumber is a branded type based on the \"string\" primitive.\n * type PhoneNumber = Brand<string, 'PhoneNumber'>;\n *\n * function createPhoneNumber(input: string): PhoneNumber {\n *   if (!/\\d+(\\-\\d+)+/.test(input)) {\n *     throw new Error('Invalid phone number: ' + JSON.stringify(input));\n *   }\n *   return input as PhoneNumber;\n * }\n *\n * const p1: PhoneNumber = createPhoneNumber('123-456-7890');\n *\n * // PhoneNumber is a string and can be used as one:\n * const p2: string = p1;\n *\n * // But an arbitrary string cannot be implicitly type cast as PhoneNumber.\n * // ERROR: Type 'string' is not assignable to type 'PhoneNumber'\n * const p3: PhoneNumber = '123-456-7890';\n * ```\n *\n * For more information about this pattern, see {@link\n * https://github.com/Microsoft/TypeScript/blob/7b48a182c05ea4dea81bab73ecbbe9e013a79e99/src/compiler/types.ts#L693-L698\n * | this comment} explaining the TypeScript compiler's introduction of this pattern, and\n * {@link https://spin.atomicobject.com/2018/01/15/typescript-flexible-nominal-typing/ | this article}\n * explaining the technique in depth.\n *\n * @public\n */\nexport type Brand<T, BrandTag extends string> = T & { __brand: BrandTag };\n"]}
 | 
			
		||||
							
								
								
									
										83
									
								
								node_modules/@rushstack/node-core-library/lib/ProtectableMap.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								node_modules/@rushstack/node-core-library/lib/ProtectableMap.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,83 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Constructor parameters for {@link ProtectableMap}
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export interface IProtectableMapParameters<K, V> {
 | 
			
		||||
    /**
 | 
			
		||||
     * An optional hook that will be invoked before Map.clear() is performed.
 | 
			
		||||
     */
 | 
			
		||||
    onClear?: (source: ProtectableMap<K, V>) => void;
 | 
			
		||||
    /**
 | 
			
		||||
     * An optional hook that will be invoked before Map.delete() is performed.
 | 
			
		||||
     */
 | 
			
		||||
    onDelete?: (source: ProtectableMap<K, V>, key: K) => void;
 | 
			
		||||
    /**
 | 
			
		||||
     * An optional hook that will be invoked before Map.set() is performed.
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * If this hook is provided, the function MUST return the `value` parameter.
 | 
			
		||||
     * This provides the opportunity to modify the value before it is added
 | 
			
		||||
     * to the map.
 | 
			
		||||
     */
 | 
			
		||||
    onSet?: (source: ProtectableMap<K, V>, key: K, value: V) => V;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * The ProtectableMap provides an easy way for an API to expose a `Map<K, V>` property
 | 
			
		||||
 * while intercepting and validating any write operations that are performed by
 | 
			
		||||
 * consumers of the API.
 | 
			
		||||
 *
 | 
			
		||||
 * @remarks
 | 
			
		||||
 * The ProtectableMap itself is intended to be a private object that only its owner
 | 
			
		||||
 * can access directly.  Any operations performed directly on the ProtectableMap will
 | 
			
		||||
 * bypass the hooks and any validation they perform.  The public property that is exposed
 | 
			
		||||
 * to API consumers should return {@link ProtectableMap.protectedView} instead.
 | 
			
		||||
 *
 | 
			
		||||
 * For example, suppose you want to share your `Map<string, number>` data structure,
 | 
			
		||||
 * but you want to enforce that the key must always be an upper case string:
 | 
			
		||||
 * You could use the onSet() hook to validate the keys and throw an exception
 | 
			
		||||
 * if the key is not uppercase.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
export declare class ProtectableMap<K, V> {
 | 
			
		||||
    private readonly _protectedView;
 | 
			
		||||
    constructor(parameters: IProtectableMapParameters<K, V>);
 | 
			
		||||
    /**
 | 
			
		||||
     * The owner of the protectable map should return this object via its public API.
 | 
			
		||||
     */
 | 
			
		||||
    get protectedView(): Map<K, V>;
 | 
			
		||||
    /**
 | 
			
		||||
     * Removes all entries from the map.
 | 
			
		||||
     * This operation does NOT invoke the ProtectableMap onClear() hook.
 | 
			
		||||
     */
 | 
			
		||||
    clear(): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * Removes the specified key from the map.
 | 
			
		||||
     * This operation does NOT invoke the ProtectableMap onDelete() hook.
 | 
			
		||||
     */
 | 
			
		||||
    delete(key: K): boolean;
 | 
			
		||||
    /**
 | 
			
		||||
     * Sets a value for the specified key.
 | 
			
		||||
     * This operation does NOT invoke the ProtectableMap onSet() hook.
 | 
			
		||||
     */
 | 
			
		||||
    set(key: K, value: V): this;
 | 
			
		||||
    /**
 | 
			
		||||
     * Performs an operation for each (key, value) entries in the map.
 | 
			
		||||
     */
 | 
			
		||||
    forEach(callbackfn: (value: V, key: K, map: Map<K, V>) => void, thisArg?: any): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * Retrieves the value for the specified key.
 | 
			
		||||
     * @returns undefined if the value is undefined OR if the key is missing;
 | 
			
		||||
     * otherwise returns the value associated with the key.
 | 
			
		||||
     */
 | 
			
		||||
    get(key: K): V | undefined;
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns true if the specified key belongs to the map.
 | 
			
		||||
     */
 | 
			
		||||
    has(key: K): boolean;
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the number of (key, value) entries in the map.
 | 
			
		||||
     */
 | 
			
		||||
    get size(): number;
 | 
			
		||||
}
 | 
			
		||||
//# sourceMappingURL=ProtectableMap.d.ts.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/ProtectableMap.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/ProtectableMap.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"ProtectableMap.d.ts","sourceRoot":"","sources":["../src/ProtectableMap.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,MAAM,WAAW,yBAAyB,CAAC,CAAC,EAAE,CAAC;IAC7C;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;IAEjD;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC;IAE1D;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC;CAC/D;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,cAAc,CAAC,CAAC,EAAE,CAAC;IAC9B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA2B;gBAEvC,UAAU,EAAE,yBAAyB,CAAC,CAAC,EAAE,CAAC,CAAC;IAI9D;;OAEG;IACH,IAAW,aAAa,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAEpC;IAKD;;;OAGG;IACI,KAAK,IAAI,IAAI;IAIpB;;;OAGG;IACI,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAI9B;;;OAGG;IACI,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAQlC;;OAEG;IAEI,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI;IAI3F;;;;OAIG;IACI,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAIjC;;OAEG;IACI,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAI3B;;OAEG;IACH,IAAW,IAAI,IAAI,MAAM,CAExB;CACF"}
 | 
			
		||||
							
								
								
									
										90
									
								
								node_modules/@rushstack/node-core-library/lib/ProtectableMap.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								node_modules/@rushstack/node-core-library/lib/ProtectableMap.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,90 @@
 | 
			
		||||
"use strict";
 | 
			
		||||
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 | 
			
		||||
// See LICENSE in the project root for license information.
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.ProtectableMap = void 0;
 | 
			
		||||
const ProtectableMapView_1 = require("./ProtectableMapView");
 | 
			
		||||
/**
 | 
			
		||||
 * The ProtectableMap provides an easy way for an API to expose a `Map<K, V>` property
 | 
			
		||||
 * while intercepting and validating any write operations that are performed by
 | 
			
		||||
 * consumers of the API.
 | 
			
		||||
 *
 | 
			
		||||
 * @remarks
 | 
			
		||||
 * The ProtectableMap itself is intended to be a private object that only its owner
 | 
			
		||||
 * can access directly.  Any operations performed directly on the ProtectableMap will
 | 
			
		||||
 * bypass the hooks and any validation they perform.  The public property that is exposed
 | 
			
		||||
 * to API consumers should return {@link ProtectableMap.protectedView} instead.
 | 
			
		||||
 *
 | 
			
		||||
 * For example, suppose you want to share your `Map<string, number>` data structure,
 | 
			
		||||
 * but you want to enforce that the key must always be an upper case string:
 | 
			
		||||
 * You could use the onSet() hook to validate the keys and throw an exception
 | 
			
		||||
 * if the key is not uppercase.
 | 
			
		||||
 *
 | 
			
		||||
 * @public
 | 
			
		||||
 */
 | 
			
		||||
class ProtectableMap {
 | 
			
		||||
    constructor(parameters) {
 | 
			
		||||
        this._protectedView = new ProtectableMapView_1.ProtectableMapView(this, parameters);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * The owner of the protectable map should return this object via its public API.
 | 
			
		||||
     */
 | 
			
		||||
    get protectedView() {
 | 
			
		||||
        return this._protectedView;
 | 
			
		||||
    }
 | 
			
		||||
    // ---------------------------------------------------------------------------
 | 
			
		||||
    // lib.es2015.collections contract - write operations
 | 
			
		||||
    /**
 | 
			
		||||
     * Removes all entries from the map.
 | 
			
		||||
     * This operation does NOT invoke the ProtectableMap onClear() hook.
 | 
			
		||||
     */
 | 
			
		||||
    clear() {
 | 
			
		||||
        this._protectedView._clearUnprotected();
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Removes the specified key from the map.
 | 
			
		||||
     * This operation does NOT invoke the ProtectableMap onDelete() hook.
 | 
			
		||||
     */
 | 
			
		||||
    delete(key) {
 | 
			
		||||
        return this._protectedView._deleteUnprotected(key);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Sets a value for the specified key.
 | 
			
		||||
     * This operation does NOT invoke the ProtectableMap onSet() hook.
 | 
			
		||||
     */
 | 
			
		||||
    set(key, value) {
 | 
			
		||||
        this._protectedView._setUnprotected(key, value);
 | 
			
		||||
        return this;
 | 
			
		||||
    }
 | 
			
		||||
    // ---------------------------------------------------------------------------
 | 
			
		||||
    // lib.es2015.collections contract - read operations
 | 
			
		||||
    /**
 | 
			
		||||
     * Performs an operation for each (key, value) entries in the map.
 | 
			
		||||
     */
 | 
			
		||||
    // eslint-disable-next-line @typescript-eslint/no-explicit-any
 | 
			
		||||
    forEach(callbackfn, thisArg) {
 | 
			
		||||
        this._protectedView.forEach(callbackfn);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Retrieves the value for the specified key.
 | 
			
		||||
     * @returns undefined if the value is undefined OR if the key is missing;
 | 
			
		||||
     * otherwise returns the value associated with the key.
 | 
			
		||||
     */
 | 
			
		||||
    get(key) {
 | 
			
		||||
        return this._protectedView.get(key);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns true if the specified key belongs to the map.
 | 
			
		||||
     */
 | 
			
		||||
    has(key) {
 | 
			
		||||
        return this._protectedView.has(key);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the number of (key, value) entries in the map.
 | 
			
		||||
     */
 | 
			
		||||
    get size() {
 | 
			
		||||
        return this._protectedView.size;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
exports.ProtectableMap = ProtectableMap;
 | 
			
		||||
//# sourceMappingURL=ProtectableMap.js.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/ProtectableMap.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/ProtectableMap.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										20
									
								
								node_modules/@rushstack/node-core-library/lib/ProtectableMapView.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								node_modules/@rushstack/node-core-library/lib/ProtectableMapView.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
import type { ProtectableMap, IProtectableMapParameters } from './ProtectableMap';
 | 
			
		||||
/**
 | 
			
		||||
 * The internal wrapper used by ProtectableMap.  It extends the real `Map<K, V>` base class,
 | 
			
		||||
 * but hooks the destructive operations (clear/delete/set) to give the owner a chance
 | 
			
		||||
 * to block them.
 | 
			
		||||
 *
 | 
			
		||||
 * NOTE: This is not a public API.
 | 
			
		||||
 */
 | 
			
		||||
export declare class ProtectableMapView<K, V> extends Map<K, V> {
 | 
			
		||||
    private readonly _owner;
 | 
			
		||||
    private readonly _parameters;
 | 
			
		||||
    constructor(owner: ProtectableMap<K, V>, parameters: IProtectableMapParameters<K, V>);
 | 
			
		||||
    clear(): void;
 | 
			
		||||
    delete(key: K): boolean;
 | 
			
		||||
    set(key: K, value: V): this;
 | 
			
		||||
    _clearUnprotected(): void;
 | 
			
		||||
    _deleteUnprotected(key: K): boolean;
 | 
			
		||||
    _setUnprotected(key: K, value: V): void;
 | 
			
		||||
}
 | 
			
		||||
//# sourceMappingURL=ProtectableMapView.d.ts.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/ProtectableMapView.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/ProtectableMapView.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"ProtectableMapView.d.ts","sourceRoot":"","sources":["../src/ProtectableMapView.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAElF;;;;;;GAMG;AACH,qBAAa,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAE,SAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IACrD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkC;gBAE3C,KAAK,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,yBAAyB,CAAC,CAAC,EAAE,CAAC,CAAC;IAOpF,KAAK,IAAI,IAAI;IAQb,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAQvB,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAW3B,iBAAiB,IAAI,IAAI;IAKzB,kBAAkB,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAKnC,eAAe,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;CAG/C"}
 | 
			
		||||
							
								
								
									
										56
									
								
								node_modules/@rushstack/node-core-library/lib/ProtectableMapView.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								node_modules/@rushstack/node-core-library/lib/ProtectableMapView.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,56 @@
 | 
			
		||||
"use strict";
 | 
			
		||||
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 | 
			
		||||
// See LICENSE in the project root for license information.
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.ProtectableMapView = void 0;
 | 
			
		||||
/**
 | 
			
		||||
 * The internal wrapper used by ProtectableMap.  It extends the real `Map<K, V>` base class,
 | 
			
		||||
 * but hooks the destructive operations (clear/delete/set) to give the owner a chance
 | 
			
		||||
 * to block them.
 | 
			
		||||
 *
 | 
			
		||||
 * NOTE: This is not a public API.
 | 
			
		||||
 */
 | 
			
		||||
class ProtectableMapView extends Map {
 | 
			
		||||
    constructor(owner, parameters) {
 | 
			
		||||
        super();
 | 
			
		||||
        this._owner = owner;
 | 
			
		||||
        this._parameters = parameters;
 | 
			
		||||
    }
 | 
			
		||||
    clear() {
 | 
			
		||||
        // override
 | 
			
		||||
        if (this._parameters.onClear) {
 | 
			
		||||
            this._parameters.onClear(this._owner);
 | 
			
		||||
        }
 | 
			
		||||
        super.clear();
 | 
			
		||||
    }
 | 
			
		||||
    delete(key) {
 | 
			
		||||
        // override
 | 
			
		||||
        if (this._parameters.onDelete) {
 | 
			
		||||
            this._parameters.onDelete(this._owner, key);
 | 
			
		||||
        }
 | 
			
		||||
        return super.delete(key);
 | 
			
		||||
    }
 | 
			
		||||
    set(key, value) {
 | 
			
		||||
        // override
 | 
			
		||||
        let modifiedValue = value;
 | 
			
		||||
        if (this._parameters.onSet) {
 | 
			
		||||
            modifiedValue = this._parameters.onSet(this._owner, key, modifiedValue);
 | 
			
		||||
        }
 | 
			
		||||
        super.set(key, modifiedValue);
 | 
			
		||||
        return this;
 | 
			
		||||
    }
 | 
			
		||||
    // INTERNAL USAGE ONLY
 | 
			
		||||
    _clearUnprotected() {
 | 
			
		||||
        super.clear();
 | 
			
		||||
    }
 | 
			
		||||
    // INTERNAL USAGE ONLY
 | 
			
		||||
    _deleteUnprotected(key) {
 | 
			
		||||
        return super.delete(key);
 | 
			
		||||
    }
 | 
			
		||||
    // INTERNAL USAGE ONLY
 | 
			
		||||
    _setUnprotected(key, value) {
 | 
			
		||||
        super.set(key, value);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
exports.ProtectableMapView = ProtectableMapView;
 | 
			
		||||
//# sourceMappingURL=ProtectableMapView.js.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/ProtectableMapView.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@rushstack/node-core-library/lib/ProtectableMapView.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"ProtectableMapView.js","sourceRoot":"","sources":["../src/ProtectableMapView.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAI3D;;;;;;GAMG;AACH,MAAa,kBAAyB,SAAQ,GAAS;IAIrD,YAAmB,KAA2B,EAAE,UAA2C;QACzF,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAChC,CAAC;IAEM,KAAK;QACV,WAAW;QACX,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;YAC5B,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SACvC;QACD,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;IAEM,MAAM,CAAC,GAAM;QAClB,WAAW;QACX,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;YAC7B,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;SAC7C;QACD,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAEM,GAAG,CAAC,GAAM,EAAE,KAAQ;QACzB,WAAW;QACX,IAAI,aAAa,GAAM,KAAK,CAAC;QAC7B,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;YAC1B,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;SACzE;QACD,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,sBAAsB;IACf,iBAAiB;QACtB,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;IAED,sBAAsB;IACf,kBAAkB,CAAC,GAAM;QAC9B,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,sBAAsB;IACf,eAAe,CAAC,GAAM,EAAE,KAAQ;QACrC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC;CACF;AAnDD,gDAmDC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport type { ProtectableMap, IProtectableMapParameters } from './ProtectableMap';\n\n/**\n * The internal wrapper used by ProtectableMap.  It extends the real `Map<K, V>` base class,\n * but hooks the destructive operations (clear/delete/set) to give the owner a chance\n * to block them.\n *\n * NOTE: This is not a public API.\n */\nexport class ProtectableMapView<K, V> extends Map<K, V> {\n  private readonly _owner: ProtectableMap<K, V>;\n  private readonly _parameters: IProtectableMapParameters<K, V>;\n\n  public constructor(owner: ProtectableMap<K, V>, parameters: IProtectableMapParameters<K, V>) {\n    super();\n\n    this._owner = owner;\n    this._parameters = parameters;\n  }\n\n  public clear(): void {\n    // override\n    if (this._parameters.onClear) {\n      this._parameters.onClear(this._owner);\n    }\n    super.clear();\n  }\n\n  public delete(key: K): boolean {\n    // override\n    if (this._parameters.onDelete) {\n      this._parameters.onDelete(this._owner, key);\n    }\n    return super.delete(key);\n  }\n\n  public set(key: K, value: V): this {\n    // override\n    let modifiedValue: V = value;\n    if (this._parameters.onSet) {\n      modifiedValue = this._parameters.onSet(this._owner, key, modifiedValue);\n    }\n    super.set(key, modifiedValue);\n    return this;\n  }\n\n  // INTERNAL USAGE ONLY\n  public _clearUnprotected(): void {\n    super.clear();\n  }\n\n  // INTERNAL USAGE ONLY\n  public _deleteUnprotected(key: K): boolean {\n    return super.delete(key);\n  }\n\n  // INTERNAL USAGE ONLY\n  public _setUnprotected(key: K, value: V): void {\n    super.set(key, value);\n  }\n}\n"]}
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user