diff --git a/.gitignore b/.gitignore index 6b136b5d..334bf952 100644 --- a/.gitignore +++ b/.gitignore @@ -105,3 +105,4 @@ dist .vscode .envrc .turbo +.rollup.cache/ \ No newline at end of file diff --git a/package.json b/package.json index 34754c90..a5ae899b 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ }, "type": "module", "devDependencies": { + "@edge-runtime/vm": "^3.2.0", "@rollup/plugin-replace": "^5.0.2", "@rollup/plugin-typescript": "^11.1.2", "@types/node": "^20.4.1", @@ -55,6 +56,7 @@ "jsdom": "^22.1.0", "prettier": "^2.6.2", "rollup": "^3.29.4", + "runtime": "^0.14.1", "ts-node": "^10.8.1", "tslib": "^2.6.2", "turbo": "^1.10.1", diff --git a/packages/logger/.npmignore b/packages/logger/.npmignore new file mode 100644 index 00000000..e9200611 --- /dev/null +++ b/packages/logger/.npmignore @@ -0,0 +1,14 @@ +.github +.DS_Store +examples/ +lib/ +node_modules/ +tests/ +test/ +tsconfig.json +coverage/ +.turbo/ +.rollup.cache/ +tsconfig.tsbuildinfo +rollup.config.js +rollup.config.cjs.js diff --git a/packages/logger/CHANGELOG.md b/packages/logger/CHANGELOG.md new file mode 100644 index 00000000..11bddf32 --- /dev/null +++ b/packages/logger/CHANGELOG.md @@ -0,0 +1,8 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] diff --git a/packages/logger/README.md b/packages/logger/README.md new file mode 100644 index 00000000..5b4667c4 --- /dev/null +++ b/packages/logger/README.md @@ -0,0 +1,9 @@ +## Javascript logger for Axiom + +## Quickstart + +Install using `npm install`: + +```shell +npm install @axiomhq/js @axiomhq/logger +``` diff --git a/packages/logger/package.json b/packages/logger/package.json new file mode 100644 index 00000000..b2bff4db --- /dev/null +++ b/packages/logger/package.json @@ -0,0 +1,58 @@ +{ + "name": "@axiomhq/logger", + "description": "The official Axiom javascript logger", + "version": "1.0.0", + "author": "Axiom, Inc.", + "license": "MIT", + "contributors": [ + "Islam Shehata ", + "Arne Bahlo " + ], + "engines": { + "node": ">=18" + }, + "type": "module", + "types": "dist/esm/types/index.d.ts", + "module": "dist/esm/index.js", + "main": "dist/cjs/index.cjs", + "scripts": { + "build": "rollup -c rollup.config.js", + "build:cjs": "rollup -c rollup.config.cjs.js", + "format": "eslint '*/**/*.{js,ts}' --quiet --fix", + "lint": "eslint '*/**/*.{js,ts}'", + "prepublish": "pnpm run build && pnpm run build:cjs", + "test": "vitest run test/unit/* --coverage" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/axiomhq/axiom-js.git" + }, + "keywords": [ + "axiom", + "api", + "rest", + "client", + "axiom-js", + "axiom sdk", + "axiom js", + "logging", + "logger", + "axiom logger" + ], + "bugs": { + "url": "https://github.com/axiomhq/axiom-js/issues" + }, + "homepage": "https://github.com/axiomhq/axiom-js/blob/main/packages/logger/README.md", + "dependencies": { + "@axiomhq/runtime": "workspace:*" + }, + "peerDependencies": { + "@axiomhq/js": "workspace:*" + }, + "exports": { + "types": "./dist/esm/types/index.d.ts", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.cjs", + "default": "./dist/esm/index.js" + } +} \ No newline at end of file diff --git a/packages/logger/rollup.config.cjs.js b/packages/logger/rollup.config.cjs.js new file mode 100644 index 00000000..e4ae9d76 --- /dev/null +++ b/packages/logger/rollup.config.cjs.js @@ -0,0 +1,16 @@ +import typescript from '@rollup/plugin-typescript'; + +export default [ + { + input: 'src/index.ts', + output: { + dir: 'dist/cjs', + format: 'cjs', + exports: 'named', + sourcemap: true, + preserveModules: true, + entryFileNames: '[name].cjs', + }, + plugins: [typescript({ outDir: 'dist/cjs', declarationDir: 'dist/cjs/types' })], + }, +]; diff --git a/packages/logger/rollup.config.js b/packages/logger/rollup.config.js new file mode 100644 index 00000000..f9276ee2 --- /dev/null +++ b/packages/logger/rollup.config.js @@ -0,0 +1,21 @@ +import typescript from '@rollup/plugin-typescript'; +import replace from '@rollup/plugin-replace'; + +export default [ + { + input: 'src/index.ts', + output: { + dir: 'dist/esm', + format: 'esm', + exports: 'named', + sourcemap: true, + preserveModules: true, + }, + plugins: [ + typescript({ outDir: 'dist/esm', declarationDir: 'dist/esm/types' }), + replace({ + AXIOM_VERSION: process.env.npm_package_version, + }), + ], + }, +]; diff --git a/packages/logger/src/event.ts b/packages/logger/src/event.ts new file mode 100644 index 00000000..e0c4996a --- /dev/null +++ b/packages/logger/src/event.ts @@ -0,0 +1,7 @@ +export interface LogEvent { + level: string; + message: string; + fields: any; + _time: string; + [key: string]: any; +} diff --git a/packages/logger/src/index.ts b/packages/logger/src/index.ts new file mode 100644 index 00000000..692cab4f --- /dev/null +++ b/packages/logger/src/index.ts @@ -0,0 +1,25 @@ +import { LOG_LEVEL, LogLevel } from './levels'; +import { Logger } from './logger'; +import { AxiomTransport } from './transports/axiom'; +import { ConsoleTransport } from './transports/console'; + +export { Logger, LoggerConfig } from './logger' +export { LogEvent } from './event' +export { LogLevel } from './levels' + +export function getDefaultLogger(): Logger { + const level = LogLevel[LOG_LEVEL as keyof typeof LogLevel]; + const env = process.env.NODE_ENV + const transport = env === 'production' ? new AxiomTransport({ + token: process.env.AXIOM_TOKEN || '', + axiomUrl: process.env.AXIOM_URL || 'https://api.axiom.co', + dataset: process.env.AXIOM_DATASET || '', + }) : new ConsoleTransport(); + + return new Logger({ + logLevel: level, + autoFlush: false, + transformers: [], + transport: transport, + }); +} diff --git a/packages/logger/src/levels.ts b/packages/logger/src/levels.ts new file mode 100644 index 00000000..1afac23e --- /dev/null +++ b/packages/logger/src/levels.ts @@ -0,0 +1,10 @@ +export const LOG_LEVEL = process.env.AXIOM_LOG_LEVEL || 'debug'; + +export enum LogLevel { + debug = 0, + info = 1, + warn = 2, + error = 3, + fatal = 4, + off = 100, +} diff --git a/packages/logger/src/logger.ts b/packages/logger/src/logger.ts new file mode 100644 index 00000000..d0e238f0 --- /dev/null +++ b/packages/logger/src/logger.ts @@ -0,0 +1,98 @@ +import { LogEvent } from './event'; +import { LOG_LEVEL, LogLevel } from './levels'; +import { Transport } from './transport'; +import { Transformer } from './transformer'; + +export type LoggerConfig = { + logLevel: LogLevel; + autoFlush: boolean; + transport: Transport; + transformers: Transformer[]; + args?: { [key: string]: any }; +}; + +export class Logger { + children: Logger[] = []; + + constructor(public config: LoggerConfig) { + if (this.config.logLevel == undefined || this.config.logLevel < 0) { + this.config.logLevel = LogLevel[LOG_LEVEL as keyof typeof LogLevel]; + } + } + + debug = (message: string, args: { [key: string]: any } = {}) => { + this._log(LogLevel.debug, message, args); + }; + info = (message: string, args: { [key: string]: any } = {}) => { + this._log(LogLevel.info, message, args); + }; + warn = (message: string, args: { [key: string]: any } = {}) => { + this._log(LogLevel.warn, message, args); + }; + error = (message: string, args: { [key: string]: any } = {}) => { + this._log(LogLevel.error, message, args); + }; + fatal = (message: string, args: { [key: string]: any } = {}) => { + this._log(LogLevel.fatal, message, args); + }; + + with = (args: { [key: string]: any }) => { + const config = { ...this.config, args: { ...this.config.args, ...args } }; + const child = new Logger(config); + this.children.push(child); + return child; + }; + + private _log = (level: LogLevel, message: string, args: { [key: string]: any } = {}) => { + if (level < this.config.logLevel) { + return; + } + let logEvent: LogEvent = { + level: LogLevel[level].toString(), + message, + _time: new Date(Date.now()).toISOString(), + fields: this.config.args || {}, + }; + + // check if passed args is an object, if its not an object, add it to fields.args + if (args instanceof Error) { + logEvent.fields = { ...logEvent.fields, message: args.message, stack: args.stack, name: args.name }; + } else if (typeof args === 'object' && args !== null && Object.keys(args).length > 0) { + const parsedArgs = JSON.parse(JSON.stringify(args, jsonFriendlyErrorReplacer)); + logEvent.fields = { ...logEvent.fields, ...parsedArgs }; + } else if (args && args.length) { + logEvent.fields = { ...logEvent.fields, args: args }; + } + + // loop over transformers and apply them to the logEvent + for (let t of this.config.transformers) { + logEvent = t.transform(logEvent); + } + + this.config.transport.log(logEvent); + if (this.config.autoFlush) { + this.flush(); + } + }; + + flush = async () => { + await Promise.all([this.config.transport.flush(), ...this.children.map((c) => c.flush())]); + }; +} + + +function jsonFriendlyErrorReplacer(key: string, value: any) { + if (value instanceof Error) { + return { + // Pull all enumerable properties, supporting properties on custom Errors + ...value, + // Explicitly pull Error's non-enumerable properties + name: value.name, + message: value.message, + stack: value.stack, + cause: value.cause, + }; + } + + return value; +} diff --git a/packages/logger/src/transformer.ts b/packages/logger/src/transformer.ts new file mode 100644 index 00000000..134e0f15 --- /dev/null +++ b/packages/logger/src/transformer.ts @@ -0,0 +1,5 @@ +import { LogEvent } from "./event"; + +export interface Transformer { + transform(event: LogEvent): LogEvent; +} diff --git a/packages/logger/src/transport.ts b/packages/logger/src/transport.ts new file mode 100644 index 00000000..56a467dd --- /dev/null +++ b/packages/logger/src/transport.ts @@ -0,0 +1,6 @@ +import { LogEvent } from "./event"; + +export interface Transport { + log(event: LogEvent): void; + flush(): Promise; +} diff --git a/packages/logger/src/transports/axiom.ts b/packages/logger/src/transports/axiom.ts new file mode 100644 index 00000000..45cf7ff9 --- /dev/null +++ b/packages/logger/src/transports/axiom.ts @@ -0,0 +1,24 @@ +import { Axiom } from '@axiomhq/js'; +import { Transport } from '../transport'; + +export class AxiomTransport implements Transport { + private client: Axiom; + + constructor(public credentials: AxiomCredentials) { + this.client = new Axiom({ token: credentials.token, url: credentials.axiomUrl }); + } + + log(event: any) { + this.client.ingest(this.credentials.dataset, event) + } + + async flush() { + return this.client.flush(); + } +} + +export interface AxiomCredentials { + token: string; + axiomUrl: string; + dataset: string; +} diff --git a/packages/logger/src/transports/console.ts b/packages/logger/src/transports/console.ts new file mode 100644 index 00000000..b7da8943 --- /dev/null +++ b/packages/logger/src/transports/console.ts @@ -0,0 +1,73 @@ +import { Transport } from "../transport"; +import { LogEvent } from "../event"; +import { isBrowser } from "@axiomhq/runtime"; + +export const isNoPrettyPrint = process.env.AXIOM_NO_PRETTY_PRINT == 'true' ? true : false; + +export class ConsoleTransport implements Transport { + constructor(public isNoPrettyPrint: boolean = false) {} + + log(ev: LogEvent) { + const hasFields = Object.keys(ev.fields).length > 0; + if (!this.isNoPrettyPrint) { + let msg = `${ev.level} - ${ev.message}`; + if (hasFields) { + msg += ' ' + JSON.stringify(ev.fields); + } + console.log(msg); + return; + } else { + _prettyPrint(ev, hasFields); + } + } + + async flush() { } +} + +const levelColors: { [key: string]: any } = { + info: { + terminal: '32', + browser: 'lightgreen', + }, + debug: { + terminal: '36', + browser: 'lightblue', + }, + warn: { + terminal: '33', + browser: 'yellow', + }, + error: { + terminal: '31', + browser: 'red', + }, +}; + +function _prettyPrint(ev: LogEvent, hasFields: boolean) { + // print indented message, instead of [object] + // We use the %o modifier instead of JSON.stringify because stringify will print the + // object as normal text, it loses all the functionality the browser gives for viewing + // objects in the console, such as expanding and collapsing the object. + let msgString = ''; + let args: any[] = [ev.level, ev.message]; + + if (isBrowser) { + msgString = '%c%s - %s'; + args = [`color: ${levelColors[ev.level].browser};`, ...args]; + } else { + msgString = `\x1b[${levelColors[ev.level].terminal}m%s\x1b[0m - %s`; + } + // we check if the fields object is not empty, otherwise its printed as + // or just "". + if (hasFields) { + msgString += ' %o'; + args.push(ev.fields); + } + + if (ev.request) { + msgString += ' %o'; + args.push(ev.request); + } + + console.log.apply(console, [msgString, ...args]); +} \ No newline at end of file diff --git a/packages/logger/test/unit/axiom_transport.spec.ts b/packages/logger/test/unit/axiom_transport.spec.ts new file mode 100644 index 00000000..d8815156 --- /dev/null +++ b/packages/logger/test/unit/axiom_transport.spec.ts @@ -0,0 +1,26 @@ +import { describe, it, expect, vi } from 'vitest'; +import { getDefaultLogger } from '../../src/index'; +import { AxiomTransport } from '../../src/transports/axiom'; + +vi.hoisted(() => { + vi.stubEnv('NODE_ENV', 'production'); +}) + +describe('Test Axiom Transport', () => { + it('ingests to Axiom when env is prod', async () => { + // TODO: mock Axiom transport and check it has been called + const mockedConsole = vi.spyOn(console, 'log'); + const mockedAxiom = vi.spyOn(AxiomTransport.prototype, 'flush'); + const log = getDefaultLogger(); + + expect(log.config.transport).toBeInstanceOf(AxiomTransport); + + log.info('test'); + expect(mockedAxiom).toHaveBeenCalledTimes(0); + + await log.flush(); + expect(mockedConsole).toHaveBeenCalledTimes(0); + expect(mockedAxiom).toHaveBeenCalledTimes(1); + }) +}) + diff --git a/packages/logger/test/unit/console_transport.spec.ts b/packages/logger/test/unit/console_transport.spec.ts new file mode 100644 index 00000000..a1fef9dd --- /dev/null +++ b/packages/logger/test/unit/console_transport.spec.ts @@ -0,0 +1,14 @@ +import { it, expect, vi } from 'vitest'; +import { getDefaultLogger } from '../../src/index'; +import { ConsoleTransport } from '../../src/transports/console'; + +it('prints to console when env is test or dev', async () => { + const mockedConsole = vi.spyOn(console, 'log'); + const log = getDefaultLogger(); + + expect(log.config.transport).toBeInstanceOf(ConsoleTransport); + + log.info('test'); + await log.flush(); + expect(mockedConsole).toHaveBeenCalledTimes(1); +}) diff --git a/packages/logger/test/unit/logLevels.spec.ts b/packages/logger/test/unit/logLevels.spec.ts new file mode 100644 index 00000000..47c8a084 --- /dev/null +++ b/packages/logger/test/unit/logLevels.spec.ts @@ -0,0 +1,48 @@ +import { describe, it, expect, vi } from 'vitest'; +import { Logger, LogLevel } from '../../src/index'; +import { ConsoleTransport } from '../../src/transports/console'; + +vi.useFakeTimers(); + +describe('Testing log levels', () => { + + it('log levels', async () => { + const mockedConsole = vi.spyOn(console, 'log'); + + // test overriding log level per logger + let logger = new Logger({ args: {}, autoFlush: false, logLevel: LogLevel.error, transport: new ConsoleTransport(), transformers: [] }); + logger.debug('hello'); + logger.info('hello'); + logger.warn('hello'); + await logger.flush(); + expect(mockedConsole).toHaveBeenCalledTimes(0); + + logger = new Logger({ args: {}, autoFlush: false, logLevel: LogLevel.warn, transport: new ConsoleTransport(), transformers: [] }); + logger.info('hello'); + logger.debug('hello'); + await logger.flush(); + expect(mockedConsole).toHaveBeenCalledTimes(0); + + logger = new Logger({ args: {}, autoFlush: false, logLevel: LogLevel.info, transport: new ConsoleTransport(), transformers: [] }); + logger.debug('hello'); + await logger.flush(); + expect(mockedConsole).toHaveBeenCalledTimes(0); + + // disabled logging + logger = new Logger({ args: {}, autoFlush: false, logLevel: LogLevel.off, transport: new ConsoleTransport(), transformers: [] }); + logger.error('no logs'); + await logger.flush(); + expect(mockedConsole).toHaveBeenCalledTimes(0); + + logger = new Logger({ args: {}, autoFlush: false, logLevel: LogLevel.error, transport: new ConsoleTransport(), transformers: [] }); + logger.warn('warn'); + logger.error('error'); + await logger.flush(); + expect(mockedConsole).toHaveBeenCalledTimes(1); + + logger = new Logger({ args: {}, autoFlush: false, logLevel: LogLevel.debug, transport: new ConsoleTransport(), transformers: [] }); + logger.warn('hello'); + await logger.flush(); + expect(mockedConsole).toHaveBeenCalledTimes(2); + }); +}) diff --git a/packages/logger/test/unit/log_off.spec.ts b/packages/logger/test/unit/log_off.spec.ts new file mode 100644 index 00000000..0745c57a --- /dev/null +++ b/packages/logger/test/unit/log_off.spec.ts @@ -0,0 +1,21 @@ +import { it, expect, vi } from 'vitest'; +import { getDefaultLogger, LogLevel } from '../../src/index'; + +vi.hoisted(() => { + // stub axiom env vars before importing logger + vi.stubEnv('AXIOM_URL', 'https://example.co/api/test'); + vi.stubEnv('AXIOM_LOG_LEVEL', 'off'); +}); + +vi.useFakeTimers(); + +it('disables logs when env is off', async () => { + const mockedConsole = vi.spyOn(console, 'log'); + const log = getDefaultLogger(); + + expect(log.config.logLevel).toEqual(LogLevel.off); + + log.info('test'); + await log.flush(); + expect(mockedConsole).toHaveBeenCalledTimes(0); +}) diff --git a/packages/logger/test/unit/no_log_level.spec.ts b/packages/logger/test/unit/no_log_level.spec.ts new file mode 100644 index 00000000..b0de5070 --- /dev/null +++ b/packages/logger/test/unit/no_log_level.spec.ts @@ -0,0 +1,23 @@ +import { describe, it, expect, vi } from 'vitest'; +import { getDefaultLogger, LogLevel } from '../../src/index'; + +vi.hoisted(() => { + // stub axiom env vars before importing logger + vi.stubEnv('AXIOM_INGEST_ENDPOINT', 'https://example.co/api/test'); + vi.stubEnv('AXIOM_LOG_LEVEL', 'error'); +}); + +vi.useFakeTimers(); + +describe('Testing log levels', () => { + it('detects environment variable log level', async () => { + const mockedConsole = vi.spyOn(console, 'log'); + const log = getDefaultLogger(); + + expect(log.config.logLevel).toEqual(LogLevel.error); + + log.info('test'); + await log.flush(); + expect(mockedConsole).toHaveBeenCalledTimes(0); + }) +}) diff --git a/packages/logger/tsconfig.json b/packages/logger/tsconfig.json new file mode 100644 index 00000000..b83f0bf3 --- /dev/null +++ b/packages/logger/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "node", + "baseUrl": ".", + "rootDir": "./src", + "outDir": "dist/esm", + "declarationDir": "dist/esm/types", + "declarationMap": true, + "emitDeclarationOnly": true + }, + "include": ["src/**/*"] + } + \ No newline at end of file diff --git a/packages/runtime/.npmignore b/packages/runtime/.npmignore new file mode 100644 index 00000000..e9200611 --- /dev/null +++ b/packages/runtime/.npmignore @@ -0,0 +1,14 @@ +.github +.DS_Store +examples/ +lib/ +node_modules/ +tests/ +test/ +tsconfig.json +coverage/ +.turbo/ +.rollup.cache/ +tsconfig.tsbuildinfo +rollup.config.js +rollup.config.cjs.js diff --git a/packages/runtime/CHANGELOG.md b/packages/runtime/CHANGELOG.md new file mode 100644 index 00000000..11bddf32 --- /dev/null +++ b/packages/runtime/CHANGELOG.md @@ -0,0 +1,8 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] diff --git a/packages/runtime/README.md b/packages/runtime/README.md new file mode 100644 index 00000000..e5ca68f9 --- /dev/null +++ b/packages/runtime/README.md @@ -0,0 +1,18 @@ +## Runtime + +## Quickstart + +Install using `npm install`: + +```shell +npm install @axiomhq/runtime +``` + +## Usage + +```javascript +import { detectRuntime } from '@axiomhq/runtime'; + +const runtime = detectRuntime(); +console.log(runtime.toString()); +``` \ No newline at end of file diff --git a/packages/runtime/package.json b/packages/runtime/package.json new file mode 100644 index 00000000..a0987299 --- /dev/null +++ b/packages/runtime/package.json @@ -0,0 +1,54 @@ +{ + "name": "@axiomhq/runtime", + "description": "Detect the running environment of your application", + "version": "1.0.0", + "author": "Axiom, Inc.", + "license": "MIT", + "contributors": [ + "Islam Shehata " + ], + "engines": { + "node": ">=18" + }, + "type": "module", + "types": "dist/esm/types/index.d.ts", + "module": "dist/esm/index.js", + "main": "dist/cjs/index.cjs", + "scripts": { + "build": "rollup -c rollup.config.js", + "build:cjs": "rollup -c rollup.config.cjs.js", + "format": "eslint '*/**/*.{js,ts}' --quiet --fix", + "lint": "eslint '*/**/*.{js,ts}'", + "prepublish": "pnpm run build && pnpm run build:cjs", + "test": "vitest run test/unit/* --coverage" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/axiomhq/axiom-js.git" + }, + "keywords": [ + "axiom", + "api", + "rest", + "client", + "axiom-js", + "axiom sdk", + "axiom js", + "logging", + "runtime" + ], + "bugs": { + "url": "https://github.com/axiomhq/axiom-js/issues" + }, + "homepage": "https://github.com/axiomhq/axiom-js/blob/main/packages/runtime/README.md", + "dependencies": { + "fetch-retry": "^5.0.3", + "uuid": "^8.3.2" + }, + "exports": { + "types": "./dist/esm/types/index.d.ts", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.cjs", + "default": "./dist/esm/index.js" + } +} diff --git a/packages/runtime/rollup.config.cjs.js b/packages/runtime/rollup.config.cjs.js new file mode 100644 index 00000000..e4ae9d76 --- /dev/null +++ b/packages/runtime/rollup.config.cjs.js @@ -0,0 +1,16 @@ +import typescript from '@rollup/plugin-typescript'; + +export default [ + { + input: 'src/index.ts', + output: { + dir: 'dist/cjs', + format: 'cjs', + exports: 'named', + sourcemap: true, + preserveModules: true, + entryFileNames: '[name].cjs', + }, + plugins: [typescript({ outDir: 'dist/cjs', declarationDir: 'dist/cjs/types' })], + }, +]; diff --git a/packages/runtime/rollup.config.js b/packages/runtime/rollup.config.js new file mode 100644 index 00000000..f9276ee2 --- /dev/null +++ b/packages/runtime/rollup.config.js @@ -0,0 +1,21 @@ +import typescript from '@rollup/plugin-typescript'; +import replace from '@rollup/plugin-replace'; + +export default [ + { + input: 'src/index.ts', + output: { + dir: 'dist/esm', + format: 'esm', + exports: 'named', + sourcemap: true, + preserveModules: true, + }, + plugins: [ + typescript({ outDir: 'dist/esm', declarationDir: 'dist/esm/types' }), + replace({ + AXIOM_VERSION: process.env.npm_package_version, + }), + ], + }, +]; diff --git a/packages/runtime/src/index.ts b/packages/runtime/src/index.ts new file mode 100644 index 00000000..a2423749 --- /dev/null +++ b/packages/runtime/src/index.ts @@ -0,0 +1,30 @@ +declare global { + var EdgeRuntime: string; // Edge runtime + var WorkerGlobalScope: any; // Non-standard global only used on Cloudflare: https://developers.cloudflare.com/workers/runtime-apis/websockets +} + +export const isWebWorker = + typeof self !== 'undefined' && + typeof globalThis.WorkerGlobalScope !== 'undefined' && + self instanceof WorkerGlobalScope; +export const isBrowser = typeof window !== 'undefined' || isWebWorker; +export const isEdgeRuntime = globalThis.EdgeRuntime ? true : false; + +export enum Runtime { + WebWorker, + Browser, + EdgeRuntime, + Node, +} + +export function detectRuntime(): Runtime { + if (isWebWorker) { + return Runtime.WebWorker; + } else if (isEdgeRuntime) { + return Runtime.EdgeRuntime; + } else if (isBrowser) { + return Runtime.Browser; + } + + return Runtime.Node; +} diff --git a/packages/runtime/test/unit/browser.spec.ts b/packages/runtime/test/unit/browser.spec.ts new file mode 100644 index 00000000..b7abf540 --- /dev/null +++ b/packages/runtime/test/unit/browser.spec.ts @@ -0,0 +1,9 @@ +// @vitest-environment jsdom +import { describe, it, expect } from "vitest"; +import { detectRuntime, Runtime } from '../../src/index'; + +describe("Browser tests", () => { + it('detects the runtime as a browser', () => { + expect(detectRuntime()).toEqual(Runtime.Browser); + }) +}) \ No newline at end of file diff --git a/packages/runtime/test/unit/edge.spec.ts b/packages/runtime/test/unit/edge.spec.ts new file mode 100644 index 00000000..f3795d58 --- /dev/null +++ b/packages/runtime/test/unit/edge.spec.ts @@ -0,0 +1,9 @@ +// @vitest-environment edge-runtime +import { describe, it, expect } from "vitest"; +import { detectRuntime, Runtime } from '../../src/index'; + +describe("Edge tests", () => { + it('detects edge runtime', () => { + expect(detectRuntime()).toEqual(Runtime.EdgeRuntime); + }) +}) diff --git a/packages/runtime/tsconfig.json b/packages/runtime/tsconfig.json new file mode 100644 index 00000000..b83f0bf3 --- /dev/null +++ b/packages/runtime/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "node", + "baseUrl": ".", + "rootDir": "./src", + "outDir": "dist/esm", + "declarationDir": "dist/esm/types", + "declarationMap": true, + "emitDeclarationOnly": true + }, + "include": ["src/**/*"] + } + \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3e9f283d..449748aa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '6.0' +lockfileVersion: '6.1' settings: autoInstallPeers: true @@ -8,6 +8,9 @@ importers: .: devDependencies: + '@edge-runtime/vm': + specifier: ^3.2.0 + version: 3.2.0 '@rollup/plugin-replace': specifier: ^5.0.2 version: 5.0.2(rollup@3.29.4) @@ -53,6 +56,9 @@ importers: rollup: specifier: ^3.29.4 version: 3.29.4 + runtime: + specifier: ^0.14.1 + version: 0.14.1 ts-node: specifier: ^10.8.1 version: 10.9.1(@types/node@20.4.1)(typescript@5.2.2) @@ -67,7 +73,7 @@ importers: version: 5.2.2 vitest: specifier: ^0.34.6 - version: 0.34.6(@vitest/ui@0.32.2)(jsdom@22.1.0) + version: 0.34.6(@edge-runtime/vm@3.2.0)(@vitest/ui@0.32.2)(jsdom@22.1.0) winston: specifier: ^3.8.2 version: 3.9.0 @@ -123,7 +129,7 @@ importers: version: 15.0.0(eslint-plugin-import@2.27.5)(eslint@8.51.0) eslint-plugin-import: specifier: ^2.25.2 - version: 2.27.5(@typescript-eslint/parser@6.4.0)(eslint@8.51.0) + version: 2.27.5(@typescript-eslint/parser@5.59.11)(eslint-import-resolver-typescript@3.5.5)(eslint@8.51.0) examples/pino: dependencies: @@ -186,6 +192,15 @@ importers: specifier: ^8.3.2 version: 8.3.2 + packages/logger: + dependencies: + '@axiomhq/js': + specifier: workspace:* + version: link:../js + '@axiomhq/runtime': + specifier: workspace:* + version: link:../runtime + packages/pino: dependencies: '@axiomhq/js': @@ -195,6 +210,15 @@ importers: specifier: ^1.0.0 version: 1.0.0 + packages/runtime: + dependencies: + fetch-retry: + specifier: ^5.0.3 + version: 5.0.6 + uuid: + specifier: ^8.3.2 + version: 8.3.2 + packages/winston: dependencies: '@axiomhq/js': @@ -274,6 +298,18 @@ packages: enabled: 2.0.0 kuler: 2.0.0 + /@edge-runtime/primitives@4.1.0: + resolution: {integrity: sha512-Vw0lbJ2lvRUqc7/soqygUX216Xb8T3WBZ987oywz6aJqRxcwSVWwr9e+Nqo2m9bxobA9mdbWNNoRY6S9eko1EQ==} + engines: {node: '>=16'} + dev: true + + /@edge-runtime/vm@3.2.0: + resolution: {integrity: sha512-0dEVyRLM/lG4gp1R/Ik5bfPl/1wX00xFwd5KcNH602tzBa09oF7pbTKETEhR1GjZ75K6OJnYFu8II2dyMhONMw==} + engines: {node: '>=16'} + dependencies: + '@edge-runtime/primitives': 4.1.0 + dev: true + /@esbuild/android-arm64@0.18.20: resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} @@ -711,7 +747,6 @@ packages: open: 9.1.0 picocolors: 1.0.0 tslib: 2.5.3 - dev: false /@polka/url@1.0.0-next.21: resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} @@ -904,7 +939,6 @@ packages: typescript: 5.2.2 transitivePeerDependencies: - supports-color - dev: false /@typescript-eslint/parser@6.4.0(eslint@8.51.0)(typescript@5.2.2): resolution: {integrity: sha512-I1Ah1irl033uxjxO9Xql7+biL3YD7w9IU8zF+xlzD/YxY6a4b7DYA08PXUUCbm2sEljwJF6ERFy2kTGAGcNilg==} @@ -925,6 +959,7 @@ packages: typescript: 5.2.2 transitivePeerDependencies: - supports-color + dev: true /@typescript-eslint/scope-manager@5.59.11: resolution: {integrity: sha512-dHFOsxoLFtrIcSj5h0QoBT/89hxQONwmn3FOQ0GOQcLOOXm+MIrS8zEAhs4tWl5MraxCY3ZJpaXQQdFMc2Tu+Q==} @@ -932,7 +967,6 @@ packages: dependencies: '@typescript-eslint/types': 5.59.11 '@typescript-eslint/visitor-keys': 5.59.11 - dev: false /@typescript-eslint/scope-manager@6.4.0: resolution: {integrity: sha512-TUS7vaKkPWDVvl7GDNHFQMsMruD+zhkd3SdVW0d7b+7Zo+bd/hXJQ8nsiUZMi1jloWo6c9qt3B7Sqo+flC1nig==} @@ -940,6 +974,7 @@ packages: dependencies: '@typescript-eslint/types': 6.4.0 '@typescript-eslint/visitor-keys': 6.4.0 + dev: true /@typescript-eslint/type-utils@6.4.0(eslint@8.51.0)(typescript@5.2.2): resolution: {integrity: sha512-TvqrUFFyGY0cX3WgDHcdl2/mMCWCDv/0thTtx/ODMY1QhEiyFtv/OlLaNIiYLwRpAxAtOLOY9SUf1H3Q3dlwAg==} @@ -964,11 +999,11 @@ packages: /@typescript-eslint/types@5.59.11: resolution: {integrity: sha512-epoN6R6tkvBYSc+cllrz+c2sOFWkbisJZWkOE+y3xHtvYaOE6Wk6B8e114McRJwFRjGvYdJwLXQH5c9osME/AA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: false /@typescript-eslint/types@6.4.0: resolution: {integrity: sha512-+FV9kVFrS7w78YtzkIsNSoYsnOtrYVnKWSTVXoL1761CsCRv5wpDOINgsXpxD67YCLZtVQekDDyaxfjVWUJmmg==} engines: {node: ^16.0.0 || >=18.0.0} + dev: true /@typescript-eslint/typescript-estree@5.59.11(typescript@5.2.2): resolution: {integrity: sha512-YupOpot5hJO0maupJXixi6l5ETdrITxeo5eBOeuV7RSKgYdU3G5cxO49/9WRnJq9EMrB7AuTSLH/bqOsXi7wPA==} @@ -989,7 +1024,6 @@ packages: typescript: 5.2.2 transitivePeerDependencies: - supports-color - dev: false /@typescript-eslint/typescript-estree@6.4.0(typescript@5.2.2): resolution: {integrity: sha512-iDPJArf/K2sxvjOR6skeUCNgHR/tCQXBsa+ee1/clRKr3olZjZ/dSkXPZjG6YkPtnW6p5D1egeEPMCW6Gn4yLA==} @@ -1010,6 +1044,7 @@ packages: typescript: 5.2.2 transitivePeerDependencies: - supports-color + dev: true /@typescript-eslint/utils@6.4.0(eslint@8.51.0)(typescript@5.2.2): resolution: {integrity: sha512-BvvwryBQpECPGo8PwF/y/q+yacg8Hn/2XS+DqL/oRsOPK+RPt29h5Ui5dqOKHDlbXrAeHUTnyG3wZA0KTDxRZw==} @@ -1036,7 +1071,6 @@ packages: dependencies: '@typescript-eslint/types': 5.59.11 eslint-visitor-keys: 3.4.3 - dev: false /@typescript-eslint/visitor-keys@6.4.0: resolution: {integrity: sha512-yJSfyT+uJm+JRDWYRYdCm2i+pmvXJSMtPR9Cq5/XQs4QIgNoLcoRtDdzsLbLsFM/c6um6ohQkg/MLxWvoIndJA==} @@ -1044,6 +1078,7 @@ packages: dependencies: '@typescript-eslint/types': 6.4.0 eslint-visitor-keys: 3.4.3 + dev: true /@vitejs/plugin-vue@4.2.3(vite@4.4.9)(vue@3.3.4): resolution: {integrity: sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==} @@ -1072,7 +1107,7 @@ packages: std-env: 3.4.2 test-exclude: 6.0.0 v8-to-istanbul: 9.1.0 - vitest: 0.34.6(@vitest/ui@0.32.2)(jsdom@22.1.0) + vitest: 0.34.6(@edge-runtime/vm@3.2.0)(@vitest/ui@0.32.2)(jsdom@22.1.0) transitivePeerDependencies: - supports-color dev: true @@ -1119,7 +1154,7 @@ packages: pathe: 1.1.1 picocolors: 1.0.0 sirv: 2.0.3 - vitest: 0.34.6(@vitest/ui@0.32.2)(jsdom@22.1.0) + vitest: 0.34.6(@edge-runtime/vm@3.2.0)(@vitest/ui@0.32.2)(jsdom@22.1.0) dev: true /@vitest/utils@0.32.2: @@ -1392,6 +1427,16 @@ packages: resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} dev: false + /async-done@1.3.2: + resolution: {integrity: sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==} + engines: {node: '>= 0.10'} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + process-nextick-args: 2.0.1 + stream-exhaust: 1.0.2 + dev: true + /async@3.2.4: resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} @@ -1429,14 +1474,12 @@ packages: /big-integer@1.6.51: resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} engines: {node: '>=0.6'} - dev: false /bplist-parser@0.2.0: resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} engines: {node: '>= 5.10.0'} dependencies: big-integer: 1.6.51 - dev: false /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -1468,7 +1511,6 @@ packages: engines: {node: '>=12'} dependencies: run-applescript: 5.0.0 - dev: false /busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} @@ -1583,6 +1625,12 @@ packages: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true + /createClass@1.0.7: + resolution: {integrity: sha512-unCMvR78WxGWg464+UDn31JA4+Q1hdwf50Z7ooyut2xCLLNIcMSsayytG6gscvgFHCpUw14EGszmks7aGhZXKA==} + dependencies: + inherits: 2.0.4 + dev: true + /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -1659,7 +1707,6 @@ packages: dependencies: bplist-parser: 0.2.0 untildify: 4.0.0 - dev: false /default-browser@4.0.0: resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} @@ -1669,12 +1716,10 @@ packages: default-browser-id: 3.0.0 execa: 7.1.1 titleize: 3.0.0 - dev: false /define-lazy-prop@3.0.0: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} - dev: false /define-properties@1.2.0: resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} @@ -1735,13 +1780,18 @@ packages: /enabled@2.0.0: resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + /enhanced-resolve@5.14.1: resolution: {integrity: sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==} engines: {node: '>=10.13.0'} dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 - dev: false /entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} @@ -1851,7 +1901,7 @@ packages: dependencies: confusing-browser-globals: 1.0.11 eslint: 8.51.0 - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@6.4.0)(eslint@8.51.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.11)(eslint-import-resolver-typescript@3.5.5)(eslint@8.51.0) object.assign: 4.1.4 object.entries: 1.1.6 semver: 6.3.1 @@ -1872,7 +1922,7 @@ packages: eslint: 8.51.0 eslint-import-resolver-node: 0.3.7 eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.59.11)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.51.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@6.4.0)(eslint@8.51.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.11)(eslint-import-resolver-typescript@3.5.5)(eslint@8.51.0) eslint-plugin-jsx-a11y: 6.7.1(eslint@8.51.0) eslint-plugin-react: 7.32.2(eslint@8.51.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.51.0) @@ -1911,7 +1961,7 @@ packages: enhanced-resolve: 5.14.1 eslint: 8.51.0 eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.59.11)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.51.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@6.4.0)(eslint@8.51.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.11)(eslint-import-resolver-typescript@3.5.5)(eslint@8.51.0) get-tsconfig: 4.6.0 globby: 13.1.4 is-core-module: 2.12.1 @@ -1922,7 +1972,6 @@ packages: - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - dev: false /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.59.11)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.51.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} @@ -1952,37 +2001,8 @@ packages: eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.59.11)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.51.0) transitivePeerDependencies: - supports-color - dev: false - - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.4.0)(eslint-import-resolver-node@0.3.7)(eslint@8.51.0): - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - dependencies: - '@typescript-eslint/parser': 6.4.0(eslint@8.51.0)(typescript@5.2.2) - debug: 3.2.7 - eslint: 8.51.0 - eslint-import-resolver-node: 0.3.7 - transitivePeerDependencies: - - supports-color - /eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.4.0)(eslint@8.51.0): + /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.59.11)(eslint-import-resolver-typescript@3.5.5)(eslint@8.51.0): resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} engines: {node: '>=4'} peerDependencies: @@ -1992,7 +2012,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 6.4.0(eslint@8.51.0)(typescript@5.2.2) + '@typescript-eslint/parser': 5.59.11(eslint@8.51.0)(typescript@5.2.2) array-includes: 3.1.6 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 @@ -2000,7 +2020,7 @@ packages: doctrine: 2.1.0 eslint: 8.51.0 eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.4.0)(eslint-import-resolver-node@0.3.7)(eslint@8.51.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.59.11)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.51.0) has: 1.0.3 is-core-module: 2.12.1 is-glob: 4.0.3 @@ -2206,7 +2226,6 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 strip-final-newline: 2.0.0 - dev: false /execa@7.1.1: resolution: {integrity: sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==} @@ -2221,7 +2240,6 @@ packages: onetime: 6.0.0 signal-exit: 3.0.7 strip-final-newline: 3.0.0 - dev: false /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -2354,7 +2372,6 @@ packages: /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - dev: false /get-symbol-description@1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} @@ -2367,7 +2384,6 @@ packages: resolution: {integrity: sha512-lgbo68hHTQnFddybKbbs/RDRJnJT5YyGy2kQzVwbq+g67X73i+5MVTval34QxGkOe9X5Ujf1UYpCaphLyltjEg==} dependencies: resolve-pkg-maps: 1.0.0 - dev: false /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} @@ -2438,7 +2454,6 @@ packages: ignore: 5.2.4 merge2: 1.4.1 slash: 4.0.0 - dev: false /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} @@ -2447,7 +2462,6 @@ packages: /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: false /graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} @@ -2524,12 +2538,10 @@ packages: /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} - dev: false /human-signals@4.3.1: resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} engines: {node: '>=14.18.0'} - dev: false /iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} @@ -2615,13 +2627,11 @@ packages: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} hasBin: true - dev: false /is-docker@3.0.0: resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true - dev: false /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} @@ -2639,7 +2649,6 @@ packages: hasBin: true dependencies: is-docker: 3.0.0 - dev: false /is-negative-zero@2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} @@ -2682,7 +2691,6 @@ packages: /is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: false /is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} @@ -2716,7 +2724,6 @@ packages: engines: {node: '>=8'} dependencies: is-docker: 2.2.1 - dev: false /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -2861,9 +2868,133 @@ packages: dependencies: p-locate: 5.0.0 + /lodash._arraycopy@3.0.0: + resolution: {integrity: sha512-RHShTDnPKP7aWxlvXKiDT6IX2jCs6YZLCtNhOru/OX2Q/tzX295vVBK5oX1ECtN+2r86S0Ogy8ykP1sgCZAN0A==} + dev: true + + /lodash._arrayeach@3.0.0: + resolution: {integrity: sha512-Mn7HidOVcl3mkQtbPsuKR0Fj0N6Q6DQB77CtYncZcJc0bx5qv2q4Gl6a0LC1AN+GSxpnBDNnK3CKEm9XNA4zqQ==} + dev: true + + /lodash._baseassign@3.2.0: + resolution: {integrity: sha512-t3N26QR2IdSN+gqSy9Ds9pBu/J1EAFEshKlUHpJG3rvyJOYgcELIxcIeKKfZk7sjOz11cFfzJRsyFry/JyabJQ==} + dependencies: + lodash._basecopy: 3.0.1 + lodash.keys: 3.1.2 + dev: true + + /lodash._baseclone@3.3.0: + resolution: {integrity: sha512-1K0dntf2dFQ5my0WoGKkduewR6+pTNaqX03kvs45y7G5bzl4B3kTR4hDfJIc2aCQDeLyQHhS280tc814m1QC1Q==} + dependencies: + lodash._arraycopy: 3.0.0 + lodash._arrayeach: 3.0.0 + lodash._baseassign: 3.2.0 + lodash._basefor: 3.0.3 + lodash.isarray: 3.0.4 + lodash.keys: 3.1.2 + dev: true + + /lodash._basecopy@3.0.1: + resolution: {integrity: sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==} + dev: true + + /lodash._basefor@3.0.3: + resolution: {integrity: sha512-6bc3b8grkpMgDcVJv9JYZAk/mHgcqMljzm7OsbmcE2FGUMmmLQTPHlh/dFqR8LA0GQ7z4K67JSotVKu5058v1A==} + dev: true + + /lodash._bindcallback@3.0.1: + resolution: {integrity: sha512-2wlI0JRAGX8WEf4Gm1p/mv/SZ+jLijpj0jyaE/AXeuQphzCgD8ZQW4oSpoN8JAopujOFGU3KMuq7qfHBWlGpjQ==} + dev: true + + /lodash._createassigner@3.1.1: + resolution: {integrity: sha512-LziVL7IDnJjQeeV95Wvhw6G28Z8Q6da87LWKOPWmzBLv4u6FAT/x5v00pyGW0u38UoogNF2JnD3bGgZZDaNEBw==} + dependencies: + lodash._bindcallback: 3.0.1 + lodash._isiterateecall: 3.0.9 + lodash.restparam: 3.6.1 + dev: true + + /lodash._getnative@3.9.1: + resolution: {integrity: sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==} + dev: true + + /lodash._isiterateecall@3.0.9: + resolution: {integrity: sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ==} + dev: true + + /lodash.clone@3.0.3: + resolution: {integrity: sha512-yVYPpFTdZDCLG2p07gVRTvcwN5X04oj2hu4gG6r0fer58JA08wAVxXzWM+CmmxO2bzOH8u8BkZTZqgX6juVF7A==} + dependencies: + lodash._baseclone: 3.3.0 + lodash._bindcallback: 3.0.1 + lodash._isiterateecall: 3.0.9 + dev: true + + /lodash.isarguments@3.1.0: + resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + dev: true + + /lodash.isarray@3.0.4: + resolution: {integrity: sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==} + dev: true + + /lodash.isplainobject@3.2.0: + resolution: {integrity: sha512-P4wZnho5curNqeEq/x292Pb57e1v+woR7DJ84DURelKB46lby8aDEGVobSaYtzHdQBWQrJSdxcCwjlGOvvdIyg==} + dependencies: + lodash._basefor: 3.0.3 + lodash.isarguments: 3.1.0 + lodash.keysin: 3.0.8 + dev: true + + /lodash.istypedarray@3.0.6: + resolution: {integrity: sha512-lGWJ6N8AA3KSv+ZZxlTdn4f6A7kMfpJboeyvbFdE7IU9YAgweODqmOgdUHOA+c6lVWeVLysdaxciFXi+foVsWw==} + dev: true + + /lodash.keys@3.1.2: + resolution: {integrity: sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==} + dependencies: + lodash._getnative: 3.9.1 + lodash.isarguments: 3.1.0 + lodash.isarray: 3.0.4 + dev: true + + /lodash.keysin@3.0.8: + resolution: {integrity: sha512-YDB/5xkL3fBKFMDaC+cfGV00pbiJ6XoJIfRmBhv7aR6wWtbCW6IzkiWnTfkiHTF6ALD7ff83dAtB3OEaSoyQPg==} + dependencies: + lodash.isarguments: 3.1.0 + lodash.isarray: 3.0.4 + dev: true + + /lodash.merge@3.3.2: + resolution: {integrity: sha512-ZgGZpRhWLjivGUbjtApZR4HyLv/UAyoYqESVYkK4aLBJVHRrbFpG+GNnE9JPijliME4LkKM0SFI/WyOiBiv1+w==} + dependencies: + lodash._arraycopy: 3.0.0 + lodash._arrayeach: 3.0.0 + lodash._createassigner: 3.1.1 + lodash._getnative: 3.9.1 + lodash.isarguments: 3.1.0 + lodash.isarray: 3.0.4 + lodash.isplainobject: 3.2.0 + lodash.istypedarray: 3.0.6 + lodash.keys: 3.1.2 + lodash.keysin: 3.0.8 + lodash.toplainobject: 3.0.0 + dev: true + /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + /lodash.restparam@3.6.1: + resolution: {integrity: sha512-L4/arjjuq4noiUJpt3yS6KIKDtJwNe2fIYgMqyYYKoeIfV1iEqvPwhCx23o+R9dzouGihDAPN1dTIRWa7zk8tw==} + dev: true + + /lodash.toplainobject@3.0.0: + resolution: {integrity: sha512-wMI0Ju1bvSmnBS3EcRRH/3zDnZOPpDtMtNDzbbNMKuTrEpALsf+sPyMeogmv63Y11qZQO7H1xFzohIEGRMjPYA==} + dependencies: + lodash._basecopy: 3.0.1 + lodash.keysin: 3.0.8 + dev: true + /logform@2.5.1: resolution: {integrity: sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==} dependencies: @@ -2919,7 +3050,6 @@ packages: /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: false /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} @@ -2947,12 +3077,10 @@ packages: /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} - dev: false /mimic-fn@4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} - dev: false /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -3049,14 +3177,12 @@ packages: engines: {node: '>=8'} dependencies: path-key: 3.1.1 - dev: false /npm-run-path@5.1.0: resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: path-key: 4.0.0 - dev: false /nwsapi@2.2.5: resolution: {integrity: sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ==} @@ -3134,14 +3260,12 @@ packages: engines: {node: '>=6'} dependencies: mimic-fn: 2.1.0 - dev: false /onetime@6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} dependencies: mimic-fn: 4.0.0 - dev: false /open@9.1.0: resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} @@ -3151,7 +3275,6 @@ packages: define-lazy-prop: 3.0.0 is-inside-container: 1.0.0 is-wsl: 2.2.0 - dev: false /optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} @@ -3210,7 +3333,6 @@ packages: /path-key@4.0.0: resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} engines: {node: '>=12'} - dev: false /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -3322,6 +3444,10 @@ packages: react-is: 18.2.0 dev: true + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + /process-warning@2.2.0: resolution: {integrity: sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg==} dev: false @@ -3432,7 +3558,6 @@ packages: /resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - dev: false /resolve@1.19.0: resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} @@ -3493,13 +3618,22 @@ packages: engines: {node: '>=12'} dependencies: execa: 5.1.1 - dev: false /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 + /runtime@0.14.1: + resolution: {integrity: sha512-okusjXO4tfjIK+YHvghl9mP23zxoBvIcamV24CIzk2XXYFx+qWVd1SyNFqIa8htV8eX2aMW3QtM2YFj2QQTQlg==} + dependencies: + async-done: 1.3.2 + createClass: 1.0.7 + lodash.clone: 3.0.3 + lodash.merge: 3.3.2 + once: 1.4.0 + dev: true + /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -3570,7 +3704,6 @@ packages: /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: false /simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} @@ -3593,7 +3726,6 @@ packages: /slash@4.0.0: resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} engines: {node: '>=12'} - dev: false /sonic-boom@3.3.0: resolution: {integrity: sha512-LYxp34KlZ1a2Jb8ZQgFCK3niIHzibdwtwNUWKg0qQRzsDoJ3Gfgkf8KdBTFU3SkejDEIlWwnSnpVdOZIhFMl/g==} @@ -3626,6 +3758,10 @@ packages: resolution: {integrity: sha512-Cw6eJDX9AxEEL0g5pYj8Zx9KXtDf60rxwS2ze0HBanS0aKhj1sBlzcsmg+R0qYy8byFa854/yR2X5ZmBSClVmg==} dev: true + /stream-exhaust@1.0.2: + resolution: {integrity: sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==} + dev: true + /streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -3684,12 +3820,10 @@ packages: /strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} - dev: false /strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} - dev: false /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} @@ -3738,12 +3872,10 @@ packages: dependencies: '@pkgr/utils': 2.4.1 tslib: 2.5.3 - dev: false /tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} - dev: false /test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} @@ -3783,7 +3915,6 @@ packages: /titleize@3.0.0: resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} engines: {node: '>=12'} - dev: false /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} @@ -3827,6 +3958,7 @@ packages: typescript: '>=4.2.0' dependencies: typescript: 5.2.2 + dev: true /ts-node@10.9.1(@types/node@20.4.1)(typescript@5.2.2): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} @@ -3869,11 +4001,9 @@ packages: /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: false /tslib@2.5.3: resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} - dev: false /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} @@ -3887,7 +4017,6 @@ packages: dependencies: tslib: 1.14.1 typescript: 5.2.2 - dev: false /turbo-darwin-64@1.10.3: resolution: {integrity: sha512-IIB9IomJGyD3EdpSscm7Ip1xVWtYb7D0x7oH3vad3gjFcjHJzDz9xZ/iw/qItFEW+wGFcLSRPd+1BNnuLM8AsA==} @@ -3997,7 +4126,6 @@ packages: /untildify@4.0.0: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} engines: {node: '>=8'} - dev: false /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -4090,7 +4218,7 @@ packages: fsevents: 2.3.2 dev: true - /vitest@0.34.6(@vitest/ui@0.32.2)(jsdom@22.1.0): + /vitest@0.34.6(@edge-runtime/vm@3.2.0)(@vitest/ui@0.32.2)(jsdom@22.1.0): resolution: {integrity: sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==} engines: {node: '>=v14.18.0'} hasBin: true @@ -4121,6 +4249,7 @@ packages: webdriverio: optional: true dependencies: + '@edge-runtime/vm': 3.2.0 '@types/chai': 4.3.5 '@types/chai-subset': 1.3.3 '@types/node': 20.4.1