diff --git a/packages/next-intl/package.json b/packages/next-intl/package.json index f07d695bb..976679e9b 100644 --- a/packages/next-intl/package.json +++ b/packages/next-intl/package.json @@ -127,6 +127,7 @@ "@formatjs/intl-localematcher": "^0.5.4", "@swc/core": "^1.13.19", "negotiator": "^1.0.0", + "po-parser": "^0.1.2", "use-intl": "workspace:^" }, "peerDependencies": { diff --git a/packages/next-intl/src/extractor/formatters/POFormatter.tsx b/packages/next-intl/src/extractor/formatters/POFormatter.tsx index 8e98558ee..57348dc77 100644 --- a/packages/next-intl/src/extractor/formatters/POFormatter.tsx +++ b/packages/next-intl/src/extractor/formatters/POFormatter.tsx @@ -1,6 +1,6 @@ +import POParser from 'po-parser'; import type {ExtractedMessage, Locale} from '../types.js'; import {setNestedProperty} from '../utils/ObjectUtils.js'; -import POParser from '../utils/POParser.js'; import Formatter, {type FormatterContext} from './Formatter.js'; import {getSortedMessages} from './utils.js'; diff --git a/packages/next-intl/src/extractor/utils/POParser.test.tsx b/packages/next-intl/src/extractor/utils/POParser.test.tsx deleted file mode 100644 index a9b4cb79a..000000000 --- a/packages/next-intl/src/extractor/utils/POParser.test.tsx +++ /dev/null @@ -1,605 +0,0 @@ -import {describe, expect, it} from 'vitest'; -import POParser from './POParser.js'; - -describe('parse', () => { - it('parses a basic message', () => { - expect( - POParser.parse(` -msgid "+YJVTi" -msgstr "Hey" -`) - ).toEqual({ - messages: [ - { - id: '+YJVTi', - message: 'Hey' - } - ] - }); - }); - - it('parses an empty message', () => { - expect( - POParser.parse(` -msgid "lNLCAE" -msgstr "" -`) - ).toEqual({ - messages: [ - { - id: 'lNLCAE', - message: '' - } - ] - }); - }); - - it('handles irregular whitespace', () => { - expect( - POParser.parse(` - msgid "+YJVTi" -msgstr "Hey" -`) - ).toEqual({ - messages: [ - { - id: '+YJVTi', - message: 'Hey' - } - ] - }); - }); - - it('parses a message with a namespace', () => { - expect( - POParser.parse(` -msgctxt "ui.greeting" -msgid "+YJVTi" -msgstr "Hey" -`) - ).toEqual({ - messages: [ - { - id: 'ui.greeting.+YJVTi', - message: 'Hey' - } - ] - }); - }); - - it('parses multiple messages with arbitrary whitespace', () => { - expect( - POParser.parse(` -msgid "+YJVTi" -msgstr "Hey" - -msgid "fDJkF2" -msgstr "Hello" - - -msgid "aZdGjT" -msgstr "World" -`) - ).toEqual({ - messages: [ - { - id: '+YJVTi', - message: 'Hey' - }, - { - id: 'fDJkF2', - message: 'Hello' - }, - { - id: 'aZdGjT', - message: 'World' - } - ] - }); - }); - - it('parses a file path', () => { - expect( - POParser.parse(` -#: src/components/Greeting.tsx -msgid "+YJVTi" -msgstr "Hey" -`) - ).toEqual({ - messages: [ - { - id: '+YJVTi', - message: 'Hey', - references: [ - { - path: 'src/components/Greeting.tsx' - } - ] - } - ] - }); - }); - - it('parses a file path and line number', () => { - expect( - POParser.parse(` -#: src/components/Greeting.tsx:120 -msgid "+YJVTi" -msgstr "Hey" -`) - ).toEqual({ - messages: [ - { - id: '+YJVTi', - message: 'Hey', - references: [ - { - path: 'src/components/Greeting.tsx' - } - ] - } - ] - }); - }); - - it('parses multiple file paths', () => { - expect( - POParser.parse(` -#: src/components/Greeting.tsx:120 -#: src/components/Greeting.tsx:121 -msgid "+YJVTi" -msgstr "Hey" -`) - ).toEqual({ - messages: [ - { - id: '+YJVTi', - message: 'Hey', - references: [ - { - path: 'src/components/Greeting.tsx' - }, - { - path: 'src/components/Greeting.tsx' - } - ] - } - ] - }); - }); - - it('ignores line and column numbers in references', () => { - expect( - POParser.parse(` -#: src/components/Greeting.tsx:120:15 -msgid "+YJVTi" -msgstr "Hey" -`) - ).toEqual({ - messages: [ - { - id: '+YJVTi', - message: 'Hey', - references: [ - { - path: 'src/components/Greeting.tsx' - } - ] - } - ] - }); - }); - - it('parses a comment extracted from the source code', () => { - expect( - POParser.parse(` -#. Shown on home screen -msgid "+YJVTi" -msgstr "Hey" -`) - ).toEqual({ - messages: [ - { - id: '+YJVTi', - message: 'Hey', - description: 'Shown on home screen' - } - ] - }); - }); - - it('parses metadata', () => { - // "The header contains meta-information about the content in the file. - // It is marked with the first empty translation entry in the PO file." - // Source: https://pofile.net - expect( - POParser.parse(` -msgid "" -msgstr "" -"POT-Creation-Date: 2025-10-27 16:00+0000\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: next-intl\n" -"Language: en-GB\n" -"Project-Id-Version: 123\n" -"Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-10-23 16:19\n" -"Last-Translator: \n" -"Language-Team: English, United Kingdom\n" -"X-Crowdin-Project: 123\n" -"X-Crowdin-Project-ID: 1\n" -"X-Crowdin-Language: en-GB\n" -"X-Crowdin-File: /messages/en.po\n" -"X-Crowdin-File-ID: 11\n" -`) - ).toEqual({ - meta: { - 'POT-Creation-Date': '2025-10-27 16:00+0000', - 'MIME-Version': '1.0', - 'Content-Type': 'text/plain; charset=UTF-8', - 'Content-Transfer-Encoding': '8bit', - 'X-Generator': 'next-intl', - Language: 'en-GB', - 'Project-Id-Version': '123', - 'Report-Msgid-Bugs-To': '', - 'PO-Revision-Date': '2025-10-23 16:19', - 'Last-Translator': '', - 'Language-Team': 'English, United Kingdom', - 'X-Crowdin-Project': '123', - 'X-Crowdin-Project-ID': '1', - 'X-Crowdin-Language': 'en-GB', - 'X-Crowdin-File': '/messages/en.po', - 'X-Crowdin-File-ID': '11' - } - }); - }); - - it('parses entry with multiple infos (references, description, namespace)', () => { - expect( - POParser.parse(` -#: src/components/Button.tsx:15 -#: src/components/Button.tsx:20 -#. Button text for submit action -msgctxt "ui.button" -msgid "submit" -msgstr "Submit" -`) - ).toEqual({ - messages: [ - { - id: 'ui.button.submit', - message: 'Submit', - description: 'Button text for submit action', - references: [ - { - path: 'src/components/Button.tsx' - }, - { - path: 'src/components/Button.tsx' - } - ] - } - ] - }); - }); - - it('parses numeric message IDs', () => { - expect( - POParser.parse(` -msgid "123" -msgstr "One hundred twenty three" -`) - ).toEqual({ - messages: [ - { - id: '123', - message: 'One hundred twenty three' - } - ] - }); - }); - - it('parses metadata without trailing newlines', () => { - expect( - POParser.parse(` -msgid "" -msgstr "" -"POT-Creation-Date: 2025-10-27 16:00+0000" -"MIME-Version: 1.0" -`) - ).toEqual({ - meta: { - 'POT-Creation-Date': '2025-10-27 16:00+0000', - 'MIME-Version': '1.0' - } - }); - }); - - it('parses metadata when msgstr appears before msgid', () => { - expect( - POParser.parse(` -msgstr "" -msgid "" -"POT-Creation-Date: 2025-10-27 16:00+0000" -"MIME-Version: 1.0" - -msgid "hello" -msgstr "Hello" -`) - ).toEqual({ - meta: { - 'POT-Creation-Date': '2025-10-27 16:00+0000', - 'MIME-Version': '1.0' - }, - messages: [ - { - id: 'hello', - message: 'Hello' - } - ] - }); - }); - - it('parses nested namespaces correctly', () => { - expect( - POParser.parse(` -msgctxt "ui.button.submit" -msgid "text" -msgstr "Submit" -`) - ).toEqual({ - messages: [ - { - id: 'ui.button.submit.text', - message: 'Submit' - } - ] - }); - }); - - it('parses entries with varying flexible msgid/msgstr ordering', () => { - expect( - POParser.parse(` -msgstr "Hello" -msgid "greeting" - -msgid "farewell" -msgstr "Goodbye" -`) - ).toEqual({ - messages: [ - { - id: 'greeting', - message: 'Hello' - }, - { - id: 'farewell', - message: 'Goodbye' - } - ] - }); - }); - - it('parses files with Windows newline format (\\r\\n)', () => { - expect( - POParser.parse( - 'msgid "hello"\r\nmsgstr "Hello World"\r\n\r\nmsgid "goodbye"\r\nmsgstr "Goodbye"' - ) - ).toEqual({ - messages: [ - { - id: 'hello', - message: 'Hello World' - }, - { - id: 'goodbye', - message: 'Goodbye' - } - ] - }); - }); - - it('parses metadata with Windows newline format (\\r\\n)', () => { - expect( - POParser.parse( - 'msgid ""\r\nmsgstr ""\r\n"POT-Creation-Date: 2025-10-27 16:00+0000\\n"\r\n"Language: en\\n"' - ) - ).toEqual({ - meta: { - 'POT-Creation-Date': '2025-10-27 16:00+0000', - Language: 'en' - } - }); - }); - - describe('error handling', () => { - it('throws for incomplete quoted strings', () => { - expect(() => - POParser.parse(` -msgid "incomplete -msgstr "message" -`) - ).toThrow('Incomplete quoted string:\n> "incomplete'); - }); - - it('throws if the message is not quoted', () => { - expect(() => - POParser.parse(` -msgid "+YJVTi" -msgstr 123 -`) - ).toThrow('Incomplete quoted string:\n> 123'); - }); - - it('throws if the ID is not quoted', () => { - expect(() => - POParser.parse(` -msgid 123 -msgstr "Hey" -`) - ).toThrow('Incomplete quoted string:\n> 123'); - }); - - it('throws if no id is present', () => { - expect(() => - POParser.parse(` -msgstr "Hey" -`) - ).toThrow('Incomplete message entry: both msgid and msgstr are required'); - }); - - it('throws if no message is present', () => { - expect(() => - POParser.parse(` -msgid "+YJVTi" -`) - ).toThrow('Incomplete message entry: both msgid and msgstr are required'); - }); - - it('throws for usage of plurals', () => { - expect(() => - POParser.parse(` -msgid "+YJVTi" -msgstr "You have one new message" -msgid_plural "You have %d new messages" -`) - ).toThrow( - 'Plural forms (msgid_plural) are not supported, use ICU pluralization instead:\n> msgid_plural "You have %d new messages"' - ); - }); - - it('throws for translator comments', () => { - expect(() => - POParser.parse(` -# Shown on home screen -msgid "+YJVTi" -msgstr "Hey"`) - ).toThrow( - 'Translator comments (#) are not supported, use inline descriptions instead:\n> # Shown on home screen' - ); - }); - - it('throws for flag comments', () => { - expect(() => - POParser.parse(` -#, fuzzy -msgid "+YJVTi" -msgstr "Hey"`) - ).toThrow('Flag comments (#,) are not supported:\n> #, fuzzy'); - }); - - it('throws for previous string key comments', () => { - expect(() => - POParser.parse(` -#| msgid +YJVTi -msgid "+YJVTi" -msgstr "Hey"`) - ).toThrow( - 'Previous string key comments (#|) are not supported:\n> #| msgid +YJVTi' - ); - }); - - it('throws for strings with newlines', () => { - expect(() => - POParser.parse(` -msgid "" -"Very long string.\n" -"Even longer string" -msgstr "" -"translation\n" -"translation_2" -`) - ).toThrow( - 'Multi-line strings are not supported, use single-line strings instead:\n> "Very long string.' - ); - }); - }); -}); - -describe('serialize', () => { - it('serializes simple messages', () => { - expect( - POParser.serialize({ - messages: [ - {id: 'hello', message: 'Hello World'}, - {id: 'goodbye', message: 'Goodbye'} - ] - }) - ).toMatchInlineSnapshot(` - "msgid "hello" - msgstr "Hello World" - - msgid "goodbye" - msgstr "Goodbye" - " - `); - }); - - it('serializes messages with metadata', () => { - expect( - POParser.serialize({ - meta: { - 'Content-Type': 'text/plain; charset=UTF-8', - Language: 'en' - }, - messages: [{id: 'welcome', message: 'Welcome'}] - }) - ).toMatchInlineSnapshot(` - "msgid "" - msgstr "" - "Content-Type: text/plain; charset=UTF-8\\n" - "Language: en\\n" - - msgid "welcome" - msgstr "Welcome" - " - `); - }); - - it('serializes messages with context and references', () => { - expect( - POParser.serialize({ - messages: [ - { - id: 'ui.button.save', - message: 'Save', - description: 'Save button tooltip', - references: [ - {path: 'src/components/Button.tsx'}, - {path: 'src/pages/Profile.tsx'} - ] - } - ] - }) - ).toMatchInlineSnapshot(` - "#. Save button tooltip - #: src/components/Button.tsx - #: src/pages/Profile.tsx - msgctxt "ui.button" - msgid "save" - msgstr "Save" - " - `); - }); - - it('serializes nested namespaces correctly', () => { - expect( - POParser.serialize({ - messages: [ - {id: 'ui.button.submit.text', message: 'Submit'}, - {id: 'simple.message', message: 'Hello'} - ] - }) - ).toMatchInlineSnapshot(` - "msgctxt "ui.button.submit" - msgid "text" - msgstr "Submit" - - msgctxt "simple" - msgid "message" - msgstr "Hello" - " - `); - }); -}); diff --git a/packages/next-intl/src/extractor/utils/POParser.tsx b/packages/next-intl/src/extractor/utils/POParser.tsx deleted file mode 100644 index f7876fd95..000000000 --- a/packages/next-intl/src/extractor/utils/POParser.tsx +++ /dev/null @@ -1,317 +0,0 @@ -import type {ExtractedMessage} from '../types.js'; - -type Catalog = { - meta?: Record; - messages?: Array; -}; - -type State = 'entry' | 'meta'; - -type Entry = { - msgctxt?: string; - msgid?: string; - msgstr?: string; - references?: Array<{path: string}>; - description?: string; -}; - -export default class POParser { - private static readonly KEYWORDS = { - MSGID: 'msgid', - MSGSTR: 'msgstr', - MSGCTXT: 'msgctxt', - MSGID_PLURAL: 'msgid_plural' - } as const; - - private static readonly COMMENTS = { - REFERENCE: '#:', - EXTRACTED: '#.', - TRANSLATOR: '#', - FLAG: '#,', - PREVIOUS: '#|' - } as const; - - private static readonly NAMESPACE_SEPARATOR = '.'; - private static readonly QUOTE = '"'; - private static readonly NEWLINE = '\\n'; - private static readonly FILE_COLUMN_SEPARATOR = ':'; - private static readonly META_SEPARATOR = ':'; - - static parse(content: string): Catalog { - const lines = POParser.splitLines(content); - const messages: Array = []; - const meta: Record = {}; - - let state: State = 'entry'; - let entry: Entry | undefined; - - for (let i = 0; i < lines.length; i++) { - const line = lines[i].trim(); - - // An empty line indicates the end of an entry - if (!line) { - if (state === 'entry' && entry) { - messages.push(POParser.finishEntry(entry)); - entry = undefined; - } - state = 'entry'; - continue; - } - - if (state === 'meta') { - if (line.startsWith(POParser.QUOTE)) { - const metaLine = POParser.extractQuotedString(line, state); - const cleaned = metaLine.endsWith(POParser.NEWLINE) - ? metaLine.slice(0, -2) - : metaLine; - - const separatorIndex = cleaned.indexOf(POParser.META_SEPARATOR); - if (separatorIndex > 0) { - const key = cleaned.substring(0, separatorIndex).trim(); - const value = cleaned.substring(separatorIndex + 1).trim(); - meta[key] = value; - } - } else { - POParser.throwWithLine( - 'Encountered unexpected non-quoted metadata line', - line - ); - } - } else { - // Unsupported comment types - if (POParser.lineStartsWithPrefix(line, POParser.COMMENTS.TRANSLATOR)) { - POParser.throwWithLine( - 'Translator comments (#) are not supported, use inline descriptions instead', - line - ); - } - if (POParser.lineStartsWithPrefix(line, POParser.COMMENTS.FLAG)) { - POParser.throwWithLine('Flag comments (#,) are not supported', line); - } - if (POParser.lineStartsWithPrefix(line, POParser.COMMENTS.PREVIOUS)) { - POParser.throwWithLine( - 'Previous string key comments (#|) are not supported', - line - ); - } - - // Reference comments - if (POParser.lineStartsWithPrefix(line, POParser.COMMENTS.REFERENCE)) { - entry = POParser.ensureEntry(entry); - // Only use the path part, ignore line and column numbers - const path = line - .substring(POParser.COMMENTS.REFERENCE.length) - .trim() - .split(POParser.FILE_COLUMN_SEPARATOR) - .at(0)!; - entry.references ??= []; - entry.references.push({path}); - continue; - } - - // Extracted comments - if (POParser.lineStartsWithPrefix(line, POParser.COMMENTS.EXTRACTED)) { - entry = POParser.ensureEntry(entry); - entry.description = line - .substring(POParser.COMMENTS.EXTRACTED.length) - .trim(); - continue; - } - - // Check for unsupported features - if ( - POParser.lineStartsWithPrefix(line, POParser.KEYWORDS.MSGID_PLURAL) - ) { - POParser.throwWithLine( - 'Plural forms (msgid_plural) are not supported, use ICU pluralization instead', - line - ); - } - - // msgctxt - if (POParser.lineStartsWithPrefix(line, POParser.KEYWORDS.MSGCTXT)) { - entry = POParser.ensureEntry(entry); - entry.msgctxt = POParser.extractQuotedString( - line.substring(POParser.KEYWORDS.MSGCTXT.length + 1), - state - ); - continue; - } - - // msgid - if (POParser.lineStartsWithPrefix(line, POParser.KEYWORDS.MSGID)) { - entry = POParser.ensureEntry(entry); - entry.msgid = POParser.extractQuotedString( - line.substring(POParser.KEYWORDS.MSGID.length + 1), - state - ); - - if (POParser.isMetaEntry(entry, messages)) { - state = 'meta'; - entry = undefined; - } - continue; - } - - // msgstr - if (POParser.lineStartsWithPrefix(line, POParser.KEYWORDS.MSGSTR)) { - entry = POParser.ensureEntry(entry); - entry.msgstr = POParser.extractQuotedString( - line.substring(POParser.KEYWORDS.MSGSTR.length + 1), - state - ); - - if (POParser.isMetaEntry(entry, messages)) { - state = 'meta'; - entry = undefined; - } - continue; - } - - // Multi-line strings are not supported in entry mode - if (line.startsWith(POParser.QUOTE)) { - POParser.throwWithLine( - 'Multi-line strings are not supported, use single-line strings instead', - line - ); - } - } - } - - // Finish any remaining entry - if (state === 'entry' && entry) { - messages.push(POParser.finishEntry(entry)); - } - - return { - meta: Object.keys(meta).length > 0 ? meta : undefined, - messages: messages.length > 0 ? messages : undefined - }; - } - - private static isMetaEntry( - entry: Entry, - messages: Array - ): boolean { - return messages.length === 0 && entry.msgid === '' && entry.msgstr === ''; - } - - static serialize(catalog: Catalog): string { - const lines: Array = []; - - // Metadata - if (catalog.meta) { - lines.push( - `${POParser.KEYWORDS.MSGID} ${POParser.QUOTE}${POParser.QUOTE}` - ); - lines.push( - `${POParser.KEYWORDS.MSGSTR} ${POParser.QUOTE}${POParser.QUOTE}` - ); - for (const [key, value] of Object.entries(catalog.meta)) { - lines.push( - `${POParser.QUOTE}${key}${POParser.META_SEPARATOR} ${value}${POParser.NEWLINE}${POParser.QUOTE}` - ); - } - lines.push(''); - } - - // Messages - if (catalog.messages) { - for (const message of catalog.messages) { - if (message.description) { - lines.push(`${POParser.COMMENTS.EXTRACTED} ${message.description}`); - } - - if (message.references && message.references.length > 0) { - for (const ref of message.references) { - lines.push(`${POParser.COMMENTS.REFERENCE} ${ref.path}`); - } - } - - let msgctxt: string | undefined; - let msgid: string; - - const lastDotIndex = message.id.lastIndexOf( - POParser.NAMESPACE_SEPARATOR - ); - if (lastDotIndex > 0) { - msgctxt = message.id.substring(0, lastDotIndex); - msgid = message.id.substring(lastDotIndex + 1); - } else { - msgid = message.id; - } - - if (msgctxt) { - lines.push( - `${POParser.KEYWORDS.MSGCTXT} ${POParser.QUOTE}${msgctxt}${POParser.QUOTE}` - ); - } - - lines.push( - `${POParser.KEYWORDS.MSGID} ${POParser.QUOTE}${msgid}${POParser.QUOTE}` - ); - lines.push( - `${POParser.KEYWORDS.MSGSTR} ${POParser.QUOTE}${message.message}${POParser.QUOTE}` - ); - lines.push(''); - } - } - - return lines.join('\n'); - } - - private static lineStartsWithPrefix(line: string, prefix: string) { - return line.startsWith(prefix + ' '); - } - - private static throwWithLine(message: string, line: string): never { - throw new Error(`${message}:\n> ${line}`); - } - - private static splitLines(content: string): Array { - // Avoid overhead for Unix newlines only - if (content.includes('\r')) { - content = content.replace(/\r\n/g, '\n'); - } - - return content.split('\n'); - } - - private static ensureEntry(entry: Entry | undefined): Entry { - return entry || {}; - } - - private static finishEntry(entry: Entry): ExtractedMessage { - if (entry.msgid == null || entry.msgstr == null) { - throw new Error( - 'Incomplete message entry: both msgid and msgstr are required' - ); - } - - let fullId = entry.msgid; - if (entry.msgctxt) { - fullId = entry.msgctxt + POParser.NAMESPACE_SEPARATOR + entry.msgid; - } - - return { - id: fullId, - message: entry.msgstr, - description: entry.description, - references: entry.references - }; - } - - private static extractQuotedString(line: string, state?: State): string { - const trimmed = line.trim(); - const endIndex = trimmed.indexOf(POParser.QUOTE, POParser.QUOTE.length); - - if (endIndex === -1) { - if (state === 'meta') { - return trimmed.substring(POParser.QUOTE.length); - } - POParser.throwWithLine('Incomplete quoted string', line); - } - - return trimmed.substring(POParser.QUOTE.length, endIndex); - } -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e1171a79b..6a3aebf82 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -45,10 +45,10 @@ importers: version: 2.2.0(react@18.3.1) '@vercel/analytics': specifier: 1.5.0 - version: 1.5.0(@remix-run/react@2.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 1.5.0(@remix-run/react@2.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@vercel/speed-insights': specifier: ^1.2.0 - version: 1.2.0(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 1.2.0(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) clsx: specifier: ^2.1.1 version: 2.1.1 @@ -57,13 +57,13 @@ importers: version: 2.3.0 next: specifier: ^14.2.4 - version: 14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) nextra: specifier: ^3.3.1 - version: 3.3.1(@types/react@19.2.2)(acorn@8.15.0)(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + version: 3.3.1(@types/react@19.2.2)(acorn@8.15.0)(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) nextra-theme-docs: specifier: ^3.3.1 - version: 3.3.1(patch_hash=37qjvtnqoj5dxgzxofrrj6xcdq)(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@3.3.1(@types/react@19.2.2)(acorn@8.15.0)(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 3.3.1(patch_hash=37qjvtnqoj5dxgzxofrrj6xcdq)(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@3.3.1(@types/react@19.2.2)(acorn@8.15.0)(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: ^18.3.1 version: 18.3.1 @@ -94,7 +94,7 @@ importers: version: 9.11.1(jiti@2.4.2) eslint-config-molindo: specifier: ^8.0.0 - version: 8.0.0(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(jest@29.7.0(@types/node@20.17.24))(tailwindcss@3.4.17)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)) + version: 8.0.0(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(@typescript-eslint/parser@8.46.2(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(jest@29.7.0(@types/node@20.17.24))(tailwindcss@3.4.17)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)) fast-glob: specifier: ^3.3.3 version: 3.3.3 @@ -103,7 +103,7 @@ importers: version: 16.0.0 next-sitemap: specifier: ^4.2.3 - version: 4.2.3(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + version: 4.2.3(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) next-validate-link: specifier: ^1.5.1 version: 1.5.1 @@ -167,7 +167,7 @@ importers: version: 9.38.0(jiti@2.4.2) eslint-config-next: specifier: ^16.0.3 - version: 16.0.3(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2) + version: 16.0.3(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2) jest: specifier: ^29.7.0 version: 29.7.0(@types/node@20.17.24) @@ -216,7 +216,7 @@ importers: version: 9.38.0(jiti@2.4.2) eslint-config-next: specifier: ^16.0.3 - version: 16.0.3(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2) + version: 16.0.3(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2) prettier: specifier: ^3.3.3 version: 3.5.3 @@ -323,7 +323,7 @@ importers: version: 16.0.3(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) next-auth: specifier: ^4.24.11 - version: 4.24.11(next@16.0.3(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 4.24.11(next@16.0.3(@playwright/test@1.55.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) next-intl: specifier: ^4.0.0 version: link:../../packages/next-intl @@ -823,6 +823,9 @@ importers: negotiator: specifier: ^1.0.0 version: 1.0.0 + po-parser: + specifier: ^0.1.2 + version: 0.1.2 use-intl: specifier: workspace:^ version: link:../use-intl @@ -859,7 +862,7 @@ importers: version: 9.11.1(jiti@2.4.2) eslint-config-molindo: specifier: ^8.0.0 - version: 8.0.0(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(@typescript-eslint/parser@8.46.2(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(jest@29.7.0(@types/node@20.17.24))(tailwindcss@4.0.13)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)) + version: 8.0.0(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(jest@29.7.0(@types/node@20.17.24))(tailwindcss@4.0.13)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)) eslint-plugin-react-compiler: specifier: 0.0.0-experimental-8e3b87c-20240822 version: 0.0.0-experimental-8e3b87c-20240822(eslint@9.11.1(jiti@2.4.2)) @@ -2621,7 +2624,7 @@ packages: '@expo/bunyan@4.0.1': resolution: {integrity: sha512-+Lla7nYSiHZirgK+U/uYzsLv/X+HaJienbD5AKX1UQZHYfWaP+9uuQluRB4GrEVWF0GZ7vEVp/jzaOT9k/SQlg==} - engines: {'0': node >=0.10.0} + engines: {node: '>=0.10.0'} '@expo/cli@0.4.11': resolution: {integrity: sha512-L9Ci9RBh0aPFEDF1AjDYPk54OgeUJIKzxF3lRgITm+lQpI3IEKjAc9LaYeQeO1mlZMUQmPkHArF8iyz1eOeVoQ==} @@ -12087,6 +12090,9 @@ packages: resolution: {integrity: sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg==} engines: {node: '>=6'} + po-parser@0.1.2: + resolution: {integrity: sha512-VM3oOnJPNe4akD3lu4vKM5wjjogpEKe9h2//pSDeZIU7y7RPzIW1xmbznkAo97raGkLkK+Hrzpp9Txp2Ej5/bQ==} + points-on-curve@0.2.0: resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} @@ -21004,15 +21010,15 @@ snapshots: '@vanilla-extract/private@1.0.3': {} - '@vercel/analytics@1.5.0(@remix-run/react@2.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@vercel/analytics@1.5.0(@remix-run/react@2.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': optionalDependencies: '@remix-run/react': 2.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) - next: 14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 - '@vercel/speed-insights@1.2.0(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@vercel/speed-insights@1.2.0(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': optionalDependencies: - next: 14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 '@vitejs/plugin-react@4.3.4(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0))': @@ -24130,6 +24136,37 @@ snapshots: optionalDependencies: source-map: 0.6.1 + eslint-config-molindo@8.0.0(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(@typescript-eslint/parser@8.46.2(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(jest@29.7.0(@types/node@20.17.24))(tailwindcss@3.4.17)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)): + dependencies: + '@eslint/js': 9.12.0 + '@typescript-eslint/utils': 8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) + '@vitest/eslint-plugin': 1.1.7(@typescript-eslint/utils@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)) + confusing-browser-globals: 1.0.11 + eslint: 9.11.1(jiti@2.4.2) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.46.2(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@2.4.2)) + eslint-plugin-css-modules: 2.11.0(eslint@9.11.1(jiti@2.4.2)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.46.2(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@2.4.2)) + eslint-plugin-jest: 28.8.3(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(jest@29.7.0(@types/node@20.17.24))(typescript@5.8.2) + eslint-plugin-jsx-a11y: 6.10.0(eslint@9.11.1(jiti@2.4.2)) + eslint-plugin-react: 7.37.1(eslint@9.11.1(jiti@2.4.2)) + eslint-plugin-react-hooks: 5.0.0(eslint@9.11.1(jiti@2.4.2)) + eslint-plugin-sort-destructure-keys: 2.0.0(eslint@9.11.1(jiti@2.4.2)) + eslint-plugin-tailwindcss: 3.13.0(tailwindcss@3.4.17) + eslint-plugin-unicorn: 56.0.0(eslint@9.11.1(jiti@2.4.2)) + eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2)) + typescript-eslint: 8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) + transitivePeerDependencies: + - '@typescript-eslint/eslint-plugin' + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - eslint-plugin-import-x + - jest + - supports-color + - tailwindcss + - typescript + - vitest + eslint-config-molindo@8.0.0(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(@typescript-eslint/parser@8.46.2(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(jest@29.7.0(@types/node@20.17.24))(tailwindcss@4.0.13)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)): dependencies: '@eslint/js': 9.12.0 @@ -24192,7 +24229,7 @@ snapshots: - typescript - vitest - eslint-config-molindo@8.0.0(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(jest@29.7.0(@types/node@20.17.24))(tailwindcss@3.4.17)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)): + eslint-config-molindo@8.0.0(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(jest@29.7.0(@types/node@20.17.24))(tailwindcss@4.0.13)(typescript@5.8.2)(vitest@3.0.8(@edge-runtime/vm@5.0.0)(@types/debug@4.1.12)(@types/node@20.17.24)(jiti@2.4.2)(jsdom@27.1.0)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0)): dependencies: '@eslint/js': 9.12.0 '@typescript-eslint/utils': 8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) @@ -24207,7 +24244,7 @@ snapshots: eslint-plugin-react: 7.37.1(eslint@9.11.1(jiti@2.4.2)) eslint-plugin-react-hooks: 5.0.0(eslint@9.11.1(jiti@2.4.2)) eslint-plugin-sort-destructure-keys: 2.0.0(eslint@9.11.1(jiti@2.4.2)) - eslint-plugin-tailwindcss: 3.13.0(tailwindcss@3.4.17) + eslint-plugin-tailwindcss: 3.13.0(tailwindcss@4.0.13) eslint-plugin-unicorn: 56.0.0(eslint@9.11.1(jiti@2.4.2)) eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2))(eslint@9.11.1(jiti@2.4.2)) typescript-eslint: 8.9.0(eslint@9.11.1(jiti@2.4.2))(typescript@5.8.2) @@ -24229,7 +24266,7 @@ snapshots: eslint: 9.38.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.38.0(jiti@2.4.2)))(eslint@9.38.0(jiti@2.4.2)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.38.0(jiti@2.4.2)))(eslint@9.38.0(jiti@2.4.2)))(eslint@9.38.0(jiti@2.4.2)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.38.0(jiti@2.4.2)) eslint-plugin-jsx-a11y: 6.10.0(eslint@9.38.0(jiti@2.4.2)) eslint-plugin-react: 7.37.1(eslint@9.38.0(jiti@2.4.2)) eslint-plugin-react-hooks: 7.0.1(eslint@9.38.0(jiti@2.4.2)) @@ -24302,7 +24339,7 @@ snapshots: is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.38.0(jiti@2.4.2)))(eslint@9.38.0(jiti@2.4.2)))(eslint@9.38.0(jiti@2.4.2)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.38.0(jiti@2.4.2)) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node @@ -24540,7 +24577,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.38.0(jiti@2.4.2)))(eslint@9.38.0(jiti@2.4.2)))(eslint@9.38.0(jiti@2.4.2)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.4.2))(typescript@5.8.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.38.0(jiti@2.4.2)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -29629,7 +29666,7 @@ snapshots: dependencies: type-fest: 2.19.0 - next-auth@4.24.11(next@16.0.3(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + next-auth@4.24.11(next@16.0.3(@playwright/test@1.55.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: '@babel/runtime': 7.24.7 '@panva/hkdf': 1.2.0 @@ -29644,13 +29681,13 @@ snapshots: react-dom: 19.2.0(react@19.2.0) uuid: 8.3.2 - next-sitemap@4.2.3(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + next-sitemap@4.2.3(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): dependencies: '@corex/deepmerge': 4.0.43 '@next/env': 13.5.6 fast-glob: 3.3.3 minimist: 1.2.8 - next: 14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-themes@0.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: @@ -29696,7 +29733,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 14.2.24 '@swc/helpers': 0.5.5 @@ -29706,7 +29743,7 @@ snapshots: postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.26.10)(react@18.3.1) optionalDependencies: '@next/swc-darwin-arm64': 14.2.24 '@next/swc-darwin-x64': 14.2.24 @@ -29746,21 +29783,21 @@ snapshots: - '@babel/core' - babel-plugin-macros - nextra-theme-docs@3.3.1(patch_hash=37qjvtnqoj5dxgzxofrrj6xcdq)(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@3.3.1(@types/react@19.2.2)(acorn@8.15.0)(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + nextra-theme-docs@3.3.1(patch_hash=37qjvtnqoj5dxgzxofrrj6xcdq)(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(nextra@3.3.1(@types/react@19.2.2)(acorn@8.15.0)(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@headlessui/react': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) clsx: 2.1.1 escape-string-regexp: 5.0.0 flexsearch: 0.7.43 - next: 14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-themes: 0.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - nextra: 3.3.1(@types/react@19.2.2)(acorn@8.15.0)(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) + nextra: 3.3.1(@types/react@19.2.2)(acorn@8.15.0)(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) scroll-into-view-if-needed: 3.1.0 zod: 3.24.2 - nextra@3.3.1(@types/react@19.2.2)(acorn@8.15.0)(next@14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2): + nextra@3.3.1(@types/react@19.2.2)(acorn@8.15.0)(next@14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.8.2): dependencies: '@formatjs/intl-localematcher': 0.5.10 '@headlessui/react': 2.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -29783,7 +29820,7 @@ snapshots: mdast-util-gfm: 3.1.0 mdast-util-to-hast: 13.2.0 negotiator: 1.0.0 - next: 14.2.24(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.24(@babel/core@7.26.10)(@playwright/test@1.55.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) p-limit: 6.2.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -30698,6 +30735,8 @@ snapshots: transitivePeerDependencies: - typescript + po-parser@0.1.2: {} + points-on-curve@0.2.0: {} points-on-path@0.2.1: @@ -33003,10 +33042,12 @@ snapshots: dependencies: react: 17.0.2 - styled-jsx@5.1.1(react@18.3.1): + styled-jsx@5.1.1(@babel/core@7.26.10)(react@18.3.1): dependencies: client-only: 0.0.1 react: 18.3.1 + optionalDependencies: + '@babel/core': 7.26.10 styled-jsx@5.1.6(@babel/core@7.26.10)(react@19.2.0): dependencies: