From 701c75a2a88a29be2fce193f75e1484799a5539c Mon Sep 17 00:00:00 2001 From: Romain Hamel Date: Tue, 5 Nov 2024 22:17:56 +0100 Subject: [PATCH] feat(module): devtools integration (#2196) Co-authored-by: Benjamin Canac --- .github/workflows/ci-v3.yml | 3 + .gitignore | 3 + build.config.ts | 6 +- devtools/app/app.config.ts | 8 + devtools/app/app.vue | 222 ++++++++++++++++++ devtools/app/components/CollapseContainer.vue | 43 ++++ devtools/app/components/ComponentPreview.vue | 151 ++++++++++++ .../app/components/ComponentPropInput.vue | 39 +++ devtools/app/components/UILogo.vue | 10 + devtools/app/components/inputs/ArrayInput.vue | 76 ++++++ .../app/components/inputs/BooleanInput.vue | 20 ++ .../app/components/inputs/NumberInput.vue | 15 ++ .../app/components/inputs/ObjectInput.vue | 38 +++ .../app/components/inputs/StringEnumInput.vue | 60 +++++ .../app/components/inputs/StringInput.vue | 15 ++ devtools/app/composables/usePropSchema.ts | 44 ++++ devtools/app/composables/useShiki.ts | 34 +++ devtools/app/plugins/prettier.client.ts | 54 +++++ devtools/app/workers/prettier.js | 36 +++ devtools/nuxt.config.ts | 38 +++ devtools/package.json | 19 ++ devtools/public/favicon.svg | 1 + .../test/composables/usePropSchema.test.ts | 24 ++ devtools/test/fixtures/schemas.ts | 133 +++++++++++ devtools/test/vitest.config.ts | 7 + devtools/tsconfig.json | 4 + docs/app/plugins/prettier.ts | 34 ++- docs/app/workers/prettier.js | 19 +- eslint.config.mjs | 2 + package.json | 14 +- playground/app/app.vue | 33 +-- playground/nuxt.config.ts | 27 ++- pnpm-lock.yaml | 30 +++ pnpm-workspace.yaml | 1 + src/defaults.ts | 3 + src/devtools/meta.ts | 148 ++++++++++++ src/devtools/runtime/DevtoolsRenderer.vue | 71 ++++++ .../runtime/examples/AvatarGroupExample.vue | 7 + .../runtime/examples/ButtonGroupExample.vue | 8 + src/devtools/runtime/examples/CardExample.vue | 13 + .../runtime/examples/CarouselExample.vue | 13 + src/devtools/runtime/examples/ChipExample.vue | 5 + .../runtime/examples/CollapsibleExample.vue | 8 + .../examples/CommandPaletteExample.vue | 29 +++ .../runtime/examples/ContainerExample.vue | 5 + .../runtime/examples/ContextMenuExample.vue | 5 + .../runtime/examples/DrawerExample.vue | 8 + .../runtime/examples/DropdownMenuExample.vue | 5 + src/devtools/runtime/examples/FormExample.vue | 30 +++ .../runtime/examples/FormFieldExample.vue | 5 + src/devtools/runtime/examples/LinkExample.vue | 5 + .../runtime/examples/ModalExample.vue | 8 + .../runtime/examples/PopoverExample.vue | 8 + .../runtime/examples/SkeletonExample.vue | 3 + .../runtime/examples/SlideoverExample.vue | 8 + .../runtime/examples/ToasterExample.vue | 11 + .../runtime/examples/TooltipExample.vue | 5 + src/module.ts | 92 +++++++- src/runtime/components/Accordion.vue | 32 ++- src/runtime/components/Alert.vue | 3 + src/runtime/components/App.vue | 8 + src/runtime/components/Avatar.vue | 3 + src/runtime/components/AvatarGroup.vue | 3 + src/runtime/components/Badge.vue | 3 + src/runtime/components/Breadcrumb.vue | 26 +- src/runtime/components/Button.vue | 6 +- src/runtime/components/ButtonGroup.vue | 3 + src/runtime/components/Card.vue | 3 + src/runtime/components/Carousel.vue | 3 +- src/runtime/components/Checkbox.vue | 3 + src/runtime/components/Chip.vue | 3 + src/runtime/components/Collapsible.vue | 3 + src/runtime/components/CommandPalette.vue | 3 +- src/runtime/components/Container.vue | 3 + src/runtime/components/ContextMenu.vue | 62 ++++- src/runtime/components/Drawer.vue | 3 + src/runtime/components/DropdownMenu.vue | 50 +++- src/runtime/components/Form.vue | 3 + src/runtime/components/FormField.vue | 3 + src/runtime/components/InputMenu.vue | 3 + src/runtime/components/Kbd.vue | 2 + src/runtime/components/Link.vue | 3 + src/runtime/components/Modal.vue | 3 + src/runtime/components/NavigationMenu.vue | 40 +++- src/runtime/components/Pagination.vue | 3 + src/runtime/components/Popover.vue | 3 + src/runtime/components/RadioGroup.vue | 3 + src/runtime/components/Select.vue | 3 + src/runtime/components/SelectMenu.vue | 3 + src/runtime/components/Skeleton.vue | 3 + src/runtime/components/Slideover.vue | 3 + src/runtime/components/Switch.vue | 3 + src/runtime/components/Tabs.vue | 19 +- src/runtime/components/Toast.vue | 3 + src/runtime/components/Toaster.vue | 7 + src/runtime/components/Tooltip.vue | 3 + src/runtime/composables/extendDevtoolsMeta.ts | 8 + src/templates.ts | 7 + src/unplugin.ts | 2 +- tsconfig.json | 2 +- 100 files changed, 2062 insertions(+), 59 deletions(-) create mode 100644 devtools/app/app.config.ts create mode 100644 devtools/app/app.vue create mode 100644 devtools/app/components/CollapseContainer.vue create mode 100644 devtools/app/components/ComponentPreview.vue create mode 100644 devtools/app/components/ComponentPropInput.vue create mode 100644 devtools/app/components/UILogo.vue create mode 100644 devtools/app/components/inputs/ArrayInput.vue create mode 100644 devtools/app/components/inputs/BooleanInput.vue create mode 100644 devtools/app/components/inputs/NumberInput.vue create mode 100644 devtools/app/components/inputs/ObjectInput.vue create mode 100644 devtools/app/components/inputs/StringEnumInput.vue create mode 100644 devtools/app/components/inputs/StringInput.vue create mode 100644 devtools/app/composables/usePropSchema.ts create mode 100644 devtools/app/composables/useShiki.ts create mode 100644 devtools/app/plugins/prettier.client.ts create mode 100644 devtools/app/workers/prettier.js create mode 100644 devtools/nuxt.config.ts create mode 100644 devtools/package.json create mode 100644 devtools/public/favicon.svg create mode 100644 devtools/test/composables/usePropSchema.test.ts create mode 100644 devtools/test/fixtures/schemas.ts create mode 100644 devtools/test/vitest.config.ts create mode 100644 devtools/tsconfig.json create mode 100644 src/devtools/meta.ts create mode 100644 src/devtools/runtime/DevtoolsRenderer.vue create mode 100644 src/devtools/runtime/examples/AvatarGroupExample.vue create mode 100644 src/devtools/runtime/examples/ButtonGroupExample.vue create mode 100644 src/devtools/runtime/examples/CardExample.vue create mode 100644 src/devtools/runtime/examples/CarouselExample.vue create mode 100644 src/devtools/runtime/examples/ChipExample.vue create mode 100644 src/devtools/runtime/examples/CollapsibleExample.vue create mode 100644 src/devtools/runtime/examples/CommandPaletteExample.vue create mode 100644 src/devtools/runtime/examples/ContainerExample.vue create mode 100644 src/devtools/runtime/examples/ContextMenuExample.vue create mode 100644 src/devtools/runtime/examples/DrawerExample.vue create mode 100644 src/devtools/runtime/examples/DropdownMenuExample.vue create mode 100644 src/devtools/runtime/examples/FormExample.vue create mode 100644 src/devtools/runtime/examples/FormFieldExample.vue create mode 100644 src/devtools/runtime/examples/LinkExample.vue create mode 100644 src/devtools/runtime/examples/ModalExample.vue create mode 100644 src/devtools/runtime/examples/PopoverExample.vue create mode 100644 src/devtools/runtime/examples/SkeletonExample.vue create mode 100644 src/devtools/runtime/examples/SlideoverExample.vue create mode 100644 src/devtools/runtime/examples/ToasterExample.vue create mode 100644 src/devtools/runtime/examples/TooltipExample.vue create mode 100644 src/runtime/composables/extendDevtoolsMeta.ts diff --git a/.github/workflows/ci-v3.yml b/.github/workflows/ci-v3.yml index 4d0019ad..cea46b4a 100644 --- a/.github/workflows/ci-v3.yml +++ b/.github/workflows/ci-v3.yml @@ -43,6 +43,9 @@ jobs: - name: Prepare run: pnpm run dev:prepare + - name: Devtools prepare + run: pnpm run devtools:prepare + - name: Lint run: pnpm run lint diff --git a/.gitignore b/.gitignore index 96dceea8..0a82abf6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +.component-meta/ +component-meta.* + # Nuxt dev/build outputs .output .data diff --git a/build.config.ts b/build.config.ts index 6373e67a..fef778b4 100644 --- a/build.config.ts +++ b/build.config.ts @@ -2,6 +2,9 @@ import { defineBuildConfig } from 'unbuild' export default defineBuildConfig({ entries: [ + // Include devtools runtime files + { input: './src/devtools/runtime', builder: 'mkdist', outDir: 'dist/devtools/runtime' }, + // Vue support './src/unplugin', './src/vite' ], @@ -9,7 +12,8 @@ export default defineBuildConfig({ emitCJS: true }, replace: { - 'process.env.DEV': 'false' + 'process.env.DEV': 'false', + 'process.env.NUXT_UI_DEVTOOLS_LOCAL': 'false' }, hooks: { 'mkdist:entry:options'(ctx, entry, options) { diff --git a/devtools/app/app.config.ts b/devtools/app/app.config.ts new file mode 100644 index 00000000..aec89678 --- /dev/null +++ b/devtools/app/app.config.ts @@ -0,0 +1,8 @@ +export default defineAppConfig({ + ui: { + colors: { + primary: 'green', + neutral: 'zinc' + } + } +}) diff --git a/devtools/app/app.vue b/devtools/app/app.vue new file mode 100644 index 00000000..941a414c --- /dev/null +++ b/devtools/app/app.vue @@ -0,0 +1,222 @@ + + + + + diff --git a/devtools/app/components/CollapseContainer.vue b/devtools/app/components/CollapseContainer.vue new file mode 100644 index 00000000..6b110330 --- /dev/null +++ b/devtools/app/components/CollapseContainer.vue @@ -0,0 +1,43 @@ + + + diff --git a/devtools/app/components/ComponentPreview.vue b/devtools/app/components/ComponentPreview.vue new file mode 100644 index 00000000..fdc2ff4c --- /dev/null +++ b/devtools/app/components/ComponentPreview.vue @@ -0,0 +1,151 @@ + + +