diff --git a/.gitignore b/.gitignore index 29420311b8..fbe2245502 100644 --- a/.gitignore +++ b/.gitignore @@ -56,6 +56,7 @@ api-docs.json /files ormconfig.json temp +/packages/frontend/src/**/*.stories.ts # blender backups *.blend1 diff --git a/packages/frontend/src/components/global/MkA.stories.ts b/packages/frontend/src/components/global/MkA.stories.ts deleted file mode 100644 index cdc5d13f6a..0000000000 --- a/packages/frontend/src/components/global/MkA.stories.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* eslint-disable @typescript-eslint/explicit-function-return-type */ -/* eslint-disable import/no-default-export */ -import { Meta } from '@storybook/vue3'; -const meta = { - title: 'components/global/MkA', - component: MkA, -} satisfies Meta; -export default meta; -/* eslint-disable @typescript-eslint/explicit-function-return-type */ -import { expect } from '@storybook/jest'; -import { userEvent, within } from '@storybook/testing-library'; -import { StoryObj } from '@storybook/vue3'; -import { tick } from '@/scripts/test-utils'; -import MkA from './MkA.vue'; -export const Default = { - render(args) { - return { - components: { - MkA, - }, - setup() { - return { - args, - }; - }, - computed: { - props() { - return { - ...args, - }; - }, - }, - template: 'Text', - }; - }, - async play({ canvasElement }) { - const canvas = within(canvasElement); - const a = canvas.getByRole('link'); - await expect(a.href).toMatch(/^https?:\/\/.*#test$/); - await userEvent.click(a, { button: 2 }); - await tick(); - const menu = canvas.getByRole('menu'); - await expect(menu).toBeInTheDocument(); - await userEvent.click(a, { button: 0 }); - await tick(); - await expect(menu).not.toBeInTheDocument(); - }, - args: { - to: '#test', - }, - parameters: { - layout: 'centered', - }, -} satisfies StoryObj; diff --git a/packages/frontend/src/components/global/MkAcct.stories.ts b/packages/frontend/src/components/global/MkAcct.stories.ts deleted file mode 100644 index 95b1286c75..0000000000 --- a/packages/frontend/src/components/global/MkAcct.stories.ts +++ /dev/null @@ -1,47 +0,0 @@ -/* eslint-disable @typescript-eslint/explicit-function-return-type */ -/* eslint-disable import/no-default-export */ -import { Meta } from '@storybook/vue3'; -const meta = { - title: 'components/global/MkAcct', - component: MkAcct, -} satisfies Meta; -export default meta; -/* eslint-disable @typescript-eslint/explicit-function-return-type */ -import { StoryObj } from '@storybook/vue3'; -import { userDetailed } from '../../../.storybook/fakes'; -import MkAcct from './MkAcct.vue'; -export const Default = { - render(args) { - return { - components: { - MkAcct, - }, - setup() { - return { - args, - }; - }, - computed: { - props() { - return { - ...args, - }; - }, - }, - template: '', - }; - }, - args: { - user: userDetailed, - }, - parameters: { - layout: 'centered', - }, -} satisfies StoryObj; -export const Detail = { - ...Default, - args: { - ...Default.args, - detail: true, - }, -} satisfies StoryObj; diff --git a/packages/frontend/src/components/global/MkAd.stories.ts b/packages/frontend/src/components/global/MkAd.stories.ts deleted file mode 100644 index d852b911ee..0000000000 --- a/packages/frontend/src/components/global/MkAd.stories.ts +++ /dev/null @@ -1,130 +0,0 @@ -/* eslint-disable @typescript-eslint/explicit-function-return-type */ -/* eslint-disable import/no-default-export */ -import { Meta } from '@storybook/vue3'; -const meta = { - title: 'components/global/MkAd', - component: MkAd, -} satisfies Meta; -export default meta; -/* eslint-disable @typescript-eslint/explicit-function-return-type */ -import { expect } from '@storybook/jest'; -import { userEvent, within } from '@storybook/testing-library'; -import { StoryObj } from '@storybook/vue3'; -import { i18n } from '@/i18n'; -import MkAd from './MkAd.vue'; -const common = { - render(args) { - return { - components: { - MkAd, - }, - setup() { - return { - args, - }; - }, - computed: { - props() { - return { - ...args, - }; - }, - }, - template: '', - }; - }, - async play({ canvasElement, args }) { - const canvas = within(canvasElement); - const a = canvas.getByRole('link'); - await expect(a.href).toMatch(/^https?:\/\/.*#test$/); - const img = within(a).getByRole('img'); - await expect(img).toBeInTheDocument(); - let buttons = canvas.getAllByRole('button'); - await expect(buttons).toHaveLength(1); - const i = buttons[0]; - await expect(i).toBeInTheDocument(); - await userEvent.click(i); - await expect(a).not.toBeInTheDocument(); - await expect(i).not.toBeInTheDocument(); - buttons = canvas.getAllByRole('button'); - await expect(buttons).toHaveLength(args.__hasReduce ? 2 : 1); - const reduce = args.__hasReduce ? buttons[0] : null; - const back = buttons[args.__hasReduce ? 1 : 0]; - if (reduce) { - await expect(reduce).toBeInTheDocument(); - await expect(reduce).toHaveTextContent( - i18n.ts._ad.reduceFrequencyOfThisAd - ); - } - await expect(back).toBeInTheDocument(); - await expect(back).toHaveTextContent(i18n.ts._ad.back); - await userEvent.click(back); - if (reduce) { - await expect(reduce).not.toBeInTheDocument(); - } - await expect(back).not.toBeInTheDocument(); - const aAgain = canvas.getByRole('link'); - await expect(aAgain).toBeInTheDocument(); - const imgAgain = within(aAgain).getByRole('img'); - await expect(imgAgain).toBeInTheDocument(); - }, - args: { - prefer: [], - specify: { - id: 'someadid', - radio: 1, - url: '#test', - }, - __hasReduce: true, - }, - parameters: { - layout: 'centered', - }, -} satisfies StoryObj; -export const Square = { - ...common, - args: { - ...common.args, - specify: { - ...common.args.specify, - place: 'square', - imageUrl: - 'https://github.com/misskey-dev/misskey/blob/master/packages/frontend/assets/about-icon.png?raw=true', - }, - }, -}; -export const Horizontal = { - ...common, - args: { - ...common.args, - specify: { - ...common.args.specify, - place: 'horizontal', - imageUrl: - 'https://github.com/misskey-dev/misskey/blob/master/packages/frontend/assets/fedi.jpg?raw=true', - }, - }, -}; -export const HorizontalBig = { - ...common, - args: { - ...common.args, - specify: { - ...common.args.specify, - place: 'horizontal-big', - imageUrl: - 'https://github.com/misskey-dev/misskey/blob/master/packages/frontend/assets/fedi.jpg?raw=true', - }, - }, -}; -export const ZeroRatio = { - ...Square, - args: { - ...Square.args, - specify: { - ...Square.args.specify, - ratio: 0, - }, - __hasReduce: false, - }, -}; diff --git a/packages/frontend/src/components/global/MkAvatar.stories.ts b/packages/frontend/src/components/global/MkAvatar.stories.ts deleted file mode 100644 index 51265720b8..0000000000 --- a/packages/frontend/src/components/global/MkAvatar.stories.ts +++ /dev/null @@ -1,65 +0,0 @@ -/* eslint-disable @typescript-eslint/explicit-function-return-type */ -/* eslint-disable import/no-default-export */ -import { Meta } from '@storybook/vue3'; -const meta = { - title: 'components/global/MkAvatar', - component: MkAvatar, -} satisfies Meta; -export default meta; -/* eslint-disable @typescript-eslint/explicit-function-return-type */ -/* eslint-disable import/no-duplicates */ -import { StoryObj } from '@storybook/vue3'; -import { userDetailed } from '../../../.storybook/fakes'; -import MkAvatar from './MkAvatar.vue'; -const common = { - render(args) { - return { - components: { - MkAvatar, - }, - setup() { - return { - args, - }; - }, - computed: { - props() { - return { - ...args, - }; - }, - }, - template: '', - }; - }, - args: { - user: userDetailed, - }, - decorators: [ - (Story, context) => ({ - // eslint-disable-next-line quotes - template: `
`, - }), - ], - parameters: { - layout: 'centered', - }, -} satisfies StoryObj; -export const ProfilePage = { - ...common, - args: { - ...common.args, - size: 120, - indicator: true, - }, -}; -export const ProfilePageCat = { - ...ProfilePage, - args: { - ...ProfilePage.args, - user: { - ...userDetailed, - isCat: true, - }, - }, -}; diff --git a/packages/frontend/src/components/global/MkCustomEmoji.stories.ts b/packages/frontend/src/components/global/MkCustomEmoji.stories.ts deleted file mode 100644 index 5624eef5b1..0000000000 --- a/packages/frontend/src/components/global/MkCustomEmoji.stories.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* eslint-disable @typescript-eslint/explicit-function-return-type */ -/* eslint-disable import/no-default-export */ -import { Meta } from '@storybook/vue3'; -const meta = { - title: 'components/global/MkCustomEmoji', - component: MkCustomEmoji, -} satisfies Meta; -export default meta; -/* eslint-disable @typescript-eslint/explicit-function-return-type */ -/* eslint-disable import/no-duplicates */ -import { StoryObj } from '@storybook/vue3'; -import MkCustomEmoji from './MkCustomEmoji.vue'; -export const Default = { - render(args) { - return { - components: { - MkCustomEmoji, - }, - setup() { - return { - args, - }; - }, - computed: { - props() { - return { - ...args, - }; - }, - }, - template: '', - }; - }, - args: { - name: 'mi', - url: 'https://github.com/misskey-dev/misskey/blob/master/packages/frontend/assets/about-icon.png?raw=true', - }, - parameters: { - layout: 'centered', - }, -} satisfies StoryObj; -export const Normal = { - ...Default, - args: { - ...Default.args, - normal: true, - }, -}; -export const Missing = { - ...Default, - args: { - name: Default.args.name, - }, -}; diff --git a/packages/frontend/src/components/global/MkEllipsis.stories.ts b/packages/frontend/src/components/global/MkEllipsis.stories.ts deleted file mode 100644 index 5b8b7ca062..0000000000 --- a/packages/frontend/src/components/global/MkEllipsis.stories.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* eslint-disable @typescript-eslint/explicit-function-return-type */ -/* eslint-disable import/no-default-export */ -import { Meta, StoryObj } from '@storybook/vue3'; -import MkEllipsis from './MkEllipsis.vue'; -const meta = { - title: 'components/global/MkEllipsis', - component: MkEllipsis, -} satisfies Meta; -export const Default = { - render(args) { - return { - components: { - MkEllipsis, - }, - setup() { - return { - args, - }; - }, - computed: { - props() { - return { - ...args, - }; - }, - }, - template: '', - }; - }, - parameters: { - layout: 'centered', - }, -} satisfies StoryObj; -export default meta; diff --git a/packages/frontend/src/components/global/MkEmoji.stories.ts b/packages/frontend/src/components/global/MkEmoji.stories.ts deleted file mode 100644 index e3e81a76ab..0000000000 --- a/packages/frontend/src/components/global/MkEmoji.stories.ts +++ /dev/null @@ -1,40 +0,0 @@ -/* eslint-disable @typescript-eslint/explicit-function-return-type */ -/* eslint-disable import/no-default-export */ -import { Meta } from '@storybook/vue3'; -const meta = { - title: 'components/global/MkEmoji', - component: MkEmoji, -} satisfies Meta; -export default meta; -/* eslint-disable @typescript-eslint/explicit-function-return-type */ -/* eslint-disable import/no-duplicates */ -import { StoryObj } from '@storybook/vue3'; -import MkEmoji from './MkEmoji.vue'; -export const Default = { - render(args) { - return { - components: { - MkEmoji, - }, - setup() { - return { - args, - }; - }, - computed: { - props() { - return { - ...args, - }; - }, - }, - template: '', - }; - }, - args: { - emoji: '❤', - }, - parameters: { - layout: 'centered', - }, -} satisfies StoryObj; diff --git a/packages/frontend/src/components/global/MkError.stories.ts b/packages/frontend/src/components/global/MkError.stories.ts deleted file mode 100644 index 274117f950..0000000000 --- a/packages/frontend/src/components/global/MkError.stories.ts +++ /dev/null @@ -1,36 +0,0 @@ -/* eslint-disable @typescript-eslint/explicit-function-return-type */ -/* eslint-disable import/no-default-export */ -import { Meta, StoryObj } from '@storybook/vue3'; -import MkError from './MkError.vue'; -import * as storiesMeta from './MkError.stories.meta'; -const meta = { - title: 'components/global/MkError', - component: MkError, - ...storiesMeta, -} satisfies Meta; -export const Default = { - render(args) { - return { - components: { - MkError, - }, - setup() { - return { - args, - }; - }, - computed: { - props() { - return { - ...args, - }; - }, - }, - template: '', - }; - }, - parameters: { - layout: 'centered', - }, -} satisfies StoryObj; -export default meta; diff --git a/packages/frontend/src/components/global/MkLoading.stories.ts b/packages/frontend/src/components/global/MkLoading.stories.ts deleted file mode 100644 index dd58d30e7c..0000000000 --- a/packages/frontend/src/components/global/MkLoading.stories.ts +++ /dev/null @@ -1,65 +0,0 @@ -/* eslint-disable @typescript-eslint/explicit-function-return-type */ -/* eslint-disable import/no-default-export */ -import { Meta } from '@storybook/vue3'; -const meta = { - title: 'components/global/MkLoading', - component: MkLoading, -} satisfies Meta; -export default meta; -/* eslint-disable @typescript-eslint/explicit-function-return-type */ -import { StoryObj } from '@storybook/vue3'; -import MkLoading from './MkLoading.vue'; -export const Default = { - render(args) { - return { - components: { - MkLoading, - }, - setup() { - return { - args, - }; - }, - computed: { - props() { - return { - ...args, - }; - }, - }, - template: '', - }; - }, - args: {}, - parameters: { - layout: 'centered', - }, -} satisfies StoryObj; -export const Inline = { - ...Default, - args: { - ...Default.args, - inline: true, - }, -}; -export const Colored = { - ...Default, - args: { - ...Default.args, - colored: true, - }, -}; -export const Mini = { - ...Default, - args: { - ...Default.args, - mini: true, - }, -}; -export const Em = { - ...Default, - args: { - ...Default.args, - em: true, - }, -}; diff --git a/packages/frontend/src/components/global/MkMisskeyFlavoredMarkdown.stories.ts b/packages/frontend/src/components/global/MkMisskeyFlavoredMarkdown.stories.ts deleted file mode 100644 index b39951fcc8..0000000000 --- a/packages/frontend/src/components/global/MkMisskeyFlavoredMarkdown.stories.ts +++ /dev/null @@ -1,85 +0,0 @@ -/* eslint-disable @typescript-eslint/explicit-function-return-type */ -/* eslint-disable import/no-default-export */ -import { Meta } from '@storybook/vue3'; -const meta = { - title: 'components/global/MkMisskeyFlavoredMarkdown', - component: MkMisskeyFlavoredMarkdown, -} satisfies Meta; -export default meta; -/* eslint-disable @typescript-eslint/explicit-function-return-type */ -import { StoryObj } from '@storybook/vue3'; -import MkMisskeyFlavoredMarkdown from './MkMisskeyFlavoredMarkdown.vue'; -import { within } from '@storybook/testing-library'; -import { expect } from '@storybook/jest'; -export const Default = { - render(args) { - return { - components: { - MkMisskeyFlavoredMarkdown, - }, - setup() { - return { - args, - }; - }, - computed: { - props() { - return { - ...args, - }; - }, - }, - template: '', - }; - }, - async play({ canvasElement, args }) { - const canvas = within(canvasElement); - if (args.plain) { - const aiHelloMiskist = canvas.getByText('@ai *Hello*, #Miskist!'); - await expect(aiHelloMiskist).toBeInTheDocument(); - } else { - const ai = canvas.getByText('@ai'); - await expect(ai).toBeInTheDocument(); - await expect(ai.closest('a')).toHaveAttribute('href', '/@ai'); - const hello = canvas.getByText('Hello'); - await expect(hello).toBeInTheDocument(); - await expect(hello.style.fontStyle).toBe('oblique'); - const miskist = canvas.getByText('#Miskist'); - await expect(miskist).toBeInTheDocument(); - await expect(miskist).toHaveAttribute( - 'href', - args.isNote ?? true ? '/tags/Miskist' : '/user-tags/Miskist' - ); - } - const heart = canvas.getByAltText('❤'); - await expect(heart).toBeInTheDocument(); - await expect(heart).toHaveAttribute('src', '/twemoji/2764.svg'); - }, - args: { - text: '@ai *Hello*, #Miskist! ❤', - }, - parameters: { - layout: 'centered', - }, -} satisfies StoryObj; -export const Plain = { - ...Default, - args: { - ...Default.args, - plain: true, - }, -}; -export const Nowrap = { - ...Default, - args: { - ...Default.args, - nowrap: true, - }, -}; -export const IsNotNote = { - ...Default, - args: { - ...Default.args, - isNote: false, - }, -}; diff --git a/packages/frontend/src/components/global/MkPageHeader.stories.ts b/packages/frontend/src/components/global/MkPageHeader.stories.ts deleted file mode 100644 index 6f0b9dd344..0000000000 --- a/packages/frontend/src/components/global/MkPageHeader.stories.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* eslint-disable @typescript-eslint/explicit-function-return-type */ -/* eslint-disable import/no-default-export */ -import { Meta, StoryObj } from '@storybook/vue3'; -import MkPageHeader from './MkPageHeader.vue'; -const meta = { - title: 'components/global/MkPageHeader', - component: MkPageHeader, -} satisfies Meta; -export const Default = { - render(args) { - return { - components: { - MkPageHeader, - }, - setup() { - return { - args, - }; - }, - computed: { - props() { - return { - ...args, - }; - }, - }, - template: '', - }; - }, - parameters: { - layout: 'centered', - }, -} satisfies StoryObj; -export default meta; diff --git a/packages/frontend/src/components/global/MkPageHeader.tabs.stories.ts b/packages/frontend/src/components/global/MkPageHeader.tabs.stories.ts deleted file mode 100644 index 89c241eb7a..0000000000 --- a/packages/frontend/src/components/global/MkPageHeader.tabs.stories.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* eslint-disable @typescript-eslint/explicit-function-return-type */ -/* eslint-disable import/no-default-export */ -import { Meta, StoryObj } from '@storybook/vue3'; -import MkPageHeader_tabs from './MkPageHeader.tabs.vue'; -const meta = { - title: 'components/global/MkPageHeader/tabs', - component: MkPageHeader_tabs, -} satisfies Meta; -export const Default = { - render(args) { - return { - components: { - MkPageHeader_tabs, - }, - setup() { - return { - args, - }; - }, - computed: { - props() { - return { - ...args, - }; - }, - }, - template: '', - }; - }, - parameters: { - layout: 'centered', - }, -} satisfies StoryObj; -export default meta; diff --git a/packages/frontend/src/components/global/MkSpacer.stories.ts b/packages/frontend/src/components/global/MkSpacer.stories.ts deleted file mode 100644 index f5e7b2eb9b..0000000000 --- a/packages/frontend/src/components/global/MkSpacer.stories.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* eslint-disable @typescript-eslint/explicit-function-return-type */ -/* eslint-disable import/no-default-export */ -import { Meta, StoryObj } from '@storybook/vue3'; -import MkSpacer from './MkSpacer.vue'; -const meta = { - title: 'components/global/MkSpacer', - component: MkSpacer, -} satisfies Meta; -export const Default = { - render(args) { - return { - components: { - MkSpacer, - }, - setup() { - return { - args, - }; - }, - computed: { - props() { - return { - ...args, - }; - }, - }, - template: '', - }; - }, - parameters: { - layout: 'centered', - }, -} satisfies StoryObj; -export default meta; diff --git a/packages/frontend/src/components/global/MkStickyContainer.stories.ts b/packages/frontend/src/components/global/MkStickyContainer.stories.ts deleted file mode 100644 index 180fdddb1a..0000000000 --- a/packages/frontend/src/components/global/MkStickyContainer.stories.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* eslint-disable @typescript-eslint/explicit-function-return-type */ -/* eslint-disable import/no-default-export */ -import { Meta, StoryObj } from '@storybook/vue3'; -import MkStickyContainer from './MkStickyContainer.vue'; -const meta = { - title: 'components/global/MkStickyContainer', - component: MkStickyContainer, -} satisfies Meta; -export const Default = { - render(args) { - return { - components: { - MkStickyContainer, - }, - setup() { - return { - args, - }; - }, - computed: { - props() { - return { - ...args, - }; - }, - }, - template: '', - }; - }, - parameters: { - layout: 'centered', - }, -} satisfies StoryObj; -export default meta; diff --git a/packages/frontend/src/components/global/MkTime.stories.ts b/packages/frontend/src/components/global/MkTime.stories.ts deleted file mode 100644 index d45dc70f28..0000000000 --- a/packages/frontend/src/components/global/MkTime.stories.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* eslint-disable @typescript-eslint/explicit-function-return-type */ -/* eslint-disable import/no-default-export */ -import { Meta, StoryObj } from '@storybook/vue3'; -import MkTime from './MkTime.vue'; -const meta = { - title: 'components/global/MkTime', - component: MkTime, -} satisfies Meta; -export const Default = { - render(args) { - return { - components: { - MkTime, - }, - setup() { - return { - args, - }; - }, - computed: { - props() { - return { - ...args, - }; - }, - }, - template: '', - }; - }, - parameters: { - layout: 'centered', - }, -} satisfies StoryObj; -export default meta; diff --git a/packages/frontend/src/components/global/MkUrl.stories.ts b/packages/frontend/src/components/global/MkUrl.stories.ts deleted file mode 100644 index e3b2c4ceba..0000000000 --- a/packages/frontend/src/components/global/MkUrl.stories.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* eslint-disable @typescript-eslint/explicit-function-return-type */ -/* eslint-disable import/no-default-export */ -import { Meta, StoryObj } from '@storybook/vue3'; -import MkUrl from './MkUrl.vue'; -const meta = { - title: 'components/global/MkUrl', - component: MkUrl, -} satisfies Meta; -export const Default = { - render(args) { - return { - components: { - MkUrl, - }, - setup() { - return { - args, - }; - }, - computed: { - props() { - return { - ...args, - }; - }, - }, - template: '', - }; - }, - parameters: { - layout: 'centered', - }, -} satisfies StoryObj; -export default meta; diff --git a/packages/frontend/src/components/global/MkUserName.stories.ts b/packages/frontend/src/components/global/MkUserName.stories.ts deleted file mode 100644 index ec708c61c8..0000000000 --- a/packages/frontend/src/components/global/MkUserName.stories.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* eslint-disable @typescript-eslint/explicit-function-return-type */ -/* eslint-disable import/no-default-export */ -import { Meta, StoryObj } from '@storybook/vue3'; -import MkUserName from './MkUserName.vue'; -const meta = { - title: 'components/global/MkUserName', - component: MkUserName, -} satisfies Meta; -export const Default = { - render(args) { - return { - components: { - MkUserName, - }, - setup() { - return { - args, - }; - }, - computed: { - props() { - return { - ...args, - }; - }, - }, - template: '', - }; - }, - parameters: { - layout: 'centered', - }, -} satisfies StoryObj; -export default meta; diff --git a/packages/frontend/src/components/global/RouterView.stories.ts b/packages/frontend/src/components/global/RouterView.stories.ts deleted file mode 100644 index 86e25b4757..0000000000 --- a/packages/frontend/src/components/global/RouterView.stories.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* eslint-disable @typescript-eslint/explicit-function-return-type */ -/* eslint-disable import/no-default-export */ -import { Meta, StoryObj } from '@storybook/vue3'; -import RouterView from './RouterView.vue'; -const meta = { - title: 'components/global/RouterView', - component: RouterView, -} satisfies Meta; -export const Default = { - render(args) { - return { - components: { - RouterView, - }, - setup() { - return { - args, - }; - }, - computed: { - props() { - return { - ...args, - }; - }, - }, - template: '', - }; - }, - parameters: { - layout: 'centered', - }, -} satisfies StoryObj; -export default meta;