diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1569215..018469d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -51,6 +51,9 @@ jobs: - name: Run tests run: yarn test + - name: Run coverage + run: yarn test:coverage + - name: Run typecheck tests run: yarn vitest run -c packages/v1-contexts/vitest.config.ts --typecheck.only --typecheck.checker tsc --typecheck.tsconfig packages/v1-contexts/tsconfig.json diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 553d987..b9322c6 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -91,5 +91,9 @@ jobs: - name: Run tests run: yarn test + - name: Run coverage + if: ${{ matrix.node-version == '24.x' }} + run: yarn test:coverage + - name: Run typecheck tests run: yarn vitest run -c packages/v1-contexts/vitest.config.ts --typecheck.only --typecheck.checker tsc --typecheck.tsconfig packages/v1-contexts/tsconfig.json diff --git a/.gitignore b/.gitignore index f5d832a..041ec2a 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ dist generated node_modules +coverage .npmrc .pnp.cjs diff --git a/Makefile b/Makefile index 2fff1bb..b7c67db 100644 --- a/Makefile +++ b/Makefile @@ -39,6 +39,15 @@ else $(YARN) test endif +.PHONY: tests-coverage +tests-coverage: ## Runs autotests with coverage report + $(TARGET_HEADER) +ifdef cli + $(YARN) vitest --run --coverage $(cli) --passWithNoTests +else + $(YARN) test:coverage +endif + .PHONY: tests-typecheck-contexts tests-typecheck-contexts: ## Runs typecheck tests (test-d.ts) for v1-contexts $(TARGET_HEADER) diff --git a/package.json b/package.json index 9111567..c7e821a 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,8 @@ "build:code": "vite build", "build:meta": "npx tsx scripts/build.meta.ts", "eslint": "eslint .", - "test": "vitest --run" + "test": "vitest --run", + "test:coverage": "vitest --run --coverage" }, "peerDependencies": { "pinia": "^2.2", @@ -54,6 +55,7 @@ "@types/semver": "^7.7.1", "@types/yargs": "^17.0.35", "@vitejs/plugin-vue": "^6.0.2", + "@vitest/coverage-istanbul": "4.0.15", "@vue/language-server": "^3.1.8", "@vue/test-utils": "^2.4.6", "chalk": "^5.3.0", diff --git a/packages/v1-components/vitest.config.ts b/packages/v1-components/vitest.config.ts index c5df8be..2e5d46c 100644 --- a/packages/v1-components/vitest.config.ts +++ b/packages/v1-components/vitest.config.ts @@ -16,7 +16,9 @@ export default mergeConfig( environment: 'jsdom', coverage: { provider: 'istanbul', - include: ['src/**'], + all: true, + include: ['src/**/*.{ts,tsx,vue}'], + exclude: ['src/**/*.d.ts'], }, }, }) diff --git a/packages/v1-contexts/tests/edge-cases.test.ts b/packages/v1-contexts/tests/edge-cases.test.ts new file mode 100644 index 0000000..2b0afca --- /dev/null +++ b/packages/v1-contexts/tests/edge-cases.test.ts @@ -0,0 +1,373 @@ +import type { + ActionSchema, + ContextAccessor, + ContextSchema, + CustomContextAccessor, + CustomContextSchema, + CustomFieldAccessor, + Rejection, +} from '@retailcrm/embed-ui-v1-types/context' + +import type { Endpoint } from '@remote-ui/rpc' + +import { + createContextAccessor, + createCustomContextAccessor, + createGetter, + createSetter, + LogicalError, +} from '@/host' + +import { + defineActions, + defineContext, + injectEndpoint, +} from '@/remote' + +import { + injectAccessor, + useContext, + useDictionary, +} from '@/remote/custom' + +import { + createPinia, + setActivePinia, +} from 'pinia' +import { createApp } from 'vue' + +import { + beforeEach, + describe, + expect, + test, + vi, +} from 'vitest' + +const actionSchema = { + save: { + accepts: Object.assign( + (args: unknown): args is [number] => Array.isArray(args) && args.length === 1 && typeof args[0] === 'number', + { members: [{ name: 'value', type: 'number' }] } + ), + expects: Object.assign( + (payload: unknown): payload is string => typeof payload === 'string', + { type: 'string' } + ), + }, +} satisfies ActionSchema<{ + save: (value: number) => string +}> + +const customSchema: CustomContextSchema = { + entity: 'order', + fields: [{ + kind: 'boolean', + code: 'flag', + readonly: false, + initial: false, + }, { + kind: 'date', + code: 'date', + readonly: false, + initial: null, + }, { + kind: 'datetime', + code: 'datetime', + readonly: false, + initial: null, + }, { + kind: 'dictionary', + code: 'dictionary', + readonly: false, + initial: null, + dictionaryCode: 'd', + }, { + kind: 'multiselect_dictionary', + code: 'multi', + readonly: false, + initial: [], + dictionaryCode: 'm', + }, { + kind: 'email', + code: 'email', + readonly: false, + initial: null, + }, { + kind: 'integer', + code: 'integer', + readonly: false, + initial: null, + }, { + kind: 'numeric', + code: 'numeric', + readonly: false, + initial: null, + }, { + kind: 'string', + code: 'string', + readonly: false, + initial: null, + }, { + kind: 'text', + code: 'text', + readonly: false, + initial: null, + }, { + kind: 'string', + code: 'readonly', + readonly: true, + initial: null, + }], +} + +describe('context accessor edge cases', () => { + describe('host accessors', () => { + test('reject unsupported fields in createGetter and createSetter', () => { + type PrimitiveSchema = { + id: { + accepts: (value: unknown) => value is number; + defaults: () => number; + readonly: false; + }; + } + + const getter = createGetter('test/getter', { + id: () => 1, + }) + const setter = createSetter('test/setter', { + id: () => {}, + }) + + expect(getter('id')).toBe(1) + expect(() => getter('missing' as never)).toThrow(LogicalError) + + setter('id', 2) + expect(() => setter('missing' as never, 2 as never)).toThrow(LogicalError) + }) + + test('forward host errors to rejection callback without onError handler', () => { + const rejection = vi.fn<(r: Rejection) => void>() + const accessor = createContextAccessor({} as never) + + expect(() => accessor.get('missing' as never, '~' as never, rejection)).toThrow(LogicalError) + expect(rejection).toHaveBeenCalled() + }) + + test('report host errors through onError handler when it is configured', () => { + const onError = vi.fn() + const accessor = createContextAccessor({} as never, onError) + + expect(accessor.get('missing' as never, '~' as never, vi.fn())).toBeUndefined() + expect(onError).toHaveBeenCalled() + }) + + test('handle custom dictionary failures and missing entities', async () => { + const schema: CustomContextSchema = { + entity: 'order', + fields: [{ + kind: 'string', + code: 'name', + readonly: false, + initial: null, + }], + } + + const accessor: CustomFieldAccessor = { + schema, + get: (code) => code === 'name' ? 'value' : null, + set: () => {}, + onChange: () => () => {}, + } + + const rejection = vi.fn<(r: Rejection) => void>() + const onError = vi.fn() + + const withoutDictionary = createCustomContextAccessor([accessor]) + await expect(withoutDictionary.getCustomDictionary('dict')).rejects.toThrow(LogicalError) + + const withErrorHandler = createCustomContextAccessor([accessor], null, onError) + await expect(withErrorHandler.getCustomDictionary('dict')).resolves.toEqual([]) + expect(onError).toHaveBeenCalled() + + const dictionaryError = new Error('Dictionary failed') + const withThrowingDictionary = createCustomContextAccessor( + [accessor], + async () => { + throw dictionaryError + } + ) + + await expect(withThrowingDictionary.getCustomDictionary('dict', {}, rejection)).rejects.toThrow(dictionaryError) + expect(rejection).toHaveBeenCalled() + + expect(withoutDictionary.getCustomSchema('order')).toEqual(schema) + expect(() => withoutDictionary.getCustomSchema('missing')).toThrow(LogicalError) + expect(() => withoutDictionary.getCustomField('missing', 'name')).toThrow(LogicalError) + expect(() => withoutDictionary.setCustomField('missing', 'name', 'value')).toThrow(LogicalError) + expect(() => withoutDictionary.onCustomFieldChange('missing', 'name', () => {})).toThrow(LogicalError) + }) + }) + + describe('remote context and actions', () => { + const endpoint = { + call: { + get: vi.fn(), + on: vi.fn(), + set: vi.fn(), + invoke: vi.fn(), + }, + } as unknown as Endpoint + }> + + beforeEach(() => { + const pinia = createPinia() + pinia.use(injectEndpoint(endpoint)) + createApp({ template: '
' }).use(pinia) + setActivePinia(pinia) + + endpoint.call.get = vi.fn() + endpoint.call.on = vi.fn() + endpoint.call.set = vi.fn() + endpoint.call.invoke = vi.fn() + }) + + test('initialize context and validate writable and readonly set paths', async () => { + const schema = { + readonlyValue: { + accepts: (value: unknown): value is number => typeof value === 'number', + defaults: () => 1, + readonly: true, + }, + writableValue: { + accepts: (value: unknown): value is number => typeof value === 'number', + defaults: () => 0, + readonly: false, + }, + } satisfies ContextSchema + + const useCounter = defineContext<'counter', typeof schema>('counter', schema) + const counter = useCounter() + + endpoint.call.get = vi.fn(async () => null) as unknown as typeof endpoint.call.get + await counter.initialize() + + endpoint.call.get = vi.fn(async () => ({ + readonlyValue: 5, + writableValue: 7, + })) as unknown as typeof endpoint.call.get + await counter.initialize() + + expect(endpoint.call.on).toHaveBeenCalled() + expect(counter.readonlyValue).toBe(5) + expect(counter.writableValue).toBe(7) + + counter.set('writableValue', 10) + expect(endpoint.call.set).toHaveBeenCalledWith('counter', 'writableValue', 10, null) + + expect(() => counter.set('readonlyValue' as never, 5 as never)).toThrow('readonly') + expect(() => counter.set('missing' as never, 1 as never)).toThrow('not present') + expect(() => counter.set('writableValue', 'x' as never)).toThrow('Invalid value') + }) + + test('validate defineActions arguments, rejections and result guards', async () => { + const useActions = defineActions('order/card', actionSchema) + const actions = useActions() + + expect((actions as Record).missing).toBeUndefined() + + await expect((actions as unknown as { save (value: string): Promise }).save('x')).rejects.toThrow('Invalid arguments') + + endpoint.call.invoke = vi.fn(async () => ({ + payload: null, + rejection: { message: 'failed' }, + })) + await expect(actions.save(1)).rejects.toThrow('failed') + + endpoint.call.invoke = vi.fn(async () => ({ + payload: 123, + rejection: null, + })) + await expect(actions.save(1)).rejects.toThrow('Invalid result') + + endpoint.call.invoke = vi.fn(async () => ({ + payload: 'ok', + rejection: null, + })) + await expect(actions.save(1)).resolves.toBe('ok') + }) + }) + + describe('remote custom fields', () => { + const endpoint = { + call: { + getCustomSchema: vi.fn(), + onCustomFieldChange: vi.fn(), + setCustomField: vi.fn(), + getCustomDictionary: vi.fn(), + }, + } as unknown as Endpoint + + beforeEach(() => { + const pinia = createPinia() + pinia.use(injectAccessor(endpoint)) + createApp({ template: '
' }).use(pinia) + setActivePinia(pinia) + + endpoint.call.getCustomSchema = vi.fn(async () => customSchema) + endpoint.call.onCustomFieldChange = vi.fn() + endpoint.call.setCustomField = vi.fn() + endpoint.call.getCustomDictionary = vi.fn(async () => []) + }) + + test('validate initialization, readonly and kind-specific value guards in useContext', async () => { + const order = useContext('order') + + expect(() => order.set('string', 'x')).toThrow('not initialized') + + await order.initialize() + + order.set('flag', true) + order.set('date', '2025-01-01') + order.set('datetime', '2025-01-01T00:00:00Z') + order.set('dictionary', 'A') + order.set('multi', ['A', 'B']) + order.set('email', 'a@b.c') + order.set('integer', 10) + order.set('numeric', 10.5) + order.set('string', 'value') + order.set('text', 'text value') + + expect(endpoint.call.setCustomField).toHaveBeenCalled() + + expect(() => order.set('readonly', 'x')).toThrow('not writable') + expect(() => order.set('missing', 'x')).toThrow('does not contain field') + + expect(() => order.set('flag', null as never)).toThrow('Invalid value') + expect(() => order.set('date', 1 as never)).toThrow('Invalid value') + expect(() => order.set('datetime', 1 as never)).toThrow('Invalid value') + expect(() => order.set('dictionary', 1 as never)).toThrow('Invalid value') + expect(() => order.set('multi', ['A', 1] as never)).toThrow('Invalid value') + expect(() => order.set('email', 1 as never)).toThrow('Invalid value') + expect(() => order.set('integer', 10.5 as never)).toThrow('Invalid value') + expect(() => order.set('numeric', 'x' as never)).toThrow('Invalid value') + expect(() => order.set('string', 1 as never)).toThrow('Invalid value') + expect(() => order.set('text', 1 as never)).toThrow('Invalid value') + }) + + test('resolve and reject useDictionary queries through host response', async () => { + const dictionary = useDictionary() + + endpoint.call.getCustomDictionary = vi.fn(async (_code, _params, onReject?: ((r: Rejection) => void) | null) => { + onReject?.({ message: 'failed' }) + return [] + }) + + await expect(dictionary.query('dict')).rejects.toEqual({ message: 'failed' }) + + endpoint.call.getCustomDictionary = vi.fn(async () => [{ code: 'A', text: 'A', cursor: '' }]) + await expect(dictionary.query('dict')).resolves.toEqual([{ code: 'A', text: 'A', cursor: '' }]) + }) + }) +}) diff --git a/packages/v1-contexts/tests/modules-contracts.test.ts b/packages/v1-contexts/tests/modules-contracts.test.ts new file mode 100644 index 0000000..d98d500 --- /dev/null +++ b/packages/v1-contexts/tests/modules-contracts.test.ts @@ -0,0 +1,61 @@ +import * as customerCard from '@/common/customer/card' +import * as customerCardPhone from '@/common/customer/card-phone' +import * as orderCard from '@/common/order/card' +import * as orderCardSettings from '@/common/order/card-settings' +import * as userCurrent from '@/common/user/current' + +import * as orderPredicates from '@/predicates/order/card' + +import * as remoteCustomerCard from '@/remote/customer/card' +import * as remoteCustomerCardPhone from '@/remote/customer/card-phone' +import * as remoteOrderCard from '@/remote/order/card' +import * as remoteOrderCardSettings from '@/remote/order/card-settings' +import * as remoteUserCurrent from '@/remote/user/current' +import * as remoteSettings from '@/remote/settings' + +import { + describe, + expect, + test, +} from 'vitest' + +describe('context module contracts', () => { + test('exports stable ids and schema objects from common modules', () => { + expect(customerCard.id).toBe('customer/card') + expect(customerCardPhone.id).toBe('customer/card:phone') + expect(orderCard.id).toBe('order/card') + expect(orderCardSettings.id).toBe('order/card:settings') + expect(userCurrent.id).toBe('user/current') + + expect(customerCard.schema).toBeTypeOf('object') + expect(customerCardPhone.schema).toBeTypeOf('object') + expect(orderCard.schema).toBeTypeOf('object') + expect(orderCardSettings.schema).toBeTypeOf('object') + expect(userCurrent.schema).toBeTypeOf('object') + }) + + test('exports order predicate guards', () => { + expect(orderPredicates.isDimensions).toBeTypeOf('function') + expect(orderPredicates.isMoney).toBeTypeOf('function') + expect(orderPredicates.isOffer).toBeTypeOf('function') + expect(orderPredicates.isProduct).toBeTypeOf('function') + expect(orderPredicates.isItem).toBeTypeOf('function') + expect(orderPredicates.isCreateOrderItemInput).toBeTypeOf('function') + }) + + test('exports schema and useContext from remote modules', () => { + expect(remoteCustomerCard.schema).toBeTypeOf('object') + expect(remoteCustomerCardPhone.schema).toBeTypeOf('object') + expect(remoteOrderCard.schema).toBeTypeOf('object') + expect(remoteOrderCardSettings.schema).toBeTypeOf('object') + expect(remoteUserCurrent.schema).toBeTypeOf('object') + expect(remoteSettings.schema).toBeTypeOf('object') + + expect(remoteCustomerCard.useContext).toBeTypeOf('function') + expect(remoteCustomerCardPhone.useContext).toBeTypeOf('function') + expect(remoteOrderCard.useContext).toBeTypeOf('function') + expect(remoteOrderCardSettings.useContext).toBeTypeOf('function') + expect(remoteUserCurrent.useContext).toBeTypeOf('function') + expect(remoteSettings.useContext).toBeTypeOf('function') + }) +}) diff --git a/packages/v1-contexts/tests/predicates.test.ts b/packages/v1-contexts/tests/predicates.test.ts index 60c85d2..c4e059d 100644 --- a/packages/v1-contexts/tests/predicates.test.ts +++ b/packages/v1-contexts/tests/predicates.test.ts @@ -1,4 +1,5 @@ import { + isNumeric, isNumber, isShape, isString, @@ -124,4 +125,10 @@ describe('isShape', () => { }, })).toBe(true) }) -}) \ No newline at end of file + + test('validates numeric string predicate', () => { + expect(isNumeric(1)).toBe(true) + expect(isNumeric('1.25')).toBe(true) + expect(isNumeric('abc')).toBe(false) + }) +}) diff --git a/packages/v1-contexts/tests/schema-contracts.test.ts b/packages/v1-contexts/tests/schema-contracts.test.ts new file mode 100644 index 0000000..a02a399 --- /dev/null +++ b/packages/v1-contexts/tests/schema-contracts.test.ts @@ -0,0 +1,70 @@ +import type { ContextSchema } from '@retailcrm/embed-ui-v1-types/context' + +import { + actions as orderActions, + schema as orderSchema, +} from '@/common/order/card' + +import { schema as orderSettingsSchema } from '@/common/order/card-settings' +import { schema as customerSchema } from '@/common/customer/card' +import { schema as customerPhoneSchema } from '@/common/customer/card-phone' +import { schema as userSchema } from '@/common/user/current' + +import { + describe, + expect, + test, +} from 'vitest' + +type FieldDescriptor = { + accepts: (value: unknown) => boolean; + defaults: () => unknown; +} + +const schemaContracts: [string, ContextSchema][] = [ + ['customer', customerSchema], + ['customer phone', customerPhoneSchema], + ['user', userSchema], + ['order settings', orderSettingsSchema], + ['order', orderSchema], +] + +describe('context schema contracts', () => { + test.each(schemaContracts)('keeps %s schema defaults compatible with accepts predicates', (_name, schema) => { + Object.values(schema).forEach((field) => { + const descriptor = field as unknown as FieldDescriptor + const defaults = descriptor.defaults() + + expect(typeof descriptor.accepts(defaults)).toBe('boolean') + expect(typeof descriptor.accepts(undefined)).toBe('boolean') + + if (Array.isArray(defaults)) { + expect(typeof descriptor.accepts([...defaults])).toBe('boolean') + } + }) + }) + + test('keeps order action argument and result predicates executable', () => { + expect(orderActions.createItem.accepts([{ productId: 1, offerId: 2 }])).toBe(true) + expect(orderActions.createItem.expects(10)).toBe(true) + + expect(orderActions.changeItemPrice.accepts([0, 10])).toBe(true) + expect(orderActions.changeItemPrice.expects(undefined)).toBe(true) + + expect(orderActions.changeItemPriceType.accepts([0, null])).toBe(true) + expect(orderActions.changeItemPriceType.expects(undefined)).toBe(true) + + expect(orderActions.changeItemDiscount.accepts([0, { amount: 10 }])).toBe(true) + expect(orderActions.changeItemDiscount.accepts([0, { percent: 15 }])).toBe(true) + expect(orderActions.changeItemDiscount.expects(undefined)).toBe(true) + + expect(orderActions.changeItemQuantity.accepts([0, 2])).toBe(true) + expect(orderActions.changeItemQuantity.expects(undefined)).toBe(true) + + expect(orderActions.changeItemStatus.accepts([0, 'new'])).toBe(true) + expect(orderActions.changeItemStatus.expects(undefined)).toBe(true) + + expect(orderActions.removeItem.accepts([0])).toBe(true) + expect(orderActions.removeItem.expects(undefined)).toBe(true) + }) +}) diff --git a/packages/v1-contexts/tests/settings.test.ts b/packages/v1-contexts/tests/settings.test.ts index 8b67347..39ee7e8 100644 --- a/packages/v1-contexts/tests/settings.test.ts +++ b/packages/v1-contexts/tests/settings.test.ts @@ -40,4 +40,13 @@ test('accepts valid routing data', () => { scheme: 'http', locale: '', })).toBe(true) -}) \ No newline at end of file +}) + +test('executes defaults in settings schema', () => { + expect(schema['image.workers'].defaults()).toEqual([]) + expect(schema['system.locale'].defaults()).toBe('en-GB') + expect(schema['system.routing'].defaults()).toEqual({ + ...routingDataDefaults, + routes: {}, + }) +}) diff --git a/packages/v1-contexts/vitest.config.ts b/packages/v1-contexts/vitest.config.ts index 97b0123..115fa45 100644 --- a/packages/v1-contexts/vitest.config.ts +++ b/packages/v1-contexts/vitest.config.ts @@ -21,7 +21,9 @@ export default mergeConfig(basic, defineConfig({ environment: 'jsdom', coverage: { provider: 'istanbul', - include: ['src/**'], + all: true, + include: ['src/**/*.{ts,tsx,vue}'], + exclude: ['src/**/*.d.ts'], }, }, })) diff --git a/skills/local-ci-simulation/SKILL.md b/skills/local-ci-simulation/SKILL.md new file mode 100644 index 0000000..ab8e653 --- /dev/null +++ b/skills/local-ci-simulation/SKILL.md @@ -0,0 +1,46 @@ +--- +name: local-ci-simulation +description: Simulate GitHub Actions CI locally for this repository by mapping workflow jobs to terminal commands, running phases step-by-step, isolating failing stages, and reporting exact root causes with fix suggestions. Use when CI is red, when validating a fix before push, or when user asks for phased local CI verification. Always propose full simulation first and run it only after explicit user confirmation because it is resource-intensive. +--- + +# Local Ci Simulation + +## Core Policy +- Offer full local CI simulation before running it. +- Start full simulation only after explicit user confirmation. +- Prefer lightweight targeted checks first when user has not requested full run. +- Preserve command order from workflow files and report exact failing phase. + +## Workflow +1. Inspect `.github/workflows/tests.yml` and `.github/workflows/release.yml`. +2. Build a phase list that mirrors CI jobs and step order. +3. Ask whether to run: + - focused mode: failing phase only; + - full mode: all heavy phases sequentially. +4. Run selected phases and stop at first failing command unless user asks to continue. +5. Distinguish non-fatal warnings from fatal errors. +6. Report: + - failing phase name; + - command; + - key error lines; + - minimal fix; + - post-fix recheck commands. + +## Repo Command Map +Use these commands as default simulation phases for this repository: + +```bash +make .yarnrc.yml +yarn install +yarn workspaces foreach -A --topological-dev run build +yarn eslint +yarn test +yarn test:coverage +yarn vitest run -c packages/v1-contexts/vitest.config.ts --typecheck.only --typecheck.checker tsc --typecheck.tsconfig packages/v1-contexts/tsconfig.json +yarn workspace @retailcrm/embed-ui-v1-components run storybook:build +``` + +## Practical Notes +- Re-run the exact failing command after applying a fix. +- Run dependent follow-up checks for confidence (`eslint`, `test`, relevant build/storybook step). +- Mention when output is truncated and provide the most diagnostic lines. diff --git a/skills/local-ci-simulation/agents/openai.yaml b/skills/local-ci-simulation/agents/openai.yaml new file mode 100644 index 0000000..bf7cdf9 --- /dev/null +++ b/skills/local-ci-simulation/agents/openai.yaml @@ -0,0 +1,4 @@ +interface: + display_name: "Local CI Simulation" + short_description: "Simulate CI phases locally and isolate failing steps" + default_prompt: "Analyze CI workflows, propose focused vs full local simulation, and run heavy full simulation only after explicit user confirmation." diff --git a/vitest.config.ts b/vitest.config.ts index 49c4100..aecfded 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -23,7 +23,15 @@ export default defineConfig({ exclude: [...defaultExclude, './packages/**'], coverage: { provider: 'istanbul', - include: ['src/**'], + all: true, + include: [ + 'src/**/*.{ts,tsx,vue}', + 'packages/*/src/**/*.{ts,tsx,vue}', + ], + exclude: [ + 'src/**/*.d.ts', + 'packages/*/src/**/*.d.ts', + ], }, projects: [ '.', diff --git a/yarn.lock b/yarn.lock index daba57f..b759006 100644 --- a/yarn.lock +++ b/yarn.lock @@ -63,6 +63,103 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:^7.28.6, @babel/code-frame@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/code-frame@npm:7.29.0" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.28.5" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.1.1" + checksum: 10/199e15ff89007dd30675655eec52481cb245c9fdf4f81e4dc1f866603b0217b57aff25f5ffa0a95bbc8e31eb861695330cd7869ad52cc211aa63016320ef72c5 + languageName: node + linkType: hard + +"@babel/compat-data@npm:^7.28.6": + version: 7.29.0 + resolution: "@babel/compat-data@npm:7.29.0" + checksum: 10/7f21beedb930ed8fbf7eabafc60e6e6521c1d905646bf1317a61b2163339157fe797efeb85962bf55136e166b01fd1a6b526a15974b92a8b877d564dcb6c9580 + languageName: node + linkType: hard + +"@babel/core@npm:^7.23.9": + version: 7.29.0 + resolution: "@babel/core@npm:7.29.0" + dependencies: + "@babel/code-frame": "npm:^7.29.0" + "@babel/generator": "npm:^7.29.0" + "@babel/helper-compilation-targets": "npm:^7.28.6" + "@babel/helper-module-transforms": "npm:^7.28.6" + "@babel/helpers": "npm:^7.28.6" + "@babel/parser": "npm:^7.29.0" + "@babel/template": "npm:^7.28.6" + "@babel/traverse": "npm:^7.29.0" + "@babel/types": "npm:^7.29.0" + "@jridgewell/remapping": "npm:^2.3.5" + convert-source-map: "npm:^2.0.0" + debug: "npm:^4.1.0" + gensync: "npm:^1.0.0-beta.2" + json5: "npm:^2.2.3" + semver: "npm:^6.3.1" + checksum: 10/25f4e91688cdfbaf1365831f4f245b436cdaabe63d59389b75752013b8d61819ee4257101b52fc328b0546159fd7d0e74457ed7cf12c365fea54be4fb0a40229 + languageName: node + linkType: hard + +"@babel/generator@npm:^7.29.0": + version: 7.29.1 + resolution: "@babel/generator@npm:7.29.1" + dependencies: + "@babel/parser": "npm:^7.29.0" + "@babel/types": "npm:^7.29.0" + "@jridgewell/gen-mapping": "npm:^0.3.12" + "@jridgewell/trace-mapping": "npm:^0.3.28" + jsesc: "npm:^3.0.2" + checksum: 10/61fe4ddd6e817aa312a14963ccdbb5c9a8c57e8b97b98d19a8a99ccab2215fda1a5f52bc8dd8d2e3c064497ddeb3ab8ceb55c76fa0f58f8169c34679d2256fe0 + languageName: node + linkType: hard + +"@babel/helper-compilation-targets@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-compilation-targets@npm:7.28.6" + dependencies: + "@babel/compat-data": "npm:^7.28.6" + "@babel/helper-validator-option": "npm:^7.27.1" + browserslist: "npm:^4.24.0" + lru-cache: "npm:^5.1.1" + semver: "npm:^6.3.1" + checksum: 10/f512a5aeee4dfc6ea8807f521d085fdca8d66a7d068a6dd5e5b37da10a6081d648c0bbf66791a081e4e8e6556758da44831b331540965dfbf4f5275f3d0a8788 + languageName: node + linkType: hard + +"@babel/helper-globals@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/helper-globals@npm:7.28.0" + checksum: 10/91445f7edfde9b65dcac47f4f858f68dc1661bf73332060ab67ad7cc7b313421099a2bfc4bda30c3db3842cfa1e86fffbb0d7b2c5205a177d91b22c8d7d9cb47 + languageName: node + linkType: hard + +"@babel/helper-module-imports@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-module-imports@npm:7.28.6" + dependencies: + "@babel/traverse": "npm:^7.28.6" + "@babel/types": "npm:^7.28.6" + checksum: 10/64b1380d74425566a3c288074d7ce4dea56d775d2d3325a3d4a6df1dca702916c1d268133b6f385de9ba5b822b3c6e2af5d3b11ac88e5453d5698d77264f0ec0 + languageName: node + linkType: hard + +"@babel/helper-module-transforms@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-module-transforms@npm:7.28.6" + dependencies: + "@babel/helper-module-imports": "npm:^7.28.6" + "@babel/helper-validator-identifier": "npm:^7.28.5" + "@babel/traverse": "npm:^7.28.6" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/2e421c7db743249819ee51e83054952709dc2e197c7d5d415b4bdddc718580195704bfcdf38544b3f674efc2eccd4d29a65d38678fc827ed3934a7690984cd8b + languageName: node + linkType: hard + "@babel/helper-string-parser@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-string-parser@npm:7.27.1" @@ -77,6 +174,34 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-option@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-validator-option@npm:7.27.1" + checksum: 10/db73e6a308092531c629ee5de7f0d04390835b21a263be2644276cb27da2384b64676cab9f22cd8d8dbd854c92b1d7d56fc8517cf0070c35d1c14a8c828b0903 + languageName: node + linkType: hard + +"@babel/helpers@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helpers@npm:7.28.6" + dependencies: + "@babel/template": "npm:^7.28.6" + "@babel/types": "npm:^7.28.6" + checksum: 10/213485cdfffc4deb81fc1bf2cefed61bc825049322590ef69690e223faa300a2a4d1e7d806c723bb1f1f538226b9b1b6c356ca94eb47fa7c6d9e9f251ee425e6 + languageName: node + linkType: hard + +"@babel/parser@npm:^7.23.9, @babel/parser@npm:^7.28.6, @babel/parser@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/parser@npm:7.29.0" + dependencies: + "@babel/types": "npm:^7.29.0" + bin: + parser: ./bin/babel-parser.js + checksum: 10/b1576dca41074997a33ee740d87b330ae2e647f4b7da9e8d2abd3772b18385d303b0cee962b9b88425e0f30d58358dbb8d63792c1a2d005c823d335f6a029747 + languageName: node + linkType: hard + "@babel/parser@npm:^7.24.7, @babel/parser@npm:^7.28.5, @babel/parser@npm:^7.6.0, @babel/parser@npm:^7.9.6": version: 7.28.5 resolution: "@babel/parser@npm:7.28.5" @@ -88,6 +213,32 @@ __metadata: languageName: node linkType: hard +"@babel/template@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/template@npm:7.28.6" + dependencies: + "@babel/code-frame": "npm:^7.28.6" + "@babel/parser": "npm:^7.28.6" + "@babel/types": "npm:^7.28.6" + checksum: 10/0ad6e32bf1e7e31bf6b52c20d15391f541ddd645cbd488a77fe537a15b280ee91acd3a777062c52e03eedbc2e1f41548791f6a3697c02476ec5daf49faa38533 + languageName: node + linkType: hard + +"@babel/traverse@npm:^7.28.6, @babel/traverse@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/traverse@npm:7.29.0" + dependencies: + "@babel/code-frame": "npm:^7.29.0" + "@babel/generator": "npm:^7.29.0" + "@babel/helper-globals": "npm:^7.28.0" + "@babel/parser": "npm:^7.29.0" + "@babel/template": "npm:^7.28.6" + "@babel/types": "npm:^7.29.0" + debug: "npm:^4.3.1" + checksum: 10/3a0d0438f1ba9fed4fbe1706ea598a865f9af655a16ca9517ab57bda526e224569ca1b980b473fb68feea5e08deafbbf2cf9febb941f92f2d2533310c3fc4abc + languageName: node + linkType: hard + "@babel/types@npm:^7.24.7, @babel/types@npm:^7.28.5, @babel/types@npm:^7.6.1, @babel/types@npm:^7.9.6": version: 7.28.5 resolution: "@babel/types@npm:7.28.5" @@ -98,6 +249,16 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.28.6, @babel/types@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/types@npm:7.29.0" + dependencies: + "@babel/helper-string-parser": "npm:^7.27.1" + "@babel/helper-validator-identifier": "npm:^7.28.5" + checksum: 10/bfc2b211210f3894dcd7e6a33b2d1c32c93495dc1e36b547376aa33441abe551ab4bc1640d4154ee2acd8e46d3bbc925c7224caae02fcaf0e6a771e97fccc661 + languageName: node + linkType: hard + "@conventional-changelog/git-client@npm:^1.0.0": version: 1.0.1 resolution: "@conventional-changelog/git-client@npm:1.0.1" @@ -809,6 +970,13 @@ __metadata: languageName: node linkType: hard +"@istanbuljs/schema@npm:^0.1.3": + version: 0.1.3 + resolution: "@istanbuljs/schema@npm:0.1.3" + checksum: 10/a9b1e49acdf5efc2f5b2359f2df7f90c5c725f2656f16099e8b2cd3a000619ecca9fc48cf693ba789cf0fd989f6e0df6a22bc05574be4223ecdbb7997d04384b + languageName: node + linkType: hard + "@johnsoncodehk/pug-beautify@npm:^0.2.2": version: 0.2.2 resolution: "@johnsoncodehk/pug-beautify@npm:0.2.2" @@ -816,7 +984,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.5": +"@jridgewell/gen-mapping@npm:^0.3.12, @jridgewell/gen-mapping@npm:^0.3.13, @jridgewell/gen-mapping@npm:^0.3.5": version: 0.3.13 resolution: "@jridgewell/gen-mapping@npm:0.3.13" dependencies: @@ -850,7 +1018,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.24": +"@jridgewell/trace-mapping@npm:0.3.31, @jridgewell/trace-mapping@npm:^0.3.23, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.28": version: 0.3.31 resolution: "@jridgewell/trace-mapping@npm:0.3.31" dependencies: @@ -1112,6 +1280,7 @@ __metadata: "@types/semver": "npm:^7.7.1" "@types/yargs": "npm:^17.0.35" "@vitejs/plugin-vue": "npm:^6.0.2" + "@vitest/coverage-istanbul": "npm:4.0.15" "@vue/language-server": "npm:^3.1.8" "@vue/test-utils": "npm:^2.4.6" chalk: "npm:^5.3.0" @@ -1888,6 +2057,27 @@ __metadata: languageName: node linkType: hard +"@vitest/coverage-istanbul@npm:4.0.15": + version: 4.0.15 + resolution: "@vitest/coverage-istanbul@npm:4.0.15" + dependencies: + "@istanbuljs/schema": "npm:^0.1.3" + "@jridgewell/gen-mapping": "npm:^0.3.13" + "@jridgewell/trace-mapping": "npm:0.3.31" + istanbul-lib-coverage: "npm:^3.2.2" + istanbul-lib-instrument: "npm:^6.0.3" + istanbul-lib-report: "npm:^3.0.1" + istanbul-lib-source-maps: "npm:^5.0.6" + istanbul-reports: "npm:^3.2.0" + magicast: "npm:^0.5.1" + obug: "npm:^2.1.1" + tinyrainbow: "npm:^3.0.3" + peerDependencies: + vitest: 4.0.15 + checksum: 10/d6e83bfedb1859cddb586928af879efc1dbe544cd1a7a8b4e5a46da98c007e6416aa49ea68a3492159edede2e431daf7cc75e99b3542273bacf8a85b4455546c + languageName: node + linkType: hard + "@vitest/expect@npm:3.2.4": version: 3.2.4 resolution: "@vitest/expect@npm:3.2.4" @@ -2738,6 +2928,15 @@ __metadata: languageName: node linkType: hard +"baseline-browser-mapping@npm:^2.9.0": + version: 2.9.19 + resolution: "baseline-browser-mapping@npm:2.9.19" + bin: + baseline-browser-mapping: dist/cli.js + checksum: 10/8d7bbb7fe3d1ad50e04b127c819ba6d059c01ed0d2a7a5fc3327e23a8c42855fa3a8b510550c1fe1e37916147e6a390243566d3ef85bf6130c8ddfe5cc3db530 + languageName: node + linkType: hard + "bidi-js@npm:^1.0.3": version: 1.0.3 resolution: "bidi-js@npm:1.0.3" @@ -2787,6 +2986,21 @@ __metadata: languageName: node linkType: hard +"browserslist@npm:^4.24.0": + version: 4.28.1 + resolution: "browserslist@npm:4.28.1" + dependencies: + baseline-browser-mapping: "npm:^2.9.0" + caniuse-lite: "npm:^1.0.30001759" + electron-to-chromium: "npm:^1.5.263" + node-releases: "npm:^2.0.27" + update-browserslist-db: "npm:^1.2.0" + bin: + browserslist: cli.js + checksum: 10/64f2a97de4bce8473c0e5ae0af8d76d1ead07a5b05fc6bc87b848678bb9c3a91ae787b27aa98cdd33fc00779607e6c156000bed58fefb9cf8e4c5a183b994cdb + languageName: node + linkType: hard + "bundle-name@npm:^4.1.0": version: 4.1.0 resolution: "bundle-name@npm:4.1.0" @@ -2874,6 +3088,13 @@ __metadata: languageName: node linkType: hard +"caniuse-lite@npm:^1.0.30001759": + version: 1.0.30001769 + resolution: "caniuse-lite@npm:1.0.30001769" + checksum: 10/4b7d087832d4330a8b1fa02cd9455bdb068ea67f1735f2aa6324d5b64b24f5079cf6349b13d209f268ffa59644b9f4f784266b780bafd877ceb83c9797ca80ba + languageName: node + linkType: hard + "ccount@npm:^2.0.0": version: 2.0.1 resolution: "ccount@npm:2.0.1" @@ -3222,6 +3443,13 @@ __metadata: languageName: node linkType: hard +"convert-source-map@npm:^2.0.0": + version: 2.0.0 + resolution: "convert-source-map@npm:2.0.0" + checksum: 10/c987be3ec061348cdb3c2bfb924bec86dea1eacad10550a85ca23edb0fe3556c3a61c7399114f3331ccb3499d7fd0285ab24566e5745929412983494c3926e15 + languageName: node + linkType: hard + "copy-anything@npm:^2.0.1": version: 2.0.6 resolution: "copy-anything@npm:2.0.6" @@ -3515,6 +3743,18 @@ __metadata: languageName: node linkType: hard +"debug@npm:^4.1.0, debug@npm:^4.1.1": + version: 4.4.3 + resolution: "debug@npm:4.4.3" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10/9ada3434ea2993800bd9a1e320bd4aa7af69659fb51cca685d390949434bc0a8873c21ed7c9b852af6f2455a55c6d050aa3937d52b3c69f796dab666f762acad + languageName: node + linkType: hard + "decimal.js@npm:^10.6.0": version: 10.6.0 resolution: "decimal.js@npm:10.6.0" @@ -3761,6 +4001,13 @@ __metadata: languageName: node linkType: hard +"electron-to-chromium@npm:^1.5.263": + version: 1.5.286 + resolution: "electron-to-chromium@npm:1.5.286" + checksum: 10/530ae36571f3f737431dc1f97ab176d9ec38d78e7a14a78fff78540769ef139e9011200a886864111ee26d64e647136531ff004f368f5df8cdd755c45ad97649 + languageName: node + linkType: hard + "electron-to-chromium@npm:^1.5.41": version: 1.5.63 resolution: "electron-to-chromium@npm:1.5.63" @@ -4696,6 +4943,13 @@ __metadata: languageName: node linkType: hard +"gensync@npm:^1.0.0-beta.2": + version: 1.0.0-beta.2 + resolution: "gensync@npm:1.0.0-beta.2" + checksum: 10/17d8333460204fbf1f9160d067e1e77f908a5447febb49424b8ab043026049835c9ef3974445c57dbd39161f4d2b04356d7de12b2eecaa27a7a7ea7d871cbedd + languageName: node + linkType: hard + "get-caller-file@npm:^2.0.5": version: 2.0.5 resolution: "get-caller-file@npm:2.0.5" @@ -5012,6 +5266,13 @@ __metadata: languageName: node linkType: hard +"html-escaper@npm:^2.0.0": + version: 2.0.2 + resolution: "html-escaper@npm:2.0.2" + checksum: 10/034d74029dcca544a34fb6135e98d427acd73019796ffc17383eaa3ec2fe1c0471dcbbc8f8ed39e46e86d43ccd753a160631615e4048285e313569609b66d5b7 + languageName: node + linkType: hard + "http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" @@ -5479,6 +5740,58 @@ __metadata: languageName: node linkType: hard +"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0, istanbul-lib-coverage@npm:^3.2.2": + version: 3.2.2 + resolution: "istanbul-lib-coverage@npm:3.2.2" + checksum: 10/40bbdd1e937dfd8c830fa286d0f665e81b7a78bdabcd4565f6d5667c99828bda3db7fb7ac6b96a3e2e8a2461ddbc5452d9f8bc7d00cb00075fa6a3e99f5b6a81 + languageName: node + linkType: hard + +"istanbul-lib-instrument@npm:^6.0.3": + version: 6.0.3 + resolution: "istanbul-lib-instrument@npm:6.0.3" + dependencies: + "@babel/core": "npm:^7.23.9" + "@babel/parser": "npm:^7.23.9" + "@istanbuljs/schema": "npm:^0.1.3" + istanbul-lib-coverage: "npm:^3.2.0" + semver: "npm:^7.5.4" + checksum: 10/aa5271c0008dfa71b6ecc9ba1e801bf77b49dc05524e8c30d58aaf5b9505e0cd12f25f93165464d4266a518c5c75284ecb598fbd89fec081ae77d2c9d3327695 + languageName: node + linkType: hard + +"istanbul-lib-report@npm:^3.0.0, istanbul-lib-report@npm:^3.0.1": + version: 3.0.1 + resolution: "istanbul-lib-report@npm:3.0.1" + dependencies: + istanbul-lib-coverage: "npm:^3.0.0" + make-dir: "npm:^4.0.0" + supports-color: "npm:^7.1.0" + checksum: 10/86a83421ca1cf2109a9f6d193c06c31ef04a45e72a74579b11060b1e7bb9b6337a4e6f04abfb8857e2d569c271273c65e855ee429376a0d7c91ad91db42accd1 + languageName: node + linkType: hard + +"istanbul-lib-source-maps@npm:^5.0.6": + version: 5.0.6 + resolution: "istanbul-lib-source-maps@npm:5.0.6" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.23" + debug: "npm:^4.1.1" + istanbul-lib-coverage: "npm:^3.0.0" + checksum: 10/569dd0a392ee3464b1fe1accbaef5cc26de3479eacb5b91d8c67ebb7b425d39fd02247d85649c3a0e9c29b600809fa60b5af5a281a75a89c01f385b1e24823a2 + languageName: node + linkType: hard + +"istanbul-reports@npm:^3.2.0": + version: 3.2.0 + resolution: "istanbul-reports@npm:3.2.0" + dependencies: + html-escaper: "npm:^2.0.0" + istanbul-lib-report: "npm:^3.0.0" + checksum: 10/6773a1d5c7d47eeec75b317144fe2a3b1da84a44b6282bebdc856e09667865e58c9b025b75b3d87f5bc62939126cbba4c871ee84254537d934ba5da5d4c4ec4e + languageName: node + linkType: hard + "jackspeak@npm:^3.1.2": version: 3.4.3 resolution: "jackspeak@npm:3.4.3" @@ -5597,6 +5910,15 @@ __metadata: languageName: node linkType: hard +"jsesc@npm:^3.0.2": + version: 3.1.0 + resolution: "jsesc@npm:3.1.0" + bin: + jsesc: bin/jsesc + checksum: 10/20bd37a142eca5d1794f354db8f1c9aeb54d85e1f5c247b371de05d23a9751ecd7bd3a9c4fc5298ea6fa09a100dafb4190fa5c98c6610b75952c3487f3ce7967 + languageName: node + linkType: hard + "json-buffer@npm:3.0.1": version: 3.0.1 resolution: "json-buffer@npm:3.0.1" @@ -5636,6 +5958,15 @@ __metadata: languageName: node linkType: hard +"json5@npm:^2.2.3": + version: 2.2.3 + resolution: "json5@npm:2.2.3" + bin: + json5: lib/cli.js + checksum: 10/1db67b853ff0de3534085d630691d3247de53a2ed1390ba0ddff681ea43e9b3e30ecbdb65c5e9aab49435e44059c23dbd6fee8ee619419ba37465bb0dd7135da + languageName: node + linkType: hard + "jsonc-parser@npm:^2.3.0": version: 2.3.1 resolution: "jsonc-parser@npm:2.3.1" @@ -5835,6 +6166,15 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^5.1.1": + version: 5.1.1 + resolution: "lru-cache@npm:5.1.1" + dependencies: + yallist: "npm:^3.0.2" + checksum: 10/951d2673dcc64a7fb888bf3d13bc2fdf923faca97d89cdb405ba3dfff77e2b26e5798d405e78fcd7094c9e7b8b4dab2ddc5a4f8a11928af24a207b7c738ca3f8 + languageName: node + linkType: hard + "lru-cache@npm:^6.0.0": version: 6.0.0 resolution: "lru-cache@npm:6.0.0" @@ -5860,6 +6200,17 @@ __metadata: languageName: node linkType: hard +"magicast@npm:^0.5.1": + version: 0.5.2 + resolution: "magicast@npm:0.5.2" + dependencies: + "@babel/parser": "npm:^7.29.0" + "@babel/types": "npm:^7.29.0" + source-map-js: "npm:^1.2.1" + checksum: 10/724d47bfa70cc5046992cf6defae51a3cb701307b35e5637faede1b109fb19ccb47d3f3886df569f5b1281deb6a1ae6993f4542e7c7c6312f70d7be0f4194833 + languageName: node + linkType: hard + "make-dir@npm:^2.1.0": version: 2.1.0 resolution: "make-dir@npm:2.1.0" @@ -5870,6 +6221,15 @@ __metadata: languageName: node linkType: hard +"make-dir@npm:^4.0.0": + version: 4.0.0 + resolution: "make-dir@npm:4.0.0" + dependencies: + semver: "npm:^7.5.3" + checksum: 10/bf0731a2dd3aab4db6f3de1585cea0b746bb73eb5a02e3d8d72757e376e64e6ada190b1eddcde5b2f24a81b688a9897efd5018737d05e02e2a671dda9cff8a8a + languageName: node + linkType: hard + "make-fetch-happen@npm:^13.0.0": version: 13.0.1 resolution: "make-fetch-happen@npm:13.0.1" @@ -6676,6 +7036,13 @@ __metadata: languageName: node linkType: hard +"node-releases@npm:^2.0.27": + version: 2.0.27 + resolution: "node-releases@npm:2.0.27" + checksum: 10/f6c78ddb392ae500719644afcbe68a9ea533242c02312eb6a34e8478506eb7482a3fb709c70235b01c32fe65625b68dfa9665113f816d87f163bc3819b62b106 + languageName: node + linkType: hard + "nopt@npm:^7.0.0, nopt@npm:^7.2.0": version: 7.2.1 resolution: "nopt@npm:7.2.1" @@ -8973,6 +9340,20 @@ __metadata: languageName: node linkType: hard +"update-browserslist-db@npm:^1.2.0": + version: 1.2.3 + resolution: "update-browserslist-db@npm:1.2.3" + dependencies: + escalade: "npm:^3.2.0" + picocolors: "npm:^1.1.1" + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: 10/059f774300efb4b084a49293143c511f3ae946d40397b5c30914e900cd5691a12b8e61b41dd54ed73d3b56c8204165a0333107dd784ccf8f8c81790bcc423175 + languageName: node + linkType: hard + "uri-js@npm:^4.2.2, uri-js@npm:^4.4.1": version: 4.4.1 resolution: "uri-js@npm:4.4.1" @@ -9771,6 +10152,13 @@ __metadata: languageName: node linkType: hard +"yallist@npm:^3.0.2": + version: 3.1.1 + resolution: "yallist@npm:3.1.1" + checksum: 10/9af0a4329c3c6b779ac4736c69fae4190ac03029fa27c1aef4e6bcc92119b73dea6fe5db5fe881fb0ce2a0e9539a42cdf60c7c21eda04d1a0b8c082e38509efb + languageName: node + linkType: hard + "yallist@npm:^4.0.0": version: 4.0.0 resolution: "yallist@npm:4.0.0"