diff --git a/apps/docs/.gitignore b/apps/docs/.gitignore index d3ed2ff3c4d..6eeb1dafe26 100644 --- a/apps/docs/.gitignore +++ b/apps/docs/.gitignore @@ -26,6 +26,9 @@ yarn-error.log* # Sitemap public/sitemap.xml +# llms.txt (generated) +public/llms.txt +public/llms/ # Copied examples folder /examples/ diff --git a/apps/docs/components/reference/Reference.types.ts b/apps/docs/components/reference/Reference.types.ts index ea25597af29..371fcf1fe9e 100644 --- a/apps/docs/components/reference/Reference.types.ts +++ b/apps/docs/components/reference/Reference.types.ts @@ -30,7 +30,13 @@ export interface IFunctionDefinition { id: string $ref: string description: string - examples?: [] + examples?: IFunctionExample[] +} + +export interface IFunctionExample { + id: string + name: string + code: string } export interface ICommonBase { diff --git a/apps/docs/features/docs/GuidesMdx.utils.tsx b/apps/docs/features/docs/GuidesMdx.utils.tsx index 6fbb0858829..d3720f0e0cf 100644 --- a/apps/docs/features/docs/GuidesMdx.utils.tsx +++ b/apps/docs/features/docs/GuidesMdx.utils.tsx @@ -15,12 +15,6 @@ import { BASE_PATH } from '~/lib/constants' import { GUIDES_DIRECTORY, isValidGuideFrontmatter, type GuideFrontmatter } from '~/lib/docs' import { newEditLink } from './GuidesMdx.template' -/** - * [TODO Charis] - * - * This is kind of a dumb place for this to be, clean up later as part of - * cleaning up navigation menus. - */ const PUBLISHED_SECTIONS = [ 'ai', 'api', diff --git a/apps/docs/package.json b/apps/docs/package.json index e3d9c70821e..d081932a2e4 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -12,7 +12,8 @@ "build": "next build", "build:analyze": "ANALYZE=true next build", "build:sitemap": "tsx ./internals/generate-sitemap.ts", - "postbuild": "pnpm run build:sitemap && ./../../scripts/upload-static-assets.sh", + "build:llms": "tsx ./scripts/llms.ts", + "postbuild": "pnpm run build:sitemap && pnpm run build:llms && ./../../scripts/upload-static-assets.sh", "start": "next start", "lint": "next lint", "lint:mdx": "supa-mdx-lint content --config ../../supa-mdx-lint.config.toml", @@ -21,7 +22,7 @@ "test": "vitest --exclude \"**/*.smoke.test.ts\"", "test:smoke": "pnpm run codegen:references && vitest -t \"prod smoke test\"", "embeddings": "tsx scripts/search/generate-embeddings.ts", - "embeddings:refresh": "pnpm run embeddings -- --refresh", + "embeddings:refresh": "pnpm run embeddings --refresh", "troubleshooting:sync": "node features/docs/Troubleshooting.script.mjs", "last-changed": "tsx scripts/last-changed.ts", "last-changed:reset": "pnpm run last-changed -- --reset", @@ -114,6 +115,7 @@ "devDependencies": { "@aws-sdk/client-secrets-manager": "^3.410.0", "@supabase/supa-mdx-lint": "0.2.6-alpha", + "@types/common-tags": "^1.8.4", "@types/estree": "1.0.5", "@types/hast": "^2.3.4", "@types/jsrsasign": "^10.5.12", diff --git a/apps/docs/scripts/llms.ts b/apps/docs/scripts/llms.ts new file mode 100644 index 00000000000..47a1b16b48b --- /dev/null +++ b/apps/docs/scripts/llms.ts @@ -0,0 +1,102 @@ +import 'dotenv/config' +import fs from 'node:fs/promises' + +import { + fetchCliLibReferenceSource, + fetchCSharpLibReferenceSource, + fetchDartLibReferenceSource, + fetchGuideSources, + fetchJsLibReferenceSource, + fetchKtLibReferenceSource, + fetchPythonLibReferenceSource, + fetchSwiftLibReferenceSource, + type SearchSource, +} from './search/sources' + +interface Source { + title: string + /** + * Path relative to https://supabase.com. No leading slash + */ + relPath: string + fetch: () => Promise +} + +function toLink(source: Source) { + return `[${source.title}](https://supabase.com/${source.relPath})` +} + +const SOURCES: Source[] = [ + { + title: 'Supabase Guides', + relPath: 'llms/guides.txt', + fetch: fetchGuideSources, + }, + { + title: 'Supabase Reference (JavaScript)', + relPath: 'llms/js.txt', + fetch: fetchJsLibReferenceSource, + }, + { + title: 'Supabase Reference (Dart)', + relPath: 'llms/dart.txt', + fetch: fetchDartLibReferenceSource, + }, + { + title: 'Supabase Reference (Swift)', + relPath: 'llms/swift.txt', + fetch: fetchSwiftLibReferenceSource, + }, + { + title: 'Supabase Reference (Kotlin)', + relPath: 'llms/kt.txt', + fetch: fetchKtLibReferenceSource, + }, + { + title: 'Supabase Reference (Python)', + relPath: 'llms/py.txt', + fetch: fetchPythonLibReferenceSource, + }, + { + title: 'Supabase Reference (C#)', + relPath: 'llms/csharp.txt', + fetch: fetchCSharpLibReferenceSource, + }, + { + title: 'Supabase Reference (CLI)', + relPath: 'llms/cli.txt', + fetch: fetchCliLibReferenceSource, + }, +] + +async function generateMainLlmsTxt() { + const sourceLinks = SOURCES.map((source) => `- ${toLink(source)}`).join('\n') + const fullText = `# Supabase Docs\n\n${sourceLinks}` + fs.writeFile('public/llms.txt', fullText) +} + +async function generateSourceLlmsTxt(sourceDefn: Source) { + const source = await sourceDefn.fetch() + const sourceText = source + .map((section) => { + section.process() + return section.extractIndexedContent() + }) + .join('\n\n') + const fullText = sourceDefn.title + '\n\n' + sourceText + + fs.writeFile(`public/${sourceDefn.relPath}`, fullText) +} + +async function generateLlmsTxt() { + try { + await fs.mkdir('public/llms', { recursive: true }) + await Promise.all([generateMainLlmsTxt(), ...SOURCES.map(generateSourceLlmsTxt)]) + } catch (err) { + console.error(err) + } +} + +if (require.main === module) { + generateLlmsTxt() +} diff --git a/apps/docs/scripts/search/generate-embeddings.ts b/apps/docs/scripts/search/generate-embeddings.ts index 00cb8fc0aec..dfb83112fac 100644 --- a/apps/docs/scripts/search/generate-embeddings.ts +++ b/apps/docs/scripts/search/generate-embeddings.ts @@ -1,12 +1,10 @@ import { createClient } from '@supabase/supabase-js' -import dotenv from 'dotenv' +import 'dotenv/config' import { parseArgs } from 'node:util' import { OpenAI } from 'openai' import { v4 as uuidv4 } from 'uuid' import type { Json, Section } from '../helpers.mdx' -import { fetchSources } from './sources' - -dotenv.config() +import { fetchAllSources } from './sources' const args = parseArgs({ options: { @@ -56,7 +54,7 @@ async function generateEmbeddings() { const refreshDate = new Date() - const embeddingSources = await fetchSources() + const embeddingSources = await fetchAllSources() console.log(`Discovered ${embeddingSources.length} pages`) diff --git a/apps/docs/scripts/search/sources/github-discussion.ts b/apps/docs/scripts/search/sources/github-discussion.ts index 429a14af5c0..8eb158122e1 100644 --- a/apps/docs/scripts/search/sources/github-discussion.ts +++ b/apps/docs/scripts/search/sources/github-discussion.ts @@ -1,7 +1,7 @@ import { createAppAuth } from '@octokit/auth-app' import { Octokit } from '@octokit/core' import { paginateGraphql } from '@octokit/plugin-paginate-graphql' -import { createHash } from 'crypto' +import crypto, { createHash } from 'node:crypto' import { BaseLoader, BaseSource } from './base' export const ExtendedOctokit = Octokit.plugin(paginateGraphql) @@ -25,6 +25,12 @@ export type DiscussionsResponse = { } } +const appId = process.env.SEARCH_GITHUB_APP_ID ?? process.env.DOCS_GITHUB_APP_ID +const installationId = + process.env.SEARCH_GITHUB_APP_INSTALLATION_ID ?? process.env.DOCS_GITHUB_APP_INSTALLATION_ID +const privateKey = + process.env.SEARCH_GITHUB_APP_PRIVATE_KEY ?? process.env.DOCS_GITHUB_APP_PRIVATE_KEY + /** * Fetches GitHub discussions for a repository + category */ @@ -32,9 +38,9 @@ export async function fetchDiscussions(owner: string, repo: string, categoryId: const octokit = new ExtendedOctokit({ authStrategy: createAppAuth, auth: { - appId: process.env.SEARCH_GITHUB_APP_ID, - installationId: process.env.SEARCH_GITHUB_APP_INSTALLATION_ID, - privateKey: process.env.SEARCH_GITHUB_APP_PRIVATE_KEY, + appId, + installationId, + privateKey: crypto.createPrivateKey(privateKey).export({ type: 'pkcs8', format: 'pem' }), }, }) diff --git a/apps/docs/scripts/search/sources/index.ts b/apps/docs/scripts/search/sources/index.ts index 0b7f08558a0..302115018c8 100644 --- a/apps/docs/scripts/search/sources/index.ts +++ b/apps/docs/scripts/search/sources/index.ts @@ -1,4 +1,5 @@ import { sep } from 'node:path' + import { GitHubDiscussionLoader, type GitHubDiscussionSource, @@ -26,97 +27,139 @@ export type SearchSource = | GitHubDiscussionSource | IntegrationSource -/** - * Fetches all the sources we want to index for search - */ -export async function fetchSources() { - const openApiReferenceSource = new OpenApiReferenceLoader( +export async function fetchGuideSources() { + return ( + await Promise.all( + (await walk('content/guides')) + .filter( + ({ path }) => + /\.mdx?$/.test(path) && + !ignoredFiles.includes(path) && + !path.split(sep).some((part) => part.startsWith('_')) + ) + .map((entry) => new MarkdownLoader('guide', entry.path, { yaml: true }).load()) + ) + ).flat() +} + +export async function fetchOpenApiReferenceSource() { + return new OpenApiReferenceLoader( 'api', '/reference/api', { title: 'Management API Reference' }, 'spec/transforms/api_v1_openapi_deparsed.json', 'spec/common-api-sections.json' ).load() +} - const jsLibReferenceSource = new ClientLibReferenceLoader( +export async function fetchJsLibReferenceSource() { + return new ClientLibReferenceLoader( 'js-lib', '/reference/javascript', { title: 'JavaScript Reference' }, 'spec/supabase_js_v2.yml', 'spec/common-client-libs-sections.json' ).load() +} - const dartLibReferenceSource = new ClientLibReferenceLoader( +export async function fetchDartLibReferenceSource() { + return new ClientLibReferenceLoader( 'dart-lib', '/reference/dart', { title: 'Dart Reference' }, 'spec/supabase_dart_v2.yml', 'spec/common-client-libs-sections.json' ).load() +} - const pythonLibReferenceSource = new ClientLibReferenceLoader( +export async function fetchPythonLibReferenceSource() { + return new ClientLibReferenceLoader( 'python-lib', '/reference/python', { title: 'Python Reference' }, 'spec/supabase_py_v2.yml', 'spec/common-client-libs-sections.json' ).load() +} - const cSharpLibReferenceSource = new ClientLibReferenceLoader( +export async function fetchCSharpLibReferenceSource() { + return new ClientLibReferenceLoader( 'csharp-lib', '/reference/csharp', { title: 'C# Reference' }, 'spec/supabase_csharp_v0.yml', 'spec/common-client-libs-sections.json' ).load() +} - const swiftLibReferenceSource = new ClientLibReferenceLoader( +export async function fetchSwiftLibReferenceSource() { + return new ClientLibReferenceLoader( 'swift-lib', '/reference/swift', { title: 'Swift Reference' }, 'spec/supabase_swift_v2.yml', 'spec/common-client-libs-sections.json' ).load() +} - const ktLibReferenceSource = new ClientLibReferenceLoader( +export async function fetchKtLibReferenceSource() { + return new ClientLibReferenceLoader( 'kt-lib', '/reference/kotlin', { title: 'Kotlin Reference' }, 'spec/supabase_kt_v1.yml', 'spec/common-client-libs-sections.json' ).load() +} - const cliReferenceSource = new CliReferenceLoader( +export async function fetchCliLibReferenceSource() { + return new CliReferenceLoader( 'cli', '/reference/cli', { title: 'CLI Reference' }, 'spec/cli_v1_commands.yaml', 'spec/common-cli-sections.json' ).load() +} - const guideSources = (await walk('content/guides')) - .filter( - ({ path }) => - /\.mdx?$/.test(path) && - !ignoredFiles.includes(path) && - !path.split(sep).some((part) => part.startsWith('_')) +/** + * Fetches all the sources we want to index for search + */ +export async function fetchAllSources() { + const guideSources = fetchGuideSources() + + const openApiReferenceSource = fetchOpenApiReferenceSource() + const jsLibReferenceSource = fetchJsLibReferenceSource() + const dartLibReferenceSource = fetchDartLibReferenceSource() + const pythonLibReferenceSource = fetchPythonLibReferenceSource() + const cSharpLibReferenceSource = fetchCSharpLibReferenceSource() + const swiftLibReferenceSource = fetchSwiftLibReferenceSource() + const ktLibReferenceSource = fetchKtLibReferenceSource() + const cliReferenceSource = fetchCliLibReferenceSource() + + const partnerIntegrationSources = fetchPartners() + .then((partners) => + Promise.all(partners.map((partner) => new IntegrationLoader(partner.slug, partner).load())) ) - .map((entry) => new MarkdownLoader('guide', entry.path, { yaml: true }).load()) + .then((data) => data.flat()) - const partnerIntegrationSources = (await fetchPartners()).map((partner) => - new IntegrationLoader(partner.slug, partner).load() + const githubDiscussionSources = fetchDiscussions( + 'supabase', + 'supabase', + 'DIC_kwDODMpXOc4CUvEr' // 'Troubleshooting' category ) - - const githubDiscussionSources = ( - await fetchDiscussions( - 'supabase', - 'supabase', - 'DIC_kwDODMpXOc4CUvEr' // 'Troubleshooting' category + .then((discussions) => + Promise.all( + discussions.map((discussion) => + new GitHubDiscussionLoader('supabase/supabase', discussion).load() + ) + ) ) - ).map((discussion) => new GitHubDiscussionLoader('supabase/supabase', discussion).load()) + .then((data) => data.flat()) const sources: SearchSource[] = ( await Promise.all([ + guideSources, openApiReferenceSource, jsLibReferenceSource, dartLibReferenceSource, @@ -125,9 +168,8 @@ export async function fetchSources() { swiftLibReferenceSource, ktLibReferenceSource, cliReferenceSource, - ...githubDiscussionSources, - ...partnerIntegrationSources, - ...guideSources, + partnerIntegrationSources, + githubDiscussionSources, ]) ).flat() diff --git a/apps/docs/scripts/search/sources/markdown.ts b/apps/docs/scripts/search/sources/markdown.ts index d9417d223b6..a34e77c5a97 100644 --- a/apps/docs/scripts/search/sources/markdown.ts +++ b/apps/docs/scripts/search/sources/markdown.ts @@ -44,6 +44,8 @@ export class MarkdownSource extends BaseSource { extractIndexedContent(): string { const sections = this.sections ?? [] - return sections.map(({ content }) => content).join('\n\n') + const sectionText = sections.map(({ content }) => content).join('\n\n') + + return `# ${this.meta.title ?? ''}\n\n${this.meta.subtitle ?? ''}\n\n${sectionText}` } } diff --git a/apps/docs/scripts/search/sources/partner-integrations.ts b/apps/docs/scripts/search/sources/partner-integrations.ts index 6f89dff783c..76d78e172a2 100644 --- a/apps/docs/scripts/search/sources/partner-integrations.ts +++ b/apps/docs/scripts/search/sources/partner-integrations.ts @@ -9,13 +9,14 @@ type PartnerData = { overview: string // The Markdown content for indexing } +const supabaseUrl = process.env.NEXT_PUBLIC_MISC_USE_URL ?? process.env.NEXT_PUBLIC_MISC_URL +const supabaseAnonKey = + process.env.NEXT_PUBLIC_MISC_USE_ANON_KEY ?? process.env.NEXT_PUBLIC_MISC_ANON_KEY + let supabaseClient: SupabaseClient function getSupabaseClient() { if (!supabaseClient) { - supabaseClient = createClient( - process.env.NEXT_PUBLIC_MISC_USE_URL!, - process.env.NEXT_PUBLIC_MISC_USE_ANON_KEY! - ) + supabaseClient = createClient(supabaseUrl, supabaseAnonKey) return supabaseClient } } diff --git a/apps/docs/scripts/search/sources/reference-doc.ts b/apps/docs/scripts/search/sources/reference-doc.ts index efb54e6bcdc..36c54ab3e37 100644 --- a/apps/docs/scripts/search/sources/reference-doc.ts +++ b/apps/docs/scripts/search/sources/reference-doc.ts @@ -163,7 +163,7 @@ export class OpenApiReferenceSource extends ReferenceSource { extractIndexedContent(): string { const { summary, description, operation, tags } = this.specSection - return `${this.meta.title}\n\n${summary}\n\n${description}\n\n${operation}\n\n${tags.join( + return `# ${this.meta.title ?? ''}\n\n${summary ?? ''}\n\n${description ?? ''}\n\n${operation ?? ''}\n\n${tags.join( ', ' )}` } @@ -212,8 +212,12 @@ export class ClientLibReferenceSource extends ReferenceSource `### ${example.name ?? ''}\n\n${example.code ?? ''}`) + .join('\n\n') ?? '' + return `# ${this.meta.title ?? ''}\n\n${title ?? ''}\n\n${description ?? ''}\n\n## Examples\n\n${exampleText}` } } @@ -259,6 +263,6 @@ export class CliReferenceSource extends ReferenceSource { extractIndexedContent(): string { const { summary, description, usage } = this.specSection - return `${this.meta.title}\n\n${summary}\n\n${description}\n\n${usage}` + return `# ${this.meta.title ?? ''}\n\n${summary ?? ''}\n\n${description ?? ''}\n\n${usage ?? ''}` } } diff --git a/apps/docs/turbo.json b/apps/docs/turbo.json index b349cadfbeb..59bfa4d6391 100644 --- a/apps/docs/turbo.json +++ b/apps/docs/turbo.json @@ -17,7 +17,9 @@ "NEXT_PUBLIC_SUPABASE_URL", "NEXT_PUBLIC_SUPABASE_ANON_KEY", "NEXT_PUBLIC_MISC_URL", + "NEXT_PUBLIC_MISC_USE_URL", "NEXT_PUBLIC_MISC_ANON_KEY", + "NEXT_PUBLIC_MISC_USE_ANON_KEY", "NODE_ENV", "NEXT_PUBLIC_API_URL", "NEXT_PUBLIC_BASE_PATH", @@ -34,18 +36,21 @@ "NEXT_PUBLIC_GOTRUE_URL", "NEXT_PUBLIC_SUPABASE_ANON_KEY", // These envs are technically passthrough env vars because they're only used on the server side of Nextjs + "ASSET_CDN_S3_ENDPOINT", + "AWS_ACCESS_KEY_ID", + "AWS_SECRET_ACCESS_KEY", "DOCS_GITHUB_APP_ID", "DOCS_GITHUB_APP_INSTALLATION_ID", "DOCS_GITHUB_APP_PRIVATE_KEY", "DOCS_REVALIDATION_KEYS", "DOCS_REVALIDATION_OVERRIDE_KEYS", - "SUPABASE_SECRET_KEY", - "OPENAI_API_KEY", - "AWS_ACCESS_KEY_ID", - "AWS_SECRET_ACCESS_KEY", "FORCE_ASSET_CDN", - "ASSET_CDN_S3_ENDPOINT", - "SITE_NAME" + "OPENAI_API_KEY", + "SEARCH_GITHUB_APP_ID", + "SEARCH_GITHUB_APP_INSTALLATION_ID", + "SEARCH_GITHUB_APP_PRIVATE_KEY", + "SITE_NAME", + "SUPABASE_SECRET_KEY" ], "inputs": ["$TURBO_DEFAULT$"], "outputs": [".next/**", "!.next/cache/**"] diff --git a/apps/www/lib/rewrites.js b/apps/www/lib/rewrites.js index 0e8e3499307..3b5f2f9273e 100644 --- a/apps/www/lib/rewrites.js +++ b/apps/www/lib/rewrites.js @@ -52,6 +52,14 @@ module.exports = [ source: '/.well-known/security.txt', destination: `${process.env.NEXT_PUBLIC_DOCS_URL}/.well-known/security.txt`, }, + { + source: '/llms.txt', + destination: `${process.env.NEXT_PUBLIC_DOCS_URL}/llms.txt`, + }, + { + source: '/llms/:path(.*\\.txt$)', + destination: `${process.env.NEXT_PUBLIC_DOCS_URL}/llms/:path`, + }, { source: '/feed.xml', destination: `/rss.xml`, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 30b82e788f9..c7f9b4cdd89 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -445,6 +445,9 @@ importers: '@supabase/supa-mdx-lint': specifier: 0.2.6-alpha version: 0.2.6-alpha + '@types/common-tags': + specifier: ^1.8.4 + version: 1.8.4 '@types/estree': specifier: 1.0.5 version: 1.0.5 @@ -1390,7 +1393,7 @@ importers: dependencies: '@mertasan/tailwindcss-variables': specifier: ^2.2.3 - version: 2.7.0(autoprefixer@10.4.16(postcss@8.5.3))(postcss@8.5.3) + version: 2.7.0(autoprefixer@10.4.16(postcss@8.4.38))(postcss@8.4.38) '@radix-ui/colors': specifier: ^0.1.8 version: 0.1.9 @@ -1643,7 +1646,7 @@ importers: version: 0.436.0(react@18.2.0) next: specifier: 'catalog:' - version: 14.2.21(@babel/core@7.24.7(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) + version: 14.2.21(@babel/core@7.26.9(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) next-themes: specifier: ^0.3.0 version: 0.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -1842,7 +1845,7 @@ importers: version: 0.33.0 next: specifier: 'catalog:' - version: 14.2.21(@babel/core@7.24.7(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) + version: 14.2.21(@babel/core@7.26.9(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) next-themes: specifier: '*' version: 0.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -1939,7 +1942,7 @@ importers: version: link:../api-types next-router-mock: specifier: ^0.9.13 - version: 0.9.13(next@14.2.21(@babel/core@7.24.7(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0))(react@18.2.0) + version: 0.9.13(next@14.2.21(@babel/core@7.26.9(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0))(react@18.2.0) typescript: specifier: ~5.5.0 version: 5.5.2 @@ -7692,7 +7695,6 @@ packages: resolution: {integrity: sha512-t0q23FIpvHDTtnORW+bDJziGsal5uh9RJTJ1fyH8drd4lICOoXhJ5pLMUZ5C0VQei6dNmwTzzoTRgMkO9JgHEQ==} peerDependencies: eslint: '>= 5' - bundledDependencies: [] eslint-plugin-import@2.29.1: resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} @@ -15256,12 +15258,6 @@ snapshots: lodash: 4.17.21 postcss: 8.4.38 - '@mertasan/tailwindcss-variables@2.7.0(autoprefixer@10.4.16(postcss@8.5.3))(postcss@8.5.3)': - dependencies: - autoprefixer: 10.4.16(postcss@8.5.3) - lodash: 4.17.21 - postcss: 8.5.3 - '@monaco-editor/loader@1.4.0(monaco-editor@0.33.0)': dependencies: monaco-editor: 0.33.0 @@ -18962,16 +18958,6 @@ snapshots: postcss: 8.4.38 postcss-value-parser: 4.2.0 - autoprefixer@10.4.16(postcss@8.5.3): - dependencies: - browserslist: 4.23.3 - caniuse-lite: 1.0.30001651 - fraction.js: 4.3.6 - normalize-range: 0.1.2 - picocolors: 1.0.1 - postcss: 8.5.3 - postcss-value-parser: 4.2.0 - available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 @@ -23972,6 +23958,11 @@ snapshots: next: 14.2.21(@babel/core@7.24.7(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) react: 18.2.0 + next-router-mock@0.9.13(next@14.2.21(@babel/core@7.26.9(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0))(react@18.2.0): + dependencies: + next: 14.2.21(@babel/core@7.26.9(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) + react: 18.2.0 + next-seo@6.5.0(next@14.2.21(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: next: 14.2.21(@babel/core@7.24.7(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) @@ -24011,6 +24002,34 @@ snapshots: - '@babel/core' - babel-plugin-macros + next@14.2.21(@babel/core@7.26.9(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.49.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0): + dependencies: + '@next/env': 14.2.21 + '@swc/helpers': 0.5.5 + busboy: 1.6.0 + caniuse-lite: 1.0.30001695 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + styled-jsx: 5.1.1(@babel/core@7.26.9(supports-color@8.1.1))(react@18.2.0) + optionalDependencies: + '@next/swc-darwin-arm64': 14.2.21 + '@next/swc-darwin-x64': 14.2.21 + '@next/swc-linux-arm64-gnu': 14.2.21 + '@next/swc-linux-arm64-musl': 14.2.21 + '@next/swc-linux-x64-gnu': 14.2.21 + '@next/swc-linux-x64-musl': 14.2.21 + '@next/swc-win32-arm64-msvc': 14.2.21 + '@next/swc-win32-ia32-msvc': 14.2.21 + '@next/swc-win32-x64-msvc': 14.2.21 + '@opentelemetry/api': 1.9.0 + '@playwright/test': 1.49.1 + sass: 1.72.0 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + nice-try@1.0.5: {} no-case@3.0.4: @@ -26351,6 +26370,13 @@ snapshots: optionalDependencies: '@babel/core': 7.24.7(supports-color@8.1.1) + styled-jsx@5.1.1(@babel/core@7.26.9(supports-color@8.1.1))(react@18.2.0): + dependencies: + client-only: 0.0.1 + react: 18.2.0 + optionalDependencies: + '@babel/core': 7.26.9(supports-color@8.1.1) + stylis@4.3.1: {} sucrase@3.34.0: