From 1f256d564932b5104203e2df13e361b1275885cc Mon Sep 17 00:00:00 2001 From: Jonas <121523551+jonasfroeller@users.noreply.github.com> Date: Mon, 30 Sep 2024 21:23:32 +0200 Subject: [PATCH 1/4] fix: README.md configuration reference urls --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 871f02f..5993cc0 100644 --- a/README.md +++ b/README.md @@ -49,13 +49,13 @@ Then go to `http://localhost:8080/swagger`. ## provider @default 'scalar' -Choose between [Scalar](https://swagger.io/specification/v2/) & [SwaggerUI](https://github.com/swagger-api/swagger-ui) +Choose between [Scalar](https://github.com/scalar/scalar) & [SwaggerUI](https://github.com/swagger-api/swagger-ui) ## scalar -Customize scalarConfig, refers to [Scalar config](https://github.com/scalar/scalar) +Customize scalarConfig, refers to [Scalar config](https://github.com/scalar/scalar/blob/main/documentation/configuration.md) ## swagger -Customize Swagger config, refers to [Swagger 3.0.3 config](https://swagger.io/specification/v3/) +Customize Swagger config, refers to [Swagger 3.0.3 config](https://swagger.io/specification/v3) ## path @default '/swagger' From 6efc3fa64202e37cc5df902feeb7bce227cb667e Mon Sep 17 00:00:00 2001 From: inyourtime Date: Thu, 3 Oct 2024 10:01:58 +0700 Subject: [PATCH 2/4] update scalar config to use @scalar/types --- bun.lockb | Bin 209841 -> 92772 bytes example/index.ts | 5 +- package.json | 7 +- src/index.ts | 2 +- src/scalar/index.ts | 2 +- src/scalar/types/index.ts | 12 - src/scalar/types/unjead.ts | 1002 ------------------------------------ src/types.ts | 4 +- 8 files changed, 6 insertions(+), 1028 deletions(-) delete mode 100644 src/scalar/types/index.ts delete mode 100644 src/scalar/types/unjead.ts diff --git a/bun.lockb b/bun.lockb index 147a7ee3decb9734309fe986dc6109aec73b3b57..6fd79990d31945755cf65f86d0a825050370de2c 100755 GIT binary patch delta 16723 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 1.1.0-rc.2", "eslint": "9.6.0", @@ -74,6 +68,7 @@ "typescript": "^5.5.3" }, "dependencies": { + "@scalar/types": "^0.0.12", "openapi-types": "^12.1.3", "pathe": "^1.1.2" } diff --git a/src/index.ts b/src/index.ts index e1dcf1c..2a1a284 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,7 +7,7 @@ import { ScalarRender } from './scalar' import { filterPaths, registerSchemaPath } from './utils' import type { OpenAPIV3 } from 'openapi-types' -import type { ReferenceConfiguration } from '@scalar/api-reference' +import type { ReferenceConfiguration } from '@scalar/types' import type { ElysiaSwaggerConfig } from './types' /** diff --git a/src/scalar/index.ts b/src/scalar/index.ts index fbe8558..91d1600 100644 --- a/src/scalar/index.ts +++ b/src/scalar/index.ts @@ -1,6 +1,6 @@ import scalarElysiaTheme from './theme' import type { OpenAPIV3 } from 'openapi-types' -import type { ReferenceConfiguration } from '@scalar/api-reference' +import type { ReferenceConfiguration } from '@scalar/types' export const ScalarRender = ( info: OpenAPIV3.InfoObject, diff --git a/src/scalar/types/index.ts b/src/scalar/types/index.ts deleted file mode 100644 index 53d171f..0000000 --- a/src/scalar/types/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -export type SpecConfiguration = { - /** URL to a Swagger/OpenAPI file */ - url?: string; - /** Swagger/Open API spec */ - content?: string | Record | (() => Record); - /** The result of @scalar/swagger-parser */ - preparsedContent?: Record; -}; - -export type ReferenceLayoutType = 'modern' | 'classic'; - -export type ThemeId = 'alternate' | 'default' | 'moon' | 'purple' | 'solarized' | 'none'; diff --git a/src/scalar/types/unjead.ts b/src/scalar/types/unjead.ts deleted file mode 100644 index 1dd01d3..0000000 --- a/src/scalar/types/unjead.ts +++ /dev/null @@ -1,1002 +0,0 @@ -type Booleanable = boolean | 'false' | 'true' | ''; -type Stringable = string | Booleanable | number; -type Arrayable = T | Array; -interface DataKeys { - [key: `data-${string}`]: Stringable; -} -type DefinedValueOrEmptyObject> = [T] extends [undefined] ? ({}) : T; -type Merge, D = {}> = [T] extends [undefined] ? D : D & T; -interface MergeHead { - base?: {}; - link?: {}; - meta?: {}; - style?: {}; - script?: {}; - noscript?: {}; - htmlAttrs?: {}; - bodyAttrs?: {}; -} -type MaybePromiseProps = T | { - [key in keyof T]?: T[key] | Promise; -}; - -type ReferrerPolicy = '' | 'no-referrer' | 'no-referrer-when-downgrade' | 'origin' | 'origin-when-cross-origin' | 'same-origin' | 'strict-origin' | 'strict-origin-when-cross-origin' | 'unsafe-url'; - -interface MetaFlatArticle { - /** - * Writers of the article. - * @example ['https://example.com/some.html', 'https://example.com/one.html'] - */ - articleAuthor?: string[]; - /** - * When the article is out of date after. - * @example '1970-01-01T00:00:00.000Z' - */ - articleExpirationTime?: string; - /** - * When the article was last changed. - * @example '1970-01-01T00:00:00.000Z' - */ - articleModifiedTime?: string; - /** - * When the article was first published. - * @example '1970-01-01T00:00:00.000Z' - */ - articlePublishedTime?: string; - /** - * A high-level section name. - * @example 'Technology' - */ - articleSection?: string; - /** - * Tag words associated with this article. - * @example ['Apple', 'Steve Jobs] - */ - articleTag?: string[]; -} -interface MetaFlatBook { - /** - * Who wrote this book. - * @example ['https://example.com/some.html', 'https://example.com/one.html'] - */ - bookAuthor?: string[]; - /** - * The ISBN. - * @example '978-3-16-148410-0' - */ - bookIsbn?: string; - /** - * The date the book was released. - * @example '1970-01-01T00:00:00.000Z' - */ - bookReleaseDate?: string; - /** - * Tag words associated with this book. - * @example ['Apple', 'Steve Jobs] - */ - bookTag?: string[]; -} -interface MetaFlatProfile { - /** - * A name normally given to an individual by a parent or self-chosen. - */ - profileFirstName?: string; - /** - * Their gender. - */ - profileGender?: 'male' | 'female' | string; - /** - * A name inherited from a family or marriage and by which the individual is commonly known. - */ - profileLastName?: string; - /** - * A short unique string to identify them. - */ - profileUsername?: string; -} -interface MetaFlat extends MetaFlatArticle, MetaFlatBook, MetaFlatProfile { - /** - * This attribute declares the document's character encoding. - * If the attribute is present, its value must be an ASCII case-insensitive match for the string "utf-8", - * because UTF-8 is the only valid encoding for HTML5 documents. - * `` elements which declare a character encoding must be located entirely within the first 1024 bytes - * of the document. - * - * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-charset - */ - charset: 'utf-8' | (string & Record); - /** - * Use this tag to provide a short description of the page. - * In some situations, this description is used in the snippet shown in search results. - * - * @see https://developers.google.com/search/docs/advanced/appearance/snippet#meta-descriptions - */ - description: string; - /** - * Specifies one or more color schemes with which the document is compatible. - * The browser will use this information in tandem with the user's browser or device settings to determine what colors - * to use for everything from background and foregrounds to form controls and scrollbars. - * The primary use for `` is to indicate compatibility with—and order of preference - * for—light and dark color modes. - * - * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta/name#normal - */ - colorScheme: 'normal' | 'light dark' | 'dark light' | 'only light' | (string & Record); - /** - * The name of the application running in the web page. - * - * Uses: - * - When adding the page to the home screen. - * - * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta/name - */ - applicationName: string; - /** - * The name of the document's author. - * - * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta/name - */ - author: string; - /** - * The name of the creator of the document, such as an organization or institution. - * - * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta/name#other_metadata_names - */ - creator: string; - /** - * The name of the document's publisher. - * - * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta/name#other_metadata_names - */ - publisher: string; - /** - * The identifier of the software that generated the page. - * - * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta/name#standard_metadata_names_defined_in_the_html_specification - */ - generator: string; - /** - * Controls the HTTP Referer header of requests sent from the document. - * - * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta/name#standard_metadata_names_defined_in_the_html_specification - */ - referrer: ReferrerPolicy; - /** - * This tag tells the browser how to render a page on a mobile device. - * Presence of this tag indicates to Google that the page is mobile friendly. - * - * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta/name#standard_metadata_names_defined_in_other_specifications - */ - viewport: 'width=device-width, initial-scale=1.0' | string | Partial<{ - /** - * Defines the pixel width of the viewport that you want the web site to be rendered at. - */ - width: number | string | 'device-width'; - /** - * Defines the height of the viewport. Not used by any browser. - */ - height: number | string | 'device-height'; - /** - * Defines the ratio between the device width - * (device-width in portrait mode or device-height in landscape mode) and the viewport size. - * - * @minimum 0 - * @maximum 10 - */ - initialScale: '1.0' | number | (string & Record); - /** - * Defines the maximum amount to zoom in. - * It must be greater or equal to the minimum-scale or the behavior is undefined. - * Browser settings can ignore this rule and iOS10+ ignores it by default. - * - * @minimum 0 - * @maximum 10 - */ - maximumScale: number | string; - /** - * Defines the minimum zoom level. It must be smaller or equal to the maximum-scale or the behavior is undefined. - * Browser settings can ignore this rule and iOS10+ ignores it by default. - * - * @minimum 0 - * @maximum 10 - */ - minimumScale: number | string; - /** - * If set to no, the user is unable to zoom in the webpage. - * The default is yes. Browser settings can ignore this rule, and iOS10+ ignores it by default. - */ - userScalable: 'yes' | 'no'; - /** - * The auto value doesn't affect the initial layout viewport, and the whole web page is viewable. - * - * The contain value means that the viewport is scaled to fit the largest rectangle inscribed within the display. - * - * The cover value means that the viewport is scaled to fill the device display. - * It is highly recommended to make use of the safe area inset variables to ensure that important content - * doesn't end up outside the display. - */ - viewportFit: 'auto' | 'contain' | 'cover'; - }>; - /** - * Control the behavior of search engine crawling and indexing. - * - * @see https://developers.google.com/search/docs/crawling-indexing/robots-meta-tag - */ - robots: 'noindex, nofollow' | 'index, follow' | string | Partial<{ - /** - * Allow search engines to index this page. - * - * Note: This is not officially supported by Google but is used widely. - */ - index: Booleanable; - /** - * Allow search engines to follow links on this page. - * - * Note: This is not officially supported by Google but is used widely. - */ - follow: Booleanable; - /** - * There are no restrictions for indexing or serving. - * This directive is the default value and has no effect if explicitly listed. - */ - all: Booleanable; - /** - * Do not show this page, media, or resource in search results. - * If you don't specify this directive, the page, media, or resource may be indexed and shown in search results. - */ - noindex: Booleanable; - /** - * Do not follow the links on this page. - * If you don't specify this directive, Google may use the links on the page to discover those linked pages. - */ - nofollow: Booleanable; - /** - * Equivalent to noindex, nofollow. - */ - none: Booleanable; - /** - * Do not show a cached link in search results. - * If you don't specify this directive, - * Google may generate a cached page and users may access it through the search results. - */ - noarchive: Booleanable; - /** - * Do not show a sitelinks search box in the search results for this page. - * If you don't specify this directive, Google may generate a search box specific to your site in search results, - * along with other direct links to your site. - */ - nositelinkssearchbox: Booleanable; - /** - * - * Do not show a text snippet or video preview in the search results for this page. - * A static image thumbnail (if available) may still be visible, when it results in a better user experience. - */ - nosnippet: Booleanable; - /** - * Google is allowed to index the content of a page if it's embedded in another - * page through iframes or similar HTML tags, in spite of a noindex directive. - * - * indexifembedded only has an effect if it's accompanied by noindex. - */ - indexifembedded: Booleanable; - /** - * Use a maximum of [number] characters as a textual snippet for this search result. - */ - maxSnippet: number | string; - /** - * Set the maximum size of an image preview for this page in a search results. - */ - maxImagePreview: 'none' | 'standard' | 'large'; - /** - * Use a maximum of [number] seconds as a video snippet for videos on this page in search results. - */ - maxVideoPreview: number | string; - /** - * Don't offer translation of this page in search results. - */ - notranslate: Booleanable; - /** - * Do not show this page in search results after the specified date/time. - */ - unavailable_after: string; - /** - * Do not index images on this page. - */ - noimageindex: Booleanable; - }>; - /** - * Special meta tag for controlling Google's indexing behavior. - * - * @see https://developers.google.com/search/docs/crawling-indexing/special-tags - */ - google: - /** - * When users search for your site, Google Search results sometimes display a search box specific to your site, - * along with other direct links to your site. This tag tells Google not to show the sitelinks search box. - */ - 'nositelinkssearchbox' | - /** - * Prevents various Google text-to-speech services from reading aloud web pages using text-to-speech (TTS). - */ - 'nopagereadaloud'; - /** - * Control how Google indexing works specifically for the googlebot crawler. - * - * @see https://developers.google.com/search/docs/crawling-indexing/robots-meta-tag - */ - googlebot: - /** - * When Google recognizes that the contents of a page aren't in the language that the user likely wants to read, - * Google may provide a translated title link and snippet in search results. - */ - 'notranslate' | 'noimageindex' | 'noarchive' | 'nosnippet' | 'max-snippet' | 'max-image-preview' | 'max-video-preview'; - /** - * Control how Google indexing works specifically for the googlebot-news crawler. - * - * @see https://developers.google.com/search/docs/crawling-indexing/robots-meta-tag - */ - googlebotNews: 'noindex' | 'nosnippet' | 'notranslate' | 'noimageindex'; - /** - * You can use this tag on the top-level page of your site to verify ownership for Search Console. - * - * @see https://developers.google.com/search/docs/crawling-indexing/special-tags - */ - googleSiteVerification: string; - /** - * Labels a page as containing adult content, to signal that it be filtered by SafeSearch results - * . - * @see https://developers.google.com/search/docs/advanced/guidelines/safesearch - */ - rating: 'adult'; - /** - * The canonical URL for your page. - * - * This should be the undecorated URL, without session variables, user identifying parameters, or counters. - * Likes and Shares for this URL will aggregate at this URL. - * - * For example: mobile domain URLs should point to the desktop version of the URL as the canonical URL to aggregate - * Likes and Shares across different versions of the page. - * - * @see https://ogp.me/#metadata - */ - ogUrl: string; - /** - * The title of your page without any branding such as your site name. - * - * @see https://ogp.me/#metadata - */ - ogTitle: string; - /** - * A brief description of the content, usually between 2 and 4 sentences. - * - * @see https://ogp.me/#optional - */ - ogDescription: string; - /** - * The type of media of your content. This tag impacts how your content shows up in Feed. If you don't specify a type, - * the default is website. - * Each URL should be a single object, so multiple og:type values are not possible. - * - * @see https://ogp.me/#metadata - */ - ogType: 'website' | 'article' | 'book' | 'profile' | 'music.song' | 'music.album' | 'music.playlist' | 'music.radio_status' | 'video.movie' | 'video.episode' | 'video.tv_show' | 'video.other'; - /** - * The locale of the resource. Defaults to en_US. - * - * @see https://ogp.me/#optional - */ - ogLocale: string; - /** - * An array of other locales this page is available in. - * - * @see https://ogp.me/#optional - */ - ogLocaleAlternate: Arrayable; - /** - * The word that appears before this object's title in a sentence. - * An enum of (a, an, the, "", auto). - * If auto is chosen, the consumer of your data should choose between "a" or "an". - * Default is "" (blank). - * - * @see https://ogp.me/#optional - */ - ogDeterminer: 'a' | 'an' | 'the' | '' | 'auto'; - /** - * If your object is part of a larger website, the name which should be displayed for the overall site. e.g., "IMDb". - * - * @see https://ogp.me/#optional - */ - ogSiteName: string; - /** - * The URL for the video. If you want the video to play in-line in Feed, you should use the https:// URL if possible. - * - * @see https://ogp.me/#type_video - */ - ogVideo: string | Arrayable<{ - /** - * Equivalent to og:video - */ - url: string; - /** - * - * Secure URL for the video. Include this even if you set the secure URL in og:video. - */ - secureUrl?: string; - /** - * MIME type of the video. - */ - type?: 'application/x-shockwave-flash' | 'video/mp4'; - /** - * Width of video in pixels. This property is required for videos. - */ - width?: string | number; - /** - * Height of video in pixels. This property is required for videos. - */ - height?: string | number; - /** - * A text description of the video. - */ - alt?: string; - }>; - /** - * Equivalent to og:video - * - * @see https://ogp.me/#type_video - */ - ogVideoUrl: string; - /** - * - * Secure URL for the video. Include this even if you set the secure URL in og:video. - * - * @see https://ogp.me/#type_video - */ - ogVideoSecureUrl: string; - /** - * MIME type of the video. - * - * @see https://ogp.me/#type_video - */ - ogVideoType: 'application/x-shockwave-flash' | 'video/mp4'; - /** - * Width of video in pixels. This property is required for videos. - * - * @see https://ogp.me/#type_video - */ - ogVideoWidth: string | number; - /** - * Height of video in pixels. This property is required for videos. - * - * @see https://ogp.me/#type_video - */ - ogVideoHeight: string | number; - /** - * A text description of the video. - * - * @see https://ogp.me/#type_video - */ - ogVideoAlt: string; - /** - * The URL of the image that appears when someone shares the content. - * - * @see https://developers.facebook.com/docs/sharing/webmasters#images - */ - ogImage: string | Arrayable<{ - /** - * Equivalent to og:image - */ - url: string; - /** - * - * https:// URL for the image - */ - secureUrl?: string; - /** - * MIME type of the image. - */ - type?: 'image/jpeg' | 'image/gif' | 'image/png'; - /** - * Width of image in pixels. Specify height and width for your image to ensure that the image loads properly the first time it's shared. - */ - width?: '1200' | string | number; - /** - * Height of image in pixels. Specify height and width for your image to ensure that the image loads properly the first time it's shared. - */ - height?: '630' | string | number; - /** - * A description of what is in the image (not a caption). If the page specifies an og:image, it should specify og:image:alt. - */ - alt?: string; - }>; - /** - * Equivalent to og:image - * - * @see https://developers.facebook.com/docs/sharing/webmasters#images - */ - ogImageUrl: string; - /** - * - * https:// URL for the image - * - * @see https://developers.facebook.com/docs/sharing/webmasters#images - */ - ogImageSecureUrl: string; - /** - * MIME type of the image. - * - * @see https://developers.facebook.com/docs/sharing/webmasters#images - */ - ogImageType: 'image/jpeg' | 'image/gif' | 'image/png'; - /** - * Width of image in pixels. Specify height and width for your image to ensure that the image loads properly the first time it's shared. - * - * @see https://developers.facebook.com/docs/sharing/webmasters#images - */ - ogImageWidth: '1200' | string | number; - /** - * Height of image in pixels. Specify height and width for your image to ensure that the image loads properly the first time it's shared. - * - * @see https://developers.facebook.com/docs/sharing/webmasters#images - */ - ogImageHeight: '630' | string | number; - /** - * A description of what is in the image (not a caption). If the page specifies an og:image, it should specify og:image:alt. - * - * @see https://developers.facebook.com/docs/sharing/webmasters#images - */ - ogImageAlt: string; - /** - * The URL for an audio file to accompany this object. - * - * @see https://ogp.me/#optional - */ - ogAudio: string | Arrayable<{ - /** - * Equivalent to og:audio - */ - url: string; - /** - * Secure URL for the audio. Include this even if you set the secure URL in og:audio. - */ - secureUrl?: string; - /** - * MIME type of the audio. - */ - type?: 'audio/mpeg' | 'audio/ogg' | 'audio/wav'; - }>; - /** - * Equivalent to og:audio - * - * @see https://ogp.me/#optional - */ - ogAudioUrl: string; - /** - * Secure URL for the audio. Include this even if you set the secure URL in og:audio. - * - * @see https://ogp.me/#optional - */ - ogAudioSecureUrl: string; - /** - * MIME type of the audio. - * - * @see https://ogp.me/#optional - */ - ogAudioType: 'audio/mpeg' | 'audio/ogg' | 'audio/wav'; - /** - * Your Facebook app ID. - * - * In order to use Facebook Insights you must add the app ID to your page. - * Insights lets you view analytics for traffic to your site from Facebook. Find the app ID in your App Dashboard. - * - * @see https://developers.facebook.com/docs/sharing/webmasters#basic - */ - fbAppId: string | number; - /** - * The card type - * - * Used with all cards - * - * @see https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/abouts-cards - */ - twitterCard: 'summary' | 'summary_large_image' | 'app' | 'player'; - /** - * Title of content (max 70 characters) - * - * Used with summary, summary_large_image, player cards - * - * Same as `og:title` - * - * @maxLength 70 - * @see https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/abouts-cards - */ - twitterTitle: string; - /** - * Description of content (maximum 200 characters) - * - * Used with summary, summary_large_image, player cards. - * - * Same as `og:description` - * - * @maxLength 200 - * @see https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/abouts-cards - */ - twitterDescription: string; - /** - * URL of image to use in the card. - * Images must be less than 5MB in size. - * JPG, PNG, WEBP and GIF formats are supported. - * Only the first frame of an animated GIF will be used. SVG is not supported. - * - * Used with summary, summary_large_image, player cards - * - * Same as `og:image`. - * - * @see https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/abouts-cards - */ - twitterImage: string | Arrayable<{ - /** - * Equivalent to twitter:image - */ - url: string; - /** - * MIME type of the image. - * @deprecated Twitter removed this property from their card specification. - */ - type?: 'image/jpeg' | 'image/gif' | 'image/png'; - /** - * Width of image in pixels. Specify height and width for your image to ensure that the image loads properly the first time it's shared. - * @deprecated Twitter removed this property from their card specification. - */ - width?: '1200' | string | number; - /** - * Height of image in pixels. Specify height and width for your image to ensure that the image loads properly the first time it's shared. - * @deprecated Twitter removed this property from their card specification. - */ - height?: '630' | string | number; - /** - * A description of what is in the image (not a caption). If the page specifies an og:image, it should specify og:image:alt. - */ - alt?: string; - }>; - /** - * The width of the image in pixels. - * - * Note: This is not officially documented. - * - * Same as `og:image:width` - * - * @deprecated Twitter removed this property from their card specification. - * @see https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/abouts-cards - */ - twitterImageWidth: string | number; - /** - * The height of the image in pixels. - * - * Note: This is not officially documented. - * - * Same as `og:image:height` - * - * @deprecated Twitter removed this property from their card specification. - * @see https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/abouts-cards - */ - twitterImageHeight: string | number; - /** - * The type of the image. - * - * Note: This is not officially documented. - * - * Same as `og:image:type` - * - * @deprecated Twitter removed this property from their card specification. - * @see https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/abouts-cards - */ - twitterImageType: 'image/jpeg' | 'image/gif' | 'image/png'; - /** - * A text description of the image conveying the essential nature of an image to users who are visually impaired. - * Maximum 420 characters. - * - * Used with summary, summary_large_image, player cards - * - * Same as `og:image:alt`. - * - * @maxLength 420 - * @see https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/abouts-cards - */ - twitterImageAlt: string; - /** - * The @username of website. Either twitter:site or twitter:site:id is required. - * - * Used with summary, summary_large_image, app, player cards - * - * @example @harlan_zw - * @see https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/markup - */ - twitterSite: string; - /** - * Same as twitter:site, but the user’s Twitter ID. Either twitter:site or twitter:site:id is required. - * - * Used with summary, summary_large_image, player cards - * - * @example 1296047337022742529 - * @see https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/markup - */ - twitterSiteId: string | number; - /** - * The @username who created the pages content. - * - * Used with summary_large_image cards - * - * @example harlan_zw - * @see https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/markup - */ - twitterCreator: string; - /** - * Twitter user ID of content creator - * - * Used with summary, summary_large_image cards - * - * @see https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/markup - */ - twitterCreatorId: string | number; - /** - * HTTPS URL of player iframe - * - * Used with player card - * - * @see https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/markup - */ - twitterPlayer: string; - /** - * - * Width of iframe in pixels - * - * Used with player card - * - * @see https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/markup - */ - twitterPlayerWidth: string | number; - /** - * Height of iframe in pixels - * - * Used with player card - * - * @see https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/markup - */ - twitterPlayerHeight: string | number; - /** - * URL to raw video or audio stream - * - * Used with player card - * - * @see https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/markup - */ - twitterPlayerStream: string; - /** - * Name of your iPhone app - * - * Used with app card - * - * @see https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/markup - */ - twitterAppNameIphone: string; - /** - * Your app ID in the iTunes App Store - * - * Used with app card - * - * @see https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/markup - */ - twitterAppIdIphone: string; - /** - * Your app’s custom URL scheme (you must include ”://” after your scheme name) - * - * Used with app card - * - * @see https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/markup - */ - twitterAppUrlIphone: string; - /** - * Name of your iPad optimized app - * - * Used with app card - * - * @see https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/markup - */ - twitterAppNameIpad: string; - /** - * Your app ID in the iTunes App Store - * - * Used with app card - * - * @see https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/markup - */ - twitterAppIdIpad: string; - /** - * Your app’s custom URL scheme - * - * Used with app card - * - * @see https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/markup - */ - twitterAppUrlIpad: string; - /** - * Name of your Android app - * - * Used with app card - * - * @see https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/markup - */ - twitterAppNameGoogleplay: string; - /** - * Your app ID in the Google Play Store - * - * Used with app card - * - * @see https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/markup - */ - twitterAppIdGoogleplay: string; - /** - * Your app’s custom URL scheme - * - * @see https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/markup - */ - twitterAppUrlGoogleplay: string; - /** - * Top customizable data field, can be a relatively short string (ie “$3.99”) - * - * Used by Slack. - * - * @see https://api.slack.com/reference/messaging/link-unfurling#classic_unfurl - */ - twitterData1: string; - /** - * Customizable label or units for the information in twitter:data1 (best practice: use all caps) - * - * Used by Slack. - * - * @see https://api.slack.com/reference/messaging/link-unfurling#classic_unfurl - */ - twitterLabel1: string; - /** - * Bottom customizable data field, can be a relatively short string (ie “Seattle, WA”) - * - * Used by Slack. - * - * @see https://api.slack.com/reference/messaging/link-unfurling#classic_unfurl - */ - twitterData2: string; - /** - * Customizable label or units for the information in twitter:data2 (best practice: use all caps) - * - * Used by Slack. - * - * @see https://api.slack.com/reference/messaging/link-unfurling#classic_unfurl - */ - twitterLabel2: string; - /** - * Indicates a suggested color that user agents should use to customize the display of the page or - * of the surrounding user interface. - * - * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta/name - * @example `#4285f4` or `{ color: '#4285f4', media: '(prefers-color-scheme: dark)'}` - */ - themeColor: string | Arrayable<{ - /** - * A valid CSS color value that matches the value used for the `theme-color` CSS property. - * - * @example `#4285f4` - */ - content: string; - /** - * A valid media query that defines when the value should be used. - * - * @example `(prefers-color-scheme: dark)` - */ - media: '(prefers-color-scheme: dark)' | '(prefers-color-scheme: light)' | string; - }>; - /** - * Sets whether a web application runs in full-screen mode. - */ - mobileWebAppCapable: 'yes'; - /** - * Sets whether a web application runs in full-screen mode. - * - * @see https://developer.apple.com/library/archive/documentation/AppleApplications/Reference/SafariHTMLRef/Articles/MetaTags.html - */ - appleMobileWebAppCapable: 'yes'; - /** - * Sets the style of the status bar for a web application. - * - * @see https://developer.apple.com/library/archive/documentation/AppleApplications/Reference/SafariHTMLRef/Articles/MetaTags.html - */ - appleMobileWebAppStatusBarStyle: 'default' | 'black' | 'black-translucent'; - /** - * Make the app title different from the page title. - */ - appleMobileWebAppTitle: string; - /** - * Promoting Apps with Smart App Banners - * - * @see https://developer.apple.com/documentation/webkit/promoting_apps_with_smart_app_banners - */ - appleItunesApp: string | { - /** - * Your app’s unique identifier. - */ - appId: string; - /** - * A URL that provides context to your native app. - */ - appArgument?: string; - }; - /** - * Enables or disables automatic detection of possible phone numbers in a webpage in Safari on iOS. - * - * @see https://developer.apple.com/library/archive/documentation/AppleApplications/Reference/SafariHTMLRef/Articles/MetaTags.html - */ - formatDetection: 'telephone=no'; - /** - * Tile image for windows. - * - * @see https://learn.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/dn320426(v=vs.85) - */ - msapplicationTileImage: string; - /** - * Tile colour for windows - * - * @see https://learn.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/dn320426(v=vs.85) - */ - msapplicationTileColor: string; - /** - * URL of a config for windows tile. - * - * @see https://learn.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/dn320426(v=vs.85) - */ - msapplicationConfig: string; - contentSecurityPolicy: string | Partial<{ - childSrc: string; - connectSrc: string; - defaultSrc: string; - fontSrc: string; - imgSrc: string; - manifestSrc: string; - mediaSrc: string; - objectSrc: string; - prefetchSrc: string; - scriptSrc: string; - scriptSrcElem: string; - scriptSrcAttr: string; - styleSrc: string; - styleSrcElem: string; - styleSrcAttr: string; - workerSrc: string; - baseUri: string; - sandbox: string; - formAction: string; - frameAncestors: string; - reportUri: string; - reportTo: string; - requireSriFor: string; - requireTrustedTypesFor: string; - trustedTypes: string; - upgradeInsecureRequests: string; - }>; - contentType: 'text/html; charset=utf-8'; - defaultStyle: string; - xUaCompatible: 'IE=edge'; - refresh: string | { - seconds: number | string; - url: string; - }; - /** - * A comma-separated list of keywords - relevant to the page (Legacy tag used to tell search engines what the page is about). - * @deprecated the "keywords" metatag is no longer used. - * @see https://web.dev/learn/html/metadata/#keywords - */ - keywords: string; -} -type MetaFlatNullable = { - [K in keyof MetaFlat]: MetaFlat[K] | null; -}; -export type MetaFlatInput = Partial; -type AsyncMetaFlatInput = MaybePromiseProps; diff --git a/src/types.ts b/src/types.ts index 7f21ecd..5370e38 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,5 +1,5 @@ import type { OpenAPIV3 } from 'openapi-types' -import type { ReferenceConfiguration } from '@scalar/api-reference' +import type { ReferenceConfiguration } from '@scalar/types' import type { SwaggerUIOptions } from './swagger/types' export interface ElysiaSwaggerConfig { @@ -44,7 +44,7 @@ export interface ElysiaSwaggerConfig { /** * Scalar configuration to customize scalar *' - * @see https://github.com/scalar/scalar + * @see https://github.com/scalar/scalar/blob/main/documentation/configuration.md */ scalarConfig?: ReferenceConfiguration /** From bc6cfafac3ad97f554ca1c0f0ce5d82c542447cb Mon Sep 17 00:00:00 2001 From: inyourtime Date: Thu, 3 Oct 2024 10:02:36 +0700 Subject: [PATCH 3/4] add some test for title and description with Scalar provider --- test/index.test.ts | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/test/index.test.ts b/test/index.test.ts index 146becc..868be79 100644 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -45,7 +45,7 @@ describe('Swagger', () => { ).toBe(true) }) - it('follow title and description', async () => { + it('follow title and description with Swagger-UI provider', async () => { const app = new Elysia().use( swagger({ version: '4.5.0', @@ -75,6 +75,36 @@ describe('Swagger', () => { ).toBe(true) }) + it('follow title and description with Scalar provider', async () => { + const app = new Elysia().use( + swagger({ + version: '4.5.0', + provider: 'scalar', + documentation: { + info: { + title: 'Elysia Documentation', + description: 'Herrscher of Human', + version: '1.0.0' + } + } + }) + ) + + await app.modules + + const res = await app.handle(req('/swagger')).then((x) => x.text()) + + expect(res.includes('Elysia Documentation')).toBe(true) + expect( + res.includes( + `` + ) + ).toBe(true) + }) + it('use custom path', async () => { const app = new Elysia().use( swagger({ From 8c4634ad0783e6a118f2ab057123e188b1c94301 Mon Sep 17 00:00:00 2001 From: saltyaom Date: Wed, 9 Oct 2024 02:00:59 +0700 Subject: [PATCH 4/4] :wrench: fix: duplicate object reference --- CHANGELOG.md | 4 +++ bun.lockb | Bin 92772 -> 93212 bytes package.json | 4 +-- src/utils.ts | 73 +++++++++++++++++++++++++++++---------------------- 4 files changed, 47 insertions(+), 34 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c571d13..4155cd9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# 1.1.14 - 9 Oct 2024 +Bug fix: +- Fix duplicate object reference + # 1.1.2 - 5 Sep 2024 Feature: - add provenance publish diff --git a/bun.lockb b/bun.lockb index 6fd79990d31945755cf65f86d0a825050370de2c..fbb6b378e4b96618afcd4ffbf9d95a1a957f603f 100755 GIT binary patch delta 8241 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 delta 8101 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 diff --git a/package.json b/package.json index 13afdcb..12d84bb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@elysiajs/swagger", - "version": "1.1.3", + "version": "1.1.4", "description": "Plugin for Elysia to auto-generate Swagger page", "author": { "name": "saltyAom", @@ -62,7 +62,7 @@ "devDependencies": { "@apidevtools/swagger-parser": "^10.1.0", "@types/bun": "1.1.6", - "elysia": ">= 1.1.0-rc.2", + "elysia": "1.1.18", "eslint": "9.6.0", "tsup": "^8.1.0", "typescript": "^5.5.3" diff --git a/src/utils.ts b/src/utils.ts index 395d825..b0a24a6 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -69,7 +69,9 @@ const mapTypesResponse = ( const responses: Record = {} - for (const type of types) + for (const type of types) { + // console.log(schema) + responses[type] = { schema: typeof schema === 'string' @@ -78,6 +80,7 @@ const mapTypesResponse = ( } : { ...(schema as any) } } + } return responses } @@ -101,6 +104,12 @@ export const generateOperationId = (method: string, paths: string) => { return operationId } +const cloneHook = (hook: T) => { + if (!hook) return + + return { ...hook } +} + export const registerSchemaPath = ({ schema, path, @@ -114,7 +123,7 @@ export const registerSchemaPath = ({ method: HTTPMethod hook?: LocalHook models: Record -}) => { +}) => { const contentType = hook?.type ?? [ 'application/json', 'multipart/form-data', @@ -126,13 +135,13 @@ export const registerSchemaPath = ({ const contentTypes = typeof contentType === 'string' ? [contentType] - : contentType ?? ['application/json'] + : (contentType ?? ['application/json']) - const bodySchema = hook?.body - const paramsSchema = hook?.params - const headerSchema = hook?.headers - const querySchema = hook?.query - let responseSchema = hook?.response as unknown as OpenAPIV3.ResponsesObject + const bodySchema = cloneHook(hook?.body) + const paramsSchema = cloneHook(hook?.params) + const headerSchema = cloneHook(hook?.headers) + const querySchema = cloneHook(hook?.query) + let responseSchema: OpenAPIV3.ResponsesObject = cloneHook(hook?.response) if (typeof responseSchema === 'object') { if (Kind in responseSchema) { @@ -292,36 +301,36 @@ export const registerSchemaPath = ({ } export const filterPaths = ( - paths: Record, - docsPath: string, - { - excludeStaticFile = true, - exclude = [] - }: { - excludeStaticFile: boolean - exclude: (string | RegExp)[] - } + paths: Record, + docsPath: string, + { + excludeStaticFile = true, + exclude = [] + }: { + excludeStaticFile: boolean + exclude: (string | RegExp)[] + } ) => { const newPaths: Record = {} - // exclude docs path and OpenAPI json path - const excludePaths = [`/${docsPath}`, `/${docsPath}/json`].map((p) => + // exclude docs path and OpenAPI json path + const excludePaths = [`/${docsPath}`, `/${docsPath}/json`].map((p) => normalize(p) ) - for (const [key, value] of Object.entries(paths)) - if ( - !exclude.some((x) => { - if (typeof x === 'string') return key === x - - return x.test(key) - }) && - !excludePaths.includes(key) && - !key.includes('*') && - (excludeStaticFile ? !key.includes('.') : true) - ) { - Object.keys(value).forEach((method) => { - const schema = value[method] + for (const [key, value] of Object.entries(paths)) + if ( + !exclude.some((x) => { + if (typeof x === 'string') return key === x + + return x.test(key) + }) && + !excludePaths.includes(key) && + !key.includes('*') && + (excludeStaticFile ? !key.includes('.') : true) + ) { + Object.keys(value).forEach((method) => { + const schema = value[method] if (key.includes('{')) { if (!schema.parameters) schema.parameters = []