From 6d27663f7735f957f74cc4e610fd6c007381bbc4 Mon Sep 17 00:00:00 2001 From: baixiangcpp Date: Thu, 18 Jun 2026 08:46:57 -0700 Subject: [PATCH 1/5] fix(seo): scope sitemap lastmod inputs --- scripts/lib/sitemap-lastmod-lib.js | 52 +- src/lib/sitemap-lastmod.json | 2380 +++++++++++----------- tests/guards/sitemap-lastmod-lib.test.ts | 26 +- 3 files changed, 1242 insertions(+), 1216 deletions(-) diff --git a/scripts/lib/sitemap-lastmod-lib.js b/scripts/lib/sitemap-lastmod-lib.js index b61fc7bd..02382d1c 100644 --- a/scripts/lib/sitemap-lastmod-lib.js +++ b/scripts/lib/sitemap-lastmod-lib.js @@ -4,19 +4,11 @@ import fs from "node:fs"; import path from "node:path"; import { execFileSync } from "node:child_process"; import { fileURLToPath } from "node:url"; -import { listManifestFiles, loadToolSlugs } from "./tool-manifest-lib.js"; +import { loadOrderedToolManifests, loadToolSlugs } from "./tool-manifest-lib.js"; const __dirname = path.dirname(fileURLToPath(import.meta.url)); const ROOT_DIR = path.join(__dirname, "../.."); const ROUTE_GROUPS_PATH = path.join(ROOT_DIR, "src/lib/sitemap-route-groups.json"); -const TOOL_REGISTRY_SHARED_FILES = [ - "src/core/registry/categories.ts", - "src/core/registry/manifests.ts", - "src/core/registry/registry.ts", - "src/core/registry/related-tools.ts", - "src/core/registry/tool-order.json", - "src/core/registry/types.ts", -]; const MANIFEST_RELATIVE_PATH = "src/lib/sitemap-lastmod.json"; const LOCALES = ["en", "zh-CN", "zh-TW", "ja", "ko", "de", "fr"]; @@ -30,7 +22,6 @@ const ROUTE_FILE_NAMES = [ "layout.jsx", "layout.js", ]; -const GLOBAL_ROUTE_FILES = ["src/app/layout.tsx", "src/app/[lang]/layout.tsx"]; const DEFAULT_FALLBACK_ISO = "2026-02-25T00:00:00.000Z"; function runGit(args) { @@ -145,36 +136,47 @@ function readRouteGroups() { return JSON.parse(fs.readFileSync(ROUTE_GROUPS_PATH, "utf8")); } -function toProjectRelativePath(absolutePath) { - return path.relative(ROOT_DIR, absolutePath).replace(/\\/g, "/"); +function buildToolManifestPathBySlug() { + const manifestPathBySlug = new Map(); + for (const manifest of loadOrderedToolManifests()) { + if (manifest.sourceFile) { + manifestPathBySlug.set(manifest.slug, manifest.sourceFile); + } + } + return manifestPathBySlug; } -function getToolMetaTrackedFiles() { - return [ - ...TOOL_REGISTRY_SHARED_FILES, - ...listManifestFiles().map((manifestPath) => toProjectRelativePath(manifestPath)), - ] - .filter((relativePath) => isTrackedFile(relativePath)); -} +const TOOL_MANIFEST_PATH_BY_SLUG = buildToolManifestPathBySlug(); function readToolSlugs() { return loadToolSlugs(); } function getRouteFilesForSlug(slug) { + if (!slug) { + return ["src/app/[lang]/page.tsx"].filter((filePath) => isTrackedFile(filePath)); + } + const base = slug ? `src/app/[lang]/${slug}` : "src/app/[lang]"; return ROUTE_FILE_NAMES .map((name) => `${base}/${name}`) .filter((filePath) => isTrackedFile(filePath)); } -function resolveRouteLastmod({ locale, slug, includeToolMeta, fallbackIso }) { - const paths = dedupePaths([ - ...GLOBAL_ROUTE_FILES, +function getToolMetaTrackedFiles(slug) { + const manifestPath = TOOL_MANIFEST_PATH_BY_SLUG.get(slug); + return manifestPath && isTrackedFile(manifestPath) ? [manifestPath] : []; +} + +export function buildLastmodInputPaths({ slug, includeToolMeta }) { + return dedupePaths([ ...getRouteFilesForSlug(slug), - `src/core/i18n/translations/${locale}.json`, - ...(includeToolMeta ? getToolMetaTrackedFiles() : []), + ...(includeToolMeta && slug ? getToolMetaTrackedFiles(slug) : []), ].filter(Boolean)); +} + +function resolveRouteLastmod({ slug, includeToolMeta, fallbackIso }) { + const paths = buildLastmodInputPaths({ slug, includeToolMeta }); const routeIsos = paths.map((filePath) => getEffectiveTrackedIso(filePath)); return selectLatestIso(routeIsos, fallbackIso); @@ -182,7 +184,7 @@ function resolveRouteLastmod({ locale, slug, includeToolMeta, fallbackIso }) { function buildLocaleMap({ slug, includeToolMeta, fallbackIso }) { return Object.fromEntries( - LOCALES.map((locale) => [locale, resolveRouteLastmod({ locale, slug, includeToolMeta, fallbackIso })]) + LOCALES.map((locale) => [locale, resolveRouteLastmod({ slug, includeToolMeta, fallbackIso })]) ); } diff --git a/src/lib/sitemap-lastmod.json b/src/lib/sitemap-lastmod.json index 082f4519..e614b574 100644 --- a/src/lib/sitemap-lastmod.json +++ b/src/lib/sitemap-lastmod.json @@ -10,1539 +10,1539 @@ "fr" ], "home": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "hubs": { "formatters": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "text-tools": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "generators": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "network-tools": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "format-validate": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "convert-encode": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "text-content": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "web-api": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "generators-ids": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "design-media": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" } }, "static": { "all-tools": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-17T00:00:00.000Z", + "zh-CN": "2026-06-17T00:00:00.000Z", + "zh-TW": "2026-06-17T00:00:00.000Z", + "ja": "2026-06-17T00:00:00.000Z", + "ko": "2026-06-17T00:00:00.000Z", + "de": "2026-06-17T00:00:00.000Z", + "fr": "2026-06-17T00:00:00.000Z" }, "about": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "pricing": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "contact": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "privacy": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-17T00:00:00.000Z", + "zh-CN": "2026-06-17T00:00:00.000Z", + "zh-TW": "2026-06-17T00:00:00.000Z", + "ja": "2026-06-17T00:00:00.000Z", + "ko": "2026-06-17T00:00:00.000Z", + "de": "2026-06-17T00:00:00.000Z", + "fr": "2026-06-17T00:00:00.000Z" }, "terms": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "install-app": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "json-formatting-errors": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "json-vs-json5-differences": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "validate-json-before-api-requests": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "json-schema-validation-checklist": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "api-auth-header-mistakes": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "convert-curl-to-fetch-python": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "mock-openapi-quickly": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "openapi-debugging-workflow-checklist": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "dns-records-uptime": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "certificate-chain-basics-for-developers": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "csp-mistakes-that-break-production": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "robots-txt-testing-checklist": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "css-layout-patterns-for-developers": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "modern-css-effects-guide": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "css-animations-and-transitions-guide": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "css-border-radius-and-shapes-guide": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "image-optimization-for-web-complete-workflow": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "color-extraction-from-images-use-cases-and-tools": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "svg-optimization-and-conversion-best-practices": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "image-privacy-how-to-censor-and-protect-images": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "base64-encoding-when-and-how-to-use-it": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "hash-functions-compared-md5-vs-sha256-vs-sha512": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "url-encoding-explained-common-mistakes-and-solutions": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "jwt-security-best-practices-for-token-handling": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "md5-digest-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "sha1-digest-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "sha256-digest-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "sha224-digest-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "sha384-digest-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "sha512-digest-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "css-formatter": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" } }, "tools": { "json-formatter": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-17T00:00:00.000Z", + "zh-CN": "2026-06-17T00:00:00.000Z", + "zh-TW": "2026-06-17T00:00:00.000Z", + "ja": "2026-06-17T00:00:00.000Z", + "ko": "2026-06-17T00:00:00.000Z", + "de": "2026-06-17T00:00:00.000Z", + "fr": "2026-06-17T00:00:00.000Z" }, "xml-formatter": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "sql-formatter": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "javascript-formatter": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "javascript-minifier": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "html-minifier": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "html-encoder-decoder": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "html-css-beautifier": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "html-formatter": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "yaml-json-converter": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "markdown-preview": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "html-to-markdown": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "json-to-typescript": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "css-minifier": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "svg-optimizer": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "jsonpath-playground": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "openapi-viewer": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "json-diff-viewer": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "csv-json-converter": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "base64-encode-decode": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "url-encode-decode": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "jwt-decoder": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-17T00:00:00.000Z", + "zh-CN": "2026-06-17T00:00:00.000Z", + "zh-TW": "2026-06-17T00:00:00.000Z", + "ja": "2026-06-17T00:00:00.000Z", + "ko": "2026-06-17T00:00:00.000Z", + "de": "2026-06-17T00:00:00.000Z", + "fr": "2026-06-17T00:00:00.000Z" }, "jwt-workbench": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-17T00:00:00.000Z", + "zh-CN": "2026-06-17T00:00:00.000Z", + "zh-TW": "2026-06-17T00:00:00.000Z", + "ja": "2026-06-17T00:00:00.000Z", + "ko": "2026-06-17T00:00:00.000Z", + "de": "2026-06-17T00:00:00.000Z", + "fr": "2026-06-17T00:00:00.000Z" }, "hash-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "md5-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "text-diff-checker": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "multiple-whitespace-remover": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "letter-counter": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "bionic-reading-converter": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "google-fonts-pair-finder": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "text-to-handwriting-converter": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "code-to-image-converter": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "image-base64": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "unix-timestamp": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "uuid-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "lorem-ipsum": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "password-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "color-converter": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "react-native-shadow-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "ai-color-palette-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "color-mixer": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "color-shades-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "image-average-color-finder": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "image-caption-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "image-color-extractor": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "image-color-picker": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "image-cropper": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "image-filters": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "instagram-filters": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "instagram-post-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "instagram-story-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "open-graph-meta-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "tweet-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "tweet-to-image-converter": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "twitter-ad-revenue-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "instagram-photo-downloader": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-17T00:00:00.000Z", + "zh-CN": "2026-06-17T00:00:00.000Z", + "zh-TW": "2026-06-17T00:00:00.000Z", + "ja": "2026-06-17T00:00:00.000Z", + "ko": "2026-06-17T00:00:00.000Z", + "de": "2026-06-17T00:00:00.000Z", + "fr": "2026-06-17T00:00:00.000Z" }, "vimeo-thumbnail-grabber": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-17T00:00:00.000Z", + "zh-CN": "2026-06-17T00:00:00.000Z", + "zh-TW": "2026-06-17T00:00:00.000Z", + "ja": "2026-06-17T00:00:00.000Z", + "ko": "2026-06-17T00:00:00.000Z", + "de": "2026-06-17T00:00:00.000Z", + "fr": "2026-06-17T00:00:00.000Z" }, "youtube-thumbnail-grabber": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-17T00:00:00.000Z", + "zh-CN": "2026-06-17T00:00:00.000Z", + "zh-TW": "2026-06-17T00:00:00.000Z", + "ja": "2026-06-17T00:00:00.000Z", + "ko": "2026-06-17T00:00:00.000Z", + "de": "2026-06-17T00:00:00.000Z", + "fr": "2026-06-17T00:00:00.000Z" }, "image-resizer": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "photo-censor": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "scanned-pdf-converter": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "svg-blob-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "svg-pattern-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "svg-stroke-to-fill-converter": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "svg-to-png-converter": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "css-background-pattern-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "css-border-radius-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "css-box-shadow-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "css-checkbox-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "css-clip-path-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "css-cubic-bezier-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "css-glassmorphism-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "css-gradient-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "css-loader-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "css-switch-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "css-text-glitch-effect-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "css-triangle-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "qr-code-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "barcode-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "fake-iban-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "list-randomizer": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "ascii-art-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "env-parser": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-17T00:00:00.000Z", + "zh-CN": "2026-06-17T00:00:00.000Z", + "zh-TW": "2026-06-17T00:00:00.000Z", + "ja": "2026-06-17T00:00:00.000Z", + "ko": "2026-06-17T00:00:00.000Z", + "de": "2026-06-17T00:00:00.000Z", + "fr": "2026-06-17T00:00:00.000Z" }, "id-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "regex-tester": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "regex-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "crontab-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "user-agent-parser": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "cron-visualizer": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "http-status-codes": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "chmod-calculator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "cidr-subnet-calculator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "url-parser": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "certificate-decoder": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-17T00:00:00.000Z", + "zh-CN": "2026-06-17T00:00:00.000Z", + "zh-TW": "2026-06-17T00:00:00.000Z", + "ja": "2026-06-17T00:00:00.000Z", + "ko": "2026-06-17T00:00:00.000Z", + "de": "2026-06-17T00:00:00.000Z", + "fr": "2026-06-17T00:00:00.000Z" }, "http-request-builder": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-17T00:00:00.000Z", + "zh-CN": "2026-06-17T00:00:00.000Z", + "zh-TW": "2026-06-17T00:00:00.000Z", + "ja": "2026-06-17T00:00:00.000Z", + "ko": "2026-06-17T00:00:00.000Z", + "de": "2026-06-17T00:00:00.000Z", + "fr": "2026-06-17T00:00:00.000Z" }, "curl-to-code": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "ndjson-formatter": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "jwt-verifier": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-17T00:00:00.000Z", + "zh-CN": "2026-06-17T00:00:00.000Z", + "zh-TW": "2026-06-17T00:00:00.000Z", + "ja": "2026-06-17T00:00:00.000Z", + "ko": "2026-06-17T00:00:00.000Z", + "de": "2026-06-17T00:00:00.000Z", + "fr": "2026-06-17T00:00:00.000Z" }, "slugify-case-converter": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "invisible-characters-detector": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "robots-txt-tester": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "csp-parser": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "csv-diff": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "header-diff": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-17T00:00:00.000Z", + "zh-CN": "2026-06-17T00:00:00.000Z", + "zh-TW": "2026-06-17T00:00:00.000Z", + "ja": "2026-06-17T00:00:00.000Z", + "ko": "2026-06-17T00:00:00.000Z", + "de": "2026-06-17T00:00:00.000Z", + "fr": "2026-06-17T00:00:00.000Z" }, "security-header-analyzer": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-17T00:00:00.000Z", + "zh-CN": "2026-06-17T00:00:00.000Z", + "zh-TW": "2026-06-17T00:00:00.000Z", + "ja": "2026-06-17T00:00:00.000Z", + "ko": "2026-06-17T00:00:00.000Z", + "de": "2026-06-17T00:00:00.000Z", + "fr": "2026-06-17T00:00:00.000Z" }, "totp-generator": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-17T00:00:00.000Z", + "zh-CN": "2026-06-17T00:00:00.000Z", + "zh-TW": "2026-06-17T00:00:00.000Z", + "ja": "2026-06-17T00:00:00.000Z", + "ko": "2026-06-17T00:00:00.000Z", + "de": "2026-06-17T00:00:00.000Z", + "fr": "2026-06-17T00:00:00.000Z" }, "openapi-mock": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "docker-run-to-compose": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "local-log-parser": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-17T00:00:00.000Z", + "zh-CN": "2026-06-17T00:00:00.000Z", + "zh-TW": "2026-06-17T00:00:00.000Z", + "ja": "2026-06-17T00:00:00.000Z", + "ko": "2026-06-17T00:00:00.000Z", + "de": "2026-06-17T00:00:00.000Z", + "fr": "2026-06-17T00:00:00.000Z" }, "jq-playground": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "log-scrubber": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-17T00:00:00.000Z", + "zh-CN": "2026-06-17T00:00:00.000Z", + "zh-TW": "2026-06-17T00:00:00.000Z", + "ja": "2026-06-17T00:00:00.000Z", + "ko": "2026-06-17T00:00:00.000Z", + "de": "2026-06-17T00:00:00.000Z", + "fr": "2026-06-17T00:00:00.000Z" }, "gzip-brotli-lab": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "yaml-merge-patch-explorer": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "yq-playground": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "structured-data-visualizer": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "har-viewer-sanitizer": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-17T00:00:00.000Z", + "zh-CN": "2026-06-17T00:00:00.000Z", + "zh-TW": "2026-06-17T00:00:00.000Z", + "ja": "2026-06-17T00:00:00.000Z", + "ko": "2026-06-17T00:00:00.000Z", + "de": "2026-06-17T00:00:00.000Z", + "fr": "2026-06-17T00:00:00.000Z" }, "pipeline-builder": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "saml-decoder": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-17T00:00:00.000Z", + "zh-CN": "2026-06-17T00:00:00.000Z", + "zh-TW": "2026-06-17T00:00:00.000Z", + "ja": "2026-06-17T00:00:00.000Z", + "ko": "2026-06-17T00:00:00.000Z", + "de": "2026-06-17T00:00:00.000Z", + "fr": "2026-06-17T00:00:00.000Z" }, "asn1-der-inspector": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "hex-bytes-workbench": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" }, "unicode-inspector": { - "en": "2026-06-18T00:00:00.000Z", - "zh-CN": "2026-06-18T00:00:00.000Z", - "zh-TW": "2026-06-18T00:00:00.000Z", - "ja": "2026-06-18T00:00:00.000Z", - "ko": "2026-06-18T00:00:00.000Z", - "de": "2026-06-18T00:00:00.000Z", - "fr": "2026-06-18T00:00:00.000Z" + "en": "2026-06-14T00:00:00.000Z", + "zh-CN": "2026-06-14T00:00:00.000Z", + "zh-TW": "2026-06-14T00:00:00.000Z", + "ja": "2026-06-14T00:00:00.000Z", + "ko": "2026-06-14T00:00:00.000Z", + "de": "2026-06-14T00:00:00.000Z", + "fr": "2026-06-14T00:00:00.000Z" } } } diff --git a/tests/guards/sitemap-lastmod-lib.test.ts b/tests/guards/sitemap-lastmod-lib.test.ts index 9984116d..dc5b39ce 100644 --- a/tests/guards/sitemap-lastmod-lib.test.ts +++ b/tests/guards/sitemap-lastmod-lib.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest" -import { resolveTrackedFileLastmod, toUtcDayIso } from "../../scripts/lib/sitemap-lastmod-lib.js" +import { buildLastmodInputPaths, resolveTrackedFileLastmod, toUtcDayIso } from "../../scripts/lib/sitemap-lastmod-lib.js" describe("sitemap lastmod lib", () => { it("normalizes git timestamps to UTC day granularity", () => { @@ -26,4 +26,28 @@ describe("sitemap lastmod lib", () => { }), ).toBe("2026-04-10T00:00:00.000Z") }) + + it("keeps route lastmod inputs scoped to files that materially change the rendered page", () => { + const homePaths = buildLastmodInputPaths({ + slug: "", + includeToolMeta: false, + }) + const toolPaths = buildLastmodInputPaths({ + slug: "json-formatter", + includeToolMeta: true, + }) + + expect(homePaths).toContain("src/app/[lang]/page.tsx") + expect(homePaths).not.toContain("src/app/layout.tsx") + expect(homePaths).not.toContain("src/app/[lang]/layout.tsx") + expect(homePaths).not.toContain("src/core/i18n/translations/en.json") + + expect(toolPaths).toContain("src/app/[lang]/json-formatter/page.tsx") + expect(toolPaths).toContain("src/app/[lang]/json-formatter/layout.tsx") + expect(toolPaths).toContain("src/features/tools/json-formatter/manifest.ts") + expect(toolPaths).not.toContain("src/core/registry/manifests.ts") + expect(toolPaths).not.toContain("src/core/registry/registry.ts") + expect(toolPaths).not.toContain("src/core/registry/tool-order.json") + expect(toolPaths).not.toContain("src/core/i18n/translations/en.json") + }) }) From 925895495eb2465301235d37c63874efa64119c6 Mon Sep 17 00:00:00 2001 From: baixiangcpp Date: Thu, 18 Jun 2026 08:47:23 -0700 Subject: [PATCH 2/5] fix(seo): keep tool handoffs out of query URLs --- src/app/page.tsx | 8 ++++- src/app/robots.ts | 4 +++ src/core/routing/tool-handoff.ts | 17 +++++++---- .../html-css-beautifier-tool.tsx | 2 +- src/features/tools/html-minifier/page.tsx | 2 +- .../tools/javascript-minifier/page.tsx | 2 +- src/features/tools/json-formatter/page.tsx | 2 +- .../tools/json-to-typescript/page.tsx | 2 +- src/features/tools/pipeline-builder/page.tsx | 2 +- .../guards/root-page-redirect-guard.test.tsx | 2 ++ tests/unit/tool-handoff.test.ts | 29 ++++++++++++------- 11 files changed, 50 insertions(+), 22 deletions(-) diff --git a/src/app/page.tsx b/src/app/page.tsx index 8a3506f2..91372529 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -63,7 +63,13 @@ export default function RootPage() { if (supported.indexOf(lang) < 0) lang = 'en'; } - var suffix = (window.location.search || '') + (window.location.hash || ''); + var search = window.location.search || ''; + var hash = window.location.hash || ''; + if (search.indexOf('handoff=') >= 0 || search.indexOf('handoff_ref=') >= 0) { + hash = '#' + search.slice(1); + search = ''; + } + var suffix = search + hash; var target = '/' + lang + suffix; window.location.replace(target); })(); diff --git a/src/app/robots.ts b/src/app/robots.ts index 3a42c66d..46393e9d 100644 --- a/src/app/robots.ts +++ b/src/app/robots.ts @@ -6,6 +6,10 @@ export default function robots(): MetadataRoute.Robots { rules: { userAgent: '*', allow: '/', + disallow: [ + '*?handoff=', + '*?handoff_ref=', + ], }, sitemap: 'https://byteflow.tools/sitemap.xml', } diff --git a/src/core/routing/tool-handoff.ts b/src/core/routing/tool-handoff.ts index 5cd8cf11..f99aff64 100644 --- a/src/core/routing/tool-handoff.ts +++ b/src/core/routing/tool-handoff.ts @@ -55,7 +55,7 @@ export function buildShareableToolHandoffHref(lang: string, slug: string, payloa if (!text) return basePath const encoded = toBase64Url(text) - return `${basePath}?${HANDOFF_PARAM}=${encodeURIComponent(encoded)}` + return `${basePath}#${HANDOFF_PARAM}=${encodeURIComponent(encoded)}` } export const buildToolHandoffHref = buildShareableToolHandoffHref @@ -123,16 +123,23 @@ export function buildToolHandoffLink(lang: string, slug: string, payload: string const handoffRef = createHandoffRef() return { - href: `${basePath}?${HANDOFF_REF_PARAM}=${encodeURIComponent(handoffRef)}`, + href: `${basePath}#${HANDOFF_REF_PARAM}=${encodeURIComponent(handoffRef)}`, prime: () => storeHandoffPayload(handoffRef, text), } } -export function getToolHandoffFromSearchParams(searchParams: URLSearchParams): string | null { - const raw = searchParams.get(HANDOFF_PARAM) +function normalizeFragmentParams(fragment?: string): URLSearchParams { + if (!fragment) return new URLSearchParams() + const normalized = fragment.startsWith("#") ? fragment.slice(1) : fragment + return new URLSearchParams(normalized) +} + +export function getToolHandoffFromSearchParams(searchParams: URLSearchParams, fragment?: string): string | null { + const fragmentParams = normalizeFragmentParams(fragment) + const raw = fragmentParams.get(HANDOFF_PARAM) ?? searchParams.get(HANDOFF_PARAM) if (raw) return fromBase64Url(raw) - const handoffRef = searchParams.get(HANDOFF_REF_PARAM) + const handoffRef = fragmentParams.get(HANDOFF_REF_PARAM) ?? searchParams.get(HANDOFF_REF_PARAM) if (!handoffRef) return null return readHandoffPayload(handoffRef) } diff --git a/src/features/tool-templates/html-css-beautifier-tool.tsx b/src/features/tool-templates/html-css-beautifier-tool.tsx index 6e5ad545..3887fd13 100644 --- a/src/features/tool-templates/html-css-beautifier-tool.tsx +++ b/src/features/tool-templates/html-css-beautifier-tool.tsx @@ -119,7 +119,7 @@ export function HtmlCssBeautifierTool({ React.useEffect(() => { if (typeof window === "undefined") return - const handoff = getToolHandoffFromSearchParams(new URLSearchParams(window.location.search)) + const handoff = getToolHandoffFromSearchParams(new URLSearchParams(window.location.search), window.location.hash) if (!handoff || handoff === appliedHandoffRef.current) return appliedHandoffRef.current = handoff setInput(handoff) diff --git a/src/features/tools/html-minifier/page.tsx b/src/features/tools/html-minifier/page.tsx index 64bbc583..ae6cd2f4 100644 --- a/src/features/tools/html-minifier/page.tsx +++ b/src/features/tools/html-minifier/page.tsx @@ -60,7 +60,7 @@ export function HtmlMinifierPage() { React.useEffect(() => { if (typeof window === "undefined") return - const handoff = getToolHandoffFromSearchParams(new URLSearchParams(window.location.search)) + const handoff = getToolHandoffFromSearchParams(new URLSearchParams(window.location.search), window.location.hash) if (!handoff || handoff === appliedHandoffRef.current) return appliedHandoffRef.current = handoff setInput(handoff) diff --git a/src/features/tools/javascript-minifier/page.tsx b/src/features/tools/javascript-minifier/page.tsx index 1665d302..c8c629ca 100644 --- a/src/features/tools/javascript-minifier/page.tsx +++ b/src/features/tools/javascript-minifier/page.tsx @@ -46,7 +46,7 @@ export function JavascriptMinifierPage() { React.useEffect(() => { if (typeof window === "undefined") return - const handoff = getToolHandoffFromSearchParams(new URLSearchParams(window.location.search)) + const handoff = getToolHandoffFromSearchParams(new URLSearchParams(window.location.search), window.location.hash) if (!handoff || handoff === appliedHandoffRef.current) return appliedHandoffRef.current = handoff setInput(handoff) diff --git a/src/features/tools/json-formatter/page.tsx b/src/features/tools/json-formatter/page.tsx index c6b58e7d..dd007f23 100644 --- a/src/features/tools/json-formatter/page.tsx +++ b/src/features/tools/json-formatter/page.tsx @@ -99,7 +99,7 @@ export function JsonFormatterPage() { React.useEffect(() => { if (typeof window === "undefined") return - const handoff = getToolHandoffFromSearchParams(new URLSearchParams(window.location.search)) + const handoff = getToolHandoffFromSearchParams(new URLSearchParams(window.location.search), window.location.hash) if (!handoff || handoff === appliedHandoffRef.current) return appliedHandoffRef.current = handoff setInput(handoff) diff --git a/src/features/tools/json-to-typescript/page.tsx b/src/features/tools/json-to-typescript/page.tsx index 32bb45c9..b91c4cc5 100644 --- a/src/features/tools/json-to-typescript/page.tsx +++ b/src/features/tools/json-to-typescript/page.tsx @@ -155,7 +155,7 @@ export function JsonToTypeScriptPage() { React.useEffect(() => { if (typeof window === "undefined") return - const handoff = getToolHandoffFromSearchParams(new URLSearchParams(window.location.search)) + const handoff = getToolHandoffFromSearchParams(new URLSearchParams(window.location.search), window.location.hash) if (!handoff || handoff === appliedHandoffRef.current) return appliedHandoffRef.current = handoff setInput(handoff) diff --git a/src/features/tools/pipeline-builder/page.tsx b/src/features/tools/pipeline-builder/page.tsx index b410abeb..928e60dc 100644 --- a/src/features/tools/pipeline-builder/page.tsx +++ b/src/features/tools/pipeline-builder/page.tsx @@ -110,7 +110,7 @@ export function PipelineBuilderPage() { } } - const handoff = getToolHandoffFromSearchParams(params) + const handoff = getToolHandoffFromSearchParams(params, window.location.hash) if (handoff) { setInitialInput(handoff) toast.success(text("handoff_loaded")) diff --git a/tests/guards/root-page-redirect-guard.test.tsx b/tests/guards/root-page-redirect-guard.test.tsx index 588cb080..f76f1a9f 100644 --- a/tests/guards/root-page-redirect-guard.test.tsx +++ b/tests/guards/root-page-redirect-guard.test.tsx @@ -8,6 +8,8 @@ describe("root page locale redirect guard", () => { expect(html).toContain("window.location.search || ''") expect(html).toContain("window.location.hash || ''") + expect(html).toContain("search.indexOf('handoff=') >= 0") + expect(html).toContain("search.indexOf('handoff_ref=') >= 0") expect(html).toContain("else if (raw === 'zh' || raw.indexOf('zh-') === 0) lang = 'zh-CN';") expect(html).toContain("var target = '/' + lang + suffix;") expect(html).toContain("window.location.replace(target);") diff --git a/tests/unit/tool-handoff.test.ts b/tests/unit/tool-handoff.test.ts index b4d72deb..bd1eb6a9 100644 --- a/tests/unit/tool-handoff.test.ts +++ b/tests/unit/tool-handoff.test.ts @@ -9,7 +9,8 @@ import { describe("tool handoff", () => { it("builds a localized shareable handoff URL", () => { const href = buildShareableToolHandoffHref("en", "json-to-typescript", '{"a":1}') - expect(href.startsWith("/en/json-to-typescript?handoff=")).toBe(true) + expect(href.startsWith("/en/json-to-typescript#handoff=")).toBe(true) + expect(href).not.toContain("?handoff=") }) it("returns base path when payload is empty", () => { @@ -19,9 +20,8 @@ describe("tool handoff", () => { it("round-trips unicode payload from query params", () => { const payload = "你好, JSON\n{\"name\":\"ByteFlow\"}" const href = buildShareableToolHandoffHref("en", "json-to-typescript", payload) - const query = href.split("?")[1] || "" - const params = new URLSearchParams(query) - expect(getToolHandoffFromSearchParams(params)).toBe(payload) + const fragment = href.split("#")[1] || "" + expect(getToolHandoffFromSearchParams(new URLSearchParams(), fragment)).toBe(payload) }) it("returns null on invalid handoff value", () => { @@ -37,20 +37,29 @@ describe("tool handoff", () => { it("keeps the legacy handoff href export as explicit share-link behavior", () => { const href = buildToolHandoffHref("en", "json-to-typescript", '{"a":1}') - expect(href.startsWith("/en/json-to-typescript?handoff=")).toBe(true) + expect(href.startsWith("/en/json-to-typescript#handoff=")).toBe(true) }) it("uses sessionStorage handoff by default when available", () => { const payload = '{"token":"secret"}' const handoff = buildToolHandoffLink("en", "json-to-typescript", payload) - expect(handoff.href.startsWith("/en/json-to-typescript?handoff_ref=")).toBe(true) + expect(handoff.href.startsWith("/en/json-to-typescript#handoff_ref=")).toBe(true) expect(handoff.href).not.toContain("secret") handoff.prime() - const query = handoff.href.split("?")[1] || "" - const params = new URLSearchParams(query) - expect(getToolHandoffFromSearchParams(params)).toBe(payload) - expect(getToolHandoffFromSearchParams(params)).toBeNull() + const fragment = handoff.href.split("#")[1] || "" + expect(getToolHandoffFromSearchParams(new URLSearchParams(), fragment)).toBe(payload) + expect(getToolHandoffFromSearchParams(new URLSearchParams(), fragment)).toBeNull() + }) + + it("still reads old query-string handoff URLs for backward compatibility", () => { + const href = buildShareableToolHandoffHref("en", "json-to-typescript", "legacy payload") + const fragment = href.split("#")[1] || "" + const value = new URLSearchParams(fragment).get("handoff") ?? "" + + expect(getToolHandoffFromSearchParams(new URLSearchParams(`handoff=${encodeURIComponent(value)}`))).toBe( + "legacy payload", + ) }) }) From 83182a732b3bf9247f9b97d538947bfa35f42f21 Mon Sep 17 00:00:00 2001 From: baixiangcpp Date: Thu, 18 Jun 2026 08:47:44 -0700 Subject: [PATCH 3/5] fix(seo): move legacy aliases to deployment redirects --- public/_redirects | 7 ++++ src/core/security/inline-script-policy.ts | 7 ++-- .../components/legacy-tool-redirect-page.tsx | 38 ++++++------------- .../html-injection-surface-guard.test.ts | 13 +++---- 4 files changed, 27 insertions(+), 38 deletions(-) create mode 100644 public/_redirects diff --git a/public/_redirects b/public/_redirects new file mode 100644 index 00000000..e4bfa461 --- /dev/null +++ b/public/_redirects @@ -0,0 +1,7 @@ +/en/cron-expression-generator /en/crontab-generator 301 +/zh-CN/cron-expression-generator /zh-CN/crontab-generator 301 +/zh-TW/cron-expression-generator /zh-TW/crontab-generator 301 +/ja/cron-expression-generator /ja/crontab-generator 301 +/ko/cron-expression-generator /ko/crontab-generator 301 +/de/cron-expression-generator /de/crontab-generator 301 +/fr/cron-expression-generator /fr/crontab-generator 301 diff --git a/src/core/security/inline-script-policy.ts b/src/core/security/inline-script-policy.ts index de92d5e2..e349c830 100644 --- a/src/core/security/inline-script-policy.ts +++ b/src/core/security/inline-script-policy.ts @@ -24,13 +24,12 @@ export const INLINE_SCRIPT_POLICY: readonly InlineScriptPolicyEntry[] = [ { id: "legacy-tool-redirect", file: "src/core/seo/components/legacy-tool-redirect-page.tsx", - purpose: "Client-side redirect for statically exported legacy tool aliases.", - requiresUnsafeInline: true, - migrationPath: "Replace with static redirect artifacts or a hashed redirect bootstrap per alias.", + purpose: "Fallback content for statically exported legacy tool aliases after deployment-level redirects.", + requiresUnsafeInline: false, + migrationPath: "Keep alias redirects in public/_redirects and remove this fallback when old exports can be dropped.", }, ] export function inlineScriptPolicyRequiresUnsafeInline(): boolean { return INLINE_SCRIPT_POLICY.some((entry) => entry.requiresUnsafeInline) } - diff --git a/src/core/seo/components/legacy-tool-redirect-page.tsx b/src/core/seo/components/legacy-tool-redirect-page.tsx index fcaa97a1..d7bde6ec 100644 --- a/src/core/seo/components/legacy-tool-redirect-page.tsx +++ b/src/core/seo/components/legacy-tool-redirect-page.tsx @@ -6,33 +6,17 @@ type LegacyToolRedirectPageProps = { } export function LegacyToolRedirectPage({ href, title, body, cta }: LegacyToolRedirectPageProps) { - const escapedHref = JSON.stringify(href) - return ( - <> -