diff options
Diffstat (limited to 'tools')
71 files changed, 1551 insertions, 12555 deletions
diff --git a/tools/@types/lib.gecko.dom.d.ts b/tools/@types/lib.gecko.dom.d.ts index 656ffabf90..bb1e110104 100644 --- a/tools/@types/lib.gecko.dom.d.ts +++ b/tools/@types/lib.gecko.dom.d.ts @@ -9491,6 +9491,10 @@ interface Document extends Node, DocumentOrShadowRoot, FontFaceSource, GeometryU * * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Document/createElement) */ + createElement<K extends keyof HTMLElementTagNameMap>(tagName: K, options?: ElementCreationOptions): HTMLElementTagNameMap[K]; + /** @deprecated */ + createElement<K extends keyof HTMLElementDeprecatedTagNameMap>(tagName: K, options?: ElementCreationOptions): HTMLElementDeprecatedTagNameMap[K]; + createElement(tagName: string, options?: ElementCreationOptions): HTMLElement; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Document/createElementNS) */ createElementNS(namespace: string | null, qualifiedName: string, options?: ElementCreationOptions | string): Element; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Document/createEvent) */ @@ -17898,11 +17902,10 @@ interface IDBFactory { /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/IDBFactory/cmp) */ cmp(first: any, second: any): number; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/IDBFactory/deleteDatabase) */ - deleteDatabase(name: string, options?: IDBOpenDBOptions): IDBOpenDBRequest; + deleteDatabase(name: string): IDBOpenDBRequest; deleteForPrincipal(principal: Principal, name: string, options?: IDBOpenDBOptions): IDBOpenDBRequest; /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/IDBFactory/open) */ - open(name: string, version: number): IDBOpenDBRequest; - open(name: string, options?: IDBOpenDBOptions): IDBOpenDBRequest; + open(name: string, version?: number): IDBOpenDBRequest; openForPrincipal(principal: Principal, name: string, version: number): IDBOpenDBRequest; openForPrincipal(principal: Principal, name: string, options?: IDBOpenDBOptions): IDBOpenDBRequest; } diff --git a/tools/@types/lib.gecko.xpcom.d.ts b/tools/@types/lib.gecko.xpcom.d.ts index ba4d17fef6..891093525a 100644 --- a/tools/@types/lib.gecko.xpcom.d.ts +++ b/tools/@types/lib.gecko.xpcom.d.ts @@ -444,6 +444,7 @@ interface nsIAccessibleRole extends nsISupports { readonly ROLE_STRONG: 136; readonly ROLE_TIME: 137; readonly ROLE_GRID: 138; + readonly ROLE_ROWGROUP: 139; } // https://searchfox.org/mozilla-central/source/accessible/interfaces/nsIAccessibleScrollingEvent.idl @@ -1041,14 +1042,6 @@ interface nsIAutoCompleteObserver extends nsISupports { onSearchResult(search: nsIAutoCompleteSearch, result: nsIAutoCompleteResult): void; } -interface nsIAutoCompleteSearchDescriptor extends nsISupports { - readonly SEARCH_TYPE_DELAYED: 0; - readonly SEARCH_TYPE_IMMEDIATE: 1; - - readonly searchType: u16; - readonly clearingAutoFillSearchesAgain: boolean; -} - // https://searchfox.org/mozilla-central/source/toolkit/components/autocomplete/nsIAutoCompleteSimpleResult.idl interface nsIAutoCompleteSimpleResult extends nsIAutoCompleteResult { @@ -1422,6 +1415,12 @@ interface nsIToolkitChromeRegistry extends nsIXULChromeRegistry { getLocalesForPackage(aPackage: string): nsIUTF8StringEnumerator; } +// https://searchfox.org/mozilla-central/source/tools/code-coverage/nsICodeCoverage.idl + +interface nsICodeCoverage extends nsISupports { + flushCounters(): Promise<any>; +} + // https://searchfox.org/mozilla-central/source/dom/commandhandler/nsICommandManager.idl interface nsICommandManager extends nsISupports { @@ -1651,17 +1650,11 @@ enum LoadCommand { LOAD_CMD_PUSHSTATE = 8, } -enum MetaViewportOverride { - META_VIEWPORT_OVERRIDE_DISABLED = 0, - META_VIEWPORT_OVERRIDE_ENABLED = 1, - META_VIEWPORT_OVERRIDE_NONE = 2, -} - } declare global { -interface nsIDocShell extends nsIDocShellTreeItem, Enums<typeof nsIDocShell.DocShellEnumeratorDirection & typeof nsIDocShell.AppType & typeof nsIDocShell.BusyFlags & typeof nsIDocShell.LoadCommand & typeof nsIDocShell.MetaViewportOverride> { +interface nsIDocShell extends nsIDocShellTreeItem, Enums<typeof nsIDocShell.DocShellEnumeratorDirection & typeof nsIDocShell.AppType & typeof nsIDocShell.BusyFlags & typeof nsIDocShell.LoadCommand> { setCancelContentJSEpoch(aEpoch: i32): void; addState(aData: any, aTitle: string, aURL: string, aReplace: boolean): void; prepareForNewContentModel(): void; @@ -1733,7 +1726,6 @@ interface nsIDocShell extends nsIDocShellTreeItem, Enums<typeof nsIDocShell.DocS setOriginAttributes(aAttrs: any): void; readonly editingSession: nsIEditingSession; readonly browserChild: nsIBrowserChild; - metaViewportOverride: nsIDocShell.MetaViewportOverride; useTrackingProtection: boolean; setColorMatrix(aMatrix: float[]): void; readonly isForceReloading: boolean; @@ -2186,6 +2178,7 @@ declare global { interface nsIScriptableContentIterator extends nsISupports, Enums<typeof nsIScriptableContentIterator.IteratorType> { initWithRootNode(aType: nsIScriptableContentIterator.IteratorType, aRoot: Node): void; initWithRange(aType: nsIScriptableContentIterator.IteratorType, aRange: Range): void; + initWithRangeAllowCrossShadowBoundary(aType: nsIScriptableContentIterator.IteratorType, aRange: Range): void; initWithPositions(aType: nsIScriptableContentIterator.IteratorType, aStartContainer: Node, aStartOffset: u32, aEndContainer: Node, aEndOffset: u32): void; first(): void; last(): void; @@ -2210,8 +2203,9 @@ interface nsISelectionController extends nsISelectionDisplay { readonly SELECTION_FIND: 8; readonly SELECTION_URLSECONDARY: 9; readonly SELECTION_URLSTRIKEOUT: 10; - readonly SELECTION_HIGHLIGHT: 11; - readonly NUM_SELECTIONTYPES: 12; + readonly SELECTION_TARGET_TEXT: 11; + readonly SELECTION_HIGHLIGHT: 12; + readonly NUM_SELECTIONTYPES: 13; readonly SELECTION_ANCHOR_REGION: 0; readonly SELECTION_FOCUS_REGION: 1; readonly SELECTION_WHOLE_SELECTION: 2; @@ -4006,15 +4000,13 @@ interface nsIWebAuthnAutoFillEntry extends nsISupports { interface nsIWebAuthnService extends nsISupports { readonly isUVPAA: boolean; - makeCredential(aTransactionId: u64, browsingContextId: u64, args: nsIWebAuthnRegisterArgs, promise: nsIWebAuthnRegisterPromise): void; - getAssertion(aTransactionId: u64, browsingContextId: u64, args: nsIWebAuthnSignArgs, promise: nsIWebAuthnSignPromise): void; cancel(aTransactionId: u64): void; hasPendingConditionalGet(aBrowsingContextId: u64, aOrigin: string): u64; getAutoFillEntries(aTransactionId: u64): nsIWebAuthnAutoFillEntry[]; selectAutoFillEntry(aTransactionId: u64, aCredentialId: u8[]): void; resumeConditionalGet(aTransactionId: u64): void; pinCallback(aTransactionId: u64, aPin: string): void; - resumeMakeCredential(aTransactionId: u64, aForceNoneAttestation: boolean): void; + setHasAttestationConsent(aTransactionId: u64, aHasConsent: boolean): void; selectionCallback(aTransactionId: u64, aIndex: u64): void; addVirtualAuthenticator(protocol: string, transport: string, hasResidentKey: boolean, hasUserVerification: boolean, isUserConsenting: boolean, isUserVerified: boolean): u64; removeVirtualAuthenticator(authenticatorId: u64): void; @@ -4650,7 +4642,7 @@ interface nsITypeAheadFind extends nsISupports { // https://searchfox.org/mozilla-central/source/toolkit/components/glean/xpcom/nsIFOG.idl interface nsIFOG extends nsISupports { - initializeFOG(aDataPathOverride?: string, aAppIdOverride?: string): void; + initializeFOG(aDataPathOverride?: string, aAppIdOverride?: string, aDisableInternalPings?: boolean): void; registerCustomPings(): void; setLogPings(aEnableLogPings: boolean): void; setTagPings(aDebugTag: string): void; @@ -5304,7 +5296,7 @@ interface mozIOSPreferences extends nsISupports { // https://searchfox.org/mozilla-central/source/toolkit/components/passwordmgr/nsILoginAutoCompleteSearch.idl interface nsILoginAutoCompleteSearch extends nsISupports { - startSearch(aSearchString: string, aPreviousResult: nsIAutoCompleteResult, aElement: HTMLInputElement, aListener: nsIFormAutoCompleteObserver): void; + startSearch(aSearchString: string, aPreviousResult: nsIAutoCompleteResult, aElement: HTMLInputElement, aListener: nsIFormFillCompleteObserver): void; stopSearch(): void; } @@ -5439,6 +5431,7 @@ interface nsIHandlerInfo extends nsISupports { readonly possibleApplicationHandlers: nsIMutableArray; readonly hasDefaultHandler: boolean; readonly defaultDescription: string; + readonly defaultExecutable: nsIFile; launchWithURI(aURI: nsIURI, aBrowsingContext?: BrowsingContext): void; preferredAction: nsHandlerInfoAction; alwaysAskBeforeHandling: boolean; @@ -5467,6 +5460,7 @@ interface nsIHandlerApp extends nsISupports { interface nsILocalHandlerApp extends nsIHandlerApp { executable: nsIFile; readonly parameterCount: u32; + prettyNameAsync(): Promise<any>; clearParameters(): void; appendParameter(param: string): void; getParameter(parameterIndex: u32): string; @@ -6565,12 +6559,6 @@ interface nsIParentChannel extends nsIStreamListener { // https://searchfox.org/mozilla-central/source/netwerk/base/nsIParentRedirectingChannel.idl -interface nsIParentRedirectingChannel extends nsIParentChannel { - startRedirect(newChannel: nsIChannel, redirectFlags: u32, callback: nsIAsyncVerifyRedirectCallback): void; - continueVerification(callback: nsIAsyncVerifyRedirectReadyCallback): void; - completeRedirect(succeeded: nsresult): void; -} - // https://searchfox.org/mozilla-central/source/netwerk/base/nsIPermission.idl interface nsIPermission extends nsISupports { @@ -6601,6 +6589,7 @@ interface nsIPermissionManager extends nsISupports { getAllByTypes(types: string[]): nsIPermission[]; getAllByTypeSince(type: string, since: i64): nsIPermission[]; addFromPrincipal(principal: nsIPrincipal, type: string, permission: u32, expireType?: u32, expireTime?: i64): void; + testAddFromPrincipalByTime(principal: nsIPrincipal, type: string, permission: u32, modificationTime: i64): void; addFromPrincipalAndPersistInPrivateBrowsing(principal: nsIPrincipal, type: string, permission: u32): void; removeFromPrincipal(principal: nsIPrincipal, type: string): void; removePermission(perm: nsIPermission): void; @@ -7090,7 +7079,6 @@ interface nsIStreamLoader extends nsIThreadRetargetableStreamListener { interface nsIStreamTransportService extends nsISupports { createInputTransport(aStream: nsIInputStream, aCloseWhenDone: boolean): nsITransport; - InputAvailable(aStream: nsIInputStream, aCallback: nsIInputAvailableCallback): void; } // https://searchfox.org/mozilla-central/source/netwerk/base/nsISyncStreamListener.idl @@ -7239,7 +7227,6 @@ interface nsIUDPSocket extends nsISupports { init2(aAddr: string, aPort: i32, aPrincipal: nsIPrincipal, aAddressReuse?: boolean): void; close(): void; asyncListen(aListener: nsIUDPSocketListener): void; - syncListen(aListener: nsIUDPSocketSyncListener): void; readonly localAddr: nsINetAddr; readonly port: i32; send(host: string, port: u16, data: u8[]): u32; @@ -8344,6 +8331,7 @@ interface nsIDirIndexParser extends nsIStreamListener { interface nsIStreamConverter extends nsIThreadRetargetableStreamListener { convert(aFromStream: nsIInputStream, aFromType: string, aToType: string, aCtxt: nsISupports): nsIInputStream; asyncConvertData(aFromType: string, aToType: string, aListener: nsIStreamListener, aCtxt: nsISupports): void; + maybeRetarget(request: nsIRequest): void; getConvertedType(aFromType: string, aChannel: nsIChannel): string; } @@ -8738,9 +8726,7 @@ interface nsICertStorage extends nsISupports { setRevocations(revocations: nsIRevocationState[], callback: nsICertStorageCallback): void; getRevocationState(issuer: u8[], serial: u8[], subject: u8[], pubkey: u8[]): i16; setFullCRLiteFilter(filter: u8[], enrolledIssuers: string[], coverage: nsICRLiteCoverage[], callback: nsICertStorageCallback): void; - getCRLiteRevocationState(issuer: u8[], issuerSPKI: u8[], serialNumber: u8[], timestamps: nsICRLiteTimestamp[]): i16; addCRLiteStash(stash: u8[], callback: nsICertStorageCallback): void; - isCertRevokedByStash(issuerSPKI: u8[], serialNumber: u8[]): boolean; addCerts(certs: nsICertInfo[], callback: nsICertStorageCallback): void; removeCertsByHashes(hashes: string[], callback: nsICertStorageCallback): void; findCertsBySubject(subject: u8[]): u8[][]; @@ -9597,7 +9583,7 @@ interface nsINavHistoryQueryOptions extends nsISupports { } interface nsINavHistoryService extends nsISupports { - readonly DATABASE_SCHEMA_VERSION: 76; + readonly DATABASE_SCHEMA_VERSION: 77; readonly TRANSITION_LINK: 1; readonly TRANSITION_TYPED: 2; readonly TRANSITION_BOOKMARK: 3; @@ -9707,6 +9693,7 @@ interface nsIPrefObserver extends nsISupports { interface nsIPrefService extends nsISupports { resetPrefs(): void; savePrefFile(aFile: nsIFile): void; + backupPrefFile(aFile: nsIFile): Promise<any>; getBranch(aPrefRoot: string): nsIPrefBranch; getDefaultBranch(aPrefRoot: string): nsIPrefBranch; readonly dirty: boolean; @@ -9827,17 +9814,6 @@ interface mozISandboxSettings extends nsISupports { readonly contentWin32kLockdownStateString: string; } -// https://searchfox.org/mozilla-central/source/toolkit/components/satchel/nsIFormAutoComplete.idl - -interface nsIFormAutoComplete extends nsISupports { - autoCompleteSearchAsync(aInputName: string, aSearchString: string, aField: HTMLInputElement, aPreviousResult: nsIAutoCompleteResult, aAddDatalist: boolean, aListener: nsIFormAutoCompleteObserver): void; - stopAutoCompleteSearch(): void; -} - -type nsIFormAutoCompleteObserver = Callable<{ - onSearchCompletion(result: nsIAutoCompleteResult): void; -}> - // https://searchfox.org/mozilla-central/source/toolkit/components/satchel/nsIFormFillController.idl interface nsIFormFillController extends nsISupports { @@ -9851,6 +9827,17 @@ interface nsIFormFillController extends nsISupports { showPopup(): void; } +type nsIFormFillCompleteObserver = Callable<{ + onSearchCompletion(result: nsIAutoCompleteResult): void; +}> + +// https://searchfox.org/mozilla-central/source/toolkit/components/satchel/nsIFormHistoryAutoComplete.idl + +interface nsIFormHistoryAutoComplete extends nsISupports { + autoCompleteSearchAsync(aInputName: string, aSearchString: string, aField: HTMLInputElement, aPreviousResult: nsIAutoCompleteResult, aAddDatalist: boolean, aListener: nsIFormFillCompleteObserver): void; + stopAutoCompleteSearch(): void; +} + // https://searchfox.org/mozilla-central/source/services/interfaces/mozIAppServicesLogger.idl interface mozIAppServicesLogger extends nsISupports { @@ -10112,7 +10099,7 @@ interface mozIStorageAsyncConnection extends nsISupports { readonly TRANSACTION_EXCLUSIVE: 2; defaultTransactionType: i32; - readonly variableLimit: i32; + variableLimit: i32; readonly transactionInProgress: boolean; asyncClose(aCallback?: mozIStorageCompletionCallback): void; asyncClone(aReadOnly: boolean, aCallback: mozIStorageCompletionCallback): void; @@ -10785,10 +10772,12 @@ interface nsIClearDataService extends nsISupports { readonly CLEAR_COOKIE_BANNER_EXECUTED_RECORD: 67108864; readonly CLEAR_FINGERPRINTING_PROTECTION_STATE: 134217728; readonly CLEAR_BOUNCE_TRACKING_PROTECTION_STATE: 268435456; + readonly CLEAR_STORAGE_PERMISSIONS: 536870912; readonly CLEAR_ALL: 4294967295; readonly CLEAR_ALL_CACHES: 12648454; readonly CLEAR_DOM_STORAGES: 262784; readonly CLEAR_FORGET_ABOUT_SITE: 534237079; + readonly CLEAR_COOKIES_AND_SITE_DATA: 1007104641; deleteDataFromLocalFiles(aIsUserRequest: boolean, aFlags: u32, aCallback: nsIClearDataCallback): void; deleteDataFromHost(aHost: string, aIsUserRequest: boolean, aFlags: u32, aCallback: nsIClearDataCallback): void; @@ -10847,13 +10836,21 @@ enum Action { eCanceled = 1001, } +enum CancelError { + eUserInitiated = 0, + eNoAgent = 1, + eInvalidAgentSignature = 2, + eErrorOther = 3, +} + } declare global { -interface nsIContentAnalysisResponse extends nsISupports, Enums<typeof nsIContentAnalysisResponse.Action> { +interface nsIContentAnalysisResponse extends nsISupports, Enums<typeof nsIContentAnalysisResponse.Action & typeof nsIContentAnalysisResponse.CancelError> { readonly action: nsIContentAnalysisResponse.Action; readonly shouldAllowContent: boolean; + readonly cancelError: nsIContentAnalysisResponse.CancelError; readonly requestToken: string; acknowledge(aCaa: nsIContentAnalysisAcknowledgement): void; } @@ -10887,6 +10884,7 @@ enum OperationType { eCustomDisplayString = 0, eClipboard = 1, eDroppedText = 2, + eOperationPrint = 3, } } @@ -10899,6 +10897,9 @@ interface nsIContentAnalysisRequest extends nsISupports, Enums<typeof nsIContent readonly operationDisplayString: string; readonly textContent: string; readonly filePath: string; + readonly printDataHandle: u64; + readonly printDataSize: u64; + readonly printerName: string; readonly url: nsIURI; readonly sha256Digest: string; readonly resources: nsIClientDownloadResource[]; @@ -10916,6 +10917,13 @@ interface nsIContentAnalysisCallback extends nsISupports { error(aResult: nsresult): void; } +interface nsIContentAnalysisDiagnosticInfo extends nsISupports { + readonly connectedToAgent: boolean; + readonly agentPath: string; + readonly failedSignatureVerification: boolean; + readonly requestCount: i64; +} + interface nsIContentAnalysis extends nsISupports { readonly isActive: boolean; readonly mightBeActive: boolean; @@ -10926,6 +10934,7 @@ interface nsIContentAnalysis extends nsISupports { respondToWarnDialog(aRequestToken: string, aAllowContent: boolean): void; cancelAllRequests(): void; testOnlySetCACmdLineArg(aVal: boolean): void; + getDiagnosticInfo(): Promise<any>; } // https://searchfox.org/mozilla-central/source/toolkit/components/cookiebanners/nsIClickRule.idl @@ -11017,6 +11026,11 @@ interface nsICookieBannerService extends nsISupports, Enums<typeof nsICookieBann resetDomainTelemetryRecord(aDomain?: string): void; } +// https://searchfox.org/mozilla-central/source/toolkit/components/cookiebanners/nsICookieBannerTelemetryService.idl + +interface nsICookieBannerTelemetryService extends nsISupports { +} + // https://searchfox.org/mozilla-central/source/toolkit/components/cookiebanners/nsICookieRule.idl interface nsICookieRule extends nsISupports { @@ -11095,6 +11109,13 @@ interface nsIRFPService extends nsISupports { testGenerateRandomKey(aChannel: nsIChannel): u8[]; } +// https://searchfox.org/mozilla-central/source/toolkit/components/resistfingerprinting/nsIUserCharacteristicsPageService.idl + +interface nsIUserCharacteristicsPageService extends nsISupports { + createContentPage(): Promise<any>; + pageLoaded(browsingContext: BrowsingContext, data: any): void; +} + // https://searchfox.org/mozilla-central/source/toolkit/components/search/nsISearchService.idl interface nsISearchSubmission extends nsISupports { @@ -11184,6 +11205,7 @@ interface nsISearchService extends nsISupports { maybeSetAndOverrideDefault(extension: any): Promise<any>; getDefaultEngineInfo(): any; parseSubmissionURL(url: string): nsISearchParseSubmissionResult; + getAlternateDomains(domain: string): string[]; } // https://searchfox.org/mozilla-central/source/toolkit/components/shell/nsIToolkitShellService.idl @@ -11192,6 +11214,12 @@ interface nsIToolkitShellService extends nsISupports { isDefaultApplication(): boolean; } +// https://searchfox.org/mozilla-central/source/toolkit/components/terminator/nsITerminatorTest.idl + +interface nsITerminatorTest extends nsISupports { + getTicksForShutdownPhases(): any; +} + // https://searchfox.org/mozilla-central/source/toolkit/components/xulstore/nsIXULStore.idl interface nsIXULStore extends nsISupports { @@ -11992,6 +12020,7 @@ interface nsIWebBrowserPrint extends nsISupports { readonly rawNumPages: i32; readonly printPreviewNumPages: i32; readonly printPreviewCurrentPageNumber: i32; + closeWindowAfterPrint: boolean; printPreviewScrollToPage(aNavType: i16, aPageNum: i32): void; exitPrintPreview(): void; } @@ -12178,7 +12207,6 @@ interface nsIBaseWindow extends nsISupports { setPositionAndSize(x: i32, y: i32, cx: i32, cy: i32, flags: u32): void; getPositionAndSize(x: OutParam<i32>, y: OutParam<i32>, cx: OutParam<i32>, cy: OutParam<i32>): void; repaint(force: boolean): void; - parentNativeWindow: nativeWindow; readonly nativeHandle: string; visibility: boolean; enabled: boolean; @@ -12498,6 +12526,8 @@ interface nsIGfxInfo extends nsISupports, Enums<typeof nsIGfxInfo.FontVisibility readonly AzureCanvasBackend: string; readonly AzureContentBackend: string; readonly usingGPUProcess: boolean; + readonly usingRemoteCanvas: boolean; + readonly usingAcceleratedCanvas: boolean; readonly hasBattery: boolean; readonly DWriteVersion: string; readonly cleartypeParameters: string; @@ -13392,7 +13422,6 @@ interface nsIClassInfo extends nsISupports { readonly RESERVED: 2147483648; readonly interfaces: nsID[]; - getScriptableHelper(): nsIXPCScriptable; readonly contractID: string; readonly classDescription: string; readonly classID: nsID; @@ -13925,7 +13954,7 @@ interface nsIConverterInputStream extends nsIUnicharInputStream { readonly DEFAULT_REPLACEMENT_CHARACTER: 65533; readonly ERRORS_ARE_FATAL: 0; - init(aStream: nsIInputStream, aCharset: string, aBufferSize: i32, aReplacementChar: char16_t): void; + init(aStream: nsIInputStream, aCharset: string, aBufferSize: i32, aReplacementChar: u16): void; } // https://searchfox.org/mozilla-central/source/xpcom/io/nsIConverterOutputStream.idl @@ -14198,7 +14227,7 @@ interface nsIUnicharLineInputStream extends nsISupports { // https://searchfox.org/mozilla-central/source/xpcom/io/nsIUnicharOutputStream.idl interface nsIUnicharOutputStream extends nsISupports { - write(aCount: u32, c: char16_t[]): boolean; + write(aCount: u32, c: u16[]): boolean; writeString(str: string): boolean; flush(): void; close(): void; @@ -14571,12 +14600,6 @@ interface nsIThread extends nsISerialEventTarget, Enums<typeof nsIThread.QoSPrio // https://searchfox.org/mozilla-central/source/xpcom/threads/nsIThreadInternal.idl -interface nsIThreadInternal extends nsIThread { - observer: nsIThreadObserver; - addObserver(observer: nsIThreadObserver): void; - removeObserver(observer: nsIThreadObserver): void; -} - // https://searchfox.org/mozilla-central/source/xpcom/threads/nsIThreadManager.idl type nsINestedEventLoopCondition = Callable<{ @@ -14725,7 +14748,6 @@ interface nsIXPCComponents_Utils extends nsISupports { waiveXrays(aVal: any): any; unwaiveXrays(aVal: any): any; getClassName(aObj: any, aUnwrap: boolean): string; - getDOMClassInfo(aClassName: string): nsIClassInfo; getIncumbentGlobal(callback?: any): any; getDebugName(obj: any): string; getWatchdogTimestamp(aCategory: string): PRTime; @@ -14920,6 +14942,11 @@ interface nsIXPCTestUtils extends nsISupports { doubleWrapFunction(f: nsIXPCTestFunctionInterface): nsIXPCTestFunctionInterface; } +interface nsIXPCTestTypeScript extends nsISupports { + exposedProp: i32; + exposedMethod(arg: i32): void; +} + // https://searchfox.org/mozilla-central/source/dom/xul/nsIBrowserController.idl interface nsIBrowserController extends nsISupports { @@ -15059,7 +15086,6 @@ interface nsIXPCComponents_Interfaces { nsIAutoCompleteResult: nsJSIID<nsIAutoCompleteResult>; nsIAutoCompleteSearch: nsJSIID<nsIAutoCompleteSearch>; nsIAutoCompleteObserver: nsJSIID<nsIAutoCompleteObserver>; - nsIAutoCompleteSearchDescriptor: nsJSIID<nsIAutoCompleteSearchDescriptor>; nsIAutoCompleteSimpleResult: nsJSIID<nsIAutoCompleteSimpleResult>; nsIAutoCompleteSimpleResultListener: nsJSIID<nsIAutoCompleteSimpleResultListener>; nsIAutoCompleteSimpleSearch: nsJSIID<nsIAutoCompleteSimpleSearch>; @@ -15083,6 +15109,7 @@ interface nsIXPCComponents_Interfaces { nsIChromeRegistry: nsJSIID<nsIChromeRegistry>; nsIXULChromeRegistry: nsJSIID<nsIXULChromeRegistry>; nsIToolkitChromeRegistry: nsJSIID<nsIToolkitChromeRegistry>; + nsICodeCoverage: nsJSIID<nsICodeCoverage>; nsICommandManager: nsJSIID<nsICommandManager>; nsICommandParams: nsJSIID<nsICommandParams>; nsIControllerCommand: nsJSIID<nsIControllerCommand>; @@ -15101,7 +15128,7 @@ interface nsIXPCComponents_Interfaces { nsIDefaultAgent: nsJSIID<nsIDefaultAgent>; nsIWindowsMutex: nsJSIID<nsIWindowsMutex>; nsIWindowsMutexFactory: nsJSIID<nsIWindowsMutexFactory>; - nsIDocShell: nsJSIID<nsIDocShell, typeof nsIDocShell.DocShellEnumeratorDirection & typeof nsIDocShell.AppType & typeof nsIDocShell.BusyFlags & typeof nsIDocShell.LoadCommand & typeof nsIDocShell.MetaViewportOverride>; + nsIDocShell: nsJSIID<nsIDocShell, typeof nsIDocShell.DocShellEnumeratorDirection & typeof nsIDocShell.AppType & typeof nsIDocShell.BusyFlags & typeof nsIDocShell.LoadCommand>; nsIDocShellTreeItem: nsJSIID<nsIDocShellTreeItem>; nsIDocShellTreeOwner: nsJSIID<nsIDocShellTreeOwner>; nsIDocumentLoaderFactory: nsJSIID<nsIDocumentLoaderFactory>; @@ -15467,7 +15494,6 @@ interface nsIXPCComponents_Interfaces { nsINetworkPredictorVerifier: nsJSIID<nsINetworkPredictorVerifier>; nsINullChannel: nsJSIID<nsINullChannel>; nsIParentChannel: nsJSIID<nsIParentChannel>; - nsIParentRedirectingChannel: nsJSIID<nsIParentRedirectingChannel>; nsIPermission: nsJSIID<nsIPermission>; nsIPermissionManager: nsJSIID<nsIPermissionManager>; nsIPrivateBrowsingChannel: nsJSIID<nsIPrivateBrowsingChannel>; @@ -15726,9 +15752,9 @@ interface nsIXPCComponents_Interfaces { nsIApplicationReputationQuery: nsJSIID<nsIApplicationReputationQuery>; nsIApplicationReputationCallback: nsJSIID<nsIApplicationReputationCallback>; mozISandboxSettings: nsJSIID<mozISandboxSettings>; - nsIFormAutoComplete: nsJSIID<nsIFormAutoComplete>; - nsIFormAutoCompleteObserver: nsJSIID<nsIFormAutoCompleteObserver>; nsIFormFillController: nsJSIID<nsIFormFillController>; + nsIFormFillCompleteObserver: nsJSIID<nsIFormFillCompleteObserver>; + nsIFormHistoryAutoComplete: nsJSIID<nsIFormHistoryAutoComplete>; mozIAppServicesLogger: nsJSIID<mozIAppServicesLogger>; mozIBridgedSyncEngineCallback: nsJSIID<mozIBridgedSyncEngineCallback>; mozIBridgedSyncEngineApplyCallback: nsJSIID<mozIBridgedSyncEngineApplyCallback>; @@ -15802,16 +15828,18 @@ interface nsIXPCComponents_Interfaces { nsIClearDataService: nsJSIID<nsIClearDataService>; nsIClearDataCallback: nsJSIID<nsIClearDataCallback>; nsIContentAnalysisAcknowledgement: nsJSIID<nsIContentAnalysisAcknowledgement, typeof nsIContentAnalysisAcknowledgement.Result & typeof nsIContentAnalysisAcknowledgement.FinalAction>; - nsIContentAnalysisResponse: nsJSIID<nsIContentAnalysisResponse, typeof nsIContentAnalysisResponse.Action>; + nsIContentAnalysisResponse: nsJSIID<nsIContentAnalysisResponse, typeof nsIContentAnalysisResponse.Action & typeof nsIContentAnalysisResponse.CancelError>; nsIClientDownloadResource: nsJSIID<nsIClientDownloadResource>; nsIContentAnalysisRequest: nsJSIID<nsIContentAnalysisRequest, typeof nsIContentAnalysisRequest.AnalysisType & typeof nsIContentAnalysisRequest.OperationType>; nsIContentAnalysisResult: nsJSIID<nsIContentAnalysisResult>; nsIContentAnalysisCallback: nsJSIID<nsIContentAnalysisCallback>; + nsIContentAnalysisDiagnosticInfo: nsJSIID<nsIContentAnalysisDiagnosticInfo>; nsIContentAnalysis: nsJSIID<nsIContentAnalysis>; nsIClickRule: nsJSIID<nsIClickRule, typeof nsIClickRule.RunContext>; nsICookieBannerListService: nsJSIID<nsICookieBannerListService>; nsICookieBannerRule: nsJSIID<nsICookieBannerRule>; nsICookieBannerService: nsJSIID<nsICookieBannerService, typeof nsICookieBannerService.Modes>; + nsICookieBannerTelemetryService: nsJSIID<nsICookieBannerTelemetryService>; nsICookieRule: nsJSIID<nsICookieRule>; nsICrashService: nsJSIID<nsICrashService>; nsIFinalizationWitnessService: nsJSIID<nsIFinalizationWitnessService>; @@ -15822,11 +15850,13 @@ interface nsIXPCComponents_Interfaces { nsIFingerprintingOverride: nsJSIID<nsIFingerprintingOverride>; nsIFingerprintingWebCompatService: nsJSIID<nsIFingerprintingWebCompatService>; nsIRFPService: nsJSIID<nsIRFPService>; + nsIUserCharacteristicsPageService: nsJSIID<nsIUserCharacteristicsPageService>; nsISearchSubmission: nsJSIID<nsISearchSubmission>; nsISearchEngine: nsJSIID<nsISearchEngine>; nsISearchParseSubmissionResult: nsJSIID<nsISearchParseSubmissionResult>; nsISearchService: nsJSIID<nsISearchService>; nsIToolkitShellService: nsJSIID<nsIToolkitShellService>; + nsITerminatorTest: nsJSIID<nsITerminatorTest>; nsIXULStore: nsJSIID<nsIXULStore>; nsITransaction: nsJSIID<nsITransaction>; nsITransactionManager: nsJSIID<nsITransactionManager>; @@ -16112,7 +16142,6 @@ interface nsIXPCComponents_Interfaces { nsISerialEventTarget: nsJSIID<nsISerialEventTarget>; nsISupportsPriority: nsJSIID<nsISupportsPriority>; nsIThread: nsJSIID<nsIThread, typeof nsIThread.QoSPriority>; - nsIThreadInternal: nsJSIID<nsIThreadInternal>; nsINestedEventLoopCondition: nsJSIID<nsINestedEventLoopCondition>; nsIThreadManager: nsJSIID<nsIThreadManager>; nsIThreadShutdown: nsJSIID<nsIThreadShutdown>; @@ -16142,6 +16171,7 @@ interface nsIXPCComponents_Interfaces { nsIXPCTestReturnCodeChild: nsJSIID<nsIXPCTestReturnCodeChild>; nsIXPCTestFunctionInterface: nsJSIID<nsIXPCTestFunctionInterface>; nsIXPCTestUtils: nsJSIID<nsIXPCTestUtils>; + nsIXPCTestTypeScript: nsJSIID<nsIXPCTestTypeScript>; nsIBrowserController: nsJSIID<nsIBrowserController>; nsIController: nsJSIID<nsIController>; nsICommandController: nsJSIID<nsICommandController>; @@ -16166,7 +16196,6 @@ type PRTime = i64; type PivotMoveReason = i16; type PredictorLearnReason = u32; type PredictorPredictReason = u32; -type char16_t = u16; type nsBitsErrorAction = i32; type nsBitsErrorStage = i32; type nsBitsErrorType = i32; @@ -16182,35 +16211,53 @@ type nsServerSocketFlag = u32; type nsSuspendedTypes = u32; type nsTaskbarProgressState = i32; type nsViewID = u64; -type nsresult = u32; - -/** - * Gecko XPCOM builtins and utility types. - */ /** - * Generic IDs are created by most code which passes a nsID to js. - * https://searchfox.org/mozilla-central/source/js/xpconnect/src/XPCJSID.cpp#24 + * Gecko XPCOM builtins. */ -interface nsID<uuid = string> { - readonly number: uuid; +declare global { + /** + * Generic IDs are created by most code which passes a nsID to js. + * https://searchfox.org/mozilla-central/source/js/xpconnect/src/XPCJSID.cpp#24 + */ + interface nsID<uuid = string> { + readonly number: uuid; + } + + /** + * In addition to nsID, interface IIDs support instanceof type guards, + * and expose constants defined on the class, including variants from enums. + * https://searchfox.org/mozilla-central/source/js/xpconnect/src/XPCJSID.cpp#45 + */ + type nsJSIID<iface, enums = {}> = nsID & Constants<iface> & enums & { + new (_: never): void; + prototype: iface; + } + + /** A union type of all known interface IIDs. */ + type nsIID = nsIXPCComponents_Interfaces[keyof nsIXPCComponents_Interfaces]; + + /** A generic to resolve QueryInterface return type from a nsIID. */ + export type nsQIResult<iid> = iid extends { prototype: infer U } ? U : never; + + /** u32 */ + type nsresult = u32; + + // Numeric typedefs, useful as a quick reference in method signatures. + type double = number; + type float = number; + type i16 = number; + type i32 = number; + type i64 = number; + type u16 = number; + type u32 = number; + type u64 = number; + type u8 = number; } /** - * In addition to nsID, interface IIDs support instanceof type guards, - * and expose constants defined on the class, including variants from enums. - * https://searchfox.org/mozilla-central/source/js/xpconnect/src/XPCJSID.cpp#44 + * XPCOM utility types. */ -type nsJSIID<iface, enums = {}> = nsID & Constants<iface> & enums & { - new (_: never): void; - prototype: iface; -} - -/** A union of all known IIDs. */ -type nsIID = nsIXPCComponents_Interfaces[keyof nsIXPCComponents_Interfaces]; - -/** A generic to resolve QueryInterface return type from a nsID (or nsIID). */ -export type nsQIResult<iid> = iid extends { prototype: infer U } ? U : never; /** XPCOM inout param is passed in as a js object with a value property. */ type InOutParam<T> = { value: T }; @@ -16218,7 +16265,7 @@ type InOutParam<T> = { value: T }; /** XPCOM out param is written to the passed in object's value property. */ type OutParam<T> = { value?: T }; -/** A named type for interfaces to inherit from enums. */ +/** A named type to enable interfaces to inherit from enums. */ type Enums<enums> = enums; /** Callable accepts either form of a [function] interface. */ @@ -16230,42 +16277,4 @@ type Constants<T> = { [K in keyof T as IfConst<K, T[K]>]: T[K] }; /** Resolves only for keys K whose corresponding type T is a narrow number. */ type IfConst<K, T> = T extends number ? (number extends T ? never : K) : never; -declare global { - // Until we have [ChromeOnly] webidl. - interface BrowsingContext {} - interface ContentFrameMessageManager {} - interface DOMRequest {} - interface FrameLoader {} - interface JSProcessActorChild {} - interface JSProcessActorParent {} - interface TreeColumn {} - interface WebExtensionContentScript {} - interface WebExtensionPolicy {} - interface WindowGlobalParent {} - interface WindowContext {} - interface XULTreeElement {} -} - -// Non-scriptable interfaces referenced from scriptable ones. -interface nsIAsyncVerifyRedirectReadyCallback {} -interface nsICRLiteTimestamp {} -interface nsIInputAvailableCallback {} -interface nsIScriptElement {} -interface nsIThreadObserver {} -interface nsIUDPSocketSyncListener {} -interface nsIWebAuthnRegisterArgs {} -interface nsIWebAuthnRegisterPromise {} -interface nsIWebAuthnSignArgs {} -interface nsIWebAuthnSignPromise {} -interface nsIXPCScriptable {} - -// Typedefs useful as a quick reference in method signatures. -type double = number; -type float = number; -type i16 = number; -type i32 = number; -type i64 = number; -type u16 = number; -type u32 = number; -type u64 = number; -type u8 = number; +export {}; diff --git a/tools/browsertime/mach_commands.py b/tools/browsertime/mach_commands.py index f0e90445e9..a75a4d9b5d 100644 --- a/tools/browsertime/mach_commands.py +++ b/tools/browsertime/mach_commands.py @@ -44,7 +44,7 @@ import time import mozpack.path as mozpath from mach.decorators import Command, CommandArgument from mozbuild.base import BinaryNotFoundException, MachCommandBase -from mozbuild.util import mkdir +from mozbuild.dirutils import mkdir from six import StringIO AUTOMATION = "MOZ_AUTOMATION" in os.environ diff --git a/tools/esmify/import-to-import_esmodule.js b/tools/esmify/import-to-import_esmodule.js deleted file mode 100644 index d8e0aee5bb..0000000000 --- a/tools/esmify/import-to-import_esmodule.js +++ /dev/null @@ -1,472 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -// jscodeshift rule to replace import calls for JSM with import calls for ESM -// or static import for ESM. - -/* eslint-env node */ - -const _path = require("path"); -const { isESMified } = require(_path.resolve(__dirname, "./is-esmified.js")); -const { - jsmExtPattern, - esmifyExtension, - isIdentifier, - isString, - warnForPath, - getPrevStatement, - getNextStatement, - isMemberExpressionWithIdentifiers, - rewriteMemberExpressionWithIdentifiers, - createMemberExpressionWithIdentifiers, -} = require(_path.resolve(__dirname, "./utils.js")); -const { - isImportESModuleCall, - replaceImportESModuleCall, - tryReplacingWithStaticImport, -} = require(_path.resolve(__dirname, "./static-import.js")); - -module.exports = function (fileInfo, api) { - const { jscodeshift } = api; - const root = jscodeshift(fileInfo.source); - doTranslate(fileInfo.path, jscodeshift, root); - return root.toSource({ lineTerminator: "\n" }); -}; - -module.exports.doTranslate = doTranslate; - -function isESMifiedAndTarget(resourceURI) { - const files = []; - if (!isESMified(resourceURI, files)) { - return false; - } - - if ("ESMIFY_TARGET_PREFIX" in process.env) { - const targetPrefix = process.env.ESMIFY_TARGET_PREFIX; - for (const esm of files) { - if (esm.startsWith(targetPrefix)) { - return true; - } - } - - return false; - } - - return true; -} - -const importCalls = [ - { - from: ["Cu", "import"], - to: ["ChromeUtils", "importESModule"], - }, - { - from: ["ChromeUtils", "import"], - to: ["ChromeUtils", "importESModule"], - }, - { - from: ["SpecialPowers", "ChromeUtils", "import"], - to: ["SpecialPowers", "ChromeUtils", "importESModule"], - }, -]; - -const singleLazyGetterCalls = [ - { - from: ["ChromeUtils", "defineModuleGetter"], - to: ["ChromeUtils", "defineESModuleGetters"], - }, - { - from: ["SpecialPowers", "ChromeUtils", "defineModuleGetter"], - to: ["SpecialPowers", "ChromeUtils", "defineESModuleGetters"], - }, -]; - -const multiLazyGettersCalls = [ - { - from: ["XPCOMUtils", "defineLazyModuleGetters"], - to: ["ChromeUtils", "defineESModuleGetters"], - }, -]; - -function isMemberExpressionMatchingPatterns(node, patterns) { - for (const item of patterns) { - if (isMemberExpressionWithIdentifiers(node, item.from)) { - return item; - } - } - - return null; -} - -function replaceImportCall(inputFile, jscodeshift, path, rewriteItem) { - if (path.node.arguments.length !== 1) { - warnForPath(inputFile, path, `import call should have only one argument`); - return; - } - - const resourceURINode = path.node.arguments[0]; - if (!isString(resourceURINode)) { - warnForPath(inputFile, path, `resource URI should be a string`); - return; - } - - const resourceURI = resourceURINode.value; - if (!resourceURI.match(jsmExtPattern)) { - warnForPath(inputFile, path, `Non-jsm: ${resourceURI}`); - return; - } - - if (!isESMifiedAndTarget(resourceURI)) { - return; - } - - if ( - !tryReplacingWithStaticImport( - jscodeshift, - inputFile, - path, - resourceURINode, - false - ) - ) { - rewriteMemberExpressionWithIdentifiers(path.node.callee, rewriteItem.to); - resourceURINode.value = esmifyExtension(resourceURI); - } -} - -// Find `ChromeUtils.defineESModuleGetters` or variant statement specified by -// expectedIDs, adjacent to `path` which uses the same target object. -function findDefineESModuleGettersStmt(path, expectedIDs) { - // `path` must be top-level. - if (path.parent.node.type !== "ExpressionStatement") { - return null; - } - - if (path.parent.parent.node.type !== "Program") { - return null; - } - - // Get previous or next statement with ChromeUtils.defineESModuleGetters. - let callStmt; - const prev = getPrevStatement(path.parent); - if ( - prev && - prev.type === "ExpressionStatement" && - prev.expression.type === "CallExpression" && - isMemberExpressionWithIdentifiers(prev.expression.callee, expectedIDs) - ) { - callStmt = prev; - } else { - const next = getNextStatement(path.parent); - if ( - next && - next.type === "ExpressionStatement" && - next.expression.type === "CallExpression" && - isMemberExpressionWithIdentifiers(next.expression.callee, expectedIDs) - ) { - callStmt = next; - } else { - return null; - } - } - - const call = callStmt.expression; - - if (call.arguments.length !== 2) { - return null; - } - - const modulesNode = call.arguments[1]; - if (modulesNode.type !== "ObjectExpression") { - return null; - } - - // Check if the target object is same. - if ( - path.node.arguments[0].type === "ThisExpression" && - call.arguments[0].type === "ThisExpression" - ) { - return callStmt; - } - - if ( - path.node.arguments[0].type === "Identifier" && - call.arguments[0].type === "Identifier" && - path.node.arguments[0].name === call.arguments[0].name - ) { - return callStmt; - } - - return null; -} - -function getPropKeyString(prop) { - if (prop.key.type === "Identifier") { - return prop.key.name; - } - - if (prop.key.type === "Literal") { - return prop.key.value.toString(); - } - - return ""; -} - -function sortProps(obj) { - obj.properties.sort((a, b) => { - return getPropKeyString(a) < getPropKeyString(b) ? -1 : 1; - }); -} - -// Move comments above `nodeFrom` before `nodeTo`. -function moveComments(nodeTo, nodeFrom) { - if (!nodeFrom.comments) { - return; - } - if (nodeTo.comments) { - nodeTo.comments = [...nodeTo.comments, ...nodeFrom.comments]; - } else { - nodeTo.comments = nodeFrom.comments; - } - nodeFrom.comments = []; -} - -function replaceLazyGetterCall(inputFile, jscodeshift, path, rewriteItem) { - if (path.node.arguments.length !== 3) { - warnForPath(inputFile, path, `lazy getter call should have 3 arguments`); - return; - } - - const nameNode = path.node.arguments[1]; - if (!isString(nameNode)) { - warnForPath(inputFile, path, `name should be a string`); - return; - } - - const resourceURINode = path.node.arguments[2]; - if (!isString(resourceURINode)) { - warnForPath(inputFile, path, `resource URI should be a string`); - return; - } - - const resourceURI = resourceURINode.value; - if (!resourceURI.match(jsmExtPattern)) { - warnForPath(inputFile, path, `Non-js/jsm: ${resourceURI}`); - return; - } - - if (!isESMifiedAndTarget(resourceURI)) { - return; - } - - resourceURINode.value = esmifyExtension(resourceURI); - const prop = jscodeshift.property( - "init", - jscodeshift.identifier(nameNode.value), - resourceURINode - ); - - const callStmt = findDefineESModuleGettersStmt(path, rewriteItem.to); - if (callStmt) { - // Move a property to existing ChromeUtils.defineESModuleGetters call. - - moveComments(callStmt, path.parent.node); - path.parent.prune(); - - callStmt.expression.arguments[1].properties.push(prop); - sortProps(callStmt.expression.arguments[1]); - } else { - // Convert this call into ChromeUtils.defineESModuleGetters. - - rewriteMemberExpressionWithIdentifiers(path.node.callee, rewriteItem.to); - path.node.arguments = [ - path.node.arguments[0], - jscodeshift.objectExpression([prop]), - ]; - } -} - -function replaceLazyGettersCall(inputFile, jscodeshift, path, rewriteItem) { - if (path.node.arguments.length !== 2) { - warnForPath(inputFile, path, `lazy getters call should have 2 arguments`); - return; - } - - const modulesNode = path.node.arguments[1]; - if (modulesNode.type !== "ObjectExpression") { - warnForPath(inputFile, path, `modules parameter should be an object`); - return; - } - - const esmProps = []; - const jsmProps = []; - - for (const prop of modulesNode.properties) { - const resourceURINode = prop.value; - if (!isString(resourceURINode)) { - warnForPath(inputFile, path, `resource URI should be a string`); - jsmProps.push(prop); - continue; - } - - const resourceURI = resourceURINode.value; - if (!resourceURI.match(jsmExtPattern)) { - warnForPath(inputFile, path, `Non-js/jsm: ${resourceURI}`); - jsmProps.push(prop); - continue; - } - - if (!isESMifiedAndTarget(resourceURI)) { - jsmProps.push(prop); - continue; - } - - esmProps.push(prop); - } - - if (esmProps.length === 0) { - return; - } - - let callStmt = findDefineESModuleGettersStmt(path, rewriteItem.to); - if (jsmProps.length === 0) { - if (callStmt) { - // Move all properties to existing ChromeUtils.defineESModuleGetters call. - - moveComments(callStmt, path.parent.node); - path.parent.prune(); - - for (const prop of esmProps) { - const resourceURINode = prop.value; - resourceURINode.value = esmifyExtension(resourceURINode.value); - callStmt.expression.arguments[1].properties.push(prop); - } - sortProps(callStmt.expression.arguments[1]); - } else { - // Convert this call into ChromeUtils.defineESModuleGetters. - - rewriteMemberExpressionWithIdentifiers(path.node.callee, rewriteItem.to); - for (const prop of esmProps) { - const resourceURINode = prop.value; - resourceURINode.value = esmifyExtension(resourceURINode.value); - } - } - } else { - // Move some properties to ChromeUtils.defineESModuleGetters. - - if (path.parent.node.type !== "ExpressionStatement") { - warnForPath(inputFile, path, `lazy getters call in unexpected context`); - return; - } - - if (!callStmt) { - callStmt = jscodeshift.expressionStatement( - jscodeshift.callExpression( - createMemberExpressionWithIdentifiers(jscodeshift, rewriteItem.to), - [path.node.arguments[0], jscodeshift.objectExpression([])] - ) - ); - path.parent.insertBefore(callStmt); - } - - moveComments(callStmt, path.parent.node); - - for (const prop of esmProps) { - const resourceURINode = prop.value; - resourceURINode.value = esmifyExtension(resourceURINode.value); - callStmt.expression.arguments[1].properties.push(prop); - } - sortProps(callStmt.expression.arguments[1]); - - path.node.arguments[1].properties = jsmProps; - } -} - -function getProp(obj, key) { - if (obj.type !== "ObjectExpression") { - return null; - } - - for (const prop of obj.properties) { - if (prop.computed) { - continue; - } - - if (!prop.key) { - continue; - } - - if (isIdentifier(prop.key, key)) { - return prop; - } - } - - return null; -} - -function tryReplaceActorDefinition(inputFile, path, name) { - const obj = path.node; - - const prop = getProp(obj, name); - if (!prop) { - return; - } - - const moduleURIProp = getProp(prop.value, "moduleURI"); - if (!moduleURIProp) { - return; - } - - if (!isString(moduleURIProp.value)) { - warnForPath(inputFile, path, `${name} moduleURI should be a string`); - return; - } - - const moduleURI = moduleURIProp.value.value; - if (!moduleURI.match(jsmExtPattern)) { - warnForPath(inputFile, path, `${name} Non-js/jsm: ${moduleURI}`); - return; - } - - if (!isESMifiedAndTarget(moduleURI)) { - return; - } - - moduleURIProp.key.name = "esModuleURI"; - moduleURIProp.value.value = esmifyExtension(moduleURI); -} - -function doTranslate(inputFile, jscodeshift, root) { - root.find(jscodeshift.CallExpression).forEach(path => { - if (isImportESModuleCall(path.node)) { - replaceImportESModuleCall(inputFile, jscodeshift, path, false); - return; - } - - const callee = path.node.callee; - - let item; - item = isMemberExpressionMatchingPatterns(callee, importCalls); - if (item) { - replaceImportCall(inputFile, jscodeshift, path, item); - return; - } - - item = isMemberExpressionMatchingPatterns(callee, singleLazyGetterCalls); - if (item) { - replaceLazyGetterCall(inputFile, jscodeshift, path, item); - return; - } - - item = isMemberExpressionMatchingPatterns(callee, multiLazyGettersCalls); - if (item) { - replaceLazyGettersCall(inputFile, jscodeshift, path, item); - } - }); - - root.find(jscodeshift.ObjectExpression).forEach(path => { - tryReplaceActorDefinition(inputFile, path, "parent"); - tryReplaceActorDefinition(inputFile, path, "child"); - }); -} diff --git a/tools/esmify/is-esmified.js b/tools/esmify/is-esmified.js deleted file mode 100644 index 978e804f4b..0000000000 --- a/tools/esmify/is-esmified.js +++ /dev/null @@ -1,81 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -// A utility to check if given JSM is already ESM-ified. - -/* eslint-env node */ - -const fs = require("fs"); -const _path = require("path"); -const { esmifyExtension } = require(_path.resolve(__dirname, "./utils.js")); - -let json_map; -if (process.env.ESMIFY_MAP_JSON) { - json_map = _path.resolve(process.env.ESMIFY_MAP_JSON); -} else { - json_map = _path.resolve(__dirname, "./map.json"); -} -const uri_map = JSON.parse(fs.readFileSync(json_map)); -const esm_uri_map = generateESMURIMap(uri_map); - -function generateESMURIMap(jsm_map) { - const esm_map = {}; - - for (let [uri, jsms] of Object.entries(jsm_map)) { - if (typeof jsms === "string") { - jsms = [jsms]; - } - esm_map[esmifyExtension(uri)] = jsms.map(esmifyExtension); - } - - return esm_map; -} - -function isESMifiedSlow(resourceURI) { - if (!(resourceURI in uri_map)) { - console.warn(`WARNING: Unknown module: ${resourceURI}`); - return { result: false, jsms: [] }; - } - - let jsms = uri_map[resourceURI]; - if (typeof jsms === "string") { - jsms = [jsms]; - } - - const prefix = "../../"; - for (const jsm of jsms) { - if (fs.existsSync(prefix + jsm)) { - return { result: false, jsms }; - } - const esm = esmifyExtension(jsm); - if (!fs.existsSync(prefix + esm)) { - return { result: false, jsms }; - } - } - - return { result: true, jsms }; -} - -const isESMified_memo = {}; -function isESMified(resourceURI, files) { - if (!(resourceURI in isESMified_memo)) { - isESMified_memo[resourceURI] = isESMifiedSlow(resourceURI); - } - - for (const jsm of isESMified_memo[resourceURI].jsms) { - files.push(esmifyExtension(jsm)); - } - - return isESMified_memo[resourceURI].result; -} - -function getESMFiles(resourceURI) { - if (resourceURI in esm_uri_map) { - return esm_uri_map[resourceURI]; - } - return []; -} - -exports.isESMified = isESMified; -exports.getESMFiles = getESMFiles; diff --git a/tools/esmify/mach_commands.py b/tools/esmify/mach_commands.py deleted file mode 100644 index 7b72c7b0e3..0000000000 --- a/tools/esmify/mach_commands.py +++ /dev/null @@ -1,908 +0,0 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -import json -import logging -import os -import pathlib -import re -import subprocess -import sys - -from mach.decorators import Command, CommandArgument - - -def path_sep_to_native(path_str): - """Make separators in the path OS native.""" - return pathlib.os.sep.join(path_str.split("/")) - - -def path_sep_from_native(path): - """Make separators in the path OS native.""" - return "/".join(str(path).split(pathlib.os.sep)) - - -excluded_from_convert_prefix = list( - map( - path_sep_to_native, - [ - # Testcases for actors. - "toolkit/actors/TestProcessActorChild.jsm", - "toolkit/actors/TestProcessActorParent.jsm", - "toolkit/actors/TestWindowChild.jsm", - "toolkit/actors/TestWindowParent.jsm", - "js/xpconnect/tests/unit/", - # Testcase for build system. - "python/mozbuild/mozbuild/test/", - ], - ) -) - - -def is_excluded_from_convert(path): - """Returns true if the JSM file shouldn't be converted to ESM.""" - path_str = str(path) - for prefix in excluded_from_convert_prefix: - if path_str.startswith(prefix): - return True - - return False - - -excluded_from_imports_prefix = list( - map( - path_sep_to_native, - [ - # Vendored or auto-generated files. - "browser/components/pocket/content/panels/js/vendor.bundle.js", - "devtools/client/debugger/dist/parser-worker.js", - "devtools/client/debugger/test/mochitest/examples/react/build/main.js", - "devtools/client/debugger/test/mochitest/examples/sourcemapped/polyfill-bundle.js", - "devtools/client/inspector/markup/test/shadowdom_open_debugger.min.js", - "devtools/client/shared/source-map-loader/test/browser/fixtures/bundle.js", - "layout/style/test/property_database.js", - "services/fxaccounts/FxAccountsPairingChannel.js", - "testing/web-platform/", - # Unrelated testcases that has edge case syntax. - "browser/components/sessionstore/test/unit/data/", - "devtools/client/debugger/src/workers/parser/tests/fixtures/", - "devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/", - "devtools/client/webconsole/test/browser/test-syntaxerror-worklet.js", - "devtools/server/tests/xpcshell/test_framebindings-03.js", - "devtools/server/tests/xpcshell/test_framebindings-04.js", - "devtools/shared/tests/xpcshell/test_eventemitter_basic.js", - "devtools/shared/tests/xpcshell/test_eventemitter_static.js", - "dom/base/crashtests/module-with-syntax-error.js", - "dom/base/test/file_bug687859-16.js", - "dom/base/test/file_bug687859-16.js", - "dom/base/test/file_js_cache_syntax_error.js", - "dom/base/test/jsmodules/module_badSyntax.js", - "dom/canvas/test/reftest/webgl-utils.js", - "dom/encoding/test/file_utf16_be_bom.js", - "dom/encoding/test/file_utf16_le_bom.js", - "dom/html/test/bug649134/file_bug649134-1.sjs", - "dom/html/test/bug649134/file_bug649134-2.sjs", - "dom/media/webrtc/tests/mochitests/identity/idp-bad.js", - "dom/serviceworkers/test/file_js_cache_syntax_error.js", - "dom/serviceworkers/test/parse_error_worker.js", - "dom/workers/test/importScripts_worker_imported3.js", - "dom/workers/test/invalid.js", - "dom/workers/test/threadErrors_worker1.js", - "dom/xhr/tests/browser_blobFromFile.js", - "image/test/browser/browser_image.js", - "js/xpconnect/tests/chrome/test_bug732665_meta.js", - "js/xpconnect/tests/mochitest/class_static_worker.js", - "js/xpconnect/tests/unit/bug451678_subscript.js", - "js/xpconnect/tests/unit/error_other.sys.mjs", - "js/xpconnect/tests/unit/es6module_parse_error.js", - "js/xpconnect/tests/unit/recursive_importA.jsm", - "js/xpconnect/tests/unit/recursive_importB.jsm", - "js/xpconnect/tests/unit/syntax_error.jsm", - "js/xpconnect/tests/unit/test_defineModuleGetter.js", - "js/xpconnect/tests/unit/test_import.js", - "js/xpconnect/tests/unit/test_import_shim.js", - "js/xpconnect/tests/unit/test_recursive_import.js", - "js/xpconnect/tests/unit/test_unload.js", - "modules/libpref/test/unit/data/testParser.js", - "python/mozbuild/mozbuild/test/", - "remote/shared/messagehandler/test/browser/resources/modules/root/invalid.sys.mjs", - "testing/talos/talos/startup_test/sessionrestore/profile-manywindows/sessionstore.js", - "testing/talos/talos/startup_test/sessionrestore/profile/sessionstore.js", - "toolkit/components/reader/Readerable.sys.mjs", - "toolkit/components/workerloader/tests/moduleF-syntax-error.js", - "tools/lint/test/", - "tools/update-packaging/test/", - # SpiderMonkey internals. - "js/examples/", - "js/src/", - # Files has macro. - "browser/app/profile/firefox.js", - "browser/branding/official/pref/firefox-branding.js", - "browser/components/enterprisepolicies/schemas/schema.sys.mjs", - "browser/locales/en-US/firefox-l10n.js", - "mobile/android/app/geckoview-prefs.js", - "mobile/android/locales/en-US/mobile-l10n.js", - "modules/libpref/greprefs.js", - "modules/libpref/init/all.js", - "testing/condprofile/condprof/tests/profile/user.js", - "testing/mozbase/mozprofile/tests/files/prefs_with_comments.js", - "toolkit/modules/AppConstants.sys.mjs", - "toolkit/mozapps/update/tests/data/xpcshellConstantsPP.js", - # Uniffi templates - "toolkit/components/uniffi-bindgen-gecko-js/src/templates/js/", - ], - ) -) - -EXCLUSION_FILES = [ - os.path.join("tools", "rewriting", "Generated.txt"), - os.path.join("tools", "rewriting", "ThirdPartyPaths.txt"), -] - - -def load_exclusion_files(): - for path in EXCLUSION_FILES: - with open(path, "r") as f: - for line in f: - p = path_sep_to_native(re.sub(r"\*$", "", line.strip())) - excluded_from_imports_prefix.append(p) - - -def is_excluded_from_imports(path): - """Returns true if the JS file content shouldn't be handled by - jscodeshift. - - This filter is necessary because jscodeshift cannot handle some - syntax edge cases and results in unexpected rewrite.""" - path_str = str(path) - for prefix in excluded_from_imports_prefix: - if path_str.startswith(prefix): - return True - - return False - - -# Wrapper for hg/git operations -class VCSUtils: - def run(self, cmd): - # Do not pass check=True because the pattern can match no file. - lines = subprocess.run(cmd, stdout=subprocess.PIPE).stdout.decode() - return filter(lambda x: x != "", lines.split("\n")) - - -class HgUtils(VCSUtils): - def is_available(): - return pathlib.Path(".hg").exists() - - def rename(self, before, after): - cmd = ["hg", "rename", before, after] - subprocess.run(cmd, check=True) - - def find_jsms(self, path): - jsms = [] - - # NOTE: `set:glob:` syntax does not accept backslash on windows. - path = path_sep_from_native(path) - - cmd = ["hg", "files", f'set:glob:"{path}/**/*.jsm"'] - for line in self.run(cmd): - jsm = pathlib.Path(line) - if is_excluded_from_convert(jsm): - continue - jsms.append(jsm) - - cmd = [ - "hg", - "files", - rf"set:grep('EXPORTED_SYMBOLS = \[') and glob:\"{path}/**/*.js\"", - ] - for line in self.run(cmd): - jsm = pathlib.Path(line) - if is_excluded_from_convert(jsm): - continue - jsms.append(jsm) - - return jsms - - def find_all_jss(self, path): - jss = [] - - # NOTE: `set:glob:` syntax does not accept backslash on windows. - path = path_sep_from_native(path) - - cmd = [ - "hg", - "files", - f'set:glob:"{path}/**/*.jsm" or glob:"{path}/**/*.js" or ' - + f'glob:"{path}/**/*.mjs" or glob:"{path}/**/*.sjs"', - ] - for line in self.run(cmd): - js = pathlib.Path(line) - if is_excluded_from_imports(js): - continue - jss.append(js) - - return jss - - -class GitUtils(VCSUtils): - def is_available(): - return pathlib.Path(".git").exists() - - def rename(self, before, after): - cmd = ["git", "mv", before, after] - subprocess.run(cmd, check=True) - - def find_jsms(self, path): - jsms = [] - - cmd = ["git", "ls-files", f"{path}/*.jsm"] - for line in self.run(cmd): - jsm = pathlib.Path(line) - if is_excluded_from_convert(jsm): - continue - jsms.append(jsm) - - handled = {} - cmd = ["git", "grep", "EXPORTED_SYMBOLS = \\[", f"{path}/*.js"] - for line in self.run(cmd): - m = re.search("^([^:]+):", line) - if not m: - continue - filename = m.group(1) - if filename in handled: - continue - handled[filename] = True - jsm = pathlib.Path(filename) - if is_excluded_from_convert(jsm): - continue - jsms.append(jsm) - - return jsms - - def find_all_jss(self, path): - jss = [] - - cmd = [ - "git", - "ls-files", - f"{path}/*.jsm", - f"{path}/*.js", - f"{path}/*.mjs", - f"{path}/*.sjs", - ] - for line in self.run(cmd): - js = pathlib.Path(line) - if is_excluded_from_imports(js): - continue - jss.append(js) - - return jss - - -class Summary: - def __init__(self): - self.convert_errors = [] - self.import_errors = [] - self.rename_errors = [] - self.no_refs = [] - - -@Command( - "esmify", - category="misc", - description="ESMify JSM files.", -) -@CommandArgument( - "path", - nargs=1, - help="Path to the JSM file to ESMify, or the directory that contains " - "JSM files and/or JS files that imports ESM-ified JSM.", -) -@CommandArgument( - "--convert", - action="store_true", - help="Only perform the step 1 = convert part", -) -@CommandArgument( - "--imports", - action="store_true", - help="Only perform the step 2 = import calls part", -) -@CommandArgument( - "--prefix", - default="", - help="Restrict the target of import in the step 2 to ESM-ified JSM, by the " - "prefix match for the JSM file's path. e.g. 'browser/'.", -) -def esmify(command_context, path=None, convert=False, imports=False, prefix=""): - """ - This command does the following 2 steps: - 1. Convert the JSM file specified by `path` to ESM file, or the JSM files - inside the directory specified by `path` to ESM files, and also - fix references in build files and test definitions - 2. Convert import calls inside file(s) specified by `path` for ESM-ified - files to use new APIs - - Example 1: - # Convert all JSM files inside `browser/components/pagedata` directory, - # and replace all references for ESM-ified files in the entire tree to use - # new APIs - - $ ./mach esmify --convert browser/components/pagedata - $ ./mach esmify --imports . --prefix=browser/components/pagedata - - Example 2: - # Convert all JSM files inside `browser` directory, and replace all - # references for the JSM files inside `browser` directory to use - # new APIs - - $ ./mach esmify browser - """ - - def error(text): - command_context.log(logging.ERROR, "esmify", {}, f"[ERROR] {text}") - - def warn(text): - command_context.log(logging.WARN, "esmify", {}, f"[WARN] {text}") - - def info(text): - command_context.log(logging.INFO, "esmify", {}, f"[INFO] {text}") - - # If no options is specified, perform both. - if not convert and not imports: - convert = True - imports = True - - path = pathlib.Path(path[0]) - - if not verify_path(command_context, path): - return 1 - - if HgUtils.is_available(): - vcs_utils = HgUtils() - elif GitUtils.is_available(): - vcs_utils = GitUtils() - else: - error( - "This script needs to be run inside mozilla-central " - "checkout of either mercurial or git." - ) - return 1 - - load_exclusion_files() - - info("Setting up jscodeshift...") - setup_jscodeshift() - - is_single_file = path.is_file() - - modified_files = [] - summary = Summary() - - if convert: - info("Searching files to convert to ESM...") - if is_single_file: - jsms = [path] - else: - jsms = vcs_utils.find_jsms(path) - - info(f"Found {len(jsms)} file(s) to convert to ESM.") - - info("Converting to ESM...") - jsms = convert_module(jsms, summary) - if jsms is None: - error("Failed to rewrite exports.") - return 1 - - info("Renaming...") - esms = rename_jsms(command_context, vcs_utils, jsms, summary) - - modified_files += esms - - if imports: - info("Searching files to rewrite imports...") - - if is_single_file: - if convert: - # Already converted above - jss = esms - else: - jss = [path] - else: - jss = vcs_utils.find_all_jss(path) - - info(f"Checking {len(jss)} JS file(s). Rewriting any matching imports...") - - result = rewrite_imports(jss, prefix, summary) - if result is None: - return 1 - - info(f"Rewritten {len(result)} file(s).") - - # Only modified files needs eslint fix - modified_files += result - - modified_files = list(set(modified_files)) - - info(f"Applying eslint --fix for {len(modified_files)} file(s)...") - eslint_fix(command_context, modified_files) - - def print_files(f, errors): - for [path, message] in errors: - f(f" * {path}") - if message: - f(f" {message}") - - if len(summary.convert_errors): - error("========") - error("Following files are not converted into ESM due to error:") - print_files(error, summary.convert_errors) - - if len(summary.import_errors): - warn("========") - warn("Following files are not rewritten to import ESMs due to error:") - warn( - "(NOTE: Errors related to 'private names' are mostly due to " - " preprocessor macros in the file):" - ) - print_files(warn, summary.import_errors) - - if len(summary.rename_errors): - error("========") - error("Following files are not renamed due to error:") - print_files(error, summary.rename_errors) - - if len(summary.no_refs): - warn("========") - warn("Following files are not found in any build files.") - warn("Please update references to those files manually:") - print_files(warn, summary.rename_errors) - - return 0 - - -def verify_path(command_context, path): - """Check if the path passed to the command is valid relative path.""" - - def error(text): - command_context.log(logging.ERROR, "esmify", {}, f"[ERROR] {text}") - - if not path.exists(): - error(f"{path} does not exist.") - return False - - if path.is_absolute(): - error("Path must be a relative path from mozilla-central checkout.") - return False - - return True - - -def find_file(path, target): - """Find `target` file in ancestor of path.""" - target_path = path.parent / target - if not target_path.exists(): - if path.parent == path: - return None - - return find_file(path.parent, target) - - return target_path - - -def try_rename_in(command_context, path, target, jsm_name, esm_name, jsm_path): - """Replace the occurrences of `jsm_name` with `esm_name` in `target` - file.""" - - def info(text): - command_context.log(logging.INFO, "esmify", {}, f"[INFO] {text}") - - if type(target) is str: - # Target is specified by filename, that may exist somewhere in - # the jsm's directory or ancestor directories. - target_path = find_file(path, target) - if not target_path: - return False - - # JSM should be specified with relative path in the file. - # - # Single moz.build or jar.mn can contain multiple files with same name. - # Search for relative path. - jsm_relative_path = jsm_path.relative_to(target_path.parent) - jsm_path_str = path_sep_from_native(str(jsm_relative_path)) - else: - # Target is specified by full path. - target_path = target - - # JSM should be specified with full path in the file. - jsm_path_str = path_sep_from_native(str(jsm_path)) - - jsm_path_re = re.compile(r"\b" + jsm_path_str.replace(".", r"\.") + r"\b") - jsm_name_re = re.compile(r"\b" + jsm_name.replace(".", r"\.") + r"\b") - - modified = False - content = "" - with open(target_path, "r") as f: - for line in f: - if jsm_path_re.search(line): - modified = True - line = jsm_name_re.sub(esm_name, line) - - content += line - - if modified: - info(f" {str(target_path)}") - info(f" {jsm_name} => {esm_name}") - with open(target_path, "w", newline="\n") as f: - f.write(content) - - return True - - -def try_rename_uri_in(command_context, target, jsm_name, esm_name, jsm_uri, esm_uri): - """Replace the occurrences of `jsm_uri` with `esm_uri` in `target` file.""" - - def info(text): - command_context.log(logging.INFO, "esmify", {}, f"[INFO] {text}") - - modified = False - content = "" - with open(target, "r") as f: - for line in f: - if jsm_uri in line: - modified = True - line = line.replace(jsm_uri, esm_uri) - - content += line - - if modified: - info(f" {str(target)}") - info(f" {jsm_name} => {esm_name}") - with open(target, "w", newline="\n") as f: - f.write(content) - - return True - - -def try_rename_components_conf(command_context, path, jsm_name, esm_name): - """Replace the occurrences of `jsm_name` with `esm_name` in components.conf - file.""" - - def info(text): - command_context.log(logging.INFO, "esmify", {}, f"[INFO] {text}") - - target_path = find_file(path, "components.conf") - if not target_path: - return False - - # Unlike try_rename_in, components.conf contains the URL instead of - # relative path, and also there are no known files with same name. - # Simply replace the filename. - - with open(target_path, "r") as f: - content = f.read() - - prop_re = re.compile( - "[\"']jsm[\"']:(.*)" + r"\b" + jsm_name.replace(".", r"\.") + r"\b" - ) - - if not prop_re.search(content): - return False - - info(f" {str(target_path)}") - info(f" {jsm_name} => {esm_name}") - - content = prop_re.sub(r"'esModule':\1" + esm_name, content) - with open(target_path, "w", newline="\n") as f: - f.write(content) - - return True - - -def esmify_name(name): - return re.sub(r"\.(jsm|js|jsm\.js)$", ".sys.mjs", name) - - -def esmify_path(jsm_path): - jsm_name = jsm_path.name - esm_name = re.sub(r"\.(jsm|js|jsm\.js)$", ".sys.mjs", jsm_name) - esm_path = jsm_path.parent / esm_name - return esm_path - - -path_to_uri_map = None - - -def load_path_to_uri_map(): - global path_to_uri_map - - if path_to_uri_map: - return - - if "ESMIFY_MAP_JSON" in os.environ: - json_map = pathlib.Path(os.environ["ESMIFY_MAP_JSON"]) - else: - json_map = pathlib.Path(__file__).parent / "map.json" - - with open(json_map, "r") as f: - uri_to_path_map = json.loads(f.read()) - - path_to_uri_map = dict() - - for uri, paths in uri_to_path_map.items(): - if type(paths) is str: - paths = [paths] - - for path in paths: - path_to_uri_map[path] = uri - - -def find_jsm_uri(jsm_path): - load_path_to_uri_map() - - path = path_sep_from_native(jsm_path) - - if path in path_to_uri_map: - return path_to_uri_map[path] - - return None - - -def rename_single_file(command_context, vcs_utils, jsm_path, summary): - """Rename `jsm_path` to .sys.mjs, and fix references to the file in build - and test definitions.""" - - def info(text): - command_context.log(logging.INFO, "esmify", {}, f"[INFO] {text}") - - esm_path = esmify_path(jsm_path) - - jsm_name = jsm_path.name - esm_name = esm_path.name - - target_files = [ - ".eslintignore", - "moz.build", - "jar.mn", - "browser.toml", - "browser-common.toml", - "chrome.toml", - "mochitest.toml", - "xpcshell.toml", - "xpcshell-child-process.toml", - "xpcshell-common.toml", - "xpcshell-parent-process.toml", - pathlib.Path("tools", "lint", "eslint.yml"), - pathlib.Path("tools", "lint", "rejected-words.yml"), - ] - - info(f"{jsm_path} => {esm_path}") - - renamed = False - for target in target_files: - if try_rename_in( - command_context, jsm_path, target, jsm_name, esm_name, jsm_path - ): - renamed = True - - if try_rename_components_conf(command_context, jsm_path, jsm_name, esm_name): - renamed = True - - uri_target_files = [ - pathlib.Path( - "browser", "base", "content", "test", "performance", "browser_startup.js" - ), - pathlib.Path( - "browser", - "base", - "content", - "test", - "performance", - "browser_startup_content.js", - ), - pathlib.Path( - "browser", - "base", - "content", - "test", - "performance", - "browser_startup_content_subframe.js", - ), - pathlib.Path( - "toolkit", - "components", - "backgroundtasks", - "tests", - "browser", - "browser_xpcom_graph_wait.js", - ), - ] - - jsm_uri = find_jsm_uri(jsm_path) - if jsm_uri: - esm_uri = re.sub(r"\.(jsm|js|jsm\.js)$", ".sys.mjs", jsm_uri) - - for target in uri_target_files: - if try_rename_uri_in( - command_context, target, jsm_uri, esm_uri, jsm_name, esm_name - ): - renamed = True - - if not renamed: - summary.no_refs.append([jsm_path, None]) - - if not esm_path.exists(): - vcs_utils.rename(jsm_path, esm_path) - else: - summary.rename_errors.append([jsm_path, f"{esm_path} already exists"]) - - return esm_path - - -def rename_jsms(command_context, vcs_utils, jsms, summary): - esms = [] - for jsm in jsms: - esm = rename_single_file(command_context, vcs_utils, jsm, summary) - esms.append(esm) - - return esms - - -npm_prefix = pathlib.Path("tools") / "esmify" -path_from_npm_prefix = pathlib.Path("..") / ".." - - -def setup_jscodeshift(): - """Install jscodeshift.""" - cmd = [ - sys.executable, - "./mach", - "npm", - "install", - "jscodeshift", - "--save-dev", - "--prefix", - str(npm_prefix), - ] - subprocess.run(cmd, check=True) - - -def run_npm_command(args, env, stdin): - cmd = [ - sys.executable, - "./mach", - "npm", - "run", - ] + args - p = subprocess.Popen(cmd, env=env, stdin=subprocess.PIPE, stdout=subprocess.PIPE) - p.stdin.write(stdin) - p.stdin.close() - - ok_files = [] - errors = [] - while True: - line = p.stdout.readline() - if not line: - break - line = line.rstrip().decode() - - if line.startswith(" NOC "): - continue - - print(line) - - m = re.search(r"^ (OKK|ERR) ([^ ]+)(?: (.+))?", line) - if not m: - continue - - result = m.group(1) - # NOTE: path is written from `tools/esmify`. - path = pathlib.Path(m.group(2)).relative_to(path_from_npm_prefix) - error = m.group(3) - - if result == "OKK": - ok_files.append(path) - - if result == "ERR": - errors.append([path, error]) - - if p.wait() != 0: - return [None, None] - - return ok_files, errors - - -def convert_module(jsms, summary): - """Replace EXPORTED_SYMBOLS with export declarations, and replace - ChromeUtils.importESModule with static import as much as possible, - and return the list of successfully rewritten files.""" - - if len(jsms) == 0: - return [] - - env = os.environ.copy() - - stdin = "\n".join(map(str, paths_from_npm_prefix(jsms))).encode() - - ok_files, errors = run_npm_command( - [ - "convert_module", - "--prefix", - str(npm_prefix), - ], - env=env, - stdin=stdin, - ) - - if ok_files is None and errors is None: - return None - - summary.convert_errors.extend(errors) - - return ok_files - - -def rewrite_imports(jss, prefix, summary): - """Replace import calls for JSM with import calls for ESM or static import - for ESM.""" - - if len(jss) == 0: - return [] - - env = os.environ.copy() - env["ESMIFY_TARGET_PREFIX"] = prefix - - stdin = "\n".join(map(str, paths_from_npm_prefix(jss))).encode() - - ok_files, errors = run_npm_command( - [ - "rewrite_imports", - "--prefix", - str(npm_prefix), - ], - env=env, - stdin=stdin, - ) - - if ok_files is None and errors is None: - return None - - summary.import_errors.extend(errors) - - return ok_files - - -def paths_from_npm_prefix(paths): - """Convert relative path from mozilla-central to relative path from - tools/esmify.""" - return list(map(lambda path: path_from_npm_prefix / path, paths)) - - -def eslint_fix(command_context, files): - """Auto format files.""" - - def info(text): - command_context.log(logging.INFO, "esmify", {}, f"[INFO] {text}") - - if len(files) == 0: - return - - remaining = files[0:] - - # There can be too many files for single command line, perform by chunk. - max_files = 16 - while len(remaining) > max_files: - info(f"{len(remaining)} files remaining") - - chunk = remaining[0:max_files] - remaining = remaining[max_files:] - - cmd = [sys.executable, "./mach", "eslint", "--fix"] + chunk - subprocess.run(cmd, check=True) - - info(f"{len(remaining)} files remaining") - chunk = remaining - cmd = [sys.executable, "./mach", "eslint", "--fix"] + chunk - subprocess.run(cmd, check=True) diff --git a/tools/esmify/map.json b/tools/esmify/map.json deleted file mode 100644 index 0185ae5401..0000000000 --- a/tools/esmify/map.json +++ /dev/null @@ -1,1127 +0,0 @@ -{ - "chrome://devtools-startup/content/DevToolsShim.jsm": "devtools/startup/DevToolsShim.jsm", - "chrome://global/content/tabprompts.jsm": "toolkit/components/prompts/content/tabprompts.jsm", - "chrome://mochikit/content/ShutdownLeaksCollector.jsm": "testing/mochitest/ShutdownLeaksCollector.jsm", - "chrome://mochikit/content/tests/SimpleTest/StructuredLog.jsm": "testing/modules/StructuredLog.jsm", - "chrome://mochitests/content/browser/accessible/tests/browser/Common.jsm": "accessible/tests/browser/Common.jsm", - "chrome://mochitests/content/browser/accessible/tests/browser/Layout.jsm": "accessible/tests/browser/Layout.jsm", - "chrome://mochitests/content/browser/devtools/client/shared/sourceeditor/test/CodeMirrorTestActors.jsm": "devtools/client/shared/sourceeditor/test/CodeMirrorTestActors.jsm", - "chrome://mochitests/content/chrome/docshell/test/chrome/DocShellHelpers.jsm": "docshell/test/chrome/DocShellHelpers.jsm", - "chrome://mochitests/content/chrome/dom/console/tests/console.jsm": "dom/console/tests/console.jsm", - "chrome://mochitests/content/chrome/dom/network/tests/tcpsocket_test.jsm": "dom/network/tests/tcpsocket_test.jsm", - "chrome://mochitests/content/chrome/dom/url/tests/file_worker_url.jsm": "dom/url/tests/file_worker_url.jsm", - "chrome://mochitests/content/chrome/dom/url/tests/test_bug883784.jsm": "dom/url/tests/test_bug883784.jsm", - "chrome://mochitests/content/chrome/dom/workers/test/WorkerTest.jsm": "dom/workers/test/WorkerTest.jsm", - "chrome://pocket/content/Pocket.jsm": "browser/components/pocket/content/Pocket.jsm", - "chrome://pocket/content/SaveToPocket.jsm": "browser/components/pocket/content/SaveToPocket.jsm", - "chrome://pocket/content/pktApi.jsm": "browser/components/pocket/content/pktApi.jsm", - "chrome://pocket/content/pktTelemetry.jsm": "browser/components/pocket/content/pktTelemetry.jsm", - "chrome://remote/content/server/HTTPD.jsm": "netwerk/test/httpserver/httpd.js", - "resource:///actors/ASRouterChild.jsm": "browser/components/newtab/actors/ASRouterChild.jsm", - "resource:///actors/ASRouterParent.jsm": "browser/components/newtab/actors/ASRouterParent.jsm", - "resource:///actors/AboutLoginsChild.jsm": "browser/components/aboutlogins/AboutLoginsChild.jsm", - "resource:///actors/AboutLoginsParent.jsm": "browser/components/aboutlogins/AboutLoginsParent.jsm", - "resource:///actors/AboutNewTabChild.jsm": "browser/actors/AboutNewTabChild.jsm", - "resource:///actors/AboutNewTabParent.jsm": "browser/actors/AboutNewTabParent.jsm", - "resource:///actors/AboutPocketChild.jsm": "browser/actors/AboutPocketChild.jsm", - "resource:///actors/AboutPocketParent.jsm": "browser/actors/AboutPocketParent.jsm", - "resource:///actors/AboutPrivateBrowsingChild.jsm": "browser/actors/AboutPrivateBrowsingChild.jsm", - "resource:///actors/AboutPrivateBrowsingParent.jsm": "browser/actors/AboutPrivateBrowsingParent.jsm", - "resource:///actors/AboutProtectionsChild.jsm": "browser/actors/AboutProtectionsChild.jsm", - "resource:///actors/AboutProtectionsParent.jsm": "browser/actors/AboutProtectionsParent.jsm", - "resource:///actors/AboutReaderChild.jsm": "browser/actors/AboutReaderChild.jsm", - "resource:///actors/AboutReaderParent.jsm": "browser/actors/AboutReaderParent.jsm", - "resource:///actors/AboutTabCrashedChild.jsm": "browser/actors/AboutTabCrashedChild.jsm", - "resource:///actors/AboutTabCrashedParent.jsm": "browser/actors/AboutTabCrashedParent.jsm", - "resource:///actors/AboutWelcomeChild.jsm": "browser/components/newtab/aboutwelcome/AboutWelcomeChild.jsm", - "resource:///actors/AboutWelcomeParent.jsm": "browser/components/newtab/aboutwelcome/AboutWelcomeParent.jsm", - "resource:///actors/BlockedSiteChild.jsm": "browser/actors/BlockedSiteChild.jsm", - "resource:///actors/BlockedSiteParent.jsm": "browser/actors/BlockedSiteParent.jsm", - "resource:///actors/BrowserProcessChild.jsm": "browser/actors/BrowserProcessChild.jsm", - "resource:///actors/BrowserTabChild.jsm": "browser/actors/BrowserTabChild.jsm", - "resource:///actors/BrowserTabParent.jsm": "browser/actors/BrowserTabParent.jsm", - "resource:///actors/ClickHandlerChild.jsm": "browser/actors/ClickHandlerChild.jsm", - "resource:///actors/ClickHandlerParent.jsm": "browser/actors/ClickHandlerParent.jsm", - "resource:///actors/ContentDelegateChild.jsm": "mobile/android/actors/ContentDelegateChild.jsm", - "resource:///actors/ContentDelegateParent.jsm": "mobile/android/actors/ContentDelegateParent.jsm", - "resource:///actors/ContentSearchChild.jsm": "browser/actors/ContentSearchChild.jsm", - "resource:///actors/ContentSearchParent.jsm": "browser/actors/ContentSearchParent.jsm", - "resource:///actors/ContextMenuChild.jsm": "browser/actors/ContextMenuChild.jsm", - "resource:///actors/ContextMenuParent.jsm": "browser/actors/ContextMenuParent.jsm", - "resource:///actors/DOMFullscreenChild.jsm": "browser/actors/DOMFullscreenChild.jsm", - "resource:///actors/DOMFullscreenParent.jsm": "browser/actors/DOMFullscreenParent.jsm", - "resource:///actors/DecoderDoctorChild.jsm": "browser/actors/DecoderDoctorChild.jsm", - "resource:///actors/DecoderDoctorParent.jsm": "browser/actors/DecoderDoctorParent.jsm", - "resource:///actors/EncryptedMediaChild.jsm": "browser/actors/EncryptedMediaChild.jsm", - "resource:///actors/EncryptedMediaParent.jsm": "browser/actors/EncryptedMediaParent.jsm", - "resource:///actors/FormValidationChild.jsm": "browser/actors/FormValidationChild.jsm", - "resource:///actors/FormValidationParent.jsm": "browser/actors/FormValidationParent.jsm", - "resource:///actors/GeckoViewAutoFillChild.jsm": "mobile/android/actors/GeckoViewAutoFillChild.jsm", - "resource:///actors/GeckoViewAutoFillParent.jsm": "mobile/android/actors/GeckoViewAutoFillParent.jsm", - "resource:///actors/GeckoViewContentChild.jsm": "mobile/android/actors/GeckoViewContentChild.jsm", - "resource:///actors/GeckoViewContentParent.jsm": "mobile/android/actors/GeckoViewContentParent.jsm", - "resource:///actors/GeckoViewFormValidationChild.jsm": "mobile/android/actors/GeckoViewFormValidationChild.jsm", - "resource:///actors/GeckoViewPermissionChild.jsm": "mobile/android/actors/GeckoViewPermissionChild.jsm", - "resource:///actors/GeckoViewPermissionParent.jsm": "mobile/android/actors/GeckoViewPermissionParent.jsm", - "resource:///actors/GeckoViewPermissionProcessChild.jsm": "mobile/android/actors/GeckoViewPermissionProcessChild.jsm", - "resource:///actors/GeckoViewPermissionProcessParent.jsm": "mobile/android/actors/GeckoViewPermissionProcessParent.jsm", - "resource:///actors/GeckoViewPromptChild.jsm": "mobile/android/actors/GeckoViewPromptChild.jsm", - "resource:///actors/GeckoViewPrompterChild.jsm": "mobile/android/actors/GeckoViewPrompterChild.jsm", - "resource:///actors/GeckoViewPrompterParent.jsm": "mobile/android/actors/GeckoViewPrompterParent.jsm", - "resource:///actors/GeckoViewSettingsChild.jsm": "mobile/android/actors/GeckoViewSettingsChild.jsm", - "resource:///actors/InteractionsChild.jsm": "browser/components/places/InteractionsChild.jsm", - "resource:///actors/InteractionsParent.jsm": "browser/components/places/InteractionsParent.jsm", - "resource:///actors/LightweightThemeChild.jsm": "browser/actors/LightweightThemeChild.jsm", - "resource:///actors/LinkHandlerChild.jsm": "browser/actors/LinkHandlerChild.jsm", - "resource:///actors/LinkHandlerParent.jsm": "browser/actors/LinkHandlerParent.jsm", - "resource:///actors/LoadURIDelegateChild.jsm": "mobile/android/actors/LoadURIDelegateChild.jsm", - "resource:///actors/LoadURIDelegateParent.jsm": "mobile/android/actors/LoadURIDelegateParent.jsm", - "resource:///actors/MediaControlDelegateChild.jsm": "mobile/android/actors/MediaControlDelegateChild.jsm", - "resource:///actors/MediaControlDelegateParent.jsm": "mobile/android/actors/MediaControlDelegateParent.jsm", - "resource:///actors/PageDataChild.jsm": "browser/components/pagedata/PageDataChild.jsm", - "resource:///actors/PageDataParent.jsm": "browser/components/pagedata/PageDataParent.jsm", - "resource:///actors/PageInfoChild.jsm": "browser/actors/PageInfoChild.jsm", - "resource:///actors/PageStyleChild.jsm": "browser/actors/PageStyleChild.jsm", - "resource:///actors/PageStyleParent.jsm": "browser/actors/PageStyleParent.jsm", - "resource:///actors/PluginChild.jsm": "browser/actors/PluginChild.jsm", - "resource:///actors/PluginParent.jsm": "browser/actors/PluginParent.jsm", - "resource:///actors/PointerLockChild.jsm": "browser/actors/PointerLockChild.jsm", - "resource:///actors/PointerLockParent.jsm": "browser/actors/PointerLockParent.jsm", - "resource:///actors/ProgressDelegateChild.jsm": "mobile/android/actors/ProgressDelegateChild.jsm", - "resource:///actors/ProgressDelegateParent.jsm": "mobile/android/actors/ProgressDelegateParent.jsm", - "resource:///actors/PromptParent.jsm": "browser/actors/PromptParent.jsm", - "resource:///actors/RFPHelperChild.jsm": "browser/actors/RFPHelperChild.jsm", - "resource:///actors/RFPHelperParent.jsm": "browser/actors/RFPHelperParent.jsm", - "resource:///actors/RefreshBlockerChild.jsm": "browser/actors/RefreshBlockerChild.jsm", - "resource:///actors/RefreshBlockerParent.jsm": "browser/actors/RefreshBlockerParent.jsm", - "resource:///actors/ScreenshotsComponentChild.jsm": "browser/actors/ScreenshotsComponentChild.jsm", - "resource:///actors/ScrollDelegateChild.jsm": "mobile/android/actors/ScrollDelegateChild.jsm", - "resource:///actors/ScrollDelegateParent.jsm": "mobile/android/actors/ScrollDelegateParent.jsm", - "resource:///actors/SearchSERPTelemetryChild.jsm": "browser/actors/SearchSERPTelemetryChild.jsm", - "resource:///actors/SearchSERPTelemetryParent.jsm": "browser/actors/SearchSERPTelemetryParent.jsm", - "resource:///actors/SelectionActionDelegateChild.jsm": "mobile/android/actors/SelectionActionDelegateChild.jsm", - "resource:///actors/SelectionActionDelegateParent.jsm": "mobile/android/actors/SelectionActionDelegateParent.jsm", - "resource:///actors/SwitchDocumentDirectionChild.jsm": "browser/actors/SwitchDocumentDirectionChild.jsm", - "resource:///actors/WebRTCChild.jsm": "browser/actors/WebRTCChild.jsm", - "resource:///actors/WebRTCParent.jsm": "browser/actors/WebRTCParent.jsm", - "resource:///modules/360seMigrationUtils.jsm": "browser/components/migration/360seMigrationUtils.jsm", - "resource:///modules/AboutDebuggingRegistration.jsm": "devtools/startup/AboutDebuggingRegistration.jsm", - "resource:///modules/AboutDevToolsToolboxRegistration.jsm": "devtools/startup/AboutDevToolsToolboxRegistration.jsm", - "resource:///modules/AboutNewTab.jsm": "browser/modules/AboutNewTab.jsm", - "resource:///modules/AboutNewTabService.jsm": "browser/components/newtab/AboutNewTabService.jsm", - "resource://gre/modules/AppUpdater.jsm": "toolkit/mozapps/update/AppUpdater.jsm", - "resource:///modules/AsyncTabSwitcher.jsm": "browser/modules/AsyncTabSwitcher.jsm", - "resource:///modules/AttributionCode.jsm": "browser/components/attribution/AttributionCode.jsm", - "resource:///modules/BrowserContentHandler.jsm": "browser/components/BrowserContentHandler.jsm", - "resource:///modules/BrowserGlue.jsm": "browser/components/BrowserGlue.jsm", - "resource:///modules/BrowserSearchTelemetry.jsm": "browser/components/search/BrowserSearchTelemetry.jsm", - "resource:///modules/BrowserUIUtils.jsm": "browser/modules/BrowserUIUtils.jsm", - "resource:///modules/BrowserWindowTracker.jsm": "browser/modules/BrowserWindowTracker.jsm", - "resource:///modules/BuiltInThemeConfig.jsm": "browser/themes/BuiltInThemeConfig.jsm", - "resource:///modules/BuiltInThemes.jsm": "browser/themes/BuiltInThemes.jsm", - "resource:///modules/CaptiveDetect.jsm": "toolkit/components/captivedetect/CaptiveDetect.jsm", - "resource:///modules/ChromeMacOSLoginCrypto.jsm": "browser/components/migration/ChromeMacOSLoginCrypto.jsm", - "resource:///modules/ChromeMigrationUtils.jsm": "browser/components/migration/ChromeMigrationUtils.jsm", - "resource:///modules/ChromeProfileMigrator.jsm": "browser/components/migration/ChromeProfileMigrator.jsm", - "resource:///modules/ChromeWindowsLoginCrypto.jsm": "browser/components/migration/ChromeWindowsLoginCrypto.jsm", - "resource:///modules/CommonNames.jsm": "browser/components/places/CommonNames.jsm", - "resource:///modules/ContentCrashHandlers.jsm": "browser/modules/ContentCrashHandlers.jsm", - "resource:///modules/CustomizableUI.jsm": "browser/components/customizableui/CustomizableUI.jsm", - "resource:///modules/CustomizableWidgets.jsm": "browser/components/customizableui/CustomizableWidgets.jsm", - "resource:///modules/CustomizeMode.jsm": "browser/components/customizableui/CustomizeMode.jsm", - "resource:///modules/DevToolsStartup.jsm": "devtools/startup/DevToolsStartup.jsm", - "resource:///modules/Discovery.jsm": "browser/modules/Discovery.jsm", - "resource:///modules/DoHConfig.jsm": "browser/components/doh/DoHConfig.jsm", - "resource:///modules/DoHController.jsm": "browser/components/doh/DoHController.jsm", - "resource:///modules/DoHHeuristics.jsm": "browser/components/doh/DoHHeuristics.jsm", - "resource:///modules/DomainGroupBuilder.jsm": "browser/components/places/DomainGroupBuilder.jsm", - "resource:///modules/DownloadSpamProtection.jsm": "browser/components/downloads/DownloadSpamProtection.jsm", - "resource:///modules/DownloadsCommon.jsm": "browser/components/downloads/DownloadsCommon.jsm", - "resource:///modules/DownloadsMacFinderProgress.jsm": "browser/components/downloads/DownloadsMacFinderProgress.jsm", - "resource:///modules/DownloadsTaskbar.jsm": "browser/components/downloads/DownloadsTaskbar.jsm", - "resource:///modules/DownloadsViewUI.jsm": "browser/components/downloads/DownloadsViewUI.jsm", - "resource:///modules/DownloadsViewableInternally.jsm": "browser/components/downloads/DownloadsViewableInternally.jsm", - "resource:///modules/DragPositionManager.jsm": "browser/components/customizableui/DragPositionManager.jsm", - "resource:///modules/ESEDBReader.jsm": "browser/components/migration/ESEDBReader.jsm", - "resource:///modules/EdgeProfileMigrator.jsm": "browser/components/migration/EdgeProfileMigrator.jsm", - "resource:///modules/EveryWindow.jsm": "browser/modules/EveryWindow.jsm", - "resource:///modules/ExtensionControlledPopup.jsm": "browser/components/extensions/ExtensionControlledPopup.jsm", - "resource:///modules/ExtensionPopups.jsm": "browser/components/extensions/ExtensionPopups.jsm", - "resource:///modules/ExtensionsUI.jsm": "browser/modules/ExtensionsUI.jsm", - "resource:///modules/FaviconLoader.jsm": "browser/modules/FaviconLoader.jsm", - "resource:///modules/FirefoxProfileMigrator.jsm": "browser/components/migration/FirefoxProfileMigrator.jsm", - "resource:///modules/HeadlessShell.jsm": "browser/components/shell/HeadlessShell.jsm", - "resource:///modules/HomePage.jsm": "browser/modules/HomePage.jsm", - "resource:///modules/IEProfileMigrator.jsm": "browser/components/migration/IEProfileMigrator.jsm", - "resource:///modules/InstallerPrefs.jsm": "browser/components/installerprefs/InstallerPrefs.jsm", - "resource:///modules/Interactions.jsm": "browser/components/places/Interactions.jsm", - "resource:///modules/InteractionsBlocklist.jsm": "browser/components/places/InteractionsBlocklist.jsm", - "resource:///modules/LaterRun.jsm": "browser/modules/LaterRun.jsm", - "resource:///modules/LoginBreaches.jsm": "browser/components/aboutlogins/LoginBreaches.jsm", - "resource:///modules/MSMigrationUtils.jsm": "browser/components/migration/MSMigrationUtils.jsm", - "resource:///modules/MacAttribution.jsm": "browser/components/attribution/MacAttribution.jsm", - "resource:///modules/MacTouchBar.jsm": "browser/components/touchbar/MacTouchBar.jsm", - "resource:///modules/MigrationUtils.jsm": "browser/components/migration/MigrationUtils.jsm", - "resource:///modules/NewTabPagePreloading.jsm": "browser/modules/NewTabPagePreloading.jsm", - "resource:///modules/OpenInTabsUtils.jsm": "browser/modules/OpenInTabsUtils.jsm", - "resource:///modules/PageActions.jsm": "browser/modules/PageActions.jsm", - "resource:///modules/PanelMultiView.jsm": "browser/components/customizableui/PanelMultiView.jsm", - "resource:///modules/PartnerLinkAttribution.jsm": "browser/modules/PartnerLinkAttribution.jsm", - "resource:///modules/PinnedGroupBuilder.jsm": "browser/components/places/PinnedGroupBuilder.jsm", - "resource:///modules/PlacesUIUtils.jsm": "browser/components/places/PlacesUIUtils.jsm", - "resource:///modules/ProcessHangMonitor.jsm": "browser/modules/ProcessHangMonitor.jsm", - "resource:///modules/ProfileMigrator.jsm": "browser/components/migration/ProfileMigrator.jsm", - "resource:///modules/PromptCollection.jsm": "browser/components/prompts/PromptCollection.jsm", - "resource:///modules/SafariProfileMigrator.jsm": "browser/components/migration/SafariProfileMigrator.jsm", - "resource:///modules/Sanitizer.jsm": "browser/modules/Sanitizer.jsm", - "resource:///modules/ScreenshotChild.jsm": "browser/components/shell/ScreenshotChild.jsm", - "resource:///modules/ScreenshotsOverlayChild.jsm": "browser/components/screenshots/ScreenshotsOverlayChild.jsm", - "resource:///modules/ScreenshotsUtils.jsm": "browser/components/screenshots/ScreenshotsUtils.jsm", - "resource:///modules/SearchOneOffs.jsm": "browser/components/search/SearchOneOffs.jsm", - "resource:///modules/SearchSERPTelemetry.jsm": "browser/components/search/SearchSERPTelemetry.jsm", - "resource:///modules/SearchUIUtils.jsm": "browser/components/search/SearchUIUtils.jsm", - "resource:///modules/SearchWidgetTracker.jsm": "browser/components/customizableui/SearchWidgetTracker.jsm", - "resource:///modules/SelectionChangedMenulist.jsm": "browser/modules/SelectionChangedMenulist.jsm", - "resource:///modules/ShellService.jsm": "browser/components/shell/ShellService.jsm", - "resource:///modules/SiteDataManager.jsm": "browser/modules/SiteDataManager.jsm", - "resource:///modules/SitePermissions.jsm": "browser/modules/SitePermissions.jsm", - "resource:///modules/SnapshotGroups.jsm": "browser/components/places/SnapshotGroups.jsm", - "resource:///modules/SnapshotMonitor.jsm": "browser/components/places/SnapshotMonitor.jsm", - "resource:///modules/SnapshotScorer.jsm": "browser/components/places/SnapshotScorer.jsm", - "resource:///modules/SnapshotSelector.jsm": "browser/components/places/SnapshotSelector.jsm", - "resource:///modules/Snapshots.jsm": "browser/components/places/Snapshots.jsm", - "resource:///modules/StartupRecorder.jsm": "browser/components/StartupRecorder.jsm", - "resource:///modules/TRRPerformance.jsm": "browser/components/doh/TRRPerformance.jsm", - "resource:///modules/TabUnloader.jsm": "browser/modules/TabUnloader.jsm", - "resource:///modules/TabsList.jsm": "browser/modules/TabsList.jsm", - "resource:///modules/ThemeVariableMap.jsm": "browser/themes/ThemeVariableMap.jsm", - "resource:///modules/TransientPrefs.jsm": "browser/modules/TransientPrefs.jsm", - "resource:///modules/UITour.jsm": "browser/components/uitour/UITour.jsm", - "resource:///modules/UITourChild.jsm": "browser/components/uitour/UITourChild.jsm", - "resource:///modules/UITourParent.jsm": "browser/components/uitour/UITourParent.jsm", - "resource:///modules/UnitConverterSimple.jsm": "browser/components/urlbar/unitconverters/UnitConverterSimple.jsm", - "resource:///modules/UnitConverterTemperature.jsm": "browser/components/urlbar/unitconverters/UnitConverterTemperature.jsm", - "resource:///modules/UnitConverterTimezone.jsm": "browser/components/urlbar/unitconverters/UnitConverterTimezone.jsm", - "resource:///modules/UrlbarController.jsm": "browser/components/urlbar/UrlbarController.jsm", - "resource:///modules/UrlbarEventBufferer.jsm": "browser/components/urlbar/UrlbarEventBufferer.jsm", - "resource:///modules/UrlbarInput.jsm": "browser/components/urlbar/UrlbarInput.jsm", - "resource:///modules/UrlbarMuxerUnifiedComplete.jsm": "browser/components/urlbar/UrlbarMuxerUnifiedComplete.jsm", - "resource:///modules/UrlbarPrefs.jsm": "browser/components/urlbar/UrlbarPrefs.jsm", - "resource:///modules/UrlbarProviderAboutPages.jsm": "browser/components/urlbar/UrlbarProviderAboutPages.jsm", - "resource:///modules/UrlbarProviderAliasEngines.jsm": "browser/components/urlbar/UrlbarProviderAliasEngines.jsm", - "resource:///modules/UrlbarProviderAutofill.jsm": "browser/components/urlbar/UrlbarProviderAutofill.jsm", - "resource:///modules/UrlbarProviderBookmarkKeywords.jsm": "browser/components/urlbar/UrlbarProviderBookmarkKeywords.jsm", - "resource:///modules/UrlbarProviderCalculator.jsm": "browser/components/urlbar/UrlbarProviderCalculator.jsm", - "resource:///modules/UrlbarProviderExtension.jsm": "browser/components/urlbar/UrlbarProviderExtension.jsm", - "resource:///modules/UrlbarProviderHeuristicFallback.jsm": "browser/components/urlbar/UrlbarProviderHeuristicFallback.jsm", - "resource:///modules/UrlbarProviderInputHistory.jsm": "browser/components/urlbar/UrlbarProviderInputHistory.jsm", - "resource:///modules/UrlbarProviderInterventions.jsm": "browser/components/urlbar/UrlbarProviderInterventions.jsm", - "resource:///modules/UrlbarProviderOmnibox.jsm": "browser/components/urlbar/UrlbarProviderOmnibox.jsm", - "resource:///modules/UrlbarProviderOpenTabs.jsm": "browser/components/urlbar/UrlbarProviderOpenTabs.jsm", - "resource:///modules/UrlbarProviderPlaces.jsm": "browser/components/urlbar/UrlbarProviderPlaces.jsm", - "resource:///modules/UrlbarProviderPrivateSearch.jsm": "browser/components/urlbar/UrlbarProviderPrivateSearch.jsm", - "resource:///modules/UrlbarProviderQuickSuggest.jsm": "browser/components/urlbar/UrlbarProviderQuickSuggest.jsm", - "resource:///modules/UrlbarProviderRemoteTabs.jsm": "browser/components/urlbar/UrlbarProviderRemoteTabs.jsm", - "resource:///modules/UrlbarProviderSearchSuggestions.jsm": "browser/components/urlbar/UrlbarProviderSearchSuggestions.jsm", - "resource:///modules/UrlbarProviderSearchTips.jsm": "browser/components/urlbar/UrlbarProviderSearchTips.jsm", - "resource:///modules/UrlbarProviderTabToSearch.jsm": "browser/components/urlbar/UrlbarProviderTabToSearch.jsm", - "resource:///modules/UrlbarProviderTokenAliasEngines.jsm": "browser/components/urlbar/UrlbarProviderTokenAliasEngines.jsm", - "resource:///modules/UrlbarProviderTopSites.jsm": "browser/components/urlbar/UrlbarProviderTopSites.jsm", - "resource:///modules/UrlbarProviderUnitConversion.jsm": "browser/components/urlbar/UrlbarProviderUnitConversion.jsm", - "resource:///modules/UrlbarProvidersManager.jsm": "browser/components/urlbar/UrlbarProvidersManager.jsm", - "resource:///modules/UrlbarResult.jsm": "browser/components/urlbar/UrlbarResult.jsm", - "resource:///modules/UrlbarSearchOneOffs.jsm": "browser/components/urlbar/UrlbarSearchOneOffs.jsm", - "resource:///modules/UrlbarSearchUtils.jsm": "browser/components/urlbar/UrlbarSearchUtils.jsm", - "resource:///modules/UrlbarTokenizer.jsm": "browser/components/urlbar/UrlbarTokenizer.jsm", - "resource:///modules/UrlbarUtils.jsm": "browser/components/urlbar/UrlbarUtils.jsm", - "resource:///modules/UrlbarValueFormatter.jsm": "browser/components/urlbar/UrlbarValueFormatter.jsm", - "resource:///modules/UrlbarView.jsm": "browser/components/urlbar/UrlbarView.jsm", - "resource:///modules/WebProtocolHandlerRegistrar.jsm": "browser/components/protocolhandler/WebProtocolHandlerRegistrar.jsm", - "resource:///modules/WindowsJumpLists.jsm": "browser/modules/WindowsJumpLists.jsm", - "resource:///modules/WindowsPreviewPerTab.jsm": "browser/modules/WindowsPreviewPerTab.jsm", - "resource:///modules/ZoomUI.jsm": "browser/modules/ZoomUI.jsm", - "resource:///modules/asrouter/ASRouter.jsm": "browser/components/asrouter/modules/ASRouter.jsm", - "resource:///modules/asrouter/ASRouterDefaultConfig.jsm": "browser/components/asrouter/modules/ASRouterDefaultConfig.jsm", - "resource:///modules/asrouter/ASRouterParentProcessMessageHandler.jsm": "browser/components/asrouter/modules/ASRouterParentProcessMessageHandler.jsm", - "resource:///modules/asrouter/ASRouterPreferences.jsm": "browser/components/asrouter/modules/ASRouterPreferences.jsm", - "resource:///modules/asrouter/ASRouterTargeting.jsm": "browser/components/asrouter/modules/ASRouterTargeting.jsm", - "resource:///modules/asrouter/ASRouterTriggerListeners.jsm": "browser/components/asrouter/modules/ASRouterTriggerListeners.jsm", - "resource:///modules/asrouter/CFRPageActions.jsm": "browser/components/asrouter/modules/CFRPageActions.jsm", - "resource:///modules/asrouter/InfoBar.jsm": "browser/components/asrouter/modules/InfoBar.jsm", - "resource:///modules/asrouter/MomentsPageHub.jsm": "browser/components/asrouter/modules/MomentsPageHub.jsm", - "resource:///modules/asrouter/OnboardingMessageProvider.jsm": "browser/components/asrouter/modules/OnboardingMessageProvider.jsm", - "resource:///modules/asrouter/ToolbarBadgeHub.jsm": "browser/components/asrouter/modules/ToolbarBadgeHub.jsm", - "resource:///modules/asrouter/ToolbarPanelHub.jsm": "browser/components/asrouter/modules/ToolbarPanelHub.jsm", - "resource:///modules/distribution.js": "browser/components/distribution.js", - "resource:///modules/pagedata/OpenGraphPageData.jsm": "browser/components/pagedata/OpenGraphPageData.jsm", - "resource:///modules/pagedata/PageDataSchema.jsm": "browser/components/pagedata/PageDataSchema.jsm", - "resource:///modules/pagedata/PageDataService.jsm": "browser/components/pagedata/PageDataService.jsm", - "resource:///modules/pagedata/SchemaOrgPageData.jsm": "browser/components/pagedata/SchemaOrgPageData.jsm", - "resource:///modules/pagedata/TwitterPageData.jsm": "browser/components/pagedata/TwitterPageData.jsm", - "resource:///modules/policies/BookmarksPolicies.jsm": "browser/components/enterprisepolicies/helpers/BookmarksPolicies.jsm", - "resource:///modules/policies/Policies.jsm": "browser/components/enterprisepolicies/Policies.jsm", - "resource:///modules/policies/ProxyPolicies.jsm": "browser/components/enterprisepolicies/helpers/ProxyPolicies.jsm", - "resource:///modules/policies/WebsiteFilter.jsm": "browser/components/enterprisepolicies/helpers/WebsiteFilter.jsm", - "resource:///modules/policies/schema.jsm": "browser/components/enterprisepolicies/schemas/schema.jsm", - "resource:///modules/sessionstore/GlobalState.jsm": "browser/components/sessionstore/GlobalState.jsm", - "resource:///modules/sessionstore/RecentlyClosedTabsAndWindowsMenuUtils.jsm": "browser/components/sessionstore/RecentlyClosedTabsAndWindowsMenuUtils.jsm", - "resource:///modules/sessionstore/RunState.jsm": "browser/components/sessionstore/RunState.jsm", - "resource:///modules/sessionstore/SessionCookies.jsm": "browser/components/sessionstore/SessionCookies.jsm", - "resource:///modules/sessionstore/SessionFile.jsm": "browser/components/sessionstore/SessionFile.jsm", - "resource:///modules/sessionstore/SessionMigration.jsm": "browser/components/sessionstore/SessionMigration.jsm", - "resource:///modules/sessionstore/SessionSaver.jsm": "browser/components/sessionstore/SessionSaver.jsm", - "resource:///modules/sessionstore/SessionStartup.jsm": "browser/components/sessionstore/SessionStartup.jsm", - "resource:///modules/sessionstore/SessionStore.jsm": "browser/components/sessionstore/SessionStore.jsm", - "resource:///modules/sessionstore/SessionWriter.jsm": "browser/components/sessionstore/SessionWriter.jsm", - "resource:///modules/sessionstore/StartupPerformance.jsm": "browser/components/sessionstore/StartupPerformance.jsm", - "resource:///modules/sessionstore/TabAttributes.jsm": "browser/components/sessionstore/TabAttributes.jsm", - "resource:///modules/sessionstore/TabState.jsm": "browser/components/sessionstore/TabState.jsm", - "resource:///modules/sessionstore/TabStateCache.jsm": "browser/components/sessionstore/TabStateCache.jsm", - "resource:///modules/sessionstore/TabStateFlusher.jsm": "browser/components/sessionstore/TabStateFlusher.jsm", - "resource:///modules/syncedtabs/EventEmitter.jsm": "browser/components/syncedtabs/EventEmitter.jsm", - "resource:///modules/syncedtabs/SyncedTabsDeckComponent.js": "browser/components/syncedtabs/SyncedTabsDeckComponent.js", - "resource:///modules/syncedtabs/SyncedTabsDeckStore.js": "browser/components/syncedtabs/SyncedTabsDeckStore.js", - "resource:///modules/syncedtabs/SyncedTabsDeckView.js": "browser/components/syncedtabs/SyncedTabsDeckView.js", - "resource:///modules/syncedtabs/SyncedTabsListStore.js": "browser/components/syncedtabs/SyncedTabsListStore.js", - "resource:///modules/syncedtabs/TabListComponent.js": "browser/components/syncedtabs/TabListComponent.js", - "resource:///modules/syncedtabs/TabListView.js": "browser/components/syncedtabs/TabListView.js", - "resource:///modules/syncedtabs/util.js": "browser/components/syncedtabs/util.js", - "resource:///modules/webrtcUI.jsm": "browser/modules/webrtcUI.jsm", - "resource://activity-stream/aboutwelcome/lib/AboutWelcomeDefaults.jsm": "browser/components/newtab/aboutwelcome/lib/AboutWelcomeDefaults.jsm", - "resource://activity-stream/aboutwelcome/lib/AboutWelcomeTelemetry.jsm": "browser/components/newtab/aboutwelcome/lib/AboutWelcomeTelemetry.jsm", - "resource://activity-stream/common/Actions.jsm": "browser/components/newtab/common/Actions.jsm", - "resource://activity-stream/common/ActorConstants.jsm": "browser/components/newtab/common/ActorConstants.jsm", - "resource://activity-stream/common/Dedupe.jsm": "browser/components/newtab/common/Dedupe.jsm", - "resource://activity-stream/common/Reducers.jsm": "browser/components/newtab/common/Reducers.jsm", - "resource://activity-stream/lib/ASRouterNewTabHook.jsm": "browser/components/newtab/lib/ASRouterNewTabHook.jsm", - "resource://activity-stream/lib/AboutPreferences.jsm": "browser/components/newtab/lib/AboutPreferences.jsm", - "resource://activity-stream/lib/ActivityStream.jsm": "browser/components/newtab/lib/ActivityStream.jsm", - "resource://activity-stream/lib/ActivityStreamMessageChannel.jsm": "browser/components/newtab/lib/ActivityStreamMessageChannel.jsm", - "resource://activity-stream/lib/ActivityStreamStorage.jsm": "browser/components/newtab/lib/ActivityStreamStorage.jsm", - "resource://activity-stream/lib/CFRMessageProvider.jsm": "browser/components/newtab/lib/CFRMessageProvider.jsm", - "resource://activity-stream/lib/DefaultSites.jsm": "browser/components/newtab/lib/DefaultSites.jsm", - "resource://activity-stream/lib/DiscoveryStreamFeed.jsm": "browser/components/newtab/lib/DiscoveryStreamFeed.jsm", - "resource://activity-stream/lib/DownloadsManager.jsm": "browser/components/newtab/lib/DownloadsManager.jsm", - "resource://activity-stream/lib/FaviconFeed.jsm": "browser/components/newtab/lib/FaviconFeed.jsm", - "resource://activity-stream/lib/FeatureCalloutMessages.jsm": "browser/components/newtab/lib/FeatureCalloutMessages.jsm", - "resource://activity-stream/lib/FilterAdult.jsm": "browser/components/newtab/lib/FilterAdult.jsm", - "resource://activity-stream/lib/LinksCache.jsm": "browser/components/newtab/lib/LinksCache.jsm", - "resource://activity-stream/lib/NewTabInit.jsm": "browser/components/newtab/lib/NewTabInit.jsm", - "resource://activity-stream/lib/PanelTestProvider.jsm": "browser/components/newtab/lib/PanelTestProvider.jsm", - "resource://activity-stream/lib/PersistentCache.jsm": "browser/components/newtab/lib/PersistentCache.jsm", - "resource://activity-stream/lib/PersonalityProvider/NaiveBayesTextTagger.jsm": "browser/components/newtab/lib/PersonalityProvider/NaiveBayesTextTagger.jsm", - "resource://activity-stream/lib/PersonalityProvider/NmfTextTagger.jsm": "browser/components/newtab/lib/PersonalityProvider/NmfTextTagger.jsm", - "resource://activity-stream/lib/PersonalityProvider/PersonalityProvider.jsm": "browser/components/newtab/lib/PersonalityProvider/PersonalityProvider.jsm", - "resource://activity-stream/lib/PersonalityProvider/PersonalityProviderWorkerClass.jsm": "browser/components/newtab/lib/PersonalityProvider/PersonalityProviderWorkerClass.jsm", - "resource://activity-stream/lib/PersonalityProvider/RecipeExecutor.jsm": "browser/components/newtab/lib/PersonalityProvider/RecipeExecutor.jsm", - "resource://activity-stream/lib/PersonalityProvider/Tokenize.jsm": "browser/components/newtab/lib/PersonalityProvider/Tokenize.jsm", - "resource://activity-stream/lib/PlacesFeed.jsm": "browser/components/newtab/lib/PlacesFeed.jsm", - "resource://activity-stream/lib/PrefsFeed.jsm": "browser/components/newtab/lib/PrefsFeed.jsm", - "resource://activity-stream/lib/RecommendationProvider.jsm": "browser/components/newtab/lib/RecommendationProvider.jsm", - "resource://activity-stream/lib/RemoteL10n.jsm": "browser/components/newtab/lib/RemoteL10n.jsm", - "resource://activity-stream/lib/Screenshots.jsm": "browser/components/newtab/lib/Screenshots.jsm", - "resource://activity-stream/lib/SearchShortcuts.jsm": "browser/components/newtab/lib/SearchShortcuts.jsm", - "resource://activity-stream/lib/SectionsManager.jsm": "browser/components/newtab/lib/SectionsManager.jsm", - "resource://activity-stream/lib/ShortURL.jsm": "browser/components/newtab/lib/ShortURL.jsm", - "resource://activity-stream/lib/SiteClassifier.jsm": "browser/components/newtab/lib/SiteClassifier.jsm", - "resource://activity-stream/lib/Spotlight.jsm": "browser/components/newtab/lib/Spotlight.jsm", - "resource://activity-stream/lib/Store.jsm": "browser/components/newtab/lib/Store.jsm", - "resource://activity-stream/lib/SystemTickFeed.jsm": "browser/components/newtab/lib/SystemTickFeed.jsm", - "resource://activity-stream/lib/TippyTopProvider.jsm": "browser/components/newtab/lib/TippyTopProvider.jsm", - "resource://activity-stream/lib/ToastNotification.jsm": "browser/components/newtab/lib/ToastNotification.jsm", - "resource://activity-stream/lib/TopSitesFeed.jsm": "browser/components/newtab/lib/TopSitesFeed.jsm", - "resource://activity-stream/lib/TopStoriesFeed.jsm": "browser/components/newtab/lib/TopStoriesFeed.jsm", - "resource://activity-stream/lib/UTEventReporting.jsm": "browser/components/newtab/lib/UTEventReporting.jsm", - "resource://android/assets/web_extensions/test-support/TestSupportChild.jsm": "mobile/android/geckoview/src/androidTest/assets/web_extensions/test-support/TestSupportChild.jsm", - "resource://android/assets/web_extensions/test-support/TestSupportProcessChild.jsm": "mobile/android/geckoview/src/androidTest/assets/web_extensions/test-support/TestSupportProcessChild.jsm", - "resource://app/modules/SnapshotSelector.jsm": "browser/components/places/SnapshotSelector.jsm", - "resource://autofill/AutofillTelemetry.jsm": "toolkit/components/formautofill/AutofillTelemetry.jsm", - "resource://autofill/CreditCardRuleset.jsm": "toolkit/components/formautofill/CreditCardRuleset.jsm", - "resource://autofill/FormAutofill.jsm": "toolkit/components/formautofill/FormAutofill.jsm", - "resource://autofill/FormAutofillChild.jsm": "toolkit/components/formautofill/FormAutofillChild.jsm", - "resource://autofill/FormAutofillContent.jsm": "toolkit/components/formautofill/FormAutofillContent.jsm", - "resource://autofill/FormAutofillHandler.jsm": "toolkit/components/formautofill/FormAutofillHandler.jsm", - "resource://autofill/FormAutofillHeuristics.jsm": "toolkit/components/formautofill/FormAutofillHeuristics.jsm", - "resource://autofill/FormAutofillNameUtils.jsm": "toolkit/components/formautofill/FormAutofillNameUtils.jsm", - "resource://autofill/FormAutofillParent.jsm": "toolkit/components/formautofill/FormAutofillParent.jsm", - "resource://autofill/FormAutofillPreferences.jsm": "toolkit/components/formautofill/FormAutofillPreferences.jsm", - "resource://autofill/FormAutofillStorageBase.jsm": "toolkit/components/formautofill/FormAutofillStorageBase.jsm", - "resource://autofill/FormAutofillSync.jsm": "toolkit/components/formautofill/FormAutofillSync.jsm", - "resource://autofill/Autofilltelemetry.jsm": "toolkit/components/formautofill/Autofilltelemetry.jsm", - "resource://autofill/FormAutofillUtils.jsm": "toolkit/components/formautofill/FormAutofillUtils.jsm", - "resource://autofill/ProfileAutoCompleteResult.jsm": "toolkit/components/formautofill/ProfileAutoCompleteResult.jsm", - "resource://autofill/phonenumberutils/PhoneNumber.jsm": "toolkit/components/formautofill/phonenumberutils/PhoneNumber.jsm", - "resource://autofill/phonenumberutils/PhoneNumberMetaData.jsm": "toolkit/components/formautofill/phonenumberutils/PhoneNumberMetaData.jsm", - "resource://autofill/phonenumberutils/PhoneNumberNormalizer.jsm": "toolkit/components/formautofill/phonenumberutils/PhoneNumberNormalizer.jsm", - "resource://damp-test/content/actors/DampLoadChild.jsm": "testing/talos/talos/tests/devtools/addon/content/actors/DampLoadChild.jsm", - "resource://damp-test/content/actors/DampLoadParent.jsm": "testing/talos/talos/tests/devtools/addon/content/actors/DampLoadParent.jsm", - "resource://devtools/client/framework/browser-toolbox/Launcher.jsm": "devtools/client/framework/browser-toolbox/Launcher.jsm", - "resource://devtools/client/jsonview/Converter.jsm": "devtools/client/jsonview/Converter.jsm", - "resource://devtools/client/jsonview/Sniffer.jsm": "devtools/client/jsonview/Sniffer.jsm", - "resource://devtools/client/performance-new/shared/background.jsm.js": "devtools/client/performance-new/shared/background.jsm.js", - "resource://devtools/client/performance-new/popup/menu-button.jsm.js": "devtools/client/performance-new/popup/menu-button.jsm.js", - "resource://devtools/client/performance-new/popup/logic.jsm.js": "devtools/client/performance-new/popup/logic.jsm.js", - "resource://devtools/client/performance-new/shared/symbolication.jsm.js": "devtools/client/performance-new/shared/symbolication.jsm.js", - "resource://devtools/client/performance-new/shared/typescript-lazy-load.jsm.js": "devtools/client/performance-new/shared/typescript-lazy-load.jsm.js", - "resource://devtools/client/storage/VariablesView.jsm": "devtools/client/storage/VariablesView.jsm", - "resource://devtools/client/styleeditor/StyleEditorUI.jsm": "devtools/client/styleeditor/StyleEditorUI.jsm", - "resource://devtools/client/styleeditor/StyleEditorUtil.jsm": "devtools/client/styleeditor/StyleEditorUtil.jsm", - "resource://devtools/client/styleeditor/StyleSheetEditor.jsm": "devtools/client/styleeditor/StyleSheetEditor.jsm", - "resource://devtools/server/actors/targets/target-actor-registry.jsm": "devtools/server/actors/targets/target-actor-registry.jsm", - "resource://devtools/server/actors/watcher/SessionDataHelpers.jsm": "devtools/server/actors/watcher/SessionDataHelpers.jsm", - "resource://devtools/server/actors/watcher/WatcherRegistry.jsm": "devtools/server/actors/watcher/WatcherRegistry.jsm", - "resource://devtools/server/actors/watcher/browsing-context-helpers.jsm": "devtools/server/actors/watcher/browsing-context-helpers.jsm", - "resource://devtools/server/connectors/js-window-actor/DevToolsFrameChild.jsm": "devtools/server/connectors/js-window-actor/DevToolsFrameChild.jsm", - "resource://devtools/server/connectors/js-window-actor/DevToolsFrameParent.jsm": "devtools/server/connectors/js-window-actor/DevToolsFrameParent.jsm", - "resource://devtools/server/connectors/js-window-actor/DevToolsWorkerChild.jsm": "devtools/server/connectors/js-window-actor/DevToolsWorkerChild.jsm", - "resource://devtools/server/connectors/js-window-actor/DevToolsWorkerParent.jsm": "devtools/server/connectors/js-window-actor/DevToolsWorkerParent.jsm", - "resource://devtools/server/connectors/js-window-actor/WindowGlobalLogger.jsm": "devtools/server/connectors/js-window-actor/WindowGlobalLogger.jsm", - "resource://devtools/server/startup/content-process.jsm": "devtools/server/startup/content-process.jsm", - "resource://devtools/shared/loader/Loader.jsm": "devtools/shared/loader/Loader.jsm", - "resource://devtools/shared/loader/base-loader.js": "devtools/shared/loader/base-loader.js", - "resource://devtools/shared/loader/browser-loader.js": "devtools/shared/loader/browser-loader.js", - "resource://devtools/shared/loader/loader-plugin-raw.jsm": "devtools/shared/loader/loader-plugin-raw.jsm", - "resource://devtools/shared/loader/worker-loader.js": "devtools/shared/loader/worker-loader.js", - "resource://devtools/shared/security/DevToolsSocketStatus.jsm": "devtools/shared/security/DevToolsSocketStatus.jsm", - "resource://devtools/shared/test-helpers/tracked-objects.jsm": "devtools/shared/test-helpers/tracked-objects.jsm", - "resource://devtools/shared/validate-breakpoint.jsm": "devtools/shared/validate-breakpoint.jsm", - "resource://devtools/shared/worker/worker.js": "devtools/shared/worker/worker.js", - "resource://featuregates/FeatureGate.jsm": "toolkit/components/featuregates/FeatureGate.jsm", - "resource://featuregates/FeatureGateImplementation.jsm": "toolkit/components/featuregates/FeatureGateImplementation.jsm", - "resource://gre/actors/AboutHttpsOnlyErrorChild.jsm": "toolkit/actors/AboutHttpsOnlyErrorChild.jsm", - "resource://gre/actors/AboutHttpsOnlyErrorParent.jsm": "toolkit/actors/AboutHttpsOnlyErrorParent.jsm", - "resource://gre/actors/AudioPlaybackChild.jsm": "toolkit/actors/AudioPlaybackChild.jsm", - "resource://gre/actors/AudioPlaybackParent.jsm": "toolkit/actors/AudioPlaybackParent.jsm", - "resource://gre/actors/AutoCompleteChild.jsm": "toolkit/actors/AutoCompleteChild.jsm", - "resource://gre/actors/AutoCompleteParent.jsm": "toolkit/actors/AutoCompleteParent.jsm", - "resource://gre/actors/AutoScrollChild.jsm": "toolkit/actors/AutoScrollChild.jsm", - "resource://gre/actors/AutoScrollParent.jsm": "toolkit/actors/AutoScrollParent.jsm", - "resource://gre/actors/AutoplayChild.jsm": "toolkit/actors/AutoplayChild.jsm", - "resource://gre/actors/AutoplayParent.jsm": "toolkit/actors/AutoplayParent.jsm", - "resource://gre/actors/BackgroundThumbnailsChild.jsm": "toolkit/actors/BackgroundThumbnailsChild.jsm", - "resource://gre/actors/BrowserElementChild.jsm": "toolkit/actors/BrowserElementChild.jsm", - "resource://gre/actors/BrowserElementParent.jsm": "toolkit/actors/BrowserElementParent.jsm", - "resource://gre/actors/ClipboardReadPasteChild.jsm": "toolkit/actors/ClipboardReadPasteChild.jsm", - "resource://gre/actors/ClipboardReadPasteParent.jsm": "toolkit/actors/ClipboardReadPasteParent.jsm", - "resource://gre/actors/ContentMetaChild.jsm": "toolkit/actors/ContentMetaChild.jsm", - "resource://gre/actors/ContentMetaParent.jsm": "toolkit/actors/ContentMetaParent.jsm", - "resource://gre/actors/ControllersChild.jsm": "toolkit/actors/ControllersChild.jsm", - "resource://gre/actors/ControllersParent.jsm": "toolkit/actors/ControllersParent.jsm", - "resource://gre/actors/CookieBannerChild.jsm.jsm": "toolkit/components/cookiebanners/CookieBannerChild.jsm.jsm", - "resource://gre/actors/CookieBannerParent.jsm": "toolkit/components/cookiebanners/CookieBannerParent.jsm", - "resource://gre/actors/DateTimePickerChild.jsm": "toolkit/actors/DateTimePickerChild.jsm", - "resource://gre/actors/DateTimePickerParent.jsm": "toolkit/actors/DateTimePickerParent.jsm", - "resource://gre/actors/ExtFindChild.jsm": "toolkit/actors/ExtFindChild.jsm", - "resource://gre/actors/FindBarChild.jsm": "toolkit/actors/FindBarChild.jsm", - "resource://gre/actors/FindBarParent.jsm": "toolkit/actors/FindBarParent.jsm", - "resource://gre/actors/FinderChild.jsm": "toolkit/actors/FinderChild.jsm", - "resource://gre/actors/FormHistoryChild.jsm": "toolkit/components/satchel/FormHistoryChild.jsm", - "resource://gre/actors/FormHistoryParent.jsm": "toolkit/components/satchel/FormHistoryParent.jsm", - "resource://gre/actors/InlineSpellCheckerChild.jsm": "toolkit/actors/InlineSpellCheckerChild.jsm", - "resource://gre/actors/InlineSpellCheckerParent.jsm": "toolkit/actors/InlineSpellCheckerParent.jsm", - "resource://gre/actors/KeyPressEventModelCheckerChild.jsm": "toolkit/actors/KeyPressEventModelCheckerChild.jsm", - "resource://gre/actors/LayoutDebugChild.jsm": "layout/tools/layout-debug/LayoutDebugChild.jsm", - "resource://gre/actors/NetErrorChild.jsm": "toolkit/actors/NetErrorChild.jsm", - "resource://gre/actors/NetErrorParent.jsm": "toolkit/actors/NetErrorParent.jsm", - "resource://gre/actors/PictureInPictureChild.jsm": "toolkit/actors/PictureInPictureChild.jsm", - "resource://gre/actors/PopupBlockingChild.jsm": "toolkit/actors/PopupBlockingChild.jsm", - "resource://gre/actors/PopupBlockingParent.jsm": "toolkit/actors/PopupBlockingParent.jsm", - "resource://gre/actors/PrintingChild.jsm": "toolkit/actors/PrintingChild.jsm", - "resource://gre/actors/PrintingParent.jsm": "toolkit/actors/PrintingParent.jsm", - "resource://gre/actors/PrintingSelectionChild.jsm": "toolkit/actors/PrintingSelectionChild.jsm", - "resource://gre/actors/PurgeSessionHistoryChild.jsm": "toolkit/actors/PurgeSessionHistoryChild.jsm", - "resource://gre/actors/RemotePageChild.jsm": "toolkit/actors/RemotePageChild.jsm", - "resource://gre/actors/SelectChild.jsm": "toolkit/actors/SelectChild.jsm", - "resource://gre/actors/SelectParent.jsm": "toolkit/actors/SelectParent.jsm", - "resource://gre/actors/ThumbnailsChild.jsm": "toolkit/actors/ThumbnailsChild.jsm", - "resource://gre/actors/UAWidgetsChild.jsm": "toolkit/actors/UAWidgetsChild.jsm", - "resource://gre/actors/UnselectedTabHoverChild.jsm": "toolkit/actors/UnselectedTabHoverChild.jsm", - "resource://gre/actors/UnselectedTabHoverParent.jsm": "toolkit/actors/UnselectedTabHoverParent.jsm", - "resource://gre/actors/ViewSourceChild.jsm": "toolkit/actors/ViewSourceChild.jsm", - "resource://gre/actors/ViewSourcePageChild.jsm": "toolkit/actors/ViewSourcePageChild.jsm", - "resource://gre/actors/ViewSourcePageParent.jsm": "toolkit/actors/ViewSourcePageParent.jsm", - "resource://gre/actors/WebChannelChild.jsm": "toolkit/actors/WebChannelChild.jsm", - "resource://gre/actors/WebChannelParent.jsm": "toolkit/actors/WebChannelParent.jsm", - "resource://gre/modules/AboutCertViewerChild.jsm": "toolkit/components/certviewer/AboutCertViewerChild.jsm", - "resource://gre/modules/AboutCertViewerParent.jsm": "toolkit/components/certviewer/AboutCertViewerParent.jsm", - "resource://gre/modules/AboutPagesUtils.jsm": "toolkit/modules/AboutPagesUtils.jsm", - "resource://gre/modules/AboutReader.jsm": "toolkit/components/reader/AboutReader.jsm", - "resource://gre/modules/AbuseReporter.jsm": "toolkit/mozapps/extensions/AbuseReporter.jsm", - "resource://gre/modules/ActorManagerParent.jsm": "toolkit/modules/ActorManagerParent.jsm", - "resource://gre/modules/AddonManager.jsm": "toolkit/mozapps/extensions/AddonManager.jsm", - "resource://gre/modules/AddonSearchEngine.jsm": "toolkit/components/search/AddonSearchEngine.jsm", - "resource://gre/modules/AndroidLog.jsm": "mobile/android/modules/geckoview/AndroidLog.jsm", - "resource://gre/modules/AppConstants.jsm": "toolkit/modules/AppConstants.jsm", - "resource://gre/modules/AppMenuNotifications.jsm": "toolkit/modules/AppMenuNotifications.jsm", - "resource://gre/modules/AsanReporter.jsm": "toolkit/modules/AsanReporter.jsm", - "resource://gre/modules/AsyncPrefs.jsm": "toolkit/modules/AsyncPrefs.jsm", - "resource://gre/modules/AsyncShutdown.jsm": "toolkit/components/asyncshutdown/AsyncShutdown.jsm", - "resource://gre/modules/AutoCompleteSimpleSearch.jsm": "toolkit/components/autocomplete/AutoCompleteSimpleSearch.jsm", - "resource://gre/modules/BHRTelemetryService.jsm": "toolkit/components/backgroundhangmonitor/BHRTelemetryService.jsm", - "resource://gre/modules/BackgroundPageThumbs.jsm": "toolkit/components/thumbnails/BackgroundPageThumbs.jsm", - "resource://gre/modules/BackgroundTasksManager.jsm": "toolkit/components/backgroundtasks/BackgroundTasksManager.jsm", - "resource://gre/modules/BackgroundTasksUtils.jsm": "toolkit/components/backgroundtasks/BackgroundTasksUtils.jsm", - "resource://gre/modules/BackgroundUpdate.jsm": "toolkit/mozapps/update/BackgroundUpdate.jsm", - "resource://gre/modules/BinarySearch.jsm": "toolkit/modules/BinarySearch.jsm", - "resource://gre/modules/Bits.jsm": "toolkit/components/bitsdownload/Bits.jsm", - "resource://gre/modules/Blocklist.jsm": "toolkit/mozapps/extensions/Blocklist.jsm", - "resource://gre/modules/BookmarkHTMLUtils.jsm": "toolkit/components/places/BookmarkHTMLUtils.jsm", - "resource://gre/modules/BookmarkJSONUtils.jsm": "toolkit/components/places/BookmarkJSONUtils.jsm", - "resource://gre/modules/Bookmarks.jsm": "toolkit/components/places/Bookmarks.jsm", - "resource://gre/modules/BrowserTelemetryUtils.jsm": "toolkit/modules/BrowserTelemetryUtils.jsm", - "resource://gre/modules/BrowserUtils.jsm": "toolkit/modules/BrowserUtils.jsm", - "resource://gre/modules/CSV.js": "toolkit/components/passwordmgr/CSV.js", - "resource://gre/modules/CanonicalJSON.jsm": "toolkit/modules/CanonicalJSON.jsm", - "resource://gre/modules/CaptiveDetect.jsm": "toolkit/components/captivedetect/CaptiveDetect.jsm", - "resource://gre/modules/CertUtils.jsm": "toolkit/modules/CertUtils.jsm", - "resource://gre/modules/ChildCrashHandler.jsm": "mobile/android/modules/geckoview/ChildCrashHandler.jsm", - "resource://gre/modules/ClearDataService.jsm": "toolkit/components/cleardata/ClearDataService.jsm", - "resource://gre/modules/ClientID.jsm": "toolkit/components/telemetry/app/ClientID.jsm", - "resource://gre/modules/Color.jsm": "toolkit/modules/Color.jsm", - "resource://gre/modules/ColorPickerDelegate.jsm": "mobile/android/components/geckoview/ColorPickerDelegate.jsm", - "resource://gre/modules/CommonDialog.jsm": "toolkit/components/prompts/src/CommonDialog.jsm", - "resource://gre/modules/ComponentUtils.jsm": "js/xpconnect/loader/ComponentUtils.jsm", - "resource://gre/modules/ConduitsChild.jsm": "toolkit/components/extensions/ConduitsChild.jsm", - "resource://gre/modules/ConduitsParent.jsm": "toolkit/components/extensions/ConduitsParent.jsm", - "resource://gre/modules/Console.jsm": "toolkit/modules/Console.jsm", - "resource://gre/modules/ConsoleAPIStorage.jsm": "dom/console/ConsoleAPIStorage.jsm", - "resource://gre/modules/ContentAreaDropListener.jsm": "dom/base/ContentAreaDropListener.jsm", - "resource://gre/modules/ContentBlockingAllowList.jsm": "toolkit/components/antitracking/ContentBlockingAllowList.jsm", - "resource://gre/modules/ContentDOMReference.jsm": "toolkit/modules/ContentDOMReference.jsm", - "resource://gre/modules/ContentDispatchChooser.jsm": "toolkit/mozapps/handling/ContentDispatchChooser.jsm", - "resource://gre/modules/ContentPrefService2.jsm": "toolkit/components/contentprefs/ContentPrefService2.jsm", - "resource://gre/modules/ContentPrefServiceChild.jsm": "toolkit/components/contentprefs/ContentPrefServiceChild.jsm", - "resource://gre/modules/ContentPrefServiceParent.jsm": "toolkit/components/contentprefs/ContentPrefServiceParent.jsm", - "resource://gre/modules/ContentPrefStore.jsm": "toolkit/components/contentprefs/ContentPrefStore.jsm", - "resource://gre/modules/ContentPrefUtils.jsm": "toolkit/components/contentprefs/ContentPrefUtils.jsm", - "resource://gre/modules/ContextualIdentityService.jsm": "toolkit/components/contextualidentity/ContextualIdentityService.jsm", - "resource://gre/modules/CoveragePing.jsm": "toolkit/components/telemetry/pings/CoveragePing.jsm", - "resource://gre/modules/CrashManager.jsm": "toolkit/components/crashes/CrashManager.in.jsm", - "resource://gre/modules/CrashMonitor.jsm": "toolkit/components/crashmonitor/CrashMonitor.jsm", - "resource://gre/modules/CrashReports.jsm": "toolkit/crashreporter/CrashReports.jsm", - "resource://gre/modules/CrashService.jsm": "toolkit/components/crashes/CrashService.jsm", - "resource://gre/modules/CrashSubmit.jsm": "toolkit/crashreporter/CrashSubmit.jsm", - "resource://gre/modules/Credentials.jsm": "services/fxaccounts/Credentials.jsm", - "resource://gre/modules/CreditCard.jsm": "toolkit/modules/CreditCard.jsm", - "resource://gre/modules/CustomElementsListener.jsm": "toolkit/components/processsingleton/CustomElementsListener.jsm", - "resource://gre/modules/DOMRequestHelper.jsm": "dom/base/DOMRequestHelper.jsm", - "resource://gre/modules/DateTimePickerPanel.jsm": "toolkit/modules/DateTimePickerPanel.jsm", - "resource://gre/modules/DefaultCLH.jsm": "toolkit/components/DefaultCLH.jsm", - "resource://gre/modules/DeferredTask.jsm": "toolkit/modules/DeferredTask.jsm", - "resource://gre/modules/DelayedInit.jsm": "mobile/android/modules/geckoview/DelayedInit.jsm", - "resource://gre/modules/Deprecated.jsm": "toolkit/modules/Deprecated.jsm", - "resource://gre/modules/DownloadCore.jsm": "toolkit/components/downloads/DownloadCore.jsm", - "resource://gre/modules/DownloadHistory.jsm": "toolkit/components/downloads/DownloadHistory.jsm", - "resource://gre/modules/DownloadIntegration.jsm": "toolkit/components/downloads/DownloadIntegration.jsm", - "resource://gre/modules/DownloadLastDir.jsm": "toolkit/mozapps/downloads/DownloadLastDir.jsm", - "resource://gre/modules/DownloadLegacy.jsm": "toolkit/components/downloads/DownloadLegacy.jsm", - "resource://gre/modules/DownloadList.jsm": "toolkit/components/downloads/DownloadList.jsm", - "resource://gre/modules/DownloadPaths.jsm": "toolkit/components/downloads/DownloadPaths.jsm", - "resource://gre/modules/DownloadStore.jsm": "toolkit/components/downloads/DownloadStore.jsm", - "resource://gre/modules/DownloadUIHelper.jsm": "toolkit/components/downloads/DownloadUIHelper.jsm", - "resource://gre/modules/DownloadUtils.jsm": "toolkit/mozapps/downloads/DownloadUtils.jsm", - "resource://gre/modules/Downloads.jsm": "toolkit/components/downloads/Downloads.jsm", - "resource://gre/modules/E10SUtils.jsm": "toolkit/modules/E10SUtils.jsm", - "resource://gre/modules/EnterprisePolicies.jsm": "toolkit/components/enterprisepolicies/EnterprisePolicies.jsm", - "resource://gre/modules/EnterprisePoliciesContent.jsm": "toolkit/components/enterprisepolicies/EnterprisePoliciesContent.jsm", - "resource://gre/modules/EnterprisePoliciesParent.jsm": "toolkit/components/enterprisepolicies/EnterprisePoliciesParent.jsm", - "resource://gre/modules/EventEmitter.jsm": "toolkit/modules/EventEmitter.jsm", - "resource://gre/modules/EventPing.jsm": "toolkit/components/telemetry/pings/EventPing.jsm", - "resource://gre/modules/ExtHandlerService.jsm": "uriloader/exthandler/ExtHandlerService.jsm", - "resource://gre/modules/Extension.jsm": "toolkit/components/extensions/Extension.jsm", - "resource://gre/modules/ExtensionActions.jsm": "toolkit/components/extensions/ExtensionActions.jsm", - "resource://gre/modules/ExtensionActivityLog.jsm": "toolkit/components/extensions/ExtensionActivityLog.jsm", - "resource://gre/modules/ExtensionChild.jsm": "toolkit/components/extensions/ExtensionChild.jsm", - "resource://gre/modules/ExtensionChildDevToolsUtils.jsm": "toolkit/components/extensions/ExtensionChildDevToolsUtils.jsm", - "resource://gre/modules/ExtensionCommon.jsm": "toolkit/components/extensions/ExtensionCommon.jsm", - "resource://gre/modules/ExtensionContent.jsm": "toolkit/components/extensions/ExtensionContent.jsm", - "resource://gre/modules/ExtensionPageChild.jsm": "toolkit/components/extensions/ExtensionPageChild.jsm", - "resource://gre/modules/ExtensionParent.jsm": "toolkit/components/extensions/ExtensionParent.jsm", - "resource://gre/modules/ExtensionPermissions.jsm": "toolkit/components/extensions/ExtensionPermissions.jsm", - "resource://gre/modules/ExtensionPreferencesManager.jsm": "toolkit/components/extensions/ExtensionPreferencesManager.jsm", - "resource://gre/modules/ExtensionProcessScript.jsm": "toolkit/components/extensions/ExtensionProcessScript.jsm", - "resource://gre/modules/ExtensionScriptingStore.jsm": "toolkit/components/extensions/ExtensionScriptingStore.jsm", - "resource://gre/modules/ExtensionSearchHandler.jsm": "toolkit/components/places/ExtensionSearchHandler.jsm", - "resource://gre/modules/ExtensionSettingsStore.jsm": "toolkit/components/extensions/ExtensionSettingsStore.jsm", - "resource://gre/modules/ExtensionShortcuts.jsm": "toolkit/components/extensions/ExtensionShortcuts.jsm", - "resource://gre/modules/ExtensionStorage.jsm": "toolkit/components/extensions/ExtensionStorage.jsm", - "resource://gre/modules/ExtensionStorageComponents.jsm": "toolkit/components/extensions/storage/ExtensionStorageComponents.jsm", - "resource://gre/modules/ExtensionStorageIDB.jsm": "toolkit/components/extensions/ExtensionStorageIDB.jsm", - "resource://gre/modules/ExtensionStorageSync.jsm": "toolkit/components/extensions/ExtensionStorageSync.jsm", - "resource://gre/modules/ExtensionStorageSyncKinto.jsm": "toolkit/components/extensions/ExtensionStorageSyncKinto.jsm", - "resource://gre/modules/ExtensionTelemetry.jsm": "toolkit/components/extensions/ExtensionTelemetry.jsm", - "resource://gre/modules/ExtensionUtils.jsm": "toolkit/components/extensions/ExtensionUtils.jsm", - "resource://gre/modules/ExtensionWorkerChild.jsm": "toolkit/components/extensions/ExtensionWorkerChild.jsm", - "resource://gre/modules/FilePickerDelegate.jsm": "mobile/android/components/geckoview/FilePickerDelegate.jsm", - "resource://gre/modules/FileUtils.jsm": "toolkit/modules/FileUtils.jsm", - "resource://gre/modules/FindBarContent.jsm": "toolkit/modules/FindBarContent.jsm", - "resource://gre/modules/FindContent.jsm": "toolkit/components/extensions/FindContent.jsm", - "resource://gre/modules/Finder.jsm": "toolkit/modules/Finder.jsm", - "resource://gre/modules/FinderHighlighter.jsm": "toolkit/modules/FinderHighlighter.jsm", - "resource://gre/modules/FinderIterator.jsm": "toolkit/modules/FinderIterator.jsm", - "resource://gre/modules/FinderParent.jsm": "toolkit/modules/FinderParent.jsm", - "resource://gre/modules/FirefoxRelay.jsm": "toolkit/components/passwordmgr/FirefoxRelay.jsm", - "resource://gre/modules/FirstStartup.jsm": "toolkit/modules/FirstStartup.jsm", - "resource://gre/modules/ForgetAboutSite.jsm": "toolkit/components/forgetaboutsite/ForgetAboutSite.jsm", - "resource://gre/modules/FormHistory.jsm": "toolkit/components/satchel/FormHistory.jsm", - "resource://gre/modules/FormAutoComplete.jsm": "toolkit/components/satchel/FormHistoryAutoComplete.jsm", - "resource://gre/modules/FormHistoryStartup.jsm": "toolkit/components/satchel/FormHistoryStartup.jsm", - "resource://gre/modules/FormLikeFactory.jsm": "toolkit/modules/FormLikeFactory.jsm", - "resource://gre/modules/FxAccounts.jsm": "services/fxaccounts/FxAccounts.jsm", - "resource://gre/modules/FxAccountsClient.jsm": "services/fxaccounts/FxAccountsClient.jsm", - "resource://gre/modules/FxAccountsCommands.js": "services/fxaccounts/FxAccountsCommands.js", - "resource://gre/modules/FxAccountsCommon.js": "services/fxaccounts/FxAccountsCommon.js", - "resource://gre/modules/FxAccountsConfig.jsm": "services/fxaccounts/FxAccountsConfig.jsm", - "resource://gre/modules/FxAccountsDevice.jsm": "services/fxaccounts/FxAccountsDevice.jsm", - "resource://gre/modules/FxAccountsKeys.jsm": "services/fxaccounts/FxAccountsKeys.jsm", - "resource://gre/modules/FxAccountsPairing.jsm": "services/fxaccounts/FxAccountsPairing.jsm", - "resource://gre/modules/FxAccountsPairingChannel.js": "services/fxaccounts/FxAccountsPairingChannel.js", - "resource://gre/modules/FxAccountsProfile.jsm": "services/fxaccounts/FxAccountsProfile.jsm", - "resource://gre/modules/FxAccountsProfileClient.jsm": "services/fxaccounts/FxAccountsProfileClient.jsm", - "resource://gre/modules/FxAccountsPush.jsm": "services/fxaccounts/FxAccountsPush.jsm", - "resource://gre/modules/FxAccountsStorage.jsm": "services/fxaccounts/FxAccountsStorage.jsm", - "resource://gre/modules/FxAccountsTelemetry.jsm": "services/fxaccounts/FxAccountsTelemetry.jsm", - "resource://gre/modules/FxAccountsWebChannel.jsm": "services/fxaccounts/FxAccountsWebChannel.jsm", - "resource://gre/modules/GMPInstallManager.jsm": "toolkit/modules/GMPInstallManager.jsm", - "resource://gre/modules/GMPUtils.jsm": "toolkit/modules/GMPUtils.jsm", - "resource://gre/modules/GeckoViewAutocomplete.jsm": "mobile/android/modules/geckoview/GeckoViewAutocomplete.jsm", - "resource://gre/modules/GeckoViewAutofill.jsm": "mobile/android/modules/geckoview/GeckoViewAutofill.jsm", - "resource://gre/modules/GeckoViewChildModule.jsm": "mobile/android/modules/geckoview/GeckoViewChildModule.jsm", - "resource://gre/modules/GeckoViewConsole.jsm": "mobile/android/modules/geckoview/GeckoViewConsole.jsm", - "resource://gre/modules/GeckoViewContent.jsm": "mobile/android/modules/geckoview/GeckoViewContent.jsm", - "resource://gre/modules/GeckoViewContentBlocking.jsm": "mobile/android/modules/geckoview/GeckoViewContentBlocking.jsm", - "resource://gre/modules/GeckoViewMediaControl.jsm": "mobile/android/modules/geckoview/GeckoViewMediaControl.jsm", - "resource://gre/modules/GeckoViewModule.jsm": "mobile/android/modules/geckoview/GeckoViewModule.jsm", - "resource://gre/modules/GeckoViewNavigation.jsm": "mobile/android/modules/geckoview/GeckoViewNavigation.jsm", - "resource://gre/modules/GeckoViewPermission.jsm": "mobile/android/components/geckoview/GeckoViewPermission.jsm", - "resource://gre/modules/GeckoViewProcessHangMonitor.jsm": "mobile/android/modules/geckoview/GeckoViewProcessHangMonitor.jsm", - "resource://gre/modules/GeckoViewProgress.jsm": "mobile/android/modules/geckoview/GeckoViewProgress.jsm", - "resource://gre/modules/GeckoViewPrompt.jsm": "mobile/android/components/geckoview/GeckoViewPrompt.jsm", - "resource://gre/modules/GeckoViewPush.jsm": "mobile/android/components/geckoview/GeckoViewPush.jsm", - "resource://gre/modules/GeckoViewPushController.jsm": "mobile/android/modules/geckoview/GeckoViewPushController.jsm", - "resource://gre/modules/GeckoViewRemoteDebugger.jsm": "mobile/android/modules/geckoview/GeckoViewRemoteDebugger.jsm", - "resource://gre/modules/GeckoViewSelectionAction.jsm": "mobile/android/modules/geckoview/GeckoViewSelectionAction.jsm", - "resource://gre/modules/GeckoViewSettings.jsm": "mobile/android/modules/geckoview/GeckoViewSettings.jsm", - "resource://gre/modules/GeckoViewStartup.jsm": "mobile/android/components/geckoview/GeckoViewStartup.jsm", - "resource://gre/modules/GeckoViewStorageController.jsm": "mobile/android/modules/geckoview/GeckoViewStorageController.jsm", - "resource://gre/modules/GeckoViewTab.jsm": "mobile/android/modules/geckoview/GeckoViewTab.jsm", - "resource://gre/modules/GeckoViewTelemetry.jsm": "mobile/android/modules/geckoview/GeckoViewTelemetry.jsm", - "resource://gre/modules/GeckoViewTestUtils.jsm": "mobile/android/modules/geckoview/GeckoViewTestUtils.jsm", - "resource://gre/modules/GeckoViewWebExtension.jsm": "mobile/android/modules/geckoview/GeckoViewWebExtension.jsm", - "resource://gre/modules/Geometry.jsm": "toolkit/modules/Geometry.jsm", - "resource://gre/modules/HealthPing.jsm": "toolkit/components/telemetry/pings/HealthPing.jsm", - "resource://gre/modules/HelperAppDlg.jsm": "toolkit/mozapps/downloads/HelperAppDlg.jsm", - "resource://gre/modules/HiddenFrame.jsm": "toolkit/modules/HiddenFrame.jsm", - "resource://gre/modules/History.jsm": "toolkit/components/places/History.jsm", - "resource://gre/modules/Http.jsm": "toolkit/modules/Http.jsm", - "resource://gre/modules/IgnoreLists.jsm": "toolkit/modules/IgnoreLists.jsm", - "resource://gre/modules/ImageObjectProcessor.jsm": "dom/manifest/ImageObjectProcessor.jsm", - "resource://gre/modules/IndexedDB.jsm": "toolkit/modules/IndexedDB.jsm", - "resource://gre/modules/InlineSpellChecker.jsm": "toolkit/modules/InlineSpellChecker.jsm", - "resource://gre/modules/InlineSpellCheckerContent.jsm": "toolkit/modules/InlineSpellCheckerContent.jsm", - "resource://gre/modules/InputListAutoComplete.jsm": "toolkit/components/satchel/InputListAutoComplete.jsm", - "resource://gre/modules/InsecurePasswordUtils.jsm": "toolkit/components/passwordmgr/InsecurePasswordUtils.jsm", - "resource://gre/modules/Integration.jsm": "toolkit/modules/Integration.jsm", - "resource://gre/modules/JSONFile.jsm": "toolkit/modules/JSONFile.jsm", - "resource://gre/modules/JsonSchema.jsm": "toolkit/modules/JsonSchema.jsm", - "resource://gre/modules/KeywordUtils.jsm": "toolkit/modules/KeywordUtils.jsm", - "resource://gre/modules/LangPackMatcher.jsm": "intl/locale/LangPackMatcher.jsm", - "resource://gre/modules/LayoutUtils.jsm": "toolkit/modules/LayoutUtils.jsm", - "resource://gre/modules/LightweightThemeConsumer.jsm": "toolkit/modules/LightweightThemeConsumer.jsm", - "resource://gre/modules/LightweightThemeManager.jsm": "toolkit/mozapps/extensions/LightweightThemeManager.jsm", - "resource://gre/modules/LoadURIDelegate.jsm": "mobile/android/modules/geckoview/LoadURIDelegate.jsm", - "resource://gre/modules/LocationHelper.jsm": "dom/base/LocationHelper.jsm", - "resource://gre/modules/Log.jsm": "toolkit/modules/Log.jsm", - "resource://gre/modules/LoginAutoComplete.jsm": "toolkit/components/passwordmgr/LoginAutoComplete.jsm", - "resource://gre/modules/LoginCSVImport.jsm": "toolkit/components/passwordmgr/LoginCSVImport.jsm", - "resource://gre/modules/LoginExport.jsm": "toolkit/components/passwordmgr/LoginExport.jsm", - "resource://gre/modules/LoginFormFactory.jsm": "toolkit/components/passwordmgr/LoginFormFactory.jsm", - "resource://gre/modules/LoginHelper.jsm": "toolkit/components/passwordmgr/LoginHelper.jsm", - "resource://gre/modules/LoginInfo.jsm": "toolkit/components/passwordmgr/LoginInfo.jsm", - "resource://gre/modules/LoginManager.jsm": "toolkit/components/passwordmgr/LoginManager.jsm", - "resource://gre/modules/LoginManagerAuthPrompter.jsm": "toolkit/components/passwordmgr/LoginManagerAuthPrompter.jsm", - "resource://gre/modules/LoginManagerChild.jsm": "toolkit/components/passwordmgr/LoginManagerChild.jsm", - "resource://gre/modules/LoginManagerContextMenu.jsm": "toolkit/components/passwordmgr/LoginManagerContextMenu.jsm", - "resource://gre/modules/LoginManagerParent.jsm": "toolkit/components/passwordmgr/LoginManagerParent.jsm", - "resource://gre/modules/LoginManagerPrompter.jsm": "toolkit/components/passwordmgr/LoginManagerPrompter.jsm", - "resource://gre/modules/LoginRecipes.jsm": "toolkit/components/passwordmgr/LoginRecipes.jsm", - "resource://gre/modules/LoginRelatedRealms.jsm": "toolkit/components/passwordmgr/LoginRelatedRealms.jsm", - "resource://gre/modules/LoginStorageDelegate.jsm": "mobile/android/components/geckoview/LoginStorageDelegate.jsm", - "resource://gre/modules/LoginStore.jsm": "toolkit/components/passwordmgr/LoginStore.jsm", - "resource://gre/modules/MainProcessSingleton.jsm": "toolkit/components/processsingleton/MainProcessSingleton.jsm", - "resource://gre/modules/Manifest.jsm": "dom/manifest/Manifest.jsm", - "resource://gre/modules/ManifestFinder.jsm": "dom/manifest/ManifestFinder.jsm", - "resource://gre/modules/ManifestIcons.jsm": "dom/manifest/ManifestIcons.jsm", - "resource://gre/modules/ManifestMessagesChild.jsm": "dom/ipc/ManifestMessagesChild.jsm", - "resource://gre/modules/ManifestObtainer.jsm": "dom/manifest/ManifestObtainer.jsm", - "resource://gre/modules/ManifestProcessor.jsm": "dom/manifest/ManifestProcessor.jsm", - "resource://gre/modules/MatchURLFilters.jsm": "toolkit/components/extensions/MatchURLFilters.jsm", - "resource://gre/modules/MediaUtils.jsm": "mobile/android/modules/geckoview/MediaUtils.jsm", - "resource://gre/modules/MessageManagerProxy.jsm": "toolkit/components/extensions/MessageManagerProxy.jsm", - "resource://gre/modules/ModulesPing.jsm": "toolkit/components/telemetry/pings/ModulesPing.jsm", - "resource://gre/modules/MozProtocolHandler.jsm": "toolkit/components/mozprotocol/MozProtocolHandler.jsm", - "resource://gre/modules/NLP.jsm": "toolkit/modules/NLP.jsm", - "resource://gre/modules/NativeManifests.jsm": "toolkit/components/extensions/NativeManifests.jsm", - "resource://gre/modules/NativeMessaging.jsm": "toolkit/components/extensions/NativeMessaging.jsm", - "resource://gre/modules/NetUtil.jsm": "netwerk/base/NetUtil.jsm", - "resource://gre/modules/NetworkGeolocationProvider.jsm": "dom/system/NetworkGeolocationProvider.jsm", - "resource://gre/modules/NewPasswordModel.jsm": "toolkit/components/passwordmgr/NewPasswordModel.jsm", - "resource://gre/modules/NewTabUtils.jsm": "toolkit/modules/NewTabUtils.jsm", - "resource://gre/modules/NotificationStorage.jsm": "dom/notification/NotificationStorage.jsm", - "resource://gre/modules/OSCrypto.jsm": "toolkit/components/passwordmgr/OSCrypto.jsm", - "resource://gre/modules/OSCrypto_win.jsm": "toolkit/components/passwordmgr/OSCrypto_win.jsm", - "resource://gre/modules/OSKeyStore.jsm": "toolkit/modules/OSKeyStore.jsm", - "resource://gre/modules/ObjectUtils.jsm": "toolkit/modules/ObjectUtils.jsm", - "resource://gre/modules/OpenSearchEngine.jsm": "toolkit/components/search/OpenSearchEngine.jsm", - "resource://gre/modules/OsEnvironment.jsm": "toolkit/modules/OsEnvironment.jsm", - "resource://gre/modules/PageThumbUtils.jsm": "toolkit/components/thumbnails/PageThumbUtils.jsm", - "resource://gre/modules/PageThumbs.jsm": "toolkit/components/thumbnails/PageThumbs.jsm", - "resource://gre/modules/PageThumbsStorageService.jsm": "toolkit/components/thumbnails/PageThumbsStorageService.jsm", - "resource://gre/modules/PartitioningExceptionListService.jsm": "toolkit/components/antitracking/PartitioningExceptionListService.jsm", - "resource://gre/modules/PasswordGenerator.jsm": "toolkit/components/passwordmgr/PasswordGenerator.jsm", - "resource://gre/modules/PasswordRulesManager.jsm": "toolkit/components/passwordmgr/PasswordRulesManager.jsm", - "resource://gre/modules/PasswordRulesParser.jsm": "toolkit/components/passwordmgr/PasswordRulesParser.jsm", - "resource://gre/modules/PerformanceCounters.jsm": "toolkit/components/extensions/PerformanceCounters.jsm", - "resource://gre/modules/PermissionsUtils.jsm": "toolkit/modules/PermissionsUtils.jsm", - "resource://gre/modules/PictureInPicture.jsm": "toolkit/components/pictureinpicture/PictureInPicture.jsm", - "resource://gre/modules/PictureInPictureControls.jsm": "toolkit/components/pictureinpicture/PictureInPictureControls.jsm", - "resource://gre/modules/PlacesBackups.jsm": "toolkit/components/places/PlacesBackups.jsm", - "resource://gre/modules/PlacesDBUtils.jsm": "toolkit/components/places/PlacesDBUtils.jsm", - "resource://gre/modules/PlacesExpiration.jsm": "toolkit/components/places/PlacesExpiration.jsm", - "resource://gre/modules/PlacesPreviews.jsm": "toolkit/components/places/PlacesPreviews.jsm", - "resource://gre/modules/PlacesSyncUtils.jsm": "toolkit/components/places/PlacesSyncUtils.jsm", - "resource://gre/modules/PlacesTransactions.jsm": "toolkit/components/places/PlacesTransactions.jsm", - "resource://gre/modules/PlacesUtils.jsm": "toolkit/components/places/PlacesUtils.jsm", - "resource://gre/modules/PolicySearchEngine.jsm": "toolkit/components/search/PolicySearchEngine.jsm", - "resource://gre/modules/PopupNotifications.jsm": "toolkit/modules/PopupNotifications.jsm", - "resource://gre/modules/Preferences.jsm": "toolkit/modules/Preferences.jsm", - "resource://gre/modules/PrincipalsCollector.jsm": "toolkit/components/cleardata/PrincipalsCollector.jsm", - "resource://gre/modules/PrivateBrowsingUtils.jsm": "toolkit/modules/PrivateBrowsingUtils.jsm", - "resource://gre/modules/ProcessSelector.jsm": "dom/base/ProcessSelector.jsm", - "resource://gre/modules/ProcessType.jsm": "toolkit/modules/ProcessType.jsm", - "resource://gre/modules/ProfileAge.jsm": "toolkit/modules/ProfileAge.jsm", - "resource://gre/modules/PromiseUtils.jsm": "toolkit/modules/PromiseUtils.jsm", - "resource://gre/modules/PromiseWorker.jsm": "toolkit/components/promiseworker/PromiseWorker.jsm", - "resource://gre/modules/PromptCollection.jsm": "mobile/android/components/geckoview/PromptCollection.jsm", - "resource://gre/modules/Prompter.jsm": "toolkit/components/prompts/src/Prompter.jsm", - "resource://gre/modules/PropertyListUtils.jsm": "toolkit/modules/PropertyListUtils.jsm", - "resource://gre/modules/ProxyChannelFilter.jsm": "toolkit/components/extensions/ProxyChannelFilter.jsm", - "resource://gre/modules/PurgeTrackerService.jsm": "toolkit/components/antitracking/PurgeTrackerService.jsm", - "resource://gre/modules/RFPHelper.jsm": "toolkit/components/resistfingerprinting/RFPHelper.jsm", - "resource://gre/modules/ReaderMode.jsm": "toolkit/components/reader/ReaderMode.jsm", - "resource://gre/modules/Readerable.jsm": "toolkit/components/reader/Readerable.jsm", - "resource://gre/modules/Region.jsm": "toolkit/modules/Region.jsm", - "resource://gre/modules/RemotePageAccessManager.jsm": "toolkit/modules/RemotePageAccessManager.jsm", - "resource://gre/modules/RemoteWebNavigation.jsm": "toolkit/components/remotebrowserutils/RemoteWebNavigation.jsm", - "resource://gre/modules/ResetProfile.jsm": "toolkit/modules/ResetProfile.jsm", - "resource://gre/modules/ResponsivenessMonitor.jsm": "toolkit/modules/ResponsivenessMonitor.jsm", - "resource://gre/modules/SafeBrowsing.jsm": "toolkit/components/url-classifier/SafeBrowsing.jsm", - "resource://gre/modules/SanityTest.jsm": "toolkit/components/gfx/SanityTest.jsm", - "resource://gre/modules/Schemas.jsm": "toolkit/components/extensions/Schemas.jsm", - "resource://gre/modules/SearchEngine.jsm": "toolkit/components/search/SearchEngine.jsm", - "resource://gre/modules/SearchEngineSelector.jsm": "toolkit/components/search/SearchEngineSelector.jsm", - "resource://gre/modules/SearchService.jsm": "toolkit/components/search/SearchService.jsm", - "resource://gre/modules/SearchSettings.jsm": "toolkit/components/search/SearchSettings.jsm", - "resource://gre/modules/SearchStaticData.jsm": "toolkit/components/search/SearchStaticData.jsm", - "resource://gre/modules/SearchSuggestionController.jsm": "toolkit/components/search/SearchSuggestionController.jsm", - "resource://gre/modules/SearchSuggestions.jsm": "toolkit/components/search/SearchSuggestions.jsm", - "resource://gre/modules/SearchUtils.jsm": "toolkit/components/search/SearchUtils.jsm", - "resource://gre/modules/SecurityInfo.jsm": "toolkit/components/extensions/webrequest/SecurityInfo.jsm", - "resource://gre/modules/SelectionUtils.jsm": "toolkit/modules/SelectionUtils.jsm", - "resource://gre/modules/ServiceRequest.jsm": "toolkit/modules/ServiceRequest.jsm", - "resource://gre/modules/ServiceWorkerCleanUp.jsm": "toolkit/components/cleardata/ServiceWorkerCleanUp.jsm", - "resource://gre/modules/Services.jsm": "toolkit/modules/Services.jsm", - "resource://gre/modules/SessionStoreFunctions.jsm": "toolkit/components/sessionstore/SessionStoreFunctions.jsm", - "resource://gre/modules/ShareDelegate.jsm": "mobile/android/components/geckoview/ShareDelegate.jsm", - "resource://gre/modules/SharedPromptUtils.jsm": "toolkit/components/prompts/src/PromptUtils.jsm", - "resource://gre/modules/ShieldContentProcess.jsm": "toolkit/components/normandy/ShieldContentProcess.jsm", - "resource://gre/modules/ShortcutUtils.jsm": "toolkit/modules/ShortcutUtils.jsm", - "resource://gre/modules/SimpleServices.jsm": "toolkit/components/utils/SimpleServices.jsm", - "resource://gre/modules/SignUpFormRuleset.jsm": "toolkit/components/passwordmgr/SignUpFormRuleset.jsm", - "resource://gre/modules/SlowScriptDebug.jsm": "dom/base/SlowScriptDebug.jsm", - "resource://gre/modules/Sqlite.jsm": "toolkit/modules/Sqlite.jsm", - "resource://gre/modules/SubDialog.jsm": "toolkit/modules/SubDialog.jsm", - "resource://gre/modules/Subprocess.jsm": "toolkit/modules/subprocess/Subprocess.jsm", - "resource://gre/modules/SyncedBookmarksMirror.jsm": "toolkit/components/places/SyncedBookmarksMirror.jsm", - "resource://gre/modules/TaggingService.jsm": "toolkit/components/places/TaggingService.jsm", - "resource://gre/modules/TaskScheduler.jsm": "toolkit/components/taskscheduler/TaskScheduler.jsm", - "resource://gre/modules/TaskSchedulerMacOSImpl.jsm": "toolkit/components/taskscheduler/TaskSchedulerMacOSImpl.jsm", - "resource://gre/modules/TaskSchedulerWinImpl.jsm": "toolkit/components/taskscheduler/TaskSchedulerWinImpl.jsm", - "resource://gre/modules/TelemetryArchive.jsm": "toolkit/components/telemetry/app/TelemetryArchive.jsm", - "resource://gre/modules/TelemetryController.jsm": "toolkit/components/telemetry/app/TelemetryController.jsm", - "resource://gre/modules/TelemetryControllerBase.jsm": "toolkit/components/telemetry/app/TelemetryControllerBase.jsm", - "resource://gre/modules/TelemetryControllerContent.jsm": "toolkit/components/telemetry/app/TelemetryControllerContent.jsm", - "resource://gre/modules/TelemetryControllerParent.jsm": "toolkit/components/telemetry/app/TelemetryControllerParent.jsm", - "resource://gre/modules/TelemetryEnvironment.jsm": "toolkit/components/telemetry/app/TelemetryEnvironment.jsm", - "resource://gre/modules/TelemetryReportingPolicy.jsm": "toolkit/components/telemetry/app/TelemetryReportingPolicy.jsm", - "resource://gre/modules/TelemetryScheduler.jsm": "toolkit/components/telemetry/app/TelemetryScheduler.jsm", - "resource://gre/modules/TelemetrySend.jsm": "toolkit/components/telemetry/app/TelemetrySend.jsm", - "resource://gre/modules/TelemetrySession.jsm": "toolkit/components/telemetry/pings/TelemetrySession.jsm", - "resource://gre/modules/TelemetryStartup.jsm": "toolkit/components/telemetry/TelemetryStartup.jsm", - "resource://gre/modules/TelemetryStorage.jsm": "toolkit/components/telemetry/app/TelemetryStorage.jsm", - "resource://gre/modules/TelemetryTimestamps.jsm": "toolkit/components/telemetry/app/TelemetryTimestamps.jsm", - "resource://gre/modules/TelemetryUtils.jsm": "toolkit/components/telemetry/app/TelemetryUtils.jsm", - "resource://gre/modules/Timer.jsm": "toolkit/modules/Timer.jsm", - "resource://gre/modules/TooltipTextProvider.jsm": "toolkit/components/tooltiptext/TooltipTextProvider.jsm", - "resource://gre/modules/TrackingDBService.jsm": "toolkit/components/antitracking/TrackingDBService.jsm", - "resource://gre/modules/Troubleshoot.jsm": "toolkit/modules/Troubleshoot.jsm", - "resource://gre/modules/URIFixup.jsm": "docshell/base/URIFixup.jsm", - "resource://gre/modules/URLDecorationAnnotationsService.jsm": "toolkit/components/antitracking/URLDecorationAnnotationsService.jsm", - "resource://gre/modules/URLFormatter.jsm": "toolkit/components/urlformatter/URLFormatter.jsm", - "resource://gre/modules/URLQueryStrippingListService.jsm": "toolkit/components/antitracking/URLQueryStrippingListService.jsm", - "resource://gre/modules/UninstallPing.jsm": "toolkit/components/telemetry/pings/UninstallPing.jsm", - "resource://gre/modules/UntrustedModulesPing.jsm": "toolkit/components/telemetry/pings/UntrustedModulesPing.jsm", - "resource://gre/modules/UpdateListener.jsm": "toolkit/mozapps/update/UpdateListener.jsm", - "resource://gre/modules/UpdatePing.jsm": "toolkit/components/telemetry/pings/UpdatePing.jsm", - "resource://gre/modules/UpdateService.jsm": "toolkit/mozapps/update/UpdateService.jsm", - "resource://gre/modules/UpdateServiceStub.jsm": "toolkit/mozapps/update/UpdateServiceStub.jsm", - "resource://gre/modules/UpdateTelemetry.jsm": "toolkit/mozapps/update/UpdateTelemetry.jsm", - "resource://gre/modules/UpdateTimerManager.jsm": "toolkit/components/timermanager/UpdateTimerManager.jsm", - "resource://gre/modules/UpdateUtils.jsm": "toolkit/modules/UpdateUtils.jsm", - "resource://gre/modules/UrlClassifierExceptionListService.jsm": "netwerk/url-classifier/UrlClassifierExceptionListService.jsm", - "resource://gre/modules/UrlClassifierHashCompleter.jsm": "toolkit/components/url-classifier/UrlClassifierHashCompleter.jsm", - "resource://gre/modules/UrlClassifierLib.jsm": "toolkit/components/url-classifier/UrlClassifierLib.jsm", - "resource://gre/modules/UrlClassifierListManager.jsm": "toolkit/components/url-classifier/UrlClassifierListManager.jsm", - "resource://gre/modules/UserSearchEngine.jsm": "toolkit/components/search/UserSearchEngine.jsm", - "resource://gre/modules/ValueExtractor.jsm": "dom/manifest/ValueExtractor.jsm", - "resource://gre/modules/WebChannel.jsm": "toolkit/modules/WebChannel.jsm", - "resource://gre/modules/WebHandlerApp.jsm": "uriloader/exthandler/WebHandlerApp.jsm", - "resource://gre/modules/WebNavigation.jsm": "toolkit/components/extensions/WebNavigation.jsm", - "resource://gre/modules/WebNavigationFrames.jsm": "toolkit/components/extensions/WebNavigationFrames.jsm", - "resource://gre/modules/WebRequest.jsm": "toolkit/components/extensions/webrequest/WebRequest.jsm", - "resource://gre/modules/WebRequestUpload.jsm": "toolkit/components/extensions/webrequest/WebRequestUpload.jsm", - "resource://gre/modules/WebVTTParserWrapper.jsm": "dom/media/webvtt/WebVTTParserWrapper.jsm", - "resource://gre/modules/WellKnownOpportunisticUtils.jsm": "netwerk/protocol/http/WellKnownOpportunisticUtils.jsm", - "resource://gre/modules/WindowsRegistry.jsm": "toolkit/modules/WindowsRegistry.jsm", - "resource://gre/modules/XPCOMUtils.jsm": "js/xpconnect/loader/XPCOMUtils.jsm", - "resource://gre/modules/addonManager.js": "toolkit/mozapps/extensions/addonManager.js", - "resource://gre/modules/addons/AddonRepository.jsm": "toolkit/mozapps/extensions/internal/AddonRepository.jsm", - "resource://gre/modules/addons/AddonSettings.jsm": "toolkit/mozapps/extensions/internal/AddonSettings.jsm", - "resource://gre/modules/addons/AddonUpdateChecker.jsm": "toolkit/mozapps/extensions/internal/AddonUpdateChecker.jsm", - "resource://gre/modules/addons/GMPProvider.jsm": "toolkit/mozapps/extensions/internal/GMPProvider.jsm", - "resource://gre/modules/addons/ProductAddonChecker.jsm": "toolkit/mozapps/extensions/internal/ProductAddonChecker.jsm", - "resource://gre/modules/addons/XPIDatabase.jsm": "toolkit/mozapps/extensions/internal/XPIDatabase.jsm", - "resource://gre/modules/addons/XPIInstall.jsm": "toolkit/mozapps/extensions/internal/XPIInstall.jsm", - "resource://gre/modules/addons/XPIProvider.jsm": "toolkit/mozapps/extensions/internal/XPIProvider.jsm", - "resource://gre/modules/amContentHandler.jsm": "toolkit/mozapps/extensions/amContentHandler.jsm", - "resource://gre/modules/amInstallTrigger.jsm": "toolkit/mozapps/extensions/amInstallTrigger.jsm", - "resource://gre/modules/amWebAPI.jsm": "toolkit/mozapps/extensions/amWebAPI.jsm", - "resource://gre/modules/backgroundtasks/BackgroundTask_backgroundupdate.jsm": "toolkit/mozapps/update/BackgroundTask_backgroundupdate.jsm", - "resource://gre/modules/components-utils/ClientEnvironment.jsm": "toolkit/components/utils/ClientEnvironment.jsm", - "resource://gre/modules/components-utils/FilterExpressions.jsm": "toolkit/components/utils/FilterExpressions.jsm", - "resource://gre/modules/components-utils/JsonSchemaValidator.jsm": "toolkit/components/utils/JsonSchemaValidator.jsm", - "resource://gre/modules/components-utils/Sampling.jsm": "toolkit/components/utils/Sampling.jsm", - "resource://gre/modules/components-utils/WindowsInstallsInfo.jsm": "toolkit/components/utils/WindowsInstallsInfo.jsm", - "resource://gre/modules/components-utils/WindowsVersionInfo.jsm": "toolkit/components/utils/WindowsVersionInfo.jsm", - "resource://gre/modules/components-utils/mozjexl.js": "toolkit/components/utils/mozjexl.js", - "resource://gre/modules/crypto-SDR.js": "toolkit/components/passwordmgr/crypto-SDR.js", - "resource://gre/modules/ctypes.jsm": "toolkit/components/ctypes/ctypes.jsm", - "resource://gre/modules/handlers/HandlerList.jsm": "uriloader/exthandler/HandlerList.jsm", - "resource://gre/modules/jsdebugger.jsm": "devtools/platform/jsdebugger.jsm", - "resource://gre/modules/kvstore.jsm": "toolkit/components/kvstore/kvstore.jsm", - "resource://gre/modules/lz4.js": "toolkit/components/lz4/lz4.js", - "resource://gre/modules/lz4_internal.js": "toolkit/components/lz4/lz4_internal.js", - "resource://gre/modules/media/IdpSandbox.jsm": "dom/media/IdpSandbox.jsm", - "resource://gre/modules/media/PeerConnection.jsm": "dom/media/PeerConnection.jsm", - "resource://gre/modules/media/PeerConnectionIdp.jsm": "dom/media/PeerConnectionIdp.jsm", - "resource://gre/modules/mozIntl.jsm": "toolkit/components/mozintl/mozIntl.jsm", - "resource://gre/modules/narrate/NarrateControls.jsm": "toolkit/components/narrate/NarrateControls.jsm", - "resource://gre/modules/narrate/Narrator.jsm": "toolkit/components/narrate/Narrator.jsm", - "resource://gre/modules/narrate/VoiceSelect.jsm": "toolkit/components/narrate/VoiceSelect.jsm", - "resource://gre/modules/netwerk-dns/PublicSuffixList.jsm": "netwerk/dns/PublicSuffixList.jsm", - "resource://gre/modules/nsAsyncShutdown.jsm": "toolkit/components/asyncshutdown/nsAsyncShutdown.jsm", - "resource://gre/modules/nsCrashMonitor.jsm": "toolkit/components/crashmonitor/nsCrashMonitor.jsm", - "resource://gre/modules/nsFormAutoCompleteResult.jsm": "toolkit/components/satchel/nsFormAutoCompleteResult.jsm", - "resource://gre/modules/pdfjs.js": "toolkit/components/pdfjs/pdfjs.js", - "resource://gre/modules/policies/WindowsGPOParser.jsm": "toolkit/components/enterprisepolicies/WindowsGPOParser.jsm", - "resource://gre/modules/policies/macOSPoliciesParser.jsm": "toolkit/components/enterprisepolicies/macOSPoliciesParser.jsm", - "resource://gre/modules/psm/DER.jsm": "security/manager/ssl/DER.jsm", - "resource://gre/modules/psm/RemoteSecuritySettings.jsm": "security/manager/ssl/RemoteSecuritySettings.jsm", - "resource://gre/modules/psm/X509.jsm": "security/manager/ssl/X509.jsm", - "resource://gre/modules/reader/ReaderWorker.jsm": "toolkit/components/reader/ReaderWorker.jsm", - "resource://gre/modules/reflect.jsm": "toolkit/components/reflect/reflect.jsm", - "resource://gre/modules/remotepagemanager/MessagePort.jsm": "toolkit/components/remotepagemanager/MessagePort.jsm", - "resource://gre/modules/remotepagemanager/RemotePageManagerChild.jsm": "toolkit/components/remotepagemanager/RemotePageManagerChild.jsm", - "resource://gre/modules/remotepagemanager/RemotePageManagerParent.jsm": "toolkit/components/remotepagemanager/RemotePageManagerParent.jsm", - "resource://gre/modules/services-automation/ServicesAutomation.jsm": "services/automation/ServicesAutomation.jsm", - "resource://gre/modules/sessionstore/PrivacyFilter.jsm": "toolkit/modules/sessionstore/PrivacyFilter.jsm", - "resource://gre/modules/sessionstore/PrivacyLevel.jsm": "toolkit/modules/sessionstore/PrivacyLevel.jsm", - "resource://gre/modules/sessionstore/SessionHistory.jsm": "toolkit/modules/sessionstore/SessionHistory.jsm", - "resource://gre/modules/sessionstore/Utils.jsm": "toolkit/modules/sessionstore/Utils.jsm", - "resource://gre/modules/storage-geckoview.js": "toolkit/components/passwordmgr/storage-geckoview.js", - "resource://gre/modules/storage-json.js": "toolkit/components/passwordmgr/storage-json.js", - "resource://gre/modules/subprocess/subprocess_common.jsm": "toolkit/modules/subprocess/subprocess_common.jsm", - "resource://gre/modules/subprocess/subprocess_unix.jsm": "toolkit/modules/subprocess/subprocess_unix.jsm", - "resource://gre/modules/subprocess/subprocess_win.jsm": "toolkit/modules/subprocess/subprocess_win.jsm", - "resource://gre/modules/third_party/fathom/fathom.jsm": "toolkit/modules/third_party/fathom/fathom.jsm", - "resource://gre/modules/third_party/jsesc/jsesc.js": "toolkit/modules/third_party/jsesc/jsesc.js", - "resource://gre/modules/translation/LanguageDetector.jsm": "toolkit/components/translation/LanguageDetector.jsm", - "resource://gre/modules/txEXSLTRegExFunctions.jsm": "dom/xslt/xslt/txEXSLTRegExFunctions.jsm", - "resource://gre/modules/vtt.jsm": "dom/media/webvtt/vtt.jsm", - "resource://messaging-system/lib/Logger.jsm": "toolkit/components/messaging-system/lib/Logger.jsm", - "resource://messaging-system/lib/SpecialMessageActions.jsm": "toolkit/components/messaging-system/lib/SpecialMessageActions.jsm", - "resource://messaging-system/targeting/Targeting.jsm": "toolkit/components/messaging-system/targeting/Targeting.jsm", - "resource://mozscreenshots/Screenshot.jsm": "browser/tools/mozscreenshots/mozscreenshots/extension/Screenshot.jsm", - "resource://mozscreenshots/TestRunner.jsm": "browser/tools/mozscreenshots/mozscreenshots/extension/TestRunner.jsm", - "resource://nimbus/ExperimentAPI.jsm": "toolkit/components/nimbus/ExperimentAPI.jsm", - "resource://nimbus/lib/ExperimentManager.jsm": "toolkit/components/nimbus/lib/ExperimentManager.jsm", - "resource://nimbus/lib/ExperimentStore.jsm": "toolkit/components/nimbus/lib/ExperimentStore.jsm", - "resource://nimbus/lib/RemoteSettingsExperimentLoader.jsm": "toolkit/components/nimbus/lib/RemoteSettingsExperimentLoader.jsm", - "resource://nimbus/lib/SharedDataMap.jsm": "toolkit/components/nimbus/lib/SharedDataMap.jsm", - "resource://normandy-content/AboutPages.jsm": "toolkit/components/normandy/content/AboutPages.jsm", - "resource://normandy-content/ShieldFrameChild.jsm": "toolkit/components/normandy/content/ShieldFrameChild.jsm", - "resource://normandy-content/ShieldFrameParent.jsm": "toolkit/components/normandy/content/ShieldFrameParent.jsm", - "resource://normandy-vendor/PropTypes.js": "toolkit/components/normandy/vendor/PropTypes.js", - "resource://normandy-vendor/React.js": "toolkit/components/normandy/vendor/React.js", - "resource://normandy-vendor/ReactDOM.js": "toolkit/components/normandy/vendor/ReactDOM.js", - "resource://normandy-vendor/classnames.js": "toolkit/components/normandy/vendor/classnames.js", - "resource://normandy/Normandy.jsm": "toolkit/components/normandy/Normandy.jsm", - "resource://normandy/NormandyMigrations.jsm": "toolkit/components/normandy/NormandyMigrations.jsm", - "resource://normandy/actions/AddonRollbackAction.jsm": "toolkit/components/normandy/actions/AddonRollbackAction.jsm", - "resource://normandy/actions/AddonRolloutAction.jsm": "toolkit/components/normandy/actions/AddonRolloutAction.jsm", - "resource://normandy/actions/BaseAction.jsm": "toolkit/components/normandy/actions/BaseAction.jsm", - "resource://normandy/actions/BaseStudyAction.jsm": "toolkit/components/normandy/actions/BaseStudyAction.jsm", - "resource://normandy/actions/BranchedAddonStudyAction.jsm": "toolkit/components/normandy/actions/BranchedAddonStudyAction.jsm", - "resource://normandy/actions/ConsoleLogAction.jsm": "toolkit/components/normandy/actions/ConsoleLogAction.jsm", - "resource://normandy/actions/MessagingExperimentAction.jsm": "toolkit/components/normandy/actions/MessagingExperimentAction.jsm", - "resource://normandy/actions/PreferenceExperimentAction.jsm": "toolkit/components/normandy/actions/PreferenceExperimentAction.jsm", - "resource://normandy/actions/PreferenceRollbackAction.jsm": "toolkit/components/normandy/actions/PreferenceRollbackAction.jsm", - "resource://normandy/actions/PreferenceRolloutAction.jsm": "toolkit/components/normandy/actions/PreferenceRolloutAction.jsm", - "resource://normandy/actions/ShowHeartbeatAction.jsm": "toolkit/components/normandy/actions/ShowHeartbeatAction.jsm", - "resource://normandy/actions/schemas/index.js": "toolkit/components/normandy/actions/schemas/index.js", - "resource://normandy/lib/ActionsManager.jsm": "toolkit/components/normandy/lib/ActionsManager.jsm", - "resource://normandy/lib/AddonRollouts.jsm": "toolkit/components/normandy/lib/AddonRollouts.jsm", - "resource://normandy/lib/AddonStudies.jsm": "toolkit/components/normandy/lib/AddonStudies.jsm", - "resource://normandy/lib/CleanupManager.jsm": "toolkit/components/normandy/lib/CleanupManager.jsm", - "resource://normandy/lib/ClientEnvironment.jsm": "toolkit/components/normandy/lib/ClientEnvironment.jsm", - "resource://normandy/lib/EventEmitter.jsm": "toolkit/components/normandy/lib/EventEmitter.jsm", - "resource://normandy/lib/Heartbeat.jsm": "toolkit/components/normandy/lib/Heartbeat.jsm", - "resource://normandy/lib/LogManager.jsm": "toolkit/components/normandy/lib/LogManager.jsm", - "resource://normandy/lib/NormandyAddonManager.jsm": "toolkit/components/normandy/lib/NormandyAddonManager.jsm", - "resource://normandy/lib/NormandyApi.jsm": "toolkit/components/normandy/lib/NormandyApi.jsm", - "resource://normandy/lib/NormandyUtils.jsm": "toolkit/components/normandy/lib/NormandyUtils.jsm", - "resource://normandy/lib/PrefUtils.jsm": "toolkit/components/normandy/lib/PrefUtils.jsm", - "resource://normandy/lib/PreferenceExperiments.jsm": "toolkit/components/normandy/lib/PreferenceExperiments.jsm", - "resource://normandy/lib/PreferenceRollouts.jsm": "toolkit/components/normandy/lib/PreferenceRollouts.jsm", - "resource://normandy/lib/RecipeRunner.jsm": "toolkit/components/normandy/lib/RecipeRunner.jsm", - "resource://normandy/lib/ShieldPreferences.jsm": "toolkit/components/normandy/lib/ShieldPreferences.jsm", - "resource://normandy/lib/Storage.jsm": "toolkit/components/normandy/lib/Storage.jsm", - "resource://normandy/lib/TelemetryEvents.jsm": "toolkit/components/normandy/lib/TelemetryEvents.jsm", - "resource://normandy/lib/Uptake.jsm": "toolkit/components/normandy/lib/Uptake.jsm", - "resource://pdf.js/PdfJs.jsm": "toolkit/components/pdfjs/content/PdfJs.jsm", - "resource://pdf.js/PdfJsDefaultPreferences.jsm": "toolkit/components/pdfjs/content/PdfJsDefaultPreferences.jsm", - "resource://pdf.js/PdfJsNetwork.jsm": "toolkit/components/pdfjs/content/PdfJsNetwork.jsm", - "resource://pdf.js/PdfJsTelemetry.jsm": "toolkit/components/pdfjs/content/PdfJsTelemetry.jsm", - "resource://pdf.js/PdfSandbox.jsm": "toolkit/components/pdfjs/content/PdfSandbox.jsm", - "resource://pdf.js/PdfStreamConverter.jsm": "toolkit/components/pdfjs/content/PdfStreamConverter.jsm", - "resource://pdf.js/PdfjsChild.jsm": "toolkit/components/pdfjs/content/PdfjsChild.jsm", - "resource://pdf.js/PdfjsParent.jsm": "toolkit/components/pdfjs/content/PdfjsParent.jsm", - "resource://pdf.js/build/pdf.sandbox.external.js": "toolkit/components/pdfjs/content/build/pdf.sandbox.external.js", - "resource://reftest/AsyncSpellCheckTestHelper.jsm": "editor/AsyncSpellCheckTestHelper.jsm", - "resource://reftest/PerTestCoverageUtils.jsm": "tools/code-coverage/PerTestCoverageUtils.jsm", - "resource://reftest/ReftestFissionChild.jsm": "layout/tools/reftest/ReftestFissionChild.jsm", - "resource://reftest/ReftestFissionParent.jsm": "layout/tools/reftest/ReftestFissionParent.jsm", - "resource://reftest/StructuredLog.jsm": "testing/modules/StructuredLog.jsm", - "resource://reftest/globals.jsm": "layout/tools/reftest/globals.jsm", - "resource://reftest/manifest.jsm": "layout/tools/reftest/manifest.jsm", - "resource://reftest/reftest.jsm": "layout/tools/reftest/reftest.jsm", - "resource://services-automation/ServicesAutomation.jsm": "services/automation/ServicesAutomation.jsm", - "resource://services-common/async.js": "services/common/async.js", - "resource://services-common/hawkclient.js": "services/common/hawkclient.js", - "resource://services-common/hawkrequest.js": "services/common/hawkrequest.js", - "resource://services-common/kinto-http-client.js": "services/common/kinto-http-client.js", - "resource://services-common/kinto-offline-client.js": "services/common/kinto-offline-client.js", - "resource://services-common/kinto-storage-adapter.js": "services/common/kinto-storage-adapter.js", - "resource://services-common/logmanager.js": "services/common/logmanager.js", - "resource://services-common/observers.js": "services/common/observers.js", - "resource://services-common/rest.js": "services/common/rest.js", - "resource://services-common/tokenserverclient.js": "services/common/tokenserverclient.js", - "resource://services-common/uptake-telemetry.js": "services/common/uptake-telemetry.js", - "resource://services-common/utils.js": "services/common/utils.js", - "resource://services-crypto/WeaveCrypto.js": "services/crypto/modules/WeaveCrypto.js", - "resource://services-crypto/jwcrypto.jsm": "services/crypto/modules/jwcrypto.jsm", - "resource://services-crypto/utils.js": "services/crypto/modules/utils.js", - "resource://services-settings/Attachments.jsm": "services/settings/Attachments.jsm", - "resource://services-settings/Database.jsm": "services/settings/Database.jsm", - "resource://services-settings/IDBHelpers.jsm": "services/settings/IDBHelpers.jsm", - "resource://services-settings/RemoteSettingsClient.jsm": "services/settings/RemoteSettingsClient.jsm", - "resource://services-settings/RemoteSettingsComponents.jsm": "services/settings/RemoteSettingsComponents.jsm", - "resource://services-settings/RemoteSettingsWorker.jsm": "services/settings/RemoteSettingsWorker.jsm", - "resource://services-settings/SharedUtils.jsm": "services/settings/SharedUtils.jsm", - "resource://services-settings/SyncHistory.jsm": "services/settings/SyncHistory.jsm", - "resource://services-settings/Utils.jsm": "services/settings/Utils.jsm", - "resource://services-settings/remote-settings.js": "services/settings/remote-settings.js", - "resource://services-sync/SyncDisconnect.jsm": "services/sync/modules/SyncDisconnect.jsm", - "resource://services-sync/SyncedTabs.jsm": "services/sync/modules/SyncedTabs.jsm", - "resource://services-sync/UIState.jsm": "services/sync/modules/UIState.jsm", - "resource://services-sync/Weave.jsm": "services/sync/Weave.jsm", - "resource://services-sync/addonsreconciler.js": "services/sync/modules/addonsreconciler.js", - "resource://services-sync/addonutils.js": "services/sync/modules/addonutils.js", - "resource://services-sync/bridged_engine.js": "services/sync/modules/bridged_engine.js", - "resource://services-sync/collection_validator.js": "services/sync/modules/collection_validator.js", - "resource://services-sync/constants.js": "services/sync/modules/constants.js", - "resource://services-sync/doctor.js": "services/sync/modules/doctor.js", - "resource://services-sync/engines.js": "services/sync/modules/engines.js", - "resource://services-sync/engines/addons.js": "services/sync/modules/engines/addons.js", - "resource://services-sync/engines/bookmarks.js": "services/sync/modules/engines/bookmarks.js", - "resource://services-sync/engines/clients.js": "services/sync/modules/engines/clients.js", - "resource://services-sync/engines/extension-storage.js": "services/sync/modules/engines/extension-storage.js", - "resource://services-sync/engines/forms.js": "services/sync/modules/engines/forms.js", - "resource://services-sync/engines/history.js": "services/sync/modules/engines/history.js", - "resource://services-sync/engines/passwords.js": "services/sync/modules/engines/passwords.js", - "resource://services-sync/engines/prefs.js": "services/sync/modules/engines/prefs.js", - "resource://services-sync/engines/tabs.js": "services/sync/modules/engines/tabs.js", - "resource://services-sync/keys.js": "services/sync/modules/keys.js", - "resource://services-sync/main.js": "services/sync/modules/main.js", - "resource://services-sync/policies.js": "services/sync/modules/policies.js", - "resource://services-sync/record.js": "services/sync/modules/record.js", - "resource://services-sync/resource.js": "services/sync/modules/resource.js", - "resource://services-sync/service.js": "services/sync/modules/service.js", - "resource://services-sync/stages/declined.js": "services/sync/modules/stages/declined.js", - "resource://services-sync/stages/enginesync.js": "services/sync/modules/stages/enginesync.js", - "resource://services-sync/status.js": "services/sync/modules/status.js", - "resource://services-sync/sync_auth.js": "services/sync/modules/sync_auth.js", - "resource://services-sync/telemetry.js": "services/sync/modules/telemetry.js", - "resource://services-sync/util.js": "services/sync/modules/util.js", - "resource://specialpowers/AppTestDelegate.jsm": "testing/specialpowers/content/AppTestDelegate.jsm", - "resource://specialpowers/AppTestDelegateChild.jsm": "testing/specialpowers/content/AppTestDelegateChild.jsm", - "resource://specialpowers/AppTestDelegateParent.jsm": "testing/specialpowers/content/AppTestDelegateParent.jsm", - "resource://specialpowers/MockColorPicker.jsm": "testing/specialpowers/content/MockColorPicker.jsm", - "resource://specialpowers/MockFilePicker.jsm": "testing/specialpowers/content/MockFilePicker.jsm", - "resource://specialpowers/MockPermissionPrompt.jsm": "testing/specialpowers/content/MockPermissionPrompt.jsm", - "resource://specialpowers/SpecialPowersChild.jsm": "testing/specialpowers/content/SpecialPowersChild.jsm", - "resource://specialpowers/SpecialPowersEventUtils.jsm": "testing/specialpowers/content/SpecialPowersEventUtils.jsm", - "resource://specialpowers/SpecialPowersParent.jsm": "testing/specialpowers/content/SpecialPowersParent.jsm", - "resource://specialpowers/SpecialPowersSandbox.jsm": "testing/specialpowers/content/SpecialPowersSandbox.jsm", - "resource://specialpowers/WrapPrivileged.jsm": "testing/specialpowers/content/WrapPrivileged.jsm", - "resource://talos-powers/TalosParentProfiler.jsm": "testing/talos/talos/talos-powers/content/TalosParentProfiler.jsm", - "resource://test/AllowJavascriptChild.jsm": "docshell/test/unit/AllowJavascriptChild.jsm", - "resource://test/AllowJavascriptParent.jsm": "docshell/test/unit/AllowJavascriptParent.jsm", - "resource://test/Census.jsm": "devtools/shared/heapsnapshot/tests/xpcshell/Census.jsm", - "resource://test/CrashTestUtils.jsm": "toolkit/crashreporter/test/CrashTestUtils.jsm", - "resource://test/GlobalObjectsModule.jsm": "dom/indexedDB/test/unit/GlobalObjectsModule.jsm", - "resource://test/Match.jsm": "devtools/shared/heapsnapshot/tests/xpcshell/Match.jsm", - "resource://test/TestRunner.jsm": "browser/tools/mozscreenshots/mozscreenshots/extension/TestRunner.jsm", - "resource://test/broadcast_handler.jsm": "dom/push/test/xpcshell/broadcast_handler.jsm", - "resource://testing-common/AddonTestUtils.jsm": "toolkit/mozapps/extensions/internal/AddonTestUtils.jsm", - "resource://testing-common/AppData.jsm": "testing/modules/AppData.jsm", - "resource://testing-common/AppInfo.jsm": "testing/modules/AppInfo.jsm", - "resource://testing-common/Assert.jsm": "testing/modules/Assert.jsm", - "resource://testing-common/AsyncSpellCheckTestHelper.jsm": "editor/AsyncSpellCheckTestHelper.jsm", - "resource://testing-common/BackgroundTasksTestUtils.jsm": "toolkit/components/backgroundtasks/BackgroundTasksTestUtils.jsm", - "resource://testing-common/BrowserTestUtils.jsm": "testing/mochitest/BrowserTestUtils/BrowserTestUtils.jsm", - "resource://testing-common/BrowserTestUtilsChild.jsm": "testing/mochitest/BrowserTestUtils/BrowserTestUtilsChild.jsm", - "resource://testing-common/BrowserTestUtilsParent.jsm": "testing/mochitest/BrowserTestUtils/BrowserTestUtilsParent.jsm", - "resource://testing-common/ContentEventListenerChild.jsm": "testing/mochitest/BrowserTestUtils/ContentEventListenerChild.jsm", - "resource://testing-common/ContentEventListenerParent.jsm": "testing/mochitest/BrowserTestUtils/ContentEventListenerParent.jsm", - "resource://testing-common/ContentTask.jsm": "testing/mochitest/BrowserTestUtils/ContentTask.jsm", - "resource://testing-common/ContentTaskUtils.jsm": "testing/mochitest/BrowserTestUtils/ContentTaskUtils.jsm", - "resource://testing-common/CookieXPCShellUtils.jsm": "netwerk/cookie/CookieXPCShellUtils.jsm", - "resource://testing-common/CoverageUtils.jsm": "testing/modules/CoverageUtils.jsm", - "resource://testing-common/CrashManagerTest.jsm": "toolkit/components/crashes/CrashManagerTest.jsm", - "resource://testing-common/CustomizableUITestUtils.jsm": "browser/components/customizableui/test/CustomizableUITestUtils.jsm", - "resource://testing-common/DoHTestUtils.jsm": "browser/components/doh/DoHTestUtils.jsm", - "resource://testing-common/EnterprisePolicyTesting.jsm": "toolkit/components/enterprisepolicies/tests/EnterprisePolicyTesting.jsm", - "resource://testing-common/ExtensionTestCommon.jsm": "toolkit/components/extensions/ExtensionTestCommon.jsm", - "resource://testing-common/ExtensionXPCShellUtils.jsm": "toolkit/components/extensions/ExtensionXPCShellUtils.jsm", - "resource://testing-common/FileTestUtils.jsm": "testing/modules/FileTestUtils.jsm", - "resource://testing-common/FluentSyntax.jsm": "intl/l10n/FluentSyntax.jsm", - "resource://testing-common/FormHistoryTestUtils.jsm": "toolkit/components/satchel/test/FormHistoryTestUtils.jsm", - "resource://testing-common/HandlerServiceTestUtils.jsm": "uriloader/exthandler/tests/HandlerServiceTestUtils.jsm", - "resource://testing-common/LangPackMatcherTestUtils.jsm": "intl/locale/tests/LangPackMatcherTestUtils.jsm", - "resource://testing-common/LoginTestUtils.jsm": "toolkit/components/passwordmgr/test/LoginTestUtils.jsm", - "resource://testing-common/MessageChannel.jsm": "toolkit/components/extensions/MessageChannel.jsm", - "resource://testing-common/MockDocument.jsm": "toolkit/modules/tests/modules/MockDocument.jsm", - "resource://testing-common/MockFilePicker.jsm": "testing/specialpowers/content/MockFilePicker.jsm", - "resource://testing-common/MockRegistrar.jsm": "testing/modules/MockRegistrar.jsm", - "resource://testing-common/MockRegistry.jsm": "testing/modules/MockRegistry.jsm", - "resource://testing-common/NimbusTestUtils.jsm": "toolkit/components/nimbus/test/NimbusTestUtils.jsm", - "resource://testing-common/NormandyTestUtils.jsm": "toolkit/components/normandy/test/NormandyTestUtils.jsm", - "resource://testing-common/OSKeyStoreTestUtils.jsm": "toolkit/modules/tests/modules/OSKeyStoreTestUtils.jsm", - "resource://testing-common/PerTestCoverageUtils.jsm": "tools/code-coverage/PerTestCoverageUtils.jsm", - "resource://testing-common/PermissionTestUtils.jsm": "extensions/permissions/test/PermissionTestUtils.jsm", - "resource://testing-common/PlacesTestUtils.jsm": "toolkit/components/places/tests/PlacesTestUtils.jsm", - "resource://testing-common/PromiseTestUtils.jsm": "toolkit/modules/tests/modules/PromiseTestUtils.jsm", - "resource://testing-common/PromptTestUtils.jsm": "toolkit/components/prompts/test/PromptTestUtils.jsm", - "resource://testing-common/QuickSuggestTestUtils.jsm": "browser/components/urlbar/tests/quicksuggest/QuickSuggestTestUtils.jsm", - "resource://testing-common/RegionTestUtils.jsm": "toolkit/modules/tests/xpcshell/RegionTestUtils.jsm", - "resource://testing-common/SearchTestUtils.jsm": "toolkit/components/search/tests/SearchTestUtils.jsm", - "resource://testing-common/Sinon.jsm": "testing/modules/Sinon.jsm", - "resource://testing-common/SiteDataTestUtils.jsm": "toolkit/components/cleardata/SiteDataTestUtils.jsm", - "resource://testing-common/StructuredLog.jsm": "testing/modules/StructuredLog.jsm", - "resource://testing-common/TelemetryArchiveTesting.jsm": "toolkit/components/telemetry/tests/unit/TelemetryArchiveTesting.jsm", - "resource://testing-common/TelemetryEnvironmentTesting.jsm": "toolkit/components/telemetry/tests/unit/TelemetryEnvironmentTesting.jsm", - "resource://testing-common/TelemetryTestUtils.jsm": "toolkit/components/telemetry/tests/utils/TelemetryTestUtils.jsm", - "resource://testing-common/TestIntegration.jsm": "toolkit/modules/tests/xpcshell/TestIntegration.jsm", - "resource://testing-common/TestInterfaceJS.jsm": "dom/bindings/test/TestInterfaceJS.jsm", - "resource://testing-common/TestProcessActorChild.jsm": "toolkit/actors/TestProcessActorChild.jsm", - "resource://testing-common/TestProcessActorParent.jsm": "toolkit/actors/TestProcessActorParent.jsm", - "resource://testing-common/TestUtils.jsm": "testing/modules/TestUtils.jsm", - "resource://testing-common/TestWindowChild.jsm": "toolkit/actors/TestWindowChild.jsm", - "resource://testing-common/TestWindowParent.jsm": "toolkit/actors/TestWindowParent.jsm", - "resource://testing-common/UrlClassifierTestUtils.jsm": "toolkit/components/url-classifier/tests/UrlClassifierTestUtils.jsm", - "resource://testing-common/UrlbarTestUtils.jsm": "browser/components/urlbar/tests/UrlbarTestUtils.jsm", - "resource://testing-common/XPCShellContentUtils.jsm": "testing/modules/XPCShellContentUtils.jsm", - "resource://testing-common/backgroundtasks/BackgroundTask_automaticrestart.jsm": "toolkit/components/backgroundtasks/tests/BackgroundTask_automaticrestart.jsm", - "resource://testing-common/backgroundtasks/BackgroundTask_shouldprocessupdates.jsm": "toolkit/components/backgroundtasks/tests/BackgroundTask_shouldprocessupdates.jsm", - "resource://testing-common/backgroundtasks/BackgroundTask_wait.jsm": "toolkit/components/backgroundtasks/tests/BackgroundTask_wait.jsm", - "resource://testing-common/cookie_filtering_helper.jsm": "netwerk/test/browser/cookie_filtering_helper.jsm", - "resource://testing-common/dom/quota/test/modules/ModuleLoader.jsm": "dom/quota/test/modules/system/ModuleLoader.jsm", - "resource://testing-common/dom/quota/test/modules/StorageUtils.jsm": "dom/quota/test/modules/system/StorageUtils.jsm", - "resource://testing-common/dom/quota/test/modules/WorkerDriver.jsm": "dom/quota/test/modules/system/WorkerDriver.jsm", - "resource://testing-common/early_hint_preload_test_helper.jsm": "netwerk/test/browser/early_hint_preload_test_helper.jsm", - "resource://testing-common/httpd.js": "netwerk/test/httpserver/httpd.js", - "resource://testing-common/services/common/logging.js": "services/common/modules-testing/logging.js", - "resource://testing-common/services/sync/fakeservices.js": "services/sync/modules-testing/fakeservices.js", - "resource://testing-common/services/sync/fxa_utils.js": "services/sync/modules-testing/fxa_utils.js", - "resource://testing-common/services/sync/rotaryengine.js": "services/sync/modules-testing/rotaryengine.js", - "resource://testing-common/services/sync/utils.js": "services/sync/modules-testing/utils.js", - "resource://tps/auth/fxaccounts.jsm": "services/sync/tps/extensions/tps/resource/auth/fxaccounts.jsm", - "resource://tps/logger.jsm": "services/sync/tps/extensions/tps/resource/logger.jsm", - "resource://tps/modules/addons.jsm": "services/sync/tps/extensions/tps/resource/modules/addons.jsm", - "resource://tps/modules/bookmarkValidator.jsm": "services/sync/tps/extensions/tps/resource/modules/bookmarkValidator.jsm", - "resource://tps/modules/bookmarks.jsm": "services/sync/tps/extensions/tps/resource/modules/bookmarks.jsm", - "resource://tps/modules/formautofill.jsm": "services/sync/tps/extensions/tps/resource/modules/formautofill.jsm", - "resource://tps/modules/forms.jsm": "services/sync/tps/extensions/tps/resource/modules/forms.jsm", - "resource://tps/modules/history.jsm": "services/sync/tps/extensions/tps/resource/modules/history.jsm", - "resource://tps/modules/passwords.jsm": "services/sync/tps/extensions/tps/resource/modules/passwords.jsm", - "resource://tps/modules/prefs.jsm": "services/sync/tps/extensions/tps/resource/modules/prefs.jsm", - "resource://tps/modules/tabs.jsm": "services/sync/tps/extensions/tps/resource/modules/tabs.jsm", - "resource://tps/modules/windows.jsm": "services/sync/tps/extensions/tps/resource/modules/windows.jsm", - "resource://tps/quit.js": "services/sync/tps/extensions/tps/resource/quit.js", - "resource://tps/tps.jsm": "services/sync/tps/extensions/tps/resource/tps.jsm", - "resource://webcompat/AboutCompat.jsm": "browser/extensions/webcompat/about-compat/AboutCompat.jsm", - "resource://testing-common/PerfTestHelpers.jsm": "browser/base/content/test/performance/PerfTestHelpers.jsm", - "resource:///modules/QuickActionsLoaderDefault.jsm": "browser/components/urlbar/QuickActionsLoaderDefault.jsm", - "resource:///modules/UrlbarProviderQuickActions.jsm": "browser/components/urlbar/UrlbarProviderQuickActions.jsm", - "resource://gre/modules/UrlClassifierRemoteSettingsService.jsm": "toolkit/components/url-classifier/UrlClassifierRemoteSettingsService.jsm", - - "resource:///modules/BrowserUsageTelemetry.jsm": [ - "browser/modules/BrowserUsageTelemetry.jsm", - "mobile/android/modules/geckoview/BrowserUsageTelemetry.jsm" - ], - "resource:///modules/ExtensionBrowsingData.jsm": [ - "browser/components/extensions/ExtensionBrowsingData.jsm", - "mobile/android/components/extensions/ExtensionBrowsingData.jsm" - ], - "resource://autofill/FormAutofillPrompter.jsm": [ - "toolkit/components/formautofill/android/FormAutofillPrompter.jsm", - "toolkit/components/formautofill/default/FormAutofillPrompter.jsm" - ], - "resource://autofill/FormAutofillStorage.jsm": [ - "toolkit/components/formautofill/android/FormAutofillStorage.jsm", - "toolkit/components/formautofill/default/FormAutofillStorage.jsm" - ], - "resource://gre/modules/NotificationDB.jsm": [ - "dom/notification/new/NotificationDB.jsm", - "dom/notification/old/NotificationDB.jsm" - ], - "resource://gre/modules/XULStore.jsm": [ - "toolkit/components/xulstore/new/XULStore.jsm", - "toolkit/components/xulstore/old/XULStore.jsm" - ], - "resource://testing-common/AppUiTestDelegate.jsm": [ - "browser/components/extensions/test/AppUiTestDelegate.jsm", - "mobile/android/modules/test/AppUiTestDelegate.jsm" - ] -} diff --git a/tools/esmify/package-lock.json b/tools/esmify/package-lock.json deleted file mode 100644 index dea539947b..0000000000 --- a/tools/esmify/package-lock.json +++ /dev/null @@ -1,7895 +0,0 @@ -{ - "name": "esmify", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "devDependencies": { - "jscodeshift": "^0.13.1" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.6.tgz", - "integrity": "sha512-tzulrgDT0QD6U7BJ4TKVk2SDDg7wlP39P9yAx1RfLy7vP/7rsDRlWVfbWxElslu56+r7QOhB2NSDsabYYruoZQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.6.tgz", - "integrity": "sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helpers": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.6.tgz", - "integrity": "sha512-AIwwoOS8axIC5MZbhNHRLKi3D+DMpvDf9XUcu3pIVAfOHFT45f4AoDAltRbHIQomCipkCZxrNkfpOEHhJz/VKw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6", - "@jridgewell/gen-mapping": "^0.3.0", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.6.tgz", - "integrity": "sha512-KT10c1oWEpmrIRYnthbzHgoOf6B+Xd6a5yhdbNtdhtG7aO1or5HViuf1TQR36xY/QprXA5nvxO6nAjhJ4y38jw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.6.tgz", - "integrity": "sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.6.tgz", - "integrity": "sha512-YfDzdnoxHGV8CzqHGyCbFvXg5QESPFkXlHtvdCkesLjjVMT2Adxe4FGUR5ChIb3DxSaXO12iIOCWoXdsUVwnqw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-member-expression-to-functions": "^7.18.6", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", - "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", - "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", - "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz", - "integrity": "sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.6.tgz", - "integrity": "sha512-CeHxqwwipekotzPDUuJOfIMtcIHBuc7WAzLmTYWctVigqS5RktNMQ5bEwQSuGewzYnCtTWa3BARXeiLxDTv+Ng==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.6.tgz", - "integrity": "sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz", - "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.6.tgz", - "integrity": "sha512-z5wbmV55TveUPZlCLZvxWHtrjuJd+8inFhk7DG0WW87/oJuGDcjDiu7HIvGcpf5464L6xKCg3vNkmlVVz9hwyQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-wrap-function": "^7.18.6", - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.6.tgz", - "integrity": "sha512-fTf7zoXnUGl9gF25fXCWE26t7Tvtyn6H4hkLSYhATwJvw2uYxd3aoXplMSe0g9XbwK7bmxNes7+FGO0rB/xC0g==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-member-expression-to-functions": "^7.18.6", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.6.tgz", - "integrity": "sha512-4KoLhwGS9vGethZpAhYnMejWkX64wsnHPDwvOsKWU6Fg4+AlK2Jz3TyjQLMEPvz+1zemi/WBdkYxCD0bAfIkiw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.6.tgz", - "integrity": "sha512-I5/LZfozwMNbwr/b1vhhuYD+J/mU+gfGAj5td7l5Rv9WYmH6i3Om69WGKNmlIpsVW/mF6O5bvTKbvDQZVgjqOw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-function-name": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.6.tgz", - "integrity": "sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz", - "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.6.tgz", - "integrity": "sha512-Udgu8ZRgrBrttVz6A0EVL0SJ1z+RLbIeqsu632SA1hf0awEppD6TvdznoH+orIF8wtFFAV/Enmw9Y+9oV8TQcw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz", - "integrity": "sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", - "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.6.tgz", - "integrity": "sha512-zr/QcUlUo7GPo6+X1wC98NJADqmy5QTFWWhqeQWiki4XHafJtLl/YMGkmRB2szDD2IYJCCdBTd4ElwhId9T7Xw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.6.tgz", - "integrity": "sha512-zMo66azZth/0tVd7gmkxOkOjs2rpHyhpcFo565PUP37hSp6hSd9uUKIfTDFMz58BwqgQKhJ9YxtM5XddjXVn+Q==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.6.tgz", - "integrity": "sha512-9yuM6wr4rIsKa1wlUAbZEazkCrgw2sMPEXCr4Rnwetu7cEW1NydkCWytLuYletbf8vFxdJxFhwEZqMpOx2eZyw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/compat-data": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.6.tgz", - "integrity": "sha512-PatI6elL5eMzoypFAiYDpYQyMtXTn+iMhuxxQt5mAXD4fEmKorpSI3PHd+i3JXBJN3xyA6MvJv7at23HffFHwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", - "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-flow": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz", - "integrity": "sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", - "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", - "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", - "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", - "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.6.tgz", - "integrity": "sha512-pRqwb91C42vs1ahSAWJkxOxU1RHWDn16XAa6ggQ72wjLlWyYeAcLvTtE0aM8ph3KNydy9CQF2nLYcjq1WysgxQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.6.tgz", - "integrity": "sha512-XTg8XW/mKpzAF3actL554Jl/dOYoJtv3l8fxaEczpgz84IeeVf+T1u2CSvPHuZbt0w3JkIx4rdn/MRQI7mo0HQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.6.tgz", - "integrity": "sha512-9repI4BhNrR0KenoR9vm3/cIc1tSBIo+u1WVjKCAynahj25O8zfbiE6JtAtHPGQSs4yZ+bA8mRasRP+qc+2R5A==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.6.tgz", - "integrity": "sha512-tgy3u6lRp17ilY8r1kP4i2+HDUwxlVqq3RTc943eAWSzGgpU1qhiKpqZ5CMyHReIYPHdo3Kg8v8edKtDqSVEyQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.6.tgz", - "integrity": "sha512-NJU26U/208+sxYszf82nmGYqVF9QN8py2HFTblPT9hbawi8+1C5a9JubODLTGFuT0qlkqVinmkwOD13s0sZktg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.18.6.tgz", - "integrity": "sha512-wE0xtA7csz+hw4fKPwxmu5jnzAsXPIO57XnRwzXP3T19jWh1BODnPGoG9xKYwvAwusP7iUktHayRFbMPGtODaQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-flow": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.6.tgz", - "integrity": "sha512-WAjoMf4wIiSsy88KmG7tgj2nFdEK7E46tArVtcgED7Bkj6Fg/tG5SbvNIOKxbFS2VFgNh6+iaPswBeQZm4ox8w==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.6.tgz", - "integrity": "sha512-kJha/Gbs5RjzIu0CxZwf5e3aTTSlhZnHMT8zPWnJMjNpLOUgqevg+PN5oMH68nMCXnfiMo4Bhgxqj59KHTlAnA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.6.tgz", - "integrity": "sha512-x3HEw0cJZVDoENXOp20HlypIHfl0zMIhMVZEBVTfmqbObIpsMxMbmU5nOEO8R7LYT+z5RORKPlTI5Hj4OsO9/Q==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", - "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", - "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.6.tgz", - "integrity": "sha512-UbPYpXxLjTw6w6yXX2BYNxF3p6QY225wcTkfQCy3OMnSlS/C3xGtwUjEzGkldb/sy6PWLiCQ3NbYfjWUTI3t4g==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", - "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.6.tgz", - "integrity": "sha512-FjdqgMv37yVl/gwvzkcB+wfjRI8HQmc5EgOG9iGNvUY1ok+TjsoaMP7IqCDZBhkFcM5f3OPVMs6Dmp03C5k4/A==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", - "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "regenerator-transform": "^0.15.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.6.tgz", - "integrity": "sha512-ayT53rT/ENF8WWexIRg9AiV9h0aIteyWn5ptfZTZQrjk/+f3WdrJGCY4c9wcgl2+MKkKPhzbYp97FTsquZpDCw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.6.tgz", - "integrity": "sha512-UuqlRrQmT2SWRvahW46cGSany0uTlcj8NYOS5sRGYi8FxPYPoLd5DDmMd32ZXEj2Jq+06uGVQKHxa/hJx2EzKw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.6.tgz", - "integrity": "sha512-7m71iS/QhsPk85xSjFPovHPcH3H9qeyzsujhTc+vcdnsXavoWYJ74zx0lP5RhpC5+iDnVLO+PPMHzC11qels1g==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.6.tgz", - "integrity": "sha512-ijHNhzIrLj5lQCnI6aaNVRtGVuUZhOXFLRVFs7lLrkXTHip4FKty5oAuQdk4tywG0/WjXmjTfQCWmuzrvFer1w==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-typescript": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz", - "integrity": "sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.6.tgz", - "integrity": "sha512-WrthhuIIYKrEFAwttYzgRNQ5hULGmwTj+D6l7Zdfsv5M7IWV/OZbUfbeL++Qrzx1nVJwWROIFhCHRYQV4xbPNw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/compat-data": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.6", - "@babel/plugin-proposal-async-generator-functions": "^7.18.6", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.6", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.6", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.18.6", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.6", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.18.6", - "@babel/plugin-transform-classes": "^7.18.6", - "@babel/plugin-transform-computed-properties": "^7.18.6", - "@babel/plugin-transform-destructuring": "^7.18.6", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.6", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.6", - "@babel/plugin-transform-function-name": "^7.18.6", - "@babel/plugin-transform-literals": "^7.18.6", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.18.6", - "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.6", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.18.6", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.6", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.6", - "@babel/plugin-transform-typeof-symbol": "^7.18.6", - "@babel/plugin-transform-unicode-escapes": "^7.18.6", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.6", - "babel-plugin-polyfill-corejs2": "^0.3.1", - "babel-plugin-polyfill-corejs3": "^0.5.2", - "babel-plugin-polyfill-regenerator": "^0.3.1", - "core-js-compat": "^3.22.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-flow": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.18.6.tgz", - "integrity": "sha512-E7BDhL64W6OUqpuyHnSroLnqyRTcG6ZdOBl1OKI/QK/HJfplqK/S3sq1Cckx7oTodJ5yOXyfw7rEADJ6UjoQDQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-flow-strip-types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", - "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-typescript": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/register": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.18.6.tgz", - "integrity": "sha512-tkYtONzaO8rQubZzpBnvZPFcHgh8D9F55IjOsYton4X2IBoyRn2ZSWQqySTZnUn2guZbxbQiAB27hJEbvXamhQ==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "find-cache-dir": "^2.0.0", - "make-dir": "^2.1.0", - "pirates": "^4.0.5", - "source-map-support": "^0.5.16" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.6.tgz", - "integrity": "sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==", - "dev": true, - "peer": true, - "dependencies": { - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", - "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.6.tgz", - "integrity": "sha512-zS/OKyqmD7lslOtFqbscH6gMLFYOfG1YPqCKfAW5KrTeolKqvB8UelR49Fpr6y93kYkW2Ik00mT1LOGiAGvizw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.6.tgz", - "integrity": "sha512-NdBNzPDwed30fZdDQtVR7ZgaO4UKjuaQFH9VArS+HMnurlOY0JWN+4ROlu/iapMFwjRQU4pOG4StZfDmulEwGA==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.8.tgz", - "integrity": "sha512-YK5G9LaddzGbcucK4c8h5tWFmMPBvRZ/uyWmN1/SbBdIvqGUdWGkJ5BAaccgs6XbzVLsqbPJrBSFwKv3kT9i7w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", - "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ast-types": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", - "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", - "dev": true, - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/babel-core": { - "version": "7.0.0-bridge.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", - "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", - "dev": true, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "dependencies": { - "object.assign": "^4.1.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", - "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.1", - "semver": "^6.1.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", - "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.1", - "core-js-compat": "^3.21.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", - "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/braces/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/browserslist": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.0.tgz", - "integrity": "sha512-UQxE0DIhRB5z/zDz9iA03BOfxaN2+GQdBYH/2WrSIWEUrnpzTPJbhqt+umq6r3acaPRTW1FNTkrcp0PXgtFkvA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001358", - "electron-to-chromium": "^1.4.164", - "node-releases": "^2.0.5", - "update-browserslist-db": "^1.0.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001359", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001359.tgz", - "integrity": "sha512-Xln/BAsPzEuiVLgJ2/45IaqD9jShtk3Y33anKb4+yLwQzws3+v6odKfpgES/cDEaZMLzSChpIGdbOYtH9MyuHw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", - "dev": true, - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/core-js-compat": { - "version": "3.23.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.23.3.tgz", - "integrity": "sha512-WSzUs2h2vvmKsacLHNTdpyOC9k43AEhcGoFlVgCY4L7aw98oSBKtPL6vD0/TqZjRWRQYdDSLkzZIni4Crbbiqw==", - "dev": true, - "peer": true, - "dependencies": { - "browserslist": "^4.21.0", - "semver": "7.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.172", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.172.tgz", - "integrity": "sha512-yDoFfTJnqBAB6hSiPvzmsBJSrjOXJtHSJoqJdI/zSIh7DYupYnIOHt/bbPw/WE31BJjNTybDdNAs21gCMnTh0Q==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", - "dev": true, - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fill-range/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/flow-parser": { - "version": "0.181.1", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.181.1.tgz", - "integrity": "sha512-+Mx87/GkmF5+FHk8IXc5WppD/oC4wB+05MuIv7qmIMgThND3RhOBGl7Npyc2L7NLVenme00ZlwEKVieiMz4bqA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", - "dev": true, - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", - "dev": true, - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", - "dev": true, - "peer": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/jscodeshift": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.13.1.tgz", - "integrity": "sha512-lGyiEbGOvmMRKgWk4vf+lUrCWO/8YR8sUR3FKF1Cq5fovjZDlIcw3Hu5ppLHAnEXshVffvaM0eyuY/AbOeYpnQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.13.16", - "@babel/parser": "^7.13.16", - "@babel/plugin-proposal-class-properties": "^7.13.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", - "@babel/plugin-proposal-optional-chaining": "^7.13.12", - "@babel/plugin-transform-modules-commonjs": "^7.13.8", - "@babel/preset-flow": "^7.13.13", - "@babel/preset-typescript": "^7.13.0", - "@babel/register": "^7.13.16", - "babel-core": "^7.0.0-bridge.0", - "chalk": "^4.1.2", - "flow-parser": "0.*", - "graceful-fs": "^4.2.4", - "micromatch": "^3.1.10", - "neo-async": "^2.5.0", - "node-dir": "^0.1.17", - "recast": "^0.20.4", - "temp": "^0.8.4", - "write-file-atomic": "^2.3.0" - }, - "bin": { - "jscodeshift": "bin/jscodeshift.js" - }, - "peerDependencies": { - "@babel/preset-env": "^7.1.6" - } - }, - "node_modules/jscodeshift/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jscodeshift/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jscodeshift/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jscodeshift/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jscodeshift/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jscodeshift/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true, - "peer": true - }, - "node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", - "dev": true, - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/node-dir": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", - "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==", - "dev": true, - "dependencies": { - "minimatch": "^3.0.2" - }, - "engines": { - "node": ">= 0.10.5" - } - }, - "node_modules/node-releases": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", - "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==", - "dev": true - }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", - "dev": true, - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", - "dev": true, - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "peer": true - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/recast": { - "version": "0.20.5", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.20.5.tgz", - "integrity": "sha512-E5qICoPoNL4yU0H0NoBDntNB0Q5oMSNh9usFctYniLBluTthi3RsQVBXIJNbApOlvSwW/RGxIuokPcAc59J5fQ==", - "dev": true, - "dependencies": { - "ast-types": "0.14.2", - "esprima": "~4.0.0", - "source-map": "~0.6.1", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true, - "peer": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", - "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", - "dev": true, - "peer": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true, - "peer": true - }, - "node_modules/regenerator-transform": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", - "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regexpu-core": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", - "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", - "dev": true, - "peer": true, - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", - "dev": true, - "peer": true - }, - "node_modules/regjsparser": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", - "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", - "dev": true, - "peer": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "peer": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "peer": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true - }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", - "dev": true, - "dependencies": { - "ret": "~0.1.10" - } - }, - "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/snapdragon/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dev": true, - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated", - "dev": true - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", - "dev": true, - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/temp": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz", - "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==", - "dev": true, - "dependencies": { - "rimraf": "~2.6.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "peer": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/union-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", - "dev": true, - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", - "dev": true, - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", - "dev": true, - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz", - "integrity": "sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true - }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.6.tgz", - "integrity": "sha512-tzulrgDT0QD6U7BJ4TKVk2SDDg7wlP39P9yAx1RfLy7vP/7rsDRlWVfbWxElslu56+r7QOhB2NSDsabYYruoZQ==", - "dev": true - }, - "@babel/core": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.6.tgz", - "integrity": "sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helpers": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - } - }, - "@babel/generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.6.tgz", - "integrity": "sha512-AIwwoOS8axIC5MZbhNHRLKi3D+DMpvDf9XUcu3pIVAfOHFT45f4AoDAltRbHIQomCipkCZxrNkfpOEHhJz/VKw==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6", - "@jridgewell/gen-mapping": "^0.3.0", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.6.tgz", - "integrity": "sha512-KT10c1oWEpmrIRYnthbzHgoOf6B+Xd6a5yhdbNtdhtG7aO1or5HViuf1TQR36xY/QprXA5nvxO6nAjhJ4y38jw==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.6.tgz", - "integrity": "sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", - "semver": "^6.3.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.6.tgz", - "integrity": "sha512-YfDzdnoxHGV8CzqHGyCbFvXg5QESPFkXlHtvdCkesLjjVMT2Adxe4FGUR5ChIb3DxSaXO12iIOCWoXdsUVwnqw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-member-expression-to-functions": "^7.18.6", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", - "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.1.0" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", - "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", - "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==", - "dev": true - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "dev": true, - "peer": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-function-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz", - "integrity": "sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw==", - "dev": true, - "requires": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.6.tgz", - "integrity": "sha512-CeHxqwwipekotzPDUuJOfIMtcIHBuc7WAzLmTYWctVigqS5RktNMQ5bEwQSuGewzYnCtTWa3BARXeiLxDTv+Ng==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.6.tgz", - "integrity": "sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz", - "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.6.tgz", - "integrity": "sha512-z5wbmV55TveUPZlCLZvxWHtrjuJd+8inFhk7DG0WW87/oJuGDcjDiu7HIvGcpf5464L6xKCg3vNkmlVVz9hwyQ==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-wrap-function": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-replace-supers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.6.tgz", - "integrity": "sha512-fTf7zoXnUGl9gF25fXCWE26t7Tvtyn6H4hkLSYhATwJvw2uYxd3aoXplMSe0g9XbwK7bmxNes7+FGO0rB/xC0g==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-member-expression-to-functions": "^7.18.6", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.6.tgz", - "integrity": "sha512-4KoLhwGS9vGethZpAhYnMejWkX64wsnHPDwvOsKWU6Fg4+AlK2Jz3TyjQLMEPvz+1zemi/WBdkYxCD0bAfIkiw==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.6.tgz", - "integrity": "sha512-I5/LZfozwMNbwr/b1vhhuYD+J/mU+gfGAj5td7l5Rv9WYmH6i3Om69WGKNmlIpsVW/mF6O5bvTKbvDQZVgjqOw==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-function-name": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/helpers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.6.tgz", - "integrity": "sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ==", - "dev": true, - "requires": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz", - "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==", - "dev": true - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.6.tgz", - "integrity": "sha512-Udgu8ZRgrBrttVz6A0EVL0SJ1z+RLbIeqsu632SA1hf0awEppD6TvdznoH+orIF8wtFFAV/Enmw9Y+9oV8TQcw==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.6" - } - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz", - "integrity": "sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", - "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.6.tgz", - "integrity": "sha512-zr/QcUlUo7GPo6+X1wC98NJADqmy5QTFWWhqeQWiki4XHafJtLl/YMGkmRB2szDD2IYJCCdBTd4ElwhId9T7Xw==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.6.tgz", - "integrity": "sha512-zMo66azZth/0tVd7gmkxOkOjs2rpHyhpcFo565PUP37hSp6hSd9uUKIfTDFMz58BwqgQKhJ9YxtM5XddjXVn+Q==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.6.tgz", - "integrity": "sha512-9yuM6wr4rIsKa1wlUAbZEazkCrgw2sMPEXCr4Rnwetu7cEW1NydkCWytLuYletbf8vFxdJxFhwEZqMpOx2eZyw==", - "dev": true, - "peer": true, - "requires": { - "@babel/compat-data": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.18.6" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.6.tgz", - "integrity": "sha512-PatI6elL5eMzoypFAiYDpYQyMtXTn+iMhuxxQt5mAXD4fEmKorpSI3PHd+i3JXBJN3xyA6MvJv7at23HffFHwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", - "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-flow": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz", - "integrity": "sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", - "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", - "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", - "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", - "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.6.tgz", - "integrity": "sha512-pRqwb91C42vs1ahSAWJkxOxU1RHWDn16XAa6ggQ72wjLlWyYeAcLvTtE0aM8ph3KNydy9CQF2nLYcjq1WysgxQ==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.6.tgz", - "integrity": "sha512-XTg8XW/mKpzAF3actL554Jl/dOYoJtv3l8fxaEczpgz84IeeVf+T1u2CSvPHuZbt0w3JkIx4rdn/MRQI7mo0HQ==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.6.tgz", - "integrity": "sha512-9repI4BhNrR0KenoR9vm3/cIc1tSBIo+u1WVjKCAynahj25O8zfbiE6JtAtHPGQSs4yZ+bA8mRasRP+qc+2R5A==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.6.tgz", - "integrity": "sha512-tgy3u6lRp17ilY8r1kP4i2+HDUwxlVqq3RTc943eAWSzGgpU1qhiKpqZ5CMyHReIYPHdo3Kg8v8edKtDqSVEyQ==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.6.tgz", - "integrity": "sha512-NJU26U/208+sxYszf82nmGYqVF9QN8py2HFTblPT9hbawi8+1C5a9JubODLTGFuT0qlkqVinmkwOD13s0sZktg==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-flow-strip-types": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.18.6.tgz", - "integrity": "sha512-wE0xtA7csz+hw4fKPwxmu5jnzAsXPIO57XnRwzXP3T19jWh1BODnPGoG9xKYwvAwusP7iUktHayRFbMPGtODaQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-flow": "^7.18.6" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.6.tgz", - "integrity": "sha512-WAjoMf4wIiSsy88KmG7tgj2nFdEK7E46tArVtcgED7Bkj6Fg/tG5SbvNIOKxbFS2VFgNh6+iaPswBeQZm4ox8w==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.6.tgz", - "integrity": "sha512-kJha/Gbs5RjzIu0CxZwf5e3aTTSlhZnHMT8zPWnJMjNpLOUgqevg+PN5oMH68nMCXnfiMo4Bhgxqj59KHTlAnA==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.6.tgz", - "integrity": "sha512-x3HEw0cJZVDoENXOp20HlypIHfl0zMIhMVZEBVTfmqbObIpsMxMbmU5nOEO8R7LYT+z5RORKPlTI5Hj4OsO9/Q==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", - "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", - "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.6.tgz", - "integrity": "sha512-UbPYpXxLjTw6w6yXX2BYNxF3p6QY225wcTkfQCy3OMnSlS/C3xGtwUjEzGkldb/sy6PWLiCQ3NbYfjWUTI3t4g==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", - "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.6.tgz", - "integrity": "sha512-FjdqgMv37yVl/gwvzkcB+wfjRI8HQmc5EgOG9iGNvUY1ok+TjsoaMP7IqCDZBhkFcM5f3OPVMs6Dmp03C5k4/A==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", - "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "regenerator-transform": "^0.15.0" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.6.tgz", - "integrity": "sha512-ayT53rT/ENF8WWexIRg9AiV9h0aIteyWn5ptfZTZQrjk/+f3WdrJGCY4c9wcgl2+MKkKPhzbYp97FTsquZpDCw==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.6.tgz", - "integrity": "sha512-UuqlRrQmT2SWRvahW46cGSany0uTlcj8NYOS5sRGYi8FxPYPoLd5DDmMd32ZXEj2Jq+06uGVQKHxa/hJx2EzKw==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.6.tgz", - "integrity": "sha512-7m71iS/QhsPk85xSjFPovHPcH3H9qeyzsujhTc+vcdnsXavoWYJ74zx0lP5RhpC5+iDnVLO+PPMHzC11qels1g==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-typescript": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.6.tgz", - "integrity": "sha512-ijHNhzIrLj5lQCnI6aaNVRtGVuUZhOXFLRVFs7lLrkXTHip4FKty5oAuQdk4tywG0/WjXmjTfQCWmuzrvFer1w==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-typescript": "^7.18.6" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz", - "integrity": "sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/preset-env": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.6.tgz", - "integrity": "sha512-WrthhuIIYKrEFAwttYzgRNQ5hULGmwTj+D6l7Zdfsv5M7IWV/OZbUfbeL++Qrzx1nVJwWROIFhCHRYQV4xbPNw==", - "dev": true, - "peer": true, - "requires": { - "@babel/compat-data": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.6", - "@babel/plugin-proposal-async-generator-functions": "^7.18.6", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.6", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.6", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.18.6", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.6", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.18.6", - "@babel/plugin-transform-classes": "^7.18.6", - "@babel/plugin-transform-computed-properties": "^7.18.6", - "@babel/plugin-transform-destructuring": "^7.18.6", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.6", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.6", - "@babel/plugin-transform-function-name": "^7.18.6", - "@babel/plugin-transform-literals": "^7.18.6", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.18.6", - "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.6", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.18.6", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.6", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.6", - "@babel/plugin-transform-typeof-symbol": "^7.18.6", - "@babel/plugin-transform-unicode-escapes": "^7.18.6", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.6", - "babel-plugin-polyfill-corejs2": "^0.3.1", - "babel-plugin-polyfill-corejs3": "^0.5.2", - "babel-plugin-polyfill-regenerator": "^0.3.1", - "core-js-compat": "^3.22.1", - "semver": "^6.3.0" - } - }, - "@babel/preset-flow": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.18.6.tgz", - "integrity": "sha512-E7BDhL64W6OUqpuyHnSroLnqyRTcG6ZdOBl1OKI/QK/HJfplqK/S3sq1Cckx7oTodJ5yOXyfw7rEADJ6UjoQDQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-flow-strip-types": "^7.18.6" - } - }, - "@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/preset-typescript": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", - "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-typescript": "^7.18.6" - } - }, - "@babel/register": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.18.6.tgz", - "integrity": "sha512-tkYtONzaO8rQubZzpBnvZPFcHgh8D9F55IjOsYton4X2IBoyRn2ZSWQqySTZnUn2guZbxbQiAB27hJEbvXamhQ==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "find-cache-dir": "^2.0.0", - "make-dir": "^2.1.0", - "pirates": "^4.0.5", - "source-map-support": "^0.5.16" - } - }, - "@babel/runtime": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.6.tgz", - "integrity": "sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==", - "dev": true, - "peer": true, - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", - "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/traverse": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.6.tgz", - "integrity": "sha512-zS/OKyqmD7lslOtFqbscH6gMLFYOfG1YPqCKfAW5KrTeolKqvB8UelR49Fpr6y93kYkW2Ik00mT1LOGiAGvizw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.6.tgz", - "integrity": "sha512-NdBNzPDwed30fZdDQtVR7ZgaO4UKjuaQFH9VArS+HMnurlOY0JWN+4ROlu/iapMFwjRQU4pOG4StZfDmulEwGA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.8.tgz", - "integrity": "sha512-YK5G9LaddzGbcucK4c8h5tWFmMPBvRZ/uyWmN1/SbBdIvqGUdWGkJ5BAaccgs6XbzVLsqbPJrBSFwKv3kT9i7w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", - "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", - "dev": true - }, - "ast-types": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", - "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", - "dev": true, - "requires": { - "tslib": "^2.0.1" - } - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "babel-core": { - "version": "7.0.0-bridge.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", - "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", - "dev": true, - "requires": {} - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", - "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", - "dev": true, - "peer": true, - "requires": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.1", - "semver": "^6.1.1" - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", - "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.1", - "core-js-compat": "^3.21.0" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", - "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", - "dev": true, - "peer": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.1" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - } - } - }, - "browserslist": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.0.tgz", - "integrity": "sha512-UQxE0DIhRB5z/zDz9iA03BOfxaN2+GQdBYH/2WrSIWEUrnpzTPJbhqt+umq6r3acaPRTW1FNTkrcp0PXgtFkvA==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001358", - "electron-to-chromium": "^1.4.164", - "node-releases": "^2.0.5", - "update-browserslist-db": "^1.0.0" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "caniuse-lite": { - "version": "1.0.30001359", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001359.tgz", - "integrity": "sha512-Xln/BAsPzEuiVLgJ2/45IaqD9jShtk3Y33anKb4+yLwQzws3+v6odKfpgES/cDEaZMLzSChpIGdbOYtH9MyuHw==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", - "dev": true - }, - "core-js-compat": { - "version": "3.23.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.23.3.tgz", - "integrity": "sha512-WSzUs2h2vvmKsacLHNTdpyOC9k43AEhcGoFlVgCY4L7aw98oSBKtPL6vD0/TqZjRWRQYdDSLkzZIni4Crbbiqw==", - "dev": true, - "peer": true, - "requires": { - "browserslist": "^4.21.0", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "peer": true - } - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==", - "dev": true - }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "electron-to-chromium": { - "version": "1.4.172", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.172.tgz", - "integrity": "sha512-yDoFfTJnqBAB6hSiPvzmsBJSrjOXJtHSJoqJdI/zSIh7DYupYnIOHt/bbPw/WE31BJjNTybDdNAs21gCMnTh0Q==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "peer": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - } - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "flow-parser": { - "version": "0.181.1", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.181.1.tgz", - "integrity": "sha512-+Mx87/GkmF5+FHk8IXc5WppD/oC4wB+05MuIv7qmIMgThND3RhOBGl7Npyc2L7NLVenme00ZlwEKVieiMz4bqA==", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", - "dev": true, - "peer": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "jscodeshift": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.13.1.tgz", - "integrity": "sha512-lGyiEbGOvmMRKgWk4vf+lUrCWO/8YR8sUR3FKF1Cq5fovjZDlIcw3Hu5ppLHAnEXshVffvaM0eyuY/AbOeYpnQ==", - "dev": true, - "requires": { - "@babel/core": "^7.13.16", - "@babel/parser": "^7.13.16", - "@babel/plugin-proposal-class-properties": "^7.13.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", - "@babel/plugin-proposal-optional-chaining": "^7.13.12", - "@babel/plugin-transform-modules-commonjs": "^7.13.8", - "@babel/preset-flow": "^7.13.13", - "@babel/preset-typescript": "^7.13.0", - "@babel/register": "^7.13.16", - "babel-core": "^7.0.0-bridge.0", - "chalk": "^4.1.2", - "flow-parser": "0.*", - "graceful-fs": "^4.2.4", - "micromatch": "^3.1.10", - "neo-async": "^2.5.0", - "node-dir": "^0.1.17", - "recast": "^0.20.4", - "temp": "^0.8.4", - "write-file-atomic": "^2.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true, - "peer": true - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node-dir": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", - "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==", - "dev": true, - "requires": { - "minimatch": "^3.0.2" - } - }, - "node-releases": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", - "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "peer": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", - "dev": true - }, - "recast": { - "version": "0.20.5", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.20.5.tgz", - "integrity": "sha512-E5qICoPoNL4yU0H0NoBDntNB0Q5oMSNh9usFctYniLBluTthi3RsQVBXIJNbApOlvSwW/RGxIuokPcAc59J5fQ==", - "dev": true, - "requires": { - "ast-types": "0.14.2", - "esprima": "~4.0.0", - "source-map": "~0.6.1", - "tslib": "^2.0.1" - } - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true, - "peer": true - }, - "regenerate-unicode-properties": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", - "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", - "dev": true, - "peer": true, - "requires": { - "regenerate": "^1.4.2" - } - }, - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true, - "peer": true - }, - "regenerator-transform": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", - "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", - "dev": true, - "peer": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexpu-core": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", - "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", - "dev": true, - "peer": true, - "requires": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" - } - }, - "regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", - "dev": true, - "peer": true - }, - "regjsparser": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", - "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", - "dev": true, - "peer": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "peer": true - } - } - }, - "repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "peer": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - } - } - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "peer": true - }, - "temp": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz", - "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==", - "dev": true, - "requires": { - "rimraf": "~2.6.2" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true, - "peer": true - }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "peer": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", - "dev": true, - "peer": true - }, - "unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", - "dev": true, - "peer": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - } - } - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", - "dev": true - } - } - }, - "update-browserslist-db": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz", - "integrity": "sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", - "dev": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - } - } -} diff --git a/tools/esmify/package.json b/tools/esmify/package.json deleted file mode 100644 index 152aaae5da..0000000000 --- a/tools/esmify/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "devDependencies": { - "jscodeshift": "^0.13.1" - }, - "scripts": { - "convert_module": "jscodeshift -t use-import-export-declarations.js --stdin --verbose=2", - "rewrite_imports": "jscodeshift -t import-to-import_esmodule.js --stdin --verbose=2" - } -} diff --git a/tools/esmify/static-import.js b/tools/esmify/static-import.js deleted file mode 100644 index e99bfb3380..0000000000 --- a/tools/esmify/static-import.js +++ /dev/null @@ -1,147 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -/* eslint-env node */ - -const _path = require("path"); -const { getESMFiles } = require(_path.resolve(__dirname, "./is-esmified.js")); -const { - esmifyExtension, - isString, - warnForPath, - isMemberExpressionWithIdentifiers, -} = require(_path.resolve(__dirname, "./utils.js")); - -function isTargetESM(resourceURI) { - if ("ESMIFY_TARGET_PREFIX" in process.env) { - const files = getESMFiles(resourceURI); - const targetPrefix = process.env.ESMIFY_TARGET_PREFIX; - for (const esm of files) { - if (esm.startsWith(targetPrefix)) { - return true; - } - } - - return false; - } - - return true; -} - -function isImportESModuleCall(node) { - return isMemberExpressionWithIdentifiers(node.callee, [ - "ChromeUtils", - "importESModule", - ]); -} - -// Replace `ChromeUtils.import`, `Cu.import`, and `ChromeUtils.importESModule` -// with static import if it's at the top-level of system ESM file. -function tryReplacingWithStaticImport( - jscodeshift, - inputFile, - path, - resourceURINode, - alwaysReplace -) { - if (!alwaysReplace && !inputFile.endsWith(".sys.mjs")) { - // Static import is available only in system ESM. - return false; - } - - // Check if it's at the top-level. - if (path.parent.node.type !== "VariableDeclarator") { - return false; - } - - if (path.parent.parent.node.type !== "VariableDeclaration") { - return false; - } - - const decls = path.parent.parent.node; - if (decls.declarations.length !== 1) { - return false; - } - - if (path.parent.parent.parent.node.type !== "Program") { - return false; - } - - if (path.node.arguments.length !== 1) { - return false; - } - - const resourceURI = resourceURINode.value; - - // Collect imported symbols. - const specs = []; - if (path.parent.node.id.type === "Identifier") { - specs.push(jscodeshift.importNamespaceSpecifier(path.parent.node.id)); - } else if (path.parent.node.id.type === "ObjectPattern") { - for (const prop of path.parent.node.id.properties) { - if (prop.shorthand) { - specs.push(jscodeshift.importSpecifier(prop.key)); - } else if (prop.value.type === "Identifier") { - specs.push(jscodeshift.importSpecifier(prop.key, prop.value)); - } else { - return false; - } - } - } else { - return false; - } - - // If this is `ChromeUtils.import` or `Cu.import`, replace the extension. - // no-op for `ChromeUtils.importESModule`. - resourceURINode.value = esmifyExtension(resourceURI); - - const e = jscodeshift.importDeclaration(specs, resourceURINode); - e.comments = path.parent.parent.node.comments; - path.parent.parent.node.comments = []; - path.parent.parent.replace(e); - - return true; -} - -function replaceImportESModuleCall( - inputFile, - jscodeshift, - path, - alwaysReplace -) { - if (path.node.arguments.length !== 1) { - warnForPath( - inputFile, - path, - `importESModule call should have only one argument` - ); - return; - } - - const resourceURINode = path.node.arguments[0]; - if (!isString(resourceURINode)) { - warnForPath(inputFile, path, `resource URI should be a string`); - return; - } - - if (!alwaysReplace) { - const resourceURI = resourceURINode.value; - if (!isTargetESM(resourceURI)) { - return; - } - } - - // If this cannot be replaced with static import, do nothing. - tryReplacingWithStaticImport( - jscodeshift, - inputFile, - path, - resourceURINode, - alwaysReplace - ); -} - -exports.isImportESModuleCall = isImportESModuleCall; -exports.tryReplacingWithStaticImport = tryReplacingWithStaticImport; -exports.replaceImportESModuleCall = replaceImportESModuleCall; diff --git a/tools/esmify/use-import-export-declarations.js b/tools/esmify/use-import-export-declarations.js deleted file mode 100644 index 60e017645b..0000000000 --- a/tools/esmify/use-import-export-declarations.js +++ /dev/null @@ -1,208 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -// jscodeshift rule to replace EXPORTED_SYMBOLS with export declarations, -// and also convert existing ChromeUtils.importESModule to static import. - -/* eslint-env node */ - -const _path = require("path"); -const { - warnForPath, - getPrevStatement, - getNextStatement, -} = require(_path.resolve(__dirname, "./utils.js")); -const { - isImportESModuleCall, - replaceImportESModuleCall, -} = require(_path.resolve(__dirname, "./static-import.js")); - -module.exports = function (fileInfo, api) { - const { jscodeshift } = api; - const root = jscodeshift(fileInfo.source); - doTranslate(fileInfo.path, jscodeshift, root); - return root.toSource({ lineTerminator: "\n" }); -}; - -module.exports.doTranslate = doTranslate; - -// Move the comment for `path.node` to adjacent statement, keeping the position -// as much as possible. -function moveComments(inputFile, path) { - const next = getNextStatement(path); - if (next) { - if (next.comments) { - next.comments = [...path.node.comments, ...next.comments]; - } else { - next.comments = path.node.comments; - } - path.node.comments = []; - - return; - } - - const prev = getPrevStatement(path); - if (prev) { - path.node.comments.forEach(c => { - c.leading = false; - c.trailing = true; - }); - - if (prev.comments) { - prev.comments = [...prev.comments, ...path.node.comments]; - } else { - prev.comments = path.node.comments; - } - path.node.comments = []; - - return; - } - - warnForPath( - inputFile, - path, - `EXPORTED_SYMBOLS has comments and it cannot be preserved` - ); -} - -function collectAndRemoveExportedSymbols(inputFile, root) { - const nodes = root.findVariableDeclarators("EXPORTED_SYMBOLS"); - if (!nodes.length) { - throw Error(`EXPORTED_SYMBOLS not found`); - } - - let path = nodes.get(0); - const obj = nodes.get(0).node.init; - if (!obj) { - throw Error(`EXPORTED_SYMBOLS is not statically known`); - } - - if (path.parent.node.declarations.length !== 1) { - throw Error(`EXPORTED_SYMBOLS shouldn't be declared with other variables`); - } - - if (path.parent.node.comments && path.parent.node.comments.length) { - moveComments(inputFile, path.parent); - } - - path.parent.prune(); - - const EXPORTED_SYMBOLS = new Set(); - if (obj.type !== "ArrayExpression") { - throw Error(`EXPORTED_SYMBOLS is not statically known`); - } - - for (const elem of obj.elements) { - if (elem.type !== "Literal") { - throw Error(`EXPORTED_SYMBOLS is not statically known`); - } - var name = elem.value; - if (typeof name !== "string") { - throw Error(`EXPORTED_SYMBOLS item must be a string`); - } - EXPORTED_SYMBOLS.add(name); - } - - return EXPORTED_SYMBOLS; -} - -function isTopLevel(path) { - return path.parent.node.type === "Program"; -} - -function convertToExport(jscodeshift, path) { - const e = jscodeshift.exportNamedDeclaration(path.node); - e.comments = []; - e.comments = path.node.comments; - path.node.comments = []; - - path.replace(e); -} - -function doTranslate(inputFile, jscodeshift, root) { - const EXPORTED_SYMBOLS = collectAndRemoveExportedSymbols(inputFile, root); - - root.find(jscodeshift.FunctionDeclaration).forEach(path => { - if (!isTopLevel(path)) { - return; - } - const name = path.node.id.name; - if (!EXPORTED_SYMBOLS.has(name)) { - return; - } - EXPORTED_SYMBOLS.delete(name); - convertToExport(jscodeshift, path, name); - }); - - root.find(jscodeshift.ClassDeclaration).forEach(path => { - if (!isTopLevel(path)) { - return; - } - const name = path.node.id.name; - if (!EXPORTED_SYMBOLS.has(name)) { - return; - } - EXPORTED_SYMBOLS.delete(name); - convertToExport(jscodeshift, path, name); - }); - - root.find(jscodeshift.VariableDeclaration).forEach(path => { - if (!isTopLevel(path)) { - return; - } - - let exists = false; - let name; - for (const decl of path.node.declarations) { - if (decl.id.type === "Identifier") { - name = decl.id.name; - if (EXPORTED_SYMBOLS.has(name)) { - exists = true; - break; - } - } - - if (decl.id.type === "ObjectPattern") { - if (decl.id.properties.length === 1) { - const prop = decl.id.properties[0]; - if (prop.shorthand) { - if (prop.key.type === "Identifier") { - name = prop.key.name; - if (EXPORTED_SYMBOLS.has(name)) { - exists = true; - break; - } - } - } - } - } - } - if (!exists) { - return; - } - - if (path.node.declarations.length !== 1) { - throw Error( - `exported variable shouldn't be declared with other variables` - ); - } - - EXPORTED_SYMBOLS.delete(name); - convertToExport(jscodeshift, path, name); - }); - - if (EXPORTED_SYMBOLS.size !== 0) { - throw Error( - `exported symbols ${[...EXPORTED_SYMBOLS].join(", ")} not found` - ); - } - - root.find(jscodeshift.CallExpression).forEach(path => { - if (isImportESModuleCall(path.node)) { - // This file is not yet renamed. Skip the extension check. - // Also skip the isTargetESM. - replaceImportESModuleCall(inputFile, jscodeshift, path, true); - } - }); -} diff --git a/tools/esmify/utils.js b/tools/esmify/utils.js deleted file mode 100644 index 386d4d6673..0000000000 --- a/tools/esmify/utils.js +++ /dev/null @@ -1,165 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -// Shared utility functions. - -/* eslint-env node */ - -function warnForPath(inputFile, path, message) { - const loc = path.node.loc; - console.warn( - `WARNING: ${inputFile}:${loc.start.line}:${loc.start.column} : ${message}` - ); -} - -// Get the previous statement of `path.node` in `Program`. -function getPrevStatement(path) { - const parent = path.parent; - if (parent.node.type !== "Program") { - return null; - } - - const index = parent.node.body.findIndex(n => n == path.node); - if (index === -1) { - return null; - } - - if (index === 0) { - return null; - } - - return parent.node.body[index - 1]; -} - -// Get the next statement of `path.node` in `Program`. -function getNextStatement(path) { - const parent = path.parent; - if (parent.node.type !== "Program") { - return null; - } - - const index = parent.node.body.findIndex(n => n == path.node); - if (index === -1) { - return null; - } - - if (index + 1 == parent.node.body.length) { - return null; - } - - return parent.node.body[index + 1]; -} - -function isIdentifier(node, name) { - if (node.type !== "Identifier") { - return false; - } - if (node.name !== name) { - return false; - } - return true; -} - -function isString(node) { - return node.type === "Literal" && typeof node.value === "string"; -} - -const jsmExtPattern = /\.(jsm|js|jsm\.js)$/; - -function esmifyExtension(path) { - return path.replace(jsmExtPattern, ".sys.mjs"); -} - -// Given possible member expression, return the list of Identifier nodes in -// the source order. -// -// Returns an empty array if: -// * not a simple MemberExpression tree with Identifiers -// * there's computed property -function memberExpressionsToIdentifiers(memberExpr) { - let ids = []; - - function f(node) { - if (node.type !== "MemberExpression" || node.computed) { - return false; - } - - if (node.object.type === "Identifier") { - ids.push(node.object); - ids.push(node.property); - return true; - } - - if (!f(node.object)) { - return false; - } - ids.push(node.property); - return true; - } - - if (!f(memberExpr)) { - return []; - } - - return ids; -} - -// Returns true if the node is a simple MemberExpression tree with Identifiers -// matches expectedIDs. -function isMemberExpressionWithIdentifiers(node, expectedIDs) { - const actualIDs = memberExpressionsToIdentifiers(node); - if (actualIDs.length !== expectedIDs.length) { - return false; - } - - for (let i = 0; i < expectedIDs.length; i++) { - if (actualIDs[i].name !== expectedIDs[i]) { - return false; - } - } - - return true; -} - -// Rewrite the Identifiers of MemberExpression tree to toIDs. -// `node` must be a simple MemberExpression tree with Identifiers, and -// the length of Identifiers should match. -function rewriteMemberExpressionWithIdentifiers(node, toIDs) { - const actualIDs = memberExpressionsToIdentifiers(node); - for (let i = 0; i < toIDs.length; i++) { - actualIDs[i].name = toIDs[i]; - } -} - -// Create a simple MemberExpression tree with given Identifiers. -function createMemberExpressionWithIdentifiers(jscodeshift, ids) { - if (ids.length < 2) { - throw new Error("Unexpected length of ids for member expression"); - } - - if (ids.length > 2) { - return jscodeshift.memberExpression( - createMemberExpressionWithIdentifiers(jscodeshift, ids.slice(0, -1)), - jscodeshift.identifier(ids[ids.length - 1]) - ); - } - - return jscodeshift.memberExpression( - jscodeshift.identifier(ids[0]), - jscodeshift.identifier(ids[1]) - ); -} - -exports.warnForPath = warnForPath; -exports.getPrevStatement = getPrevStatement; -exports.getNextStatement = getNextStatement; -exports.isIdentifier = isIdentifier; -exports.isString = isString; -exports.jsmExtPattern = jsmExtPattern; -exports.esmifyExtension = esmifyExtension; -exports.isMemberExpressionWithIdentifiers = isMemberExpressionWithIdentifiers; -exports.rewriteMemberExpressionWithIdentifiers = - rewriteMemberExpressionWithIdentifiers; -exports.createMemberExpressionWithIdentifiers = - createMemberExpressionWithIdentifiers; diff --git a/tools/fuzzing/interface/FuzzingInterface.cpp b/tools/fuzzing/interface/FuzzingInterface.cpp index f06ca68656..ba932c4b2a 100644 --- a/tools/fuzzing/interface/FuzzingInterface.cpp +++ b/tools/fuzzing/interface/FuzzingInterface.cpp @@ -28,3 +28,42 @@ LazyLogModule gFuzzingLog("nsFuzzing"); #endif } // namespace mozilla + +#ifdef AFLFUZZ +__AFL_FUZZ_INIT(); + +int afl_interface_raw(FuzzingTestFuncRaw testFunc) { + __AFL_INIT(); + char* testFilePtr = getenv("MOZ_FUZZ_TESTFILE"); + uint8_t* buf = NULL; + + if (testFilePtr) { + std::string testFile(testFilePtr); + while (__AFL_LOOP(1000)) { + std::ifstream is; + is.open(testFile, std::ios::binary); + is.seekg(0, std::ios::end); + size_t len = is.tellg(); + is.seekg(0, std::ios::beg); + MOZ_RELEASE_ASSERT(len >= 0); + if (!len) { + is.close(); + continue; + } + buf = reinterpret_cast<uint8_t*>(realloc(buf, len)); + MOZ_RELEASE_ASSERT(buf); + is.read(reinterpret_cast<char*>(buf), len); + is.close(); + testFunc(buf, len); + } + } else { + buf = __AFL_FUZZ_TESTCASE_BUF; + while (__AFL_LOOP(1000)) { + size_t len = __AFL_FUZZ_TESTCASE_LEN; + testFunc(buf, len); + } + } + + return 0; +} +#endif // AFLFUZZ diff --git a/tools/fuzzing/interface/FuzzingInterface.h b/tools/fuzzing/interface/FuzzingInterface.h index 792f0809ec..31a4b50867 100644 --- a/tools/fuzzing/interface/FuzzingInterface.h +++ b/tools/fuzzing/interface/FuzzingInterface.h @@ -37,55 +37,17 @@ extern LazyLogModule gFuzzingLog; MOZ_LOG(mozilla::gFuzzingLog, mozilla::LogLevel::Verbose, args) #endif // JS_STANDALONE +} // namespace mozilla + typedef int (*FuzzingTestFuncRaw)(const uint8_t*, size_t); #ifdef AFLFUZZ -static int afl_interface_raw(const char* testFile, - FuzzingTestFuncRaw testFunc) { - char* buf = NULL; - - while (__AFL_LOOP(1000)) { - std::ifstream is; - is.open(testFile, std::ios::binary); - is.seekg(0, std::ios::end); - int len = is.tellg(); - is.seekg(0, std::ios::beg); - MOZ_RELEASE_ASSERT(len >= 0); - if (!len) { - is.close(); - continue; - } - buf = (char*)realloc(buf, len); - MOZ_RELEASE_ASSERT(buf); - is.read(buf, len); - is.close(); - testFunc((uint8_t*)buf, (size_t)len); - } - - free(buf); - - return 0; -} - -# define MOZ_AFL_INTERFACE_COMMON() \ - char* testFilePtr = getenv("MOZ_FUZZ_TESTFILE"); \ - if (!testFilePtr) { \ - fprintf(stderr, \ - "Must specify testfile in MOZ_FUZZ_TESTFILE environment " \ - "variable.\n"); \ - return 1; \ - } \ - /* Make a copy of testFilePtr so the testing function can safely call \ - * getenv \ - */ \ - std::string testFile(testFilePtr); +int afl_interface_raw(FuzzingTestFuncRaw testFunc); # define MOZ_AFL_INTERFACE_RAW(initFunc, testFunc, moduleName) \ static int afl_fuzz_##moduleName(const uint8_t* data, size_t size) { \ - MOZ_RELEASE_ASSERT(data == NULL && size == 0); \ - MOZ_AFL_INTERFACE_COMMON(); \ - return ::mozilla::afl_interface_raw(testFile.c_str(), testFunc); \ + return afl_interface_raw(testFunc); \ } \ static void __attribute__((constructor)) AFLRegister##moduleName() { \ ::mozilla::FuzzerRegistry::getInstance().registerModule( \ @@ -110,6 +72,4 @@ static int afl_interface_raw(const char* testFile, MOZ_LIBFUZZER_INTERFACE_RAW(initFunc, testFunc, moduleName); \ MOZ_AFL_INTERFACE_RAW(initFunc, testFunc, moduleName); -} // namespace mozilla - #endif // FuzzingInterface_h__ diff --git a/tools/fuzzing/interface/FuzzingInterfaceStream.cpp b/tools/fuzzing/interface/FuzzingInterfaceStream.cpp deleted file mode 100644 index f2c5c891e9..0000000000 --- a/tools/fuzzing/interface/FuzzingInterfaceStream.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -/* - * Interface implementation for the unified fuzzing interface - */ - -#include "nsIFile.h" -#include "nsIPrefService.h" -#include "nsIProperties.h" - -#include "FuzzingInterfaceStream.h" - -#include "mozilla/Assertions.h" - -#ifndef JS_STANDALONE -# include "nsNetUtil.h" -#endif - -namespace mozilla { - -#ifdef AFLFUZZ - -void afl_interface_stream(const char* testFile, - FuzzingTestFuncStream testFunc) { - nsresult rv; - nsCOMPtr<nsIProperties> dirService = - do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID); - MOZ_RELEASE_ASSERT(dirService != nullptr); - nsCOMPtr<nsIFile> file; - rv = dirService->Get(NS_OS_CURRENT_WORKING_DIR, NS_GET_IID(nsIFile), - getter_AddRefs(file)); - MOZ_RELEASE_ASSERT(NS_SUCCEEDED(rv)); - file->AppendNative(nsDependentCString(testFile)); - while (__AFL_LOOP(1000)) { - nsCOMPtr<nsIInputStream> inputStream; - rv = NS_NewLocalFileInputStream(getter_AddRefs(inputStream), file); - MOZ_RELEASE_ASSERT(NS_SUCCEEDED(rv)); - if (!NS_InputStreamIsBuffered(inputStream)) { - nsCOMPtr<nsIInputStream> bufStream; - rv = NS_NewBufferedInputStream(getter_AddRefs(bufStream), - inputStream.forget(), 1024); - MOZ_RELEASE_ASSERT(NS_SUCCEEDED(rv)); - inputStream = bufStream; - } - testFunc(inputStream.forget()); - } -} - -#endif - -} // namespace mozilla diff --git a/tools/fuzzing/interface/FuzzingInterfaceStream.h b/tools/fuzzing/interface/FuzzingInterfaceStream.h index 1542020794..44807d9ebd 100644 --- a/tools/fuzzing/interface/FuzzingInterfaceStream.h +++ b/tools/fuzzing/interface/FuzzingInterfaceStream.h @@ -28,32 +28,25 @@ #include "FuzzingInterface.h" -namespace mozilla { - typedef int (*FuzzingTestFuncStream)(nsCOMPtr<nsIInputStream>); #ifdef AFLFUZZ -void afl_interface_stream(const char* testFile, FuzzingTestFuncStream testFunc); - -# define MOZ_AFL_INTERFACE_COMMON(initFunc) \ - if (initFunc) initFunc(NULL, NULL); \ - char* testFilePtr = getenv("MOZ_FUZZ_TESTFILE"); \ - if (!testFilePtr) { \ - fprintf(stderr, \ - "Must specify testfile in MOZ_FUZZ_TESTFILE environment " \ - "variable.\n"); \ - return; \ - } \ - /* Make a copy of testFilePtr so the testing function can safely call \ - * getenv \ - */ \ - std::string testFile(testFilePtr); - -# define MOZ_AFL_INTERFACE_STREAM(initFunc, testFunc, moduleName) \ - TEST(AFL, moduleName) \ - { \ - MOZ_AFL_INTERFACE_COMMON(initFunc); \ - ::mozilla::afl_interface_stream(testFile.c_str(), testFunc); \ +# define MOZ_AFL_INTERFACE_STREAM(initFunc, testFunc, moduleName) \ + static int afl_fuzz_inner_##moduleName(const uint8_t* data, size_t size) { \ + if (size > INT32_MAX) return 0; \ + nsCOMPtr<nsIInputStream> stream; \ + nsresult rv = NS_NewByteInputStream(getter_AddRefs(stream), \ + Span((const char*)data, size), \ + NS_ASSIGNMENT_DEPEND); \ + MOZ_RELEASE_ASSERT(NS_SUCCEEDED(rv)); \ + return testFunc(stream.forget()); \ + } \ + static int afl_fuzz_##moduleName(const uint8_t* data, size_t size) { \ + return afl_interface_raw(afl_fuzz_inner_##moduleName); \ + } \ + static void __attribute__((constructor)) AFLRegister##moduleName() { \ + ::mozilla::FuzzerRegistry::getInstance().registerModule( \ + #moduleName, initFunc, afl_fuzz_##moduleName); \ } #else # define MOZ_AFL_INTERFACE_STREAM(initFunc, testFunc, moduleName) /* Nothing \ @@ -85,6 +78,4 @@ void afl_interface_stream(const char* testFile, FuzzingTestFuncStream testFunc); MOZ_LIBFUZZER_INTERFACE_STREAM(initFunc, testFunc, moduleName); \ MOZ_AFL_INTERFACE_STREAM(initFunc, testFunc, moduleName); -} // namespace mozilla - #endif // FuzzingInterfaceStream_h__ diff --git a/tools/fuzzing/interface/harness/FuzzerTestHarness.h b/tools/fuzzing/interface/harness/FuzzerTestHarness.h index d7bb1064cf..6104be5438 100644 --- a/tools/fuzzing/interface/harness/FuzzerTestHarness.h +++ b/tools/fuzzing/interface/harness/FuzzerTestHarness.h @@ -14,6 +14,7 @@ #include "mozilla/ArrayUtils.h" #include "mozilla/Attributes.h" +#include "mozilla/IntegerPrintfMacros.h" #include "prenv.h" #include "nsComponentManagerUtils.h" diff --git a/tools/fuzzing/interface/moz.build b/tools/fuzzing/interface/moz.build index 8a51007174..fbfb59d924 100644 --- a/tools/fuzzing/interface/moz.build +++ b/tools/fuzzing/interface/moz.build @@ -21,10 +21,6 @@ else: "FuzzingInterfaceStream.h", ] - SOURCES += [ - "FuzzingInterfaceStream.cpp", - ] - DIRS += [ "harness", ] diff --git a/tools/fuzzing/ipc/IPCFuzzController.cpp b/tools/fuzzing/ipc/IPCFuzzController.cpp index 7eee9102c0..ba52ec4095 100644 --- a/tools/fuzzing/ipc/IPCFuzzController.cpp +++ b/tools/fuzzing/ipc/IPCFuzzController.cpp @@ -52,6 +52,8 @@ const uint32_t ipcDefaultTriggerMsg = dom::PContent::Msg_SignalFuzzingReady__ID; IPCFuzzController::IPCFuzzController() : useLastPortName(false), + useLastPortNameAlways(false), + protoFilterTargetExcludeToplevel(false), useLastActor(0), mMutex("IPCFuzzController"), mIPCTriggerMsg(ipcDefaultTriggerMsg) { @@ -156,6 +158,18 @@ bool IPCFuzzController::GetRandomIPCMessageType(ProtocolId pId, return true; } +static bool IsManagedByTargetActor(IProtocol* protocol, + std::string& protoIdFilter) { + while (protocol) { + if (!strcmp(protocol->GetProtocolName(), protoIdFilter.c_str())) { + return true; + } + + protocol = protocol->Manager(); + } + return false; +} + void IPCFuzzController::OnActorConnected(IProtocol* protocol) { if (!XRE_IsParentProcess()) { return; @@ -171,7 +185,8 @@ void IPCFuzzController::OnActorConnected(IProtocol* protocol) { "DEBUG: IPCFuzzController::OnActorConnected() Mutex locked\n"); static bool protoIdFilterInitialized = false; - static bool allowNewActors = false; + static bool allowSubActors = + !!getenv("MOZ_FUZZ_PROTOID_FILTER_ALLOW_SUBACTORS"); static std::string protoIdFilter; if (!protoIdFilterInitialized) { const char* protoIdFilterStr = getenv("MOZ_FUZZ_PROTOID_FILTER"); @@ -181,42 +196,67 @@ void IPCFuzzController::OnActorConnected(IProtocol* protocol) { protoIdFilterInitialized = true; } -#ifdef FUZZ_DEBUG - MOZ_FUZZING_NYX_PRINTF("INFO: [OnActorConnected] ActorID %d Protocol: %s\n", - protocol->Id(), protocol->GetProtocolName()); -#endif - MessageChannel* channel = protocol->ToplevelProtocol()->GetIPCChannel(); Maybe<PortName> portName = channel->GetPortName(); + + if (!portName) { + MOZ_FUZZING_NYX_PRINTF("INFO: [OnActorConnected] ActorID %d Protocol: %s\n", + protocol->Id(), protocol->GetProtocolName()); + } + if (portName) { - if (!protoIdFilter.empty() && - (!Nyx::instance().started() || !allowNewActors) && - strcmp(protocol->GetProtocolName(), protoIdFilter.c_str()) && - !actorIds[*portName].empty()) { - MOZ_FUZZING_NYX_PRINTF( - "INFO: [OnActorConnected] ActorID %d Protocol: %s ignored due to " - "filter.\n", - protocol->Id(), protocol->GetProtocolName()); - return; - } else if (!protoIdFilter.empty() && - !strcmp(protocol->GetProtocolName(), protoIdFilter.c_str())) { - MOZ_FUZZING_NYX_PRINTF( - "INFO: [OnActorConnected] ActorID %d Protocol: %s matches target.\n", - protocol->Id(), protocol->GetProtocolName()); - } else if (!protoIdFilter.empty() && actorIds[*portName].empty()) { + if (!protoIdFilter.empty()) { + if (!strcmp(protocol->GetProtocolName(), protoIdFilter.c_str())) { + MOZ_FUZZING_NYX_PRINTF( + "INFO: [OnActorConnected] ActorID %d Protocol: %s matches " + "target.\n", + protocol->Id(), protocol->GetProtocolName()); + + // If our matching protocol is not a toplevel actor, then we need to + // exclude the toplevel protocol later in `MakeTargetDecision` because + // the actor will always be added to the map. + protoFilterTargetExcludeToplevel = protocol->Manager() != nullptr; + } else if (actorIds[*portName].empty()) { + MOZ_FUZZING_NYX_PRINTF( + "INFO: [OnActorConnected] ActorID %d Protocol: %s is toplevel " + "actor.\n", + protocol->Id(), protocol->GetProtocolName()); + } else if (allowSubActors && + IsManagedByTargetActor(protocol, protoIdFilter)) { + MOZ_FUZZING_NYX_PRINTF( + "INFO: [OnActorConnected] ActorID %d Protocol: %s is managed by " + "target actor.\n", + protocol->Id(), protocol->GetProtocolName()); + } else { + // Not a toplevel actor, not matching the filter and also either not a + // sub actor of our target or we are focusing only on the target. Ignore + // this actor. + if (!!getenv("MOZ_FUZZ_DEBUG")) { + MOZ_FUZZING_NYX_PRINTF( + "INFO: [OnActorConnected] ActorID %d Protocol: %s ignored due to " + "filter.\n", + protocol->Id(), protocol->GetProtocolName()); + } + return; + } + } + + if (!!getenv("MOZ_FUZZ_DEBUG")) { MOZ_FUZZING_NYX_PRINTF( - "INFO: [OnActorConnected] ActorID %d Protocol: %s is toplevel " - "actor.\n", - protocol->Id(), protocol->GetProtocolName()); + "INFO: [OnActorConnected] ActorID %d Protocol: %s Port: %lu %lu\n", + protocol->Id(), protocol->GetProtocolName(), portName->v1, + portName->v2); } actorIds[*portName].emplace_back(protocol->Id(), protocol->GetProtocolId()); - if (Nyx::instance().started() && protoIdFilter.empty()) { - // Fix the port we will be using for at least the next 5 messages - useLastPortName = true; - lastActorPortName = *portName; + if (Nyx::instance().started()) { + if (!useLastPortNameAlways) { + // Fix the port we will be using for at least the next 5 messages + useLastPortName = true; + lastActorPortName = *portName; + } // Use this actor for the next 5 messages useLastActor = 5; @@ -247,6 +287,16 @@ void IPCFuzzController::OnActorDestroyed(IProtocol* protocol) { MOZ_FUZZING_NYX_DEBUG( "DEBUG: IPCFuzzController::OnActorDestroyed() Mutex locked\n"); + if (maybeLastActorId && + (maybeLastActorId == protocol->Id() || + (maybeLastActorId == MSG_ROUTING_CONTROL && !protocol->Id())) && + lastActorPortName == *portName) { + MOZ_FUZZING_NYX_DEBUG("INFO: Actor pinning released.\n"); + // We destroyed the actor we were focusing on, unpin. + maybeLastActorId = 0; + useLastActor = 0; + } + for (auto iter = actorIds[*portName].begin(); iter != actorIds[*portName].end();) { if (iter->first == protocol->Id() && @@ -293,13 +343,14 @@ bool IPCFuzzController::ObserveIPCMessage(mozilla::ipc::NodeChannel* channel, if (!channel->mBlockSendRecv) { MOZ_FUZZING_NYX_PRINTF( "INFO: [NodeChannel::OnMessageReceived] Blocking further " - "communication on Port %lu %lu (seen fuzz msg)\n", + "communication on node %lu %lu (seen fuzz msg)\n", channel->GetName().v1, channel->GetName().v2); channel->mBlockSendRecv = true; } return true; } else if (aMessage.type() == mIPCTriggerMsg && !Nyx::instance().started()) { - MOZ_FUZZING_NYX_PRINT("DEBUG: Ready message detected.\n"); + MOZ_FUZZING_NYX_PRINTF("DEBUG: Ready message detected on actor %d.\n", + aMessage.routing_id()); if (!haveTargetNodeName && !!getenv("MOZ_FUZZ_PROTOID_FILTER")) { // With a protocol filter set, we want to pin to the actor that @@ -322,8 +373,23 @@ bool IPCFuzzController::ObserveIPCMessage(mozilla::ipc::NodeChannel* channel, } lastActorPortName = event->port_name(); - useLastPortName = true; - useLastActor = 1024; + useLastPortNameAlways = true; + + if (!getenv("MOZ_FUZZ_PROTOID_FILTER_ALLOW_SUBACTORS")) { + // In this mode, we really want to focus on a single actor. + useLastActor = 1024; + maybeLastActorId = aMessage.routing_id(); + MOZ_FUZZING_NYX_PRINTF("DEBUG: Pinned to actor %d forever.\n", + aMessage.routing_id()); + } else { + // In this mode, we want to focus on a particular actor and all of its + // sub actors. This means we have to pin the port at least. Undesired + // other actors are filtered out already in OnActorConnected *except* + // for the toplevel actor belonging to this port. This exception is + // handled separately in MakeTargetDecision. + MOZ_FUZZING_NYX_PRINTF("DEBUG: Pinned to port %lu %lu forever.\n", + lastActorPortName.v1, lastActorPortName.v2); + } } // TODO: This is specific to PContent fuzzing. If we later want to fuzz @@ -353,7 +419,7 @@ bool IPCFuzzController::ObserveIPCMessage(mozilla::ipc::NodeChannel* channel, if (!channel->mBlockSendRecv) { MOZ_FUZZING_NYX_PRINTF( "INFO: [NodeChannel::OnMessageReceived] Blocking further " - "communication on Port %lu %lu (fuzzing started)\n", + "communication on node %lu %lu (fuzzing started)\n", channel->GetName().v1, channel->GetName().v2); channel->mBlockSendRecv = true; } @@ -428,13 +494,14 @@ bool IPCFuzzController::ObserveIPCMessage(mozilla::ipc::NodeChannel* channel, if (!channel->mBlockSendRecv) { MOZ_FUZZING_NYX_PRINTF( "INFO: [NodeChannel::OnMessageReceived] Blocking further " - "communication on Port %lu %lu (fuzzing start pending)\n", + "communication on node %lu %lu (fuzzing start pending)\n", channel->GetName().v1, channel->GetName().v2); channel->mBlockSendRecv = true; } return false; } + MOZ_FUZZING_NYX_ABORT("Unreachable"); return true; } } @@ -452,6 +519,11 @@ bool IPCFuzzController::ObserveIPCMessage(mozilla::ipc::NodeChannel* channel, portSeqNos.insert_or_assign( name, std::pair<int32_t, uint64_t>(aMessage.seqno(), userMsgEv->sequence_num())); +#ifdef FUZZ_DEBUG + MOZ_FUZZING_NYX_PRINTF( + "DEBUG: Port %lu %lu updated sequence number to %lu\n", name.v1, + name.v2, userMsgEv->sequence_num()); +#endif portNodeName.insert_or_assign(name, channel->GetName()); } @@ -520,18 +592,6 @@ bool IPCFuzzController::MakeTargetDecision( uint8_t portIndex, uint8_t portInstanceIndex, uint8_t actorIndex, uint16_t typeOffset, PortName* name, int32_t* seqno, uint64_t* fseqno, int32_t* actorId, uint32_t* type, bool* is_cons, bool update) { - // Every possible toplevel actor type has a fixed number that - // we assign to it in the constructor of this class. Here, we - // use the lower 6 bits to select this toplevel actor type. - // This approach has the advantage that the tests will always - // select the same toplevel actor type deterministically, - // independent of the order they appeared and independent - // of the type of fuzzing we are doing. - auto portInstances = portNames[portIndex & 0x3f]; - if (!portInstances.size()) { - return false; - } - if (useLastActor) { useLastActor--; *name = lastActorPortName; @@ -541,17 +601,26 @@ bool IPCFuzzController::MakeTargetDecision( // Once we stop pinning to the last actor, we need to decide if we // want to keep the pinning on the port itself. We use one of the // unused upper bits of portIndex for this purpose. - if (!useLastActor && (portIndex & (1 << 7))) { - if (mIPCTriggerMsg == ipcDefaultTriggerMsg) { - MOZ_FUZZING_NYX_PRINT( - "DEBUG: MakeTargetDecision: Released pinning on last port.\n"); - useLastPortName = false; - } + if (!useLastActor && !useLastPortNameAlways && (portIndex & (1 << 7))) { + MOZ_FUZZING_NYX_PRINT( + "DEBUG: MakeTargetDecision: Released pinning on last port.\n"); + useLastPortName = false; } - } else if (useLastPortName) { + } else if (useLastPortName || useLastPortNameAlways) { *name = lastActorPortName; MOZ_FUZZING_NYX_PRINT("DEBUG: MakeTargetDecision: Pinned to last port.\n"); } else { + // Every possible toplevel actor type has a fixed number that + // we assign to it in the constructor of this class. Here, we + // use the lower 6 bits to select this toplevel actor type. + // This approach has the advantage that the tests will always + // select the same toplevel actor type deterministically, + // independent of the order they appeared and independent + // of the type of fuzzing we are doing. + auto portInstances = portNames[portIndex & 0x3f]; + if (!portInstances.size()) { + return false; + } *name = portInstances[portInstanceIndex % portInstances.size()]; } @@ -580,7 +649,26 @@ bool IPCFuzzController::MakeTargetDecision( bool isPreserveHeader = *type; if (useLastActor) { - actorIndex = actors.size() - 1; + if (maybeLastActorId) { + bool found = false; + for (actorIndex = 0; actorIndex < actors.size(); ++actorIndex) { + // Toplevel actors have a discrepancy here: Routing ID is -1 but the + // actor id provided through protocol->Id() is 0. + if (actors[actorIndex].first == maybeLastActorId || + (maybeLastActorId == MSG_ROUTING_CONTROL && + !actors[actorIndex].first)) { + found = true; + break; + } + } + + if (!found) { + MOZ_FUZZING_NYX_ABORT( + "ERROR: Pinned to actor that's not in actors map!?\n"); + } + } else { + actorIndex = actors.size() - 1; + } } else if (isPreserveHeader) { // In preserveHeaderMode, we need to find an actor that matches the // requested message type instead of any random actor. @@ -592,6 +680,11 @@ bool IPCFuzzController::MakeTargetDecision( ProtocolId wantedProtocolId = static_cast<ProtocolId>(maybeProtocolId); std::vector<uint32_t> allowedIndices; for (uint32_t i = 0; i < actors.size(); ++i) { + if (protoFilterTargetExcludeToplevel && !i) { + // Filter out the toplevel protocol at index 0 + continue; + } + if (actors[i].second == wantedProtocolId) { allowedIndices.push_back(i); } @@ -602,6 +695,14 @@ bool IPCFuzzController::MakeTargetDecision( } actorIndex = allowedIndices[actorIndex % allowedIndices.size()]; + } else if (protoFilterTargetExcludeToplevel) { + // Filter out the toplevel protocol + if (actors.size() < 2) { + // We likely destroyed all other actors + return false; + } + actorIndex %= actors.size() - 1; + actorIndex++; } else { actorIndex %= actors.size(); } @@ -735,11 +836,14 @@ NS_IMETHODIMP IPCFuzzController::IPCFuzzLoop::Run() { auto portNameResult = IPCFuzzController::instance().portNodeName.find(iter->first); if (portNameResult->second == - IPCFuzzController::instance().targetNodeName) { - MOZ_FUZZING_NYX_PRINT( + IPCFuzzController::instance().targetNodeName && + IPCFuzzController::instance().mIPCTriggerMsg == + ipcDefaultTriggerMsg) { + MOZ_FUZZING_NYX_PRINTF( "ERROR: We should not have port map entries without a " "corresponding " - "entry in our actors map\n"); + "entry in our actors map (Port %lu %lu)\n", + iter->first.v1, iter->first.v2); MOZ_REALLY_CRASH(__LINE__); } else { iter = IPCFuzzController::instance().portSeqNos.erase(iter); @@ -952,6 +1056,9 @@ NS_IMETHODIMP IPCFuzzController::IPCFuzzLoop::Run() { msg->header()->type = msgType; } + // Make sure we're not sending with LAZY_SEND + msg->header()->flags.mFlags &= ~IPC::Message::HeaderFlags::LAZY_SEND_BIT; + // Create the footer auto messageEvent = MakeUnique<UserMessageEvent>(0); messageEvent->set_port_name(new_port_name); @@ -985,6 +1092,14 @@ NS_IMETHODIMP IPCFuzzController::IPCFuzzLoop::Run() { msg->header()->flags, msg->header()->txid, msg->header()->num_handles); #endif + if (!!getenv("MOZ_FUZZ_DEBUG")) { + MOZ_FUZZING_NYX_PRINTF( + "INFO: Flags: IsSync: %d IsReply: %d IsReplyError: %d IsConstructor: " + "%d IsRelay: %d IsLazySend: %d\n", + msg->is_sync(), msg->is_reply(), msg->is_reply_error(), + msg->is_constructor(), msg->is_relay(), msg->is_lazy_send()); + } + // The number of messages we expect to see stopped. expected_messages++; @@ -1117,6 +1232,9 @@ void IPCFuzzController::SynchronizeOnMessageExecution( Nyx::instance().handle_event("MOZ_TIMEOUT", nullptr, 0, nullptr); MOZ_FUZZING_NYX_PRINT( "ERROR: ======== END OF ITERATION (TIMEOUT) ========\n"); + if (!!getenv("MOZ_FUZZ_CRASH_ON_TIMEOUT")) { + MOZ_DIAGNOSTIC_ASSERT(false, "IPCFuzzController Timeout"); + } Nyx::instance().release( IPCFuzzController::instance().getMessageStopCount()); } @@ -1241,6 +1359,7 @@ UniquePtr<IPC::Message> IPCFuzzController::replaceIPCMessage( IPCFuzzController::instance().useLastActor = 0; IPCFuzzController::instance().useLastPortName = false; + IPCFuzzController::instance().useLastPortNameAlways = false; MOZ_FUZZING_NYX_DEBUG("DEBUG: Requesting data...\n"); @@ -1276,7 +1395,7 @@ UniquePtr<IPC::Message> IPCFuzzController::replaceIPCMessage( ipchdr->payload_size = ipcMsgLen - sizeof(IPC::Message::Header); if (Nyx::instance().is_replay()) { - MOZ_FUZZING_NYX_PRINT("INFO: Replaying IPC packet with payload:\n"); + MOZ_FUZZING_NYX_PRINT("INFO: Replaying single IPC packet with payload:\n"); for (uint32_t i = 0; i < ipcMsgLen - sizeof(IPC::Message::Header); ++i) { if (i % 16 == 0) { MOZ_FUZZING_NYX_PRINT("\n "); @@ -1291,6 +1410,11 @@ UniquePtr<IPC::Message> IPCFuzzController::replaceIPCMessage( UniquePtr<IPC::Message> msg(new IPC::Message(ipcMsgData, ipcMsgLen)); + if (!!getenv("MOZ_FUZZ_DEBUG")) { + MOZ_FUZZING_NYX_PRINTF("INFO: Name: %s Target: %d\n", msg->name(), + msg->routing_id()); + } + // This marks the message as a fuzzing message. Without this, it will // be ignored by MessageTask and also not even scheduled by NodeChannel // in asynchronous mode. We use this to ignore any IPC activity that diff --git a/tools/fuzzing/ipc/IPCFuzzController.h b/tools/fuzzing/ipc/IPCFuzzController.h index 756a68f38f..5c27443381 100644 --- a/tools/fuzzing/ipc/IPCFuzzController.h +++ b/tools/fuzzing/ipc/IPCFuzzController.h @@ -138,13 +138,24 @@ class IPCFuzzController { // If set, `lastActorPortName` is valid and fuzzing is pinned to this port. Atomic<bool> useLastPortName; - // Last port where a new actor appeared. Only valid with `useLastPortName`. + // If set, `lastActorPortName` is valid and fuzzing is forever pinned to this + // port. + Atomic<bool> useLastPortNameAlways; + + // If set, the toplevel actor will be from fuzzing. + Atomic<bool> protoFilterTargetExcludeToplevel; + + // Last port where a new actor appeared. Only valid with + // `useLastPortName`. mojo::core::ports::PortName lastActorPortName; // Counter to indicate how long fuzzing should stay pinned to the last // actor that appeared on `lastActorPortName`. Atomic<uint32_t> useLastActor; + // If this is non-zero, we want a specific actor ID instead of the last. + Atomic<int32_t> maybeLastActorId; + // This is the deterministic ordering of toplevel actors for fuzzing. // In this matrix, each row (toplevel index) corresponds to one toplevel // actor *type* while each entry in that row is an instance of that type, diff --git a/tools/fuzzing/smoke/smoke.py b/tools/fuzzing/smoke/smoke.py index bfc7cb56cd..1a031a18f9 100644 --- a/tools/fuzzing/smoke/smoke.py +++ b/tools/fuzzing/smoke/smoke.py @@ -6,7 +6,7 @@ This script can be used to perform simple calls using `jsshell` or whatever other tools you may add. -The call is done via `taskcluster/ci/fuzzing/kind.yml` and +The call is done via `taskcluster/kinds/fuzzing/kind.yml` and files contained in the `target.jsshell.zip` and `target.fuzztest.tests.tar.gz` build artifacts are downloaded to run things. diff --git a/tools/github-sync/converter.py b/tools/github-sync/converter.py deleted file mode 100755 index 104229e299..0000000000 --- a/tools/github-sync/converter.py +++ /dev/null @@ -1,481 +0,0 @@ -#!/usr/bin/env python3 - -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -import os -import re -import subprocess -import sys - -import hglib -import pygit2 - -DEBUG = False - - -def eprint(*args, **kwargs): - print(*args, file=sys.stderr, **kwargs) - - -def debugprint(*args, **kwargs): - if DEBUG: - eprint(*args, **kwargs) - - -class HgCommit: - def __init__(self, parent1, parent2): - self.parents = [] - if parent1 == NULL_PARENT_REV: - raise Exception( - "Encountered a hg changeset with no parents! We don't handle this...." - ) - self.parents.append(parent1) - if parent2 != NULL_PARENT_REV: - self.parents.append(parent2) - self.touches_sync_code = False - self.children = [] - - def add_child(self, rev): - self.children.append(rev) - - -class GitCommit: - def __init__(self, hg_rev, commit_obj): - self.hg_rev = hg_rev - self.commit_obj = commit_obj - - -def load_git_repository(): - commit_map = dict() - # First, scan the tags for "mozilla-xxx" that keep track of manually synchronized changes - sync_tags = filter( - lambda ref: ref.startswith("refs/tags/mozilla-"), - list(downstream_git_repo.references), - ) - for desc in sync_tags: - commit = downstream_git_repo.lookup_reference(desc).peel() - # cut out the revision hash from the output - hg_rev = desc[18:] - commit_map[hg_rev] = GitCommit(hg_rev, commit) - debugprint("Loaded pre-existing tag hg %s -> git %s" % (hg_rev, commit.oid)) - - # Next, scan the commits for a specific message format - re_commitmsg = re.compile( - r"^\[(ghsync|wrupdater)\] From https://hg.mozilla.org/mozilla-central/rev/([0-9a-fA-F]+)$", - re.MULTILINE, - ) - for commit in downstream_git_repo.walk(downstream_git_repo.head.target): - m = re_commitmsg.search(commit.message) - if not m: - continue - hg_rev = m.group(2) - commit_map[hg_rev] = GitCommit(hg_rev, commit) - debugprint("Loaded pre-existing commit hg %s -> git %s" % (hg_rev, commit.oid)) - return commit_map - - -def timeof(git_commit): - return git_commit.commit_obj.commit_time + git_commit.commit_obj.commit_time_offset - - -def find_newest_commit(commit_map): - newest_hg_rev = None - newest_commit_time = None - - for hg_rev, git_commit in commit_map.items(): - if newest_hg_rev is None or timeof(git_commit) > newest_commit_time: - newest_hg_rev = hg_rev - newest_commit_time = timeof(git_commit) - - return newest_hg_rev - - -def get_single_rev(revset): - output = subprocess.check_output( - ["hg", "log", "-r", revset, "--template", "{node}"] - ) - output = str(output, "ascii") - return output - - -def get_multiple_revs(revset, template): - output = subprocess.check_output( - ["hg", "log", "-r", revset, "--template", template + "\\n"] - ) - for line in output.splitlines(): - yield str(line, "ascii") - - -def get_base_hg_rev(commit_map): - base_hg_rev = find_newest_commit(commit_map) - eprint("Using %s as base hg revision" % base_hg_rev) - return base_hg_rev - - -def load_hg_commits(commits, query): - for cset in get_multiple_revs(query, "{node} {p1node} {p2node}"): - tokens = cset.split() - commits[tokens[0]] = HgCommit(tokens[1], tokens[2]) - return commits - - -def get_real_base_hg_rev(hg_data, commit_map): - # Some of the HG commits we want to port to github may have landed on codelines - # that branched off central prior to base_hg_rev. So when we create the git - # equivalents, they will have parents that are not the HEAD of the git repo, - # but instead will be descendants of older commits in the git repo. In order - # to do this correctly, we need to find the hg-equivalents of all of those - # possible git parents. So first we identify all the "tail" hg revisions in - # our hg_data set (think "tail" as in opposite of "head" which is the tipmost - # commit). The "tail" hg revisions are the ones for which we don't have their - # ancestors in hg_data. - tails = [] - for rev, cset in hg_data.items(): - for parent in cset.parents: - if parent not in hg_data: - tails.append(rev) - eprint("Found hg tail revisions %s" % tails) - # Then we find their common ancestor, which will be some ancestor of base_hg_rev - # from which those codelines. - if len(tails) == 0: - common_ancestor = get_single_rev(".") - else: - common_ancestor = get_single_rev("ancestor(" + ",".join(tails) + ")") - eprint("Found common ancestor of tail revisions: %s" % common_ancestor) - - # And then we find the newest git commit whose hg-equivalent is an ancestor of - # that common ancestor, to make sure we are starting from a known hg/git - # commit pair. - for git_commit in sorted(commit_map.values(), key=timeof, reverse=True): - new_base = get_single_rev( - "ancestor(" + common_ancestor + "," + git_commit.hg_rev + ")" - ) - if new_base == common_ancestor: - eprint( - "Pre-existing git commit %s from hg rev %s is descendant of common ancestor; %s" - % ( - git_commit.commit_obj.id, - git_commit.hg_rev, - "walking back further...", - ) - ) - continue - if new_base != git_commit.hg_rev: - eprint( - "Pre-existing git commit %s from hg rev %s is on sibling branch" - " of common ancestor; %s" - % ( - git_commit.commit_obj.id, - git_commit.hg_rev, - "walking back further...", - ) - ) - continue - eprint( - "Pre-existing git commit %s from hg rev %s is sufficiently old; stopping walk" - % (git_commit.commit_obj.id, git_commit.hg_rev) - ) - common_ancestor = new_base - break - - return common_ancestor - - -# Now we prune out all the uninteresting changesets from hg_commits. The -# uninteresting ones are ones that don't touch the target code, are not merges, -# and are not referenced by mozilla tags in the git repo. -# We do this by rewriting the parents to the "interesting" ancestor. -def prune_boring(rev): - while rev in hg_commits: - parent_pruned = False - for i in range(len(hg_commits[rev].parents)): - parent_rev = hg_commits[rev].parents[i] - if parent_rev not in hg_commits: - continue - if hg_commits[parent_rev].touches_sync_code: - continue - if len(hg_commits[parent_rev].parents) > 1: - continue - if parent_rev in hg_to_git_commit_map: - continue - - # If we get here, then `parent_rev` is a boring revision and we can - # prune it. Connect `rev` to its grandparent, and prune the parent - grandparent_rev = hg_commits[parent_rev].parents[0] - hg_commits[rev].parents[i] = grandparent_rev - # eprint("Pruned %s as boring parent of %s, using %s now" % - # (parent_rev, rev, grandparent_rev)) - parent_pruned = True - - if parent_pruned: - # If we pruned a parent, process `rev` again as we might want to - # prune more parents - continue - - # Collapse identical parents, because if the parents are identical - # we don't need to keep multiple copies of them. - hg_commits[rev].parents = list(dict.fromkeys(hg_commits[rev].parents)) - - # If we get here, all of `rev`s parents are interesting, so we can't - # prune them. Move up to the parent rev and start processing that, or - # if we have multiple parents then recurse on those nodes. - if len(hg_commits[rev].parents) == 1: - rev = hg_commits[rev].parents[0] - continue - - for parent_rev in hg_commits[rev].parents: - prune_boring(parent_rev) - return - - -class FakeCommit: - def __init__(self, oid): - self.oid = oid - - -def fake_commit(hg_rev, parent1, parent2): - if parent1 is None: - eprint("ERROR: Trying to build on None") - exit(1) - oid = "githash_%s" % hash(parent1) - eprint("Fake-built %s" % oid) - return FakeCommit(oid) - - -def build_tree(builder, treedata): - for name, value in treedata.items(): - if isinstance(value, dict): - subbuilder = downstream_git_repo.TreeBuilder() - build_tree(subbuilder, value) - builder.insert(name, subbuilder.write(), pygit2.GIT_FILEMODE_TREE) - else: - (filemode, contents) = value - blob_oid = downstream_git_repo.create_blob(contents) - builder.insert(name, blob_oid, filemode) - - -def author_to_signature(author): - pieces = author.strip().split("<") - if len(pieces) != 2 or pieces[1][-1] != ">": - # We could probably handle this better - return pygit2.Signature(author, "") - name = pieces[0].strip() - email = pieces[1][:-1].strip() - return pygit2.Signature(name, email) - - -def real_commit(hg_rev, parent1, parent2): - filetree = dict() - manifest = mozilla_hg_repo.manifest(rev=hg_rev) - for nodeid, permission, executable, symlink, filename in manifest: - if not filename.startswith(relative_path.encode("utf-8")): - continue - if symlink: - filemode = pygit2.GIT_FILEMODE_LINK - elif executable: - filemode = pygit2.GIT_FILEMODE_BLOB_EXECUTABLE - else: - filemode = pygit2.GIT_FILEMODE_BLOB - filecontent = mozilla_hg_repo.cat([filename], rev=hg_rev) - subtree = filetree - for component in filename.split(b"/")[2:-1]: - subtree = subtree.setdefault(component.decode("latin-1"), dict()) - filename = filename.split(b"/")[-1] - subtree[filename.decode("latin-1")] = (filemode, filecontent) - - builder = downstream_git_repo.TreeBuilder() - build_tree(builder, filetree) - tree_oid = builder.write() - - parent1_obj = downstream_git_repo.get(parent1) - if parent1_obj.tree_id == tree_oid: - eprint("Early-exit; tree matched that of parent git commit %s" % parent1) - return parent1_obj - - if parent2 is not None: - parent2_obj = downstream_git_repo.get(parent2) - if parent2_obj.tree_id == tree_oid: - eprint("Early-exit; tree matched that of parent git commit %s" % parent2) - return parent2_obj - - hg_rev_obj = mozilla_hg_repo.log(revrange=hg_rev, limit=1)[0] - commit_author = hg_rev_obj[4].decode("latin-1") - commit_message = hg_rev_obj[5].decode("latin-1") - commit_message += ( - "\n\n[ghsync] From https://hg.mozilla.org/mozilla-central/rev/%s" % hg_rev - + "\n" - ) - - parents = [parent1] - if parent2 is not None: - parents.append(parent2) - commit_oid = downstream_git_repo.create_commit( - None, - author_to_signature(commit_author), - author_to_signature(commit_author), - commit_message, - tree_oid, - parents, - ) - eprint("Built git commit %s" % commit_oid) - return downstream_git_repo.get(commit_oid) - - -def try_commit(hg_rev, parent1, parent2=None): - if False: - return fake_commit(hg_rev, parent1, parent2) - else: - return real_commit(hg_rev, parent1, parent2) - - -def build_git_commits(rev): - debugprint("build_git_commit(%s)..." % rev) - if rev in hg_to_git_commit_map: - debugprint(" maps to %s" % hg_to_git_commit_map[rev].commit_obj.oid) - return hg_to_git_commit_map[rev].commit_obj.oid - - if rev not in hg_commits: - debugprint(" not in hg_commits") - return None - - if len(hg_commits[rev].parents) == 1: - git_parent = build_git_commits(hg_commits[rev].parents[0]) - if not hg_commits[rev].touches_sync_code: - eprint( - "WARNING: Found rev %s that is non-merge and not related to the target" - % rev - ) - return git_parent - eprint("Building git equivalent for %s on top of %s" % (rev, git_parent)) - commit_obj = try_commit(rev, git_parent) - hg_to_git_commit_map[rev] = GitCommit(rev, commit_obj) - debugprint(" built %s as %s" % (rev, commit_obj.oid)) - return commit_obj.oid - - git_parent_1 = build_git_commits(hg_commits[rev].parents[0]) - git_parent_2 = build_git_commits(hg_commits[rev].parents[1]) - if git_parent_1 is None or git_parent_2 is None or git_parent_1 == git_parent_2: - git_parent = git_parent_1 if git_parent_2 is None else git_parent_2 - if not hg_commits[rev].touches_sync_code: - debugprint( - " %s is merge with no parents or doesn't touch WR, returning %s" - % (rev, git_parent) - ) - return git_parent - - eprint( - "WARNING: Found merge rev %s whose parents have identical target code" - ", but modifies the target" % rev - ) - eprint("Building git equivalent for %s on top of %s" % (rev, git_parent)) - commit_obj = try_commit(rev, git_parent) - hg_to_git_commit_map[rev] = GitCommit(rev, commit_obj) - debugprint(" built %s as %s" % (rev, commit_obj.oid)) - return commit_obj.oid - - # An actual merge - eprint( - "Building git equivalent for %s on top of %s, %s" - % (rev, git_parent_1, git_parent_2) - ) - commit_obj = try_commit(rev, git_parent_1, git_parent_2) - hg_to_git_commit_map[rev] = GitCommit(rev, commit_obj) - debugprint(" built %s as %s" % (rev, commit_obj.oid)) - return commit_obj.oid - - -def pretty_print(rev, cset): - desc = " %s" % rev - desc += " parents: %s" % cset.parents - if rev in hg_to_git_commit_map: - desc += " git: %s" % hg_to_git_commit_map[rev].commit_obj.oid - if rev == hg_tip: - desc += " (tip)" - return desc - - -if len(sys.argv) < 3: - eprint("Usage: %s <local-checkout-path> <repo-relative-path>" % sys.argv[0]) - eprint("Current dir must be the mozilla hg repo") - exit(1) - -local_checkout_path = sys.argv[1] -relative_path = sys.argv[2] -mozilla_hg_path = os.getcwd() -NULL_PARENT_REV = "0000000000000000000000000000000000000000" - -downstream_git_repo = pygit2.Repository(pygit2.discover_repository(local_checkout_path)) -mozilla_hg_repo = hglib.open(mozilla_hg_path) -hg_to_git_commit_map = load_git_repository() -base_hg_rev = get_base_hg_rev(hg_to_git_commit_map) -if base_hg_rev is None: - eprint("Found no sync commits or 'mozilla-xxx' tags") - exit(1) - -hg_commits = load_hg_commits(dict(), "only(.," + base_hg_rev + ")") -eprint("Initial set has %s changesets" % len(hg_commits)) -base_hg_rev = get_real_base_hg_rev(hg_commits, hg_to_git_commit_map) -eprint("Using hg rev %s as common ancestor of all interesting changesets" % base_hg_rev) - -# Refresh hg_commits with our wider dataset -hg_tip = get_single_rev(".") -wider_range = "%s::%s" % (base_hg_rev, hg_tip) -hg_commits = load_hg_commits(hg_commits, wider_range) -eprint("Updated set has %s changesets" % len(hg_commits)) - -if DEBUG: - eprint("Graph of descendants of %s" % base_hg_rev) - output = subprocess.check_output( - [ - "hg", - "log", - "--graph", - "-r", - "descendants(" + base_hg_rev + ")", - "--template", - "{node} {desc|firstline}\\n", - ] - ) - for line in output.splitlines(): - eprint(line.decode("utf-8", "ignore")) - -# Also flag any changes that touch the project -query = "(" + wider_range + ') & file("glob:' + relative_path + '/**")' -for cset in get_multiple_revs(query, "{node}"): - debugprint("Changeset %s modifies %s" % (cset, relative_path)) - hg_commits[cset].touches_sync_code = True -eprint( - "Identified %s changesets that touch the target code" - % sum([1 if v.touches_sync_code else 0 for (k, v) in hg_commits.items()]) -) - -prune_boring(hg_tip) - -# hg_tip itself might be boring -if not hg_commits[hg_tip].touches_sync_code and len(hg_commits[hg_tip].parents) == 1: - new_tip = hg_commits[hg_tip].parents[0] - eprint("Pruned tip %s as boring, using %s now" % (hg_tip, new_tip)) - hg_tip = new_tip - -eprint("--- Interesting changesets ---") -for rev, cset in hg_commits.items(): - if cset.touches_sync_code or len(cset.parents) > 1 or rev in hg_to_git_commit_map: - eprint(pretty_print(rev, cset)) -if DEBUG: - eprint("--- Other changesets (not really interesting) ---") - for rev, cset in hg_commits.items(): - if not ( - cset.touches_sync_code - or len(cset.parents) > 1 - or rev in hg_to_git_commit_map - ): - eprint(pretty_print(rev, cset)) - -git_tip = build_git_commits(hg_tip) -if git_tip is None: - eprint("No new changesets generated, exiting.") -else: - downstream_git_repo.create_reference("refs/heads/github-sync", git_tip, force=True) - eprint("Updated github-sync branch to %s, done!" % git_tip) diff --git a/tools/github-sync/read-json.py b/tools/github-sync/read-json.py deleted file mode 100755 index 87264d7df4..0000000000 --- a/tools/github-sync/read-json.py +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env python3 - -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -import json -import sys - -j = json.load(sys.stdin) -components = sys.argv[1].split("/") - - -def next_match(json_fragment, components): - if len(components) == 0: - yield json_fragment - else: - component = components[0] - if type(json_fragment) == list: - if component == "*": - for item in json_fragment: - yield from next_match(item, components[1:]) - else: - component = int(component) - if component >= len(j): - sys.exit(1) - yield from next_match(json_fragment[component], components[1:]) - elif type(json_fragment) == dict: - if component == "*": - for key in sorted(json_fragment.keys()): - yield from next_match(json_fragment[key], components[1:]) - elif component not in json_fragment: - sys.exit(1) - else: - yield from next_match(json_fragment[component], components[1:]) - - -for match in list(next_match(j, components)): - if type(match) == dict: - print(" ".join(match.keys())) - else: - print(match) diff --git a/tools/github-sync/readme.md b/tools/github-sync/readme.md deleted file mode 100644 index d691071336..0000000000 --- a/tools/github-sync/readme.md +++ /dev/null @@ -1,106 +0,0 @@ -# Github synchronization scripts - -This tool aims to help synchronizing changes from mozilla-central to Github on pushes. -This is useful for Gecko sub-projects that have Github mirrors, like `gfx/wr` linking to `https://github.com/servo/webrender`. -Originally, the tools were developed in `https://github.com/staktrace/wrupdater`, -then got moved under `gfx/wr/ci-scripts/wrupdater`, -and finally migrated here while also abstracting away from WebRender specifically. - -The main entry point is the `sync-to-github.sh` script that is called with the following arguments: - 1. name of the project, matching the repository under `https://github.com/moz-gfx` user (e.g. `webrender`) - 2. relative folder in mozilla-central, which is the upstream for the changes (e.g. `gfx/wr`) - 3. downstream repository specified as "organization/project-name" (e.g. `servo/webrender`) - 4. name to call for auto-approving the pull request (e.g. `bors` or `@bors-servo`) - -It creates a staging directory at `~/.ghsync` if one doesn't already exist, -and clones the the downstream repo into it. -The script also requires the `GECKO_PATH` environment variable -to point to a mercurial clone of `mozilla-central`, and access to the -taskcluster secrets service to get a Github API token. - -The `sync-to-github.sh` script does some setup steps but the bulk of the actual work -is done by the `converter.py` script. This script scans the mercurial -repository for new changes to the relative folder in m-c, -and adds commits to the git repository corresponding to those changes. -There are some details in the implementation that make it more robust -than simply exporting patches and attempting to reapply them; -in particular it builds a commit tree structure that mirrors what is found in -the `mozilla-central` repository with respect to branches and merges. -So if conflicting changes land on autoland and inbound, and then get -merged, the git repository commits will have the same structure with -a fork/merge in the commit history. This was discovered to be -necessary after a previous version ran into multiple cases where -the simple patch approach didn't really work. - -One of the actions the `converter.py` takes is to find the last sync point -between Github and mozilla-central. This is done based on the following markers: - - commit message containing the string "[ghsync] From https://hg.mozilla.org/mozilla-central/rev/xxx" - - commit message containing the string "[wrupdater] From https://hg.mozilla.org/mozilla-central/rev/xxx" - - commit with tag "mozilla-xxx" -(where xxx is always a mozilla-central hg revision identifier). - -Once the converter is done converting, the `sync-to-github.sh` script -finishes the process by pushing the new commits to the `github-sync` branch -of the `https://github.com/moz-gfx/<project-name>` repository, -and generating a pull request against the downstream repository. It also -leaves a comment on the PR that triggers testing and automatic merge of the PR. -If there is already a pull request (perhaps from a previous run) the -pre-existing PR is force-updated instead. This allows for graceful -handling of scenarios where the PR failed to get merged (e.g. due to -CI failures on the Github side). - -The script is intended to by run by taskcluster for any changes that -touch the relative folder that land on `mozilla-central`. This may mean -that multiple instances of this script run concurrently, or even out -of order (i.e. the task for an older m-c push runs after the task for -a newer m-c push). The script was written with these possibilities in -mind and should be able to eventually recover from any such scenario -automatically (although it may take additional changes to mozilla-central -for such recovery to occur). That being said, the number of pathological -scenarios here is quite large and they were not really tested. - -## Ownership and access - -When this tool is run in Firefox CI, it needs to have push permissions to -the `moz-gfx` github user's account. It gets this permission via a secret token -stored in the Firefox CI taskcluster secrets service. If you need to update -the token, you need to find somebody who is a member of the -[webrender-ci access group](https://people.mozilla.org/a/webrender-ci/). The -Google Drive associated with that access group has additional documentation -on the `moz-gfx` github user and the secret token. - -## Debugging - -To debug the converter.py script, you need to have a hg checkout of -mozilla-central, let's assume it's at $MOZILLA. First create a virtualenv -with the right dependencies installed: - -``` -mkdir -p $HOME/.ghsync -virtualenv --python=python3 $HOME/.ghsync/venv -source $HOME/.ghsync/venv/bin/activate -pip3 install -r $MOZILLA/taskcluster/docker/github-sync/requirements.txt -``` - -Also create a checkout of the downstream github repo and set up a `github-sync` -branch to the point where you want port commits to. For example, for WebRender -you'd do: - -``` -cd $HOME/.ghsync -git clone https://github.com/servo/webrender -cd webrender -git checkout -b github-sync master -``` - -(You can set the github-sync branch to a past revision if you want to replicate -a failure that already got committed). - -Then run the converter from your hg checkout: - -``` -cd $MOZILLA -tools/github-sync/converter.py $HOME/.ghsync/webrender gfx/wr -``` - -You can set the DEBUG variable in the script to True to get more output. diff --git a/tools/github-sync/sync-to-github.sh b/tools/github-sync/sync-to-github.sh deleted file mode 100755 index d677649748..0000000000 --- a/tools/github-sync/sync-to-github.sh +++ /dev/null @@ -1,159 +0,0 @@ -#!/usr/bin/env bash - -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -# Do NOT set -x here, since that will expose a secret API token! -set -o errexit -set -o nounset -set -o pipefail - -if [[ "$(uname)" != "Linux" ]]; then - echo "Error: this script must be run on Linux due to readlink semantics" - exit 1 -fi - -# GECKO_PATH should definitely be set -if [[ -z "${GECKO_PATH}" ]]; then - echo "Error: GECKO_PATH must point to a hg clone of mozilla-central" - exit 1 -fi - -# Internal variables, don't fiddle with these -MYSELF=$(readlink -f ${0}) -MYDIR=$(dirname "${MYSELF}") -WORKDIR="${HOME}/.ghsync" -TMPDIR="${WORKDIR}/tmp" - -NAME="$1" -RELATIVE_PATH="$2" -DOWNSTREAM_REPO="$3" -BORS="$4" -BRANCH="github-sync" - -mkdir -p "${TMPDIR}" - -# Bring the project clone to a known good up-to-date state -if [[ ! -d "${WORKDIR}/${NAME}" ]]; then - echo "Setting up ${NAME} repo..." - git clone "https://github.com/${DOWNSTREAM_REPO}" "${WORKDIR}/${NAME}" - pushd "${WORKDIR}/${NAME}" - git remote add moz-gfx https://github.com/moz-gfx/${NAME} - popd -else - echo "Updating ${NAME} repo..." - pushd "${WORKDIR}/${NAME}" - git checkout master - git pull - popd -fi - -if [[ -n "${GITHUB_SECRET:-}" ]]; then - echo "Obtaining github API token..." - # Be careful, GITHUB_TOKEN is secret, so don't log it (or any variables - # built using it). - GITHUB_TOKEN=$( - curl -sSfL "$TASKCLUSTER_PROXY_URL/secrets/v1/secret/${GITHUB_SECRET}" | - ${MYDIR}/read-json.py "secret/token" - ) - AUTH="moz-gfx:${GITHUB_TOKEN}" - CURL_AUTH="Authorization: bearer ${GITHUB_TOKEN}" -fi - -echo "Pushing base ${BRANCH} branch..." -pushd "${WORKDIR}/${NAME}" -git fetch moz-gfx -git checkout -B ${BRANCH} moz-gfx/${BRANCH} || git checkout -B ${BRANCH} master - -if [[ -n "${GITHUB_SECRET:-}" ]]; then - # git may emit error messages that contain the URL, so let's sanitize them - # or we might leak the auth token to the task log. - git push "https://${AUTH}@github.com/moz-gfx/${NAME}" \ - "${BRANCH}:${BRANCH}" 2>&1 | sed -e "s/${AUTH}/_SANITIZED_/g" - # Re-fetch to update the remote moz-gfx/$BRANCH branch in the local repo; - # normally the push does this but we use a fully-qualified URL for - # pushing so it doesn't happen. - git fetch moz-gfx -fi -popd - -# Run the converter -echo "Running converter..." -pushd "${GECKO_PATH}" -"${MYDIR}/converter.py" "${WORKDIR}/${NAME}" "${RELATIVE_PATH}" -popd - -# Check to see if we have changes that need pushing -echo "Checking for new changes..." -pushd "${WORKDIR}/${NAME}" -PATCHCOUNT=$(git log --oneline moz-gfx/${BRANCH}..${BRANCH}| wc -l) -if [[ ${PATCHCOUNT} -eq 0 ]]; then - echo "No new patches found, aborting..." - exit 0 -fi - -# Log the new changes, just for logging purposes -echo "Here are the new changes:" -git log --graph --stat moz-gfx/${BRANCH}..${BRANCH} - -# Collect PR numbers of PRs opened on Github and merged to m-c -set +e -FIXES=$( - git log master..${BRANCH} | - grep "\[import_pr\] From https://github.com/${DOWNSTREAM_REPO}/pull" | - sed -e "s%.*pull/% Fixes #%" | - uniq | - tr '\n' ',' -) -echo "${FIXES}" -set -e - -if [[ -z "${GITHUB_SECRET:-}" ]]; then - echo "Running in try push, exiting now" - exit 0 -fi - -echo "Pushing new changes to moz-gfx..." -# git may emit error messages that contain the URL, so let's sanitize them -# or we might leak the auth token to the task log. -git push "https://${AUTH}@github.com/moz-gfx/${NAME}" +${BRANCH}:${BRANCH} \ - 2>&1 | sed -e "s/${AUTH}/_SANITIZED_/g" - -CURL_HEADER="Accept: application/vnd.github.v3+json" -CURL=(curl -sSfL -H "${CURL_HEADER}" -H "${CURL_AUTH}") -# URL extracted here mostly to make servo-tidy happy with line lengths -API_URL="https://api.github.com/repos/${DOWNSTREAM_REPO}" - -# Check if there's an existing PR open -echo "Listing pre-existing pull requests..." -"${CURL[@]}" "${API_URL}/pulls?head=moz-gfx:${BRANCH}" | - tee "${TMPDIR}/pr.get" -set +e -COMMENT_URL=$(cat "${TMPDIR}/pr.get" | ${MYDIR}/read-json.py "0/comments_url") -HAS_COMMENT_URL="${?}" -set -e - -if [[ ${HAS_COMMENT_URL} -ne 0 ]]; then - echo "Pull request not found, creating..." - # The PR doesn't exist yet, so let's create it - ( echo -n '{ "title": "Sync changes from mozilla-central '"${RELATIVE_PATH}"'"' - echo -n ', "body": "'"${FIXES}"'"' - echo -n ', "head": "moz-gfx:'"${BRANCH}"'"' - echo -n ', "base": "master" }' - ) > "${TMPDIR}/pr.create" - "${CURL[@]}" -d "@${TMPDIR}/pr.create" "${API_URL}/pulls" | - tee "${TMPDIR}/pr.response" - COMMENT_URL=$( - cat "${TMPDIR}/pr.response" | - ${MYDIR}/read-json.py "comments_url" - ) -fi - -# At this point COMMENTS_URL should be set, so leave a comment to tell bors -# to merge the PR. -echo "Posting r+ comment to ${COMMENT_URL}..." -echo '{ "body": "'"$BORS"' r=auto" }' > "${TMPDIR}/bors_rplus" -"${CURL[@]}" -d "@${TMPDIR}/bors_rplus" "${COMMENT_URL}" - -echo "All done!" diff --git a/tools/lint/condprof-addons.yml b/tools/lint/condprof-addons.yml index a62c1fb6b9..b85deda7bc 100644 --- a/tools/lint/condprof-addons.yml +++ b/tools/lint/condprof-addons.yml @@ -5,6 +5,6 @@ condprof-addons: - 'testing/condprofile/condprof/customization' exclude: [] extensions: ['json'] - support-files: ['taskcluster/ci/fetch/browsertime.yml'] + support-files: ['taskcluster/kinds/fetch/browsertime.yml'] type: structured_log payload: condprof-addons:lint diff --git a/tools/lint/condprof-addons/__init__.py b/tools/lint/condprof-addons/__init__.py index f17ab26f3f..c569a4d8dc 100644 --- a/tools/lint/condprof-addons/__init__.py +++ b/tools/lint/condprof-addons/__init__.py @@ -13,7 +13,7 @@ import requests import yaml from mozlint.pathutils import expand_exclusions -BROWSERTIME_FETCHES_PATH = Path("taskcluster/ci/fetch/browsertime.yml") +BROWSERTIME_FETCHES_PATH = Path("taskcluster/kinds/fetch/browsertime.yml") CUSTOMIZATIONS_PATH = Path("testing/condprofile/condprof/customization/") DOWNLOAD_TIMEOUT = 30 ERR_FETCH_TASK_MISSING = "firefox-addons taskcluster fetch config section not found" diff --git a/tools/lint/eslint/eslint-plugin-mozilla/lib/configs/recommended.js b/tools/lint/eslint/eslint-plugin-mozilla/lib/configs/recommended.js index 036ed1bda3..003311f623 100644 --- a/tools/lint/eslint/eslint-plugin-mozilla/lib/configs/recommended.js +++ b/tools/lint/eslint/eslint-plugin-mozilla/lib/configs/recommended.js @@ -55,7 +55,6 @@ module.exports = { files: ["**/*.sys.mjs", "**/*.jsm"], rules: { "mozilla/lazy-getter-object-name": "error", - "mozilla/reject-chromeutils-import": "error", "mozilla/reject-eager-module-in-lazy-getter": "error", "mozilla/reject-global-this": "error", "mozilla/reject-globalThis-modification": "error", @@ -180,6 +179,7 @@ module.exports = { "mozilla/prefer-boolean-length-check": "error", "mozilla/prefer-formatValues": "error", "mozilla/reject-addtask-only": "error", + "mozilla/reject-chromeutils-import": "error", "mozilla/reject-chromeutils-import-params": "error", "mozilla/reject-importGlobalProperties": ["error", "allownonwebidl"], "mozilla/reject-multiple-getters-calls": "error", diff --git a/tools/lint/eslint/eslint-plugin-mozilla/lib/environments/privileged.js b/tools/lint/eslint/eslint-plugin-mozilla/lib/environments/privileged.js index 7e6437ce7a..f0bd1aa8b8 100644 --- a/tools/lint/eslint/eslint-plugin-mozilla/lib/environments/privileged.js +++ b/tools/lint/eslint/eslint-plugin-mozilla/lib/environments/privileged.js @@ -317,6 +317,7 @@ module.exports = { ImageData: false, ImageDocument: false, InputEvent: false, + InspectorCSSParser: false, InspectorFontFace: false, InspectorUtils: false, InstallTriggerImpl: false, diff --git a/tools/lint/eslint/eslint-plugin-mozilla/lib/environments/special-powers-sandbox.js b/tools/lint/eslint/eslint-plugin-mozilla/lib/environments/special-powers-sandbox.js index 5a28c91883..2ef47d89e0 100644 --- a/tools/lint/eslint/eslint-plugin-mozilla/lib/environments/special-powers-sandbox.js +++ b/tools/lint/eslint/eslint-plugin-mozilla/lib/environments/special-powers-sandbox.js @@ -35,6 +35,7 @@ module.exports = { assert: false, Assert: false, BrowsingContext: false, + InspectorCSSParser: false, InspectorUtils: false, ok: false, is: false, diff --git a/tools/lint/license.yml b/tools/lint/license.yml index 34e1eb817c..00490b3028 100644 --- a/tools/lint/license.yml +++ b/tools/lint/license.yml @@ -26,13 +26,6 @@ license: - config/external/nspr/_pr_bld.h # Unknown origin - gfx/2d/MMIHelpers.h - # might not work with license - - gradle.properties - # might not work with license - - gradle/wrapper/gradle-wrapper.properties - - mobile/android/android-components/gradle/wrapper/gradle-wrapper.properties - - mobile/android/fenix/gradle/wrapper/gradle-wrapper.properties - - mobile/android/focus-android/gradle/wrapper/gradle-wrapper.properties # ICU4X data - intl/icu_segmenter_data # Imported code that is dual Apache2 / MIT licensed @@ -44,52 +37,8 @@ license: - mobile/android/geckoview_example/src/main - testing/webcompat/interventions/ - testing/webcompat/shims/ - # TODO - Bug 1881094: temporarily ignored for firefox-android migration - - mobile/android/android-components/components/browser/engine-system/src/main/res/ - - mobile/android/android-components/components/browser/errorpages/src/main/res/ - - mobile/android/android-components/components/browser/menu/src/main/res/ - - mobile/android/android-components/components/browser/menu2/src/main/res/ - - mobile/android/android-components/components/browser/toolbar/src/main/res/ - - mobile/android/android-components/components/compose/awesomebar/src/main/res/ - - mobile/android/android-components/components/compose/browser-toolbar/src/main/res/ - - mobile/android/android-components/components/compose/cfr/src/main/res/ - - mobile/android/android-components/components/compose/tabstray/src/main/res/ - - mobile/android/android-components/components/feature/addons/src/main/res/ - - mobile/android/android-components/components/feature/app-links/src/main/res/ - - mobile/android/android-components/components/feature/autofill/src/main/res/ - - mobile/android/android-components/components/feature/awesomebar/src/main/res/ - - mobile/android/android-components/components/feature/contextmenu/src/main/res/ - - mobile/android/android-components/components/feature/customtabs/src/main/res/ - - mobile/android/android-components/components/feature/downloads/src/main/res/ - - mobile/android/android-components/components/feature/findinpage/src/main/res/ - - mobile/android/android-components/components/feature/fxsuggest/src/main/res/ - - mobile/android/android-components/components/feature/media/src/main/res/ - - mobile/android/android-components/components/feature/privatemode/src/main/res/ - - mobile/android/android-components/components/feature/prompts/src/main/res/ - - mobile/android/android-components/components/feature/pwa/src/main/res/ - - mobile/android/android-components/components/feature/qr/src/main/res/ - - mobile/android/android-components/components/feature/readerview/src/main/res/ - - mobile/android/android-components/components/feature/search/src/main/res/ - - mobile/android/android-components/components/feature/sitepermissions/ - - mobile/android/android-components/components/feature/tabs/src/main/res/ - - mobile/android/android-components/components/feature/webcompat/src/main/assets/extensions/webcompat/injections/ - - mobile/android/android-components/components/feature/webnotifications/src/main/res/ - - mobile/android/android-components/components/lib/crash/src/main/res/ - - mobile/android/android-components/components/service/nimbus/src/main/res/ - - mobile/android/android-components/components/support/base/src/main/res/ - - mobile/android/android-components/components/support/ktx/src/main/res/ - - mobile/android/android-components/components/support/utils/src/main/res/ - - mobile/android/android-components/components/ui/tabcounter/src/main/res/ - - mobile/android/android-components/components/ui/widgets/src/main/res/ + # TODO - Bug 1882443: temporarily ignored for firefox-android migration - mobile/android/android-components/docs/ - - mobile/android/fenix/app/src/main/res/ - - mobile/android/fenix/benchmark/src/main/AndroidManifest.xml - - mobile/android/focus-android/app/lint-baseline.xml - - mobile/android/focus-android/app/src/main/res/ - # might not work with license - - mobile/android/gradle/dotgradle-offline/gradle.properties - # might not work with license - - mobile/android/gradle/dotgradle-online/gradle.properties # Almost empty file - modules/libpref/greprefs.js - parser/html/java/named-character-references.html diff --git a/tools/lint/perfdocs.yml b/tools/lint/perfdocs.yml index 175781ad00..62d6b40897 100644 --- a/tools/lint/perfdocs.yml +++ b/tools/lint/perfdocs.yml @@ -12,7 +12,7 @@ perfdocs: 'dom/indexedDB/test', ] exclude: [] - extensions: ['rst', 'ini', 'yml'] + extensions: [] support-files: [] type: structured_log payload: perfdocs:lint diff --git a/tools/lint/perfdocs/framework_gatherers.py b/tools/lint/perfdocs/framework_gatherers.py index 3c0a4026d9..c875b2a2c8 100644 --- a/tools/lint/perfdocs/framework_gatherers.py +++ b/tools/lint/perfdocs/framework_gatherers.py @@ -51,6 +51,38 @@ class FrameworkGatherer(object): self._task_list = {} self._task_match_pattern = re.compile(r"([\w\W]*/[pgo|opt]*)-([\w\W]*)") + def _build_section_with_header(self, title, content, header_type=None): + """ + Adds a section to the documentation with the title as the type mentioned + and paragraph as content mentioned. + :param title: title of the section + :param content: content of section paragraph + :param header_type: type of the title heading + """ + heading_map = {"H2": "*", "H3": "=", "H4": "-", "H5": "^"} + return [title, heading_map.get(header_type, "^") * len(title), content, ""] + + def _get_metric_heading(self, metric, metrics_info): + """ + Gets the heading of a specific metric. + + :param str metric: The metric to search for. + :param dict metrics_info: The information of all the + metrics that were documented. + :return str: The heading to use for the given metric. + """ + for metric_heading, metric_info in metrics_info.items(): + if metric == metric_heading or any( + metric == alias for alias in metric_info.get("aliases", []) + ): + return metric_heading + if metric_info.get("matcher"): + match = re.search(metric_info["matcher"], metric) + if match: + return metric_heading + + raise Exception(f"Could not find a metric heading for `{metric}`") + def get_task_match(self, task_name): return re.search(self._task_match_pattern, task_name) @@ -85,16 +117,23 @@ class FrameworkGatherer(object): """ raise NotImplementedError - def _build_section_with_header(self, title, content, header_type=None): + def build_metrics_documentation(self, yaml_content): """ - Adds a section to the documentation with the title as the type mentioned - and paragraph as content mentioned. - :param title: title of the section - :param content: content of section paragraph - :param header_type: type of the title heading + Each framework that provides a page with descriptions about the + metrics it produces must implement this method. The metrics defined + for the framework can be found in the `yaml_content` variable. + + The framework gatherer is expected to produce the full documentation + for all the metrics defined in the yaml_content at once. This is done + to allow differentiation between how metrics are displayed between + the different frameworks. + + :param dict yaml_content: A dictionary of the YAML config file for + the specific framework. + :return list: A list of all the lines being added to the metrics + documentation. """ - heading_map = {"H2": "*", "H3": "=", "H4": "-", "H5": "^"} - return [title, heading_map.get(header_type, "^") * len(title), content, ""] + raise NotImplementedError class RaptorGatherer(FrameworkGatherer): @@ -167,7 +206,9 @@ class RaptorGatherer(FrameworkGatherer): :return list: the list of the tests """ desc_exclusion = ["here", "manifest_relpath", "path", "relpath"] - test_manifest = TestManifest([str(manifest_path)], strict=False, document=True) + test_manifest = TestManifest( + [str(manifest_path)], strict=False, document=True, add_line_no=True + ) test_list = test_manifest.active_tests(exists=False, disabled=False) subtests = {} for subtest in test_list: @@ -206,6 +247,21 @@ class RaptorGatherer(FrameworkGatherer): return subtests + def _get_metric_heading(self, metric, metrics_info): + """ + Finds, and returns the correct heading for a metric to target in a reference link. + + :param str metric: The metric to search for. + :param dict metrics_info: The information of all the + metrics that were documented. + :return str: A formatted string containing the reference link to the + documented metric. + """ + metric_heading = super(RaptorGatherer, self)._get_metric_heading( + metric, metrics_info + ) + return f"`{metric} <raptor-metrics.html#{metric_heading.lower().replace(' ', '-')}>`__" + def get_test_list(self): """ Returns a dictionary containing the tests in every suite ini file. @@ -235,7 +291,9 @@ class RaptorGatherer(FrameworkGatherer): return self._test_list - def build_test_description(self, title, test_description="", suite_name=""): + def build_test_description( + self, title, test_description="", suite_name="", metrics_info=None + ): matcher = [] browsers = [ "firefox", @@ -292,6 +350,18 @@ class RaptorGatherer(FrameworkGatherer): f" * **{sub_title}**: " f"{description[key].replace('{subtest}', description['name'])}\n" ) + elif key == "alert_on": + result += ( + f" * **{sub_title}**: " + + ", ".join( + self._get_metric_heading(metric.strip(), metrics_info) + for metric in description[key] + .replace("\n", " ") + .replace(",", " ") + .split() + ) + + "\n" + ) else: if "\n" in description[key]: description[key] = description[key].replace("\n", " ") @@ -328,6 +398,39 @@ class RaptorGatherer(FrameworkGatherer): title.capitalize(), content, header_type="H4" ) + def build_metrics_documentation(self, parsed_metrics): + metrics_documentation = [] + for metric, metric_info in sorted( + parsed_metrics.items(), key=lambda item: item[0] + ): + metric_content = metric_info["description"] + "\n\n" + + metric_content += ( + f" * **Aliases**: {', '.join(sorted(metric_info['aliases']))}\n" + ) + metric_content += " * **Tests using it**:\n" + + for suite, tests in sorted( + metric_info["location"].items(), key=lambda item: item[0] + ): + metric_content += f" * **{suite.capitalize()}**: " + + test_links = [] + for test in sorted(tests): + test_links.append( + f"`{test} <raptor.html#{test}-{suite.lower()[0]}>`__" + ) + + metric_content += ", ".join(test_links) + "\n" + + metrics_documentation.extend( + self._build_section_with_header( + metric, metric_content, header_type="H3" + ) + ) + + return metrics_documentation + class MozperftestGatherer(FrameworkGatherer): """ @@ -371,7 +474,9 @@ class MozperftestGatherer(FrameworkGatherer): return self._test_list - def build_test_description(self, title, test_description="", suite_name=""): + def build_test_description( + self, title, test_description="", suite_name="", metrics_info=None + ): return [str(self.script_infos[title])] def build_suite_section(self, title, content): @@ -428,7 +533,9 @@ class TalosGatherer(FrameworkGatherer): return self._test_list - def build_test_description(self, title, test_description="", suite_name=""): + def build_test_description( + self, title, test_description="", suite_name="", metrics_info=None + ): result = f".. dropdown:: {title}\n" result += f" :class-container: anchor-id-{title}\n\n" @@ -548,7 +655,9 @@ class AwsyGatherer(FrameworkGatherer): title.capitalize(), content, header_type="H4" ) - def build_test_description(self, title, test_description="", suite_name=""): + def build_test_description( + self, title, test_description="", suite_name="", metrics_info=None + ): dropdown_suite_name = suite_name.replace(" ", "-") result = f".. dropdown:: {title} ({test_description})\n" result += f" :class-container: anchor-id-{title}-{dropdown_suite_name}\n\n" diff --git a/tools/lint/perfdocs/gatherer.py b/tools/lint/perfdocs/gatherer.py index 828c2f7f2b..89f03cfdbb 100644 --- a/tools/lint/perfdocs/gatherer.py +++ b/tools/lint/perfdocs/gatherer.py @@ -87,6 +87,9 @@ class Gatherer(object): if any(d in str(path.resolve()) for d in exclude_dir): continue files = [f for f in os.listdir(path)] + + # Metrics are optional so it's only added to the matched if we + # find the `metrics.rst` file in the perfdocs folder matched = {"path": str(path), "yml": "", "rst": "", "static": []} for file in files: @@ -95,6 +98,8 @@ class Gatherer(object): matched["yml"] = file elif file == "index.rst": matched["rst"] = file + elif file == "metrics.rst": + matched["metrics"] = file elif file.split(".")[-1] in ALLOWED_STATIC_FILETYPES: matched["static"].append(file) diff --git a/tools/lint/perfdocs/generator.py b/tools/lint/perfdocs/generator.py index 3f3a0acefa..240468d62c 100644 --- a/tools/lint/perfdocs/generator.py +++ b/tools/lint/perfdocs/generator.py @@ -70,6 +70,17 @@ class Generator(object): rst_content = read_file( pathlib.Path(framework["path"], framework["rst"]), stringify=True ) + gatherer = self._verifier._gatherer.framework_gatherers[ + yaml_content["name"] + ] + + metrics_rst_content = None + metrics_info = self._verifier.metrics_info[yaml_content["name"]] + if framework.get("metrics"): + metrics_rst_content = read_file( + pathlib.Path(framework["path"], framework["metrics"]), + stringify=True, + ) # Gather all tests and descriptions and format them into # documentation content @@ -87,21 +98,41 @@ class Generator(object): tests = suite_info.get("tests", {}) for test_name in sorted(tests.keys()): - gatherer = self._verifier._gatherer.framework_gatherers[ - yaml_content["name"] - ] test_description = gatherer.build_test_description( - test_name, tests[test_name], suite_name + test_name, + test_description=tests[test_name], + suite_name=suite_name, + metrics_info=metrics_info, ) documentation.extend(test_description) documentation.append("") + # For each framework, we may want to organize the metrics differently + # so delegate the complete setup of the metric documentation to the + # framework-specific gatherers + metrics_rst = "" + if metrics_rst_content: + metrics_documentation = gatherer.build_metrics_documentation( + metrics_info + ) + metrics_rst = re.sub( + r"{metrics_documentation}", + "\n".join(metrics_documentation), + metrics_rst_content, + ) + rst_content = re.sub( + r"{metrics_rst_name}", + f"{yaml_content['name']}-metrics", + rst_content, + ) + # Insert documentation into `.rst` file framework_rst = re.sub( r"{documentation}", "\n".join(documentation), rst_content ) frameworks_info[yaml_content["name"]] = { "dynamic": framework_rst, + "metrics": metrics_rst, "static": [], } @@ -165,6 +196,12 @@ class Generator(object): pathlib.Path(perfdocs_tmpdir, framework_name), ) + if framework_docs[framework_name]["metrics"]: + save_file( + framework_docs[framework_name]["metrics"], + pathlib.Path(perfdocs_tmpdir, f"{framework_name}-metrics"), + ) + for static_name in framework_docs[framework_name]["static"]: if static_name["file"].endswith(".rst"): # XXX Replace this with a shutil.copy call (like below) @@ -266,16 +303,15 @@ class Generator(object): perfdocs_tmpdir = self._create_perfdocs() if self._generate: self._save_perfdocs(perfdocs_tmpdir) - else: + elif not are_dirs_equal(perfdocs_tmpdir, self.perfdocs_path): # If we are not generating, then at least check if they # should be regenerated by comparing the directories. - if not are_dirs_equal(perfdocs_tmpdir, self.perfdocs_path): - logger.warning( - "PerfDocs are outdated, run ./mach lint -l perfdocs --fix .` " - + "to update them. You can also apply the " - + f"{'perfdocs.diff' if ON_TRY else 'diff.txt'} patch file " - + f"{'produced from this reviewbot test ' if ON_TRY else ''}" - + "to fix the issue.", - files=get_changed_files(self._workspace), - restricted=False, - ) + logger.warning( + "PerfDocs are outdated, run ./mach lint -l perfdocs --fix .` " + + "to update them. You can also apply the " + + f"{'perfdocs.diff' if ON_TRY else 'diff.txt'} patch file " + + f"{'produced from this reviewbot test ' if ON_TRY else ''}" + + "to fix the issue.", + files=get_changed_files(self._workspace), + restricted=False, + ) diff --git a/tools/lint/perfdocs/verifier.py b/tools/lint/perfdocs/verifier.py index 0f39e3a047..5f0b62cbf2 100644 --- a/tools/lint/perfdocs/verifier.py +++ b/tools/lint/perfdocs/verifier.py @@ -63,12 +63,10 @@ CONFIG_SCHEMA = { "type": "object", "properties": { "test_name": {"type": "string"}, - "metrics": {"$ref": "#/definitions/metrics_schema"}, }, }, "description": {"type": "string"}, "owner": {"type": "string"}, - "metrics": {"$ref": "#/definitions/metrics_schema"}, }, "required": ["description"], } @@ -93,6 +91,7 @@ class Verifier(object): :param str workspace_dir: Path to the top-level checkout directory. """ self.workspace_dir = workspace_dir + self.metrics_info = {} self._gatherer = Gatherer(workspace_dir, taskgraph) self._compiled_matchers = {} @@ -242,104 +241,32 @@ class Verifier(object): the test harness as real metrics. Failures here suggest that a metric changed name, is missing an alias, is misnamed, duplicated, or was removed. """ - yaml_suite = yaml_content["suites"][suite] - suite_metrics = yaml_suite.get("metrics", {}) - - # Check to make sure all the metrics with given descriptions - # are actually being measured. Add the metric to the "verified" field in - # global_metrics to use it later for "global" metrics that can - # have their descriptions removed. Start from the test level. - for test_name, test_info in yaml_suite.get("tests", {}).items(): - if not isinstance(test_info, dict): - continue - test_metrics_info = test_info.get("metrics", {}) - - # Find all tests that match with this name in case they measure - # different things - measured_metrics = [] - for t in framework_info["test_list"][suite]: - if not self._is_yaml_test_match(t, test_name): - # Check to make sure we are checking against the right - # test. Skip the metric check if we can't find the test. - continue - measured_metrics.extend( - framework_info["test_list"][suite][t].get("metrics", []) - ) - - if len(measured_metrics) == 0: - continue - - # Check if all the test metrics documented exist - for metric_name, metric_info in test_metrics_info.items(): + for global_metric_name, global_metric_info in global_metrics["global"].items(): + for test, test_info in framework_info["test_list"][suite].items(): verified_metrics = self._match_metrics( - metric_name, metric_info, measured_metrics + global_metric_name, global_metric_info, test_info.get("metrics", []) ) - if len(verified_metrics) > 0: + if len(verified_metrics) == 0: + continue + + if global_metric_info.get("verified", False): + # We already verified this global metric, but add any + # extra verified metrics here + global_metrics["verified"].extend(verified_metrics) + else: + global_metric_info["verified"] = True global_metrics["yaml-verified"].extend( - [metric_name] + metric_info["aliases"] + [global_metric_name] + global_metric_info["aliases"] ) global_metrics["verified"].extend( - [metric_name] + metric_info["aliases"] + verified_metrics - ) - else: - logger.warning( - ( - "Cannot find documented metric `{}` " - "being used in the specified test `{}`." - ).format(metric_name, test_name), - framework_info["yml_path"], + [global_metric_name] + + global_metric_info["aliases"] + + verified_metrics ) - # Check the suite level now - for suite_metric_name, suite_metric_info in suite_metrics.items(): - measured_metrics = [] - for _, test_info in framework_info["test_list"][suite].items(): - measured_metrics.extend(test_info.get("metrics", [])) - - verified_metrics = self._match_metrics( - suite_metric_name, suite_metric_info, measured_metrics - ) - if len(verified_metrics) > 0: - global_metrics["yaml-verified"].extend( - [suite_metric_name] + suite_metric_info["aliases"] - ) - global_metrics["verified"].extend( - [suite_metric_name] - + suite_metric_info["aliases"] - + verified_metrics - ) - else: - logger.warning( - ( - "Cannot find documented metric `{}` " - "being used in the specified suite `{}`." - ).format(suite_metric_name, suite), - framework_info["yml_path"], - ) - - # Finally check the global level (output failures later) - all_measured_metrics = [] - for _, test_info in framework_info["test_list"][suite].items(): - all_measured_metrics.extend(test_info.get("metrics", [])) - for global_metric_name, global_metric_info in global_metrics["global"].items(): - verified_metrics = self._match_metrics( - global_metric_name, global_metric_info, all_measured_metrics - ) - if global_metric_info.get("verified", False): - # We already verified this global metric, but add any - # extra verified metrics here - global_metrics["verified"].extend(verified_metrics) - continue - if len(verified_metrics) > 0: - global_metric_info["verified"] = True - global_metrics["yaml-verified"].extend( - [global_metric_name] + global_metric_info["aliases"] - ) - global_metrics["verified"].extend( - [global_metric_name] - + global_metric_info["aliases"] - + verified_metrics - ) + global_metric_info.setdefault("location", {}).setdefault( + suite, [] + ).append(test) def _validate_metrics_harness_direction( self, suite, test_list, yaml_content, global_metrics @@ -484,6 +411,8 @@ class Verifier(object): suite, test_list, yaml_content, global_metrics ) + self.metrics_info[framework_info["name"]] = global_metrics["global"] + def validate_yaml(self, yaml_path): """ Validate that the YAML file has all the fields that are @@ -532,10 +461,10 @@ class Verifier(object): return valid - def validate_rst_content(self, rst_path): + def validate_rst_content(self, rst_path, expected_str): """ - Validate that the index file given has a {documentation} entry - so that the documentation can be inserted there. + Validate that a given RST has the expected string in it + so that the generated documentation can be inserted there. :param str rst_path: Path to the RST file. :return bool: True/False => Passed/Failed Validation @@ -545,14 +474,14 @@ class Verifier(object): # Check for a {documentation} entry in some line, # if we can't find one, then the validation fails. valid = False - docs_match = re.compile(".*{documentation}.*") + docs_match = re.compile(f".*{expected_str}.*") for line in rst_content: if docs_match.search(line): valid = True break if not valid: logger.warning( # noqa: PLE1205 - "Cannot find a '{documentation}' entry in the given index file", + f"Cannot find a '{expected_str}' entry in the given index file", rst_path, ) @@ -583,9 +512,18 @@ class Verifier(object): _valid_files = { "yml": self.validate_yaml(matched_yml), "rst": True, + "metrics": True, } if not read_yaml(matched_yml)["static-only"]: - _valid_files["rst"] = self.validate_rst_content(matched_rst) + _valid_files["rst"] = self.validate_rst_content( + matched_rst, "{documentation}" + ) + + if matched.get("metrics"): + _valid_files["metrics"] = self.validate_rst_content( + pathlib.Path(matched["path"], matched["metrics"]), + "{metrics_documentation}", + ) # Log independently the errors found for the matched files for file_format, valid in _valid_files.items(): diff --git a/tools/lint/python/l10n_lint.py b/tools/lint/python/l10n_lint.py index 158cb5f7e6..2ba2278d22 100644 --- a/tools/lint/python/l10n_lint.py +++ b/tools/lint/python/l10n_lint.py @@ -40,15 +40,14 @@ def lint_strings(name, paths, lintconfig, **lintargs): extensions = lintconfig.get("extensions") # Load l10n.toml configs - l10nconfigs = load_configs(lintconfig, root, l10n_base, name) + l10nconfigs = load_configs(lintconfig["l10n_configs"], root, l10n_base, name) - # Check include paths in l10n.yml if it's in our given paths - # Only the l10n.yml will show up here, but if the l10n.toml files - # change, we also get the l10n.yml as the toml files are listed as - # support files. + # If l10n.yml is included in the provided paths, validate it against the + # TOML files, then remove it to avoid parsing it as a localizable resource. if lintconfig["path"] in paths: results = validate_linter_includes(lintconfig, l10nconfigs, lintargs) paths.remove(lintconfig["path"]) + lintconfig["include"].remove(mozpath.relpath(lintconfig["path"], root)) else: results = [] @@ -60,8 +59,7 @@ def lint_strings(name, paths, lintconfig, **lintargs): all_files.append(fileobj.path) if fp.isfile: all_files.append(p) - # Filter again, our directories might have picked up files the - # explicitly excluded in the l10n.yml configuration. + # Filter out files explicitly excluded in the l10n.yml configuration. # `browser/locales/en-US/firefox-l10n.js` is a good example. all_files, _ = pathutils.filterpaths( lintargs["root"], @@ -70,7 +68,8 @@ def lint_strings(name, paths, lintconfig, **lintargs): exclude=exclude, extensions=extensions, ) - # These should be excluded in l10n.yml + # Filter again, our directories might have picked up files that should be + # excluded in l10n.yml skips = {p for p in all_files if not parser.hasParser(p)} results.extend( result.from_config( @@ -142,11 +141,11 @@ def strings_repo_setup(repo: str, name: str): fh.flush() -def load_configs(lintconfig, root, l10n_base, locale): +def load_configs(l10n_configs, root, l10n_base, locale): """Load l10n configuration files specified in the linter configuration.""" configs = [] env = {"l10n_base": l10n_base} - for toml in lintconfig["l10n_configs"]: + for toml in l10n_configs: cfg = TOMLParser().parse( mozpath.join(root, toml), env=env, ignore_missing_includes=True ) diff --git a/tools/lint/rejected-words.yml b/tools/lint/rejected-words.yml index ed9e8c9d60..6a809930ec 100644 --- a/tools/lint/rejected-words.yml +++ b/tools/lint/rejected-words.yml @@ -213,7 +213,7 @@ avoid-blacklist-and-whitelist: - security/sandbox/linux/SandboxFilter.cpp - security/sandbox/linux/SandboxFilterUtil.h - security/sandbox/linux/Sandbox.h - - taskcluster/ci/docker-image/kind.yml + - taskcluster/kinds/docker-image/kind.yml - taskcluster/gecko_taskgraph/actions/create_interactive.py - taskcluster/gecko_taskgraph/transforms/test/other.py - taskcluster/gecko_taskgraph/try_option_syntax.py diff --git a/tools/lint/test/conftest.py b/tools/lint/test/conftest.py index ad88f8aa97..94ac511804 100644 --- a/tools/lint/test/conftest.py +++ b/tools/lint/test/conftest.py @@ -260,6 +260,7 @@ def perfdocs_sample(): DYNAMIC_SAMPLE_CONFIG, SAMPLE_CONFIG, SAMPLE_INI, + SAMPLE_METRICS_CONFIG, SAMPLE_TEST, temp_dir, temp_file, @@ -291,7 +292,11 @@ def perfdocs_sample(): ) as tmpconfig, temp_file( "config_2.yml", tempdir=perfdocs_dir, content=DYNAMIC_SAMPLE_CONFIG ) as tmpconfig_2, temp_file( - "index.rst", tempdir=perfdocs_dir, content="{documentation}" + "config_metrics.yml", tempdir=perfdocs_dir, content=SAMPLE_METRICS_CONFIG + ) as tmpconfig_metrics, temp_file( + "index.rst", + tempdir=perfdocs_dir, + content="{metrics_rst_name}{documentation}", ) as tmpindex: yield { "top_dir": tmpdir, @@ -301,5 +306,6 @@ def perfdocs_sample(): "test": tmptest, "config": tmpconfig, "config_2": tmpconfig_2, + "config_metrics": tmpconfig_metrics, "index": tmpindex, } diff --git a/tools/lint/test/test_perfdocs.py b/tools/lint/test/test_perfdocs.py index 4ee834ad68..5a12c82d4d 100644 --- a/tools/lint/test/test_perfdocs.py +++ b/tools/lint/test/test_perfdocs.py @@ -85,11 +85,32 @@ suites: SAMPLE_METRICS_CONFIG = """ name: raptor +manifest: "None" +metrics: + 'test': + aliases: [t1, t2] + description: a description + matcher: f.*|S.* +static-only: False +suites: + suite: + description: "Performance tests from the 'suite' folder." + tests: + Example: "Performance test Example from another_suite." + another_suite: + description: "Performance tests from the 'another_suite' folder." + tests: + Example: "Performance test Example from another_suite." +""" + + +DYNAMIC_METRICS_CONFIG = """ +name: raptor manifest: "None"{} static-only: False suites: suite: - description: "Performance tests from the 'suite' folder."{} + description: "Performance tests from the 'suite' folder." tests: Example: "Performance test Example from another_suite." another_suite: @@ -324,7 +345,9 @@ def test_perfdocs_verifier_validate_rst_pass( from perfdocs.verifier import Verifier - valid = Verifier(top_dir).validate_rst_content(pathlib.Path(rst_path)) + valid = Verifier(top_dir).validate_rst_content( + pathlib.Path(rst_path), expected_str="{documentation}" + ) assert valid @@ -347,7 +370,7 @@ def test_perfdocs_verifier_invalid_rst(logger, structured_logger, perfdocs_sampl from perfdocs.verifier import Verifier verifier = Verifier("top_dir") - valid = verifier.validate_rst_content(rst_path) + valid = verifier.validate_rst_content(rst_path, expected_str="{documentation}") expected = ( "Cannot find a '{documentation}' entry in the given index file", @@ -532,7 +555,7 @@ def test_perfdocs_verifier_nonexistent_documented_metrics( setup_sample_logger(logger, structured_logger, top_dir) with open(perfdocs_sample["config"], "w", newline="\n") as f: - f.write(SAMPLE_METRICS_CONFIG.format(metric_definitions, "")) + f.write(DYNAMIC_METRICS_CONFIG.format(metric_definitions, "")) with open(perfdocs_sample["manifest"]["path"], "w", newline="\n") as f: f.write(manifest) @@ -587,7 +610,7 @@ def test_perfdocs_verifier_undocumented_metrics( setup_sample_logger(logger, structured_logger, top_dir) with open(perfdocs_sample["config"], "w", newline="\n") as f: - f.write(SAMPLE_METRICS_CONFIG.format(metric_definitions, "")) + f.write(DYNAMIC_METRICS_CONFIG.format(metric_definitions, "")) with open(perfdocs_sample["manifest"]["path"], "w", newline="\n") as f: f.write(manifest) @@ -619,6 +642,13 @@ metrics: aliases: - fcp - SpeedIndex + - SpeedIndex2 + description: "Example" + "FirstPaint2": + aliases: + - fcp + - SpeedIndex + - SpeedIndex2 description: "Example" """, 3, ], @@ -629,12 +659,20 @@ metrics: FirstPaint: aliases: - fcp + - SpeedIndex3 + - SpeedIndex description: Example SpeedIndex: aliases: - speedindex - si description: Example + SpeedIndex3: + aliases: + - speedindex + - si + - fcp + description: Example """, 5, ], @@ -648,10 +686,7 @@ def test_perfdocs_verifier_duplicate_metrics( setup_sample_logger(logger, structured_logger, top_dir) with open(perfdocs_sample["config"], "w", newline="\n") as f: - indented_defs = "\n".join( - [(" " * 8) + metric_line for metric_line in metric_definitions.split("\n")] - ) - f.write(SAMPLE_METRICS_CONFIG.format(metric_definitions, indented_defs)) + f.write(DYNAMIC_METRICS_CONFIG.format(metric_definitions)) with open(perfdocs_sample["manifest"]["path"], "w", newline="\n") as f: f.write(manifest) @@ -710,7 +745,7 @@ def test_perfdocs_verifier_valid_metrics( setup_sample_logger(logger, structured_logger, top_dir) with open(perfdocs_sample["config"], "w", newline="\n") as f: - f.write(SAMPLE_METRICS_CONFIG.format(metric_definitions, "")) + f.write(DYNAMIC_METRICS_CONFIG.format(metric_definitions, "")) with open(perfdocs_sample["manifest"]["path"], "w", newline="\n") as f: f.write(manifest) @@ -836,7 +871,9 @@ def test_perfdocs_framework_gatherers_urls(logger, structured_logger, perfdocs_s for test_name in tests.keys(): desc = gn._verifier._gatherer.framework_gatherers[ "raptor" - ].build_test_description(fg, test_name, tests[test_name], suite_name) + ].build_test_description( + fg, test_name, tests[test_name], suite_name, {"fcp": {}} + ) assert f"**test url**: `<{url[0]['test_url']}>`__" in desc[0] assert f"**expected**: {url[0]['expected']}" in desc[0] assert test_name in desc[0] diff --git a/tools/lint/test/test_perfdocs_generation.py b/tools/lint/test/test_perfdocs_generation.py index b9b540d234..7966ed0f12 100644 --- a/tools/lint/test/test_perfdocs_generation.py +++ b/tools/lint/test/test_perfdocs_generation.py @@ -51,6 +51,72 @@ def test_perfdocs_generator_generate_perfdocs_pass( @mock.patch("perfdocs.logger.PerfDocLogger") +def test_perfdocs_generator_generate_perfdocs_metrics_pass( + logger, structured_logger, perfdocs_sample +): + from test_perfdocs import temp_file + + top_dir = perfdocs_sample["top_dir"] + setup_sample_logger(logger, structured_logger, top_dir) + + templates_dir = pathlib.Path(top_dir, "tools", "lint", "perfdocs", "templates") + templates_dir.mkdir(parents=True, exist_ok=True) + + from perfdocs.generator import Generator + from perfdocs.verifier import Verifier + + sample_gatherer_result = { + "suite": {"Example": {"metrics": ["fcp", "SpeedIndex"]}}, + "another_suite": {"Example": {}}, + } + sample_test_list_result = { + "suite": [{"metrics": ["fcp", "SpeedIndex"], "name": "Example"}], + "another_suite": [{"name": "Example"}], + } + + with temp_file( + "metrics.rst", + tempdir=pathlib.Path(top_dir, "perfdocs"), + content="{metrics_documentation}", + ): + with mock.patch( + "perfdocs.framework_gatherers.RaptorGatherer.get_test_list" + ) as m: + m.return_value = sample_gatherer_result + with perfdocs_sample["config"].open("w") as f1, perfdocs_sample[ + "config_metrics" + ].open("r") as f2: + # Overwrite content of config.yml with metrics config + f1.write(f2.read()) + + verifier = Verifier(top_dir) + verifier.validate_tree() + + verifier._gatherer.framework_gatherers[ + "raptor" + ]._descriptions = sample_test_list_result + + generator = Generator(verifier, generate=True, workspace=top_dir) + with temp_file( + "index.rst", tempdir=templates_dir, content="{test_documentation}" + ): + generator.generate_perfdocs() + + with pathlib.Path(generator.perfdocs_path, "raptor-metrics.rst").open() as f: + metrics_content = f.read() + assert "{metrics_documentation}" not in metrics_content + assert "a description" in metrics_content + assert "**Tests using it**" in metrics_content + + with pathlib.Path(generator.perfdocs_path, "raptor.rst").open() as f: + raptor_index_content = f.read() + assert "{metrics_rst_name}" not in raptor_index_content + assert "raptor-metrics" in raptor_index_content + + assert logger.warning.call_count == 0 + + +@mock.patch("perfdocs.logger.PerfDocLogger") def test_perfdocs_generator_needed_regeneration( logger, structured_logger, perfdocs_sample ): @@ -227,7 +293,7 @@ def test_perfdocs_generator_build_perfdocs(logger, structured_logger, perfdocs_s generator = Generator(verifier, generate=True, workspace=top_dir) frameworks_info = generator.build_perfdocs_from_tree() - expected = ["dynamic", "static"] + expected = ["dynamic", "metrics", "static"] for framework in sorted(frameworks_info.keys()): for i, framework_info in enumerate(frameworks_info[framework]): diff --git a/tools/lint/trojan-source.yml b/tools/lint/trojan-source.yml index a273626b58..7a0ac594c3 100644 --- a/tools/lint/trojan-source.yml +++ b/tools/lint/trojan-source.yml @@ -16,10 +16,10 @@ trojan-source: - third_party/rust/clap_builder/src/output/textwrap/core.rs - third_party/rust/textwrap/src/core.rs - third_party/rust/icu_provider/src/hello_world.rs - - third_party/rust/uniffi-example-rondpoint/tests/bindings/test_rondpoint.py - third_party/rust/error-chain/tests/tests.rs - third_party/rust/unicode-width/src/tests.rs - security/nss/gtests/mozpkix_gtest/pkixnames_tests.cpp + - toolkit/components/uniffi-fixtures/rondpoint/tests/bindings/test_rondpoint.py extensions: - .c - .cc diff --git a/tools/moz.build b/tools/moz.build index bca499db61..041c998800 100644 --- a/tools/moz.build +++ b/tools/moz.build @@ -13,9 +13,6 @@ with Files("code-coverage/**"): with Files("compare-locales/mach_commands.py"): BUG_COMPONENT = ("Localization Infrastructure and Tools", "compare-locales") -with Files("github-sync/**"): - BUG_COMPONENT = ("Core", "Graphics") - with Files("lint/**"): BUG_COMPONENT = ("Developer Infrastructure", "Lint and Formatting") diff --git a/tools/moztreedocs/docs/jsdoc-support.rst b/tools/moztreedocs/docs/jsdoc-support.rst index 100fb92dac..2c1d5843b6 100644 --- a/tools/moztreedocs/docs/jsdoc-support.rst +++ b/tools/moztreedocs/docs/jsdoc-support.rst @@ -1,6 +1,25 @@ jsdoc support ============= +ESLint support +-------------- + +If you are looking to enable JSDoc generation for your documents, please also +enable the ESLint plugin for JSDoc if it is not already enabled. + +In the top-level :searchfox:`.eslintrc.js file <.eslintrc.js>` there are currently +two sections where the ``valid-jsdoc`` and ``require-jsdoc`` rules are enabled. +Please check that your component is not excluded from these sections. If it is, +you should remove the exclusion and fix any instances that are raised by running + +.. code-block:: shell + + ./mach eslint path/to/component/ + + +Enabling JSDoc generation +------------------------- + Here is a quick example, for the public AddonManager :ref:`API <AddonManager Reference>` To use it for your own code: @@ -8,9 +27,9 @@ To use it for your own code: #. Check that JSDoc generates the output you expect (you may need to use a @class annotation on "object initializer"-style class definitions for instance) #. Create an `.rst file`, which may contain explanatory text as well as the API docs. The minimum will look something like - `this <https://firefox-source-docs.mozilla.org/_sources/toolkit/mozapps/extensions/addon-manager/AddonManager.rst.txt>`__ + `this <https://firefox-source-docs.mozilla.org/_sources/toolkit/mozapps/extensions/addon-manager/AddonManager.rst.txt>`__. #. Ensure your component is on the js_source_path here in the sphinx - config: https://hg.mozilla.org/mozilla-central/file/72ee4800d415/tools/docs/conf.py#l46 + config: https://hg.mozilla.org/mozilla-central/file/72ee4800d415/tools/docs/conf.py#l46 #. Run `mach doc` locally to generate the output and confirm that it looks correct. diff --git a/tools/performance/Perfetto.cpp b/tools/performance/Perfetto.cpp new file mode 100644 index 0000000000..1fef9c3b78 --- /dev/null +++ b/tools/performance/Perfetto.cpp @@ -0,0 +1,19 @@ +/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "mozilla/Perfetto.h" +#include <stdlib.h> + +PERFETTO_TRACK_EVENT_STATIC_STORAGE(); + +void InitPerfetto() { + if (!getenv("MOZ_DISABLE_PERFETTO")) { + perfetto::TracingInitArgs args; + args.backends |= perfetto::kSystemBackend; + perfetto::Tracing::Initialize(args); + perfetto::TrackEvent::Register(); + } +} diff --git a/tools/performance/Perfetto.h b/tools/performance/Perfetto.h new file mode 100644 index 0000000000..5a2989ce95 --- /dev/null +++ b/tools/performance/Perfetto.h @@ -0,0 +1,117 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_Perfetto_h +#define mozilla_Perfetto_h + +#ifdef MOZ_PERFETTO +# include "perfetto/perfetto.h" +# include "mozilla/TimeStamp.h" + +// Initialization is called when a content process is created. +// This can be called multiple times. +extern void InitPerfetto(); + +/* Perfetto Tracing: + * + * This file provides an interface to the perfetto tracing API. The API from + * the perfetto sdk can be used directly, but an additional set of macros + * prefixed with PERFETTO_* have been defined to help minimize the use of + * ifdef's. + * + * The common perfetto macros require a category and name at the very least. + * These must be static strings, or wrapped with perfetto::DynamicString if + * dynamic. If the string is static, but provided through a runtime pointer, + * then it must be wrapped with perfetto::StaticString. + * + * You can also provide additional parameters such as a timestamp, + * or a lambda to add additional information to the trace marker. + * For more info, see https://perfetto.dev/docs/instrumentation/tracing-sdk + * + * Examples: + * + * // Add a trace event to measure work inside a block, + * // using static strings only. + * + * { + * PERFETTO_TRACE_EVENT("js", "JS::RunScript"); + * run_script(); + * } + * + * // Add a trace event to measure work inside a block, + * // using a dynamic string. + * + * void runScript(nsCString& scriptName) + * { + * PERFETTO_TRACE_EVENT("js", perfetto::DynamicString{scriptName.get()}); + * run_script(); + * } + * + * // Add a trace event using a dynamic category and name. + * + * void runScript(nsCString& categoryName, nsCString& scriptName) + * { + * perfetto::DynamicCategory category{category.get()}; + * PERFETTO_TRACE_EVENT(category, perfetto::DynamicString{scriptName.get()}); + * run_script(); + * } + * + * // Add a trace event to measure two arbitrary points of code. + * // Events in the same category must always be nested. + * + * void startWork() { + * PERFETTO_TRACE_EVENT_BEGIN("js", "StartWork"); + * ... + * PERFETTO_TRACE_EVENT_END("js"); + * } + * + * // Create a trace marker for an event that has already occurred + * // using previously saved timestamps. + * + * void record_event(TimeStamp startTimeStamp, TimeStamp endTimeStamp) + * { + * PERFETTO_TRACE_EVENT_BEGIN("js", "Some Event", startTimeStamp); + * PERFETTO_TRACE_EVENT_END("js", endTimeStamp); + * } + */ + +// Wrap the common trace event macros from perfetto so +// they can be called without #ifdef's. +# define PERFETTO_TRACE_EVENT(...) TRACE_EVENT(__VA_ARGS__) +# define PERFETTO_TRACE_EVENT_BEGIN(...) TRACE_EVENT_BEGIN(__VA_ARGS__) +# define PERFETTO_TRACE_EVENT_END(...) TRACE_EVENT_END(__VA_ARGS__) + +namespace perfetto { +// Specialize custom timestamps for mozilla::TimeStamp. +template <> +struct TraceTimestampTraits<mozilla::TimeStamp> { + static inline TraceTimestamp ConvertTimestampToTraceTimeNs( + const mozilla::TimeStamp& timestamp) { + return {protos::gen::BuiltinClock::BUILTIN_CLOCK_MONOTONIC, + timestamp.RawClockMonotonicNanosecondsSinceBoot()}; + } +}; +} // namespace perfetto + +// Categories can be added dynamically, but to minimize overhead +// all categories should be pre-defined here whenever possible. +PERFETTO_DEFINE_CATEGORIES(perfetto::Category("task"), + perfetto::Category("usertiming")); + +#else // !defined(MOZ_PERFETTO) +# define PERFETTO_TRACE_EVENT(...) \ + do { \ + } while (0) +# define PERFETTO_TRACE_EVENT_BEGIN(...) \ + do { \ + } while (0) +# define PERFETTO_TRACE_EVENT_END(...) \ + do { \ + } while (0) +inline void InitPerfetto() {} +#endif // MOZ_PERFETTO + +#endif // mozilla_Perfetto_h diff --git a/tools/performance/moz.build b/tools/performance/moz.build index ea82c83126..10f2b69cf2 100644 --- a/tools/performance/moz.build +++ b/tools/performance/moz.build @@ -9,9 +9,14 @@ UNIFIED_SOURCES += [ ] EXPORTS.mozilla += [ + "Perfetto.h", "PerfStats.h", ] include("/ipc/chromium/chromium-config.mozbuild") +if CONFIG["MOZ_PERFETTO"]: + UNIFIED_SOURCES += ["Perfetto.cpp"] + DIRS += ["/third_party/perfetto/"] + FINAL_LIBRARY = "xul" diff --git a/tools/profiler/core/memory_hooks.cpp b/tools/profiler/core/memory_hooks.cpp index e13a109aab..5167d15d46 100644 --- a/tools/profiler/core/memory_hooks.cpp +++ b/tools/profiler/core/memory_hooks.cpp @@ -584,6 +584,7 @@ BaseProfilerCount* install_memory_hooks() { ThreadIntercept::Init(); } else { sCounter->Clear(); + sCounter->Register(); } jemalloc_replace_dynamic(replace_init); return sCounter; @@ -635,4 +636,10 @@ void disable_native_allocations() { } } +void unregister_memory_counter() { + if (sCounter) { + sCounter->Unregister(); + } +} + } // namespace mozilla::profiler diff --git a/tools/profiler/core/memory_hooks.h b/tools/profiler/core/memory_hooks.h index a6ace771dd..4f59b21136 100644 --- a/tools/profiler/core/memory_hooks.h +++ b/tools/profiler/core/memory_hooks.h @@ -17,6 +17,7 @@ BaseProfilerCount* install_memory_hooks(); void remove_memory_hooks(); void enable_native_allocations(); void disable_native_allocations(); +void unregister_memory_counter(); } // namespace profiler } // namespace mozilla diff --git a/tools/profiler/core/platform.cpp b/tools/profiler/core/platform.cpp index 6b7e318f80..4641587a9a 100644 --- a/tools/profiler/core/platform.cpp +++ b/tools/profiler/core/platform.cpp @@ -114,18 +114,32 @@ #include <string_view> #include <type_traits> +// To simplify other code in this file, define a helper definition to avoid +// repeating the same preprocessor checks. + // The signals that we use to control the profiler conflict with the signals -// used to control the code coverage tool. Therefore, if coverage is enabled, we -// need to disable our own signal handling mechanisms. +// used to control the code coverage tool. Therefore, if coverage is enabled, +// we need to disable our own signal handling mechanisms. #ifndef MOZ_CODE_COVERAGE # ifdef XP_WIN // TODO: Add support for windows "signal"-like behaviour. See Bug 1867328. +# elif defined(GP_OS_darwin) || defined(GP_OS_linux) || \ + defined(GP_OS_android) || defined(GP_OS_freebsd) +// Specify the specific platforms that we want to support +# define GECKO_PROFILER_ASYNC_POSIX_SIGNAL_CONTROL 1 # else -# include <signal.h> -# include <unistd.h> +// No support on this unknown platform! # endif #endif +// We need some extra includes if we're supporting async posix signals +#if defined(GECKO_PROFILER_ASYNC_POSIX_SIGNAL_CONTROL) +# include <signal.h> +# include <fcntl.h> +# include <unistd.h> +# include <errno.h> +#endif + #if defined(GP_OS_android) # include "JavaExceptions.h" # include "mozilla/java/GeckoJavaSamplerNatives.h" @@ -250,11 +264,28 @@ ProfileChunkedBuffer& profiler_get_core_buffer() { return sProfileChunkedBuffer; } -mozilla::Atomic<int, mozilla::MemoryOrdering::Relaxed> gSkipSampling; +#if defined(GECKO_PROFILER_ASYNC_POSIX_SIGNAL_CONTROL) +// Control character to start the profiler ('g' for "go"!) +static const char sAsyncSignalControlCharStart = 'g'; +// Control character to stop the profiler ('s' for "stop"!) +static const char sAsyncSignalControlCharStop = 's'; + +// This is a file descriptor that is the "write" end of the POSIX pipe that we +// use to start the profiler. It is written to in profiler_start_signal_handler +// and read from in AsyncSignalControlThread +static mozilla::Atomic<int, mozilla::MemoryOrdering::Relaxed> + sAsyncSignalControlWriteFd(-1); // Atomic flag to stop the profiler from within the sampling loop mozilla::Atomic<bool, mozilla::MemoryOrdering::Relaxed> gStopAndDumpFromSignal( false); +#endif + +// Forward declare the function to call when we need to dump + stop from within +// the async control thread +void profiler_dump_and_stop(); + +mozilla::Atomic<int, mozilla::MemoryOrdering::Relaxed> gSkipSampling; #if defined(GP_OS_android) class GeckoJavaSampler @@ -380,6 +411,7 @@ static uint32_t AvailableFeatures() { } #else // The memory hooks are not available. + ProfilerFeature::ClearMemory(features); ProfilerFeature::ClearNativeAllocations(features); #endif @@ -506,6 +538,143 @@ static constexpr size_t MAX_JS_FRAMES = using JsFrame = mozilla::profiler::ThreadRegistrationData::JsFrame; using JsFrameBuffer = mozilla::profiler::ThreadRegistrationData::JsFrameBuffer; +#if defined(GECKO_PROFILER_ASYNC_POSIX_SIGNAL_CONTROL) +// Forward declare this, so we can call it from the constructor. +static void* AsyncSignalControlThreadEntry(void* aArg); + +// Define our platform specific async (posix) signal control thread here. +class AsyncSignalControlThread { + public: + AsyncSignalControlThread() : mThread() { + // Try to open a pipe for this to communicate with. If we can't do this, + // then we give up and return, as there's no point continuing without + // being able to communicate + int pipeFds[2]; + if (pipe(pipeFds)) { + LOG("Profiler AsyncSignalControlThread failed to create a pipe."); + return; + } + + // Close this pipe on calls to exec(). + fcntl(pipeFds[0], F_SETFD, FD_CLOEXEC); + fcntl(pipeFds[1], F_SETFD, FD_CLOEXEC); + + // Write the reading side to mFd, and the writing side to the global atomic + mFd = pipeFds[0]; + sAsyncSignalControlWriteFd = pipeFds[1]; + + // We don't really care about stack size, as it should be minimal, so + // leave the pthread attributes as a nullptr, i.e. choose the default. + pthread_attr_t* attr_ptr = nullptr; + if (pthread_create(&mThread, attr_ptr, AsyncSignalControlThreadEntry, + this) != 0) { + MOZ_CRASH("pthread_create failed"); + } + }; + + ~AsyncSignalControlThread() { + // Derived from code in nsDumpUtils.cpp. Comment reproduced here for + // poisterity: Close sAsyncSignalControlWriteFd /after/ setting the fd to + // -1. Otherwise we have the (admittedly far-fetched) race where we + // + // 1) close sAsyncSignalControlWriteFd + // 2) open a new fd with the same number as sAsyncSignalControlWriteFd + // had. + // 3) receive a signal, then write to the fd. + int asyncSignalControlWriteFd = sAsyncSignalControlWriteFd.exchange(-1); + // This will unblock the "read" in StartWatching. + close(asyncSignalControlWriteFd); + // Finally, exit the thread. + pthread_join(mThread, nullptr); + }; + + void Watch() { + char msg[1]; + ssize_t nread; + while (true) { + // Try reading from the pipe. This will block until something is written: + nread = read(mFd, msg, sizeof(msg)); + + if (nread == -1 && errno == EINTR) { + // nread == -1 and errno == EINTR means that `read` was interrupted + // by a signal before reading any data. This is likely because the + // profiling thread interrupted us (with SIGPROF). We can safely ignore + // this and "go around" the loop again to try and read. + continue; + } + + if (nread == -1 && errno != EINTR) { + // nread == -1 and errno != EINTR means that `read` has failed in some + // way that we can't recover from. In this case, all we can do is give + // up, and quit the watcher, as the pipe is likely broken. + LOG("Error (%d) when reading in AsyncSignalControlThread", errno); + return; + } + + if (nread == 0) { + // nread == 0 signals that the other end of the pipe has been cleanly + // closed. Close our end, and exit the reading loop. + close(mFd); + return; + } + + // If we reach here, nread != 0 and nread != -1. This means that we + // should have read at least one byte, which should be a control byte + // for the profiler. + // It *might* happen that `read` is interrupted by the sampler thread + // after successfully reading. If this occurs, read returns the number + // of bytes read. As anything other than 1 is wrong for us, we can + // always assume that we can read whatever `read` read. + MOZ_RELEASE_ASSERT(nread == 1); + + if (msg[0] == sAsyncSignalControlCharStart) { + // Start the profiler here directly, as we're on a background thread. + // set of preferences, configuration of them is TODO, see Bug 1866007 + uint32_t features = ProfilerFeature::JS | ProfilerFeature::StackWalk | + ProfilerFeature::CPUUtilization; + // as we often don't know what threads we'll care about, tell the + // profiler to profile all threads. + const char* filters[] = {"*"}; + profiler_start(PROFILER_DEFAULT_SIGHANDLE_ENTRIES, + PROFILER_DEFAULT_INTERVAL, features, filters, + MOZ_ARRAY_LENGTH(filters), 0); + } else if (msg[0] == sAsyncSignalControlCharStop) { + // Check to see whether the profiler is even running before trying to + // stop the profiler. Most other methods of stopping the profiler (i.e. + // those through nsProfiler etc) already know whether or not the + // profiler is running, so don't try and stop it if it's already + // running. Signal-stopping doesn't have this constraint, so we should + // check just in case there is a codepath followed by + // `profiler_dump_and_stop` that breaks if we stop while stopped. + if (profiler_is_active()) { + profiler_dump_and_stop(); + } + } else { + LOG("AsyncSignalControlThread recieved unknown control signal: %c", + msg[0]); + } + } + }; + + private: + // The read side of the pipe that we use to communicate from a signal handler + // to the AsyncSignalControlThread + int mFd; + + // The thread handle for the async signal control thread + // Note, that unlike the sampler thread, this is currently a posix-only + // feature. Therefore, we don't bother to have a windows equivalent - we + // just use a pthread_t + pthread_t mThread; +}; + +static void* AsyncSignalControlThreadEntry(void* aArg) { + auto* thread = static_cast<AsyncSignalControlThread*>(aArg); + thread->Watch(); + return nullptr; +} +#endif + // All functions in this file can run on multiple threads unless they have an // NS_IsMainThread() assertion. @@ -529,6 +698,10 @@ class CorePS { CorePS() : mProcessStartTime(TimeStamp::ProcessCreation()), mMaybeBandwidthCounter(nullptr) +#if defined(GECKO_PROFILER_ASYNC_POSIX_SIGNAL_CONTROL) + , + mAsyncSignalControlThread(nullptr) +#endif #ifdef USE_LUL_STACKWALK , mLul(nullptr) @@ -539,6 +712,9 @@ class CorePS { } ~CorePS() { +#if defined(GECKO_PROFILER_ASYNC_POSIX_SIGNAL_CONTROL) + delete mAsyncSignalControlThread; +#endif #ifdef USE_LUL_STACKWALK delete sInstance->mLul; delete mMaybeBandwidthCounter; @@ -684,6 +860,14 @@ class CorePS { return sInstance->mMaybeBandwidthCounter; } +#if defined(GECKO_PROFILER_ASYNC_POSIX_SIGNAL_CONTROL) + static void SetAsyncSignalControlThread( + AsyncSignalControlThread* aAsyncSignalControlThread) { + MOZ_ASSERT(sInstance); + sInstance->mAsyncSignalControlThread = aAsyncSignalControlThread; + } +#endif + private: // The singleton instance static CorePS* sInstance; @@ -701,6 +885,11 @@ class CorePS { // Non-owning pointers to all active counters Vector<BaseProfilerCount*> mCounters; +#if defined(GECKO_PROFILER_ASYNC_POSIX_SIGNAL_CONTROL) + // Background thread for communicating with async signal handlers + AsyncSignalControlThread* mAsyncSignalControlThread; +#endif + #ifdef USE_LUL_STACKWALK // LUL's state. Null prior to the first activation, non-null thereafter. // Owned by this CorePS. @@ -1139,6 +1328,11 @@ class ActivePS { #undef PS_GET_FEATURE + static bool ShouldInstallMemoryHooks(PSLockRef) { + MOZ_ASSERT(sInstance); + return ProfilerFeature::ShouldInstallMemoryHooks(sInstance->mFeatures); + } + static uint32_t JSFlags(PSLockRef aLock) { uint32_t Flags = 0; Flags |= @@ -4106,10 +4300,6 @@ static SamplerThread* NewSamplerThread(PSLockRef aLock, uint32_t aGeneration, return new SamplerThread(aLock, aGeneration, aInterval, aFeatures); } -// Forward declare the function to call when we need to dump + stop from within -// the sampler thread -void profiler_dump_and_stop(); - // This function is the sampler thread. This implementation is used for all // targets. void SamplerThread::Run() { @@ -4765,27 +4955,6 @@ void SamplerThread::Run() { scheduledSampleStart = beforeSleep + sampleInterval; SleepMicro(static_cast<uint32_t>(sampleInterval.ToMicroseconds())); } - - // Check to see if the hard-reset flag has been set to stop the profiler. - // This should only be used on the worst occasions when we need to stop the - // profiler from within the sampling thread (e.g. if the main thread is - // stuck) We need to do this here as it is outside of the scope of the lock. - // Otherwise we'll encounter a race condition where `profiler_stop` tries to - // get the lock that we already hold. We also need to wait until after we - // have carried out post sampling callbacks, as otherwise we may reach a - // situation where another part of the program is waiting for us to finish - // sampling, but we have ended early! - if (gStopAndDumpFromSignal) { - // Reset the flag in case we restart the profiler at a later point - gStopAndDumpFromSignal = false; - // dump the profile, and stop the profiler - profiler_dump_and_stop(); - // profiler_stop will try to destroy the active sampling thread. This will - // also destroy some data structures that are used further down this - // function, leading to invalid accesses. We therefore exit the function - // directly, rather than breaking from the loop. - return; - } } // End of `while` loop. We can only be here from a `break` inside the loop. @@ -5069,9 +5238,9 @@ void SamplerThread::SpyOnUnregisteredThreads() { MOZ_DEFINE_MALLOC_SIZE_OF(GeckoProfilerMallocSizeOf) -NS_IMETHODIMP -GeckoProfilerReporter::CollectReports(nsIHandleReportCallback* aHandleReport, - nsISupports* aData, bool aAnonymize) { +NS_IMETHODIMP GeckoProfilerReporter::CollectReports( + nsIHandleReportCallback* aHandleReport, nsISupports* aData, + bool aAnonymize) { MOZ_RELEASE_ASSERT(NS_IsMainThread()); size_t profSize = 0; @@ -5294,16 +5463,41 @@ static const char* get_size_suffix(const char* str) { return ptr; } -#if !defined(XP_WIN) && !defined(MOZ_CODE_COVERAGE) +#if defined(GECKO_PROFILER_ASYNC_POSIX_SIGNAL_CONTROL) +static void profiler_start_signal_handler(int signal, siginfo_t* info, + void* context) { + // Starting the profiler from a signal handler is a risky business: Both of + // the main tasks that we would like to accomplish (allocating memory, and + // starting a thread) are illegal within a UNIX signal handler. Conversely, + // we cannot dispatch to the main thread, as this may be "stuck" (why else + // would we be using a signal handler to start the profiler?). + // Instead, we have a background thread running that watches a pipe for a + // given "control" character. In this handler, we can simply write to that + // pipe to get the background thread to start the profiler for us! + // Note that `write` is async-signal safe (see signal-safety(7)): + // https://www.man7.org/linux/man-pages/man7/signal-safety.7.html + // This means that it's safe for us to call within a signal handler. + if (sAsyncSignalControlWriteFd != -1) { + char signalControlCharacter = sAsyncSignalControlCharStart; + Unused << write(sAsyncSignalControlWriteFd, &signalControlCharacter, + sizeof(signalControlCharacter)); + } +} + static void profiler_stop_signal_handler(int signal, siginfo_t* info, void* context) { - // We cannot really do any logging here, as this is a signal handler. // Signal handlers are limited in what functions they can call, for more // details see: https://man7.org/linux/man-pages/man7/signal-safety.7.html - // Writing to a file is allowed, but as signal handlers are also limited in - // how long they can run, we instead set an atomic variable to true to trigger - // the sampling thread to stop and dump the data in the profiler. - gStopAndDumpFromSignal = true; + // As we have a background thread already running for checking whether or + // not we want to start the profiler, we can re-use the same machinery to + // stop the profiler. We use the same mechanism of writing to a pipe/file + // descriptor, but with a different control character. Note that `write` is + // signal safe. + if (sAsyncSignalControlWriteFd != -1) { + char signalControlCharacter = sAsyncSignalControlCharStop; + Unused << write(sAsyncSignalControlWriteFd, &signalControlCharacter, + sizeof(signalControlCharacter)); + } } #endif @@ -5379,8 +5573,17 @@ void profiler_dump_and_stop() { profiler_stop(); } +#if defined(GECKO_PROFILER_ASYNC_POSIX_SIGNAL_CONTROL) void profiler_init_signal_handlers() { -#if !defined(XP_WIN) && !defined(MOZ_CODE_COVERAGE) + // Set a handler to start the profiler + struct sigaction prof_start_sa {}; + memset(&prof_start_sa, 0, sizeof(struct sigaction)); + prof_start_sa.sa_sigaction = profiler_start_signal_handler; + prof_start_sa.sa_flags = SA_RESTART | SA_SIGINFO; + sigemptyset(&prof_start_sa.sa_mask); + DebugOnly<int> rstart = sigaction(SIGUSR1, &prof_start_sa, nullptr); + MOZ_ASSERT(rstart == 0, "Failed to install Profiler SIGUSR1 handler"); + // Set a handler to stop the profiler struct sigaction prof_stop_sa {}; memset(&prof_stop_sa, 0, sizeof(struct sigaction)); @@ -5389,8 +5592,8 @@ void profiler_init_signal_handlers() { sigemptyset(&prof_stop_sa.sa_mask); DebugOnly<int> rstop = sigaction(SIGUSR2, &prof_stop_sa, nullptr); MOZ_ASSERT(rstop == 0, "Failed to install Profiler SIGUSR2 handler"); -#endif } +#endif void profiler_init(void* aStackTop) { LOG("profiler_init"); @@ -5444,8 +5647,14 @@ void profiler_init(void* aStackTop) { // Platform-specific initialization. PlatformInit(lock); +#if defined(GECKO_PROFILER_ASYNC_POSIX_SIGNAL_CONTROL) + // Initialise the background thread to listen for signal handler + // communication + CorePS::SetAsyncSignalControlThread(new AsyncSignalControlThread); + // Initialise the signal handlers needed to start/stop the profiler profiler_init_signal_handlers(); +#endif #if defined(GP_OS_android) if (jni::IsAvailable()) { @@ -5611,9 +5820,16 @@ void profiler_init(void* aStackTop) { profiler_mark_thread_awake(); #if defined(MOZ_REPLACE_MALLOC) && defined(MOZ_PROFILER_MEMORY) - // Start counting memory allocations (outside of lock because this may call - // profiler_add_sampled_counter which would attempt to take the lock.) - ActivePS::SetMemoryCounter(mozilla::profiler::install_memory_hooks()); + if (ProfilerFeature::ShouldInstallMemoryHooks(features)) { + // Start counting memory allocations (outside of lock because this may call + // profiler_add_sampled_counter which would attempt to take the lock.) + ActivePS::SetMemoryCounter(mozilla::profiler::install_memory_hooks()); + } else { + // Unregister the memory counter in case it was registered before. This will + // make sure that the empty memory counter from the previous profiler run is + // removed completely and we don't serialize the memory counters. + mozilla::profiler::unregister_memory_counter(); + } #endif invoke_profiler_state_change_callbacks(ProfilingState::Started); @@ -6240,9 +6456,16 @@ RefPtr<GenericPromise> profiler_start(PowerOfTwo32 aCapacity, double aInterval, } #if defined(MOZ_REPLACE_MALLOC) && defined(MOZ_PROFILER_MEMORY) - // Start counting memory allocations (outside of lock because this may call - // profiler_add_sampled_counter which would attempt to take the lock.) - ActivePS::SetMemoryCounter(mozilla::profiler::install_memory_hooks()); + if (ProfilerFeature::ShouldInstallMemoryHooks(aFeatures)) { + // Start counting memory allocations (outside of lock because this may call + // profiler_add_sampled_counter which would attempt to take the lock.) + ActivePS::SetMemoryCounter(mozilla::profiler::install_memory_hooks()); + } else { + // Unregister the memory counter in case it was registered before. This will + // make sure that the empty memory counter from the previous profiler run is + // removed completely and we don't serialize the memory counters. + mozilla::profiler::unregister_memory_counter(); + } #endif invoke_profiler_state_change_callbacks(ProfilingState::Started); @@ -6366,7 +6589,8 @@ void profiler_ensure_started(PowerOfTwo32 aCapacity, double aInterval, } #if defined(MOZ_REPLACE_MALLOC) && defined(MOZ_PROFILER_MEMORY) - if (ActivePS::FeatureNativeAllocations(aLock)) { + if (ActivePS::FeatureNativeAllocations(aLock) && + ActivePS::ShouldInstallMemoryHooks(aLock)) { mozilla::profiler::disable_native_allocations(); } #endif diff --git a/tools/profiler/docs/code-overview.rst b/tools/profiler/docs/code-overview.rst index 3ca662e141..bb9db364de 100644 --- a/tools/profiler/docs/code-overview.rst +++ b/tools/profiler/docs/code-overview.rst @@ -2,7 +2,7 @@ Profiler Code Overview ###################### This is an overview of the code that implements the Profiler inside Firefox -with dome details around tricky subjects, or pointers to more detailed +with some details around tricky subjects, or pointers to more detailed documentation and/or source code. It assumes familiarity with Firefox development, including Mercurial (hg), mach, diff --git a/tools/profiler/docs/index.rst b/tools/profiler/docs/index.rst index 53920e7d2f..02eb9f6839 100644 --- a/tools/profiler/docs/index.rst +++ b/tools/profiler/docs/index.rst @@ -23,13 +23,13 @@ while the profiler.firefox.com interface is documented at `profiler.firefox.com/ buffer instrumenting-javascript instrumenting-rust + instrumenting-android markers-guide memory The following areas still need documentation: * LUL - * Instrumenting Java * Registering Threads * Samples and Stack Walking * Triggering Gecko Profiles in Automation diff --git a/tools/profiler/docs/instrumenting-android.rst b/tools/profiler/docs/instrumenting-android.rst new file mode 100644 index 0000000000..fdd96613b4 --- /dev/null +++ b/tools/profiler/docs/instrumenting-android.rst @@ -0,0 +1,102 @@ +Instrumenting Android +======================== + +There are multiple ways to use the profiler with Android. There is the "Java" +profiler feature (via about:profiling), which enables profiling for JVM code. +This is most likely turned on already for the preset if you are profiling an +Android device. + +In addition to sampling, markers can be created to specifically mark an instant +in time, or a duration. This can be helpful to make sense of a particular piece +of the front-end, or record events that normally wouldn't show up in samples. + +.. note:: + This guide explains Android markers in depth. To learn more about how to add a + marker in C++, JavaScript or Rust, please take a look at their documentation + in :doc:`markers-guide`, :doc:`instrumenting-javascript` or + :doc:`instrumenting-rust` respectively. + +Markers in the GeckoView Java codebase +************************************** + +If you are in the GeckoView codebase, then you should have access to ``GeckoRuntime``. +``GeckoRuntime`` has a ``getProfilerController`` method to get the ``ProfilerController``. +See the `ProfilerController Java file`_ (`javadoc`_) to find which methods you can use to +instrument your source code. + +Here's an example: + +.. code-block:: java + + // Simple marker + sGeckoRuntime.getProfilerController().addMarker("Marker Name"); + + // Simple marker with additional information + sGeckoRuntime.getProfilerController().addMarker("Marker Name", "info"); + + // Duration marker + Double startTime = sGeckoRuntime.getProfilerController().getProfilerTime(); + // ...some code you want to measure... + sGeckoRuntime.getProfilerController().addMarker("Marker Name", startTime); + + // Duration marker with additional information + sGeckoRuntime.getProfilerController().addMarker("Marker Name", startTime, "info"); + +There are various overloads of ``addMarker`` you can choose depending on your need. + +If you need to compute some information before adding it to a marker, it's +recommended to wrap that code with a `isProfilerActive` if check to make sure +that it's only executed while the profiler is active. Here's an example: + +.. code-block:: java + + ProfilerController profilerController = runtime.getProfilerController(); + if (profilerController.isProfilerActive()) { + // Compute the information you want to include. + String info = ... + sGeckoRuntime.getProfilerController().addMarker("Marker Name", info); + } + +Markers in the Fenix codebase +***************************** + +If you are in the Fenix codebase, then you should have access to the Android +components. The Android components includes a `Profiler interface here`_, with +its corresponding `implementation here`_. You should be able to do everything +you can do with the ``ProfilerController``. Here's an example on how to call them: + +.. code-block:: kotlin + + // Simple marker + components.core.engine.profiler?.addMarker("Marker Name"); + + // Simple marker with additional information + components.core.engine.profiler?.addMarker("Marker Name", "info"); + + // Duration marker + val startTime = components.core.engine.profiler?.getProfilerTime() + // ...some code you want to measure... + components.core.engine.profiler?.addMarker("Marker Name", startTime, "additional info") + + // Duration marker with additional information + components.core.engine.profiler?.addMarker("Marker Name", startTime, "info"); + +Similarly, there are various overloads of ``addMarker`` you can choose depending on your needs. + +Like for the GeckoView example above, if you need to compute some information +before adding it to a marker, it's recommended to wrap that code with a +`isProfilerActive` if check to make sure that it's only executed while the +profiler is active. Here's an example: + +.. code-block:: kotlin + + if (components.core.engine.profiler?.isProfilerActive() == true) { + // Compute the information you want to include. + var info = ... + components.core.engine.profiler?.addMarker("Marker Name", info) + } + +.. _ProfilerController Java file: https://searchfox.org/mozilla-central/source/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/ProfilerController.java +.. _javadoc: https://mozilla.github.io/geckoview/javadoc/mozilla-central/org/mozilla/geckoview/ProfilerController.html +.. _Profiler interface here: https://searchfox.org/mozilla-central/source/mobile/android/android-components/components/concept/base/src/main/java/mozilla/components/concept/base/profiler/Profiler.kt +.. _implementation here: https://searchfox.org/mozilla-central/source/mobile/android/android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/profiler/Profiler.kt diff --git a/tools/profiler/docs/instrumenting-javascript.rst b/tools/profiler/docs/instrumenting-javascript.rst index 928d94781e..4ad5118256 100644 --- a/tools/profiler/docs/instrumenting-javascript.rst +++ b/tools/profiler/docs/instrumenting-javascript.rst @@ -11,8 +11,9 @@ or record events that normally wouldn't show up in samples. .. note:: This guide explains JavaScript markers in depth. To learn more about how to add a - marker in C++ or Rust, please take a look at their documentation - in :doc:`markers-guide` or :doc:`instrumenting-rust` respectively. + marker in C++, Rust or JVM please take a look at their documentation + in :doc:`markers-guide`, :doc:`instrumenting-rust` or :doc:`instrumenting-android` + respectively. Markers in Browser Chrome ************************* diff --git a/tools/profiler/docs/instrumenting-rust.rst b/tools/profiler/docs/instrumenting-rust.rst index c3e12f42dc..603c008b6c 100644 --- a/tools/profiler/docs/instrumenting-rust.rst +++ b/tools/profiler/docs/instrumenting-rust.rst @@ -124,8 +124,9 @@ and an optional payload of a specific type (containing arbitrary data relevant t .. note:: This guide explains Rust markers in depth. To learn more about how to add a - marker in C++ or JavaScript, please take a look at their documentation - in :doc:`markers-guide` or :doc:`instrumenting-javascript` respectively. + marker in C++, JavaScript or JVM, please take a look at their documentation + in :doc:`markers-guide` or :doc:`instrumenting-javascript`, + :doc:`instrumenting-android` respectively. Examples ^^^^^^^^ diff --git a/tools/profiler/docs/markers-guide.rst b/tools/profiler/docs/markers-guide.rst index ed18b35867..ac0e4430b9 100644 --- a/tools/profiler/docs/markers-guide.rst +++ b/tools/profiler/docs/markers-guide.rst @@ -9,8 +9,9 @@ and an optional payload of a specific type (containing arbitrary data relevant t .. note:: This guide explains C++ markers in depth. To learn more about how to add a - marker in JavaScript or Rust, please take a look at their documentation - in :doc:`instrumenting-javascript` or :doc:`instrumenting-rust` respectively. + marker in JavaScript, Rust or JVM, please take a look at their documentation + in :doc:`instrumenting-javascript`, :doc:`instrumenting-rust` or + :doc:`instrumenting-android` respectively. Example ------- diff --git a/tools/profiler/public/ProfilerControl.h b/tools/profiler/public/ProfilerControl.h index ac145fac00..53fec681ce 100644 --- a/tools/profiler/public/ProfilerControl.h +++ b/tools/profiler/public/ProfilerControl.h @@ -61,6 +61,9 @@ static constexpr mozilla::PowerOfTwo32 PROFILER_DEFAULT_ENTRIES = static constexpr mozilla::PowerOfTwo32 PROFILER_DEFAULT_STARTUP_ENTRIES = mozilla::baseprofiler::BASE_PROFILER_DEFAULT_STARTUP_ENTRIES; +static constexpr mozilla::PowerOfTwo32 PROFILER_DEFAULT_SIGHANDLE_ENTRIES = + mozilla::MakePowerOfTwo32<64 * 1024 * 1024>(); // 64M entries = 512MiB + # define PROFILER_DEFAULT_INTERVAL BASE_PROFILER_DEFAULT_INTERVAL # define PROFILER_MAX_INTERVAL BASE_PROFILER_MAX_INTERVAL diff --git a/tools/profiler/public/ProfilerCounts.h b/tools/profiler/public/ProfilerCounts.h index cebca81e2c..bdd2ddef9a 100644 --- a/tools/profiler/public/ProfilerCounts.h +++ b/tools/profiler/public/ProfilerCounts.h @@ -20,6 +20,7 @@ # include "mozilla/Assertions.h" # include "mozilla/Atomics.h" +# include "mozilla/DataMutex.h" class BaseProfilerCount; void profiler_add_sampled_counter(BaseProfilerCount* aCounter); @@ -188,13 +189,33 @@ class ProfilerCounterTotal final : public BaseProfilerCount { public: ProfilerCounterTotal(const char* aLabel, const char* aCategory, const char* aDescription) - : BaseProfilerCount(aLabel, &mCounter, &mNumber, aCategory, - aDescription) { + : BaseProfilerCount(aLabel, &mCounter, &mNumber, aCategory, aDescription), + mRegistered(false, "ProfilerCounterTotal::mRegistered") { // Assume we're in libxul + Register(); + } + + virtual ~ProfilerCounterTotal() { Unregister(); } + + void Register() { + auto registered = mRegistered.Lock(); + if (*registered) { + return; + } + + *registered = true; profiler_add_sampled_counter(this); } - virtual ~ProfilerCounterTotal() { profiler_remove_sampled_counter(this); } + void Unregister() { + auto registered = mRegistered.Lock(); + if (!*registered) { + return; + } + + *registered = false; + profiler_remove_sampled_counter(this); + } BaseProfilerCount& operator++() { Add(1); @@ -208,6 +229,9 @@ class ProfilerCounterTotal final : public BaseProfilerCount { ProfilerAtomicSigned mCounter; ProfilerAtomicUnsigned mNumber; + // Using OffTheBooksMutex here because we intentionally leak memory counters + // if they are initialized. + mozilla::DataMutexBase<bool, mozilla::OffTheBooksMutex> mRegistered; }; // Defines a counter that is sampled on each profiler tick, with a running diff --git a/tools/profiler/public/ProfilerState.h b/tools/profiler/public/ProfilerState.h index 40e1517c91..aad74862b3 100644 --- a/tools/profiler/public/ProfilerState.h +++ b/tools/profiler/public/ProfilerState.h @@ -118,7 +118,10 @@ "every CPU core for every profiler sample.") \ \ MACRO(23, "bandwidth", Bandwidth, \ - "Record the network bandwidth used for every profiler sample.") + "Record the network bandwidth used for every profiler sample.") \ + MACRO( \ + 24, "memory", Memory, \ + "Track the memory allocations and deallocations per process over time.") // *** Synchronize with lists in BaseProfilerState.h and geckoProfiler.json *** struct ProfilerFeature { @@ -138,6 +141,12 @@ struct ProfilerFeature { PROFILER_FOR_EACH_FEATURE(DECLARE) #undef DECLARE + + [[nodiscard]] static constexpr bool ShouldInstallMemoryHooks( + uint32_t aFeatures) { + return ProfilerFeature::HasMemory(aFeatures) || + ProfilerFeature::HasNativeAllocations(aFeatures); + } }; // clang-format off diff --git a/tools/profiler/tests/gtest/moz.build b/tools/profiler/tests/gtest/moz.build index e1c3994621..ea5ca1f228 100644 --- a/tools/profiler/tests/gtest/moz.build +++ b/tools/profiler/tests/gtest/moz.build @@ -30,7 +30,8 @@ LOCAL_INCLUDES += [ "/tools/profiler/lul", ] -if CONFIG["OS_TARGET"] != "Android": +# Bug 1885381 - Hangs/timeouts under TSAN +if CONFIG["OS_TARGET"] != "Android" and not CONFIG["MOZ_TSAN"]: UNIFIED_SOURCES += [ "GeckoProfiler.cpp", "ThreadProfileTest.cpp", diff --git a/tools/profiler/tests/xpcshell/test_feature_posix_signals.js b/tools/profiler/tests/xpcshell/test_feature_posix_signals.js index 28fbf890e8..d4b77d6550 100644 --- a/tools/profiler/tests/xpcshell/test_feature_posix_signals.js +++ b/tools/profiler/tests/xpcshell/test_feature_posix_signals.js @@ -5,7 +5,7 @@ ChromeUtils.defineESModuleGetters(this, { Downloads: "resource://gre/modules/Downloads.sys.mjs", FileUtils: "resource://gre/modules/FileUtils.sys.mjs", - BrowserTestUtils: "resource://testing-common/BrowserTestUtils.sys.mjs", + TestUtils: "resource://testing-common/TestUtils.sys.mjs", }); const { ctypes } = ChromeUtils.importESModule( @@ -68,23 +68,6 @@ function raiseSignal(pid, sig) { return { ok: true }; } -// We would like to use the following to wait for a stop signal to actually be -// handled: -// await Services.profiler.waitOnePeriodicSampling(); -// However, as we are trying to shut down the profiler using the sampler -// thread, this can cause complications between the callback waiting for the -// sampling to be over, and the sampler thread actually finishing. -// Instead, we use the BrowserTestUtils.waitForCondition to wait until the -// profiler is no longer active. -async function waitUntilProfilerStopped(interval = 1000, maxTries = 100) { - await BrowserTestUtils.waitForCondition( - () => !Services.profiler.IsActive(), - "the profiler should be inactive", - interval, - maxTries - ); -} - async function cleanupAfterTest() { // We need to cleanup written profiles after a test // Get the system downloads directory, and use it to build a profile file @@ -112,10 +95,46 @@ async function cleanupAfterTest() { // may cause a mismatch if we test on on, say, a gnu hurd kernel, or on a // linux kernel running on sparc, but the feature will not break - only // the testing. -// const SIGUSR1 = Services.appinfo.OS === "Darwin" ? 30 : 10; +const SIGUSR1 = Services.appinfo.OS === "Darwin" ? 30 : 10; const SIGUSR2 = Services.appinfo.OS === "Darwin" ? 31 : 12; add_task(async () => { + info("Test that starting the profiler with a posix signal works."); + + Assert.ok( + !Services.profiler.IsActive(), + "The profiler should not begin the test active." + ); + + // Get the process ID + let pid = Services.appinfo.processID; + + // Set up an observer to watch for the profiler starting + let startPromise = TestUtils.topicObserved("profiler-started"); + + // Try and start the profiler using a signal. + let result = raiseSignal(pid, SIGUSR1); + Assert.ok(result, "Raising a signal should succeed"); + + // Wait for the profiler to stop + Assert.ok(await startPromise, "The profiler should start"); + + // Wait until the profiler is active + Assert.ok(Services.profiler.IsActive(), "The profiler should now be active."); + + // Let the profiler sample at least once + await Services.profiler.waitOnePeriodicSampling(); + info("Waiting a periodic sampling completed"); + + // Stop the profiler + await Services.profiler.StopProfiler(); + Assert.ok( + !Services.profiler.IsActive(), + "The profiler should now be inactive." + ); +}); + +add_task(async () => { info("Test that stopping the profiler with a posix signal works."); registerCleanupFunction(cleanupAfterTest); @@ -136,13 +155,20 @@ add_task(async () => { // Get the process ID let pid = Services.appinfo.processID; + // Set up an observer to watch for the profiler stopping + let stopPromise = TestUtils.topicObserved("profiler-stopped"); + // Try and stop the profiler using a signal. let result = raiseSignal(pid, SIGUSR2); Assert.ok(result, "Raising a SIGUSR2 signal should succeed."); - await waitUntilProfilerStopped(); + // Wait for the profiler to stop + Assert.ok(await stopPromise, "The profiler should stop"); - do_test_finished(); + Assert.ok( + !Services.profiler.IsActive(), + "The profiler should now be inactive." + ); }); add_task(async () => { @@ -174,21 +200,24 @@ add_task(async () => { await Services.profiler.StartProfiler(entries, interval, threads, features); Assert.ok(Services.profiler.IsActive(), "The profiler should now be active."); + // Set up an observer to watch for the profiler stopping + let stopPromise = TestUtils.topicObserved("profiler-stopped"); + // Try and stop the profiler using a signal. let result = raiseSignal(pid, SIGUSR2); Assert.ok(result, "Raising a SIGUSR2 signal should succeed."); - // Wait for the file to exist - await BrowserTestUtils.waitForCondition( - async () => await IOUtils.exists(profile.path), - "Waiting for a profile file to be written to disk." + // Wait for the profiler to stop + Assert.ok(await stopPromise, "The profiler should stop"); + + // Now that it's stopped, make sure that we have a profile file + Assert.ok( + await IOUtils.exists(profile.path), + "A profile file should be written to disk." ); - await waitUntilProfilerStopped(); Assert.ok( !Services.profiler.IsActive(), "The profiler should now be inactive." ); - - do_test_finished(); }); diff --git a/tools/profiler/tests/xpcshell/xpcshell.toml b/tools/profiler/tests/xpcshell/xpcshell.toml index 2cde39d09f..8e58e1ff08 100644 --- a/tools/profiler/tests/xpcshell/xpcshell.toml +++ b/tools/profiler/tests/xpcshell/xpcshell.toml @@ -49,8 +49,10 @@ skip-if = [ ["test_feature_posix_signals.js"] skip-if = [ - "ccov", - "os == 'win'", + "tsan", # We have intermittent timeout issues in TSan, see Bug 1889828 + "ccov", # The signals for the profiler conflict with the ccov signals + "os == 'win'", # Not yet supported on windows + "os == 'android'", # Not yet supported on android ] # Native stackwalking is somewhat unreliable depending on the platform. diff --git a/tools/rewriting/Generated.txt b/tools/rewriting/Generated.txt index f8aa8f24c6..c657d1d24d 100644 --- a/tools/rewriting/Generated.txt +++ b/tools/rewriting/Generated.txt @@ -23,8 +23,6 @@ dom/tests/ajax/mochikit/ intl/components/src/UnicodeScriptCodes.h intl/unicharutil/util/nsSpecialCasingData.cpp intl/unicharutil/util/nsUnicodePropertyData.cpp -mobile/locales/l10n-changesets.json -mobile/locales/l10n-onchange-changesets.json mobile/android/**/.build-cache mobile/android/**/.gradle mobile/android/**/build @@ -32,6 +30,50 @@ mobile/android/**/bin mobile/android/**/generated mobile/android/**\/local.properties mobile/android/**\/manifest.json +mobile/android/android-components/components/feature/search/src/main/assets/search/search_telemetry_v2.json +mobile/android/android-components/components/browser/engine-system/src/main/res/ +mobile/android/android-components/components/browser/errorpages/src/main/res/ +mobile/android/android-components/components/browser/menu/src/main/res/ +mobile/android/android-components/components/browser/menu2/src/main/res/ +mobile/android/android-components/components/browser/toolbar/src/main/res/ +mobile/android/android-components/components/browser/toolbar2/src/main/res/ +mobile/android/android-components/components/compose/awesomebar/src/main/res/ +mobile/android/android-components/components/compose/browser-toolbar/src/main/res/ +mobile/android/android-components/components/compose/cfr/src/main/res/ +mobile/android/android-components/components/compose/tabstray/src/main/res/ +mobile/android/android-components/components/feature/addons/src/main/res/ +mobile/android/android-components/components/feature/app-links/src/main/res/ +mobile/android/android-components/components/feature/autofill/src/main/res/ +mobile/android/android-components/components/feature/awesomebar/src/main/res/ +mobile/android/android-components/components/feature/contextmenu/src/main/res/ +mobile/android/android-components/components/feature/customtabs/src/main/res/ +mobile/android/android-components/components/feature/downloads/src/main/res/ +mobile/android/android-components/components/feature/findinpage/src/main/res/ +mobile/android/android-components/components/feature/fxsuggest/src/main/res/ +mobile/android/android-components/components/feature/media/src/main/res/ +mobile/android/android-components/components/feature/privatemode/src/main/res/ +mobile/android/android-components/components/feature/prompts/src/main/res/ +mobile/android/android-components/components/feature/pwa/src/main/res/ +mobile/android/android-components/components/feature/qr/src/main/res/ +mobile/android/android-components/components/feature/readerview/src/main/res/ +mobile/android/android-components/components/feature/search/src/main/res/ +mobile/android/android-components/components/feature/sitepermissions/ +mobile/android/android-components/components/feature/tabs/src/main/res/ +mobile/android/android-components/components/feature/webnotifications/src/main/res/ +mobile/android/android-components/components/lib/crash/src/main/res/ +mobile/android/android-components/components/service/nimbus/src/main/res/ +mobile/android/android-components/components/support/base/src/main/res/ +mobile/android/android-components/components/support/ktx/src/main/res/ +mobile/android/android-components/components/support/utils/src/main/res/ +mobile/android/android-components/components/ui/tabcounter/src/main/res/ +mobile/android/android-components/components/ui/widgets/src/main/res/ +mobile/android/android-components/samples/glean/src/main/res/raw/initial_experiments.json +mobile/android/fenix/app/src/debug/res/raw/initial_experiments.json +mobile/android/fenix/app/src/main/res/ +mobile/android/fenix/app/src/main/res/raw/initial_experiments.json +mobile/android/focus-android/app/src/main/res/ +mobile/locales/l10n-changesets.json +mobile/locales/l10n-onchange-changesets.json node_modules/ python/mozperftest/mozperftest/tests/data/ security/manager/tools/KnownRootHashes.json diff --git a/tools/rewriting/ThirdPartyPaths.txt b/tools/rewriting/ThirdPartyPaths.txt index 2f07ead2ea..8a0a3b9daa 100644 --- a/tools/rewriting/ThirdPartyPaths.txt +++ b/tools/rewriting/ThirdPartyPaths.txt @@ -36,6 +36,7 @@ dom/media/platforms/ffmpeg/ffmpeg57/ dom/media/platforms/ffmpeg/ffmpeg58/ dom/media/platforms/ffmpeg/ffmpeg59/ dom/media/platforms/ffmpeg/ffmpeg60/ +dom/media/platforms/ffmpeg/ffmpeg61/ dom/media/platforms/ffmpeg/libav53/ dom/media/platforms/ffmpeg/libav54/ dom/media/platforms/ffmpeg/libav55/ @@ -134,6 +135,9 @@ media/openmax_il/ media/webrtc/signaling/gtest/MockCall.h mfbt/double-conversion/double-conversion/ mfbt/lz4/.* +mobile/android/android-components/components/feature/readerview/src/main/assets/extensions/readerview/readability/JSDOMParser-0.4.2.js +mobile/android/android-components/components/feature/readerview/src/main/assets/extensions/readerview/readability/readability-0.4.2.js +mobile/android/android-components/components/feature/readerview/src/main/assets/extensions/readerview/readability/readability-readerable-0.4.2.js mobile/android/exoplayer2/ modules/brotli/ modules/fdlibm/ @@ -180,6 +184,7 @@ testing/xpcshell/node-ws/ third_party/ toolkit/components/certviewer/content/vendor/ toolkit/components/jsoncpp/ +toolkit/components/ml/vendor/ toolkit/components/normandy/vendor/ toolkit/components/passwordmgr/PasswordRulesParser.sys.mjs toolkit/components/protobuf/ diff --git a/tools/signing/macos/mach_commands.py b/tools/signing/macos/mach_commands.py index 543faca2ea..a513ad7238 100644 --- a/tools/signing/macos/mach_commands.py +++ b/tools/signing/macos/mach_commands.py @@ -306,7 +306,7 @@ def macos_sign( # and the channel argument (nightly, devedition, or release) we'll # use different entitlements. sourcedir = command_context.topsrcdir - buildconfigpath = sourcedir + "/taskcluster/ci/config.yml" + buildconfigpath = sourcedir + "/taskcluster/config.yml" command_context.log( logging.INFO, diff --git a/tools/tryselect/selectors/perf.py b/tools/tryselect/selectors/perf.py index e8a6e6f9cc..96416829f7 100644 --- a/tools/tryselect/selectors/perf.py +++ b/tools/tryselect/selectors/perf.py @@ -198,7 +198,7 @@ class PerfParser(CompareParser): "tests. If the Activity, Binary Path, or Intents required " "change at all relative to the existing GeckoView, and Fenix " "tasks, then you will need to make fixes in the associated " - "taskcluster files (e.g. taskcluster/ci/test/browsertime-mobile.yml). " + "taskcluster files (e.g. taskcluster/kinds/test/browsertime-mobile.yml). " "Alternatively, set MOZ_FIREFOX_ANDROID_APK_OUTPUT to a path to " "an APK, and then run the command with --browsertime-upload-apk " "firefox-android. This option will only copy the APK for browsertime, see " diff --git a/tools/tryselect/selectors/release.py b/tools/tryselect/selectors/release.py index fae85469ba..5ec88a989c 100644 --- a/tools/tryselect/selectors/release.py +++ b/tools/tryselect/selectors/release.py @@ -126,7 +126,7 @@ def run( } ) - with open(os.path.join(vcs.path, "taskcluster/ci/config.yml")) as f: + with open(os.path.join(vcs.path, "taskcluster/config.yml")) as f: migration_configs = yaml.safe_load(f) for migration in migrations: migration_config = migration_configs["merge-automation"]["behaviors"][migration] diff --git a/tools/tryselect/task_config.py b/tools/tryselect/task_config.py index 58e8beeda4..0bf9731eee 100644 --- a/tools/tryselect/task_config.py +++ b/tools/tryselect/task_config.py @@ -610,7 +610,7 @@ class WorkerOverrides(TryConfig): if worker_suffixes: root = build.topsrcdir - root = os.path.join(root, "taskcluster", "ci") + root = os.path.join(root, "taskcluster") graph_config = load_graph_config(root) for worker_suffix in worker_suffixes: alias, suffix = worker_suffix.split("=", 1) diff --git a/tools/tryselect/tasks.py b/tools/tryselect/tasks.py index 701d1c1ade..46abd3546b 100644 --- a/tools/tryselect/tasks.py +++ b/tools/tryselect/tasks.py @@ -78,7 +78,7 @@ def generate_tasks(params=None, full=False, disable_target_task_filter=False): "target_tasks_method": target_tasks_method, }, ) - root = os.path.join(build.topsrcdir, "taskcluster", "ci") + root = os.path.join(build.topsrcdir, "taskcluster") taskgraph.fast = True generator = TaskGraphGenerator(root_dir=root, parameters=params) diff --git a/tools/ts/fixtures/intrinsics.d.ts b/tools/ts/fixtures/intrinsics.d.ts index 7a0b45ee52..125e401eae 100644 --- a/tools/ts/fixtures/intrinsics.d.ts +++ b/tools/ts/fixtures/intrinsics.d.ts @@ -1,30 +1,49 @@ /** - * Gecko XPCOM builtins and utility types. + * Gecko XPCOM builtins. */ +declare global { + /** + * Generic IDs are created by most code which passes a nsID to js. + * https://searchfox.org/mozilla-central/source/js/xpconnect/src/XPCJSID.cpp#24 + */ + interface nsID<uuid = string> { + readonly number: uuid; + } -/** - * Generic IDs are created by most code which passes a nsID to js. - * https://searchfox.org/mozilla-central/source/js/xpconnect/src/XPCJSID.cpp#24 - */ -interface nsID<uuid = string> { - readonly number: uuid; + /** + * In addition to nsID, interface IIDs support instanceof type guards, + * and expose constants defined on the class, including variants from enums. + * https://searchfox.org/mozilla-central/source/js/xpconnect/src/XPCJSID.cpp#45 + */ + type nsJSIID<iface, enums = {}> = nsID & Constants<iface> & enums & { + new (_: never): void; + prototype: iface; + } + + /** A union type of all known interface IIDs. */ + type nsIID = nsIXPCComponents_Interfaces[keyof nsIXPCComponents_Interfaces]; + + /** A generic to resolve QueryInterface return type from a nsIID. */ + export type nsQIResult<iid> = iid extends { prototype: infer U } ? U : never; + + /** u32 */ + type nsresult = u32; + + // Numeric typedefs, useful as a quick reference in method signatures. + type double = number; + type float = number; + type i16 = number; + type i32 = number; + type i64 = number; + type u16 = number; + type u32 = number; + type u64 = number; + type u8 = number; } /** - * In addition to nsID, interface IIDs support instanceof type guards, - * and expose constants defined on the class, including variants from enums. - * https://searchfox.org/mozilla-central/source/js/xpconnect/src/XPCJSID.cpp#44 + * XPCOM utility types. */ -type nsJSIID<iface, enums = {}> = nsID & Constants<iface> & enums & { - new (_: never): void; - prototype: iface; -} - -/** A union of all known IIDs. */ -type nsIID = nsIXPCComponents_Interfaces[keyof nsIXPCComponents_Interfaces]; - -/** A generic to resolve QueryInterface return type from a nsID (or nsIID). */ -export type nsQIResult<iid> = iid extends { prototype: infer U } ? U : never; /** XPCOM inout param is passed in as a js object with a value property. */ type InOutParam<T> = { value: T }; @@ -32,7 +51,7 @@ type InOutParam<T> = { value: T }; /** XPCOM out param is written to the passed in object's value property. */ type OutParam<T> = { value?: T }; -/** A named type for interfaces to inherit from enums. */ +/** A named type to enable interfaces to inherit from enums. */ type Enums<enums> = enums; /** Callable accepts either form of a [function] interface. */ @@ -44,42 +63,4 @@ type Constants<T> = { [K in keyof T as IfConst<K, T[K]>]: T[K] }; /** Resolves only for keys K whose corresponding type T is a narrow number. */ type IfConst<K, T> = T extends number ? (number extends T ? never : K) : never; -declare global { - // Until we have [ChromeOnly] webidl. - interface BrowsingContext {} - interface ContentFrameMessageManager {} - interface DOMRequest {} - interface FrameLoader {} - interface JSProcessActorChild {} - interface JSProcessActorParent {} - interface TreeColumn {} - interface WebExtensionContentScript {} - interface WebExtensionPolicy {} - interface WindowGlobalParent {} - interface WindowContext {} - interface XULTreeElement {} -} - -// Non-scriptable interfaces referenced from scriptable ones. -interface nsIAsyncVerifyRedirectReadyCallback {} -interface nsICRLiteTimestamp {} -interface nsIInputAvailableCallback {} -interface nsIScriptElement {} -interface nsIThreadObserver {} -interface nsIUDPSocketSyncListener {} -interface nsIWebAuthnRegisterArgs {} -interface nsIWebAuthnRegisterPromise {} -interface nsIWebAuthnSignArgs {} -interface nsIWebAuthnSignPromise {} -interface nsIXPCScriptable {} - -// Typedefs useful as a quick reference in method signatures. -type double = number; -type float = number; -type i16 = number; -type i32 = number; -type i64 = number; -type u16 = number; -type u32 = number; -type u64 = number; -type u8 = number; +export {}; diff --git a/tools/ts/fixtures/xpctest.d.ts b/tools/ts/fixtures/xpctest.d.ts index 6b2863a656..cf705832b6 100644 --- a/tools/ts/fixtures/xpctest.d.ts +++ b/tools/ts/fixtures/xpctest.d.ts @@ -160,7 +160,7 @@ interface nsIXPCTestUtils extends nsISupports { doubleWrapFunction(f: nsIXPCTestFunctionInterface): nsIXPCTestFunctionInterface; } -interface nsIXPCTestNoScriptMembers extends nsISupports { +interface nsIXPCTestTypeScript extends nsISupports { exposedProp: i32; exposedMethod(arg: i32): void; } @@ -178,43 +178,60 @@ interface nsIXPCComponents_Interfaces { nsIXPCTestReturnCodeChild: nsJSIID<nsIXPCTestReturnCodeChild>; nsIXPCTestFunctionInterface: nsJSIID<nsIXPCTestFunctionInterface>; nsIXPCTestUtils: nsJSIID<nsIXPCTestUtils>; - nsIXPCTestNoScriptMembers: nsJSIID<nsIXPCTestNoScriptMembers>; + nsIXPCTestTypeScript: nsJSIID<nsIXPCTestTypeScript>; } } // global // Typedefs from xpidl. type PRTime = i64; -type char16_t = u16; -type nsresult = u32; /** - * Gecko XPCOM builtins and utility types. + * Gecko XPCOM builtins. */ - -/** - * Generic IDs are created by most code which passes a nsID to js. - * https://searchfox.org/mozilla-central/source/js/xpconnect/src/XPCJSID.cpp#24 - */ -interface nsID<uuid = string> { - readonly number: uuid; +declare global { + /** + * Generic IDs are created by most code which passes a nsID to js. + * https://searchfox.org/mozilla-central/source/js/xpconnect/src/XPCJSID.cpp#24 + */ + interface nsID<uuid = string> { + readonly number: uuid; + } + + /** + * In addition to nsID, interface IIDs support instanceof type guards, + * and expose constants defined on the class, including variants from enums. + * https://searchfox.org/mozilla-central/source/js/xpconnect/src/XPCJSID.cpp#45 + */ + type nsJSIID<iface, enums = {}> = nsID & Constants<iface> & enums & { + new (_: never): void; + prototype: iface; + } + + /** A union type of all known interface IIDs. */ + type nsIID = nsIXPCComponents_Interfaces[keyof nsIXPCComponents_Interfaces]; + + /** A generic to resolve QueryInterface return type from a nsIID. */ + export type nsQIResult<iid> = iid extends { prototype: infer U } ? U : never; + + /** u32 */ + type nsresult = u32; + + // Numeric typedefs, useful as a quick reference in method signatures. + type double = number; + type float = number; + type i16 = number; + type i32 = number; + type i64 = number; + type u16 = number; + type u32 = number; + type u64 = number; + type u8 = number; } /** - * In addition to nsID, interface IIDs support instanceof type guards, - * and expose constants defined on the class, including variants from enums. - * https://searchfox.org/mozilla-central/source/js/xpconnect/src/XPCJSID.cpp#44 + * XPCOM utility types. */ -type nsJSIID<iface, enums = {}> = nsID & Constants<iface> & enums & { - new (_: never): void; - prototype: iface; -} - -/** A union of all known IIDs. */ -type nsIID = nsIXPCComponents_Interfaces[keyof nsIXPCComponents_Interfaces]; - -/** A generic to resolve QueryInterface return type from a nsID (or nsIID). */ -export type nsQIResult<iid> = iid extends { prototype: infer U } ? U : never; /** XPCOM inout param is passed in as a js object with a value property. */ type InOutParam<T> = { value: T }; @@ -222,7 +239,7 @@ type InOutParam<T> = { value: T }; /** XPCOM out param is written to the passed in object's value property. */ type OutParam<T> = { value?: T }; -/** A named type for interfaces to inherit from enums. */ +/** A named type to enable interfaces to inherit from enums. */ type Enums<enums> = enums; /** Callable accepts either form of a [function] interface. */ @@ -234,42 +251,4 @@ type Constants<T> = { [K in keyof T as IfConst<K, T[K]>]: T[K] }; /** Resolves only for keys K whose corresponding type T is a narrow number. */ type IfConst<K, T> = T extends number ? (number extends T ? never : K) : never; -declare global { - // Until we have [ChromeOnly] webidl. - interface BrowsingContext {} - interface ContentFrameMessageManager {} - interface DOMRequest {} - interface FrameLoader {} - interface JSProcessActorChild {} - interface JSProcessActorParent {} - interface TreeColumn {} - interface WebExtensionContentScript {} - interface WebExtensionPolicy {} - interface WindowGlobalParent {} - interface WindowContext {} - interface XULTreeElement {} -} - -// Non-scriptable interfaces referenced from scriptable ones. -interface nsIAsyncVerifyRedirectReadyCallback {} -interface nsICRLiteTimestamp {} -interface nsIInputAvailableCallback {} -interface nsIScriptElement {} -interface nsIThreadObserver {} -interface nsIUDPSocketSyncListener {} -interface nsIWebAuthnRegisterArgs {} -interface nsIWebAuthnRegisterPromise {} -interface nsIWebAuthnSignArgs {} -interface nsIWebAuthnSignPromise {} -interface nsIXPCScriptable {} - -// Typedefs useful as a quick reference in method signatures. -type double = number; -type float = number; -type i16 = number; -type i32 = number; -type i64 = number; -type u16 = number; -type u32 = number; -type u64 = number; -type u8 = number; +export {}; |