Skip to content

Commit

Permalink
change!: split entry points into client / node
Browse files Browse the repository at this point in the history
  • Loading branch information
enzonotario committed Jan 20, 2025
1 parent 5a9bfce commit 298c933
Show file tree
Hide file tree
Showing 27 changed files with 223 additions and 147 deletions.
16 changes: 13 additions & 3 deletions docs/.vitepress/config.mts
Original file line number Diff line number Diff line change
Expand Up @@ -237,9 +237,19 @@ export default defineConfigWithTheme({
],
vite: {
resolve: {
alias: {
'vitepress-openapi': process.env.NODE_ENV === 'production' ? resolve(__dirname, '../../') : resolve(__dirname, '../../src/'),
},
...(process.env.NODE_ENV === 'production'
? {
alias: {
'vitepress-openapi/client': resolve(__dirname, '../../dist/client'),
'vitepress-openapi': resolve(__dirname, '../../dist/index'),
},
}
: {
alias: {
'vitepress-openapi/client': resolve(__dirname, '../../src/client'),
'vitepress-openapi': resolve(__dirname, '../../src/index'),
},
}),
},
},
})
2 changes: 1 addition & 1 deletion docs/.vitepress/theme/components/sandbox/Sandbox.vue
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<script setup lang="ts">
import { provide, watch } from 'vue'
import { compressToURL, decompressFromURL } from '@amoutonbrady/lz-string'
import { useTheme } from 'vitepress-openapi'
import { useTheme } from 'vitepress-openapi/client'
import { useUrlSearchParams } from '@vueuse/core'
import { ResizableHandle, ResizablePanel, ResizablePanelGroup } from '../ui/resizable'
import { deepUnref } from '../../../../../src/lib/deepUnref'
Expand Down
3 changes: 1 addition & 2 deletions docs/.vitepress/theme/components/theme/ThemeConfig.vue
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
<script setup lang="ts">
import { useTheme } from 'vitepress-openapi'
import { DEFAULT_OPERATION_SLOTS, useTheme } from 'vitepress-openapi/client'
import { inject } from 'vue'
import { DEFAULT_OPERATION_SLOTS } from '../../../../../src'
import type { SandboxData } from '../../sandboxData'
const sandboxData = inject('sandboxData') as SandboxData
Expand Down
4 changes: 0 additions & 4 deletions docs/.vitepress/theme/components/theme/ThemeConfigPopover.vue
Original file line number Diff line number Diff line change
@@ -1,13 +1,9 @@
<script setup lang="ts">
import { inject } from 'vue'
import { Icon } from '@iconify/vue'
import { useToggle } from '@vueuse/core'
import { Popover, PopoverContent, PopoverTrigger } from '../ui/popover'
import type { SandboxData } from '../../sandboxData'
import ThemeConfig from './ThemeConfig.vue'
const sandboxData = inject('sandboxData') as SandboxData
const [isOpen, toggleOpen] = useToggle(false)
</script>

Expand Down
2 changes: 1 addition & 1 deletion docs/.vitepress/theme/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { theme, useOpenapi } from 'vitepress-openapi'
import { theme, useOpenapi } from 'vitepress-openapi/client'
import DefaultTheme from 'vitepress/theme'
import spec from '../../public/openapi.json' assert {type: 'json'}
import ExampleBlock from './components/ExampleBlock.vue'
Expand Down
2 changes: 1 addition & 1 deletion docs/composables/usePlayground.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ The `usePlayground` composable provides functions to manage the Playground.
You can use the `usePlayground` composable to configure the Playground in your `.vitepress/theme/index.js` file, or in any `.md` page/file.

```ts
import { usePlayground } from 'vitepress-openapi'
import { usePlayground } from 'vitepress-openapi/client'

export default {
async enhanceApp({ app, router, siteData }) {
Expand Down
2 changes: 1 addition & 1 deletion docs/composables/useTheme.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ The `useTheme` composable provides functions to configure the theme.
You can use the `useTheme` composable to configure the theme in your `.vitepress/theme/index.js` file, or in any `.md` page/file.

```ts
import { useTheme, locales } from 'vitepress-openapi'
import { useTheme, locales } from 'vitepress-openapi/client'

export default {
async enhanceApp({app, router, siteData}) {
Expand Down
4 changes: 2 additions & 2 deletions docs/customizations/i18n.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ You can use the `useTheme` composable to configure internationalization in your

```vue
<script setup lang="ts">
import { useTheme, locales } from 'vitepress-openapi'
import { useTheme, locales } from 'vitepress-openapi/client'
useTheme({
i18n: {
Expand Down Expand Up @@ -44,7 +44,7 @@ If you're using the built-in VitePress i18n features, you can configure the loca

```vue
<script setup lang="ts">
import { useTheme } from 'vitepress-openapi'
import { useTheme } from 'vitepress-openapi/client'
import { useData } from 'vitepress'
const { lang } = useData()
Expand Down
2 changes: 1 addition & 1 deletion docs/customizations/operation-badges.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ title: vitepress-openapi
You can also customize the prefix of the badges by setting the `operation.badgePrefix.{badgeName}` key in the i18n messages. For example, in your `.vitepress/theme/index.ts`, before calling `theme.enhanceApp({ app })`, you can set the following:

```typescript
import { locales, theme, useTheme } from 'vitepress-openapi'
import { locales, theme, useTheme } from 'vitepress-openapi/client'
import DefaultTheme from 'vitepress/theme'
import 'vitepress-openapi/dist/style.css'

Expand Down
2 changes: 1 addition & 1 deletion docs/customizations/parts/code-samples-example.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<script setup lang="ts">
import { useData } from 'vitepress'
import { useTheme, generateCodeSample } from 'vitepress-openapi'
import { useTheme, generateCodeSample } from 'vitepress-openapi/client'

const { isDark } = useData()

Expand Down
2 changes: 1 addition & 1 deletion docs/customizations/parts/operation-badges-example.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<script setup lang="ts">
import { useData } from 'vitepress'
import { useTheme } from 'vitepress-openapi'
import { useTheme } from 'vitepress-openapi/client'

const { isDark } = useData()

Expand Down
2 changes: 1 addition & 1 deletion docs/customizations/parts/operation-tags-slot-example.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<script setup lang="ts">
import { useData } from 'vitepress'
import { DEFAULT_OPERATION_SLOTS, useTheme } from 'vitepress-openapi'
import { DEFAULT_OPERATION_SLOTS, useTheme } from 'vitepress-openapi/client'

const { isDark } = useData()

Expand Down
2 changes: 1 addition & 1 deletion docs/examples/[exampleSlug].md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ title: vitepress-openapi
<script setup lang="ts">
import { onBeforeMount, onBeforeUnmount } from 'vue'
import { useRoute, useData } from 'vitepress'
import { useTheme } from 'vitepress-openapi'
import { useTheme } from 'vitepress-openapi/client'

const route = useRoute()

Expand Down
18 changes: 9 additions & 9 deletions docs/guide/getting-started.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ In your `.vitepress/theme/index.[js,ts]`, import the theme and the CSS file.
```js [JavaScript]
// .vitepress/theme/index.js
import DefaultTheme from 'vitepress/theme'
import { theme } from 'vitepress-openapi' // [!code ++]
import { theme } from 'vitepress-openapi/client' // [!code ++]
import 'vitepress-openapi/dist/style.css' // [!code ++]

export default {
Expand All @@ -73,7 +73,7 @@ export default {
// .vitepress/theme/index.ts
import DefaultTheme from 'vitepress/theme'
import type { Theme } from 'vitepress'
import { theme } from 'vitepress-openapi' // [!code ++]
import { theme } from 'vitepress-openapi/client' // [!code ++]
import 'vitepress-openapi/dist/style.css' // [!code ++]
export default {
Expand Down Expand Up @@ -101,8 +101,8 @@ In your `.vitepress/theme/index.[js,ts]` file, import the OpenAPI specification
```js [JavaScript]
// .vitepress/theme/index.js
import DefaultTheme from 'vitepress/theme'
import { theme } from 'vitepress-openapi' // [!code --]
import { theme, useOpenapi } from 'vitepress-openapi' // [!code ++]
import { theme } from 'vitepress-openapi/client' // [!code --]
import { theme, useOpenapi } from 'vitepress-openapi/client' // [!code ++]
import 'vitepress-openapi/dist/style.css'

import spec from '../../public/openapi.json' // [!code ++]
Expand All @@ -126,8 +126,8 @@ export default {
// .vitepress/theme/index.ts
import DefaultTheme from 'vitepress/theme'
import type { Theme } from 'vitepress'
import { theme } from 'vitepress-openapi' // [!code --]
import { theme, useOpenapi } from 'vitepress-openapi'// [!code ++]
import { theme } from 'vitepress-openapi/client' // [!code --]
import { theme, useOpenapi } from 'vitepress-openapi/client'// [!code ++]
import 'vitepress-openapi/dist/style.css'

import spec from '../../public/openapi.json' assert { type: 'json' } // [!code ++]
Expand Down Expand Up @@ -216,7 +216,7 @@ If you are using `useOpenapi` in your `.vitepress/theme/index.[js,ts]` file, you
```js [JavaScript]
// .vitepress/theme/index.js
import DefaultTheme from 'vitepress/theme'
import { theme, useOpenapi } from 'vitepress-openapi'
import { theme, useOpenapi } from 'vitepress-openapi/client'
import 'vitepress-openapi/dist/style.css'

import spec from '../../public/openapi.json'
Expand Down Expand Up @@ -283,7 +283,7 @@ title: vitepress-openapi

<script setup>
import { useData } from 'vitepress'
import { useTheme } from 'vitepress-openapi' // [!code ++]
import { useTheme } from 'vitepress-openapi/client' // [!code ++]
import spec from '../public/openapi.json'

const { isDark } = useData()
Expand All @@ -305,7 +305,7 @@ title: vitepress-openapi

<script setup>
import { useRoute, useData } from 'vitepress'
import { useTheme } from 'vitepress-openapi' // [!code ++]
import { useTheme } from 'vitepress-openapi/client' // [!code ++]
import spec from '../public/openapi.json'

const route = useRoute()
Expand Down
6 changes: 3 additions & 3 deletions docs/sidebar/sidebar-items.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ The `useSidebar` composable provides functions to generate sidebar items based o
To generate sidebar items grouped by tags, you can use the `generateSidebarGroups` function. Configure your `.vitepress/config.js` as follows:

```ts
import { useSidebar, useOpenapi } from 'vitepress-openapi'
import { useSidebar, useOpenapi } from 'vitepress-openapi/client'
import spec from '../public/openapi.json' assert { type: 'json' }

const sidebar = useSidebar({
Expand Down Expand Up @@ -60,7 +60,7 @@ module.exports = {
To generate sidebar items by tags, you can use the `itemsByTags` function. Configure your `.vitepress/config.js` as follows:

```ts
import { useSidebar, useOpenapi } from 'vitepress-openapi'
import { useSidebar, useOpenapi } from 'vitepress-openapi/client'
import spec from '../public/openapi.json' assert { type: 'json' }

const sidebar = useSidebar({
Expand Down Expand Up @@ -100,7 +100,7 @@ module.exports = {
To generate sidebar items by paths, you can use the `itemsByPaths` function. Configure your `.vitepress/config.js` as follows:

```ts
import { useSidebar, useOpenapi } from 'vitepress-openapi'
import { useSidebar, useOpenapi } from 'vitepress-openapi/client'
import spec from '../public/openapi.json' assert { type: 'json' }

const sidebar = useSidebar({ spec })
Expand Down
2 changes: 1 addition & 1 deletion docs/tests/[testSlug].md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ title: vitepress-openapi
<script setup lang="ts">
import { onUnmounted } from 'vue'
import { useRoute, useData } from 'vitepress'
import { useTheme } from 'vitepress-openapi'
import { useTheme } from 'vitepress-openapi/client'

const route = useRoute()

Expand Down
12 changes: 8 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,17 @@
],
"exports": {
".": {
"import": "./dist/vitepress-openapi.es.js",
"require": "./dist/vitepress-openapi.umd.js"
"import": "./dist/vitepress-openapi.node.es.js",
"require": "./dist/vitepress-openapi.node.umd.js"
},
"./client": {
"import": "./dist/vitepress-openapi.client.es.js",
"require": "./dist/vitepress-openapi.client.umd.js"
},
"./dist/style.css": "./dist/style.css"
},
"main": "./dist/vitepress-openapi.es.js",
"module": "./dist/vitepress-openapi.es.js",
"main": "./dist/vitepress-openapi.node.es.js",
"module": "./dist/vitepress-openapi.node.es.js",
"types": "./dist/types/index.d.ts",
"files": [
"dist",
Expand Down
73 changes: 73 additions & 0 deletions src/client.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
import type { Component } from 'vue'
import { watch } from 'vue'
import type { Awaitable } from 'vitepress'
import type { EnhanceAppContext, Theme } from 'vitepress/client'
import * as VueI18n from 'vue-i18n'
import * as components from './components'
import { DEFAULT_OPERATION_SLOTS, useTheme } from './composables/useTheme'
import { useShiki } from './composables/useShiki'
import type { createOpenApiInstance } from './lib/createOpenApiInstance'

import 'tailwindcss/tailwind.css'
import './style.css'
import './json.css'

interface OAEnhanceAppContext extends EnhanceAppContext {
openapi?: ReturnType<typeof createOpenApiInstance> | null
}

interface VPTheme {
Layout: Component
enhanceApp: (ctx: OAEnhanceAppContext) => Awaitable<void>
extends?: Theme
}

export const theme = {
enhanceApp({ app, openapi = null }) {
if (openapi) {
app.provide('openapi', openapi)
}

const themeConfig = useTheme()

const i18nConfig = themeConfig.getI18nConfig()
const i18n: any = VueI18n.createI18n({
legacy: false,
locale: i18nConfig.locale.value,
fallbackLocale: i18nConfig.fallbackLocale.value,
messages: i18nConfig.messages,
})
app.use(i18n)

watch(
() => themeConfig.getLocale(),
() => {
if (i18n.global.locale.value !== themeConfig.getLocale()) {
i18n.global.locale.value = themeConfig.getLocale()
}
},
{
immediate: true,
},
)

Object.entries(components).forEach(([key, component]) => {
app.component(key, component)
})

useShiki().initShiki()
},
} as VPTheme

export { useOpenapi } from './composables/useOpenapi'
export { useTheme } from './composables/useTheme'
export { DEFAULT_OPERATION_SLOTS }
export { useShiki } from './composables/useShiki'
export { usePlayground } from './composables/usePlayground'
export { OpenApi } from './lib/OpenApi'
export { getOpenApiInstance } from './lib/getOpenApiInstance'
export { createOpenApiInstance } from './lib/createOpenApiInstance'
export { OARequest } from './lib/codeSamples/request'
export type { IOARequest } from './lib/codeSamples/request'
export { generateCodeSample } from './lib/codeSamples/generateCodeSample'
export { locales } from './locales'
6 changes: 5 additions & 1 deletion src/composables/useOpenapi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,11 @@ export function useOpenapi({
}

function addSchema({ id, spec, config }: { id: string, spec: OpenAPI.Document, config?: PartialUseThemeConfig }) {
const openapi = createOpenApiInstance({ spec })
const openapi = createOpenApiInstance({
spec,
defaultTag: config?.spec?.defaultTag,
defaultTagDescription: config?.spec?.defaultTagDescription,
})

// @ts-expect-error: This adds all the properties of the OpenAPI instance to the schema.
schemas.set(id, {
Expand Down
13 changes: 12 additions & 1 deletion src/composables/usePaths.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,21 @@ import { prepareOpenAPI } from '../lib/prepareOpenAPI/prepareOpenAPI'

export function usePaths({
spec,
defaultTag = undefined,
defaultTagDescription = undefined,
}: {
spec: OpenAPI.Document
defaultTag?: string
defaultTagDescription?: string
}) {
const openapi = OpenApi({ spec, transformedSpec: prepareOpenAPI(spec) })
const openapi = OpenApi({
spec,
transformedSpec: prepareOpenAPI({
spec,
defaultTag,
defaultTagDescription,
}),
})

function getTags() {
return openapi.getFilteredTags()
Expand Down
Loading

0 comments on commit 298c933

Please sign in to comment.