diff --git a/.github/workflows/generate-embeddings.yml b/.github/workflows/generate-embeddings.yml new file mode 100644 index 0000000000000..e083c8b10fd87 --- /dev/null +++ b/.github/workflows/generate-embeddings.yml @@ -0,0 +1,53 @@ +name: Generate embeddings + +on: + schedule: + - cron: "0 5 * * 0,4" # sunday, thursday 5AM + workflow_dispatch: +jobs: + cache-and-install: + if: github.repository == 'nrwl/nx' + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [18] + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Install Node.js + uses: actions/setup-node@v3 + with: + node-version: 18 + + - name: Install pnpm + uses: pnpm/action-setup@v2 + id: pnpm-install + with: + version: 7 + run_install: false + + - name: Get pnpm store directory + id: pnpm-cache + shell: bash + run: | + echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT + + - name: Setup pnpm cache + uses: actions/cache@v3 + with: + path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + + - name: Install dependencies + run: pnpm install --no-frozen-lockfile + + - name: Run embeddings script + run: pnpm exec nx run tools-documentation-create-embeddings:run-node + env: + NX_NEXT_PUBLIC_SUPABASE_URL: ${{ secrets.NX_NEXT_PUBLIC_SUPABASE_URL }} + NX_SUPABASE_SERVICE_ROLE_KEY: ${{ secrets.NX_SUPABASE_SERVICE_ROLE_KEY }} + NX_OPENAI_KEY: ${{ secrets.NX_OPENAI_KEY }} \ No newline at end of file diff --git a/nx-dev/data-access-ai/src/lib/data-access-ai.ts b/nx-dev/data-access-ai/src/lib/data-access-ai.ts index fd8c31ea3e60a..82db879d64999 100644 --- a/nx-dev/data-access-ai/src/lib/data-access-ai.ts +++ b/nx-dev/data-access-ai/src/lib/data-access-ai.ts @@ -11,7 +11,13 @@ import { ChatCompletionRequestMessageRoleEnum, CreateCompletionResponseUsage, } from 'openai'; -import { getMessageFromResponse, sanitizeLinksInResponse } from './utils'; +import { + PageSection, + getListOfSources, + getMessageFromResponse, + sanitizeLinksInResponse, + toMarkdownList, +} from './utils'; const openAiKey = process.env['NX_OPENAI_KEY']; const supabaseUrl = process.env['NX_NEXT_PUBLIC_SUPABASE_URL']; @@ -21,9 +27,12 @@ const config = new Configuration({ }); const openai = new OpenAIApi(config); -export async function nxDevDataAccessAi( - query: string -): Promise<{ textResponse: string; usage?: CreateCompletionResponseUsage }> { +export async function nxDevDataAccessAi(query: string): Promise<{ + textResponse: string; + usage?: CreateCompletionResponseUsage; + sources: { heading: string; url: string }[]; + sourcesMarkdown: string; +}> { try { if (!openAiKey) { throw new ApplicationError('Missing environment variable NX_OPENAI_KEY'); @@ -80,11 +89,11 @@ export async function nxDevDataAccessAi( }: CreateEmbeddingResponse = embeddingResponse.data; const { error: matchError, data: pageSections } = await supabaseClient.rpc( - 'match_page_sections', + 'match_page_sections_2', { embedding, match_threshold: 0.78, - match_count: 10, + match_count: 15, min_content_length: 50, } ); @@ -97,13 +106,13 @@ export async function nxDevDataAccessAi( let tokenCount = 0; let contextText = ''; - for (let i = 0; i < pageSections.length; i++) { - const pageSection = pageSections[i]; + for (let i = 0; i < (pageSections as PageSection[]).length; i++) { + const pageSection: PageSection = pageSections[i]; const content = pageSection.content; const encoded = tokenizer.encode(content); tokenCount += encoded.text.length; - if (tokenCount >= 1500) { + if (tokenCount >= 2500) { break; } @@ -163,9 +172,13 @@ export async function nxDevDataAccessAi( const responseWithoutBadLinks = await sanitizeLinksInResponse(message); + const sources = getListOfSources(pageSections); + return { textResponse: responseWithoutBadLinks, usage: response.data.usage, + sources, + sourcesMarkdown: toMarkdownList(sources), }; } catch (err: unknown) { if (err instanceof UserError) { diff --git a/nx-dev/data-access-ai/src/lib/utils.ts b/nx-dev/data-access-ai/src/lib/utils.ts index 295c4c35487c4..3e97b370dccf3 100644 --- a/nx-dev/data-access-ai/src/lib/utils.ts +++ b/nx-dev/data-access-ai/src/lib/utils.ts @@ -1,4 +1,13 @@ import { CreateChatCompletionResponse } from 'openai'; +export interface PageSection { + id: number; + page_id: number; + content: string; + heading: string; + similarity: number; + slug: string; + url_partial: string | null; +} export function getMessageFromResponse( response: CreateChatCompletionResponse @@ -11,6 +20,34 @@ export function getMessageFromResponse( return response.choices[0].message?.content ?? ''; } +export function getListOfSources( + pageSections: PageSection[] +): { heading: string; url: string }[] { + const uniqueUrlPartials = new Set(); + const result = pageSections + .filter((section) => { + if (section.url_partial && !uniqueUrlPartials.has(section.url_partial)) { + uniqueUrlPartials.add(section.url_partial); + return true; + } + return false; + }) + .map((section) => ({ + heading: section.heading, + url: `https://nx.dev${section.url_partial}`, + })); + + return result; +} + +export function toMarkdownList( + sections: { heading: string; url: string }[] +): string { + return sections + .map((section) => `- [${section.heading}](${section.url})`) + .join('\n'); +} + export async function sanitizeLinksInResponse( response: string ): Promise { diff --git a/nx-dev/feature-ai/src/lib/feature-ai.tsx b/nx-dev/feature-ai/src/lib/feature-ai.tsx index f2e57f852d87f..ab53947199cb1 100644 --- a/nx-dev/feature-ai/src/lib/feature-ai.tsx +++ b/nx-dev/feature-ai/src/lib/feature-ai.tsx @@ -11,6 +11,7 @@ export function FeatureAi(): JSX.Element { const [query, setSearchTerm] = useState(''); const [loading, setLoading] = useState(false); const [feedbackSent, setFeedbackSent] = useState(false); + const [sources, setSources] = useState(''); const warning = ` {% callout type="warning" title="Always double check!" %} @@ -23,19 +24,33 @@ export function FeatureAi(): JSX.Element { setLoading(true); let completeText = ''; let usage; + let sourcesMarkdown = ''; try { const aiResponse = await nxDevDataAccessAi(query); completeText = aiResponse.textResponse; usage = aiResponse.usage; + setSources( + JSON.stringify(aiResponse.sources?.map((source) => source.url)) + ); + sourcesMarkdown = aiResponse.sourcesMarkdown; setLoading(false); } catch (error) { setError(error as any); setLoading(false); } - sendCustomEvent('ai_query', 'ai', 'query', undefined, { query, ...usage }); + sendCustomEvent('ai_query', 'ai', 'query', undefined, { + query, + ...usage, + }); setFeedbackSent(false); + + const sourcesMd = ` + {% callout type="info" title="Sources" %} + ${sourcesMarkdown} + {% /callout %}`; + setFinalResult( - renderMarkdown(warning + completeText, { filePath: '' }).node + renderMarkdown(warning + completeText + sourcesMd, { filePath: '' }).node ); }; @@ -44,6 +59,7 @@ export function FeatureAi(): JSX.Element { sendCustomEvent('ai_feedback', 'ai', type, undefined, { query, result: finalResult, + sources, }); setFeedbackSent(true); } catch (error) { diff --git a/package.json b/package.json index 6026d5cb26e4d..e88c5c9340658 100644 --- a/package.json +++ b/package.json @@ -175,6 +175,7 @@ "flat": "^5.0.2", "fork-ts-checker-webpack-plugin": "7.2.13", "fs-extra": "^11.1.0", + "github-slugger": "^2.0.0", "gpt3-tokenizer": "^1.1.5", "html-webpack-plugin": "5.5.0", "http-server": "14.1.0", @@ -191,6 +192,7 @@ "jest": "29.4.3", "jest-config": "^29.4.1", "jest-environment-jsdom": "29.4.3", + "jest-environment-node": "^29.4.1", "jest-resolve": "^29.4.1", "jest-util": "^29.4.1", "js-tokens": "^4.0.0", @@ -206,6 +208,9 @@ "loader-utils": "2.0.3", "magic-string": "~0.30.2", "markdown-factory": "^0.0.6", + "mdast-util-from-markdown": "^1.3.1", + "mdast-util-to-markdown": "^1.5.0", + "mdast-util-to-string": "^3.2.0", "memfs": "^3.0.1", "metro-config": "0.76.7", "metro-resolver": "0.76.7", @@ -267,6 +272,7 @@ "typedoc": "0.24.8", "typedoc-plugin-markdown": "3.15.3", "typescript": "~5.1.3", + "unist-builder": "^4.0.0", "unzipper": "^0.10.11", "url-loader": "^4.1.1", "use-sync-external-store": "^1.2.0", @@ -359,4 +365,3 @@ } } } - diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ee9bc7fff0db3..df07be5f90a6d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -230,7 +230,7 @@ devDependencies: version: 2.14.0 '@nestjs/cli': specifier: ^9.0.0 - version: 9.1.8(@swc/core@1.3.51)(esbuild@0.17.5) + version: 9.1.8(@swc/core@1.3.51)(esbuild@0.17.18) '@nestjs/common': specifier: ^9.0.0 version: 9.1.6(reflect-metadata@0.1.13)(rxjs@7.8.1) @@ -293,7 +293,7 @@ devDependencies: version: 16.6.0-beta.8(@swc-node/register@1.5.4)(@swc/core@1.3.51)(@types/node@18.16.9)(nx@16.6.0-beta.8)(typescript@5.1.3)(verdaccio@5.15.4) '@nx/webpack': specifier: 16.6.0-beta.8 - version: 16.6.0-beta.8(@swc-node/register@1.5.4)(@swc/core@1.3.51)(@types/node@18.16.9)(esbuild@0.17.5)(html-webpack-plugin@5.5.0)(nx@16.6.0-beta.8)(typescript@5.1.3)(verdaccio@5.15.4) + version: 16.6.0-beta.8(@swc-node/register@1.5.4)(@swc/core@1.3.51)(@types/node@18.16.9)(esbuild@0.17.18)(html-webpack-plugin@5.5.0)(nx@16.6.0-beta.8)(typescript@5.1.3)(verdaccio@5.15.4) '@parcel/watcher': specifier: 2.0.4 version: 2.0.4 @@ -347,7 +347,7 @@ devDependencies: version: 7.1.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3) '@storybook/react-webpack5': specifier: ^7.1.1 - version: 7.1.1(@babel/core@7.22.9)(@swc/core@1.3.51)(@swc/helpers@0.5.0)(esbuild@0.17.5)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3)(webpack-dev-server@4.11.1) + version: 7.1.1(@babel/core@7.22.9)(@swc/core@1.3.51)(@swc/helpers@0.5.0)(esbuild@0.17.18)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3)(webpack-dev-server@4.11.1) '@storybook/types': specifier: ^7.1.1 version: 7.1.1 @@ -377,7 +377,7 @@ devDependencies: version: 13.4.0(react-dom@18.2.0)(react@18.2.0) '@types/css-minimizer-webpack-plugin': specifier: ^3.2.1 - version: 3.2.1(esbuild@0.17.5)(webpack@5.88.0) + version: 3.2.1(esbuild@0.17.18)(webpack@5.88.0) '@types/cytoscape': specifier: ^3.18.2 version: 3.19.9 @@ -509,7 +509,7 @@ devDependencies: version: 10.2.4(webpack@5.88.0) css-minimizer-webpack-plugin: specifier: ^5.0.0 - version: 5.0.0(esbuild@0.17.5)(webpack@5.88.0) + version: 5.0.0(esbuild@0.17.18)(webpack@5.88.0) cypress: specifier: 12.16.0 version: 12.16.0 @@ -542,7 +542,7 @@ devDependencies: version: 5.10.0 esbuild: specifier: ^0.17.5 - version: 0.17.5 + version: 0.17.18 eslint: specifier: 8.15.0 version: 8.15.0 @@ -597,6 +597,9 @@ devDependencies: fs-extra: specifier: ^11.1.0 version: 11.1.0 + github-slugger: + specifier: ^2.0.0 + version: 2.0.0 gpt3-tokenizer: specifier: ^1.1.5 version: 1.1.5 @@ -645,6 +648,9 @@ devDependencies: jest-environment-jsdom: specifier: 29.4.3 version: 29.4.3 + jest-environment-node: + specifier: ^29.4.1 + version: 29.5.0 jest-resolve: specifier: ^29.4.1 version: 29.5.0 @@ -690,6 +696,15 @@ devDependencies: markdown-factory: specifier: ^0.0.6 version: 0.0.6 + mdast-util-from-markdown: + specifier: ^1.3.1 + version: 1.3.1 + mdast-util-to-markdown: + specifier: ^1.5.0 + version: 1.5.0 + mdast-util-to-string: + specifier: ^3.2.0 + version: 3.2.0 memfs: specifier: ^3.0.1 version: 3.4.7 @@ -836,7 +851,7 @@ devDependencies: version: 1.0.2 terser-webpack-plugin: specifier: ^5.3.3 - version: 5.3.6(@swc/core@1.3.51)(esbuild@0.17.5)(webpack@5.88.0) + version: 5.3.6(@swc/core@1.3.51)(esbuild@0.17.18)(webpack@5.88.0) tmp: specifier: ~0.2.1 version: 0.2.1 @@ -845,7 +860,7 @@ devDependencies: version: 1.2.2 ts-jest: specifier: 29.1.0 - version: 29.1.0(@babel/core@7.22.9)(@jest/types@29.5.0)(babel-jest@29.4.3)(esbuild@0.17.5)(jest@29.4.3)(typescript@5.1.3) + version: 29.1.0(@babel/core@7.22.9)(@jest/types@29.5.0)(babel-jest@29.4.3)(esbuild@0.17.18)(jest@29.4.3)(typescript@5.1.3) ts-loader: specifier: ^9.3.1 version: 9.4.1(typescript@5.1.3)(webpack@5.88.0) @@ -870,6 +885,9 @@ devDependencies: typescript: specifier: ~5.1.3 version: 5.1.3 + unist-builder: + specifier: ^4.0.0 + version: 4.0.0 unzipper: specifier: ^0.10.11 version: 0.10.11 @@ -887,7 +905,7 @@ devDependencies: version: 4.3.4(@types/node@18.16.9)(less@4.1.3)(sass@1.55.0)(stylus@0.59.0) webpack: specifier: 5.88.0 - version: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + version: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) webpack-dev-server: specifier: ^4.9.3 version: 4.11.1(webpack@5.88.0) @@ -4764,6 +4782,7 @@ packages: cpu: [arm64] os: [android] requiresBuild: true + dev: true optional: true /@esbuild/android-arm64@0.17.19: @@ -4774,15 +4793,6 @@ packages: requiresBuild: true optional: true - /@esbuild/android-arm64@0.17.5: - resolution: {integrity: sha512-KHWkDqYAMmKZjY4RAN1PR96q6UOtfkWlTS8uEwWxdLtkRt/0F/csUhXIrVfaSIFxnscIBMPynGfhsMwQDRIBQw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm64@0.18.17: resolution: {integrity: sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==} engines: {node: '>=12'} @@ -4798,6 +4808,7 @@ packages: cpu: [arm] os: [android] requiresBuild: true + dev: true optional: true /@esbuild/android-arm@0.17.19: @@ -4808,15 +4819,6 @@ packages: requiresBuild: true optional: true - /@esbuild/android-arm@0.17.5: - resolution: {integrity: sha512-crmPUzgCmF+qZXfl1YkiFoUta2XAfixR1tEnr/gXIixE+WL8Z0BGqfydP5oox0EUOgQMMRgtATtakyAcClQVqQ==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.18.17: resolution: {integrity: sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==} engines: {node: '>=12'} @@ -4832,6 +4834,7 @@ packages: cpu: [x64] os: [android] requiresBuild: true + dev: true optional: true /@esbuild/android-x64@0.17.19: @@ -4842,15 +4845,6 @@ packages: requiresBuild: true optional: true - /@esbuild/android-x64@0.17.5: - resolution: {integrity: sha512-8fI/AnIdmWz/+1iza2WrCw8kwXK9wZp/yZY/iS8ioC+U37yJCeppi9EHY05ewJKN64ASoBIseufZROtcFnX5GA==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.18.17: resolution: {integrity: sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==} engines: {node: '>=12'} @@ -4866,6 +4860,7 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true + dev: true optional: true /@esbuild/darwin-arm64@0.17.19: @@ -4876,15 +4871,6 @@ packages: requiresBuild: true optional: true - /@esbuild/darwin-arm64@0.17.5: - resolution: {integrity: sha512-EAvaoyIySV6Iif3NQCglUNpnMfHSUgC5ugt2efl3+QDntucJe5spn0udNZjTgNi6tKVqSceOw9tQ32liNZc1Xw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.18.17: resolution: {integrity: sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==} engines: {node: '>=12'} @@ -4900,6 +4886,7 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true + dev: true optional: true /@esbuild/darwin-x64@0.17.19: @@ -4910,15 +4897,6 @@ packages: requiresBuild: true optional: true - /@esbuild/darwin-x64@0.17.5: - resolution: {integrity: sha512-ha7QCJh1fuSwwCgoegfdaljowwWozwTDjBgjD3++WAy/qwee5uUi1gvOg2WENJC6EUyHBOkcd3YmLDYSZ2TPPA==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.18.17: resolution: {integrity: sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==} engines: {node: '>=12'} @@ -4934,6 +4912,7 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true + dev: true optional: true /@esbuild/freebsd-arm64@0.17.19: @@ -4944,15 +4923,6 @@ packages: requiresBuild: true optional: true - /@esbuild/freebsd-arm64@0.17.5: - resolution: {integrity: sha512-VbdXJkn2aI2pQ/wxNEjEcnEDwPpxt3CWWMFYmO7CcdFBoOsABRy2W8F3kjbF9F/pecEUDcI3b5i2w+By4VQFPg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.18.17: resolution: {integrity: sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==} engines: {node: '>=12'} @@ -4968,6 +4938,7 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true + dev: true optional: true /@esbuild/freebsd-x64@0.17.19: @@ -4978,15 +4949,6 @@ packages: requiresBuild: true optional: true - /@esbuild/freebsd-x64@0.17.5: - resolution: {integrity: sha512-olgGYND1/XnnWxwhjtY3/ryjOG/M4WfcA6XH8dBTH1cxMeBemMODXSFhkw71Kf4TeZFFTN25YOomaNh0vq2iXg==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.18.17: resolution: {integrity: sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==} engines: {node: '>=12'} @@ -5002,6 +4964,7 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-arm64@0.17.19: @@ -5012,15 +4975,6 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-arm64@0.17.5: - resolution: {integrity: sha512-8a0bqSwu3OlLCfu2FBbDNgQyBYdPJh1B9PvNX7jMaKGC9/KopgHs37t+pQqeMLzcyRqG6z55IGNQAMSlCpBuqg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.18.17: resolution: {integrity: sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==} engines: {node: '>=12'} @@ -5036,6 +4990,7 @@ packages: cpu: [arm] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-arm@0.17.19: @@ -5046,15 +5001,6 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-arm@0.17.5: - resolution: {integrity: sha512-YBdCyQwA3OQupi6W2/WO4FnI+NWFWe79cZEtlbqSESOHEg7a73htBIRiE6uHPQe7Yp5E4aALv+JxkRLGEUL7tw==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.18.17: resolution: {integrity: sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==} engines: {node: '>=12'} @@ -5070,6 +5016,7 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-ia32@0.17.19: @@ -5080,15 +5027,6 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-ia32@0.17.5: - resolution: {integrity: sha512-uCwm1r/+NdP7vndctgq3PoZrnmhmnecWAr114GWMRwg2QMFFX+kIWnp7IO220/JLgnXK/jP7VKAFBGmeOYBQYQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.18.17: resolution: {integrity: sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==} engines: {node: '>=12'} @@ -5104,6 +5042,7 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-loong64@0.17.19: @@ -5114,15 +5053,6 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-loong64@0.17.5: - resolution: {integrity: sha512-3YxhSBl5Sb6TtBjJu+HP93poBruFzgXmf3PVfIe4xOXMj1XpxboYZyw3W8BhoX/uwxzZz4K1I99jTE/5cgDT1g==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.18.17: resolution: {integrity: sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==} engines: {node: '>=12'} @@ -5138,6 +5068,7 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-mips64el@0.17.19: @@ -5148,15 +5079,6 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-mips64el@0.17.5: - resolution: {integrity: sha512-Hy5Z0YVWyYHdtQ5mfmfp8LdhVwGbwVuq8mHzLqrG16BaMgEmit2xKO+iDakHs+OetEx0EN/2mUzDdfdktI+Nmg==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.18.17: resolution: {integrity: sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==} engines: {node: '>=12'} @@ -5172,6 +5094,7 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-ppc64@0.17.19: @@ -5182,15 +5105,6 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-ppc64@0.17.5: - resolution: {integrity: sha512-5dbQvBLbU/Y3Q4ABc9gi23hww1mQcM7KZ9KBqabB7qhJswYMf8WrDDOSw3gdf3p+ffmijMd28mfVMvFucuECyg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.18.17: resolution: {integrity: sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==} engines: {node: '>=12'} @@ -5206,6 +5120,7 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-riscv64@0.17.19: @@ -5216,15 +5131,6 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-riscv64@0.17.5: - resolution: {integrity: sha512-fp/KUB/ZPzEWGTEUgz9wIAKCqu7CjH1GqXUO2WJdik1UNBQ7Xzw7myIajpxztE4Csb9504ERiFMxZg5KZ6HlZQ==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.18.17: resolution: {integrity: sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==} engines: {node: '>=12'} @@ -5240,6 +5146,7 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-s390x@0.17.19: @@ -5250,15 +5157,6 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-s390x@0.17.5: - resolution: {integrity: sha512-kRV3yw19YDqHTp8SfHXfObUFXlaiiw4o2lvT1XjsPZ++22GqZwSsYWJLjMi1Sl7j9qDlDUduWDze/nQx0d6Lzw==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.18.17: resolution: {integrity: sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==} engines: {node: '>=12'} @@ -5274,6 +5172,7 @@ packages: cpu: [x64] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-x64@0.17.19: @@ -5284,15 +5183,6 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-x64@0.17.5: - resolution: {integrity: sha512-vnxuhh9e4pbtABNLbT2ANW4uwQ/zvcHRCm1JxaYkzSehugoFd5iXyC4ci1nhXU13mxEwCnrnTIiiSGwa/uAF1g==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.18.17: resolution: {integrity: sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==} engines: {node: '>=12'} @@ -5308,6 +5198,7 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true + dev: true optional: true /@esbuild/netbsd-x64@0.17.19: @@ -5318,15 +5209,6 @@ packages: requiresBuild: true optional: true - /@esbuild/netbsd-x64@0.17.5: - resolution: {integrity: sha512-cigBpdiSx/vPy7doUyImsQQBnBjV5f1M99ZUlaJckDAJjgXWl6y9W17FIfJTy8TxosEF6MXq+fpLsitMGts2nA==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.18.17: resolution: {integrity: sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==} engines: {node: '>=12'} @@ -5342,6 +5224,7 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true + dev: true optional: true /@esbuild/openbsd-x64@0.17.19: @@ -5352,15 +5235,6 @@ packages: requiresBuild: true optional: true - /@esbuild/openbsd-x64@0.17.5: - resolution: {integrity: sha512-VdqRqPVIjjZfkf40LrqOaVuhw9EQiAZ/GNCSM2UplDkaIzYVsSnycxcFfAnHdWI8Gyt6dO15KHikbpxwx+xHbw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.18.17: resolution: {integrity: sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==} engines: {node: '>=12'} @@ -5376,6 +5250,7 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true + dev: true optional: true /@esbuild/sunos-x64@0.17.19: @@ -5386,15 +5261,6 @@ packages: requiresBuild: true optional: true - /@esbuild/sunos-x64@0.17.5: - resolution: {integrity: sha512-ItxPaJ3MBLtI4nK+mALLEoUs6amxsx+J1ibnfcYMkqaCqHST1AkF4aENpBehty3czqw64r/XqL+W9WqU6kc2Qw==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.18.17: resolution: {integrity: sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==} engines: {node: '>=12'} @@ -5410,6 +5276,7 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true + dev: true optional: true /@esbuild/win32-arm64@0.17.19: @@ -5420,15 +5287,6 @@ packages: requiresBuild: true optional: true - /@esbuild/win32-arm64@0.17.5: - resolution: {integrity: sha512-4u2Q6qsJTYNFdS9zHoAi80spzf78C16m2wla4eJPh4kSbRv+BpXIfl6TmBSWupD8e47B1NrTfrOlEuco7mYQtg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.18.17: resolution: {integrity: sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==} engines: {node: '>=12'} @@ -5444,6 +5302,7 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true + dev: true optional: true /@esbuild/win32-ia32@0.17.19: @@ -5454,15 +5313,6 @@ packages: requiresBuild: true optional: true - /@esbuild/win32-ia32@0.17.5: - resolution: {integrity: sha512-KYlm+Xu9TXsfTWAcocLuISRtqxKp/Y9ZBVg6CEEj0O5J9mn7YvBKzAszo2j1ndyzUPk+op+Tie2PJeN+BnXGqQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.18.17: resolution: {integrity: sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==} engines: {node: '>=12'} @@ -5478,6 +5328,7 @@ packages: cpu: [x64] os: [win32] requiresBuild: true + dev: true optional: true /@esbuild/win32-x64@0.17.19: @@ -5488,15 +5339,6 @@ packages: requiresBuild: true optional: true - /@esbuild/win32-x64@0.17.5: - resolution: {integrity: sha512-XgA9qWRqby7xdYXuF6KALsn37QGBMHsdhmnpjfZtYxKxbTOwfnDM6MYi2WuUku5poNaX2n9XGVr20zgT/2QwCw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.18.17: resolution: {integrity: sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==} engines: {node: '>=12'} @@ -6235,7 +6077,7 @@ packages: hasBin: true dev: true - /@nestjs/cli@9.1.8(@swc/core@1.3.51)(esbuild@0.17.5): + /@nestjs/cli@9.1.8(@swc/core@1.3.51)(esbuild@0.17.18): resolution: {integrity: sha512-53laCMoPLAkjyz3405FlMSrHnbr3DGeoaQjY963bEroezLlm/qfQhwj6oGJwtgA28eNFgx68mvQV2f1VZNUJtw==} engines: {node: '>= 12.9.0'} hasBin: true @@ -6260,7 +6102,7 @@ packages: tsconfig-paths: 4.1.1 tsconfig-paths-webpack-plugin: 4.0.0 typescript: 4.9.4 - webpack: 5.75.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.75.0(@swc/core@1.3.51)(esbuild@0.17.18) webpack-node-externals: 3.0.0 transitivePeerDependencies: - '@swc/core' @@ -7342,10 +7184,10 @@ packages: - verdaccio dev: true - /@nrwl/webpack@16.6.0-beta.8(@swc-node/register@1.5.4)(@swc/core@1.3.51)(@types/node@18.16.9)(esbuild@0.17.5)(html-webpack-plugin@5.5.0)(nx@16.6.0-beta.8)(typescript@5.1.3)(verdaccio@5.15.4): + /@nrwl/webpack@16.6.0-beta.8(@swc-node/register@1.5.4)(@swc/core@1.3.51)(@types/node@18.16.9)(esbuild@0.17.18)(html-webpack-plugin@5.5.0)(nx@16.6.0-beta.8)(typescript@5.1.3)(verdaccio@5.15.4): resolution: {integrity: sha512-4Ve5CFdb0eiq5tQNYrRt43jBEY0N16jOkww65kA73JqF7UseLszzL8ZX+6+P4ERcKL5YYN1HbAxcZKA1Wec8AQ==} dependencies: - '@nx/webpack': 16.6.0-beta.8(@swc-node/register@1.5.4)(@swc/core@1.3.51)(@types/node@18.16.9)(esbuild@0.17.5)(html-webpack-plugin@5.5.0)(nx@16.6.0-beta.8)(typescript@5.1.3)(verdaccio@5.15.4) + '@nx/webpack': 16.6.0-beta.8(@swc-node/register@1.5.4)(@swc/core@1.3.51)(@types/node@18.16.9)(esbuild@0.17.18)(html-webpack-plugin@5.5.0)(nx@16.6.0-beta.8)(typescript@5.1.3)(verdaccio@5.15.4) transitivePeerDependencies: - '@babel/traverse' - '@parcel/css' @@ -7838,11 +7680,11 @@ packages: - verdaccio dev: true - /@nx/webpack@16.6.0-beta.8(@swc-node/register@1.5.4)(@swc/core@1.3.51)(@types/node@18.16.9)(esbuild@0.17.5)(html-webpack-plugin@5.5.0)(nx@16.6.0-beta.8)(typescript@5.1.3)(verdaccio@5.15.4): + /@nx/webpack@16.6.0-beta.8(@swc-node/register@1.5.4)(@swc/core@1.3.51)(@types/node@18.16.9)(esbuild@0.17.18)(html-webpack-plugin@5.5.0)(nx@16.6.0-beta.8)(typescript@5.1.3)(verdaccio@5.15.4): resolution: {integrity: sha512-pHGICLovvuV+T32IKkRDtY2RYsTG9W6NrQvol30fsf2ShrPQWwUae8VKMlm5TG43R6WcY0/BG1jr+D340uQ6dQ==} dependencies: '@babel/core': 7.22.9 - '@nrwl/webpack': 16.6.0-beta.8(@swc-node/register@1.5.4)(@swc/core@1.3.51)(@types/node@18.16.9)(esbuild@0.17.5)(html-webpack-plugin@5.5.0)(nx@16.6.0-beta.8)(typescript@5.1.3)(verdaccio@5.15.4) + '@nrwl/webpack': 16.6.0-beta.8(@swc-node/register@1.5.4)(@swc/core@1.3.51)(@types/node@18.16.9)(esbuild@0.17.18)(html-webpack-plugin@5.5.0)(nx@16.6.0-beta.8)(typescript@5.1.3)(verdaccio@5.15.4) '@nx/devkit': 16.6.0-beta.8(nx@16.6.0-beta.8) '@nx/js': 16.6.0-beta.8(@swc-node/register@1.5.4)(@swc/core@1.3.51)(@types/node@18.16.9)(nx@16.6.0-beta.8)(typescript@5.1.3)(verdaccio@5.15.4) autoprefixer: 10.4.13(postcss@8.4.19) @@ -7852,7 +7694,7 @@ packages: chokidar: 3.5.3 copy-webpack-plugin: 10.2.4(webpack@5.88.0) css-loader: 6.8.1(webpack@5.88.0) - css-minimizer-webpack-plugin: 5.0.0(esbuild@0.17.5)(webpack@5.88.0) + css-minimizer-webpack-plugin: 5.0.0(esbuild@0.17.18)(webpack@5.88.0) dotenv: 10.0.0 fork-ts-checker-webpack-plugin: 7.2.13(typescript@5.1.3)(webpack@5.88.0) ignore: 5.2.0 @@ -7872,11 +7714,11 @@ packages: style-loader: 3.3.1(webpack@5.88.0) stylus: 0.59.0 stylus-loader: 7.1.0(stylus@0.59.0)(webpack@5.88.0) - terser-webpack-plugin: 5.3.9(@swc/core@1.3.51)(esbuild@0.17.5)(webpack@5.88.0) + terser-webpack-plugin: 5.3.9(@swc/core@1.3.51)(esbuild@0.17.18)(webpack@5.88.0) ts-loader: 9.4.1(typescript@5.1.3)(webpack@5.88.0) tsconfig-paths-webpack-plugin: 4.0.0 tslib: 2.5.3 - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) webpack-dev-server: 4.15.0(webpack@5.88.0) webpack-node-externals: 3.0.0 webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.5.0)(webpack@5.88.0) @@ -8346,7 +8188,7 @@ packages: react-refresh: 0.11.0 schema-utils: 3.2.0 source-map: 0.7.3 - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) webpack-dev-server: 4.11.1(webpack@5.88.0) dev: true @@ -8386,7 +8228,7 @@ packages: react-refresh: 0.10.0 schema-utils: 3.1.2 source-map: 0.7.4 - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) webpack-dev-server: 4.11.1(webpack@5.88.0) dev: true @@ -9011,7 +8853,7 @@ packages: - supports-color dev: true - /@storybook/builder-webpack5@7.1.1(@swc/helpers@0.5.0)(esbuild@0.17.5)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3): + /@storybook/builder-webpack5@7.1.1(@swc/helpers@0.5.0)(esbuild@0.17.18)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3): resolution: {integrity: sha512-is9BIExHJzNH8nbgLn8M/OWqDLu9XM2Ht4NQl1XqoKQNVurNffAtHYZr8Mhuxfx94ifwuJiZ8WSa2b8k16VquA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -9060,13 +8902,13 @@ packages: semver: 7.5.3 style-loader: 3.3.1(webpack@5.88.0) swc-loader: 0.2.3(@swc/core@1.3.51)(webpack@5.88.0) - terser-webpack-plugin: 5.3.9(@swc/core@1.3.51)(esbuild@0.17.5)(webpack@5.88.0) + terser-webpack-plugin: 5.3.9(@swc/core@1.3.51)(esbuild@0.17.18)(webpack@5.88.0) ts-dedent: 2.2.0 typescript: 5.1.3 url: 0.11.1 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) webpack-dev-middleware: 6.1.1(webpack@5.88.0) webpack-hot-middleware: 2.25.3 webpack-virtual-modules: 0.5.0 @@ -9406,7 +9248,7 @@ packages: resolution: {integrity: sha512-qpe6BiFLVs9YYFQVGgRT0dJxPOKBtGLIAsnVEpXKUPrltEWQpTxQEqqOSJlut+FLoWB5MTxrwiJ/7891h4a5pw==} dev: true - /@storybook/preset-react-webpack@7.1.1(@babel/core@7.22.9)(@swc/core@1.3.51)(esbuild@0.17.5)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3)(webpack-dev-server@4.11.1): + /@storybook/preset-react-webpack@7.1.1(@babel/core@7.22.9)(@swc/core@1.3.51)(esbuild@0.17.18)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3)(webpack-dev-server@4.11.1): resolution: {integrity: sha512-SuYNaFzPf7FWDKn7+InsOPltAt/wooCOrpgVYYNTyeEOj7TXn+YvGcxb3d0HVzQAzQuYyobt10KQGfgjUUfxgQ==} engines: {node: '>=16.0.0'} peerDependencies: @@ -9439,7 +9281,7 @@ packages: react-refresh: 0.11.0 semver: 7.5.3 typescript: 5.1.3 - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) transitivePeerDependencies: - '@swc/core' - '@types/webpack' @@ -9513,7 +9355,7 @@ packages: react-docgen-typescript: 2.2.2(typescript@5.1.3) tslib: 2.5.3 typescript: 5.1.3 - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) transitivePeerDependencies: - supports-color dev: true @@ -9528,7 +9370,7 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true - /@storybook/react-webpack5@7.1.1(@babel/core@7.22.9)(@swc/core@1.3.51)(@swc/helpers@0.5.0)(esbuild@0.17.5)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3)(webpack-dev-server@4.11.1): + /@storybook/react-webpack5@7.1.1(@babel/core@7.22.9)(@swc/core@1.3.51)(@swc/helpers@0.5.0)(esbuild@0.17.18)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3)(webpack-dev-server@4.11.1): resolution: {integrity: sha512-iTliWdmqSXw5wz/iHefr7yKhI7rko8oN5JUfkYlZafqk7M3mXy0wamLgFcrOncnBcY2UNPX1oEAiLJBKSy9ulA==} engines: {node: '>=16.0.0'} peerDependencies: @@ -9543,8 +9385,8 @@ packages: optional: true dependencies: '@babel/core': 7.22.9 - '@storybook/builder-webpack5': 7.1.1(@swc/helpers@0.5.0)(esbuild@0.17.5)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3) - '@storybook/preset-react-webpack': 7.1.1(@babel/core@7.22.9)(@swc/core@1.3.51)(esbuild@0.17.5)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3)(webpack-dev-server@4.11.1) + '@storybook/builder-webpack5': 7.1.1(@swc/helpers@0.5.0)(esbuild@0.17.18)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3) + '@storybook/preset-react-webpack': 7.1.1(@babel/core@7.22.9)(@swc/core@1.3.51)(esbuild@0.17.18)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3)(webpack-dev-server@4.11.1) '@storybook/react': 7.1.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.3) '@types/node': 16.18.36 react: 18.2.0 @@ -10319,11 +10161,11 @@ packages: '@types/node': 18.16.9 dev: true - /@types/css-minimizer-webpack-plugin@3.2.1(esbuild@0.17.5)(webpack@5.88.0): + /@types/css-minimizer-webpack-plugin@3.2.1(esbuild@0.17.18)(webpack@5.88.0): resolution: {integrity: sha512-MIlnEVQDTX0Y1/ZBY0RyD+F6+ZHlG42qCeSoCVhxI5N1atm+RnmDLQWUCWrdNqebFozUTRLDZJ04v5aYzGG5CA==} deprecated: This is a stub types definition. css-minimizer-webpack-plugin provides its own type definitions, so you do not need this installed. dependencies: - css-minimizer-webpack-plugin: 5.0.0(esbuild@0.17.5)(webpack@5.88.0) + css-minimizer-webpack-plugin: 5.0.0(esbuild@0.17.18)(webpack@5.88.0) transitivePeerDependencies: - '@parcel/css' - '@swc/css' @@ -10338,6 +10180,12 @@ packages: resolution: {integrity: sha512-oqCx0ZGiBO0UESbjgq052vjDAy2X53lZpMrWqiweMpvVwKw/2IiYDdzPFK6+f4tMfdv9YKEM9raO5bAZc3UYBg==} dev: true + /@types/debug@4.1.8: + resolution: {integrity: sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==} + dependencies: + '@types/ms': 0.7.31 + dev: true + /@types/detect-port@1.3.2: resolution: {integrity: sha512-xxgAGA2SAU4111QefXPSp5eGbDm/hW6zhvYl9IeEPZEry9F4d66QAHm5qpUXjb6IsevZV/7emAEx5MhP6O192g==} dev: true @@ -10454,7 +10302,7 @@ packages: /@types/hast@2.3.4: resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==} dependencies: - '@types/unist': 2.0.6 + '@types/unist': 3.0.0 dev: false /@types/hoist-non-react-statics@3.3.1: @@ -10591,6 +10439,12 @@ packages: resolution: {integrity: sha512-shRZ7XnYFD/8n8zSjKvFdto1QNSf4tONZIlNEZGrJe8GsOE8DL/hG1Hbl8gZlfLnjS7+f5tZGIaTgfpyW38h4w==} dev: true + /@types/mdast@3.0.12: + resolution: {integrity: sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==} + dependencies: + '@types/unist': 2.0.6 + dev: true + /@types/mdurl@1.0.2: resolution: {integrity: sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==} requiresBuild: true @@ -10616,6 +10470,10 @@ packages: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} dev: true + /@types/ms@0.7.31: + resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} + dev: true + /@types/node-fetch@2.6.4: resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==} dependencies: @@ -10751,6 +10609,10 @@ packages: /@types/unist@2.0.6: resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} + dev: true + + /@types/unist@3.0.0: + resolution: {integrity: sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w==} /@types/use-sync-external-store@0.0.3: resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==} @@ -12248,7 +12110,7 @@ packages: '@babel/core': 7.22.9 find-cache-dir: 3.3.2 schema-utils: 4.0.0 - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) dev: true /babel-plugin-add-react-displayname@0.0.5: @@ -13229,6 +13091,10 @@ packages: resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} dev: false + /character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + dev: true + /character-reference-invalid@1.1.4: resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} dev: false @@ -13904,7 +13770,7 @@ packages: normalize-path: 3.0.0 schema-utils: 4.0.0 serialize-javascript: 6.0.1 - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) dev: true /copy-webpack-plugin@11.0.0(webpack@5.86.0): @@ -14146,10 +14012,10 @@ packages: postcss-modules-values: 4.0.0(postcss@8.4.24) postcss-value-parser: 4.2.0 semver: 7.5.3 - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) dev: true - /css-minimizer-webpack-plugin@5.0.0(esbuild@0.17.5)(webpack@5.88.0): + /css-minimizer-webpack-plugin@5.0.0(esbuild@0.17.18)(webpack@5.88.0): resolution: {integrity: sha512-1wZ/PYvg+ZKwi5FX6YrvbB31jMAdurS+CmRQLwWCVSlfzJC85l/a6RVICqUHFa+jXyhilfnCyjafzJGbmz5tcA==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -14175,13 +14041,13 @@ packages: optional: true dependencies: cssnano: 6.0.1(postcss@8.4.23) - esbuild: 0.17.5 + esbuild: 0.17.18 jest-worker: 29.5.0 postcss: 8.4.23 schema-utils: 4.0.1 serialize-javascript: 6.0.1 source-map: 0.6.1 - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) dev: true /css-prefers-color-scheme@6.0.3(postcss@8.4.19): @@ -14674,6 +14540,12 @@ packages: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} dev: true + /decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + dependencies: + character-entities: 2.0.2 + dev: true + /decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} @@ -14890,6 +14762,11 @@ packages: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} + /diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + engines: {node: '>=0.3.1'} + dev: true + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -15407,6 +15284,7 @@ packages: '@esbuild/win32-arm64': 0.17.18 '@esbuild/win32-ia32': 0.17.18 '@esbuild/win32-x64': 0.17.18 + dev: true /esbuild@0.17.19: resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} @@ -15437,36 +15315,6 @@ packages: '@esbuild/win32-ia32': 0.17.19 '@esbuild/win32-x64': 0.17.19 - /esbuild@0.17.5: - resolution: {integrity: sha512-Bu6WLCc9NMsNoMJUjGl3yBzTjVLXdysMltxQWiLAypP+/vQrf+3L1Xe8fCXzxaECus2cEJ9M7pk4yKatEwQMqQ==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.17.5 - '@esbuild/android-arm64': 0.17.5 - '@esbuild/android-x64': 0.17.5 - '@esbuild/darwin-arm64': 0.17.5 - '@esbuild/darwin-x64': 0.17.5 - '@esbuild/freebsd-arm64': 0.17.5 - '@esbuild/freebsd-x64': 0.17.5 - '@esbuild/linux-arm': 0.17.5 - '@esbuild/linux-arm64': 0.17.5 - '@esbuild/linux-ia32': 0.17.5 - '@esbuild/linux-loong64': 0.17.5 - '@esbuild/linux-mips64el': 0.17.5 - '@esbuild/linux-ppc64': 0.17.5 - '@esbuild/linux-riscv64': 0.17.5 - '@esbuild/linux-s390x': 0.17.5 - '@esbuild/linux-x64': 0.17.5 - '@esbuild/netbsd-x64': 0.17.5 - '@esbuild/openbsd-x64': 0.17.5 - '@esbuild/sunos-x64': 0.17.5 - '@esbuild/win32-arm64': 0.17.5 - '@esbuild/win32-ia32': 0.17.5 - '@esbuild/win32-x64': 0.17.5 - dev: true - /esbuild@0.18.17: resolution: {integrity: sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==} engines: {node: '>=12'} @@ -16254,7 +16102,7 @@ packages: dependencies: loader-utils: 2.0.4 schema-utils: 3.1.2 - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) dev: true /file-system-cache@2.3.0: @@ -16464,7 +16312,7 @@ packages: semver: 7.5.3 tapable: 2.2.1 typescript: 5.1.3 - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) dev: true /fork-ts-checker-webpack-plugin@7.2.14(typescript@4.9.4)(webpack@5.75.0): @@ -16491,7 +16339,7 @@ packages: semver: 7.5.3 tapable: 2.2.1 typescript: 4.9.4 - webpack: 5.75.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.75.0(@swc/core@1.3.51)(esbuild@0.17.18) dev: true /fork-ts-checker-webpack-plugin@8.0.0(typescript@5.1.3)(webpack@5.88.0): @@ -16514,7 +16362,7 @@ packages: semver: 7.5.3 tapable: 2.2.1 typescript: 5.1.3 - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) dev: true /form-data@2.3.3: @@ -16898,6 +16746,10 @@ packages: resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} dev: true + /github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + dev: true + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -17383,7 +17235,7 @@ packages: lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) dev: true /htmlparser2@6.1.0: @@ -19387,7 +19239,7 @@ packages: dependencies: klona: 2.0.5 less: 4.1.3 - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) dev: true /less@4.1.3: @@ -19501,7 +19353,7 @@ packages: webpack-sources: optional: true dependencies: - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) webpack-sources: 3.2.3 dev: true @@ -19727,6 +19579,10 @@ packages: wrap-ansi: 6.2.0 dev: true + /longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + dev: true + /loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -19983,10 +19839,55 @@ packages: unist-util-visit: 2.0.3 dev: true + /mdast-util-from-markdown@1.3.1: + resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + dependencies: + '@types/mdast': 3.0.12 + '@types/unist': 2.0.6 + decode-named-character-reference: 1.0.2 + mdast-util-to-string: 3.2.0 + micromark: 3.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-decode-string: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-stringify-position: 3.0.3 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: true + + /mdast-util-phrasing@3.0.1: + resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} + dependencies: + '@types/mdast': 3.0.12 + unist-util-is: 5.2.1 + dev: true + + /mdast-util-to-markdown@1.5.0: + resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} + dependencies: + '@types/mdast': 3.0.12 + '@types/unist': 2.0.6 + longest-streak: 3.1.0 + mdast-util-phrasing: 3.0.1 + mdast-util-to-string: 3.2.0 + micromark-util-decode-string: 1.1.0 + unist-util-visit: 4.1.2 + zwitch: 2.0.4 + dev: true + /mdast-util-to-string@1.1.0: resolution: {integrity: sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==} dev: true + /mdast-util-to-string@3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + dependencies: + '@types/mdast': 3.0.12 + dev: true + /mdn-data@2.0.14: resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} dev: true @@ -20362,6 +20263,181 @@ packages: - utf-8-validate dev: true + /micromark-core-commonmark@1.1.0: + resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-factory-destination: 1.1.0 + micromark-factory-label: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-factory-title: 1.1.0 + micromark-factory-whitespace: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-html-tag-name: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: true + + /micromark-factory-destination@1.1.0: + resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: true + + /micromark-factory-label@1.1.0: + resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: true + + /micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-types: 1.1.0 + dev: true + + /micromark-factory-title@1.1.0: + resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: true + + /micromark-factory-whitespace@1.1.0: + resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: true + + /micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: true + + /micromark-util-chunked@1.1.0: + resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + dependencies: + micromark-util-symbol: 1.1.0 + dev: true + + /micromark-util-classify-character@1.1.0: + resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: true + + /micromark-util-combine-extensions@1.1.0: + resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-types: 1.1.0 + dev: true + + /micromark-util-decode-numeric-character-reference@1.1.0: + resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + dependencies: + micromark-util-symbol: 1.1.0 + dev: true + + /micromark-util-decode-string@1.1.0: + resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 1.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-symbol: 1.1.0 + dev: true + + /micromark-util-encode@1.1.0: + resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + dev: true + + /micromark-util-html-tag-name@1.2.0: + resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + dev: true + + /micromark-util-normalize-identifier@1.1.0: + resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + dependencies: + micromark-util-symbol: 1.1.0 + dev: true + + /micromark-util-resolve-all@1.1.0: + resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + dependencies: + micromark-util-types: 1.1.0 + dev: true + + /micromark-util-sanitize-uri@1.2.0: + resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-encode: 1.1.0 + micromark-util-symbol: 1.1.0 + dev: true + + /micromark-util-subtokenize@1.1.0: + resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: true + + /micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + dev: true + + /micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + dev: true + + /micromark@3.2.0: + resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + dependencies: + '@types/debug': 4.1.8 + debug: 4.3.4(supports-color@5.5.0) + decode-named-character-reference: 1.0.2 + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-combine-extensions: 1.1.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-encode: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + dev: true + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} @@ -20434,7 +20510,7 @@ packages: webpack: ^5.0.0 dependencies: schema-utils: 4.0.0 - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) dev: true /mini-css-extract-plugin@2.7.6(webpack@5.86.0): @@ -22633,7 +22709,7 @@ packages: klona: 2.0.6 postcss: 8.4.19 semver: 7.5.3 - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) dev: true /postcss-loader@7.3.2(postcss@8.4.24)(webpack@5.86.0): @@ -23713,7 +23789,7 @@ packages: dependencies: loader-utils: 2.0.4 schema-utils: 3.1.2 - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) dev: true /react-colorful@5.6.1(react-dom@18.2.0)(react@18.2.0): @@ -24557,6 +24633,13 @@ packages: tslib: 2.4.0 dev: true + /sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + dependencies: + mri: 1.2.0 + dev: true + /safe-buffer@5.1.1: resolution: {integrity: sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==} dev: true @@ -24606,7 +24689,7 @@ packages: klona: 2.0.5 neo-async: 2.6.2 sass: 1.55.0 - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) dev: true /sass-loader@13.3.1(sass@1.63.2)(webpack@5.86.0): @@ -25211,7 +25294,7 @@ packages: abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 1.0.2 - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) dev: true /source-map-loader@4.0.1(webpack@5.86.0): @@ -25662,7 +25745,7 @@ packages: peerDependencies: webpack: ^5.0.0 dependencies: - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) dev: true /style-value-types@4.1.4: @@ -25746,7 +25829,7 @@ packages: klona: 2.0.5 normalize-path: 3.0.0 stylus: 0.59.0 - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) dev: true /stylus@0.59.0: @@ -25836,7 +25919,7 @@ packages: webpack: '>=2' dependencies: '@swc/core': 1.3.51(@swc/helpers@0.5.0) - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) dev: true /swr@2.1.5(react@18.2.0): @@ -26020,7 +26103,7 @@ packages: unique-string: 2.0.0 dev: true - /terser-webpack-plugin@5.3.6(@swc/core@1.3.51)(esbuild@0.17.5)(webpack@5.88.0): + /terser-webpack-plugin@5.3.6(@swc/core@1.3.51)(esbuild@0.17.18)(webpack@5.88.0): resolution: {integrity: sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -26038,15 +26121,15 @@ packages: dependencies: '@jridgewell/trace-mapping': 0.3.18 '@swc/core': 1.3.51(@swc/helpers@0.5.0) - esbuild: 0.17.5 + esbuild: 0.17.18 jest-worker: 27.5.1 schema-utils: 3.1.2 serialize-javascript: 6.0.1 terser: 5.17.1 - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) dev: true - /terser-webpack-plugin@5.3.9(@swc/core@1.3.51)(esbuild@0.17.19)(webpack@5.86.0): + /terser-webpack-plugin@5.3.9(@swc/core@1.3.51)(esbuild@0.17.18)(webpack@5.75.0): resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -26064,15 +26147,15 @@ packages: dependencies: '@jridgewell/trace-mapping': 0.3.18 '@swc/core': 1.3.51(@swc/helpers@0.5.0) - esbuild: 0.17.19 + esbuild: 0.17.18 jest-worker: 27.5.1 schema-utils: 3.2.0 serialize-javascript: 6.0.1 terser: 5.18.0 - webpack: 5.86.0(@swc/core@1.3.51)(esbuild@0.17.19) + webpack: 5.75.0(@swc/core@1.3.51)(esbuild@0.17.18) dev: true - /terser-webpack-plugin@5.3.9(@swc/core@1.3.51)(esbuild@0.17.5)(webpack@5.75.0): + /terser-webpack-plugin@5.3.9(@swc/core@1.3.51)(esbuild@0.17.18)(webpack@5.88.0): resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -26090,15 +26173,15 @@ packages: dependencies: '@jridgewell/trace-mapping': 0.3.18 '@swc/core': 1.3.51(@swc/helpers@0.5.0) - esbuild: 0.17.5 + esbuild: 0.17.18 jest-worker: 27.5.1 schema-utils: 3.2.0 serialize-javascript: 6.0.1 terser: 5.18.0 - webpack: 5.75.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) dev: true - /terser-webpack-plugin@5.3.9(@swc/core@1.3.51)(esbuild@0.17.5)(webpack@5.88.0): + /terser-webpack-plugin@5.3.9(@swc/core@1.3.51)(esbuild@0.17.19)(webpack@5.86.0): resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -26116,12 +26199,12 @@ packages: dependencies: '@jridgewell/trace-mapping': 0.3.18 '@swc/core': 1.3.51(@swc/helpers@0.5.0) - esbuild: 0.17.5 + esbuild: 0.17.19 jest-worker: 27.5.1 schema-utils: 3.2.0 serialize-javascript: 6.0.1 terser: 5.18.0 - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.86.0(@swc/core@1.3.51)(esbuild@0.17.19) dev: true /terser@5.17.1: @@ -26407,7 +26490,7 @@ packages: engines: {node: '>=6.10'} dev: true - /ts-jest@29.1.0(@babel/core@7.22.9)(@jest/types@29.5.0)(babel-jest@29.4.3)(esbuild@0.17.5)(jest@29.4.3)(typescript@5.1.3): + /ts-jest@29.1.0(@babel/core@7.22.9)(@jest/types@29.5.0)(babel-jest@29.4.3)(esbuild@0.17.18)(jest@29.4.3)(typescript@5.1.3): resolution: {integrity: sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -26432,7 +26515,7 @@ packages: '@jest/types': 29.5.0 babel-jest: 29.4.3(@babel/core@7.22.9) bs-logger: 0.2.6 - esbuild: 0.17.5 + esbuild: 0.17.18 fast-json-stable-stringify: 2.1.0 jest: 29.4.3(@types/node@18.16.9)(ts-node@10.9.1) jest-util: 29.5.0 @@ -26456,7 +26539,7 @@ packages: micromatch: 4.0.5 semver: 7.5.3 typescript: 5.1.3 - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) dev: true /ts-node@10.9.1(@swc/core@1.3.51)(@types/node@18.16.9)(typescript@5.1.3): @@ -26880,10 +26963,28 @@ packages: crypto-random-string: 2.0.0 dev: true + /unist-builder@4.0.0: + resolution: {integrity: sha512-wmRFnH+BLpZnTKpc5L7O67Kac89s9HMrtELpnNaE6TAobq5DTZZs5YaTQfAZBA9bFPECx2uVAPO31c+GVug8mg==} + dependencies: + '@types/unist': 3.0.0 + dev: true + /unist-util-is@4.1.0: resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} dev: true + /unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + dependencies: + '@types/unist': 2.0.6 + dev: true + + /unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + dependencies: + '@types/unist': 2.0.6 + dev: true + /unist-util-visit-parents@3.1.1: resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} dependencies: @@ -26891,6 +26992,13 @@ packages: unist-util-is: 4.1.0 dev: true + /unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + dependencies: + '@types/unist': 2.0.6 + unist-util-is: 5.2.1 + dev: true + /unist-util-visit@2.0.3: resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} dependencies: @@ -26899,6 +27007,14 @@ packages: unist-util-visit-parents: 3.1.1 dev: true + /unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + dependencies: + '@types/unist': 2.0.6 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + dev: true + /universal-github-app-jwt@1.1.1: resolution: {integrity: sha512-G33RTLrIBMFmlDV4u4CBF7dh71eWwykck4XgaxaIVeZKOYZRAAxvcGMRFTUclVY6xoUPQvO4Ne5wKGxYm/Yy9w==} dependencies: @@ -27035,7 +27151,7 @@ packages: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.1.2 - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) dev: true /url-parse@1.5.10: @@ -27134,6 +27250,17 @@ packages: hasBin: true dev: true + /uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + dequal: 2.0.3 + diff: 5.1.0 + kleur: 4.1.5 + sade: 1.8.1 + dev: true + /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} @@ -27322,7 +27449,7 @@ packages: optional: true dependencies: '@types/node': 18.16.9 - esbuild: 0.17.18 + esbuild: 0.17.19 less: 4.1.3 postcss: 8.4.23 rollup: 3.21.0 @@ -27558,7 +27685,7 @@ packages: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.1.0 - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) dev: true /webpack-dev-middleware@6.1.1(webpack@5.86.0): @@ -27592,7 +27719,7 @@ packages: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.1.0 - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) dev: true /webpack-dev-server@4.11.1(webpack@5.88.0): @@ -27633,7 +27760,7 @@ packages: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) webpack-dev-middleware: 5.3.3(webpack@5.88.0) ws: 8.12.0 transitivePeerDependencies: @@ -27735,7 +27862,7 @@ packages: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) webpack-dev-middleware: 5.3.3(webpack@5.88.0) ws: 8.13.0 transitivePeerDependencies: @@ -27806,14 +27933,14 @@ packages: dependencies: html-webpack-plugin: 5.5.0(webpack@5.88.0) typed-assert: 1.0.9 - webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.5) + webpack: 5.88.0(@swc/core@1.3.51)(esbuild@0.17.18) dev: true /webpack-virtual-modules@0.5.0: resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} dev: true - /webpack@5.75.0(@swc/core@1.3.51)(esbuild@0.17.5): + /webpack@5.75.0(@swc/core@1.3.51)(esbuild@0.17.18): resolution: {integrity: sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==} engines: {node: '>=10.13.0'} hasBin: true @@ -27844,7 +27971,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.2.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(@swc/core@1.3.51)(esbuild@0.17.5)(webpack@5.75.0) + terser-webpack-plugin: 5.3.9(@swc/core@1.3.51)(esbuild@0.17.18)(webpack@5.75.0) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -27893,7 +28020,7 @@ packages: - uglify-js dev: true - /webpack@5.88.0(@swc/core@1.3.51)(esbuild@0.17.5): + /webpack@5.88.0(@swc/core@1.3.51)(esbuild@0.17.18): resolution: {integrity: sha512-O3jDhG5e44qIBSi/P6KpcCcH7HD+nYIHVBhdWFxcLOcIGN8zGo5nqF3BjyNCxIh4p1vFdNnreZv2h2KkoAw3lw==} engines: {node: '>=10.13.0'} hasBin: true @@ -27924,7 +28051,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.2.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(@swc/core@1.3.51)(esbuild@0.17.5)(webpack@5.88.0) + terser-webpack-plugin: 5.3.9(@swc/core@1.3.51)(esbuild@0.17.18)(webpack@5.88.0) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -28393,6 +28520,10 @@ packages: tslib: 2.5.3 dev: true + /zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + dev: true + settings: autoInstallPeers: true excludeLinksFromLockfile: false diff --git a/tools/documentation/create-embeddings/.eslintrc.json b/tools/documentation/create-embeddings/.eslintrc.json new file mode 100644 index 0000000000000..3456be9b9036a --- /dev/null +++ b/tools/documentation/create-embeddings/.eslintrc.json @@ -0,0 +1,18 @@ +{ + "extends": ["../../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.ts", "*.tsx"], + "rules": {} + }, + { + "files": ["*.js", "*.jsx"], + "rules": {} + } + ] +} diff --git a/tools/documentation/create-embeddings/jest.config.ts b/tools/documentation/create-embeddings/jest.config.ts new file mode 100644 index 0000000000000..fa82ea4a6317a --- /dev/null +++ b/tools/documentation/create-embeddings/jest.config.ts @@ -0,0 +1,18 @@ +/* eslint-disable */ +export default { + displayName: 'tools-documentation-create-embeddings', + preset: './jest.preset.js', + testEnvironment: 'node', + transform: { + '^.+\\.(ts|tsx|js|jsx|mts|mjs)$': [ + 'ts-jest', + { tsconfig: '/tsconfig.spec.json' }, + ], + }, + transformIgnorePatterns: [ + // Ensure that Jest does not ignore github-slugger + '/node_modules/.pnpm/(?!(github-slugger)@)', + ], + moduleFileExtensions: ['mts', 'ts', 'js', 'html'], + coverageDirectory: '../../../coverage/tools/documentation/create-embeddings', +}; diff --git a/tools/documentation/create-embeddings/jest.preset.js b/tools/documentation/create-embeddings/jest.preset.js new file mode 100644 index 0000000000000..dec8274c42c0d --- /dev/null +++ b/tools/documentation/create-embeddings/jest.preset.js @@ -0,0 +1,16 @@ +const nxPreset = require('@nx/jest/preset').default; + +module.exports = { + ...nxPreset, + testTimeout: 30000, + testMatch: ['**/+(*.)+(spec|test).+(ts|js)?(x)'], + transform: { + '^.+\\.(ts|tsx|js|jsx|mts|mjs)$': 'ts-jest', + }, + resolver: '../../../scripts/patched-jest-resolver.js', + // Fixes https://github.com/jestjs/jest/issues/11956 + runtime: '@side/jest-runtime', + moduleFileExtensions: ['ts', 'js', 'mts', 'html'], + coverageReporters: ['html'], + maxWorkers: 1, +}; diff --git a/tools/documentation/create-embeddings/project.json b/tools/documentation/create-embeddings/project.json new file mode 100644 index 0000000000000..5c3ca4b7abd8e --- /dev/null +++ b/tools/documentation/create-embeddings/project.json @@ -0,0 +1,78 @@ +{ + "name": "tools-documentation-create-embeddings", + "$schema": "../../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "tools/documentation/create-embeddings/src", + "projectType": "application", + "targets": { + "build": { + "executor": "@nx/esbuild:esbuild", + "outputs": ["{options.outputPath}"], + "defaultConfiguration": "production", + "options": { + "platform": "node", + "outputPath": "dist/tools/documentation/create-embeddings", + "format": ["esm"], + "bundle": false, + "main": "tools/documentation/create-embeddings/src/main.mts", + "tsConfig": "tools/documentation/create-embeddings/tsconfig.app.json", + "assets": ["tools/documentation/create-embeddings/src/assets"], + "generatePackageJson": true, + "esbuildOptions": { + "sourcemap": true, + "outExtension": { + ".js": ".js" + } + } + }, + "configurations": { + "development": {}, + "production": { + "esbuildOptions": { + "sourcemap": false, + "outExtension": { + ".js": ".js" + } + } + } + } + }, + "run-node": { + "executor": "@nx/js:node", + "defaultConfiguration": "development", + "options": { + "buildTarget": "tools-documentation-create-embeddings:build", + "watch": false + }, + "configurations": { + "development": { + "buildTarget": "tools-documentation-create-embeddings:build:development" + }, + "production": { + "buildTarget": "tools-documentation-create-embeddings:build:production" + } + } + }, + "lint": { + "executor": "@nx/linter:eslint", + "outputs": ["{options.outputFile}"], + "options": { + "lintFilePatterns": ["tools/documentation/create-embeddings/**/*.ts"] + } + }, + "test": { + "executor": "@nx/jest:jest", + "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], + "options": { + "jestConfig": "tools/documentation/create-embeddings/jest.config.ts", + "passWithNoTests": true + }, + "configurations": { + "ci": { + "ci": true, + "codeCoverage": true + } + } + } + }, + "tags": [] +} diff --git a/tools/documentation/create-embeddings/src/assets/.gitkeep b/tools/documentation/create-embeddings/src/assets/.gitkeep new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/tools/documentation/create-embeddings/src/main.mts b/tools/documentation/create-embeddings/src/main.mts new file mode 100644 index 0000000000000..7c482fb5edde1 --- /dev/null +++ b/tools/documentation/create-embeddings/src/main.mts @@ -0,0 +1,434 @@ +// based on: +// https://github.com/supabase-community/nextjs-openai-doc-search/blob/main/lib/generate-embeddings.ts + +import { createClient } from '@supabase/supabase-js'; +import * as dotenv from 'dotenv'; +import { readFile } from 'fs/promises'; +import 'openai'; +import { Configuration, OpenAIApi } from 'openai'; +import { inspect } from 'util'; +import yargs from 'yargs'; +import { createHash } from 'crypto'; +import GithubSlugger from 'github-slugger'; +import { fromMarkdown } from 'mdast-util-from-markdown'; +import { toMarkdown } from 'mdast-util-to-markdown'; +import { toString } from 'mdast-util-to-string'; +import { u } from 'unist-builder'; +import mapJson from '../../../../docs/map.json' assert { type: 'json' }; +import manifestsCloud from '../../../../docs/generated/manifests/cloud.json' assert { type: 'json' }; +import manifestsExtending from '../../../../docs/generated/manifests/extending-nx.json' assert { type: 'json' }; +import manifestsNx from '../../../../docs/generated/manifests/nx.json' assert { type: 'json' }; +import manifestsPackages from '../../../../docs/generated/manifests/packages.json' assert { type: 'json' }; +import manifestsRecipes from '../../../../docs/generated/manifests/recipes.json' assert { type: 'json' }; +import manifestsTags from '../../../../docs/generated/manifests/tags.json' assert { type: 'json' }; + +dotenv.config(); + +type ProcessedMdx = { + checksum: string; + sections: Section[]; +}; + +type Section = { + content: string; + heading?: string; + slug?: string; +}; + +/** + * Splits a `mdast` tree into multiple trees based on + * a predicate function. Will include the splitting node + * at the beginning of each tree. + * + * Useful to split a markdown file into smaller sections. + */ +export function splitTreeBy(tree: any, predicate: (node: any) => boolean) { + return tree.children.reduce((trees: any, node: any) => { + const [lastTree] = trees.slice(-1); + + if (!lastTree || predicate(node)) { + const tree = u('root', [node]); + return trees.concat(tree); + } + + lastTree.children.push(node); + return trees; + }, []); +} + +/** + * Processes MD content for search indexing. + * It extracts metadata and splits it into sub-sections based on criteria. + */ +export function processMdxForSearch(content: string): ProcessedMdx { + const checksum = createHash('sha256').update(content).digest('base64'); + + const mdTree = fromMarkdown(content, {}); + + if (!mdTree) { + return { + checksum, + sections: [], + }; + } + + const sectionTrees = splitTreeBy(mdTree, (node) => node.type === 'heading'); + + const slugger = new GithubSlugger(); + + const sections = sectionTrees.map((tree: any) => { + const [firstNode] = tree.children; + + const heading = + firstNode.type === 'heading' ? toString(firstNode) : undefined; + const slug = heading ? slugger.slug(heading) : undefined; + + return { + content: toMarkdown(tree), + heading, + slug, + }; + }); + + return { + checksum, + sections, + }; +} + +type WalkEntry = { + path: string; + url_partial: string; +}; + +abstract class BaseEmbeddingSource { + checksum?: string; + sections?: Section[]; + + constructor( + public source: string, + public path: string, + public url_partial: string + ) {} + + abstract load(): Promise<{ + checksum: string; + sections: Section[]; + }>; +} + +class MarkdownEmbeddingSource extends BaseEmbeddingSource { + type: 'markdown' = 'markdown'; + + constructor( + source: string, + public filePath: string, + public url_partial: string + ) { + const path = filePath.replace(/^docs/, '').replace(/\.md?$/, ''); + super(source, path, url_partial); + } + + async load() { + const contents = await readFile(this.filePath, 'utf8'); + + const { checksum, sections } = processMdxForSearch(contents); + + this.checksum = checksum; + this.sections = sections; + + return { + checksum, + sections, + }; + } +} + +type EmbeddingSource = MarkdownEmbeddingSource; + +async function generateEmbeddings() { + const argv = await yargs().option('refresh', { + alias: 'r', + description: 'Refresh data', + type: 'boolean', + }).argv; + + const shouldRefresh = argv.refresh; + + if (!process.env.NX_NEXT_PUBLIC_SUPABASE_URL) { + throw new Error( + 'Environment variable NX_NEXT_PUBLIC_SUPABASE_URL is required: skipping embeddings generation' + ); + } + + if (!process.env.NX_SUPABASE_SERVICE_ROLE_KEY) { + throw new Error( + 'Environment variable NX_SUPABASE_SERVICE_ROLE_KEY is required: skipping embeddings generation' + ); + } + + if (!process.env.NX_OPENAI_KEY) { + throw new Error( + 'Environment variable NX_OPENAI_KEY is required: skipping embeddings generation' + ); + } + + const supabaseClient = createClient( + process.env.NX_NEXT_PUBLIC_SUPABASE_URL, + process.env.NX_SUPABASE_SERVICE_ROLE_KEY, + { + auth: { + persistSession: false, + autoRefreshToken: false, + }, + } + ); + + const allFilesPaths = [ + ...getAllFilesFromMapJson(mapJson), + ...getAllFilesWithItemList(manifestsCloud), + ...getAllFilesWithItemList(manifestsExtending), + ...getAllFilesWithItemList(manifestsNx), + ...getAllFilesWithItemList(manifestsPackages), + ...getAllFilesWithItemList(manifestsRecipes), + ...getAllFilesWithItemList(manifestsTags), + ].filter((entry) => !entry.path.includes('sitemap')); + + const embeddingSources: EmbeddingSource[] = [ + ...allFilesPaths.map((entry) => { + return new MarkdownEmbeddingSource( + 'guide', + entry.path, + entry.url_partial + ); + }), + ]; + + console.log(`Discovered ${embeddingSources.length} pages`); + + if (!shouldRefresh) { + console.log('Checking which pages are new or have changed'); + } else { + console.log('Refresh flag set, re-generating all pages'); + } + + for (const [index, embeddingSource] of embeddingSources.entries()) { + const { type, source, path, url_partial } = embeddingSource; + + try { + const { checksum, sections } = await embeddingSource.load(); + + // Check for existing page in DB and compare checksums + const { error: fetchPageError, data: existingPage } = await supabaseClient + .from('nods_page') + .select('id, path, checksum') + .filter('path', 'eq', path) + .limit(1) + .maybeSingle(); + + if (fetchPageError) { + throw fetchPageError; + } + + // We use checksum to determine if this page & its sections need to be regenerated + if (!shouldRefresh && existingPage?.checksum === checksum) { + continue; + } + + if (existingPage) { + if (!shouldRefresh) { + console.log( + `#${index}: [${path}] Docs have changed, removing old page sections and their embeddings` + ); + } else { + console.log( + `#${index}: [${path}] Refresh flag set, removing old page sections and their embeddings` + ); + } + + const { error: deletePageSectionError } = await supabaseClient + .from('nods_page_section') + .delete() + .filter('page_id', 'eq', existingPage.id); + + if (deletePageSectionError) { + throw deletePageSectionError; + } + } + + // Create/update page record. Intentionally clear checksum until we + // have successfully generated all page sections. + const { error: upsertPageError, data: page } = await supabaseClient + .from('nods_page') + .upsert( + { + checksum: null, + path, + url_partial, + type, + source, + }, + { onConflict: 'path' } + ) + .select() + .limit(1) + .single(); + + if (upsertPageError) { + throw upsertPageError; + } + + console.log( + `#${index}: [${path}] Adding ${sections.length} page sections (with embeddings)` + ); + console.log( + `${embeddingSources.length - index - 1} pages remaining to process.` + ); + + for (const { slug, heading, content } of sections) { + // OpenAI recommends replacing newlines with spaces for best results (specific to embeddings) + const input = content.replace(/\n/g, ' '); + + try { + const configuration = new Configuration({ + apiKey: process.env.NX_OPENAI_KEY, + }); + const openai = new OpenAIApi(configuration); + + const embeddingResponse = await openai.createEmbedding({ + model: 'text-embedding-ada-002', + input, + }); + + if (embeddingResponse.status !== 200) { + throw new Error(inspect(embeddingResponse.data, false, 2)); + } + + const [responseData] = embeddingResponse.data.data; + + const { error: insertPageSectionError, data: pageSection } = + await supabaseClient + .from('nods_page_section') + .insert({ + page_id: page.id, + slug, + heading, + content, + url_partial, + token_count: embeddingResponse.data.usage.total_tokens, + embedding: responseData.embedding, + }) + .select() + .limit(1) + .single(); + + if (insertPageSectionError) { + throw insertPageSectionError; + } + + // Add delay after each request + await delay(500); // delay of 0.5 second + } catch (err) { + // TODO: decide how to better handle failed embeddings + console.error( + `Failed to generate embeddings for '${path}' page section starting with '${input.slice( + 0, + 40 + )}...'` + ); + + throw err; + } + } + + // Set page checksum so that we know this page was stored successfully + const { error: updatePageError } = await supabaseClient + .from('nods_page') + .update({ checksum }) + .filter('id', 'eq', page.id); + + if (updatePageError) { + throw updatePageError; + } + } catch (err) { + console.error( + `Page '${path}' or one/multiple of its page sections failed to store properly. Page has been marked with null checksum to indicate that it needs to be re-generated.` + ); + console.error(err); + } + } + + console.log('Embedding generation complete'); +} + +function delay(ms: number) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +function getAllFilesFromMapJson(doc): WalkEntry[] { + const files: WalkEntry[] = []; + + function traverse(itemList) { + for (const item of itemList) { + if (item.file && item.file.length > 0) { + // we can exclude some docs here, eg. the deprecated ones + // the path is the relative path to the file within the nx repo + // the url_partial is the relative path to the file within the docs site - under nx.dev + files.push({ path: `docs/${item.file}.md`, url_partial: item.path }); + } + + if (item.itemList) { + traverse(item.itemList); + } + } + } + + for (const item of doc.content) { + traverse([item]); + } + return files; +} + +function getAllFilesWithItemList(data): WalkEntry[] { + const files: WalkEntry[] = []; + + function traverse(itemList) { + for (const item of itemList) { + if (item.file && item.file.length > 0) { + // the path is the relative path to the file within the nx repo + // the url_partial is the relative path to the file within the docs site - under nx.dev + files.push({ path: `docs/${item.file}.md`, url_partial: item.path }); + } + + if (item.itemList) { + traverse(item.itemList); + } + } + } + + for (const key in data) { + if (data[key].itemList) { + traverse([data[key]]); + } else { + if (data[key].documents) { + files.push(...getAllFilesWithItemList(data[key].documents)); + } + if (data[key].generators) { + files.push(...getAllFilesWithItemList(data[key].generators)); + } + if (data[key].executors) { + files.push(...getAllFilesWithItemList(data[key].executors)); + } + if (data[key]?.length > 0) { + traverse(data[key]); + } + } + } + return files; +} + +async function main() { + await generateEmbeddings(); +} + +main().catch((err) => console.error(err)); diff --git a/tools/documentation/create-embeddings/tsconfig.app.json b/tools/documentation/create-embeddings/tsconfig.app.json new file mode 100644 index 0000000000000..3c71a636b1574 --- /dev/null +++ b/tools/documentation/create-embeddings/tsconfig.app.json @@ -0,0 +1,13 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../dist/out-tsc", + "module": "ESNext", + "moduleResolution": "nodenext", + "types": ["node"], + "esModuleInterop": true, + "resolveJsonModule": true + }, + "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"], + "include": ["src/**/*.ts", "src/**/*.mts"] +} diff --git a/tools/documentation/create-embeddings/tsconfig.json b/tools/documentation/create-embeddings/tsconfig.json new file mode 100644 index 0000000000000..80462a8f7bb5d --- /dev/null +++ b/tools/documentation/create-embeddings/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "../../../tsconfig.base.json", + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.spec.json" + } + ], + "compilerOptions": { + "esModuleInterop": true, + "module": "esnext", + "target": "esnext" + } +} diff --git a/tools/documentation/create-embeddings/tsconfig.spec.json b/tools/documentation/create-embeddings/tsconfig.spec.json new file mode 100644 index 0000000000000..5fb48ae69e7a6 --- /dev/null +++ b/tools/documentation/create-embeddings/tsconfig.spec.json @@ -0,0 +1,16 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"], + "allowImportingTsExtensions": true, + "emitDeclarationOnly": true + }, + "include": [ + "jest.config.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +}