diff --git a/package.json b/package.json index 9a1dbcaa9..5ed94fcde 100644 --- a/package.json +++ b/package.json @@ -15,11 +15,6 @@ "lint": "eslint \"**/*.{js,ts,tsx}\"", "release": "yarn workspaces run release" }, - "jest": { - "projects": [ - "/packages/*" - ] - }, "devDependencies": { "@changesets/cli": "^2.16.0", "@commitlint/config-conventional": "^16.2.4", diff --git a/packages/core/src/__tests__/__helpers__/mockSegmentStore.ts b/packages/core/src/__tests__/__helpers__/mockSegmentStore.ts index 79049ee11..d414ebcbc 100644 --- a/packages/core/src/__tests__/__helpers__/mockSegmentStore.ts +++ b/packages/core/src/__tests__/__helpers__/mockSegmentStore.ts @@ -9,7 +9,9 @@ import type { import type { Context, DeepPartial, + DestinationFilters, IntegrationSettings, + RoutingRule, SegmentAPIIntegrations, UserInfoState, } from '../../types'; @@ -20,6 +22,7 @@ export type StoreData = { isReady: boolean; context?: DeepPartial; settings: SegmentAPIIntegrations; + filters: DestinationFilters; userInfo: UserInfoState; deepLinkData: DeepLinkData; }; @@ -30,6 +33,7 @@ const INITIAL_VALUES: StoreData = { settings: { [SEGMENT_DESTINATION_KEY]: {}, }, + filters: {}, userInfo: { anonymousId: 'anonymousId', userId: undefined, @@ -67,6 +71,7 @@ export class MockSegmentStore implements Storage { private callbacks = { context: createCallbackManager | undefined>(), settings: createCallbackManager(), + filters: createCallbackManager(), userInfo: createCallbackManager(), deepLinkData: createCallbackManager(), }; @@ -100,9 +105,8 @@ export class MockSegmentStore implements Storage { Settable & Dictionary = { get: createMockStoreGetter(() => this.data.settings), - onChange: ( - callback: (value?: SegmentAPIIntegrations | undefined) => void - ) => this.callbacks.settings.register(callback), + onChange: (callback: (value?: SegmentAPIIntegrations) => void) => + this.callbacks.settings.register(callback), set: (value) => { this.data.settings = value instanceof Function @@ -117,6 +121,26 @@ export class MockSegmentStore implements Storage { }, }; + readonly filters: Watchable & + Settable & + Dictionary = { + get: createMockStoreGetter(() => this.data.filters), + onChange: (callback: (value?: DestinationFilters) => void) => + this.callbacks.filters.register(callback), + set: (value) => { + this.data.filters = + value instanceof Function + ? value(this.data.filters ?? {}) + : { ...value }; + this.callbacks.filters.run(this.data.filters); + return this.data.filters; + }, + add: (key: string, value: RoutingRule) => { + this.data.filters[key] = value; + this.callbacks.filters.run(this.data.filters); + }, + }; + readonly userInfo: Watchable & Settable = { get: createMockStoreGetter(() => this.data.userInfo), onChange: (callback: (value: UserInfoState) => void) => diff --git a/packages/core/src/analytics.ts b/packages/core/src/analytics.ts index a9df76477..da7ee7138 100644 --- a/packages/core/src/analytics.ts +++ b/packages/core/src/analytics.ts @@ -3,7 +3,7 @@ import { Unsubscribe } from '@segment/sovran-react-native'; import deepmerge from 'deepmerge'; import allSettled from 'promise.allsettled'; import { AppState, AppStateStatus } from 'react-native'; -import { settingsCDN } from './constants'; +import { settingsCDN, workspaceDestinationFilterKey } from './constants'; import { getContext } from './context'; import { applyRawEventData, @@ -42,8 +42,11 @@ import { } from './types'; import { getPluginsWithFlush, getPluginsWithReset } from './util'; import { getUUID } from './uuid'; +import type { SegmentAPISettings, DestinationFilters } from './types'; +import type { Rule } from '@segment/tsub/dist/store'; type OnContextLoadCallback = (type: UpdateType) => void | Promise; +type OnPluginAddedCallback = (plugin: Plugin) => void; export class SegmentClient { // the config parameters for the client - a merge of user provided and default options @@ -82,7 +85,8 @@ export class SegmentClient { private isContextLoaded = false; - private onContextLoadedCallback: OnContextLoadCallback | undefined; + private onContextLoadedObservers: OnContextLoadCallback[] = []; + private onPluginAddedObservers: OnPluginAddedCallback[] = []; private readonly platformPlugins: PlatformPlugin[] = [ new InjectUserInfo(), @@ -106,6 +110,11 @@ export class SegmentClient { */ readonly settings: Watchable; + /** + * Access or subscribe to destination filter settings + */ + readonly filters: Watchable; + /** * Access or subscribe to user info (anonymousId, userId, traits) */ @@ -181,6 +190,11 @@ export class SegmentClient { onChange: this.store.settings.onChange, }; + this.filters = { + get: this.store.filters.get, + onChange: this.store.filters.onChange, + }; + this.userInfo = { get: this.store.userInfo.get, set: this.store.userInfo.set, @@ -238,15 +252,32 @@ export class SegmentClient { this.isInitialized = true; } + private generateFiltersMap(rules: Rule[]): DestinationFilters { + const map: DestinationFilters = {}; + + for (const r of rules) { + const key = r.destinationName ?? workspaceDestinationFilterKey; + map[key] = r; + } + + return map; + } + async fetchSettings() { const settingsEndpoint = `${settingsCDN}/${this.config.writeKey}/settings`; try { const res = await fetch(settingsEndpoint); - const resJson = await res.json(); + const resJson: SegmentAPISettings = await res.json(); const integrations = resJson.integrations; + const filters = this.generateFiltersMap( + resJson.middlewareSettings?.routingRules ?? [] + ); this.logger.info(`Received settings from Segment succesfully.`); - await this.store.settings.set(integrations); + await Promise.all([ + this.store.settings.set(integrations), + this.store.filters.set(filters), + ]); } catch { this.logger.warn( `Could not receive settings from Segment. ${ @@ -366,6 +397,7 @@ export class SegmentClient { private addPlugin(plugin: Plugin) { plugin.configure(this); this.timeline.add(plugin); + this.triggerOnPluginLoaded(plugin); } /** @@ -537,8 +569,8 @@ export class SegmentClient { await this.store.context.set(deepmerge(previousContext ?? {}, context)); // Only callback during the intial context load - if (this.onContextLoadedCallback !== undefined && !this.isContextLoaded) { - this.onContextLoadedCallback(UpdateType.initial); + if (!this.isContextLoaded) { + this.triggerOnContextLoad(UpdateType.initial); } this.isContextLoaded = true; @@ -651,9 +683,25 @@ export class SegmentClient { * @param callback Function to call when context is ready. */ onContextLoaded(callback: OnContextLoadCallback) { - this.onContextLoadedCallback = callback; + this.onContextLoadedObservers.push(callback); if (this.isContextLoaded) { - this.onContextLoadedCallback(UpdateType.initial); + this.triggerOnContextLoad(UpdateType.initial); } } + + private triggerOnContextLoad(type: UpdateType) { + this.onContextLoadedObservers.map((f) => f?.(type)); + } + + /** + * Registers a callback for each plugin that gets added to the analytics client. + * @param callback Function to call + */ + onPluginLoaded(callback: OnPluginAddedCallback) { + this.onPluginAddedObservers.push(callback); + } + + private triggerOnPluginLoaded(plugin: Plugin) { + this.onPluginAddedObservers.map((f) => f?.(plugin)); + } } diff --git a/packages/core/src/constants.ts b/packages/core/src/constants.ts index b1535abd2..e0ea128fa 100644 --- a/packages/core/src/constants.ts +++ b/packages/core/src/constants.ts @@ -14,3 +14,5 @@ export const defaultConfig: Config = { trackAppLifecycleEvents: false, autoAddSegmentDestination: true, }; + +export const workspaceDestinationFilterKey = ''; diff --git a/packages/core/src/storage/sovranStorage.ts b/packages/core/src/storage/sovranStorage.ts index c4694757f..8e123e95c 100644 --- a/packages/core/src/storage/sovranStorage.ts +++ b/packages/core/src/storage/sovranStorage.ts @@ -12,6 +12,8 @@ import type { DeepPartial, Context, UserInfoState, + RoutingRule, + DestinationFilters, } from '..'; import { getUUID } from '../uuid'; import { createGetter } from './helpers'; @@ -26,20 +28,20 @@ import type { } from './types'; type Data = { - isReady: boolean; events: SegmentEvent[]; eventsToRetry: SegmentEvent[]; context: DeepPartial; settings: SegmentAPIIntegrations; userInfo: UserInfoState; + filters: DestinationFilters; }; const INITIAL_VALUES: Data = { - isReady: true, events: [], eventsToRetry: [], context: {}, settings: {}, + filters: {}, userInfo: { anonymousId: getUUID(), userId: undefined, @@ -52,6 +54,7 @@ interface ReadinessStore { hasRestoredContext: boolean; hasRestoredSettings: boolean; hasRestoredUserInfo: boolean; + hasRestoredFilters: boolean; } const isEverythingReady = (state: ReadinessStore) => @@ -89,7 +92,7 @@ registerBridgeStore({ }); function createStoreGetter< - U, + U extends {}, Z extends keyof U | undefined = undefined, V = undefined >(store: Store, key?: Z): getStateFunc { @@ -120,6 +123,7 @@ export class SovranStorage implements Storage { private settingsStore: Store<{ settings: SegmentAPIIntegrations }>; private userInfoStore: Store<{ userInfo: UserInfoState }>; private deepLinkStore: Store = deepLinkStore; + private filtersStore: Store; readonly isReady: Watchable; @@ -130,6 +134,10 @@ export class SovranStorage implements Storage { Settable & Dictionary; + readonly filters: Watchable & + Settable & + Dictionary; + readonly userInfo: Watchable & Settable; readonly deepLinkData: Watchable; @@ -142,6 +150,7 @@ export class SovranStorage implements Storage { hasRestoredContext: false, hasRestoredSettings: false, hasRestoredUserInfo: false, + hasRestoredFilters: false, }); const markAsReadyGenerator = (key: keyof ReadinessStore) => () => { @@ -240,6 +249,40 @@ export class SovranStorage implements Storage { }, }; + // Filters + + this.filtersStore = createStore(INITIAL_VALUES.filters, { + persist: { + storeId: `${this.storeId}-filters`, + persistor: this.storePersistor, + onInitialized: markAsReadyGenerator('hasRestoredFilters'), + }, + }); + + this.filters = { + get: createStoreGetter(this.filtersStore), + onChange: (callback: (value?: DestinationFilters | undefined) => void) => + this.filtersStore.subscribe((store) => callback(store)), + set: async (value) => { + const filters = await this.filtersStore.dispatch((state) => { + let newState: typeof state; + if (value instanceof Function) { + newState = value(state); + } else { + newState = { ...state, ...value }; + } + return newState; + }); + return filters; + }, + add: (key, value) => { + this.filtersStore.dispatch((state) => ({ + ...state, + [key]: value, + })); + }, + }; + // User Info Store this.userInfoStore = createStore( diff --git a/packages/core/src/storage/types.ts b/packages/core/src/storage/types.ts index d92fcc289..414cc9b2e 100644 --- a/packages/core/src/storage/types.ts +++ b/packages/core/src/storage/types.ts @@ -2,7 +2,9 @@ import type { Unsubscribe, Persistor } from '@segment/sovran-react-native'; import type { Context, DeepPartial, + DestinationFilters, IntegrationSettings, + RoutingRule, SegmentAPIIntegrations, UserInfoState, } from '../types'; @@ -62,6 +64,10 @@ export interface Storage { Settable & Dictionary; + readonly filters: Watchable & + Settable & + Dictionary; + readonly userInfo: Watchable & Settable; readonly deepLinkData: Watchable; diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 3528e758f..c98088681 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -1,4 +1,5 @@ import type { Persistor } from '@segment/sovran-react-native'; +import type { Rule } from '@segment/tsub/dist/store'; export type JsonValue = | boolean @@ -270,8 +271,25 @@ export type SegmentAPIIntegrations = { [key: string]: IntegrationSettings; }; +export type RoutingRule = Rule; + +export interface MetricsOptions { + host?: string; + sampleRate?: number; + flushTimer?: number; + maxQueueSize?: number; +} + +export interface DestinationFilters { + [key: string]: RoutingRule; +} + export type SegmentAPISettings = { integrations: SegmentAPIIntegrations; + middlewareSettings?: { + routingRules: RoutingRule[]; + }; + metrics?: MetricsOptions; }; export type DestinationMetadata = { diff --git a/packages/plugins/plugin-destination-filters/LICENSE b/packages/plugins/plugin-destination-filters/LICENSE new file mode 100644 index 000000000..bea1c8db8 --- /dev/null +++ b/packages/plugins/plugin-destination-filters/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Segment + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/plugins/plugin-destination-filters/README.md b/packages/plugins/plugin-destination-filters/README.md new file mode 100644 index 000000000..32bc1f805 --- /dev/null +++ b/packages/plugins/plugin-destination-filters/README.md @@ -0,0 +1,71 @@ +# @segment/analytics-react-native-plugin-destination-filters + +Plugin for adding support for [Destination Filters](https://segment.com/docs/connections/destinations/destination-filters/) to your React Native application. + +## Installation + +You will need to install the `@segment/analytics-react-native-plugin-destination-filters` package as a dependency in your project: + +Using NPM: +```bash +npm install --save @segment/analytics-react-native-plugin-destination-filters +``` + +Using Yarn: +```bash +yarn add @segment/analytics-react-native-plugin-destination-filters +``` + +## Usage + +Follow the [instructions for adding plugins](https://github.com/segmentio/analytics-react-native#adding-plugins) on the main Analytics client: + +After you create your segment client add `DestinationFiltersPlugin` as a plugin, order doesn't matter, this plugin will filter all the other device mode destinations you add before and after this plugin is added: + +```ts +import { createClient } from '@segment/analytics-react-native'; + +import { DestinationFiltersPlugin } from '@segment/analytics-react-native-plugin-destination-filters'; + +const segmentClient = createClient({ + writeKey: 'SEGMENT_KEY' +}); + +segmentClient.add({ plugin: new DestinationFiltersPlugin() }); +segment.add({ plugin: new FirebasePlugin() }) +``` + + +## Support + +Please use Github issues, Pull Requests, or feel free to reach out to our [support team](https://segment.com/help/). + +## Integrating with Segment + +Interested in integrating your service with us? Check out our [Partners page](https://segment.com/partners/) for more details. + +## License +``` +MIT License + +Copyright (c) 2021 Segment + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + diff --git a/packages/plugins/plugin-destination-filters/babel.config.js b/packages/plugins/plugin-destination-filters/babel.config.js new file mode 100644 index 000000000..f842b77fc --- /dev/null +++ b/packages/plugins/plugin-destination-filters/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: ['module:metro-react-native-babel-preset'], +}; diff --git a/packages/plugins/plugin-destination-filters/jest.config.js b/packages/plugins/plugin-destination-filters/jest.config.js new file mode 100644 index 000000000..9ff095a85 --- /dev/null +++ b/packages/plugins/plugin-destination-filters/jest.config.js @@ -0,0 +1,16 @@ +const { pathsToModuleNameMapper } = require('ts-jest'); +const { compilerOptions } = require('./tsconfig'); + +module.exports = { + preset: 'react-native', + roots: [''], + setupFiles: ['../../core/src/__tests__/__helpers__/setup.js'], + testPathIgnorePatterns: ['.../../core/src/__tests__/__helpers__/'], + modulePathIgnorePatterns: ['/lib/'], + transform: { + '^.+\\.tsx?$': 'ts-jest', + }, + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], + modulePaths: [compilerOptions.baseUrl], + moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths), +}; diff --git a/packages/plugins/plugin-destination-filters/package.json b/packages/plugins/plugin-destination-filters/package.json new file mode 100644 index 000000000..db00c833e --- /dev/null +++ b/packages/plugins/plugin-destination-filters/package.json @@ -0,0 +1,89 @@ +{ + "name": "@segment/analytics-react-native-plugin-destination-filters", + "version": "0.1.0", + "description": "The hassle-free way to add Segment analytics to your React-Native app.", + "main": "lib/commonjs/index", + "module": "lib/module/index", + "types": "lib/typescript/src/index.d.ts", + "react-native": "src/index", + "source": "src/index", + "files": [ + "src", + "lib", + "android", + "ios", + "cpp", + "segment-analytics-react-native-plugin-destination-filters.podspec", + "package.json", + "!android/build", + "!ios/build", + "!**/__tests__", + "!**/__fixtures__", + "!**/__mocks__" + ], + "scripts": { + "build": "bob build", + "test": "jest", + "typescript": "tsc --noEmit", + "clean": "rimraf lib node_modules", + "release": "semantic-release" + }, + "keywords": [ + "segment", + "react-native", + "ios", + "android" + ], + "repository": { + "type": "git", + "url": "https://github.com/segmentio/analytics-react-native.git", + "directory": "packages/plugins/plugin-destination-filters" + }, + "author": "Segment (https://segment.com/)", + "license": "MIT", + "bugs": { + "url": "https://github.com/segmentio/analytics-react-native/issues" + }, + "homepage": "https://github.com/segmentio/analytics-react-native#readme", + "publishConfig": { + "registry": "https://registry.npmjs.org/" + }, + "peerDependencies": { + "@segment/analytics-react-native": "*", + "@segment/sovran-react-native": "*" + }, + "dependencies": { + "@segment/tsub": "^0", + "clone": "^2.1.2" + }, + "devDependencies": { + "@semantic-release/changelog": "^6.0.1", + "@semantic-release/commit-analyzer": "^9.0.2", + "@semantic-release/git": "^10.0.1", + "@semantic-release/github": "^8.0.4", + "@semantic-release/npm": "^9.0.1", + "@semantic-release/release-notes-generator": "^10.0.3", + "@types/clone": "^2.1.1", + "@types/jest": "^27.0.3", + "conventional-changelog-conventionalcommits": "^5.0.0", + "rimraf": "^3.0.2", + "semantic-release": "^19.0.3", + "semantic-release-monorepo": "^7.0.5", + "ts-jest": "^27.0.7", + "typescript": "^4.4.4" + }, + "jest": { + "setupFiles": [ + "/src/methods/__tests__/jest_setup.ts" + ] + }, + "react-native-builder-bob": { + "source": "src", + "output": "lib", + "targets": [ + "commonjs", + "module", + "typescript" + ] + } +} diff --git a/packages/plugins/plugin-destination-filters/release.config.js b/packages/plugins/plugin-destination-filters/release.config.js new file mode 100644 index 000000000..57ec0e5b0 --- /dev/null +++ b/packages/plugins/plugin-destination-filters/release.config.js @@ -0,0 +1,3 @@ +module.exports = { + extends: ['../../../release.config.js', 'semantic-release-monorepo'], +}; diff --git a/packages/plugins/plugin-destination-filters/src/DestinationFilters.ts b/packages/plugins/plugin-destination-filters/src/DestinationFilters.ts new file mode 100644 index 000000000..3ec73b06c --- /dev/null +++ b/packages/plugins/plugin-destination-filters/src/DestinationFilters.ts @@ -0,0 +1,82 @@ +import { + DestinationPlugin, + Plugin, + PluginType, + RoutingRule, + SegmentClient, + SegmentEvent, + UtilityPlugin, +} from '@segment/analytics-react-native'; +import type { Unsubscribe } from '@segment/sovran-react-native'; +import * as tsub from '@segment/tsub'; +import clone from 'clone'; + +const WORKSPACE_DESTINATION_FILTER_KEY = ''; + +/** + * Adds processing for Destination Filters + * (https://segment.com/docs/connections/destinations/destination-filters/) + * to work on device mode destinations + */ +export class DestinationFiltersPlugin extends UtilityPlugin { + type = PluginType.before; + + private key?: string; + private filtersUnsubscribe?: Unsubscribe; + private filter?: RoutingRule; + constructor(destination?: string) { + super(); + this.key = destination; + } + + private addToPlugin(plugin: Plugin) { + if (plugin.type === PluginType.destination) { + const destination: DestinationPlugin = plugin as DestinationPlugin; + destination.add(new DestinationFiltersPlugin(destination.key)); + } + } + + override configure(analytics: SegmentClient) { + super.configure(analytics); + + if (this.key === undefined) { + // We watch for new destination plugins being added to inject a + // destination filter instance for them + analytics.onPluginLoaded(this.addToPlugin); + // We also inject an instance for each plugin already loaded + analytics.getPlugins(PluginType.destination).forEach(this.addToPlugin); + } + + const key = this.key ?? WORKSPACE_DESTINATION_FILTER_KEY; + + this.filter = analytics.filters.get()?.[key]; + + this.filtersUnsubscribe?.(); + this.filtersUnsubscribe = analytics.filters.onChange((filters) => { + this.filter = filters?.[key]; + }); + } + + execute(event: SegmentEvent) { + if (this.filter === undefined) { + return event; + } + + const { matchers, transformers } = this.filter; + let transformedEvent: SegmentEvent | undefined; + for (let i = 0; i < matchers.length; i++) { + if (tsub.matches(event, matchers[i])) { + // We have to deep clone the event as the tsub transform modifies the event in place + if (transformedEvent === undefined) { + transformedEvent = clone(event); + } + const newEvent = tsub.transform(transformedEvent, transformers[i]); + if (newEvent === undefined || newEvent === null) { + return undefined; + } + transformedEvent = newEvent; + } + } + return transformedEvent ?? event; + } +} diff --git a/packages/plugins/plugin-destination-filters/src/__tests__/DestinationFilters.test.ts b/packages/plugins/plugin-destination-filters/src/__tests__/DestinationFilters.test.ts new file mode 100644 index 000000000..648af69b7 --- /dev/null +++ b/packages/plugins/plugin-destination-filters/src/__tests__/DestinationFilters.test.ts @@ -0,0 +1,97 @@ +import { DestinationFiltersPlugin } from '../DestinationFilters'; +import { createTestClient } from '../../../../core/src/__tests__/__helpers__/setupSegmentClient'; +import { DestinationPlugin } from '@segment/analytics-react-native'; + +describe('DestinationFiltersPlugin', () => { + const { store, client } = createTestClient(); + client.add({ plugin: new DestinationFiltersPlugin() }); + + class MockDestination extends DestinationPlugin { + track = jest.fn(); + + constructor(key: string) { + super(); + this.key = key; + } + } + + beforeEach(() => { + store.reset(); + jest.clearAllMocks(); + }); + + it('works', async () => { + await store.context.set({ + device: { + id: 'pii', + advertisingId: 'pii', + model: 'Jest', + }, + app: { + name: 'test', + }, + }); + + await store.settings.set({ + DropProperties: true, + DoNotSend: true, + }); + + await store.filters.set({ + DropProperties: { + matchers: [{ ir: '', type: 'all' }], + scope: 'destinations', + target_type: 'workspace::project::destination::config', + transformers: [ + [ + { + type: 'drop_properties', + config: { + drop: { 'context.device': ['id', 'advertisingId'] }, + }, + }, + ], + ], + destinationName: 'DropProperties', + }, + DoNotSend: { + matchers: [ + { + ir: '["and",["contains","event",{"value":"DoNotSend"}],["!=","type",{"value":"identify"}]]', + type: 'fql', + }, + ], + scope: 'destinations', + target_type: 'workspace::project::destination::config', + transformers: [[{ type: 'drop' }]], + destinationName: 'DoNotSend', + }, + }); + const droppedPropsDestination = new MockDestination('DropProperties'); + client.add({ plugin: droppedPropsDestination }); + + const doNotSendDestination = new MockDestination('DoNotSend'); + client.add({ plugin: doNotSendDestination }); + + await client.track('DoNotSend'); + + // Rule DoNotSend should not permit the event going to the destination + expect(doNotSendDestination.track).not.toHaveBeenCalled(); + // Rule DropProps will drop context.device.id from the destination + expect(droppedPropsDestination.track).toHaveBeenCalled(); + let lastDestinationEvent = droppedPropsDestination.track.mock.lastCall[0]; + expect(lastDestinationEvent.context.device).not.toHaveProperty('id'); + + await client.track('ThisIsFine'); + + // Rule DoNotSend will let this event pass, it should contain the device id as that filter does not apply here + expect(doNotSendDestination.track).toHaveBeenCalled(); + lastDestinationEvent = doNotSendDestination.track.mock.lastCall[0]; + expect(lastDestinationEvent.context.device).toHaveProperty('id'); + + // Rule DropProps will drop context.device.id from the destination + expect(droppedPropsDestination.track).toHaveBeenCalled(); + lastDestinationEvent = droppedPropsDestination.track.mock.lastCall[0]; + expect(lastDestinationEvent.context.device).not.toHaveProperty('id'); + }); +}); diff --git a/packages/plugins/plugin-destination-filters/src/index.tsx b/packages/plugins/plugin-destination-filters/src/index.tsx new file mode 100644 index 000000000..ea50b87fb --- /dev/null +++ b/packages/plugins/plugin-destination-filters/src/index.tsx @@ -0,0 +1 @@ +export { DestinationFiltersPlugin } from './DestinationFilters'; diff --git a/packages/plugins/plugin-destination-filters/tsconfig.json b/packages/plugins/plugin-destination-filters/tsconfig.json new file mode 100644 index 000000000..5695a71a9 --- /dev/null +++ b/packages/plugins/plugin-destination-filters/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "outDir": "lib/typescript", + "baseUrl": ".", + "paths": { + "@segment/analytics-react-native": ["/../../core/src/index"] + } + }, + "references": [{ "path": "../../core" }] +} diff --git a/yarn.lock b/yarn.lock index 4cd640106..2c58bd8d2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2463,6 +2463,16 @@ deepmerge "^4.2.2" shell-quote "1.7.3" +"@segment/tsub@^0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@segment/tsub/-/tsub-0.2.0.tgz#456345ad04bca81f6c3fefacac722fd9eb4923ce" + integrity sha512-DThHEnZ+1PlSjj59Q7Ns/ESevjfztDV4PtKMcoVp1PWSWaaPcaktWGdTeDgi8ucsJO91qtY9N4aM2cbfGr/yWA== + dependencies: + "@stdlib/math-base-special-ldexp" "^0.0.5" + dlv "^1.1.3" + dset "^3.1.1" + tiny-hashes "^1.0.1" + "@semantic-release/changelog@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/@semantic-release/changelog/-/changelog-6.0.1.tgz#8dd0334fd8c7d50cda747d2591e4f18f816b3c9c" @@ -2608,6 +2618,820 @@ dependencies: "@sinonjs/commons" "^1.7.0" +"@stdlib/array-float32@^0.0.x": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@stdlib/array-float32/-/array-float32-0.0.6.tgz#7a1c89db3c911183ec249fa32455abd9328cfa27" + integrity sha512-QgKT5UaE92Rv7cxfn7wBKZAlwFFHPla8eXsMFsTGt5BiL4yUy36lwinPUh4hzybZ11rw1vifS3VAPuk6JP413Q== + dependencies: + "@stdlib/assert-has-float32array-support" "^0.0.x" + +"@stdlib/array-float64@^0.0.x": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@stdlib/array-float64/-/array-float64-0.0.6.tgz#02d1c80dd4c38a0f1ec150ddfefe706e148bfc10" + integrity sha512-oE8y4a84LyBF1goX5//sU1mOjet8gLI0/6wucZcjg+j/yMmNV1xFu84Az9GOGmFSE6Ze6lirGOhfBeEWNNNaJg== + dependencies: + "@stdlib/assert-has-float64array-support" "^0.0.x" + +"@stdlib/array-uint16@^0.0.x": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@stdlib/array-uint16/-/array-uint16-0.0.6.tgz#2545110f0b611a1d55b01e52bd9160aaa67d6973" + integrity sha512-/A8Tr0CqJ4XScIDRYQawosko8ha1Uy+50wsTgJhjUtXDpPRp7aUjmxvYkbe7Rm+ImYYbDQVix/uCiPAFQ8ed4Q== + dependencies: + "@stdlib/assert-has-uint16array-support" "^0.0.x" + +"@stdlib/array-uint32@^0.0.x": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@stdlib/array-uint32/-/array-uint32-0.0.6.tgz#5a923576475f539bfb2fda4721ea7bac6e993949" + integrity sha512-2hFPK1Fg7obYPZWlGDjW9keiIB6lXaM9dKmJubg/ergLQCsJQJZpYsG6mMAfTJi4NT1UF4jTmgvyKD+yf0D9cA== + dependencies: + "@stdlib/assert-has-uint32array-support" "^0.0.x" + +"@stdlib/array-uint8@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/array-uint8/-/array-uint8-0.0.7.tgz#56f82b361da6bd9caad0e1d05e7f6ef20af9c895" + integrity sha512-qYJQQfGKIcky6TzHFIGczZYTuVlut7oO+V8qUBs7BJC9TwikVnnOmb3hY3jToY4xaoi5p9OvgdJKPInhyIhzFg== + dependencies: + "@stdlib/assert-has-uint8array-support" "^0.0.x" + +"@stdlib/assert-has-float32array-support@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/assert-has-float32array-support/-/assert-has-float32array-support-0.0.8.tgz#77371183726e26ca9e6f9db41d34543607074067" + integrity sha512-Yrg7K6rBqwCzDWZ5bN0VWLS5dNUWcoSfUeU49vTERdUmZID06J069CDc07UUl8vfQWhFgBWGocH3rrpKm1hi9w== + dependencies: + "@stdlib/assert-is-float32array" "^0.0.x" + "@stdlib/cli-ctor" "^0.0.x" + "@stdlib/constants-float64-pinf" "^0.0.x" + "@stdlib/fs-read-file" "^0.0.x" + +"@stdlib/assert-has-float64array-support@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/assert-has-float64array-support/-/assert-has-float64array-support-0.0.8.tgz#4d154994d348f5d894f63b3fbb9d7a6e2e4e5311" + integrity sha512-UVQcoeWqgMw9b8PnAmm/sgzFnuWkZcNhJoi7xyMjbiDV/SP1qLCrvi06mq86cqS3QOCma1fEayJdwgteoXyyuw== + dependencies: + "@stdlib/assert-is-float64array" "^0.0.x" + "@stdlib/cli-ctor" "^0.0.x" + "@stdlib/fs-read-file" "^0.0.x" + +"@stdlib/assert-has-node-buffer-support@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/assert-has-node-buffer-support/-/assert-has-node-buffer-support-0.0.8.tgz#5564d8e797c850f6ffc522b720eab1f6cba9c814" + integrity sha512-fgI+hW4Yg4ciiv4xVKH+1rzdV7e5+6UKgMnFbc1XDXHcxLub3vOr8+H6eDECdAIfgYNA7X0Dxa/DgvX9dwDTAQ== + dependencies: + "@stdlib/assert-is-buffer" "^0.0.x" + "@stdlib/cli-ctor" "^0.0.x" + "@stdlib/fs-read-file" "^0.0.x" + +"@stdlib/assert-has-own-property@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/assert-has-own-property/-/assert-has-own-property-0.0.7.tgz#8b55b38e25db8366b028cb871905ac09c9c253fb" + integrity sha512-3YHwSWiUqGlTLSwxAWxrqaD1PkgcJniGyotJeIt5X0tSNmSW0/c9RWroCImTUUB3zBkyBJ79MyU9Nf4Qgm59fQ== + +"@stdlib/assert-has-symbol-support@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/assert-has-symbol-support/-/assert-has-symbol-support-0.0.8.tgz#8606b247f0d023f2a7a6aa8a6fe5e346aa802a8f" + integrity sha512-PoQ9rk8DgDCuBEkOIzGGQmSnjtcdagnUIviaP5YskB45/TJHXseh4NASWME8FV77WFW9v/Wt1MzKFKMzpDFu4Q== + dependencies: + "@stdlib/cli-ctor" "^0.0.x" + "@stdlib/fs-read-file" "^0.0.x" + +"@stdlib/assert-has-tostringtag-support@^0.0.x": + version "0.0.9" + resolved "https://registry.yarnpkg.com/@stdlib/assert-has-tostringtag-support/-/assert-has-tostringtag-support-0.0.9.tgz#1080ef0a4be576a72d19a819498719265456f170" + integrity sha512-UTsqdkrnQ7eufuH5BeyWOJL3ska3u5nvDWKqw3onNNZ2mvdgkfoFD7wHutVGzAA2rkTsSJAMBHVwWLsm5SbKgw== + dependencies: + "@stdlib/assert-has-symbol-support" "^0.0.x" + "@stdlib/cli-ctor" "^0.0.x" + "@stdlib/fs-read-file" "^0.0.x" + +"@stdlib/assert-has-uint16array-support@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/assert-has-uint16array-support/-/assert-has-uint16array-support-0.0.8.tgz#083828067d55e3cc896796bc63cbf5726f67eecf" + integrity sha512-vqFDn30YrtzD+BWnVqFhB130g3cUl2w5AdOxhIkRkXCDYAM5v7YwdNMJEON+D4jI8YB4D5pEYjqKweYaCq4nyg== + dependencies: + "@stdlib/assert-is-uint16array" "^0.0.x" + "@stdlib/cli-ctor" "^0.0.x" + "@stdlib/constants-uint16-max" "^0.0.x" + "@stdlib/fs-read-file" "^0.0.x" + +"@stdlib/assert-has-uint32array-support@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/assert-has-uint32array-support/-/assert-has-uint32array-support-0.0.8.tgz#a98c431fee45743088adb9602ef753c7552f9155" + integrity sha512-tJtKuiFKwFSQQUfRXEReOVGXtfdo6+xlshSfwwNWXL1WPP2LrceoiUoQk7zMCMT6VdbXgGH92LDjVcPmSbH4Xw== + dependencies: + "@stdlib/assert-is-uint32array" "^0.0.x" + "@stdlib/cli-ctor" "^0.0.x" + "@stdlib/constants-uint32-max" "^0.0.x" + "@stdlib/fs-read-file" "^0.0.x" + +"@stdlib/assert-has-uint8array-support@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/assert-has-uint8array-support/-/assert-has-uint8array-support-0.0.8.tgz#9bed19de9834c3ced633551ed630982f0f424724" + integrity sha512-ie4vGTbAS/5Py+LLjoSQi0nwtYBp+WKk20cMYCzilT0rCsBI/oez0RqHrkYYpmt4WaJL4eJqC+/vfQ5NsI7F5w== + dependencies: + "@stdlib/assert-is-uint8array" "^0.0.x" + "@stdlib/cli-ctor" "^0.0.x" + "@stdlib/constants-uint8-max" "^0.0.x" + "@stdlib/fs-read-file" "^0.0.x" + +"@stdlib/assert-is-array@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/assert-is-array/-/assert-is-array-0.0.7.tgz#7f30904f88a195d918c588540a6807d1ae639d79" + integrity sha512-/o6KclsGkNcZ5hiROarsD9XUs6xQMb4lTwF6O71UHbKWTtomEF/jD0rxLvlvj0BiCxfKrReddEYd2CnhUyskMA== + dependencies: + "@stdlib/utils-native-class" "^0.0.x" + +"@stdlib/assert-is-big-endian@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/assert-is-big-endian/-/assert-is-big-endian-0.0.7.tgz#25ca21fb1ae0ec8201a716731497a2a15f315a7f" + integrity sha512-BvutsX84F76YxaSIeS5ZQTl536lz+f+P7ew68T1jlFqxBhr4v7JVYFmuf24U040YuK1jwZ2sAq+bPh6T09apwQ== + dependencies: + "@stdlib/array-uint16" "^0.0.x" + "@stdlib/array-uint8" "^0.0.x" + "@stdlib/cli-ctor" "^0.0.x" + "@stdlib/fs-read-file" "^0.0.x" + +"@stdlib/assert-is-boolean@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/assert-is-boolean/-/assert-is-boolean-0.0.8.tgz#6b38c2e799e4475d7647fb0e44519510e67080ce" + integrity sha512-PRCpslMXSYqFMz1Yh4dG2K/WzqxTCtlKbgJQD2cIkAtXux4JbYiXCtepuoV7l4Wv1rm0a1eU8EqNPgnOmWajGw== + dependencies: + "@stdlib/assert-has-tostringtag-support" "^0.0.x" + "@stdlib/utils-define-nonenumerable-read-only-property" "^0.0.x" + "@stdlib/utils-native-class" "^0.0.x" + +"@stdlib/assert-is-buffer@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/assert-is-buffer/-/assert-is-buffer-0.0.8.tgz#633b98bc342979e9ed8ed71c3a0f1366782d1412" + integrity sha512-SYmGwOXkzZVidqUyY1IIx6V6QnSL36v3Lcwj8Rvne/fuW0bU2OomsEBzYCFMvcNgtY71vOvgZ9VfH3OppvV6eA== + dependencies: + "@stdlib/assert-is-object-like" "^0.0.x" + +"@stdlib/assert-is-float32array@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/assert-is-float32array/-/assert-is-float32array-0.0.8.tgz#a43f6106a2ef8797496ab85aaf6570715394654a" + integrity sha512-Phk0Ze7Vj2/WLv5Wy8Oo7poZIDMSTiTrEnc1t4lBn3Svz2vfBXlvCufi/i5d93vc4IgpkdrOEwfry6nldABjNQ== + dependencies: + "@stdlib/utils-native-class" "^0.0.x" + +"@stdlib/assert-is-float64array@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/assert-is-float64array/-/assert-is-float64array-0.0.8.tgz#8c27204ae6cf309e16f0bbad1937f8aa06c2a812" + integrity sha512-UC0Av36EEYIgqBbCIz1lj9g7qXxL5MqU1UrWun+n91lmxgdJ+Z77fHy75efJbJlXBf6HXhcYXECIsc0u3SzyDQ== + dependencies: + "@stdlib/utils-native-class" "^0.0.x" + +"@stdlib/assert-is-function@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/assert-is-function/-/assert-is-function-0.0.8.tgz#e4925022b7dd8c4a67e86769691d1d29ab159db9" + integrity sha512-M55Dt2njp5tnY8oePdbkKBRIypny+LpCMFZhEjJIxjLE4rA6zSlHs1yRMqD4PmW+Wl9WTeEM1GYO4AQHl1HAjA== + dependencies: + "@stdlib/utils-type-of" "^0.0.x" + +"@stdlib/assert-is-little-endian@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/assert-is-little-endian/-/assert-is-little-endian-0.0.7.tgz#f369fa3ec05c0e3a813738174b6821aacda6e323" + integrity sha512-SPObC73xXfDXY0dOewXR0LDGN3p18HGzm+4K8azTj6wug0vpRV12eB3hbT28ybzRCa6TAKUjwM/xY7Am5QzIlA== + dependencies: + "@stdlib/array-uint16" "^0.0.x" + "@stdlib/array-uint8" "^0.0.x" + "@stdlib/cli-ctor" "^0.0.x" + "@stdlib/fs-read-file" "^0.0.x" + +"@stdlib/assert-is-number@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/assert-is-number/-/assert-is-number-0.0.7.tgz#82b07cda4045bd0ecc846d3bc26d39dca7041c61" + integrity sha512-mNV4boY1cUOmoWWfA2CkdEJfXA6YvhcTvwKC0Fzq+HoFFOuTK/scpTd9HanUyN6AGBlWA8IW+cQ1ZwOT3XMqag== + dependencies: + "@stdlib/assert-has-tostringtag-support" "^0.0.x" + "@stdlib/number-ctor" "^0.0.x" + "@stdlib/utils-define-nonenumerable-read-only-property" "^0.0.x" + "@stdlib/utils-native-class" "^0.0.x" + +"@stdlib/assert-is-object-like@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/assert-is-object-like/-/assert-is-object-like-0.0.8.tgz#f6fc36eb7b612d650c6201d177214733426f0c56" + integrity sha512-pe9selDPYAu/lYTFV5Rj4BStepgbzQCr36b/eC8EGSJh6gMgRXgHVv0R+EbdJ69KNkHvKKRjnWj0A/EmCwW+OA== + dependencies: + "@stdlib/assert-tools-array-function" "^0.0.x" + "@stdlib/utils-define-nonenumerable-read-only-property" "^0.0.x" + +"@stdlib/assert-is-object@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/assert-is-object/-/assert-is-object-0.0.8.tgz#0220dca73bc3df044fc43e73b02963d5ef7ae489" + integrity sha512-ooPfXDp9c7w+GSqD2NBaZ/Du1JRJlctv+Abj2vRJDcDPyrnRTb1jmw+AuPgcW7Ca7op39JTbArI+RVHm/FPK+Q== + dependencies: + "@stdlib/assert-is-array" "^0.0.x" + +"@stdlib/assert-is-plain-object@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/assert-is-plain-object/-/assert-is-plain-object-0.0.7.tgz#0c3679faf61b03023363f1ce30f8d00f8ed1c37b" + integrity sha512-t/CEq2a083ajAgXgSa5tsH8l3kSoEqKRu1qUwniVLFYL4RGv3615CrpJUDQKVtEX5S/OKww5q0Byu3JidJ4C5w== + dependencies: + "@stdlib/assert-has-own-property" "^0.0.x" + "@stdlib/assert-is-function" "^0.0.x" + "@stdlib/assert-is-object" "^0.0.x" + "@stdlib/utils-get-prototype-of" "^0.0.x" + "@stdlib/utils-native-class" "^0.0.x" + +"@stdlib/assert-is-regexp-string@^0.0.x": + version "0.0.9" + resolved "https://registry.yarnpkg.com/@stdlib/assert-is-regexp-string/-/assert-is-regexp-string-0.0.9.tgz#424f77b4aaa46a19f4b60ba4b671893a2e5df066" + integrity sha512-FYRJJtH7XwXEf//X6UByUC0Eqd0ZYK5AC8or5g5m5efQrgr2lOaONHyDQ3Scj1A2D6QLIJKZc9XBM4uq5nOPXA== + dependencies: + "@stdlib/assert-is-string" "^0.0.x" + "@stdlib/cli-ctor" "^0.0.x" + "@stdlib/fs-read-file" "^0.0.x" + "@stdlib/process-read-stdin" "^0.0.x" + "@stdlib/regexp-eol" "^0.0.x" + "@stdlib/regexp-regexp" "^0.0.x" + "@stdlib/streams-node-stdin" "^0.0.x" + +"@stdlib/assert-is-regexp@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/assert-is-regexp/-/assert-is-regexp-0.0.7.tgz#430fe42417114e7ea01d21399a70ed9c4cbae867" + integrity sha512-ty5qvLiqkDq6AibHlNJe0ZxDJ9Mg896qolmcHb69mzp64vrsORnPPOTzVapAq0bEUZbXoypeijypLPs9sCGBSQ== + dependencies: + "@stdlib/assert-has-tostringtag-support" "^0.0.x" + "@stdlib/utils-native-class" "^0.0.x" + +"@stdlib/assert-is-string@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/assert-is-string/-/assert-is-string-0.0.8.tgz#b07e4a4cbd93b13d38fa5ebfaa281ccd6ae9e43f" + integrity sha512-Uk+bR4cglGBbY0q7O7HimEJiW/DWnO1tSzr4iAGMxYgf+VM2PMYgI5e0TLy9jOSOzWon3YS39lc63eR3a9KqeQ== + dependencies: + "@stdlib/assert-has-tostringtag-support" "^0.0.x" + "@stdlib/utils-define-nonenumerable-read-only-property" "^0.0.x" + "@stdlib/utils-native-class" "^0.0.x" + +"@stdlib/assert-is-uint16array@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/assert-is-uint16array/-/assert-is-uint16array-0.0.8.tgz#770cc5d86906393d30d387a291e81df0a984fdfb" + integrity sha512-M+qw7au+qglRXcXHjvoUZVLlGt1mPjuKudrVRto6KL4+tDsP2j+A89NDP3Fz8/XIUD+5jhj+65EOKHSMvDYnng== + dependencies: + "@stdlib/utils-native-class" "^0.0.x" + +"@stdlib/assert-is-uint32array@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/assert-is-uint32array/-/assert-is-uint32array-0.0.8.tgz#2a7f1265db25d728e3fc084f0f59be5f796efac5" + integrity sha512-cnZi2DicYcplMnkJ3dBxBVKsRNFjzoGpmG9A6jXq4KH5rFl52SezGAXSVY9o5ZV7bQGaF5JLyCLp6n9Y74hFGg== + dependencies: + "@stdlib/utils-native-class" "^0.0.x" + +"@stdlib/assert-is-uint8array@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/assert-is-uint8array/-/assert-is-uint8array-0.0.8.tgz#4521054b5d3a2206b406cad7368e0a50eaee4dec" + integrity sha512-8cqpDQtjnJAuVtRkNAktn45ixq0JHaGJxVsSiK79k7GRggvMI6QsbzO6OvcLnZ/LimD42FmgbLd13Yc2esDmZw== + dependencies: + "@stdlib/utils-native-class" "^0.0.x" + +"@stdlib/assert-tools-array-function@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/assert-tools-array-function/-/assert-tools-array-function-0.0.7.tgz#34e9e5a3fca62ea75da99fc9995ba845ba514988" + integrity sha512-3lqkaCIBMSJ/IBHHk4NcCnk2NYU52tmwTYbbqhAmv7vim8rZPNmGfj3oWkzrCsyCsyTF7ooD+In2x+qTmUbCtQ== + dependencies: + "@stdlib/assert-is-array" "^0.0.x" + +"@stdlib/buffer-ctor@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/buffer-ctor/-/buffer-ctor-0.0.7.tgz#d05b7f4a6ef26defe6cdd41ca244a927b96c55ec" + integrity sha512-4IyTSGijKUQ8+DYRaKnepf9spvKLZ+nrmZ+JrRcB3FrdTX/l9JDpggcUcC/Fe+A4KIZOnClfxLn6zfIlkCZHNA== + dependencies: + "@stdlib/assert-has-node-buffer-support" "^0.0.x" + +"@stdlib/buffer-from-string@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/buffer-from-string/-/buffer-from-string-0.0.8.tgz#0901a6e66c278db84836e483a7278502e2a33994" + integrity sha512-Dws5ZbK2M9l4Bkn/ODHFm3lNZ8tWko+NYXqGS/UH/RIQv3PGp+1tXFUSvjwjDneM6ppjQVExzVedUH1ftABs9A== + dependencies: + "@stdlib/assert-is-function" "^0.0.x" + "@stdlib/assert-is-string" "^0.0.x" + "@stdlib/buffer-ctor" "^0.0.x" + "@stdlib/string-format" "^0.0.x" + +"@stdlib/cli-ctor@^0.0.x": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@stdlib/cli-ctor/-/cli-ctor-0.0.3.tgz#5b0a6d253217556c778015eee6c14be903f82c2b" + integrity sha512-0zCuZnzFyxj66GoF8AyIOhTX5/mgGczFvr6T9h4mXwegMZp8jBC/ZkOGMwmp+ODLBTvlcnnDNpNFkDDyR6/c2g== + dependencies: + "@stdlib/utils-define-nonenumerable-read-only-property" "^0.0.x" + "@stdlib/utils-noop" "^0.0.x" + minimist "^1.2.0" + +"@stdlib/complex-float32@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/complex-float32/-/complex-float32-0.0.7.tgz#fb9a0c34254eaf3ed91c39983e19ef131fc18bc1" + integrity sha512-POCtQcBZnPm4IrFmTujSaprR1fcOFr/MRw2Mt7INF4oed6b1nzeG647K+2tk1m4mMrMPiuXCdvwJod4kJ0SXxQ== + dependencies: + "@stdlib/assert-is-number" "^0.0.x" + "@stdlib/number-float64-base-to-float32" "^0.0.x" + "@stdlib/utils-define-nonenumerable-read-only-property" "^0.0.x" + "@stdlib/utils-define-property" "^0.0.x" + "@stdlib/utils-library-manifest" "^0.0.x" + +"@stdlib/complex-float64@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/complex-float64/-/complex-float64-0.0.8.tgz#00ee3a0629d218a01b830a20406aea7d7aff6fb3" + integrity sha512-lUJwsXtGEziOWAqCcnKnZT4fcVoRsl6t6ECaCJX45Z7lAc70yJLiwUieLWS5UXmyoADHuZyUXkxtI4oClfpnaw== + dependencies: + "@stdlib/assert-is-number" "^0.0.x" + "@stdlib/complex-float32" "^0.0.x" + "@stdlib/utils-define-nonenumerable-read-only-property" "^0.0.x" + "@stdlib/utils-define-property" "^0.0.x" + "@stdlib/utils-library-manifest" "^0.0.x" + +"@stdlib/complex-reim@^0.0.x": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@stdlib/complex-reim/-/complex-reim-0.0.6.tgz#9657971e36f2a1f1930a21249c1934c8c5087efd" + integrity sha512-28WXfPSIFMtHb0YgdatkGS4yxX5sPYea5MiNgqPv3E78+tFcg8JJG52NQ/MviWP2wsN9aBQAoCPeu8kXxSPdzA== + dependencies: + "@stdlib/array-float64" "^0.0.x" + "@stdlib/complex-float64" "^0.0.x" + "@stdlib/types" "^0.0.x" + "@stdlib/utils-library-manifest" "^0.0.x" + +"@stdlib/complex-reimf@^0.0.x": + version "0.0.1" + resolved "https://registry.yarnpkg.com/@stdlib/complex-reimf/-/complex-reimf-0.0.1.tgz#6797bc1bfb668a30511611f2544d0cff4d297775" + integrity sha512-P9zu05ZW2i68Oppp3oHelP7Tk0D7tGBL0hGl1skJppr2vY9LltuNbeYI3C96tQe/7Enw/5GyAWgxoQI4cWccQA== + dependencies: + "@stdlib/array-float32" "^0.0.x" + "@stdlib/complex-float32" "^0.0.x" + "@stdlib/types" "^0.0.x" + "@stdlib/utils-library-manifest" "^0.0.x" + +"@stdlib/constants-float64-exponent-bias@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/constants-float64-exponent-bias/-/constants-float64-exponent-bias-0.0.7.tgz#caa9e6f95179001ae67bd76adca7ba13cce50350" + integrity sha512-F0f95YUVGijNzBEgOzvQXwZC41SQyefB0sYntfVMi071I5Luv1HlYc+H80Ree/Wfn3gFNACe7JdfFIMpeJgTNg== + +"@stdlib/constants-float64-high-word-exponent-mask@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/constants-float64-high-word-exponent-mask/-/constants-float64-high-word-exponent-mask-0.0.7.tgz#7ded7c0c31dc4f08fb3aca5617afa621c72c9e36" + integrity sha512-7/GL1DW/BeWLvTcfbuWUyKJkcIN9fM6m8xPEGfq6vAvv+dRIAlwKsVZVTBIAD1FcoXLKV/GDptOPTQRAPoxGqA== + +"@stdlib/constants-float64-max-base2-exponent-subnormal@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/constants-float64-max-base2-exponent-subnormal/-/constants-float64-max-base2-exponent-subnormal-0.0.7.tgz#4d2e0981442572ff43290844e0c09effac2d428d" + integrity sha512-2SKF0w6XZe1O6S3TAPHjS8pUXujSCeiCzuskQyBBw1ZbbsU0Y6Qh4f99rk1L7f/C9Kp2h8GUh4KV25bdIO8jiQ== + +"@stdlib/constants-float64-max-base2-exponent@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/constants-float64-max-base2-exponent/-/constants-float64-max-base2-exponent-0.0.7.tgz#a10640b200b282cfc5fe7f37a29ff518bf78dd23" + integrity sha512-9vOMjILdOE7f3glCWuvQtfmiipE/WsImmAbG3u5KAeLluJhosNRhnfGbfRGydJiyDDYcs3W3l1ViXhLnRLuJZA== + +"@stdlib/constants-float64-min-base2-exponent-subnormal@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/constants-float64-min-base2-exponent-subnormal/-/constants-float64-min-base2-exponent-subnormal-0.0.7.tgz#59a546567492bcfded6054585486f725eab50f3b" + integrity sha512-SFw/ZA2BP0pyLkKkbWdGGMJ9zqqHZs3NyXvGjuEAVgmCFwdH+xTyvcOo/dC543WUoPKTkLsZ4D8h4TBUksfw8A== + +"@stdlib/constants-float64-ninf@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/constants-float64-ninf/-/constants-float64-ninf-0.0.7.tgz#ca961b0726abda273fe7fcdfb894bbfe41297f8c" + integrity sha512-piVlJxJDTd5v2ZTYNyXVV2qzc5kNibhpgK+H+ykaO80FNQvqt8bIP3TTca98q+u/8tmJi15qLLRBapiT+cczjA== + dependencies: + "@stdlib/number-ctor" "^0.0.x" + +"@stdlib/constants-float64-pinf@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/constants-float64-pinf/-/constants-float64-pinf-0.0.7.tgz#aac7325ff5437089ac364290e9cd3f88e1c7d0fa" + integrity sha512-kITkBiwGkrbjDOPG9TqwW9ryTpGKs5Evlf5CJjz59kvnXtVq2FDXpJ2oePPlyWa6cc1fyGkeLwBZMCWsRgs1rQ== + +"@stdlib/constants-float64-smallest-normal@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/constants-float64-smallest-normal/-/constants-float64-smallest-normal-0.0.7.tgz#41511d44b58502a995c01400e259cde8acfb6b88" + integrity sha512-3v0kxGdIj9bW4s/jy/g1A3mmAlWP9sEEJwUMTW5QKjlw5vpYJj7QvDb8Ofvc2/hk5DgzIMNefkZMOUs3ancXfA== + +"@stdlib/constants-uint16-max@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/constants-uint16-max/-/constants-uint16-max-0.0.7.tgz#c20dbe90cf3825f03f5f44b9ee7e8cbada26f4f1" + integrity sha512-7TPoku7SlskA67mAm7mykIAjeEnkQJemw1cnKZur0mT5W4ryvDR6iFfL9xBiByVnWYq/+ei7DHbOv6/2b2jizw== + +"@stdlib/constants-uint32-max@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/constants-uint32-max/-/constants-uint32-max-0.0.7.tgz#60bda569b226120a5d2e01f3066da8e2d3b8e21a" + integrity sha512-8+NK0ewqc1vnEZNqzwFJgFSy3S543Eft7i8WyW/ygkofiqEiLAsujvYMHzPAB8/3D+PYvjTSe37StSwRwvQ6uw== + +"@stdlib/constants-uint8-max@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/constants-uint8-max/-/constants-uint8-max-0.0.7.tgz#d50affeaeb6e67a0f39059a8f5122f3fd5ff4447" + integrity sha512-fqV+xds4jgwFxwWu08b8xDuIoW6/D4/1dtEjZ1sXVeWR7nf0pjj1cHERq4kdkYxsvOGu+rjoR3MbjzpFc4fvSw== + +"@stdlib/fs-exists@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/fs-exists/-/fs-exists-0.0.8.tgz#391b2cee3e014a3b20266e5d047847f68ef82331" + integrity sha512-mZktcCxiLmycCJefm1+jbMTYkmhK6Jk1ShFmUVqJvs+Ps9/2EEQXfPbdEniLoVz4HeHLlcX90JWobUEghOOnAQ== + dependencies: + "@stdlib/cli-ctor" "^0.0.x" + "@stdlib/fs-read-file" "^0.0.x" + "@stdlib/process-cwd" "^0.0.x" + "@stdlib/utils-define-nonenumerable-read-only-property" "^0.0.x" + +"@stdlib/fs-read-file@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/fs-read-file/-/fs-read-file-0.0.8.tgz#2f12669fa6dd2d330fb5006a94dc8896f0aaa0e0" + integrity sha512-pIZID/G91+q7ep4x9ECNC45+JT2j0+jdz/ZQVjCHiEwXCwshZPEvxcPQWb9bXo6coOY+zJyX5TwBIpXBxomWFg== + dependencies: + "@stdlib/cli-ctor" "^0.0.x" + "@stdlib/utils-define-nonenumerable-read-only-property" "^0.0.x" + +"@stdlib/fs-resolve-parent-path@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/fs-resolve-parent-path/-/fs-resolve-parent-path-0.0.8.tgz#628119952dfaae78afe3916dca856408a4f5c1eb" + integrity sha512-ok1bTWsAziChibQE3u7EoXwbCQUDkFjjRAHSxh7WWE5JEYVJQg1F0o3bbjRr4D/wfYYPWLAt8AFIKBUDmWghpg== + dependencies: + "@stdlib/assert-has-own-property" "^0.0.x" + "@stdlib/assert-is-function" "^0.0.x" + "@stdlib/assert-is-plain-object" "^0.0.x" + "@stdlib/assert-is-string" "^0.0.x" + "@stdlib/cli-ctor" "^0.0.x" + "@stdlib/fs-exists" "^0.0.x" + "@stdlib/fs-read-file" "^0.0.x" + "@stdlib/process-cwd" "^0.0.x" + "@stdlib/utils-define-nonenumerable-read-only-property" "^0.0.x" + +"@stdlib/math-base-assert-is-infinite@^0.0.x": + version "0.0.9" + resolved "https://registry.yarnpkg.com/@stdlib/math-base-assert-is-infinite/-/math-base-assert-is-infinite-0.0.9.tgz#f9aa84e43a01ce4ccd976b20fbe7c508de884a90" + integrity sha512-JuPDdmxd+AtPWPHu9uaLvTsnEPaZODZk+zpagziNbDKy8DRiU1cy+t+QEjB5WizZt0A5MkuxDTjZ/8/sG5GaYQ== + dependencies: + "@stdlib/constants-float64-ninf" "^0.0.x" + "@stdlib/constants-float64-pinf" "^0.0.x" + "@stdlib/utils-library-manifest" "^0.0.x" + +"@stdlib/math-base-assert-is-nan@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/math-base-assert-is-nan/-/math-base-assert-is-nan-0.0.8.tgz#0cd6a546ca1e758251f04898fc906f6fce9e0f80" + integrity sha512-m+gCVBxLFW8ZdAfdkATetYMvM7sPFoMKboacHjb1pe21jHQqVb+/4bhRSDg6S7HGX7/8/bSzEUm9zuF7vqK5rQ== + dependencies: + "@stdlib/utils-library-manifest" "^0.0.x" + +"@stdlib/math-base-napi-binary@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/math-base-napi-binary/-/math-base-napi-binary-0.0.8.tgz#b2754b021e40e3982c5f22b853ca50724b9eb8de" + integrity sha512-B8d0HBPhfXefbdl/h0h5c+lM2sE+/U7Fb7hY/huVeoQtBtEx0Jbx/qKvPSVxMjmWCKfWlbPpbgKpN5GbFgLiAg== + dependencies: + "@stdlib/complex-float32" "^0.0.x" + "@stdlib/complex-float64" "^0.0.x" + "@stdlib/complex-reim" "^0.0.x" + "@stdlib/complex-reimf" "^0.0.x" + "@stdlib/utils-library-manifest" "^0.0.x" + +"@stdlib/math-base-napi-unary@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/math-base-napi-unary/-/math-base-napi-unary-0.0.8.tgz#4a6719886caa96bcfb67648c368a84b47072be6f" + integrity sha512-xKbGBxbgrEe7dxCDXJrooXPhXSDUl/QPqsN74Qa0+8Svsc4sbYVdU3yHSN5vDgrcWt3ZkH51j0vCSBIjvLL15g== + dependencies: + "@stdlib/complex-float32" "^0.0.x" + "@stdlib/complex-float64" "^0.0.x" + "@stdlib/complex-reim" "^0.0.x" + "@stdlib/complex-reimf" "^0.0.x" + "@stdlib/utils-library-manifest" "^0.0.x" + +"@stdlib/math-base-special-abs@^0.0.x": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@stdlib/math-base-special-abs/-/math-base-special-abs-0.0.6.tgz#1e95dbeaf417ef779c6ab6beaf15f9f96cae6fa9" + integrity sha512-FaaMUnYs2qIVN3kI5m/qNlBhDnjszhDOzEhxGEoQWR/k0XnxbCsTyjNesR2DkpiKuoAXAr9ojoDe2qBYdirWoQ== + dependencies: + "@stdlib/math-base-napi-unary" "^0.0.x" + "@stdlib/number-float64-base-to-words" "^0.0.x" + "@stdlib/utils-library-manifest" "^0.0.x" + +"@stdlib/math-base-special-copysign@^0.0.x": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@stdlib/math-base-special-copysign/-/math-base-special-copysign-0.0.6.tgz#ba1781b4be40dee5a67282b368c30f9cc5201bd0" + integrity sha512-2u2ariXtGK0c+Z8y0QHUrdP2aEvkKSZZ4GRNehVYMZT1cwDnZZOZRdTNKFquDldJ/C407upOvLpkzIeS9WmkUQ== + dependencies: + "@stdlib/math-base-napi-binary" "^0.0.x" + "@stdlib/number-float64-base-from-words" "^0.0.x" + "@stdlib/number-float64-base-get-high-word" "^0.0.x" + "@stdlib/number-float64-base-to-words" "^0.0.x" + "@stdlib/utils-library-manifest" "^0.0.x" + +"@stdlib/math-base-special-ldexp@^0.0.5": + version "0.0.5" + resolved "https://registry.yarnpkg.com/@stdlib/math-base-special-ldexp/-/math-base-special-ldexp-0.0.5.tgz#df5a1fc0252a6d6cc5f12126af903e7391d78aad" + integrity sha512-RLRsPpCdcJZMhwb4l4B/FsmGfEPEWAsik6KYUkUSSHb7ok/gZWt8LgVScxGMpJMpl5IV0v9qG4ZINVONKjX5KA== + dependencies: + "@stdlib/constants-float64-exponent-bias" "^0.0.x" + "@stdlib/constants-float64-max-base2-exponent" "^0.0.x" + "@stdlib/constants-float64-max-base2-exponent-subnormal" "^0.0.x" + "@stdlib/constants-float64-min-base2-exponent-subnormal" "^0.0.x" + "@stdlib/constants-float64-ninf" "^0.0.x" + "@stdlib/constants-float64-pinf" "^0.0.x" + "@stdlib/math-base-assert-is-infinite" "^0.0.x" + "@stdlib/math-base-assert-is-nan" "^0.0.x" + "@stdlib/math-base-special-copysign" "^0.0.x" + "@stdlib/number-float64-base-exponent" "^0.0.x" + "@stdlib/number-float64-base-from-words" "^0.0.x" + "@stdlib/number-float64-base-normalize" "^0.0.x" + "@stdlib/number-float64-base-to-words" "^0.0.x" + +"@stdlib/number-ctor@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/number-ctor/-/number-ctor-0.0.7.tgz#e97a66664639c9853b6c80bc7a15f7d67a2fc991" + integrity sha512-kXNwKIfnb10Ro3RTclhAYqbE3DtIXax+qpu0z1/tZpI2vkmTfYDQLno2QJrzJsZZgdeFtXIws+edONN9kM34ow== + +"@stdlib/number-float64-base-exponent@^0.0.x": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@stdlib/number-float64-base-exponent/-/number-float64-base-exponent-0.0.6.tgz#cd4483d9faccaf7324c385da8e37d5ecf2f120b0" + integrity sha512-wLXsG+cvynmapoffmj5hVNDH7BuHIGspBcTCdjPaD+tnqPDIm03qV5Z9YBhDh91BdOCuPZQ8Ovu2WBpX+ySeGg== + dependencies: + "@stdlib/constants-float64-exponent-bias" "^0.0.x" + "@stdlib/constants-float64-high-word-exponent-mask" "^0.0.x" + "@stdlib/number-float64-base-get-high-word" "^0.0.x" + +"@stdlib/number-float64-base-from-words@^0.0.x": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@stdlib/number-float64-base-from-words/-/number-float64-base-from-words-0.0.6.tgz#886e7dedd086e97d38b7e5fcf4c310467dbaac3c" + integrity sha512-r0elnekypCN831aw9Gp8+08br8HHAqvqtc5uXaxEh3QYIgBD/QM5qSb3b7WSAQ0ZxJJKdoykupODWWBkWQTijg== + dependencies: + "@stdlib/array-float64" "^0.0.x" + "@stdlib/array-uint32" "^0.0.x" + "@stdlib/assert-is-little-endian" "^0.0.x" + "@stdlib/number-float64-base-to-words" "^0.0.x" + "@stdlib/utils-library-manifest" "^0.0.x" + +"@stdlib/number-float64-base-get-high-word@^0.0.x": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@stdlib/number-float64-base-get-high-word/-/number-float64-base-get-high-word-0.0.6.tgz#4d3b8731a22017521cc7fc3ba57c7915b3e20fee" + integrity sha512-jSFSYkgiG/IzDurbwrDKtWiaZeSEJK8iJIsNtbPG1vOIdQMRyw+t0bf3Kf3vuJu/+bnSTvYZLqpCO6wzT/ve9g== + dependencies: + "@stdlib/array-float64" "^0.0.x" + "@stdlib/array-uint32" "^0.0.x" + "@stdlib/assert-is-little-endian" "^0.0.x" + "@stdlib/number-float64-base-to-words" "^0.0.x" + "@stdlib/utils-library-manifest" "^0.0.x" + +"@stdlib/number-float64-base-normalize@^0.0.x": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@stdlib/number-float64-base-normalize/-/number-float64-base-normalize-0.0.6.tgz#897083ba2ed4af43250c20cd65bfde2b798bf25d" + integrity sha512-+RvDf+vQdtGOg7lwz2vGFYL2hA0FyfAJyWVjBkesfHyyKL8nQclA83NJp6bjh+pVkOW3obBDX9zi8Gir4ORm1g== + dependencies: + "@stdlib/constants-float64-smallest-normal" "^0.0.x" + "@stdlib/math-base-assert-is-infinite" "^0.0.x" + "@stdlib/math-base-assert-is-nan" "^0.0.x" + "@stdlib/math-base-special-abs" "^0.0.x" + "@stdlib/types" "^0.0.x" + +"@stdlib/number-float64-base-to-float32@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/number-float64-base-to-float32/-/number-float64-base-to-float32-0.0.7.tgz#c7b82bb26cb7404017ede32cebe5864fd84c0e35" + integrity sha512-PNUSi6+cqfFiu4vgFljUKMFY2O9PxI6+T+vqtIoh8cflf+PjSGj3v4QIlstK9+6qU40eGR5SHZyLTWdzmNqLTQ== + dependencies: + "@stdlib/array-float32" "^0.0.x" + +"@stdlib/number-float64-base-to-words@^0.0.x": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@stdlib/number-float64-base-to-words/-/number-float64-base-to-words-0.0.6.tgz#527d0f251bad55b628e67aee95d2e00d611ff843" + integrity sha512-J7S0+yOBcrU9/gMTLE3oQUrtGvDj6uSxC8swOnXCLrCm0l3WItYlBl4PHPxJ+cgRiduHd1ol+ud7ctFI5/66sw== + dependencies: + "@stdlib/array-float64" "^0.0.x" + "@stdlib/array-uint32" "^0.0.x" + "@stdlib/assert-is-little-endian" "^0.0.x" + "@stdlib/os-byte-order" "^0.0.x" + "@stdlib/os-float-word-order" "^0.0.x" + "@stdlib/types" "^0.0.x" + "@stdlib/utils-library-manifest" "^0.0.x" + +"@stdlib/os-byte-order@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/os-byte-order/-/os-byte-order-0.0.7.tgz#131e02fb2ec67d172b9fe57caa629809fba11e7f" + integrity sha512-rRJWjFM9lOSBiIX4zcay7BZsqYBLoE32Oz/Qfim8cv1cN1viS5D4d3DskRJcffw7zXDnG3oZAOw5yZS0FnlyUg== + dependencies: + "@stdlib/assert-is-big-endian" "^0.0.x" + "@stdlib/assert-is-little-endian" "^0.0.x" + "@stdlib/cli-ctor" "^0.0.x" + "@stdlib/fs-read-file" "^0.0.x" + "@stdlib/utils-library-manifest" "^0.0.x" + +"@stdlib/os-float-word-order@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/os-float-word-order/-/os-float-word-order-0.0.7.tgz#067914ee1d1196b20d136c2eb55db6fd217833b4" + integrity sha512-gXIcIZf+ENKP7E41bKflfXmPi+AIfjXW/oU+m8NbP3DQasqHaZa0z5758qvnbO8L1lRJb/MzLOkIY8Bx/0cWEA== + dependencies: + "@stdlib/cli-ctor" "^0.0.x" + "@stdlib/fs-read-file" "^0.0.x" + "@stdlib/os-byte-order" "^0.0.x" + "@stdlib/utils-library-manifest" "^0.0.x" + +"@stdlib/process-cwd@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/process-cwd/-/process-cwd-0.0.8.tgz#5eef63fb75ffb5fc819659d2f450fa3ee2aa10bf" + integrity sha512-GHINpJgSlKEo9ODDWTHp0/Zc/9C/qL92h5Mc0QlIFBXAoUjy6xT4FB2U16wCNZMG3eVOzt5+SjmCwvGH0Wbg3Q== + dependencies: + "@stdlib/cli-ctor" "^0.0.x" + "@stdlib/fs-read-file" "^0.0.x" + +"@stdlib/process-read-stdin@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/process-read-stdin/-/process-read-stdin-0.0.7.tgz#684ad531759c6635715a67bdd8721fc249baa200" + integrity sha512-nep9QZ5iDGrRtrZM2+pYAvyCiYG4HfO0/9+19BiLJepjgYq4GKeumPAQo22+1xawYDL7Zu62uWzYszaVZcXuyw== + dependencies: + "@stdlib/assert-is-function" "^0.0.x" + "@stdlib/assert-is-string" "^0.0.x" + "@stdlib/buffer-ctor" "^0.0.x" + "@stdlib/buffer-from-string" "^0.0.x" + "@stdlib/streams-node-stdin" "^0.0.x" + "@stdlib/utils-next-tick" "^0.0.x" + +"@stdlib/regexp-eol@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/regexp-eol/-/regexp-eol-0.0.7.tgz#cf1667fdb5da1049c2c2f8d5c47dcbaede8650a4" + integrity sha512-BTMpRWrmlnf1XCdTxOrb8o6caO2lmu/c80XSyhYCi1DoizVIZnqxOaN5yUJNCr50g28vQ47PpsT3Yo7J3SdlRA== + dependencies: + "@stdlib/assert-has-own-property" "^0.0.x" + "@stdlib/assert-is-boolean" "^0.0.x" + "@stdlib/assert-is-plain-object" "^0.0.x" + "@stdlib/assert-is-string" "^0.0.x" + "@stdlib/utils-define-nonenumerable-read-only-property" "^0.0.x" + +"@stdlib/regexp-extended-length-path@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/regexp-extended-length-path/-/regexp-extended-length-path-0.0.7.tgz#7f76641c29895771e6249930e1863e7e137a62e0" + integrity sha512-z6uqzMWq3WPDKbl4MIZJoNA5ZsYLQI9G3j2TIvhU8X2hnhlku8p4mvK9F+QmoVvgPxKliwNnx/DAl7ltutSDKw== + dependencies: + "@stdlib/utils-define-nonenumerable-read-only-property" "^0.0.x" + +"@stdlib/regexp-function-name@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/regexp-function-name/-/regexp-function-name-0.0.7.tgz#e8dc6c7fe9276f0a8b4bc7f630a9e32ba9f37250" + integrity sha512-MaiyFUUqkAUpUoz/9F6AMBuMQQfA9ssQfK16PugehLQh4ZtOXV1LhdY8e5Md7SuYl9IrvFVg1gSAVDysrv5ZMg== + dependencies: + "@stdlib/utils-define-nonenumerable-read-only-property" "^0.0.x" + +"@stdlib/regexp-regexp@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/regexp-regexp/-/regexp-regexp-0.0.8.tgz#50221b52088cd427ef19fae6593977c1c3f77e87" + integrity sha512-S5PZICPd/XRcn1dncVojxIDzJsHtEleuJHHD7ji3o981uPHR7zI2Iy9a1eV2u7+ABeUswbI1Yuix6fXJfcwV1w== + dependencies: + "@stdlib/utils-define-nonenumerable-read-only-property" "^0.0.x" + +"@stdlib/streams-node-stdin@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/streams-node-stdin/-/streams-node-stdin-0.0.7.tgz#65ff09a2140999702a1ad885e6505334d947428f" + integrity sha512-gg4lgrjuoG3V/L29wNs32uADMCqepIcmoOFHJCTAhVe0GtHDLybUVnLljaPfdvmpPZmTvmusPQtIcscbyWvAyg== + +"@stdlib/string-base-format-interpolate@^0.0.x": + version "0.0.2" + resolved "https://registry.yarnpkg.com/@stdlib/string-base-format-interpolate/-/string-base-format-interpolate-0.0.2.tgz#a282747cc5729223a76351a655c229b3e0e8a92f" + integrity sha512-6hu7QAwB7U0Pti06grQ0RPFQHGEhBlqhgUonthpnNRjNLA2ECCsMxtYJ7CpK0120FwVhSN533neFPXAFQOJqng== + +"@stdlib/string-base-format-tokenize@^0.0.x": + version "0.0.2" + resolved "https://registry.yarnpkg.com/@stdlib/string-base-format-tokenize/-/string-base-format-tokenize-0.0.2.tgz#33145c655f63cee27437c9f3805d495c2451e531" + integrity sha512-KpQR1W8L2jBjfgPEN7FVcxhtukXi5njalqx/afEn097h91+h/r6P5KbXa3vK7MlbTO2aM9fCkn7mn8ofHy+cVg== + +"@stdlib/string-format@^0.0.x": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@stdlib/string-format/-/string-format-0.0.3.tgz#e916a7be14d83c83716f5d30b1b1af94c4e105b9" + integrity sha512-1jiElUQXlI/tTkgRuzJi9jUz/EjrO9kzS8VWHD3g7gdc3ZpxlA5G9JrIiPXGw/qmZTi0H1pXl6KmX+xWQEQJAg== + dependencies: + "@stdlib/string-base-format-interpolate" "^0.0.x" + "@stdlib/string-base-format-tokenize" "^0.0.x" + +"@stdlib/string-lowercase@^0.0.x": + version "0.0.9" + resolved "https://registry.yarnpkg.com/@stdlib/string-lowercase/-/string-lowercase-0.0.9.tgz#487361a10364bd0d9b5ee44f5cc654c7da79b66d" + integrity sha512-tXFFjbhIlDak4jbQyV1DhYiSTO8b1ozS2g/LELnsKUjIXECDKxGFyWYcz10KuyAWmFotHnCJdIm8/blm2CfDIA== + dependencies: + "@stdlib/assert-is-string" "^0.0.x" + "@stdlib/cli-ctor" "^0.0.x" + "@stdlib/fs-read-file" "^0.0.x" + "@stdlib/process-read-stdin" "^0.0.x" + "@stdlib/streams-node-stdin" "^0.0.x" + "@stdlib/string-format" "^0.0.x" + +"@stdlib/string-replace@^0.0.x": + version "0.0.11" + resolved "https://registry.yarnpkg.com/@stdlib/string-replace/-/string-replace-0.0.11.tgz#5e8790cdf4d9805ab78cc5798ab3d364dfbf5016" + integrity sha512-F0MY4f9mRE5MSKpAUfL4HLbJMCbG6iUTtHAWnNeAXIvUX1XYIw/eItkA58R9kNvnr1l5B08bavnjrgTJGIKFFQ== + dependencies: + "@stdlib/assert-is-function" "^0.0.x" + "@stdlib/assert-is-regexp" "^0.0.x" + "@stdlib/assert-is-regexp-string" "^0.0.x" + "@stdlib/assert-is-string" "^0.0.x" + "@stdlib/cli-ctor" "^0.0.x" + "@stdlib/fs-read-file" "^0.0.x" + "@stdlib/process-read-stdin" "^0.0.x" + "@stdlib/regexp-eol" "^0.0.x" + "@stdlib/streams-node-stdin" "^0.0.x" + "@stdlib/string-format" "^0.0.x" + "@stdlib/utils-escape-regexp-string" "^0.0.x" + "@stdlib/utils-regexp-from-string" "^0.0.x" + +"@stdlib/types@^0.0.x": + version "0.0.14" + resolved "https://registry.yarnpkg.com/@stdlib/types/-/types-0.0.14.tgz#02d3aab7a9bfaeb86e34ab749772ea22f7b2f7e0" + integrity sha512-AP3EI9/il/xkwUazcoY+SbjtxHRrheXgSbWZdEGD+rWpEgj6n2i63hp6hTOpAB5NipE0tJwinQlDGOuQ1lCaCw== + +"@stdlib/utils-constructor-name@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/utils-constructor-name/-/utils-constructor-name-0.0.8.tgz#ef63d17466c555b58b348a0c1175cee6044b8848" + integrity sha512-GXpyNZwjN8u3tyYjL2GgGfrsxwvfogUC3gg7L7NRZ1i86B6xmgfnJUYHYOUnSfB+R531ET7NUZlK52GxL7P82Q== + dependencies: + "@stdlib/assert-is-buffer" "^0.0.x" + "@stdlib/regexp-function-name" "^0.0.x" + "@stdlib/utils-native-class" "^0.0.x" + +"@stdlib/utils-convert-path@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/utils-convert-path/-/utils-convert-path-0.0.8.tgz#a959d02103eee462777d222584e72eceef8c223b" + integrity sha512-GNd8uIswrcJCctljMbmjtE4P4oOjhoUIfMvdkqfSrRLRY+ZqPB2xM+yI0MQFfUq/0Rnk/xtESlGSVLz9ZDtXfA== + dependencies: + "@stdlib/assert-is-string" "^0.0.x" + "@stdlib/cli-ctor" "^0.0.x" + "@stdlib/fs-read-file" "^0.0.x" + "@stdlib/process-read-stdin" "^0.0.x" + "@stdlib/regexp-eol" "^0.0.x" + "@stdlib/regexp-extended-length-path" "^0.0.x" + "@stdlib/streams-node-stdin" "^0.0.x" + "@stdlib/string-lowercase" "^0.0.x" + "@stdlib/string-replace" "^0.0.x" + +"@stdlib/utils-define-nonenumerable-read-only-property@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/utils-define-nonenumerable-read-only-property/-/utils-define-nonenumerable-read-only-property-0.0.7.tgz#ee74540c07bfc3d997ef6f8a1b2df267ea0c07ca" + integrity sha512-c7dnHDYuS4Xn3XBRWIQBPcROTtP/4lkcFyq0FrQzjXUjimfMgHF7cuFIIob6qUTnU8SOzY9p0ydRR2QJreWE6g== + dependencies: + "@stdlib/types" "^0.0.x" + "@stdlib/utils-define-property" "^0.0.x" + +"@stdlib/utils-define-property@^0.0.x": + version "0.0.9" + resolved "https://registry.yarnpkg.com/@stdlib/utils-define-property/-/utils-define-property-0.0.9.tgz#2f40ad66e28099714e3774f3585db80b13816e76" + integrity sha512-pIzVvHJvVfU/Lt45WwUAcodlvSPDDSD4pIPc9WmIYi4vnEBA9U7yHtiNz2aTvfGmBMTaLYTVVFIXwkFp+QotMA== + dependencies: + "@stdlib/types" "^0.0.x" + +"@stdlib/utils-escape-regexp-string@^0.0.x": + version "0.0.9" + resolved "https://registry.yarnpkg.com/@stdlib/utils-escape-regexp-string/-/utils-escape-regexp-string-0.0.9.tgz#36f25d78b2899384ca6c97f4064a8b48edfedb6e" + integrity sha512-E+9+UDzf2mlMLgb+zYrrPy2FpzbXh189dzBJY6OG+XZqEJAXcjWs7DURO5oGffkG39EG5KXeaQwDXUavcMDCIw== + dependencies: + "@stdlib/assert-is-string" "^0.0.x" + "@stdlib/string-format" "^0.0.x" + +"@stdlib/utils-get-prototype-of@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/utils-get-prototype-of/-/utils-get-prototype-of-0.0.7.tgz#f677132bcbc0ec89373376637148d364435918df" + integrity sha512-fCUk9lrBO2ELrq+/OPJws1/hquI4FtwG0SzVRH6UJmJfwb1zoEFnjcwyDAy+HWNVmo3xeRLsrz6XjHrJwer9pg== + dependencies: + "@stdlib/assert-is-function" "^0.0.x" + "@stdlib/utils-native-class" "^0.0.x" + +"@stdlib/utils-global@^0.0.x": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@stdlib/utils-global/-/utils-global-0.0.7.tgz#0d99dcd11b72ad10b97dfb43536ff50436db6fb4" + integrity sha512-BBNYBdDUz1X8Lhfw9nnnXczMv9GztzGpQ88J/6hnY7PHJ71av5d41YlijWeM9dhvWjnH9I7HNE3LL7R07yw0kA== + dependencies: + "@stdlib/assert-is-boolean" "^0.0.x" + +"@stdlib/utils-library-manifest@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/utils-library-manifest/-/utils-library-manifest-0.0.8.tgz#61d3ed283e82c8f14b7f952d82cfb8e47d036825" + integrity sha512-IOQSp8skSRQn9wOyMRUX9Hi0j/P5v5TvD8DJWTqtE8Lhr8kVVluMBjHfvheoeKHxfWAbNHSVpkpFY/Bdh/SHgQ== + dependencies: + "@stdlib/cli-ctor" "^0.0.x" + "@stdlib/fs-resolve-parent-path" "^0.0.x" + "@stdlib/utils-convert-path" "^0.0.x" + debug "^2.6.9" + resolve "^1.1.7" + +"@stdlib/utils-native-class@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/utils-native-class/-/utils-native-class-0.0.8.tgz#2e79de97f85d88a2bb5baa7a4528add71448d2be" + integrity sha512-0Zl9me2V9rSrBw/N8o8/9XjmPUy8zEeoMM0sJmH3N6C9StDsYTjXIAMPGzYhMEWaWHvGeYyNteFK2yDOVGtC3w== + dependencies: + "@stdlib/assert-has-own-property" "^0.0.x" + "@stdlib/assert-has-tostringtag-support" "^0.0.x" + +"@stdlib/utils-next-tick@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/utils-next-tick/-/utils-next-tick-0.0.8.tgz#72345745ec3b3aa2cedda056338ed95daae9388c" + integrity sha512-l+hPl7+CgLPxk/gcWOXRxX/lNyfqcFCqhzzV/ZMvFCYLY/wI9lcWO4xTQNMALY2rp+kiV+qiAiO9zcO+hewwUg== + +"@stdlib/utils-noop@^0.0.x": + version "0.0.13" + resolved "https://registry.yarnpkg.com/@stdlib/utils-noop/-/utils-noop-0.0.13.tgz#d8b113c605d327d786106448571c44b0f070751d" + integrity sha512-JRWHGWYWP5QK7SQ2cOYiL8NETw8P33LriZh1p9S2xC4e0rBoaY849h1A2IL2y1+x3s29KNjSaBWMrMUIV5HCSw== + +"@stdlib/utils-regexp-from-string@^0.0.x": + version "0.0.9" + resolved "https://registry.yarnpkg.com/@stdlib/utils-regexp-from-string/-/utils-regexp-from-string-0.0.9.tgz#fe4745a9a000157b365971c513fd7d4b2cb9ad6e" + integrity sha512-3rN0Mcyiarl7V6dXRjFAUMacRwe0/sYX7ThKYurf0mZkMW9tjTP+ygak9xmL9AL0QQZtbrFFwWBrDO+38Vnavw== + dependencies: + "@stdlib/assert-is-string" "^0.0.x" + "@stdlib/regexp-regexp" "^0.0.x" + "@stdlib/string-format" "^0.0.x" + +"@stdlib/utils-type-of@^0.0.x": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@stdlib/utils-type-of/-/utils-type-of-0.0.8.tgz#c62ed3fcf629471fe80d83f44c4e325860109cbe" + integrity sha512-b4xqdy3AnnB7NdmBBpoiI67X4vIRxvirjg3a8BfhM5jPr2k0njby1jAbG9dUxJvgAV6o32S4kjUgfIdjEYpTNQ== + dependencies: + "@stdlib/utils-constructor-name" "^0.0.x" + "@stdlib/utils-global" "^0.0.x" + "@szmarczak/http-timer@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" @@ -2695,6 +3519,11 @@ "@types/node" "*" "@types/responselike" "*" +"@types/clone@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@types/clone/-/clone-2.1.1.tgz#9b880d0ce9b1f209b5e0bd6d9caa38209db34024" + integrity sha512-BZIU34bSYye0j/BFcPraiDZ5ka6MJADjcDVELGf7glr9K+iE8NYVjFslJFVWzskSxkLLyCrSPScE82/UUoBSvg== + "@types/eslint-visitor-keys@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" @@ -3990,6 +4819,11 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== +clone@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== + cmd-shim@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-5.0.0.tgz#8d0aaa1a6b0708630694c4dbde070ed94c707724" @@ -4400,7 +5234,7 @@ dayjs@^1.8.15: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.4.tgz#3b3c10ca378140d8917e06ebc13a4922af4f433e" integrity sha512-Zj/lPM5hOvQ1Bf7uAvewDaUcsJoI6JmNqmHhHl3nyumwe0XHwt8sWdOVAPACJzCebL8gQCi+K49w7iKWnGwX9g== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -4631,6 +5465,11 @@ dir-glob@^3.0.0, dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" @@ -4659,6 +5498,11 @@ dot-prop@^5.1.0, dot-prop@^5.2.0: dependencies: is-obj "^2.0.0" +dset@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/dset/-/dset-3.1.2.tgz#89c436ca6450398396dc6538ea00abc0c54cd45a" + integrity sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q== + duplexer2@~0.1.0: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" @@ -10203,7 +11047,7 @@ resolve.exports@^1.1.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.20.0: +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.20.0: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== @@ -11170,6 +12014,11 @@ through@2, "through@>=2.2.7 <3", through@^2.3.6: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== +tiny-hashes@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tiny-hashes/-/tiny-hashes-1.0.1.tgz#ddbe9060312ddb4efe0a174bb3a27e1331c425a1" + integrity sha512-knIN5zj4fl7kW4EBU5sLP20DWUvi/rVouvJezV0UAym2DkQaqm365Nyc8F3QEiOvunNDMxR8UhcXd1d5g+Wg1g== + tiny-relative-date@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz#fa08aad501ed730f31cc043181d995c39a935e07"