diff --git a/code/jest.config.js b/code/jest.config.js index 0e444db10997..3c8ad1dffc43 100644 --- a/code/jest.config.js +++ b/code/jest.config.js @@ -49,6 +49,7 @@ module.exports = { '/examples/*/src/*/*/*.*', // TODO: Can not get svelte-jester to work, but also not necessary for this test, as it is run by tsc/svelte-check. '/renderers/svelte/src/public-types.test.ts', + '/renderers/vue3/src/public-types.test.ts', ], collectCoverage: false, collectCoverageFrom: [ diff --git a/code/package.json b/code/package.json index 7c93c44e5160..16a522bb9f68 100644 --- a/code/package.json +++ b/code/package.json @@ -339,6 +339,9 @@ "window-size": "^1.1.1", "zx": "^7.0.3" }, + "devDependencies": { + "expect-type": "^0.14.2" + }, "dependenciesMeta": { "@compodoc/compodoc": { "built": false diff --git a/code/renderers/vue3/package.json b/code/renderers/vue3/package.json index ce800baa58d1..4f8f32b704da 100644 --- a/code/renderers/vue3/package.json +++ b/code/renderers/vue3/package.json @@ -46,7 +46,7 @@ "*.d.ts" ], "scripts": { - "check": "../../../scripts/node_modules/.bin/tsc --noEmit", + "check": "vue-tsc --noEmit", "prep": "../../../scripts/prepare/bundle.ts" }, "dependencies": { @@ -58,12 +58,14 @@ "global": "^4.4.0", "react": "16.14.0", "react-dom": "16.14.0", - "ts-dedent": "^2.0.0" + "ts-dedent": "^2.0.0", + "type-fest": "2.19.0" }, "devDependencies": { "@digitak/esrun": "^3.2.2", "typescript": "~4.6.3", - "vue": "^3.0.0" + "vue": "^3.2.41", + "vue-tsc": "^1.0.8" }, "peerDependencies": { "@babel/core": "*", diff --git a/code/renderers/vue3/src/__tests__/Button.vue b/code/renderers/vue3/src/__tests__/Button.vue new file mode 100644 index 000000000000..322ac2c73921 --- /dev/null +++ b/code/renderers/vue3/src/__tests__/Button.vue @@ -0,0 +1,16 @@ + + + + + diff --git a/code/renderers/vue3/src/__tests__/Decorator.vue b/code/renderers/vue3/src/__tests__/Decorator.vue new file mode 100644 index 000000000000..953c1db7dbe1 --- /dev/null +++ b/code/renderers/vue3/src/__tests__/Decorator.vue @@ -0,0 +1,8 @@ + + + diff --git a/code/renderers/vue3/src/__tests__/Decorator2.vue b/code/renderers/vue3/src/__tests__/Decorator2.vue new file mode 100644 index 000000000000..19a016aa50ac --- /dev/null +++ b/code/renderers/vue3/src/__tests__/Decorator2.vue @@ -0,0 +1,8 @@ + + + diff --git a/code/renderers/vue3/src/decorateStory.ts b/code/renderers/vue3/src/decorateStory.ts index 7cbbe47b7b90..edaa0652d8a5 100644 --- a/code/renderers/vue3/src/decorateStory.ts +++ b/code/renderers/vue3/src/decorateStory.ts @@ -46,7 +46,7 @@ export function decorateStory( ): LegacyStoryFn { return decorators.reduce( (decorated: LegacyStoryFn, decorator) => (context: StoryContext) => { - let story: VueFramework['storyResult']; + let story: VueFramework['storyResult'] | undefined; const decoratedStory: VueFramework['storyResult'] = decorator((update) => { story = decorated({ ...context, ...sanitizeStoryContextUpdate(update) }); diff --git a/code/renderers/vue3/src/public-types.test.ts b/code/renderers/vue3/src/public-types.test.ts new file mode 100644 index 000000000000..293c2db48e4a --- /dev/null +++ b/code/renderers/vue3/src/public-types.test.ts @@ -0,0 +1,192 @@ +import { satisfies } from '@storybook/core-common'; +import { ComponentAnnotations, StoryAnnotations } from '@storybook/csf'; +import { expectTypeOf } from 'expect-type'; +import { SetOptional } from 'type-fest'; +import { ComponentOptions, FunctionalComponent, h } from 'vue'; +import Button from './__tests__/Button.vue'; +import Decorator2TsVue from './__tests__/Decorator2.vue'; +import DecoratorTsVue from './__tests__/Decorator.vue'; +import { DecoratorFn, Meta, StoryObj } from './public-types'; +import { VueFramework } from './types'; + +describe('Meta', () => { + test('Generic parameter of Meta can be a component', () => { + const meta: Meta = { + component: Button, + args: { label: 'good', disabled: false }, + }; + + expectTypeOf(meta).toEqualTypeOf< + ComponentAnnotations< + VueFramework, + { + readonly disabled: boolean; + readonly label: string; + onMyChangeEvent?: (id: number) => any; + onMyClickEvent?: (id: number) => any; + } + > + >(); + }); + + test('Generic parameter of Meta can be the props of the component', () => { + const meta: Meta<{ disabled: boolean; label: string }> = { + component: Button, + args: { label: 'good', disabled: false }, + }; + + expectTypeOf(meta).toEqualTypeOf< + ComponentAnnotations + >(); + }); + + test('Events are inferred from component', () => { + const meta: Meta = { + component: Button, + args: { + label: 'good', + disabled: false, + onMyChangeEvent: (value) => { + expectTypeOf(value).toEqualTypeOf(); + }, + }, + render: (args) => { + return h(Button, { + ...args, + onMyChangeEvent: (value) => { + expectTypeOf(value).toEqualTypeOf(); + }, + }); + }, + }; + }); +}); + +describe('StoryObj', () => { + type ButtonProps = { + readonly disabled: boolean; + readonly label: string; + onMyChangeEvent?: ((id: number) => any) | undefined; + onMyClickEvent?: ((id: number) => any) | undefined; + }; + + test('✅ Required args may be provided partial in meta and the story', () => { + const meta = satisfies>()({ + component: Button, + args: { label: 'good' }, + }); + + type Actual = StoryObj; + type Expected = StoryAnnotations>; + expectTypeOf().toEqualTypeOf(); + }); + + test('❌ The combined shape of meta args and story args must match the required args.', () => { + { + const meta = satisfies>()({ component: Button }); + + type Expected = StoryAnnotations; + expectTypeOf>().toEqualTypeOf(); + } + { + const meta = satisfies>()({ + component: Button, + args: { label: 'good' }, + }); + // @ts-expect-error disabled not provided ❌ + const Basic: StoryObj = {}; + + type Expected = StoryAnnotations< + VueFramework, + ButtonProps, + SetOptional + >; + expectTypeOf(Basic).toEqualTypeOf(); + } + { + const meta = satisfies>()({ component: Button }); + const Basic: StoryObj = { + // @ts-expect-error disabled not provided ❌ + args: { label: 'good' }, + }; + + type Expected = StoryAnnotations; + expectTypeOf(Basic).toEqualTypeOf(); + } + }); + + test('Component can be used as generic parameter for StoryObj', () => { + expectTypeOf>().toEqualTypeOf< + StoryAnnotations + >(); + }); +}); + +type ThemeData = 'light' | 'dark'; + +type ComponentProps = Component extends ComponentOptions + ? P + : Component extends FunctionalComponent + ? P + : never; + +describe('Story args can be inferred', () => { + test('Correct args are inferred when type is widened for render function', () => { + type Props = ComponentProps & { theme: ThemeData }; + + const meta = satisfies>()({ + component: Button, + args: { disabled: false }, + render: (args) => { + return h('div', [h('div', `Use the theme ${args.theme}`), h(Button, args)]); + }, + }); + + const Basic: StoryObj = { args: { theme: 'light', label: 'good' } }; + + type Expected = StoryAnnotations>; + expectTypeOf(Basic).toEqualTypeOf(); + }); + + const withDecorator: DecoratorFn<{ decoratorArg: string }> = ( + storyFn, + { args: { decoratorArg } } + ) => h(DecoratorTsVue, { decoratorArg }, h(storyFn())); + + test('Correct args are inferred when type is widened for decorators', () => { + type Props = ComponentProps & { decoratorArg: string }; + + const meta = satisfies>()({ + component: Button, + args: { disabled: false }, + decorators: [withDecorator], + }); + + const Basic: StoryObj = { args: { decoratorArg: 'title', label: 'good' } }; + + type Expected = StoryAnnotations>; + expectTypeOf(Basic).toEqualTypeOf(); + }); + + test('Correct args are inferred when type is widened for multiple decorators', () => { + type Props = ComponentProps & { decoratorArg: string; decoratorArg2: string }; + + const secondDecorator: DecoratorFn<{ decoratorArg2: string }> = ( + storyFn, + { args: { decoratorArg2 } } + ) => h(Decorator2TsVue, { decoratorArg2 }, h(storyFn())); + + const meta = satisfies>()({ + component: Button, + args: { disabled: false }, + decorators: [withDecorator, secondDecorator], + }); + + const Basic: StoryObj = { + args: { decoratorArg: '', decoratorArg2: '', label: 'good' }, + }; + + type Expected = StoryAnnotations>; + expectTypeOf(Basic).toEqualTypeOf(); + }); +}); diff --git a/code/renderers/vue3/src/public-types.ts b/code/renderers/vue3/src/public-types.ts index 7d1185e6ca6f..2d9aaf9e3834 100644 --- a/code/renderers/vue3/src/public-types.ts +++ b/code/renderers/vue3/src/public-types.ts @@ -3,7 +3,12 @@ import type { ComponentAnnotations, StoryAnnotations, AnnotatedStoryFn, + ArgsStoryFn, + ArgsFromMeta, + DecoratorFunction, } from '@storybook/csf'; +import { SetOptional, Simplify } from 'type-fest'; +import { ComponentOptions, ConcreteComponent, FunctionalComponent } from 'vue'; import { VueFramework } from './types'; export type { Args, ArgTypes, Parameters, StoryContext } from '@storybook/csf'; @@ -13,7 +18,9 @@ export type { Args, ArgTypes, Parameters, StoryContext } from '@storybook/csf'; * * @see [Default export](https://storybook.js.org/docs/formats/component-story-format/#default-export) */ -export type Meta = ComponentAnnotations; +export type Meta = CmpOrArgs extends ComponentOptions + ? ComponentAnnotations + : ComponentAnnotations; /** * Story function that represents a CSFv2 component example. @@ -27,11 +34,35 @@ export type StoryFn = AnnotatedStoryFn; * * @see [Named Story exports](https://storybook.js.org/docs/formats/component-story-format/#named-story-exports) */ -export type StoryObj = StoryAnnotations; +export type StoryObj = MetaOrCmpOrArgs extends { + render?: ArgsStoryFn; + component?: infer Component; + args?: infer DefaultArgs; +} + ? Simplify< + ComponentProps & ArgsFromMeta + > extends infer TArgs + ? StoryAnnotations< + VueFramework, + TArgs, + SetOptional> + > + : never + : MetaOrCmpOrArgs extends ConcreteComponent + ? StoryAnnotations> + : StoryAnnotations; +type ComponentProps = Component extends ComponentOptions + ? P + : Component extends FunctionalComponent + ? P + : unknown; /** + * @deprecated Use `StoryObj` instead. * Story function that represents a CSFv3 component example. * * @see [Named Story exports](https://storybook.js.org/docs/formats/component-story-format/#named-story-exports) */ export type Story = StoryObj; + +export type DecoratorFn = DecoratorFunction; diff --git a/code/renderers/vue3/src/render.ts b/code/renderers/vue3/src/render.ts index f6e08da07c64..c5edf8d7a207 100644 --- a/code/renderers/vue3/src/render.ts +++ b/code/renderers/vue3/src/render.ts @@ -13,8 +13,7 @@ export const render: ArgsStoryFn = (props, context) => { ); } - // TODO remove this hack - return h(Component as Parameters[0], props); + return h(Component, props); }; let setupFunction = (app: any) => {}; @@ -40,7 +39,7 @@ export function renderToDOM( return h(element); }, }); - storybookApp.config.errorHandler = showException; + storybookApp.config.errorHandler = (e: unknown) => showException(e as Error); element = storyFn(); if (!element) { @@ -56,9 +55,7 @@ export function renderToDOM( showMain(); - if (map.has(domElement)) { - map.get(domElement).unmount(); - } + map.get(domElement)?.unmount(); storybookApp.mount(domElement); } diff --git a/code/renderers/vue3/src/types.ts b/code/renderers/vue3/src/types.ts index 1a7f5ee9500c..6042c0b002d3 100644 --- a/code/renderers/vue3/src/types.ts +++ b/code/renderers/vue3/src/types.ts @@ -1,4 +1,4 @@ -import type { StoryContext as StoryContextBase } from '@storybook/csf'; +import type { AnyFramework, StoryContext as StoryContextBase } from '@storybook/csf'; import type { ConcreteComponent } from 'vue'; export type { RenderContext } from '@storybook/core-client'; @@ -12,7 +12,9 @@ export type StoryFnVueReturnType = ConcreteComponent; export type StoryContext = StoryContextBase; -export type VueFramework = { - component: ConcreteComponent; +export interface VueFramework extends AnyFramework { + // We are omitting props, as we don't use it internally, and more importantly, it completely changes the assignability of meta.component. + // Try not omitting, and check the type errros in the test file, if you want to learn more. + component: Omit, 'props'>; storyResult: StoryFnVueReturnType; -}; +} diff --git a/code/renderers/vue3/tsconfig.json b/code/renderers/vue3/tsconfig.json index a9b035c99817..e64d6d3146b4 100644 --- a/code/renderers/vue3/tsconfig.json +++ b/code/renderers/vue3/tsconfig.json @@ -1,9 +1,10 @@ { "extends": "../../tsconfig.json", "compilerOptions": { + "strict": true, "resolveJsonModule": true, "skipLibCheck": true }, - "include": ["src/**/*"], - "exclude": ["src/**/*.test.*"] + "include": ["src/**/*", "src/**/*.vue"], + "exclude": [] } diff --git a/code/yarn.lock b/code/yarn.lock index 2770b8574918..dfe6af5b6e70 100644 --- a/code/yarn.lock +++ b/code/yarn.lock @@ -7540,6 +7540,7 @@ __metadata: eslint-plugin-storybook: ^0.6.4 esm: ^3.2.25 execa: ^5.0.0 + expect-type: ^0.14.2 express: ^4.17.1 fs-extra: ^9.0.1 github-release-from-changelog: ^2.1.1 @@ -8044,8 +8045,10 @@ __metadata: react: 16.14.0 react-dom: 16.14.0 ts-dedent: ^2.0.0 + type-fest: 2.19.0 typescript: ~4.6.3 - vue: ^3.0.0 + vue: ^3.2.41 + vue-tsc: ^1.0.8 peerDependencies: "@babel/core": "*" babel-loader: ^7.0.0 || ^8.0.0 @@ -9704,6 +9707,61 @@ __metadata: languageName: node linkType: hard +"@volar/language-core@npm:1.0.8": + version: 1.0.8 + resolution: "@volar/language-core@npm:1.0.8" + dependencies: + "@volar/source-map": 1.0.8 + "@vue/reactivity": ^3.2.40 + muggle-string: ^0.1.0 + checksum: e190b36e427075ac26f1b93064dc5982f6cd45c5fde2b32604db329c4ec4352f87a45b88a37fff3b2663d3f4ecb6ba63155d69f45374622492e6b99073c6f2a7 + languageName: node + linkType: hard + +"@volar/source-map@npm:1.0.8": + version: 1.0.8 + resolution: "@volar/source-map@npm:1.0.8" + dependencies: + muggle-string: ^0.1.0 + checksum: 65c8566c3de6a5e23a80c2df2f63b1c06d2eb1f5af2a6f20cd1c81029626f230c49e514acb7e8907c22e488b788c2da56ff8f44aa7c0b02be01bae5fa1c85ecb + languageName: node + linkType: hard + +"@volar/typescript@npm:1.0.8": + version: 1.0.8 + resolution: "@volar/typescript@npm:1.0.8" + dependencies: + "@volar/language-core": 1.0.8 + checksum: e955d741116a8cac06cff8dd50bac576f8d65df54734cb62dcc422c4de910e3efd189783423c5005d2b609cc5ae519fa816d6b4cf51b9947e3b6cb87522f9a56 + languageName: node + linkType: hard + +"@volar/vue-language-core@npm:1.0.8": + version: 1.0.8 + resolution: "@volar/vue-language-core@npm:1.0.8" + dependencies: + "@volar/language-core": 1.0.8 + "@volar/source-map": 1.0.8 + "@vue/compiler-dom": ^3.2.40 + "@vue/compiler-sfc": ^3.2.40 + "@vue/reactivity": ^3.2.40 + "@vue/shared": ^3.2.40 + minimatch: ^5.1.0 + vue-template-compiler: ^2.7.10 + checksum: 9d927267ea3de0f96513c4ff4b09e8dfacca676c3e628fac4fe4327ac497a14850a8a1dcab709ea443eb998269faecf18d38c25124d6c2e70fb5d54574959092 + languageName: node + linkType: hard + +"@volar/vue-typescript@npm:1.0.8": + version: 1.0.8 + resolution: "@volar/vue-typescript@npm:1.0.8" + dependencies: + "@volar/typescript": 1.0.8 + "@volar/vue-language-core": 1.0.8 + checksum: 7d51290ef6e3e9d3adfc9584296e7264921fda6e7ade4a3964f8679a3d4a4038e8ae05a8532d2640a09ff78a8f4158f6cf6a759a28b716fe58adb20a4ef7a548 + languageName: node + linkType: hard + "@vue/compiler-core@npm:3.0.0": version: 3.0.0 resolution: "@vue/compiler-core@npm:3.0.0" @@ -9729,6 +9787,18 @@ __metadata: languageName: node linkType: hard +"@vue/compiler-core@npm:3.2.41": + version: 3.2.41 + resolution: "@vue/compiler-core@npm:3.2.41" + dependencies: + "@babel/parser": ^7.16.4 + "@vue/shared": 3.2.41 + estree-walker: ^2.0.2 + source-map: ^0.6.1 + checksum: 9f1023c2f0e8834a8056f5d0a4ac5d751b351d901e8cd03163aca10e317b08c599d326ef5de70a3d2ba1c7ee333e7a2289fc72ce4f6ac0496e750b044689f803 + languageName: node + linkType: hard + "@vue/compiler-dom@npm:3.0.0": version: 3.0.0 resolution: "@vue/compiler-dom@npm:3.0.0" @@ -9749,6 +9819,16 @@ __metadata: languageName: node linkType: hard +"@vue/compiler-dom@npm:3.2.41, @vue/compiler-dom@npm:^3.2.40": + version: 3.2.41 + resolution: "@vue/compiler-dom@npm:3.2.41" + dependencies: + "@vue/compiler-core": 3.2.41 + "@vue/shared": 3.2.41 + checksum: 5dbbd925d4603668f5edcb134c8e8718e22738b7890e1cd6f2e8621aabf42a96df2f851f722f1176ca1744345fc74000c941b7cf4dc323dbbcd70da87ccdf378 + languageName: node + linkType: hard + "@vue/compiler-sfc@npm:2.7.10": version: 2.7.10 resolution: "@vue/compiler-sfc@npm:2.7.10" @@ -9804,6 +9884,24 @@ __metadata: languageName: node linkType: hard +"@vue/compiler-sfc@npm:3.2.41, @vue/compiler-sfc@npm:^3.2.40": + version: 3.2.41 + resolution: "@vue/compiler-sfc@npm:3.2.41" + dependencies: + "@babel/parser": ^7.16.4 + "@vue/compiler-core": 3.2.41 + "@vue/compiler-dom": 3.2.41 + "@vue/compiler-ssr": 3.2.41 + "@vue/reactivity-transform": 3.2.41 + "@vue/shared": 3.2.41 + estree-walker: ^2.0.2 + magic-string: ^0.25.7 + postcss: ^8.1.10 + source-map: ^0.6.1 + checksum: 327fb7acff404ac007c8eabefe485efb4d070e347bffca2c170232f502021fac01fabeda5f4f91a7b0b175b48cef184e053da9a2ef46b7ab188b8383bef188cb + languageName: node + linkType: hard + "@vue/compiler-ssr@npm:3.0.0": version: 3.0.0 resolution: "@vue/compiler-ssr@npm:3.0.0" @@ -9824,6 +9922,16 @@ __metadata: languageName: node linkType: hard +"@vue/compiler-ssr@npm:3.2.41": + version: 3.2.41 + resolution: "@vue/compiler-ssr@npm:3.2.41" + dependencies: + "@vue/compiler-dom": 3.2.41 + "@vue/shared": 3.2.41 + checksum: 508361b2799097d86abd740548eabf7a20f9a6e1af29cda23dad07ed0b7d72569371492619f80ba2283c3e87c66016985a531cf2110742dabafe5566ca22e6eb + languageName: node + linkType: hard + "@vue/component-compiler-utils@npm:^3.1.0": version: 3.3.0 resolution: "@vue/component-compiler-utils@npm:3.3.0" @@ -9857,6 +9965,19 @@ __metadata: languageName: node linkType: hard +"@vue/reactivity-transform@npm:3.2.41": + version: 3.2.41 + resolution: "@vue/reactivity-transform@npm:3.2.41" + dependencies: + "@babel/parser": ^7.16.4 + "@vue/compiler-core": 3.2.41 + "@vue/shared": 3.2.41 + estree-walker: ^2.0.2 + magic-string: ^0.25.7 + checksum: 8f4350efa220ed3ba8f0c4721a54ae4a2c043a8cff2d8d7227525df59f09145bb76a842f30fd3b0684c083b3e776653b464d737c7c53e43ce0739ac3d958a24a + languageName: node + linkType: hard + "@vue/reactivity@npm:3.0.0": version: 3.0.0 resolution: "@vue/reactivity@npm:3.0.0" @@ -9875,6 +9996,15 @@ __metadata: languageName: node linkType: hard +"@vue/reactivity@npm:3.2.41, @vue/reactivity@npm:^3.2.40": + version: 3.2.41 + resolution: "@vue/reactivity@npm:3.2.41" + dependencies: + "@vue/shared": 3.2.41 + checksum: f76b7e3f12c441ff018ea1cb8c080365d135d87ddc075a10c87ea440a2c95e5d5ac04bb83dda0ce1f498fb390afff5d3d0c06d0a0fb46ca535df70c66dc3be90 + languageName: node + linkType: hard + "@vue/runtime-core@npm:3.0.0": version: 3.0.0 resolution: "@vue/runtime-core@npm:3.0.0" @@ -9895,6 +10025,16 @@ __metadata: languageName: node linkType: hard +"@vue/runtime-core@npm:3.2.41": + version: 3.2.41 + resolution: "@vue/runtime-core@npm:3.2.41" + dependencies: + "@vue/reactivity": 3.2.41 + "@vue/shared": 3.2.41 + checksum: 9c21632c5a3330283649a9175ae03cebe27776a7615d10b9e8f2a98e4002951a9913be7b2810623c06d6481cb56b62e2f5e6f9a5d29d79f75d66ec10b528cdc2 + languageName: node + linkType: hard + "@vue/runtime-dom@npm:3.0.0": version: 3.0.0 resolution: "@vue/runtime-dom@npm:3.0.0" @@ -9917,6 +10057,17 @@ __metadata: languageName: node linkType: hard +"@vue/runtime-dom@npm:3.2.41": + version: 3.2.41 + resolution: "@vue/runtime-dom@npm:3.2.41" + dependencies: + "@vue/runtime-core": 3.2.41 + "@vue/shared": 3.2.41 + csstype: ^2.6.8 + checksum: 744d50eb98b5a00b31ef6c318a04b9d9786f35d9f255689aba7c15e7be927c14f4d4379b704cde97f0ba467b3f36c46efcc7d0b119c9bde3419a966a21081f78 + languageName: node + linkType: hard + "@vue/server-renderer@npm:3.2.40": version: 3.2.40 resolution: "@vue/server-renderer@npm:3.2.40" @@ -9929,6 +10080,18 @@ __metadata: languageName: node linkType: hard +"@vue/server-renderer@npm:3.2.41": + version: 3.2.41 + resolution: "@vue/server-renderer@npm:3.2.41" + dependencies: + "@vue/compiler-ssr": 3.2.41 + "@vue/shared": 3.2.41 + peerDependencies: + vue: 3.2.41 + checksum: 3aa31b70e46e0171e2c07562aa09bc1e75ccc6c876c146c3d25b4674d9394de46ba9ff338105ae81d7ff679763c9ecfe48e6d7382d52de163319481132cfc55a + languageName: node + linkType: hard + "@vue/shared@npm:3.0.0": version: 3.0.0 resolution: "@vue/shared@npm:3.0.0" @@ -9943,6 +10106,13 @@ __metadata: languageName: node linkType: hard +"@vue/shared@npm:3.2.41, @vue/shared@npm:^3.2.40": + version: 3.2.41 + resolution: "@vue/shared@npm:3.2.41" + checksum: bc46bf36e856a10646639561b346a76594e8a1afa992e3394056a6e0b534c6c71b1330e13960ba9788bb36265a5e761ac4c562daad0d168265d496fc3e7d6575 + languageName: node + linkType: hard + "@webassemblyjs/ast@npm:1.11.1": version: 1.11.1 resolution: "@webassemblyjs/ast@npm:1.11.1" @@ -25506,7 +25676,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^5.0.1": +"minimatch@npm:^5.0.1, minimatch@npm:^5.1.0": version: 5.1.0 resolution: "minimatch@npm:5.1.0" dependencies: @@ -25856,6 +26026,13 @@ __metadata: languageName: node linkType: hard +"muggle-string@npm:^0.1.0": + version: 0.1.0 + resolution: "muggle-string@npm:0.1.0" + checksum: b0f3ae892ada01af94c2d75bb70e4489f060e395cf561d35ce380c6e206a1104d31861a4e98a7cee76977708b1ab3efe0df869c6bdd98bbada93aff5d120ef76 + languageName: node + linkType: hard + "multicast-dns-service-types@npm:^1.1.0": version: 1.1.0 resolution: "multicast-dns-service-types@npm:1.1.0" @@ -35506,6 +35683,16 @@ __metadata: languageName: node linkType: hard +"vue-template-compiler@npm:^2.7.10": + version: 2.7.13 + resolution: "vue-template-compiler@npm:2.7.13" + dependencies: + de-indent: ^1.0.2 + he: ^1.2.0 + checksum: 6f1b54e74cc5b2a97ccda5335123fc2e9d1b63b934efe67552fbe7a4041ac55fc24b802e5715e7509696c6bcf5d1c6e0c69e4cd0ba85b3e32384df66b452ae82 + languageName: node + linkType: hard + "vue-template-es2015-compiler@npm:^1.9.0": version: 1.9.1 resolution: "vue-template-es2015-compiler@npm:1.9.1" @@ -35513,6 +35700,20 @@ __metadata: languageName: node linkType: hard +"vue-tsc@npm:^1.0.8": + version: 1.0.8 + resolution: "vue-tsc@npm:1.0.8" + dependencies: + "@volar/vue-language-core": 1.0.8 + "@volar/vue-typescript": 1.0.8 + peerDependencies: + typescript: "*" + bin: + vue-tsc: bin/vue-tsc.js + checksum: e9ea48ef84249f842e910c8d1dab7e6b681af77714f2c4b5c7cc0810e22bb40d02bcd0701c3e30d8e52d5bd71d2a547204efa53f5caa793c96647a3b6bcf7f90 + languageName: node + linkType: hard + "vue@npm:3.0.0": version: 3.0.0 resolution: "vue@npm:3.0.0" @@ -35534,7 +35735,7 @@ __metadata: languageName: node linkType: hard -"vue@npm:^3.0.0, vue@npm:^3.2.33": +"vue@npm:^3.2.33": version: 3.2.40 resolution: "vue@npm:3.2.40" dependencies: @@ -35547,6 +35748,19 @@ __metadata: languageName: node linkType: hard +"vue@npm:^3.2.41": + version: 3.2.41 + resolution: "vue@npm:3.2.41" + dependencies: + "@vue/compiler-dom": 3.2.41 + "@vue/compiler-sfc": 3.2.41 + "@vue/runtime-dom": 3.2.41 + "@vue/server-renderer": 3.2.41 + "@vue/shared": 3.2.41 + checksum: fac4f47b5ecec8b7b7366eccb6b35866712e11887a12df0f04f989134578de27b69364c1ea1377384b38d048a0c4f604fd096500647f30c0b45cc68cff421d8d + languageName: node + linkType: hard + "w3c-hr-time@npm:^1.0.1, w3c-hr-time@npm:^1.0.2": version: 1.0.2 resolution: "w3c-hr-time@npm:1.0.2"