Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e843de42da | |||
| 4d1b2231e3 | |||
| 71f47f9037 | |||
| 79d41b6a73 |
@@ -2,13 +2,8 @@ name: Monorepo Pipeline
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
tags:
|
tags:
|
||||||
- 'v*'
|
- 'v*'
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
@@ -18,6 +13,8 @@ jobs:
|
|||||||
qa:
|
qa:
|
||||||
name: 🧪 Quality Assurance
|
name: 🧪 Quality Assurance
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
|
container:
|
||||||
|
image: catthehacker/ubuntu:act-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -52,6 +49,8 @@ jobs:
|
|||||||
needs: qa
|
needs: qa
|
||||||
if: startsWith(github.ref, 'refs/tags/v')
|
if: startsWith(github.ref, 'refs/tags/v')
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
|
container:
|
||||||
|
image: catthehacker/ubuntu:act-latest
|
||||||
env:
|
env:
|
||||||
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
@@ -86,6 +85,8 @@ jobs:
|
|||||||
needs: qa
|
needs: qa
|
||||||
if: startsWith(github.ref, 'refs/tags/v')
|
if: startsWith(github.ref, 'refs/tags/v')
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
|
container:
|
||||||
|
image: catthehacker/ubuntu:act-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -94,49 +95,52 @@ jobs:
|
|||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
- name: 🔐 Registry Login
|
- name: 🔐 Registry Login
|
||||||
run: |
|
uses: docker/login-action@v3
|
||||||
echo "${{ secrets.REGISTRY_PASS }}" | docker login registry.infra.mintel.me -u "${{ secrets.REGISTRY_USER }}" --password-stdin
|
with:
|
||||||
|
registry: registry.infra.mintel.me
|
||||||
|
username: ${{ secrets.REGISTRY_USER }}
|
||||||
|
password: ${{ secrets.REGISTRY_PASS }}
|
||||||
|
|
||||||
- name: 🏗️ Build & Push Nextjs Build-Base
|
- name: 🏗️ Build & Push Nextjs Build-Base
|
||||||
env:
|
uses: docker/build-push-action@v5
|
||||||
TAG: ${{ github.ref_name }}
|
with:
|
||||||
run: |
|
context: .
|
||||||
docker buildx build \
|
file: packages/infra/docker/Dockerfile.nextjs
|
||||||
--platform linux/amd64,linux/arm64 \
|
platforms: linux/amd64,linux/arm64
|
||||||
-t registry.infra.mintel.me/mintel/nextjs:$TAG \
|
push: true
|
||||||
-t registry.infra.mintel.me/mintel/nextjs:latest \
|
tags: |
|
||||||
-f packages/infra/docker/Dockerfile.nextjs \
|
registry.infra.mintel.me/mintel/nextjs:${{ github.ref_name }}
|
||||||
--push .
|
registry.infra.mintel.me/mintel/nextjs:latest
|
||||||
|
|
||||||
- name: 🏗️ Build & Push Production Runtime
|
- name: 🏗️ Build & Push Production Runtime
|
||||||
env:
|
uses: docker/build-push-action@v5
|
||||||
TAG: ${{ github.ref_name }}
|
with:
|
||||||
run: |
|
context: .
|
||||||
docker buildx build \
|
file: packages/infra/docker/Dockerfile.runtime
|
||||||
--platform linux/amd64,linux/arm64 \
|
platforms: linux/amd64,linux/arm64
|
||||||
-t registry.infra.mintel.me/mintel/runtime:$TAG \
|
push: true
|
||||||
-t registry.infra.mintel.me/mintel/runtime:latest \
|
tags: |
|
||||||
-f packages/infra/docker/Dockerfile.runtime \
|
registry.infra.mintel.me/mintel/runtime:${{ github.ref_name }}
|
||||||
--push .
|
registry.infra.mintel.me/mintel/runtime:latest
|
||||||
|
|
||||||
- name: 🏗️ Build & Push Gatekeeper (Product)
|
- name: 🏗️ Build & Push Gatekeeper (Product)
|
||||||
env:
|
uses: docker/build-push-action@v5
|
||||||
TAG: ${{ github.ref_name }}
|
with:
|
||||||
run: |
|
context: .
|
||||||
docker buildx build \
|
file: packages/infra/docker/Dockerfile.gatekeeper
|
||||||
--platform linux/amd64,linux/arm64 \
|
platforms: linux/amd64,linux/arm64
|
||||||
-t registry.infra.mintel.me/mintel/gatekeeper:$TAG \
|
push: true
|
||||||
-t registry.infra.mintel.me/mintel/gatekeeper:latest \
|
tags: |
|
||||||
-f packages/infra/docker/Dockerfile.gatekeeper \
|
registry.infra.mintel.me/mintel/gatekeeper:${{ github.ref_name }}
|
||||||
--push .
|
registry.infra.mintel.me/mintel/gatekeeper:latest
|
||||||
|
|
||||||
- name: 🏗️ Build & Push Directus (Base)
|
- name: 🏗️ Build & Push Directus (Base)
|
||||||
env:
|
uses: docker/build-push-action@v5
|
||||||
TAG: ${{ github.ref_name }}
|
with:
|
||||||
run: |
|
context: .
|
||||||
docker buildx build \
|
file: packages/infra/docker/Dockerfile.directus
|
||||||
--platform linux/amd64,linux/arm64 \
|
platforms: linux/amd64,linux/arm64
|
||||||
-t registry.infra.mintel.me/mintel/directus:$TAG \
|
push: true
|
||||||
-t registry.infra.mintel.me/mintel/directus:latest \
|
tags: |
|
||||||
-f packages/infra/docker/Dockerfile.directus \
|
registry.infra.mintel.me/mintel/directus:${{ github.ref_name }}
|
||||||
--push .
|
registry.infra.mintel.me/mintel/directus:latest
|
||||||
|
|||||||
@@ -13,10 +13,14 @@ export const nextConfig = [
|
|||||||
{
|
{
|
||||||
ignores: [
|
ignores: [
|
||||||
"**/dist/**",
|
"**/dist/**",
|
||||||
|
"**/build/**",
|
||||||
|
"**/out/**",
|
||||||
|
"**/coverage/**",
|
||||||
"**/.next/**",
|
"**/.next/**",
|
||||||
"**/node_modules/**",
|
"**/node_modules/**",
|
||||||
"**/.gitea/**",
|
"**/.gitea/**",
|
||||||
"**/.changeset/**",
|
"**/.changeset/**",
|
||||||
|
"**/.vercel/**",
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
...compat.extends("next/core-web-vitals", "next/typescript"),
|
...compat.extends("next/core-web-vitals", "next/typescript"),
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
"lucide-react": "^0.474.0",
|
"lucide-react": "^0.474.0",
|
||||||
"next": "15.1.6",
|
"next": "15.1.6",
|
||||||
"next-intl": "^3.26.5",
|
"next-intl": "^4.8.2",
|
||||||
"react": "^19.0.0",
|
"react": "^19.0.0",
|
||||||
"react-dom": "^19.0.0",
|
"react-dom": "^19.0.0",
|
||||||
"tailwind-merge": "^2.6.0"
|
"tailwind-merge": "^2.6.0"
|
||||||
|
|||||||
@@ -24,6 +24,8 @@ jobs:
|
|||||||
prepare:
|
prepare:
|
||||||
name: 🔍 Prepare Environment
|
name: 🔍 Prepare Environment
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
|
container:
|
||||||
|
image: catthehacker/ubuntu:act-latest
|
||||||
outputs:
|
outputs:
|
||||||
target: ${{ steps.determine.outputs.target }}
|
target: ${{ steps.determine.outputs.target }}
|
||||||
image_tag: ${{ steps.determine.outputs.image_tag }}
|
image_tag: ${{ steps.determine.outputs.image_tag }}
|
||||||
@@ -136,6 +138,8 @@ jobs:
|
|||||||
needs: prepare
|
needs: prepare
|
||||||
if: needs.prepare.outputs.target != 'skip'
|
if: needs.prepare.outputs.target != 'skip'
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
|
container:
|
||||||
|
image: catthehacker/ubuntu:act-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -171,6 +175,8 @@ jobs:
|
|||||||
needs: prepare
|
needs: prepare
|
||||||
if: needs.prepare.outputs.target != 'skip'
|
if: needs.prepare.outputs.target != 'skip'
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
|
container:
|
||||||
|
image: catthehacker/ubuntu:act-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -179,23 +185,24 @@ jobs:
|
|||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
- name: 🔐 Registry Login
|
- name: 🔐 Registry Login
|
||||||
run: |
|
uses: docker/login-action@v3
|
||||||
echo "${{ secrets.REGISTRY_PASS }}" | docker login registry.infra.mintel.me -u "${{ secrets.REGISTRY_USER }}" --password-stdin
|
with:
|
||||||
|
registry: registry.infra.mintel.me
|
||||||
|
username: ${{ secrets.REGISTRY_USER }}
|
||||||
|
password: ${{ secrets.REGISTRY_PASS }}
|
||||||
|
|
||||||
- name: 🏗️ Docker Build & Push
|
- name: 🏗️ Docker Build & Push
|
||||||
env:
|
uses: docker/build-push-action@v5
|
||||||
IMAGE_TAG: ${{ needs.prepare.outputs.image_tag }}
|
with:
|
||||||
NEXT_PUBLIC_BASE_URL: ${{ needs.prepare.outputs.next_public_base_url }}
|
context: .
|
||||||
run: |
|
platforms: linux/arm64
|
||||||
docker buildx build \
|
build-args: |
|
||||||
--pull \
|
NEXT_PUBLIC_BASE_URL=${{ needs.prepare.outputs.next_public_base_url }}
|
||||||
--platform linux/arm64 \
|
NEXT_PUBLIC_TARGET=${{ needs.prepare.outputs.target }}
|
||||||
--build-arg NEXT_PUBLIC_BASE_URL="$NEXT_PUBLIC_BASE_URL" \
|
push: true
|
||||||
--build-arg NEXT_PUBLIC_TARGET="${{ needs.prepare.outputs.target }}" \
|
tags: registry.infra.mintel.me/mintel/${{ github.event.repository.name }}:${{ needs.prepare.outputs.image_tag }}
|
||||||
-t registry.infra.mintel.me/mintel/${{ github.event.repository.name }}:$IMAGE_TAG \
|
cache-from: type=registry,ref=registry.infra.mintel.me/mintel/${{ github.event.repository.name }}:buildcache
|
||||||
--cache-from type=registry,ref=registry.infra.mintel.me/mintel/${{ github.event.repository.name }}:buildcache \
|
cache-to: type=registry,ref=registry.infra.mintel.me/mintel/${{ github.event.repository.name }}:buildcache,mode=max
|
||||||
--cache-to type=registry,ref=registry.infra.mintel.me/mintel/${{ github.event.repository.name }}:buildcache,mode=max \
|
|
||||||
--push .
|
|
||||||
|
|
||||||
# ──────────────────────────────────────────────────────────────────────────────
|
# ──────────────────────────────────────────────────────────────────────────────
|
||||||
# JOB 4: Deploy
|
# JOB 4: Deploy
|
||||||
@@ -205,6 +212,8 @@ jobs:
|
|||||||
needs: [prepare, build, qa]
|
needs: [prepare, build, qa]
|
||||||
if: needs.prepare.outputs.target != 'skip'
|
if: needs.prepare.outputs.target != 'skip'
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
|
container:
|
||||||
|
image: catthehacker/ubuntu:act-latest
|
||||||
env:
|
env:
|
||||||
TARGET: ${{ needs.prepare.outputs.target }}
|
TARGET: ${{ needs.prepare.outputs.target }}
|
||||||
IMAGE_TAG: ${{ needs.prepare.outputs.image_tag }}
|
IMAGE_TAG: ${{ needs.prepare.outputs.image_tag }}
|
||||||
@@ -271,6 +280,8 @@ jobs:
|
|||||||
needs: [prepare, deploy]
|
needs: [prepare, deploy]
|
||||||
if: always()
|
if: always()
|
||||||
runs-on: docker
|
runs-on: docker
|
||||||
|
container:
|
||||||
|
image: catthehacker/ubuntu:act-latest
|
||||||
steps:
|
steps:
|
||||||
- name: 🔔 Gotify - Success
|
- name: 🔔 Gotify - Success
|
||||||
if: needs.deploy.result == 'success'
|
if: needs.deploy.result == 'success'
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import createNextIntlPlugin from "next-intl/plugin";
|
import createNextIntlPlugin from "next-intl/plugin";
|
||||||
import { withSentryConfig } from "@sentry/nextjs";
|
import { withSentryConfig } from "@sentry/nextjs";
|
||||||
|
import fs from "node:fs";
|
||||||
const withNextIntl = createNextIntlPlugin();
|
import path from "node:path";
|
||||||
|
|
||||||
/** @type {import('next').NextConfig} */
|
/** @type {import('next').NextConfig} */
|
||||||
export const baseNextConfig = {
|
export const baseNextConfig = {
|
||||||
@@ -34,10 +34,30 @@ export const baseNextConfig = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const withMintelConfig = (config) => {
|
const withMintelConfig = (config) => {
|
||||||
const nextIntlConfig = withNextIntl({ ...baseNextConfig, ...config });
|
const i18nPaths = [
|
||||||
|
"src/i18n/request.ts",
|
||||||
|
"src/i18n/request.tsx",
|
||||||
|
"i18n/request.ts",
|
||||||
|
"i18n/request.tsx",
|
||||||
|
"src/i18n.ts",
|
||||||
|
"src/i18n.tsx",
|
||||||
|
"i18n.ts",
|
||||||
|
"i18n.tsx",
|
||||||
|
];
|
||||||
|
|
||||||
|
const hasI18nConfig = i18nPaths.some((p) =>
|
||||||
|
fs.existsSync(path.resolve(process.cwd(), p)),
|
||||||
|
);
|
||||||
|
|
||||||
|
let nextConfig = { ...baseNextConfig, ...config };
|
||||||
|
|
||||||
|
if (hasI18nConfig) {
|
||||||
|
const withNextIntl = createNextIntlPlugin();
|
||||||
|
nextConfig = withNextIntl(nextConfig);
|
||||||
|
}
|
||||||
|
|
||||||
return withSentryConfig(
|
return withSentryConfig(
|
||||||
nextIntlConfig,
|
nextConfig,
|
||||||
{
|
{
|
||||||
silent: !process.env.CI,
|
silent: !process.env.CI,
|
||||||
treeshake: { removeDebugLogging: true },
|
treeshake: { removeDebugLogging: true },
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"next-intl": "^3.0.0",
|
"next-intl": "^4.8.2",
|
||||||
"@sentry/nextjs": "^8.0.0"
|
"@sentry/nextjs": "^8.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@directus/sdk": "^21.0.0",
|
"@directus/sdk": "^21.0.0",
|
||||||
"next": "15.1.6",
|
"next": "15.1.6",
|
||||||
"next-intl": "^3.0.0",
|
"next-intl": "^4.8.2",
|
||||||
"zod": "^3.0.0"
|
"zod": "^3.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { describe, it, expect } from "vitest";
|
import { describe, it, expect } from "vitest";
|
||||||
import { isValidLang } from "../src/index";
|
import { isValidLang } from "./lang";
|
||||||
|
|
||||||
describe("next-utils", () => {
|
describe("next-utils", () => {
|
||||||
it("should validate languages correctly", () => {
|
it("should validate languages correctly", () => {
|
||||||
|
|||||||
@@ -30,12 +30,7 @@ export async function rateLimit(
|
|||||||
submissions[identifier] = now;
|
submissions[identifier] = now;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const languages = ["en", "de"] as const;
|
export * from "./lang";
|
||||||
export type Lang = (typeof languages)[number];
|
|
||||||
|
|
||||||
export function isValidLang(lang: string): lang is Lang {
|
|
||||||
return (languages as readonly string[]).includes(lang);
|
|
||||||
}
|
|
||||||
|
|
||||||
export * from "./i18n";
|
export * from "./i18n";
|
||||||
export * from "./env";
|
export * from "./env";
|
||||||
|
|||||||
6
packages/next-utils/src/lang.ts
Normal file
6
packages/next-utils/src/lang.ts
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
export const languages = ["en", "de"] as const;
|
||||||
|
export type Lang = (typeof languages)[number];
|
||||||
|
|
||||||
|
export function isValidLang(lang: string): lang is Lang {
|
||||||
|
return (languages as readonly string[]).includes(lang);
|
||||||
|
}
|
||||||
88
pnpm-lock.yaml
generated
88
pnpm-lock.yaml
generated
@@ -179,8 +179,8 @@ importers:
|
|||||||
specifier: 15.1.6
|
specifier: 15.1.6
|
||||||
version: 15.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
|
version: 15.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
|
||||||
next-intl:
|
next-intl:
|
||||||
specifier: ^3.26.5
|
specifier: ^4.8.2
|
||||||
version: 3.26.5(next@15.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)
|
version: 4.8.2(next@15.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(typescript@5.9.3)
|
||||||
react:
|
react:
|
||||||
specifier: ^19.0.0
|
specifier: ^19.0.0
|
||||||
version: 19.2.4
|
version: 19.2.4
|
||||||
@@ -249,8 +249,8 @@ importers:
|
|||||||
specifier: ^8.0.0
|
specifier: ^8.0.0
|
||||||
version: 8.55.0(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(next@15.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(webpack@5.104.1)
|
version: 8.55.0(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(next@15.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(webpack@5.104.1)
|
||||||
next-intl:
|
next-intl:
|
||||||
specifier: ^3.0.0
|
specifier: ^4.8.2
|
||||||
version: 3.26.5(next@15.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)
|
version: 4.8.2(next@15.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(typescript@5.9.3)
|
||||||
|
|
||||||
packages/next-utils:
|
packages/next-utils:
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -261,8 +261,8 @@ importers:
|
|||||||
specifier: 15.1.6
|
specifier: 15.1.6
|
||||||
version: 15.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
|
version: 15.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
|
||||||
next-intl:
|
next-intl:
|
||||||
specifier: ^3.0.0
|
specifier: ^4.8.2
|
||||||
version: 3.26.5(next@15.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)
|
version: 4.8.2(next@15.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(typescript@5.9.3)
|
||||||
zod:
|
zod:
|
||||||
specifier: ^3.0.0
|
specifier: ^3.0.0
|
||||||
version: 3.25.76
|
version: 3.25.76
|
||||||
@@ -764,36 +764,21 @@ packages:
|
|||||||
'@noble/hashes':
|
'@noble/hashes':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@formatjs/ecma402-abstract@2.3.6':
|
|
||||||
resolution: {integrity: sha512-HJnTFeRM2kVFVr5gr5kH1XP6K0JcJtE7Lzvtr3FS/so5f1kpsqqqxy5JF+FRaO6H2qmcMfAUIox7AJteieRtVw==}
|
|
||||||
|
|
||||||
'@formatjs/ecma402-abstract@3.1.1':
|
'@formatjs/ecma402-abstract@3.1.1':
|
||||||
resolution: {integrity: sha512-jhZbTwda+2tcNrs4kKvxrPLPjx8QsBCLCUgrrJ/S+G9YrGHWLhAyFMMBHJBnBoOwuLHd7L14FgYudviKaxkO2Q==}
|
resolution: {integrity: sha512-jhZbTwda+2tcNrs4kKvxrPLPjx8QsBCLCUgrrJ/S+G9YrGHWLhAyFMMBHJBnBoOwuLHd7L14FgYudviKaxkO2Q==}
|
||||||
|
|
||||||
'@formatjs/fast-memoize@2.2.7':
|
|
||||||
resolution: {integrity: sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ==}
|
|
||||||
|
|
||||||
'@formatjs/fast-memoize@3.1.0':
|
'@formatjs/fast-memoize@3.1.0':
|
||||||
resolution: {integrity: sha512-b5mvSWCI+XVKiz5WhnBCY3RJ4ZwfjAidU0yVlKa3d3MSgKmH1hC3tBGEAtYyN5mqL7N0G5x0BOUYyO8CEupWgg==}
|
resolution: {integrity: sha512-b5mvSWCI+XVKiz5WhnBCY3RJ4ZwfjAidU0yVlKa3d3MSgKmH1hC3tBGEAtYyN5mqL7N0G5x0BOUYyO8CEupWgg==}
|
||||||
|
|
||||||
'@formatjs/icu-messageformat-parser@2.11.4':
|
|
||||||
resolution: {integrity: sha512-7kR78cRrPNB4fjGFZg3Rmj5aah8rQj9KPzuLsmcSn4ipLXQvC04keycTI1F7kJYDwIXtT2+7IDEto842CfZBtw==}
|
|
||||||
|
|
||||||
'@formatjs/icu-messageformat-parser@3.5.1':
|
'@formatjs/icu-messageformat-parser@3.5.1':
|
||||||
resolution: {integrity: sha512-sSDmSvmmoVQ92XqWb499KrIhv/vLisJU8ITFrx7T7NZHUmMY7EL9xgRowAosaljhqnj/5iufG24QrdzB6X3ItA==}
|
resolution: {integrity: sha512-sSDmSvmmoVQ92XqWb499KrIhv/vLisJU8ITFrx7T7NZHUmMY7EL9xgRowAosaljhqnj/5iufG24QrdzB6X3ItA==}
|
||||||
|
|
||||||
'@formatjs/icu-skeleton-parser@1.8.16':
|
|
||||||
resolution: {integrity: sha512-H13E9Xl+PxBd8D5/6TVUluSpxGNvFSlN/b3coUp0e0JpuWXXnQDiavIpY3NnvSp4xhEMoXyyBvVfdFX8jglOHQ==}
|
|
||||||
|
|
||||||
'@formatjs/icu-skeleton-parser@2.1.1':
|
'@formatjs/icu-skeleton-parser@2.1.1':
|
||||||
resolution: {integrity: sha512-PSFABlcNefjI6yyk8f7nyX1DC7NHmq6WaCHZLySEXBrXuLOB2f935YsnzuPjlz+ibhb9yWTdPeVX1OVcj24w2Q==}
|
resolution: {integrity: sha512-PSFABlcNefjI6yyk8f7nyX1DC7NHmq6WaCHZLySEXBrXuLOB2f935YsnzuPjlz+ibhb9yWTdPeVX1OVcj24w2Q==}
|
||||||
|
|
||||||
'@formatjs/intl-localematcher@0.5.10':
|
'@formatjs/intl-localematcher@0.5.10':
|
||||||
resolution: {integrity: sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q==}
|
resolution: {integrity: sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q==}
|
||||||
|
|
||||||
'@formatjs/intl-localematcher@0.6.2':
|
|
||||||
resolution: {integrity: sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA==}
|
|
||||||
|
|
||||||
'@formatjs/intl-localematcher@0.8.1':
|
'@formatjs/intl-localematcher@0.8.1':
|
||||||
resolution: {integrity: sha512-xwEuwQFdtSq1UKtQnyTZWC+eHdv7Uygoa+H2k/9uzBVQjDyp9r20LNDNKedWXll7FssT3GRHvqsdJGYSUWqYFA==}
|
resolution: {integrity: sha512-xwEuwQFdtSq1UKtQnyTZWC+eHdv7Uygoa+H2k/9uzBVQjDyp9r20LNDNKedWXll7FssT3GRHvqsdJGYSUWqYFA==}
|
||||||
|
|
||||||
@@ -3060,9 +3045,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
|
resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
intl-messageformat@10.7.18:
|
|
||||||
resolution: {integrity: sha512-m3Ofv/X/tV8Y3tHXLohcuVuhWKo7BBq62cqY15etqmLxg2DZ34AGGgQDeR+SCta2+zICb1NX83af0GJmbQ1++g==}
|
|
||||||
|
|
||||||
intl-messageformat@11.1.2:
|
intl-messageformat@11.1.2:
|
||||||
resolution: {integrity: sha512-ucSrQmZGAxfiBHfBRXW/k7UC8MaGFlEj4Ry1tKiDcmgwQm1y3EDl40u+4VNHYomxJQMJi9NEI3riDRlth96jKg==}
|
resolution: {integrity: sha512-ucSrQmZGAxfiBHfBRXW/k7UC8MaGFlEj4Ry1tKiDcmgwQm1y3EDl40u+4VNHYomxJQMJi9NEI3riDRlth96jKg==}
|
||||||
|
|
||||||
@@ -3497,12 +3479,6 @@ packages:
|
|||||||
next-intl-swc-plugin-extractor@4.8.2:
|
next-intl-swc-plugin-extractor@4.8.2:
|
||||||
resolution: {integrity: sha512-sHDs36L1VZmFHj3tPHsD+KZJtnsRudHlNvT0ieIe3iFVn5OpGLTxW3d/Zc/2LXSj5GpGuR6wQeikbhFjU9tMQQ==}
|
resolution: {integrity: sha512-sHDs36L1VZmFHj3tPHsD+KZJtnsRudHlNvT0ieIe3iFVn5OpGLTxW3d/Zc/2LXSj5GpGuR6wQeikbhFjU9tMQQ==}
|
||||||
|
|
||||||
next-intl@3.26.5:
|
|
||||||
resolution: {integrity: sha512-EQlCIfY0jOhRldiFxwSXG+ImwkQtDEfQeSOEQp6ieAGSLWGlgjdb/Ck/O7wMfC430ZHGeUKVKax8KGusTPKCgg==}
|
|
||||||
peerDependencies:
|
|
||||||
next: ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0
|
|
||||||
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0
|
|
||||||
|
|
||||||
next-intl@4.8.2:
|
next-intl@4.8.2:
|
||||||
resolution: {integrity: sha512-GuuwyvyEI49/oehQbBXEoY8KSIYCzmfMLhmIwhMXTb+yeBmly1PnJcpgph3KczQ+HTJMXwXCmkizgtT8jBMf3A==}
|
resolution: {integrity: sha512-GuuwyvyEI49/oehQbBXEoY8KSIYCzmfMLhmIwhMXTb+yeBmly1PnJcpgph3KczQ+HTJMXwXCmkizgtT8jBMf3A==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -4377,11 +4353,6 @@ packages:
|
|||||||
uri-js@4.4.1:
|
uri-js@4.4.1:
|
||||||
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
|
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
|
||||||
|
|
||||||
use-intl@3.26.5:
|
|
||||||
resolution: {integrity: sha512-OdsJnC/znPvHCHLQH/duvQNXnP1w0hPfS+tkSi3mAbfjYBGh4JnyfdwkQBfIVf7t8gs9eSX/CntxUMvtKdG2MQ==}
|
|
||||||
peerDependencies:
|
|
||||||
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0
|
|
||||||
|
|
||||||
use-intl@4.8.2:
|
use-intl@4.8.2:
|
||||||
resolution: {integrity: sha512-3VNXZgDnPFqhIYosQ9W1Hc6K5q+ZelMfawNbexdwL/dY7BTHbceLUBX5Eeex9lgogxTp0pf1SjHuhYNAjr9H3g==}
|
resolution: {integrity: sha512-3VNXZgDnPFqhIYosQ9W1Hc6K5q+ZelMfawNbexdwL/dY7BTHbceLUBX5Eeex9lgogxTp0pf1SjHuhYNAjr9H3g==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -5168,13 +5139,6 @@ snapshots:
|
|||||||
|
|
||||||
'@exodus/bytes@1.10.0': {}
|
'@exodus/bytes@1.10.0': {}
|
||||||
|
|
||||||
'@formatjs/ecma402-abstract@2.3.6':
|
|
||||||
dependencies:
|
|
||||||
'@formatjs/fast-memoize': 2.2.7
|
|
||||||
'@formatjs/intl-localematcher': 0.6.2
|
|
||||||
decimal.js: 10.6.0
|
|
||||||
tslib: 2.8.1
|
|
||||||
|
|
||||||
'@formatjs/ecma402-abstract@3.1.1':
|
'@formatjs/ecma402-abstract@3.1.1':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@formatjs/fast-memoize': 3.1.0
|
'@formatjs/fast-memoize': 3.1.0
|
||||||
@@ -5182,31 +5146,16 @@ snapshots:
|
|||||||
decimal.js: 10.6.0
|
decimal.js: 10.6.0
|
||||||
tslib: 2.8.1
|
tslib: 2.8.1
|
||||||
|
|
||||||
'@formatjs/fast-memoize@2.2.7':
|
|
||||||
dependencies:
|
|
||||||
tslib: 2.8.1
|
|
||||||
|
|
||||||
'@formatjs/fast-memoize@3.1.0':
|
'@formatjs/fast-memoize@3.1.0':
|
||||||
dependencies:
|
dependencies:
|
||||||
tslib: 2.8.1
|
tslib: 2.8.1
|
||||||
|
|
||||||
'@formatjs/icu-messageformat-parser@2.11.4':
|
|
||||||
dependencies:
|
|
||||||
'@formatjs/ecma402-abstract': 2.3.6
|
|
||||||
'@formatjs/icu-skeleton-parser': 1.8.16
|
|
||||||
tslib: 2.8.1
|
|
||||||
|
|
||||||
'@formatjs/icu-messageformat-parser@3.5.1':
|
'@formatjs/icu-messageformat-parser@3.5.1':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@formatjs/ecma402-abstract': 3.1.1
|
'@formatjs/ecma402-abstract': 3.1.1
|
||||||
'@formatjs/icu-skeleton-parser': 2.1.1
|
'@formatjs/icu-skeleton-parser': 2.1.1
|
||||||
tslib: 2.8.1
|
tslib: 2.8.1
|
||||||
|
|
||||||
'@formatjs/icu-skeleton-parser@1.8.16':
|
|
||||||
dependencies:
|
|
||||||
'@formatjs/ecma402-abstract': 2.3.6
|
|
||||||
tslib: 2.8.1
|
|
||||||
|
|
||||||
'@formatjs/icu-skeleton-parser@2.1.1':
|
'@formatjs/icu-skeleton-parser@2.1.1':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@formatjs/ecma402-abstract': 3.1.1
|
'@formatjs/ecma402-abstract': 3.1.1
|
||||||
@@ -5216,10 +5165,6 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
tslib: 2.8.1
|
tslib: 2.8.1
|
||||||
|
|
||||||
'@formatjs/intl-localematcher@0.6.2':
|
|
||||||
dependencies:
|
|
||||||
tslib: 2.8.1
|
|
||||||
|
|
||||||
'@formatjs/intl-localematcher@0.8.1':
|
'@formatjs/intl-localematcher@0.8.1':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@formatjs/fast-memoize': 3.1.0
|
'@formatjs/fast-memoize': 3.1.0
|
||||||
@@ -7723,13 +7668,6 @@ snapshots:
|
|||||||
hasown: 2.0.2
|
hasown: 2.0.2
|
||||||
side-channel: 1.1.0
|
side-channel: 1.1.0
|
||||||
|
|
||||||
intl-messageformat@10.7.18:
|
|
||||||
dependencies:
|
|
||||||
'@formatjs/ecma402-abstract': 2.3.6
|
|
||||||
'@formatjs/fast-memoize': 2.2.7
|
|
||||||
'@formatjs/icu-messageformat-parser': 2.11.4
|
|
||||||
tslib: 2.8.1
|
|
||||||
|
|
||||||
intl-messageformat@11.1.2:
|
intl-messageformat@11.1.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@formatjs/ecma402-abstract': 3.1.1
|
'@formatjs/ecma402-abstract': 3.1.1
|
||||||
@@ -8151,14 +8089,6 @@ snapshots:
|
|||||||
|
|
||||||
next-intl-swc-plugin-extractor@4.8.2: {}
|
next-intl-swc-plugin-extractor@4.8.2: {}
|
||||||
|
|
||||||
next-intl@3.26.5(next@15.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4):
|
|
||||||
dependencies:
|
|
||||||
'@formatjs/intl-localematcher': 0.5.10
|
|
||||||
negotiator: 1.0.0
|
|
||||||
next: 15.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
|
|
||||||
react: 19.2.4
|
|
||||||
use-intl: 3.26.5(react@19.2.4)
|
|
||||||
|
|
||||||
next-intl@4.8.2(next@15.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(typescript@5.9.3):
|
next-intl@4.8.2(next@15.1.6(@babel/core@7.28.6)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(typescript@5.9.3):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@formatjs/intl-localematcher': 0.5.10
|
'@formatjs/intl-localematcher': 0.5.10
|
||||||
@@ -9163,12 +9093,6 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
punycode: 2.3.1
|
punycode: 2.3.1
|
||||||
|
|
||||||
use-intl@3.26.5(react@19.2.4):
|
|
||||||
dependencies:
|
|
||||||
'@formatjs/fast-memoize': 2.2.7
|
|
||||||
intl-messageformat: 10.7.18
|
|
||||||
react: 19.2.4
|
|
||||||
|
|
||||||
use-intl@4.8.2(react@19.2.4):
|
use-intl@4.8.2(react@19.2.4):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@formatjs/fast-memoize': 3.1.0
|
'@formatjs/fast-memoize': 3.1.0
|
||||||
|
|||||||
Reference in New Issue
Block a user