diff --git a/.claude/commands/release.md b/.claude/commands/release.md index 5857fe996ee..84d0dd4ecfc 100644 --- a/.claude/commands/release.md +++ b/.claude/commands/release.md @@ -1,18 +1,21 @@ - Kill any `turbo` processes that might be running with SIGKILL - Run `npm login` (I will manually do 2FA in the browser) -- Use `op item get "Npmjs" --fields password --reveal` to get the password for NPM. -- Use `op item get "Npmjs" --otp` to get a one-time password for 2FA. -- Run `npm token create --name="PublishRemotionXXXXXX" --packages "remotion" --packages "create-video" --packages-and-scopes-permission read-write --bypass-2fa --scopes "@remotion" --otp=`. Replace XXXXXX with a random string so we have a unique name. Use `op item get "Npmjs" --otp` to get the OTP and pass it via `--otp=`. It will ask for a password, pipe in the password using `<<<`. The NPM token will be printed. +- Use `op item get "Npmjs" --fields password --reveal --account remotiondev.1password.com` to get the password for NPM. +- Use `op item get "Npmjs" --otp --account remotiondev.1password.com` to get a one-time password for 2FA. +- Run `npm token create --name="PublishRemotionXXXXXX" --packages "remotion" --packages "create-video" --packages-and-scopes-permission read-write --bypass-2fa --scopes "@remotion" --otp=`. Replace XXXXXX with a random string so we have a unique name. Use `op item get "Npmjs" --otp --account remotiondev.1password.com` to get the OTP and pass it via `--otp=`. It will ask for a password, pipe in the password using `echo "$PASSWORD" |`. - Run `bun i` - Run `bun run build` -- Check `https://www.npmjs.com/package/remotion` to get the current version number +- Run `npm view remotion version` to get the current version number - Run `bun set-version.ts `, where is the current version plus 1 - Run `NPM_CONFIG_TOKEN= bun run release` where is the NPM token we just created - Generate a changelog in markdown and save it to `/tmp/release-.md`: - Run `git log v..v --oneline` to get all commits - Extract PR numbers from merge commits - For each PR, run `gh pr view --json title,author,number,url --jq '"* \(.title) by @\(.author.login) in \(.url)"'` - - Categorize PRs into sections: "What's Changed" (features, fixes, improvements), "Internal" (dependency upgrades, tooling, infra), "Docs" (documentation changes), "Templates" (template changes) - - Check for new contributors by comparing authors against known contributors + - Categorize PRs into sections: "What's Changed", "Templates", "Docs", "Internal" + - In "What's Changed", sort items so that entries for the same package are adjacent (no subheadings, just sorted order). Changes to the `remotion` core package should appear first + - Strip redundant prefixes from PR titles (e.g. remove "Docs:" from items in the Docs section) + - "Templates" is a separate section for any template-\* changes + - Check for genuinely new contributors by running `gh api repos/remotion-dev/remotion/contributors --paginate --jq '.[].login'` and comparing against PR authors. Only add a "New Contributors" section for authors not in that list - Add `**Full Changelog**: https://github.com/remotion-dev/remotion/compare/v...v` at the bottom - Use the same format as previous GitHub releases (check with `gh release view v`) diff --git a/bun.lock b/bun.lock index cf2a716f64e..4f3e227714e 100644 --- a/bun.lock +++ b/bun.lock @@ -6,7 +6,7 @@ "name": "remotion-monorepo", "dependencies": { "p-limit": "7.2.0", - "turbo": "2.8.6", + "turbo": "2.8.10", "typescript": "5.9.3", }, "devDependencies": { @@ -21,7 +21,7 @@ }, "packages/animated-emoji": { "name": "@remotion/animated-emoji", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "remotion": "workspace:*", }, @@ -33,7 +33,7 @@ }, "packages/animation-utils": { "name": "@remotion/animation-utils", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "remotion": "workspace:*", }, @@ -49,7 +49,7 @@ }, "packages/astro-example": { "name": "@remotion/astro-example", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "@astrojs/react": "4.0.0", "@remotion/gif": "workspace:*", @@ -68,7 +68,7 @@ }, "packages/babel-loader": { "name": "@remotion/babel-loader", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "@babel/core": "7.23.2", "@babel/plugin-proposal-class-properties": "7.14.5", @@ -92,7 +92,7 @@ }, "packages/bundler": { "name": "@remotion/bundler", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "@remotion/media-parser": "workspace:*", "@remotion/studio": "workspace:*", @@ -119,7 +119,7 @@ }, "packages/captions": { "name": "@remotion/captions", - "version": "4.0.424", + "version": "4.0.425", "devDependencies": { "@remotion/eslint-config-internal": "workspace:*", "@typescript/native-preview": "catalog:", @@ -128,7 +128,7 @@ }, "packages/cli": { "name": "@remotion/cli", - "version": "4.0.424", + "version": "4.0.425", "bin": { "remotion": "remotion-cli.js", "remotionb": "remotionb-cli.js", @@ -170,7 +170,7 @@ }, "packages/cloudrun": { "name": "@remotion/cloudrun", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "@google-cloud/artifact-registry": "3.5.1", "@google-cloud/functions-framework": "3.4.6", @@ -196,39 +196,39 @@ }, "packages/compositor": { "name": "@remotion/compositor", - "version": "4.0.424", + "version": "4.0.425", }, "packages/compositor-darwin-arm64": { "name": "@remotion/compositor-darwin-arm64", - "version": "4.0.424", + "version": "4.0.425", }, "packages/compositor-darwin-x64": { "name": "@remotion/compositor-darwin-x64", - "version": "4.0.424", + "version": "4.0.425", }, "packages/compositor-linux-arm64-gnu": { "name": "@remotion/compositor-linux-arm64-gnu", - "version": "4.0.424", + "version": "4.0.425", }, "packages/compositor-linux-arm64-musl": { "name": "@remotion/compositor-linux-arm64-musl", - "version": "4.0.424", + "version": "4.0.425", }, "packages/compositor-linux-x64-gnu": { "name": "@remotion/compositor-linux-x64-gnu", - "version": "4.0.424", + "version": "4.0.425", }, "packages/compositor-linux-x64-musl": { "name": "@remotion/compositor-linux-x64-musl", - "version": "4.0.424", + "version": "4.0.425", }, "packages/compositor-win32-x64-msvc": { "name": "@remotion/compositor-win32-x64-msvc", - "version": "4.0.424", + "version": "4.0.425", }, "packages/convert": { "name": "@remotion/convert", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "@mediabunny/mp3-encoder": "catalog:", "@mediafox/core": "^1.0.4", @@ -284,7 +284,7 @@ }, "packages/core": { "name": "remotion", - "version": "4.0.424", + "version": "4.0.425", "devDependencies": { "@happy-dom/global-registrator": "14.5.1", "@remotion/eslint-config-internal": "workspace:*", @@ -306,7 +306,7 @@ }, "packages/create-video": { "name": "create-video", - "version": "4.0.424", + "version": "4.0.425", "bin": { "create-video": "bin.js", }, @@ -329,7 +329,7 @@ }, "packages/design": { "name": "@remotion/design", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "@radix-ui/react-select": "2.1.1", "@radix-ui/react-tabs": "^1.1.0", @@ -358,11 +358,11 @@ }, "packages/discord-poster": { "name": "@remotion/discord-poster", - "version": "4.0.424", + "version": "4.0.425", }, "packages/docs": { "name": "docs", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "@algora/sdk": "^0.1.2", "@aws-sdk/s3-request-presigner": "catalog:", @@ -424,6 +424,7 @@ "@remotion/webcodecs": "workspace:*", "@remotion/whisper-web": "workspace:*", "@remotion/zod-types": "workspace:*", + "@remotion/zod-types-v3": "workspace:*", "@rive-app/canvas-advanced": "2.31.5", "@shikijs/twoslash": "3.22.0", "@shopify/react-native-skia": "2.0.0", @@ -475,7 +476,7 @@ }, "packages/docusaurus-plugin": { "name": "@remotion/docusaurus-plugin", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "@docusaurus/types": "3.6.0", "@shikijs/twoslash": "3.22.0", @@ -494,7 +495,7 @@ }, "packages/enable-scss": { "name": "@remotion/enable-scss", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "css-loader": "5.2.7", "sass-loader": "14.2.1", @@ -512,7 +513,7 @@ }, "packages/eslint-config": { "name": "@remotion/eslint-config", - "version": "4.0.424", + "version": "4.0.425", "devDependencies": { "@remotion/eslint-config-internal": "workspace:*", "@remotion/eslint-plugin": "workspace:*", @@ -529,7 +530,7 @@ }, "packages/eslint-config-flat": { "name": "@remotion/eslint-config-flat", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "typescript-eslint": "8.21.0", }, @@ -548,7 +549,7 @@ }, "packages/eslint-config-internal": { "name": "@remotion/eslint-config-internal", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "@eslint/compat": "1.2.2", "@eslint/eslintrc": "3.1.0", @@ -567,7 +568,7 @@ }, "packages/eslint-plugin": { "name": "@remotion/eslint-plugin", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "@typescript-eslint/utils": "5.19.0", }, @@ -582,7 +583,7 @@ }, "packages/example": { "name": "@remotion/example", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "@mdx-js/loader": "^2.3.0", "@mdx-js/react": "^2.3.0", @@ -627,6 +628,7 @@ "@remotion/webcodecs": "workspace:*", "@remotion/whisper-web": "workspace:*", "@remotion/zod-types": "workspace:*", + "@remotion/zod-types-v3": "workspace:*", "@shopify/react-native-skia": "2.0.0", "@types/express": "^4.17.11", "@types/hls.js": "^0.13.3", @@ -666,7 +668,7 @@ }, "packages/example-videos": { "name": "@remotion/example-videos", - "version": "4.0.424", + "version": "4.0.425", "devDependencies": { "@remotion/eslint-config-internal": "workspace:*", "@typescript/native-preview": "catalog:", @@ -676,7 +678,7 @@ }, "packages/example-without-zod": { "name": "@remotion/example-without-zod", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "@remotion/cli": "workspace:*", "react": "catalog:", @@ -686,7 +688,7 @@ }, "packages/fonts": { "name": "@remotion/fonts", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "remotion": "workspace:*", }, @@ -698,7 +700,7 @@ }, "packages/gif": { "name": "@remotion/gif", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "remotion": "workspace:*", }, @@ -718,7 +720,7 @@ }, "packages/google-fonts": { "name": "@remotion/google-fonts", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "remotion": "workspace:*", }, @@ -732,7 +734,7 @@ }, "packages/install-whisper-cpp": { "name": "@remotion/install-whisper-cpp", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "@remotion/captions": "workspace:*", }, @@ -744,7 +746,7 @@ }, "packages/it-tests": { "name": "@remotion/it-tests", - "version": "4.0.424", + "version": "4.0.425", "devDependencies": { "@remotion/bundler": "workspace:*", "@remotion/captions": "workspace:*", @@ -786,7 +788,7 @@ }, "packages/lambda": { "name": "@remotion/lambda", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "@aws-sdk/client-cloudwatch-logs": "catalog:", "@aws-sdk/client-iam": "catalog:", @@ -829,7 +831,7 @@ }, "packages/lambda-client": { "name": "@remotion/lambda-client", - "version": "4.0.424", + "version": "4.0.425", "devDependencies": { "@aws-sdk/client-cloudwatch-logs": "catalog:", "@aws-sdk/client-iam": "catalog:", @@ -853,25 +855,25 @@ }, "packages/lambda-go": { "name": "@remotion/lambda-go", - "version": "4.0.424", + "version": "4.0.425", "devDependencies": { "remotion": "workspace:*", }, }, "packages/lambda-go-example": { "name": "@remotion/lambda-go-example", - "version": "4.0.424", + "version": "4.0.425", }, "packages/lambda-php": { "name": "@remotion/lambda-php", - "version": "4.0.424", + "version": "4.0.425", "devDependencies": { "remotion": "workspace:*", }, }, "packages/lambda-python": { "name": "@remotion/lambda-python", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "dotenv": "17.3.1", }, @@ -881,14 +883,14 @@ }, "packages/lambda-ruby": { "name": "@remotion/lambda-ruby", - "version": "4.0.424", + "version": "4.0.425", "devDependencies": { "remotion": "workspace:*", }, }, "packages/layout-utils": { "name": "@remotion/layout-utils", - "version": "4.0.424", + "version": "4.0.425", "devDependencies": { "@remotion/eslint-config-internal": "workspace:*", "@typescript/native-preview": "catalog:", @@ -897,7 +899,7 @@ }, "packages/licensing": { "name": "@remotion/licensing", - "version": "4.0.424", + "version": "4.0.425", "devDependencies": { "@remotion/eslint-config-internal": "workspace:*", "@typescript/native-preview": "catalog:", @@ -908,7 +910,7 @@ }, "packages/light-leaks": { "name": "@remotion/light-leaks", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "remotion": "workspace:*", }, @@ -926,7 +928,7 @@ }, "packages/lottie": { "name": "@remotion/lottie", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "remotion": "workspace:*", }, @@ -946,7 +948,7 @@ }, "packages/mcp": { "name": "@remotion/mcp", - "version": "4.0.424", + "version": "4.0.425", "bin": { "remotion-mcp": "./dist/esm/index.mjs", }, @@ -963,7 +965,7 @@ }, "packages/media": { "name": "@remotion/media", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "@mediabunny/ac3": "catalog:", "mediabunny": "catalog:", @@ -986,7 +988,7 @@ }, "packages/media-parser": { "name": "@remotion/media-parser", - "version": "4.0.424", + "version": "4.0.425", "devDependencies": { "@remotion/eslint-config-internal": "workspace:*", "@remotion/example-videos": "workspace:*", @@ -999,7 +1001,7 @@ }, "packages/media-utils": { "name": "@remotion/media-utils", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "@remotion/media-parser": "workspace:*", "@remotion/webcodecs": "workspace:*", @@ -1018,7 +1020,7 @@ }, "packages/motion-blur": { "name": "@remotion/motion-blur", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "remotion": "workspace:*", }, @@ -1037,7 +1039,7 @@ }, "packages/noise": { "name": "@remotion/noise", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "remotion": "workspace:*", "simplex-noise": "4.0.1", @@ -1050,7 +1052,7 @@ }, "packages/openai-whisper": { "name": "@remotion/openai-whisper", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "@remotion/captions": "workspace:*", }, @@ -1063,7 +1065,7 @@ }, "packages/paths": { "name": "@remotion/paths", - "version": "4.0.424", + "version": "4.0.425", "devDependencies": { "@remotion/eslint-config-internal": "workspace:*", "@typescript/native-preview": "catalog:", @@ -1072,7 +1074,7 @@ }, "packages/player": { "name": "@remotion/player", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "remotion": "workspace:*", }, @@ -1095,7 +1097,7 @@ }, "packages/player-example": { "name": "@remotion/player-example", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "@remotion/bundler": "workspace:*", "@remotion/eslint-config-flat": "workspace:*", @@ -1116,7 +1118,7 @@ }, "packages/preload": { "name": "@remotion/preload", - "version": "4.0.424", + "version": "4.0.425", "devDependencies": { "@remotion/eslint-config-internal": "workspace:*", "@typescript/native-preview": "catalog:", @@ -1125,7 +1127,7 @@ }, "packages/promo-pages": { "name": "@remotion/promo-pages", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "@mux/upchunk": "^3.5.0", "@remotion/animated-emoji": "workspace:*", @@ -1164,9 +1166,12 @@ }, "packages/react18-tests": { "name": "@remotion/react18-tests", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { + "@remotion/zod-types": "workspace:*", + "@remotion/zod-types-v3": "workspace:*", "remotion": "workspace:*", + "zod": "3.22.3", }, "devDependencies": { "@remotion/eslint-config-internal": "workspace:*", @@ -1191,7 +1196,7 @@ }, "packages/renderer": { "name": "@remotion/renderer", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "@remotion/licensing": "workspace:*", "@remotion/streaming": "workspace:*", @@ -1230,7 +1235,7 @@ }, "packages/rive": { "name": "@remotion/rive", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "@rive-app/canvas-advanced": "2.31.5", "remotion": "workspace:*", @@ -1249,7 +1254,7 @@ }, "packages/rounded-text-box": { "name": "@remotion/rounded-text-box", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "@remotion/layout-utils": "workspace:*", "@remotion/paths": "workspace:*", @@ -1262,7 +1267,7 @@ }, "packages/serverless": { "name": "@remotion/serverless", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "@remotion/bundler": "workspace:*", "@remotion/licensing": "workspace:*", @@ -1277,7 +1282,7 @@ }, "packages/serverless-client": { "name": "@remotion/serverless-client", - "version": "4.0.424", + "version": "4.0.425", "devDependencies": { "@remotion/eslint-config-internal": "workspace:*", "@remotion/renderer": "workspace:*", @@ -1289,7 +1294,7 @@ }, "packages/shapes": { "name": "@remotion/shapes", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "@remotion/paths": "workspace:*", }, @@ -1309,7 +1314,7 @@ }, "packages/skia": { "name": "@remotion/skia", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "remotion": "workspace:*", }, @@ -1333,7 +1338,7 @@ }, "packages/skills": { "name": "@remotion/skills", - "version": "4.0.424", + "version": "4.0.425", "devDependencies": { "@remotion/bundler": "workspace:*", "@remotion/cli": "workspace:*", @@ -1351,7 +1356,7 @@ }, "packages/streaming": { "name": "@remotion/streaming", - "version": "4.0.424", + "version": "4.0.425", "devDependencies": { "@remotion/eslint-config-internal": "workspace:*", "@typescript/native-preview": "catalog:", @@ -1360,7 +1365,7 @@ }, "packages/studio": { "name": "@remotion/studio", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "@remotion/media-utils": "workspace:*", "@remotion/player": "workspace:*", @@ -1391,7 +1396,7 @@ }, "packages/studio-server": { "name": "@remotion/studio-server", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "@babel/parser": "7.24.1", "@remotion/bundler": "workspace:*", @@ -1417,7 +1422,7 @@ }, "packages/studio-shared": { "name": "@remotion/studio-shared", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "remotion": "workspace:*", }, @@ -1430,7 +1435,7 @@ }, "packages/svg-3d-engine": { "name": "@remotion/svg-3d-engine", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "@remotion/paths": "workspace:*", }, @@ -1442,7 +1447,7 @@ }, "packages/tailwind": { "name": "@remotion/tailwind", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "autoprefixer": "10.4.20", "css-loader": "5.2.7", @@ -1465,7 +1470,7 @@ }, "packages/tailwind-v4": { "name": "@remotion/tailwind-v4", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "@tailwindcss/postcss": "4.1.1", "css-loader": "5.2.7", @@ -1501,7 +1506,7 @@ "react": "19.2.3", "react-dom": "19.2.3", "remotion": "workspace:*", - "zod": "3.22.3", + "zod": "4.3.6", }, "devDependencies": { "@remotion/eslint-config-flat": "workspace:*", @@ -1546,7 +1551,7 @@ "react-dom": "19.2.3", "remotion": "workspace:*", "twoslash-cdn": "0.3.1", - "zod": "3.22.3", + "zod": "4.3.6", }, "devDependencies": { "@remotion/eslint-config-flat": "workspace:*", @@ -1566,7 +1571,7 @@ "react": "19.2.3", "react-dom": "19.2.3", "remotion": "workspace:*", - "zod": "3.22.3", + "zod": "4.3.6", }, "devDependencies": { "@remotion/eslint-config-flat": "workspace:*", @@ -1585,7 +1590,7 @@ "react": "19.2.3", "react-dom": "19.2.3", "remotion": "workspace:*", - "zod": "3.22.3", + "zod": "4.3.6", }, "devDependencies": { "@remotion/eslint-config-flat": "workspace:*", @@ -1606,7 +1611,7 @@ "react": "19.2.3", "react-dom": "19.2.3", "remotion": "workspace:*", - "zod": "3.22.3", + "zod": "4.3.6", }, "devDependencies": { "@remotion/eslint-config-flat": "workspace:*", @@ -1632,7 +1637,7 @@ "react": "19.2.3", "react-dom": "19.2.3", "remotion": "workspace:*", - "zod": "3.22.3", + "zod": "4.3.6", }, "devDependencies": { "@eslint/eslintrc": "3.1.0", @@ -1672,7 +1677,7 @@ "react-dom": "19.2.3", "remotion": "workspace:*", "tailwind-merge": "3.0.1", - "zod": "3.22.3", + "zod": "4.3.6", }, "devDependencies": { "@eslint/eslintrc": "3.1.0", @@ -1712,7 +1717,7 @@ "react": "19.2.3", "react-dom": "19.2.3", "remotion": "workspace:*", - "zod": "3.22.3", + "zod": "4.3.6", }, "devDependencies": { "@eslint/eslintrc": "3.1.0", @@ -1790,7 +1795,7 @@ "remotion": "workspace:*", "tailwind-merge": "3.4.0", "three": "0.178.0", - "zod": "4.1.13", + "zod": "4.3.6", }, "devDependencies": { "@eslint/eslintrc": "3.1.0", @@ -1832,7 +1837,7 @@ "react": "19.2.3", "react-dom": "19.2.3", "remotion": "workspace:*", - "zod": "3.22.3", + "zod": "4.3.6", }, "devDependencies": { "@elevenlabs/elevenlabs-js": "^2.20.0", @@ -1852,7 +1857,6 @@ "typescript": "5.9.3", "uuid": "^13.0.0", "yargs": "^18.0.0", - "zod-to-json-schema": "^3.24.6", }, }, "packages/template-react-router": { @@ -1879,7 +1883,7 @@ "tailwindcss": "4.0.0", "vite": "5.4.21", "vite-tsconfig-paths": "^4.2.1", - "zod": "3.22.3", + "zod": "4.3.6", }, "devDependencies": { "@react-router/dev": "7.12.0", @@ -1932,7 +1936,7 @@ "remotion": "workspace:*", "tailwind-merge": "1.14.0", "tailwindcss-animate": "1.0.7", - "zod": "3.22.3", + "zod": "4.3.6", }, "devDependencies": { "@remotion/eslint-config-flat": "workspace:*", @@ -1966,7 +1970,7 @@ "react": "19.2.3", "react-dom": "19.2.3", "remotion": "workspace:*", - "zod": "3.22.3", + "zod": "4.3.6", }, "devDependencies": { "@remotion/eslint-config-flat": "workspace:*", @@ -1991,7 +1995,7 @@ "react": "19.2.3", "react-dom": "19.2.3", "remotion": "workspace:*", - "zod": "3.22.3", + "zod": "4.3.6", }, "devDependencies": { "@remotion/eslint-config-flat": "workspace:*", @@ -2012,7 +2016,7 @@ "react": "19.2.3", "react-dom": "19.2.3", "remotion": "workspace:*", - "zod": "3.22.3", + "zod": "4.3.6", }, "devDependencies": { "@remotion/eslint-config-flat": "workspace:*", @@ -2043,7 +2047,7 @@ "react": "19.2.3", "react-dom": "19.2.3", "remotion": "workspace:*", - "zod": "3.22.3", + "zod": "4.3.6", }, "devDependencies": { "@remotion/eslint-config-flat": "workspace:*", @@ -2067,7 +2071,7 @@ "react-dom": "19.2.3", "remotion": "workspace:*", "three": "0.178.0", - "zod": "3.22.3", + "zod": "4.3.6", }, "devDependencies": { "@remotion/eslint-config-flat": "workspace:*", @@ -2091,7 +2095,7 @@ "react": "19.2.3", "react-dom": "19.2.3", "remotion": "workspace:*", - "zod": "3.22.3", + "zod": "4.3.6", }, "devDependencies": { "@remotion/captions": "workspace:*", @@ -2128,7 +2132,7 @@ "prettier": "3.8.1", "tsx": "4.19.3", "typescript": "5.9.3", - "zod": "3.22.3", + "zod": "4.3.6", }, }, "packages/template-tts-google": { @@ -2151,7 +2155,7 @@ "react": "19.2.3", "react-dom": "19.2.3", "remotion": "workspace:*", - "zod": "3.22.3", + "zod": "4.3.6", }, "devDependencies": { "@remotion/eslint-config-flat": "workspace:*", @@ -2184,7 +2188,7 @@ "react-dom": "19.2.3", "remotion": "workspace:*", "tailwind-merge": "3.0.1", - "zod": "3.22.3", + "zod": "4.3.6", }, "devDependencies": { "@eslint/eslintrc": "3.1.0", @@ -2213,7 +2217,7 @@ }, "packages/test-utils": { "name": "@remotion/test-utils", - "version": "4.0.424", + "version": "4.0.425", "devDependencies": { "@remotion/eslint-config-internal": "workspace:*", "@typescript/native-preview": "catalog:", @@ -2225,7 +2229,7 @@ }, "packages/three": { "name": "@remotion/three", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "remotion": "workspace:*", }, @@ -2252,7 +2256,7 @@ }, "packages/transitions": { "name": "@remotion/transitions", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "@remotion/paths": "workspace:*", "@remotion/shapes": "workspace:*", @@ -2276,7 +2280,7 @@ }, "packages/web-renderer": { "name": "@remotion/web-renderer", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "@remotion/licensing": "workspace:*", "mediabunny": "catalog:", @@ -2308,7 +2312,7 @@ }, "packages/webcodecs": { "name": "@remotion/webcodecs", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "@remotion/media-parser": "workspace:*", }, @@ -2325,7 +2329,7 @@ }, "packages/whisper-web": { "name": "@remotion/whisper-web", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "@remotion/captions": "workspace:*", }, @@ -2337,7 +2341,7 @@ }, "packages/zod-types": { "name": "@remotion/zod-types", - "version": "4.0.424", + "version": "4.0.425", "dependencies": { "remotion": "workspace:*", }, @@ -2351,6 +2355,23 @@ "zod": "catalog:", }, }, + "packages/zod-types-v3": { + "name": "@remotion/zod-types-v3", + "version": "4.0.425", + "dependencies": { + "@remotion/zod-types": "workspace:*", + "remotion": "workspace:*", + }, + "devDependencies": { + "@remotion/eslint-config-internal": "workspace:*", + "@typescript/native-preview": "catalog:", + "eslint": "catalog:", + "zod": "3.22.3", + }, + "peerDependencies": { + "zod": ">=3.0.0 <4.0.0", + }, + }, }, "overrides": { "@rspack/core": "1.7.6", @@ -2391,7 +2412,7 @@ "sharp": "0.34.5", "three": "0.178.0", "vitest": "4.0.9", - "zod": "3.22.3", + "zod": "4.3.6", }, "packages": { "@aashutoshrathi/word-wrap": ["@aashutoshrathi/word-wrap@1.2.6", "", {}, "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA=="], @@ -3754,6 +3775,8 @@ "@remotion/zod-types": ["@remotion/zod-types@workspace:packages/zod-types"], + "@remotion/zod-types-v3": ["@remotion/zod-types-v3@workspace:packages/zod-types-v3"], + "@rive-app/canvas-advanced": ["@rive-app/canvas-advanced@2.31.5", "", {}, "sha512-zwqLIc5wRF+zFKgDSTJn21+r4N4KWqAe6iVrjDGFzfxxeKDoESrwK7GQ9qVyS6UH2W4SsDRzO6q6jrlw33+yIg=="], "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.27", "", {}, "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA=="], @@ -7490,21 +7513,21 @@ "tunnel-rat": ["tunnel-rat@0.1.2", "", { "dependencies": { "zustand": "4.5.5" } }, "sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ=="], - "turbo": ["turbo@2.8.6", "", { "optionalDependencies": { "turbo-darwin-64": "2.8.6", "turbo-darwin-arm64": "2.8.6", "turbo-linux-64": "2.8.6", "turbo-linux-arm64": "2.8.6", "turbo-windows-64": "2.8.6", "turbo-windows-arm64": "2.8.6" }, "bin": { "turbo": "bin/turbo" } }, "sha512-QMj1SQwUYehc+xJ9SxXn56UO43hfKN64/NFetVW1BwzysRqn+q0FSgrmk+IbJ+djfd8j8zXGKGeqsnUcXwQSUQ=="], + "turbo": ["turbo@2.8.10", "", { "optionalDependencies": { "turbo-darwin-64": "2.8.10", "turbo-darwin-arm64": "2.8.10", "turbo-linux-64": "2.8.10", "turbo-linux-arm64": "2.8.10", "turbo-windows-64": "2.8.10", "turbo-windows-arm64": "2.8.10" }, "bin": { "turbo": "bin/turbo" } }, "sha512-OxbzDES66+x7nnKGg2MwBA1ypVsZoDTLHpeaP4giyiHSixbsiTaMyeJqbEyvBdp5Cm28fc+8GG6RdQtic0ijwQ=="], - "turbo-darwin-64": ["turbo-darwin-64@2.8.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-6QeZ/aLZizekiI6tKZN0IGP1a1WYZ9c/qDKPa0rSmj2X0O0Iw/ES4rKZV40S5n8SUJdiU01EFLygHJ2oWaYKXg=="], + "turbo-darwin-64": ["turbo-darwin-64@2.8.10", "", { "os": "darwin", "cpu": "x64" }, "sha512-A03fXh+B7S8mL3PbdhTd+0UsaGrhfyPkODvzBDpKRY7bbeac4MDFpJ7I+Slf2oSkCEeSvHKR7Z4U71uKRUfX7g=="], - "turbo-darwin-arm64": ["turbo-darwin-arm64@2.8.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RS4Z902vB93cQD3PJS/1IMmS0HefrB5ZXuw4ECOrxhOGz5jJVmYFJ6weDzedjoTDeYHHXGo1NoiCSHg69ngWKA=="], + "turbo-darwin-arm64": ["turbo-darwin-arm64@2.8.10", "", { "os": "darwin", "cpu": "arm64" }, "sha512-sidzowgWL3s5xCHLeqwC9M3s9M0i16W1nuQF3Mc7fPHpZ+YPohvcbVFBB2uoRRHYZg6yBnwD4gyUHKTeXfwtXA=="], - "turbo-linux-64": ["turbo-linux-64@2.8.6", "", { "os": "linux", "cpu": "x64" }, "sha512-hCWDnDepYbrSJdByuryKFoHAGFkvgBYXr6qdaGsYhX1Wgq8isqXCQBKOo99Y/9tXDwKGEeQ7xnkdFvSL7AQ4iQ=="], + "turbo-linux-64": ["turbo-linux-64@2.8.10", "", { "os": "linux", "cpu": "x64" }, "sha512-YK9vcpL3TVtqonB021XwgaQhY9hJJbKKUhLv16osxV0HkcQASQWUqR56yMge7puh6nxU67rQlTq1b7ksR1T3KA=="], - "turbo-linux-arm64": ["turbo-linux-arm64@2.8.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-oS15aCYEpynG/l69xs/ZnQ0dnz0pHhfHg70Zf5J+j5Cam0/RA0MpcryjneN/9G0PmP8a/6ZxnL5nZahX+wOBPA=="], + "turbo-linux-arm64": ["turbo-linux-arm64@2.8.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-3+j2tL0sG95iBJTm+6J8/45JsETQABPqtFyYjVjBbi6eVGdtNTiBmHNKrbvXRlQ3ZbUG75bKLaSSDHSEEN+btQ=="], "turbo-stream": ["turbo-stream@2.4.0", "", {}, "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g=="], - "turbo-windows-64": ["turbo-windows-64@2.8.6", "", { "os": "win32", "cpu": "x64" }, "sha512-eqBxqJD7H/uk9V0QO10VgwY9J2BUXejsGuzChln72Yl+o8GZwsvhOekndRxccR90J8ZO+LKO24+3VzHFh4Cu/g=="], + "turbo-windows-64": ["turbo-windows-64@2.8.10", "", { "os": "win32", "cpu": "x64" }, "sha512-hdeF5qmVY/NFgiucf8FW0CWJWtyT2QPm5mIsX0W1DXAVzqKVXGq+Zf+dg4EUngAFKjDzoBeN6ec2Fhajwfztkw=="], - "turbo-windows-arm64": ["turbo-windows-arm64@2.8.6", "", { "os": "win32", "cpu": "arm64" }, "sha512-I3VEQyxIlNZ6XTg4fLKAkuhcwzIs/GD7Vs1yhelH2aUTjf08wprjBWknDqP7mjAHMpsosRrq4DtfSZEQm83Hxg=="], + "turbo-windows-arm64": ["turbo-windows-arm64@2.8.10", "", { "os": "win32", "cpu": "arm64" }, "sha512-QGdr/Q8LWmj+ITMkSvfiz2glf0d7JG0oXVzGL3jxkGqiBI1zXFj20oqVY0qWi+112LO9SVrYdpHS0E/oGFrMbQ=="], "tw-animate-css": ["tw-animate-css@1.4.0", "", {}, "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ=="], @@ -7800,9 +7823,9 @@ "zip-stream": ["zip-stream@6.0.1", "", { "dependencies": { "archiver-utils": "5.0.2", "compress-commons": "6.0.2", "readable-stream": "4.7.0" } }, "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA=="], - "zod": ["zod@3.22.3", "", {}, "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug=="], + "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], - "zod-to-json-schema": ["zod-to-json-schema@3.25.1", "", { "peerDependencies": { "zod": "^3.25 || ^4" } }, "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA=="], + "zod-to-json-schema": ["zod-to-json-schema@3.24.6", "", { "peerDependencies": { "zod": "3.25.76" } }, "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg=="], "zod-to-ts": ["zod-to-ts@1.2.0", "", { "peerDependencies": { "typescript": "5.8.2", "zod": "3.25.76" } }, "sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA=="], @@ -7814,12 +7837,6 @@ "@ai-sdk/gateway/@vercel/oidc": ["@vercel/oidc@3.0.5", "", {}, "sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw=="], - "@ai-sdk/gateway/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - - "@ai-sdk/openai/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - - "@ai-sdk/provider-utils/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "@algolia/autocomplete-preset-algolia/@algolia/client-search": ["@algolia/client-search@5.24.0", "", { "dependencies": { "@algolia/client-common": "5.24.0", "@algolia/requester-browser-xhr": "5.24.0", "@algolia/requester-fetch": "5.24.0", "@algolia/requester-node-http": "5.24.0" } }, "sha512-k+nuciQuq7WERNNE+hsx3DX636zIy+9R4xdtvW3PANT2a2BDGOv3fv2mta8+QUMcVTVcGe/Mo3QCb4pc1HNoxA=="], "@algolia/autocomplete-preset-algolia/algoliasearch": ["algoliasearch@5.18.0", "", { "dependencies": { "@algolia/client-abtesting": "5.18.0", "@algolia/client-analytics": "5.18.0", "@algolia/client-common": "5.18.0", "@algolia/client-insights": "5.18.0", "@algolia/client-personalization": "5.18.0", "@algolia/client-query-suggestions": "5.18.0", "@algolia/client-search": "5.18.0", "@algolia/ingestion": "1.18.0", "@algolia/monitoring": "1.18.0", "@algolia/recommend": "5.18.0", "@algolia/requester-browser-xhr": "5.18.0", "@algolia/requester-fetch": "5.18.0", "@algolia/requester-node-http": "5.18.0" } }, "sha512-/tfpK2A4FpS0o+S78o3YSdlqXr0MavJIDlFK3XZrlXLy7vaRXJvW5jYg3v5e/wCaF8y0IpMjkYLhoV6QqfpOgw=="], @@ -8498,6 +8515,8 @@ "@modelcontextprotocol/sdk/zod": ["zod@4.1.13", "", {}, "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig=="], + "@modelcontextprotocol/sdk/zod-to-json-schema": ["zod-to-json-schema@3.25.1", "", { "peerDependencies": { "zod": "^3.25 || ^4" } }, "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA=="], + "@napi-rs/wasm-runtime/@emnapi/runtime": ["@emnapi/runtime@1.5.0", "", { "dependencies": { "tslib": "2.8.1" } }, "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ=="], "@next/eslint-plugin-next/fast-glob": ["fast-glob@3.3.1", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "@nodelib/fs.walk": "1.2.8", "glob-parent": "5.1.2", "merge2": "1.4.1", "micromatch": "4.0.8" } }, "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg=="], @@ -8902,6 +8921,8 @@ "@remotion/react18-tests/react-dom": ["react-dom@18.3.1", "", { "dependencies": { "loose-envify": "1.4.0", "scheduler": "0.23.2" }, "peerDependencies": { "react": "18.3.1" } }, "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw=="], + "@remotion/react18-tests/zod": ["zod@3.22.3", "", {}, "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug=="], + "@remotion/renderer/source-map": ["source-map@0.8.0-beta.0", "", { "dependencies": { "whatwg-url": "7.1.0" } }, "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA=="], "@remotion/tailwind/tailwindcss": ["tailwindcss@3.4.13", "", { "dependencies": { "@alloc/quick-lru": "5.2.0", "arg": "5.0.2", "chokidar": "3.5.3", "didyoumean": "1.2.2", "dlv": "1.1.3", "fast-glob": "3.3.2", "glob-parent": "6.0.2", "is-glob": "4.0.3", "jiti": "1.21.6", "lilconfig": "2.1.0", "micromatch": "4.0.8", "normalize-path": "3.0.0", "object-hash": "3.0.0", "picocolors": "1.1.1", "postcss": "8.5.1", "postcss-import": "15.1.0", "postcss-js": "4.0.1", "postcss-load-config": "4.0.1", "postcss-nested": "6.0.1", "postcss-selector-parser": "6.1.1", "resolve": "1.22.8", "sucrase": "3.32.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw=="], @@ -8914,6 +8935,8 @@ "@remotion/tailwind-v4/tailwindcss": ["tailwindcss@4.1.1", "", {}, "sha512-QNbdmeS979Efzim2g/bEvfuh+fTcIdp1y7gA+sb6OYSW74rt7Cr7M78AKdf6HqWT3d5AiTb7SwTT3sLQxr4/qw=="], + "@remotion/zod-types-v3/zod": ["zod@3.22.3", "", {}, "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug=="], + "@rollup/pluginutils/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], "@shopify/react-native-skia/react": ["react@19.0.0", "", {}, "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ=="], @@ -9426,8 +9449,6 @@ "acorn-jsx/acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="], - "ai/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "ajv-formats/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], "ansi-align/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "8.0.0", "is-fullwidth-code-point": "3.0.0", "strip-ansi": "6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -9458,8 +9479,6 @@ "astro/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "astro/zod-to-json-schema": ["zod-to-json-schema@3.24.6", "", { "peerDependencies": { "zod": "3.25.76" } }, "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg=="], - "async-disk-cache/debug": ["debug@4.4.1", "", { "dependencies": { "ms": "2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], "async-disk-cache/mkdirp": ["mkdirp@0.5.6", "", { "dependencies": { "minimist": "1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="], @@ -10082,6 +10101,8 @@ "openai/@types/node": ["@types/node@18.14.6", "", {}, "sha512-93+VvleD3mXwlLI/xASjw0FzKcwzl3OdTCzm1LaRfqgS21gfFtK3zDXM5Op9TeeMsJVOaJ2VRDpT9q4Y3d0AvA=="], + "openai/zod": ["zod@3.22.3", "", {}, "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug=="], + "ora/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], "ora/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], @@ -10504,8 +10525,6 @@ "template-prompt-to-motion-graphics/typescript-eslint": ["typescript-eslint@8.46.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.46.0", "@typescript-eslint/parser": "8.46.0", "@typescript-eslint/typescript-estree": "8.46.0", "@typescript-eslint/utils": "8.46.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-6+ZrB6y2bT2DX3K+Qd9vn7OFOJR+xSLDj+Aw/N3zBwUt27uTw2sw2TE2+UcY1RiyBZkaGbTkVg9SSdPNUG6aUw=="], - "template-prompt-to-motion-graphics/zod": ["zod@4.1.13", "", {}, "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig=="], - "template-react-router/tailwind-merge": ["tailwind-merge@3.0.1", "", {}, "sha512-AvzE8FmSoXC7nC+oU5GlQJbip2UO7tmOhOfQyOmPhrStOGXHU08j8mZEHZ4BmCqY5dWTCo4ClWkNyRNx1wpT0g=="], "template-react-router/tailwindcss": ["tailwindcss@4.0.0", "", {}, "sha512-ULRPI3A+e39T7pSaf1xoi58AqqJxVCLg8F/uM5A3FadUbnyDTgltVnXJvdkTjwCOGA6NazqHVcwPJC5h2vRYVQ=="], @@ -10564,6 +10583,8 @@ "template-vercel/tailwindcss": ["tailwindcss@4.0.3", "", {}, "sha512-ImmZF0Lon5RrQpsEAKGxRvHwCvMgSC4XVlFRqmbzTEDb/3wvin9zfEZrMwgsa3yqBbPqahYcVI6lulM2S7IZAA=="], + "template-vercel/turbo": ["turbo@2.8.6", "", { "optionalDependencies": { "turbo-darwin-64": "2.8.6", "turbo-darwin-arm64": "2.8.6", "turbo-linux-64": "2.8.6", "turbo-linux-arm64": "2.8.6", "turbo-windows-64": "2.8.6", "turbo-windows-arm64": "2.8.6" }, "bin": { "turbo": "bin/turbo" } }, "sha512-QMj1SQwUYehc+xJ9SxXn56UO43hfKN64/NFetVW1BwzysRqn+q0FSgrmk+IbJ+djfd8j8zXGKGeqsnUcXwQSUQ=="], + "template-vercel/typescript-eslint": ["typescript-eslint@8.46.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.46.0", "@typescript-eslint/parser": "8.46.0", "@typescript-eslint/typescript-estree": "8.46.0", "@typescript-eslint/utils": "8.46.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-6+ZrB6y2bT2DX3K+Qd9vn7OFOJR+xSLDj+Aw/N3zBwUt27uTw2sw2TE2+UcY1RiyBZkaGbTkVg9SSdPNUG6aUw=="], "terser/acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="], @@ -10746,7 +10767,7 @@ "zip-stream/readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "3.0.0", "buffer": "6.0.3", "events": "3.3.0", "process": "0.11.10", "string_decoder": "1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="], - "zod-to-json-schema/zod": ["zod@4.1.13", "", {}, "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig=="], + "zod-to-json-schema/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "zod-to-ts/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], @@ -13714,6 +13735,18 @@ "template-vercel/@typescript-eslint/parser/debug": ["debug@4.4.1", "", { "dependencies": { "ms": "2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], + "template-vercel/turbo/turbo-darwin-64": ["turbo-darwin-64@2.8.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-6QeZ/aLZizekiI6tKZN0IGP1a1WYZ9c/qDKPa0rSmj2X0O0Iw/ES4rKZV40S5n8SUJdiU01EFLygHJ2oWaYKXg=="], + + "template-vercel/turbo/turbo-darwin-arm64": ["turbo-darwin-arm64@2.8.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RS4Z902vB93cQD3PJS/1IMmS0HefrB5ZXuw4ECOrxhOGz5jJVmYFJ6weDzedjoTDeYHHXGo1NoiCSHg69ngWKA=="], + + "template-vercel/turbo/turbo-linux-64": ["turbo-linux-64@2.8.6", "", { "os": "linux", "cpu": "x64" }, "sha512-hCWDnDepYbrSJdByuryKFoHAGFkvgBYXr6qdaGsYhX1Wgq8isqXCQBKOo99Y/9tXDwKGEeQ7xnkdFvSL7AQ4iQ=="], + + "template-vercel/turbo/turbo-linux-arm64": ["turbo-linux-arm64@2.8.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-oS15aCYEpynG/l69xs/ZnQ0dnz0pHhfHg70Zf5J+j5Cam0/RA0MpcryjneN/9G0PmP8a/6ZxnL5nZahX+wOBPA=="], + + "template-vercel/turbo/turbo-windows-64": ["turbo-windows-64@2.8.6", "", { "os": "win32", "cpu": "x64" }, "sha512-eqBxqJD7H/uk9V0QO10VgwY9J2BUXejsGuzChln72Yl+o8GZwsvhOekndRxccR90J8ZO+LKO24+3VzHFh4Cu/g=="], + + "template-vercel/turbo/turbo-windows-arm64": ["turbo-windows-arm64@2.8.6", "", { "os": "win32", "cpu": "arm64" }, "sha512-I3VEQyxIlNZ6XTg4fLKAkuhcwzIs/GD7Vs1yhelH2aUTjf08wprjBWknDqP7mjAHMpsosRrq4DtfSZEQm83Hxg=="], + "template-vercel/typescript-eslint/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.46.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.46.0", "@typescript-eslint/tsconfig-utils": "8.46.0", "@typescript-eslint/types": "8.46.0", "@typescript-eslint/visitor-keys": "8.46.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg=="], "template-vercel/typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@8.46.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.46.0", "@typescript-eslint/types": "8.46.0", "@typescript-eslint/typescript-estree": "8.46.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g=="], diff --git a/package.json b/package.json index 299d41f0cf5..598bb579a05 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "ts-build": "tsc -b --verbose --watch", "stylecheck": "turbo run lint formatting --no-update-notifier", "build": "turbo run make --no-update-notifier", - "build-docs": "turbo run build-docs --no-update-notifier", + "build-docs": "TURBO_TELEMETRY_DISABLED=1 turbo run build-docs --no-update-notifier", "testssr": "turbo run testssr --no-update-notifier", "testwebcodecs": "turbo run testwebcodecs --no-update-notifier", "testwebrenderer": "turbo run testwebrenderer --concurrency=1 --no-update-notifier", @@ -57,7 +57,7 @@ "dependencies": { "p-limit": "7.2.0", "typescript": "5.9.3", - "turbo": "2.8.6" + "turbo": "2.8.10" }, "packageManager": "bun@1.3.3", "overrides": { @@ -95,7 +95,7 @@ "react-dom": "19.2.3", "eslint": "9.19.0", "prettier": "3.8.1", - "zod": "3.22.3", + "zod": "4.3.6", "@types/react": "19.2.7", "@types/react-dom": "19.2.3", "@types/node": "20.12.14", diff --git a/packages/STATS.md b/packages/STATS.md index 413c6392cda..118dc94d9e7 100644 --- a/packages/STATS.md +++ b/packages/STATS.md @@ -61,3 +61,4 @@ Monthly downloads of Remotion packages [![NPM Downloads](https://img.shields.io/npm/dm/@remotion/webcodecs.svg?style=flat&color=black&label=@remotion/webcodecs)](https://npmcharts.com/compare/@remotion/webcodecs?minimal=true) [![NPM Downloads](https://img.shields.io/npm/dm/@remotion/whisper-web.svg?style=flat&color=black&label=@remotion/whisper-web)](https://npmcharts.com/compare/@remotion/whisper-web?minimal=true) [![NPM Downloads](https://img.shields.io/npm/dm/@remotion/zod-types.svg?style=flat&color=black&label=@remotion/zod-types)](https://npmcharts.com/compare/@remotion/zod-types?minimal=true) +[![NPM Downloads](https://img.shields.io/npm/dm/@remotion/zod-types-v3.svg?style=flat&color=black&label=@remotion/zod-types-v3)](https://npmcharts.com/compare/@remotion/zod-types-v3?minimal=true) diff --git a/packages/animated-emoji/package.json b/packages/animated-emoji/package.json index 08f1b420e8d..b055e715da0 100644 --- a/packages/animated-emoji/package.json +++ b/packages/animated-emoji/package.json @@ -1,6 +1,6 @@ { "name": "@remotion/animated-emoji", - "version": "4.0.424", + "version": "4.0.425", "main": "dist/cjs/index.js", "types": "dist/cjs/index.d.ts", "module": "dist/esm/index.mjs", diff --git a/packages/animation-utils/package.json b/packages/animation-utils/package.json index 981c19e9cb2..de3e1411c97 100644 --- a/packages/animation-utils/package.json +++ b/packages/animation-utils/package.json @@ -7,7 +7,7 @@ "name": "Chetan Karwa", "email": "cbkarwa@gmail.com" }, - "version": "4.0.424", + "version": "4.0.425", "description": "Helpers for animating CSS properties", "main": "./dist/index.js", "module": "./dist/index.mjs", diff --git a/packages/astro-example/package.json b/packages/astro-example/package.json index f2405143ccb..906b11c4dd1 100644 --- a/packages/astro-example/package.json +++ b/packages/astro-example/package.json @@ -5,7 +5,7 @@ "name": "@remotion/astro-example", "private": true, "type": "module", - "version": "4.0.424", + "version": "4.0.425", "scripts": { "dev": "astro dev", "start": "astro dev", diff --git a/packages/babel-loader/package.json b/packages/babel-loader/package.json index 8d4a5b90c9f..29af56254aa 100644 --- a/packages/babel-loader/package.json +++ b/packages/babel-loader/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/babel-loader" }, "name": "@remotion/babel-loader", - "version": "4.0.424", + "version": "4.0.425", "description": "Babel loader for Remotion", "main": "dist/index.js", "scripts": { diff --git a/packages/bugs/package.json b/packages/bugs/package.json index d1256ac02bf..6715c36f9fb 100644 --- a/packages/bugs/package.json +++ b/packages/bugs/package.json @@ -4,5 +4,5 @@ }, "name": "bugs", "private": true, - "version": "4.0.424" + "version": "4.0.425" } diff --git a/packages/bundler/package.json b/packages/bundler/package.json index 40d5b3c3af5..36a501f5b2a 100644 --- a/packages/bundler/package.json +++ b/packages/bundler/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/bundler" }, "name": "@remotion/bundler", - "version": "4.0.424", + "version": "4.0.425", "description": "Bundle Remotion compositions using Webpack", "main": "dist/index.js", "sideEffects": false, diff --git a/packages/captions/package.json b/packages/captions/package.json index 22d5582e355..8dd1e4689c0 100644 --- a/packages/captions/package.json +++ b/packages/captions/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/captions" }, "name": "@remotion/captions", - "version": "4.0.424", + "version": "4.0.425", "description": "Primitives for dealing with captions", "main": "dist/index.js", "sideEffects": false, diff --git a/packages/cli/package.json b/packages/cli/package.json index 7ee83a7fc78..51b082e2dfc 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/cli" }, "name": "@remotion/cli", - "version": "4.0.424", + "version": "4.0.425", "description": "Control Remotion features using the `npx remotion` command", "main": "dist/index.js", "sideEffects": false, diff --git a/packages/cli/src/extra-packages.ts b/packages/cli/src/extra-packages.ts index 66b29897bd5..2ea64760ad8 100644 --- a/packages/cli/src/extra-packages.ts +++ b/packages/cli/src/extra-packages.ts @@ -1,9 +1,9 @@ export const EXTRA_PACKAGES: Record = { - zod: '3.22.3', mediabunny: '1.34.4', + zod: '4.3.6', }; export const EXTRA_PACKAGES_DOCS: Record = { - zod: 'https://www.remotion.dev/docs/schemas#prerequisites', mediabunny: 'https://www.remotion.dev/docs/mediabunny/version', + zod: 'https://zod.dev', }; diff --git a/packages/cli/src/list-of-remotion-packages.ts b/packages/cli/src/list-of-remotion-packages.ts index 2402bce3835..2320889e1cb 100644 --- a/packages/cli/src/list-of-remotion-packages.ts +++ b/packages/cli/src/list-of-remotion-packages.ts @@ -72,6 +72,7 @@ export const listOfRemotionPackages = [ '@remotion/transitions', '@remotion/media-parser', '@remotion/zod-types', + '@remotion/zod-types-v3', '@remotion/webcodecs', '@remotion/convert', '@remotion/captions', diff --git a/packages/cloudrun/container/package.json b/packages/cloudrun/container/package.json index 325e7aa875e..384b1d39d8b 100644 --- a/packages/cloudrun/container/package.json +++ b/packages/cloudrun/container/package.json @@ -1,6 +1,6 @@ { "name": "cloud-run-render", - "version": "4.0.424", + "version": "4.0.425", "description": "Render media and stills on GCP Cloud Run", "main": "dist/index.js", "scripts": { diff --git a/packages/cloudrun/package.json b/packages/cloudrun/package.json index 593d50a0791..8de554c1c51 100644 --- a/packages/cloudrun/package.json +++ b/packages/cloudrun/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/cloudrun" }, "name": "@remotion/cloudrun", - "version": "4.0.424", + "version": "4.0.425", "description": "Render Remotion videos on Google Cloud Run", "main": "dist/index.js", "sideEffects": false, diff --git a/packages/cloudrun/src/functions/helpers/payloads.ts b/packages/cloudrun/src/functions/helpers/payloads.ts index 4a32ab986a4..31746c6d455 100644 --- a/packages/cloudrun/src/functions/helpers/payloads.ts +++ b/packages/cloudrun/src/functions/helpers/payloads.ts @@ -59,7 +59,7 @@ export const CloudRunPayload = z.discriminatedUnion('type', [ .tuple([z.number(), z.number().nullable()]) .or(z.number()) .nullable(), - envVariables: z.record(z.string()), + envVariables: z.record(z.string(), z.string()), chromiumOptions: chromiumOptions.optional(), muted: z.boolean(), outputBucket: z.string(), @@ -76,12 +76,12 @@ export const CloudRunPayload = z.discriminatedUnion('type', [ colorSpace: z.enum(BrowserSafeApis.validColorSpaces).nullable(), clientVersion: z.string(), downloadBehavior, - metadata: z.record(z.string()).optional().nullable(), + metadata: z.record(z.string(), z.string()).optional().nullable(), renderIdOverride: z.string().optional().nullable(), renderStatusWebhook: z .object({ url: z.string(), - headers: z.record(z.string()), + headers: z.record(z.string(), z.string()), data: z.any(), webhookProgressInterval: z.number().min(0).max(1).optional().nullable(), }) @@ -101,7 +101,7 @@ export const CloudRunPayload = z.discriminatedUnion('type', [ imageFormat: stillImageFormat, scale: z.number(), privacy: z.enum(['public', 'private', 'no-acl']), - envVariables: z.record(z.string()), + envVariables: z.record(z.string(), z.string()), chromiumOptions: chromiumOptions.optional(), outputBucket: z.string(), outName: z.string().nullable(), @@ -113,12 +113,12 @@ export const CloudRunPayload = z.discriminatedUnion('type', [ offthreadVideoThreads: z.number().nullable(), clientVersion: z.string(), downloadBehavior, - metadata: z.record(z.string()).optional().nullable(), + metadata: z.record(z.string(), z.string()).optional().nullable(), renderIdOverride: z.string().optional().nullable(), renderStatusWebhook: z .object({ url: z.string(), - headers: z.record(z.string()), + headers: z.record(z.string(), z.string()), data: z.any(), webhookProgressInterval: z.number().min(0).max(1).optional().nullable(), }) diff --git a/packages/compositor-darwin-arm64/package.json b/packages/compositor-darwin-arm64/package.json index f548479c26a..2b1931dd015 100644 --- a/packages/compositor-darwin-arm64/package.json +++ b/packages/compositor-darwin-arm64/package.json @@ -2,7 +2,7 @@ "repository": { "url": "https://github.com/remotion-dev/remotion/tree/main/packages/compositor-darwin-arm64" }, - "version": "4.0.424", + "version": "4.0.425", "name": "@remotion/compositor-darwin-arm64", "os": [ "darwin" diff --git a/packages/compositor-darwin-x64/package.json b/packages/compositor-darwin-x64/package.json index 4f3b7142051..446d48e1ad1 100644 --- a/packages/compositor-darwin-x64/package.json +++ b/packages/compositor-darwin-x64/package.json @@ -2,7 +2,7 @@ "repository": { "url": "https://github.com/remotion-dev/remotion/tree/main/packages/compositor-darwin-x64" }, - "version": "4.0.424", + "version": "4.0.425", "name": "@remotion/compositor-darwin-x64", "os": [ "darwin" diff --git a/packages/compositor-linux-arm64-gnu/package.json b/packages/compositor-linux-arm64-gnu/package.json index 223ef2b73b7..983c3c32114 100644 --- a/packages/compositor-linux-arm64-gnu/package.json +++ b/packages/compositor-linux-arm64-gnu/package.json @@ -2,7 +2,7 @@ "repository": { "url": "https://github.com/remotion-dev/remotion/tree/main/packages/compositor-linux-arm64-gnu" }, - "version": "4.0.424", + "version": "4.0.425", "name": "@remotion/compositor-linux-arm64-gnu", "os": [ "linux" diff --git a/packages/compositor-linux-arm64-musl/package.json b/packages/compositor-linux-arm64-musl/package.json index a006b2d6b0c..94449cc0068 100644 --- a/packages/compositor-linux-arm64-musl/package.json +++ b/packages/compositor-linux-arm64-musl/package.json @@ -2,7 +2,7 @@ "repository": { "url": "https://github.com/remotion-dev/remotion/tree/main/packages/compositor-linux-arm64-musl" }, - "version": "4.0.424", + "version": "4.0.425", "name": "@remotion/compositor-linux-arm64-musl", "os": [ "linux" diff --git a/packages/compositor-linux-x64-gnu/package.json b/packages/compositor-linux-x64-gnu/package.json index 1e2f49cb6fb..37859e8fc86 100644 --- a/packages/compositor-linux-x64-gnu/package.json +++ b/packages/compositor-linux-x64-gnu/package.json @@ -2,7 +2,7 @@ "repository": { "url": "https://github.com/remotion-dev/remotion/tree/main/packages/compositor-linux-x64-gnu" }, - "version": "4.0.424", + "version": "4.0.425", "name": "@remotion/compositor-linux-x64-gnu", "os": [ "linux" diff --git a/packages/compositor-linux-x64-musl/package.json b/packages/compositor-linux-x64-musl/package.json index c104858d2bb..fee07a76da0 100644 --- a/packages/compositor-linux-x64-musl/package.json +++ b/packages/compositor-linux-x64-musl/package.json @@ -2,7 +2,7 @@ "repository": { "url": "https://github.com/remotion-dev/remotion/tree/main/packages/compositor-linux-x64-musl" }, - "version": "4.0.424", + "version": "4.0.425", "name": "@remotion/compositor-linux-x64-musl", "os": [ "linux" diff --git a/packages/compositor-win32-x64-msvc/package.json b/packages/compositor-win32-x64-msvc/package.json index c911106f965..50cd4bf858d 100644 --- a/packages/compositor-win32-x64-msvc/package.json +++ b/packages/compositor-win32-x64-msvc/package.json @@ -2,7 +2,7 @@ "repository": { "url": "https://github.com/remotion-dev/remotion/tree/main/packages/compositor-win32-x64-msvc" }, - "version": "4.0.424", + "version": "4.0.425", "name": "@remotion/compositor-win32-x64-msvc", "os": [ "win32" diff --git a/packages/compositor/package.json b/packages/compositor/package.json index a30e8432641..141658798f8 100644 --- a/packages/compositor/package.json +++ b/packages/compositor/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/compositor" }, "name": "@remotion/compositor", - "version": "4.0.424", + "version": "4.0.425", "description": "Rust binary for Remotion", "sideEffects": false, "scripts": { diff --git a/packages/convert/package.json b/packages/convert/package.json index b7299190817..ecc006f83a7 100644 --- a/packages/convert/package.json +++ b/packages/convert/package.json @@ -1,6 +1,6 @@ { "name": "@remotion/convert", - "version": "4.0.424", + "version": "4.0.425", "private": true, "sideEffects": false, "type": "module", diff --git a/packages/core/package.json b/packages/core/package.json index 8919b78e869..2f927016765 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/core" }, "name": "remotion", - "version": "4.0.424", + "version": "4.0.425", "description": "Make videos programmatically", "main": "dist/cjs/index.js", "types": "dist/cjs/index.d.ts", diff --git a/packages/core/src/Composition.tsx b/packages/core/src/Composition.tsx index c183b2a35dc..e04fc36d77b 100644 --- a/packages/core/src/Composition.tsx +++ b/packages/core/src/Composition.tsx @@ -1,18 +1,16 @@ import type {ComponentType} from 'react'; import React, {Suspense, useContext, useEffect} from 'react'; import {createPortal} from 'react-dom'; -import type {AnyZodObject, z} from 'zod'; +import type {z} from 'zod'; +import type {AnyZodObject} from './any-zod-type.js'; import { CanUseRemotionHooks, CanUseRemotionHooksProvider, } from './CanUseRemotionHooks.js'; +import type {Codec} from './codec.js'; +import type {TComposition} from './CompositionManager.js'; import {CompositionSetters} from './CompositionManagerContext.js'; import {FolderContext} from './Folder.js'; -import { - PROPS_UPDATED_EXTERNALLY, - useResolvedVideoConfig, -} from './ResolveCompositionConfig.js'; -import type {Codec} from './codec.js'; import {serializeThenDeserializeInStudio} from './input-props-serialization.js'; import {useIsPlayer} from './is-player.js'; import {Loading} from './loading-indicator.js'; @@ -21,6 +19,10 @@ import {portalNode} from './portal-node.js'; import type {InferProps, PropsIfHasProps} from './props-if-has-props.js'; import type {ProResProfile} from './prores-profile.js'; import type {PixelFormat, VideoImageFormat} from './render-types.js'; +import { + PROPS_UPDATED_EXTERNALLY, + useResolvedVideoConfig, +} from './ResolveCompositionConfig.js'; import {useDelayRender} from './use-delay-render.js'; import {useLazyComponent} from './use-lazy-component.js'; import {useRemotionEnvironment} from './use-remotion-environment.js'; @@ -196,12 +198,12 @@ const InnerComposition = < component: lazy, defaultProps: serializeThenDeserializeInStudio( (defaultProps ?? {}) as z.output & Props, - ) as z.output & Props, + ) as InferProps, nonce, parentFolderName: parentName, schema: schema ?? null, calculateMetadata: compProps.calculateMetadata ?? null, - }); + } as TComposition); return () => { unregisterComposition(id); diff --git a/packages/core/src/CompositionManager.tsx b/packages/core/src/CompositionManager.tsx index f32c6a4f998..39e770a424c 100644 --- a/packages/core/src/CompositionManager.tsx +++ b/packages/core/src/CompositionManager.tsx @@ -1,6 +1,6 @@ import type {ComponentType, LazyExoticComponent} from 'react'; import React from 'react'; -import type {AnyZodObject} from 'zod'; +import type {AnyZodObject} from './any-zod-type.js'; import type {CalculateMetadataFunction} from './Composition.js'; import type {DownloadBehavior} from './download-behavior.js'; import type {InferProps, PropsIfHasProps} from './props-if-has-props.js'; diff --git a/packages/core/src/CompositionManagerContext.tsx b/packages/core/src/CompositionManagerContext.tsx index d8781fbadbb..a37cb513b0d 100644 --- a/packages/core/src/CompositionManagerContext.tsx +++ b/packages/core/src/CompositionManagerContext.tsx @@ -1,6 +1,6 @@ import type React from 'react'; import {createContext} from 'react'; -import type {AnyZodObject} from 'zod'; +import type {AnyZodObject} from './any-zod-type.js'; import type {AnyComposition, TComposition} from './CompositionManager.js'; import type {TFolder} from './Folder.js'; import type {VideoConfig} from './video-config.js'; diff --git a/packages/core/src/CompositionManagerProvider.tsx b/packages/core/src/CompositionManagerProvider.tsx index 4c7bdfb25a7..6ca4d395c3f 100644 --- a/packages/core/src/CompositionManagerProvider.tsx +++ b/packages/core/src/CompositionManagerProvider.tsx @@ -5,7 +5,7 @@ import { useRef, useState, } from 'react'; -import type {AnyZodObject} from 'zod'; +import type {AnyZodObject} from './any-zod-type.js'; import type {TComposition} from './CompositionManager'; import {compositionsRef, type AnyComposition} from './CompositionManager'; import type { diff --git a/packages/core/src/Still.tsx b/packages/core/src/Still.tsx index d643e2021a0..51d855c4613 100644 --- a/packages/core/src/Still.tsx +++ b/packages/core/src/Still.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import type {AnyZodObject} from 'zod'; +import type {AnyZodObject} from './any-zod-type.js'; import type {CompositionProps, StillProps} from './Composition.js'; import {Composition} from './Composition.js'; diff --git a/packages/core/src/any-zod-type.ts b/packages/core/src/any-zod-type.ts new file mode 100644 index 00000000000..89350e8a327 --- /dev/null +++ b/packages/core/src/any-zod-type.ts @@ -0,0 +1,14 @@ +import type * as z3 from 'zod/v3'; +import type * as z4 from 'zod/v4/core'; + +/** + * Structural type for standalone zod v3 (e.g. 3.22.x) ZodObject, + * which predates Standard Schema and lacks ~standard/~validate. + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +type StandaloneZodV3Object = {_def: any; _input: any; [k: string]: any}; + +export type AnyZodObject = + | z3.AnyZodObject + | z4.$ZodObject + | StandaloneZodV3Object; diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 729c580cb60..680ac270998 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -123,6 +123,7 @@ export type BundleState = checkMultipleRemotionVersions(); export * from './AbsoluteFill.js'; export * from './animated-image/index.js'; +export type {AnyZodObject} from './any-zod-type.js'; export {Artifact} from './Artifact.js'; export {Audio, Html5Audio, RemotionAudioProps} from './audio/index.js'; export type {LoopVolumeCurveBehavior} from './audio/use-audio-frame.js'; diff --git a/packages/core/src/props-if-has-props.ts b/packages/core/src/props-if-has-props.ts index eec1c3335e5..2ff9fcc6cab 100644 --- a/packages/core/src/props-if-has-props.ts +++ b/packages/core/src/props-if-has-props.ts @@ -1,4 +1,4 @@ -import type {AnyZodObject, z} from 'zod'; +import type {AnyZodObject} from './any-zod-type.js'; type And = A extends true ? B extends true @@ -6,6 +6,19 @@ type And = A extends true : false : false; +/** + * Infer the input type of a zod schema using structural typing. + * v3 schemas have `_input` phantom type. + * v4 schemas have `_zod.input` phantom type. + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +type InferZodInput = T extends {_zod: {input: any}} + ? T['_zod']['input'] + : // eslint-disable-next-line @typescript-eslint/no-explicit-any + T extends {_input: any} + ? T['_input'] + : Record; + export type PropsIfHasProps< Schema extends AnyZodObject, Props extends Record, @@ -34,6 +47,6 @@ export type InferProps< Props : {} extends Props ? // Only schema specified - z.input + InferZodInput : // Props and schema specified - z.input & Props; + InferZodInput & Props; diff --git a/packages/core/src/resolve-video-config.ts b/packages/core/src/resolve-video-config.ts index e2fc474e71b..9a7856a8d22 100644 --- a/packages/core/src/resolve-video-config.ts +++ b/packages/core/src/resolve-video-config.ts @@ -1,4 +1,4 @@ -import type {AnyZodObject} from 'zod'; +import type {AnyZodObject} from './any-zod-type.js'; import type { CalcMetadataReturnType, CalculateMetadataFunction, diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 88dac71b7ef..adcf509616b 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -5,4 +5,4 @@ * @see [Documentation](https://remotion.dev/docs/version) * @returns {string} The current version of the remotion package */ -export const VERSION = '4.0.424'; +export const VERSION = '4.0.425'; diff --git a/packages/create-video/package.json b/packages/create-video/package.json index a6f1589af7c..56cb516b12f 100644 --- a/packages/create-video/package.json +++ b/packages/create-video/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/create-video" }, "name": "create-video", - "version": "4.0.424", + "version": "4.0.425", "description": "Create a new Remotion project", "main": "dist/index.js", "bin": { diff --git a/packages/create-video/src/list-of-remotion-packages.ts b/packages/create-video/src/list-of-remotion-packages.ts index 2402bce3835..2320889e1cb 100644 --- a/packages/create-video/src/list-of-remotion-packages.ts +++ b/packages/create-video/src/list-of-remotion-packages.ts @@ -72,6 +72,7 @@ export const listOfRemotionPackages = [ '@remotion/transitions', '@remotion/media-parser', '@remotion/zod-types', + '@remotion/zod-types-v3', '@remotion/webcodecs', '@remotion/convert', '@remotion/captions', diff --git a/packages/design/package.json b/packages/design/package.json index 306679038dd..e282cf2ed0a 100644 --- a/packages/design/package.json +++ b/packages/design/package.json @@ -1,6 +1,6 @@ { "name": "@remotion/design", - "version": "4.0.424", + "version": "4.0.425", "main": "dist/index.js", "types": "dist/index.d.ts", "module": "dist/esm/index.mjs", diff --git a/packages/discord-poster/package.json b/packages/discord-poster/package.json index 07bd6fe5058..860f6c81541 100644 --- a/packages/discord-poster/package.json +++ b/packages/discord-poster/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/discord-poster" }, "name": "@remotion/discord-poster", - "version": "4.0.424", + "version": "4.0.425", "license": "SEE LICENSE IN LICENSE.md", "type": "module", "scripts": { diff --git a/packages/docs/docs/5-0-migration.mdx b/packages/docs/docs/5-0-migration.mdx index bf4979942c9..9b7e8eb608e 100644 --- a/packages/docs/docs/5-0-migration.mdx +++ b/packages/docs/docs/5-0-migration.mdx @@ -55,12 +55,6 @@ It never made sense to have this prop as transitioned elements need to be positi **Required action**: Remove the `layout` prop. -## Zod should be upgraded to 3.23.8 - -Remotion previously used the types of Zod 3.22.3. With Remotion 5.0, the types of 3.23.8 are used. - -**Required action**: If you use Zod, Upgrade Zod to 3.23.8. - ## `measureSpring()` does not accept `from` and `to` options anymore The values passed in there did not influence the calculation at all. Therefore we removed those options. diff --git a/packages/docs/docs/investors.mdx b/packages/docs/docs/investors.mdx index 812298346b9..60270f108ad 100644 --- a/packages/docs/docs/investors.mdx +++ b/packages/docs/docs/investors.mdx @@ -42,7 +42,7 @@ See also: [Why we are not building Lovable for Motion Graphics](/docs/lovable-fo ## Customers -Remotion has over 150 active customers, making us very diversified. +Remotion has over 200 active customers, making us very diversified. Our goal is to make Remotion a framework that works for everyone, not favoring any specific customer. ## Shark Tank appearance diff --git a/packages/docs/docs/schemas.mdx b/packages/docs/docs/schemas.mdx index 00a3e80b226..07b858fb1d5 100644 --- a/packages/docs/docs/schemas.mdx +++ b/packages/docs/docs/schemas.mdx @@ -10,7 +10,7 @@ As an alternative to [using TypeScript types](/docs/parameterized-rendering) to ## Prerequisites -If you want to use this feature, install `zod@3.22.3` and [`@remotion/zod-types`](/docs/zod-types) for Remotion-specific types: +If you want to use this feature, install `zod` and [`@remotion/zod-types`](/docs/zod-types) for Remotion-specific types: ```bash npx remotion add @remotion/zod-types zod diff --git a/packages/docs/docs/web-renderer/render-media-on-web.mdx b/packages/docs/docs/web-renderer/render-media-on-web.mdx index 25b22c2eb8e..f4ea4686d77 100644 --- a/packages/docs/docs/web-renderer/render-media-on-web.mdx +++ b/packages/docs/docs/web-renderer/render-media-on-web.mdx @@ -5,6 +5,8 @@ title: renderMediaOnWeb() crumb: '@remotion/web-renderer' --- +# renderMediaOnWeb() + :::warning Very experimental feature - expect bugs and breaking changes at any time. [Track progress on GitHub](https://github.com/remotion-dev/remotion/issues/5913) and discuss in the [`#web-renderer`](https://remotion.dev/discord) channel on Discord. @@ -12,8 +14,6 @@ Very experimental feature - expect bugs and breaking changes at any time. _Part of the `@remotion/web-renderer` package._ - - Renders a video or audio in the browser. If you want to render a single frame to an image, use [`renderStillOnWeb()`](/docs/web-renderer/render-still-on-web). @@ -271,9 +271,9 @@ By default, Remotion will automatically choose `"web-fs"` if available, otherwis ### `schema?` -_Zod schema_ +_Zod v4 schema_ -A Zod schema to validate the input props. +A Zod v4 schema to validate the input props. See [Schemas](/docs/schemas) for more information. ### `licenseKey?` diff --git a/packages/docs/docs/web-renderer/render-still-on-web.mdx b/packages/docs/docs/web-renderer/render-still-on-web.mdx index 5a269c150b6..df7a24fbab4 100644 --- a/packages/docs/docs/web-renderer/render-still-on-web.mdx +++ b/packages/docs/docs/web-renderer/render-still-on-web.mdx @@ -5,6 +5,8 @@ title: renderStillOnWeb() crumb: '@remotion/web-renderer' --- +# renderStillOnWeb() + :::warning Very experimental feature - expect bugs and breaking changes at any time. [Track progress on GitHub](https://github.com/remotion-dev/remotion/issues/5913) and discuss in the [`#web-renderer`](https://remotion.dev/discord) channel on Discord. @@ -12,8 +14,6 @@ Very experimental feature - expect bugs and breaking changes at any time. _Part of the `@remotion/web-renderer` package._ - - Renders a single frame to an image in the browser. If you want to render a video instead, use [`renderMediaOnWeb()`](/docs/web-renderer/render-media-on-web). @@ -149,9 +149,9 @@ _function_ ### `schema?` -_Zod schema_ +_Zod v4 schema_ -A Zod schema to validate the input props. +A Zod v4 schema to validate the input props. See [Schemas](/docs/schemas) for more information. ### `licenseKey?` diff --git a/packages/docs/docs/zod-types/index.mdx b/packages/docs/docs/zod-types/index.mdx index f8404ae8513..7c00981c258 100644 --- a/packages/docs/docs/zod-types/index.mdx +++ b/packages/docs/docs/zod-types/index.mdx @@ -9,9 +9,13 @@ import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import {ZodTypesTableOfContents} from './TableOfContents'; -Includes utility types and Remotion-specific types for [Zod](https://github.com/colinhacks/zod). -Currently, only Zod version 3.22.3 is supported. -In the next major version of Remotion, the Zod version will be updated. +Includes utility types and Remotion-specific types for [Zod](https://github.com/colinhacks/zod). + +:::note +Since Remotion v4.0.426, `@remotion/zod-types` is based on Zod v4. +If you want, you can now upgrade to Zod v4. +If you want to stay on Zod 3.22.3 as previously required by Remotion, use [`@remotion/zod-types-v3`](/docs/zod-types/v3) instead of [`@remotion/zod-types`](/docs/zod-types). +::: ## Installation diff --git a/packages/docs/docs/zod-types/v3.mdx b/packages/docs/docs/zod-types/v3.mdx new file mode 100644 index 00000000000..5d5c8553a06 --- /dev/null +++ b/packages/docs/docs/zod-types/v3.mdx @@ -0,0 +1,68 @@ +--- +image: /generated/articles-docs-zod-types-v3.png +sidebar_label: Zod 3 vs. Zod 4 +title: '@remotion/zod-types-v3' +crumb: '@remotion/zod-types' +--- + +# @remotion/zod-types-v3 + +[`@remotion/zod-types`](/docs/zod-types) creates schemas using Zod v4 since Remotion v4.0.426. + +This package is for if you are using Zod v3.22.3 and want to compose functions like [`zColor()`](/docs/zod-types/z-color) with Zod v3.22.3 schemas. + +## Installation + + + +## Usage + +```tsx twoslash title="Using @remotion/zod-types-v3 with Zod v3" +import {z} from 'zod'; // zod = 3.22.3 +import {zColor} from '@remotion/zod-types-v3'; + +export const mySchema = z.object({ + color: zColor(), +}); +``` + +The package exports the same [`zColor()`](/docs/zod-types/z-color), [`zTextarea()`](/docs/zod-types/z-textarea), and [`zMatrix()`](/docs/zod-types/z-matrix) functions as [`@remotion/zod-types`](/docs/zod-types), but they return Zod v3.22.3 schema types. + +## When to use + +Use [`@remotion/zod-types`](/docs/zod-types) with Zod v4: + +```tsx twoslash +import {z} from 'zod'; // zod = 4.x.x +import {zColor} from '@remotion/zod-types'; + +export const mySchema = z.object({ + color: zColor(), +}); +``` + +Use [`@remotion/zod-types`](/docs/zod-types) if you are not nesting schemas: + +```tsx twoslash +import {zColor} from '@remotion/zod-types'; +import {visualControl} from '@remotion/studio'; + +export const myVisualControl = visualControl('my-color', '#fff', zColor()); +``` + +Use `@remotion/zod-types-v3` with Zod v3.22.3: + +```tsx twoslash +import {z} from 'zod'; // zod = 3.22.3 +import {zColor} from '@remotion/zod-types-v3'; + +export const mySchema = z.object({ + color: zColor(), +}); +``` + +Other Zod 3.x.x versions are not officially supported. + +## See also + +- [`@remotion/zod-types`](/docs/zod-types) diff --git a/packages/docs/package.json b/packages/docs/package.json index 0da9805daa7..471119e7c8d 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -4,7 +4,7 @@ }, "name": "docs", "private": true, - "version": "4.0.424", + "version": "4.0.425", "scripts": { "formatting": "prettier src --check", "docusaurus": "docusaurus", @@ -83,6 +83,7 @@ "@remotion/webcodecs": "workspace:*", "@remotion/whisper-web": "workspace:*", "@remotion/zod-types": "workspace:*", + "@remotion/zod-types-v3": "workspace:*", "@rive-app/canvas-advanced": "2.31.5", "@shopify/react-native-skia": "2.0.0", "@swc/core": "^1.3.80", diff --git a/packages/docs/sidebars.ts b/packages/docs/sidebars.ts index da0ed817656..3b924af0a16 100644 --- a/packages/docs/sidebars.ts +++ b/packages/docs/sidebars.ts @@ -766,6 +766,7 @@ const sidebars: SidebarsConfig = { 'zod-types/z-color', 'zod-types/z-textarea', 'zod-types/z-matrix', + 'zod-types/v3', ], }, { diff --git a/packages/docs/src/data/articles.ts b/packages/docs/src/data/articles.ts index 12cc0c068ea..4c017c8e851 100644 --- a/packages/docs/src/data/articles.ts +++ b/packages/docs/src/data/articles.ts @@ -7087,6 +7087,15 @@ export const articles = [ noAi: false, slug: 'zod-types/index', }, + { + id: 'zod-types/v3', + title: '@remotion/zod-types-v3', + relativePath: 'docs/zod-types/v3.mdx', + compId: 'articles-docs-zod-types-v3', + crumb: '@remotion/zod-types', + noAi: false, + slug: 'zod-types/v3', + }, { id: 'zod-types/z-color', title: 'zColor()', diff --git a/packages/docs/static/generated/articles-docs-zod-types-v3.png b/packages/docs/static/generated/articles-docs-zod-types-v3.png new file mode 100644 index 00000000000..29d307f4611 Binary files /dev/null and b/packages/docs/static/generated/articles-docs-zod-types-v3.png differ diff --git a/packages/docs/tsconfig.json b/packages/docs/tsconfig.json index eb94dcf5155..87a40321e83 100644 --- a/packages/docs/tsconfig.json +++ b/packages/docs/tsconfig.json @@ -11,16 +11,16 @@ "noImplicitAny": false, "strictNullChecks": true, "strict": false, - "noEmit": true + "noEmit": true, + "paths": { + "@site/*": ["./*"] + }, + "types": [ + "node", + "@docusaurus/module-type-aliases", + "@docusaurus/theme-classic" + ] }, - "paths": { - "@site/*": ["./*"] - }, - "types": [ - "node", - "@docusaurus/module-type-aliases", - "@docusaurus/theme-classic" - ], "references": [ {"path": "../player"}, diff --git a/packages/docusaurus-plugin/package.json b/packages/docusaurus-plugin/package.json index b930c40ca65..5bf6790f073 100644 --- a/packages/docusaurus-plugin/package.json +++ b/packages/docusaurus-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@remotion/docusaurus-plugin", - "version": "4.0.424", + "version": "4.0.425", "main": "dist/index.js", "types": "dist/index.d.ts", "sideEffects": false, diff --git a/packages/docusaurus-plugin/src/shiki.ts b/packages/docusaurus-plugin/src/shiki.ts index b467c3fbc36..28039fb581d 100644 --- a/packages/docusaurus-plugin/src/shiki.ts +++ b/packages/docusaurus-plugin/src/shiki.ts @@ -186,8 +186,7 @@ const remarkVisitor = md: 'markdown', txt: 'plaintext', }; - const resolvedLang = - langAliases[fence.lang] || fence.lang || 'plaintext'; + const resolvedLang = langAliases[fence.lang] || fence.lang || 'plaintext'; try { shikiHTML = highlighter.codeToHtml(node.value, { @@ -209,6 +208,19 @@ const remarkVisitor = ); } + // Inject title bar if fence has a title attribute + if (fence.meta.title && typeof fence.meta.title === 'string') { + const {title} = fence.meta; + shikiHTML = shikiHTML.replace( + '
]*>)/,
+				`$1
${title}
`, + ); + } + // @ts-expect-error node.type = 'mdxJsxFlowElement'; node.name = 'div'; diff --git a/packages/enable-scss/package.json b/packages/enable-scss/package.json index 3e4aa0da594..f41e01f3302 100644 --- a/packages/enable-scss/package.json +++ b/packages/enable-scss/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/enable-scss" }, "name": "@remotion/enable-scss", - "version": "4.0.424", + "version": "4.0.425", "description": "Enable SCSS support in Remotion", "main": "dist/cjs/index.js", "types": "dist/cjs/index.d.ts", diff --git a/packages/eslint-config-flat/package.json b/packages/eslint-config-flat/package.json index 5fd19b631cf..895fccb12a7 100644 --- a/packages/eslint-config-flat/package.json +++ b/packages/eslint-config-flat/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/eslint-config-flat" }, "name": "@remotion/eslint-config-flat", - "version": "4.0.424", + "version": "4.0.425", "description": "Default configuration for Remotion templates (ESLint >= 9)", "main": "dist/esm/index.mjs", "type": "module", diff --git a/packages/eslint-config-internal/package.json b/packages/eslint-config-internal/package.json index 1fba753f471..b7d5e5996ff 100644 --- a/packages/eslint-config-internal/package.json +++ b/packages/eslint-config-internal/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/eslint-config-internal" }, "name": "@remotion/eslint-config-internal", - "version": "4.0.424", + "version": "4.0.425", "license": "SEE LICENSE IN LICENSE.md", "main": "dist/index.js", "scripts": { diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json index 90eda3ea608..ecce80713bf 100644 --- a/packages/eslint-config/package.json +++ b/packages/eslint-config/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/eslint-config" }, "name": "@remotion/eslint-config", - "version": "4.0.424", + "version": "4.0.425", "description": "Default configuration for Remotion templates (ESLint <= 8)", "main": "dist/index.js", "files": [ diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index a225cca0eb6..645e776c49d 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/eslint-plugin" }, "name": "@remotion/eslint-plugin", - "version": "4.0.424", + "version": "4.0.425", "description": "Rules for writing Remotion code", "scripts": { "test": "node src/tests/execute.mjs", diff --git a/packages/example-videos/package.json b/packages/example-videos/package.json index 92e8eba53ec..65268748ed7 100644 --- a/packages/example-videos/package.json +++ b/packages/example-videos/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/example-videos" }, "name": "@remotion/example-videos", - "version": "4.0.424", + "version": "4.0.425", "main": "dist/index.js", "types": "dist/index.d.ts", "sideEffects": false, diff --git a/packages/example-without-zod/package.json b/packages/example-without-zod/package.json index 82aa24d4acd..531c75399df 100644 --- a/packages/example-without-zod/package.json +++ b/packages/example-without-zod/package.json @@ -4,7 +4,7 @@ }, "name": "@remotion/example-without-zod", "private": true, - "version": "4.0.424", + "version": "4.0.425", "license": "SEE LICENSE IN LICENSE.md", "author": "Jonny Burger", "main": "dist/index.js", diff --git a/packages/example/package.json b/packages/example/package.json index c40ebdf976a..5bbc1adf4da 100644 --- a/packages/example/package.json +++ b/packages/example/package.json @@ -4,7 +4,7 @@ }, "name": "@remotion/example", "private": true, - "version": "4.0.424", + "version": "4.0.425", "license": "SEE LICENSE IN LICENSE.md", "author": "Jonny Burger", "main": "dist/index.js", @@ -70,6 +70,7 @@ "@remotion/media-parser": "workspace:*", "@remotion/whisper-web": "workspace:*", "@remotion/zod-types": "workspace:*", + "@remotion/zod-types-v3": "workspace:*", "@shopify/react-native-skia": "2.0.0", "@types/express": "^4.17.11", "@types/hls.js": "^0.13.3", diff --git a/packages/example/src/Root.tsx b/packages/example/src/Root.tsx index 321665220f6..e7aed679c31 100644 --- a/packages/example/src/Root.tsx +++ b/packages/example/src/Root.tsx @@ -60,12 +60,7 @@ import RemoteVideo from './RemoteVideo'; import {RetryDelayRender} from './RetryDelayRender'; import RiveVehicle from './Rive/RiveExample'; import {ScalePath} from './ScalePath'; -import { - ArrayTest, - SchemaTest, - schemaArrayTestSchema, - schemaTestSchema, -} from './SchemaTest'; +import {SchemaTest, schemaTestSchema} from './SchemaTest'; import {Scripts} from './Scripts'; import {WidthHeightSequences} from './Sequence/WidthHeightSequences'; import CircleTest from './Shapes/CircleTest'; @@ -109,6 +104,7 @@ import {VideoTesting} from './VideoTesting'; import {WarpDemoOuter} from './WarpText'; import {WarpDemo2} from './WarpText/demo2'; import {WatchStaticDemo} from './watch-static'; +import {ZodV4SchemaTest, zodV4Schema} from './ZodV4SchemaTest'; if (alias !== 'alias') { throw new Error('should support TS aliases'); @@ -1497,16 +1493,23 @@ export const Index: React.FC = () => { durationInFrames={150} schema={schemaTestSchema} /> + diff --git a/packages/example/src/SchemaTest/index.tsx b/packages/example/src/SchemaTest/index.tsx index 66aa19fbc07..70e90184430 100644 --- a/packages/example/src/SchemaTest/index.tsx +++ b/packages/example/src/SchemaTest/index.tsx @@ -35,20 +35,6 @@ export const schemaTestSchema = z.object({ tuple: z.tuple([z.string(), z.number(), z.object({a: z.string()})]), }); -export const schemaArrayTestSchema = z.array(z.number()); - -export const ArrayTest: React.FC = () => { - return ( - - ); -}; - export const SchemaTest: React.FC> = ({ delay, title, diff --git a/packages/example/src/VisualControls/index.tsx b/packages/example/src/VisualControls/index.tsx index 0ea71d943a3..6fadb3d4e96 100644 --- a/packages/example/src/VisualControls/index.tsx +++ b/packages/example/src/VisualControls/index.tsx @@ -6,7 +6,7 @@ import {AbsoluteFill} from 'remotion'; export const VisualControls = () => { const matrix = visualControl( 'my-matrix', - [9.63, 0.83, 1.3, 0, 0, 2.79, 0, 0, 1.26, 0.35, 1, 0, 0, 0, 0, 1] as const, + [11.77, 1.49, 1.3, 0, 0, 2.79, 0, 0, 1.26, 0.35, 1, 0, 0, 0, 0, 1] as const, zMatrix(), ); diff --git a/packages/example/src/ZodV4SchemaTest.tsx b/packages/example/src/ZodV4SchemaTest.tsx new file mode 100644 index 00000000000..d1df194b74a --- /dev/null +++ b/packages/example/src/ZodV4SchemaTest.tsx @@ -0,0 +1,53 @@ +/** + * Test composition using zod v4 schema. + * Verifies that the studio schema editor works with zod v4. + */ +import React from 'react'; +import {AbsoluteFill} from 'remotion'; +import {z} from 'zod/v4'; + +export const zodV4Schema = z.object({ + greeting: z.string().default('Hello from Zod v4!'), + count: z.number().min(0).max(100), + enabled: z.boolean(), + items: z.array(z.object({label: z.string(), value: z.number()})), + mode: z.enum(['light', 'dark']), + optional: z.string().optional(), + nested: z.object({ + a: z.string(), + b: z.number(), + }), +}); + +export const ZodV4SchemaTest: React.FC> = ({ + greeting, + count, + enabled, + items, + mode, +}) => { + return ( + +
{greeting}
+
+ Count: {count} | Enabled: {String(enabled)} +
+
    + {items.map((item) => ( +
  • + {item.label}: {item.value} +
  • + ))} +
+
+ ); +}; diff --git a/packages/example/tsconfig.json b/packages/example/tsconfig.json index abf81d2eeb2..7be2fca483e 100644 --- a/packages/example/tsconfig.json +++ b/packages/example/tsconfig.json @@ -35,6 +35,7 @@ {"path": "../three"}, {"path": "../transitions"}, {"path": "../zod-types"}, + {"path": "../zod-types-v3"}, {"path": "../svg-3d-engine"}, {"path": "../media-parser"}, {"path": "../webcodecs"}, diff --git a/packages/fonts/package.json b/packages/fonts/package.json index 4fc60bcaf59..137c12f3c11 100644 --- a/packages/fonts/package.json +++ b/packages/fonts/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/fonts" }, "name": "@remotion/fonts", - "version": "4.0.424", + "version": "4.0.425", "description": "Helpers for loading local fonts into Remotion", "main": "dist/cjs/index.js", "types": "dist/cjs/index.d.ts", diff --git a/packages/gif/package.json b/packages/gif/package.json index ef78c646300..a9da6c32dc0 100644 --- a/packages/gif/package.json +++ b/packages/gif/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/gif" }, "name": "@remotion/gif", - "version": "4.0.424", + "version": "4.0.425", "description": "Embed GIFs in a Remotion video", "sideEffects": false, "bugs": { diff --git a/packages/google-fonts/package.json b/packages/google-fonts/package.json index 7794d5ca605..d1c281fe9ed 100644 --- a/packages/google-fonts/package.json +++ b/packages/google-fonts/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/google-fonts" }, "name": "@remotion/google-fonts", - "version": "4.0.424", + "version": "4.0.425", "description": "Use Google Fonts in Remotion", "main": "dist/cjs/index.js", "module": "dist/esm/index.mjs", @@ -620,6 +620,18 @@ "Besley": [ "dist/cjs/Besley.d.ts" ], + "BetaniaPatmos": [ + "dist/cjs/BetaniaPatmos.d.ts" + ], + "BetaniaPatmosGDL": [ + "dist/cjs/BetaniaPatmosGDL.d.ts" + ], + "BetaniaPatmosIn": [ + "dist/cjs/BetaniaPatmosIn.d.ts" + ], + "BetaniaPatmosInGDL": [ + "dist/cjs/BetaniaPatmosInGDL.d.ts" + ], "BethEllen": [ "dist/cjs/BethEllen.d.ts" ], @@ -1826,6 +1838,9 @@ "Gurajada": [ "dist/cjs/Gurajada.d.ts" ], + "GveretLevin": [ + "dist/cjs/GveretLevin.d.ts" + ], "Gwendolyn": [ "dist/cjs/Gwendolyn.d.ts" ], @@ -2015,6 +2030,9 @@ "Iceland": [ "dist/cjs/Iceland.d.ts" ], + "Idiqlat": [ + "dist/cjs/Idiqlat.d.ts" + ], "Imbue": [ "dist/cjs/Imbue.d.ts" ], @@ -4199,6 +4217,9 @@ "RampartOne": [ "dist/cjs/RampartOne.d.ts" ], + "Ramsina": [ + "dist/cjs/Ramsina.d.ts" + ], "Ranchers": [ "dist/cjs/Ranchers.d.ts" ], diff --git a/packages/google-fonts/scripts/google-fonts.ts b/packages/google-fonts/scripts/google-fonts.ts index d2483d78258..c1e3abca60c 100644 --- a/packages/google-fonts/scripts/google-fonts.ts +++ b/packages/google-fonts/scripts/google-fonts.ts @@ -4746,6 +4746,62 @@ export const googleFonts: Font[] = [ kind: 'webfonts#webfont', menu: 'https://fonts.gstatic.com/s/besley/v22/PlIhFlO1MaNwaNGWUC92IOH_mtG4fbbBedViFQ.woff2', }, + { + family: 'Betania Patmos', + variants: ['regular'], + subsets: ['latin', 'latin-ext'], + version: 'v2', + lastModified: '2026-02-17', + files: { + regular: + 'https://fonts.gstatic.com/s/betaniapatmos/v2/9oRXNYMTrDYnkuhOrHhyQracaunGNbEH8qpU.woff2', + }, + category: 'handwriting', + kind: 'webfonts#webfont', + menu: 'https://fonts.gstatic.com/s/betaniapatmos/v2/9oRXNYMTrDYnkuhOrHhyQracatnCP7A.woff2', + }, + { + family: 'Betania Patmos GDL', + variants: ['regular'], + subsets: ['latin', 'latin-ext'], + version: 'v2', + lastModified: '2026-02-17', + files: { + regular: + 'https://fonts.gstatic.com/s/betaniapatmosgdl/v2/-nFhOHE6_uoR4VYoynWSh_bKTCFIT7tx0vr352np3Q.woff2', + }, + category: 'handwriting', + kind: 'webfonts#webfont', + menu: 'https://fonts.gstatic.com/s/betaniapatmosgdl/v2/-nFhOHE6_uoR4VYoynWSh_bKTCFIT7tB1vD2.woff2', + }, + { + family: 'Betania Patmos In', + variants: ['regular'], + subsets: ['latin', 'latin-ext'], + version: 'v2', + lastModified: '2026-02-17', + files: { + regular: + 'https://fonts.gstatic.com/s/betaniapatmosin/v2/t5t6IQYdPp6dFAyhcz3W2MuHvhmmxLuDUBsTrn5P.woff2', + }, + category: 'handwriting', + kind: 'webfonts#webfont', + menu: 'https://fonts.gstatic.com/s/betaniapatmosin/v2/t5t6IQYdPp6dFAyhcz3W2MuHvhmmxIuHWho.woff2', + }, + { + family: 'Betania Patmos In GDL', + variants: ['regular'], + subsets: ['latin', 'latin-ext'], + version: 'v2', + lastModified: '2026-02-17', + files: { + regular: + 'https://fonts.gstatic.com/s/betaniapatmosingdl/v2/va9Y4lzJyMBdF8kOQbYe5MWhMhe2GnyJ0wb2GFPMgLIQTg.woff2', + }, + category: 'handwriting', + kind: 'webfonts#webfont', + menu: 'https://fonts.gstatic.com/s/betaniapatmosingdl/v2/va9Y4lzJyMBdF8kOQbYe5MWhMhe2GnyJ0wbGHFnN.woff2', + }, { family: 'Beth Ellen', variants: ['regular'], @@ -14127,6 +14183,20 @@ export const googleFonts: Font[] = [ kind: 'webfonts#webfont', menu: 'https://fonts.gstatic.com/s/gurajada/v22/FwZY7-Qx308m-l-0Ke6B6Mk.woff2', }, + { + family: 'Gveret Levin', + variants: ['regular'], + subsets: ['hebrew', 'latin'], + version: 'v4', + lastModified: '2026-02-17', + files: { + regular: + 'https://fonts.gstatic.com/s/gveretlevin/v4/0QInMXVI5YS9Rnn7ar449p-O9pbS8ANesw.woff2', + }, + category: 'handwriting', + kind: 'webfonts#webfont', + menu: 'https://fonts.gstatic.com/s/gveretlevin/v4/0QInMXVI5YS9Rnn7ar449p--8pzT.woff2', + }, { family: 'Gwendolyn', variants: ['regular', '700'], @@ -15643,6 +15713,24 @@ export const googleFonts: Font[] = [ kind: 'webfonts#webfont', menu: 'https://fonts.gstatic.com/s/iceland/v22/rax9HiuFsdMNOnWPaK1MAQ.woff2', }, + { + family: 'Idiqlat', + variants: ['200', '300', 'regular'], + subsets: ['latin', 'syriac'], + version: 'v2', + lastModified: '2026-02-17', + files: { + '200': + 'https://fonts.gstatic.com/s/idiqlat/v2/YA9Wr0ef50XNM6kiAOrKkiQqs7GtlvY.woff2', + '300': + 'https://fonts.gstatic.com/s/idiqlat/v2/YA9Wr0ef50XNM6kiAI7JkiQqs7GtlvY.woff2', + regular: + 'https://fonts.gstatic.com/s/idiqlat/v2/YA9Tr0ef50XNM6kiOCfhtikBr7g.woff2', + }, + category: 'serif', + kind: 'webfonts#webfont', + menu: 'https://fonts.gstatic.com/s/idiqlat/v2/YA9Tr0ef50XNM6kiCCPrtw.woff2', + }, { family: 'Imbue', variants: [ @@ -20569,15 +20657,15 @@ export const googleFonts: Font[] = [ family: 'Ma Shan Zheng', variants: ['regular'], subsets: ['chinese-simplified', 'latin'], - version: 'v14', - lastModified: '2025-09-08', + version: 'v17', + lastModified: '2026-02-17', files: { regular: - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMHsDIRSfr0.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMHsDIRSfr0.woff2', }, category: 'handwriting', kind: 'webfonts#webfont', - menu: 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXadMXmDQ.woff2', + menu: 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXadMXmDQ.woff2', }, { family: 'Macondo', @@ -21321,105 +21409,105 @@ export const googleFonts: Font[] = [ family: 'Material Symbols', variants: ['100', '200', '300', 'regular', '500', '600', '700'], subsets: ['latin'], - version: 'v42', - lastModified: '2026-02-10', + version: 'v43', + lastModified: '2026-02-17', files: { '100': - 'https://fonts.gstatic.com/s/materialsymbols/v42/d6kSkb-sS9m3-i1LgQNcsFOOuLQXvG559b5GLMxCWRtThFK5gn7xw7XblIl2peTfMb7ONaa2_wzcUHR1Ukiw2RYw2vadH3BFk0G4701x-cU0BaNVXEHuQLn3PT2vOA.woff2', + 'https://fonts.gstatic.com/s/materialsymbols/v43/d6kSkb-sS9m3-i1LgQNcsFOOuLQXvG559b5GLMxCWRtThFK5gn7xw7XblIl2peTfMb7ONaa2_wzcUHR1Ukiw2RYw2vadH3BFk0G4701x-cU0BaNVXEHuQLn3PT2vOA.woff2', '200': - 'https://fonts.gstatic.com/s/materialsymbols/v42/d6kSkb-sS9m3-i1LgQNcsFOOuLQXvG559b5GLMxCWRtThFK5gn7xw7XblIl2peTfMb7ONaa2_wzcUHR1Ukiw2RYw2vadH3BFk0G4701x-cU0BaNV3EDuQLn3PT2vOA.woff2', + 'https://fonts.gstatic.com/s/materialsymbols/v43/d6kSkb-sS9m3-i1LgQNcsFOOuLQXvG559b5GLMxCWRtThFK5gn7xw7XblIl2peTfMb7ONaa2_wzcUHR1Ukiw2RYw2vadH3BFk0G4701x-cU0BaNV3EDuQLn3PT2vOA.woff2', '300': - 'https://fonts.gstatic.com/s/materialsymbols/v42/d6kSkb-sS9m3-i1LgQNcsFOOuLQXvG559b5GLMxCWRtThFK5gn7xw7XblIl2peTfMb7ONaa2_wzcUHR1Ukiw2RYw2vadH3BFk0G4701x-cU0BaNVAkDuQLn3PT2vOA.woff2', + 'https://fonts.gstatic.com/s/materialsymbols/v43/d6kSkb-sS9m3-i1LgQNcsFOOuLQXvG559b5GLMxCWRtThFK5gn7xw7XblIl2peTfMb7ONaa2_wzcUHR1Ukiw2RYw2vadH3BFk0G4701x-cU0BaNVAkDuQLn3PT2vOA.woff2', '500': - 'https://fonts.gstatic.com/s/materialsymbols/v42/d6kSkb-sS9m3-i1LgQNcsFOOuLQXvG559b5GLMxCWRtThFK5gn7xw7XblIl2peTfMb7ONaa2_wzcUHR1Ukiw2RYw2vadH3BFk0G4701x-cU0BaNVbkDuQLn3PT2vOA.woff2', + 'https://fonts.gstatic.com/s/materialsymbols/v43/d6kSkb-sS9m3-i1LgQNcsFOOuLQXvG559b5GLMxCWRtThFK5gn7xw7XblIl2peTfMb7ONaa2_wzcUHR1Ukiw2RYw2vadH3BFk0G4701x-cU0BaNVbkDuQLn3PT2vOA.woff2', '600': - 'https://fonts.gstatic.com/s/materialsymbols/v42/d6kSkb-sS9m3-i1LgQNcsFOOuLQXvG559b5GLMxCWRtThFK5gn7xw7XblIl2peTfMb7ONaa2_wzcUHR1Ukiw2RYw2vadH3BFk0G4701x-cU0BaNVgkfuQLn3PT2vOA.woff2', + 'https://fonts.gstatic.com/s/materialsymbols/v43/d6kSkb-sS9m3-i1LgQNcsFOOuLQXvG559b5GLMxCWRtThFK5gn7xw7XblIl2peTfMb7ONaa2_wzcUHR1Ukiw2RYw2vadH3BFk0G4701x-cU0BaNVgkfuQLn3PT2vOA.woff2', '700': - 'https://fonts.gstatic.com/s/materialsymbols/v42/d6kSkb-sS9m3-i1LgQNcsFOOuLQXvG559b5GLMxCWRtThFK5gn7xw7XblIl2peTfMb7ONaa2_wzcUHR1Ukiw2RYw2vadH3BFk0G4701x-cU0BaNVu0fuQLn3PT2vOA.woff2', + 'https://fonts.gstatic.com/s/materialsymbols/v43/d6kSkb-sS9m3-i1LgQNcsFOOuLQXvG559b5GLMxCWRtThFK5gn7xw7XblIl2peTfMb7ONaa2_wzcUHR1Ukiw2RYw2vadH3BFk0G4701x-cU0BaNVu0fuQLn3PT2vOA.woff2', regular: - 'https://fonts.gstatic.com/s/materialsymbols/v42/d6kSkb-sS9m3-i1LgQNcsFOOuLQXvG559b5GLMxCWRtThFK5gn7xw7XblIl2peTfMb7ONaa2_wzcUHR1Ukiw2RYw2vadH3BFk0G4701x-cU0BaNVXEDuQLn3PT2vOA.woff2', + 'https://fonts.gstatic.com/s/materialsymbols/v43/d6kSkb-sS9m3-i1LgQNcsFOOuLQXvG559b5GLMxCWRtThFK5gn7xw7XblIl2peTfMb7ONaa2_wzcUHR1Ukiw2RYw2vadH3BFk0G4701x-cU0BaNVXEDuQLn3PT2vOA.woff2', }, category: 'monospace', kind: 'webfonts#webfont', - menu: 'https://fonts.gstatic.com/s/materialsymbols/v42/d6kSkb-sS9m3-i1LgQNcsFOOuLQXvG559b5GLMxCWRtThFK5gn7xw7XblIl2peTfMb7ONaa2_wzcUHR1Ukiw2RYw2vadH3BFk0G4701x-cU0BaNVXEDeRLP2.woff2', + menu: 'https://fonts.gstatic.com/s/materialsymbols/v43/d6kSkb-sS9m3-i1LgQNcsFOOuLQXvG559b5GLMxCWRtThFK5gn7xw7XblIl2peTfMb7ONaa2_wzcUHR1Ukiw2RYw2vadH3BFk0G4701x-cU0BaNVXEDeRLP2.woff2', }, { family: 'Material Symbols Outlined', variants: ['100', '200', '300', 'regular', '500', '600', '700'], subsets: ['latin'], - version: 'v314', - lastModified: '2026-02-10', + version: 'v315', + lastModified: '2026-02-17', files: { '100': - 'https://fonts.gstatic.com/s/materialsymbolsoutlined/v314/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDCvHeejbd5zrTgt.woff2', + 'https://fonts.gstatic.com/s/materialsymbolsoutlined/v315/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDCvHeejbd5zrTgt.woff2', '200': - 'https://fonts.gstatic.com/s/materialsymbolsoutlined/v314/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDAvHOejbd5zrTgt.woff2', + 'https://fonts.gstatic.com/s/materialsymbolsoutlined/v315/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDAvHOejbd5zrTgt.woff2', '300': - 'https://fonts.gstatic.com/s/materialsymbolsoutlined/v314/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDDxHOejbd5zrTgt.woff2', + 'https://fonts.gstatic.com/s/materialsymbolsoutlined/v315/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDDxHOejbd5zrTgt.woff2', '500': - 'https://fonts.gstatic.com/s/materialsymbolsoutlined/v314/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDCdHOejbd5zrTgt.woff2', + 'https://fonts.gstatic.com/s/materialsymbolsoutlined/v315/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDCdHOejbd5zrTgt.woff2', '600': - 'https://fonts.gstatic.com/s/materialsymbolsoutlined/v314/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDBxG-ejbd5zrTgt.woff2', + 'https://fonts.gstatic.com/s/materialsymbolsoutlined/v315/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDBxG-ejbd5zrTgt.woff2', '700': - 'https://fonts.gstatic.com/s/materialsymbolsoutlined/v314/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDBIG-ejbd5zrTgt.woff2', + 'https://fonts.gstatic.com/s/materialsymbolsoutlined/v315/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDBIG-ejbd5zrTgt.woff2', regular: - 'https://fonts.gstatic.com/s/materialsymbolsoutlined/v314/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDCvHOejbd5zrTgt.woff2', + 'https://fonts.gstatic.com/s/materialsymbolsoutlined/v315/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDCvHOejbd5zrTgt.woff2', }, category: 'monospace', kind: 'webfonts#webfont', - menu: 'https://fonts.gstatic.com/s/materialsymbolsoutlined/v314/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDCvHNenZ98.woff2', + menu: 'https://fonts.gstatic.com/s/materialsymbolsoutlined/v315/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDCvHNenZ98.woff2', }, { family: 'Material Symbols Rounded', variants: ['100', '200', '300', 'regular', '500', '600', '700'], subsets: ['latin'], - version: 'v316', - lastModified: '2026-02-10', + version: 'v317', + lastModified: '2026-02-17', files: { '100': - 'https://fonts.gstatic.com/s/materialsymbolsrounded/v316/syl0-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvDmUSVOK7BDB_Qb9vUSzq3wzLK-P0J-V_Zs-QtQth3-jOcbTCVpeRL2w5rwZu2rIekXxeJKJBjAa8.woff2', + 'https://fonts.gstatic.com/s/materialsymbolsrounded/v317/syl0-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvDmUSVOK7BDB_Qb9vUSzq3wzLK-P0J-V_Zs-QtQth3-jOcbTCVpeRL2w5rwZu2rIekXxeJKJBjAa8.woff2', '200': - 'https://fonts.gstatic.com/s/materialsymbolsrounded/v316/syl0-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvDmUSVOK7BDB_Qb9vUSzq3wzLK-P0J-V_Zs-QtQth3-jOcbTCVpeRL2w5rwZu2rAelXxeJKJBjAa8.woff2', + 'https://fonts.gstatic.com/s/materialsymbolsrounded/v317/syl0-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvDmUSVOK7BDB_Qb9vUSzq3wzLK-P0J-V_Zs-QtQth3-jOcbTCVpeRL2w5rwZu2rAelXxeJKJBjAa8.woff2', '300': - 'https://fonts.gstatic.com/s/materialsymbolsrounded/v316/syl0-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvDmUSVOK7BDB_Qb9vUSzq3wzLK-P0J-V_Zs-QtQth3-jOcbTCVpeRL2w5rwZu2rNmlXxeJKJBjAa8.woff2', + 'https://fonts.gstatic.com/s/materialsymbolsrounded/v317/syl0-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvDmUSVOK7BDB_Qb9vUSzq3wzLK-P0J-V_Zs-QtQth3-jOcbTCVpeRL2w5rwZu2rNmlXxeJKJBjAa8.woff2', '500': - 'https://fonts.gstatic.com/s/materialsymbolsrounded/v316/syl0-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvDmUSVOK7BDB_Qb9vUSzq3wzLK-P0J-V_Zs-QtQth3-jOcbTCVpeRL2w5rwZu2rLWlXxeJKJBjAa8.woff2', + 'https://fonts.gstatic.com/s/materialsymbolsrounded/v317/syl0-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvDmUSVOK7BDB_Qb9vUSzq3wzLK-P0J-V_Zs-QtQth3-jOcbTCVpeRL2w5rwZu2rLWlXxeJKJBjAa8.woff2', '600': - 'https://fonts.gstatic.com/s/materialsymbolsrounded/v316/syl0-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvDmUSVOK7BDB_Qb9vUSzq3wzLK-P0J-V_Zs-QtQth3-jOcbTCVpeRL2w5rwZu2rFmiXxeJKJBjAa8.woff2', + 'https://fonts.gstatic.com/s/materialsymbolsrounded/v317/syl0-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvDmUSVOK7BDB_Qb9vUSzq3wzLK-P0J-V_Zs-QtQth3-jOcbTCVpeRL2w5rwZu2rFmiXxeJKJBjAa8.woff2', '700': - 'https://fonts.gstatic.com/s/materialsymbolsrounded/v316/syl0-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvDmUSVOK7BDB_Qb9vUSzq3wzLK-P0J-V_Zs-QtQth3-jOcbTCVpeRL2w5rwZu2rGCiXxeJKJBjAa8.woff2', + 'https://fonts.gstatic.com/s/materialsymbolsrounded/v317/syl0-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvDmUSVOK7BDB_Qb9vUSzq3wzLK-P0J-V_Zs-QtQth3-jOcbTCVpeRL2w5rwZu2rGCiXxeJKJBjAa8.woff2', regular: - 'https://fonts.gstatic.com/s/materialsymbolsrounded/v316/syl0-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvDmUSVOK7BDB_Qb9vUSzq3wzLK-P0J-V_Zs-QtQth3-jOcbTCVpeRL2w5rwZu2rIelXxeJKJBjAa8.woff2', + 'https://fonts.gstatic.com/s/materialsymbolsrounded/v317/syl0-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvDmUSVOK7BDB_Qb9vUSzq3wzLK-P0J-V_Zs-QtQth3-jOcbTCVpeRL2w5rwZu2rIelXxeJKJBjAa8.woff2', }, category: 'monospace', kind: 'webfonts#webfont', - menu: 'https://fonts.gstatic.com/s/materialsymbolsrounded/v316/syl0-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvDmUSVOK7BDB_Qb9vUSzq3wzLK-P0J-V_Zs-QtQth3-jOcbTCVpeRL2w5rwZu2rIelbxODKQ.woff2', + menu: 'https://fonts.gstatic.com/s/materialsymbolsrounded/v317/syl0-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190FjpZIvDmUSVOK7BDB_Qb9vUSzq3wzLK-P0J-V_Zs-QtQth3-jOcbTCVpeRL2w5rwZu2rIelbxODKQ.woff2', }, { family: 'Material Symbols Sharp', variants: ['100', '200', '300', 'regular', '500', '600', '700'], subsets: ['latin'], - version: 'v311', - lastModified: '2026-02-10', + version: 'v312', + lastModified: '2026-02-17', files: { '100': - 'https://fonts.gstatic.com/s/materialsymbolssharp/v311/gNNBW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4c2_whPnoY9ruReaU4bHmz74m0ZkGH-VBYe1x0TV6x4yFH8F-H5OdzEL3sVTgJtfbYxOLozCLJ1H7-knk.woff2', + 'https://fonts.gstatic.com/s/materialsymbolssharp/v312/gNNBW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4c2_whPnoY9ruReaU4bHmz74m0ZkGH-VBYe1x0TV6x4yFH8F-H5OdzEL3sVTgJtfbYxOLozCLJ1H7-knk.woff2', '200': - 'https://fonts.gstatic.com/s/materialsymbolssharp/v311/gNNBW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4c2_whPnoY9ruReaU4bHmz74m0ZkGH-VBYe1x0TV6x4yFH8F-H5OdzEL3sVTgJtfbYxMLojCLJ1H7-knk.woff2', + 'https://fonts.gstatic.com/s/materialsymbolssharp/v312/gNNBW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4c2_whPnoY9ruReaU4bHmz74m0ZkGH-VBYe1x0TV6x4yFH8F-H5OdzEL3sVTgJtfbYxMLojCLJ1H7-knk.woff2', '300': - 'https://fonts.gstatic.com/s/materialsymbolssharp/v311/gNNBW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4c2_whPnoY9ruReaU4bHmz74m0ZkGH-VBYe1x0TV6x4yFH8F-H5OdzEL3sVTgJtfbYxPVojCLJ1H7-knk.woff2', + 'https://fonts.gstatic.com/s/materialsymbolssharp/v312/gNNBW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4c2_whPnoY9ruReaU4bHmz74m0ZkGH-VBYe1x0TV6x4yFH8F-H5OdzEL3sVTgJtfbYxPVojCLJ1H7-knk.woff2', '500': - 'https://fonts.gstatic.com/s/materialsymbolssharp/v311/gNNBW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4c2_whPnoY9ruReaU4bHmz74m0ZkGH-VBYe1x0TV6x4yFH8F-H5OdzEL3sVTgJtfbYxO5ojCLJ1H7-knk.woff2', + 'https://fonts.gstatic.com/s/materialsymbolssharp/v312/gNNBW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4c2_whPnoY9ruReaU4bHmz74m0ZkGH-VBYe1x0TV6x4yFH8F-H5OdzEL3sVTgJtfbYxO5ojCLJ1H7-knk.woff2', '600': - 'https://fonts.gstatic.com/s/materialsymbolssharp/v311/gNNBW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4c2_whPnoY9ruReaU4bHmz74m0ZkGH-VBYe1x0TV6x4yFH8F-H5OdzEL3sVTgJtfbYxNVpTCLJ1H7-knk.woff2', + 'https://fonts.gstatic.com/s/materialsymbolssharp/v312/gNNBW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4c2_whPnoY9ruReaU4bHmz74m0ZkGH-VBYe1x0TV6x4yFH8F-H5OdzEL3sVTgJtfbYxNVpTCLJ1H7-knk.woff2', '700': - 'https://fonts.gstatic.com/s/materialsymbolssharp/v311/gNNBW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4c2_whPnoY9ruReaU4bHmz74m0ZkGH-VBYe1x0TV6x4yFH8F-H5OdzEL3sVTgJtfbYxNspTCLJ1H7-knk.woff2', + 'https://fonts.gstatic.com/s/materialsymbolssharp/v312/gNNBW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4c2_whPnoY9ruReaU4bHmz74m0ZkGH-VBYe1x0TV6x4yFH8F-H5OdzEL3sVTgJtfbYxNspTCLJ1H7-knk.woff2', regular: - 'https://fonts.gstatic.com/s/materialsymbolssharp/v311/gNNBW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4c2_whPnoY9ruReaU4bHmz74m0ZkGH-VBYe1x0TV6x4yFH8F-H5OdzEL3sVTgJtfbYxOLojCLJ1H7-knk.woff2', + 'https://fonts.gstatic.com/s/materialsymbolssharp/v312/gNNBW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4c2_whPnoY9ruReaU4bHmz74m0ZkGH-VBYe1x0TV6x4yFH8F-H5OdzEL3sVTgJtfbYxOLojCLJ1H7-knk.woff2', }, category: 'monospace', kind: 'webfonts#webfont', - menu: 'https://fonts.gstatic.com/s/materialsymbolssharp/v311/gNNBW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4c2_whPnoY9ruReaU4bHmz74m0ZkGH-VBYe1x0TV6x4yFH8F-H5OdzEL3sVTgJtfbYxOLogCPLVA.woff2', + menu: 'https://fonts.gstatic.com/s/materialsymbolssharp/v312/gNNBW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4c2_whPnoY9ruReaU4bHmz74m0ZkGH-VBYe1x0TV6x4yFH8F-H5OdzEL3sVTgJtfbYxOLogCPLVA.woff2', }, { family: 'Maven Pro', @@ -23822,15 +23910,15 @@ export const googleFonts: Font[] = [ family: 'Noto Color Emoji', variants: ['regular'], subsets: ['emoji'], - version: 'v38', - lastModified: '2026-01-07', + version: 'v39', + lastModified: '2026-02-17', files: { regular: - 'https://fonts.gstatic.com/s/notocoloremoji/v38/Yq6P-KqIXTD0t4D9z1ESnKM3-HpFabts79iz64w.woff2', + 'https://fonts.gstatic.com/s/notocoloremoji/v39/Yq6P-KqIXTD0t4D9z1ESnKM3-HpFabts79iz64w.woff2', }, category: 'sans-serif', kind: 'webfonts#webfont', - menu: 'https://fonts.gstatic.com/s/notocoloremoji/v38/Yq6P-KqIXTD0t4D9z1ESnKM3-HpFWb9m7g.woff2', + menu: 'https://fonts.gstatic.com/s/notocoloremoji/v39/Yq6P-KqIXTD0t4D9z1ESnKM3-HpFWb9m7g.woff2', colorCapabilities: ['COLRv1', 'SVG'], }, { @@ -34177,6 +34265,20 @@ export const googleFonts: Font[] = [ kind: 'webfonts#webfont', menu: 'https://fonts.gstatic.com/s/rampartone/v13/K2F1fZFGl_JSR1tAWNG9R5qhJy8.woff2', }, + { + family: 'Ramsina', + variants: ['regular'], + subsets: ['latin', 'syriac'], + version: 'v2', + lastModified: '2026-02-17', + files: { + regular: + 'https://fonts.gstatic.com/s/ramsina/v2/daaYSTE-LGmCbhP9-Ls1Q4mMrSg.woff2', + }, + category: 'serif', + kind: 'webfonts#webfont', + menu: 'https://fonts.gstatic.com/s/ramsina/v2/daaYSTE-LGmCbhP9yL8_Qg.woff2', + }, { family: 'Ranchers', variants: ['regular'], @@ -43236,15 +43338,15 @@ export const googleFonts: Font[] = [ family: 'ZCOOL KuaiLe', variants: ['regular'], subsets: ['chinese-simplified', 'latin'], - version: 'v20', - lastModified: '2025-09-16', + version: 'v22', + lastModified: '2026-02-17', files: { regular: - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo4zzoXhC2g.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo4zzoXhC2g.woff2', }, category: 'sans-serif', kind: 'webfonts#webfont', - menu: 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2mp4by.woff2', + menu: 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2mp4by.woff2', }, { family: 'ZCOOL QingKe HuangYou', diff --git a/packages/google-fonts/scripts/incompatible-fonts.ts b/packages/google-fonts/scripts/incompatible-fonts.ts index 6bff67c45b9..9a957ff74d6 100644 --- a/packages/google-fonts/scripts/incompatible-fonts.ts +++ b/packages/google-fonts/scripts/incompatible-fonts.ts @@ -1,120 +1,120 @@ export const incompatibleFonts = [ - "Chiron GoRound TC", "Chiron Hei HK", "Chiron Sung HK", + "Chiron GoRound TC", "Linefont", - "Material Icons Sharp", + "Material Icons", "Material Icons Outlined", "Material Icons Round", - "Material Icons", + "Material Icons Sharp", "Material Icons Two Tone", "Material Symbols", "Material Symbols Rounded", - "Material Symbols Sharp", "Material Symbols Outlined", + "Material Symbols Sharp", "Playwrite AR", "Playwrite AR Guides", "Playwrite AT", "Playwrite AT Guides", - "Playwrite AU QLD Guides", "Playwrite AU NSW Guides", - "Playwrite AU SA", + "Playwrite AU QLD", "Playwrite AU NSW", + "Playwrite AU QLD Guides", + "Playwrite AU SA", "Playwrite AU SA Guides", - "Playwrite AU QLD", "Playwrite AU TAS", "Playwrite AU TAS Guides", - "Playwrite AU VIC", - "Playwrite BE VLG", "Playwrite AU VIC Guides", "Playwrite BE VLG Guides", + "Playwrite AU VIC", + "Playwrite BE WAL", "Playwrite BE WAL Guides", + "Playwrite BE VLG", "Playwrite BR", - "Playwrite BE WAL", - "Playwrite BR Guides", "Playwrite CA", - "Playwrite CL", + "Playwrite BR Guides", "Playwrite CA Guides", - "Playwrite CL Guides", - "Playwrite CU", + "Playwrite CL", "Playwrite CO Guides", + "Playwrite CO", + "Playwrite CU", "Playwrite CU Guides", + "Playwrite CZ Guides", "Playwrite CZ", "Playwrite DE Grund", - "Playwrite CZ Guides", + "Playwrite CL Guides", "Playwrite DE Grund Guides", - "Playwrite DE LA", - "Playwrite CO", "Playwrite DE LA Guides", "Playwrite DE SAS", + "Playwrite DE LA", + "Playwrite DE SAS Guides", "Playwrite DE VA", "Playwrite DE VA Guides", "Playwrite DK Loopet", - "Playwrite DK Loopet Guides", - "Playwrite DE SAS Guides", - "Playwrite DK Uloopet Guides", "Playwrite DK Uloopet", - "Playwrite ES", - "Playwrite ES Deco", - "Playwrite ES Deco Guides", - "Playwrite ES Guides", + "Playwrite DK Uloopet Guides", + "Playwrite DK Loopet Guides", "Playwrite FR Moderne", + "Playwrite ES", "Playwrite FR Moderne Guides", "Playwrite FR Trad", + "Playwrite ES Guides", "Playwrite FR Trad Guides", - "Playwrite GB J", "Playwrite GB J Guides", "Playwrite GB S", - "Playwrite HR", + "Playwrite GB J", "Playwrite GB S Guides", "Playwrite HR Guides", - "Playwrite HR Lijeva", + "Playwrite HR", "Playwrite HR Lijeva Guides", - "Playwrite HU", "Playwrite HU Guides", + "Playwrite HR Lijeva", + "Playwrite HU", + "Playwrite ID", "Playwrite ID Guides", "Playwrite IE", "Playwrite IE Guides", - "Playwrite IN", - "Playwrite ID", - "Playwrite IS Guides", "Playwrite IN Guides", "Playwrite IS", + "Playwrite IS Guides", "Playwrite IT Moderna", "Playwrite IT Moderna Guides", "Playwrite IT Trad", + "Playwrite ES Deco", + "Playwrite IN", + "Playwrite MX Guides", "Playwrite MX", - "Playwrite IT Trad Guides", + "Playwrite NG Modern", + "Playwrite NG Modern Guides", + "Playwrite NO", "Playwrite NL Guides", "Playwrite NL", - "Playwrite NO", "Playwrite NZ", "Playwrite NO Guides", - "Playwrite MX Guides", - "Playwrite NG Modern Guides", - "Playwrite NG Modern", - "Playwrite NZ Basic", - "Playwrite PL Guides", "Playwrite NZ Guides", + "Playwrite PE", "Playwrite PE Guides", "Playwrite NZ Basic Guides", - "Playwrite PE", + "Playwrite NZ Basic", "Playwrite PL", - "Playwrite PT", + "Playwrite PL Guides", "Playwrite PT Guides", - "Playwrite TZ", - "Playwrite SK Guides", - "Playwrite RO Guides", + "Playwrite PT", + "Playwrite RO", "Playwrite SK", - "Playwrite TZ Guides", + "Playwrite RO Guides", + "Playwrite SK Guides", + "Playwrite TZ", "Playwrite US Modern", - "Playwrite US Trad", - "Playwrite RO", "Playwrite US Modern Guides", + "Playwrite ES Deco Guides", + "Playwrite US Trad", + "Playwrite IT Trad Guides", "Playwrite US Trad Guides", "Playwrite VN", + "Playwrite TZ Guides", "Playwrite VN Guides", - "Playwrite ZA Guides", "Playwrite ZA", + "Playwrite ZA Guides", "Wavefont" ]; \ No newline at end of file diff --git a/packages/google-fonts/src/BetaniaPatmos.ts b/packages/google-fonts/src/BetaniaPatmos.ts new file mode 100644 index 00000000000..036da85a0f0 --- /dev/null +++ b/packages/google-fonts/src/BetaniaPatmos.ts @@ -0,0 +1,46 @@ +import {loadFonts} from './base'; + +export const getInfo = () => ({ + fontFamily: 'Betania Patmos', + importName: 'BetaniaPatmos', + version: 'v2', + url: 'https://fonts.googleapis.com/css2?family=Betania+Patmos:ital,wght@0,400', + unicodeRanges: { + 'latin-ext': + 'U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF', + latin: + 'U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD', + }, + fonts: { + normal: { + '400': { + 'latin-ext': + 'https://fonts.gstatic.com/s/betaniapatmos/v2/9oRXNYMTrDYnkuhOrHhyQracatnKP7A38g.woff2', + latin: + 'https://fonts.gstatic.com/s/betaniapatmos/v2/9oRXNYMTrDYnkuhOrHhyQracatnEP7A.woff2', + }, + }, + }, + subsets: ['latin', 'latin-ext'], +}); + +export const fontFamily = 'Betania Patmos' as const; + +type Variants = { + normal: { + weights: '400'; + subsets: 'latin' | 'latin-ext'; + }; +}; + +export const loadFont = ( + style?: T, + options?: { + weights?: Variants[T]['weights'][]; + subsets?: Variants[T]['subsets'][]; + document?: Document; + ignoreTooManyRequestsWarning?: boolean; + }, +) => { + return loadFonts(getInfo(), style, options); +}; diff --git a/packages/google-fonts/src/BetaniaPatmosGDL.ts b/packages/google-fonts/src/BetaniaPatmosGDL.ts new file mode 100644 index 00000000000..9b0f6ab05a2 --- /dev/null +++ b/packages/google-fonts/src/BetaniaPatmosGDL.ts @@ -0,0 +1,46 @@ +import {loadFonts} from './base'; + +export const getInfo = () => ({ + fontFamily: 'Betania Patmos GDL', + importName: 'BetaniaPatmosGDL', + version: 'v2', + url: 'https://fonts.googleapis.com/css2?family=Betania+Patmos+GDL:ital,wght@0,400', + unicodeRanges: { + 'latin-ext': + 'U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF', + latin: + 'U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD', + }, + fonts: { + normal: { + '400': { + 'latin-ext': + 'https://fonts.gstatic.com/s/betaniapatmosgdl/v2/-nFhOHE6_uoR4VYoynWSh_bKTCFIT7tB3vD212k.woff2', + latin: + 'https://fonts.gstatic.com/s/betaniapatmosgdl/v2/-nFhOHE6_uoR4VYoynWSh_bKTCFIT7tB0PD2.woff2', + }, + }, + }, + subsets: ['latin', 'latin-ext'], +}); + +export const fontFamily = 'Betania Patmos GDL' as const; + +type Variants = { + normal: { + weights: '400'; + subsets: 'latin' | 'latin-ext'; + }; +}; + +export const loadFont = ( + style?: T, + options?: { + weights?: Variants[T]['weights'][]; + subsets?: Variants[T]['subsets'][]; + document?: Document; + ignoreTooManyRequestsWarning?: boolean; + }, +) => { + return loadFonts(getInfo(), style, options); +}; diff --git a/packages/google-fonts/src/BetaniaPatmosIn.ts b/packages/google-fonts/src/BetaniaPatmosIn.ts new file mode 100644 index 00000000000..eb7d7ea6d7d --- /dev/null +++ b/packages/google-fonts/src/BetaniaPatmosIn.ts @@ -0,0 +1,46 @@ +import {loadFonts} from './base'; + +export const getInfo = () => ({ + fontFamily: 'Betania Patmos In', + importName: 'BetaniaPatmosIn', + version: 'v2', + url: 'https://fonts.googleapis.com/css2?family=Betania+Patmos+In:ital,wght@0,400', + unicodeRanges: { + 'latin-ext': + 'U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF', + latin: + 'U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD', + }, + fonts: { + normal: { + '400': { + 'latin-ext': + 'https://fonts.gstatic.com/s/betaniapatmosin/v2/t5t6IQYdPp6dFAyhcz3W2MuHvhmmxIuPWhojrg.woff2', + latin: + 'https://fonts.gstatic.com/s/betaniapatmosin/v2/t5t6IQYdPp6dFAyhcz3W2MuHvhmmxIuBWho.woff2', + }, + }, + }, + subsets: ['latin', 'latin-ext'], +}); + +export const fontFamily = 'Betania Patmos In' as const; + +type Variants = { + normal: { + weights: '400'; + subsets: 'latin' | 'latin-ext'; + }; +}; + +export const loadFont = ( + style?: T, + options?: { + weights?: Variants[T]['weights'][]; + subsets?: Variants[T]['subsets'][]; + document?: Document; + ignoreTooManyRequestsWarning?: boolean; + }, +) => { + return loadFonts(getInfo(), style, options); +}; diff --git a/packages/google-fonts/src/BetaniaPatmosInGDL.ts b/packages/google-fonts/src/BetaniaPatmosInGDL.ts new file mode 100644 index 00000000000..75de49e1b1c --- /dev/null +++ b/packages/google-fonts/src/BetaniaPatmosInGDL.ts @@ -0,0 +1,46 @@ +import {loadFonts} from './base'; + +export const getInfo = () => ({ + fontFamily: 'Betania Patmos In GDL', + importName: 'BetaniaPatmosInGDL', + version: 'v2', + url: 'https://fonts.googleapis.com/css2?family=Betania+Patmos+In+GDL:ital,wght@0,400', + unicodeRanges: { + 'latin-ext': + 'U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF', + latin: + 'U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD', + }, + fonts: { + normal: { + '400': { + 'latin-ext': + 'https://fonts.gstatic.com/s/betaniapatmosingdl/v2/va9Y4lzJyMBdF8kOQbYe5MWhMhe2GnyJ0wbGFFnNsLI.woff2', + latin: + 'https://fonts.gstatic.com/s/betaniapatmosingdl/v2/va9Y4lzJyMBdF8kOQbYe5MWhMhe2GnyJ0wbGGlnN.woff2', + }, + }, + }, + subsets: ['latin', 'latin-ext'], +}); + +export const fontFamily = 'Betania Patmos In GDL' as const; + +type Variants = { + normal: { + weights: '400'; + subsets: 'latin' | 'latin-ext'; + }; +}; + +export const loadFont = ( + style?: T, + options?: { + weights?: Variants[T]['weights'][]; + subsets?: Variants[T]['subsets'][]; + document?: Document; + ignoreTooManyRequestsWarning?: boolean; + }, +) => { + return loadFonts(getInfo(), style, options); +}; diff --git a/packages/google-fonts/src/GveretLevin.ts b/packages/google-fonts/src/GveretLevin.ts new file mode 100644 index 00000000000..5414450e3b7 --- /dev/null +++ b/packages/google-fonts/src/GveretLevin.ts @@ -0,0 +1,46 @@ +import {loadFonts} from './base'; + +export const getInfo = () => ({ + fontFamily: 'Gveret Levin', + importName: 'GveretLevin', + version: 'v4', + url: 'https://fonts.googleapis.com/css2?family=Gveret+Levin:ital,wght@0,400', + unicodeRanges: { + hebrew: + 'U+0307-0308, U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F', + latin: + 'U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD', + }, + fonts: { + normal: { + '400': { + hebrew: + 'https://fonts.gstatic.com/s/gveretlevin/v4/0QInMXVI5YS9Rnn7ar449p--9pzTwAM.woff2', + latin: + 'https://fonts.gstatic.com/s/gveretlevin/v4/0QInMXVI5YS9Rnn7ar449p--9JzT.woff2', + }, + }, + }, + subsets: ['hebrew', 'latin'], +}); + +export const fontFamily = 'Gveret Levin' as const; + +type Variants = { + normal: { + weights: '400'; + subsets: 'hebrew' | 'latin'; + }; +}; + +export const loadFont = ( + style?: T, + options?: { + weights?: Variants[T]['weights'][]; + subsets?: Variants[T]['subsets'][]; + document?: Document; + ignoreTooManyRequestsWarning?: boolean; + }, +) => { + return loadFonts(getInfo(), style, options); +}; diff --git a/packages/google-fonts/src/Idiqlat.ts b/packages/google-fonts/src/Idiqlat.ts new file mode 100644 index 00000000000..32b9c51c866 --- /dev/null +++ b/packages/google-fonts/src/Idiqlat.ts @@ -0,0 +1,58 @@ +import {loadFonts} from './base'; + +export const getInfo = () => ({ + fontFamily: 'Idiqlat', + importName: 'Idiqlat', + version: 'v2', + url: 'https://fonts.googleapis.com/css2?family=Idiqlat:ital,wght@0,200;0,300;0,400', + unicodeRanges: { + syriac: + 'U+0303-0304, U+0307-0308, U+030A, U+0320, U+0323-0325, U+032D-032E, U+0330-0331, U+060C, U+061B-061C, U+061F, U+0621, U+0640, U+064B-0655, U+0660-066C, U+0670, U+0700-074F, U+0860-086A, U+1DF8, U+1DFA, U+200C-200F, U+25CC, U+2670-2671', + latin: + 'U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD', + }, + fonts: { + normal: { + '200': { + syriac: + 'https://fonts.gstatic.com/s/idiqlat/v2/YA9Wr0ef50XNM6kiAOrKolUgsoGt.woff2', + latin: + 'https://fonts.gstatic.com/s/idiqlat/v2/YA9Wr0ef50XNM6kiAOrKoiYgsg.woff2', + }, + '300': { + syriac: + 'https://fonts.gstatic.com/s/idiqlat/v2/YA9Wr0ef50XNM6kiAI7JolUgsoGt.woff2', + latin: + 'https://fonts.gstatic.com/s/idiqlat/v2/YA9Wr0ef50XNM6kiAI7JoiYgsg.woff2', + }, + '400': { + syriac: + 'https://fonts.gstatic.com/s/idiqlat/v2/YA9Tr0ef50XNM6kiCFbrtxkB.woff2', + latin: + 'https://fonts.gstatic.com/s/idiqlat/v2/YA9Tr0ef50XNM6kiCCXrtw.woff2', + }, + }, + }, + subsets: ['latin', 'syriac'], +}); + +export const fontFamily = 'Idiqlat' as const; + +type Variants = { + normal: { + weights: '200' | '300' | '400'; + subsets: 'latin' | 'syriac'; + }; +}; + +export const loadFont = ( + style?: T, + options?: { + weights?: Variants[T]['weights'][]; + subsets?: Variants[T]['subsets'][]; + document?: Document; + ignoreTooManyRequestsWarning?: boolean; + }, +) => { + return loadFonts(getInfo(), style, options); +}; diff --git a/packages/google-fonts/src/MaShanZheng.ts b/packages/google-fonts/src/MaShanZheng.ts index c26f06570a2..98127197530 100644 --- a/packages/google-fonts/src/MaShanZheng.ts +++ b/packages/google-fonts/src/MaShanZheng.ts @@ -3,7 +3,7 @@ import {loadFonts} from './base'; export const getInfo = () => ({ fontFamily: 'Ma Shan Zheng', importName: 'MaShanZheng', - version: 'v14', + version: 'v17', url: 'https://fonts.googleapis.com/css2?family=Ma+Shan+Zheng:ital,wght@0,400', unicodeRanges: { '[5]': @@ -195,189 +195,189 @@ export const getInfo = () => ({ normal: { '400': { '[5]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.5.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.5.woff2', '[6]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.6.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.6.woff2', '[21]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.21.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.21.woff2', '[22]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.22.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.22.woff2', '[23]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.23.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.23.woff2', '[24]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.24.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.24.woff2', '[25]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.25.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.25.woff2', '[26]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.26.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.26.woff2', '[27]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.27.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.27.woff2', '[28]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.28.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.28.woff2', '[29]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.29.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.29.woff2', '[30]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.30.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.30.woff2', '[31]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.31.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.31.woff2', '[32]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.32.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.32.woff2', '[33]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.33.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.33.woff2', '[34]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.34.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.34.woff2', '[35]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.35.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.35.woff2', '[36]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.36.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.36.woff2', '[37]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.37.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.37.woff2', '[38]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.38.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.38.woff2', '[39]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.39.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.39.woff2', '[40]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.40.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.40.woff2', '[41]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.41.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.41.woff2', '[42]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.42.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.42.woff2', '[43]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.43.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.43.woff2', '[44]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.44.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.44.woff2', '[45]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.45.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.45.woff2', '[46]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.46.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.46.woff2', '[47]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.47.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.47.woff2', '[48]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.48.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.48.woff2', '[49]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.49.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.49.woff2', '[50]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.50.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.50.woff2', '[51]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.51.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.51.woff2', '[52]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.52.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.52.woff2', '[53]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.53.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.53.woff2', '[54]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.54.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.54.woff2', '[55]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.55.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.55.woff2', '[56]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.56.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.56.woff2', '[57]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.57.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.57.woff2', '[58]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.58.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.58.woff2', '[59]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.59.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.59.woff2', '[60]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.60.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.60.woff2', '[61]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.61.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.61.woff2', '[62]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.62.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.62.woff2', '[63]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.63.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.63.woff2', '[64]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.64.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.64.woff2', '[65]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.65.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.65.woff2', '[66]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.66.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.66.woff2', '[67]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.67.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.67.woff2', '[68]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.68.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.68.woff2', '[69]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.69.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.69.woff2', '[70]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.70.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.70.woff2', '[71]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.71.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.71.woff2', '[72]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.72.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.72.woff2', '[73]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.73.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.73.woff2', '[74]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.74.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.74.woff2', '[75]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.75.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.75.woff2', '[76]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.76.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.76.woff2', '[77]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.77.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.77.woff2', '[78]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.78.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.78.woff2', '[79]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.79.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.79.woff2', '[80]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.80.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.80.woff2', '[81]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.81.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.81.woff2', '[82]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.82.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.82.woff2', '[83]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.83.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.83.woff2', '[84]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.84.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.84.woff2', '[85]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.85.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.85.woff2', '[90]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.90.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.90.woff2', '[91]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.91.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.91.woff2', '[97]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.97.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.97.woff2', '[99]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.99.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.99.woff2', '[100]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.100.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.100.woff2', '[101]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.101.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.101.woff2', '[102]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.102.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.102.woff2', '[103]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.103.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.103.woff2', '[104]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.104.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.104.woff2', '[105]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.105.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.105.woff2', '[106]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.106.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.106.woff2', '[107]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.107.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.107.woff2', '[108]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.108.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.108.woff2', '[109]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.109.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.109.woff2', '[110]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.110.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.110.woff2', '[111]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.111.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.111.woff2', '[112]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.112.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.112.woff2', '[113]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.113.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.113.woff2', '[114]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.114.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.114.woff2', '[115]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.115.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.115.woff2', '[116]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.116.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.116.woff2', '[117]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.117.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.117.woff2', '[118]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.118.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.118.woff2', '[119]': - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.119.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXaRMGEFoZJFdX0wQ5Xo5Hr21L9zCcRFhbSe5Nk0pIMuUkHEA.119.woff2', latin: - 'https://fonts.gstatic.com/s/mashanzheng/v14/NaPecZTRCLxvwo41b4gvzkXadMPmDQ.woff2', + 'https://fonts.gstatic.com/s/mashanzheng/v17/NaPecZTRCLxvwo41b4gvzkXadMPmDQ.woff2', }, }, }, diff --git a/packages/google-fonts/src/NotoColorEmoji.ts b/packages/google-fonts/src/NotoColorEmoji.ts index 8537e2494cc..6104136572a 100644 --- a/packages/google-fonts/src/NotoColorEmoji.ts +++ b/packages/google-fonts/src/NotoColorEmoji.ts @@ -3,7 +3,7 @@ import {loadFonts} from './base'; export const getInfo = () => ({ fontFamily: 'Noto Color Emoji', importName: 'NotoColorEmoji', - version: 'v38', + version: 'v39', url: 'https://fonts.googleapis.com/css2?family=Noto+Color+Emoji:ital,wght@0,400', unicodeRanges: { '[0]': 'U+1f1e6-1f1ff', @@ -30,25 +30,25 @@ export const getInfo = () => ({ normal: { '400': { '[0]': - 'https://fonts.gstatic.com/s/notocoloremoji/v38/Yq6P-KqIXTD0t4D9z1ESnKM3-HpFabsE4tq3luCC7p-aXxcn.0.woff2', + 'https://fonts.gstatic.com/s/notocoloremoji/v39/Yq6P-KqIXTD0t4D9z1ESnKM3-HpFabsE4tq3luCC7p-aXxcn.0.woff2', '[1]': - 'https://fonts.gstatic.com/s/notocoloremoji/v38/Yq6P-KqIXTD0t4D9z1ESnKM3-HpFabsE4tq3luCC7p-aXxcn.1.woff2', + 'https://fonts.gstatic.com/s/notocoloremoji/v39/Yq6P-KqIXTD0t4D9z1ESnKM3-HpFabsE4tq3luCC7p-aXxcn.1.woff2', '[2]': - 'https://fonts.gstatic.com/s/notocoloremoji/v38/Yq6P-KqIXTD0t4D9z1ESnKM3-HpFabsE4tq3luCC7p-aXxcn.2.woff2', + 'https://fonts.gstatic.com/s/notocoloremoji/v39/Yq6P-KqIXTD0t4D9z1ESnKM3-HpFabsE4tq3luCC7p-aXxcn.2.woff2', '[3]': - 'https://fonts.gstatic.com/s/notocoloremoji/v38/Yq6P-KqIXTD0t4D9z1ESnKM3-HpFabsE4tq3luCC7p-aXxcn.3.woff2', + 'https://fonts.gstatic.com/s/notocoloremoji/v39/Yq6P-KqIXTD0t4D9z1ESnKM3-HpFabsE4tq3luCC7p-aXxcn.3.woff2', '[4]': - 'https://fonts.gstatic.com/s/notocoloremoji/v38/Yq6P-KqIXTD0t4D9z1ESnKM3-HpFabsE4tq3luCC7p-aXxcn.4.woff2', + 'https://fonts.gstatic.com/s/notocoloremoji/v39/Yq6P-KqIXTD0t4D9z1ESnKM3-HpFabsE4tq3luCC7p-aXxcn.4.woff2', '[5]': - 'https://fonts.gstatic.com/s/notocoloremoji/v38/Yq6P-KqIXTD0t4D9z1ESnKM3-HpFabsE4tq3luCC7p-aXxcn.5.woff2', + 'https://fonts.gstatic.com/s/notocoloremoji/v39/Yq6P-KqIXTD0t4D9z1ESnKM3-HpFabsE4tq3luCC7p-aXxcn.5.woff2', '[6]': - 'https://fonts.gstatic.com/s/notocoloremoji/v38/Yq6P-KqIXTD0t4D9z1ESnKM3-HpFabsE4tq3luCC7p-aXxcn.6.woff2', + 'https://fonts.gstatic.com/s/notocoloremoji/v39/Yq6P-KqIXTD0t4D9z1ESnKM3-HpFabsE4tq3luCC7p-aXxcn.6.woff2', '[7]': - 'https://fonts.gstatic.com/s/notocoloremoji/v38/Yq6P-KqIXTD0t4D9z1ESnKM3-HpFabsE4tq3luCC7p-aXxcn.7.woff2', + 'https://fonts.gstatic.com/s/notocoloremoji/v39/Yq6P-KqIXTD0t4D9z1ESnKM3-HpFabsE4tq3luCC7p-aXxcn.7.woff2', '[8]': - 'https://fonts.gstatic.com/s/notocoloremoji/v38/Yq6P-KqIXTD0t4D9z1ESnKM3-HpFabsE4tq3luCC7p-aXxcn.8.woff2', + 'https://fonts.gstatic.com/s/notocoloremoji/v39/Yq6P-KqIXTD0t4D9z1ESnKM3-HpFabsE4tq3luCC7p-aXxcn.8.woff2', '[9]': - 'https://fonts.gstatic.com/s/notocoloremoji/v38/Yq6P-KqIXTD0t4D9z1ESnKM3-HpFabsE4tq3luCC7p-aXxcn.9.woff2', + 'https://fonts.gstatic.com/s/notocoloremoji/v39/Yq6P-KqIXTD0t4D9z1ESnKM3-HpFabsE4tq3luCC7p-aXxcn.9.woff2', }, }, }, diff --git a/packages/google-fonts/src/Ramsina.ts b/packages/google-fonts/src/Ramsina.ts new file mode 100644 index 00000000000..7d48453b756 --- /dev/null +++ b/packages/google-fonts/src/Ramsina.ts @@ -0,0 +1,46 @@ +import {loadFonts} from './base'; + +export const getInfo = () => ({ + fontFamily: 'Ramsina', + importName: 'Ramsina', + version: 'v2', + url: 'https://fonts.googleapis.com/css2?family=Ramsina:ital,wght@0,400', + unicodeRanges: { + syriac: + 'U+0303-0304, U+0307-0308, U+030A, U+0320, U+0323-0325, U+032D-032E, U+0330-0331, U+060C, U+061B-061C, U+061F, U+0621, U+0640, U+064B-0655, U+0660-066C, U+0670, U+0700-074F, U+0860-086A, U+1DF8, U+1DFA, U+200C-200F, U+25CC, U+2670-2671', + latin: + 'U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD', + }, + fonts: { + normal: { + '400': { + syriac: + 'https://fonts.gstatic.com/s/ramsina/v2/daaYSTE-LGmCbhP9yMo_QrmM.woff2', + latin: + 'https://fonts.gstatic.com/s/ramsina/v2/daaYSTE-LGmCbhP9yLk_Qg.woff2', + }, + }, + }, + subsets: ['latin', 'syriac'], +}); + +export const fontFamily = 'Ramsina' as const; + +type Variants = { + normal: { + weights: '400'; + subsets: 'latin' | 'syriac'; + }; +}; + +export const loadFont = ( + style?: T, + options?: { + weights?: Variants[T]['weights'][]; + subsets?: Variants[T]['subsets'][]; + document?: Document; + ignoreTooManyRequestsWarning?: boolean; + }, +) => { + return loadFonts(getInfo(), style, options); +}; diff --git a/packages/google-fonts/src/ZCOOLKuaiLe.ts b/packages/google-fonts/src/ZCOOLKuaiLe.ts index 042fb421275..58997717f15 100644 --- a/packages/google-fonts/src/ZCOOLKuaiLe.ts +++ b/packages/google-fonts/src/ZCOOLKuaiLe.ts @@ -3,7 +3,7 @@ import {loadFonts} from './base'; export const getInfo = () => ({ fontFamily: 'ZCOOL KuaiLe', importName: 'ZCOOLKuaiLe', - version: 'v20', + version: 'v22', url: 'https://fonts.googleapis.com/css2?family=ZCOOL+KuaiLe:ital,wght@0,400', unicodeRanges: { '[5]': @@ -140,6 +140,8 @@ export const getInfo = () => ({ 'U+4ea3, U+4ea5, U+4eb0-4eb1, U+4eb3-4eb6, U+4eb8-4eb9, U+4ebb-4ebe, U+4ec2-4ec4, U+4ec8-4ec9, U+4ecc, U+4ecf-4ed0, U+4ed2, U+4eda-4edb, U+4edd-4ee1, U+4ee6-4ee9, U+4eeb, U+4eee-4eef, U+4ef3-4ef5, U+4ef8-4efa, U+4efc, U+4f00, U+4f03-4f05, U+4f08-4f09, U+4f0b, U+4f0e, U+4f12-4f13, U+4f15, U+4f1b, U+4f1d, U+4f21-4f22, U+4f25, U+4f27-4f29, U+4f2b-4f2e, U+4f31-4f33, U+4f36-4f37, U+4f39, U+4f3e, U+4f40-4f41, U+4f43, U+4f47-4f49, U+4f54, U+4f57-4f58, U+4f5d-4f5e, U+4f61-4f62, U+4f64-4f65, U+4f67, U+4f6a, U+4f6e-4f6f, U+4f72, U+4f74-4f7e, U+4f80-4f82, U+4f84, U+4f89-4f8a, U+4f8e-4f98, U+4f9e, U+4fa1, U+4fa5, U+4fa9-4faa, U+4fac, U+4fb3, U+4fb6-4fb8, U+4fbd, U+4fc2, U+4fc5-4fc6, U+4fcd-4fce, U+4fd0', '[85]': 'U+3129, U+3131, U+3134, U+3137, U+3139, U+3141-3142, U+3145, U+3147-3148, U+314b, U+314d-314e, U+315c, U+3160-3161, U+3163-3164, U+3186, U+318d, U+3192, U+3196-3198, U+319e-319f, U+3220-3229, U+3231, U+3268, U+3297, U+3299, U+32a3, U+338e-338f, U+3395, U+339c-339e, U+33c4, U+33d1-33d2, U+33d5, U+3434, U+34dc, U+34ee, U+353e, U+355d, U+3566, U+3575, U+3592, U+35a0-35a1, U+35ad, U+35ce, U+36a2, U+36ab, U+38a8, U+3dab, U+3de7, U+3deb, U+3e1a, U+3f1b, U+3f6d, U+4495, U+4723, U+48fa, U+4ca3, U+4db6-4dbf, U+4e02, U+4e04-4e06, U+4e0c, U+4e0f, U+4e15, U+4e17, U+4e1f-4e21, U+4e26, U+4e29, U+4e2c, U+4e2f, U+4e31, U+4e35, U+4e37, U+4e3c, U+4e3f-4e42, U+4e44, U+4e46-4e47, U+4e57, U+4e5a-4e5c, U+4e64-4e65, U+4e67, U+4e69, U+4e6d, U+4e78, U+4e7f-4e82, U+4e85, U+4e87, U+4e8a, U+4e8d, U+4e93, U+4e96, U+4e98-4e99, U+4e9c, U+4e9e-4ea0, U+4ea2', + '[86]': + 'U+279f-27a2, U+27a4-27a5, U+27a8, U+27b0, U+27b2-27b3, U+27b9, U+27e8-27e9, U+27f6, U+2800, U+28ec, U+2913, U+2921-2922, U+2934-2935, U+2a2f, U+2b05-2b07, U+2b50, U+2b55, U+2bc5-2bc6, U+2e1c-2e1d, U+2ebb, U+2f00, U+2f08, U+2f24, U+2f2d, U+2f2f-2f30, U+2f3c, U+2f45, U+2f63-2f64, U+2f74, U+2f83, U+2f8f, U+2fbc, U+3003, U+3005-3007, U+3012-3013, U+301c-301e, U+3021, U+3023-3024, U+3030, U+3034-3035, U+3041, U+3043, U+3045, U+3047, U+3049, U+3056, U+3058, U+305c, U+305e, U+3062, U+306c, U+3074, U+3077, U+307a, U+307c-307d, U+3080, U+308e, U+3090-3091, U+3099-309b, U+309d-309e, U+30a5, U+30bc, U+30be, U+30c2, U+30c5, U+30cc, U+30d8, U+30e2, U+30e8, U+30ee, U+30f0-30f2, U+30f4-30f6, U+30fd-30fe, U+3105-3126, U+3128', '[90]': 'U+207c-2083, U+208c-208e, U+2092, U+20a6, U+20a8-20ad, U+20af, U+20b1, U+20b4-20b5, U+20b8-20ba, U+20bd, U+20db, U+20dd, U+20e0, U+20e3, U+2105, U+2109, U+2113, U+2116-2117, U+2120-2121, U+2126, U+212b, U+2133, U+2139, U+2194, U+2196-2199, U+21a0, U+21a9-21aa, U+21af, U+21b3, U+21b5, U+21ba-21bb, U+21c4, U+21ca, U+21cc, U+21d0-21d4, U+21e1, U+21e6-21e9, U+2200, U+2202, U+2205-2208, U+220f, U+2211-2212, U+2215, U+2217-2219, U+221d-2220, U+2223, U+2225, U+2227-222b, U+222e, U+2234-2237, U+223c-223d, U+2248, U+224c, U+2252, U+2256, U+2260-2261, U+2266-2267, U+226a-226b, U+226e-226f, U+2282-2283, U+2295, U+2297, U+2299, U+22a5, U+22b0-22b1, U+22b9, U+22bf, U+22c5-22c6, U+22ef, U+2304, U+2307, U+230b, U+2312-2314, U+2318, U+231a-231b, U+2323, U+239b, U+239d-239e, U+23a0, U+23e9', '[91]': @@ -195,189 +197,191 @@ export const getInfo = () => ({ normal: { '400': { '[5]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.5.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.5.woff2', '[6]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.6.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.6.woff2', '[21]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.21.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.21.woff2', '[22]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.22.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.22.woff2', '[23]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.23.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.23.woff2', '[24]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.24.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.24.woff2', '[25]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.25.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.25.woff2', '[26]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.26.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.26.woff2', '[27]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.27.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.27.woff2', '[28]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.28.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.28.woff2', '[29]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.29.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.29.woff2', '[30]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.30.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.30.woff2', '[31]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.31.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.31.woff2', '[32]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.32.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.32.woff2', '[33]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.33.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.33.woff2', '[34]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.34.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.34.woff2', '[35]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.35.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.35.woff2', '[36]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.36.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.36.woff2', '[37]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.37.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.37.woff2', '[38]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.38.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.38.woff2', '[39]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.39.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.39.woff2', '[40]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.40.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.40.woff2', '[41]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.41.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.41.woff2', '[42]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.42.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.42.woff2', '[43]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.43.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.43.woff2', '[44]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.44.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.44.woff2', '[45]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.45.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.45.woff2', '[46]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.46.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.46.woff2', '[47]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.47.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.47.woff2', '[48]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.48.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.48.woff2', '[49]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.49.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.49.woff2', '[50]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.50.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.50.woff2', '[51]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.51.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.51.woff2', '[52]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.52.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.52.woff2', '[53]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.53.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.53.woff2', '[54]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.54.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.54.woff2', '[55]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.55.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.55.woff2', '[56]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.56.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.56.woff2', '[57]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.57.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.57.woff2', '[58]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.58.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.58.woff2', '[59]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.59.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.59.woff2', '[60]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.60.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.60.woff2', '[61]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.61.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.61.woff2', '[62]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.62.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.62.woff2', '[63]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.63.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.63.woff2', '[64]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.64.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.64.woff2', '[65]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.65.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.65.woff2', '[66]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.66.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.66.woff2', '[67]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.67.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.67.woff2', '[68]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.68.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.68.woff2', '[69]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.69.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.69.woff2', '[70]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.70.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.70.woff2', '[71]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.71.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.71.woff2', '[72]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.72.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.72.woff2', '[73]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.73.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.73.woff2', '[74]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.74.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.74.woff2', '[75]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.75.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.75.woff2', '[76]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.76.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.76.woff2', '[77]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.77.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.77.woff2', '[78]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.78.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.78.woff2', '[79]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.79.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.79.woff2', '[80]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.80.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.80.woff2', '[81]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.81.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.81.woff2', '[82]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.82.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.82.woff2', '[83]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.83.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.83.woff2', '[84]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.84.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.84.woff2', '[85]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.85.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.85.woff2', + '[86]': + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.86.woff2', '[90]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.90.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.90.woff2', '[91]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.91.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.91.woff2', '[97]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.97.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.97.woff2', '[99]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.99.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.99.woff2', '[100]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.100.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.100.woff2', '[101]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.101.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.101.woff2', '[102]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.102.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.102.woff2', '[103]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.103.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.103.woff2', '[104]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.104.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.104.woff2', '[105]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.105.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.105.woff2', '[106]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.106.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.106.woff2', '[107]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.107.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.107.woff2', '[108]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.108.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.108.woff2', '[109]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.109.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.109.woff2', '[110]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.110.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.110.woff2', '[111]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.111.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.111.woff2', '[112]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.112.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.112.woff2', '[113]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.113.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.113.woff2', '[114]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.114.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.114.woff2', '[115]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.115.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.115.woff2', '[116]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.116.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.116.woff2', '[117]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.117.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.117.woff2', '[118]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.118.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.118.woff2', '[119]': - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.119.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2Wo-Tpo2MpsrpYU3EJjXfOiTrBdUtGm0PGsPHkbHZzpr3G.119.woff2', latin: - 'https://fonts.gstatic.com/s/zcoolkuaile/v20/tssqApdaRQokwFjFJjvM6h2moYby.woff2', + 'https://fonts.gstatic.com/s/zcoolkuaile/v22/tssqApdaRQokwFjFJjvM6h2moYby.woff2', }, }, }, diff --git a/packages/google-fonts/src/index.ts b/packages/google-fonts/src/index.ts index 23b41fd998d..575492f2022 100644 --- a/packages/google-fonts/src/index.ts +++ b/packages/google-fonts/src/index.ts @@ -1030,6 +1030,26 @@ export const getAvailableFonts = () => [ importName: 'Besley', load: () => import('./Besley') as Promise, }, + { + fontFamily: 'Betania Patmos', + importName: 'BetaniaPatmos', + load: () => import('./BetaniaPatmos') as Promise, + }, + { + fontFamily: 'Betania Patmos GDL', + importName: 'BetaniaPatmosGDL', + load: () => import('./BetaniaPatmosGDL') as Promise, + }, + { + fontFamily: 'Betania Patmos In', + importName: 'BetaniaPatmosIn', + load: () => import('./BetaniaPatmosIn') as Promise, + }, + { + fontFamily: 'Betania Patmos In GDL', + importName: 'BetaniaPatmosInGDL', + load: () => import('./BetaniaPatmosInGDL') as Promise, + }, { fontFamily: 'Beth Ellen', importName: 'BethEllen', @@ -3040,6 +3060,11 @@ export const getAvailableFonts = () => [ importName: 'Gurajada', load: () => import('./Gurajada') as Promise, }, + { + fontFamily: 'Gveret Levin', + importName: 'GveretLevin', + load: () => import('./GveretLevin') as Promise, + }, { fontFamily: 'Gwendolyn', importName: 'Gwendolyn', @@ -3355,6 +3380,11 @@ export const getAvailableFonts = () => [ importName: 'Iceland', load: () => import('./Iceland') as Promise, }, + { + fontFamily: 'Idiqlat', + importName: 'Idiqlat', + load: () => import('./Idiqlat') as Promise, + }, { fontFamily: 'Imbue', importName: 'Imbue', @@ -6996,6 +7026,11 @@ export const getAvailableFonts = () => [ importName: 'RampartOne', load: () => import('./RampartOne') as Promise, }, + { + fontFamily: 'Ramsina', + importName: 'Ramsina', + load: () => import('./Ramsina') as Promise, + }, { fontFamily: 'Ranchers', importName: 'Ranchers', diff --git a/packages/install-whisper-cpp/package.json b/packages/install-whisper-cpp/package.json index 9b73ee8f7d7..cfb96deb666 100644 --- a/packages/install-whisper-cpp/package.json +++ b/packages/install-whisper-cpp/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/install-whisper-cpp" }, "name": "@remotion/install-whisper-cpp", - "version": "4.0.424", + "version": "4.0.425", "description": "Helpers for installing and using Whisper.cpp", "main": "dist/index.js", "sideEffects": false, diff --git a/packages/it-tests/package.json b/packages/it-tests/package.json index 48ff83f4db3..100f464cef3 100644 --- a/packages/it-tests/package.json +++ b/packages/it-tests/package.json @@ -3,10 +3,10 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/it-tests" }, "name": "@remotion/it-tests", - "version": "4.0.424", + "version": "4.0.425", "license": "SEE LICENSE IN LICENSE.md", "scripts": { - "test": " node --test src/node-version/media-parser.mjs && bun test src/rendering --run", + "test": " node --test src/node-version/media-parser.mjs && bun test src/rendering --run --timeout 60000", "testssr": "bun test src/ssr src/bundle src/webcodecs src/templates src/monorepo --timeout 40000", "testlambda": "exit 0", "lint": "tsc -d", diff --git a/packages/it-tests/src/rendering/frame-accuracy.test.ts b/packages/it-tests/src/rendering/frame-accuracy.test.ts index 4f1675e6e57..b287a9610d7 100644 --- a/packages/it-tests/src/rendering/frame-accuracy.test.ts +++ b/packages/it-tests/src/rendering/frame-accuracy.test.ts @@ -1,46 +1,22 @@ import {expect, test} from 'bun:test'; import {getMissedFramesforCodec} from './test-utils'; -test( - 'should render correct frames from embedded videos - WebM onthread', - async () => { - const missedFrames = await getMissedFramesforCodec('webm', 'normal'); - expect(missedFrames).toBeLessThanOrEqual(8); - }, - { - timeout: 60000, - }, -); +test('should render correct frames from embedded videos - WebM onthread', async () => { + const missedFrames = await getMissedFramesforCodec('webm', 'normal'); + expect(missedFrames).toBeLessThanOrEqual(8); +}); -test( - 'should render correct frames from embedded videos - WebM offthread', - async () => { - const missedFrames = await getMissedFramesforCodec('webm', 'offthread'); - expect(missedFrames).toBe(0); - }, - { - timeout: 60000, - }, -); +test('should render correct frames from embedded videos - WebM offthread', async () => { + const missedFrames = await getMissedFramesforCodec('webm', 'offthread'); + expect(missedFrames).toBe(0); +}); -test( - 'should render correct frames from embedded videos - MP4 onthread', - async () => { - const missedFrames = await getMissedFramesforCodec('mp4', 'normal'); - expect(missedFrames).toBeLessThanOrEqual(8); - }, - { - timeout: 60000, - }, -); +test('should render correct frames from embedded videos - MP4 onthread', async () => { + const missedFrames = await getMissedFramesforCodec('mp4', 'normal'); + expect(missedFrames).toBeLessThanOrEqual(8); +}); -test( - 'should render correct frames from embedded videos - MP4 offthread', - async () => { - const missedFrames = await getMissedFramesforCodec('mp4', 'offthread'); - expect(missedFrames).toBe(0); - }, - { - timeout: 60000, - }, -); +test('should render correct frames from embedded videos - MP4 offthread', async () => { + const missedFrames = await getMissedFramesforCodec('mp4', 'offthread'); + expect(missedFrames).toBe(0); +}); diff --git a/packages/it-tests/src/templates/validate-templates.test.ts b/packages/it-tests/src/templates/validate-templates.test.ts index 85119d13233..ed1642b898b 100644 --- a/packages/it-tests/src/templates/validate-templates.test.ts +++ b/packages/it-tests/src/templates/validate-templates.test.ts @@ -38,12 +38,6 @@ describe('Templates should be valid', () => { expect(body.dependencies.react).toMatch(/^\^?19/); expect(body.dependencies['react-dom']).toMatch(/^\^?19/); - if ( - body.dependencies['zod'] && - !template.shortName.includes('Prompt to Motion Graphics') - ) { - expect(body.dependencies['zod']).toBe('3.22.3'); - } if (body.dependencies['@types/web']) { expect(body.dependencies['@types/web']).toInclude('0.0.166'); } diff --git a/packages/lambda-client/package.json b/packages/lambda-client/package.json index ea3addee4cc..e66af820311 100644 --- a/packages/lambda-client/package.json +++ b/packages/lambda-client/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/lambda-client" }, "name": "@remotion/lambda-client", - "version": "4.0.424", + "version": "4.0.425", "main": "dist/cjs/index.js", "sideEffects": false, "scripts": { diff --git a/packages/lambda-go-example/package.json b/packages/lambda-go-example/package.json index 1472e4e1e5a..95d4aa29a8d 100644 --- a/packages/lambda-go-example/package.json +++ b/packages/lambda-go-example/package.json @@ -4,6 +4,6 @@ }, "name": "@remotion/lambda-go-example", "private": true, - "version": "4.0.424", + "version": "4.0.425", "scripts": {} } diff --git a/packages/lambda-go/package.json b/packages/lambda-go/package.json index 6fa9dbedbf8..857061162c8 100644 --- a/packages/lambda-go/package.json +++ b/packages/lambda-go/package.json @@ -4,7 +4,7 @@ }, "name": "@remotion/lambda-go", "private": true, - "version": "4.0.424", + "version": "4.0.425", "scripts": { "lint": "node build.mjs", "publishprivate": "node publish.mjs" diff --git a/packages/lambda-go/version.go b/packages/lambda-go/version.go index d64a2fb0879..6e70e257f88 100644 --- a/packages/lambda-go/version.go +++ b/packages/lambda-go/version.go @@ -1,3 +1,3 @@ package lambda_go_sdk; -const VERSION = "4.0.424" \ No newline at end of file +const VERSION = "4.0.425" \ No newline at end of file diff --git a/packages/lambda-php-example/composer.json b/packages/lambda-php-example/composer.json index 88c131a5811..8b009b88344 100644 --- a/packages/lambda-php-example/composer.json +++ b/packages/lambda-php-example/composer.json @@ -19,6 +19,6 @@ ], "require": { "vlucas/phpdotenv": "^5.5", - "remotion/lambda": "4.0.424" + "remotion/lambda": "4.0.425" } } diff --git a/packages/lambda-php/composer.json b/packages/lambda-php/composer.json index 0a1cc61b974..8aa339ee7d2 100644 --- a/packages/lambda-php/composer.json +++ b/packages/lambda-php/composer.json @@ -1,7 +1,7 @@ { "name": "remotion/lambda", "type": "library", - "version": "4.0.424", + "version": "4.0.425", "description": "A PHP library for working with Remotion Lambda", "license": "proprietary", "autoload": { diff --git a/packages/lambda-php/composer.lock b/packages/lambda-php/composer.lock index fb722748596..44754acc8b2 100644 --- a/packages/lambda-php/composer.lock +++ b/packages/lambda-php/composer.lock @@ -1,2583 +1,2583 @@ { - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "5791cffc444d3883edf14579a984e777", - "packages": [ - { - "name": "aws/aws-crt-php", - "version": "v1.2.6", - "source": { - "type": "git", - "url": "https://github.com/awslabs/aws-crt-php.git", - "reference": "a63485b65b6b3367039306496d49737cf1995408" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/a63485b65b6b3367039306496d49737cf1995408", - "reference": "a63485b65b6b3367039306496d49737cf1995408", - "shasum": "" - }, - "require": { - "php": ">=5.5" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35||^5.6.3||^9.5", - "yoast/phpunit-polyfills": "^1.0" - }, - "suggest": { - "ext-awscrt": "Make sure you install awscrt native extension to use any of the functionality." - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "AWS SDK Common Runtime Team", - "email": "aws-sdk-common-runtime@amazon.com" - } - ], - "description": "AWS Common Runtime for PHP", - "homepage": "https://github.com/awslabs/aws-crt-php", - "keywords": [ - "amazon", - "aws", - "crt", - "sdk" - ], - "support": { - "issues": "https://github.com/awslabs/aws-crt-php/issues", - "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.6" - }, - "time": "2024-06-13T17:21:28+00:00" - }, - { - "name": "aws/aws-sdk-php", - "version": "3.322.5", - "source": { - "type": "git", - "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "968fe51da0854eac0e0aeac6ec8b86856c6bd83e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/968fe51da0854eac0e0aeac6ec8b86856c6bd83e", - "reference": "968fe51da0854eac0e0aeac6ec8b86856c6bd83e", - "shasum": "" - }, - "require": { - "aws/aws-crt-php": "^1.2.3", - "ext-json": "*", - "ext-pcre": "*", - "ext-simplexml": "*", - "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5", - "guzzlehttp/promises": "^1.4.0 || ^2.0", - "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", - "mtdowling/jmespath.php": "^2.6", - "php": ">=7.2.5", - "psr/http-message": "^1.0 || ^2.0" - }, - "require-dev": { - "andrewsville/php-token-reflection": "^1.4", - "aws/aws-php-sns-message-validator": "~1.0", - "behat/behat": "~3.0", - "composer/composer": "^1.10.22", - "dms/phpunit-arraysubset-asserts": "^0.4.0", - "doctrine/cache": "~1.4", - "ext-dom": "*", - "ext-openssl": "*", - "ext-pcntl": "*", - "ext-sockets": "*", - "nette/neon": "^2.3", - "paragonie/random_compat": ">= 2", - "phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5", - "psr/cache": "^1.0", - "psr/simple-cache": "^1.0", - "sebastian/comparator": "^1.2.3 || ^4.0", - "yoast/phpunit-polyfills": "^1.0" - }, - "suggest": { - "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications", - "doctrine/cache": "To use the DoctrineCacheAdapter", - "ext-curl": "To send requests using cURL", - "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages", - "ext-sockets": "To use client-side monitoring" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "Aws\\": "src/" - }, - "exclude-from-classmap": [ - "src/data/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Amazon Web Services", - "homepage": "http://aws.amazon.com" - } - ], - "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project", - "homepage": "http://aws.amazon.com/sdkforphp", - "keywords": [ - "amazon", - "aws", - "cloud", - "dynamodb", - "ec2", - "glacier", - "s3", - "sdk" - ], - "support": { - "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", - "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.322.5" - }, - "time": "2024-09-25T18:14:27+00:00" - }, - { - "name": "guzzlehttp/guzzle", - "version": "7.9.2", - "source": { - "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "d281ed313b989f213357e3be1a179f02196ac99b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", - "reference": "d281ed313b989f213357e3be1a179f02196ac99b", - "shasum": "" - }, - "require": { - "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0.3", - "guzzlehttp/psr7": "^2.7.0", - "php": "^7.2.5 || ^8.0", - "psr/http-client": "^1.0", - "symfony/deprecation-contracts": "^2.2 || ^3.0" - }, - "provide": { - "psr/http-client-implementation": "1.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "ext-curl": "*", - "guzzle/client-integration-tests": "3.0.2", - "php-http/message-factory": "^1.1", - "phpunit/phpunit": "^8.5.39 || ^9.6.20", - "psr/log": "^1.1 || ^2.0 || ^3.0" - }, - "suggest": { - "ext-curl": "Required for CURL handler support", - "ext-intl": "Required for Internationalized Domain Name (IDN) support", - "psr/log": "Required for using the Log middleware" - }, - "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - } - }, - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "GuzzleHttp\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Jeremy Lindblom", - "email": "jeremeamia@gmail.com", - "homepage": "https://github.com/jeremeamia" - }, - { - "name": "George Mponos", - "email": "gmponos@gmail.com", - "homepage": "https://github.com/gmponos" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://github.com/sagikazarmark" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - } - ], - "description": "Guzzle is a PHP HTTP client library", - "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "psr-18", - "psr-7", - "rest", - "web service" - ], - "support": { - "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.9.2" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", - "type": "tidelift" - } - ], - "time": "2024-07-24T11:22:20+00:00" - }, - { - "name": "guzzlehttp/promises", - "version": "2.0.3", - "source": { - "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", - "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", - "shasum": "" - }, - "require": { - "php": "^7.2.5 || ^8.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.39 || ^9.6.20" - }, - "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Promise\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - } - ], - "description": "Guzzle promises library", - "keywords": [ - "promise" - ], - "support": { - "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.3" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", - "type": "tidelift" - } - ], - "time": "2024-07-18T10:29:17+00:00" - }, - { - "name": "guzzlehttp/psr7", - "version": "2.7.0", - "source": { - "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", - "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", - "shasum": "" - }, - "require": { - "php": "^7.2.5 || ^8.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.1 || ^2.0", - "ralouphie/getallheaders": "^3.0" - }, - "provide": { - "psr/http-factory-implementation": "1.0", - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "http-interop/http-factory-tests": "0.9.0", - "phpunit/phpunit": "^8.5.39 || ^9.6.20" - }, - "suggest": { - "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" - }, - "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "George Mponos", - "email": "gmponos@gmail.com", - "homepage": "https://github.com/gmponos" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://github.com/sagikazarmark" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://sagikazarmark.hu" - } - ], - "description": "PSR-7 message implementation that also provides common utility methods", - "keywords": [ - "http", - "message", - "psr-7", - "request", - "response", - "stream", - "uri", - "url" - ], - "support": { - "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.7.0" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", - "type": "tidelift" - } - ], - "time": "2024-07-18T11:15:46+00:00" - }, - { - "name": "mtdowling/jmespath.php", - "version": "2.8.0", - "source": { - "type": "git", - "url": "https://github.com/jmespath/jmespath.php.git", - "reference": "a2a865e05d5f420b50cc2f85bb78d565db12a6bc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/a2a865e05d5f420b50cc2f85bb78d565db12a6bc", - "reference": "a2a865e05d5f420b50cc2f85bb78d565db12a6bc", - "shasum": "" - }, - "require": { - "php": "^7.2.5 || ^8.0", - "symfony/polyfill-mbstring": "^1.17" - }, - "require-dev": { - "composer/xdebug-handler": "^3.0.3", - "phpunit/phpunit": "^8.5.33" - }, - "bin": [ - "bin/jp.php" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.8-dev" - } - }, - "autoload": { - "files": [ - "src/JmesPath.php" - ], - "psr-4": { - "JmesPath\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Declaratively specify how to extract elements from a JSON document", - "keywords": [ - "json", - "jsonpath" - ], - "support": { - "issues": "https://github.com/jmespath/jmespath.php/issues", - "source": "https://github.com/jmespath/jmespath.php/tree/2.8.0" - }, - "time": "2024-09-04T18:46:31+00:00" - }, - { - "name": "psr/http-client", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-client.git", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", - "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP clients", - "homepage": "https://github.com/php-fig/http-client", - "keywords": [ - "http", - "http-client", - "psr", - "psr-18" - ], - "support": { - "source": "https://github.com/php-fig/http-client" - }, - "time": "2023-09-23T14:17:50+00:00" - }, - { - "name": "psr/http-factory", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-factory.git", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", - "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", - "shasum": "" - }, - "require": { - "php": ">=7.1", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", - "keywords": [ - "factory", - "http", - "message", - "psr", - "psr-17", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-factory" - }, - "time": "2024-04-15T12:06:14+00:00" - }, - { - "name": "psr/http-message", - "version": "2.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", - "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-message/tree/2.0" - }, - "time": "2023-04-04T09:54:51+00:00" - }, - { - "name": "ralouphie/getallheaders", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "120b605dfeb996808c31b6477290a714d356e822" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", - "reference": "120b605dfeb996808c31b6477290a714d356e822", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^5 || ^6.5" - }, - "type": "library", - "autoload": { - "files": [ - "src/getallheaders.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ralph Khattar", - "email": "ralph.khattar@gmail.com" - } - ], - "description": "A polyfill for getallheaders.", - "support": { - "issues": "https://github.com/ralouphie/getallheaders/issues", - "source": "https://github.com/ralouphie/getallheaders/tree/develop" - }, - "time": "2019-03-08T08:55:37+00:00" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v3.5.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", - "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, - "branch-alias": { - "dev-main": "3.5-dev" - } - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-04-18T09:32:20+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.31.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "provide": { - "ext-mbstring": "*" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-09-09T11:45:10+00:00" - } - ], - "packages-dev": [ - { - "name": "myclabs/deep-copy", - "version": "1.13.4", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", - "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3 <3.2.2" - }, - "require-dev": { - "doctrine/collections": "^1.6.8", - "doctrine/common": "^2.13.3 || ^3.2.2", - "phpspec/prophecy": "^1.10", - "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" - }, - "type": "library", - "autoload": { - "files": [ - "src/DeepCopy/deep_copy.php" - ], - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "time": "2025-08-01T08:46:24+00:00" - }, - { - "name": "nikic/php-parser", - "version": "v5.7.0", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", - "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-json": "*", - "ext-tokenizer": "*", - "php": ">=7.4" - }, - "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^9.0" - }, - "bin": [ - "bin/php-parse" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "PhpParser\\": "lib/PhpParser" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov" - } - ], - "description": "A PHP parser written in PHP", - "keywords": [ - "parser", - "php" - ], - "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" - }, - "time": "2025-12-06T11:56:16+00:00" - }, - { - "name": "phar-io/manifest", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "54750ef60c58e43759730615a392c31c80e23176" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", - "reference": "54750ef60c58e43759730615a392c31c80e23176", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-phar": "*", - "ext-xmlwriter": "*", - "phar-io/version": "^3.0.1", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.4" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2024-03-03T12:33:53+00:00" - }, - { - "name": "phar-io/version", - "version": "3.2.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.2.1" - }, - "time": "2022-02-21T01:04:05+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "10.1.16", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "7e308268858ed6baedc8704a304727d20bc07c77" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", - "reference": "7e308268858ed6baedc8704a304727d20bc07c77", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-xmlwriter": "*", - "nikic/php-parser": "^4.19.1 || ^5.1.0", - "php": ">=8.1", - "phpunit/php-file-iterator": "^4.1.0", - "phpunit/php-text-template": "^3.0.1", - "sebastian/code-unit-reverse-lookup": "^3.0.0", - "sebastian/complexity": "^3.2.0", - "sebastian/environment": "^6.1.0", - "sebastian/lines-of-code": "^2.0.2", - "sebastian/version": "^4.0.1", - "theseer/tokenizer": "^1.2.3" - }, - "require-dev": { - "phpunit/phpunit": "^10.1" - }, - "suggest": { - "ext-pcov": "PHP extension that provides line coverage", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "10.1.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-08-22T04:31:57+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "4.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", - "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-08-31T06:24:48+00:00" - }, - { - "name": "phpunit/php-invoker", - "version": "4.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", - "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "ext-pcntl": "*", - "phpunit/phpunit": "^10.0" - }, - "suggest": { - "ext-pcntl": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Invoke callables with a timeout", - "homepage": "https://github.com/sebastianbergmann/php-invoker/", - "keywords": [ - "process" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:56:09+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "3.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", - "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-08-31T14:07:24+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "6.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", - "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:57:52+00:00" - }, - { - "name": "phpunit/phpunit", - "version": "10.5.62", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "3f7dd5066ebde5809296a81f0b19e8b00e5aab49" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3f7dd5066ebde5809296a81f0b19e8b00e5aab49", - "reference": "3f7dd5066ebde5809296a81f0b19e8b00e5aab49", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.13.4", - "phar-io/manifest": "^2.0.4", - "phar-io/version": "^3.2.1", - "php": ">=8.1", - "phpunit/php-code-coverage": "^10.1.16", - "phpunit/php-file-iterator": "^4.1.0", - "phpunit/php-invoker": "^4.0.0", - "phpunit/php-text-template": "^3.0.1", - "phpunit/php-timer": "^6.0.0", - "sebastian/cli-parser": "^2.0.1", - "sebastian/code-unit": "^2.0.0", - "sebastian/comparator": "^5.0.5", - "sebastian/diff": "^5.1.1", - "sebastian/environment": "^6.1.0", - "sebastian/exporter": "^5.1.4", - "sebastian/global-state": "^6.0.2", - "sebastian/object-enumerator": "^5.0.0", - "sebastian/recursion-context": "^5.0.1", - "sebastian/type": "^4.0.0", - "sebastian/version": "^4.0.1" - }, - "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "10.5-dev" - } - }, - "autoload": { - "files": [ - "src/Framework/Assert/Functions.php" - ], - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.62" - }, - "funding": [ - { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", - "type": "tidelift" - } - ], - "time": "2026-01-27T05:32:38+00:00" - }, - { - "name": "sebastian/cli-parser", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", - "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for parsing CLI options", - "homepage": "https://github.com/sebastianbergmann/cli-parser", - "support": { - "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-02T07:12:49+00:00" - }, - { - "name": "sebastian/code-unit", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", - "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the PHP code units", - "homepage": "https://github.com/sebastianbergmann/code-unit", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:58:43+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", - "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:59:15+00:00" - }, - { - "name": "sebastian/comparator", - "version": "5.0.5", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "55dfef806eb7dfeb6e7a6935601fef866f8ca48d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55dfef806eb7dfeb6e7a6935601fef866f8ca48d", - "reference": "55dfef806eb7dfeb6e7a6935601fef866f8ca48d", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-mbstring": "*", - "php": ">=8.1", - "sebastian/diff": "^5.0", - "sebastian/exporter": "^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^10.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.5" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", - "type": "tidelift" - } - ], - "time": "2026-01-24T09:25:16+00:00" - }, - { - "name": "sebastian/complexity", - "version": "3.2.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "68ff824baeae169ec9f2137158ee529584553799" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", - "reference": "68ff824baeae169ec9f2137158ee529584553799", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for calculating the complexity of PHP code units", - "homepage": "https://github.com/sebastianbergmann/complexity", - "support": { - "issues": "https://github.com/sebastianbergmann/complexity/issues", - "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-12-21T08:37:17+00:00" - }, - { - "name": "sebastian/diff", - "version": "5.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", - "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0", - "symfony/process": "^6.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-02T07:15:17+00:00" - }, - { - "name": "sebastian/environment", - "version": "6.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", - "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "suggest": { - "ext-posix": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "https://github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-23T08:47:14+00:00" - }, - { - "name": "sebastian/exporter", - "version": "5.1.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "0735b90f4da94969541dac1da743446e276defa6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/0735b90f4da94969541dac1da743446e276defa6", - "reference": "0735b90f4da94969541dac1da743446e276defa6", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "php": ">=8.1", - "sebastian/recursion-context": "^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^10.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "https://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/exporter/issues", - "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", - "type": "tidelift" - } - ], - "time": "2025-09-24T06:09:11+00:00" - }, - { - "name": "sebastian/global-state", - "version": "6.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", - "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "sebastian/object-reflector": "^3.0", - "sebastian/recursion-context": "^5.0" - }, - "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "https://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-03-02T07:19:19+00:00" - }, - { - "name": "sebastian/lines-of-code", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", - "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for counting the lines of code in PHP source code", - "homepage": "https://github.com/sebastianbergmann/lines-of-code", - "support": { - "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-12-21T08:38:20+00:00" - }, - { - "name": "sebastian/object-enumerator", - "version": "5.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", - "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "sebastian/object-reflector": "^3.0", - "sebastian/recursion-context": "^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T07:08:32+00:00" - }, - { - "name": "sebastian/object-reflector", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", - "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T07:06:18+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "5.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "47e34210757a2f37a97dcd207d032e1b01e64c7a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/47e34210757a2f37a97dcd207d032e1b01e64c7a", - "reference": "47e34210757a2f37a97dcd207d032e1b01e64c7a", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "https://github.com/sebastianbergmann/recursion-context", - "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", - "type": "tidelift" - } - ], - "time": "2025-08-10T07:50:56+00:00" - }, - { - "name": "sebastian/type", - "version": "4.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", - "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", - "support": { - "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T07:10:45+00:00" - }, - { - "name": "sebastian/version", - "version": "4.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", - "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-07T11:34:05+00:00" - }, - { - "name": "theseer/tokenizer", - "version": "1.3.1", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", - "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "support": { - "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.3.1" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2025-11-17T20:03:58+00:00" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": {}, - "prefer-stable": false, - "prefer-lowest": false, - "platform": {}, - "platform-dev": {}, - "plugin-api-version": "2.6.0" + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "5791cffc444d3883edf14579a984e777", + "packages": [ + { + "name": "aws/aws-crt-php", + "version": "v1.2.6", + "source": { + "type": "git", + "url": "https://github.com/awslabs/aws-crt-php.git", + "reference": "a63485b65b6b3367039306496d49737cf1995408" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/a63485b65b6b3367039306496d49737cf1995408", + "reference": "a63485b65b6b3367039306496d49737cf1995408", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35||^5.6.3||^9.5", + "yoast/phpunit-polyfills": "^1.0" + }, + "suggest": { + "ext-awscrt": "Make sure you install awscrt native extension to use any of the functionality." + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "AWS SDK Common Runtime Team", + "email": "aws-sdk-common-runtime@amazon.com" + } + ], + "description": "AWS Common Runtime for PHP", + "homepage": "https://github.com/awslabs/aws-crt-php", + "keywords": [ + "amazon", + "aws", + "crt", + "sdk" + ], + "support": { + "issues": "https://github.com/awslabs/aws-crt-php/issues", + "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.6" + }, + "time": "2024-06-13T17:21:28+00:00" + }, + { + "name": "aws/aws-sdk-php", + "version": "3.322.5", + "source": { + "type": "git", + "url": "https://github.com/aws/aws-sdk-php.git", + "reference": "968fe51da0854eac0e0aeac6ec8b86856c6bd83e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/968fe51da0854eac0e0aeac6ec8b86856c6bd83e", + "reference": "968fe51da0854eac0e0aeac6ec8b86856c6bd83e", + "shasum": "" + }, + "require": { + "aws/aws-crt-php": "^1.2.3", + "ext-json": "*", + "ext-pcre": "*", + "ext-simplexml": "*", + "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5", + "guzzlehttp/promises": "^1.4.0 || ^2.0", + "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", + "mtdowling/jmespath.php": "^2.6", + "php": ">=7.2.5", + "psr/http-message": "^1.0 || ^2.0" + }, + "require-dev": { + "andrewsville/php-token-reflection": "^1.4", + "aws/aws-php-sns-message-validator": "~1.0", + "behat/behat": "~3.0", + "composer/composer": "^1.10.22", + "dms/phpunit-arraysubset-asserts": "^0.4.0", + "doctrine/cache": "~1.4", + "ext-dom": "*", + "ext-openssl": "*", + "ext-pcntl": "*", + "ext-sockets": "*", + "nette/neon": "^2.3", + "paragonie/random_compat": ">= 2", + "phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5", + "psr/cache": "^1.0", + "psr/simple-cache": "^1.0", + "sebastian/comparator": "^1.2.3 || ^4.0", + "yoast/phpunit-polyfills": "^1.0" + }, + "suggest": { + "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications", + "doctrine/cache": "To use the DoctrineCacheAdapter", + "ext-curl": "To send requests using cURL", + "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages", + "ext-sockets": "To use client-side monitoring" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Aws\\": "src/" + }, + "exclude-from-classmap": [ + "src/data/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Amazon Web Services", + "homepage": "http://aws.amazon.com" + } + ], + "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project", + "homepage": "http://aws.amazon.com/sdkforphp", + "keywords": [ + "amazon", + "aws", + "cloud", + "dynamodb", + "ec2", + "glacier", + "s3", + "sdk" + ], + "support": { + "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", + "issues": "https://github.com/aws/aws-sdk-php/issues", + "source": "https://github.com/aws/aws-sdk-php/tree/3.322.5" + }, + "time": "2024-09-25T18:14:27+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.9.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0.3", + "guzzlehttp/psr7": "^2.7.0", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.9.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2024-07-24T11:22:20+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", + "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2024-07-18T10:29:17+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.7.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.7.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2024-07-18T11:15:46+00:00" + }, + { + "name": "mtdowling/jmespath.php", + "version": "2.8.0", + "source": { + "type": "git", + "url": "https://github.com/jmespath/jmespath.php.git", + "reference": "a2a865e05d5f420b50cc2f85bb78d565db12a6bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/a2a865e05d5f420b50cc2f85bb78d565db12a6bc", + "reference": "a2a865e05d5f420b50cc2f85bb78d565db12a6bc", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-mbstring": "^1.17" + }, + "require-dev": { + "composer/xdebug-handler": "^3.0.3", + "phpunit/phpunit": "^8.5.33" + }, + "bin": [ + "bin/jp.php" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "files": [ + "src/JmesPath.php" + ], + "psr-4": { + "JmesPath\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Declaratively specify how to extract elements from a JSON document", + "keywords": [ + "json", + "jsonpath" + ], + "support": { + "issues": "https://github.com/jmespath/jmespath.php/issues", + "source": "https://github.com/jmespath/jmespath.php/tree/2.8.0" + }, + "time": "2024-09-04T18:46:31+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.5-dev" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + } + ], + "packages-dev": [ + { + "name": "myclabs/deep-copy", + "version": "1.13.4", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2025-08-01T08:46:24+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.7.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" + }, + "time": "2025-12-06T11:56:16+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "10.1.16", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "7e308268858ed6baedc8704a304727d20bc07c77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", + "reference": "7e308268858ed6baedc8704a304727d20bc07c77", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.19.1 || ^5.1.0", + "php": ">=8.1", + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-text-template": "^3.0.1", + "sebastian/code-unit-reverse-lookup": "^3.0.0", + "sebastian/complexity": "^3.2.0", + "sebastian/environment": "^6.1.0", + "sebastian/lines-of-code": "^2.0.2", + "sebastian/version": "^4.0.1", + "theseer/tokenizer": "^1.2.3" + }, + "require-dev": { + "phpunit/phpunit": "^10.1" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-08-22T04:31:57+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "4.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T06:24:48+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:56:09+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T14:07:24+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:57:52+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "10.5.62", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "3f7dd5066ebde5809296a81f0b19e8b00e5aab49" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3f7dd5066ebde5809296a81f0b19e8b00e5aab49", + "reference": "3f7dd5066ebde5809296a81f0b19e8b00e5aab49", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.13.4", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.1", + "phpunit/php-code-coverage": "^10.1.16", + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-invoker": "^4.0.0", + "phpunit/php-text-template": "^3.0.1", + "phpunit/php-timer": "^6.0.0", + "sebastian/cli-parser": "^2.0.1", + "sebastian/code-unit": "^2.0.0", + "sebastian/comparator": "^5.0.5", + "sebastian/diff": "^5.1.1", + "sebastian/environment": "^6.1.0", + "sebastian/exporter": "^5.1.4", + "sebastian/global-state": "^6.0.2", + "sebastian/object-enumerator": "^5.0.0", + "sebastian/recursion-context": "^5.0.1", + "sebastian/type": "^4.0.0", + "sebastian/version": "^4.0.1" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.5-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.62" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2026-01-27T05:32:38+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:12:49+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:58:43+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:59:15+00:00" + }, + { + "name": "sebastian/comparator", + "version": "5.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "55dfef806eb7dfeb6e7a6935601fef866f8ca48d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55dfef806eb7dfeb6e7a6935601fef866f8ca48d", + "reference": "55dfef806eb7dfeb6e7a6935601fef866f8ca48d", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/diff": "^5.0", + "sebastian/exporter": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" + } + ], + "time": "2026-01-24T09:25:16+00:00" + }, + { + "name": "sebastian/complexity", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "68ff824baeae169ec9f2137158ee529584553799" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", + "reference": "68ff824baeae169ec9f2137158ee529584553799", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-21T08:37:17+00:00" + }, + { + "name": "sebastian/diff", + "version": "5.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0", + "symfony/process": "^6.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:15:17+00:00" + }, + { + "name": "sebastian/environment", + "version": "6.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-23T08:47:14+00:00" + }, + { + "name": "sebastian/exporter", + "version": "5.1.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "0735b90f4da94969541dac1da743446e276defa6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/0735b90f4da94969541dac1da743446e276defa6", + "reference": "0735b90f4da94969541dac1da743446e276defa6", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", + "type": "tidelift" + } + ], + "time": "2025-09-24T06:09:11+00:00" + }, + { + "name": "sebastian/global-state", + "version": "6.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:19:19+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-21T08:38:20+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:08:32+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:06:18+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "5.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "47e34210757a2f37a97dcd207d032e1b01e64c7a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/47e34210757a2f37a97dcd207d032e1b01e64c7a", + "reference": "47e34210757a2f37a97dcd207d032e1b01e64c7a", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", + "type": "tidelift" + } + ], + "time": "2025-08-10T07:50:56+00:00" + }, + { + "name": "sebastian/type", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:10:45+00:00" + }, + { + "name": "sebastian/version", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-07T11:34:05+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.3.1" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2025-11-17T20:03:58+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": false, + "prefer-lowest": false, + "platform": {}, + "platform-dev": {}, + "plugin-api-version": "2.6.0" } diff --git a/packages/lambda-php/package.json b/packages/lambda-php/package.json index 206fde5571b..c5a46d58c8d 100644 --- a/packages/lambda-php/package.json +++ b/packages/lambda-php/package.json @@ -4,7 +4,7 @@ }, "name": "@remotion/lambda-php", "private": true, - "version": "4.0.424", + "version": "4.0.425", "scripts": { "lint": "node build.mjs", "publishprivate": "node publish.mjs" diff --git a/packages/lambda-php/src/Semantic.php b/packages/lambda-php/src/Semantic.php index b768135029e..60db25e7236 100644 --- a/packages/lambda-php/src/Semantic.php +++ b/packages/lambda-php/src/Semantic.php @@ -4,5 +4,5 @@ class Semantic { - public const VERSION = "4.0.424"; + public const VERSION = "4.0.425"; } \ No newline at end of file diff --git a/packages/lambda-python/package.json b/packages/lambda-python/package.json index 0c24fcb1464..a0bd4f23ba1 100644 --- a/packages/lambda-python/package.json +++ b/packages/lambda-python/package.json @@ -4,7 +4,7 @@ }, "name": "@remotion/lambda-python", "private": true, - "version": "4.0.424", + "version": "4.0.425", "scripts": { "publishprivate": "node publish.mjs" }, diff --git a/packages/lambda-python/remotion_lambda/version.py b/packages/lambda-python/remotion_lambda/version.py index 16fe619fd91..6e972127a85 100644 --- a/packages/lambda-python/remotion_lambda/version.py +++ b/packages/lambda-python/remotion_lambda/version.py @@ -1,2 +1,2 @@ # pylint: disable=missing-module-docstring, missing-final-newline -VERSION = "4.0.424" \ No newline at end of file +VERSION = "4.0.425" \ No newline at end of file diff --git a/packages/lambda-ruby/lib/remotion_lambda/version.rb b/packages/lambda-ruby/lib/remotion_lambda/version.rb index 2082105a73f..6ceaaac09d4 100644 --- a/packages/lambda-ruby/lib/remotion_lambda/version.rb +++ b/packages/lambda-ruby/lib/remotion_lambda/version.rb @@ -1 +1 @@ -VERSION = "4.0.424" \ No newline at end of file +VERSION = "4.0.425" \ No newline at end of file diff --git a/packages/lambda-ruby/package.json b/packages/lambda-ruby/package.json index 53ff4b1fc2d..1c94de50776 100644 --- a/packages/lambda-ruby/package.json +++ b/packages/lambda-ruby/package.json @@ -4,7 +4,7 @@ }, "name": "@remotion/lambda-ruby", "private": true, - "version": "4.0.424", + "version": "4.0.425", "scripts": { "publishprivate": "bun publish.ts" }, diff --git a/packages/lambda-ruby/remotion_lambda.gemspec b/packages/lambda-ruby/remotion_lambda.gemspec index ceda4996bc8..0c88e0e3fad 100644 --- a/packages/lambda-ruby/remotion_lambda.gemspec +++ b/packages/lambda-ruby/remotion_lambda.gemspec @@ -1,6 +1,6 @@ Gem::Specification.new do |s| s.name = "remotion_lambda" - s.version = "4.0.424" + s.version = "4.0.425" s.summary = "Remotion Lambda SDK" s.description = "A Ruby SDK for Remotion Lambda" s.authors = ["Jonny Burger"] diff --git a/packages/lambda/package.json b/packages/lambda/package.json index 7f57f76a8bd..6df7a3edff7 100644 --- a/packages/lambda/package.json +++ b/packages/lambda/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/lambda" }, "name": "@remotion/lambda", - "version": "4.0.424", + "version": "4.0.425", "description": "Render Remotion videos on AWS Lambda", "main": "dist/index.js", "sideEffects": false, diff --git a/packages/layout-utils/package.json b/packages/layout-utils/package.json index 8f29f5c32d1..86a157cc6c2 100644 --- a/packages/layout-utils/package.json +++ b/packages/layout-utils/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/layout-utils" }, "name": "@remotion/layout-utils", - "version": "4.0.424", + "version": "4.0.425", "description": "Utilities for working with layouts", "main": "dist/cjs/index.js", "types": "dist/cjs/index.d.ts", diff --git a/packages/licensing/package.json b/packages/licensing/package.json index 6723cca0d82..c8dccb159c1 100644 --- a/packages/licensing/package.json +++ b/packages/licensing/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/licensing" }, "name": "@remotion/licensing", - "version": "4.0.424", + "version": "4.0.425", "description": "Manage your Remotion.pro license", "main": "dist", "sideEffects": false, diff --git a/packages/light-leaks/package.json b/packages/light-leaks/package.json index 5f269810bbc..cc0cdddf103 100644 --- a/packages/light-leaks/package.json +++ b/packages/light-leaks/package.json @@ -1,6 +1,6 @@ { "name": "@remotion/light-leaks", - "version": "4.0.424", + "version": "4.0.425", "description": "Light leak effects for Remotion", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/lottie/package.json b/packages/lottie/package.json index ddc2eaca585..938a4c4b763 100644 --- a/packages/lottie/package.json +++ b/packages/lottie/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/lottie" }, "name": "@remotion/lottie", - "version": "4.0.424", + "version": "4.0.425", "description": "Include Lottie animations in Remotion", "main": "dist/cjs/index.js", "types": "dist/cjs/index.d.ts", diff --git a/packages/mcp/package.json b/packages/mcp/package.json index c64b374629b..9022bf5be54 100644 --- a/packages/mcp/package.json +++ b/packages/mcp/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/mcp" }, "name": "@remotion/mcp", - "version": "4.0.424", + "version": "4.0.425", "description": "Remotion's Model Context Protocol", "main": "dist/esm/index.mjs", "sideEffects": false, diff --git a/packages/media-parser/package.json b/packages/media-parser/package.json index 7651e52ee8a..9c506dd4a07 100644 --- a/packages/media-parser/package.json +++ b/packages/media-parser/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/media-parser" }, "name": "@remotion/media-parser", - "version": "4.0.424", + "version": "4.0.425", "main": "dist/index.js", "sideEffects": false, "scripts": { diff --git a/packages/media-parser/src/version.ts b/packages/media-parser/src/version.ts index 00e70c3a84d..d12a573d3a5 100644 --- a/packages/media-parser/src/version.ts +++ b/packages/media-parser/src/version.ts @@ -1,2 +1,2 @@ // Automatically generated on publish -export const VERSION = '4.0.424'; +export const VERSION = '4.0.425'; diff --git a/packages/media-utils/package.json b/packages/media-utils/package.json index 45f8ed25eac..dc3ac11c3f1 100644 --- a/packages/media-utils/package.json +++ b/packages/media-utils/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/media-utils" }, "name": "@remotion/media-utils", - "version": "4.0.424", + "version": "4.0.425", "description": "Utilities for working with media files", "main": "dist/index.js", "sideEffects": false, diff --git a/packages/media/package.json b/packages/media/package.json index 3b2b83a6bfe..eb968ae7d0d 100644 --- a/packages/media/package.json +++ b/packages/media/package.json @@ -1,6 +1,6 @@ { "name": "@remotion/media", - "version": "4.0.424", + "version": "4.0.425", "main": "dist/index.js", "types": "dist/index.d.ts", "module": "dist/esm/index.mjs", diff --git a/packages/motion-blur/package.json b/packages/motion-blur/package.json index 861f36a388b..d646fafffb7 100644 --- a/packages/motion-blur/package.json +++ b/packages/motion-blur/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/motion-blur" }, "name": "@remotion/motion-blur", - "version": "4.0.424", + "version": "4.0.425", "description": "Motion blur effect for Remotion", "main": "dist/cjs/index.js", "types": "dist/cjs/index.d.ts", diff --git a/packages/noise/package.json b/packages/noise/package.json index a385059f68f..0739bdbea0c 100644 --- a/packages/noise/package.json +++ b/packages/noise/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/noise" }, "name": "@remotion/noise", - "version": "4.0.424", + "version": "4.0.425", "description": "Noise generation functions", "main": "dist/cjs/index.js", "types": "dist/cjs/index.d.ts", diff --git a/packages/openai-whisper/package.json b/packages/openai-whisper/package.json index bfee3ec6943..031c9323bed 100644 --- a/packages/openai-whisper/package.json +++ b/packages/openai-whisper/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/openai-whisper" }, "name": "@remotion/openai-whisper", - "version": "4.0.424", + "version": "4.0.425", "description": "Work with the output of the OpenAI Whisper API", "main": "dist/index.js", "sideEffects": false, diff --git a/packages/paths/package.json b/packages/paths/package.json index 4cdf22949aa..3124e8b4bb8 100644 --- a/packages/paths/package.json +++ b/packages/paths/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/paths" }, "name": "@remotion/paths", - "version": "4.0.424", + "version": "4.0.425", "description": "Utilities for working with SVG paths", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/player-example/package.json b/packages/player-example/package.json index 9d20f69ab8a..b62e3f59052 100644 --- a/packages/player-example/package.json +++ b/packages/player-example/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/player-example" }, "name": "@remotion/player-example", - "version": "4.0.424", + "version": "4.0.425", "private": true, "author": "Jonny Burger ", "maintainers": [ diff --git a/packages/player/package.json b/packages/player/package.json index 2fc917014dc..0c82c79920a 100644 --- a/packages/player/package.json +++ b/packages/player/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/player" }, "name": "@remotion/player", - "version": "4.0.424", + "version": "4.0.425", "description": "React component for embedding a Remotion preview into your app", "main": "dist/cjs/index.js", "types": "dist/cjs/index.d.ts", diff --git a/packages/player/src/Player.tsx b/packages/player/src/Player.tsx index 67661b6338a..03bedf09d20 100644 --- a/packages/player/src/Player.tsx +++ b/packages/player/src/Player.tsx @@ -9,6 +9,7 @@ import React, { useState, } from 'react'; import type { + AnyZodObject, CompProps, LogLevel, PlayableMediaTag, @@ -16,7 +17,6 @@ import type { TimelineContextValue, } from 'remotion'; import {Composition, Internals} from 'remotion'; -import type {AnyZodObject} from 'zod'; import {PlayerEmitterProvider} from './EmitterProvider.js'; import type {RenderMuteButton} from './MediaVolumeSlider.js'; import type { diff --git a/packages/player/src/Thumbnail.tsx b/packages/player/src/Thumbnail.tsx index 22cb0d721a3..52f4b9e07e6 100644 --- a/packages/player/src/Thumbnail.tsx +++ b/packages/player/src/Thumbnail.tsx @@ -12,9 +12,13 @@ import { useRef, useState, } from 'react'; -import type {CompProps, LogLevel, TimelineContextValue} from 'remotion'; +import type { + AnyZodObject, + CompProps, + LogLevel, + TimelineContextValue, +} from 'remotion'; import {Internals, random} from 'remotion'; -import type {AnyZodObject} from 'zod'; import {ThumbnailEmitterContext} from './emitter-context.js'; import {ThumbnailEmitter} from './event-emitter.js'; import type {ThumbnailMethods} from './player-methods.js'; diff --git a/packages/player/src/utils/props-if-has-props.ts b/packages/player/src/utils/props-if-has-props.ts index 1431a9172c5..4523136e9e0 100644 --- a/packages/player/src/utils/props-if-has-props.ts +++ b/packages/player/src/utils/props-if-has-props.ts @@ -1,4 +1,12 @@ -import type {AnyZodObject, z} from 'zod'; +import type {AnyZodObject} from 'remotion'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +type InferZodInput = T extends {_zod: {input: any}} + ? T['_zod']['input'] + : // eslint-disable-next-line @typescript-eslint/no-explicit-any + T extends {_input: any} + ? T['_input'] + : Record; export type PropsIfHasProps< Schema extends AnyZodObject, @@ -7,7 +15,7 @@ export type PropsIfHasProps< ? {} extends Props ? { // Neither props nor schema specified - inputProps?: z.input & Props; + inputProps?: InferZodInput & Props; } : { // Only props specified @@ -16,9 +24,9 @@ export type PropsIfHasProps< : {} extends Props ? { // Only schema specified - inputProps: z.input; + inputProps: InferZodInput; } : { // Props and schema specified - inputProps: z.input & Props; + inputProps: InferZodInput & Props; }; diff --git a/packages/preload/package.json b/packages/preload/package.json index c152026c079..2cf4389463c 100644 --- a/packages/preload/package.json +++ b/packages/preload/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/preload" }, "name": "@remotion/preload", - "version": "4.0.424", + "version": "4.0.425", "description": "Preloads assets for use in Remotion", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/promo-pages/.npmignore b/packages/promo-pages/.npmignore index 64f89b690b1..9f7f8f5db60 100644 --- a/packages/promo-pages/.npmignore +++ b/packages/promo-pages/.npmignore @@ -4,4 +4,5 @@ eslint.config.mjs src server.ts vite.config.ts -tsconfig.json \ No newline at end of file +tsconfig.json +tsconfig.tsbuildinfo \ No newline at end of file diff --git a/packages/promo-pages/package.json b/packages/promo-pages/package.json index f9153e1f16d..8812b0d72f1 100644 --- a/packages/promo-pages/package.json +++ b/packages/promo-pages/package.json @@ -1,6 +1,6 @@ { "name": "@remotion/promo-pages", - "version": "4.0.424", + "version": "4.0.425", "publishConfig": { "access": "public" }, diff --git a/packages/promo-pages/src/components/homepage/CommunityStatsItems.tsx b/packages/promo-pages/src/components/homepage/CommunityStatsItems.tsx index b8e29bb163b..b8cac935ccf 100644 --- a/packages/promo-pages/src/components/homepage/CommunityStatsItems.tsx +++ b/packages/promo-pages/src/components/homepage/CommunityStatsItems.tsx @@ -177,7 +177,7 @@ export const GitHubStars: React.FC = () => { width="45px" /> {
GitHub{' '}
- {'36k'} + {'37k'}
); diff --git a/packages/react18-tests/package.json b/packages/react18-tests/package.json index c70491dc18b..b4506c59417 100644 --- a/packages/react18-tests/package.json +++ b/packages/react18-tests/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/react18-tests" }, "name": "@remotion/react18-tests", - "version": "4.0.424", + "version": "4.0.425", "main": "dist/index.js", "sideEffects": false, "scripts": { @@ -16,7 +16,10 @@ "author": "Remotion ", "license": "UNLICENSED", "dependencies": { - "remotion": "workspace:*" + "remotion": "workspace:*", + "zod": "3.22.3", + "@remotion/zod-types": "workspace:*", + "@remotion/zod-types-v3": "workspace:*" }, "devDependencies": { "@remotion/eslint-config-internal": "workspace:*", diff --git a/packages/react18-tests/src/test/Root.tsx b/packages/react18-tests/src/test/Root.tsx index 04561d70344..127b4ef7496 100644 --- a/packages/react18-tests/src/test/Root.tsx +++ b/packages/react18-tests/src/test/Root.tsx @@ -1,6 +1,7 @@ // bun run studio import React from 'react'; import {Composition} from 'remotion'; +import {ZodV3SchemaTest, zodV3Schema} from './ZodV3SchemaTest'; const TestComponent: React.FC = () => { return ( @@ -21,13 +22,31 @@ const TestComponent: React.FC = () => { export const Root: React.FC = () => { return ( - + <> + + + ); }; diff --git a/packages/react18-tests/src/test/ZodV3SchemaTest.tsx b/packages/react18-tests/src/test/ZodV3SchemaTest.tsx new file mode 100644 index 00000000000..18a627cb929 --- /dev/null +++ b/packages/react18-tests/src/test/ZodV3SchemaTest.tsx @@ -0,0 +1,45 @@ +/** + * Test composition using zod v3 schema (via zod/v3 import). + * Verifies that the studio schema editor works with zod v3 schemas. + */ +import {zMatrix} from '@remotion/zod-types-v3'; +import React from 'react'; +import {z} from 'zod'; + +export const zodV3Schema = z.object({ + title: z.string(), + count: z.number().min(0).max(100), + enabled: zMatrix(), + tags: z.array(z.string()), + level: z.enum(['beginner', 'intermediate', 'advanced']), +}); + +export const ZodV3SchemaTest: React.FC> = ({ + title, + count, + enabled, + tags, + level, +}) => { + return ( +
+
{title}
+
+ Count: {count} | Enabled: {String(enabled)} | Level: {level} +
+
Tags: {tags.join(', ')}
+
+ ); +}; diff --git a/packages/renderer/package.json b/packages/renderer/package.json index 714dc1af61f..7739bd151ad 100644 --- a/packages/renderer/package.json +++ b/packages/renderer/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/renderer" }, "name": "@remotion/renderer", - "version": "4.0.424", + "version": "4.0.425", "description": "Render Remotion videos using Node.js or Bun", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/rive/package.json b/packages/rive/package.json index 7f8f4dfbe93..23ac0de146c 100644 --- a/packages/rive/package.json +++ b/packages/rive/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/rive" }, "name": "@remotion/rive", - "version": "4.0.424", + "version": "4.0.425", "description": "Embed Rive animations in a Remotion video", "main": "dist/cjs/index.js", "types": "dist/cjs/index.d.ts", diff --git a/packages/rounded-text-box/package.json b/packages/rounded-text-box/package.json index de532bf49aa..58b75753d43 100644 --- a/packages/rounded-text-box/package.json +++ b/packages/rounded-text-box/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/rounded-text-box" }, "name": "@remotion/rounded-text-box", - "version": "4.0.424", + "version": "4.0.425", "description": "Create a TikTok-like multiline text box SVG path with rounded corners", "main": "dist/cjs/index.js", "types": "dist/cjs/index.d.ts", diff --git a/packages/serverless-client/package.json b/packages/serverless-client/package.json index be274f1f40f..db19ad5ed98 100644 --- a/packages/serverless-client/package.json +++ b/packages/serverless-client/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/serverless-client" }, "name": "@remotion/serverless-client", - "version": "4.0.424", + "version": "4.0.425", "main": "dist", "sideEffects": false, "scripts": { diff --git a/packages/serverless/package.json b/packages/serverless/package.json index 481ac7014bb..980c07bf666 100644 --- a/packages/serverless/package.json +++ b/packages/serverless/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/serverless" }, "name": "@remotion/serverless", - "version": "4.0.424", + "version": "4.0.425", "description": "A runtime for distributed rendering", "main": "dist", "sideEffects": false, diff --git a/packages/shapes/package.json b/packages/shapes/package.json index b355bf28ba5..5300eb4b666 100644 --- a/packages/shapes/package.json +++ b/packages/shapes/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/shapes" }, "name": "@remotion/shapes", - "version": "4.0.424", + "version": "4.0.425", "description": "Generate SVG shapes", "main": "dist/index.js", "sideEffects": false, diff --git a/packages/skia/package.json b/packages/skia/package.json index 5a9f8da2941..43a792a4b88 100644 --- a/packages/skia/package.json +++ b/packages/skia/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/skia" }, "name": "@remotion/skia", - "version": "4.0.424", + "version": "4.0.425", "description": "Include React Native Skia components in a Remotion video", "main": "dist/cjs/index.js", "types": "dist/cjs/index.d.ts", diff --git a/packages/skills/package.json b/packages/skills/package.json index 19b74d213de..7d871e621ee 100644 --- a/packages/skills/package.json +++ b/packages/skills/package.json @@ -7,7 +7,7 @@ }, "name": "@remotion/skills", "private": true, - "version": "4.0.424", + "version": "4.0.425", "devDependencies": { "@remotion/eslint-config-internal": "workspace:*", "eslint": "catalog:", diff --git a/packages/skills/skills/remotion/rules/parameters.md b/packages/skills/skills/remotion/rules/parameters.md index cffd64c3d68..8860800662b 100644 --- a/packages/skills/skills/remotion/rules/parameters.md +++ b/packages/skills/skills/remotion/rules/parameters.md @@ -7,32 +7,32 @@ metadata: To make a video parametrizable, a Zod schema can be added to a composition. -First, `zod` must be installed - it must be exactly version `3.22.3`. +First, `zod` must be installed . Search the project for lockfiles and run the correct command depending on the package manager: If `package-lock.json` is found, use the following command: ```bash -npm i zod@3.22.3 +npm i zod ``` If `bun.lockb` is found, use the following command: ```bash -bun i zod@3.22.3 +bun i zod ``` If `yarn.lock` is found, use the following command: ```bash -yarn add zod@3.22.3 +yarn add zod ``` If `pnpm-lock.yaml` is found, use the following command: ```bash -pnpm i zod@3.22.3 +pnpm i zod ``` Then, a Zod schema can be defined alongside the component: diff --git a/packages/streaming/package.json b/packages/streaming/package.json index ca18807a392..d862d38d216 100644 --- a/packages/streaming/package.json +++ b/packages/streaming/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/streaming" }, "name": "@remotion/streaming", - "version": "4.0.424", + "version": "4.0.425", "description": "Utilities for streaming data between programs", "main": "dist", "sideEffects": false, diff --git a/packages/studio-server/package.json b/packages/studio-server/package.json index 5c165481125..edc7b617d41 100644 --- a/packages/studio-server/package.json +++ b/packages/studio-server/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/studio-server" }, "name": "@remotion/studio-server", - "version": "4.0.424", + "version": "4.0.425", "description": "Run a Remotion Studio with a server backend", "main": "dist", "sideEffects": false, diff --git a/packages/studio-shared/package.json b/packages/studio-shared/package.json index 5779c5b9352..52e09824ea6 100644 --- a/packages/studio-shared/package.json +++ b/packages/studio-shared/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/studio-shared" }, "name": "@remotion/studio-shared", - "version": "4.0.424", + "version": "4.0.425", "description": "Internal package for shared objects between the Studio backend and frontend", "main": "dist", "sideEffects": false, diff --git a/packages/studio-shared/src/package-info.ts b/packages/studio-shared/src/package-info.ts index 407bf1bdc14..3a1d6c4fa6f 100644 --- a/packages/studio-shared/src/package-info.ts +++ b/packages/studio-shared/src/package-info.ts @@ -71,6 +71,7 @@ export const packages = [ 'transitions', 'media-parser', 'zod-types', + 'zod-types-v3', 'webcodecs', 'convert', 'captions', @@ -94,18 +95,18 @@ export type ExtraPackage = { }; export const extraPackages: ExtraPackage[] = [ - { - name: 'zod', - version: '3.22.3', - description: 'Schema validation library for defining component props', - docsUrl: 'https://www.remotion.dev/docs/schemas', - }, { name: 'mediabunny', version: '1.34.4', description: 'Multimedia library used by Remotion', docsUrl: 'https://www.remotion.dev/docs/mediabunny/version', }, + { + name: 'zod', + version: '4.3.6', + description: 'TypeScript-first schema validation', + docsUrl: 'https://zod.dev', + }, ]; export const descriptions: {[key in Pkgs]: string | null} = { @@ -133,6 +134,7 @@ export const descriptions: {[key in Pkgs]: string | null} = { preload: 'Preloads assets for use in Remotion', shapes: 'Generate SVG shapes', 'zod-types': 'Zod types for Remotion', + 'zod-types-v3': 'Zod 3.22.3 types for Remotion', gif: 'Embed GIFs in a Remotion video', 'eslint-plugin': 'Rules for writing Remotion code', 'eslint-config': 'Default configuration for Remotion templates (ESLint <= 8)', @@ -272,6 +274,7 @@ export const installableMap: {[key in Pkgs]: boolean} = { transitions: true, 'media-parser': true, 'zod-types': true, + 'zod-types-v3': true, webcodecs: true, convert: false, captions: true, @@ -309,6 +312,7 @@ export const apiDocs: {[key in Pkgs]: string | null} = { preload: 'https://www.remotion.dev/docs/preload', shapes: 'https://www.remotion.dev/docs/shapes', 'zod-types': 'https://www.remotion.dev/docs/zod-types', + 'zod-types-v3': 'https://www.remotion.dev/docs/zod-types/v3', gif: 'https://www.remotion.dev/docs/gif', 'eslint-plugin': 'https://www.remotion.dev/docs/brownfield#install-the-eslint-plugin', diff --git a/packages/studio/package.json b/packages/studio/package.json index b159c72fe7e..60047f2e274 100644 --- a/packages/studio/package.json +++ b/packages/studio/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/studio" }, "name": "@remotion/studio", - "version": "4.0.424", + "version": "4.0.425", "description": "APIs for interacting with the Remotion Studio", "main": "dist", "sideEffects": false, diff --git a/packages/studio/src/api/create-composition.tsx b/packages/studio/src/api/create-composition.tsx index 4c50a684a57..024c7e57d4f 100644 --- a/packages/studio/src/api/create-composition.tsx +++ b/packages/studio/src/api/create-composition.tsx @@ -1,6 +1,5 @@ -import type {CompositionProps, StillProps} from 'remotion'; +import type {AnyZodObject, CompositionProps, StillProps} from 'remotion'; import {Composition, Still} from 'remotion'; -import type {AnyZodObject} from 'zod'; export const createComposition = >({ diff --git a/packages/studio/src/api/helpers/calc-new-props.ts b/packages/studio/src/api/helpers/calc-new-props.ts index ed4b617c2cb..88e12f7ad60 100644 --- a/packages/studio/src/api/helpers/calc-new-props.ts +++ b/packages/studio/src/api/helpers/calc-new-props.ts @@ -1,6 +1,5 @@ -import type {AnyComposition} from 'remotion'; +import type {AnyComposition, AnyZodObject} from 'remotion'; import {Internals, getRemotionEnvironment} from 'remotion'; -import type {AnyZodObject} from 'zod'; export type UpdateDefaultPropsFunction = (currentValues: { schema: AnyZodObject | null; diff --git a/packages/studio/src/components/RenderModal/DataEditor.tsx b/packages/studio/src/components/RenderModal/DataEditor.tsx index 9f6301a89e9..57ccdad01e1 100644 --- a/packages/studio/src/components/RenderModal/DataEditor.tsx +++ b/packages/studio/src/components/RenderModal/DataEditor.tsx @@ -8,7 +8,6 @@ import React, { import type {_InternalTypes, SerializedJSONWithCustomFields} from 'remotion'; import {getInputProps, Internals} from 'remotion'; import {NoReactInternals} from 'remotion/no-react'; -import {type z} from 'zod'; import {FastRefreshContext} from '../../fast-refresh-context'; import {StudioServerConnectionCtx} from '../../helpers/client-id'; import {BACKGROUND, BORDER_COLOR, LIGHT_TEXT} from '../../helpers/colors'; @@ -30,6 +29,11 @@ import { ZodNotInstalled, } from './SchemaEditor/SchemaErrorMessages'; import {extractEnumJsonPaths} from './SchemaEditor/extract-enum-json-paths'; +import type { + AnyZodSchema, + ZodSafeParseResult, +} from './SchemaEditor/zod-schema-type'; +import {getZodSchemaType, zodSafeParse} from './SchemaEditor/zod-schema-type'; import {WarningIndicatorButton} from './WarningIndicatorButton'; import type {TypeCanSaveState} from './get-render-modal-warnings'; import { @@ -48,7 +52,7 @@ export type State = str: string; value: Record; validJSON: true; - zodValidation: Zod.SafeParseReturnType; + zodValidation: ZodSafeParseResult; } | { str: string; @@ -173,13 +177,18 @@ export const DataEditor: React.FC<{ return 'no-schema' as const; } - if (!(typeof unresolvedComposition.schema.safeParse === 'function')) { + if ( + !( + typeof (unresolvedComposition.schema as {safeParse?: unknown}) + .safeParse === 'function' + ) + ) { throw new Error( 'A value which is not a Zod schema was passed to `schema`', ); } - return unresolvedComposition.schema; + return unresolvedComposition.schema as AnyZodSchema; }, [unresolvedComposition.schema, z]); const zodValidationResult = useMemo(() => { @@ -191,7 +200,7 @@ export const DataEditor: React.FC<{ return 'no-schema' as const; } - return schema.safeParse(defaultProps); + return zodSafeParse(schema, defaultProps); }, [defaultProps, schema]); const setShowWarning: React.Dispatch> = @@ -422,11 +431,9 @@ export const DataEditor: React.FC<{ throw new Error('expected schema'); } - const def: z.ZodTypeDef = schema._def; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const typeName = (def as any).typeName as z.ZodFirstPartyTypeKind; + const typeName = getZodSchemaType(schema); - if (typeName === z.ZodFirstPartyTypeKind.ZodAny) { + if (typeName === 'any') { return ; } diff --git a/packages/studio/src/components/RenderModal/RenderModalJSONPropsEditor.tsx b/packages/studio/src/components/RenderModal/RenderModalJSONPropsEditor.tsx index 16d82b629c0..90ed3e1e49b 100644 --- a/packages/studio/src/components/RenderModal/RenderModalJSONPropsEditor.tsx +++ b/packages/studio/src/components/RenderModal/RenderModalJSONPropsEditor.tsx @@ -1,7 +1,6 @@ import React, {useCallback, useEffect, useMemo} from 'react'; import type {SerializedJSONWithCustomFields} from 'remotion'; import {NoReactInternals} from 'remotion/no-react'; -import type {z} from 'zod'; import {FAIL_COLOR} from '../../helpers/colors'; import {setUnsavedProps} from '../../helpers/document-title'; import {useKeybinding} from '../../helpers/use-keybinding'; @@ -12,6 +11,8 @@ import {Flex, Row, Spacing} from '../layout'; import type {State} from './DataEditor'; import {ZodErrorMessages} from './SchemaEditor/ZodErrorMessages'; import {deepEqual} from './SchemaEditor/deep-equal'; +import type {AnyZodSchema} from './SchemaEditor/zod-schema-type'; +import {zodSafeParse} from './SchemaEditor/zod-schema-type'; const style: React.CSSProperties = { fontFamily: 'monospace', @@ -25,10 +26,10 @@ const scrollable: React.CSSProperties = { flex: 1, }; -const parseJSON = (str: string, schema: z.ZodTypeAny): State => { +const parseJSON = (str: string, schema: AnyZodSchema): State => { try { const value = NoReactInternals.deserializeJSONWithSpecialTypes(str); - const zodValidation = schema.safeParse(value); + const zodValidation = zodSafeParse(schema, value); return {str, value, validJSON: true, zodValidation}; } catch (e) { return {str, validJSON: false, error: (e as Error).message}; @@ -44,7 +45,7 @@ export const RenderModalJSONPropsEditor: React.FC<{ readonly showSaveButton: boolean; readonly serializedJSON: SerializedJSONWithCustomFields | null; readonly defaultProps: Record; - readonly schema: z.ZodTypeAny; + readonly schema: AnyZodSchema; }> = ({ setValue, value, @@ -77,7 +78,7 @@ export const RenderModalJSONPropsEditor: React.FC<{ const parsed = parseJSON(e.target.value, schema); if (parsed.validJSON) { - const validationResult = schema.safeParse(parsed.value); + const validationResult = zodSafeParse(schema, parsed.value); setLocalValue({ str: e.target.value, value: parsed.value, diff --git a/packages/studio/src/components/RenderModal/SchemaEditor/SchemaEditor.tsx b/packages/studio/src/components/RenderModal/SchemaEditor/SchemaEditor.tsx index da4c6440815..f079c4613ad 100644 --- a/packages/studio/src/components/RenderModal/SchemaEditor/SchemaEditor.tsx +++ b/packages/studio/src/components/RenderModal/SchemaEditor/SchemaEditor.tsx @@ -1,6 +1,5 @@ import React, {useCallback, useEffect, useMemo, useState} from 'react'; import {Internals} from 'remotion'; -import type {AnyZodObject, z} from 'zod'; import {setUnsavedProps} from '../../../helpers/document-title'; import {useKeybinding} from '../../../helpers/use-keybinding'; import {VERTICAL_SCROLLBAR_CLASSNAME} from '../../Menu/is-menu-item'; @@ -15,6 +14,8 @@ import {deepEqual} from './deep-equal'; import type {RevisionContextType} from './local-state'; import {RevisionContext} from './local-state'; import {defaultPropsEditorScrollableAreaRef} from './scroll-to-default-props-path'; +import type {AnyZodSchema, ZodSafeParseResult} from './zod-schema-type'; +import {getZodSchemaType, zodSafeParse} from './zod-schema-type'; const scrollable: React.CSSProperties = { display: 'flex', @@ -23,12 +24,12 @@ const scrollable: React.CSSProperties = { }; export const SchemaEditor: React.FC<{ - readonly schema: AnyZodObject; + readonly schema: AnyZodSchema; readonly unsavedDefaultProps: Record; readonly setValue: React.Dispatch< React.SetStateAction> >; - readonly zodValidationResult: z.SafeParseReturnType; + readonly zodValidationResult: ZodSafeParseResult; readonly savedDefaultProps: Record; readonly onSave: ( updater: (oldState: Record) => Record, @@ -108,16 +109,14 @@ export const SchemaEditor: React.FC<{ }; }, [keybindings, onQuickSave, onSave]); - const def: z.ZodTypeDef = schema._def; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const typeName = (def as any).typeName as z.ZodFirstPartyTypeKind; + const typeName = getZodSchemaType(schema); const reset = useCallback(() => { setValue(savedDefaultProps); }, [savedDefaultProps, setValue]); if (!zodValidationResult.success) { - const defaultPropsValid = schema.safeParse(savedDefaultProps); + const defaultPropsValid = zodSafeParse(schema, savedDefaultProps); if (!defaultPropsValid.success) { return ; @@ -128,7 +127,7 @@ export const SchemaEditor: React.FC<{ ); } - if (typeName !== z.ZodFirstPartyTypeKind.ZodObject) { + if (typeName !== 'object') { return ; } diff --git a/packages/studio/src/components/RenderModal/SchemaEditor/SchemaErrorMessages.tsx b/packages/studio/src/components/RenderModal/SchemaEditor/SchemaErrorMessages.tsx index b66bde28306..e4073fc70cf 100644 --- a/packages/studio/src/components/RenderModal/SchemaEditor/SchemaErrorMessages.tsx +++ b/packages/studio/src/components/RenderModal/SchemaEditor/SchemaErrorMessages.tsx @@ -1,9 +1,10 @@ -import type {z} from 'zod'; +// Schema error messages for studio editor import {BACKGROUND, BLUE, LIGHT_TEXT} from '../../../helpers/colors'; import {Button} from '../../Button'; import {inlineCodeSnippet} from '../../Menu/styles'; import {Spacing} from '../../layout'; import {ZodErrorMessages} from './ZodErrorMessages'; +import type {ZodSafeParseResult} from './zod-schema-type'; const explainer: React.CSSProperties = { display: 'flex', @@ -86,7 +87,7 @@ export const NoDefaultProps = () => { }; export const InvalidDefaultProps: React.FC<{ - zodValidationResult: z.SafeParseReturnType; + zodValidationResult: ZodSafeParseResult; }> = ({zodValidationResult}) => { return (
@@ -111,7 +112,7 @@ export const InvalidDefaultProps: React.FC<{ }; export const InvalidSchema: React.FC<{ - zodValidationResult: z.SafeParseReturnType; + zodValidationResult: ZodSafeParseResult; reset: () => void; }> = ({zodValidationResult, reset}) => { return ( diff --git a/packages/studio/src/components/RenderModal/SchemaEditor/SchemaSeparationLine.tsx b/packages/studio/src/components/RenderModal/SchemaEditor/SchemaSeparationLine.tsx index af806dc1937..2cded5139ef 100644 --- a/packages/studio/src/components/RenderModal/SchemaEditor/SchemaSeparationLine.tsx +++ b/packages/studio/src/components/RenderModal/SchemaEditor/SchemaSeparationLine.tsx @@ -1,5 +1,4 @@ import React, {useCallback, useMemo, useState} from 'react'; -import type {z} from 'zod'; import {BACKGROUND, LIGHT_TEXT, LINE_COLOR} from '../../../helpers/colors'; import {Plus} from '../../../icons/plus'; import { @@ -9,6 +8,8 @@ import { import {Spacing} from '../../layout'; import {fieldSetText} from '../layout'; import {createZodValues} from './create-zod-values'; +import type {AnyZodSchema} from './zod-schema-type'; +import {getArrayElement} from './zod-schema-type'; export const VERTICAL_GUIDE_HEIGHT = 24; @@ -35,7 +36,7 @@ export const SchemaArrayItemSeparationLine: React.FC<{ increment: boolean, ) => void; readonly index: number; - readonly schema: z.ZodTypeAny; + readonly schema: AnyZodSchema; readonly showAddButton: boolean; readonly isLast: boolean; }> = ({onChange, index, schema, isLast, showAddButton}) => { @@ -48,21 +49,21 @@ export const SchemaArrayItemSeparationLine: React.FC<{ throw new Error('expected zod'); } - const def = schema._def as z.ZodArrayDef; + const arrayElement = getArrayElement(schema); const onAdd = useCallback(() => { onChange( (oldV) => { return [ ...oldV.slice(0, index + 1), - createZodValues(def.type, z, zodTypes), + createZodValues(arrayElement, z, zodTypes), ...oldV.slice(index + 1), ]; }, false, true, ); - }, [def.type, index, onChange, z, zodTypes]); + }, [arrayElement, index, onChange, z, zodTypes]); const dynamicAddButtonStyle: React.CSSProperties = useMemo(() => { return { diff --git a/packages/studio/src/components/RenderModal/SchemaEditor/ZodArrayEditor.tsx b/packages/studio/src/components/RenderModal/SchemaEditor/ZodArrayEditor.tsx index 4414f027819..e8a72ed50e6 100644 --- a/packages/studio/src/components/RenderModal/SchemaEditor/ZodArrayEditor.tsx +++ b/packages/studio/src/components/RenderModal/SchemaEditor/ZodArrayEditor.tsx @@ -1,5 +1,4 @@ import React, {useMemo, useState} from 'react'; -import type {z} from 'zod'; import { useZodIfPossible, useZodTypesIfPossible, @@ -14,10 +13,12 @@ import type {UpdaterFunction} from './ZodSwitch'; import {createZodValues} from './create-zod-values'; import {deepEqual} from './deep-equal'; import {useLocalState} from './local-state'; +import type {AnyZodSchema} from './zod-schema-type'; +import {getArrayElement} from './zod-schema-type'; import type {JSONPath} from './zod-types'; export const ZodArrayEditor: React.FC<{ - readonly schema: z.ZodTypeAny; + readonly schema: AnyZodSchema; readonly jsonPath: JSONPath; readonly value: unknown[]; readonly defaultValue: unknown[]; @@ -50,7 +51,7 @@ export const ZodArrayEditor: React.FC<{ const [expanded, setExpanded] = useState(true); - const def = schema._def as z.ZodArrayDef; + const arrayElement = getArrayElement(schema); const suffix = useMemo(() => { return expanded ? ' [' : ' [...] '; @@ -62,11 +63,6 @@ export const ZodArrayEditor: React.FC<{ const zodTypes = useZodTypesIfPossible(); - const typeName = def.typeName as z.ZodFirstPartyTypeKind; - if (typeName !== z.ZodFirstPartyTypeKind.ZodArray) { - throw new Error('expected object'); - } - const isDefaultValue = useMemo(() => { return deepEqual(localValue.value, defaultValue); }, [defaultValue, localValue]); @@ -106,12 +102,12 @@ export const ZodArrayEditor: React.FC<{ ; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - def: any; + elementSchema: AnyZodSchema; index: number; value: unknown; defaultValue: unknown; @@ -19,7 +19,7 @@ export const ZodArrayItemEditor: React.FC<{ mayPad: boolean; mayRemove: boolean; }> = ({ - def, + elementSchema, onChange, jsonPath, index, @@ -81,7 +81,7 @@ export const ZodArrayItemEditor: React.FC<{
; diff --git a/packages/studio/src/components/RenderModal/SchemaEditor/ZodColorEditor.tsx b/packages/studio/src/components/RenderModal/SchemaEditor/ZodColorEditor.tsx index e6dd3a8dcf1..ec1c38af18c 100644 --- a/packages/studio/src/components/RenderModal/SchemaEditor/ZodColorEditor.tsx +++ b/packages/studio/src/components/RenderModal/SchemaEditor/ZodColorEditor.tsx @@ -1,5 +1,4 @@ import React, {useCallback, useMemo} from 'react'; -import type {z} from 'zod'; import {colorWithNewOpacity} from '../../../helpers/color-math'; import {InputDragger} from '../../NewComposition/InputDragger'; import {RemotionInput} from '../../NewComposition/RemInput'; @@ -14,6 +13,7 @@ import {SchemaLabel} from './SchemaLabel'; import {ZodFieldValidation} from './ZodFieldValidation'; import type {UpdaterFunction} from './ZodSwitch'; import {useLocalState} from './local-state'; +import type {AnyZodSchema} from './zod-schema-type'; import type {JSONPath} from './zod-types'; const fullWidth: React.CSSProperties = { @@ -21,7 +21,7 @@ const fullWidth: React.CSSProperties = { }; export const ZodColorEditor: React.FC<{ - readonly schema: z.ZodTypeAny; + readonly schema: AnyZodSchema; readonly jsonPath: JSONPath; readonly value: string; readonly defaultValue: string; diff --git a/packages/studio/src/components/RenderModal/SchemaEditor/ZodDateEditor.tsx b/packages/studio/src/components/RenderModal/SchemaEditor/ZodDateEditor.tsx index 2464ce050f6..d287f683a6a 100644 --- a/packages/studio/src/components/RenderModal/SchemaEditor/ZodDateEditor.tsx +++ b/packages/studio/src/components/RenderModal/SchemaEditor/ZodDateEditor.tsx @@ -1,5 +1,4 @@ import React, {useCallback} from 'react'; -import type {z} from 'zod'; import {VERY_LIGHT_TEXT} from '../../../helpers/colors'; import {RemotionInput} from '../../NewComposition/RemInput'; import {Spacing} from '../../layout'; @@ -8,6 +7,7 @@ import {SchemaLabel} from './SchemaLabel'; import {ZodFieldValidation} from './ZodFieldValidation'; import type {UpdaterFunction} from './ZodSwitch'; import {useLocalState} from './local-state'; +import type {AnyZodSchema} from './zod-schema-type'; import type {JSONPath} from './zod-types'; const fullWidth: React.CSSProperties = { @@ -50,7 +50,7 @@ const formatDate = (date: Date) => { }; export const ZodDateEditor: React.FC<{ - readonly schema: z.ZodTypeAny; + readonly schema: AnyZodSchema; readonly jsonPath: JSONPath; readonly value: Date; readonly defaultValue: Date; diff --git a/packages/studio/src/components/RenderModal/SchemaEditor/ZodDefaultEditor.tsx b/packages/studio/src/components/RenderModal/SchemaEditor/ZodDefaultEditor.tsx index f44d038a7c1..5ae5ef2c86d 100644 --- a/packages/studio/src/components/RenderModal/SchemaEditor/ZodDefaultEditor.tsx +++ b/packages/studio/src/components/RenderModal/SchemaEditor/ZodDefaultEditor.tsx @@ -1,15 +1,16 @@ import React from 'react'; -import type {z} from 'zod'; +import type {AnyZodSchema} from './zod-schema-type'; +import {getInnerType} from './zod-schema-type'; +import type {JSONPath} from './zod-types'; import type {UpdaterFunction} from './ZodSwitch'; import {ZodSwitch} from './ZodSwitch'; -import type {JSONPath} from './zod-types'; export const ZodDefaultEditor: React.FC<{ readonly showSaveButton: boolean; readonly jsonPath: JSONPath; readonly value: unknown; readonly defaultValue: unknown; - readonly schema: z.ZodTypeAny; + readonly schema: AnyZodSchema; readonly setValue: UpdaterFunction; readonly onSave: UpdaterFunction; readonly onRemove: null | (() => void); @@ -29,7 +30,7 @@ export const ZodDefaultEditor: React.FC<{ saveDisabledByParent, mayPad, }) => { - const {innerType} = schema._def as z.ZodDefaultDef; + const innerType = getInnerType(schema); return ( >; value: Record; defaultValue: Record; @@ -48,10 +53,10 @@ export const ZodDiscriminatedUnionEditor: React.FC<{ const zodTypes = useZodTypesIfPossible(); - const typedSchema = schema._def as z.ZodDiscriminatedUnionDef; + const discriminator = getDiscriminator(schema); const options = useMemo( - () => [...typedSchema.optionsMap.keys()], - [typedSchema.optionsMap], + () => getDiscriminatedOptionKeys(schema), + [schema], ) as string[]; const { @@ -72,16 +77,19 @@ export const ZodDiscriminatedUnionEditor: React.FC<{ label: option, id: option, keyHint: null, - leftItem: - option === value[typedSchema.discriminator] ? : null, + leftItem: option === value[discriminator] ? : null, onClick: () => { - const val = createZodValues( - typedSchema.optionsMap.get( - option, - ) as ZodDiscriminatedUnionOption, - z, - zodTypes, - ) as Record; + const optionSchema = getDiscriminatedOption(schema, option); + if (!optionSchema) { + throw new Error( + `No schema found for discriminator value: ${option}`, + ); + } + + const val = createZodValues(optionSchema, z, zodTypes) as Record< + string, + unknown + >; setLocalValue(() => val, false, false); }, quickSwitcherLabel: null, @@ -89,15 +97,7 @@ export const ZodDiscriminatedUnionEditor: React.FC<{ type: 'item', }; }); - }, [ - options, - setLocalValue, - typedSchema.discriminator, - typedSchema.optionsMap, - value, - z, - zodTypes, - ]); + }, [options, setLocalValue, discriminator, schema, value, z, zodTypes]); const save = useCallback(() => { onSave(() => value, false, false); @@ -106,16 +106,15 @@ export const ZodDiscriminatedUnionEditor: React.FC<{ const discriminatedUnionReplacement: ObjectDiscrimatedUnionReplacement = useMemo(() => { return { - discriminator: typedSchema.discriminator, + discriminator, markup: (
), @@ -146,14 +145,23 @@ export const ZodDiscriminatedUnionEditor: React.FC<{ saveDisabledByParent, saving, showSaveButton, - typedSchema.discriminator, + discriminator, value, ]); + const currentOptionSchema = getDiscriminatedOption( + schema, + value[discriminator] as string, + ); + + if (!currentOptionSchema) { + throw new Error('No matching option found for discriminated union'); + } + return ( >} saveDisabledByParent={saveDisabledByParent} saving={saving} - schema={ - typedSchema.optionsMap.get( - value[typedSchema.discriminator] as string, - ) as ZodDiscriminatedUnionOption - } + schema={currentOptionSchema} setValue={setLocalValue} showSaveButton={showSaveButton} unsavedValue={value} diff --git a/packages/studio/src/components/RenderModal/SchemaEditor/ZodEffectEditor.tsx b/packages/studio/src/components/RenderModal/SchemaEditor/ZodEffectEditor.tsx index 5374f1cf806..24ad5bfc84f 100644 --- a/packages/studio/src/components/RenderModal/SchemaEditor/ZodEffectEditor.tsx +++ b/packages/studio/src/components/RenderModal/SchemaEditor/ZodEffectEditor.tsx @@ -1,11 +1,11 @@ import React from 'react'; -import type {z} from 'zod'; -import {useZodIfPossible} from '../../get-zod-if-possible'; import {Fieldset} from './Fieldset'; import {ZodFieldValidation} from './ZodFieldValidation'; import type {UpdaterFunction} from './ZodSwitch'; import {ZodSwitch} from './ZodSwitch'; import {useLocalState} from './local-state'; +import type {AnyZodSchema} from './zod-schema-type'; +import {getEffectsInner, getZodSchemaType} from './zod-schema-type'; import type {JSONPath} from './zod-types'; const fullWidth: React.CSSProperties = { @@ -13,7 +13,7 @@ const fullWidth: React.CSSProperties = { }; export const ZodEffectEditor: React.FC<{ - readonly schema: z.ZodTypeAny; + readonly schema: AnyZodSchema; readonly jsonPath: JSONPath; readonly value: unknown; readonly setValue: UpdaterFunction; @@ -35,9 +35,9 @@ export const ZodEffectEditor: React.FC<{ saving, mayPad, }) => { - const z = useZodIfPossible(); - if (!z) { - throw new Error('expected zod'); + const typeName = getZodSchemaType(schema); + if (typeName !== 'effects') { + throw new Error('expected effect'); } const {localValue, onChange} = useLocalState({ @@ -47,11 +47,7 @@ export const ZodEffectEditor: React.FC<{ savedValue: defaultValue, }); - const def = schema._def; - const typeName = def.typeName as z.ZodFirstPartyTypeKind; - if (typeName !== z.ZodFirstPartyTypeKind.ZodEffects) { - throw new Error('expected effect'); - } + const innerSchema = getEffectsInner(schema); return (
@@ -60,7 +56,7 @@ export const ZodEffectEditor: React.FC<{ value={value} setValue={onChange} jsonPath={jsonPath} - schema={def.schema} + schema={innerSchema} defaultValue={defaultValue} onSave={onSave} showSaveButton={showSaveButton} diff --git a/packages/studio/src/components/RenderModal/SchemaEditor/ZodEnumEditor.tsx b/packages/studio/src/components/RenderModal/SchemaEditor/ZodEnumEditor.tsx index 85024a4b2bb..e830f53bbfb 100644 --- a/packages/studio/src/components/RenderModal/SchemaEditor/ZodEnumEditor.tsx +++ b/packages/studio/src/components/RenderModal/SchemaEditor/ZodEnumEditor.tsx @@ -1,14 +1,14 @@ import React, {useCallback, useMemo} from 'react'; -import type {z} from 'zod'; import {Checkmark} from '../../../icons/Checkmark'; import type {ComboboxValue} from '../../NewComposition/ComboBox'; import {Combobox} from '../../NewComposition/ComboBox'; -import {useZodIfPossible} from '../../get-zod-if-possible'; import {Fieldset} from './Fieldset'; import {SchemaLabel} from './SchemaLabel'; import {ZodFieldValidation} from './ZodFieldValidation'; import type {UpdaterFunction} from './ZodSwitch'; import {useLocalState} from './local-state'; +import type {AnyZodSchema} from './zod-schema-type'; +import {getEnumValues} from './zod-schema-type'; import type {JSONPath} from './zod-types'; const container: React.CSSProperties = { @@ -16,7 +16,7 @@ const container: React.CSSProperties = { }; export const ZodEnumEditor: React.FC<{ - readonly schema: z.ZodTypeAny; + readonly schema: AnyZodSchema; readonly jsonPath: JSONPath; readonly value: string; readonly defaultValue: string; @@ -36,11 +36,6 @@ export const ZodEnumEditor: React.FC<{ onRemove, saving, }) => { - const z = useZodIfPossible(); - if (!z) { - throw new Error('expected zod'); - } - const { localValue, onChange: setLocalValue, @@ -52,17 +47,12 @@ export const ZodEnumEditor: React.FC<{ savedValue: defaultValue, }); - const def = schema._def; - - const typeName = def.typeName as z.ZodFirstPartyTypeKind; - if (typeName !== z.ZodFirstPartyTypeKind.ZodEnum) { - throw new Error('expected enum'); - } + const enumValues = getEnumValues(schema); const isRoot = jsonPath.length === 0; const comboBoxValues = useMemo(() => { - return def.values.map((option: string): ComboboxValue => { + return enumValues.map((option: string): ComboboxValue => { return { value: option, label: option, @@ -77,7 +67,7 @@ export const ZodEnumEditor: React.FC<{ type: 'item', }; }); - }, [def.values, setLocalValue, value]); + }, [enumValues, setLocalValue, value]); const save = useCallback(() => { onSave(() => value, false, false); diff --git a/packages/studio/src/components/RenderModal/SchemaEditor/ZodErrorMessages.tsx b/packages/studio/src/components/RenderModal/SchemaEditor/ZodErrorMessages.tsx index 0e5b39489ec..016d5a7e341 100644 --- a/packages/studio/src/components/RenderModal/SchemaEditor/ZodErrorMessages.tsx +++ b/packages/studio/src/components/RenderModal/SchemaEditor/ZodErrorMessages.tsx @@ -1,8 +1,8 @@ import React, {useMemo} from 'react'; -import type {z} from 'zod'; import {FAIL_COLOR, LIGHT_TEXT} from '../../../helpers/colors'; import {WarningTriangle} from '../../NewComposition/ValidationMessage'; import {Spacing} from '../../layout'; +import type {ZodSafeParseResult} from './zod-schema-type'; const schemaLabel: React.CSSProperties = { fontSize: 14, @@ -25,7 +25,7 @@ const triangleStyle: React.CSSProperties = { }; export const ZodErrorMessages: React.FC<{ - readonly zodValidationResult: z.SafeParseReturnType; + readonly zodValidationResult: ZodSafeParseResult; readonly viewTab: 'schema' | 'json'; }> = ({zodValidationResult, viewTab}) => { if (zodValidationResult.success) { @@ -46,7 +46,7 @@ export const ZodErrorMessages: React.FC<{ if (viewTab === 'json') { return (
- {zodValidationResult.error.errors.map((error) => { + {zodValidationResult.error.issues.map((error) => { return (
@@ -62,7 +62,7 @@ export const ZodErrorMessages: React.FC<{ return (
- {zodValidationResult.error.errors.map((error) => { + {zodValidationResult.error.issues.map((error) => { return (
-{' '} diff --git a/packages/studio/src/components/RenderModal/SchemaEditor/ZodFieldValidation.tsx b/packages/studio/src/components/RenderModal/SchemaEditor/ZodFieldValidation.tsx index a9e82601761..ad92d278524 100644 --- a/packages/studio/src/components/RenderModal/SchemaEditor/ZodFieldValidation.tsx +++ b/packages/studio/src/components/RenderModal/SchemaEditor/ZodFieldValidation.tsx @@ -22,7 +22,8 @@ export const ZodFieldValidation: React.FC<{ localValue: LocalState; path: JSONPath; }> = ({localValue, path}) => { - if (localValue.zodValidation.success) { + const {zodValidation} = localValue; + if (zodValidation.success) { return null; } @@ -30,14 +31,14 @@ export const ZodFieldValidation: React.FC<{
Zod Validation has failed:
- {localValue.zodValidation.error.errors.map((error, index) => ( + {zodValidation.error.issues.map((error, index: number) => ( // eslint-disable-next-line react/no-array-index-key
Type: {error.code}
diff --git a/packages/studio/src/components/RenderModal/SchemaEditor/ZodMatrixEditor.tsx b/packages/studio/src/components/RenderModal/SchemaEditor/ZodMatrixEditor.tsx index fe290e13195..e69275c8d8d 100644 --- a/packages/studio/src/components/RenderModal/SchemaEditor/ZodMatrixEditor.tsx +++ b/packages/studio/src/components/RenderModal/SchemaEditor/ZodMatrixEditor.tsx @@ -1,5 +1,4 @@ import React, {useMemo, useState} from 'react'; -import type {z} from 'zod'; import { useZodIfPossible, useZodTypesIfPossible, @@ -14,6 +13,8 @@ import type {UpdaterFunction} from './ZodSwitch'; import {createZodValues} from './create-zod-values'; import {deepEqual} from './deep-equal'; import {useLocalState} from './local-state'; +import type {AnyZodSchema} from './zod-schema-type'; +import {getArrayElement} from './zod-schema-type'; import type {JSONPath} from './zod-types'; const rowStyle: React.CSSProperties = { @@ -23,7 +24,7 @@ const rowStyle: React.CSSProperties = { }; export const ZodMatrixEditor: React.FC<{ - readonly schema: z.ZodTypeAny; + readonly schema: AnyZodSchema; readonly jsonPath: JSONPath; readonly value: unknown[]; readonly defaultValue: unknown[]; @@ -56,7 +57,7 @@ export const ZodMatrixEditor: React.FC<{ const [expanded, setExpanded] = useState(true); - const def = schema._def as z.ZodArrayDef; + const arrayElement = getArrayElement(schema); const suffix = useMemo(() => { return expanded ? ' [' : ' [...] '; @@ -128,12 +129,12 @@ export const ZodMatrixEditor: React.FC<{ ; onSave: UpdaterFunction; onRemove: null | (() => void); @@ -28,7 +29,7 @@ export const ZodNullableEditor: React.FC<{ saveDisabledByParent, mayPad, }) => { - const {innerType} = schema._def as z.ZodOptionalDef; + const innerType = getInnerType(schema); return ( { - const minCheck = (schema as z.ZodNumber)._def.checks.find( - (c) => c.kind === 'min', - ); - if (!minCheck) { - return -Infinity; - } +const getMinValue = (schema: AnyZodSchema) => { + const {checks} = getZodDef(schema); + if (!checks) return -Infinity; - if (minCheck.kind !== 'min') { - throw new Error('Expected min check'); + if (isZodV3Schema(schema)) { + // v3: {kind: "min", value: 0, inclusive: true} + const minCheck = checks.find((c: {kind: string}) => c.kind === 'min'); + if (!minCheck || !minCheck.inclusive) return -Infinity; + return minCheck.value; } - if (!minCheck.inclusive) { - return -Infinity; + // v4: check objects with _zod.def = {check: "greater_than", value: 0, inclusive: true} + for (const c of checks) { + const def = c._zod?.def; + if (def?.check === 'greater_than' && def.inclusive) { + return def.value; + } } - return minCheck.value; + return -Infinity; }; -const getMaxValue = (schema: z.ZodTypeAny) => { - const maxCheck = (schema as z.ZodNumber)._def.checks.find( - (c) => c.kind === 'max', - ); - if (!maxCheck) { - return Infinity; - } +const getMaxValue = (schema: AnyZodSchema) => { + const {checks} = getZodDef(schema); + if (!checks) return Infinity; - if (maxCheck.kind !== 'max') { - throw new Error('Expected max check'); + if (isZodV3Schema(schema)) { + // v3: {kind: "max", value: 100, inclusive: true} + const maxCheck = checks.find((c: {kind: string}) => c.kind === 'max'); + if (!maxCheck || !maxCheck.inclusive) return Infinity; + return maxCheck.value; } - if (!maxCheck.inclusive) { - return Infinity; + // v4: check objects with _zod.def = {check: "less_than", value: 100, inclusive: true} + for (const c of checks) { + const def = c._zod?.def; + if (def?.check === 'less_than' && def.inclusive) { + return def.value; + } } - return maxCheck.value; + return Infinity; }; -const getStep = (schema: z.ZodTypeAny): number | undefined => { - const multipleStep = (schema as z.ZodNumber)._def.checks.find( - (c) => c.kind === 'multipleOf', - ); - - if (!multipleStep) { - return undefined; +const getStep = (schema: AnyZodSchema): number | undefined => { + const {checks} = getZodDef(schema); + if (!checks) return undefined; + + if (isZodV3Schema(schema)) { + // v3: {kind: "multipleOf", value: 5} + const multipleStep = checks.find( + (c: {kind: string}) => c.kind === 'multipleOf', + ); + if (!multipleStep) return undefined; + return multipleStep.value; } - if (multipleStep.kind !== 'multipleOf') { - throw new Error('Expected multipleOf check'); + // v4: check objects with _zod.def = {check: "multiple_of", value: 5} + for (const c of checks) { + const def = c._zod?.def; + if (def?.check === 'multiple_of') { + return def.value; + } } - return multipleStep.value; + return undefined; }; export const ZodNumberEditor: React.FC<{ - readonly schema: z.ZodTypeAny; + readonly schema: AnyZodSchema; readonly jsonPath: JSONPath; readonly value: number; readonly setValue: UpdaterFunction; diff --git a/packages/studio/src/components/RenderModal/SchemaEditor/ZodObjectEditor.tsx b/packages/studio/src/components/RenderModal/SchemaEditor/ZodObjectEditor.tsx index 1dbff01d5d0..eddcdd4257c 100644 --- a/packages/studio/src/components/RenderModal/SchemaEditor/ZodObjectEditor.tsx +++ b/packages/studio/src/components/RenderModal/SchemaEditor/ZodObjectEditor.tsx @@ -1,6 +1,4 @@ import React, {useMemo, useState} from 'react'; -import type {z} from 'zod'; -import {useZodIfPossible} from '../../get-zod-if-possible'; import {fieldsetLabel} from '../layout'; import {Fieldset} from './Fieldset'; import {SchemaLabel} from './SchemaLabel'; @@ -10,6 +8,8 @@ import type {UpdaterFunction} from './ZodSwitch'; import {ZodSwitch} from './ZodSwitch'; import {deepEqual} from './deep-equal'; import {useLocalState} from './local-state'; +import type {AnyZodSchema} from './zod-schema-type'; +import {getObjectShape, getZodSchemaType} from './zod-schema-type'; import type {JSONPath} from './zod-types'; export type ObjectDiscrimatedUnionReplacement = { @@ -18,7 +18,7 @@ export type ObjectDiscrimatedUnionReplacement = { }; export const ZodObjectEditor: React.FC<{ - readonly schema: z.ZodTypeAny; + readonly schema: AnyZodSchema; readonly jsonPath: JSONPath; readonly unsavedValue: Record; readonly savedValue: Record; @@ -44,11 +44,6 @@ export const ZodObjectEditor: React.FC<{ mayPad, discriminatedUnionReplacement, }) => { - const z = useZodIfPossible(); - if (!z) { - throw new Error('expected zod'); - } - const [expanded, setExpanded] = useState(true); const {localValue, onChange, RevisionContextProvider, reset} = useLocalState({ schema, @@ -57,14 +52,12 @@ export const ZodObjectEditor: React.FC<{ savedValue, }); - const def = schema._def; - - const typeName = def.typeName as z.ZodFirstPartyTypeKind; - if (typeName !== z.ZodFirstPartyTypeKind.ZodObject) { + const typeName = getZodSchemaType(schema); + if (typeName !== 'object') { throw new Error('expected object'); } - const shape = def.shape(); + const shape = getObjectShape(schema); const keys = Object.keys(shape); const isRoot = jsonPath.length === 0; diff --git a/packages/studio/src/components/RenderModal/SchemaEditor/ZodOptionalEditor.tsx b/packages/studio/src/components/RenderModal/SchemaEditor/ZodOptionalEditor.tsx index 0c000b3adda..92bbb1a78ae 100644 --- a/packages/studio/src/components/RenderModal/SchemaEditor/ZodOptionalEditor.tsx +++ b/packages/studio/src/components/RenderModal/SchemaEditor/ZodOptionalEditor.tsx @@ -1,6 +1,7 @@ -import type {z} from 'zod'; import {ZodOrNullishEditor} from './ZodOrNullishEditor'; import type {UpdaterFunction} from './ZodSwitch'; +import type {AnyZodSchema} from './zod-schema-type'; +import {getInnerType} from './zod-schema-type'; import type {JSONPath} from './zod-types'; export const ZodOptionalEditor: React.FC<{ @@ -8,7 +9,7 @@ export const ZodOptionalEditor: React.FC<{ jsonPath: JSONPath; value: unknown; defaultValue: unknown; - schema: z.ZodTypeAny; + schema: AnyZodSchema; setValue: UpdaterFunction; onSave: UpdaterFunction; onRemove: null | (() => void); @@ -28,7 +29,7 @@ export const ZodOptionalEditor: React.FC<{ saveDisabledByParent, mayPad, }) => { - const {innerType} = schema._def as z.ZodOptionalDef; + const innerType = getInnerType(schema); return ( ; onSave: UpdaterFunction; onRemove: null | (() => void); diff --git a/packages/studio/src/components/RenderModal/SchemaEditor/ZodStaticFileEditor.tsx b/packages/studio/src/components/RenderModal/SchemaEditor/ZodStaticFileEditor.tsx index 8fe0d5acca7..cbc2d15bc8b 100644 --- a/packages/studio/src/components/RenderModal/SchemaEditor/ZodStaticFileEditor.tsx +++ b/packages/studio/src/components/RenderModal/SchemaEditor/ZodStaticFileEditor.tsx @@ -1,15 +1,14 @@ import React, {useCallback, useMemo} from 'react'; -import type {z} from 'zod'; import {Checkmark} from '../../../icons/Checkmark'; import type {ComboboxValue} from '../../NewComposition/ComboBox'; import {Combobox} from '../../NewComposition/ComboBox'; -import {useZodIfPossible} from '../../get-zod-if-possible'; import {useStaticFiles} from '../../use-static-files'; import {Fieldset} from './Fieldset'; import {SchemaLabel} from './SchemaLabel'; import {ZodFieldValidation} from './ZodFieldValidation'; import type {UpdaterFunction} from './ZodSwitch'; import {useLocalState} from './local-state'; +import type {AnyZodSchema} from './zod-schema-type'; import type {JSONPath} from './zod-types'; const container: React.CSSProperties = { @@ -17,7 +16,7 @@ const container: React.CSSProperties = { }; export const ZodStaticFileEditor: React.FC<{ - readonly schema: z.ZodTypeAny; + readonly schema: AnyZodSchema; readonly jsonPath: JSONPath; readonly value: string; readonly defaultValue: string; @@ -41,11 +40,6 @@ export const ZodStaticFileEditor: React.FC<{ saveDisabledByParent, mayPad, }) => { - const z = useZodIfPossible(); - if (!z) { - throw new Error('expected zod'); - } - const { localValue, onChange: setLocalValue, @@ -57,13 +51,6 @@ export const ZodStaticFileEditor: React.FC<{ savedValue: defaultValue, }); - const def = schema._def; - - const typeName = def.typeName as z.ZodFirstPartyTypeKind; - if (typeName !== z.ZodFirstPartyTypeKind.ZodString) { - throw new Error('expected enum'); - } - const isRoot = jsonPath.length === 0; const staticFiles = useStaticFiles(); diff --git a/packages/studio/src/components/RenderModal/SchemaEditor/ZodStringEditor.tsx b/packages/studio/src/components/RenderModal/SchemaEditor/ZodStringEditor.tsx index 604ffc43570..0eff61d301d 100644 --- a/packages/studio/src/components/RenderModal/SchemaEditor/ZodStringEditor.tsx +++ b/packages/studio/src/components/RenderModal/SchemaEditor/ZodStringEditor.tsx @@ -1,5 +1,4 @@ import React, {useCallback} from 'react'; -import type {z} from 'zod'; import {RemotionInput} from '../../NewComposition/RemInput'; import {useZodIfPossible} from '../../get-zod-if-possible'; import {Fieldset} from './Fieldset'; @@ -7,6 +6,7 @@ import {SchemaLabel} from './SchemaLabel'; import {ZodFieldValidation} from './ZodFieldValidation'; import type {UpdaterFunction} from './ZodSwitch'; import {useLocalState} from './local-state'; +import type {AnyZodSchema} from './zod-schema-type'; import type {JSONPath} from './zod-types'; const fullWidth: React.CSSProperties = { @@ -14,7 +14,7 @@ const fullWidth: React.CSSProperties = { }; export const ZodStringEditor: React.FC<{ - readonly schema: z.ZodTypeAny; + readonly schema: AnyZodSchema; readonly jsonPath: JSONPath; readonly value: string; readonly defaultValue: string; diff --git a/packages/studio/src/components/RenderModal/SchemaEditor/ZodSwitch.tsx b/packages/studio/src/components/RenderModal/SchemaEditor/ZodSwitch.tsx index fa94301c16b..e8f244cbfb2 100644 --- a/packages/studio/src/components/RenderModal/SchemaEditor/ZodSwitch.tsx +++ b/packages/studio/src/components/RenderModal/SchemaEditor/ZodSwitch.tsx @@ -1,9 +1,11 @@ import React from 'react'; -import type {z} from 'zod'; +import {useZodTypesIfPossible} from '../../get-zod-if-possible'; +import type {AnyZodSchema} from './zod-schema-type'; import { - useZodIfPossible, - useZodTypesIfPossible, -} from '../../get-zod-if-possible'; + getEffectsInner, + getZodSchemaDescription, + getZodSchemaType, +} from './zod-schema-type'; import type {JSONPath} from './zod-types'; import {ZodArrayEditor} from './ZodArrayEditor'; import {ZodBooleanEditor} from './ZodBooleanEditor'; @@ -32,7 +34,7 @@ export type UpdaterFunction = ( ) => void; export const ZodSwitch: React.FC<{ - readonly schema: z.ZodTypeAny; + readonly schema: AnyZodSchema; readonly jsonPath: JSONPath; readonly value: unknown; readonly defaultValue: unknown; @@ -56,18 +58,11 @@ export const ZodSwitch: React.FC<{ saveDisabledByParent, mayPad, }) => { - const def: z.ZodTypeDef = schema._def; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const typeName = (def as any).typeName as z.ZodFirstPartyTypeKind; - - const z = useZodIfPossible(); - if (!z) { - throw new Error('expected zod'); - } - + const typeName = getZodSchemaType(schema); + const description = getZodSchemaDescription(schema); const zodTypes = useZodTypesIfPossible(); - if (typeName === z.ZodFirstPartyTypeKind.ZodObject) { + if (typeName === 'object') { return ( >} @@ -86,7 +81,29 @@ export const ZodSwitch: React.FC<{ ); } - if (typeName === z.ZodFirstPartyTypeKind.ZodString) { + if (typeName === 'string') { + // In v4, .refine() doesn't wrap in ZodEffects, so check brand here too + if ( + zodTypes && + description === zodTypes.ZodZypesInternals.REMOTION_COLOR_BRAND + ) { + return ( + } + jsonPath={jsonPath} + schema={schema} + onSave={onSave as UpdaterFunction} + defaultValue={defaultValue as string} + showSaveButton={showSaveButton} + onRemove={onRemove} + saving={saving} + saveDisabledByParent={saveDisabledByParent} + mayPad={mayPad} + /> + ); + } + if ((value as string).startsWith(window.remotion_staticBase)) { return ( } + value={value as unknown[]} + jsonPath={jsonPath} + schema={schema} + defaultValue={defaultValue as unknown[]} + onSave={onSave as UpdaterFunction} + showSaveButton={showSaveButton} + onRemove={onRemove} + saving={saving} + saveDisabledByParent={saveDisabledByParent} + mayPad={mayPad} + /> + ); + } + return ( } @@ -276,7 +314,7 @@ export const ZodSwitch: React.FC<{ ); } - if (typeName === z.ZodFirstPartyTypeKind.ZodEnum) { + if (typeName === 'enum') { return ( } @@ -292,11 +330,12 @@ export const ZodSwitch: React.FC<{ ); } - if (typeName === z.ZodFirstPartyTypeKind.ZodEffects) { + // In v3, effects wrap schemas (e.g. .refine(), .transform()). + // In v4, refine/transform are embedded as checks, so this only applies to v3. + if (typeName === 'effects') { if ( zodTypes && - schema._def.description === - zodTypes.ZodZypesInternals.REMOTION_COLOR_BRAND + description === zodTypes.ZodZypesInternals.REMOTION_COLOR_BRAND ) { return ( } value={value as unknown[]} jsonPath={jsonPath} - schema={schema._def.schema} + schema={getEffectsInner(schema)} defaultValue={defaultValue as unknown[]} onSave={onSave as UpdaterFunction} showSaveButton={showSaveButton} @@ -353,7 +391,7 @@ export const ZodSwitch: React.FC<{ ); } - if (typeName === z.ZodFirstPartyTypeKind.ZodUnion) { + if (typeName === 'union') { return ( } @@ -443,7 +481,7 @@ export const ZodSwitch: React.FC<{ ); } - if (typeName === z.ZodFirstPartyTypeKind.ZodTuple) { + if (typeName === 'tuple') { return ( } diff --git a/packages/studio/src/components/RenderModal/SchemaEditor/ZodTextareaEditor.tsx b/packages/studio/src/components/RenderModal/SchemaEditor/ZodTextareaEditor.tsx index 49febf3c57f..b84487ba7c0 100644 --- a/packages/studio/src/components/RenderModal/SchemaEditor/ZodTextareaEditor.tsx +++ b/packages/studio/src/components/RenderModal/SchemaEditor/ZodTextareaEditor.tsx @@ -1,5 +1,4 @@ import React, {useCallback} from 'react'; -import type {z} from 'zod'; import {RemTextarea} from '../../NewComposition/RemTextarea'; import { useZodIfPossible, @@ -10,6 +9,7 @@ import {SchemaLabel} from './SchemaLabel'; import {ZodFieldValidation} from './ZodFieldValidation'; import type {UpdaterFunction} from './ZodSwitch'; import {useLocalState} from './local-state'; +import type {AnyZodSchema} from './zod-schema-type'; import type {JSONPath} from './zod-types'; const fullWidth: React.CSSProperties = { @@ -22,7 +22,7 @@ const textareaStyle: React.CSSProperties = { }; export const ZodTextareaEditor: React.FC<{ - readonly schema: z.ZodTypeAny; + readonly schema: AnyZodSchema; readonly jsonPath: JSONPath; readonly value: string; readonly defaultValue: string; diff --git a/packages/studio/src/components/RenderModal/SchemaEditor/ZodTupleEditor.tsx b/packages/studio/src/components/RenderModal/SchemaEditor/ZodTupleEditor.tsx index 6a902ef983f..bcb5935d492 100644 --- a/packages/studio/src/components/RenderModal/SchemaEditor/ZodTupleEditor.tsx +++ b/packages/studio/src/components/RenderModal/SchemaEditor/ZodTupleEditor.tsx @@ -1,5 +1,4 @@ import React, {useMemo, useState} from 'react'; -import type {z} from 'zod'; import { useZodIfPossible, useZodTypesIfPossible, @@ -11,13 +10,15 @@ import {useLocalState} from './local-state'; import {SchemaLabel} from './SchemaLabel'; import {SchemaArrayItemSeparationLine} from './SchemaSeparationLine'; import {SchemaVerticalGuide} from './SchemaVerticalGuide'; +import type {AnyZodSchema} from './zod-schema-type'; +import {getTupleItems} from './zod-schema-type'; import type {JSONPath} from './zod-types'; import {ZodFieldValidation} from './ZodFieldValidation'; import type {UpdaterFunction} from './ZodSwitch'; import {ZodTupleItemEditor} from './ZodTupleItemEditor'; export const ZodTupleEditor: React.FC<{ - readonly schema: z.ZodTypeAny; + readonly schema: AnyZodSchema; readonly jsonPath: JSONPath; readonly value: unknown[]; readonly defaultValue: unknown[]; @@ -49,7 +50,7 @@ export const ZodTupleEditor: React.FC<{ }); const [expanded, setExpanded] = useState(true); - const def = schema._def as z.ZodTupleDef; + const tupleItems = getTupleItems(schema); const suffix = useMemo(() => { return expanded ? ' [' : ' [...] '; @@ -61,11 +62,6 @@ export const ZodTupleEditor: React.FC<{ const zodTypes = useZodTypesIfPossible(); - const typeName = def.typeName as z.ZodFirstPartyTypeKind; - if (typeName !== z.ZodFirstPartyTypeKind.ZodTuple) { - throw new Error('expected object'); - } - const isDefaultValue = useMemo(() => { return deepEqual(localValue.value, defaultValue); }, [defaultValue, localValue]); @@ -105,12 +101,12 @@ export const ZodTupleEditor: React.FC<{ ; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - def: any; + tupleItems: AnyZodSchema[]; index: number; value: unknown; defaultValue: unknown; @@ -18,7 +18,7 @@ export const ZodTupleItemEditor: React.FC<{ saveDisabledByParent: boolean; mayPad: boolean; }> = ({ - def, + tupleItems, onChange, jsonPath, index, @@ -71,7 +71,7 @@ export const ZodTupleItemEditor: React.FC<{
{ - const nullIndex = value.findIndex( - (v) => - v._def.typeName === zodType.ZodFirstPartyTypeKind.ZodNull || - v._def.typeName === zodType.ZodFirstPartyTypeKind.ZodUndefined, - ); + +const findNull = (value: readonly AnyZodSchema[]) => { + const nullIndex = value.findIndex((v) => { + const type = getZodSchemaType(v); + return type === 'null' || type === 'undefined'; + }); if (nullIndex === -1) { return null; } const nullishValue = - value[nullIndex]._def.typeName === zodType.ZodFirstPartyTypeKind.ZodNull - ? null - : undefined; + getZodSchemaType(value[nullIndex]) === 'null' ? null : undefined; const otherSchema = value[nullIndex === 0 ? 1 : 0]; + const otherType = getZodSchemaType(otherSchema); const otherSchemaIsAlsoNullish = - otherSchema._def.typeName === zodType.ZodFirstPartyTypeKind.ZodNull || - otherSchema._def.typeName === zodType.ZodFirstPartyTypeKind.ZodUndefined; + otherType === 'null' || otherType === 'undefined'; return { nullIndex, @@ -42,7 +36,7 @@ export const ZodUnionEditor: React.FC<{ jsonPath: JSONPath; value: unknown; defaultValue: unknown; - schema: z.ZodTypeAny; + schema: AnyZodSchema; setValue: UpdaterFunction; onSave: UpdaterFunction; onRemove: null | (() => void); @@ -62,12 +56,7 @@ export const ZodUnionEditor: React.FC<{ saveDisabledByParent, mayPad, }) => { - const {options} = schema._def as z.ZodUnionDef; - - const z = useZodIfPossible(); - if (!z) { - throw new Error('expected zod'); - } + const options = getUnionOptions(schema); if (options.length > 2) { return ( @@ -93,7 +82,7 @@ export const ZodUnionEditor: React.FC<{ ); } - const nullResult = findNull(options, z); + const nullResult = findNull(options); if (!nullResult) { return ( diff --git a/packages/studio/src/components/RenderModal/SchemaEditor/create-zod-values.ts b/packages/studio/src/components/RenderModal/SchemaEditor/create-zod-values.ts index 483705be4f5..08d85c4e540 100644 --- a/packages/studio/src/components/RenderModal/SchemaEditor/create-zod-values.ts +++ b/packages/studio/src/components/RenderModal/SchemaEditor/create-zod-values.ts @@ -1,59 +1,107 @@ -import type {z} from 'zod'; -import type {ZodType, ZodTypesType} from '../../get-zod-if-possible'; +import type {ZodTypesType} from '../../get-zod-if-possible'; +import { + type AnyZodSchema, + getArrayElement, + getBrandedInner, + getDefaultValue, + getEffectsInner, + getFirstEnumValue, + getInnerType, + getIntersectionSchemas, + getLiteralValue, + getObjectShape, + getPipelineInput, + getPipelineOutput, + getRecordKeyType, + getRecordValueType, + getTupleItems, + getUnionOptions, + getZodDef, + getZodSchemaDescription, + getZodSchemaType, + isZodV3Schema, +} from './zod-schema-type'; export const createZodValues = ( - schema: Zod.ZodTypeAny, - zodRuntime: ZodType, + schema: AnyZodSchema, + zodRuntime: unknown, zodTypes: ZodTypesType | null, ): unknown => { if (!schema) { throw new Error('Invalid zod schema'); } - const def = schema._def; - const typeName = def.typeName as z.ZodFirstPartyTypeKind; + // In v4, .refine()/.describe() don't wrap in effects — the description + // lives directly on the schema. Check for branded descriptions early + // so they are detected regardless of the underlying type. + const description = getZodSchemaDescription(schema); + if (zodTypes) { + if (description === zodTypes.ZodZypesInternals.REMOTION_COLOR_BRAND) { + return '#ffffff'; + } - switch (typeName) { - case zodRuntime.ZodFirstPartyTypeKind.ZodString: + if (description === zodTypes.ZodZypesInternals.REMOTION_TEXTAREA_BRAND) { return ''; - case zodRuntime.ZodFirstPartyTypeKind.ZodNumber: { - for (const check of (def as z.ZodNumberDef).checks) { - if (check.kind === 'min') { - return check.value; - } + } - if (check.kind === 'max' && check.value < 0) { - return check.value; + if (description === zodTypes.ZodZypesInternals.REMOTION_MATRIX_BRAND) { + return [ + [1, 0, 0], + [0, 1, 0], + [0, 0, 1], + ]; + } + } + + const typeName = getZodSchemaType(schema); + + switch (typeName) { + case 'string': + return ''; + case 'number': { + const {checks} = getZodDef(schema); + if (checks) { + if (isZodV3Schema(schema)) { + for (const check of checks) { + if (check.kind === 'min') return check.value; + if (check.kind === 'max' && check.value < 0) return check.value; + } + } else { + for (const check of checks) { + const cd = check._zod?.def; + if (cd?.check === 'greater_than') return cd.value; + if (cd?.check === 'less_than' && cd.value < 0) return cd.value; + } } } return 0; } - case zodRuntime.ZodFirstPartyTypeKind.ZodBigInt: + case 'bigint': return BigInt(0); - case zodRuntime.ZodFirstPartyTypeKind.ZodBoolean: + case 'boolean': return false; - case zodRuntime.ZodFirstPartyTypeKind.ZodNaN: + case 'nan': return NaN; - case zodRuntime.ZodFirstPartyTypeKind.ZodDate: + case 'date': return new Date(); - case zodRuntime.ZodFirstPartyTypeKind.ZodSymbol: + case 'symbol': return Symbol('remotion'); - case zodRuntime.ZodFirstPartyTypeKind.ZodUndefined: + case 'undefined': + case 'void': return undefined; - case zodRuntime.ZodFirstPartyTypeKind.ZodNull: + case 'null': return null; - case zodRuntime.ZodFirstPartyTypeKind.ZodAny: + case 'any': + case 'custom': throw new Error('Cannot create a value for type z.any()'); - case zodRuntime.ZodFirstPartyTypeKind.ZodUnknown: + case 'unknown': throw new Error('Cannot create a value for type z.unknown()'); - case zodRuntime.ZodFirstPartyTypeKind.ZodNever: + case 'never': throw new Error('Cannot create a value for type z.never()'); - case zodRuntime.ZodFirstPartyTypeKind.ZodVoid: - return undefined; - case zodRuntime.ZodFirstPartyTypeKind.ZodObject: { - const shape = (def as z.ZodObjectDef).shape(); + case 'object': { + const shape = getObjectShape(schema); const keys = Object.keys(shape); const returnValue = keys.reduce( (existing, key) => { @@ -65,66 +113,32 @@ export const createZodValues = ( return returnValue; } - case zodRuntime.ZodFirstPartyTypeKind.ZodArray: { - return [ - createZodValues((def as z.ZodArrayDef).type, zodRuntime, zodTypes), - ]; + case 'array': { + return [createZodValues(getArrayElement(schema), zodRuntime, zodTypes)]; } - case zodRuntime.ZodFirstPartyTypeKind.ZodUnion: { - const firstOptions = (def as z.ZodUnionDef).options[0]; - return firstOptions - ? createZodValues(firstOptions, zodRuntime, zodTypes) + case 'union': { + const firstOption = getUnionOptions(schema)[0]; + return firstOption + ? createZodValues(firstOption, zodRuntime, zodTypes) : undefined; } - case zodRuntime.ZodFirstPartyTypeKind.ZodDiscriminatedUnion: { - const options = (def as z.ZodDiscriminatedUnionDef).options[0]; - return createZodValues(options, zodRuntime, zodTypes); + case 'discriminatedUnion': { + const firstOption = getUnionOptions(schema)[0]; + return createZodValues(firstOption, zodRuntime, zodTypes); } - case zodRuntime.ZodFirstPartyTypeKind.ZodLiteral: { - return (def as z.ZodLiteralDef).value; + case 'literal': { + return getLiteralValue(schema); } - case zodRuntime.ZodFirstPartyTypeKind.ZodEffects: { - if ( - zodTypes && - schema._def.description === - zodTypes.ZodZypesInternals.REMOTION_COLOR_BRAND - ) { - return '#ffffff'; - } - - if ( - zodTypes && - schema._def.description === - zodTypes.ZodZypesInternals.REMOTION_TEXTAREA_BRAND - ) { - return ''; - } - - if ( - zodTypes && - schema._def.description === - zodTypes.ZodZypesInternals.REMOTION_MATRIX_BRAND - ) { - return [ - [1, 0, 0], - [0, 1, 0], - [0, 0, 1], - ]; - } - - return createZodValues( - (def as z.ZodEffectsDef).schema, - zodRuntime, - zodTypes, - ); + case 'effects': { + return createZodValues(getEffectsInner(schema), zodRuntime, zodTypes); } - case zodRuntime.ZodFirstPartyTypeKind.ZodIntersection: { - const {left, right} = def as z.ZodIntersectionDef; + case 'intersection': { + const {left, right} = getIntersectionSchemas(schema); const leftValue = createZodValues(left, zodRuntime, zodTypes); if (typeof leftValue !== 'object') { throw new Error( @@ -143,95 +157,93 @@ export const createZodValues = ( return {...leftValue, ...rightValue}; } - case zodRuntime.ZodFirstPartyTypeKind.ZodTuple: { - const items = (def as z.ZodTupleDef).items.map((item) => + case 'tuple': { + return getTupleItems(schema).map((item) => createZodValues(item, zodRuntime, zodTypes), ); - return items; } - case zodRuntime.ZodFirstPartyTypeKind.ZodRecord: { + case 'record': { const values = createZodValues( - (def as z.ZodRecordDef).valueType, + getRecordValueType(schema), zodRuntime, zodTypes, ); return {key: values}; } - case zodRuntime.ZodFirstPartyTypeKind.ZodMap: { - const defType = def as z.ZodMapDef; - const values = createZodValues(defType.valueType, zodRuntime, zodTypes); - const key = createZodValues(defType.keyType, zodRuntime, zodTypes); + case 'map': { + const values = createZodValues( + getRecordValueType(schema), + zodRuntime, + zodTypes, + ); + const key = createZodValues( + getRecordKeyType(schema), + zodRuntime, + zodTypes, + ); return new Map([[key, values]]); } - case zodRuntime.ZodFirstPartyTypeKind.ZodLazy: { - const defType = def as z.ZodLazyDef; - const type = defType.getter(); + case 'lazy': { + const type = getZodDef(schema).getter(); return createZodValues(type, zodRuntime, zodTypes); } - case zodRuntime.ZodFirstPartyTypeKind.ZodSet: { - const defType = def as z.ZodSetDef; - const values = createZodValues(defType.valueType, zodRuntime, zodTypes); + case 'set': { + const values = createZodValues( + getZodDef(schema).valueType, + zodRuntime, + zodTypes, + ); return new Set([values]); } - case zodRuntime.ZodFirstPartyTypeKind.ZodFunction: { + case 'function': { throw new Error('Cannot create a value for type function'); } - case zodRuntime.ZodFirstPartyTypeKind.ZodEnum: { - const {values} = def as z.ZodEnumDef; - return values[0]; + case 'enum': { + return getFirstEnumValue(schema); } - case zodRuntime.ZodFirstPartyTypeKind.ZodNativeEnum: { + case 'nativeEnum': { return 0; } - case zodRuntime.ZodFirstPartyTypeKind.ZodOptional: { - const defType = def as z.ZodOptionalDef; - const value = createZodValues(defType.innerType, zodRuntime, zodTypes); - return value; - } - - case zodRuntime.ZodFirstPartyTypeKind.ZodNullable: { - const defType = def as z.ZodNullableDef; - const value = createZodValues(defType.innerType, zodRuntime, zodTypes); - return value; - } - - case zodRuntime.ZodFirstPartyTypeKind.ZodDefault: { - const defType = def as z.ZodDefaultDef; - return defType.defaultValue(); + case 'optional': + case 'nullable': + case 'catch': { + return createZodValues(getInnerType(schema), zodRuntime, zodTypes); } - case zodRuntime.ZodFirstPartyTypeKind.ZodCatch: { - const defType = def as z.ZodCatchDef; - const value = createZodValues(defType.innerType, zodRuntime, zodTypes); - return value; + case 'default': { + return getDefaultValue(schema); } - case zodRuntime.ZodFirstPartyTypeKind.ZodPromise: { - const defType = def as z.ZodPromiseDef; - const value = createZodValues(defType.type, zodRuntime, zodTypes); + case 'promise': { + const def = getZodDef(schema); + // v3: _def.type, v4: _def.innerType + const inner = isZodV3Schema(schema) ? def.type : def.innerType; + const value = createZodValues(inner, zodRuntime, zodTypes); return Promise.resolve(value); } - case zodRuntime.ZodFirstPartyTypeKind.ZodBranded: { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const defType = def as z.ZodBrandedDef; - const value = createZodValues(defType.type, zodRuntime, zodTypes); - return value; + case 'branded': { + return createZodValues(getBrandedInner(schema), zodRuntime, zodTypes); } - case zodRuntime.ZodFirstPartyTypeKind.ZodPipeline: { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const defType = def as z.ZodPipelineDef; - const value = createZodValues(defType.out, zodRuntime, zodTypes); - return value; + case 'pipeline': + case 'pipe': { + const out = getPipelineOutput(schema); + // In v4, .transform() creates pipe { in, out: transform }. + // Since we don't apply transforms, use the input side. + if (getZodSchemaType(out) === 'transform') { + return createZodValues(getPipelineInput(schema), zodRuntime, zodTypes); + } + + return createZodValues(out, zodRuntime, zodTypes); } default: diff --git a/packages/studio/src/components/RenderModal/SchemaEditor/extract-enum-json-paths.ts b/packages/studio/src/components/RenderModal/SchemaEditor/extract-enum-json-paths.ts index d11448fcbea..817d183b1ae 100644 --- a/packages/studio/src/components/RenderModal/SchemaEditor/extract-enum-json-paths.ts +++ b/packages/studio/src/components/RenderModal/SchemaEditor/extract-enum-json-paths.ts @@ -1,5 +1,20 @@ -import type {z} from 'zod'; -import type {ZodType, ZodTypesType} from '../../get-zod-if-possible'; +import type {ZodTypesType} from '../../get-zod-if-possible'; +import { + type AnyZodSchema, + getArrayElement, + getBrandedInner, + getEffectsInner, + getInnerType, + getIntersectionSchemas, + getObjectShape, + getPipelineOutput, + getRecordKeyType, + getRecordValueType, + getTupleItems, + getUnionOptions, + getZodSchemaDescription, + getZodSchemaType, +} from './zod-schema-type'; export const extractEnumJsonPaths = ({ schema, @@ -7,17 +22,27 @@ export const extractEnumJsonPaths = ({ currentPath, zodTypes, }: { - schema: Zod.ZodTypeAny; - zodRuntime: ZodType; + schema: AnyZodSchema; + zodRuntime: unknown; zodTypes: ZodTypesType | null; currentPath: (string | number)[]; }): (string | number)[][] => { - const def = schema._def; - const typeName = def.typeName as z.ZodFirstPartyTypeKind; + // In v4, .refine()/.describe() don't wrap in effects — the description + // lives directly on the schema. Check for branded descriptions early + // so they are detected regardless of the underlying type. + const description = getZodSchemaDescription(schema); + if ( + zodTypes && + description === zodTypes.ZodZypesInternals.REMOTION_MATRIX_BRAND + ) { + return [currentPath]; + } + + const typeName = getZodSchemaType(schema); switch (typeName) { - case zodRuntime.ZodFirstPartyTypeKind.ZodObject: { - const shape = (def as z.ZodObjectDef).shape(); + case 'object': { + const shape = getObjectShape(schema); const keys = Object.keys(shape); return keys .map((key) => { @@ -31,17 +56,17 @@ export const extractEnumJsonPaths = ({ .flat(1); } - case zodRuntime.ZodFirstPartyTypeKind.ZodArray: { + case 'array': { return extractEnumJsonPaths({ - schema: (def as z.ZodArrayDef).type, + schema: getArrayElement(schema), zodRuntime, currentPath: [...currentPath, '[]'], zodTypes, }); } - case zodRuntime.ZodFirstPartyTypeKind.ZodUnion: { - return (def as z.ZodUnionDef).options + case 'union': { + return getUnionOptions(schema) .map((option) => { return extractEnumJsonPaths({ schema: option, @@ -53,8 +78,8 @@ export const extractEnumJsonPaths = ({ .flat(1); } - case zodRuntime.ZodFirstPartyTypeKind.ZodDiscriminatedUnion: { - return (def as z.ZodDiscriminatedUnionDef).options + case 'discriminatedUnion': { + return getUnionOptions(schema) .map((op) => { return extractEnumJsonPaths({ schema: op, @@ -66,29 +91,21 @@ export const extractEnumJsonPaths = ({ .flat(1); } - case zodRuntime.ZodFirstPartyTypeKind.ZodLiteral: { + case 'literal': { return [currentPath]; } - case zodRuntime.ZodFirstPartyTypeKind.ZodEffects: { - if ( - zodTypes && - schema._def.description === - zodTypes.ZodZypesInternals.REMOTION_MATRIX_BRAND - ) { - return [currentPath]; - } - + case 'effects': { return extractEnumJsonPaths({ - schema: (def as z.ZodEffectsDef).schema, + schema: getEffectsInner(schema), zodRuntime, currentPath, zodTypes, }); } - case zodRuntime.ZodFirstPartyTypeKind.ZodIntersection: { - const {left, right} = def as z.ZodIntersectionDef; + case 'intersection': { + const {left, right} = getIntersectionSchemas(schema); const leftValue = extractEnumJsonPaths({ schema: left, zodRuntime, @@ -106,8 +123,8 @@ export const extractEnumJsonPaths = ({ return [...leftValue, ...rightValue]; } - case zodRuntime.ZodFirstPartyTypeKind.ZodTuple: { - return (def as z.ZodTupleDef).items + case 'tuple': { + return getTupleItems(schema) .map((item, i) => extractEnumJsonPaths({ schema: item, @@ -119,116 +136,95 @@ export const extractEnumJsonPaths = ({ .flat(1); } - case zodRuntime.ZodFirstPartyTypeKind.ZodRecord: { - const values = extractEnumJsonPaths({ - schema: (def as z.ZodRecordDef).valueType, + case 'record': { + const recordPath = [...currentPath, '{}']; + const keyResults = extractEnumJsonPaths({ + schema: getRecordKeyType(schema), + zodRuntime, + currentPath: recordPath, + zodTypes, + }); + const valueResults = extractEnumJsonPaths({ + schema: getRecordValueType(schema), zodRuntime, - currentPath: [...currentPath, '{}'], + currentPath: recordPath, zodTypes, }); - return values; + return [...keyResults, ...valueResults]; } - case zodRuntime.ZodFirstPartyTypeKind.ZodFunction: { + case 'function': { throw new Error('Cannot create a value for type function'); } - case zodRuntime.ZodFirstPartyTypeKind.ZodEnum: { + case 'enum': { return [currentPath]; } - case zodRuntime.ZodFirstPartyTypeKind.ZodNativeEnum: { + case 'nativeEnum': { return []; } - case zodRuntime.ZodFirstPartyTypeKind.ZodOptional: { - const defType = def as z.ZodOptionalDef; - const value = extractEnumJsonPaths({ - schema: defType.innerType, - zodRuntime, - currentPath, - zodTypes, - }); - return value; - } - - case zodRuntime.ZodFirstPartyTypeKind.ZodNullable: { - const defType = def as z.ZodNullableDef; - const value = extractEnumJsonPaths({ - schema: defType.innerType, - zodRuntime, - currentPath, - zodTypes, - }); - return value; - } - - case zodRuntime.ZodFirstPartyTypeKind.ZodDefault: { - const defType = def as z.ZodDefaultDef; + case 'optional': + case 'nullable': + case 'catch': { return extractEnumJsonPaths({ - schema: defType.innerType, + schema: getInnerType(schema), zodRuntime, currentPath, zodTypes, }); } - case zodRuntime.ZodFirstPartyTypeKind.ZodCatch: { - const defType = def as z.ZodCatchDef; + case 'default': { return extractEnumJsonPaths({ - schema: defType.innerType, + schema: getInnerType(schema), zodRuntime, currentPath, zodTypes, }); } - case zodRuntime.ZodFirstPartyTypeKind.ZodPromise: { + case 'promise': { return []; } - case zodRuntime.ZodFirstPartyTypeKind.ZodBranded: { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const defType = def as z.ZodBrandedDef; - const value = extractEnumJsonPaths({ - schema: defType.type, + case 'branded': { + return extractEnumJsonPaths({ + schema: getBrandedInner(schema), zodRuntime, currentPath, zodTypes, }); - return value; } - case zodRuntime.ZodFirstPartyTypeKind.ZodPipeline: { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const defType = def as z.ZodPipelineDef; - const value = extractEnumJsonPaths({ - schema: defType.out, + case 'pipeline': + case 'pipe': { + return extractEnumJsonPaths({ + schema: getPipelineOutput(schema), zodRuntime, currentPath, zodTypes, }); - return value; - } - - case zodRuntime.ZodFirstPartyTypeKind.ZodString: - case zodRuntime.ZodFirstPartyTypeKind.ZodNumber: - case zodRuntime.ZodFirstPartyTypeKind.ZodBigInt: - case zodRuntime.ZodFirstPartyTypeKind.ZodBoolean: - case zodRuntime.ZodFirstPartyTypeKind.ZodNaN: - case zodRuntime.ZodFirstPartyTypeKind.ZodDate: - case zodRuntime.ZodFirstPartyTypeKind.ZodSymbol: - case zodRuntime.ZodFirstPartyTypeKind.ZodUndefined: - case zodRuntime.ZodFirstPartyTypeKind.ZodNull: - case zodRuntime.ZodFirstPartyTypeKind.ZodAny: - case zodRuntime.ZodFirstPartyTypeKind.ZodUnknown: - case zodRuntime.ZodFirstPartyTypeKind.ZodNever: - case zodRuntime.ZodFirstPartyTypeKind.ZodVoid: - case zodRuntime.ZodFirstPartyTypeKind.ZodMap: // Maps are not serializable - case zodRuntime.ZodFirstPartyTypeKind.ZodLazy: - case zodRuntime.ZodFirstPartyTypeKind.ZodSet: { - // Sets are not serializable + } + case 'string': + case 'number': + case 'bigint': + case 'boolean': + case 'nan': + case 'date': + case 'symbol': + case 'undefined': + case 'null': + case 'any': + case 'unknown': + case 'never': + case 'void': + case 'map': + case 'lazy': + case 'set': + case 'custom': { return []; } diff --git a/packages/studio/src/components/RenderModal/SchemaEditor/local-state.tsx b/packages/studio/src/components/RenderModal/SchemaEditor/local-state.tsx index 636b6c7698e..9cf27d67ad8 100644 --- a/packages/studio/src/components/RenderModal/SchemaEditor/local-state.tsx +++ b/packages/studio/src/components/RenderModal/SchemaEditor/local-state.tsx @@ -8,13 +8,14 @@ import React, { useState, } from 'react'; import {Internals} from 'remotion'; -import type {z} from 'zod'; import type {UpdaterFunction} from './ZodSwitch'; import {deepEqual} from './deep-equal'; +import type {AnyZodSchema, ZodSafeParseResult} from './zod-schema-type'; +import {zodSafeParse} from './zod-schema-type'; export type LocalState = { value: T; - zodValidation: z.SafeParseReturnType; + zodValidation: ZodSafeParseResult; keyStabilityRevision: number; }; @@ -34,7 +35,7 @@ export const useLocalState = ({ savedValue, }: { unsavedValue: T; - schema: z.ZodTypeAny; + schema: AnyZodSchema; setValue: UpdaterFunction; savedValue: T; }) => { @@ -48,7 +49,7 @@ export const useLocalState = ({ [parentRevision]: { value: unsavedValue, keyStabilityRevision: 0, - zodValidation: schema.safeParse(unsavedValue), + zodValidation: zodSafeParse(schema, unsavedValue), }, }; }); @@ -58,7 +59,7 @@ export const useLocalState = ({ return { value: unsavedValue, keyStabilityRevision: 0, - zodValidation: schema.safeParse(unsavedValue), + zodValidation: zodSafeParse(schema, unsavedValue), }; } @@ -83,7 +84,7 @@ export const useLocalState = ({ localUnsavedValue ?? { value: savedValue, keyStabilityRevision: 0, - zodValidation: schema.safeParse(savedValue), + zodValidation: zodSafeParse(schema, savedValue), } ); }, [localUnsavedValue, savedValue, schema]); @@ -101,7 +102,7 @@ export const useLocalState = ({ return; } - const safeParse = schema.safeParse(newValue); + const safeParse = zodSafeParse(schema, newValue); if (safeParse.success || forceApply) { setValue(updater, forceApply, increment); diff --git a/packages/studio/src/components/RenderModal/SchemaEditor/zod-schema-type.ts b/packages/studio/src/components/RenderModal/SchemaEditor/zod-schema-type.ts new file mode 100644 index 00000000000..5aff45065a3 --- /dev/null +++ b/packages/studio/src/components/RenderModal/SchemaEditor/zod-schema-type.ts @@ -0,0 +1,406 @@ +/** + * Normalizes zod schema type detection across v3 and v4. + * + * v3 schemas have `_def.typeName` (e.g. "ZodString") + * v4 schemas have `_def.type` (e.g. "string") and `_zod` property + * + * This module provides a unified type name using v4-style lowercase strings, + * and accessor helpers that abstract v3/v4 `_def` property differences. + */ + +/** + * Structural type for any Zod schema (v3 or v4). + * + * v3 schemas have `_def` with `typeName` property. + * v4 classic schemas have `_def` with `type` property. + * v4 core schemas have `_zod.def` with `type` property. + * At runtime, all zod schemas have `_def` (classic layer adds it for v4). + */ +export interface ZodValidationError { + format(): {_errors: string[]}; + issues: readonly { + code: string; + message: string; + path: readonly PropertyKey[]; + }[]; +} + +export type ZodSafeParseResult = + | {success: true; data: unknown} + | {success: false; error: ZodValidationError}; + +export interface AnyZodSchema { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + readonly _def?: Record; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + readonly _zod?: {def: Record; [key: string]: any}; + readonly description?: string; +} + +/** + * Call safeParse on any Zod schema (v3 or v4). + * All Zod schemas have safeParse at runtime, but some v4 internal types + * (like $ZodObject) don't declare it in their type definition. + */ +export const zodSafeParse = ( + schema: AnyZodSchema, + data: unknown, +): ZodSafeParseResult => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return (schema as any).safeParse(data); +}; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export const getZodDef = (schema: AnyZodSchema): Record => { + if (schema._def) return schema._def; + if (schema._zod) return schema._zod.def; + throw new Error('Invalid zod schema: missing _def and _zod'); +}; + +export type ZodSchemaType = + | 'string' + | 'number' + | 'boolean' + | 'object' + | 'array' + | 'enum' + | 'union' + | 'discriminatedUnion' + | 'optional' + | 'nullable' + | 'default' + | 'tuple' + | 'date' + | 'any' + | 'unknown' + | 'bigint' + | 'null' + | 'undefined' + | 'effects' + | 'literal' + | 'record' + | 'never' + | (string & {}); + +const v3TypeNameMap: Record = { + ZodString: 'string', + ZodNumber: 'number', + ZodBoolean: 'boolean', + ZodObject: 'object', + ZodArray: 'array', + ZodEnum: 'enum', + ZodUnion: 'union', + ZodDiscriminatedUnion: 'discriminatedUnion', + ZodOptional: 'optional', + ZodNullable: 'nullable', + ZodDefault: 'default', + ZodTuple: 'tuple', + ZodDate: 'date', + ZodAny: 'any', + ZodUnknown: 'unknown', + ZodBigInt: 'bigint', + ZodNull: 'null', + ZodUndefined: 'undefined', + ZodEffects: 'effects', + ZodLiteral: 'literal', + ZodRecord: 'record', + ZodNever: 'never', + ZodVoid: 'void', + ZodNaN: 'nan', + ZodSymbol: 'symbol', + ZodIntersection: 'intersection', + ZodMap: 'map', + ZodSet: 'set', + ZodLazy: 'lazy', + ZodFunction: 'function', + ZodNativeEnum: 'nativeEnum', + ZodCatch: 'catch', + ZodPromise: 'promise', + ZodBranded: 'branded', + ZodPipeline: 'pipeline', +}; + +export const isZodV3Schema = (schema: AnyZodSchema): boolean => { + const def = getZodDef(schema); + return 'typeName' in def; +}; + +/** + * Get the normalized type name for a zod schema (v3 or v4). + * + * In v4, discriminatedUnion is a union with a `discriminator` property on `_def`. + * This function returns 'discriminatedUnion' for that case. + */ +export const getZodSchemaType = (schema: AnyZodSchema): ZodSchemaType => { + const def = getZodDef(schema); + + if ('typeName' in def) { + const {typeName} = def; + return v3TypeNameMap[typeName] ?? typeName; + } + + // v4 schema: def.type is a string like "string", "number", etc. + const {type} = def; + + // In v4, discriminatedUnion has def.type === "union" with def.discriminator + if (type === 'union' && def.discriminator !== undefined) { + return 'discriminatedUnion'; + } + + return type; +}; + +/** + * Get the description of a schema, handling v3 vs v4 differences. + * + * v3: _def.description + * v4: schema.description + */ +export const getZodSchemaDescription = ( + schema: AnyZodSchema, +): string | undefined => { + if (isZodV3Schema(schema)) { + return getZodDef(schema).description; + } + + return schema.description; +}; + +/** + * Get the shape of an object schema. + * v3: _def.shape() (function) + * v4: _def.shape (plain object) + */ +export const getObjectShape = ( + schema: AnyZodSchema, +): Record => { + const {shape} = getZodDef(schema); + return typeof shape === 'function' ? shape() : shape; +}; + +/** + * Get the element schema of an array. + * v3: _def.type + * v4: _def.element + */ +export const getArrayElement = (schema: AnyZodSchema): AnyZodSchema => { + const def = getZodDef(schema); + return isZodV3Schema(schema) ? def.type : def.element; +}; + +/** + * Get the inner type for wrappers like optional, nullable, default, catch. + * Both v3 and v4 use _def.innerType. + */ +export const getInnerType = (schema: AnyZodSchema): AnyZodSchema => { + return getZodDef(schema).innerType; +}; + +/** + * Get the inner schema for effects (v3 only - v4 doesn't wrap). + * v3: _def.schema + */ +export const getEffectsInner = (schema: AnyZodSchema): AnyZodSchema => { + return getZodDef(schema).schema; +}; + +/** + * Get the literal value. + * v3: _def.value (single value) + * v4: _def.values (array of values) - take the first + */ +export const getLiteralValue = (schema: AnyZodSchema): unknown => { + const def = getZodDef(schema); + if (isZodV3Schema(schema)) { + return def.value; + } + + return def.values?.[0]; +}; + +/** + * Get enum values as an array of strings. + * v3: _def.values (string[]) + * v4: _def.entries (Record) - convert to values array + */ +export const getEnumValues = (schema: AnyZodSchema): string[] => { + const def = getZodDef(schema); + if (isZodV3Schema(schema)) { + return def.values; + } + + const {entries} = def; + return Object.values(entries); +}; + +/** + * Get the first valid value from an enum schema. + * Handles both regular enums and nativeEnums. + * + * In v4, nativeEnums are represented as regular enums with bidirectional + * entries (e.g. { Apple: 0, "0": "Apple" }). This function filters out + * the reverse mappings to return actual enum values. + */ +export const getFirstEnumValue = (schema: AnyZodSchema): unknown => { + const def = getZodDef(schema); + + if (isZodV3Schema(schema)) { + if (def.typeName === 'ZodNativeEnum') { + const vals = Object.values(def.values); + return vals[0]; + } + + return def.values[0]; + } + + const {entries} = def; + const pairs = Object.entries(entries); + + // Check for native enum with bidirectional mapping + const hasReverseMapping = pairs.some(([key, value]) => key !== String(value)); + if (hasReverseMapping) { + // For numeric native enums, filter out the numeric-key reverse mappings + const forwardPairs = pairs.filter(([key]) => Number.isNaN(Number(key))); + if (forwardPairs.length > 0) { + return forwardPairs[0][1]; + } + } + + return Object.values(entries)[0]; +}; + +/** + * Get the union/discriminatedUnion options array. + * Both v3 and v4 use _def.options. + */ +export const getUnionOptions = (schema: AnyZodSchema): AnyZodSchema[] => { + return getZodDef(schema).options; +}; + +/** + * Get the default value from a ZodDefault. + * v3: _def.defaultValue() (function) + * v4: _def.defaultValue (plain value) + */ +export const getDefaultValue = (schema: AnyZodSchema): unknown => { + const dv = getZodDef(schema).defaultValue; + return typeof dv === 'function' ? dv() : dv; +}; + +/** + * Get the discriminator key from a discriminated union. + * v3: _def.discriminator + * v4: _def.discriminator + */ +export const getDiscriminator = (schema: AnyZodSchema): string => { + return getZodDef(schema).discriminator; +}; + +/** + * Get all discriminator option keys from a discriminated union. + * v3: [..._def.optionsMap.keys()] + * v4: iterate options and extract literal values from discriminator field + */ +export const getDiscriminatedOptionKeys = (schema: AnyZodSchema): string[] => { + const def = getZodDef(schema); + const discriminator = getDiscriminator(schema); + + // v3 has optionsMap + if (isZodV3Schema(schema) && def.optionsMap) { + return [...def.optionsMap.keys()]; + } + + // v4: iterate options + const options = getUnionOptions(schema); + return options.map((option) => { + const shape = getObjectShape(option); + const discriminatorSchema = shape[discriminator]; + return getLiteralValue(discriminatorSchema) as string; + }); +}; + +/** + * Get the option schema matching a discriminator value. + * v3: _def.optionsMap.get(value) + * v4: find matching option by inspecting literal values + */ +export const getDiscriminatedOption = ( + schema: AnyZodSchema, + discriminatorValue: string, +): AnyZodSchema | undefined => { + const def = getZodDef(schema); + const discriminator = getDiscriminator(schema); + + // v3 has optionsMap + if (isZodV3Schema(schema) && def.optionsMap) { + return def.optionsMap.get(discriminatorValue); + } + + // v4: iterate options + const options = getUnionOptions(schema); + return options.find((option) => { + const shape = getObjectShape(option); + const discriminatorSchema = shape[discriminator]; + return getLiteralValue(discriminatorSchema) === discriminatorValue; + }); +}; + +/** + * Get the left and right schemas from an intersection. + * Both v3 and v4 use _def.left and _def.right. + */ +export const getIntersectionSchemas = ( + schema: AnyZodSchema, +): {left: AnyZodSchema; right: AnyZodSchema} => { + const def = getZodDef(schema); + return {left: def.left, right: def.right}; +}; + +/** + * Get the items array from a tuple schema. + * Both v3 and v4 use _def.items. + */ +export const getTupleItems = (schema: AnyZodSchema): AnyZodSchema[] => { + return getZodDef(schema).items; +}; + +/** + * Get the value type schema from a record. + * Both v3 and v4 use _def.valueType. + */ +export const getRecordValueType = (schema: AnyZodSchema): AnyZodSchema => { + return getZodDef(schema).valueType; +}; + +/** + * Get the key type schema from a record. + * Both v3 and v4 use _def.keyType. + */ +export const getRecordKeyType = (schema: AnyZodSchema): AnyZodSchema => { + return getZodDef(schema).keyType; +}; + +/** + * Get the output schema from a pipeline/pipe. + * Both v3 and v4 use _def.out. + */ +export const getPipelineOutput = (schema: AnyZodSchema): AnyZodSchema => { + return getZodDef(schema).out; +}; + +/** + * Get the input schema from a pipeline/pipe. + * Both v3 and v4 use _def.in. + */ +export const getPipelineInput = (schema: AnyZodSchema): AnyZodSchema => { + return getZodDef(schema).in; +}; + +/** + * Get the inner schema from a branded type. + * v3: _def.type + * v4: branded is the schema itself (branding is type-level only) + */ +export const getBrandedInner = (schema: AnyZodSchema): AnyZodSchema => { + return isZodV3Schema(schema) ? getZodDef(schema).type : schema; +}; diff --git a/packages/studio/src/components/get-zod-if-possible.tsx b/packages/studio/src/components/get-zod-if-possible.tsx index b54594f10f0..b51f65740b9 100644 --- a/packages/studio/src/components/get-zod-if-possible.tsx +++ b/packages/studio/src/components/get-zod-if-possible.tsx @@ -8,6 +8,8 @@ import React, { // eslint-disable-next-line @typescript-eslint/consistent-type-imports export type ZodType = Awaited['z']; +// eslint-disable-next-line @typescript-eslint/consistent-type-imports +export type ZodV3Type = Awaited; export type ZodTypesType = Awaited< // eslint-disable-next-line @typescript-eslint/consistent-type-imports typeof import('@remotion/zod-types') @@ -22,6 +24,15 @@ export async function getZodIfPossible(): Promise { } } +export const getZodV3IfPossible = async (): Promise => { + try { + const mod = await import('zod/v3'); + return mod; + } catch { + return null; + } +}; + export const getZTypesIfPossible = async (): Promise => { try { const mod = await import('@remotion/zod-types'); @@ -36,6 +47,11 @@ export function useZodIfPossible(): ZodType | null { return context?.zod ?? null; } +export const useZodV3IfPossible = () => { + const context = useContext(ZodContext); + return context?.zodV3 ?? null; +}; + export const useZodTypesIfPossible = () => { const context = useContext(ZodContext); return context?.zodTypes ?? null; @@ -43,6 +59,7 @@ export const useZodTypesIfPossible = () => { type ContextType = { zod: ZodType | null; + zodV3: ZodV3Type | null; zodTypes: ZodTypesType | null; }; @@ -52,12 +69,17 @@ export const ZodProvider: React.FC<{ readonly children: React.ReactNode; }> = ({children}) => { const [zod, setZod] = useState(null); + const [zodV3, setZodV3] = useState(null); const [zodTypes, setZodTypes] = useState(null); useEffect(() => { getZodIfPossible().then((z) => setZod(z)); }, []); + useEffect(() => { + getZodV3IfPossible().then((z) => setZodV3(z)); + }, []); + useEffect(() => { getZTypesIfPossible().then((z) => setZodTypes(z)); }, []); @@ -65,9 +87,10 @@ export const ZodProvider: React.FC<{ const contextValue = useMemo(() => { return { zod, + zodV3, zodTypes, }; - }, [zod, zodTypes]); + }, [zod, zodV3, zodTypes]); return ( {children} diff --git a/packages/studio/src/test/create-zod-values.test.ts b/packages/studio/src/test/create-zod-values.test.ts index 417176d99a6..461c9a7f129 100644 --- a/packages/studio/src/test/create-zod-values.test.ts +++ b/packages/studio/src/test/create-zod-values.test.ts @@ -72,8 +72,8 @@ test('Should be able to create a union', async () => { expect(createZodValues(z.union([z.number(), z.string()]), z, zodTypes)).toBe( 0, ); - // @ts-expect-error union - expect(createZodValues(z.union([]), z, zodTypes)).toBe(undefined); + // In v4, z.union([]) throws during schema creation + expect(() => createZodValues(z.union([]) as never, z, zodTypes)).toThrow(); }); test('Zod literal', async () => { @@ -109,10 +109,11 @@ test('Should be able to create a discriminated union', async () => { ), ).toEqual({status: 'failed', error: 0}); + // In v4, z.discriminatedUnion('status', []) throws during schema creation expect(() => // @ts-expect-error invalid zod type createZodValues(z.discriminatedUnion('status', []), z, zodTypes), - ).toThrow(/Invalid zod schema/); + ).toThrow(); }); test('Zod instanceof', async () => { @@ -155,7 +156,7 @@ test('Zod record', async () => { const z = await getZ(); const zodTypes = await getZodTypes(); - const Record = z.record(z.string()); + const Record = z.record(z.string(), z.string()); expect(createZodValues(Record, z, zodTypes)).toEqual({key: ''}); }); @@ -267,7 +268,7 @@ test('Zod promise', async () => { const z = await getZ(); const zodTypes = await getZodTypes(); - const undef = z.string().promise(); + const undef = z.promise(z.string()); (createZodValues(undef, z, zodTypes) as Promise).then((v) => { expect(v).toBe(''); }); diff --git a/packages/studio/src/test/extract-zod-enums.test.ts b/packages/studio/src/test/extract-zod-enums.test.ts index 59704585094..78439ff1152 100644 --- a/packages/studio/src/test/extract-zod-enums.test.ts +++ b/packages/studio/src/test/extract-zod-enums.test.ts @@ -43,9 +43,9 @@ test('Extract Zod enums #2', () => { ), tuples: z.tuple([z.enum(['a']), z.enum(['b'])]).optional(), abc: z - .record(z.enum(['a', 'b', 'c'])) + .record(z.enum(['a', 'b', 'c']), z.unknown()) .nullable() - .default({}), + .default(() => null), branded: z.object({a: z.enum(['a'])}).brand('branded'), }), zodRuntime: z, diff --git a/packages/studio/src/visual-controls/VisualControls.tsx b/packages/studio/src/visual-controls/VisualControls.tsx index 30a96ae7141..90b0427b628 100644 --- a/packages/studio/src/visual-controls/VisualControls.tsx +++ b/packages/studio/src/visual-controls/VisualControls.tsx @@ -9,14 +9,14 @@ import React, { useState, } from 'react'; import {useRemotionEnvironment} from 'remotion'; -import type {z, ZodTypeAny} from 'zod'; import {getZodSchemaFromPrimitive} from '../api/get-zod-schema-from-primitive'; import {useZodIfPossible} from '../components/get-zod-if-possible'; +import type {AnyZodSchema} from '../components/RenderModal/SchemaEditor/zod-schema-type'; import {getVisualControlEditedValue} from './get-current-edited-value'; export type VisualControlValueWithoutUnsaved = { valueInCode: unknown; - schema: ZodTypeAny; + schema: AnyZodSchema; stack: string; }; @@ -38,7 +38,7 @@ export const VisualControlsTabActivatedContext = export type SetVisualControlsContextType = { updateHandles: () => void; updateValue: (key: string, value: unknown) => void; - visualControl: (key: string, value: T, schema?: z.ZodTypeAny) => T; + visualControl: (key: string, value: T, schema?: AnyZodSchema) => T; }; export const VisualControlsContext = createContext({ @@ -47,7 +47,7 @@ export const VisualControlsContext = createContext({ export type VisualControlRef = { // May not call it visualControl, because we rely on stacktrace names - globalVisualControl: (key: string, value: T, schema?: z.ZodTypeAny) => T; + globalVisualControl: (key: string, value: T, schema?: AnyZodSchema) => T; }; export const visualControlRef = createRef(); @@ -116,7 +116,7 @@ export const VisualControlsProvider: React.FC<{ const visualControl = useCallback( // eslint-disable-next-line prefer-arrow-callback - function (key: string, value: T, schema?: z.ZodTypeAny): T { + function (key: string, value: T, schema?: AnyZodSchema): T { // eslint-disable-next-line no-constant-condition if (handles && false) { /** Intentional: State is managed imperatively */ @@ -132,7 +132,7 @@ export const VisualControlsProvider: React.FC<{ const {changed, currentValue} = setControl(key, { valueInCode: value, - schema: schema ?? getZodSchemaFromPrimitive(value, z), + schema: (schema ?? getZodSchemaFromPrimitive(value, z)) as AnyZodSchema, stack: new Error().stack as string, }); diff --git a/packages/svg-3d-engine/package.json b/packages/svg-3d-engine/package.json index 962ec98c417..b4149aec72a 100644 --- a/packages/svg-3d-engine/package.json +++ b/packages/svg-3d-engine/package.json @@ -24,7 +24,7 @@ "require": "./dist/cjs/index.js" } }, - "version": "4.0.424", + "version": "4.0.425", "repository": { "url": "https://github.com/remotion-dev/remotion/tree/main/packages/svg-3d-engine" }, diff --git a/packages/tailwind-v4/package.json b/packages/tailwind-v4/package.json index a8e00ab9094..5e0a23da65d 100644 --- a/packages/tailwind-v4/package.json +++ b/packages/tailwind-v4/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/tailwind-v4" }, "name": "@remotion/tailwind-v4", - "version": "4.0.424", + "version": "4.0.425", "description": "Enable TailwindCSS support in Remotion (TailwindCSS v4)", "main": "dist/cjs/index.js", "types": "dist/cjs/index.d.ts", diff --git a/packages/tailwind/package.json b/packages/tailwind/package.json index 7ff74f24a0b..95f076a3f24 100644 --- a/packages/tailwind/package.json +++ b/packages/tailwind/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/tailwind" }, "name": "@remotion/tailwind", - "version": "4.0.424", + "version": "4.0.425", "description": "Enable TailwindCSS support in Remotion (TailwindCSS v3)", "main": "dist/cjs/index.js", "types": "dist/cjs/index.d.ts", diff --git a/packages/template-audiogram/package.json b/packages/template-audiogram/package.json index 9181bd90eaf..3fd240ec0cc 100644 --- a/packages/template-audiogram/package.json +++ b/packages/template-audiogram/package.json @@ -24,7 +24,7 @@ "react": "19.2.3", "react-dom": "19.2.3", "remotion": "workspace:*", - "zod": "3.22.3" + "zod": "4.3.6" }, "devDependencies": { "@remotion/eslint-config-flat": "workspace:*", diff --git a/packages/template-code-hike/package.json b/packages/template-code-hike/package.json index 1c20c29012c..93991df9b6d 100644 --- a/packages/template-code-hike/package.json +++ b/packages/template-code-hike/package.json @@ -17,7 +17,7 @@ "remotion": "workspace:*", "twoslash-cdn": "0.3.1", "polished": "4.3.1", - "zod": "3.22.3" + "zod": "4.3.6" }, "devDependencies": { "@remotion/eslint-config-flat": "workspace:*", diff --git a/packages/template-code-hike/src/calculate-metadata/schema.ts b/packages/template-code-hike/src/calculate-metadata/schema.ts index 99b2d8231f0..d1a374b3e80 100644 --- a/packages/template-code-hike/src/calculate-metadata/schema.ts +++ b/packages/template-code-hike/src/calculate-metadata/schema.ts @@ -7,7 +7,7 @@ export const width = z.discriminatedUnion("type", [ }), z.object({ type: z.literal("fixed"), - value: z.number().step(1), + value: z.number().multipleOf(1), }), ]); diff --git a/packages/template-helloworld/package.json b/packages/template-helloworld/package.json index 252b504343a..cb2f6f119b9 100644 --- a/packages/template-helloworld/package.json +++ b/packages/template-helloworld/package.json @@ -16,7 +16,7 @@ "react": "19.2.3", "react-dom": "19.2.3", "remotion": "workspace:*", - "zod": "3.22.3" + "zod": "4.3.6" }, "devDependencies": { "@remotion/eslint-config-flat": "workspace:*", diff --git a/packages/template-javascript/package.json b/packages/template-javascript/package.json index 291d685be9e..81e976f0da2 100644 --- a/packages/template-javascript/package.json +++ b/packages/template-javascript/package.json @@ -15,7 +15,7 @@ "react": "19.2.3", "react-dom": "19.2.3", "remotion": "workspace:*", - "zod": "3.22.3" + "zod": "4.3.6" }, "devDependencies": { "@remotion/eslint-config-flat": "workspace:*", diff --git a/packages/template-music-visualization/package.json b/packages/template-music-visualization/package.json index 57d3b0f98f5..0177cf957b2 100644 --- a/packages/template-music-visualization/package.json +++ b/packages/template-music-visualization/package.json @@ -21,7 +21,7 @@ "react": "19.2.3", "react-dom": "19.2.3", "remotion": "workspace:*", - "zod": "3.22.3" + "zod": "4.3.6" }, "devDependencies": { "@remotion/eslint-config-flat": "workspace:*", diff --git a/packages/template-next-app-tailwind/package.json b/packages/template-next-app-tailwind/package.json index ea6f7898f21..573697e1ee4 100644 --- a/packages/template-next-app-tailwind/package.json +++ b/packages/template-next-app-tailwind/package.json @@ -31,7 +31,7 @@ "react-dom": "19.2.3", "remotion": "workspace:*", "tailwind-merge": "3.0.1", - "zod": "3.22.3" + "zod": "4.3.6" }, "devDependencies": { "@tailwindcss/postcss": "4.1.1", diff --git a/packages/template-next-app/package.json b/packages/template-next-app/package.json index da3af7ab855..287db24dbde 100644 --- a/packages/template-next-app/package.json +++ b/packages/template-next-app/package.json @@ -23,7 +23,7 @@ "react": "19.2.3", "react-dom": "19.2.3", "remotion": "workspace:*", - "zod": "3.22.3" + "zod": "4.3.6" }, "devDependencies": { "@remotion/eslint-config-flat": "workspace:*", diff --git a/packages/template-next-pages/package.json b/packages/template-next-pages/package.json index a05c53f2a44..9ed00881a72 100644 --- a/packages/template-next-pages/package.json +++ b/packages/template-next-pages/package.json @@ -23,7 +23,7 @@ "react": "19.2.3", "react-dom": "19.2.3", "remotion": "workspace:*", - "zod": "3.22.3" + "zod": "4.3.6" }, "devDependencies": { "@eslint/eslintrc": "3.1.0", diff --git a/packages/template-prompt-to-motion-graphics/package.json b/packages/template-prompt-to-motion-graphics/package.json index de46719e996..23d2858517b 100644 --- a/packages/template-prompt-to-motion-graphics/package.json +++ b/packages/template-prompt-to-motion-graphics/package.json @@ -51,7 +51,7 @@ "remotion": "workspace:*", "tailwind-merge": "3.4.0", "three": "0.178.0", - "zod": "4.1.13" + "zod": "4.3.6" }, "devDependencies": { "@eslint/eslintrc": "3.1.0", diff --git a/packages/template-prompt-to-video/cli/service.ts b/packages/template-prompt-to-video/cli/service.ts index 35fbfad337a..5987ddb7709 100644 --- a/packages/template-prompt-to-video/cli/service.ts +++ b/packages/template-prompt-to-video/cli/service.ts @@ -3,7 +3,6 @@ import * as fs from "fs"; import { ElevenLabsClient } from "@elevenlabs/elevenlabs-js"; import { CharacterAlignmentResponseModel } from "@elevenlabs/elevenlabs-js/api"; import { IMAGE_HEIGHT, IMAGE_WIDTH } from "../src/lib/constants"; -import { zodToJsonSchema } from "zod-to-json-schema"; let apiKey: string | null = null; @@ -15,8 +14,7 @@ export const openaiStructuredCompletion = async ( prompt: string, schema: z.ZodType, ): Promise => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const jsonSchema = zodToJsonSchema(schema) as any; + const jsonSchema = z.toJSONSchema(schema); const res = await fetch("https://api.openai.com/v1/chat/completions", { method: "POST", diff --git a/packages/template-prompt-to-video/package.json b/packages/template-prompt-to-video/package.json index 5e442d8615f..faa49618485 100644 --- a/packages/template-prompt-to-video/package.json +++ b/packages/template-prompt-to-video/package.json @@ -21,7 +21,7 @@ "react": "19.2.3", "react-dom": "19.2.3", "remotion": "workspace:*", - "zod": "3.22.3" + "zod": "4.3.6" }, "devDependencies": { "@elevenlabs/elevenlabs-js": "^2.20.0", @@ -40,8 +40,7 @@ "tsx": "^4.20.6", "typescript": "5.9.3", "uuid": "^13.0.0", - "yargs": "^18.0.0", - "zod-to-json-schema": "^3.24.6" + "yargs": "^18.0.0" }, "private": true } diff --git a/packages/template-react-router/package.json b/packages/template-react-router/package.json index 5883a3a6007..24b2f77afc6 100644 --- a/packages/template-react-router/package.json +++ b/packages/template-react-router/package.json @@ -37,7 +37,7 @@ "@tailwindcss/vite": "4.1.1", "vite": "5.4.21", "vite-tsconfig-paths": "^4.2.1", - "zod": "3.22.3" + "zod": "4.3.6" }, "devDependencies": { "@react-router/dev": "7.12.0", diff --git a/packages/template-recorder/package.json b/packages/template-recorder/package.json index 5795768901f..5d62a4a8f1f 100644 --- a/packages/template-recorder/package.json +++ b/packages/template-recorder/package.json @@ -44,7 +44,7 @@ "react-dom": "19.2.3", "tailwind-merge": "1.14.0", "tailwindcss-animate": "1.0.7", - "zod": "3.22.3" + "zod": "4.3.6" }, "devDependencies": { "@remotion/eslint-config-flat": "workspace:*", diff --git a/packages/template-render-server/package.json b/packages/template-render-server/package.json index 8d5c7506902..94df2cea1a0 100644 --- a/packages/template-render-server/package.json +++ b/packages/template-render-server/package.json @@ -21,7 +21,7 @@ "react": "19.2.3", "react-dom": "19.2.3", "remotion": "workspace:*", - "zod": "3.22.3" + "zod": "4.3.6" }, "devDependencies": { "@remotion/eslint-config-flat": "workspace:*", diff --git a/packages/template-skia/package.json b/packages/template-skia/package.json index 3f5e94b4b34..efd48a1b780 100644 --- a/packages/template-skia/package.json +++ b/packages/template-skia/package.json @@ -19,7 +19,7 @@ "react": "19.2.3", "react-dom": "19.2.3", "remotion": "workspace:*", - "zod": "3.22.3" + "zod": "4.3.6" }, "devDependencies": { "@remotion/eslint-config-flat": "workspace:*", diff --git a/packages/template-stargazer/package.json b/packages/template-stargazer/package.json index d8d24ac7773..c95064f117a 100644 --- a/packages/template-stargazer/package.json +++ b/packages/template-stargazer/package.json @@ -14,7 +14,7 @@ "react": "19.2.3", "react-dom": "19.2.3", "remotion": "workspace:*", - "zod": "3.22.3" + "zod": "4.3.6" }, "devDependencies": { "@remotion/eslint-config-flat": "workspace:*", diff --git a/packages/template-still/package.json b/packages/template-still/package.json index db3396990ac..b9c63d29e06 100644 --- a/packages/template-still/package.json +++ b/packages/template-still/package.json @@ -32,7 +32,7 @@ "react": "19.2.3", "react-dom": "19.2.3", "remotion": "workspace:*", - "zod": "3.22.3" + "zod": "4.3.6" }, "devDependencies": { "@remotion/eslint-config-flat": "workspace:*", diff --git a/packages/template-three/package.json b/packages/template-three/package.json index 69bc0accefd..baef800c286 100644 --- a/packages/template-three/package.json +++ b/packages/template-three/package.json @@ -20,7 +20,7 @@ "react-dom": "19.2.3", "remotion": "workspace:*", "three": "0.178.0", - "zod": "3.22.3", + "zod": "4.3.6", "mediabunny": "1.34.4" }, "devDependencies": { diff --git a/packages/template-tiktok/package.json b/packages/template-tiktok/package.json index 850778a7147..8541ff45587 100644 --- a/packages/template-tiktok/package.json +++ b/packages/template-tiktok/package.json @@ -20,7 +20,7 @@ "react": "19.2.3", "react-dom": "19.2.3", "remotion": "workspace:*", - "zod": "3.22.3" + "zod": "4.3.6" }, "devDependencies": { "@remotion/eslint-config-flat": "workspace:*", diff --git a/packages/template-tts-azure/package.json b/packages/template-tts-azure/package.json index 6d2e05b1c75..4f4f4e63bc6 100644 --- a/packages/template-tts-azure/package.json +++ b/packages/template-tts-azure/package.json @@ -32,6 +32,6 @@ "prettier": "3.8.1", "tsx": "4.19.3", "typescript": "5.9.3", - "zod": "3.22.3" + "zod": "4.3.6" } } diff --git a/packages/template-tts-google/package.json b/packages/template-tts-google/package.json index bf525f17524..f48dcfd1fc2 100644 --- a/packages/template-tts-google/package.json +++ b/packages/template-tts-google/package.json @@ -37,7 +37,7 @@ "react": "19.2.3", "react-dom": "19.2.3", "remotion": "workspace:*", - "zod": "3.22.3" + "zod": "4.3.6" }, "private": true } diff --git a/packages/template-vercel/package.json b/packages/template-vercel/package.json index 8a18e87e9d3..11a7ca814c9 100644 --- a/packages/template-vercel/package.json +++ b/packages/template-vercel/package.json @@ -29,7 +29,7 @@ "react-dom": "19.2.3", "remotion": "workspace:*", "tailwind-merge": "3.0.1", - "zod": "3.22.3" + "zod": "4.3.6" }, "devDependencies": { "@tailwindcss/postcss": "4.1.1", diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index e74ebaea04c..96107377299 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/test-utils" }, "name": "@remotion/test-utils", - "version": "4.0.424", + "version": "4.0.425", "main": "dist", "sideEffects": false, "scripts": { diff --git a/packages/three/package.json b/packages/three/package.json index 5c91387830a..7bd9a3e7111 100644 --- a/packages/three/package.json +++ b/packages/three/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/three" }, "name": "@remotion/three", - "version": "4.0.424", + "version": "4.0.425", "description": "Include React Three Fiber components in a Remotion video", "main": "dist/cjs/index.js", "types": "dist/cjs/index.d.ts", diff --git a/packages/transitions/package.json b/packages/transitions/package.json index db9a86b22d4..1f9184b4803 100644 --- a/packages/transitions/package.json +++ b/packages/transitions/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/transitions" }, "name": "@remotion/transitions", - "version": "4.0.424", + "version": "4.0.425", "description": "Library for creating transitions in Remotion", "sideEffects": false, "main": "dist/esm/index.mjs", diff --git a/packages/web-renderer/package.json b/packages/web-renderer/package.json index da410f20b58..edd3b13cc99 100644 --- a/packages/web-renderer/package.json +++ b/packages/web-renderer/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/web-renderer" }, "name": "@remotion/web-renderer", - "version": "4.0.424", + "version": "4.0.425", "main": "dist/index.js", "type": "module", "scripts": { diff --git a/packages/web-renderer/src/create-scaffold.tsx b/packages/web-renderer/src/create-scaffold.tsx index 130a8487a95..02d7237a063 100644 --- a/packages/web-renderer/src/create-scaffold.tsx +++ b/packages/web-renderer/src/create-scaffold.tsx @@ -3,7 +3,7 @@ import {flushSync} from 'react-dom'; import ReactDOM from 'react-dom/client'; import type {Codec, DelayRenderScope, LogLevel, TRenderAsset} from 'remotion'; import {Internals} from 'remotion'; -import type {AnyZodObject} from 'zod'; +import type {$ZodObject} from 'zod/v4/core'; import type {TimeUpdaterRef} from './update-time'; import {UpdateTime} from './update-time'; @@ -45,7 +45,7 @@ export function createScaffold>({ initialFrame: number; durationInFrames: number; fps: number; - schema: AnyZodObject | null; + schema: $ZodObject | null; Component: ComponentType; audioEnabled: boolean; videoEnabled: boolean; diff --git a/packages/web-renderer/src/props-if-has-props.ts b/packages/web-renderer/src/props-if-has-props.ts index 370eaf9932c..3e9564ac209 100644 --- a/packages/web-renderer/src/props-if-has-props.ts +++ b/packages/web-renderer/src/props-if-has-props.ts @@ -1,11 +1,12 @@ import type {ComponentType} from 'react'; import type {CalculateMetadataFunction} from 'remotion'; -import type {AnyZodObject, z} from 'zod'; +import type {z} from 'zod'; +import type {$ZodObject} from 'zod/v4/core'; export type InferProps< - Schema extends AnyZodObject, + Schema extends $ZodObject, Props extends Record, -> = AnyZodObject extends Schema +> = $ZodObject extends Schema ? {} extends Props ? // Neither props nor schema specified Record @@ -18,9 +19,9 @@ export type InferProps< z.input & Props; export type DefaultPropsIfHasProps< - Schema extends AnyZodObject, + Schema extends $ZodObject, Props, -> = AnyZodObject extends Schema +> = $ZodObject extends Schema ? {} extends Props ? { // Neither props nor schema specified @@ -43,7 +44,7 @@ export type DefaultPropsIfHasProps< type LooseComponentType = ComponentType | ((props: T) => React.ReactNode); type OptionalDimensions< - Schema extends AnyZodObject, + Schema extends $ZodObject, Props extends Record, > = { component: LooseComponentType; @@ -54,7 +55,7 @@ type OptionalDimensions< }; type MandatoryDimensions< - Schema extends AnyZodObject, + Schema extends $ZodObject, Props extends Record, > = { component: LooseComponentType; @@ -67,7 +68,7 @@ type MandatoryDimensions< }; export type CompositionCalculateMetadataOrExplicit< - Schema extends AnyZodObject, + Schema extends $ZodObject, Props extends Record, > = ( | (OptionalDimensions & { diff --git a/packages/web-renderer/src/render-media-on-web.tsx b/packages/web-renderer/src/render-media-on-web.tsx index e34b7f920a1..74c455495e7 100644 --- a/packages/web-renderer/src/render-media-on-web.tsx +++ b/packages/web-renderer/src/render-media-on-web.tsx @@ -2,7 +2,8 @@ import {BufferTarget, StreamTarget} from 'mediabunny'; import type {CalculateMetadataFunction} from 'remotion'; import {Internals, type LogLevel} from 'remotion'; import {VERSION} from 'remotion/version'; -import type {AnyZodObject, z} from 'zod'; +import type {z} from 'zod'; +import type {$ZodObject} from 'zod/v4/core'; import {addAudioSample, addVideoSampleAndCloseFrame} from './add-sample'; import {handleArtifacts, type WebRendererOnArtifact} from './artifact'; import {onlyInlineAudio} from './audio'; @@ -32,10 +33,7 @@ import { type WebRendererVideoCodec, } from './mediabunny-mappings'; import type {WebRendererOutputTarget} from './output-target'; -import type { - CompositionCalculateMetadataOrExplicit, - InferProps, -} from './props-if-has-props'; +import type {CompositionCalculateMetadataOrExplicit} from './props-if-has-props'; import {onlyOneRenderAtATimeQueue} from './render-operations-queue'; import {resolveAudioCodec} from './resolve-audio-codec'; import {sendUsageEvent} from './send-telemetry-event'; @@ -47,9 +45,9 @@ import {waitForReady} from './wait-for-ready'; import {cleanupStaleOpfsFiles, createWebFsTarget} from './web-fs-target'; export type InputPropsIfHasProps< - Schema extends AnyZodObject, + Schema extends $ZodObject, Props, -> = AnyZodObject extends Schema +> = $ZodObject extends Schema ? {} extends Props ? { // Neither props nor schema specified @@ -70,7 +68,7 @@ export type InputPropsIfHasProps< }; type MandatoryRenderMediaOnWebOptions< - Schema extends AnyZodObject, + Schema extends $ZodObject, Props extends Record, > = { composition: CompositionCalculateMetadataOrExplicit; @@ -96,7 +94,7 @@ export type WebRendererHardwareAcceleration = | 'prefer-hardware' | 'prefer-software'; -type OptionalRenderMediaOnWebOptions = { +type OptionalRenderMediaOnWebOptions = { delayRenderTimeoutInMilliseconds: number; logLevel: LogLevel; schema: Schema | undefined; @@ -122,14 +120,14 @@ type OptionalRenderMediaOnWebOptions = { }; export type RenderMediaOnWebOptions< - Schema extends AnyZodObject, + Schema extends $ZodObject, Props extends Record, > = MandatoryRenderMediaOnWebOptions & Partial> & InputPropsIfHasProps; type InternalRenderMediaOnWebOptions< - Schema extends AnyZodObject, + Schema extends $ZodObject, Props extends Record, > = MandatoryRenderMediaOnWebOptions & OptionalRenderMediaOnWebOptions & @@ -140,7 +138,7 @@ type InternalRenderMediaOnWebOptions< // TODO: Apply defaultCodec const internalRenderMediaOnWeb = async < - Schema extends AnyZodObject, + Schema extends $ZodObject, Props extends Record, >({ composition, @@ -226,8 +224,8 @@ const internalRenderMediaOnWeb = async < const resolved = await Internals.resolveVideoConfig({ calculateMetadata: - (composition.calculateMetadata as CalculateMetadataFunction< - InferProps> + (composition.calculateMetadata as unknown as CalculateMetadataFunction< + Record >) ?? null, signal: signal ?? new AbortController().signal, defaultProps: composition.defaultProps ?? {}, @@ -535,7 +533,7 @@ const internalRenderMediaOnWeb = async < }; export const renderMediaOnWeb = < - Schema extends AnyZodObject, + Schema extends $ZodObject, Props extends Record, >( options: RenderMediaOnWebOptions, diff --git a/packages/web-renderer/src/render-still-on-web.tsx b/packages/web-renderer/src/render-still-on-web.tsx index e969c632b85..ce28d2125ad 100644 --- a/packages/web-renderer/src/render-still-on-web.tsx +++ b/packages/web-renderer/src/render-still-on-web.tsx @@ -3,16 +3,13 @@ import { type CalculateMetadataFunction, type LogLevel, } from 'remotion'; -import type {AnyZodObject} from 'zod'; +import type {$ZodObject} from 'zod/v4/core'; import type {WebRendererOnArtifact} from './artifact'; import {handleArtifacts} from './artifact'; import {checkForError, createScaffold} from './create-scaffold'; import type {InternalState} from './internal-state'; import {makeInternalState} from './internal-state'; -import type { - CompositionCalculateMetadataOrExplicit, - InferProps, -} from './props-if-has-props'; +import type {CompositionCalculateMetadataOrExplicit} from './props-if-has-props'; import type {InputPropsIfHasProps} from './render-media-on-web'; import {onlyOneRenderAtATimeQueue} from './render-operations-queue'; import {sendUsageEvent} from './send-telemetry-event'; @@ -23,7 +20,7 @@ import {waitForReady} from './wait-for-ready'; export type RenderStillOnWebImageFormat = 'png' | 'jpeg' | 'webp'; type MandatoryRenderStillOnWebOptions< - Schema extends AnyZodObject, + Schema extends $ZodObject, Props extends Record, > = { frame: number; @@ -32,7 +29,7 @@ type MandatoryRenderStillOnWebOptions< composition: CompositionCalculateMetadataOrExplicit; }; -type OptionalRenderStillOnWebOptions = { +type OptionalRenderStillOnWebOptions = { delayRenderTimeoutInMilliseconds: number; logLevel: LogLevel; schema: Schema | undefined; @@ -45,21 +42,21 @@ type OptionalRenderStillOnWebOptions = { }; type InternalRenderStillOnWebOptions< - Schema extends AnyZodObject, + Schema extends $ZodObject, Props extends Record, > = MandatoryRenderStillOnWebOptions & OptionalRenderStillOnWebOptions & InputPropsIfHasProps; export type RenderStillOnWebOptions< - Schema extends AnyZodObject, + Schema extends $ZodObject, Props extends Record, > = MandatoryRenderStillOnWebOptions & Partial> & InputPropsIfHasProps; async function internalRenderStillOnWeb< - Schema extends AnyZodObject, + Schema extends $ZodObject, Props extends Record, >({ frame, @@ -80,8 +77,8 @@ async function internalRenderStillOnWeb< const resolved = await Internals.resolveVideoConfig({ calculateMetadata: - (composition.calculateMetadata as CalculateMetadataFunction< - InferProps> + (composition.calculateMetadata as unknown as CalculateMetadataFunction< + Record >) ?? null, signal: signal ?? new AbortController().signal, defaultProps: composition.defaultProps ?? {}, @@ -190,7 +187,7 @@ async function internalRenderStillOnWeb< } export const renderStillOnWeb = < - Schema extends AnyZodObject, + Schema extends $ZodObject, Props extends Record, >( options: RenderStillOnWebOptions, diff --git a/packages/webcodecs/package.json b/packages/webcodecs/package.json index d2c9508d5e4..40a92cd781f 100644 --- a/packages/webcodecs/package.json +++ b/packages/webcodecs/package.json @@ -1,6 +1,6 @@ { "name": "@remotion/webcodecs", - "version": "4.0.424", + "version": "4.0.425", "main": "dist/index.js", "types": "dist/index.d.ts", "module": "dist/esm/index.mjs", diff --git a/packages/whisper-web/package.json b/packages/whisper-web/package.json index 4a6abbf74b9..fa113a966f1 100644 --- a/packages/whisper-web/package.json +++ b/packages/whisper-web/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/whisper-web" }, "name": "@remotion/whisper-web", - "version": "4.0.424", + "version": "4.0.425", "main": "dist/index.js", "sideEffects": false, "scripts": { diff --git a/packages/zod-types-v3/.npmignore b/packages/zod-types-v3/.npmignore new file mode 100644 index 00000000000..71352c3fd9c --- /dev/null +++ b/packages/zod-types-v3/.npmignore @@ -0,0 +1,10 @@ +dist/test/** +src +eslint.config.mjs +tsconfig.tsbuildinfo +*.tgz +.turbo +tsconfig.json +.prettierrc.js +bundle.ts +dist/cjs/test \ No newline at end of file diff --git a/packages/zod-types-v3/README.md b/packages/zod-types-v3/README.md new file mode 100644 index 00000000000..7e6f5fdd650 --- /dev/null +++ b/packages/zod-types-v3/README.md @@ -0,0 +1,18 @@ +# @remotion/zod-types-v3 + +Zod 3.22.3 types for Remotion + +[![NPM Downloads](https://img.shields.io/npm/dm/@remotion/zod-types-v3.svg?style=flat&color=black&label=Downloads)](https://npmcharts.com/compare/@remotion/zod-types-v3?minimal=true) + +## Installation + +```bash +npm install @remotion/zod-types-v3 --save-exact +``` + +When installing a Remotion package, make sure to align the version of all `remotion` and `@remotion/*` packages to the same version. +Remove the `^` character from the version number to use the exact version. + +## Usage + +See the [documentation](https://www.remotion.dev/docs/zod-types/v3) for more information. diff --git a/packages/zod-types-v3/bundle.ts b/packages/zod-types-v3/bundle.ts new file mode 100644 index 00000000000..1a9324d4af6 --- /dev/null +++ b/packages/zod-types-v3/bundle.ts @@ -0,0 +1,32 @@ +import {build} from 'bun'; +import path from 'path'; + +if (process.env.NODE_ENV !== 'production') { + throw new Error('This script must be run using NODE_ENV=production'); +} + +console.time('Generated.'); +const output = await build({ + entrypoints: ['src/index.ts'], + naming: '[name].mjs', + external: [ + 'remotion', + 'remotion/no-react', + '@remotion/zod-types', + 'zod', + ], +}); + +if (!output.success) { + console.log(output.logs.join('\n')); + process.exit(1); +} + +for (const file of output.outputs) { + const str = await file.text(); + const out = path.join('dist', 'esm', file.path); + + await Bun.write(out, str); +} + +console.timeEnd('Generated.'); diff --git a/packages/zod-types-v3/eslint.config.mjs b/packages/zod-types-v3/eslint.config.mjs new file mode 100644 index 00000000000..04fd4fac110 --- /dev/null +++ b/packages/zod-types-v3/eslint.config.mjs @@ -0,0 +1,7 @@ +import {remotionFlatConfig} from '@remotion/eslint-config-internal'; + +const config = remotionFlatConfig({react: false}); + +export default { + ...config, +}; diff --git a/packages/zod-types-v3/package.json b/packages/zod-types-v3/package.json new file mode 100644 index 00000000000..e8d069734f4 --- /dev/null +++ b/packages/zod-types-v3/package.json @@ -0,0 +1,55 @@ +{ + "name": "@remotion/zod-types-v3", + "version": "4.0.425", + "description": "Zod 3.22.3 types for Remotion", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "module": "dist/esm/index.mjs", + "repository": { + "url": "https://github.com/remotion-dev/remotion/tree/main/packages/zod-types-v3" + }, + "sideEffects": false, + "type": "module", + "scripts": { + "formatting": "prettier --experimental-cli src --check", + "lint": "eslint src", + "watch": "tsgo -w", + "make": "tsgo && bun --env-file=../.env.bundle bundle.ts" + }, + "author": "Jonny Burger ", + "contributors": [], + "license": "MIT", + "bugs": { + "url": "https://github.com/remotion-dev/remotion/issues" + }, + "dependencies": { + "remotion": "workspace:*", + "@remotion/zod-types": "workspace:*" + }, + "peerDependencies": { + "zod": ">=3.0.0 <4.0.0" + }, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "module": "./dist/esm/index.mjs", + "import": "./dist/esm/index.mjs" + }, + "./package.json": "./package.json" + }, + "devDependencies": { + "zod": "3.22.3", + "@remotion/eslint-config-internal": "workspace:*", + "eslint": "catalog:", + "@typescript/native-preview": "catalog:" + }, + "keywords": [ + "remotion", + "zod", + "zod-v3" + ], + "publishConfig": { + "access": "public" + }, + "homepage": "https://www.remotion.dev/docs/zod-types/v3" +} diff --git a/packages/zod-types-v3/src/index.ts b/packages/zod-types-v3/src/index.ts new file mode 100644 index 00000000000..1857a7d3200 --- /dev/null +++ b/packages/zod-types-v3/src/index.ts @@ -0,0 +1,3 @@ +export {zColor} from './z-color.js'; +export {zMatrix} from './z-matrix.js'; +export {zTextarea} from './z-textarea.js'; diff --git a/packages/zod-types-v3/src/z-color.ts b/packages/zod-types-v3/src/z-color.ts new file mode 100644 index 00000000000..f982c95b1aa --- /dev/null +++ b/packages/zod-types-v3/src/z-color.ts @@ -0,0 +1,20 @@ +import {ZodZypesInternals} from '@remotion/zod-types'; +import {z} from 'zod'; + +const {parseColor, REMOTION_COLOR_BRAND} = ZodZypesInternals; + +export const zColor = () => + z + .string() + .refine( + (value) => { + try { + parseColor(value); + return true; + } catch { + return false; + } + }, + {message: 'Invalid color'}, + ) + .describe(REMOTION_COLOR_BRAND); diff --git a/packages/zod-types-v3/src/z-matrix.ts b/packages/zod-types-v3/src/z-matrix.ts new file mode 100644 index 00000000000..ce3befda314 --- /dev/null +++ b/packages/zod-types-v3/src/z-matrix.ts @@ -0,0 +1,17 @@ +import {ZodZypesInternals} from '@remotion/zod-types'; +import {z} from 'zod'; + +const {REMOTION_MATRIX_BRAND} = ZodZypesInternals; + +export const zMatrix = () => + z + .array(z.number().step(0.01)) + .refine( + (value) => { + const count = value.length; + const root = Math.sqrt(count); + return Number.isInteger(root) && root > 0; + }, + {message: 'Invalid matrix, must be a square matrix'}, + ) + .describe(REMOTION_MATRIX_BRAND); diff --git a/packages/zod-types-v3/src/z-textarea.ts b/packages/zod-types-v3/src/z-textarea.ts new file mode 100644 index 00000000000..d51b08ce7b9 --- /dev/null +++ b/packages/zod-types-v3/src/z-textarea.ts @@ -0,0 +1,6 @@ +import {ZodZypesInternals} from '@remotion/zod-types'; +import {z} from 'zod'; + +const {REMOTION_TEXTAREA_BRAND} = ZodZypesInternals; + +export const zTextarea = () => z.string().describe(REMOTION_TEXTAREA_BRAND); diff --git a/packages/zod-types-v3/tsconfig.json b/packages/zod-types-v3/tsconfig.json new file mode 100644 index 00000000000..e5c5f5163c6 --- /dev/null +++ b/packages/zod-types-v3/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../tsconfig.settings.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "dist", + "skipLibCheck": true, + "target": "ES2022", + "module": "es2020", + "moduleResolution": "bundler", + "declaration": true, + "emitDeclarationOnly": true + }, + "include": ["src"] +} diff --git a/packages/zod-types/package.json b/packages/zod-types/package.json index 21db4a7e95d..8dbf3498ee5 100644 --- a/packages/zod-types/package.json +++ b/packages/zod-types/package.json @@ -3,7 +3,7 @@ "url": "https://github.com/remotion-dev/remotion/tree/main/packages/zod-types" }, "name": "@remotion/zod-types", - "version": "4.0.424", + "version": "4.0.425", "description": "Zod types for Remotion", "main": "dist/cjs/index.js", "types": "dist/cjs/index.d.ts", diff --git a/tsconfig.json b/tsconfig.json index 5869c92a939..564700d35f5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -243,6 +243,9 @@ { "path": "./packages/zod-types" }, + { + "path": "./packages/zod-types-v3" + }, { "path": "./packages/media" }, diff --git a/turbo.json b/turbo.json index caf4c01dd5a..8b26ad65357 100644 --- a/turbo.json +++ b/turbo.json @@ -24,6 +24,11 @@ "testwebrenderer": { "dependsOn": ["@remotion/web-renderer#make"] }, + "build": { + "dependsOn": ["^make"], + "outputs": ["dist"], + "outputLogs": "new-only" + }, "make": { "dependsOn": ["^make"], "outputs": ["dist"],