feat: llms.txt (#33780)

* feat: llms.txt

* feat: split llms.txt into multiple files

We have too many docs, so the concatenated text file uses an unreasonable amount of tokens. Chunk it up a little so it's more usable.
This commit is contained in:
Charis authored and Joshen Lim committed 2025-03-05 15:39:01 +01:00
1 parent caaa55ee57
commit 7dce37752a
14 files changed
+284 -85

No files matched your search

+3
View File
@@ -26,6 +26,9 @@ yarn-error.log*
# Sitemap
public/sitemap.xml
# llms.txt (generated)
public/llms.txt
public/llms/
# Copied examples folder
/examples/
@@ -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 {
@@ -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',
+4 -2
View File
@@ -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",
+102
View File
@@ -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<SearchSource[]>
}
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()
}
@@ -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`)
@@ -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' }),
},
})
+73 -31
View File
@@ -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()
+3 -1
View File
@@ -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}`
}
}
@@ -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
}
}
@@ -163,7 +163,7 @@ export class OpenApiReferenceSource extends ReferenceSource<enrichedOperation> {
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<IFunctionDefinitio
}
extractIndexedContent(): string {
const { title, description } = this.specSection
return `${this.meta.title}\n\n${title}\n\n${description}`
const { title, description, examples } = this.specSection
const exampleText =
examples
?.map((example) => `### ${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<CliCommand> {
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 ?? ''}`
}
}
+11 -6
View File
@@ -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/**"]
+8
View File
@@ -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`,
+47 -21
View File
@@ -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: