diff --git a/.github/dependabot.yml b/.github/dependabot.yml index b18fd29..a9412c3 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,6 +1,6 @@ version: 2 updates: - - package-ecosystem: 'github-actions' - directory: '/' - schedule: - interval: 'weekly' + - package-ecosystem: 'github-actions' + directory: '/' + schedule: + interval: 'weekly' diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a321cd4..f000f83 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,25 +1,25 @@ name: Test on: - push: - branches: [master] - pull_request: - branches: [master] + push: + branches: [master] + pull_request: + branches: [master] permissions: - contents: read + contents: read jobs: - test: - runs-on: ubuntu-latest + test: + runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v6 - - uses: pnpm/action-setup@v5 - - name: Use Node.js - uses: actions/setup-node@v6 - with: - node-version: 22 - cache: 'pnpm' - - run: pnpm install --frozen-lockfile - - run: pnpm test + steps: + - uses: actions/checkout@v6 + - uses: pnpm/action-setup@v5 + - name: Use Node.js + uses: actions/setup-node@v6 + with: + node-version: 22 + cache: 'pnpm' + - run: pnpm install --frozen-lockfile + - run: pnpm test diff --git a/.oxfmtrc.json b/.oxfmtrc.json deleted file mode 100644 index b945198..0000000 --- a/.oxfmtrc.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "$schema": "./node_modules/oxfmt/configuration_schema.json", - "singleQuote": true, - "printWidth": 120, - "sortPackageJson": false, - "sortImports": { - "groups": [ - "builtin", - "external", - ["internal", "parent", "sibling", "index"], - "type-builtin", - "type-external", - ["type-internal", "type-parent", "type-sibling", "type-index"] - ] - }, - "ignorePatterns": [], - "overrides": [ - { - "files": ["generated/**"], - "options": { - "printWidth": 80 - } - } - ] -} diff --git a/.oxlintrc.json b/.oxlintrc.json deleted file mode 100644 index 05ecd62..0000000 --- a/.oxlintrc.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "$schema": "./node_modules/oxlint/configuration_schema.json", - "plugins": ["typescript", "unicorn", "vue"], - "env": { - "node": true, - "browser": true - }, - "categories": { - "correctness": "error", - "perf": "error", - "suspicious": "error", - "pedantic": "warn", - "style": "warn", - "nursery": "warn" - }, - "globals": { - "defineExpose": "readonly", - "defineProps": "readonly", - "defineModel": "readonly" - }, - "rules": { - "id-length": "off", - "init-declarations": "off", - "max-depth": "off", - "max-lines-per-function": "off", - "max-params": "off", - "max-statements": "off", - "no-await-in-loop": "off", - "no-duplicate-imports": ["error", { "allowSeparateTypeImports": true }], - "no-magic-numbers": "off", - "no-ternary": "off", - "prefer-global-this": "off", - "sort-imports": "off", - "typescript/consistent-type-imports": ["error", { "prefer": "type-imports", "fixStyle": "separate-type-imports" }], - "unicorn/filename-case": "off", - "unicorn/no-null": "off", - "unicorn/prefer-node-protocol": "error" - } -} diff --git a/.vitepress/config.ts b/.vitepress/config.ts index 920895a..98eaf9d 100644 --- a/.vitepress/config.ts +++ b/.vitepress/config.ts @@ -2,155 +2,159 @@ import { slug as githubSlug } from 'github-slugger'; import { defineConfig } from 'vitepress'; import { groupIconMdPlugin, groupIconVitePlugin } from 'vitepress-plugin-group-icons'; -import modulesData from '../generated/metadata/modules.json' with { type: 'json' }; -import joiInfo from '../generated/modules/joi/info.json' with { type: 'json' }; import { formatVersion } from './utils.js'; +import ModulesData from '../generated/metadata/modules.json' with { type: 'json' }; +import JoiInfo from '../generated/modules/joi/info.json' with { type: 'json' }; -const modulesItems = Object.keys(modulesData) - .filter((name) => name !== 'joi') - .map((name) => ({ - link: `/module/${name}/install`, - text: name, - })); +const modulesItems = Object.keys(ModulesData) + .filter((name) => name !== 'joi') + .map((name) => ({ + link: `/module/${name}/install`, + text: name, + })); const getModuleSidebar = (moduleName: string) => { - const moduleData = modulesData[moduleName as keyof typeof modulesData]; - return [ - { - items: [{ link: '/module/', text: 'All Modules' }, ...modulesItems], - text: 'Modules', - }, - { - items: [ - { link: `/module/${moduleName}/install`, text: 'Installation' }, + const moduleData = ModulesData[moduleName as keyof typeof ModulesData]; + return [ { - items: moduleData.versions.map((version) => ({ - link: `/module/${moduleName}/api/${formatVersion(version.name)}`, - text: formatVersion(version.name), - })), - link: `/module/${moduleName}/api/${formatVersion(moduleData.versions[0].name)}`, - text: 'API', + items: [{ link: '/module/', text: 'All Modules' }, ...modulesItems], + text: 'Modules', }, - { link: `/module/${moduleName}/changelog`, text: 'Changelog' }, - ], - text: moduleName, - }, - ]; + { + items: [ + { link: `/module/${moduleName}/install`, text: 'Installation' }, + { + items: moduleData.versions.map((version) => ({ + link: `/module/${moduleName}/api/${formatVersion(version.name)}`, + text: formatVersion(version.name), + })), + link: `/module/${moduleName}/api/${formatVersion(moduleData.versions[0].name)}`, + text: 'API', + }, + { link: `/module/${moduleName}/changelog`, text: 'Changelog' }, + ], + text: moduleName, + }, + ]; }; const moduleSidebars = Object.fromEntries( - Object.keys(modulesData) - .filter((name) => name !== 'joi') - .map((name) => [`/module/${name}/`, getModuleSidebar(name)]), + Object.keys(ModulesData) + .filter((name) => name !== 'joi') + .map((name) => [`/module/${name}/`, getModuleSidebar(name)]), ); export default defineConfig({ - appearance: true, - cleanUrls: true, - description: 'The most powerful data validation library for JS', - head: [['link', { href: '/favicon2.png', rel: 'icon' }]], - markdown: { - anchor: { - slugify: (s) => githubSlug(s), - }, - config(md) { - md.use(groupIconMdPlugin); - }, - lineNumbers: true, - theme: { - dark: 'vitesse-dark', - light: 'vitesse-light', - }, - }, - outDir: 'dist', - srcDir: 'docs', - themeConfig: { - docFooter: { - next: false, - prev: false, - }, - footer: { - copyright: 'Copyright © 2012-present hapi.js team', - message: - 'Deploys by Netlify', - }, - logo: '/img/joiTransparent.png', - nav: [ - { link: '/', text: 'Home' }, - { activeMatch: '^/api/', link: `/api/${formatVersion(joiInfo.versionsArray[0])}`, text: 'API' }, - { - activeMatch: '^/resources/', - link: '/resources/changelog', - text: 'Resources', - }, - { activeMatch: '^/module/', link: '/module/', text: 'Modules' }, - { activeMatch: '^/policies/', link: '/policies/coc', text: 'Policies' }, - { activeMatch: '^/tester/', link: '/tester/', text: 'Sandbox' }, - ], - outline: { - label: 'On this page', - level: 'deep', - }, - sidebar: { - '/api/': [ - { - items: [ - { - items: joiInfo.versionsArray.map((version) => ({ - link: `/api/${formatVersion(version)}`, - text: formatVersion(version), - })), - link: `/api/${formatVersion(joiInfo.versionsArray[0])}`, - text: 'API', - }, - ], - text: 'joi', + appearance: true, + cleanUrls: true, + description: 'The most powerful data validation library for JS', + head: [['link', { href: '/favicon2.png', rel: 'icon' }]], + markdown: { + anchor: { + slugify: (s) => githubSlug(s), }, - ], - '/module/': [ - { - items: [{ link: '/module/', text: 'All Modules' }, ...modulesItems], - text: 'Modules', + config(md) { + md.use(groupIconMdPlugin); }, - ], - '/policies/': [ - { - items: [ - { link: '/policies/coc', text: 'Code of Conduct' }, - { link: '/policies/contributing', text: 'Contributing' }, - { link: '/policies/license', text: 'License' }, - { link: '/policies/security', text: 'Security' }, - { link: '/policies/styleguide', text: 'Style Guide' }, - { link: '/policies/support', text: 'Support' }, - ], - text: 'Policies', + lineNumbers: true, + theme: { + dark: 'vitesse-dark', + light: 'vitesse-light', }, - ], - '/resources/': [ - { - items: [ - { link: '/resources/changelog', text: 'Changelog' }, - { link: '/resources/status', text: 'Module Status' }, - ], - text: 'Resources', + }, + outDir: 'dist', + srcDir: 'docs', + themeConfig: { + docFooter: { + next: false, + prev: false, }, - ], - '/tester/': [ - { - items: joiInfo.versionsArray.map((version) => ({ - link: `/tester/${formatVersion(version)}`, - text: formatVersion(version), - })), - text: 'Versions', + footer: { + copyright: 'Copyright © 2012-present hapi.js team', + message: + 'Deploys by Netlify', }, - ], - ...moduleSidebars, + logo: '/img/joiTransparent.png', + nav: [ + { link: '/', text: 'Home' }, + { + activeMatch: '^/api/', + link: `/api/${formatVersion(JoiInfo.versionsArray[0])}`, + text: 'API', + }, + { + activeMatch: '^/resources/', + link: '/resources/changelog', + text: 'Resources', + }, + { activeMatch: '^/module/', link: '/module/', text: 'Modules' }, + { activeMatch: '^/policies/', link: '/policies/coc', text: 'Policies' }, + { activeMatch: '^/tester/', link: '/tester/', text: 'Sandbox' }, + ], + outline: { + label: 'On this page', + level: 'deep', + }, + sidebar: { + '/api/': [ + { + items: [ + { + items: JoiInfo.versionsArray.map((version) => ({ + link: `/api/${formatVersion(version)}`, + text: formatVersion(version), + })), + link: `/api/${formatVersion(JoiInfo.versionsArray[0])}`, + text: 'API', + }, + ], + text: 'joi', + }, + ], + '/module/': [ + { + items: [{ link: '/module/', text: 'All Modules' }, ...modulesItems], + text: 'Modules', + }, + ], + '/policies/': [ + { + items: [ + { link: '/policies/coc', text: 'Code of Conduct' }, + { link: '/policies/contributing', text: 'Contributing' }, + { link: '/policies/license', text: 'License' }, + { link: '/policies/security', text: 'Security' }, + { link: '/policies/styleguide', text: 'Style Guide' }, + { link: '/policies/support', text: 'Support' }, + ], + text: 'Policies', + }, + ], + '/resources/': [ + { + items: [ + { link: '/resources/changelog', text: 'Changelog' }, + { link: '/resources/status', text: 'Module Status' }, + ], + text: 'Resources', + }, + ], + '/tester/': [ + { + items: JoiInfo.versionsArray.map((version) => ({ + link: `/tester/${formatVersion(version)}`, + text: formatVersion(version), + })), + text: 'Versions', + }, + ], + ...moduleSidebars, + }, + socialLinks: [{ icon: 'github', link: 'https://github.com/hapijs/joi' }], + }, + title: 'joi.dev', + titleTemplate: 'joi.dev - :title', + vite: { + plugins: [groupIconVitePlugin()], }, - socialLinks: [{ icon: 'github', link: 'https://github.com/hapijs/joi' }], - }, - title: 'joi.dev', - titleTemplate: 'joi.dev - :title', - vite: { - plugins: [groupIconVitePlugin()], - }, }); diff --git a/.vitepress/theme/index.ts b/.vitepress/theme/index.ts index e00d20b..51eea9f 100644 --- a/.vitepress/theme/index.ts +++ b/.vitepress/theme/index.ts @@ -1,9 +1,11 @@ import DefaultTheme from 'vitepress/theme'; import { defineAsyncComponent, h } from 'vue'; +// oxfmt-ignore import './variables.css'; import './main.css'; import 'virtual:group-icons.css'; + import { getRedirectPath } from './redirect.js'; import type { Theme } from 'vitepress'; @@ -15,31 +17,31 @@ const StatusContent = defineAsyncComponent(() => import('../../components/Status const TesterContent = defineAsyncComponent(() => import('../../components/TesterContent.vue')); export default { - Layout() { - return h(DefaultTheme.Layout, null, { - 'sidebar-nav-after': () => h(CarbonAds), - }); - }, - enhanceApp({ app, router }) { - app.component('ModuleIndex', ModuleIndex); - app.component('StatusContent', StatusContent); - app.component('TesterContent', TesterContent); - app.component('ApiOutline', ApiOutline); + Layout() { + return h(DefaultTheme.Layout, null, { + 'sidebar-nav-after': () => h(CarbonAds), + }); + }, + enhanceApp({ app, router }) { + app.component('ModuleIndex', ModuleIndex); + app.component('StatusContent', StatusContent); + app.component('TesterContent', TesterContent); + app.component('ApiOutline', ApiOutline); - if (typeof window !== 'undefined') { - router.onBeforeRouteChange = (to) => { - const target = getRedirectPath(to); - if (target) { - router.go(target); - return false; - } - }; + if (typeof window !== 'undefined') { + router.onBeforeRouteChange = (to) => { + const target = getRedirectPath(to); + if (target) { + router.go(target); + return false; + } + }; - const initialTarget = getRedirectPath(window.location.pathname); - if (initialTarget) { - router.go(initialTarget); - } - } - }, - extends: DefaultTheme, + const initialTarget = getRedirectPath(window.location.pathname); + if (initialTarget) { + router.go(initialTarget); + } + } + }, + extends: DefaultTheme, } satisfies Theme; diff --git a/.vitepress/theme/main.css b/.vitepress/theme/main.css index bda87a8..b6ffff3 100644 --- a/.vitepress/theme/main.css +++ b/.vitepress/theme/main.css @@ -1,82 +1,82 @@ .VPSidebar .nav { - display: flex; - flex-direction: column; - min-height: calc(100vh - var(--vp-nav-height) - 128px); + display: flex; + flex-direction: column; + min-height: calc(100vh - var(--vp-nav-height) - 128px); } .breaking-badge { - display: inline-flex; - align-items: center; - padding: 0 6px; - font-size: 11px; - font-weight: 600; - height: 18px; - line-height: 18px; - border-radius: 4px; - background-color: var(--vp-c-brand-1); - color: var(--vp-c-white); - text-transform: uppercase; - vertical-align: middle; - margin-left: 8px; - box-sizing: border-box; + display: inline-flex; + align-items: center; + padding: 0 6px; + font-size: 11px; + font-weight: 600; + height: 18px; + line-height: 18px; + border-radius: 4px; + background-color: var(--vp-c-brand-1); + color: var(--vp-c-white); + text-transform: uppercase; + vertical-align: middle; + margin-left: 8px; + box-sizing: border-box; } .breaking-badge::after { - content: 'breaking changes'; + content: 'breaking changes'; } .release-notes-link { - display: inline-flex; - align-items: center; - padding: 0 6px; - font-size: 11px; - font-weight: 600; - height: 18px; - line-height: 18px; - border-radius: 4px; - background-color: var(--release-notes-bg); - color: var(--vp-c-black) !important; - text-transform: uppercase; - vertical-align: middle; - margin-left: 8px; - text-decoration: none !important; - box-sizing: border-box; + display: inline-flex; + align-items: center; + padding: 0 6px; + font-size: 11px; + font-weight: 600; + height: 18px; + line-height: 18px; + border-radius: 4px; + background-color: var(--release-notes-bg); + color: var(--vp-c-black) !important; + text-transform: uppercase; + vertical-align: middle; + margin-left: 8px; + text-decoration: none !important; + box-sizing: border-box; } .release-notes-link::after { - content: 'release notes'; - margin-left: 10px; + content: 'release notes'; + margin-left: 10px; } .release-notes-link span { - margin-left: 10px; + margin-left: 10px; } .release-notes-link:hover { - opacity: 0.8; + opacity: 0.8; } .release-notes-img { - width: 12px; - height: 12px; + width: 12px; + height: 12px; } .atom-link { - display: inline-flex; - align-items: center; - vertical-align: middle; - color: var(--vp-c-text-2); - transition: color 0.2s; - text-decoration: none !important; - margin-left: 12px; + display: inline-flex; + align-items: center; + vertical-align: middle; + color: var(--vp-c-text-2); + transition: color 0.2s; + text-decoration: none !important; + margin-left: 12px; } .atom-link:hover { - color: var(--vp-c-orange) !important; + color: var(--vp-c-orange) !important; } .atom-icon { - width: 24px; - height: 24px; - fill: currentColor; + width: 24px; + height: 24px; + fill: currentColor; } diff --git a/.vitepress/theme/redirect.ts b/.vitepress/theme/redirect.ts index b48fac6..8a9f653 100644 --- a/.vitepress/theme/redirect.ts +++ b/.vitepress/theme/redirect.ts @@ -1,51 +1,51 @@ import Semver from 'semver'; -import joiInfo from '../../generated/modules/joi/info.json' with { type: 'json' }; +import JoiInfo from '../../generated/modules/joi/info.json' with { type: 'json' }; import { formatVersion } from '../utils.js'; export const getRedirectPath = (toPath: string) => { - const [urlPath, hash] = toPath.split('#'); - const path = urlPath.replace(/\/$/, '').replace(/\.html$/, '') || '/'; - const match = path.match(/^\/(api|tester)(?:\/([^/]+))?$/); - if (!match) { - return null; - } - - const [_, type, version] = match; - const suffix = hash ? `#${hash}` : ''; - - const [latestVersion] = joiInfo.versionsArray; - const latestMasked = formatVersion(latestVersion); - - if (!version) { - return `/${type}/${latestMasked}${suffix}`; - } - - const maskedVersions = joiInfo.versionsArray.map(formatVersion); - - if (maskedVersions.includes(version)) { - return null; - } - - let targetVersion = latestVersion; - try { - const coerced = Semver.coerce(version); - if (coerced) { - const major = Semver.major(coerced); - const sameMajor = joiInfo.versionsArray.find((v) => Semver.major(v) === major); - if (sameMajor) { - targetVersion = sameMajor; - } + const [urlPath, hash] = toPath.split('#'); + const path = urlPath.replace(/\/$/, '').replace(/\.html$/, '') || '/'; + const match = path.match(/^\/(api|tester)(?:\/([^/]+))?$/); + if (!match) { + return null; } - } catch { - // Keep targetVersion as latest if coercion fails - } - const finalTarget = formatVersion(targetVersion); + const [, type, version] = match; + const suffix = hash ? `#${hash}` : ''; - if (finalTarget === version) { - return null; - } + const [latestVersion] = JoiInfo.versionsArray; + const latestMasked = formatVersion(latestVersion); - return `/${type}/${finalTarget}${suffix}`; + if (!version) { + return `/${type}/${latestMasked}${suffix}`; + } + + const maskedVersions = JoiInfo.versionsArray.map(formatVersion); + + if (maskedVersions.includes(version)) { + return null; + } + + let targetVersion = latestVersion; + try { + const coerced = Semver.coerce(version); + if (coerced) { + const major = Semver.major(coerced); + const sameMajor = JoiInfo.versionsArray.find((v) => Semver.major(v) === major); + if (sameMajor) { + targetVersion = sameMajor; + } + } + } catch { + // Keep targetVersion as latest if coercion fails + } + + const finalTarget = formatVersion(targetVersion); + + if (finalTarget === version) { + return null; + } + + return `/${type}/${finalTarget}${suffix}`; }; diff --git a/.vitepress/theme/variables.css b/.vitepress/theme/variables.css index 18eeead..0d03f88 100644 --- a/.vitepress/theme/variables.css +++ b/.vitepress/theme/variables.css @@ -1,25 +1,25 @@ :root { - /* Brand Colors */ - --vp-c-brand-1: #0080ff; - --vp-c-brand-2: #0066cc; - --vp-c-brand-3: #004da6; - --vp-c-brand-soft: rgba(0, 128, 255, 0.14); + /* Brand Colors */ + --vp-c-brand-1: #0080ff; + --vp-c-brand-2: #0066cc; + --vp-c-brand-3: #004da6; + --vp-c-brand-soft: rgba(0, 128, 255, 0.14); - /* Tester Component */ - --tester-error: #ff6a6a; - --tester-success: #42b983; + /* Tester Component */ + --tester-error: #ff6a6a; + --tester-success: #42b983; - /* Release Notes Badge */ - --release-notes-bg: #fad8c7; + /* Release Notes Badge */ + --release-notes-bg: #fad8c7; - /* CodeMirror Editor */ - --cm-selection-bg-dark: #3e4451; - --cm-selection-bg-light: #d7d4f0; + /* CodeMirror Editor */ + --cm-selection-bg-dark: #3e4451; + --cm-selection-bg-light: #d7d4f0; - /* Atom Icon */ - --vp-c-orange: #f26522; + /* Atom Icon */ + --vp-c-orange: #f26522; - /* Modal & Overlays */ - --overlay-bg: rgba(0, 0, 0, 0.5); - --modal-shadow: rgba(0, 0, 0, 0.3); + /* Modal & Overlays */ + --overlay-bg: rgba(0, 0, 0, 0.5); + --modal-shadow: rgba(0, 0, 0, 0.3); } diff --git a/.vitepress/utils.ts b/.vitepress/utils.ts index 0c481df..3b16b7a 100644 --- a/.vitepress/utils.ts +++ b/.vitepress/utils.ts @@ -1,4 +1,4 @@ export const formatVersion = (version: string) => { - const [major] = version.split('.'); - return `${major}.x.x`; + const [major] = version.split('.'); + return `${major}.x.x`; }; diff --git a/cli/generateChangelog.ts b/cli/generateChangelog.ts index 2e9471b..ab5967c 100644 --- a/cli/generateChangelog.ts +++ b/cli/generateChangelog.ts @@ -1,5 +1,5 @@ -import fs from 'node:fs/promises'; -import path from 'node:path'; +import Fs from 'node:fs/promises'; +import Path from 'node:path'; import { Semaphore } from 'es-toolkit'; import { Feed } from 'feed'; @@ -12,160 +12,162 @@ import { getExisting, getModuleChangelogPath, getModuleMarkdownChangelogPath, PU import type { ChangelogItem } from './types.js'; export const generateChangelog = async (moduleName: string) => { - let foundNewMilestones = false; - - const filePath = getModuleChangelogPath(moduleName); - const existing = await getExisting(filePath); - const existingMap = new Map(existing?.map((c) => [c.version, c])); - - console.info(`[changelog] Generating for ${moduleName}`); + let foundNewMilestones = false; + + const filePath = getModuleChangelogPath(moduleName); + const existing = await getExisting(filePath); + const existingMap = new Map(existing?.map((c) => [c.version, c])); + + console.info(`[changelog] Generating for ${moduleName}`); + + const milestones = await getMilestones(moduleName); + + const changelog: ChangelogItem[] = []; + + const limit = new Semaphore(10); + const tasks = milestones.map(async (milestone) => { + if (existingMap.has(milestone.title)) { + console.info(`[changelog] Skipping ${moduleName}@${milestone.title}`); + return existingMap.get(milestone.title)!; + } + + await limit.acquire(); + try { + console.info(`[changelog] Getting issues for ${moduleName}@${milestone.title}`); + + const issues = await getMilestoneIssues(moduleName, milestone.number); + + foundNewMilestones = true; + + return { + date: milestone.closed_at, + id: milestone.id, + issues: issues.map((issue) => ({ + id: issue.id, + labels: issue.labels.map((label) => label.name), + number: issue.number, + title: issue.title, + url: issue.html_url, + })), + number: milestone.number, + url: milestone.html_url, + version: milestone.title, + }; + } finally { + limit.release(); + } + }); - const milestones = await getMilestones(moduleName); + changelog.push(...(await Promise.all(tasks))); - const changelog: ChangelogItem[] = []; + const sortedChangelog = changelog.toSorted((a, b) => Semver.compare(b.version, a.version)); - const limit = new Semaphore(10); - const tasks = milestones.map(async (milestone) => { - if (existingMap.has(milestone.title)) { - console.info(`[changelog] Skipping ${moduleName}@${milestone.title}`); - return existingMap.get(milestone.title)!; + if (foundNewMilestones) { + await Fs.writeFile(filePath, JSON.stringify(sortedChangelog, null, 2)); } - await limit.acquire(); - try { - console.info(`[changelog] Getting issues for ${moduleName}@${milestone.title}`); - - const issues = await getMilestoneIssues(moduleName, milestone.number); - - foundNewMilestones = true; - - return { - date: milestone.closed_at, - id: milestone.id, - issues: issues.map((issue) => ({ - id: issue.id, - labels: issue.labels.map((label) => label.name), - number: issue.number, - title: issue.title, - url: issue.html_url, - })), - number: milestone.number, - url: milestone.html_url, - version: milestone.title, - }; - } finally { - limit.release(); - } - }); - - changelog.push(...(await Promise.all(tasks))); - - const sortedChangelog = changelog.toSorted((a, b) => Semver.compare(b.version, a.version)); - - if (foundNewMilestones) { - await fs.writeFile(filePath, JSON.stringify(sortedChangelog, null, 2)); - } - - await generateModuleMarkdownChangelog(moduleName, sortedChangelog); - await generateModuleAtom(moduleName, sortedChangelog); + await generateModuleMarkdownChangelog(moduleName, sortedChangelog); + await generateModuleAtom(moduleName, sortedChangelog); }; const generateModuleAtom = async (moduleName: string, sortedChangelog: ChangelogItem[]) => { - const isJoi = moduleName === 'joi'; - const spec = modules[moduleName]; - const fullModuleName = spec?.package ?? moduleName; - const baseLink = isJoi ? 'https://joi.dev' : `https://joi.dev/module/${moduleName}`; - const changelogLink = isJoi - ? 'https://joi.dev/resources/changelog' - : `https://joi.dev/module/${moduleName}/changelog`; - - const feed = new Feed({ - favicon: 'https://joi.dev/favicon.png', - id: baseLink, - image: 'https://joi.dev/img/logo.png', - language: 'en', - link: baseLink, - title: `${fullModuleName} changelog`, - updated: new Date(sortedChangelog[0]?.date ?? Date.now()), - }); - - const items = sortedChangelog.slice(0, 50); - - for (const item of items) { - const title = `${fullModuleName} v${item.version}`; - const link = `${changelogLink}#${item.version}`; - const date = new Date(item.date); - - let content = '
    '; - for (const issue of item.issues) { - content += `
  • [#${issue.number}] ${escapeHtml(issue.title)}
  • `; - } - content += '
'; - - feed.addItem({ - content, - date, - description: title, - id: item.url, - link, - title, + const isJoi = moduleName === 'joi'; + const spec = modules[moduleName]; + const fullModuleName = spec?.package ?? moduleName; + const baseLink = isJoi ? 'https://joi.dev' : `https://joi.dev/module/${moduleName}`; + const changelogLink = isJoi + ? 'https://joi.dev/resources/changelog' + : `https://joi.dev/module/${moduleName}/changelog`; + + const feed = new Feed({ + favicon: 'https://joi.dev/favicon.png', + id: baseLink, + image: 'https://joi.dev/img/logo.png', + language: 'en', + link: baseLink, + title: `${fullModuleName} changelog`, + updated: new Date(sortedChangelog[0]?.date ?? Date.now()), }); - } - const atomPath = path.join(PUBLIC_ATOM_DIR, `${moduleName}.atom`); - await fs.mkdir(path.dirname(atomPath), { recursive: true }); - await fs.writeFile(atomPath, feed.atom1()); + const items = sortedChangelog.slice(0, 50); + + for (const item of items) { + const title = `${fullModuleName} v${item.version}`; + const link = `${changelogLink}#${item.version}`; + const date = new Date(item.date); + + let content = '
    '; + for (const issue of item.issues) { + content += `
  • [#${issue.number}] ${escapeHtml(issue.title)}
  • `; + } + content += '
'; + + feed.addItem({ + content, + date, + description: title, + id: item.url, + link, + title, + }); + } + + const atomPath = Path.join(PUBLIC_ATOM_DIR, `${moduleName}.atom`); + await Fs.mkdir(Path.dirname(atomPath), { recursive: true }); + await Fs.writeFile(atomPath, feed.atom1()); }; const generateModuleMarkdownChangelog = async (moduleName: string, sortedChangelog: ChangelogItem[]) => { - const majorVersions = new Set(); - sortedChangelog.forEach((m) => { - const [major] = m.version.split('.'); - if (major) { - majorVersions.add(major); - } - }); + const majorVersions = new Set(); + sortedChangelog.forEach((m) => { + const [major] = m.version.split('.'); + if (major) { + majorVersions.add(major); + } + }); - const changelogPath = getModuleMarkdownChangelogPath(moduleName); - await fs.mkdir(path.dirname(changelogPath), { recursive: true }); - let content = ''; + const changelogPath = getModuleMarkdownChangelogPath(moduleName); + await Fs.mkdir(Path.dirname(changelogPath), { recursive: true }); + let content = ''; - const sortedMajors = [...majorVersions].toSorted((a, b) => parseInt(b, 10) - parseInt(a, 10)); + const sortedMajors = [...majorVersions].toSorted((a, b) => parseInt(b, 10) - parseInt(a, 10)); - for (const major of sortedMajors) { - content += `## Version ${major} {#v${major}}\n\n`; + for (const major of sortedMajors) { + content += `## Version ${major} {#v${major}}\n\n`; - const milestones = sortedChangelog.filter((m) => m.version.startsWith(`${major}.`)); + const milestones = sortedChangelog.filter((m) => m.version.startsWith(`${major}.`)); - for (const milestone of milestones) { - const hasBreaking = milestone.issues.some((issue) => issue.labels.some((label) => label === 'breaking changes')); + for (const milestone of milestones) { + const hasBreaking = milestone.issues.some((issue) => + issue.labels.some((label) => label === 'breaking changes'), + ); - const releaseNotesIssue = milestone.issues.find((issue) => - issue.labels.some((label) => label === 'release notes'), - ); + const releaseNotesIssue = milestone.issues.find((issue) => + issue.labels.some((label) => label === 'release notes'), + ); - content += `### [${milestone.version}](${milestone.url}) `; + content += `### [${milestone.version}](${milestone.url}) `; - if (releaseNotesIssue) { - content += ` `; - } + if (releaseNotesIssue) { + content += ` `; + } - if (hasBreaking) { - content += ` `; - } + if (hasBreaking) { + content += ` `; + } - content += `{#${milestone.version}} `; + content += `{#${milestone.version}} `; - content += `\n\n`; + content += `\n\n`; - for (const issue of milestone.issues) { - content += `- [#${issue.number}](${issue.url}) ${escapeHtml(issue.title)}\n`; - } - content += '\n'; + for (const issue of milestone.issues) { + content += `- [#${issue.number}](${issue.url}) ${escapeHtml(issue.title)}\n`; + } + content += '\n'; + } } - } - await fs.writeFile(changelogPath, content); + await Fs.writeFile(changelogPath, content); }; const escapeHtml = (text: string) => text.replaceAll('<', '<').replaceAll('>', '>'); diff --git a/cli/getModuleInfo.ts b/cli/getModuleInfo.ts index 1f0e0d6..c2858c1 100644 --- a/cli/getModuleInfo.ts +++ b/cli/getModuleInfo.ts @@ -1,6 +1,6 @@ import { execFileSync } from 'node:child_process'; -import fs from 'node:fs/promises'; -import path from 'node:path'; +import Fs from 'node:fs/promises'; +import Path from 'node:path'; import { Semaphore, uniq } from 'es-toolkit'; import Semver from 'semver'; @@ -9,34 +9,34 @@ import { generateChangelog } from './generateChangelog.js'; import { getRawContent, getRepoInfo } from './gh.js'; import { modules } from './modules.js'; import { - API_DIR, - METADATA_DIR, - MODULE_DIR, - PACKAGE_JSON_PATH, - POLICIES_GENERATED_DIR, - getExisting, - getModuleInfoPath, - getModuleMarkdownPath, - getModuleStoragePath, + API_DIR, + METADATA_DIR, + MODULE_DIR, + PACKAGE_JSON_PATH, + POLICIES_GENERATED_DIR, + getExisting, + getModuleInfoPath, + getModuleMarkdownPath, + getModuleStoragePath, } from './paths.js'; import type { ModuleInfo, ModuleSpec, VersionInfo } from './types.js'; const getFilteredVersions = (specs: ModuleSpec, versions: string[]): VersionInfo[] => { - const compatibilityVersions = Object.keys(specs.compatibility); - const minVersion = Math.min(...compatibilityVersions.map((v) => parseInt(v, 10))); - const prefilteredVersions = versions.filter((v) => Semver.satisfies(v, `>=${minVersion}`)); - const publishedMajorVersions = uniq(prefilteredVersions.map((v) => Semver.major(v))); - const semveredMajors = compatibilityVersions.map((v) => `${v}.0.0`); - - return publishedMajorVersions.map((major) => { - const closestMatchingVersion = Semver.maxSatisfying(semveredMajors, `<= ${major}`); - return { - fullVersion: Semver.maxSatisfying(prefilteredVersions, `^${major}`)!, - major, - nodeVersion: closestMatchingVersion ? specs.compatibility[Semver.major(closestMatchingVersion)] : '', - }; - }); + const compatibilityVersions = Object.keys(specs.compatibility); + const minVersion = Math.min(...compatibilityVersions.map((v) => parseInt(v, 10))); + const prefilteredVersions = versions.filter((v) => Semver.satisfies(v, `>=${minVersion}`)); + const publishedMajorVersions = uniq(prefilteredVersions.map((v) => Semver.major(v))); + const semveredMajors = compatibilityVersions.map((v) => `${v}.0.0`); + + return publishedMajorVersions.map((major) => { + const closestMatchingVersion = Semver.maxSatisfying(semveredMajors, `<= ${major}`); + return { + fullVersion: Semver.maxSatisfying(prefilteredVersions, `^${major}`)!, + major, + nodeVersion: closestMatchingVersion ? specs.compatibility[Semver.major(closestMatchingVersion)] : '', + }; + }); }; const repos: Record> = {}; @@ -44,157 +44,157 @@ const repos: Record> = {}; const limit = new Semaphore(4); const processModule = async (moduleName: string, specs: ModuleSpec) => { - console.info(`Processing ${moduleName}`); - - await fs.mkdir(getModuleStoragePath(moduleName), { - recursive: true, - }); + console.info(`Processing ${moduleName}`); - const filePath = getModuleInfoPath(moduleName); + await Fs.mkdir(getModuleStoragePath(moduleName), { + recursive: true, + }); - const existing = await getExisting(filePath); + const filePath = getModuleInfoPath(moduleName); + + const existing = await getExisting(filePath); + + // Get published versions from npm + const versions = JSON.parse( + execFileSync('npm', ['view', specs.package, 'versions', '--json'], { + encoding: 'utf8', + }), + ) as string[]; + + const currentModule: ModuleInfo = { + api: false, + forks: 0, + link: '', + name: moduleName, + package: specs.package, + slogan: '', + stars: 0, + updated: '', + versions: [], + versionsArray: [], + }; + repos[moduleName] = currentModule; + + // Keep only latest versions from majors listed in specs + const filteredVersions = getFilteredVersions(specs, versions); + + currentModule.versionsArray = filteredVersions.map((v) => v.fullVersion).toSorted((a, b) => Semver.compare(b, a)); + + const versionLimit = new Semaphore(10); + const versionTasks = filteredVersions.map(async ({ nodeVersion, fullVersion, major }) => { + const apiPath = getModuleMarkdownPath(moduleName, major); + const apiExists = await Fs.access(apiPath) + .then(() => true) + .catch(() => false); + + const existingVersion = existing?.versions.find((v) => v.name === fullVersion); + + if (existingVersion && apiExists) { + console.info(`[docs] Skipping ${moduleName}@${major}`); + return { + apiExists: true, + branch: existingVersion.branch, + license: existingVersion.license, + name: existingVersion.name, + node: existingVersion.node, + }; + } + + await versionLimit.acquire(); + try { + console.info(`[docs] Processing ${moduleName}@${fullVersion}`); + const tagName = `v${fullVersion}`; + + const api = await getRawContent(moduleName, 'API.md', tagName); + + await Fs.mkdir(Path.dirname(apiPath), { recursive: true }); + + await Fs.writeFile(apiPath, api.data); + console.info(`[docs] Wrote ${apiPath}`); + + return { + apiExists: true, + branch: tagName, + license: 'BSD', + name: fullVersion, + node: nodeVersion, + }; + } finally { + versionLimit.release(); + } + }); - // Get published versions from npm - const versions = JSON.parse( - execFileSync('npm', ['view', specs.package, 'versions', '--json'], { - encoding: 'utf8', - }), - ) as string[]; - - const currentModule: ModuleInfo = { - api: false, - forks: 0, - link: '', - name: moduleName, - package: specs.package, - slogan: '', - stars: 0, - updated: '', - versions: [], - versionsArray: [], - }; - repos[moduleName] = currentModule; - - // Keep only latest versions from majors listed in specs - const filteredVersions = getFilteredVersions(specs, versions); - - currentModule.versionsArray = filteredVersions.map((v) => v.fullVersion).toSorted((a, b) => Semver.compare(b, a)); - - const versionLimit = new Semaphore(10); - const versionTasks = filteredVersions.map(async ({ nodeVersion, fullVersion, major }) => { - const apiPath = getModuleMarkdownPath(moduleName, major); - const apiExists = await fs - .access(apiPath) - .then(() => true) - .catch(() => false); - - const existingVersion = existing?.versions.find((v) => v.name === fullVersion); - - if (existingVersion && apiExists) { - console.info(`[docs] Skipping ${moduleName}@${major}`); - return { - apiExists: true, - branch: existingVersion.branch, - license: existingVersion.license, - name: existingVersion.name, - node: existingVersion.node, - }; + const versionResults = await Promise.all(versionTasks); + for (const result of versionResults) { + currentModule.versions.push({ + branch: result.branch, + license: result.license, + name: result.name, + node: result.node, + }); + if (result.apiExists) { + currentModule.api = true; + } } - await versionLimit.acquire(); - try { - console.info(`[docs] Processing ${moduleName}@${fullVersion}`); - const tagName = `v${fullVersion}`; - - const api = await getRawContent(moduleName, 'API.md', tagName); + currentModule.versions.sort((a, b) => Semver.compare(a.name, b.name)); + + const [readme, repoInfo] = await Promise.all([ + existing ? Promise.resolve({ data: '' }) : getRawContent(moduleName, 'README.md'), + existing + ? Promise.resolve({ + data: { + forks_count: existing.forks, + html_url: existing.link, + pushed_at: existing.updated, + stargazers_count: existing.stars, + }, + }) + : getRepoInfo(moduleName), + ]); + + const readmeMatch = readme.data.match(/####(.*)/gm); + const rawSlogan = + readmeMatch === null ? (existing?.slogan ?? 'Description coming soon...') : readmeMatch[0].slice(5); + + currentModule.slogan = rawSlogan.trim(); + currentModule.forks = repoInfo.data.forks_count; + currentModule.stars = repoInfo.data.stargazers_count; + currentModule.updated = repoInfo.data.pushed_at; + currentModule.link = repoInfo.data.html_url; + + const moduleDir = getModuleStoragePath(moduleName); + await Fs.mkdir(moduleDir, { recursive: true }); + + await Fs.writeFile(filePath, JSON.stringify(currentModule, null, 2)); + + if (moduleName === 'joi') { + await Fs.mkdir(API_DIR, { recursive: true }); + } - await fs.mkdir(path.dirname(apiPath), { recursive: true }); + await generateChangelog(moduleName); - await fs.writeFile(apiPath, api.data); - console.info(`[docs] Wrote ${apiPath}`); + await Fs.writeFile(filePath, JSON.stringify(currentModule, null, 2)); - return { - apiExists: true, - branch: tagName, - license: 'BSD', - name: fullVersion, - node: nodeVersion, - }; - } finally { - versionLimit.release(); - } - }); - - const versionResults = await Promise.all(versionTasks); - for (const result of versionResults) { - currentModule.versions.push({ - branch: result.branch, - license: result.license, - name: result.name, - node: result.node, - }); - if (result.apiExists) { - currentModule.api = true; - } - } - - currentModule.versions.sort((a, b) => Semver.compare(a.name, b.name)); - - const [readme, repoInfo] = await Promise.all([ - existing ? Promise.resolve({ data: '' }) : getRawContent(moduleName, 'README.md'), - existing - ? Promise.resolve({ - data: { - forks_count: existing.forks, - html_url: existing.link, - pushed_at: existing.updated, - stargazers_count: existing.stars, - }, - }) - : getRepoInfo(moduleName), - ]); - - const readmeMatch = readme.data.match(/####(.*)/gm); - const rawSlogan = readmeMatch === null ? (existing?.slogan ?? 'Description coming soon...') : readmeMatch[0].slice(5); - - currentModule.slogan = rawSlogan.trim(); - currentModule.forks = repoInfo.data.forks_count; - currentModule.stars = repoInfo.data.stargazers_count; - currentModule.updated = repoInfo.data.pushed_at; - currentModule.link = repoInfo.data.html_url; - - const moduleDir = getModuleStoragePath(moduleName); - await fs.mkdir(moduleDir, { recursive: true }); - - await fs.writeFile(filePath, JSON.stringify(currentModule, null, 2)); - - if (moduleName === 'joi') { - await fs.mkdir(API_DIR, { recursive: true }); - } - - await generateChangelog(moduleName); - - await fs.writeFile(filePath, JSON.stringify(currentModule, null, 2)); - - repos[moduleName] = { - forks: currentModule.forks, - link: currentModule.link, - package: currentModule.package, - slogan: currentModule.slogan, - stars: currentModule.stars, - updated: currentModule.updated, - versions: currentModule.versions, - versionsArray: currentModule.versionsArray, - }; + repos[moduleName] = { + forks: currentModule.forks, + link: currentModule.link, + package: currentModule.package, + slogan: currentModule.slogan, + stars: currentModule.stars, + updated: currentModule.updated, + versions: currentModule.versions, + versionsArray: currentModule.versionsArray, + }; }; const moduleTasks = Object.entries(modules).map(async ([moduleName, specs]) => { - await limit.acquire(); - try { - await processModule(moduleName, specs); - } finally { - limit.release(); - } + await limit.acquire(); + try { + await processModule(moduleName, specs); + } finally { + limit.release(); + } }); await Promise.all(moduleTasks); @@ -202,76 +202,76 @@ await Promise.all(moduleTasks); const sortedRepos = Object.fromEntries(Object.keys(modules).map((name) => [name, repos[name]])); const policies: [string, string, string?][] = [ - ['coc', 'CODE_OF_CONDUCT'], - ['contributing', 'CONTRIBUTING'], - ['license', 'LICENSE'], - ['security', 'SECURITY'], - ['styleguide', 'STYLE', 'assets'], - ['support', 'SUPPORT'], + ['coc', 'CODE_OF_CONDUCT'], + ['contributing', 'CONTRIBUTING'], + ['license', 'LICENSE'], + ['security', 'SECURITY'], + ['styleguide', 'STYLE', 'assets'], + ['support', 'SUPPORT'], ]; -await fs.mkdir(POLICIES_GENERATED_DIR, { recursive: true }); +await Fs.mkdir(POLICIES_GENERATED_DIR, { recursive: true }); await Promise.all( - policies.map(async ([policy, fileName, repo]) => { - const policyPath = path.join(POLICIES_GENERATED_DIR, `${policy}.md`); - const existingPolicy = await fs.readFile(policyPath, 'utf8').catch(() => null); - if (existingPolicy) { - console.info(`[policy] Skipping ${policy}`); - return; - } - const { data } = await getRawContent(repo ?? '.github', `${fileName}.md`, 'master'); - await fs.writeFile(policyPath, data); - }), + policies.map(async ([policy, fileName, repo]) => { + const policyPath = Path.join(POLICIES_GENERATED_DIR, `${policy}.md`); + const existingPolicy = await Fs.readFile(policyPath, 'utf8').catch(() => null); + if (existingPolicy) { + console.info(`[policy] Skipping ${policy}`); + return; + } + const { data } = await getRawContent(repo ?? '.github', `${fileName}.md`, 'master'); + await Fs.writeFile(policyPath, data); + }), ); -await fs.mkdir(METADATA_DIR, { recursive: true }); -await fs.writeFile(path.join(METADATA_DIR, 'modules.json'), JSON.stringify(sortedRepos, null, 2)); +await Fs.mkdir(METADATA_DIR, { recursive: true }); +await Fs.writeFile(Path.join(METADATA_DIR, 'modules.json'), JSON.stringify(sortedRepos, null, 2)); console.info('Updating joi dependencies...'); -const packageJson = JSON.parse(await fs.readFile(PACKAGE_JSON_PATH, 'utf8')); +const packageJson = JSON.parse(await Fs.readFile(PACKAGE_JSON_PATH, 'utf8')); const joiMajors = Object.keys(modules.joi.compatibility); const joiRepo = repos.joi; let changed = false; for (const majorStr of joiMajors) { - const major = parseInt(majorStr, 10); - const depName = `joi-${major}`; - const latestVersion = joiRepo?.versionsArray?.find((v) => Semver.major(v) === major); - - if (latestVersion) { - const depValue = `npm:joi@${latestVersion}`; - if (packageJson.dependencies[depName] !== depValue) { - packageJson.dependencies[depName] = depValue; - changed = true; + const major = parseInt(majorStr, 10); + const depName = `joi-${major}`; + const latestVersion = joiRepo?.versionsArray?.find((v) => Semver.major(v) === major); + + if (latestVersion) { + const depValue = `npm:joi@${latestVersion}`; + if (packageJson.dependencies[depName] !== depValue) { + packageJson.dependencies[depName] = depValue; + changed = true; + } + } else { + console.warn(`Could not find latest version for joi major ${major}`); } - } else { - console.warn(`Could not find latest version for joi major ${major}`); - } } if (changed) { - await fs.writeFile(PACKAGE_JSON_PATH, `${JSON.stringify(packageJson, null, 2)}\n`); - console.info('Running pnpm install...'); - execFileSync('pnpm', ['install', '--no-frozen-lockfile'], { stdio: 'inherit' }); + await Fs.writeFile(PACKAGE_JSON_PATH, `${JSON.stringify(packageJson, null, 2)}\n`); + console.info('Running pnpm install...'); + execFileSync('pnpm', ['install', '--no-frozen-lockfile'], { stdio: 'inherit' }); } // Generate module/index.md -const moduleIndexMdPath = path.join(MODULE_DIR, 'index.md'); +const moduleIndexMdPath = Path.join(MODULE_DIR, 'index.md'); const moduleIndexContent = `# Modules The joi ecosystem consists of several modules. `; -await fs.mkdir(MODULE_DIR, { recursive: true }); -await fs.writeFile(moduleIndexMdPath, moduleIndexContent); +await Fs.mkdir(MODULE_DIR, { recursive: true }); +await Fs.writeFile(moduleIndexMdPath, moduleIndexContent); console.info('Running oxfmt...'); try { - execFileSync('oxfmt', ['./generated'], { stdio: 'inherit' }); + execFileSync('oxfmt', ['./generated'], { stdio: 'inherit' }); - // Apparently oxfmt sometimes needs a 2nd pass - execFileSync('oxfmt', ['./generated'], { stdio: 'inherit' }); + // Apparently oxfmt sometimes needs a 2nd pass + execFileSync('oxfmt', ['./generated'], { stdio: 'inherit' }); } catch (error: unknown) { - console.error('Failed to run oxfmt:', error instanceof Error ? error.message : error); + console.error('Failed to run oxfmt:', error instanceof Error ? error.message : error); } diff --git a/cli/gh.ts b/cli/gh.ts index 23c827f..19c6e5f 100644 --- a/cli/gh.ts +++ b/cli/gh.ts @@ -7,64 +7,64 @@ import type { Issue, Milestone } from './types.js'; const MyOctokit = Octokit.plugin(throttling); const gh = new MyOctokit({ - auth: process.env.GITHUB_TOKEN, - throttle: { - onRateLimit: (retryAfter, options, octokit, retryCount) => { - octokit.log.warn(`Request quota exhausted for request ${options.method} ${options.url}`); + auth: process.env.GITHUB_TOKEN, + throttle: { + onRateLimit: (retryAfter, options, octokit, retryCount) => { + octokit.log.warn(`Request quota exhausted for request ${options.method} ${options.url}`); - if (retryCount < 1) { - // Only retries once - octokit.log.info(`Retrying after ${retryAfter} seconds!`); - return true; - } + if (retryCount < 1) { + // Only retries once + octokit.log.info(`Retrying after ${retryAfter} seconds!`); + return true; + } + }, + onSecondaryRateLimit: (retryAfter, options, octokit) => { + // Does not retry, only logs a warning + octokit.log.warn(`Secondary quota exhausted for request ${options.method} ${options.url}`); + }, }, - onSecondaryRateLimit: (retryAfter, options, octokit) => { - // Does not retry, only logs a warning - octokit.log.warn(`Secondary quota exhausted for request ${options.method} ${options.url}`); - }, - }, }); export const getRawContent = async (repoName: string, filePath: string, tagName?: string) => - (await gh.repos.getContent({ - mediaType: { - format: 'raw', - }, - owner: 'hapijs', - path: filePath, - ref: tagName, - repo: repoName, - })) as unknown as { data: string }; + (await gh.repos.getContent({ + mediaType: { + format: 'raw', + }, + owner: 'hapijs', + path: filePath, + ref: tagName, + repo: repoName, + })) as unknown as { data: string }; export const getRepoInfo = async (moduleName: string) => - await gh.repos.get({ - owner: 'hapijs', - repo: moduleName, - }); + await gh.repos.get({ + owner: 'hapijs', + repo: moduleName, + }); export const getMilestones = async (moduleName: string) => { - const milestones: Milestone[] = []; - for await (const response of gh.paginate.iterator(gh.issues.listMilestones, { - owner: 'hapijs', - per_page: 100, - repo: moduleName, - state: 'closed', - })) { - milestones.push(...(response.data as Milestone[])); - } - return milestones.toSorted((a, b) => Semver.compare(a.title, b.title)); + const milestones: Milestone[] = []; + for await (const response of gh.paginate.iterator(gh.issues.listMilestones, { + owner: 'hapijs', + per_page: 100, + repo: moduleName, + state: 'closed', + })) { + milestones.push(...(response.data as Milestone[])); + } + return milestones.toSorted((a, b) => Semver.compare(a.title, b.title)); }; export const getMilestoneIssues = async (moduleName: string, milestoneNumber: number) => { - const issues: Issue[] = []; - for await (const response of gh.paginate.iterator(gh.issues.listForRepo, { - milestone: milestoneNumber.toString(), - owner: 'hapijs', - per_page: 100, - repo: moduleName, - state: 'closed', - })) { - issues.push(...(response.data as Issue[])); - } - return issues; + const issues: Issue[] = []; + for await (const response of gh.paginate.iterator(gh.issues.listForRepo, { + milestone: milestoneNumber.toString(), + owner: 'hapijs', + per_page: 100, + repo: moduleName, + state: 'closed', + })) { + issues.push(...(response.data as Issue[])); + } + return issues; }; diff --git a/cli/modules.ts b/cli/modules.ts index dc6d4e9..eb44fe5 100644 --- a/cli/modules.ts +++ b/cli/modules.ts @@ -1,41 +1,41 @@ import type { ModuleSpec } from './types.js'; export const modules: Record = { - address: { - compatibility: { - 5: '>= 14', + address: { + compatibility: { + 5: '>= 14', + }, + package: '@hapi/address', }, - package: '@hapi/address', - }, - formula: { - compatibility: { - 3: '>= 14', + formula: { + compatibility: { + 3: '>= 14', + }, + package: '@hapi/formula', }, - package: '@hapi/formula', - }, - joi: { - compatibility: { - 17: '>= 14', - 18: '>= 20', + joi: { + compatibility: { + 17: '>= 14', + 18: '>= 20', + }, + package: 'joi', }, - package: 'joi', - }, - 'joi-date': { - compatibility: { - 2: '>= 14', + 'joi-date': { + compatibility: { + 2: '>= 14', + }, + package: '@joi/date', }, - package: '@joi/date', - }, - pinpoint: { - compatibility: { - 2: '>= 14', + pinpoint: { + compatibility: { + 2: '>= 14', + }, + package: '@hapi/pinpoint', }, - package: '@hapi/pinpoint', - }, - tlds: { - compatibility: { - 1: '>= 14', + tlds: { + compatibility: { + 1: '>= 14', + }, + package: '@hapi/tlds', }, - package: '@hapi/tlds', - }, }; diff --git a/cli/paths.ts b/cli/paths.ts index 7b1868c..3d85418 100644 --- a/cli/paths.ts +++ b/cli/paths.ts @@ -1,37 +1,37 @@ -import fs from 'node:fs/promises'; -import path from 'node:path'; - -export const GENERATED_DIR = path.join(import.meta.dirname, '../generated'); -export const API_DIR = path.join(import.meta.dirname, '../docs/api'); -export const MODULE_DIR = path.join(import.meta.dirname, '../docs/module'); -export const MARKDOWN_DIR = path.join(GENERATED_DIR, 'markdown'); -export const POLICIES_GENERATED_DIR = path.join(MARKDOWN_DIR, 'policies'); -export const METADATA_DIR = path.join(GENERATED_DIR, 'metadata'); -export const MODULES_DIR = path.join(GENERATED_DIR, 'modules'); -export const ROOT_DIR = path.join(import.meta.dirname, '..'); -export const PACKAGE_JSON_PATH = path.join(ROOT_DIR, 'package.json'); -export const PUBLIC_ATOM_DIR = path.join(import.meta.dirname, '../docs/public/atom'); +import Fs from 'node:fs/promises'; +import Path from 'node:path'; + +export const GENERATED_DIR = Path.join(import.meta.dirname, '../generated'); +export const API_DIR = Path.join(import.meta.dirname, '../docs/api'); +export const MODULE_DIR = Path.join(import.meta.dirname, '../docs/module'); +export const MARKDOWN_DIR = Path.join(GENERATED_DIR, 'markdown'); +export const POLICIES_GENERATED_DIR = Path.join(MARKDOWN_DIR, 'policies'); +export const METADATA_DIR = Path.join(GENERATED_DIR, 'metadata'); +export const MODULES_DIR = Path.join(GENERATED_DIR, 'modules'); +export const ROOT_DIR = Path.join(import.meta.dirname, '..'); +export const PACKAGE_JSON_PATH = Path.join(ROOT_DIR, 'package.json'); +export const PUBLIC_ATOM_DIR = Path.join(import.meta.dirname, '../docs/public/atom'); export const getModuleMarkdownPath = (moduleName: string, major: string | number) => - path.join(MARKDOWN_DIR, moduleName, major.toString(), 'api.md'); + Path.join(MARKDOWN_DIR, moduleName, major.toString(), 'api.md'); export const getModuleMarkdownChangelogPath = (moduleName: string) => - path.join(MARKDOWN_DIR, moduleName, 'changelog.md'); + Path.join(MARKDOWN_DIR, moduleName, 'changelog.md'); -export const getModuleStoragePath = (moduleName: string) => path.join(MODULES_DIR, moduleName); +export const getModuleStoragePath = (moduleName: string) => Path.join(MODULES_DIR, moduleName); -export const getModuleInfoPath = (moduleName: string) => path.join(getModuleStoragePath(moduleName), 'info.json'); +export const getModuleInfoPath = (moduleName: string) => Path.join(getModuleStoragePath(moduleName), 'info.json'); export const getModuleChangelogPath = (moduleName: string) => - path.join(getModuleStoragePath(moduleName), 'changelog.json'); + Path.join(getModuleStoragePath(moduleName), 'changelog.json'); -export const getModuleAtomPath = (moduleName: string) => path.join(getModuleStoragePath(moduleName), 'changelog.atom'); +export const getModuleAtomPath = (moduleName: string) => Path.join(getModuleStoragePath(moduleName), 'changelog.atom'); export const getExisting = async (filePath: string): Promise => { - try { - const content = await fs.readFile(filePath, 'utf8'); - return JSON.parse(content) as T; - } catch { - // Ignore error - } + try { + const content = await Fs.readFile(filePath, 'utf8'); + return JSON.parse(content) as T; + } catch { + // Ignore error + } }; diff --git a/cli/types.ts b/cli/types.ts index e002896..68e670e 100644 --- a/cli/types.ts +++ b/cli/types.ts @@ -1,75 +1,75 @@ export interface ChangelogItem { - id: number; - number: number; - version: string; - date: string; - url: string; - issues: { id: number; number: number; - title: string; + version: string; + date: string; url: string; - labels: string[]; - }[]; + issues: { + id: number; + number: number; + title: string; + url: string; + labels: string[]; + }[]; } export interface Milestone { - id: number; - number: number; - title: string; - closed_at: string; - html_url: string; + id: number; + number: number; + title: string; + closed_at: string; + html_url: string; } export interface Issue { - id: number; - number: number; - title: string; - html_url: string; - labels: { name: string }[]; + id: number; + number: number; + title: string; + html_url: string; + labels: { name: string }[]; } export interface VersionInfo { - nodeVersion: string; - fullVersion: string; - major: number; + nodeVersion: string; + fullVersion: string; + major: number; } export interface ModuleInfo { - name: string; - slogan: string; - forks: number; - stars: number; - updated: string; - link: string; - versions: { name: string; - branch: string; - license: string; - node: string; - }[]; - versionsArray: string[]; - api: boolean; - package: string; + slogan: string; + forks: number; + stars: number; + updated: string; + link: string; + versions: { + name: string; + branch: string; + license: string; + node: string; + }[]; + versionsArray: string[]; + api: boolean; + package: string; } export interface ModuleMetadata { - slogan: string; - link: string; - stars: number; - forks: number; - updated: string; - versionsArray: string[]; - versions: { - name: string; - branch: string; - license: string; - node: string; - }[]; - package: string; + slogan: string; + link: string; + stars: number; + forks: number; + updated: string; + versionsArray: string[]; + versions: { + name: string; + branch: string; + license: string; + node: string; + }[]; + package: string; } export interface ModuleSpec { - package: string; - compatibility: Record; + package: string; + compatibility: Record; } diff --git a/components/ApiOutline.vue b/components/ApiOutline.vue index 553cd29..ff2aeb1 100644 --- a/components/ApiOutline.vue +++ b/components/ApiOutline.vue @@ -5,74 +5,74 @@ import { onMounted, ref } from 'vue'; const outline = ref(null); const onActiveChange = (mutations) => { - for (const { target, type, attributeName } of mutations) { - if ( - type === 'attributes' && - attributeName === 'class' && - target.classList.contains('active') && - target.classList.contains('outline-link') - ) { - target.scrollIntoView({ behavior: 'smooth', block: 'center' }); + for (const { target, type, attributeName } of mutations) { + if ( + type === 'attributes' && + attributeName === 'class' && + target.classList.contains('active') && + target.classList.contains('outline-link') + ) { + target.scrollIntoView({ behavior: 'smooth', block: 'center' }); + } } - } }; onMounted(() => { - outline.value = document.querySelector('.VPDocAsideOutline'); + outline.value = document.querySelector('.VPDocAsideOutline'); }); useMutationObserver(outline, onActiveChange, { - attributeFilter: ['class'], - subtree: true, + attributeFilter: ['class'], + subtree: true, }); diff --git a/components/CarbonAds.vue b/components/CarbonAds.vue index 6d9d5ed..1e5f8ef 100644 --- a/components/CarbonAds.vue +++ b/components/CarbonAds.vue @@ -5,104 +5,104 @@ import { onMounted, watch } from 'vue'; const route = useRoute(); const load = () => { - const script = document.createElement('script'); - script.id = '_carbonads_js'; - script.src = `//cdn.carbonads.com/carbon.js?serve=CEAIL27W&placement=joidev`; - script.async = true; + const script = document.createElement('script'); + script.id = '_carbonads_js'; + script.src = `//cdn.carbonads.com/carbon.js?serve=CEAIL27W&placement=joidev`; + script.async = true; - const container = document.querySelector('#carbon-ad'); - if (container) { - container.innerHTML = ''; - container.append(script); - } + const container = document.querySelector('#carbon-ad'); + if (container) { + container.innerHTML = ''; + container.append(script); + } }; onMounted(() => { - load(); + load(); }); watch( - () => route.path, - () => { - // Wait for the next tick to ensure the container is still present - setTimeout(() => { - if ( - '_carbonads' in window && - window._carbonads && - typeof window._carbonads === 'object' && - 'refresh' in window._carbonads && - typeof window._carbonads.refresh === 'function' - ) { - window._carbonads.refresh(); - } else { - load(); - } - }, 0); - }, + () => route.path, + () => { + // Wait for the next tick to ensure the container is still present + setTimeout(() => { + if ( + '_carbonads' in window && + window._carbonads && + typeof window._carbonads === 'object' && + 'refresh' in window._carbonads && + typeof window._carbonads.refresh === 'function' + ) { + window._carbonads.refresh(); + } else { + load(); + } + }, 0); + }, ); diff --git a/components/CodeMirrorEditor.vue b/components/CodeMirrorEditor.vue index eff03b9..76f2f5c 100644 --- a/components/CodeMirrorEditor.vue +++ b/components/CodeMirrorEditor.vue @@ -1,5 +1,5 @@ diff --git a/components/ModuleIndex.vue b/components/ModuleIndex.vue index 1306d27..5dbb1fd 100644 --- a/components/ModuleIndex.vue +++ b/components/ModuleIndex.vue @@ -1,145 +1,146 @@ diff --git a/components/StatusContent.vue b/components/StatusContent.vue index 02df47a..7408e50 100644 --- a/components/StatusContent.vue +++ b/components/StatusContent.vue @@ -1,166 +1,169 @@ diff --git a/components/TesterContent.vue b/components/TesterContent.vue index e73201d..aa4bb91 100644 --- a/components/TesterContent.vue +++ b/components/TesterContent.vue @@ -1,77 +1,77 @@ diff --git a/composables/annotate.ts b/composables/annotate.ts index 67167be..39b64bc 100644 --- a/composables/annotate.ts +++ b/composables/annotate.ts @@ -1,178 +1,179 @@ const ANNOTATIONS = '@@annotations'; export const annotate = (err: any) => { - if (!err._original || typeof err._original !== 'object') { - const message = err.details && err.details.length > 0 ? err.details[0].message : err.message || err.toString(); - return { - annotated: message, - errorLines: [1], - }; - } + if (!err._original || typeof err._original !== 'object') { + const message = err.details && err.details.length > 0 ? err.details[0].message : err.message || err.toString(); + return { + annotated: message, + errorLines: [1], + }; + } - let obj; - try { - // oxlint-disable-next-line unicorn/prefer-structured-clone - obj = JSON.parse(JSON.stringify(err._original)); - } catch { - return { - annotated: err.message, - errorLines: [1], - }; - } - - for (let i = err.details.length - 1; i >= 0; --i) { - // Reverse order to process deepest child first - const pos = i + 1; - const error = err.details[i]; - const { path } = error; - let node = obj; - if (path.length === 0) { - const refAnnotations = node[ANNOTATIONS] || { - errors: {}, - missing: {}, - }; - node[ANNOTATIONS] = refAnnotations; - refAnnotations.errors[''] = refAnnotations.errors[''] || []; - refAnnotations.errors[''].push(pos); - } else { - for (let j = 0; ; ++j) { - const seg = path[j]; - if (j + 1 < path.length && node[seg] !== undefined && typeof node[seg] !== 'string') { - node = node[seg]; + let obj; + try { + // oxlint-disable-next-line unicorn/prefer-structured-clone + obj = JSON.parse(JSON.stringify(err._original)); + } catch { + return { + annotated: err.message, + errorLines: [1], + }; + } + + for (let i = err.details.length - 1; i >= 0; --i) { + // Reverse order to process deepest child first + const pos = i + 1; + const error = err.details[i]; + const { path } = error; + let node = obj; + if (path.length === 0) { + const refAnnotations = node[ANNOTATIONS] || { + errors: {}, + missing: {}, + }; + node[ANNOTATIONS] = refAnnotations; + refAnnotations.errors[''] = refAnnotations.errors[''] || []; + refAnnotations.errors[''].push(pos); } else { - const refAnnotations = node[ANNOTATIONS] || { - errors: {}, - missing: {}, - }; - node[ANNOTATIONS] = refAnnotations; - - const cacheKey = seg === undefined ? error.context.key : seg; - - if (node[seg] === undefined) { - refAnnotations.missing[cacheKey] = pos; - } else { - refAnnotations.errors[cacheKey] = refAnnotations.errors[cacheKey] || []; - refAnnotations.errors[cacheKey].push(pos); - } - - break; + for (let j = 0; ; ++j) { + const seg = path[j]; + if (j + 1 < path.length && node[seg] !== undefined && typeof node[seg] !== 'string') { + node = node[seg]; + } else { + const refAnnotations = node[ANNOTATIONS] || { + errors: {}, + missing: {}, + }; + node[ANNOTATIONS] = refAnnotations; + + const cacheKey = seg === undefined ? error.context.key : seg; + + if (node[seg] === undefined) { + refAnnotations.missing[cacheKey] = pos; + } else { + refAnnotations.errors[cacheKey] = refAnnotations.errors[cacheKey] || []; + refAnnotations.errors[cacheKey].push(pos); + } + + break; + } + } } - } - } - } - - const replacers = { - arrayIndex: /\s*"_\$idx\$_([, \d]+)_\$end\$_",?\n(.*)/g, - key: /_\$key\$_([, \d]+)_\$end\$_"/g, - missing: /"_\$miss\$_([^|]+)\|(\d+)_\$end\$_": "__missing__"/g, - specials: /"\[(NaN|Symbol.*|-?Infinity|function.*|\(.*)]"/g, - }; - - const getMessageFromMatch = (match: string) => { - const positions = match.split(',').map((p) => p.trim()); - return positions - .map((p) => { - const index = Number(p) - 1; - return err.details[index] ? err.details[index].message : 'Unknown error'; - }) - .join('; '); - }; - - const annotated = JSON.stringify(obj, createSerializer(err), 2) - .replace(replacers.key, ($0, $1) => `" /* ${getMessageFromMatch($1)} */`) - .replace(replacers.missing, ($0, $1, $2) => `"${$1}": undefined /* ${getMessageFromMatch($2)} */`) - .replace(replacers.arrayIndex, ($0, $1, $2) => `\n${$2} /* ${getMessageFromMatch($1)} */`) - .replace(replacers.specials, ($0, $1) => $1); - - const lines = annotated.split('\n'); - const errorLines = []; - for (let i = 0; i < lines.length; ++i) { - if (lines[i].includes('/*')) { - errorLines.push(i + 1); } - } - return { - annotated, - errorLines, - }; -}; + const replacers = { + arrayIndex: /\s*"_\$idx\$_([, \d]+)_\$end\$_",?\n(.*)/g, + key: /_\$key\$_([, \d]+)_\$end\$_"/g, + missing: /"_\$miss\$_([^|]+)\|(\d+)_\$end\$_": "__missing__"/g, + specials: /"\[(NaN|Symbol.*|-?Infinity|function.*|\(.*)]"/g, + }; -const createSerializer = (_err: any) => { - const keys: string[] = []; - const stack: any[] = []; + const getMessageFromMatch = (match: string) => { + const positions = match.split(',').map((p) => p.trim()); + return positions + .map((p) => { + const index = Number(p) - 1; + return err.details[index] ? err.details[index].message : 'Unknown error'; + }) + .join('; '); + }; - const cycleReplacer = (key: string, value: any) => { - if (stack[0] === value) { - return '[Circular ~]'; + const annotated = JSON.stringify(obj, createSerializer(err), 2) + .replace(replacers.key, ($0, $1) => `" /* ${getMessageFromMatch($1)} */`) + .replace(replacers.missing, ($0, $1, $2) => `"${$1}": undefined /* ${getMessageFromMatch($2)} */`) + .replace(replacers.arrayIndex, ($0, $1, $2) => `\n${$2} /* ${getMessageFromMatch($1)} */`) + .replace(replacers.specials, ($0, $1) => $1); + + const lines = annotated.split('\n'); + const errorLines = []; + for (let i = 0; i < lines.length; ++i) { + if (lines[i].includes('/*')) { + errorLines.push(i + 1); + } } - return `[Circular ~. ${keys.slice(0, stack.indexOf(value)).join('.')}]`; - }; + return { + annotated, + errorLines, + }; +}; + +const createSerializer = (_err: any) => { + const keys: string[] = []; + const stack: any[] = []; - return function serializer(this: any, key: string, value: any) { - if (key === ANNOTATIONS) { - return; - } + const cycleReplacer = (key: string, value: any) => { + if (stack[0] === value) { + return '[Circular ~]'; + } - if (stack.length > 0) { - const thisPos = stack.indexOf(this); - if (~thisPos) { - stack.length = thisPos + 1; - keys.length = thisPos + 1; - keys[thisPos] = key; - } else { - stack.push(this); - keys.push(key); - } - - if (stack.includes(value)) { - value = cycleReplacer.call(this, key, value); - } - } else { - stack.push(value); - } + return `[Circular ~. ${keys.slice(0, stack.indexOf(value)).join('.')}]`; + }; - if (value) { - const annotations = value[ANNOTATIONS]; - if (annotations) { - if (Array.isArray(value)) { - const annotated = []; + return function serializer(this: any, key: string, value: any) { + if (key === ANNOTATIONS) { + return; + } - for (let i = 0; i < value.length; ++i) { - if (annotations.errors[i]) { - annotated.push(`_$idx$_${annotations.errors[i].toSorted().join(', ')}_$end$_`); + if (stack.length > 0) { + const thisPos = stack.indexOf(this); + if (~thisPos) { + stack.length = thisPos + 1; + keys.length = thisPos + 1; + keys[thisPos] = key; + } else { + stack.push(this); + keys.push(key); } - annotated.push(value[i]); - } - - value = annotated; + if (stack.includes(value)) { + value = cycleReplacer.call(this, key, value); + } } else { - for (const [errorKey, error] of Object.entries(annotations.errors)) { - value[`${errorKey}_$key$_${(error as unknown[]).toSorted().join(', ')}_$end$_`] = value[errorKey]; - value[errorKey] = undefined; - } - - for (const [missingKey, missing] of Object.entries(annotations.missing)) { - value[`_$miss$_${missingKey}|${missing}_$end$_`] = '__missing__'; - } + stack.push(value); } - return value; - } - } + if (value) { + const annotations = value[ANNOTATIONS]; + if (annotations) { + if (Array.isArray(value)) { + const annotated = []; + + for (let i = 0; i < value.length; ++i) { + if (annotations.errors[i]) { + annotated.push(`_$idx$_${annotations.errors[i].toSorted().join(', ')}_$end$_`); + } + + annotated.push(value[i]); + } + + value = annotated; + } else { + for (const [errorKey, error] of Object.entries(annotations.errors)) { + value[`${errorKey}_$key$_${(error as unknown[]).toSorted().join(', ')}_$end$_`] = + value[errorKey]; + value[errorKey] = undefined; + } + + for (const [missingKey, missing] of Object.entries(annotations.missing)) { + value[`_$miss$_${missingKey}|${missing}_$end$_`] = '__missing__'; + } + } + + return value; + } + } - if ( - value === Infinity || - value === -Infinity || - Number.isNaN(value) || - typeof value === 'function' || - typeof value === 'symbol' - ) { - return `[${value.toString()}]`; - } + if ( + value === Infinity || + value === -Infinity || + Number.isNaN(value) || + typeof value === 'function' || + typeof value === 'symbol' + ) { + return `[${value.toString()}]`; + } - return value; - }; + return value; + }; }; diff --git a/composables/joiCompletionSource.ts b/composables/joiCompletionSource.ts index 06420d9..4ac10ea 100644 --- a/composables/joiCompletionSource.ts +++ b/composables/joiCompletionSource.ts @@ -7,119 +7,120 @@ let env: VirtualTypeScriptEnvironment | null = null; let currentVersion: string | null = null; const getEnv = async (version: string) => { - if (env && currentVersion === version) { - return env; - } + if (env && currentVersion === version) { + return env; + } - const ts = await import('typescript'); + const ts = await import('typescript'); - const compilerOptions = { - lib: ['es2024'], - module: ts.ModuleKind.ESNext, - target: ts.ScriptTarget.ESNext, - }; + const compilerOptions = { + lib: ['es2024'], + module: ts.ModuleKind.ESNext, + target: ts.ScriptTarget.ESNext, + }; - const fsMap = await createDefaultMapFromCDN(compilerOptions, ts.version, true, ts); + const fsMap = await createDefaultMapFromCDN(compilerOptions, ts.version, true, ts); - const { default: joiDts } = version.startsWith('17.') - ? await import('joi-17/lib/index.d.ts?raw') - : await import('joi-18/lib/index.d.ts?raw'); + const { default: joiDts } = version.startsWith('17.') + ? await import('joi-17/lib/index.d.ts?raw') + : await import('joi-18/lib/index.d.ts?raw'); - fsMap.set('/node_modules/joi/index.d.ts', joiDts); - fsMap.set('/node_modules/joi/package.json', JSON.stringify({ name: 'joi', types: 'index.d.ts' })); + fsMap.set('/node_modules/joi/index.d.ts', joiDts); + fsMap.set('/node_modules/joi/package.json', JSON.stringify({ name: 'joi', types: 'index.d.ts' })); - if (version.startsWith('18.')) { - const { default: standardSchemaTypes } = await import('../node_modules/@standard-schema/spec/dist/index.d.ts?raw'); - fsMap.set('/node_modules/@standard-schema/spec/index.d.ts', standardSchemaTypes); - fsMap.set( - '/node_modules/@standard-schema/spec/package.json', - JSON.stringify({ name: '@standard-schema/spec', types: 'index.d.ts' }), - ); - } + if (version.startsWith('18.')) { + const { default: standardSchemaTypes } = + await import('../node_modules/@standard-schema/spec/dist/index.d.ts?raw'); + fsMap.set('/node_modules/@standard-schema/spec/index.d.ts', standardSchemaTypes); + fsMap.set( + '/node_modules/@standard-schema/spec/package.json', + JSON.stringify({ name: '@standard-schema/spec', types: 'index.d.ts' }), + ); + } - const system = createSystem(fsMap); - env = createVirtualTypeScriptEnvironment(system, [], ts, compilerOptions); - currentVersion = version; + const system = createSystem(fsMap); + env = createVirtualTypeScriptEnvironment(system, [], ts, compilerOptions); + currentVersion = version; - return env; + return env; }; const filterJoiOperations = (name: string) => - name.startsWith('$') || - name.startsWith('_') || - name.startsWith('validate') || - name === 'cache' || - name === 'ValidationError'; + name.startsWith('$') || + name.startsWith('_') || + name.startsWith('validate') || + name === 'cache' || + name === 'ValidationError'; export const joiCompletionSource = async (context: CompletionContext, version: string) => { - try { - const tsEnv = await getEnv(version); - const code = context.state.doc.toString(); - - const prefix = "import Joi from 'joi';\n"; - const wrappedCode = prefix + code; - const pos = context.pos + prefix.length; - - const fileName = 'index.ts'; - if (tsEnv.getSourceFile(fileName)) { - tsEnv.updateFile(fileName, wrappedCode); - } else { - tsEnv.createFile(fileName, wrappedCode); + try { + const tsEnv = await getEnv(version); + const code = context.state.doc.toString(); + + const prefix = "import Joi from 'joi';\n"; + const wrappedCode = prefix + code; + const pos = context.pos + prefix.length; + + const fileName = 'index.ts'; + if (tsEnv.getSourceFile(fileName)) { + tsEnv.updateFile(fileName, wrappedCode); + } else { + tsEnv.createFile(fileName, wrappedCode); + } + + const completions = tsEnv.languageService.getCompletionsAtPosition(fileName, pos, {}); + if (!completions) { + return null; + } + + const word = context.matchBefore(/\w*/); + if (!word && !context.explicit) { + return null; + } + + return { + from: word ? word.from : context.pos, + options: completions.entries + .filter((entry) => !filterJoiOperations(entry.name)) + .map((entry) => { + let type = 'variable'; + if (entry.kind === 'method') { + type = 'method'; + } else if (entry.kind === 'property') { + type = 'property'; + } + + return { + boost: entry.sortText ? -Number(entry.sortText) : 0, + info: () => { + const details = tsEnv.languageService.getCompletionEntryDetails( + fileName, + pos, + entry.name, + {}, + entry.source, + {}, + entry.data, + ); + if (!details) { + return null; + } + + const doc = `${details.documentation?.map((d) => d.text).join('\n') || ''}`; + + const div = document.createElement('div'); + div.className = 'cm-completionInfo-text'; + div.style.whiteSpace = 'pre-wrap'; + div.textContent = doc; + return div; + }, + label: entry.name, + type, + }; + }), + }; + } catch (error) { + console.error('Joi completion error:', error); + return null; } - - const completions = tsEnv.languageService.getCompletionsAtPosition(fileName, pos, {}); - if (!completions) { - return null; - } - - const word = context.matchBefore(/\w*/); - if (!word && !context.explicit) { - return null; - } - - return { - from: word ? word.from : context.pos, - options: completions.entries - .filter((entry) => !filterJoiOperations(entry.name)) - .map((entry) => { - let type = 'variable'; - if (entry.kind === 'method') { - type = 'method'; - } else if (entry.kind === 'property') { - type = 'property'; - } - - return { - boost: entry.sortText ? -Number(entry.sortText) : 0, - info: () => { - const details = tsEnv.languageService.getCompletionEntryDetails( - fileName, - pos, - entry.name, - {}, - entry.source, - {}, - entry.data, - ); - if (!details) { - return null; - } - - const doc = `${details.documentation?.map((d) => d.text).join('\n') || ''}`; - - const div = document.createElement('div'); - div.className = 'cm-completionInfo-text'; - div.style.whiteSpace = 'pre-wrap'; - div.textContent = doc; - return div; - }, - label: entry.name, - type, - }; - }), - }; - } catch (error) { - console.error('Joi completion error:', error); - return null; - } }; diff --git a/docs/api/[version].paths.ts b/docs/api/[version].paths.ts index c6a9621..88d2601 100644 --- a/docs/api/[version].paths.ts +++ b/docs/api/[version].paths.ts @@ -1,27 +1,27 @@ -import fs from 'node:fs'; -import path from 'node:path'; +import Fs from 'node:fs'; +import Path from 'node:path'; import { defineRoutes } from 'vitepress'; -import joiInfo from '../../generated/modules/joi/info.json' with { type: 'json' }; +import JoiInfo from '../../generated/modules/joi/info.json' with { type: 'json' }; import type { ModuleInfo } from '../../cli/types.js'; export default defineRoutes({ - paths() { - const info = joiInfo as ModuleInfo; - const majors = info.versionsArray.map((v) => parseInt(v.split('.')[0], 10)); + paths() { + const info = JoiInfo as ModuleInfo; + const majors = info.versionsArray.map((v) => parseInt(v.split('.')[0], 10)); - return majors.map((major) => { - const versionInfo = info.versions.find((v) => parseInt(v.name.split('.')[0], 10) === major); - const fullVersion = versionInfo?.name ?? `${major}.x.x`; - const version = `${major}.x.x`; - let content = fs.readFileSync(path.resolve(`generated/markdown/joi/${major}/api.md`), 'utf8'); - content = content.replaceAll('{{', '{{').replaceAll('}}', '}}'); - return { - content, - params: { fullVersion, major: major.toString(), version }, - }; - }); - }, + return majors.map((major) => { + const versionInfo = info.versions.find((v) => parseInt(v.name.split('.')[0], 10) === major); + const fullVersion = versionInfo?.name ?? `${major}.x.x`; + const version = `${major}.x.x`; + let content = Fs.readFileSync(Path.resolve(`generated/markdown/joi/${major}/api.md`), 'utf8'); + content = content.replaceAll('{{', '{{').replaceAll('}}', '}}'); + return { + content, + params: { fullVersion, major: major.toString(), version }, + }; + }); + }, }); diff --git a/docs/index.md b/docs/index.md index 629058f..bbeac9f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -4,29 +4,29 @@ layout: home title: Home hero: - name: 'joi' - tagline: 'The most powerful schema description language and data validator for JavaScript' - actions: - - theme: brand - text: Get started with joi - link: /api - - theme: alt - text: Try it in the sandbox - link: /tester - image: - src: /img/joiTransparent.png - alt: joi logo + name: 'joi' + tagline: 'The most powerful schema description language and data validator for JavaScript' + actions: + - theme: brand + text: Get started with joi + link: /api + - theme: alt + text: Try it in the sandbox + link: /tester + image: + src: /img/joiTransparent.png + alt: joi logo features: - - title: Expressive - details: | - Over 150 built-in validators across strings, numbers, dates, arrays, objects, binaries, and more — with chainable rules that read like English. - - title: Declarative - details: | - Describe complex relationships between fields without writing callback logic. Cross-field references, conditional schemas, and key dependencies — all as one-liners. - - title: Extensible - details: | - Build your own schema types with Joi's extension system. Add custom rules, coercions, and chainable methods — then share them as plugins. + - title: Expressive + details: | + Over 150 built-in validators across strings, numbers, dates, arrays, objects, binaries, and more — with chainable rules that read like English. + - title: Declarative + details: | + Describe complex relationships between fields without writing callback logic. Cross-field references, conditional schemas, and key dependencies — all as one-liners. + - title: Extensible + details: | + Build your own schema types with Joi's extension system. Add custom rules, coercions, and chainable methods — then share them as plugins. --- ## Get started in seconds @@ -51,15 +51,15 @@ pnpm add joi import Joi from 'joi'; const schema = Joi.object({ - username: Joi.string().alphanum().min(3).max(30).required(), - email: Joi.string().email().required(), - age: Joi.number().integer().min(18), + username: Joi.string().alphanum().min(3).max(30).required(), + email: Joi.string().email().required(), + age: Joi.number().integer().min(18), }); const { error, value } = schema.validate({ - username: 'danilo', - email: 'danilo@example.com', - age: 28, + username: 'danilo', + email: 'danilo@example.com', + age: 28, }); ``` @@ -71,11 +71,11 @@ Define one schema. Produce specialized versions for different contexts — like ```js const schema = Joi.object({ - id: Joi.number().alter({ - create: (s) => s.forbidden(), - update: (s) => s.required(), - }), - name: Joi.string().required(), + id: Joi.number().alter({ + create: (s) => s.forbidden(), + update: (s) => s.required(), + }), + name: Joi.string().required(), }); const createSchema = schema.tailor('create'); @@ -90,13 +90,13 @@ Express relationships between fields without writing validation logic. Joi handl ```js const schema = Joi.object({ - email: Joi.string().email(), - phone: Joi.string().pattern(/^\+?[0-9]{7,15}$/), - address: Joi.string(), + email: Joi.string().email(), + phone: Joi.string().pattern(/^\+?[0-9]{7,15}$/), + address: Joi.string(), }) - .or('email', 'phone') // at least one contact method - .with('phone', 'address') // phone requires address - .xor('email', 'phone'); // but not both + .or('email', 'phone') // at least one contact method + .with('phone', 'address') // phone requires address + .xor('email', 'phone'); // but not both ``` _Seven dependency methods: `.with()`, `.without()`, `.or()`, `.and()`, `.xor()`, `.oxor()`, `.nand()`._ @@ -107,10 +107,10 @@ Reference other fields directly in validation rules. No callbacks, no workaround ```js const schema = Joi.object({ - startDate: Joi.date().required(), - endDate: Joi.date().greater(Joi.ref('startDate')).required(), - password: Joi.string().min(8).required(), - confirm: Joi.any().valid(Joi.ref('password')).required(), + startDate: Joi.date().required(), + endDate: Joi.date().greater(Joi.ref('startDate')).required(), + password: Joi.string().min(8).required(), + confirm: Joi.any().valid(Joi.ref('password')).required(), }); ``` diff --git a/docs/module/[name]/api/[version].paths.ts b/docs/module/[name]/api/[version].paths.ts index c65f6a4..6d4d3da 100644 --- a/docs/module/[name]/api/[version].paths.ts +++ b/docs/module/[name]/api/[version].paths.ts @@ -1,32 +1,32 @@ -import fs from 'node:fs'; -import path from 'node:path'; +import Fs from 'node:fs'; +import Path from 'node:path'; import { defineRoutes } from 'vitepress'; -import modulesData from '../../../../generated/metadata/modules.json' with { type: 'json' }; +import ModulesData from '../../../../generated/metadata/modules.json' with { type: 'json' }; import type { ModuleInfo, ModuleMetadata } from '../../../../cli/types.js'; export default defineRoutes({ - paths() { - const data = modulesData as Record; - return Object.keys(data) - .filter((name) => name !== 'joi') - .flatMap((name: string) => { - const info = data[name] as unknown as ModuleInfo; - const majors = info.versionsArray.map((v: string) => parseInt(v.split('.')[0], 10)); + paths() { + const data = ModulesData as Record; + return Object.keys(data) + .filter((name) => name !== 'joi') + .flatMap((name: string) => { + const info = data[name] as unknown as ModuleInfo; + const majors = info.versionsArray.map((v: string) => parseInt(v.split('.')[0], 10)); - return majors.map((major: number) => { - const versionInfo = info.versions.find((v) => parseInt(v.name.split('.')[0], 10) === major); - const fullVersion = versionInfo?.name ?? `${major}.x.x`; - const version = `${major}.x.x`; - let content = fs.readFileSync(path.resolve(`generated/markdown/${name}/${major}/api.md`), 'utf8'); - content = content.replaceAll('{{', '{{').replaceAll('}}', '}}'); - return { - content, - params: { fullVersion, name, package: info.package, version }, - }; - }); - }); - }, + return majors.map((major: number) => { + const versionInfo = info.versions.find((v) => parseInt(v.name.split('.')[0], 10) === major); + const fullVersion = versionInfo?.name ?? `${major}.x.x`; + const version = `${major}.x.x`; + let content = Fs.readFileSync(Path.resolve(`generated/markdown/${name}/${major}/api.md`), 'utf8'); + content = content.replaceAll('{{', '{{').replaceAll('}}', '}}'); + return { + content, + params: { fullVersion, name, package: info.package, version }, + }; + }); + }); + }, }); diff --git a/docs/module/[name]/changelog.paths.ts b/docs/module/[name]/changelog.paths.ts index e399ba6..1426de8 100644 --- a/docs/module/[name]/changelog.paths.ts +++ b/docs/module/[name]/changelog.paths.ts @@ -1,22 +1,22 @@ -import fs from 'node:fs'; -import path from 'node:path'; +import Fs from 'node:fs'; +import Path from 'node:path'; import { defineRoutes } from 'vitepress'; -import modulesData from '../../../generated/metadata/modules.json' with { type: 'json' }; +import ModulesData from '../../../generated/metadata/modules.json' with { type: 'json' }; import type { ModuleMetadata } from '../../../cli/types.js'; export default defineRoutes({ - paths() { - return Object.keys(modulesData as Record) - .filter((name) => name !== 'joi') - .map((name: string) => { - const content = fs.readFileSync(path.resolve(`generated/markdown/${name}/changelog.md`), 'utf8'); - return { - content, - params: { name }, - }; - }); - }, + paths() { + return Object.keys(ModulesData as Record) + .filter((name) => name !== 'joi') + .map((name: string) => { + const content = Fs.readFileSync(Path.resolve(`generated/markdown/${name}/changelog.md`), 'utf8'); + return { + content, + params: { name }, + }; + }); + }, }); diff --git a/docs/module/[name]/install.paths.ts b/docs/module/[name]/install.paths.ts index 92147d2..3536805 100644 --- a/docs/module/[name]/install.paths.ts +++ b/docs/module/[name]/install.paths.ts @@ -1,42 +1,42 @@ import { defineRoutes } from 'vitepress'; -import modulesData from '../../../generated/metadata/modules.json' with { type: 'json' }; +import ModulesData from '../../../generated/metadata/modules.json' with { type: 'json' }; import type { ModuleMetadata } from '../../../cli/types.js'; const renderInstall = (info: ModuleMetadata) => { - let content = ` + let content = ` ### Compatibility | Major version | License | Node.js | | ------------- | ------- | ------- | `; - const versions = [...info.versions].toReversed(); - for (const v of versions) { - const [major] = v.name.split('.'); - content += `| ${major} | ${v.license} | ${v.node} |\n`; - } + const versions = [...info.versions].toReversed(); + for (const v of versions) { + const [major] = v.name.split('.'); + content += `| ${major} | ${v.license} | ${v.node} |\n`; + } - return content; + return content; }; export default defineRoutes({ - paths() { - const data = modulesData as Record; - return Object.keys(data) - .filter((name) => name !== 'joi') - .map((name: string) => { - const info = data[name]; - const content = renderInstall(info); - const lastVersion = info.versions.at(-1)!; - const [latestMajor] = lastVersion.name.split('.'); - const fullVersion = lastVersion.name; - const version = `${latestMajor}.x.x`; - return { - content, - params: { fullVersion, name, package: info.package, slogan: info.slogan, version }, - }; - }); - }, + paths() { + const data = ModulesData as Record; + return Object.keys(data) + .filter((name) => name !== 'joi') + .map((name: string) => { + const info = data[name]; + const content = renderInstall(info); + const lastVersion = info.versions.at(-1)!; + const [latestMajor] = lastVersion.name.split('.'); + const fullVersion = lastVersion.name; + const version = `${latestMajor}.x.x`; + return { + content, + params: { fullVersion, name, package: info.package, slogan: info.slogan, version }, + }; + }); + }, }); diff --git a/docs/public/atom/joi.atom b/docs/public/atom/joi.atom index c88eb6e..2f48430 100644 --- a/docs/public/atom/joi.atom +++ b/docs/public/atom/joi.atom @@ -71,6 +71,14 @@
  • [#3084] feat: add isAsync() helper
  • [#3082] Added wrapper option to uuid function
  • [#3080] feat: implement standard schema spec
  • [#3078] Implement Standard Schema
  • [#2993] What version of node does this library support?
  • [#2982] feat: Improve array().items type
  • [#2981] feat: Improve alternatives type
  • [#2926] 18.0.0 Release Notes
  • [#2925] chore: upgrade modules
  • ]]>
    + + <![CDATA[joi v17.13.4]]> + https://github.com/hapijs/joi/milestone/216 + + 2026-06-17T07:55:02.000Z + +
  • [#3123] chore: backport #3113 to v17
  • ]]>
    +
    <![CDATA[joi v17.13.3]]> https://github.com/hapijs/joi/milestone/207 @@ -399,12 +407,4 @@
  • [#2263] Update deps
  • [#2262] 17.0.0 Release Notes
  • [#2261] Remove ValidationError.annotate() from browser build
  • [#2260] object.regex()
  • [#2254] Giving an array argument to any.valid returns incorrect error
  • [#2243] Allow `_` in alias, arg, flag, modifier, override, rule, and term names
  • [#2242] Can you allow `_` in rule names?
  • [#2231] Change errors.wrapArrays to errors.wrap.array
  • [#2219] Add the ability to extend all types in place
  • [#2200] Move ip and uri logic to address
  • [#2199] Remove node 8, 10
  • [#2189] Change default function second argument to full helpers (from prefs)
  • [#2182] Remove quotation marks from error messages
  • [#2163] string().hostiname() - validation of non-ASCII chars containing domains
  • ]]>
    - - <![CDATA[joi v16.1.8]]> - https://github.com/hapijs/joi/milestone/163 - - 2019-11-24T10:02:03.000Z - -
  • [#2226] object.with and object.without throw error on $ prefixed keys
  • [#2218] Maximum call stack size exceeded​​ error for dataUri validation
  • [#2212] Joi.string().email() considers "a@a.com/asd" as valid email
  • [#2208] fix: describe() on schema with default value null
  • [#2207] describe() on schema with default value null results in "Cannot read property 'Symbol(literal)' of null"
  • [#2205] Cannot require a minimal number of matching object properties with `pattern`
  • [#2190] Joi.string().domain() treats an email address as a valid domain name
  • [#2187] Giving an array argument to any.allow(...values) gives incorrect error
  • [#2181] Joi.alternatives produces confusing message when used with nested object and `{ abortEarly: false }`
  • [#2176] joi.types() is missing `func` alias
  • [#2173] [Request] Allow mixing patch version
  • ]]>
    -
    \ No newline at end of file diff --git a/docs/public/atom/tlds.atom b/docs/public/atom/tlds.atom index a5cd4d5..9986202 100644 --- a/docs/public/atom/tlds.atom +++ b/docs/public/atom/tlds.atom @@ -2,11 +2,19 @@ https://joi.dev/module/tlds @hapi/tlds changelog - 2026-02-17T14:10:31.000Z + 2026-06-10T10:29:38.000Z https://github.com/jpmonette/feed https://joi.dev/img/logo.png https://joi.dev/favicon.png + + <![CDATA[@hapi/tlds v1.1.7]]> + https://github.com/hapijs/tlds/milestone/15 + + 2026-06-10T10:29:38.000Z + +
  • [#20] Update TLDs
  • ]]>
    +
    <![CDATA[@hapi/tlds v1.1.6]]> https://github.com/hapijs/tlds/milestone/14 diff --git a/docs/resources/index.md b/docs/resources/index.md index 56237f3..5645a5d 100644 --- a/docs/resources/index.md +++ b/docs/resources/index.md @@ -1,12 +1,12 @@ --- layout: false head: - - - meta - - http-equiv: refresh - content: 0; url=/resources/changelog - - - script - - {} - - "window.location.replace('/resources/changelog');" + - - meta + - http-equiv: refresh + content: 0; url=/resources/changelog + - - script + - {} + - "window.location.replace('/resources/changelog');" --- Redirecting to Changelog... diff --git a/docs/tester/[version].paths.ts b/docs/tester/[version].paths.ts index b45a06e..055e2d8 100644 --- a/docs/tester/[version].paths.ts +++ b/docs/tester/[version].paths.ts @@ -1,23 +1,23 @@ import { defineRoutes } from 'vitepress'; -import joiInfo from '../../generated/modules/joi/info.json' with { type: 'json' }; +import JoiInfo from '../../generated/modules/joi/info.json' with { type: 'json' }; import type { ModuleInfo } from '../../cli/types.js'; export default defineRoutes({ - paths() { - const info = joiInfo as ModuleInfo; - const versions = info.versionsArray - .map((v) => parseInt(v.split('.')[0], 10)) - .map((major) => ({ - params: { version: `${major}.x.x` }, - })); + paths() { + const info = JoiInfo as ModuleInfo; + const versions = info.versionsArray + .map((v) => parseInt(v.split('.')[0], 10)) + .map((major) => ({ + params: { version: `${major}.x.x` }, + })); - // Also handle the base /tester path - versions.push({ - params: { version: 'index' }, - }); + // Also handle the base /tester path + versions.push({ + params: { version: 'index' }, + }); - return versions; - }, + return versions; + }, }); diff --git a/env.d.ts b/env.d.ts index cfab8ba..8461884 100644 --- a/env.d.ts +++ b/env.d.ts @@ -1,13 +1,13 @@ declare module '*.vue' { - import type { DefineComponent } from 'vue'; - // oxlint-disable-next-line typescript/ban-types - const component: DefineComponent<{}, {}, any>; - export default component; + import type { DefineComponent } from 'vue'; + // oxlint-disable-next-line typescript/ban-types + const component: DefineComponent<{}, {}, any>; + export default component; } declare module '*?raw' { - const content: string; - export default content; + const content: string; + export default content; } declare module '*.css' {} diff --git a/generated/markdown/address/5/api.md b/generated/markdown/address/5/api.md index c70c780..ed334be 100644 --- a/generated/markdown/address/5/api.md +++ b/generated/markdown/address/5/api.md @@ -6,12 +6,12 @@ Analyzes a string to verify it is a valid domain name where: - `domain` - the domain name string being verified. - `options` - optional settings: - - `allowUnicode` - if `false`, Unicode characters are not allowed in domain names. Defaults to `true`. - - `allowUnderscore` - if `false`, underscore (`_`) characters will not be allowed in the domain name. Defaults to `false`. - - `minDomainSegments` - the minimum number of domain segments (e.g. `x.y.z` has 3 segments) required. Defaults to `2`. - - `tlds` - options to validate the top-level-domain segment (e.g. `com` in `example.com`) where: - - `deny` - a `Set` with strings matching forbidden TLD values (all non-matching values are allowed). - - `allow` - a `Set` with strings matching the only allowed TLD values. + - `allowUnicode` - if `false`, Unicode characters are not allowed in domain names. Defaults to `true`. + - `allowUnderscore` - if `false`, underscore (`_`) characters will not be allowed in the domain name. Defaults to `false`. + - `minDomainSegments` - the minimum number of domain segments (e.g. `x.y.z` has 3 segments) required. Defaults to `2`. + - `tlds` - options to validate the top-level-domain segment (e.g. `com` in `example.com`) where: + - `deny` - a `Set` with strings matching forbidden TLD values (all non-matching values are allowed). + - `allow` - a `Set` with strings matching the only allowed TLD values. If the `domain` is valid, no return value. If the `domain` is invalid, an object is returned with: @@ -30,13 +30,13 @@ Analyzes a string to verify it is a valid email address where: - `email` - the email address string being verified. - `options` - optional settings: - - `allowUnicode` - if `false`, Unicode characters are not allowed in the email address local and domain parts. Defaults to `true`. - - `allowUnderscore` - if `false`, underscore (`_`) characters will not be allowed in the domain name. Defaults to `false`. - - `ignoreLength` - if `true`, the standards email maximum length limit is ignored. Defaults to `true`. - - `minDomainSegments` - the minimum number of domain segments (e.g. `x.y.z` has 3 segments) required in the domain part. Defaults to `2`. - - `tlds` - options to validate the top-level-domain segment (e.g. `com` in `example.com`) where: - - `deny` - a `Set` with strings matching forbidden TLD values (all non-matching values are allowed). - - `allow` - a `Set` with strings matching the only allowed TLD values. + - `allowUnicode` - if `false`, Unicode characters are not allowed in the email address local and domain parts. Defaults to `true`. + - `allowUnderscore` - if `false`, underscore (`_`) characters will not be allowed in the domain name. Defaults to `false`. + - `ignoreLength` - if `true`, the standards email maximum length limit is ignored. Defaults to `true`. + - `minDomainSegments` - the minimum number of domain segments (e.g. `x.y.z` has 3 segments) required in the domain part. Defaults to `2`. + - `tlds` - options to validate the top-level-domain segment (e.g. `com` in `example.com`) where: + - `deny` - a `Set` with strings matching forbidden TLD values (all non-matching values are allowed). + - `allow` - a `Set` with strings matching the only allowed TLD values. If the `email` is valid, no return value. If the `email` is invalid, an object is returned with: diff --git a/generated/markdown/formula/3/api.md b/generated/markdown/formula/3/api.md index 3964689..b47f30f 100644 --- a/generated/markdown/formula/3/api.md +++ b/generated/markdown/formula/3/api.md @@ -4,21 +4,21 @@ const Formula = require('@hapi/formula'); const functions = { - x: (value) => value + 10, + x: (value) => value + 10, }; const constants = { - Z: 100, + Z: 100, }; const reference = function (name) { - return (context) => context[name]; + return (context) => context[name]; }; const formula = new Formula.Parser('1 + a.b.c.2.4.x + [b] + x([y + 4] + Z)', { - functions, - constants, - reference, + functions, + constants, + reference, }); formula.evaluate({ 'a.b.c.2.4.x': 2, b: 3, 'y + 4': 5 }); // 1 + 2 + 3 + 5 + 10 + 100 @@ -33,10 +33,10 @@ Creates a new formula parser object where: - `formula` - the formula string to parse. - `options` - optional settings: - - `constants` - a hash of key-value pairs used to convert constants to values. - - `tokenRx` - a regular expression used to validate token variables. - - `reference` - a variable resolver factory function with signature `function(variable)` which returns a function with signature `function(context)` returning the resolved `variable`. - - `functions` - a hash of key-value pairs used to resolve formula functions. + - `constants` - a hash of key-value pairs used to convert constants to values. + - `tokenRx` - a regular expression used to validate token variables. + - `reference` - a variable resolver factory function with signature `function(variable)` which returns a function with signature `function(context)` returning the resolved `variable`. + - `functions` - a hash of key-value pairs used to resolve formula functions. ### `parser.evaluate([context])` diff --git a/generated/markdown/joi/17/api.md b/generated/markdown/joi/17/api.md index c731540..e284a83 100644 --- a/generated/markdown/joi/17/api.md +++ b/generated/markdown/joi/17/api.md @@ -8,24 +8,24 @@ const Joi = require('joi'); const schema = Joi.object({ - username: Joi.string().alphanum().min(3).max(30).required(), + username: Joi.string().alphanum().min(3).max(30).required(), - password: Joi.string().pattern(new RegExp('^[a-zA-Z0-9]{3,30}$')), + password: Joi.string().pattern(new RegExp('^[a-zA-Z0-9]{3,30}$')), - repeat_password: Joi.ref('password'), + repeat_password: Joi.ref('password'), - access_token: [Joi.string(), Joi.number()], + access_token: [Joi.string(), Joi.number()], - birth_year: Joi.number().integer().min(1900).max(2013), + birth_year: Joi.number().integer().min(1900).max(2013), - email: Joi.string().email({ - minDomainSegments: 2, - tlds: { allow: ['com', 'net'] }, - }), + email: Joi.string().email({ + minDomainSegments: 2, + tlds: { allow: ['com', 'net'] }, + }), }) - .with('username', 'birth_year') - .xor('password', 'access_token') - .with('password', 'repeat_password'); + .with('username', 'birth_year') + .xor('password', 'access_token') + .with('password', 'repeat_password'); schema.validate({ username: 'abc', birth_year: 1994 }); // -> { value: { username: 'abc', birth_year: 1994 } } @@ -36,33 +36,33 @@ schema.validate({}); // Also - try { - const value = await schema.validateAsync({ - username: 'abc', - birth_year: 1994, - }); + const value = await schema.validateAsync({ + username: 'abc', + birth_year: 1994, + }); } catch (err) {} ``` The above schema defines the following constraints: - `username` - - a required string - - must contain only alphanumeric characters - - at least 3 characters long but no more than 30 - - must be accompanied by `birth_year` + - a required string + - must contain only alphanumeric characters + - at least 3 characters long but no more than 30 + - must be accompanied by `birth_year` - `password` - - an optional string - - must satisfy the custom regex pattern - - cannot appear together with `access_token` - - must be accompanied by `repeat_password` and equal to it + - an optional string + - must satisfy the custom regex pattern + - cannot appear together with `access_token` + - must be accompanied by `repeat_password` and equal to it - `access_token` - - an optional, unconstrained string or number + - an optional, unconstrained string or number - `birth_year` - - an integer between 1900 and 2013 + - an integer between 1900 and 2013 - `email` - - a valid email address string - - must have two domain parts e.g. `example.com` - - TLD must be `.com` or `.net` + - a valid email address string + - must have two domain parts e.g. `example.com` + - TLD must be `.com` or `.net` ### General Usage @@ -72,7 +72,7 @@ First, a schema is constructed using the provided types and constraints: ```js const schema = Joi.object({ - a: Joi.string(), + a: Joi.string(), }); ``` @@ -100,7 +100,7 @@ the module converts it internally to an object() type equivalent to: ```js const schema = Joi.object().keys({ - a: Joi.string(), + a: Joi.string(), }); ``` @@ -108,17 +108,17 @@ When validating a schema: - Values (or keys in case of objects) are optional by default. - ```js - Joi.string().validate(undefined); // validates fine - ``` + ```js + Joi.string().validate(undefined); // validates fine + ``` - To disallow this behavior, you can either set the schema as `required()`, or set `presence` to `"required"` when passing `options`: + To disallow this behavior, you can either set the schema as `required()`, or set `presence` to `"required"` when passing `options`: - ```js - Joi.string().required().validate(undefined); - // or - Joi.string().validate(undefined, /* options */ { presence: 'required' }); - ``` + ```js + Joi.string().required().validate(undefined); + // or + Joi.string().validate(undefined, /* options */ { presence: 'required' }); + ``` - Strings are utf-8 encoded by default. - Rules are defined in an additive fashion and evaluated in order, first the inclusive rules, then the exclusive rules. @@ -156,8 +156,8 @@ Provisions a simple LRU cache for caching simple inputs (`undefined`, `null`, st booleans) where: - `options` - optional settings: - - `max` - number of items to store in the cache before the least used items are dropped. - Defaults to `1000`. + - `max` - number of items to store in the cache before the least used items are dropped. + Defaults to `1000`. ### `checkPreferences(prefs)` @@ -179,10 +179,10 @@ Converts literal schema definition to **joi** schema object (or returns the same - `schema` - the schema definition to compile. - `options` - optional settings: - - `legacy` - if `true` and the provided schema is (or contains parts) using an older version of - **joi**, will return a compiled schema that is compatible with the older version. If `false`, - the schema is always compiled using the current version and if older schema components are - found, an error is thrown. + - `legacy` - if `true` and the provided schema is (or contains parts) using an older version of + **joi**, will return a compiled schema that is compatible with the older version. If `false`, + the schema is always compiled using the current version and if older schema components are + found, an error is thrown. ```js const definition = ['key', 5, { a: true, b: [/^a/, 'boom'] }]; @@ -191,15 +191,15 @@ const schema = Joi.compile(definition); // Same as: const schema = Joi.alternatives().try( - Joi.string().valid('key'), - Joi.number().valid(5), - Joi.object({ - a: Joi.boolean().valid(true), - b: Joi.alternatives().try( - Joi.string().pattern(/^a/), - Joi.string().valid('boom'), - ), - }), + Joi.string().valid('key'), + Joi.number().valid(5), + Joi.object({ + a: Joi.boolean().valid(true), + b: Joi.alternatives().try( + Joi.string().pattern(/^a/), + Joi.string().valid('boom'), + ), + }), ); ``` @@ -212,14 +212,14 @@ where: ```js const custom = Joi.defaults((schema) => { - switch (schema.type) { - case 'string': - return schema.allow(''); - case 'object': - return schema.min(1); - default: - return schema; - } + switch (schema.type) { + case 'string': + return schema.allow(''); + case 'object': + return schema.min(1); + default: + return schema; + } }); const schema = custom.object(); // Returns Joi.object().min(1) @@ -232,7 +232,7 @@ Generates a dynamic expression using a template string where: - `template` - the template string using the [template syntax](#template-syntax). - `options` - optional settings used when creating internal references. Supports the same options as [`ref()`](#refkey-options), in addition to those options: - - `functions` - an object with keys being function names and values being their implementation that will be executed when used in the expression. Using the same name as a built-in function will result in a local override. Note: carefully check your arguments depending on the situation where the expression is used. + - `functions` - an object with keys being function names and values being their implementation that will be executed when used in the expression. Using the same name as a built-in function will result in a local override. Note: carefully check your arguments depending on the situation where the expression is used. #### Template syntax @@ -282,8 +282,8 @@ Can only be used in rules that support in-references. ```js const schema = Joi.object({ - a: Joi.array().items(Joi.number()), - b: Joi.number().valid(Joi.in('a')), + a: Joi.array().items(Joi.number()), + b: Joi.number().valid(Joi.in('a')), }); ``` @@ -319,7 +319,7 @@ Checks whether or not the provided argument is a **joi** schema where: - `schema` - the value being checked. - `options` - optional settings: - - `legacy` - if `true`, will identify schemas from older versions of joi, otherwise will throw an error. Defaults to `false`. + - `legacy` - if `true`, will identify schemas from older versions of joi, otherwise will throw an error. Defaults to `false`. ```js const schema = Joi.any(); @@ -354,27 +354,27 @@ References support the following arguments: - `key` - the reference target. References can point to sibling keys (`a.b`) or ancestor keys (`...a.b`) using the `.` separator. If a `key` starts with `$` is signifies a context reference which is looked up in the `context` option object. The `key` can start with one or more separator characters to indicate a [relative starting point](#Relative-references). - `options` - optional settings: - - `adjust` - a function with the signature `function(value)` where `value` is the resolved reference value and the return value is the adjusted value to use. For example `(value) => value + 5` will add 5 to the resolved value. Note that the `adjust` feature will not perform any type validation on the adjusted value and it must match the value expected by the rule it is used in. Cannot be used with `map`. - - `map` - an array of array pairs using the format `[[key, value], [key, value]]` used to maps the resolved reference value to another value. If the resolved value is not in the map, it is returned as-is. Cannot be used with `adjust`. - - `prefix` - overrides default prefix characters key string prefix. Can be set to `false` to disable all prefix parsing (treat keys as literal strings), or an object with specific overrides for: - - `global` - references to the globally provided `context` preference. Defaults to `'$'`. - - `local` - references to error-specific or rule specific context. Defaults to `'#'`. - - `root` - references to the root value being validated. Defaults to `'/'`. - - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the `key` as a literal value. - - `ancestor` - if set to a number, sets the reference [relative starting point](#Relative-references). Cannot be combined with separator prefix characters. Defaults to the reference key prefix (or `1` if none present). - - `in` - creates an [in-reference](#inref-options). - - `iterables` - when `true`, the reference resolves by reaching into maps and sets. - - `render` - when `true`, the value of the reference is used instead of its name in error messages and template rendering. Defaults to `false`. + - `adjust` - a function with the signature `function(value)` where `value` is the resolved reference value and the return value is the adjusted value to use. For example `(value) => value + 5` will add 5 to the resolved value. Note that the `adjust` feature will not perform any type validation on the adjusted value and it must match the value expected by the rule it is used in. Cannot be used with `map`. + - `map` - an array of array pairs using the format `[[key, value], [key, value]]` used to maps the resolved reference value to another value. If the resolved value is not in the map, it is returned as-is. Cannot be used with `adjust`. + - `prefix` - overrides default prefix characters key string prefix. Can be set to `false` to disable all prefix parsing (treat keys as literal strings), or an object with specific overrides for: + - `global` - references to the globally provided `context` preference. Defaults to `'$'`. + - `local` - references to error-specific or rule specific context. Defaults to `'#'`. + - `root` - references to the root value being validated. Defaults to `'/'`. + - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the `key` as a literal value. + - `ancestor` - if set to a number, sets the reference [relative starting point](#Relative-references). Cannot be combined with separator prefix characters. Defaults to the reference key prefix (or `1` if none present). + - `in` - creates an [in-reference](#inref-options). + - `iterables` - when `true`, the reference resolves by reaching into maps and sets. + - `render` - when `true`, the value of the reference is used instead of its name in error messages and template rendering. Defaults to `false`. Note that references can only be used where explicitly supported such as in `valid()` or `invalid()` rules. If upwards (parents) references are needed, use [`object.assert()`](#objectassertref-schema-message). ```js const schema = Joi.object({ - a: Joi.ref('b.c'), - b: { - c: Joi.any(), - }, - c: Joi.ref('$x'), + a: Joi.ref('b.c'), + b: { + c: Joi.any(), + }, + c: Joi.ref('$x'), }); await schema.validateAsync({ a: 5, b: { c: 5 } }, { context: { x: 5 } }); @@ -481,7 +481,7 @@ const Joi = require('joi'); const { object, string } = Joi.types(); const schema = object.keys({ - property: string.min(4), + property: string.min(4), }); ``` @@ -515,8 +515,8 @@ To create an exclusive list of values, see [`any.valid(value)`](#anyvalidvalues- ```js const schema = { - a: Joi.any().allow('a'), - b: Joi.any().allow('b', 'B'), + a: Joi.any().allow('a'), + b: Joi.any().allow('b', 'B'), }; ``` @@ -530,10 +530,10 @@ is called where: ```js const schema = Joi.object({ - key: Joi.string().alter({ - get: (schema) => schema.required(), - post: (schema) => schema.forbidden(), - }), + key: Joi.string().alter({ + get: (schema) => schema.required(), + post: (schema) => schema.forbidden(), + }), }); const getSchema = schema.tailor('get'); @@ -548,10 +548,10 @@ Assigns the schema an artifact id which is included in the validation result if ```js const schema = { - a: [ - Joi.number().max(10).artifact('under'), - Joi.number().min(11).artifact('over'), - ], + a: [ + Joi.number().max(10).artifact('under'), + Joi.number().min(11).artifact('over'), + ], }; ``` @@ -599,10 +599,10 @@ Note that `key` and `value` can be anything including objects, array, etc. It is Casts the validated value to the specified type where: - `to` - the value target type. Each **joi** schema type supports its own set of cast targets: - - `'map'` - supported by the `Joi.object()` type, converts the result to a `Map` object containing the object key-value pairs. - - `'number'` - supported by `Joi.boolean()` and `Joi.date()`, converts the result to a number. For dates, number of milliseconds since the epoch and for booleans, `0` for `false` and `1` for `true`. - - `'set'` - supported by the `Joi.array()` type, converts the result to a `Set` object containing the array values. - - `'string'` - supported by `Joi.binary()`, `Joi.boolean()`, `Joi.date()`, and `Joi.number()`, converts the result to a string. + - `'map'` - supported by the `Joi.object()` type, converts the result to a `Map` object containing the object key-value pairs. + - `'number'` - supported by `Joi.boolean()` and `Joi.date()`, converts the result to a number. For dates, number of milliseconds since the epoch and for booleans, `0` for `false` and `1` for `true`. + - `'set'` - supported by the `Joi.array()` type, converts the result to a `Set` object containing the array values. + - `'string'` - supported by `Joi.binary()`, `Joi.boolean()`, `Joi.date()`, and `Joi.number()`, converts the result to a string. #### `any.concat(schema)` @@ -621,42 +621,42 @@ const ab = a.concat(b); Adds a custom validation function to execute arbitrary code where: - `method` - the custom (synchronous only) validation function using signature `function(value, helpers)` where: - - `value` - the value being validated. - - `helpers` - an object with the following helpers: - - `schema` - the current schema. - - `state` - the current validation state. - - `prefs` - the current preferences. - - `original` - the original value passed into validation before any conversions. - - `error(code, [local], [localState])` - a method to generate error codes using a message code, optional local context and optional validation local state. - - `message(messages, [local])` - a method to generate an error with an internal `'custom'` error code and the provided messages object to use as override. Note that this is much slower than using the preferences `messages` option but is much simpler to write when performance is not important. - - `warn(code, [local])` - a method to add a warning using a message code and optional local context. + - `value` - the value being validated. + - `helpers` - an object with the following helpers: + - `schema` - the current schema. + - `state` - the current validation state. + - `prefs` - the current preferences. + - `original` - the original value passed into validation before any conversions. + - `error(code, [local], [localState])` - a method to generate error codes using a message code, optional local context and optional validation local state. + - `message(messages, [local])` - a method to generate an error with an internal `'custom'` error code and the provided messages object to use as override. Note that this is much slower than using the preferences `messages` option but is much simpler to write when performance is not important. + - `warn(code, [local])` - a method to add a warning using a message code and optional local context. Note: if the method fails to return a value, the value will be unset or returned as `undefined`. ```js const method = (value, helpers) => { - // Throw an error (will be replaced with 'any.custom' error) - if (value === '1') { - throw new Error('nope'); - } - - // Replace value with a new value - if (value === '2') { - return '3'; - } - - // Use error to return an existing error code - if (value === '4') { - return helpers.error('any.invalid'); - } - - // Override value with undefined to unset - if (value === '5') { - return undefined; - } - - // Return the value unchanged - return value; + // Throw an error (will be replaced with 'any.custom' error) + if (value === '1') { + throw new Error('nope'); + } + + // Replace value with a new value + if (value === '2') { + return '3'; + } + + // Use error to return an existing error code + if (value === '4') { + return helpers.error('any.invalid'); + } + + // Override value with undefined to unset + if (value === '5') { + return undefined; + } + + // Return the value unchanged + return value; }; const schema = Joi.string().custom(method, 'custom validation'); @@ -669,11 +669,11 @@ Possible validation errors: [`any.custom`](#anycustom) Sets a default value if the original value is `undefined` where: - `value` - the default value. One of: - - a literal value (string, number, object, etc.). - - a [references](#refkey-options). - - a function which returns the default value using the signature `function(parent, helpers)` where: - - `parent` - a clone of the object containing the value being validated. Note that since specifying a `parent` argument performs cloning, do not declare format arguments if you are not using them. - - `helpers` - same as those described in [`any.custom()`](#anycustommethod_description). + - a literal value (string, number, object, etc.). + - a [references](#refkey-options). + - a function which returns the default value using the signature `function(parent, helpers)` where: + - `parent` - a clone of the object containing the value being validated. Note that since specifying a `parent` argument performs cloning, do not declare format arguments if you are not using them. + - `helpers` - same as those described in [`any.custom()`](#anycustommethod_description). When called without any `value` on an object schema type, a default value will be automatically generated based on the default values of the object keys. @@ -681,22 +681,22 @@ Note that if `value` is an object, any changes to the object after `default()` i ```js const generateUsername = (parent, helpers) => { - return parent.firstname.toLowerCase() + '-' + parent.lastname.toLowerCase(); + return parent.firstname.toLowerCase() + '-' + parent.lastname.toLowerCase(); }; generateUsername.description = 'generated username'; const schema = Joi.object({ - username: Joi.string().default(generateUsername), - firstname: Joi.string(), - lastname: Joi.string(), - created: Joi.date().default(Date.now), - status: Joi.string().default('registered'), + username: Joi.string().default(generateUsername), + firstname: Joi.string(), + lastname: Joi.string(), + created: Joi.date().default(Date.now), + status: Joi.string().default('registered'), }); const { value } = schema.validate({ - firstname: 'Jane', - lastname: 'Doe', + firstname: 'Jane', + lastname: 'Doe', }); // value.status === 'registered' @@ -732,7 +732,7 @@ Annotates the key where: ```js const schema = Joi.any().description( - 'this key will match anything you give it', + 'this key will match anything you give it', ); ``` @@ -754,8 +754,8 @@ schema.validate(''); // returns { error: "value" is not allowed to be empty, val Overrides the default **joi** error with a custom error if the rule fails where: - `err` can be: - - an instance of `Error` - the override error. - - a function with the signature `function(errors)`, where `errors` is an array of validation reports and it returns either a single `Error` or an array of validation reports. + - an instance of `Error` - the override error. + - a function with the signature `function(errors)`, where `errors` is an array of validation reports and it returns either a single `Error` or an array of validation reports. Do not use this method if you are simply trying to override the error message - use `any.message()` or `any.messages()` instead. This method is designed to override the **joi** validation error and return the exact override provided. It is useful when you want to return the result of validation directly (e.g. when using with a **hapi** server) and want to return a different HTTP error code than 400. @@ -768,28 +768,28 @@ schema.validate(3); // returns Error('Was REALLY expecting a string') ```js const schema = Joi.object({ - foo: Joi.number() - .min(0) - .error((errors) => new Error('"foo" requires a positive number')), + foo: Joi.number() + .min(0) + .error((errors) => new Error('"foo" requires a positive number')), }); schema.validate({ foo: -2 }); // returns new Error('"foo" requires a positive number') ``` ```js const schema = Joi.object({ - foo: Joi.number() - .min(0) - .error((errors) => { - return new Error( - 'found errors with ' + - errors - .map( - (err) => - `${err.local.key}(${err.local.limit}) with value ${err.local.value}`, - ) - .join(' and '), - ); - }), + foo: Joi.number() + .min(0) + .error((errors) => { + return new Error( + 'found errors with ' + + errors + .map( + (err) => + `${err.local.key}(${err.local.limit}) with value ${err.local.value}`, + ) + .join(' and '), + ); + }), }); schema.validate({ foo: -2 }); // returns new Error('found errors with foo(0) with value -2') ``` @@ -800,7 +800,7 @@ Adds examples to the schema where: - `example` - adds an example. Note that no validation is performed on the value. - `options` - optional settings: - - `override` - if `true`, replaces any existing examples. Defaults to `false`. + - `override` - if `true`, replaces any existing examples. Defaults to `false`. ```js const schema = Joi.string().min(4).example('abcd'); @@ -812,16 +812,16 @@ Adds an external validation rule where: - `method` - an async or sync function with signature `function(value, helpers)` which can either return a replacement value, `undefined` to indicate no change, or throw an error, where: - - `value` - a clone of the object containing the value being validated. - - `helpers` - an object with the following helpers: - - `schema` - the current schema. - - `linked` - if the schema is a link, the schema it links to. - - `state` - the current validation state. - - `prefs` - the current preferences. - - `original` - the original value passed into validation before any conversions. - - `error(code, [local])` - a method to generate error codes using a message code and optional local context. - - `message(messages, [local])` - a method to generate an error with an internal `'external'` error code and the provided messages object to use as override. Note that this is much slower than using the preferences `messages` option but is much simpler to write when performance is not important. - - `warn(code, [local])` - a method to add a warning using a message code and optional local context. + - `value` - a clone of the object containing the value being validated. + - `helpers` - an object with the following helpers: + - `schema` - the current schema. + - `linked` - if the schema is a link, the schema it links to. + - `state` - the current validation state. + - `prefs` - the current preferences. + - `original` - the original value passed into validation before any conversions. + - `error(code, [local])` - a method to generate error codes using a message code and optional local context. + - `message(messages, [local])` - a method to generate an error with an internal `'external'` error code and the provided messages object to use as override. Note that this is much slower than using the preferences `messages` option but is much simpler to write when performance is not important. + - `warn(code, [local])` - a method to add a warning using a message code and optional local context. - `description` - optional string used to document the purpose of the method. Note that external validation rules are only called after the all other validation rules for the @@ -870,7 +870,7 @@ Marks a key as forbidden which will not allow any value except `undefined`. Used ```js const schema = { - a: Joi.any().forbidden(), + a: Joi.any().forbidden(), }; ``` @@ -904,8 +904,8 @@ Disallows values where: ```js const schema = { - a: Joi.any().invalid('a'), - b: Joi.any().invalid('b', 'B'), + a: Joi.any().invalid('a'), + b: Joi.any().invalid('b', 'B'), }; ``` @@ -926,7 +926,7 @@ Overrides the key name in error messages. ```js const schema = { - first_name: Joi.string().label('First Name'), + first_name: Joi.string().label('First Name'), }; ``` @@ -1035,9 +1035,9 @@ Set the result mode where: Applies a set of rule options to the current ruleset or last rule added where: - `options` - the rules to apply where: - - `keep` - if `true`, the rules will not be replaced by the same unique rule later. For example, `Joi.number().min(1).rule({ keep: true }).min(2)` will keep both `min()` rules instead of the later rule overriding the first. Defaults to `false`. - - `message` - a single message string or a messages object where each key is an error code and corresponding message string as value. The object is the same as the `messages` used as an option in [`any.validate()`](#anyvalidatevalue-options). The strings can be plain messages or a message template. - - `warn` - if `true`, turns any error generated by the ruleset to warnings. + - `keep` - if `true`, the rules will not be replaced by the same unique rule later. For example, `Joi.number().min(1).rule({ keep: true }).min(2)` will keep both `min()` rules instead of the later rule overriding the first. Defaults to `false`. + - `message` - a single message string or a messages object where each key is an error code and corresponding message string as value. The object is the same as the `messages` used as an option in [`any.validate()`](#anyvalidatevalue-options). The strings can be plain messages or a message template. + - `warn` - if `true`, turns any error generated by the ruleset to warnings. When applying rule options, the last rule (e.g. `min()`) is used unless there is an active ruleset defined (e.g. `$.min().max()`) in which case the options are applied to all the provided rules. Once `rule()` is called, the previous rules can no longer be modified and any active ruleset is terminated. @@ -1050,16 +1050,16 @@ Starts a ruleset in order to apply multiple [rule options](#anyruleoptions). The ```js const schema = Joi.number() - .ruleset.min(1) - .max(10) - .rule({ message: 'Number must be between 1 and 10' }); + .ruleset.min(1) + .max(10) + .rule({ message: 'Number must be between 1 and 10' }); ``` ```js const schema = Joi.number() - .$.min(1) - .max(10) - .rule({ message: 'Number must be between 1 and 10' }); + .$.min(1) + .max(10) + .rule({ message: 'Number must be between 1 and 10' }); ``` #### `any.shared(schema)` @@ -1070,11 +1070,11 @@ Registers a schema to be used by descendants of the current schema in named link ```js const schema = Joi.object({ - a: [Joi.string(), Joi.link('#x')], - b: Joi.link('#type.a'), + a: [Joi.string(), Joi.link('#x')], + b: Joi.link('#type.a'), }) - .shared(Joi.number().id('x')) - .id('type'); + .shared(Joi.number().id('x')) + .id('type'); ``` #### `any.strict(isStrict)` @@ -1097,8 +1097,8 @@ where: ```js const schema = Joi.object({ - username: Joi.string(), - password: Joi.string().strip(), + username: Joi.string(), + password: Joi.string().strip(), }); schema.validate({ username: 'test', password: 'hunter2' }); // result.value = { username: 'test' } @@ -1127,10 +1127,10 @@ Applies any assigned target alterations to a copy of the schema that were applie ```js const schema = Joi.object({ - key: Joi.string().alter({ - get: (schema) => schema.required(), - post: (schema) => schema.forbidden(), - }), + key: Joi.string().alter({ + get: (schema) => schema.required(), + post: (schema) => schema.forbidden(), + }), }); const getSchema = schema.tailor('get'); @@ -1155,8 +1155,8 @@ Adds the provided values into the allowed values list and marks them as the only ```js const schema = { - a: Joi.any().valid('a'), - b: Joi.any().valid('b', 'B'), + a: Joi.any().valid('a'), + b: Joi.any().valid('b', 'B'), }; ``` @@ -1168,43 +1168,43 @@ Validates a value using the current schema and options where: - `value` - the value being validated. - `options` - an optional object with the following optional keys: - - `abortEarly` - when `true`, stops validation on the first error, otherwise returns all the errors found. Defaults to `true`. - - `allowUnknown` - when `true`, allows object to contain unknown keys which are ignored. Defaults to `false`. - - `cache` - when `true`, schema caching is enabled (for schemas with explicit caching rules). Default to `true`. - - `context` - provides an external data set to be used in [references](#refkey-options). Can only be set as an external option to `validate()` and not using `any.prefs()`. - - `convert` - when `true`, attempts to cast values to the required types (e.g. a string to a number). Defaults to `true`. - - `dateFormat` - sets the string format used when converting dates to strings in error messages and casting. Options are: - - `'date'` - date string. - - `'iso'` - date time ISO string. This is the default. - - `'string'` - JS default date time string. - - `'time'` - time string. - - `'utc'` - UTC date time string. - - `debug` - when `true`, valid results and throw errors are decorated with a `debug` property which includes an array of the validation steps used to generate the returned result. Defaults to `false`. - - `errors` - error formatting settings: - - `escapeHtml` - when `true`, error message templates will escape special characters to HTML entities, for security purposes. Defaults to `false`. - - `label` - defines the value used to set the `label` context variable: - - `'path'` - the full path to the value being validated. This is the default value. - - `'key'` - the key of the value being validated. - - `false` - remove any label prefix from error message, including the `""`. - - `language` - the preferred language code for error messages. The value is matched against keys at the root of the `messages` object, and then the error code as a child key of that. Can be a reference to the value, global context, or local context which is the root value passed to the validation function. Note that references to the value are usually not what you want as they move around the value structure relative to where the error happens. Instead, either use the global context, or the absolute value (e.g. `Joi.ref('/variable')`); - - `render` - when `false`, skips rendering error templates. Useful when error messages are generated elsewhere to save processing time. Defaults to `true`. - - `stack` - when `true`, the main error will possess a stack trace, otherwise it will be disabled. Defaults to `false` for performance reasons. Has no effect on platforms other than V8/node.js as it uses the [Stack trace API](https://v8.dev/docs/stack-trace-api). - - `wrap` - overrides the way values are wrapped (e.g. `[]` around arrays, `""` around labels and variables prefixed with `:`). Each key can be set to a string with one (same character before and after the value) or two characters (first character before and second character after), or `false` to disable wrapping: - - `label` - the characters used around `{#label}` references. Defaults to `'"'`. - - `array` - the characters used around array values. Defaults to `'[]'`. - - `string` - the characters used around each array string values. Defaults to `false`. - - `wrapArrays` - if `true`, array values in error messages are wrapped in `[]`. Defaults to `true`. - - `externals` - if `false`, the external rules set with [`any.external()`](#anyexternalmethod-description) are ignored, which is required to ignore any external validations in synchronous mode (or an exception is thrown). Defaults to `true`. - - `messages` - overrides individual error messages. Defaults to no override (`{}`). Use the `'*'` error code as a catch-all for all error codes that do not have a message provided in the override. Messages use the same rules as [templates](#template-syntax). Variables in double braces `{{var}}` are HTML escaped if the option `errors.escapeHtml` is set to `true`. - - `noDefaults` - when `true`, do not apply default values. Defaults to `false`. - - `nonEnumerables` - when `true`, inputs are shallow cloned to include non-enumerable properties. Defaults to `false`. - - `presence` - sets the default presence requirements. Supported modes: `'optional'`, `'required'`, and `'forbidden'`. Defaults to `'optional'`. - - `skipFunctions` - when `true`, ignores unknown keys with a function value. Defaults to `false`. - - `stripUnknown` - remove unknown elements from objects and arrays. Defaults to `false`. - - when an `object` : - - `arrays` - set to `true` to remove unknown items from arrays. - - `objects` - set to `true` to remove unknown keys from objects. - - when `true`, it is equivalent to having `{ arrays: false, objects: true }`. + - `abortEarly` - when `true`, stops validation on the first error, otherwise returns all the errors found. Defaults to `true`. + - `allowUnknown` - when `true`, allows object to contain unknown keys which are ignored. Defaults to `false`. + - `cache` - when `true`, schema caching is enabled (for schemas with explicit caching rules). Default to `true`. + - `context` - provides an external data set to be used in [references](#refkey-options). Can only be set as an external option to `validate()` and not using `any.prefs()`. + - `convert` - when `true`, attempts to cast values to the required types (e.g. a string to a number). Defaults to `true`. + - `dateFormat` - sets the string format used when converting dates to strings in error messages and casting. Options are: + - `'date'` - date string. + - `'iso'` - date time ISO string. This is the default. + - `'string'` - JS default date time string. + - `'time'` - time string. + - `'utc'` - UTC date time string. + - `debug` - when `true`, valid results and throw errors are decorated with a `debug` property which includes an array of the validation steps used to generate the returned result. Defaults to `false`. + - `errors` - error formatting settings: + - `escapeHtml` - when `true`, error message templates will escape special characters to HTML entities, for security purposes. Defaults to `false`. + - `label` - defines the value used to set the `label` context variable: + - `'path'` - the full path to the value being validated. This is the default value. + - `'key'` - the key of the value being validated. + - `false` - remove any label prefix from error message, including the `""`. + - `language` - the preferred language code for error messages. The value is matched against keys at the root of the `messages` object, and then the error code as a child key of that. Can be a reference to the value, global context, or local context which is the root value passed to the validation function. Note that references to the value are usually not what you want as they move around the value structure relative to where the error happens. Instead, either use the global context, or the absolute value (e.g. `Joi.ref('/variable')`); + - `render` - when `false`, skips rendering error templates. Useful when error messages are generated elsewhere to save processing time. Defaults to `true`. + - `stack` - when `true`, the main error will possess a stack trace, otherwise it will be disabled. Defaults to `false` for performance reasons. Has no effect on platforms other than V8/node.js as it uses the [Stack trace API](https://v8.dev/docs/stack-trace-api). + - `wrap` - overrides the way values are wrapped (e.g. `[]` around arrays, `""` around labels and variables prefixed with `:`). Each key can be set to a string with one (same character before and after the value) or two characters (first character before and second character after), or `false` to disable wrapping: + - `label` - the characters used around `{#label}` references. Defaults to `'"'`. + - `array` - the characters used around array values. Defaults to `'[]'`. + - `string` - the characters used around each array string values. Defaults to `false`. + - `wrapArrays` - if `true`, array values in error messages are wrapped in `[]`. Defaults to `true`. + - `externals` - if `false`, the external rules set with [`any.external()`](#anyexternalmethod-description) are ignored, which is required to ignore any external validations in synchronous mode (or an exception is thrown). Defaults to `true`. + - `messages` - overrides individual error messages. Defaults to no override (`{}`). Use the `'*'` error code as a catch-all for all error codes that do not have a message provided in the override. Messages use the same rules as [templates](#template-syntax). Variables in double braces `{{var}}` are HTML escaped if the option `errors.escapeHtml` is set to `true`. + - `noDefaults` - when `true`, do not apply default values. Defaults to `false`. + - `nonEnumerables` - when `true`, inputs are shallow cloned to include non-enumerable properties. Defaults to `false`. + - `presence` - sets the default presence requirements. Supported modes: `'optional'`, `'required'`, and `'forbidden'`. Defaults to `'optional'`. + - `skipFunctions` - when `true`, ignores unknown keys with a function value. Defaults to `false`. + - `stripUnknown` - remove unknown elements from objects and arrays. Defaults to `false`. + - when an `object` : + - `arrays` - set to `true` to remove unknown items from arrays. + - `objects` - set to `true` to remove unknown keys from objects. + - when `true`, it is equivalent to having `{ arrays: false, objects: true }`. Returns an object with the following keys: @@ -1215,11 +1215,11 @@ Returns an object with the following keys: ```js const schema = Joi.object({ - a: Joi.number(), + a: Joi.number(), }); const value = { - a: '123', + a: '123', }; const result = schema.validate(value); @@ -1232,23 +1232,23 @@ Validates a value asynchronously using the current schema and options where: - `value` - the value being validated. - `options` - an optional object as described in [`any.validate()`](#anyvalidatevalue-options), with the following additional settings: - - `artifacts` - when `true`, artifacts are returned alongside the value (i.e. `{ value, artifacts }`). Defaults to `false`. - - `warnings` - when `true`, warnings are returned alongside the value (i.e. `{ value, warning }`). Defaults to `false`. + - `artifacts` - when `true`, artifacts are returned alongside the value (i.e. `{ value, artifacts }`). Defaults to `false`. + - `warnings` - when `true`, warnings are returned alongside the value (i.e. `{ value, warning }`). Defaults to `false`. Returns a Promise that resolves into the validated value when the value is valid. If the value is valid and the `warnings` or `debug` options are set to `true`, returns an object `{ value, warning, debug }`. If validation fails, the promise rejects with the validation error. ```js const schema = Joi.object({ - a: Joi.number(), + a: Joi.number(), }); const value = { - a: '123', + a: '123', }; try { - const value = await schema.validateAsync(value); - // value -> { "a" : 123 } + const value = await schema.validateAsync(value); + // value -> { "a" : 123 } } catch (err) {} ``` @@ -1269,8 +1269,8 @@ When calling [`any.validateAsync()`](#anyvalidateasyncvalue-options), set the `w ```js const schema = Joi.any() - .warning('custom.x', { w: 'world' }) - .message({ 'custom.x': 'hello {#w}!' }); + .warning('custom.x', { w: 'world' }) + .message({ 'custom.x': 'hello {#w}!' }); const { value, error, warning } = schema.validate('anything'); @@ -1281,11 +1281,11 @@ const { value, error, warning } = schema.validate('anything'); // or try { - const { value, warning } = await schema.validateAsync('anything', { - warnings: true, - }); - // value -> 'anything'; - // warning -> { message: 'hello world!', details: [...] } + const { value, warning } = await schema.validateAsync('anything', { + warnings: true, + }); + // value -> 'anything'; + // warning -> { message: 'hello world!', details: [...] } } catch (err) {} ``` @@ -1295,12 +1295,12 @@ Adds conditions that are evaluated during validation and modify the schema befor - `condition` - a key name, [reference](#refkey-options), or a schema. If omitted, defaults to `Joi.ref('.')`. - `options` - an object with: - - `is` - the condition expressed as a **joi** schema. Anything that is not a **joi** schema will be converted using [Joi.compile](#compileschema-options). By default, the `is` condition schema allows for `undefined` values. Use `.required()` to override. For example, use `is: Joi.number().required()` to guarantee that a **joi** reference exists and is a number. - - `not` - the negative version of `is` (`then` and `otherwise` have reverse roles). - - `then` - if the condition is true, the **joi** schema to use. - - `otherwise` - if the condition is false, the **joi** schema to use. - - `switch` - an array of `{ is, then }` conditions that are evaluated against the `condition`. The last item in the array may also contain `otherwise`. - - `break` - stops processing all other conditions if the rule results in a `then`, `otherwise`, of `switch` match. + - `is` - the condition expressed as a **joi** schema. Anything that is not a **joi** schema will be converted using [Joi.compile](#compileschema-options). By default, the `is` condition schema allows for `undefined` values. Use `.required()` to override. For example, use `is: Joi.number().required()` to guarantee that a **joi** reference exists and is a number. + - `not` - the negative version of `is` (`then` and `otherwise` have reverse roles). + - `then` - if the condition is true, the **joi** schema to use. + - `otherwise` - if the condition is false, the **joi** schema to use. + - `switch` - an array of `{ is, then }` conditions that are evaluated against the `condition`. The last item in the array may also contain `otherwise`. + - `break` - stops processing all other conditions if the rule results in a `then`, `otherwise`, of `switch` match. If `condition` is a reference: @@ -1324,16 +1324,16 @@ Notes: ```js const schema = { - a: Joi.any() - .valid('x') - .when('b', { - is: Joi.exist(), - then: Joi.valid('y'), - otherwise: Joi.valid('z'), - }) - .when('c', { is: Joi.number().min(10), then: Joi.forbidden() }), - b: Joi.any(), - c: Joi.number(), + a: Joi.any() + .valid('x') + .when('b', { + is: Joi.exist(), + then: Joi.valid('y'), + otherwise: Joi.valid('z'), + }) + .when('c', { is: Joi.number().min(10), then: Joi.forbidden() }), + b: Joi.any(), + c: Joi.number(), }; ``` @@ -1341,15 +1341,15 @@ Or with a schema: ```js const schema = Joi.object({ - a: Joi.any().valid('x'), - b: Joi.any(), + a: Joi.any().valid('x'), + b: Joi.any(), }).when(Joi.object({ b: Joi.exist() }).unknown(), { - then: Joi.object({ - a: Joi.valid('y'), - }), - otherwise: Joi.object({ - a: Joi.valid('z'), - }), + then: Joi.object({ + a: Joi.valid('y'), + }), + otherwise: Joi.object({ + a: Joi.valid('z'), + }), }); ``` @@ -1359,16 +1359,16 @@ validate this logic: ```js const schema = Joi.object({ - type: Joi.string().valid('A', 'B', 'C').required(), // required if type == 'A' + type: Joi.string().valid('A', 'B', 'C').required(), // required if type == 'A' - foo: Joi.when('type', { - is: 'A', - then: Joi.string().valid('X', 'Y', 'Z').required(), - }), // required if type === 'A' and foo !== 'Z' + foo: Joi.when('type', { + is: 'A', + then: Joi.string().valid('X', 'Y', 'Z').required(), + }), // required if type === 'A' and foo !== 'Z' - bar: Joi.string(), + bar: Joi.string(), }).when(Joi.object({ type: Joi.valid('A'), foo: Joi.not('Z') }).unknown(), { - then: Joi.object({ bar: Joi.required() }), + then: Joi.object({ bar: Joi.required() }), }); ``` @@ -1377,8 +1377,8 @@ like this: ```js const schema = { - a: Joi.valid('a', 'b', 'other'), - other: Joi.string().when('a', { is: 'other', then: Joi.required() }), + a: Joi.valid('a', 'b', 'other'), + other: Joi.string().when('a', { is: 'other', then: Joi.required() }), }; ``` @@ -1387,17 +1387,17 @@ so like this: ```js const schema = Joi.object({ - a: Joi.boolean().required(), - b: Joi.object() - .keys({ - c: Joi.string(), - d: Joi.number().required(), - }) - .required() - .when('a', { - is: true, - then: Joi.object({ c: Joi.required() }), // b.c is required only when a is true - }), + a: Joi.boolean().required(), + b: Joi.object() + .keys({ + c: Joi.string(), + d: Joi.number().required(), + }) + .required() + .when('a', { + is: true, + then: Joi.object({ c: Joi.required() }), // b.c is required only when a is true + }), }); ``` @@ -1406,11 +1406,11 @@ following (notice the use of `required()`): ```js const schema = Joi.object({ - min: Joi.number(), - max: Joi.number().when('min', { - is: Joi.number().required(), - then: Joi.number().greater(Joi.ref('min')), - }), + min: Joi.number(), + max: Joi.number().when('min', { + is: Joi.number().required(), + then: Joi.number().greater(Joi.ref('min')), + }), }); ``` @@ -1418,15 +1418,15 @@ To evaluate multiple values on a single reference: ```js const schema = Joi.object({ - a: Joi.number().required(), - b: Joi.number().when('a', { - switch: [ - { is: 0, then: Joi.valid(1) }, - { is: 1, then: Joi.valid(2) }, - { is: 2, then: Joi.valid(3) }, - ], - otherwise: Joi.valid(4), - }), + a: Joi.number().required(), + b: Joi.number().when('a', { + switch: [ + { is: 0, then: Joi.valid(1) }, + { is: 1, then: Joi.valid(2) }, + { is: 2, then: Joi.valid(3) }, + ], + otherwise: Joi.valid(4), + }), }); ``` @@ -1434,12 +1434,12 @@ Or shorter: ```js const schema = Joi.object({ - a: Joi.number().required(), - b: Joi.number().when('a', [ - { is: 0, then: 1 }, - { is: 1, then: 2 }, - { is: 2, then: 3, otherwise: 4 }, - ]), + a: Joi.number().required(), + b: Joi.number().when('a', [ + { is: 0, then: 1 }, + { is: 1, then: 2 }, + { is: 2, then: 3, otherwise: 4 }, + ]), }); ``` @@ -1467,11 +1467,11 @@ Adds a conditional alternative schema type, either based on another key value, o - `condition` - the key name or [reference](#refkey-options), or a schema. - `options` - an object with: - - `is` - the condition expressed as a **joi** schema. Anything that is not a **joi** schema will be converted using [Joi.compile](#compileschema-options). - - `not` - the negative version of `is` (`then` and `otherwise` have reverse roles). - - `then` - if the condition is true, the **joi** schema to use. - - `otherwise` - if the condition is false, the **joi** schema to use. - - `switch` - an array of `{ is, then }` conditions that are evaluated against the `condition`. The last item in the array may also contain `otherwise`. + - `is` - the condition expressed as a **joi** schema. Anything that is not a **joi** schema will be converted using [Joi.compile](#compileschema-options). + - `not` - the negative version of `is` (`then` and `otherwise` have reverse roles). + - `then` - if the condition is true, the **joi** schema to use. + - `otherwise` - if the condition is false, the **joi** schema to use. + - `switch` - an array of `{ is, then }` conditions that are evaluated against the `condition`. The last item in the array may also contain `otherwise`. If `condition` is a reference: @@ -1492,25 +1492,25 @@ Note that `alternatives.conditional()` is different than `any.when()`. When you ```js const schema = { - a: Joi.alternatives().conditional('b', { - is: 5, - then: Joi.string(), - otherwise: Joi.number(), - }), - b: Joi.any(), + a: Joi.alternatives().conditional('b', { + is: 5, + then: Joi.string(), + otherwise: Joi.number(), + }), + b: Joi.any(), }; ``` ```js const schema = Joi.alternatives().conditional(Joi.object({ b: 5 }).unknown(), { - then: Joi.object({ - a: Joi.string(), - b: Joi.any(), - }), - otherwise: Joi.object({ - a: Joi.number(), - b: Joi.any(), - }), + then: Joi.object({ + a: Joi.string(), + b: Joi.any(), + }), + otherwise: Joi.object({ + a: Joi.number(), + b: Joi.any(), + }), }); ``` @@ -1520,8 +1520,8 @@ this definition of `a`: ```js const schema = { - a: Joi.alternatives().conditional('b', { is: true, then: Joi.required() }), - b: Joi.boolean(), + a: Joi.alternatives().conditional('b', { is: true, then: Joi.required() }), + b: Joi.boolean(), }; ``` @@ -1534,8 +1534,8 @@ To accomplish the desired result above use: ```js const schema = { - a: Joi.when('b', { is: true, then: Joi.required() }), - b: Joi.boolean(), + a: Joi.when('b', { is: true, then: Joi.required() }), + b: Joi.boolean(), }; ``` @@ -1544,9 +1544,9 @@ const schema = { Requires the validated value to match a specific set of the provided `alternative.try()` schemas where: - `mode` - the match mode which can be one of: - - `'any'` - match any provided schema. This is the default value. - - `'all'` - match all of the provided schemas. Note that this will ignore any conversions performed by the matchin schemas and return the raw value provided regardless of the `convert` preference set. - - `'one'` - match one and only one of the provided schemas. + - `'any'` - match any provided schema. This is the default value. + - `'all'` - match all of the provided schemas. Note that this will ignore any conversions performed by the matchin schemas and return the raw value provided regardless of the `convert` preference set. + - `'one'` - match one and only one of the provided schemas. Note: Cannot be combined with `alternatives.conditional()`. @@ -1586,13 +1586,13 @@ Verifies that a schema validates at least one of the values in the array, where: ```js const schema = Joi.array() - .items( - Joi.object({ - a: Joi.string(), - b: Joi.number(), - }), - ) - .has(Joi.object({ a: Joi.string().valid('a'), b: Joi.number() })); + .items( + Joi.object({ + a: Joi.string(), + b: Joi.number(), + }), + ) + .has(Joi.object({ a: Joi.string().valid('a'), b: Joi.number() })); ``` Possible validation errors: [`array.hasKnown`](#arrayhasknown), [`array.hasUnknown`](#arrayhasunknown) @@ -1611,16 +1611,16 @@ Errors will contain the number of items that didn't match. Any unmatched item ha ```js const schema = Joi.array().items(Joi.string(), Joi.number()); // array may contain strings and numbers const schema = Joi.array().items( - Joi.string().required(), - Joi.string().required(), + Joi.string().required(), + Joi.string().required(), ); // array must contain at least two strings const schema = Joi.array().items( - Joi.string().valid('not allowed').forbidden(), - Joi.string(), + Joi.string().valid('not allowed').forbidden(), + Joi.string(), ); // array may contain strings, but none of those strings can match 'not allowed' const schema = Joi.array().items( - Joi.string().label('My string').required(), - Joi.number().required(), + Joi.string().label('My string').required(), + Joi.number().required(), ); // If this fails it can result in `[ValidationError: "value" does not contain [My string] and 1 other required value(s)]` ``` @@ -1638,8 +1638,8 @@ const schema = Joi.array().length(5); ```js const schema = Joi.object({ - limit: Joi.number().integer().required(), - numbers: Joi.array().length(Joi.ref('limit')).required(), + limit: Joi.number().integer().required(), + numbers: Joi.array().length(Joi.ref('limit')).required(), }); ``` @@ -1657,8 +1657,8 @@ const schema = Joi.array().max(10); ```js const schema = Joi.object({ - limit: Joi.number().integer().required(), - numbers: Joi.array().max(Joi.ref('limit')).required(), + limit: Joi.number().integer().required(), + numbers: Joi.array().max(Joi.ref('limit')).required(), }); ``` @@ -1676,8 +1676,8 @@ const schema = Joi.array().min(2); ```js const schema = Joi.object({ - limit: Joi.number().integer().required(), - numbers: Joi.array().min(Joi.ref('limit')).required(), + limit: Joi.number().integer().required(), + numbers: Joi.array().min(Joi.ref('limit')).required(), }); ``` @@ -1694,12 +1694,12 @@ Errors will contain the number of items that didn't match. Any unmatched item ha ```js const schema = Joi.array().ordered( - Joi.string().required(), - Joi.number().required(), + Joi.string().required(), + Joi.number().required(), ); // array must have first item as string and second item as number const schema = Joi.array() - .ordered(Joi.string().required()) - .items(Joi.number().required()); // array must have first item as string and 1 or more subsequent items as number + .ordered(Joi.string().required()) + .items(Joi.number().required()); // array must have first item as string and 1 or more subsequent items as number const schema = Joi.array().ordered(Joi.string().required(), Joi.number()); // array must have first item as string and optionally second item as number ``` @@ -1724,10 +1724,10 @@ Possible validation errors: [`array.excludes`](#arrayexcludes), [`array.includes Requires the array to comply with the specified sort order where: - `options` - optional settings: - - `order` - the sort order. Allowed values: - - `'ascending'` - sort the array in ascending order. This is the default. - - `'descending'` - sort the array in descending order. - - `by` - a key name or reference to sort array objects by. Defaults to the entire value. + - `order` - the sort order. Allowed values: + - `'ascending'` - sort the array in ascending order. This is the default. + - `'descending'` - sort the array in descending order. + - `by` - a key name or reference to sort array objects by. Defaults to the entire value. Notes: @@ -1753,16 +1753,16 @@ Possible validation errors: [`array.sparse`](#arraysparse) Requires the array values to be unique where: - `comparator` - an optional custom `comparator` that is either: - - a function that takes 2 parameters to compare. This function should return whether the 2 - parameters are equal or not, you are also **responsible** for this function not to fail, any - `Error` would bubble out of Joi. - - a string in dot notation representing the path of the element to do uniqueness check on. Any - missing path will be considered undefined, and can as well only exist once. + - a function that takes 2 parameters to compare. This function should return whether the 2 + parameters are equal or not, you are also **responsible** for this function not to fail, any + `Error` would bubble out of Joi. + - a string in dot notation representing the path of the element to do uniqueness check on. Any + missing path will be considered undefined, and can as well only exist once. - `options` - optional settings: - - `ignoreUndefined` - if `true`, undefined values for the dot notation string comparator will - not cause the array to fail on uniqueness. Defaults to `false`. - - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the - `key` as a literal value. + - `ignoreUndefined` - if `true`, undefined values for the dot notation string comparator will + not cause the array to fail on uniqueness. Defaults to `false`. + - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the + `key` as a literal value. Note: remember that if you provide a custom comparator function, different types can be passed as parameter depending on the rules you set on items. @@ -1936,8 +1936,8 @@ const schema = Joi.date().greater('now'); ```js const schema = Joi.object({ - from: Joi.date().required(), - to: Joi.date().greater(Joi.ref('from')).required(), + from: Joi.date().required(), + to: Joi.date().greater(Joi.ref('from')).required(), }); ``` @@ -1969,8 +1969,8 @@ const schema = Joi.date().less('now'); ```js const schema = Joi.object({ - from: Joi.date().less(Joi.ref('to')).required(), - to: Joi.date().required(), + from: Joi.date().less(Joi.ref('to')).required(), + to: Joi.date().required(), }); ``` @@ -1994,8 +1994,8 @@ const schema = Joi.date().max('now'); ```js const schema = Joi.object({ - from: Joi.date().max(Joi.ref('to')).required(), - to: Joi.date().required(), + from: Joi.date().max(Joi.ref('to')).required(), + to: Joi.date().required(), }); ``` @@ -2019,8 +2019,8 @@ const schema = Joi.date().min('now'); ```js const schema = Joi.object({ - from: Joi.date().required(), - to: Joi.date().min(Joi.ref('from')).required(), + from: Joi.date().required(), + to: Joi.date().min(Joi.ref('from')).required(), }); ``` @@ -2117,13 +2117,17 @@ Note that named links must be found in a direct ancestor of the link. The names Links are resolved once (per runtime) and the result schema cached. If you reuse a link in different places, the first time it is resolved at run-time, the result will be used by all other instances. If you want each link to resolve relative to the place it is used, use a separate `Joi.link()` statement in each place or set the `relative()` flag. +As a safety net, when validation exceeds the runtime call stack while resolving a link, validation fails with the `link.depth` error code instead of crashing the process. + +Possible validation errors: [`link.depth`](#linkdepth) + Named links: ```js const person = Joi.object({ - firstName: Joi.string().required(), - lastName: Joi.string().required(), - children: Joi.array().items(Joi.link('#person')), + firstName: Joi.string().required(), + lastName: Joi.string().required(), + children: Joi.array().items(Joi.link('#person')), }).id('person'); ``` @@ -2131,12 +2135,12 @@ Relative links: ```js const person = Joi.object({ - firstName: Joi.string().required(), - lastName: Joi.string().required(), - children: Joi.array().items(Joi.link('...')), - // . - the link - // .. - the children array - // ... - the person object + firstName: Joi.string().required(), + lastName: Joi.string().required(), + children: Joi.array().items(Joi.link('...')), + // . - the link + // .. - the children array + // ... - the person object }); ``` @@ -2144,9 +2148,9 @@ Absolute links: ```js const person = Joi.object({ - firstName: Joi.string().required(), - lastName: Joi.string().required(), - children: Joi.array().items(Joi.link('/')), + firstName: Joi.string().required(), + lastName: Joi.string().required(), + children: Joi.array().items(Joi.link('/')), }); ``` @@ -2159,8 +2163,8 @@ Will throw an error during validation if left uninitialized (e.g. `Joi.link()` c ```js const schema = Joi.object({ - a: [Joi.string(), Joi.number()], - b: Joi.link().ref('#type.a'), + a: [Joi.string(), Joi.number()], + b: Joi.link().ref('#type.a'), }).id('type'); ``` @@ -2198,8 +2202,8 @@ const schema = Joi.number().greater(5); ```js const schema = Joi.object({ - min: Joi.number().required(), - max: Joi.number().greater(Joi.ref('min')).required(), + min: Joi.number().required(), + max: Joi.number().greater(Joi.ref('min')).required(), }); ``` @@ -2225,8 +2229,8 @@ const schema = Joi.number().less(10); ```js const schema = Joi.object({ - min: Joi.number().less(Joi.ref('max')).required(), - max: Joi.number().required(), + min: Joi.number().less(Joi.ref('max')).required(), + max: Joi.number().required(), }); ``` @@ -2244,8 +2248,8 @@ const schema = Joi.number().max(10); ```js const schema = Joi.object({ - min: Joi.number().max(Joi.ref('max')).required(), - max: Joi.number().required(), + min: Joi.number().max(Joi.ref('max')).required(), + max: Joi.number().required(), }); ``` @@ -2263,8 +2267,8 @@ const schema = Joi.number().min(2); ```js const schema = Joi.object({ - min: Joi.number().required(), - max: Joi.number().min(Joi.ref('min')).required(), + min: Joi.number().required(), + max: Joi.number().min(Joi.ref('min')).required(), }); ``` @@ -2361,8 +2365,8 @@ Supports the same methods of the [`any()`](#any) type. ```js const object = Joi.object({ - a: Joi.number().min(1).max(10).integer(), - b: 'some string', + a: Joi.number().min(1).max(10).integer(), + b: 'some string', }); await object.validateAsync({ a: 5 }); @@ -2384,13 +2388,13 @@ them are required as well where: - `peers` - the string key names of which if one present, all are required. - `options` - optional settings: - - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the `key` as a literal value. - - `isPresent` - function that overrides the default check for an empty value. Default: `(resolved) => resolved !== undefined` + - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the `key` as a literal value. + - `isPresent` - function that overrides the default check for an empty value. Default: `(resolved) => resolved !== undefined` ```js const schema = Joi.object({ - a: Joi.any(), - b: Joi.any(), + a: Joi.any(), + b: Joi.any(), }).and('a', 'b'); ``` @@ -2405,11 +2409,11 @@ Appends the allowed object keys where: ```js // Validate key a const base = Joi.object({ - a: Joi.number(), + a: Joi.number(), }); // Validate keys a, b. const extended = base.append({ - b: Joi.string(), + b: Joi.string(), }); ``` @@ -2424,13 +2428,13 @@ Verifies an assertion where: ```js const schema = Joi.object({ - a: { - b: Joi.string(), - c: Joi.number(), - }, - d: { - e: Joi.any(), - }, + a: { + b: Joi.string(), + c: Joi.number(), + }, + d: { + e: Joi.any(), + }, }).assert('.d.e', Joi.ref('a.c'), 'equal to a.c'); ``` @@ -2460,12 +2464,12 @@ Sets or extends the allowed object keys where: ```js const base = Joi.object().keys({ - a: Joi.number(), - b: Joi.string(), + a: Joi.number(), + b: Joi.string(), }); // Validate keys a, b and c. const extended = base.keys({ - c: Joi.boolean(), + c: Joi.boolean(), }); ``` @@ -2513,13 +2517,13 @@ Defines a relationship between keys where not all peers can be present at the sa - `peers` - the key names of which if one present, the others may not all be present. - `options` - optional settings: - - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the `key` as a literal value. - - `isPresent` - function that overrides the default check for an empty value. Default: `(resolved) => resolved !== undefined` + - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the `key` as a literal value. + - `isPresent` - function that overrides the default check for an empty value. Default: `(resolved) => resolved !== undefined` ```js const schema = Joi.object({ - a: Joi.any(), - b: Joi.any(), + a: Joi.any(), + b: Joi.any(), }).nand('a', 'b'); ``` @@ -2532,13 +2536,13 @@ allowed) where: - `peers` - the key names of which at least one must appear. - `options` - optional settings: - - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the `key` as a literal value. - - `isPresent` - function that overrides the default check for an empty value. Default: `(resolved) => resolved !== undefined` + - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the `key` as a literal value. + - `isPresent` - function that overrides the default check for an empty value. Default: `(resolved) => resolved !== undefined` ```js const schema = Joi.object({ - a: Joi.any(), - b: Joi.any(), + a: Joi.any(), + b: Joi.any(), }).or('a', 'b'); ``` @@ -2551,13 +2555,13 @@ required where: - `peers` - the exclusive key names that must not appear together but where none are required. - `options` - optional settings: - - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the `key` as a literal value. - - `isPresent` - function that overrides the default check for an empty value. Default: `(resolved) => resolved !== undefined` + - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the `key` as a literal value. + - `isPresent` - function that overrides the default check for an empty value. Default: `(resolved) => resolved !== undefined` ```js const schema = Joi.object({ - a: Joi.any(), - b: Joi.any(), + a: Joi.any(), + b: Joi.any(), }).oxor('a', 'b'); ``` @@ -2570,20 +2574,20 @@ Specify validation rules for unknown keys matching a pattern where: - `pattern` - a pattern that can be either a regular expression or a **joi** schema that will be tested against the unknown key names. Note that if the pattern is a regular expression, for it to match the entire key name, it must begin with `^` and end with `$`. - `schema` - the schema object matching keys must validate against. - `options` - options settings: - - `fallthrough` - if `true`, multiple matching patterns are tested against the key, otherwise once a pattern match is found, no other patterns are compared. Defaults to `false`. - - `matches` - a joi array schema used to validated the array of matching keys. For example, `Joi.object().pattern(/\d/, Joi.boolean(), { matches: Joi.array().length(2) })` will require two matching keys. If the `matches` schema is not an array type schema, it will be converted to `Joi.array().items(matches)`. If the `matches` schema contains references, they are resolved against the ancestors as follows: - - self - the array of matching keys (`Joi.ref('.length')`) - - parent - the object value containing the keys (`Joi.ref('a')`) + - `fallthrough` - if `true`, multiple matching patterns are tested against the key, otherwise once a pattern match is found, no other patterns are compared. Defaults to `false`. + - `matches` - a joi array schema used to validated the array of matching keys. For example, `Joi.object().pattern(/\d/, Joi.boolean(), { matches: Joi.array().length(2) })` will require two matching keys. If the `matches` schema is not an array type schema, it will be converted to `Joi.array().items(matches)`. If the `matches` schema contains references, they are resolved against the ancestors as follows: + - self - the array of matching keys (`Joi.ref('.length')`) + - parent - the object value containing the keys (`Joi.ref('a')`) ```js const schema = Joi.object({ - a: Joi.string(), + a: Joi.string(), }).pattern(/\w\d/, Joi.boolean()); // OR const schema = Joi.object({ - a: Joi.string(), + a: Joi.string(), }).pattern(Joi.string().min(2).max(5), Joi.boolean()); ``` @@ -2616,16 +2620,16 @@ Renames a key to another name (deletes the renamed key) where: - `from` - the original key name or a regular expression matching keys. - `to` - the new key name. `to` can be set to a [`template`](#templatetemplate-options) which is rendered at runtime using the current value, global context, and local context if `from` is a regular expression (e.g. the expression `/^(\d+)$/` will match any all-digits keys with a capture group that is accessible in the template via `{#1}`). - `options` - an optional object with the following optional keys: - - `alias` - if `true`, does not delete the old key name, keeping both the new and old keys in place. Defaults to `false`. - - `multiple` - if `true`, allows renaming multiple keys to the same destination where the last rename wins. Defaults to `false`. - - `override` - if `true`, allows renaming a key over an existing key. Defaults to `false`. - - `ignoreUndefined` - if `true`, skip renaming of a key if it's undefined. Defaults to `false`. + - `alias` - if `true`, does not delete the old key name, keeping both the new and old keys in place. Defaults to `false`. + - `multiple` - if `true`, allows renaming multiple keys to the same destination where the last rename wins. Defaults to `false`. + - `override` - if `true`, allows renaming a key over an existing key. Defaults to `false`. + - `ignoreUndefined` - if `true`, skip renaming of a key if it's undefined. Defaults to `false`. Keys are renamed before any other validation rules are applied. If `to` is a template that references the object own keys (e.g. `'{.prefix}-{#1}'`), the value of these keys is the raw input value, not the value generated after validation. If a key is renamed and then its value fails to pass a validation rule, the error message will use the renamed key, not the original key which may be confusing for users (labels can help in some cases). ```js const object = Joi.object({ - a: Joi.number(), + a: Joi.number(), }).rename('b', 'a'); await object.validateAsync({ b: 5 }); @@ -2637,7 +2641,7 @@ Using a regular expression: const regex = /^foobar$/i; const schema = Joi.object({ - fooBar: Joi.string(), + fooBar: Joi.string(), }).rename(regex, 'fooBar'); await schema.validateAsync({ FooBar: 'a' }); @@ -2647,14 +2651,14 @@ Using a regular expression with template: ```js const schema = Joi.object() - .rename(/^(\d+)$/, Joi.expression('x{#1}x')) - .pattern(/^x\d+x$/, Joi.any()); + .rename(/^(\d+)$/, Joi.expression('x{#1}x')) + .pattern(/^x\d+x$/, Joi.any()); const input = { - 123: 'x', - 1: 'y', - 0: 'z', - x4x: 'test', + 123: 'x', + 1: 'y', + 0: 'z', + x4x: 'test', }; const value = await Joi.compile(schema).validateAsync(input); @@ -2695,16 +2699,16 @@ Requires the presence of other keys whenever the specified key is present where: - `peers` - the required peer key names that must appear together with `key`. `peers` can be a single string value or an array of string values. - `options` - optional settings: - - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the `key` as a literal value. - - `isPresent` - function that overrides the default check for an empty value. Default: `(resolved) => resolved !== undefined` + - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the `key` as a literal value. + - `isPresent` - function that overrides the default check for an empty value. Default: `(resolved) => resolved !== undefined` Note that unlike [`object.and()`](#objectandpeers-options), `with()` creates a dependency only between the `key` and each of the `peers`, not between the `peers` themselves. ```js const schema = Joi.object({ - a: Joi.any(), - b: Joi.any(), + a: Joi.any(), + b: Joi.any(), }).with('a', 'b'); ``` @@ -2718,13 +2722,13 @@ Forbids the presence of other keys whenever the specified is present where: - `peers` - the forbidden peer key names that must not appear together with `key`. `peers` can be a single string value or an array of string values. - `options` - optional settings: - - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the `key` as a literal value. - - `isPresent` - function that overrides the default check for an empty value. Default: `(resolved) => resolved !== undefined` + - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the `key` as a literal value. + - `isPresent` - function that overrides the default check for an empty value. Default: `(resolved) => resolved !== undefined` ```js const schema = Joi.object({ - a: Joi.any(), - b: Joi.any(), + a: Joi.any(), + b: Joi.any(), }).without('a', ['b']); ``` @@ -2737,13 +2741,13 @@ the same time where: - `peers` - the exclusive key names that must not appear together but where one of them is required. - `options` - optional settings: - - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the `key` as a literal value. - - `isPresent` - function that overrides the default check for an empty value. Default: `(resolved) => resolved !== undefined` + - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the `key` as a literal value. + - `isPresent` - function that overrides the default check for an empty value. Default: `(resolved) => resolved !== undefined` ```js const schema = Joi.object({ - a: Joi.any(), - b: Joi.any(), + a: Joi.any(), + b: Joi.any(), }).xor('a', 'b'); ``` @@ -2788,8 +2792,8 @@ Possible validation errors: [`string.alphanum`](#stringalphanum-1) Requires the string value to be a valid base64 string; does not check the decoded value. - `options` - optional settings: - - `paddingRequired` - if `true`, the string must be properly padded with the `=` characters. Defaults to `true`. - - `urlSafe` - if `true`, uses the URI-safe base64 format which replaces `+` with `-` and `\` with `_`. Defaults to `false`. + - `paddingRequired` - if `true`, the string must be properly padded with the `=` characters. Defaults to `true`. + - `urlSafe` - if `true`, uses the URI-safe base64 format which replaces `+` with `-` and `\` with `_`. Defaults to `false`. Padding characters are not required for decoding, as the number of missing bytes can be inferred from the number of digits. With that said, try to use padding if at all possible. @@ -2837,7 +2841,7 @@ Possible validation errors: [`string.creditCard`](#stringcreditcard-1) Requires the string value to be a valid data URI string. - `options` - optional settings: - - `paddingRequired` - optional parameter defaulting to `true` which will require `=` padding if `true` or make padding optional if `false`. + - `paddingRequired` - optional parameter defaulting to `true` which will require `=` padding if `true` or make padding optional if `false`. ```js const schema = Joi.string().dataUri(); @@ -2852,21 +2856,21 @@ Possible validation errors: [`string.dataUri`](#stringdatauri) Requires the string value to be a valid domain name. - `options` - optional settings: - - `allowFullyQualified` - if `true`, domains ending with a `.` character are permitted. Defaults to `false`. - - `allowUnicode` - if `true`, Unicode characters are permitted. Defaults to `true`. - - `minDomainSegments` - number of segments required for the domain. Defaults to `2`. - - `maxDomainSegments` - maximum number of allowed domain segments. Default to no limit. - - `tlds` - options for TLD (top level domain) validation. By default, the TLD must be a valid - name listed on the [IANA registry](http://data.iana.org/TLD/tlds-alpha-by-domain.txt). To - disable validation, set `tlds` to `false`. To customize how TLDs are validated, set one of - these: - - `allow` - one of: - - `true` to use the IANA list of registered TLDs. This is the default value. - - `false` to allow any TLD not listed in the `deny` list, if present. - - a `Set` or array of the allowed TLDs. Cannot be used together with `deny`. - - `deny` - one of: - - a `Set` or array of the forbidden TLDs. Cannot be used together with a custom `allow` - list. + - `allowFullyQualified` - if `true`, domains ending with a `.` character are permitted. Defaults to `false`. + - `allowUnicode` - if `true`, Unicode characters are permitted. Defaults to `true`. + - `minDomainSegments` - number of segments required for the domain. Defaults to `2`. + - `maxDomainSegments` - maximum number of allowed domain segments. Default to no limit. + - `tlds` - options for TLD (top level domain) validation. By default, the TLD must be a valid + name listed on the [IANA registry](http://data.iana.org/TLD/tlds-alpha-by-domain.txt). To + disable validation, set `tlds` to `false`. To customize how TLDs are validated, set one of + these: + - `allow` - one of: + - `true` to use the IANA list of registered TLDs. This is the default value. + - `false` to allow any TLD not listed in the `deny` list, if present. + - a `Set` or array of the allowed TLDs. Cannot be used together with `deny`. + - `deny` - one of: + - a `Set` or array of the forbidden TLDs. Cannot be used together with a custom `allow` + list. ```js const schema = Joi.string().domain(); @@ -2879,28 +2883,28 @@ Possible validation errors: [`string.domain`](#stringdomain) Requires the string value to be a valid email address. - `options` - optional settings: - - `allowFullyQualified` - if `true`, domains ending with a `.` character are permitted. Defaults to `false`. - - `allowUnicode` - if `true`, Unicode characters are permitted. Defaults to `true`. - - `ignoreLength` - if `true`, ignore invalid email length errors. Defaults to `false`. - - `minDomainSegments` - number of segments required for the domain. The default setting excludes - single segment domains such as `example@io` which is a valid email but very uncommon. Defaults - to `2`. - - `maxDomainSegments` - maximum number of allowed domain segments. Default to no limit. - - `multiple` - if `true`, allows multiple email addresses in a single string, separated by `,` - or the `separator` characters. Defaults to `false`. - - `separator` - when `multiple` is `true`, overrides the default `,` separator. String can be - a single character or multiple separator characters. Defaults to `','`. - - `tlds` - options for TLD (top level domain) validation. By default, the TLD must be a valid - name listed on the [IANA registry](http://data.iana.org/TLD/tlds-alpha-by-domain.txt). To - disable validation, set `tlds` to `false`. To customize how TLDs are validated, set one of - these: - - `allow` - one of: - - `true` to use the IANA list of registered TLDs. This is the default value. - - `false` to allow any TLD not listed in the `deny` list, if present. - - a `Set` or array of the allowed TLDs. Cannot be used together with `deny`. - - `deny` - one of: - - a `Set` or array of the forbidden TLDs. Cannot be used together with a custom `allow` - list. + - `allowFullyQualified` - if `true`, domains ending with a `.` character are permitted. Defaults to `false`. + - `allowUnicode` - if `true`, Unicode characters are permitted. Defaults to `true`. + - `ignoreLength` - if `true`, ignore invalid email length errors. Defaults to `false`. + - `minDomainSegments` - number of segments required for the domain. The default setting excludes + single segment domains such as `example@io` which is a valid email but very uncommon. Defaults + to `2`. + - `maxDomainSegments` - maximum number of allowed domain segments. Default to no limit. + - `multiple` - if `true`, allows multiple email addresses in a single string, separated by `,` + or the `separator` characters. Defaults to `false`. + - `separator` - when `multiple` is `true`, overrides the default `,` separator. String can be + a single character or multiple separator characters. Defaults to `','`. + - `tlds` - options for TLD (top level domain) validation. By default, the TLD must be a valid + name listed on the [IANA registry](http://data.iana.org/TLD/tlds-alpha-by-domain.txt). To + disable validation, set `tlds` to `false`. To customize how TLDs are validated, set one of + these: + - `allow` - one of: + - `true` to use the IANA list of registered TLDs. This is the default value. + - `false` to allow any TLD not listed in the `deny` list, if present. + - a `Set` or array of the allowed TLDs. Cannot be used together with `deny`. + - `deny` - one of: + - a `Set` or array of the forbidden TLDs. Cannot be used together with a custom `allow` + list. ```js const schema = Joi.string().email(); @@ -2915,19 +2919,19 @@ Possible validation errors: [`string.email`](#stringemail) Requires the string value to be a valid GUID. - `options` - optional settings: - - `version` - specifies one or more acceptable versions. Can be an Array or String with the following values: - `uuidv1`, `uuidv2`, `uuidv3`, `uuidv4`, `uuidv5`, `uuidv6`, `uuidv7` or `uuidv8`. If no `version` is specified then it is assumed to be a generic `guid` - which will not validate the version or variant of the guid and just check for general structure format. - - `separator` - defines the allowed or required GUID separator where: - - `true` - a separator is required, can be either `:` or `-`. - - `false` - separator is not allowed. - - `'-'` - a dash separator is required. - - `':'` - a colon separator is required. - - defaults to optional `:` or `-` separator. + - `version` - specifies one or more acceptable versions. Can be an Array or String with the following values: + `uuidv1`, `uuidv2`, `uuidv3`, `uuidv4`, `uuidv5`, `uuidv6`, `uuidv7` or `uuidv8`. If no `version` is specified then it is assumed to be a generic `guid` + which will not validate the version or variant of the guid and just check for general structure format. + - `separator` - defines the allowed or required GUID separator where: + - `true` - a separator is required, can be either `:` or `-`. + - `false` - separator is not allowed. + - `'-'` - a dash separator is required. + - `':'` - a colon separator is required. + - defaults to optional `:` or `-` separator. ```js const schema = Joi.string().guid({ - version: ['uuidv4', 'uuidv5'], + version: ['uuidv4', 'uuidv5'], }); ``` @@ -2938,8 +2942,8 @@ Possible validation errors: [`string.guid`](#stringguid) Requires the string value to be a valid hexadecimal string. - `options` - optional settings: - - `byteAligned` - Boolean specifying whether you want to check that the hexadecimal string is byte aligned. If `convert` is `true`, a `0` will be added in front of the string in case it needs to be aligned. Defaults to `false`. - - `prefix` - Boolean or `optional`. When `true`, the string will be considered valid if prefixed with `0x` or `0X`. When `false`, the prefix is forbidden. When `optional`, the string will be considered valid if prefixed or not prefixed at all. Defaults to `false`. + - `byteAligned` - Boolean specifying whether you want to check that the hexadecimal string is byte aligned. If `convert` is `true`, a `0` will be added in front of the string in case it needs to be aligned. Defaults to `false`. + - `prefix` - Boolean or `optional`. When `true`, the string will be considered valid if prefixed with `0x` or `0X`. When `false`, the prefix is forbidden. When `optional`, the string will be considered valid if prefixed or not prefixed at all. Defaults to `false`. ```js const schema = Joi.string().hex({ prefix: 'optional' }); @@ -2970,14 +2974,14 @@ const schema = Joi.string().valid('a').insensitive(); Requires the string value to be a valid ip address. - `options` - optional settings: - - `version` - One or more IP address versions to validate against. Valid values: `ipv4`, `ipv6`, `ipvfuture` - - `cidr` - Used to determine if a CIDR is allowed or not. Valid values: `optional`, `required`, `forbidden` + - `version` - One or more IP address versions to validate against. Valid values: `ipv4`, `ipv6`, `ipvfuture` + - `cidr` - Used to determine if a CIDR is allowed or not. Valid values: `optional`, `required`, `forbidden` ```js // Accept only ipv4 and ipv6 addresses with a CIDR const schema = Joi.string().ip({ - version: ['ipv4', 'ipv6'], - cidr: 'required', + version: ['ipv4', 'ipv6'], + cidr: 'required', }); ``` @@ -3027,8 +3031,8 @@ const schema = Joi.string().length(5); ```js const schema = Joi.object({ - length: Joi.string().required(), - value: Joi.string().length(Joi.ref('length'), 'utf8').required(), + length: Joi.string().required(), + value: Joi.string().length(Joi.ref('length'), 'utf8').required(), }); ``` @@ -3058,8 +3062,8 @@ const schema = Joi.string().max(10); ```js const schema = Joi.object({ - max: Joi.string().required(), - value: Joi.string().max(Joi.ref('max'), 'utf8').required(), + max: Joi.string().required(), + value: Joi.string().max(Joi.ref('max'), 'utf8').required(), }); ``` @@ -3078,8 +3082,8 @@ const schema = Joi.string().min(2); ```js const schema = Joi.object({ - min: Joi.string().required(), - value: Joi.string().min(Joi.ref('min'), 'utf8').required(), + min: Joi.string().required(), + value: Joi.string().min(Joi.ref('min'), 'utf8').required(), }); ``` @@ -3109,9 +3113,9 @@ Defines a pattern rule where: - `regex` - a regular expression object the string value must match against. Note that if the pattern is a regular expression, for it to match the entire key name, it must begin with `^` and end with `$`. - `name` - optional name for patterns (useful with multiple patterns). - `options` - an optional configuration object with the following supported properties: - - `name` - optional pattern name. - - `invert` - optional boolean flag. Defaults to `false` behavior. If specified as `true`, the - provided pattern will be disallowed instead of required. + - `name` - optional pattern name. + - `invert` - optional boolean flag. Defaults to `false` behavior. If specified as `true`, the + provided pattern will be disallowed instead of required. ```js const schema = Joi.string().pattern(/^[abc]+$/); @@ -3126,8 +3130,8 @@ const invertedSchema = Joi.string().pattern(/^[a-z]+$/, { invert: true }); invertedSchema.validate('lowercase'); // ValidationError: "value" with value "lowercase" matches the inverted pattern: [a-z] const invertedNamedSchema = Joi.string().pattern(/^[a-z]+$/, { - name: 'alpha', - invert: true, + name: 'alpha', + invert: true, }); invertedNamedSchema.validate('lowercase'); // ValidationError: "value" with value "lowercase" matches the inverted alpha pattern ``` @@ -3203,17 +3207,17 @@ Possible validation errors: [`string.uppercase`](#stringuppercase-1) Requires the string value to be a valid [RFC 3986](http://tools.ietf.org/html/rfc3986) URI. - `options` - optional settings: - - `scheme` - Specifies one or more acceptable Schemes, should only include the scheme name. Can be an Array or String (strings are automatically escaped for use in a Regular Expression). - - `allowRelative` - Allow relative URIs. Defaults to `false`. - - `relativeOnly` - Restrict only relative URIs. Defaults to `false`. - - `allowQuerySquareBrackets` - Allows unencoded square brackets inside the query string. This is **NOT** RFC 3986 compliant but query strings like `abc[]=123&abc[]=456` are very common these days. Defaults to `false`. - - `domain` - Validate the domain component using the options specified in [`string.domain()`](#stringdomainoptions). - - `encodeUri` - When `convert` is true, if the validation fails, attempts to encode the URI using [`encodeURI`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURI) before validating it again. This allows to provide, for example, unicode URIs, and have it encoded for you. Defaults to `false`. + - `scheme` - Specifies one or more acceptable Schemes, should only include the scheme name. Can be an Array or String (strings are automatically escaped for use in a Regular Expression). + - `allowRelative` - Allow relative URIs. Defaults to `false`. + - `relativeOnly` - Restrict only relative URIs. Defaults to `false`. + - `allowQuerySquareBrackets` - Allows unencoded square brackets inside the query string. This is **NOT** RFC 3986 compliant but query strings like `abc[]=123&abc[]=456` are very common these days. Defaults to `false`. + - `domain` - Validate the domain component using the options specified in [`string.domain()`](#stringdomainoptions). + - `encodeUri` - When `convert` is true, if the validation fails, attempts to encode the URI using [`encodeURI`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURI) before validating it again. This allows to provide, for example, unicode URIs, and have it encoded for you. Defaults to `false`. ```js // Accept git or git http/https const schema = Joi.string().uri({ - scheme: ['git', /git\+https?/], + scheme: ['git', /git\+https?/], }); ``` @@ -3239,14 +3243,14 @@ Possible validation errors: [`symbol.base`](#symbolbase) Allows values to be transformed into `Symbol`s, where: - `map` - mapping declaration that can be: - - an object, where keys are strings, and values are `Symbol`s - - an array of arrays of length 2, where for each sub-array, the 1st element must be anything but an object, a function or a `Symbol`, and the 2nd element must be a Symbol - - a `Map`, following the same principles as the array above + - an object, where keys are strings, and values are `Symbol`s + - an array of arrays of length 2, where for each sub-array, the 1st element must be anything but an object, a function or a `Symbol`, and the 2nd element must be a Symbol + - a `Map`, following the same principles as the array above ```js const schema = Joi.symbol().map([ - [1, Symbol('one')], - ['two', Symbol('two')], + [1, Symbol('one')], + ['two', Symbol('two')], ]); ``` @@ -3280,153 +3284,154 @@ Where: - `base`: The base schema to extend from. This key is forbidden when `type` is a regular expression. - `messages`: A hash of error codes and their messages. To interpolate dynamic values, use the [template syntax](#template-syntax). - `flags`: A hash of flag names and their definitions where: - - `default`: The default value of the flag. When `describe()` is called and the current flag matches this default value, it will be omitted entirely from the description. + - `default`: The default value of the flag. When `describe()` is called and the current flag matches this default value, it will be omitted entirely from the description. - `prepare`: A function with signature `function (value, helpers) {}` that prepares the input value (for example, converts `,` to `.` to support multiple decimal representations) where: - - `value`: The input value. - - `helpers`: [Validation helpers](#validation-helpers) + - `value`: The input value. + - `helpers`: [Validation helpers](#validation-helpers) - Must return an object with one of the following keys: - - `value`: The modified value. - - `errors`: Validation error(s) generated by `$_createError()` or `helpers.error()`. + Must return an object with one of the following keys: + - `value`: The modified value. + - `errors`: Validation error(s) generated by `$_createError()` or `helpers.error()`. - If `errors` is defined, validation will abort regardless of `abortEarly`. Refer to the validation process above for further information. + If `errors` is defined, validation will abort regardless of `abortEarly`. Refer to the validation process above for further information. - `coerce`: A function with signature `function (value, helpers) {}` that coerces the input value where: - - `value`: The input value. - - `helpers`: [Validation helpers](#validation-helpers) - - You can also pass an object where: - - `from`: The type(s) to convert from. Can be a single string or an array of strings. Joi will only run `method` if the value `typeof` of the input value is equal to one of the provided values. - - `method`: A function with signature `function (value, helpers)` that coerces the input value where: - `value`: The input value. - `helpers`: [Validation helpers](#validation-helpers) - Must return an object with one of the following keys: - - `value`: The modified value. - - `errors`: Validation error(s) generated by `$_createError()` or `helpers.error()`. + You can also pass an object where: + - `from`: The type(s) to convert from. Can be a single string or an array of strings. Joi will only run `method` if the value `typeof` of the input value is equal to one of the provided values. + - `method`: A function with signature `function (value, helpers)` that coerces the input value where: + - `value`: The input value. + - `helpers`: [Validation helpers](#validation-helpers) - If `errors` is defined, validation will abort regardless of `abortEarly`. Refer to the validation process above for further information. + Must return an object with one of the following keys: + - `value`: The modified value. + - `errors`: Validation error(s) generated by `$_createError()` or `helpers.error()`. + + If `errors` is defined, validation will abort regardless of `abortEarly`. Refer to the validation process above for further information. - `validate`: A function with signature `function (value, helpers) {}` that performs base validation on the input value where: - - `value`: The input value. - - `helpers`: [Validation helpers](#validation-helpers) + - `value`: The input value. + - `helpers`: [Validation helpers](#validation-helpers) - Must return an object with one of the following keys: - - `value`: The modified value. - - `errors`: Validation error(s) generated by `$_createError()` or `helpers.error()`. + Must return an object with one of the following keys: + - `value`: The modified value. + - `errors`: Validation error(s) generated by `$_createError()` or `helpers.error()`. - If `errors` is defined, validation will abort regardless of `abortEarly`. Refer to the validation process above for further information. + If `errors` is defined, validation will abort regardless of `abortEarly`. Refer to the validation process above for further information. - `rules`: A hash of validation rule names and their implementation where: - - `alias`: Aliases of the rule. Can be a string or an array of strings. - - `args`: An array of argument names or an object that define the parameters the rule will accept where: - - `name`: The argument name. - - `ref`: Whether this argument allows references. Joi will resolve them before passing to `validate`. Defaults to `false`. - - `assert`: A function of signature `function (value) {}` that validates the argument by returning a boolean. Also accepts a Joi schema. This key is required if `ref` is set to `true`. - - `normalize`: A function of signature `function (value) {}` that normalizes the argument before passing it to `assert`. - - `message`: A message to throw if `assert` is a function. This key is forbidden if `assert` is a schema. - - `convert`: Whether this is a dual rule that converts the input value and validates it at the same time. Defaults to `false`. - - `manifest`: Whether this rule should be outputted in the schema's description. Defaults to `true`. - - `method`: The method that will be attached onto the schema instance. Useful when you need to set flags. If set to `undefined`, Joi will default to a function that when called will add the rule to the rules queue. If set to `false`, the no method will be added to the instance. - - `multi`: Whether this rule can be invoked multiple times. Defaults to `false`. - - `validate`: A function of signature `function (value, helpers, args, rule)` that validates the input value where: - - `value`: The input value. - - `helpers`: [Validation helpers](#validation-helpers) - - `args`: Resolved and validated arguments mapped by their names. - - `rule`: The rule definitions passed to `$_addRule` left untouched. Useful if you need access to the raw arguments before validation. + - `alias`: Aliases of the rule. Can be a string or an array of strings. + - `args`: An array of argument names or an object that define the parameters the rule will accept where: + - `name`: The argument name. + - `ref`: Whether this argument allows references. Joi will resolve them before passing to `validate`. Defaults to `false`. + - `assert`: A function of signature `function (value) {}` that validates the argument by returning a boolean. Also accepts a Joi schema. This key is required if `ref` is set to `true`. + - `normalize`: A function of signature `function (value) {}` that normalizes the argument before passing it to `assert`. + - `message`: A message to throw if `assert` is a function. This key is forbidden if `assert` is a schema. + - `convert`: Whether this is a dual rule that converts the input value and validates it at the same time. Defaults to `false`. + - `manifest`: Whether this rule should be outputted in the schema's description. Defaults to `true`. + - `method`: The method that will be attached onto the schema instance. Useful when you need to set flags. If set to `undefined`, Joi will default to a function that when called will add the rule to the rules queue. If set to `false`, the no method will be added to the instance. + - `multi`: Whether this rule can be invoked multiple times. Defaults to `false`. + - `validate`: A function of signature `function (value, helpers, args, rule)` that validates the input value where: + - `value`: The input value. + - `helpers`: [Validation helpers](#validation-helpers) + - `args`: Resolved and validated arguments mapped by their names. + - `rule`: The rule definitions passed to `$_addRule` left untouched. Useful if you need access to the raw arguments before validation. - `overrides`: A hash of method names and their overridden implementation. To refer to the parent method, use [`$_parent()`](#\_parentmethod-args) ```js const Joi = require('joi'); const custom = Joi.extend((joi) => { - return { - type: 'million', - base: joi.number(), - messages: { - 'million.base': '{{#label}} must be at least a million', - 'million.big': '{{#label}} must be at least five millions', - 'million.round': '{{#label}} must be a round number', - 'million.dividable': '{{#label}} must be dividable by {{#q}}', - }, - coerce(value, helpers) { - // Only called when prefs.convert is true - - if (helpers.schema.$_getRule('round')) { - return { value: Math.round(value) }; - } - }, - validate(value, helpers) { - // Base validation regardless of the rules applied - - if (value < 1000000) { - return { value, errors: helpers.error('million.base') }; - } - - // Check flags for global state - - if (helpers.schema.$_getFlag('big') && value < 5000000) { - return { value, errors: helpers.error('million.big') }; - } - }, - rules: { - big: { - alias: 'large', - method() { - return this.$_setFlag('big', true); - }, - }, - round: { - convert: true, // Dual rule: converts or validates - method() { - return this.$_addRule('round'); + return { + type: 'million', + base: joi.number(), + messages: { + 'million.base': '{{#label}} must be at least a million', + 'million.big': '{{#label}} must be at least five millions', + 'million.round': '{{#label}} must be a round number', + 'million.dividable': '{{#label}} must be dividable by {{#q}}', }, - validate(value, helpers, args, options) { - // Only called when prefs.convert is false (due to rule convert option) + coerce(value, helpers) { + // Only called when prefs.convert is true - if (value % 1 !== 0) { - return helpers.error('million.round'); - } - }, - }, - dividable: { - multi: true, // Rule supports multiple invocations - method(q) { - return this.$_addRule({ name: 'dividable', args: { q } }); + if (helpers.schema.$_getRule('round')) { + return { value: Math.round(value) }; + } }, - args: [ - { - name: 'q', - ref: true, - assert: (value) => typeof value === 'number' && !isNaN(value), - message: 'must be a number', - }, - ], - validate(value, helpers, args, options) { - if (value % args.q === 0) { - return value; // Value is valid - } + validate(value, helpers) { + // Base validation regardless of the rules applied - return helpers.error('million.dividable', { q: args.q }); - }, - }, - even: { - method() { - // Rule with only method used to alias another rule + if (value < 1000000) { + return { value, errors: helpers.error('million.base') }; + } - return this.dividable(2); + // Check flags for global state + + if (helpers.schema.$_getFlag('big') && value < 5000000) { + return { value, errors: helpers.error('million.big') }; + } }, - }, - }, - }; + rules: { + big: { + alias: 'large', + method() { + return this.$_setFlag('big', true); + }, + }, + round: { + convert: true, // Dual rule: converts or validates + method() { + return this.$_addRule('round'); + }, + validate(value, helpers, args, options) { + // Only called when prefs.convert is false (due to rule convert option) + + if (value % 1 !== 0) { + return helpers.error('million.round'); + } + }, + }, + dividable: { + multi: true, // Rule supports multiple invocations + method(q) { + return this.$_addRule({ name: 'dividable', args: { q } }); + }, + args: [ + { + name: 'q', + ref: true, + assert: (value) => + typeof value === 'number' && !isNaN(value), + message: 'must be a number', + }, + ], + validate(value, helpers, args, options) { + if (value % args.q === 0) { + return value; // Value is valid + } + + return helpers.error('million.dividable', { q: args.q }); + }, + }, + even: { + method() { + // Rule with only method used to alias another rule + + return this.dividable(2); + }, + }, + }, + }; }); const schema = custom.object({ - a: custom.million().round().dividable(Joi.ref('b')), - b: custom.number(), - c: custom.million().even().dividable(7), - d: custom.million().round().prefs({ convert: false }), - e: custom.million().large(), + a: custom.million().round().dividable(Joi.ref('b')), + b: custom.number(), + c: custom.million().even().dividable(7), + d: custom.million().round().prefs({ convert: false }), + e: custom.million().large(), }); ``` @@ -3437,9 +3442,9 @@ const schema = custom.object({ - `schema`: The reference to the current schema. Useful if you need to use any of the [Advanced functions](#advanced-functions). - `state`: The current validation state. See [Validation state](#validation-state). - `error`: A function with signature `function (code, local, localState = currentState) {}` similar to [`$_createError()`](#\_createerrorcode-value-local-state-prefs-options) but with the current value, validation options, current state passed where: - - `code`: The error code. - - `local`: Local context used to interpolate the message. - - `localState`: The localized state. + - `code`: The error code. + - `local`: Local context used to interpolate the message. + - `localState`: The localized state. - `errorsArray`: A function that creates an array that can be recognised by Joi as a valid error array. **Note that using a native JS array can cause Joi to output incorrect results.** - `warn`: TODO - `message`: TODO @@ -3480,10 +3485,10 @@ TODO Adds a rule to the rules queue where: - `options`: A rule name string or rule options where: - - `name`: The name of the rule. - - `args`: The arguments to be processed. - - `method`: The name of another rule to reuse. - You can also pass extra properties and they will be accessible within the `rule` argument of the `validate` method. + - `name`: The name of the rule. + - `args`: The arguments to be processed. + - `method`: The name of another rule to reuse. + You can also pass extra properties and they will be accessible within the `rule` argument of the `validate` method. #### $\_compile(schema, options) @@ -3550,7 +3555,7 @@ Sets a flag where: - `name`: The flag name to set. - `value`: The value to set the flag to. - `options`: Optional options where: - - `clone`: Whether to clone the schema. Defaults to `true`. Only set to `false` if the schema has already been cloned before. + - `clone`: Whether to clone the schema. Defaults to `true`. Only set to `false` if the schema has already been cloned before. #### $\_validate(value, state, prefs) @@ -3571,14 +3576,14 @@ Performs validation against the current schema without the extra overhead of mer - `name` - `'ValidationError'`. - `isJoi` - `true`. - `details` - an array of errors : - - `message` - string with a description of the error. - - `path` - ordered array where each element is the accessor to the value where the error happened. - - `type` - type of the error. - - `context` - object providing context of the error containing: - - `key` - key of the value that erred, equivalent to the last element of `details.path`. - - `label` - label of the value that erred, or the `key` if any, or the default `messages.root`. - - `value` - the value that failed validation. - - other error specific properties as described for each error code. + - `message` - string with a description of the error. + - `path` - ordered array where each element is the accessor to the value where the error happened. + - `type` - type of the error. + - `context` - object providing context of the error containing: + - `key` - key of the value that erred, equivalent to the last element of `details.path`. + - `label` - label of the value that erred, or the `key` if any, or the default `messages.root`. + - `value` - the value that failed validation. + - other error specific properties as described for each error code. - `annotate()` - function that returns a string with an annotated version of the object pointing at the places where errors occurred. Takes an optional parameter that, if truthy, will strip the colors out of the output. @@ -3618,7 +3623,7 @@ Additional local context properties: ```ts { - types: Array; // The list of expected types + types: Array; // The list of expected types } ``` @@ -3630,7 +3635,7 @@ Additional local context properties: ```ts { - error: Error; // The error thrown + error: Error; // The error thrown } ``` @@ -3642,7 +3647,7 @@ Additional local context properties: ```ts { - error: Error; // Error generated during the default value function call + error: Error; // Error generated during the default value function call } ``` @@ -3654,7 +3659,7 @@ Additional local context properties: ```ts { - error: Error; // Error generated during the failover value function call + error: Error; // Error generated during the failover value function call } ``` @@ -3666,7 +3671,7 @@ Additional local context properties: ```ts { - invalids: Array; // Contains the list of the invalid values that should be rejected + invalids: Array; // Contains the list of the invalid values that should be rejected } ``` @@ -3678,7 +3683,7 @@ Additional local context properties: ```ts { - valids: Array; // Contains the list of the valid values that were expected + valids: Array; // Contains the list of the valid values that were expected } ``` @@ -3716,7 +3721,7 @@ Additional local context properties: ```ts { - pos: number; // Index where the value was found in the array + pos: number; // Index where the value was found in the array } ``` @@ -3741,7 +3746,7 @@ Additional local context properties: ```ts { - knownMisses: Array; // Labels of all the missing values + knownMisses: Array; // Labels of all the missing values } ``` @@ -3753,7 +3758,7 @@ Additional local context properties: ```ts { - unknownMisses: number; // Count of missing values that didn't have a label + unknownMisses: number; // Count of missing values that didn't have a label } ``` @@ -3765,7 +3770,7 @@ Additional local context properties: ```ts { - pos: number; // Index where the value was found in the array + pos: number; // Index where the value was found in the array } ``` @@ -3777,7 +3782,7 @@ Additional local context properties: ```ts { - limit: number; // Length that was expected for this array + limit: number; // Length that was expected for this array } ``` @@ -3789,7 +3794,7 @@ Additional local context properties: ```ts { - limit: number; // Maximum length that was expected for this array + limit: number; // Maximum length that was expected for this array } ``` @@ -3801,7 +3806,7 @@ Additional local context properties: ```ts { - limit: number; // Minimum length that was expected for this array + limit: number; // Minimum length that was expected for this array } ``` @@ -3843,7 +3848,7 @@ Additional local context properties: ```ts { - type: string; // The unsupported array item type + type: string; // The unsupported array item type } ``` @@ -3855,7 +3860,7 @@ Additional local context properties: ```ts { - pos: number; // Index where an undefined value was found in the array + pos: number; // Index where an undefined value was found in the array } ``` @@ -3881,7 +3886,7 @@ Additional local context properties: ```ts { - patternLabel: string; // Label of assertion schema + patternLabel: string; // Label of assertion schema } ``` @@ -3901,7 +3906,7 @@ Additional local context properties: ```ts { - limit: number; // Length that was expected for this buffer + limit: number; // Length that was expected for this buffer } ``` @@ -3913,7 +3918,7 @@ Additional local context properties: ```ts { - limit: number; // Maximum length that was expected for this buffer + limit: number; // Maximum length that was expected for this buffer } ``` @@ -3925,7 +3930,7 @@ Additional local context properties: ```ts { - limit: number; // Minimum length that was expected for this buffer + limit: number; // Minimum length that was expected for this buffer } ``` @@ -3945,7 +3950,7 @@ Additional local context properties: ```ts { - format: string; // The required format + format: string; // The required format } ``` @@ -3957,7 +3962,7 @@ Additional local context properties: ```ts { - limit: Date; // Maximum date + limit: Date; // Maximum date } ``` @@ -3969,7 +3974,7 @@ Additional local context properties: ```ts { - limit: Date; // Minimum date + limit: Date; // Minimum date } ``` @@ -3981,7 +3986,7 @@ Additional local context properties: ```ts { - limit: Date; // Maximum date + limit: Date; // Maximum date } ``` @@ -3993,7 +3998,7 @@ Additional local context properties: ```ts { - limit: Date; // Minimum date + limit: Date; // Minimum date } ``` @@ -4009,7 +4014,7 @@ Additional local context properties: ```ts { - n: number; // Expected arity + n: number; // Expected arity } ``` @@ -4025,7 +4030,7 @@ Additional local context properties: ```ts { - n: number; // Maximum expected arity + n: number; // Maximum expected arity } ``` @@ -4037,10 +4042,14 @@ Additional local context properties: ```ts { - n: number; // Minimum expected arity + n: number; // Minimum expected arity } ``` +#### `link.depth` + +The validation chain exceeded the runtime call stack while resolving a recursive link. Returned instead of throwing a `RangeError`. + #### `number.base` The value is not a number or could not be cast to a number. @@ -4053,7 +4062,7 @@ Additional local context properties: ```ts { - limit: number; // Minimum value that was expected for this number + limit: number; // Minimum value that was expected for this number } ``` @@ -4073,7 +4082,7 @@ Additional local context properties: ```ts { - limit: number; // Maximum value that was expected for this number + limit: number; // Maximum value that was expected for this number } ``` @@ -4085,7 +4094,7 @@ Additional local context properties: ```ts { - limit: number; // Maximum value that was expected for this number + limit: number; // Maximum value that was expected for this number } ``` @@ -4097,7 +4106,7 @@ Additional local context properties: ```ts { - limit: number; // Minimum value that was expected for this number + limit: number; // Minimum value that was expected for this number } ``` @@ -4109,7 +4118,7 @@ Additional local context properties: ```ts { - multiple: number; // The number of which the input is supposed to be a multiple of + multiple: number; // The number of which the input is supposed to be a multiple of } ``` @@ -4133,7 +4142,7 @@ Additional local context properties: ```ts { - limit: number; // The precision that it should have had + limit: number; // The precision that it should have had } ``` @@ -4149,7 +4158,7 @@ Additional local context properties: ```ts { - child: string; // Property that is unexpected + child: string; // Property that is unexpected } ``` @@ -4189,7 +4198,7 @@ Additional local context properties: ```ts { - type: string; // The expected type + type: string; // The expected type } ``` @@ -4201,7 +4210,7 @@ Additional local context properties: ```ts { - limit: number; // Number of keys that was expected for this object + limit: number; // Number of keys that was expected for this object } ``` @@ -4213,7 +4222,7 @@ Additional local context properties: ```ts { - limit: number; // Maximum number of keys + limit: number; // Maximum number of keys } ``` @@ -4225,7 +4234,7 @@ Additional local context properties: ```ts { - limit: number; // Minimum number of keys + limit: number; // Minimum number of keys } ``` @@ -4315,7 +4324,7 @@ Additional local context properties: ```ts { - type: string; // The required schema + type: string; // The required schema } ``` @@ -4327,7 +4336,7 @@ Additional local context properties: ```ts { - type: string; // Type name the object should have been + type: string; // Type name the object should have been } ``` @@ -4419,7 +4428,7 @@ Additional local context properties: ```ts { - invalids: [string]; // Array of invalid emails + invalids: [string]; // Array of invalid emails } ``` @@ -4464,7 +4473,7 @@ Additional local context properties: ```ts { - cidr: string; // CIDR used for the validation + cidr: string; // CIDR used for the validation } ``` @@ -4527,7 +4536,7 @@ Additional local context properties: ```ts { - form: string; // Normalization form that is expected + form: string; // Normalization form that is expected } ``` @@ -4607,7 +4616,7 @@ Additional local context properties: ```ts { - scheme: string; // Scheme prefix that is expected in the URI + scheme: string; // Scheme prefix that is expected in the URI } ``` diff --git a/generated/markdown/joi/18/api.md b/generated/markdown/joi/18/api.md index 9d11488..21b8c90 100644 --- a/generated/markdown/joi/18/api.md +++ b/generated/markdown/joi/18/api.md @@ -8,24 +8,24 @@ const Joi = require('joi'); const schema = Joi.object({ - username: Joi.string().alphanum().min(3).max(30).required(), + username: Joi.string().alphanum().min(3).max(30).required(), - password: Joi.string().pattern(new RegExp('^[a-zA-Z0-9]{3,30}$')), + password: Joi.string().pattern(new RegExp('^[a-zA-Z0-9]{3,30}$')), - repeat_password: Joi.ref('password'), + repeat_password: Joi.ref('password'), - access_token: [Joi.string(), Joi.number()], + access_token: [Joi.string(), Joi.number()], - birth_year: Joi.number().integer().min(1900).max(2013), + birth_year: Joi.number().integer().min(1900).max(2013), - email: Joi.string().email({ - minDomainSegments: 2, - tlds: { allow: ['com', 'net'] }, - }), + email: Joi.string().email({ + minDomainSegments: 2, + tlds: { allow: ['com', 'net'] }, + }), }) - .with('username', 'birth_year') - .xor('password', 'access_token') - .with('password', 'repeat_password'); + .with('username', 'birth_year') + .xor('password', 'access_token') + .with('password', 'repeat_password'); schema.validate({ username: 'abc', birth_year: 1994 }); // -> { value: { username: 'abc', birth_year: 1994 } } @@ -36,33 +36,33 @@ schema.validate({}); // Also - try { - const value = await schema.validateAsync({ - username: 'abc', - birth_year: 1994, - }); + const value = await schema.validateAsync({ + username: 'abc', + birth_year: 1994, + }); } catch (err) {} ``` The above schema defines the following constraints: - `username` - - a required string - - must contain only alphanumeric characters - - at least 3 characters long but no more than 30 - - must be accompanied by `birth_year` + - a required string + - must contain only alphanumeric characters + - at least 3 characters long but no more than 30 + - must be accompanied by `birth_year` - `password` - - an optional string - - must satisfy the custom regex pattern - - cannot appear together with `access_token` - - must be accompanied by `repeat_password` and equal to it + - an optional string + - must satisfy the custom regex pattern + - cannot appear together with `access_token` + - must be accompanied by `repeat_password` and equal to it - `access_token` - - an optional, unconstrained string or number + - an optional, unconstrained string or number - `birth_year` - - an integer between 1900 and 2013 + - an integer between 1900 and 2013 - `email` - - a valid email address string - - must have two domain parts e.g. `example.com` - - TLD must be `.com` or `.net` + - a valid email address string + - must have two domain parts e.g. `example.com` + - TLD must be `.com` or `.net` ### General Usage @@ -72,7 +72,7 @@ First, a schema is constructed using the provided types and constraints: ```js const schema = Joi.object({ - a: Joi.string(), + a: Joi.string(), }); ``` @@ -100,7 +100,7 @@ the module converts it internally to an object() type equivalent to: ```js const schema = Joi.object().keys({ - a: Joi.string(), + a: Joi.string(), }); ``` @@ -108,17 +108,17 @@ When validating a schema: - Values (or keys in case of objects) are optional by default. - ```js - Joi.string().validate(undefined); // validates fine - ``` + ```js + Joi.string().validate(undefined); // validates fine + ``` - To disallow this behavior, you can either set the schema as `required()`, or set `presence` to `"required"` when passing `options`: + To disallow this behavior, you can either set the schema as `required()`, or set `presence` to `"required"` when passing `options`: - ```js - Joi.string().required().validate(undefined); - // or - Joi.string().validate(undefined, /* options */ { presence: 'required' }); - ``` + ```js + Joi.string().required().validate(undefined); + // or + Joi.string().validate(undefined, /* options */ { presence: 'required' }); + ``` - Strings are utf-8 encoded by default. - Rules are defined in an additive fashion and evaluated in order, first the inclusive rules, then the exclusive rules. @@ -156,8 +156,8 @@ Provisions a simple LRU cache for caching simple inputs (`undefined`, `null`, st booleans) where: - `options` - optional settings: - - `max` - number of items to store in the cache before the least used items are dropped. - Defaults to `1000`. + - `max` - number of items to store in the cache before the least used items are dropped. + Defaults to `1000`. ### `checkPreferences(prefs)` @@ -179,10 +179,10 @@ Converts literal schema definition to **joi** schema object (or returns the same - `schema` - the schema definition to compile. - `options` - optional settings: - - `legacy` - if `true` and the provided schema is (or contains parts) using an older version of - **joi**, will return a compiled schema that is compatible with the older version. If `false`, - the schema is always compiled using the current version and if older schema components are - found, an error is thrown. + - `legacy` - if `true` and the provided schema is (or contains parts) using an older version of + **joi**, will return a compiled schema that is compatible with the older version. If `false`, + the schema is always compiled using the current version and if older schema components are + found, an error is thrown. ```js const definition = ['key', 5, { a: true, b: [/^a/, 'boom'] }]; @@ -191,15 +191,15 @@ const schema = Joi.compile(definition); // Same as: const schema = Joi.alternatives().try( - Joi.string().valid('key'), - Joi.number().valid(5), - Joi.object({ - a: Joi.boolean().valid(true), - b: Joi.alternatives().try( - Joi.string().pattern(/^a/), - Joi.string().valid('boom'), - ), - }), + Joi.string().valid('key'), + Joi.number().valid(5), + Joi.object({ + a: Joi.boolean().valid(true), + b: Joi.alternatives().try( + Joi.string().pattern(/^a/), + Joi.string().valid('boom'), + ), + }), ); ``` @@ -212,14 +212,14 @@ where: ```js const custom = Joi.defaults((schema) => { - switch (schema.type) { - case 'string': - return schema.allow(''); - case 'object': - return schema.min(1); - default: - return schema; - } + switch (schema.type) { + case 'string': + return schema.allow(''); + case 'object': + return schema.min(1); + default: + return schema; + } }); const schema = custom.object(); // Returns Joi.object().min(1) @@ -232,7 +232,7 @@ Generates a dynamic expression using a template string where: - `template` - the template string using the [template syntax](#template-syntax). - `options` - optional settings used when creating internal references. Supports the same options as [`ref()`](#refkey-options), in addition to those options: - - `functions` - an object with keys being function names and values being their implementation that will be executed when used in the expression. Using the same name as a built-in function will result in a local override. Note: carefully check your arguments depending on the situation where the expression is used. + - `functions` - an object with keys being function names and values being their implementation that will be executed when used in the expression. Using the same name as a built-in function will result in a local override. Note: carefully check your arguments depending on the situation where the expression is used. #### Template syntax @@ -282,8 +282,8 @@ Can only be used in rules that support in-references. ```js const schema = Joi.object({ - a: Joi.array().items(Joi.number()), - b: Joi.number().valid(Joi.in('a')), + a: Joi.array().items(Joi.number()), + b: Joi.number().valid(Joi.in('a')), }); ``` @@ -319,7 +319,7 @@ Checks whether or not the provided argument is a **joi** schema where: - `schema` - the value being checked. - `options` - optional settings: - - `legacy` - if `true`, will identify schemas from older versions of joi, otherwise will throw an error. Defaults to `false`. + - `legacy` - if `true`, will identify schemas from older versions of joi, otherwise will throw an error. Defaults to `false`. ```js const schema = Joi.any(); @@ -354,27 +354,27 @@ References support the following arguments: - `key` - the reference target. References can point to sibling keys (`a.b`) or ancestor keys (`...a.b`) using the `.` separator. If a `key` starts with `$` is signifies a context reference which is looked up in the `context` option object. The `key` can start with one or more separator characters to indicate a [relative starting point](#Relative-references). - `options` - optional settings: - - `adjust` - a function with the signature `function(value)` where `value` is the resolved reference value and the return value is the adjusted value to use. For example `(value) => value + 5` will add 5 to the resolved value. Note that the `adjust` feature will not perform any type validation on the adjusted value and it must match the value expected by the rule it is used in. Cannot be used with `map`. - - `map` - an array of array pairs using the format `[[key, value], [key, value]]` used to maps the resolved reference value to another value. If the resolved value is not in the map, it is returned as-is. Cannot be used with `adjust`. - - `prefix` - overrides default prefix characters key string prefix. Can be set to `false` to disable all prefix parsing (treat keys as literal strings), or an object with specific overrides for: - - `global` - references to the globally provided `context` preference. Defaults to `'$'`. - - `local` - references to error-specific or rule specific context. Defaults to `'#'`. - - `root` - references to the root value being validated. Defaults to `'/'`. - - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the `key` as a literal value. - - `ancestor` - if set to a number, sets the reference [relative starting point](#Relative-references). Cannot be combined with separator prefix characters. Defaults to the reference key prefix (or `1` if none present). - - `in` - creates an [in-reference](#inref-options). - - `iterables` - when `true`, the reference resolves by reaching into maps and sets. - - `render` - when `true`, the value of the reference is used instead of its name in error messages and template rendering. Defaults to `false`. + - `adjust` - a function with the signature `function(value)` where `value` is the resolved reference value and the return value is the adjusted value to use. For example `(value) => value + 5` will add 5 to the resolved value. Note that the `adjust` feature will not perform any type validation on the adjusted value and it must match the value expected by the rule it is used in. Cannot be used with `map`. + - `map` - an array of array pairs using the format `[[key, value], [key, value]]` used to maps the resolved reference value to another value. If the resolved value is not in the map, it is returned as-is. Cannot be used with `adjust`. + - `prefix` - overrides default prefix characters key string prefix. Can be set to `false` to disable all prefix parsing (treat keys as literal strings), or an object with specific overrides for: + - `global` - references to the globally provided `context` preference. Defaults to `'$'`. + - `local` - references to error-specific or rule specific context. Defaults to `'#'`. + - `root` - references to the root value being validated. Defaults to `'/'`. + - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the `key` as a literal value. + - `ancestor` - if set to a number, sets the reference [relative starting point](#Relative-references). Cannot be combined with separator prefix characters. Defaults to the reference key prefix (or `1` if none present). + - `in` - creates an [in-reference](#inref-options). + - `iterables` - when `true`, the reference resolves by reaching into maps and sets. + - `render` - when `true`, the value of the reference is used instead of its name in error messages and template rendering. Defaults to `false`. Note that references can only be used where explicitly supported such as in `valid()` or `invalid()` rules. If upwards (parents) references are needed, use [`object.assert()`](#objectassertref-schema-message). ```js const schema = Joi.object({ - a: Joi.ref('b.c'), - b: { - c: Joi.any(), - }, - c: Joi.ref('$x'), + a: Joi.ref('b.c'), + b: { + c: Joi.any(), + }, + c: Joi.ref('$x'), }); await schema.validateAsync({ a: 5, b: { c: 5 } }, { context: { x: 5 } }); @@ -481,7 +481,7 @@ const Joi = require('joi'); const { object, string } = Joi.types(); const schema = object.keys({ - property: string.min(4), + property: string.min(4), }); ``` @@ -515,8 +515,8 @@ To create an exclusive list of values, see [`any.valid(value)`](#anyvalidvalues- ```js const schema = { - a: Joi.any().allow('a'), - b: Joi.any().allow('b', 'B'), + a: Joi.any().allow('a'), + b: Joi.any().allow('b', 'B'), }; ``` @@ -530,10 +530,10 @@ is called where: ```js const schema = Joi.object({ - key: Joi.string().alter({ - get: (schema) => schema.required(), - post: (schema) => schema.forbidden(), - }), + key: Joi.string().alter({ + get: (schema) => schema.required(), + post: (schema) => schema.forbidden(), + }), }); const getSchema = schema.tailor('get'); @@ -548,10 +548,10 @@ Assigns the schema an artifact id which is included in the validation result if ```js const schema = { - a: [ - Joi.number().max(10).artifact('under'), - Joi.number().min(11).artifact('over'), - ], + a: [ + Joi.number().max(10).artifact('under'), + Joi.number().min(11).artifact('over'), + ], }; ``` @@ -599,10 +599,10 @@ Note that `key` and `value` can be anything including objects, array, etc. It is Casts the validated value to the specified type where: - `to` - the value target type. Each **joi** schema type supports its own set of cast targets: - - `'map'` - supported by the `Joi.object()` type, converts the result to a `Map` object containing the object key-value pairs. - - `'number'` - supported by `Joi.boolean()` and `Joi.date()`, converts the result to a number. For dates, number of milliseconds since the epoch and for booleans, `0` for `false` and `1` for `true`. - - `'set'` - supported by the `Joi.array()` type, converts the result to a `Set` object containing the array values. - - `'string'` - supported by `Joi.binary()`, `Joi.boolean()`, `Joi.date()`, and `Joi.number()`, converts the result to a string. + - `'map'` - supported by the `Joi.object()` type, converts the result to a `Map` object containing the object key-value pairs. + - `'number'` - supported by `Joi.boolean()` and `Joi.date()`, converts the result to a number. For dates, number of milliseconds since the epoch and for booleans, `0` for `false` and `1` for `true`. + - `'set'` - supported by the `Joi.array()` type, converts the result to a `Set` object containing the array values. + - `'string'` - supported by `Joi.binary()`, `Joi.boolean()`, `Joi.date()`, and `Joi.number()`, converts the result to a string. #### `any.concat(schema)` @@ -621,42 +621,42 @@ const ab = a.concat(b); Adds a custom validation function to execute arbitrary code where: - `method` - the custom (synchronous only) validation function using signature `function(value, helpers)` where: - - `value` - the value being validated. - - `helpers` - an object with the following helpers: - - `schema` - the current schema. - - `state` - the current validation state. - - `prefs` - the current preferences. - - `original` - the original value passed into validation before any conversions. - - `error(code, [local], [localState])` - a method to generate error codes using a message code, optional local context and optional validation local state. - - `message(messages, [local])` - a method to generate an error with an internal `'custom'` error code and the provided messages object to use as override. Note that this is much slower than using the preferences `messages` option but is much simpler to write when performance is not important. - - `warn(code, [local])` - a method to add a warning using a message code and optional local context. + - `value` - the value being validated. + - `helpers` - an object with the following helpers: + - `schema` - the current schema. + - `state` - the current validation state. + - `prefs` - the current preferences. + - `original` - the original value passed into validation before any conversions. + - `error(code, [local], [localState])` - a method to generate error codes using a message code, optional local context and optional validation local state. + - `message(messages, [local])` - a method to generate an error with an internal `'custom'` error code and the provided messages object to use as override. Note that this is much slower than using the preferences `messages` option but is much simpler to write when performance is not important. + - `warn(code, [local])` - a method to add a warning using a message code and optional local context. Note: if the method fails to return a value, the value will be unset or returned as `undefined`. ```js const method = (value, helpers) => { - // Throw an error (will be replaced with 'any.custom' error) - if (value === '1') { - throw new Error('nope'); - } - - // Replace value with a new value - if (value === '2') { - return '3'; - } - - // Use error to return an existing error code - if (value === '4') { - return helpers.error('any.invalid'); - } - - // Override value with undefined to unset - if (value === '5') { - return undefined; - } - - // Return the value unchanged - return value; + // Throw an error (will be replaced with 'any.custom' error) + if (value === '1') { + throw new Error('nope'); + } + + // Replace value with a new value + if (value === '2') { + return '3'; + } + + // Use error to return an existing error code + if (value === '4') { + return helpers.error('any.invalid'); + } + + // Override value with undefined to unset + if (value === '5') { + return undefined; + } + + // Return the value unchanged + return value; }; const schema = Joi.string().custom(method, 'custom validation'); @@ -669,11 +669,11 @@ Possible validation errors: [`any.custom`](#anycustom) Sets a default value if the original value is `undefined` where: - `value` - the default value. One of: - - a literal value (string, number, object, etc.). - - a [references](#refkey-options). - - a function which returns the default value using the signature `function(parent, helpers)` where: - - `parent` - a clone of the object containing the value being validated. Note that since specifying a `parent` argument performs cloning, do not declare format arguments if you are not using them. - - `helpers` - same as those described in [`any.custom()`](#anycustommethod_description). + - a literal value (string, number, object, etc.). + - a [references](#refkey-options). + - a function which returns the default value using the signature `function(parent, helpers)` where: + - `parent` - a clone of the object containing the value being validated. Note that since specifying a `parent` argument performs cloning, do not declare format arguments if you are not using them. + - `helpers` - same as those described in [`any.custom()`](#anycustommethod_description). When called without any `value` on an object schema type, a default value will be automatically generated based on the default values of the object keys. @@ -681,22 +681,22 @@ Note that if `value` is an object, any changes to the object after `default()` i ```js const generateUsername = (parent, helpers) => { - return parent.firstname.toLowerCase() + '-' + parent.lastname.toLowerCase(); + return parent.firstname.toLowerCase() + '-' + parent.lastname.toLowerCase(); }; generateUsername.description = 'generated username'; const schema = Joi.object({ - username: Joi.string().default(generateUsername), - firstname: Joi.string(), - lastname: Joi.string(), - created: Joi.date().default(Date.now), - status: Joi.string().default('registered'), + username: Joi.string().default(generateUsername), + firstname: Joi.string(), + lastname: Joi.string(), + created: Joi.date().default(Date.now), + status: Joi.string().default('registered'), }); const { value } = schema.validate({ - firstname: 'Jane', - lastname: 'Doe', + firstname: 'Jane', + lastname: 'Doe', }); // value.status === 'registered' @@ -732,7 +732,7 @@ Annotates the key where: ```js const schema = Joi.any().description( - 'this key will match anything you give it', + 'this key will match anything you give it', ); ``` @@ -754,8 +754,8 @@ schema.validate(''); // returns { error: "value" is not allowed to be empty, val Overrides the default **joi** error with a custom error if the rule fails where: - `err` can be: - - an instance of `Error` - the override error. - - a function with the signature `function(errors)`, where `errors` is an array of validation reports and it returns either a single `Error` or an array of validation reports. + - an instance of `Error` - the override error. + - a function with the signature `function(errors)`, where `errors` is an array of validation reports and it returns either a single `Error` or an array of validation reports. Do not use this method if you are simply trying to override the error message - use `any.message()` or `any.messages()` instead. This method is designed to override the **joi** validation error and return the exact override provided. It is useful when you want to return the result of validation directly (e.g. when using with a **hapi** server) and want to return a different HTTP error code than 400. @@ -768,28 +768,28 @@ schema.validate(3); // returns Error('Was REALLY expecting a string') ```js const schema = Joi.object({ - foo: Joi.number() - .min(0) - .error((errors) => new Error('"foo" requires a positive number')), + foo: Joi.number() + .min(0) + .error((errors) => new Error('"foo" requires a positive number')), }); schema.validate({ foo: -2 }); // returns new Error('"foo" requires a positive number') ``` ```js const schema = Joi.object({ - foo: Joi.number() - .min(0) - .error((errors) => { - return new Error( - 'found errors with ' + - errors - .map( - (err) => - `${err.local.key}(${err.local.limit}) with value ${err.local.value}`, - ) - .join(' and '), - ); - }), + foo: Joi.number() + .min(0) + .error((errors) => { + return new Error( + 'found errors with ' + + errors + .map( + (err) => + `${err.local.key}(${err.local.limit}) with value ${err.local.value}`, + ) + .join(' and '), + ); + }), }); schema.validate({ foo: -2 }); // returns new Error('found errors with foo(0) with value -2') ``` @@ -800,7 +800,7 @@ Adds examples to the schema where: - `example` - adds an example. Note that no validation is performed on the value. - `options` - optional settings: - - `override` - if `true`, replaces any existing examples. Defaults to `false`. + - `override` - if `true`, replaces any existing examples. Defaults to `false`. ```js const schema = Joi.string().min(4).example('abcd'); @@ -812,16 +812,16 @@ Adds an external validation rule where: - `method` - an async or sync function with signature `function(value, helpers)` which can either return a replacement value, `undefined` to indicate no change, or throw an error, where: - - `value` - a clone of the object containing the value being validated. - - `helpers` - an object with the following helpers: - - `schema` - the current schema. - - `linked` - if the schema is a link, the schema it links to. - - `state` - the current validation state. - - `prefs` - the current preferences. - - `original` - the original value passed into validation before any conversions. - - `error(code, [local])` - a method to generate error codes using a message code and optional local context. - - `message(messages, [local])` - a method to generate an error with an internal `'external'` error code and the provided messages object to use as override. Note that this is much slower than using the preferences `messages` option but is much simpler to write when performance is not important. - - `warn(code, [local])` - a method to add a warning using a message code and optional local context. + - `value` - a clone of the object containing the value being validated. + - `helpers` - an object with the following helpers: + - `schema` - the current schema. + - `linked` - if the schema is a link, the schema it links to. + - `state` - the current validation state. + - `prefs` - the current preferences. + - `original` - the original value passed into validation before any conversions. + - `error(code, [local])` - a method to generate error codes using a message code and optional local context. + - `message(messages, [local])` - a method to generate an error with an internal `'external'` error code and the provided messages object to use as override. Note that this is much slower than using the preferences `messages` option but is much simpler to write when performance is not important. + - `warn(code, [local])` - a method to add a warning using a message code and optional local context. - `description` - optional string used to document the purpose of the method. Note that external validation rules are only called after the all other validation rules for the @@ -870,7 +870,7 @@ Marks a key as forbidden which will not allow any value except `undefined`. Used ```js const schema = { - a: Joi.any().forbidden(), + a: Joi.any().forbidden(), }; ``` @@ -904,8 +904,8 @@ Disallows values where: ```js const schema = { - a: Joi.any().invalid('a'), - b: Joi.any().invalid('b', 'B'), + a: Joi.any().invalid('a'), + b: Joi.any().invalid('b', 'B'), }; ``` @@ -930,7 +930,7 @@ Overrides the key name in error messages. ```js const schema = { - first_name: Joi.string().label('First Name'), + first_name: Joi.string().label('First Name'), }; ``` @@ -1039,9 +1039,9 @@ Set the result mode where: Applies a set of rule options to the current ruleset or last rule added where: - `options` - the rules to apply where: - - `keep` - if `true`, the rules will not be replaced by the same unique rule later. For example, `Joi.number().min(1).rule({ keep: true }).min(2)` will keep both `min()` rules instead of the later rule overriding the first. Defaults to `false`. - - `message` - a single message string or a messages object where each key is an error code and corresponding message string as value. The object is the same as the `messages` used as an option in [`any.validate()`](#anyvalidatevalue-options). The strings can be plain messages or a message template. - - `warn` - if `true`, turns any error generated by the ruleset to warnings. + - `keep` - if `true`, the rules will not be replaced by the same unique rule later. For example, `Joi.number().min(1).rule({ keep: true }).min(2)` will keep both `min()` rules instead of the later rule overriding the first. Defaults to `false`. + - `message` - a single message string or a messages object where each key is an error code and corresponding message string as value. The object is the same as the `messages` used as an option in [`any.validate()`](#anyvalidatevalue-options). The strings can be plain messages or a message template. + - `warn` - if `true`, turns any error generated by the ruleset to warnings. When applying rule options, the last rule (e.g. `min()`) is used unless there is an active ruleset defined (e.g. `$.min().max()`) in which case the options are applied to all the provided rules. Once `rule()` is called, the previous rules can no longer be modified and any active ruleset is terminated. @@ -1054,16 +1054,16 @@ Starts a ruleset in order to apply multiple [rule options](#anyruleoptions). The ```js const schema = Joi.number() - .ruleset.min(1) - .max(10) - .rule({ message: 'Number must be between 1 and 10' }); + .ruleset.min(1) + .max(10) + .rule({ message: 'Number must be between 1 and 10' }); ``` ```js const schema = Joi.number() - .$.min(1) - .max(10) - .rule({ message: 'Number must be between 1 and 10' }); + .$.min(1) + .max(10) + .rule({ message: 'Number must be between 1 and 10' }); ``` #### `any.shared(schema)` @@ -1074,11 +1074,11 @@ Registers a schema to be used by descendants of the current schema in named link ```js const schema = Joi.object({ - a: [Joi.string(), Joi.link('#x')], - b: Joi.link('#type.a'), + a: [Joi.string(), Joi.link('#x')], + b: Joi.link('#type.a'), }) - .shared(Joi.number().id('x')) - .id('type'); + .shared(Joi.number().id('x')) + .id('type'); ``` #### `any.strict(isStrict)` @@ -1101,8 +1101,8 @@ where: ```js const schema = Joi.object({ - username: Joi.string(), - password: Joi.string().strip(), + username: Joi.string(), + password: Joi.string().strip(), }); schema.validate({ username: 'test', password: 'hunter2' }); // result.value = { username: 'test' } @@ -1131,10 +1131,10 @@ Applies any assigned target alterations to a copy of the schema that were applie ```js const schema = Joi.object({ - key: Joi.string().alter({ - get: (schema) => schema.required(), - post: (schema) => schema.forbidden(), - }), + key: Joi.string().alter({ + get: (schema) => schema.required(), + post: (schema) => schema.forbidden(), + }), }); const getSchema = schema.tailor('get'); @@ -1159,8 +1159,8 @@ Adds the provided values into the allowed values list and marks them as the only ```js const schema = { - a: Joi.any().valid('a'), - b: Joi.any().valid('b', 'B'), + a: Joi.any().valid('a'), + b: Joi.any().valid('b', 'B'), }; ``` @@ -1172,43 +1172,43 @@ Validates a value using the current schema and options where: - `value` - the value being validated. - `options` - an optional object with the following optional keys: - - `abortEarly` - when `true`, stops validation on the first error, otherwise returns all the errors found. Defaults to `true`. - - `allowUnknown` - when `true`, allows object to contain unknown keys which are ignored. Defaults to `false`. - - `cache` - when `true`, schema caching is enabled (for schemas with explicit caching rules). Default to `true`. - - `context` - provides an external data set to be used in [references](#refkey-options). Can only be set as an external option to `validate()` and not using `any.prefs()`. - - `convert` - when `true`, attempts to cast values to the required types (e.g. a string to a number). Defaults to `true`. - - `dateFormat` - sets the string format used when converting dates to strings in error messages and casting. Options are: - - `'date'` - date string. - - `'iso'` - date time ISO string. This is the default. - - `'string'` - JS default date time string. - - `'time'` - time string. - - `'utc'` - UTC date time string. - - `debug` - when `true`, valid results and throw errors are decorated with a `debug` property which includes an array of the validation steps used to generate the returned result. Defaults to `false`. - - `errors` - error formatting settings: - - `escapeHtml` - when `true`, error message templates will escape special characters to HTML entities, for security purposes. Defaults to `false`. - - `label` - defines the value used to set the `label` context variable: - - `'path'` - the full path to the value being validated. This is the default value. - - `'key'` - the key of the value being validated. - - `false` - remove any label prefix from error message, including the `""`. - - `language` - the preferred language code for error messages. The value is matched against keys at the root of the `messages` object, and then the error code as a child key of that. Can be a reference to the value, global context, or local context which is the root value passed to the validation function. Note that references to the value are usually not what you want as they move around the value structure relative to where the error happens. Instead, either use the global context, or the absolute value (e.g. `Joi.ref('/variable')`); - - `render` - when `false`, skips rendering error templates. Useful when error messages are generated elsewhere to save processing time. Defaults to `true`. - - `stack` - when `true`, the main error will possess a stack trace, otherwise it will be disabled. Defaults to `false` for performance reasons. Has no effect on platforms other than V8/node.js as it uses the [Stack trace API](https://v8.dev/docs/stack-trace-api). - - `wrap` - overrides the way values are wrapped (e.g. `[]` around arrays, `""` around labels and variables prefixed with `:`). Each key can be set to a string with one (same character before and after the value) or two characters (first character before and second character after), or `false` to disable wrapping: - - `label` - the characters used around `{#label}` references. Defaults to `'"'`. - - `array` - the characters used around array values. Defaults to `'[]'`. - - `string` - the characters used around each array string values. Defaults to `false`. - - `wrapArrays` - if `true`, array values in error messages are wrapped in `[]`. Defaults to `true`. - - `externals` - if `false`, the external rules set with [`any.external()`](#anyexternalmethod-description) are ignored, which is required to ignore any external validations in synchronous mode (or an exception is thrown). Defaults to `true`. - - `messages` - overrides individual error messages. Defaults to no override (`{}`). Use the `'*'` error code as a catch-all for all error codes that do not have a message provided in the override. Messages use the same rules as [templates](#template-syntax). Variables in double braces `{{var}}` are HTML escaped if the option `errors.escapeHtml` is set to `true`. - - `noDefaults` - when `true`, do not apply default values. Defaults to `false`. - - `nonEnumerables` - when `true`, inputs are shallow cloned to include non-enumerable properties. Defaults to `false`. - - `presence` - sets the default presence requirements. Supported modes: `'optional'`, `'required'`, and `'forbidden'`. Defaults to `'optional'`. - - `skipFunctions` - when `true`, ignores unknown keys with a function value. Defaults to `false`. - - `stripUnknown` - remove unknown elements from objects and arrays. Defaults to `false`. - - when an `object` : - - `arrays` - set to `true` to remove unknown items from arrays. - - `objects` - set to `true` to remove unknown keys from objects. - - when `true`, it is equivalent to having `{ arrays: false, objects: true }`. + - `abortEarly` - when `true`, stops validation on the first error, otherwise returns all the errors found. Defaults to `true`. + - `allowUnknown` - when `true`, allows object to contain unknown keys which are ignored. Defaults to `false`. + - `cache` - when `true`, schema caching is enabled (for schemas with explicit caching rules). Default to `true`. + - `context` - provides an external data set to be used in [references](#refkey-options). Can only be set as an external option to `validate()` and not using `any.prefs()`. + - `convert` - when `true`, attempts to cast values to the required types (e.g. a string to a number). Defaults to `true`. + - `dateFormat` - sets the string format used when converting dates to strings in error messages and casting. Options are: + - `'date'` - date string. + - `'iso'` - date time ISO string. This is the default. + - `'string'` - JS default date time string. + - `'time'` - time string. + - `'utc'` - UTC date time string. + - `debug` - when `true`, valid results and throw errors are decorated with a `debug` property which includes an array of the validation steps used to generate the returned result. Defaults to `false`. + - `errors` - error formatting settings: + - `escapeHtml` - when `true`, error message templates will escape special characters to HTML entities, for security purposes. Defaults to `false`. + - `label` - defines the value used to set the `label` context variable: + - `'path'` - the full path to the value being validated. This is the default value. + - `'key'` - the key of the value being validated. + - `false` - remove any label prefix from error message, including the `""`. + - `language` - the preferred language code for error messages. The value is matched against keys at the root of the `messages` object, and then the error code as a child key of that. Can be a reference to the value, global context, or local context which is the root value passed to the validation function. Note that references to the value are usually not what you want as they move around the value structure relative to where the error happens. Instead, either use the global context, or the absolute value (e.g. `Joi.ref('/variable')`); + - `render` - when `false`, skips rendering error templates. Useful when error messages are generated elsewhere to save processing time. Defaults to `true`. + - `stack` - when `true`, the main error will possess a stack trace, otherwise it will be disabled. Defaults to `false` for performance reasons. Has no effect on platforms other than V8/node.js as it uses the [Stack trace API](https://v8.dev/docs/stack-trace-api). + - `wrap` - overrides the way values are wrapped (e.g. `[]` around arrays, `""` around labels and variables prefixed with `:`). Each key can be set to a string with one (same character before and after the value) or two characters (first character before and second character after), or `false` to disable wrapping: + - `label` - the characters used around `{#label}` references. Defaults to `'"'`. + - `array` - the characters used around array values. Defaults to `'[]'`. + - `string` - the characters used around each array string values. Defaults to `false`. + - `wrapArrays` - if `true`, array values in error messages are wrapped in `[]`. Defaults to `true`. + - `externals` - if `false`, the external rules set with [`any.external()`](#anyexternalmethod-description) are ignored, which is required to ignore any external validations in synchronous mode (or an exception is thrown). Defaults to `true`. + - `messages` - overrides individual error messages. Defaults to no override (`{}`). Use the `'*'` error code as a catch-all for all error codes that do not have a message provided in the override. Messages use the same rules as [templates](#template-syntax). Variables in double braces `{{var}}` are HTML escaped if the option `errors.escapeHtml` is set to `true`. + - `noDefaults` - when `true`, do not apply default values. Defaults to `false`. + - `nonEnumerables` - when `true`, inputs are shallow cloned to include non-enumerable properties. Defaults to `false`. + - `presence` - sets the default presence requirements. Supported modes: `'optional'`, `'required'`, and `'forbidden'`. Defaults to `'optional'`. + - `skipFunctions` - when `true`, ignores unknown keys with a function value. Defaults to `false`. + - `stripUnknown` - remove unknown elements from objects and arrays. Defaults to `false`. + - when an `object` : + - `arrays` - set to `true` to remove unknown items from arrays. + - `objects` - set to `true` to remove unknown keys from objects. + - when `true`, it is equivalent to having `{ arrays: false, objects: true }`. Returns an object with the following keys: @@ -1219,11 +1219,11 @@ Returns an object with the following keys: ```js const schema = Joi.object({ - a: Joi.number(), + a: Joi.number(), }); const value = { - a: '123', + a: '123', }; const result = schema.validate(value); @@ -1236,23 +1236,23 @@ Validates a value asynchronously using the current schema and options where: - `value` - the value being validated. - `options` - an optional object as described in [`any.validate()`](#anyvalidatevalue-options), with the following additional settings: - - `artifacts` - when `true`, artifacts are returned alongside the value (i.e. `{ value, artifacts }`). Defaults to `false`. - - `warnings` - when `true`, warnings are returned alongside the value (i.e. `{ value, warning }`). Defaults to `false`. + - `artifacts` - when `true`, artifacts are returned alongside the value (i.e. `{ value, artifacts }`). Defaults to `false`. + - `warnings` - when `true`, warnings are returned alongside the value (i.e. `{ value, warning }`). Defaults to `false`. Returns a Promise that resolves into the validated value when the value is valid. If the value is valid and the `warnings` or `debug` options are set to `true`, returns an object `{ value, warning, debug }`. If validation fails, the promise rejects with the validation error. ```js const schema = Joi.object({ - a: Joi.number(), + a: Joi.number(), }); const value = { - a: '123', + a: '123', }; try { - const value = await schema.validateAsync(value); - // value -> { "a" : 123 } + const value = await schema.validateAsync(value); + // value -> { "a" : 123 } } catch (err) {} ``` @@ -1273,8 +1273,8 @@ When calling [`any.validateAsync()`](#anyvalidateasyncvalue-options), set the `w ```js const schema = Joi.any() - .warning('custom.x', { w: 'world' }) - .message({ 'custom.x': 'hello {#w}!' }); + .warning('custom.x', { w: 'world' }) + .message({ 'custom.x': 'hello {#w}!' }); const { value, error, warning } = schema.validate('anything'); @@ -1285,11 +1285,11 @@ const { value, error, warning } = schema.validate('anything'); // or try { - const { value, warning } = await schema.validateAsync('anything', { - warnings: true, - }); - // value -> 'anything'; - // warning -> { message: 'hello world!', details: [...] } + const { value, warning } = await schema.validateAsync('anything', { + warnings: true, + }); + // value -> 'anything'; + // warning -> { message: 'hello world!', details: [...] } } catch (err) {} ``` @@ -1316,12 +1316,12 @@ Adds conditions that are evaluated during validation and modify the schema befor - `condition` - a key name, [reference](#refkey-options), or a schema. If omitted, defaults to `Joi.ref('.')`. - `options` - an object with: - - `is` - the condition expressed as a **joi** schema. Anything that is not a **joi** schema will be converted using [Joi.compile](#compileschema-options). By default, the `is` condition schema allows for `undefined` values. Use `.required()` to override. For example, use `is: Joi.number().required()` to guarantee that a **joi** reference exists and is a number. - - `not` - the negative version of `is` (`then` and `otherwise` have reverse roles). - - `then` - if the condition is true, the **joi** schema to use. - - `otherwise` - if the condition is false, the **joi** schema to use. - - `switch` - an array of `{ is, then }` conditions that are evaluated against the `condition`. The last item in the array may also contain `otherwise`. - - `break` - stops processing all other conditions if the rule results in a `then`, `otherwise`, of `switch` match. + - `is` - the condition expressed as a **joi** schema. Anything that is not a **joi** schema will be converted using [Joi.compile](#compileschema-options). By default, the `is` condition schema allows for `undefined` values. Use `.required()` to override. For example, use `is: Joi.number().required()` to guarantee that a **joi** reference exists and is a number. + - `not` - the negative version of `is` (`then` and `otherwise` have reverse roles). + - `then` - if the condition is true, the **joi** schema to use. + - `otherwise` - if the condition is false, the **joi** schema to use. + - `switch` - an array of `{ is, then }` conditions that are evaluated against the `condition`. The last item in the array may also contain `otherwise`. + - `break` - stops processing all other conditions if the rule results in a `then`, `otherwise`, of `switch` match. If `condition` is a reference: @@ -1345,16 +1345,16 @@ Notes: ```js const schema = { - a: Joi.any() - .valid('x') - .when('b', { - is: Joi.exist(), - then: Joi.valid('y'), - otherwise: Joi.valid('z'), - }) - .when('c', { is: Joi.number().min(10), then: Joi.forbidden() }), - b: Joi.any(), - c: Joi.number(), + a: Joi.any() + .valid('x') + .when('b', { + is: Joi.exist(), + then: Joi.valid('y'), + otherwise: Joi.valid('z'), + }) + .when('c', { is: Joi.number().min(10), then: Joi.forbidden() }), + b: Joi.any(), + c: Joi.number(), }; ``` @@ -1362,15 +1362,15 @@ Or with a schema: ```js const schema = Joi.object({ - a: Joi.any().valid('x'), - b: Joi.any(), + a: Joi.any().valid('x'), + b: Joi.any(), }).when(Joi.object({ b: Joi.exist() }).unknown(), { - then: Joi.object({ - a: Joi.valid('y'), - }), - otherwise: Joi.object({ - a: Joi.valid('z'), - }), + then: Joi.object({ + a: Joi.valid('y'), + }), + otherwise: Joi.object({ + a: Joi.valid('z'), + }), }); ``` @@ -1380,16 +1380,16 @@ validate this logic: ```js const schema = Joi.object({ - type: Joi.string().valid('A', 'B', 'C').required(), // required if type == 'A' + type: Joi.string().valid('A', 'B', 'C').required(), // required if type == 'A' - foo: Joi.when('type', { - is: 'A', - then: Joi.string().valid('X', 'Y', 'Z').required(), - }), // required if type === 'A' and foo !== 'Z' + foo: Joi.when('type', { + is: 'A', + then: Joi.string().valid('X', 'Y', 'Z').required(), + }), // required if type === 'A' and foo !== 'Z' - bar: Joi.string(), + bar: Joi.string(), }).when(Joi.object({ type: Joi.valid('A'), foo: Joi.not('Z') }).unknown(), { - then: Joi.object({ bar: Joi.required() }), + then: Joi.object({ bar: Joi.required() }), }); ``` @@ -1398,8 +1398,8 @@ like this: ```js const schema = { - a: Joi.valid('a', 'b', 'other'), - other: Joi.string().when('a', { is: 'other', then: Joi.required() }), + a: Joi.valid('a', 'b', 'other'), + other: Joi.string().when('a', { is: 'other', then: Joi.required() }), }; ``` @@ -1408,17 +1408,17 @@ so like this: ```js const schema = Joi.object({ - a: Joi.boolean().required(), - b: Joi.object() - .keys({ - c: Joi.string(), - d: Joi.number().required(), - }) - .required() - .when('a', { - is: true, - then: Joi.object({ c: Joi.required() }), // b.c is required only when a is true - }), + a: Joi.boolean().required(), + b: Joi.object() + .keys({ + c: Joi.string(), + d: Joi.number().required(), + }) + .required() + .when('a', { + is: true, + then: Joi.object({ c: Joi.required() }), // b.c is required only when a is true + }), }); ``` @@ -1427,11 +1427,11 @@ following (notice the use of `required()`): ```js const schema = Joi.object({ - min: Joi.number(), - max: Joi.number().when('min', { - is: Joi.number().required(), - then: Joi.number().greater(Joi.ref('min')), - }), + min: Joi.number(), + max: Joi.number().when('min', { + is: Joi.number().required(), + then: Joi.number().greater(Joi.ref('min')), + }), }); ``` @@ -1439,15 +1439,15 @@ To evaluate multiple values on a single reference: ```js const schema = Joi.object({ - a: Joi.number().required(), - b: Joi.number().when('a', { - switch: [ - { is: 0, then: Joi.valid(1) }, - { is: 1, then: Joi.valid(2) }, - { is: 2, then: Joi.valid(3) }, - ], - otherwise: Joi.valid(4), - }), + a: Joi.number().required(), + b: Joi.number().when('a', { + switch: [ + { is: 0, then: Joi.valid(1) }, + { is: 1, then: Joi.valid(2) }, + { is: 2, then: Joi.valid(3) }, + ], + otherwise: Joi.valid(4), + }), }); ``` @@ -1455,12 +1455,12 @@ Or shorter: ```js const schema = Joi.object({ - a: Joi.number().required(), - b: Joi.number().when('a', [ - { is: 0, then: 1 }, - { is: 1, then: 2 }, - { is: 2, then: 3, otherwise: 4 }, - ]), + a: Joi.number().required(), + b: Joi.number().when('a', [ + { is: 0, then: 1 }, + { is: 1, then: 2 }, + { is: 2, then: 3, otherwise: 4 }, + ]), }); ``` @@ -1488,11 +1488,11 @@ Adds a conditional alternative schema type, either based on another key value, o - `condition` - the key name or [reference](#refkey-options), or a schema. - `options` - an object with: - - `is` - the condition expressed as a **joi** schema. Anything that is not a **joi** schema will be converted using [Joi.compile](#compileschema-options). - - `not` - the negative version of `is` (`then` and `otherwise` have reverse roles). - - `then` - if the condition is true, the **joi** schema to use. - - `otherwise` - if the condition is false, the **joi** schema to use. - - `switch` - an array of `{ is, then }` conditions that are evaluated against the `condition`. The last item in the array may also contain `otherwise`. + - `is` - the condition expressed as a **joi** schema. Anything that is not a **joi** schema will be converted using [Joi.compile](#compileschema-options). + - `not` - the negative version of `is` (`then` and `otherwise` have reverse roles). + - `then` - if the condition is true, the **joi** schema to use. + - `otherwise` - if the condition is false, the **joi** schema to use. + - `switch` - an array of `{ is, then }` conditions that are evaluated against the `condition`. The last item in the array may also contain `otherwise`. If `condition` is a reference: @@ -1513,25 +1513,25 @@ Note that `alternatives.conditional()` is different than `any.when()`. When you ```js const schema = { - a: Joi.alternatives().conditional('b', { - is: 5, - then: Joi.string(), - otherwise: Joi.number(), - }), - b: Joi.any(), + a: Joi.alternatives().conditional('b', { + is: 5, + then: Joi.string(), + otherwise: Joi.number(), + }), + b: Joi.any(), }; ``` ```js const schema = Joi.alternatives().conditional(Joi.object({ b: 5 }).unknown(), { - then: Joi.object({ - a: Joi.string(), - b: Joi.any(), - }), - otherwise: Joi.object({ - a: Joi.number(), - b: Joi.any(), - }), + then: Joi.object({ + a: Joi.string(), + b: Joi.any(), + }), + otherwise: Joi.object({ + a: Joi.number(), + b: Joi.any(), + }), }); ``` @@ -1541,8 +1541,8 @@ this definition of `a`: ```js const schema = { - a: Joi.alternatives().conditional('b', { is: true, then: Joi.required() }), - b: Joi.boolean(), + a: Joi.alternatives().conditional('b', { is: true, then: Joi.required() }), + b: Joi.boolean(), }; ``` @@ -1555,8 +1555,8 @@ To accomplish the desired result above use: ```js const schema = { - a: Joi.when('b', { is: true, then: Joi.required() }), - b: Joi.boolean(), + a: Joi.when('b', { is: true, then: Joi.required() }), + b: Joi.boolean(), }; ``` @@ -1565,9 +1565,9 @@ const schema = { Requires the validated value to match a specific set of the provided `alternative.try()` schemas where: - `mode` - the match mode which can be one of: - - `'any'` - match any provided schema. This is the default value. - - `'all'` - match all of the provided schemas. Note that this will ignore any conversions performed by the matchin schemas and return the raw value provided regardless of the `convert` preference set. - - `'one'` - match one and only one of the provided schemas. + - `'any'` - match any provided schema. This is the default value. + - `'all'` - match all of the provided schemas. Note that this will ignore any conversions performed by the matchin schemas and return the raw value provided regardless of the `convert` preference set. + - `'one'` - match one and only one of the provided schemas. Note: Cannot be combined with `alternatives.conditional()`. @@ -1607,13 +1607,13 @@ Verifies that a schema validates at least one of the values in the array, where: ```js const schema = Joi.array() - .items( - Joi.object({ - a: Joi.string(), - b: Joi.number(), - }), - ) - .has(Joi.object({ a: Joi.string().valid('a'), b: Joi.number() })); + .items( + Joi.object({ + a: Joi.string(), + b: Joi.number(), + }), + ) + .has(Joi.object({ a: Joi.string().valid('a'), b: Joi.number() })); ``` Possible validation errors: [`array.hasKnown`](#arrayhasknown), [`array.hasUnknown`](#arrayhasunknown) @@ -1632,16 +1632,16 @@ Errors will contain the number of items that didn't match. Any unmatched item ha ```js const schema = Joi.array().items(Joi.string(), Joi.number()); // array may contain strings and numbers const schema = Joi.array().items( - Joi.string().required(), - Joi.string().required(), + Joi.string().required(), + Joi.string().required(), ); // array must contain at least two strings const schema = Joi.array().items( - Joi.string().valid('not allowed').forbidden(), - Joi.string(), + Joi.string().valid('not allowed').forbidden(), + Joi.string(), ); // array may contain strings, but none of those strings can match 'not allowed' const schema = Joi.array().items( - Joi.string().label('My string').required(), - Joi.number().required(), + Joi.string().label('My string').required(), + Joi.number().required(), ); // If this fails it can result in `[ValidationError: "value" does not contain [My string] and 1 other required value(s)]` ``` @@ -1659,8 +1659,8 @@ const schema = Joi.array().length(5); ```js const schema = Joi.object({ - limit: Joi.number().integer().required(), - numbers: Joi.array().length(Joi.ref('limit')).required(), + limit: Joi.number().integer().required(), + numbers: Joi.array().length(Joi.ref('limit')).required(), }); ``` @@ -1678,8 +1678,8 @@ const schema = Joi.array().max(10); ```js const schema = Joi.object({ - limit: Joi.number().integer().required(), - numbers: Joi.array().max(Joi.ref('limit')).required(), + limit: Joi.number().integer().required(), + numbers: Joi.array().max(Joi.ref('limit')).required(), }); ``` @@ -1697,8 +1697,8 @@ const schema = Joi.array().min(2); ```js const schema = Joi.object({ - limit: Joi.number().integer().required(), - numbers: Joi.array().min(Joi.ref('limit')).required(), + limit: Joi.number().integer().required(), + numbers: Joi.array().min(Joi.ref('limit')).required(), }); ``` @@ -1715,12 +1715,12 @@ Errors will contain the number of items that didn't match. Any unmatched item ha ```js const schema = Joi.array().ordered( - Joi.string().required(), - Joi.number().required(), + Joi.string().required(), + Joi.number().required(), ); // array must have first item as string and second item as number const schema = Joi.array() - .ordered(Joi.string().required()) - .items(Joi.number().required()); // array must have first item as string and 1 or more subsequent items as number + .ordered(Joi.string().required()) + .items(Joi.number().required()); // array must have first item as string and 1 or more subsequent items as number const schema = Joi.array().ordered(Joi.string().required(), Joi.number()); // array must have first item as string and optionally second item as number ``` @@ -1745,10 +1745,10 @@ Possible validation errors: [`array.excludes`](#arrayexcludes), [`array.includes Requires the array to comply with the specified sort order where: - `options` - optional settings: - - `order` - the sort order. Allowed values: - - `'ascending'` - sort the array in ascending order. This is the default. - - `'descending'` - sort the array in descending order. - - `by` - a key name or reference to sort array objects by. Defaults to the entire value. + - `order` - the sort order. Allowed values: + - `'ascending'` - sort the array in ascending order. This is the default. + - `'descending'` - sort the array in descending order. + - `by` - a key name or reference to sort array objects by. Defaults to the entire value. Notes: @@ -1774,16 +1774,16 @@ Possible validation errors: [`array.sparse`](#arraysparse) Requires the array values to be unique where: - `comparator` - an optional custom `comparator` that is either: - - a function that takes 2 parameters to compare. This function should return whether the 2 - parameters are equal or not, you are also **responsible** for this function not to fail, any - `Error` would bubble out of Joi. - - a string in dot notation representing the path of the element to do uniqueness check on. Any - missing path will be considered undefined, and can as well only exist once. + - a function that takes 2 parameters to compare. This function should return whether the 2 + parameters are equal or not, you are also **responsible** for this function not to fail, any + `Error` would bubble out of Joi. + - a string in dot notation representing the path of the element to do uniqueness check on. Any + missing path will be considered undefined, and can as well only exist once. - `options` - optional settings: - - `ignoreUndefined` - if `true`, undefined values for the dot notation string comparator will - not cause the array to fail on uniqueness. Defaults to `false`. - - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the - `key` as a literal value. + - `ignoreUndefined` - if `true`, undefined values for the dot notation string comparator will + not cause the array to fail on uniqueness. Defaults to `false`. + - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the + `key` as a literal value. Note: remember that if you provide a custom comparator function, different types can be passed as parameter depending on the rules you set on items. @@ -1957,8 +1957,8 @@ const schema = Joi.date().greater('now'); ```js const schema = Joi.object({ - from: Joi.date().required(), - to: Joi.date().greater(Joi.ref('from')).required(), + from: Joi.date().required(), + to: Joi.date().greater(Joi.ref('from')).required(), }); ``` @@ -1990,8 +1990,8 @@ const schema = Joi.date().less('now'); ```js const schema = Joi.object({ - from: Joi.date().less(Joi.ref('to')).required(), - to: Joi.date().required(), + from: Joi.date().less(Joi.ref('to')).required(), + to: Joi.date().required(), }); ``` @@ -2015,8 +2015,8 @@ const schema = Joi.date().max('now'); ```js const schema = Joi.object({ - from: Joi.date().max(Joi.ref('to')).required(), - to: Joi.date().required(), + from: Joi.date().max(Joi.ref('to')).required(), + to: Joi.date().required(), }); ``` @@ -2040,8 +2040,8 @@ const schema = Joi.date().min('now'); ```js const schema = Joi.object({ - from: Joi.date().required(), - to: Joi.date().min(Joi.ref('from')).required(), + from: Joi.date().required(), + to: Joi.date().min(Joi.ref('from')).required(), }); ``` @@ -2148,9 +2148,9 @@ Named links: ```js const person = Joi.object({ - firstName: Joi.string().required(), - lastName: Joi.string().required(), - children: Joi.array().items(Joi.link('#person')), + firstName: Joi.string().required(), + lastName: Joi.string().required(), + children: Joi.array().items(Joi.link('#person')), }).id('person'); ``` @@ -2158,12 +2158,12 @@ Relative links: ```js const person = Joi.object({ - firstName: Joi.string().required(), - lastName: Joi.string().required(), - children: Joi.array().items(Joi.link('...')), - // . - the link - // .. - the children array - // ... - the person object + firstName: Joi.string().required(), + lastName: Joi.string().required(), + children: Joi.array().items(Joi.link('...')), + // . - the link + // .. - the children array + // ... - the person object }); ``` @@ -2171,9 +2171,9 @@ Absolute links: ```js const person = Joi.object({ - firstName: Joi.string().required(), - lastName: Joi.string().required(), - children: Joi.array().items(Joi.link('/')), + firstName: Joi.string().required(), + lastName: Joi.string().required(), + children: Joi.array().items(Joi.link('/')), }); ``` @@ -2186,8 +2186,8 @@ Will throw an error during validation if left uninitialized (e.g. `Joi.link()` c ```js const schema = Joi.object({ - a: [Joi.string(), Joi.number()], - b: Joi.link().ref('#type.a'), + a: [Joi.string(), Joi.number()], + b: Joi.link().ref('#type.a'), }).id('type'); ``` @@ -2205,8 +2205,8 @@ Validation fails with the `link.maxRecursion` error code when the limit is excee ```js const schema = Joi.object({ - name: Joi.string().required(), - keys: Joi.array().items(Joi.link('...').maxRecursion(10)), + name: Joi.string().required(), + keys: Joi.array().items(Joi.link('...').maxRecursion(10)), }); ``` @@ -2242,8 +2242,8 @@ const schema = Joi.number().greater(5); ```js const schema = Joi.object({ - min: Joi.number().required(), - max: Joi.number().greater(Joi.ref('min')).required(), + min: Joi.number().required(), + max: Joi.number().greater(Joi.ref('min')).required(), }); ``` @@ -2269,8 +2269,8 @@ const schema = Joi.number().less(10); ```js const schema = Joi.object({ - min: Joi.number().less(Joi.ref('max')).required(), - max: Joi.number().required(), + min: Joi.number().less(Joi.ref('max')).required(), + max: Joi.number().required(), }); ``` @@ -2288,8 +2288,8 @@ const schema = Joi.number().max(10); ```js const schema = Joi.object({ - min: Joi.number().max(Joi.ref('max')).required(), - max: Joi.number().required(), + min: Joi.number().max(Joi.ref('max')).required(), + max: Joi.number().required(), }); ``` @@ -2307,8 +2307,8 @@ const schema = Joi.number().min(2); ```js const schema = Joi.object({ - min: Joi.number().required(), - max: Joi.number().min(Joi.ref('min')).required(), + min: Joi.number().required(), + max: Joi.number().min(Joi.ref('min')).required(), }); ``` @@ -2405,8 +2405,8 @@ Supports the same methods of the [`any()`](#any) type. ```js const object = Joi.object({ - a: Joi.number().min(1).max(10).integer(), - b: 'some string', + a: Joi.number().min(1).max(10).integer(), + b: 'some string', }); await object.validateAsync({ a: 5 }); @@ -2428,13 +2428,13 @@ them are required as well where: - `peers` - the string key names of which if one present, all are required. - `options` - optional settings: - - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the `key` as a literal value. - - `isPresent` - function that overrides the default check for an empty value. Default: `(resolved) => resolved !== undefined` + - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the `key` as a literal value. + - `isPresent` - function that overrides the default check for an empty value. Default: `(resolved) => resolved !== undefined` ```js const schema = Joi.object({ - a: Joi.any(), - b: Joi.any(), + a: Joi.any(), + b: Joi.any(), }).and('a', 'b'); ``` @@ -2449,11 +2449,11 @@ Appends the allowed object keys where: ```js // Validate key a const base = Joi.object({ - a: Joi.number(), + a: Joi.number(), }); // Validate keys a, b. const extended = base.append({ - b: Joi.string(), + b: Joi.string(), }); ``` @@ -2468,13 +2468,13 @@ Verifies an assertion where: ```js const schema = Joi.object({ - a: { - b: Joi.string(), - c: Joi.number(), - }, - d: { - e: Joi.any(), - }, + a: { + b: Joi.string(), + c: Joi.number(), + }, + d: { + e: Joi.any(), + }, }).assert('.d.e', Joi.ref('a.c'), 'equal to a.c'); ``` @@ -2504,12 +2504,12 @@ Sets or extends the allowed object keys where: ```js const base = Joi.object().keys({ - a: Joi.number(), - b: Joi.string(), + a: Joi.number(), + b: Joi.string(), }); // Validate keys a, b and c. const extended = base.keys({ - c: Joi.boolean(), + c: Joi.boolean(), }); ``` @@ -2557,13 +2557,13 @@ Defines a relationship between keys where not all peers can be present at the sa - `peers` - the key names of which if one present, the others may not all be present. - `options` - optional settings: - - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the `key` as a literal value. - - `isPresent` - function that overrides the default check for an empty value. Default: `(resolved) => resolved !== undefined` + - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the `key` as a literal value. + - `isPresent` - function that overrides the default check for an empty value. Default: `(resolved) => resolved !== undefined` ```js const schema = Joi.object({ - a: Joi.any(), - b: Joi.any(), + a: Joi.any(), + b: Joi.any(), }).nand('a', 'b'); ``` @@ -2576,13 +2576,13 @@ allowed) where: - `peers` - the key names of which at least one must appear. - `options` - optional settings: - - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the `key` as a literal value. - - `isPresent` - function that overrides the default check for an empty value. Default: `(resolved) => resolved !== undefined` + - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the `key` as a literal value. + - `isPresent` - function that overrides the default check for an empty value. Default: `(resolved) => resolved !== undefined` ```js const schema = Joi.object({ - a: Joi.any(), - b: Joi.any(), + a: Joi.any(), + b: Joi.any(), }).or('a', 'b'); ``` @@ -2595,13 +2595,13 @@ required where: - `peers` - the exclusive key names that must not appear together but where none are required. - `options` - optional settings: - - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the `key` as a literal value. - - `isPresent` - function that overrides the default check for an empty value. Default: `(resolved) => resolved !== undefined` + - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the `key` as a literal value. + - `isPresent` - function that overrides the default check for an empty value. Default: `(resolved) => resolved !== undefined` ```js const schema = Joi.object({ - a: Joi.any(), - b: Joi.any(), + a: Joi.any(), + b: Joi.any(), }).oxor('a', 'b'); ``` @@ -2614,20 +2614,20 @@ Specify validation rules for unknown keys matching a pattern where: - `pattern` - a pattern that can be either a regular expression or a **joi** schema that will be tested against the unknown key names. Note that if the pattern is a regular expression, for it to match the entire key name, it must begin with `^` and end with `$`. - `schema` - the schema object matching keys must validate against. - `options` - options settings: - - `fallthrough` - if `true`, multiple matching patterns are tested against the key, otherwise once a pattern match is found, no other patterns are compared. Defaults to `false`. - - `matches` - a joi array schema used to validated the array of matching keys. For example, `Joi.object().pattern(/\d/, Joi.boolean(), { matches: Joi.array().length(2) })` will require two matching keys. If the `matches` schema is not an array type schema, it will be converted to `Joi.array().items(matches)`. If the `matches` schema contains references, they are resolved against the ancestors as follows: - - self - the array of matching keys (`Joi.ref('.length')`) - - parent - the object value containing the keys (`Joi.ref('a')`) + - `fallthrough` - if `true`, multiple matching patterns are tested against the key, otherwise once a pattern match is found, no other patterns are compared. Defaults to `false`. + - `matches` - a joi array schema used to validated the array of matching keys. For example, `Joi.object().pattern(/\d/, Joi.boolean(), { matches: Joi.array().length(2) })` will require two matching keys. If the `matches` schema is not an array type schema, it will be converted to `Joi.array().items(matches)`. If the `matches` schema contains references, they are resolved against the ancestors as follows: + - self - the array of matching keys (`Joi.ref('.length')`) + - parent - the object value containing the keys (`Joi.ref('a')`) ```js const schema = Joi.object({ - a: Joi.string(), + a: Joi.string(), }).pattern(/\w\d/, Joi.boolean()); // OR const schema = Joi.object({ - a: Joi.string(), + a: Joi.string(), }).pattern(Joi.string().min(2).max(5), Joi.boolean()); ``` @@ -2660,16 +2660,16 @@ Renames a key to another name (deletes the renamed key) where: - `from` - the original key name or a regular expression matching keys. - `to` - the new key name. `to` can be set to a [`template`](#templatetemplate-options) which is rendered at runtime using the current value, global context, and local context if `from` is a regular expression (e.g. the expression `/^(\d+)$/` will match any all-digits keys with a capture group that is accessible in the template via `{#1}`). - `options` - an optional object with the following optional keys: - - `alias` - if `true`, does not delete the old key name, keeping both the new and old keys in place. Defaults to `false`. - - `multiple` - if `true`, allows renaming multiple keys to the same destination where the last rename wins. Defaults to `false`. - - `override` - if `true`, allows renaming a key over an existing key. Defaults to `false`. - - `ignoreUndefined` - if `true`, skip renaming of a key if it's undefined. Defaults to `false`. + - `alias` - if `true`, does not delete the old key name, keeping both the new and old keys in place. Defaults to `false`. + - `multiple` - if `true`, allows renaming multiple keys to the same destination where the last rename wins. Defaults to `false`. + - `override` - if `true`, allows renaming a key over an existing key. Defaults to `false`. + - `ignoreUndefined` - if `true`, skip renaming of a key if it's undefined. Defaults to `false`. Keys are renamed before any other validation rules are applied. If `to` is a template that references the object own keys (e.g. `'{.prefix}-{#1}'`), the value of these keys is the raw input value, not the value generated after validation. If a key is renamed and then its value fails to pass a validation rule, the error message will use the renamed key, not the original key which may be confusing for users (labels can help in some cases). ```js const object = Joi.object({ - a: Joi.number(), + a: Joi.number(), }).rename('b', 'a'); await object.validateAsync({ b: 5 }); @@ -2681,7 +2681,7 @@ Using a regular expression: const regex = /^foobar$/i; const schema = Joi.object({ - fooBar: Joi.string(), + fooBar: Joi.string(), }).rename(regex, 'fooBar'); await schema.validateAsync({ FooBar: 'a' }); @@ -2691,14 +2691,14 @@ Using a regular expression with template: ```js const schema = Joi.object() - .rename(/^(\d+)$/, Joi.expression('x{#1}x')) - .pattern(/^x\d+x$/, Joi.any()); + .rename(/^(\d+)$/, Joi.expression('x{#1}x')) + .pattern(/^x\d+x$/, Joi.any()); const input = { - 123: 'x', - 1: 'y', - 0: 'z', - x4x: 'test', + 123: 'x', + 1: 'y', + 0: 'z', + x4x: 'test', }; const value = await Joi.compile(schema).validateAsync(input); @@ -2739,16 +2739,16 @@ Requires the presence of other keys whenever the specified key is present where: - `peers` - the required peer key names that must appear together with `key`. `peers` can be a single string value or an array of string values. - `options` - optional settings: - - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the `key` as a literal value. - - `isPresent` - function that overrides the default check for an empty value. Default: `(resolved) => resolved !== undefined` + - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the `key` as a literal value. + - `isPresent` - function that overrides the default check for an empty value. Default: `(resolved) => resolved !== undefined` Note that unlike [`object.and()`](#objectandpeers-options), `with()` creates a dependency only between the `key` and each of the `peers`, not between the `peers` themselves. ```js const schema = Joi.object({ - a: Joi.any(), - b: Joi.any(), + a: Joi.any(), + b: Joi.any(), }).with('a', 'b'); ``` @@ -2762,13 +2762,13 @@ Forbids the presence of other keys whenever the specified is present where: - `peers` - the forbidden peer key names that must not appear together with `key`. `peers` can be a single string value or an array of string values. - `options` - optional settings: - - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the `key` as a literal value. - - `isPresent` - function that overrides the default check for an empty value. Default: `(resolved) => resolved !== undefined` + - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the `key` as a literal value. + - `isPresent` - function that overrides the default check for an empty value. Default: `(resolved) => resolved !== undefined` ```js const schema = Joi.object({ - a: Joi.any(), - b: Joi.any(), + a: Joi.any(), + b: Joi.any(), }).without('a', ['b']); ``` @@ -2781,13 +2781,13 @@ the same time where: - `peers` - the exclusive key names that must not appear together but where one of them is required. - `options` - optional settings: - - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the `key` as a literal value. - - `isPresent` - function that overrides the default check for an empty value. Default: `(resolved) => resolved !== undefined` + - `separator` - overrides the default `.` hierarchy separator. Set to `false` to treat the `key` as a literal value. + - `isPresent` - function that overrides the default check for an empty value. Default: `(resolved) => resolved !== undefined` ```js const schema = Joi.object({ - a: Joi.any(), - b: Joi.any(), + a: Joi.any(), + b: Joi.any(), }).xor('a', 'b'); ``` @@ -2832,8 +2832,8 @@ Possible validation errors: [`string.alphanum`](#stringalphanum-1) Requires the string value to be a valid base64 string; does not check the decoded value. - `options` - optional settings: - - `paddingRequired` - if `true`, the string must be properly padded with the `=` characters. Defaults to `true`. - - `urlSafe` - if `true`, uses the URI-safe base64 format which replaces `+` with `-` and `\` with `_`. Defaults to `false`. + - `paddingRequired` - if `true`, the string must be properly padded with the `=` characters. Defaults to `true`. + - `urlSafe` - if `true`, uses the URI-safe base64 format which replaces `+` with `-` and `\` with `_`. Defaults to `false`. Padding characters are not required for decoding, as the number of missing bytes can be inferred from the number of digits. With that said, try to use padding if at all possible. @@ -2881,7 +2881,7 @@ Possible validation errors: [`string.creditCard`](#stringcreditcard-1) Requires the string value to be a valid data URI string. - `options` - optional settings: - - `paddingRequired` - optional parameter defaulting to `true` which will require `=` padding if `true` or make padding optional if `false`. + - `paddingRequired` - optional parameter defaulting to `true` which will require `=` padding if `true` or make padding optional if `false`. ```js const schema = Joi.string().dataUri(); @@ -2896,22 +2896,22 @@ Possible validation errors: [`string.dataUri`](#stringdatauri) Requires the string value to be a valid domain name. - `options` - optional settings: - - `allowFullyQualified` - if `true`, domains ending with a `.` character are permitted. Defaults to `false`. - - `allowUnicode` - if `true`, Unicode characters are permitted. Defaults to `true`. - - `allowUnderscore` - if `true`, underscores (`_`) are allowed in the domain name. Defaults to `false`. - - `minDomainSegments` - number of segments required for the domain. Defaults to `2`. - - `maxDomainSegments` - maximum number of allowed domain segments. Default to no limit. - - `tlds` - options for TLD (top level domain) validation. By default, the TLD must be a valid - name listed on the [IANA registry](http://data.iana.org/TLD/tlds-alpha-by-domain.txt). To - disable validation, set `tlds` to `false`. To customize how TLDs are validated, set one of - these: - - `allow` - one of: - - `true` to use the IANA list of registered TLDs. This is the default value. - - `false` to allow any TLD not listed in the `deny` list, if present. - - a `Set` or array of the allowed TLDs. Cannot be used together with `deny`. - - `deny` - one of: - - a `Set` or array of the forbidden TLDs. Cannot be used together with a custom `allow` - list. + - `allowFullyQualified` - if `true`, domains ending with a `.` character are permitted. Defaults to `false`. + - `allowUnicode` - if `true`, Unicode characters are permitted. Defaults to `true`. + - `allowUnderscore` - if `true`, underscores (`_`) are allowed in the domain name. Defaults to `false`. + - `minDomainSegments` - number of segments required for the domain. Defaults to `2`. + - `maxDomainSegments` - maximum number of allowed domain segments. Default to no limit. + - `tlds` - options for TLD (top level domain) validation. By default, the TLD must be a valid + name listed on the [IANA registry](http://data.iana.org/TLD/tlds-alpha-by-domain.txt). To + disable validation, set `tlds` to `false`. To customize how TLDs are validated, set one of + these: + - `allow` - one of: + - `true` to use the IANA list of registered TLDs. This is the default value. + - `false` to allow any TLD not listed in the `deny` list, if present. + - a `Set` or array of the allowed TLDs. Cannot be used together with `deny`. + - `deny` - one of: + - a `Set` or array of the forbidden TLDs. Cannot be used together with a custom `allow` + list. ```js const schema = Joi.string().domain(); @@ -2924,29 +2924,29 @@ Possible validation errors: [`string.domain`](#stringdomain) Requires the string value to be a valid email address. - `options` - optional settings: - - `allowFullyQualified` - if `true`, domains ending with a `.` character are permitted. Defaults to `false`. - - `allowUnicode` - if `true`, Unicode characters are permitted. Defaults to `true`. - - `allowUnderscore` - if `true`, underscores (`_`) are allowed in the domain name. Defaults to `false`. - - `ignoreLength` - if `true`, ignore invalid email length errors. Defaults to `false`. - - `minDomainSegments` - number of segments required for the domain. The default setting excludes - single segment domains such as `example@io` which is a valid email but very uncommon. Defaults - to `2`. - - `maxDomainSegments` - maximum number of allowed domain segments. Default to no limit. - - `multiple` - if `true`, allows multiple email addresses in a single string, separated by `,` - or the `separator` characters. Defaults to `false`. - - `separator` - when `multiple` is `true`, overrides the default `,` separator. String can be - a single character or multiple separator characters. Defaults to `','`. - - `tlds` - options for TLD (top level domain) validation. By default, the TLD must be a valid - name listed on the [IANA registry](http://data.iana.org/TLD/tlds-alpha-by-domain.txt). To - disable validation, set `tlds` to `false`. To customize how TLDs are validated, set one of - these: - - `allow` - one of: - - `true` to use the IANA list of registered TLDs. This is the default value. - - `false` to allow any TLD not listed in the `deny` list, if present. - - a `Set` or array of the allowed TLDs. Cannot be used together with `deny`. - - `deny` - one of: - - a `Set` or array of the forbidden TLDs. Cannot be used together with a custom `allow` - list. + - `allowFullyQualified` - if `true`, domains ending with a `.` character are permitted. Defaults to `false`. + - `allowUnicode` - if `true`, Unicode characters are permitted. Defaults to `true`. + - `allowUnderscore` - if `true`, underscores (`_`) are allowed in the domain name. Defaults to `false`. + - `ignoreLength` - if `true`, ignore invalid email length errors. Defaults to `false`. + - `minDomainSegments` - number of segments required for the domain. The default setting excludes + single segment domains such as `example@io` which is a valid email but very uncommon. Defaults + to `2`. + - `maxDomainSegments` - maximum number of allowed domain segments. Default to no limit. + - `multiple` - if `true`, allows multiple email addresses in a single string, separated by `,` + or the `separator` characters. Defaults to `false`. + - `separator` - when `multiple` is `true`, overrides the default `,` separator. String can be + a single character or multiple separator characters. Defaults to `','`. + - `tlds` - options for TLD (top level domain) validation. By default, the TLD must be a valid + name listed on the [IANA registry](http://data.iana.org/TLD/tlds-alpha-by-domain.txt). To + disable validation, set `tlds` to `false`. To customize how TLDs are validated, set one of + these: + - `allow` - one of: + - `true` to use the IANA list of registered TLDs. This is the default value. + - `false` to allow any TLD not listed in the `deny` list, if present. + - a `Set` or array of the allowed TLDs. Cannot be used together with `deny`. + - `deny` - one of: + - a `Set` or array of the forbidden TLDs. Cannot be used together with a custom `allow` + list. ```js const schema = Joi.string().email(); @@ -2961,25 +2961,25 @@ Possible validation errors: [`string.email`](#stringemail) Requires the string value to be a valid GUID. - `options` - optional settings: - - `version` - specifies one or more acceptable versions. Can be an Array or String with the following values: - `uuidv1`, `uuidv2`, `uuidv3`, `uuidv4`, `uuidv5`, `uuidv6`, `uuidv7` or `uuidv8`. If no `version` is specified then it is assumed to be a generic `guid` - which will not validate the version or variant of the guid and just check for general structure format. - - `separator` - defines the allowed or required GUID separator where: - - `true` - a separator is required, can be either `:` or `-`. - - `false` - separator is not allowed. - - `'-'` - a dash separator is required. - - `':'` - a colon separator is required. - - defaults to optional `:` or `-` separator. - - `wrapper` - defines the allowed or required GUID wrapper characters where: - - `undefined` - (default) the GUID can be optionally wrapped with `{}`, `[]`, or `()`. The opening and closing characters must be a matching pair. - - `true` - the GUID must be wrapped with `{}`, `[]`, or `()`. The opening and closing characters must be a matching pair. - - `false` - wrapper characters are not allowed. - - `'['`, `'{'`, or `'('` - a specific wrapper is required (e.g., if `wrapper` is `'['`, the GUID must be enclosed in square brackets). + - `version` - specifies one or more acceptable versions. Can be an Array or String with the following values: + `uuidv1`, `uuidv2`, `uuidv3`, `uuidv4`, `uuidv5`, `uuidv6`, `uuidv7` or `uuidv8`. If no `version` is specified then it is assumed to be a generic `guid` + which will not validate the version or variant of the guid and just check for general structure format. + - `separator` - defines the allowed or required GUID separator where: + - `true` - a separator is required, can be either `:` or `-`. + - `false` - separator is not allowed. + - `'-'` - a dash separator is required. + - `':'` - a colon separator is required. + - defaults to optional `:` or `-` separator. + - `wrapper` - defines the allowed or required GUID wrapper characters where: + - `undefined` - (default) the GUID can be optionally wrapped with `{}`, `[]`, or `()`. The opening and closing characters must be a matching pair. + - `true` - the GUID must be wrapped with `{}`, `[]`, or `()`. The opening and closing characters must be a matching pair. + - `false` - wrapper characters are not allowed. + - `'['`, `'{'`, or `'('` - a specific wrapper is required (e.g., if `wrapper` is `'['`, the GUID must be enclosed in square brackets). ```js const schema = Joi.string().guid({ - version: ['uuidv4', 'uuidv5'], - wrapper: false, + version: ['uuidv4', 'uuidv5'], + wrapper: false, }); ``` @@ -2990,8 +2990,8 @@ Possible validation errors: [`string.guid`](#stringguid) Requires the string value to be a valid hexadecimal string. - `options` - optional settings: - - `byteAligned` - Boolean specifying whether you want to check that the hexadecimal string is byte aligned. If `convert` is `true`, a `0` will be added in front of the string in case it needs to be aligned. Defaults to `false`. - - `prefix` - Boolean or `optional`. When `true`, the string will be considered valid if prefixed with `0x` or `0X`. When `false`, the prefix is forbidden. When `optional`, the string will be considered valid if prefixed or not prefixed at all. Defaults to `false`. + - `byteAligned` - Boolean specifying whether you want to check that the hexadecimal string is byte aligned. If `convert` is `true`, a `0` will be added in front of the string in case it needs to be aligned. Defaults to `false`. + - `prefix` - Boolean or `optional`. When `true`, the string will be considered valid if prefixed with `0x` or `0X`. When `false`, the prefix is forbidden. When `optional`, the string will be considered valid if prefixed or not prefixed at all. Defaults to `false`. ```js const schema = Joi.string().hex({ prefix: 'optional' }); @@ -3022,14 +3022,14 @@ const schema = Joi.string().valid('a').insensitive(); Requires the string value to be a valid ip address. - `options` - optional settings: - - `version` - One or more IP address versions to validate against. Valid values: `ipv4`, `ipv6`, `ipvfuture` - - `cidr` - Used to determine if a CIDR is allowed or not. Valid values: `optional`, `required`, `forbidden` + - `version` - One or more IP address versions to validate against. Valid values: `ipv4`, `ipv6`, `ipvfuture` + - `cidr` - Used to determine if a CIDR is allowed or not. Valid values: `optional`, `required`, `forbidden` ```js // Accept only ipv4 and ipv6 addresses with a CIDR const schema = Joi.string().ip({ - version: ['ipv4', 'ipv6'], - cidr: 'required', + version: ['ipv4', 'ipv6'], + cidr: 'required', }); ``` @@ -3079,8 +3079,8 @@ const schema = Joi.string().length(5); ```js const schema = Joi.object({ - length: Joi.string().required(), - value: Joi.string().length(Joi.ref('length'), 'utf8').required(), + length: Joi.string().required(), + value: Joi.string().length(Joi.ref('length'), 'utf8').required(), }); ``` @@ -3110,8 +3110,8 @@ const schema = Joi.string().max(10); ```js const schema = Joi.object({ - max: Joi.string().required(), - value: Joi.string().max(Joi.ref('max'), 'utf8').required(), + max: Joi.string().required(), + value: Joi.string().max(Joi.ref('max'), 'utf8').required(), }); ``` @@ -3130,8 +3130,8 @@ const schema = Joi.string().min(2); ```js const schema = Joi.object({ - min: Joi.string().required(), - value: Joi.string().min(Joi.ref('min'), 'utf8').required(), + min: Joi.string().required(), + value: Joi.string().min(Joi.ref('min'), 'utf8').required(), }); ``` @@ -3161,9 +3161,9 @@ Defines a pattern rule where: - `regex` - a regular expression object the string value must match against. Note that if the pattern is a regular expression, for it to match the entire key name, it must begin with `^` and end with `$`. - `name` - optional name for patterns (useful with multiple patterns). - `options` - an optional configuration object with the following supported properties: - - `name` - optional pattern name. - - `invert` - optional boolean flag. Defaults to `false` behavior. If specified as `true`, the - provided pattern will be disallowed instead of required. + - `name` - optional pattern name. + - `invert` - optional boolean flag. Defaults to `false` behavior. If specified as `true`, the + provided pattern will be disallowed instead of required. ```js const schema = Joi.string().pattern(/^[abc]+$/); @@ -3178,8 +3178,8 @@ const invertedSchema = Joi.string().pattern(/^[a-z]+$/, { invert: true }); invertedSchema.validate('lowercase'); // ValidationError: "value" with value "lowercase" matches the inverted pattern: [a-z] const invertedNamedSchema = Joi.string().pattern(/^[a-z]+$/, { - name: 'alpha', - invert: true, + name: 'alpha', + invert: true, }); invertedNamedSchema.validate('lowercase'); // ValidationError: "value" with value "lowercase" matches the inverted alpha pattern ``` @@ -3255,17 +3255,17 @@ Possible validation errors: [`string.uppercase`](#stringuppercase-1) Requires the string value to be a valid [RFC 3986](http://tools.ietf.org/html/rfc3986) URI. - `options` - optional settings: - - `scheme` - Specifies one or more acceptable Schemes, should only include the scheme name. Can be an Array or String (strings are automatically escaped for use in a Regular Expression). - - `allowRelative` - Allow relative URIs. Defaults to `false`. - - `relativeOnly` - Restrict only relative URIs. Defaults to `false`. - - `allowQuerySquareBrackets` - Allows unencoded square brackets inside the query string. This is **NOT** RFC 3986 compliant but query strings like `abc[]=123&abc[]=456` are very common these days. Defaults to `false`. - - `domain` - Validate the domain component using the options specified in [`string.domain()`](#stringdomainoptions). - - `encodeUri` - When `convert` is true, if the validation fails, attempts to encode the URI using [`encodeURI`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURI) before validating it again. This allows to provide, for example, unicode URIs, and have it encoded for you. Defaults to `false`. + - `scheme` - Specifies one or more acceptable Schemes, should only include the scheme name. Can be an Array or String (strings are automatically escaped for use in a Regular Expression). + - `allowRelative` - Allow relative URIs. Defaults to `false`. + - `relativeOnly` - Restrict only relative URIs. Defaults to `false`. + - `allowQuerySquareBrackets` - Allows unencoded square brackets inside the query string. This is **NOT** RFC 3986 compliant but query strings like `abc[]=123&abc[]=456` are very common these days. Defaults to `false`. + - `domain` - Validate the domain component using the options specified in [`string.domain()`](#stringdomainoptions). + - `encodeUri` - When `convert` is true, if the validation fails, attempts to encode the URI using [`encodeURI`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURI) before validating it again. This allows to provide, for example, unicode URIs, and have it encoded for you. Defaults to `false`. ```js // Accept git or git http/https const schema = Joi.string().uri({ - scheme: ['git', /git\+https?/], + scheme: ['git', /git\+https?/], }); ``` @@ -3291,14 +3291,14 @@ Possible validation errors: [`symbol.base`](#symbolbase) Allows values to be transformed into `Symbol`s, where: - `map` - mapping declaration that can be: - - an object, where keys are strings, and values are `Symbol`s - - an array of arrays of length 2, where for each sub-array, the 1st element must be anything but an object, a function or a `Symbol`, and the 2nd element must be a Symbol - - a `Map`, following the same principles as the array above + - an object, where keys are strings, and values are `Symbol`s + - an array of arrays of length 2, where for each sub-array, the 1st element must be anything but an object, a function or a `Symbol`, and the 2nd element must be a Symbol + - a `Map`, following the same principles as the array above ```js const schema = Joi.symbol().map([ - [1, Symbol('one')], - ['two', Symbol('two')], + [1, Symbol('one')], + ['two', Symbol('two')], ]); ``` @@ -3332,170 +3332,171 @@ Where: - `base`: The base schema to extend from. This key is forbidden when `type` is a regular expression. - `messages`: A hash of error codes and their messages. To interpolate dynamic values, use the [template syntax](#template-syntax). - `flags`: A hash of flag names and their definitions where: - - `default`: The default value of the flag. When `describe()` is called and the current flag matches this default value, it will be omitted entirely from the description. + - `default`: The default value of the flag. When `describe()` is called and the current flag matches this default value, it will be omitted entirely from the description. - `prepare`: A function with signature `function (value, helpers) {}` that prepares the input value (for example, converts `,` to `.` to support multiple decimal representations) where: - - `value`: The input value. - - `helpers`: [Validation helpers](#validation-helpers) + - `value`: The input value. + - `helpers`: [Validation helpers](#validation-helpers) - Must return an object with one of the following keys: - - `value`: The modified value. - - `errors`: Validation error(s) generated by `$_createError()` or `helpers.error()`. + Must return an object with one of the following keys: + - `value`: The modified value. + - `errors`: Validation error(s) generated by `$_createError()` or `helpers.error()`. - If `errors` is defined, validation will abort regardless of `abortEarly`. Refer to the validation process above for further information. + If `errors` is defined, validation will abort regardless of `abortEarly`. Refer to the validation process above for further information. - `coerce`: A function with signature `function (value, helpers) {}` that coerces the input value where: - - `value`: The input value. - - `helpers`: [Validation helpers](#validation-helpers) - - You can also pass an object where: - - `from`: The type(s) to convert from. Can be a single string or an array of strings. Joi will only run `method` if the value `typeof` of the input value is equal to one of the provided values. - - `method`: A function with signature `function (value, helpers)` that coerces the input value where: - `value`: The input value. - `helpers`: [Validation helpers](#validation-helpers) - Must return an object with one of the following keys: - - `value`: The modified value. - - `errors`: Validation error(s) generated by `$_createError()` or `helpers.error()`. + You can also pass an object where: + - `from`: The type(s) to convert from. Can be a single string or an array of strings. Joi will only run `method` if the value `typeof` of the input value is equal to one of the provided values. + - `method`: A function with signature `function (value, helpers)` that coerces the input value where: + - `value`: The input value. + - `helpers`: [Validation helpers](#validation-helpers) + + Must return an object with one of the following keys: + - `value`: The modified value. + - `errors`: Validation error(s) generated by `$_createError()` or `helpers.error()`. - If `errors` is defined, validation will abort regardless of `abortEarly`. Refer to the validation process above for further information. + If `errors` is defined, validation will abort regardless of `abortEarly`. Refer to the validation process above for further information. - `validate`: A function with signature `function (value, helpers) {}` that performs base validation on the input value where: - - `value`: The input value. - - `helpers`: [Validation helpers](#validation-helpers) + - `value`: The input value. + - `helpers`: [Validation helpers](#validation-helpers) - Must return an object with one of the following keys: - - `value`: The modified value. - - `errors`: Validation error(s) generated by `$_createError()` or `helpers.error()`. + Must return an object with one of the following keys: + - `value`: The modified value. + - `errors`: Validation error(s) generated by `$_createError()` or `helpers.error()`. - If `errors` is defined, validation will abort regardless of `abortEarly`. Refer to the validation process above for further information. + If `errors` is defined, validation will abort regardless of `abortEarly`. Refer to the validation process above for further information. - `jsonSchema`: A function with signature `function (schema, res, mode, options) {}` that returns the JSON Schema for the type where: - - `schema`: The current schema instance. - - `res`: The current JSON Schema object. - - `mode`: Either `'input'` or `'output'`. - - `options`: The options passed to `jsonSchema.input()` or `jsonSchema.output()`. - - Must return the modified JSON Schema object. - -- `rules`: A hash of validation rule names and their implementation where: - - `alias`: Aliases of the rule. Can be a string or an array of strings. - - `args`: An array of argument names or an object that define the parameters the rule will accept where: - - `name`: The argument name. - - `ref`: Whether this argument allows references. Joi will resolve them before passing to `validate`. Defaults to `false`. - - `assert`: A function of signature `function (value) {}` that validates the argument by returning a boolean. Also accepts a Joi schema. This key is required if `ref` is set to `true`. - - `normalize`: A function of signature `function (value) {}` that normalizes the argument before passing it to `assert`. - - `message`: A message to throw if `assert` is a function. This key is forbidden if `assert` is a schema. - - `convert`: Whether this is a dual rule that converts the input value and validates it at the same time. Defaults to `false`. - - `manifest`: Whether this rule should be outputted in the schema's description. Defaults to `true`. - - `method`: The method that will be attached onto the schema instance. Useful when you need to set flags. If set to `undefined`, Joi will default to a function that when called will add the rule to the rules queue. If set to `false`, the no method will be added to the instance. - - `multi`: Whether this rule can be invoked multiple times. Defaults to `false`. - - `validate`: A function of signature `function (value, helpers, args, rule)` that validates the input value where: - - `value`: The input value. - - `helpers`: [Validation helpers](#validation-helpers) - - `args`: Resolved and validated arguments mapped by their names. - - `rule`: The rule definitions passed to `$_addRule` left untouched. Useful if you need access to the raw arguments before validation. - - `jsonSchema`: A function with signature `function (rule, res, isOnly, mode, options) {}` that returns the JSON Schema for the rule where: - - `rule`: The rule object. + - `schema`: The current schema instance. - `res`: The current JSON Schema object. - - `isOnly`: A boolean indicating if the schema has the `only` flag set. - `mode`: Either `'input'` or `'output'`. - `options`: The options passed to `jsonSchema.input()` or `jsonSchema.output()`. Must return the modified JSON Schema object. +- `rules`: A hash of validation rule names and their implementation where: + - `alias`: Aliases of the rule. Can be a string or an array of strings. + - `args`: An array of argument names or an object that define the parameters the rule will accept where: + - `name`: The argument name. + - `ref`: Whether this argument allows references. Joi will resolve them before passing to `validate`. Defaults to `false`. + - `assert`: A function of signature `function (value) {}` that validates the argument by returning a boolean. Also accepts a Joi schema. This key is required if `ref` is set to `true`. + - `normalize`: A function of signature `function (value) {}` that normalizes the argument before passing it to `assert`. + - `message`: A message to throw if `assert` is a function. This key is forbidden if `assert` is a schema. + - `convert`: Whether this is a dual rule that converts the input value and validates it at the same time. Defaults to `false`. + - `manifest`: Whether this rule should be outputted in the schema's description. Defaults to `true`. + - `method`: The method that will be attached onto the schema instance. Useful when you need to set flags. If set to `undefined`, Joi will default to a function that when called will add the rule to the rules queue. If set to `false`, the no method will be added to the instance. + - `multi`: Whether this rule can be invoked multiple times. Defaults to `false`. + - `validate`: A function of signature `function (value, helpers, args, rule)` that validates the input value where: + - `value`: The input value. + - `helpers`: [Validation helpers](#validation-helpers) + - `args`: Resolved and validated arguments mapped by their names. + - `rule`: The rule definitions passed to `$_addRule` left untouched. Useful if you need access to the raw arguments before validation. + - `jsonSchema`: A function with signature `function (rule, res, isOnly, mode, options) {}` that returns the JSON Schema for the rule where: + - `rule`: The rule object. + - `res`: The current JSON Schema object. + - `isOnly`: A boolean indicating if the schema has the `only` flag set. + - `mode`: Either `'input'` or `'output'`. + - `options`: The options passed to `jsonSchema.input()` or `jsonSchema.output()`. + + Must return the modified JSON Schema object. + - `overrides`: A hash of method names and their overridden implementation. To refer to the parent method, use [`$_parent()`](#\_parentmethod-args) ```js const Joi = require('joi'); const custom = Joi.extend((joi) => { - return { - type: 'million', - base: joi.number(), - messages: { - 'million.base': '{{#label}} must be at least a million', - 'million.big': '{{#label}} must be at least five millions', - 'million.round': '{{#label}} must be a round number', - 'million.dividable': '{{#label}} must be dividable by {{#q}}', - }, - coerce(value, helpers) { - // Only called when prefs.convert is true - - if (helpers.schema.$_getRule('round')) { - return { value: Math.round(value) }; - } - }, - validate(value, helpers) { - // Base validation regardless of the rules applied - - if (value < 1000000) { - return { value, errors: helpers.error('million.base') }; - } - - // Check flags for global state - - if (helpers.schema.$_getFlag('big') && value < 5000000) { - return { value, errors: helpers.error('million.big') }; - } - }, - rules: { - big: { - alias: 'large', - method() { - return this.$_setFlag('big', true); + return { + type: 'million', + base: joi.number(), + messages: { + 'million.base': '{{#label}} must be at least a million', + 'million.big': '{{#label}} must be at least five millions', + 'million.round': '{{#label}} must be a round number', + 'million.dividable': '{{#label}} must be dividable by {{#q}}', }, - }, - round: { - convert: true, // Dual rule: converts or validates - method() { - return this.$_addRule('round'); - }, - validate(value, helpers, args, options) { - // Only called when prefs.convert is false (due to rule convert option) + coerce(value, helpers) { + // Only called when prefs.convert is true - if (value % 1 !== 0) { - return helpers.error('million.round'); - } - }, - }, - dividable: { - multi: true, // Rule supports multiple invocations - method(q) { - return this.$_addRule({ name: 'dividable', args: { q } }); + if (helpers.schema.$_getRule('round')) { + return { value: Math.round(value) }; + } }, - args: [ - { - name: 'q', - ref: true, - assert: (value) => typeof value === 'number' && !isNaN(value), - message: 'must be a number', - }, - ], - validate(value, helpers, args, options) { - if (value % args.q === 0) { - return value; // Value is valid - } + validate(value, helpers) { + // Base validation regardless of the rules applied - return helpers.error('million.dividable', { q: args.q }); - }, - }, - even: { - method() { - // Rule with only method used to alias another rule + if (value < 1000000) { + return { value, errors: helpers.error('million.base') }; + } + + // Check flags for global state - return this.dividable(2); + if (helpers.schema.$_getFlag('big') && value < 5000000) { + return { value, errors: helpers.error('million.big') }; + } }, - }, - }, - }; + rules: { + big: { + alias: 'large', + method() { + return this.$_setFlag('big', true); + }, + }, + round: { + convert: true, // Dual rule: converts or validates + method() { + return this.$_addRule('round'); + }, + validate(value, helpers, args, options) { + // Only called when prefs.convert is false (due to rule convert option) + + if (value % 1 !== 0) { + return helpers.error('million.round'); + } + }, + }, + dividable: { + multi: true, // Rule supports multiple invocations + method(q) { + return this.$_addRule({ name: 'dividable', args: { q } }); + }, + args: [ + { + name: 'q', + ref: true, + assert: (value) => + typeof value === 'number' && !isNaN(value), + message: 'must be a number', + }, + ], + validate(value, helpers, args, options) { + if (value % args.q === 0) { + return value; // Value is valid + } + + return helpers.error('million.dividable', { q: args.q }); + }, + }, + even: { + method() { + // Rule with only method used to alias another rule + + return this.dividable(2); + }, + }, + }, + }; }); const schema = custom.object({ - a: custom.million().round().dividable(Joi.ref('b')), - b: custom.number(), - c: custom.million().even().dividable(7), - d: custom.million().round().prefs({ convert: false }), - e: custom.million().large(), + a: custom.million().round().dividable(Joi.ref('b')), + b: custom.number(), + c: custom.million().even().dividable(7), + d: custom.million().round().prefs({ convert: false }), + e: custom.million().large(), }); ``` @@ -3506,9 +3507,9 @@ const schema = custom.object({ - `schema`: The reference to the current schema. Useful if you need to use any of the [Advanced functions](#advanced-functions). - `state`: The current validation state. See [Validation state](#validation-state). - `error`: A function with signature `function (code, local, localState = currentState) {}` similar to [`$_createError()`](#\_createerrorcode-value-local-state-prefs-options) but with the current value, validation options, current state passed where: - - `code`: The error code. - - `local`: Local context used to interpolate the message. - - `localState`: The localized state. + - `code`: The error code. + - `local`: Local context used to interpolate the message. + - `localState`: The localized state. - `errorsArray`: A function that creates an array that can be recognised by Joi as a valid error array. **Note that using a native JS array can cause Joi to output incorrect results.** - `warn`: TODO - `message`: TODO @@ -3549,10 +3550,10 @@ TODO Adds a rule to the rules queue where: - `options`: A rule name string or rule options where: - - `name`: The name of the rule. - - `args`: The arguments to be processed. - - `method`: The name of another rule to reuse. - You can also pass extra properties and they will be accessible within the `rule` argument of the `validate` method. + - `name`: The name of the rule. + - `args`: The arguments to be processed. + - `method`: The name of another rule to reuse. + You can also pass extra properties and they will be accessible within the `rule` argument of the `validate` method. #### $\_compile(schema, options) @@ -3619,7 +3620,7 @@ Sets a flag where: - `name`: The flag name to set. - `value`: The value to set the flag to. - `options`: Optional options where: - - `clone`: Whether to clone the schema. Defaults to `true`. Only set to `false` if the schema has already been cloned before. + - `clone`: Whether to clone the schema. Defaults to `true`. Only set to `false` if the schema has already been cloned before. #### $\_validate(value, state, prefs) @@ -3640,14 +3641,14 @@ Performs validation against the current schema without the extra overhead of mer - `name` - `'ValidationError'`. - `isJoi` - `true`. - `details` - an array of errors : - - `message` - string with a description of the error. - - `path` - ordered array where each element is the accessor to the value where the error happened. - - `type` - type of the error. - - `context` - object providing context of the error containing: - - `key` - key of the value that erred, equivalent to the last element of `details.path`. - - `label` - label of the value that erred, or the `key` if any, or the default `messages.root`. - - `value` - the value that failed validation. - - other error specific properties as described for each error code. + - `message` - string with a description of the error. + - `path` - ordered array where each element is the accessor to the value where the error happened. + - `type` - type of the error. + - `context` - object providing context of the error containing: + - `key` - key of the value that erred, equivalent to the last element of `details.path`. + - `label` - label of the value that erred, or the `key` if any, or the default `messages.root`. + - `value` - the value that failed validation. + - other error specific properties as described for each error code. - `annotate()` - function that returns a string with an annotated version of the object pointing at the places where errors occurred. Takes an optional parameter that, if truthy, will strip the colors out of the output. @@ -3687,7 +3688,7 @@ Additional local context properties: ```ts { - types: Array; // The list of expected types + types: Array; // The list of expected types } ``` @@ -3699,7 +3700,7 @@ Additional local context properties: ```ts { - error: Error; // The error thrown + error: Error; // The error thrown } ``` @@ -3711,7 +3712,7 @@ Additional local context properties: ```ts { - error: Error; // Error generated during the default value function call + error: Error; // Error generated during the default value function call } ``` @@ -3723,7 +3724,7 @@ Additional local context properties: ```ts { - error: Error; // Error generated during the failover value function call + error: Error; // Error generated during the failover value function call } ``` @@ -3735,7 +3736,7 @@ Additional local context properties: ```ts { - invalids: Array; // Contains the list of the invalid values that should be rejected + invalids: Array; // Contains the list of the invalid values that should be rejected } ``` @@ -3747,7 +3748,7 @@ Additional local context properties: ```ts { - valids: Array; // Contains the list of the valid values that were expected + valids: Array; // Contains the list of the valid values that were expected } ``` @@ -3785,7 +3786,7 @@ Additional local context properties: ```ts { - pos: number; // Index where the value was found in the array + pos: number; // Index where the value was found in the array } ``` @@ -3810,7 +3811,7 @@ Additional local context properties: ```ts { - knownMisses: Array; // Labels of all the missing values + knownMisses: Array; // Labels of all the missing values } ``` @@ -3822,7 +3823,7 @@ Additional local context properties: ```ts { - unknownMisses: number; // Count of missing values that didn't have a label + unknownMisses: number; // Count of missing values that didn't have a label } ``` @@ -3834,7 +3835,7 @@ Additional local context properties: ```ts { - pos: number; // Index where the value was found in the array + pos: number; // Index where the value was found in the array } ``` @@ -3846,7 +3847,7 @@ Additional local context properties: ```ts { - limit: number; // Length that was expected for this array + limit: number; // Length that was expected for this array } ``` @@ -3858,7 +3859,7 @@ Additional local context properties: ```ts { - limit: number; // Maximum length that was expected for this array + limit: number; // Maximum length that was expected for this array } ``` @@ -3870,7 +3871,7 @@ Additional local context properties: ```ts { - limit: number; // Minimum length that was expected for this array + limit: number; // Minimum length that was expected for this array } ``` @@ -3912,7 +3913,7 @@ Additional local context properties: ```ts { - type: string; // The unsupported array item type + type: string; // The unsupported array item type } ``` @@ -3924,7 +3925,7 @@ Additional local context properties: ```ts { - pos: number; // Index where an undefined value was found in the array + pos: number; // Index where an undefined value was found in the array } ``` @@ -3950,7 +3951,7 @@ Additional local context properties: ```ts { - patternLabel: string; // Label of assertion schema + patternLabel: string; // Label of assertion schema } ``` @@ -3970,7 +3971,7 @@ Additional local context properties: ```ts { - limit: number; // Length that was expected for this buffer + limit: number; // Length that was expected for this buffer } ``` @@ -3982,7 +3983,7 @@ Additional local context properties: ```ts { - limit: number; // Maximum length that was expected for this buffer + limit: number; // Maximum length that was expected for this buffer } ``` @@ -3994,7 +3995,7 @@ Additional local context properties: ```ts { - limit: number; // Minimum length that was expected for this buffer + limit: number; // Minimum length that was expected for this buffer } ``` @@ -4014,7 +4015,7 @@ Additional local context properties: ```ts { - format: string; // The required format + format: string; // The required format } ``` @@ -4026,7 +4027,7 @@ Additional local context properties: ```ts { - limit: Date; // Maximum date + limit: Date; // Maximum date } ``` @@ -4038,7 +4039,7 @@ Additional local context properties: ```ts { - limit: Date; // Minimum date + limit: Date; // Minimum date } ``` @@ -4050,7 +4051,7 @@ Additional local context properties: ```ts { - limit: Date; // Maximum date + limit: Date; // Maximum date } ``` @@ -4062,7 +4063,7 @@ Additional local context properties: ```ts { - limit: Date; // Minimum date + limit: Date; // Minimum date } ``` @@ -4078,7 +4079,7 @@ Additional local context properties: ```ts { - n: number; // Expected arity + n: number; // Expected arity } ``` @@ -4094,7 +4095,7 @@ Additional local context properties: ```ts { - n: number; // Maximum expected arity + n: number; // Maximum expected arity } ``` @@ -4106,7 +4107,7 @@ Additional local context properties: ```ts { - n: number; // Minimum expected arity + n: number; // Minimum expected arity } ``` @@ -4122,7 +4123,7 @@ Additional local context properties: ```ts { - limit: number; // Maximum number of times the link may be entered + limit: number; // Maximum number of times the link may be entered } ``` @@ -4138,7 +4139,7 @@ Additional local context properties: ```ts { - limit: number; // Minimum value that was expected for this number + limit: number; // Minimum value that was expected for this number } ``` @@ -4158,7 +4159,7 @@ Additional local context properties: ```ts { - limit: number; // Maximum value that was expected for this number + limit: number; // Maximum value that was expected for this number } ``` @@ -4170,7 +4171,7 @@ Additional local context properties: ```ts { - limit: number; // Maximum value that was expected for this number + limit: number; // Maximum value that was expected for this number } ``` @@ -4182,7 +4183,7 @@ Additional local context properties: ```ts { - limit: number; // Minimum value that was expected for this number + limit: number; // Minimum value that was expected for this number } ``` @@ -4194,7 +4195,7 @@ Additional local context properties: ```ts { - multiple: number; // The number of which the input is supposed to be a multiple of + multiple: number; // The number of which the input is supposed to be a multiple of } ``` @@ -4218,7 +4219,7 @@ Additional local context properties: ```ts { - limit: number; // The precision that it should have had + limit: number; // The precision that it should have had } ``` @@ -4234,7 +4235,7 @@ Additional local context properties: ```ts { - child: string; // Property that is unexpected + child: string; // Property that is unexpected } ``` @@ -4274,7 +4275,7 @@ Additional local context properties: ```ts { - type: string; // The expected type + type: string; // The expected type } ``` @@ -4286,7 +4287,7 @@ Additional local context properties: ```ts { - limit: number; // Number of keys that was expected for this object + limit: number; // Number of keys that was expected for this object } ``` @@ -4298,7 +4299,7 @@ Additional local context properties: ```ts { - limit: number; // Maximum number of keys + limit: number; // Maximum number of keys } ``` @@ -4310,7 +4311,7 @@ Additional local context properties: ```ts { - limit: number; // Minimum number of keys + limit: number; // Minimum number of keys } ``` @@ -4400,7 +4401,7 @@ Additional local context properties: ```ts { - type: string; // The required schema + type: string; // The required schema } ``` @@ -4412,7 +4413,7 @@ Additional local context properties: ```ts { - type: string; // Type name the object should have been + type: string; // Type name the object should have been } ``` @@ -4504,7 +4505,7 @@ Additional local context properties: ```ts { - invalids: [string]; // Array of invalid emails + invalids: [string]; // Array of invalid emails } ``` @@ -4549,7 +4550,7 @@ Additional local context properties: ```ts { - cidr: string; // CIDR used for the validation + cidr: string; // CIDR used for the validation } ``` @@ -4612,7 +4613,7 @@ Additional local context properties: ```ts { - form: string; // Normalization form that is expected + form: string; // Normalization form that is expected } ``` @@ -4692,7 +4693,7 @@ Additional local context properties: ```ts { - scheme: string; // Scheme prefix that is expected in the URI + scheme: string; // Scheme prefix that is expected in the URI } ``` diff --git a/generated/markdown/joi/changelog.md b/generated/markdown/joi/changelog.md index a4673ad..889327c 100644 --- a/generated/markdown/joi/changelog.md +++ b/generated/markdown/joi/changelog.md @@ -50,6 +50,10 @@ ## Version 17 {#v17} +### [17.13.4](https://github.com/hapijs/joi/milestone/216) {#17.13.4} + +- [#3123](https://github.com/hapijs/joi/pull/3123) chore: backport #3113 to v17 + ### [17.13.3](https://github.com/hapijs/joi/milestone/207) {#17.13.3} - [#3043](https://github.com/hapijs/joi/pull/3043) fix: correct function type in alternatives error diff --git a/generated/markdown/policies/styleguide.md b/generated/markdown/policies/styleguide.md index 1342832..32e264c 100644 --- a/generated/markdown/policies/styleguide.md +++ b/generated/markdown/policies/styleguide.md @@ -46,10 +46,10 @@ console.log('even when not required'); - Declare on first use, not at top of function; [self](#prototype-members) being an exception - Do not chain declarations unless inside `for` parentheses (repeat `const` or `let` for each variable in a separate statement) - Give descriptive names - - Do not use similar names or synonyms for different variables unless following a convention - - `for...in` iterators should use descriptive names - - `for` iterators should use single character names - - Use combination of plural for array and singular for each item in the array + - Do not use similar names or synonyms for different variables unless following a convention + - `for...in` iterators should use descriptive names + - `for` iterators should use single character names + - Use combination of plural for array and singular for each item in the array - Use camelCase, never underscores - Avoid using numbered variables (e.g. i1, i2, i3) @@ -62,7 +62,7 @@ console.log('even when not required'); // Right if (condition) { - return; + return; } // Wrong @@ -85,7 +85,7 @@ if (condition) return; const name = 'john'; for (let i = 0; i < name.length; ++i) { - console.log(name[i]); + console.log(name[i]); } // Wrong @@ -95,7 +95,7 @@ const name = 'john'; const len = name.length; for (position = 0; position < len; position++) { - console.log(name[position]); + console.log(name[position]); } ``` @@ -105,8 +105,8 @@ for (position = 0; position < len; position++) { ```javascript Example.prototype.method = function () { - this.public = 'external'; - this._private = 'internal'; + this.public = 'external'; + this._private = 'internal'; }; ``` @@ -114,11 +114,11 @@ Example.prototype.method = function () { ```javascript Example.prototype.method = function () { - const self = this; + const self = this; - call(123, function (err) { - self.display(err); - }); + call(123, function (err) { + self.display(err); + }); }; ``` @@ -134,7 +134,7 @@ Example.prototype.method = function () { const method = function () {}; const arrow = (foo) => { - return bar; + return bar; }; // Wrong @@ -164,17 +164,17 @@ Hoek.assert(this instanceof Server, 'Server must be instantiated using new'); // Right if (test) { - if (value === 12) { - console.log('result'); - } + if (value === 12) { + console.log('result'); + } } // Wrong if (test) { - if (value === 12) { - console.log('result'); - } + if (value === 12) { + console.log('result'); + } } ``` @@ -198,7 +198,7 @@ const string = 'text in single quotes'; ```javascript exports.get = function () { - // Some code + // Some code }; // 1 // 2 @@ -206,26 +206,26 @@ exports.get = function () { * jsDoc comment */ internals.utility = function () { - //Some code + //Some code }; ``` - Newline after `{` except for inlined or empty objects - - Inline an object when it improves readability and unlikely to change often - - No inline object in assignment unless empty + - Inline an object when it improves readability and unlikely to change often + - No inline object in assignment unless empty ```javascript // Right if (condition) { - execute(value, { strict: true }); + execute(value, { strict: true }); } if (condition) { - const options = { - strict: true, - }; - execute(value, options); + const options = { + strict: true, + }; + execute(value, options); } const empty = {}; @@ -233,105 +233,105 @@ const empty = {}; // Wrong if (condition) { - execute(value, { strict: true }); + execute(value, { strict: true }); } if (condition) { - const options = { strict: true }; - execute(value, options); + const options = { strict: true }; + execute(value, options); } const empty = {}; ``` - Newline after `}` - - Only exception is when followed by `,`, `;`, `);` which must be followed by a newline - - Includes before `else`, `catch`, etc. - - Empty line after `}` if not last statement in scope + - Only exception is when followed by `,`, `;`, `);` which must be followed by a newline + - Includes before `else`, `catch`, etc. + - Empty line after `}` if not last statement in scope ```javascript // Right if (condition) { - value = { - func: () => { - console.log('example'); - }, - message: 'hello', - }; - - execute(value, (err) => { - console.log(err); - }); + value = { + func: () => { + console.log('example'); + }, + message: 'hello', + }; + + execute(value, (err) => { + console.log(err); + }); } else { - console.log('otherwise'); + console.log('otherwise'); } // Wrong if (condition) { - value = { - func: () => { - console.log('example'); - }, - message: 'hello', - }; - execute(value, (err) => { - console.log(err); - }); + value = { + func: () => { + console.log('example'); + }, + message: 'hello', + }; + execute(value, (err) => { + console.log(err); + }); } else { - console.log('otherwise'); + console.log('otherwise'); } ``` - Empty line after `{` - - Following a multi-line condition - - In function scope declarations - - In arrow function declarations using curly braces + - Following a multi-line condition + - In function scope declarations + - In arrow function declarations using curly braces ```javascript // Right exports.method = function () { - if (condition) { - if (otherCondition) { - console.log('sometimes'); - } + if (condition) { + if (otherCondition) { + console.log('sometimes'); + } - if (result && result.statusCode === 200) { - console.log('special case'); - } + if (result && result.statusCode === 200) { + console.log('special case'); + } - console.log('always'); - } + console.log('always'); + } - execute(123, (err) => { - console.log(err); - }); + execute(123, (err) => { + console.log(err); + }); - const empty = {}; + const empty = {}; }; // Wrong exports.method = function () { - if (condition) { - if (otherCondition) { - console.log('sometimes'); - } + if (condition) { + if (otherCondition) { + console.log('sometimes'); + } - if (result && result.statusCode === 200) { - console.log('special case'); - } + if (result && result.statusCode === 200) { + console.log('special case'); + } - console.log('always'); - } + console.log('always'); + } - execute(123, (err) => { - console.log(err); - }); + execute(123, (err) => { + console.log(err); + }); - const empty = {}; + const empty = {}; }; ``` @@ -341,17 +341,17 @@ exports.method = function () { // Right if (condition) { - if (otherCondition) { - console.log('done'); - } + if (otherCondition) { + console.log('done'); + } } // Wrong if (condition) { - if (otherCondition) { - console.log('done'); - } + if (otherCondition) { + console.log('done'); + } } ``` @@ -373,13 +373,13 @@ const value = calculate(1, 3); // Right const example = function () { - return value; + return value; }; // Wrong const example = function () { - return value; + return value; }; ``` @@ -403,7 +403,7 @@ const key = example(); execute('order', 34); if (result === 'ok') { - console.log('success'); + console.log('success'); } // Wrong @@ -411,7 +411,7 @@ if (result === 'ok') { execute('order', 34); if (result === 'ok') { - console.log('success'); + console.log('success'); } ``` @@ -421,17 +421,17 @@ if (result === 'ok') { // Right const obj = { - a: 1, - b: 2, - c: 3, + a: 1, + b: 2, + c: 3, }; // Wrong const obj = { - a: 1, - b: 2, - c: 3, + a: 1, + b: 2, + c: 3, }; ``` @@ -443,7 +443,7 @@ const obj = { const name = 'john'; for (let i = 0; i < name.length; ++i) { - console.log(name[i]); + console.log(name[i]); } // Wrong @@ -451,7 +451,7 @@ for (let i = 0; i < name.length; ++i) { const name = 'john'; for (let i = 0; i < name.length; ++i) { - console.log(name[i]); + console.log(name[i]); } ``` @@ -461,23 +461,23 @@ for (let i = 0; i < name.length; ++i) { // Right for (let book in books) { - if (books.hasOwnProperty(book)) { - console.log(book.name); - } + if (books.hasOwnProperty(book)) { + console.log(book.name); + } } // Wrong for (let book in books) { - if (books.hasOwnProperty(book)) { - console.log(book.name); - } + if (books.hasOwnProperty(book)) { + console.log(book.name); + } } ``` - Always space after `{` and before `}` in inlined object - - No space for empty objects `{}` - - One space for empty functions `{ }` + - No space for empty objects `{}` + - One space for empty functions `{ }` ```javascript // Right @@ -522,7 +522,7 @@ const numbers = [1, 2, 3]; execute({ name: 'john', email: 'john@example.com' }); for (let i = 0; i < name.length; ++i) { - console.log(name[i]); + console.log(name[i]); } // Wrong @@ -532,7 +532,7 @@ execute({ name: 'john', email: 'john@example.com' }); // This for loop violates the style guide, but illustrates incorrect spacing around a comma for (let i = 0, il = name.length; i < il; ++i) { - console.log(name[i]); + console.log(name[i]); } ``` @@ -572,7 +572,7 @@ execute('some error message', 12345, this); const message = 'Hello ' + 'Steve, ' + 'How are you?'; if (value === 'hello' && result === 'ok') { - console.log('yes'); + console.log('yes'); } // Wrong @@ -580,7 +580,7 @@ if (value === 'hello' && result === 'ok') { const message = 'Hello ' + 'Steve, ' + 'How are you?'; if (value === 'hello' && result === 'ok') { - console.log('yes'); + console.log('yes'); } ``` @@ -612,54 +612,54 @@ const message = foo === bar ? foo : bar; - No TODOs - Line - - Provides narrative for the following single code line (or single statement broken for readability) - - One line of comment only - - One empty line before and none after the comment line - - No empty line before when following `{` unless other rules require it + - Provides narrative for the following single code line (or single statement broken for readability) + - One line of comment only + - One empty line before and none after the comment line + - No empty line before when following `{` unless other rules require it ```javascript function execute() { - // Initialize state - const position = 0; + // Initialize state + const position = 0; - if (condition) { - // Return message - return 'hello'; - } + if (condition) { + // Return message + return 'hello'; + } } ``` - Segment - - Provides narrative for the following code section (one or more lines of code, with or without line breaks) - - One or more lines of comments - - One empty line before and one after comments block + - Provides narrative for the following code section (one or more lines of code, with or without line breaks) + - One or more lines of comments + - One empty line before and one after comments block ```javascript function execute() { - // Print each book's name + // Print each book's name - for (let book in books) { - // Check for valid properties + for (let book in books) { + // Check for valid properties - if (books.hasOwnProperty(book)) { - console.log(book.name); + if (books.hasOwnProperty(book)) { + console.log(book.name); + } } - } } ``` - Note - - Explains the behaviour of a single code statement (can be broken into multiple lines) - - Used to document unexpected behaviour or non-standard practice - - Appears immediately at the end of the line (or statement) it describes, following whitespace to separate it from code block + - Explains the behaviour of a single code statement (can be broken into multiple lines) + - Used to document unexpected behaviour or non-standard practice + - Appears immediately at the end of the line (or statement) it describes, following whitespace to separate it from code block ```javascript function execute(value) { - if (value !== null && value !== undefined) { - // Explicit check as 'value' can be 0 + if (value !== null && value !== undefined) { + // Explicit check as 'value' can be 0 - console.log(value); - } + console.log(value); + } } ``` @@ -674,7 +674,7 @@ function execute(value) { ```javascript if (result && result.status && result.status.statusCode === 200) { - console.log('success'); + console.log('success'); } ``` @@ -695,8 +695,8 @@ const message = 'hello' + ' and welcome'; ### Module globals - Every module can only have two top level globals (except for imported modules): - - `exports` - defined automatically by node - - `internals` - must be declared as an object at the top of each module immediate following the `require` section + - `exports` - defined automatically by node + - `internals` - must be declared as an object at the top of each module immediate following the `require` section - Any variable global to the module must be a property of `internals`, including constants - If a module has automatically executing code, it must be contained within a function (using the `internals` namespace) and called at the top of the module after the `internals` declaration. diff --git a/generated/markdown/tlds/changelog.md b/generated/markdown/tlds/changelog.md index 925390a..d41743b 100644 --- a/generated/markdown/tlds/changelog.md +++ b/generated/markdown/tlds/changelog.md @@ -1,5 +1,9 @@ ## Version 1 {#v1} +### [1.1.7](https://github.com/hapijs/tlds/milestone/15) {#1.1.7} + +- [#20](https://github.com/hapijs/tlds/pull/20) Update TLDs + ### [1.1.6](https://github.com/hapijs/tlds/milestone/14) {#1.1.6} - [#19](https://github.com/hapijs/tlds/pull/19) Update TLDs diff --git a/generated/metadata/modules.json b/generated/metadata/modules.json index ea802d2..e541aa5 100644 --- a/generated/metadata/modules.json +++ b/generated/metadata/modules.json @@ -1,110 +1,110 @@ { - "address": { - "forks": 27, - "link": "https://github.com/hapijs/address", - "package": "@hapi/address", - "slogan": "Validate email address and domain.", - "stars": 33, - "updated": "2024-01-29T12:37:22Z", - "versions": [ - { - "branch": "v5.1.1", - "license": "BSD", - "name": "5.1.1", - "node": ">= 14" - } - ], - "versionsArray": ["5.1.1"] - }, - "formula": { - "forks": 20, - "link": "https://github.com/hapijs/formula", - "package": "@hapi/formula", - "slogan": "Math and string formula parser.", - "stars": 17, - "updated": "2024-02-02T16:21:44Z", - "versions": [ - { - "branch": "v3.0.2", - "license": "BSD", - "name": "3.0.2", - "node": ">= 14" - } - ], - "versionsArray": ["3.0.2"] - }, - "joi": { - "forks": 1509, - "link": "https://github.com/hapijs/joi", - "package": "joi", - "slogan": "The most powerful schema description language and data validator for JavaScript.", - "stars": 21202, - "updated": "2026-03-30T17:24:52Z", - "versions": [ - { - "branch": "v17.13.3", - "license": "BSD", - "name": "17.13.3", - "node": ">= 14" - }, - { - "branch": "v18.2.1", - "license": "BSD", - "name": "18.2.1", - "node": ">= 20" - } - ], - "versionsArray": ["18.2.1", "17.13.3"] - }, - "joi-date": { - "forks": 23, - "link": "https://github.com/hapijs/joi-date", - "package": "@joi/date", - "slogan": "Extensions for advance date rules.", - "stars": 81, - "updated": "2024-04-22T09:05:34Z", - "versions": [ - { - "branch": "v2.1.1", - "license": "BSD", - "name": "2.1.1", - "node": ">= 14" - } - ], - "versionsArray": ["2.1.1"] - }, - "pinpoint": { - "forks": 6, - "link": "https://github.com/hapijs/pinpoint", - "package": "@hapi/pinpoint", - "slogan": "Return the filename and line number of the calling function.", - "stars": 6, - "updated": "2023-11-12T09:48:56Z", - "versions": [ - { - "branch": "v2.0.1", - "license": "BSD", - "name": "2.0.1", - "node": ">= 14" - } - ], - "versionsArray": ["2.0.1"] - }, - "tlds": { - "forks": 2, - "link": "https://github.com/hapijs/tlds", - "package": "@hapi/tlds", - "slogan": "TLDS list for domain validation.", - "stars": 2, - "updated": "2026-02-17T14:09:37Z", - "versions": [ - { - "branch": "v1.1.6", - "license": "BSD", - "name": "1.1.6", - "node": ">= 14" - } - ], - "versionsArray": ["1.1.6"] - } + "address": { + "forks": 27, + "link": "https://github.com/hapijs/address", + "package": "@hapi/address", + "slogan": "Validate email address and domain.", + "stars": 33, + "updated": "2024-01-29T12:37:22Z", + "versions": [ + { + "branch": "v5.1.1", + "license": "BSD", + "name": "5.1.1", + "node": ">= 14" + } + ], + "versionsArray": ["5.1.1"] + }, + "formula": { + "forks": 20, + "link": "https://github.com/hapijs/formula", + "package": "@hapi/formula", + "slogan": "Math and string formula parser.", + "stars": 17, + "updated": "2024-02-02T16:21:44Z", + "versions": [ + { + "branch": "v3.0.2", + "license": "BSD", + "name": "3.0.2", + "node": ">= 14" + } + ], + "versionsArray": ["3.0.2"] + }, + "joi": { + "forks": 1509, + "link": "https://github.com/hapijs/joi", + "package": "joi", + "slogan": "The most powerful schema description language and data validator for JavaScript.", + "stars": 21202, + "updated": "2026-03-30T17:24:52Z", + "versions": [ + { + "branch": "v17.13.4", + "license": "BSD", + "name": "17.13.4", + "node": ">= 14" + }, + { + "branch": "v18.2.1", + "license": "BSD", + "name": "18.2.1", + "node": ">= 20" + } + ], + "versionsArray": ["18.2.1", "17.13.4"] + }, + "joi-date": { + "forks": 23, + "link": "https://github.com/hapijs/joi-date", + "package": "@joi/date", + "slogan": "Extensions for advance date rules.", + "stars": 81, + "updated": "2024-04-22T09:05:34Z", + "versions": [ + { + "branch": "v2.1.1", + "license": "BSD", + "name": "2.1.1", + "node": ">= 14" + } + ], + "versionsArray": ["2.1.1"] + }, + "pinpoint": { + "forks": 6, + "link": "https://github.com/hapijs/pinpoint", + "package": "@hapi/pinpoint", + "slogan": "Return the filename and line number of the calling function.", + "stars": 6, + "updated": "2023-11-12T09:48:56Z", + "versions": [ + { + "branch": "v2.0.1", + "license": "BSD", + "name": "2.0.1", + "node": ">= 14" + } + ], + "versionsArray": ["2.0.1"] + }, + "tlds": { + "forks": 2, + "link": "https://github.com/hapijs/tlds", + "package": "@hapi/tlds", + "slogan": "TLDS list for domain validation.", + "stars": 2, + "updated": "2026-02-17T14:09:37Z", + "versions": [ + { + "branch": "v1.1.7", + "license": "BSD", + "name": "1.1.7", + "node": ">= 14" + } + ], + "versionsArray": ["1.1.7"] + } } diff --git a/generated/modules/address/changelog.json b/generated/modules/address/changelog.json index fff81df..b77e32e 100644 --- a/generated/modules/address/changelog.json +++ b/generated/modules/address/changelog.json @@ -1,429 +1,429 @@ [ - { - "date": "2023-03-11T10:45:33Z", - "id": 9146991, - "issues": [ - { - "id": 1619963599, - "labels": [], - "number": 45, - "title": "chore: target node 14", - "url": "https://github.com/hapijs/address/pull/45" - } - ], - "number": 23, - "url": "https://github.com/hapijs/address/milestone/23", - "version": "5.1.1" - }, - { - "date": "2023-02-18T20:26:49Z", - "id": 9061974, - "issues": [ - { - "id": 1590444869, - "labels": [], - "number": 44, - "title": "chore: change package namespace and upgrade dependencies", - "url": "https://github.com/hapijs/address/pull/44" - }, - { - "id": 1357520760, - "labels": [], - "number": 43, - "title": "feat: add underscore support", - "url": "https://github.com/hapijs/address/pull/43" - }, - { - "id": 1224352951, - "labels": ["bug"], - "number": 42, - "title": "fix: minor improvements to typings and binary conversion", - "url": "https://github.com/hapijs/address/pull/42" - } - ], - "number": 22, - "url": "https://github.com/hapijs/address/milestone/22", - "version": "5.1.0" - }, - { - "date": "2022-05-02T05:42:21Z", - "id": 7793532, - "issues": [ - { - "id": 1222504847, - "labels": ["breaking changes", "feature", "types"], - "number": 41, - "title": "Change API", - "url": "https://github.com/hapijs/address/issues/41" - }, - { - "id": 1222504338, - "labels": ["breaking changes", "feature", "types"], - "number": 40, - "title": "Convert to TypeScript", - "url": "https://github.com/hapijs/address/issues/40" - }, - { - "id": 1222245015, - "labels": ["breaking changes", "dependency"], - "number": 39, - "title": "Drop node 12 support", - "url": "https://github.com/hapijs/address/issues/39" - }, - { - "id": 1202218015, - "labels": ["dependency"], - "number": 38, - "title": "Update tlds.js", - "url": "https://github.com/hapijs/address/pull/38" - } - ], - "number": 20, - "url": "https://github.com/hapijs/address/milestone/20", - "version": "5.0.0" - }, - { - "date": "2024-01-29T13:21:04Z", - "id": 10482555, - "issues": [ - { - "id": 2105392579, - "labels": ["bug"], - "number": 47, - "title": "chore: update tlds", - "url": "https://github.com/hapijs/address/pull/47" - } - ], - "number": 24, - "url": "https://github.com/hapijs/address/milestone/24", - "version": "4.1.5" - }, - { - "date": "2022-03-22T23:22:57Z", - "id": 7446122, - "issues": [ - { - "id": 1173205659, - "labels": ["dependency"], - "number": 37, - "title": "Update the TLDS for email validation", - "url": "https://github.com/hapijs/address/pull/37" - } - ], - "number": 19, - "url": "https://github.com/hapijs/address/milestone/19", - "version": "4.1.4" - }, - { - "date": "2021-12-01T08:38:39Z", - "id": 6735874, - "issues": [ - { - "id": 957589243, - "labels": ["bug"], - "number": 36, - "title": "Invalid input error validating link in schema", - "url": "https://github.com/hapijs/address/issues/36" - }, - { - "id": 654430948, - "labels": ["bug"], - "number": 31, - "title": "Incorrect validation", - "url": "https://github.com/hapijs/address/issues/31" - } - ], - "number": 18, - "url": "https://github.com/hapijs/address/milestone/18", - "version": "4.1.3" - }, - { - "date": "2021-05-07T06:11:07Z", - "id": 6403302, - "issues": [ - { - "id": 878502441, - "labels": ["bug"], - "number": 35, - "title": "Fails to invalidate URI delimiter chars on domain end", - "url": "https://github.com/hapijs/address/issues/35" - } - ], - "number": 17, - "url": "https://github.com/hapijs/address/milestone/17", - "version": "4.1.2" - }, - { - "date": "2021-02-08T01:02:42Z", - "id": 5619718, - "issues": [ - { - "id": 803109463, - "labels": ["bug"], - "number": 33, - "title": "Email validations rejects valid email addresses", - "url": "https://github.com/hapijs/address/issues/33" - } - ], - "number": 16, - "url": "https://github.com/hapijs/address/milestone/16", - "version": "4.1.1" - }, - { - "date": "2020-07-06T01:17:17Z", - "id": 5200674, - "issues": [ - { - "id": 651176115, - "labels": ["feature"], - "number": 30, - "title": "Support maxDomainSegments", - "url": "https://github.com/hapijs/address/issues/30" - } - ], - "number": 15, - "url": "https://github.com/hapijs/address/milestone/15", - "version": "4.1.0" - }, - { - "date": "2020-03-14T00:01:49Z", - "id": 4972515, - "issues": [ - { - "id": 580941272, - "labels": ["bug"], - "number": 26, - "title": "Capture domain in relative uris", - "url": "https://github.com/hapijs/address/issues/26" - } - ], - "number": 14, - "url": "https://github.com/hapijs/address/milestone/14", - "version": "4.0.1" - }, - { - "date": "2020-01-04T08:47:36Z", - "id": 4972513, - "issues": [ - { - "id": 545259529, - "labels": ["breaking changes", "dependency"], - "number": 24, - "title": "Only support node 12", - "url": "https://github.com/hapijs/address/issues/24" - } - ], - "number": 12, - "url": "https://github.com/hapijs/address/milestone/12", - "version": "4.0.0" - }, - { - "date": "2020-01-04T08:42:34Z", - "id": 4852228, - "issues": [ - { - "id": 523950264, - "labels": ["bug"], + { + "date": "2023-03-11T10:45:33Z", + "id": 9146991, + "issues": [ + { + "id": 1619963599, + "labels": [], + "number": 45, + "title": "chore: target node 14", + "url": "https://github.com/hapijs/address/pull/45" + } + ], + "number": 23, + "url": "https://github.com/hapijs/address/milestone/23", + "version": "5.1.1" + }, + { + "date": "2023-02-18T20:26:49Z", + "id": 9061974, + "issues": [ + { + "id": 1590444869, + "labels": [], + "number": 44, + "title": "chore: change package namespace and upgrade dependencies", + "url": "https://github.com/hapijs/address/pull/44" + }, + { + "id": 1357520760, + "labels": [], + "number": 43, + "title": "feat: add underscore support", + "url": "https://github.com/hapijs/address/pull/43" + }, + { + "id": 1224352951, + "labels": ["bug"], + "number": 42, + "title": "fix: minor improvements to typings and binary conversion", + "url": "https://github.com/hapijs/address/pull/42" + } + ], + "number": 22, + "url": "https://github.com/hapijs/address/milestone/22", + "version": "5.1.0" + }, + { + "date": "2022-05-02T05:42:21Z", + "id": 7793532, + "issues": [ + { + "id": 1222504847, + "labels": ["breaking changes", "feature", "types"], + "number": 41, + "title": "Change API", + "url": "https://github.com/hapijs/address/issues/41" + }, + { + "id": 1222504338, + "labels": ["breaking changes", "feature", "types"], + "number": 40, + "title": "Convert to TypeScript", + "url": "https://github.com/hapijs/address/issues/40" + }, + { + "id": 1222245015, + "labels": ["breaking changes", "dependency"], + "number": 39, + "title": "Drop node 12 support", + "url": "https://github.com/hapijs/address/issues/39" + }, + { + "id": 1202218015, + "labels": ["dependency"], + "number": 38, + "title": "Update tlds.js", + "url": "https://github.com/hapijs/address/pull/38" + } + ], "number": 20, - "title": "\"a@a.com/asd\" is invalid email", - "url": "https://github.com/hapijs/address/issues/20" - } - ], - "number": 10, - "url": "https://github.com/hapijs/address/milestone/10", - "version": "3.2.2" - }, - { - "date": "2019-11-17T05:50:55Z", - "id": 4800325, - "issues": [ - { - "id": 523939966, - "labels": ["bug"], + "url": "https://github.com/hapijs/address/milestone/20", + "version": "5.0.0" + }, + { + "date": "2024-01-29T13:21:04Z", + "id": 10482555, + "issues": [ + { + "id": 2105392579, + "labels": ["bug"], + "number": 47, + "title": "chore: update tlds", + "url": "https://github.com/hapijs/address/pull/47" + } + ], + "number": 24, + "url": "https://github.com/hapijs/address/milestone/24", + "version": "4.1.5" + }, + { + "date": "2022-03-22T23:22:57Z", + "id": 7446122, + "issues": [ + { + "id": 1173205659, + "labels": ["dependency"], + "number": 37, + "title": "Update the TLDS for email validation", + "url": "https://github.com/hapijs/address/pull/37" + } + ], + "number": 19, + "url": "https://github.com/hapijs/address/milestone/19", + "version": "4.1.4" + }, + { + "date": "2021-12-01T08:38:39Z", + "id": 6735874, + "issues": [ + { + "id": 957589243, + "labels": ["bug"], + "number": 36, + "title": "Invalid input error validating link in schema", + "url": "https://github.com/hapijs/address/issues/36" + }, + { + "id": 654430948, + "labels": ["bug"], + "number": 31, + "title": "Incorrect validation", + "url": "https://github.com/hapijs/address/issues/31" + } + ], "number": 18, - "title": "Error on email", - "url": "https://github.com/hapijs/address/issues/18" - } - ], - "number": 9, - "url": "https://github.com/hapijs/address/milestone/9", - "version": "3.2.1" - }, - { - "date": "2019-10-30T23:35:01Z", - "id": 4756274, - "issues": [ - { - "id": 515048003, - "labels": ["feature"], + "url": "https://github.com/hapijs/address/milestone/18", + "version": "4.1.3" + }, + { + "date": "2021-05-07T06:11:07Z", + "id": 6403302, + "issues": [ + { + "id": 878502441, + "labels": ["bug"], + "number": 35, + "title": "Fails to invalidate URI delimiter chars on domain end", + "url": "https://github.com/hapijs/address/issues/35" + } + ], + "number": 17, + "url": "https://github.com/hapijs/address/milestone/17", + "version": "4.1.2" + }, + { + "date": "2021-02-08T01:02:42Z", + "id": 5619718, + "issues": [ + { + "id": 803109463, + "labels": ["bug"], + "number": 33, + "title": "Email validations rejects valid email addresses", + "url": "https://github.com/hapijs/address/issues/33" + } + ], "number": 16, - "title": "Add faster version of decodeURIComponent()", - "url": "https://github.com/hapijs/address/issues/16" - }, - { - "id": 514435232, - "labels": ["feature"], + "url": "https://github.com/hapijs/address/milestone/16", + "version": "4.1.1" + }, + { + "date": "2020-07-06T01:17:17Z", + "id": 5200674, + "issues": [ + { + "id": 651176115, + "labels": ["feature"], + "number": 30, + "title": "Support maxDomainSegments", + "url": "https://github.com/hapijs/address/issues/30" + } + ], "number": 15, - "title": "Relocate joi uri and ip validation regex", - "url": "https://github.com/hapijs/address/issues/15" - } - ], - "number": 8, - "url": "https://github.com/hapijs/address/milestone/8", - "version": "3.2.0" - }, - { - "date": "2019-10-16T04:38:58Z", - "id": 4724458, - "issues": [ - { - "id": 506551200, - "labels": ["feature"], + "url": "https://github.com/hapijs/address/milestone/15", + "version": "4.1.0" + }, + { + "date": "2020-03-14T00:01:49Z", + "id": 4972515, + "issues": [ + { + "id": 580941272, + "labels": ["bug"], + "number": 26, + "title": "Capture domain in relative uris", + "url": "https://github.com/hapijs/address/issues/26" + } + ], "number": 14, - "title": "Error codes in a separate file. Closes #13", - "url": "https://github.com/hapijs/address/pull/14" - }, - { - "id": 505180439, - "labels": ["feature"], - "number": 13, - "title": "Export errors codes to allow translation", - "url": "https://github.com/hapijs/address/issues/13" - } - ], - "number": 7, - "url": "https://github.com/hapijs/address/milestone/7", - "version": "3.1.0" - }, - { - "date": "2019-10-06T01:46:35Z", - "id": 4724457, - "issues": [ - { - "id": 503024394, - "labels": ["breaking changes", "types"], + "url": "https://github.com/hapijs/address/milestone/14", + "version": "4.0.1" + }, + { + "date": "2020-01-04T08:47:36Z", + "id": 4972513, + "issues": [ + { + "id": 545259529, + "labels": ["breaking changes", "dependency"], + "number": 24, + "title": "Only support node 12", + "url": "https://github.com/hapijs/address/issues/24" + } + ], "number": 12, - "title": "Add types", - "url": "https://github.com/hapijs/address/issues/12" - }, - { - "id": 503024374, - "labels": ["breaking changes"], - "number": 11, - "title": "Drop node 8 support", - "url": "https://github.com/hapijs/address/issues/11" - } - ], - "number": 6, - "url": "https://github.com/hapijs/address/milestone/6", - "version": "3.0.0" - }, - { - "date": "2020-01-04T08:41:53Z", - "id": 4852229, - "issues": [ - { - "id": 523950299, - "labels": ["bug"], - "number": 21, - "title": "Backport #20", - "url": "https://github.com/hapijs/address/issues/21" - } - ], - "number": 11, - "url": "https://github.com/hapijs/address/milestone/11", - "version": "2.1.4" - }, - { - "date": "2019-11-17T05:57:02Z", - "id": 4678328, - "issues": [ - { - "id": 523941175, - "labels": ["bug"], - "number": 19, - "title": "Backport #18", - "url": "https://github.com/hapijs/address/issues/19" - } - ], - "number": 5, - "url": "https://github.com/hapijs/address/milestone/5", - "version": "2.1.3" - }, - { - "date": "2019-09-20T20:04:52Z", - "id": 4633488, - "issues": [ - { - "id": 496524175, - "labels": ["dependency"], + "url": "https://github.com/hapijs/address/milestone/12", + "version": "4.0.0" + }, + { + "date": "2020-01-04T08:42:34Z", + "id": 4852228, + "issues": [ + { + "id": 523950264, + "labels": ["bug"], + "number": 20, + "title": "\"a@a.com/asd\" is invalid email", + "url": "https://github.com/hapijs/address/issues/20" + } + ], + "number": 10, + "url": "https://github.com/hapijs/address/milestone/10", + "version": "3.2.2" + }, + { + "date": "2019-11-17T05:50:55Z", + "id": 4800325, + "issues": [ + { + "id": 523939966, + "labels": ["bug"], + "number": 18, + "title": "Error on email", + "url": "https://github.com/hapijs/address/issues/18" + } + ], "number": 9, - "title": "Update tlds", - "url": "https://github.com/hapijs/address/issues/9" - }, - { - "id": 496281024, - "labels": ["bug"], + "url": "https://github.com/hapijs/address/milestone/9", + "version": "3.2.1" + }, + { + "date": "2019-10-30T23:35:01Z", + "id": 4756274, + "issues": [ + { + "id": 515048003, + "labels": ["feature"], + "number": 16, + "title": "Add faster version of decodeURIComponent()", + "url": "https://github.com/hapijs/address/issues/16" + }, + { + "id": 514435232, + "labels": ["feature"], + "number": 15, + "title": "Relocate joi uri and ip validation regex", + "url": "https://github.com/hapijs/address/issues/15" + } + ], "number": 8, - "title": "Ensure Buffer presence before using it", - "url": "https://github.com/hapijs/address/pull/8" - }, - { - "id": 489753207, - "labels": ["dependency"], + "url": "https://github.com/hapijs/address/milestone/8", + "version": "3.2.0" + }, + { + "date": "2019-10-16T04:38:58Z", + "id": 4724458, + "issues": [ + { + "id": 506551200, + "labels": ["feature"], + "number": 14, + "title": "Error codes in a separate file. Closes #13", + "url": "https://github.com/hapijs/address/pull/14" + }, + { + "id": 505180439, + "labels": ["feature"], + "number": 13, + "title": "Export errors codes to allow translation", + "url": "https://github.com/hapijs/address/issues/13" + } + ], "number": 7, - "title": "Re-implement #4, #6", - "url": "https://github.com/hapijs/address/issues/7" - } - ], - "number": 4, - "url": "https://github.com/hapijs/address/milestone/4", - "version": "2.1.2" - }, - { - "date": "2019-09-05T09:14:22Z", - "id": 4623590, - "issues": [ - { - "id": 489628727, - "labels": ["dependency"], + "url": "https://github.com/hapijs/address/milestone/7", + "version": "3.1.0" + }, + { + "date": "2019-10-06T01:46:35Z", + "id": 4724457, + "issues": [ + { + "id": 503024394, + "labels": ["breaking changes", "types"], + "number": 12, + "title": "Add types", + "url": "https://github.com/hapijs/address/issues/12" + }, + { + "id": 503024374, + "labels": ["breaking changes"], + "number": 11, + "title": "Drop node 8 support", + "url": "https://github.com/hapijs/address/issues/11" + } + ], "number": 6, - "title": "Revert Url hack", - "url": "https://github.com/hapijs/address/issues/6" - } - ], - "number": 3, - "url": "https://github.com/hapijs/address/milestone/3", - "version": "2.1.1" - }, - { - "date": "2019-09-03T13:40:33Z", - "id": 4167339, - "issues": [ - { - "id": 488612705, - "labels": ["feature"], + "url": "https://github.com/hapijs/address/milestone/6", + "version": "3.0.0" + }, + { + "date": "2020-01-04T08:41:53Z", + "id": 4852229, + "issues": [ + { + "id": 523950299, + "labels": ["bug"], + "number": 21, + "title": "Backport #20", + "url": "https://github.com/hapijs/address/issues/21" + } + ], + "number": 11, + "url": "https://github.com/hapijs/address/milestone/11", + "version": "2.1.4" + }, + { + "date": "2019-11-17T05:57:02Z", + "id": 4678328, + "issues": [ + { + "id": 523941175, + "labels": ["bug"], + "number": 19, + "title": "Backport #18", + "url": "https://github.com/hapijs/address/issues/19" + } + ], "number": 5, - "title": "Make tlds optional", - "url": "https://github.com/hapijs/address/issues/5" - }, - { - "id": 488146599, - "labels": ["dependency"], + "url": "https://github.com/hapijs/address/milestone/5", + "version": "2.1.3" + }, + { + "date": "2019-09-20T20:04:52Z", + "id": 4633488, + "issues": [ + { + "id": 496524175, + "labels": ["dependency"], + "number": 9, + "title": "Update tlds", + "url": "https://github.com/hapijs/address/issues/9" + }, + { + "id": 496281024, + "labels": ["bug"], + "number": 8, + "title": "Ensure Buffer presence before using it", + "url": "https://github.com/hapijs/address/pull/8" + }, + { + "id": 489753207, + "labels": ["dependency"], + "number": 7, + "title": "Re-implement #4, #6", + "url": "https://github.com/hapijs/address/issues/7" + } + ], "number": 4, - "title": "Replace punycode dep with URL hack", - "url": "https://github.com/hapijs/address/pull/4" - }, - { - "id": 465915090, - "labels": ["feature"], - "number": 1, - "title": "Support option to allow longer email addresses", - "url": "https://github.com/hapijs/address/issues/1" - } - ], - "number": 2, - "url": "https://github.com/hapijs/address/milestone/2", - "version": "2.1.0" - } + "url": "https://github.com/hapijs/address/milestone/4", + "version": "2.1.2" + }, + { + "date": "2019-09-05T09:14:22Z", + "id": 4623590, + "issues": [ + { + "id": 489628727, + "labels": ["dependency"], + "number": 6, + "title": "Revert Url hack", + "url": "https://github.com/hapijs/address/issues/6" + } + ], + "number": 3, + "url": "https://github.com/hapijs/address/milestone/3", + "version": "2.1.1" + }, + { + "date": "2019-09-03T13:40:33Z", + "id": 4167339, + "issues": [ + { + "id": 488612705, + "labels": ["feature"], + "number": 5, + "title": "Make tlds optional", + "url": "https://github.com/hapijs/address/issues/5" + }, + { + "id": 488146599, + "labels": ["dependency"], + "number": 4, + "title": "Replace punycode dep with URL hack", + "url": "https://github.com/hapijs/address/pull/4" + }, + { + "id": 465915090, + "labels": ["feature"], + "number": 1, + "title": "Support option to allow longer email addresses", + "url": "https://github.com/hapijs/address/issues/1" + } + ], + "number": 2, + "url": "https://github.com/hapijs/address/milestone/2", + "version": "2.1.0" + } ] diff --git a/generated/modules/address/info.json b/generated/modules/address/info.json index 28f9edf..78fb9a8 100644 --- a/generated/modules/address/info.json +++ b/generated/modules/address/info.json @@ -1,19 +1,19 @@ { - "api": true, - "forks": 27, - "link": "https://github.com/hapijs/address", - "name": "address", - "package": "@hapi/address", - "slogan": "Validate email address and domain.", - "stars": 33, - "updated": "2024-01-29T12:37:22Z", - "versions": [ - { - "branch": "v5.1.1", - "license": "BSD", - "name": "5.1.1", - "node": ">= 14" - } - ], - "versionsArray": ["5.1.1"] + "api": true, + "forks": 27, + "link": "https://github.com/hapijs/address", + "name": "address", + "package": "@hapi/address", + "slogan": "Validate email address and domain.", + "stars": 33, + "updated": "2024-01-29T12:37:22Z", + "versions": [ + { + "branch": "v5.1.1", + "license": "BSD", + "name": "5.1.1", + "node": ">= 14" + } + ], + "versionsArray": ["5.1.1"] } diff --git a/generated/modules/formula/changelog.json b/generated/modules/formula/changelog.json index cf80746..47564ca 100644 --- a/generated/modules/formula/changelog.json +++ b/generated/modules/formula/changelog.json @@ -1,112 +1,112 @@ [ - { - "date": "2023-02-19T10:51:54Z", - "id": 9063122, - "issues": [ - { - "id": 1590641372, - "labels": [], - "number": 11, - "title": "chore: change package namespace", - "url": "https://github.com/hapijs/formula/pull/11" - } - ], - "number": 8, - "url": "https://github.com/hapijs/formula/milestone/8", - "version": "3.0.2" - }, - { - "date": "2023-02-19T10:50:16Z", - "id": 4972530, - "issues": [ - { - "id": 1590642366, - "labels": ["bug", "security"], - "number": 12, - "title": "fix redos on numbers", - "url": "https://github.com/hapijs/formula/issues/12" - } - ], - "number": 7, - "url": "https://github.com/hapijs/formula/milestone/7", - "version": "3.0.1" - }, - { - "date": "2020-01-04T08:54:02Z", - "id": 4972529, - "issues": [ - { - "id": 545260282, - "labels": ["breaking changes", "dependency"], - "number": 10, - "title": "Support only node 12", - "url": "https://github.com/hapijs/formula/issues/10" - } - ], - "number": 6, - "url": "https://github.com/hapijs/formula/milestone/6", - "version": "3.0.0" - }, - { - "date": "2019-10-07T04:46:26Z", - "id": 4724607, - "issues": [ - { - "id": 503229738, - "labels": ["breaking changes", "dependency"], + { + "date": "2023-02-19T10:51:54Z", + "id": 9063122, + "issues": [ + { + "id": 1590641372, + "labels": [], + "number": 11, + "title": "chore: change package namespace", + "url": "https://github.com/hapijs/formula/pull/11" + } + ], "number": 8, - "title": "Drop node 8", - "url": "https://github.com/hapijs/formula/issues/8" - }, - { - "id": 503046709, - "labels": ["breaking changes"], + "url": "https://github.com/hapijs/formula/milestone/8", + "version": "3.0.2" + }, + { + "date": "2023-02-19T10:50:16Z", + "id": 4972530, + "issues": [ + { + "id": 1590642366, + "labels": ["bug", "security"], + "number": 12, + "title": "fix redos on numbers", + "url": "https://github.com/hapijs/formula/issues/12" + } + ], "number": 7, - "title": "Change default export", - "url": "https://github.com/hapijs/formula/issues/7" - }, - { - "id": 503046658, - "labels": ["types", "breaking changes"], + "url": "https://github.com/hapijs/formula/milestone/7", + "version": "3.0.1" + }, + { + "date": "2020-01-04T08:54:02Z", + "id": 4972529, + "issues": [ + { + "id": 545260282, + "labels": ["breaking changes", "dependency"], + "number": 10, + "title": "Support only node 12", + "url": "https://github.com/hapijs/formula/issues/10" + } + ], "number": 6, - "title": "Add types", - "url": "https://github.com/hapijs/formula/issues/6" - } - ], - "number": 4, - "url": "https://github.com/hapijs/formula/milestone/4", - "version": "2.0.0" - }, - { - "date": "2019-08-09T08:37:32Z", - "id": 4437361, - "issues": [ - { - "id": 478867827, - "labels": ["feature"], + "url": "https://github.com/hapijs/formula/milestone/6", + "version": "3.0.0" + }, + { + "date": "2019-10-07T04:46:26Z", + "id": 4724607, + "issues": [ + { + "id": 503229738, + "labels": ["breaking changes", "dependency"], + "number": 8, + "title": "Drop node 8", + "url": "https://github.com/hapijs/formula/issues/8" + }, + { + "id": 503046709, + "labels": ["breaking changes"], + "number": 7, + "title": "Change default export", + "url": "https://github.com/hapijs/formula/issues/7" + }, + { + "id": 503046658, + "labels": ["types", "breaking changes"], + "number": 6, + "title": "Add types", + "url": "https://github.com/hapijs/formula/issues/6" + } + ], + "number": 4, + "url": "https://github.com/hapijs/formula/milestone/4", + "version": "2.0.0" + }, + { + "date": "2019-08-09T08:37:32Z", + "id": 4437361, + "issues": [ + { + "id": 478867827, + "labels": ["feature"], + "number": 2, + "title": "Bind functions to context", + "url": "https://github.com/hapijs/formula/issues/2" + } + ], "number": 2, - "title": "Bind functions to context", - "url": "https://github.com/hapijs/formula/issues/2" - } - ], - "number": 2, - "url": "https://github.com/hapijs/formula/milestone/2", - "version": "1.2.0" - }, - { - "date": "2019-06-24T18:43:34Z", - "id": 4437360, - "issues": [ - { - "id": 460038563, - "labels": ["feature"], + "url": "https://github.com/hapijs/formula/milestone/2", + "version": "1.2.0" + }, + { + "date": "2019-06-24T18:43:34Z", + "id": 4437360, + "issues": [ + { + "id": 460038563, + "labels": ["feature"], + "number": 1, + "title": "Identify single part", + "url": "https://github.com/hapijs/formula/issues/1" + } + ], "number": 1, - "title": "Identify single part", - "url": "https://github.com/hapijs/formula/issues/1" - } - ], - "number": 1, - "url": "https://github.com/hapijs/formula/milestone/1", - "version": "1.1.0" - } + "url": "https://github.com/hapijs/formula/milestone/1", + "version": "1.1.0" + } ] diff --git a/generated/modules/formula/info.json b/generated/modules/formula/info.json index 71ad005..9b64471 100644 --- a/generated/modules/formula/info.json +++ b/generated/modules/formula/info.json @@ -1,19 +1,19 @@ { - "api": true, - "forks": 20, - "link": "https://github.com/hapijs/formula", - "name": "formula", - "package": "@hapi/formula", - "slogan": "Math and string formula parser.", - "stars": 17, - "updated": "2024-02-02T16:21:44Z", - "versions": [ - { - "branch": "v3.0.2", - "license": "BSD", - "name": "3.0.2", - "node": ">= 14" - } - ], - "versionsArray": ["3.0.2"] + "api": true, + "forks": 20, + "link": "https://github.com/hapijs/formula", + "name": "formula", + "package": "@hapi/formula", + "slogan": "Math and string formula parser.", + "stars": 17, + "updated": "2024-02-02T16:21:44Z", + "versions": [ + { + "branch": "v3.0.2", + "license": "BSD", + "name": "3.0.2", + "node": ">= 14" + } + ], + "versionsArray": ["3.0.2"] } diff --git a/generated/modules/joi-date/changelog.json b/generated/modules/joi-date/changelog.json index 0f996e7..1a174e1 100644 --- a/generated/modules/joi-date/changelog.json +++ b/generated/modules/joi-date/changelog.json @@ -1,176 +1,176 @@ [ - { - "date": "2024-04-22T09:08:12Z", - "id": 6609017, - "issues": [ - { - "id": 2255988398, - "labels": ["bug"], - "number": 45, - "title": "fix: wrong default export", - "url": "https://github.com/hapijs/joi-date/pull/45" - } - ], - "number": 10, - "url": "https://github.com/hapijs/joi-date/milestone/10", - "version": "2.1.1" - }, - { - "date": "2021-03-30T17:07:34Z", - "id": 4724219, - "issues": [ - { - "id": 844462507, - "labels": ["feature", "types"], - "number": 38, - "title": "Add typescript types", - "url": "https://github.com/hapijs/joi-date/pull/38" - }, - { - "id": 537794284, - "labels": ["types"], - "number": 26, - "title": "Typescript Support?", - "url": "https://github.com/hapijs/joi-date/issues/26" - } - ], - "number": 9, - "url": "https://github.com/hapijs/joi-date/milestone/9", - "version": "2.1.0" - }, - { - "date": "2019-10-05T17:39:20Z", - "id": 4652451, - "issues": [ - { - "id": 499587630, - "labels": ["bug"], - "number": 25, - "title": "Fails to enforce required format when value is a number string", - "url": "https://github.com/hapijs/joi-date/issues/25" - } - ], - "number": 8, - "url": "https://github.com/hapijs/joi-date/milestone/8", - "version": "2.0.1" - }, - { - "date": "2019-09-11T23:22:56Z", - "id": 4247639, - "issues": [ - { - "id": 479153863, - "labels": ["dependency", "breaking changes"], - "number": 22, - "title": "Support joi v16", - "url": "https://github.com/hapijs/joi-date/issues/22" - }, - { - "id": 386290578, - "labels": ["bug"], - "number": 13, - "title": "Issue with \".allow\" whitelists", - "url": "https://github.com/hapijs/joi-date/issues/13" - } - ], - "number": 7, - "url": "https://github.com/hapijs/joi-date/milestone/7", - "version": "2.0.0" - }, - { - "date": "2019-04-22T07:25:30Z", - "id": 4247638, - "issues": [ - { - "id": 435622391, - "labels": ["dependency"], - "number": 17, - "title": "Change module namespace", - "url": "https://github.com/hapijs/joi-date/issues/17" - } - ], - "number": 6, - "url": "https://github.com/hapijs/joi-date/milestone/6", - "version": "1.3.0" - }, - { - "date": "2019-04-22T06:55:33Z", - "id": 3277572, - "issues": [ - { - "id": 312027071, - "labels": ["feature"], + { + "date": "2024-04-22T09:08:12Z", + "id": 6609017, + "issues": [ + { + "id": 2255988398, + "labels": ["bug"], + "number": 45, + "title": "fix: wrong default export", + "url": "https://github.com/hapijs/joi-date/pull/45" + } + ], + "number": 10, + "url": "https://github.com/hapijs/joi-date/milestone/10", + "version": "2.1.1" + }, + { + "date": "2021-03-30T17:07:34Z", + "id": 4724219, + "issues": [ + { + "id": 844462507, + "labels": ["feature", "types"], + "number": 38, + "title": "Add typescript types", + "url": "https://github.com/hapijs/joi-date/pull/38" + }, + { + "id": 537794284, + "labels": ["types"], + "number": 26, + "title": "Typescript Support?", + "url": "https://github.com/hapijs/joi-date/issues/26" + } + ], "number": 9, - "title": "Add support for UTC parsing mode", - "url": "https://github.com/hapijs/joi-date/pull/9" - } - ], - "number": 5, - "url": "https://github.com/hapijs/joi-date/milestone/5", - "version": "1.2.0" - }, - { - "date": "2018-02-16T19:31:38Z", - "id": 3123005, - "issues": [ - { - "id": 297846505, - "labels": ["dependency"], + "url": "https://github.com/hapijs/joi-date/milestone/9", + "version": "2.1.0" + }, + { + "date": "2019-10-05T17:39:20Z", + "id": 4652451, + "issues": [ + { + "id": 499587630, + "labels": ["bug"], + "number": 25, + "title": "Fails to enforce required format when value is a number string", + "url": "https://github.com/hapijs/joi-date/issues/25" + } + ], + "number": 8, + "url": "https://github.com/hapijs/joi-date/milestone/8", + "version": "2.0.1" + }, + { + "date": "2019-09-11T23:22:56Z", + "id": 4247639, + "issues": [ + { + "id": 479153863, + "labels": ["dependency", "breaking changes"], + "number": 22, + "title": "Support joi v16", + "url": "https://github.com/hapijs/joi-date/issues/22" + }, + { + "id": 386290578, + "labels": ["bug"], + "number": 13, + "title": "Issue with \".allow\" whitelists", + "url": "https://github.com/hapijs/joi-date/issues/13" + } + ], "number": 7, - "title": "fix(package): remove unused hoek dependency", - "url": "https://github.com/hapijs/joi-date/pull/7" - } - ], - "number": 4, - "url": "https://github.com/hapijs/joi-date/milestone/4", - "version": "1.1.1" - }, - { - "date": "2017-09-26T15:47:43Z", - "id": 2795154, - "issues": [ - { - "id": 260659100, - "labels": [], + "url": "https://github.com/hapijs/joi-date/milestone/7", + "version": "2.0.0" + }, + { + "date": "2019-04-22T07:25:30Z", + "id": 4247638, + "issues": [ + { + "id": 435622391, + "labels": ["dependency"], + "number": 17, + "title": "Change module namespace", + "url": "https://github.com/hapijs/joi-date/issues/17" + } + ], + "number": 6, + "url": "https://github.com/hapijs/joi-date/milestone/6", + "version": "1.3.0" + }, + { + "date": "2019-04-22T06:55:33Z", + "id": 3277572, + "issues": [ + { + "id": 312027071, + "labels": ["feature"], + "number": 9, + "title": "Add support for UTC parsing mode", + "url": "https://github.com/hapijs/joi-date/pull/9" + } + ], "number": 5, - "title": "feat(index): use provided joi instance", - "url": "https://github.com/hapijs/joi-date/pull/5" - } - ], - "number": 3, - "url": "https://github.com/hapijs/joi-date/milestone/3", - "version": "1.1.0" - }, - { - "date": "2017-09-26T15:47:44Z", - "id": 2284541, - "issues": [ - { - "id": 203827772, - "labels": ["bug"], + "url": "https://github.com/hapijs/joi-date/milestone/5", + "version": "1.2.0" + }, + { + "date": "2018-02-16T19:31:38Z", + "id": 3123005, + "issues": [ + { + "id": 297846505, + "labels": ["dependency"], + "number": 7, + "title": "fix(package): remove unused hoek dependency", + "url": "https://github.com/hapijs/joi-date/pull/7" + } + ], + "number": 4, + "url": "https://github.com/hapijs/joi-date/milestone/4", + "version": "1.1.1" + }, + { + "date": "2017-09-26T15:47:43Z", + "id": 2795154, + "issues": [ + { + "id": 260659100, + "labels": [], + "number": 5, + "title": "feat(index): use provided joi instance", + "url": "https://github.com/hapijs/joi-date/pull/5" + } + ], "number": 3, - "title": "Add Joi peerDependency", - "url": "https://github.com/hapijs/joi-date/pull/3" - } - ], - "number": 2, - "url": "https://github.com/hapijs/joi-date/milestone/2", - "version": "1.0.2" - }, - { - "date": "2016-11-22T16:19:54Z", - "id": 2151876, - "issues": [ - { - "id": 191048766, - "labels": ["bug"], + "url": "https://github.com/hapijs/joi-date/milestone/3", + "version": "1.1.0" + }, + { + "date": "2017-09-26T15:47:44Z", + "id": 2284541, + "issues": [ + { + "id": 203827772, + "labels": ["bug"], + "number": 3, + "title": "Add Joi peerDependency", + "url": "https://github.com/hapijs/joi-date/pull/3" + } + ], "number": 2, - "title": "Issue with optional date", - "url": "https://github.com/hapijs/joi-date/issues/2" - } - ], - "number": 1, - "url": "https://github.com/hapijs/joi-date/milestone/1", - "version": "1.0.1" - } + "url": "https://github.com/hapijs/joi-date/milestone/2", + "version": "1.0.2" + }, + { + "date": "2016-11-22T16:19:54Z", + "id": 2151876, + "issues": [ + { + "id": 191048766, + "labels": ["bug"], + "number": 2, + "title": "Issue with optional date", + "url": "https://github.com/hapijs/joi-date/issues/2" + } + ], + "number": 1, + "url": "https://github.com/hapijs/joi-date/milestone/1", + "version": "1.0.1" + } ] diff --git a/generated/modules/joi-date/info.json b/generated/modules/joi-date/info.json index 0667569..bb23a64 100644 --- a/generated/modules/joi-date/info.json +++ b/generated/modules/joi-date/info.json @@ -1,19 +1,19 @@ { - "api": true, - "forks": 23, - "link": "https://github.com/hapijs/joi-date", - "name": "joi-date", - "package": "@joi/date", - "slogan": "Extensions for advance date rules.", - "stars": 81, - "updated": "2024-04-22T09:05:34Z", - "versions": [ - { - "branch": "v2.1.1", - "license": "BSD", - "name": "2.1.1", - "node": ">= 14" - } - ], - "versionsArray": ["2.1.1"] + "api": true, + "forks": 23, + "link": "https://github.com/hapijs/joi-date", + "name": "joi-date", + "package": "@joi/date", + "slogan": "Extensions for advance date rules.", + "stars": 81, + "updated": "2024-04-22T09:05:34Z", + "versions": [ + { + "branch": "v2.1.1", + "license": "BSD", + "name": "2.1.1", + "node": ">= 14" + } + ], + "versionsArray": ["2.1.1"] } diff --git a/generated/modules/joi/changelog.json b/generated/modules/joi/changelog.json index 1f34420..dc07b1f 100644 --- a/generated/modules/joi/changelog.json +++ b/generated/modules/joi/changelog.json @@ -1,8673 +1,8689 @@ [ - { - "date": "2026-05-04T16:09:20Z", - "id": 15790448, - "issues": [ - { - "id": 4377943724, - "labels": ["bug"], - "number": 3113, - "title": "fix: protect link recursion from max call stack", - "url": "https://github.com/hapijs/joi/pull/3113" - } - ], - "number": 214, - "url": "https://github.com/hapijs/joi/milestone/214", - "version": "18.2.1" - }, - { - "date": "2026-05-04T15:16:15Z", - "id": 15789816, - "issues": [ - { - "id": 4377623767, - "labels": ["feature"], - "number": 3111, - "title": "feat: add maxRecursion limit to links", - "url": "https://github.com/hapijs/joi/pull/3111" - }, - { - "id": 1150539161, - "labels": ["support"], - "number": 2747, - "title": "Limit depth of self-referencing schema", - "url": "https://github.com/hapijs/joi/issues/2747" - } - ], - "number": 213, - "url": "https://github.com/hapijs/joi/milestone/213", - "version": "18.2.0" - }, - { - "date": "2026-03-30T18:05:09Z", - "id": 15356910, - "issues": [ - { - "id": 4166157537, - "labels": ["bug"], - "number": 3107, - "title": "fix: improve JSON Schema conversion for number.port() and number.sign()", - "url": "https://github.com/hapijs/joi/pull/3107" - } - ], - "number": 212, - "url": "https://github.com/hapijs/joi/milestone/212", - "version": "18.1.2" - }, - { - "date": "2026-03-23T17:52:59Z", - "id": 15258251, - "issues": [ - { - "id": 4114694252, - "labels": ["bug"], - "number": 3103, - "title": "fix: allow NaN in schema describe() output validation", - "url": "https://github.com/hapijs/joi/pull/3103" - }, - { - "id": 3936661366, - "labels": ["bug"], - "number": 3099, - "title": "Fix braces escaping when template doesn't contains any variable", - "url": "https://github.com/hapijs/joi/pull/3099" - }, - { - "id": 3927008897, - "labels": ["bug"], - "number": 3098, - "title": "Support libraryOptions in standard validator validate()", - "url": "https://github.com/hapijs/joi/issues/3098" - }, - { - "id": 3926990031, - "labels": ["bug"], - "number": 3097, - "title": "feat: enhance validation to support options in standard function", - "url": "https://github.com/hapijs/joi/pull/3097" - }, - { - "id": 3749176772, - "labels": ["bug"], - "number": 3094, - "title": "any.describe() throws an error if the schema contains .allow(NaN)", - "url": "https://github.com/hapijs/joi/issues/3094" - } - ], - "number": 211, - "url": "https://github.com/hapijs/joi/milestone/211", - "version": "18.1.1" - }, - { - "date": "2026-03-23T17:05:08Z", - "id": 15216237, - "issues": [ - { - "id": 4098194752, - "labels": ["feature"], - "number": 3102, - "title": "feat: add Standard JSON Schema", - "url": "https://github.com/hapijs/joi/pull/3102" - }, - { - "id": 3922339917, - "labels": ["feature"], - "number": 3096, - "title": "Consider implementing Standard JSON Schema", - "url": "https://github.com/hapijs/joi/issues/3096" - } - ], - "number": 210, - "url": "https://github.com/hapijs/joi/milestone/210", - "version": "18.1.0" - }, - { - "date": "2025-11-19T15:50:15Z", - "id": 14176130, - "issues": [ - { - "id": 3563309382, - "labels": ["bug"], - "number": 3092, - "title": "fix: allow coercion of string booleans with trailing whitespace", - "url": "https://github.com/hapijs/joi/pull/3092" - }, - { - "id": 3546328972, - "labels": ["bug"], - "number": 3091, - "title": "Joi.boolean() does not handle strings with trailing spaces", - "url": "https://github.com/hapijs/joi/issues/3091" - } - ], - "number": 209, - "url": "https://github.com/hapijs/joi/milestone/209", - "version": "18.0.2" - }, - { - "date": "2025-08-20T08:21:01Z", - "id": 13527492, - "issues": [ - { - "id": 3306222585, - "labels": ["types"], - "number": 3087, - "title": "fix: proper types for more complex cases of array", - "url": "https://github.com/hapijs/joi/pull/3087" - }, - { - "id": 3305853768, - "labels": ["bug", "types"], - "number": 3086, - "title": ".array().items() dynamic type item type schema causes issues in typescript", - "url": "https://github.com/hapijs/joi/issues/3086" - } - ], - "number": 208, - "url": "https://github.com/hapijs/joi/milestone/208", - "version": "18.0.1" - }, - { - "date": "2025-08-03T15:02:01Z", - "id": 9147309, - "issues": [ - { - "id": 3278056010, - "labels": ["feature"], - "number": 3084, - "title": "feat: add isAsync() helper", - "url": "https://github.com/hapijs/joi/pull/3084" - }, - { - "id": 3150627812, - "labels": ["feature"], - "number": 3082, - "title": "Added wrapper option to uuid function", - "url": "https://github.com/hapijs/joi/pull/3082" - }, - { - "id": 3101562683, - "labels": ["feature"], - "number": 3080, - "title": "feat: implement standard schema spec", - "url": "https://github.com/hapijs/joi/pull/3080" - }, - { - "id": 3092026275, - "labels": ["feature"], - "number": 3078, - "title": "Implement Standard Schema", - "url": "https://github.com/hapijs/joi/issues/3078" - }, - { - "id": 1953253079, - "labels": ["support"], - "number": 2993, - "title": "What version of node does this library support?", - "url": "https://github.com/hapijs/joi/issues/2993" - }, - { - "id": 1865188160, - "labels": ["types"], - "number": 2982, - "title": "feat: Improve array().items type", - "url": "https://github.com/hapijs/joi/pull/2982" - }, - { - "id": 1865047279, - "labels": ["types"], - "number": 2981, - "title": "feat: Improve alternatives type", - "url": "https://github.com/hapijs/joi/pull/2981" - }, - { - "id": 1620062252, - "labels": ["feature", "breaking changes", "release notes"], - "number": 2926, - "title": "18.0.0 Release Notes", - "url": "https://github.com/hapijs/joi/issues/2926" - }, - { - "id": 1620047715, - "labels": ["feature", "breaking changes", "dependency"], - "number": 2925, - "title": "chore: upgrade modules", - "url": "https://github.com/hapijs/joi/pull/2925" - } - ], - "number": 190, - "url": "https://github.com/hapijs/joi/milestone/190", - "version": "18.0.0" - }, - { - "date": "2024-06-19T15:17:24Z", - "id": 11206916, - "issues": [ - { - "id": 2362616850, - "labels": ["bug"], - "number": 3043, - "title": "fix: correct function type in alternatives error", - "url": "https://github.com/hapijs/joi/pull/3043" - } - ], - "number": 207, - "url": "https://github.com/hapijs/joi/milestone/207", - "version": "17.13.3" - }, - { - "date": "2024-06-19T12:37:04Z", - "id": 11205378, - "issues": [ - { - "id": 2295899329, - "labels": ["bug"], - "number": 3037, - "title": "fix: `stripUnknown` should honor local explicit `.unknown(false)`", - "url": "https://github.com/hapijs/joi/pull/3037" - } - ], - "number": 206, - "url": "https://github.com/hapijs/joi/milestone/206", - "version": "17.13.2" - }, - { - "date": "2024-06-19T09:15:12Z", - "id": 11000255, - "issues": [ - { - "id": 2274746403, - "labels": ["bug"], - "number": 3034, - "title": "fix: label false should also hide explicit labels", - "url": "https://github.com/hapijs/joi/pull/3034" - }, - { - "id": 2273576913, - "labels": ["bug"], - "number": 3033, - "title": "Setting `errors.label` to `false` does not remove labels from error messages for keys with labels", - "url": "https://github.com/hapijs/joi/issues/3033" - } - ], - "number": 205, - "url": "https://github.com/hapijs/joi/milestone/205", - "version": "17.13.1" - }, - { - "date": "2024-04-23T08:35:37Z", - "id": 10769457, - "issues": [ - { - "id": 2258261381, - "labels": ["feature"], - "number": 3032, - "title": "feat: support encoding uri (follow-up to #3027)", - "url": "https://github.com/hapijs/joi/pull/3032" - }, - { - "id": 2216423112, - "labels": ["feature"], - "number": 3027, - "title": "feat: Support encoding uri", - "url": "https://github.com/hapijs/joi/pull/3027" - }, - { - "id": 1489081742, - "labels": ["feature"], - "number": 2889, - "title": "string().uri() not working with accented characters", - "url": "https://github.com/hapijs/joi/issues/2889" - } - ], - "number": 204, - "url": "https://github.com/hapijs/joi/milestone/204", - "version": "17.13.0" - }, - { - "date": "2024-04-03T21:37:44Z", - "id": 10769395, - "issues": [ - { - "id": 2215661765, - "labels": ["bug"], - "number": 3026, - "title": "fix: handle bigint in unique rule", - "url": "https://github.com/hapijs/joi/pull/3026" - } - ], - "number": 203, - "url": "https://github.com/hapijs/joi/milestone/203", - "version": "17.12.3" - }, - { - "date": "2024-02-21T18:44:59Z", - "id": 10588351, - "issues": [ - { - "id": 2139645423, - "labels": ["types"], - "number": 3018, - "title": "Fix issue 2730 - Wrong State['path'] type", - "url": "https://github.com/hapijs/joi/pull/3018" - }, - { - "id": 1111849600, - "labels": ["types"], - "number": 2730, - "title": "Wrong `State['path']` type", - "url": "https://github.com/hapijs/joi/issues/2730" - } - ], - "number": 202, - "url": "https://github.com/hapijs/joi/milestone/202", - "version": "17.12.2" - }, - { - "date": "2024-01-29T13:44:48Z", - "id": 10482661, - "issues": [ - { - "id": 2105483334, - "labels": ["bug"], - "number": 3016, - "title": "fix: domain default tld validation", - "url": "https://github.com/hapijs/joi/pull/3016" - }, - { - "id": 2097724714, - "labels": ["bug"], - "number": 3015, - "title": "fix: domain default tld validation", - "url": "https://github.com/hapijs/joi/pull/3015" - }, - { - "id": 2049526270, - "labels": ["bug"], - "number": 3007, - "title": "Domain validation not checking IANA registry by default", - "url": "https://github.com/hapijs/joi/issues/3007" - } - ], - "number": 201, - "url": "https://github.com/hapijs/joi/milestone/201", - "version": "17.12.1" - }, - { - "date": "2024-01-18T00:04:23Z", - "id": 10431827, - "issues": [ - { - "id": 2087195431, - "labels": ["feature"], - "number": 3014, - "title": "feat: hex prefix", - "url": "https://github.com/hapijs/joi/pull/3014" - }, - { - "id": 2073453048, - "labels": ["feature"], - "number": 3011, - "title": "Allow 0x prefix for hex strings", - "url": "https://github.com/hapijs/joi/pull/3011" - }, - { - "id": 641339086, - "labels": ["bug", "feature"], - "number": 2386, - "title": "Allow 0x prefix for hex strings", - "url": "https://github.com/hapijs/joi/issues/2386" - } - ], - "number": 200, - "url": "https://github.com/hapijs/joi/milestone/200", - "version": "17.12.0" - }, - { - "date": "2024-01-15T13:06:38Z", - "id": 10419385, - "issues": [ - { - "id": 2081693958, - "labels": ["bug"], - "number": 3013, - "title": "fix: precision issue on number().multiple()", - "url": "https://github.com/hapijs/joi/pull/3013" - }, - { - "id": 2068151437, - "labels": ["bug", "types"], - "number": 3009, - "title": "fix: LanguageMessages type now supports languages in TypeScript", - "url": "https://github.com/hapijs/joi/pull/3009" - }, - { - "id": 1990728854, - "labels": ["bug"], - "number": 3001, - "title": "fix: do not override existing labels of underlying schemas in alternatives", - "url": "https://github.com/hapijs/joi/pull/3001" - }, - { - "id": 1787687666, - "labels": ["bug", "support"], - "number": 2962, - "title": "Multiple doesn't work correct", - "url": "https://github.com/hapijs/joi/issues/2962" - }, - { - "id": 1440500562, - "labels": ["documentation", "types"], - "number": 2875, - "title": "Fix for #2874", - "url": "https://github.com/hapijs/joi/pull/2875" - }, - { - "id": 1440478135, - "labels": ["support"], - "number": 2874, - "title": "Missing helper.error() method parameter type definition", - "url": "https://github.com/hapijs/joi/issues/2874" - }, - { - "id": 1097031270, - "labels": ["types"], - "number": 2720, - "title": "Type declaration for `messages` option of any.validate() inconsistent with the documentation and actual code", - "url": "https://github.com/hapijs/joi/issues/2720" - } - ], - "number": 199, - "url": "https://github.com/hapijs/joi/milestone/199", - "version": "17.11.1" - }, - { - "date": "2023-10-04T14:25:52Z", - "id": 10001154, - "issues": [ - { - "id": 1926334194, - "labels": ["feature"], - "number": 2988, - "title": "feat: allow custom expression functions", - "url": "https://github.com/hapijs/joi/pull/2988" - } - ], - "number": 198, - "url": "https://github.com/hapijs/joi/milestone/198", - "version": "17.11.0" - }, - { - "date": "2023-09-17T15:57:12Z", - "id": 9931143, - "issues": [ - { - "id": 1899827281, - "labels": ["bug"], - "number": 2986, - "title": "fix: missing template reference", - "url": "https://github.com/hapijs/joi/pull/2986" - }, - { - "id": 1895279030, - "labels": ["bug"], - "number": 2985, - "title": "Unit test showing example of formula parsing bug", - "url": "https://github.com/hapijs/joi/pull/2985" - }, - { - "id": 1850594151, - "labels": ["bug", "support"], - "number": 2974, - "title": "Unable to access object property with a space in its key via expression templates", - "url": "https://github.com/hapijs/joi/issues/2974" - } - ], - "number": 197, - "url": "https://github.com/hapijs/joi/milestone/197", - "version": "17.10.2" - }, - { - "date": "2023-08-31T15:49:29Z", - "id": 9865466, - "issues": [ - { - "id": 1875799190, - "labels": ["types"], - "number": 2983, - "title": "fix: allow any.error() return type to be ErrorReport[]", - "url": "https://github.com/hapijs/joi/pull/2983" - } - ], - "number": 196, - "url": "https://github.com/hapijs/joi/milestone/196", - "version": "17.10.1" - }, - { - "date": "2023-08-27T17:04:32Z", - "id": 9846520, - "issues": [ - { - "id": 1853085465, - "labels": ["types"], - "number": 2975, - "title": "property metas in Description", - "url": "https://github.com/hapijs/joi/pull/2975" - }, - { - "id": 1790067587, - "labels": ["types"], - "number": 2964, - "title": "#2963 make return value of validate match type definitions", - "url": "https://github.com/hapijs/joi/pull/2964" - }, - { - "id": 1781265663, - "labels": ["types"], - "number": 2961, - "title": "Associate Buffer with BinarySchema", - "url": "https://github.com/hapijs/joi/pull/2961" - }, - { - "id": 1777924204, - "labels": ["feature"], - "number": 2960, - "title": "feat: support bindary buffer that has been JSON.parse(JSON.strinified())", - "url": "https://github.com/hapijs/joi/pull/2960" - }, - { - "id": 1761576894, - "labels": ["feature"], - "number": 2957, - "title": "feat: support uuidv6, uuidv7 and uuidv8 guid types", - "url": "https://github.com/hapijs/joi/pull/2957" - }, - { - "id": 1741458259, - "labels": ["feature"], - "number": 2954, - "title": "Coerce toJSON'ed Buffer to real Buffer", - "url": "https://github.com/hapijs/joi/issues/2954" - } - ], - "number": 195, - "url": "https://github.com/hapijs/joi/milestone/195", - "version": "17.10.0" - }, - { - "date": "2023-04-24T20:47:29Z", - "id": 9321545, - "issues": [ - { - "id": 1681703485, - "labels": ["bug"], - "number": 2945, - "title": "fix: commit states to avoid memory leak", - "url": "https://github.com/hapijs/joi/pull/2945" - } - ], - "number": 194, - "url": "https://github.com/hapijs/joi/milestone/194", - "version": "17.9.2" - }, - { - "date": "2023-03-21T08:42:49Z", - "id": 9183895, - "issues": [ - { - "id": 1632983659, - "labels": ["bug"], - "number": 2932, - "title": "fix: do not trigger warnings and externals on arrays and alternatives mismatches", - "url": "https://github.com/hapijs/joi/pull/2932" - } - ], - "number": 193, - "url": "https://github.com/hapijs/joi/milestone/193", - "version": "17.9.1" - }, - { - "date": "2023-03-20T08:25:14Z", - "id": 9175644, - "issues": [ - { - "id": 1630304936, - "labels": ["feature"], - "number": 2931, - "title": "feat: improve external helpers", - "url": "https://github.com/hapijs/joi/pull/2931" - } - ], - "number": 192, - "url": "https://github.com/hapijs/joi/milestone/192", - "version": "17.9.0" - }, - { - "date": "2023-03-20T08:25:12Z", - "id": 9156029, - "issues": [ - { - "id": 1622804267, - "labels": ["bug", "types"], - "number": 2928, - "title": "fix: validation warning types", - "url": "https://github.com/hapijs/joi/pull/2928" - }, - { - "id": 1620230465, - "labels": ["support", "types"], - "number": 2927, - "title": "Type definition incorrect for \"warning\" return type from validateAsync", - "url": "https://github.com/hapijs/joi/issues/2927" - } - ], - "number": 191, - "url": "https://github.com/hapijs/joi/milestone/191", - "version": "17.8.4" - }, - { - "date": "2023-03-20T08:25:09Z", - "id": 9070660, - "issues": [ - { - "id": 1593084729, - "labels": [], - "number": 2919, - "title": "chore: revert 17.8.x line", - "url": "https://github.com/hapijs/joi/pull/2919" - }, - { - "id": 1593002882, - "labels": ["support"], - "number": 2917, - "title": "Cannot find module '@hapi/hoek/assert' from 'index.js'", - "url": "https://github.com/hapijs/joi/issues/2917" - }, - { - "id": 1592248117, - "labels": ["support"], - "number": 2914, - "title": "Support for older Node versions maybe lost in v17.8", - "url": "https://github.com/hapijs/joi/issues/2914" - }, - { - "id": 1591944994, - "labels": ["support"], - "number": 2913, - "title": "node_modules/@hapi/hoek/lib/deepEqual.js:274  ", - "url": "https://github.com/hapijs/joi/issues/2913" - } - ], - "number": 189, - "url": "https://github.com/hapijs/joi/milestone/189", - "version": "17.8.3" - }, - { - "date": "2023-03-20T08:25:06Z", - "id": 9070155, - "issues": [ - { - "id": 1592981259, - "labels": ["bug"], - "number": 2916, - "title": "fix: properly transform domain", - "url": "https://github.com/hapijs/joi/pull/2916" - }, - { - "id": 1592497687, - "labels": ["bug", "support"], - "number": 2915, - "title": "Email validation error in v17.8.1", - "url": "https://github.com/hapijs/joi/issues/2915" - } - ], - "number": 188, - "url": "https://github.com/hapijs/joi/milestone/188", - "version": "17.8.2" - }, - { - "date": "2023-02-19T12:33:29Z", - "id": 9063278, - "issues": [ - { - "id": 1590670833, - "labels": ["bug"], - "number": 2910, - "title": "fix: transpile optional chaining", - "url": "https://github.com/hapijs/joi/pull/2910" - } - ], - "number": 187, - "url": "https://github.com/hapijs/joi/milestone/187", - "version": "17.8.1" - }, - { - "date": "2023-02-19T11:51:58Z", - "id": 9063202, - "issues": [ - { - "id": 1590656187, - "labels": ["feature"], - "number": 2909, - "title": "chore: use latest address module", - "url": "https://github.com/hapijs/joi/pull/2909" - }, - { - "id": 936359343, - "labels": ["feature"], - "number": 2630, - "title": "Joi.string().domain() treats '_http._tcp.archive.ubuntu.com' as invalid domain name, even though it works", - "url": "https://github.com/hapijs/joi/issues/2630" - } - ], - "number": 186, - "url": "https://github.com/hapijs/joi/milestone/186", - "version": "17.8.0" - }, - { - "date": "2023-02-19T11:51:56Z", - "id": 9004988, - "issues": [ - { - "id": 1578167134, - "labels": [], - "number": 2905, - "title": "Upgrade `@sideway/formula` to `3.0.1` for `CVE-2023-25166`", - "url": "https://github.com/hapijs/joi/pull/2905" - }, - { - "id": 1504691590, - "labels": [], - "number": 2892, - "title": "Allow null values in BooleanSchema methods", - "url": "https://github.com/hapijs/joi/pull/2892" - } - ], - "number": 185, - "url": "https://github.com/hapijs/joi/milestone/185", - "version": "17.7.1" - }, - { - "date": "2022-11-10T10:33:24Z", - "id": 8569458, - "issues": [ - { - "id": 1419419908, - "labels": ["bug"], - "number": 2867, - "title": "fix: better unsafe check of exponential numbers", - "url": "https://github.com/hapijs/joi/pull/2867" - }, - { - "id": 1193366281, - "labels": ["feature"], - "number": 2762, - "title": "Add isPresent option to object dependencies", - "url": "https://github.com/hapijs/joi/pull/2762" - }, - { - "id": 992008366, - "labels": ["bug"], - "number": 2672, - "title": "Some exponential notation strings are validated as unsafe numbers", - "url": "https://github.com/hapijs/joi/issues/2672" - }, - { - "id": 790848333, - "labels": ["bug"], - "number": 2542, - "title": "Number validation fails on some strings with E-notation", - "url": "https://github.com/hapijs/joi/issues/2542" - } - ], - "number": 184, - "url": "https://github.com/hapijs/joi/milestone/184", - "version": "17.7.0" - }, - { - "date": "2022-10-22T10:08:17Z", - "id": 8538155, - "issues": [ - { - "id": 1401515258, - "labels": ["bug"], - "number": 2859, - "title": "Fix/throwing errors if required argument is omitted", - "url": "https://github.com/hapijs/joi/pull/2859" - }, - { - "id": 1111295993, - "labels": ["bug"], - "number": 2729, - "title": "Some validation methods don't throw an error when their required argument is omitted", - "url": "https://github.com/hapijs/joi/issues/2729" - } - ], - "number": 183, - "url": "https://github.com/hapijs/joi/milestone/183", - "version": "17.6.4" - }, - { - "date": "2022-10-11T10:04:10Z", - "id": 8527121, - "issues": [ - { - "id": 1404259103, - "labels": ["types"], - "number": 2860, - "title": "fix: allow all schema types to be defined and inferred", - "url": "https://github.com/hapijs/joi/pull/2860" - }, - { - "id": 1399539454, - "labels": ["support", "types"], - "number": 2857, - "title": "Typing issues with `attempt()`", - "url": "https://github.com/hapijs/joi/issues/2857" - }, - { - "id": 1168824082, - "labels": ["types"], - "number": 2753, - "title": "Typescript typing on `Joi.string().validate(...)`", - "url": "https://github.com/hapijs/joi/issues/2753" - } - ], - "number": 182, - "url": "https://github.com/hapijs/joi/milestone/182", - "version": "17.6.3" - }, - { - "date": "2022-09-29T16:09:13Z", - "id": 8474927, - "issues": [ - { - "id": 1390907633, - "labels": ["bug", "types"], - "number": 2851, - "title": "Try improving handling of unions", - "url": "https://github.com/hapijs/joi/pull/2851" - }, - { - "id": 1389694070, - "labels": ["bug", "types"], - "number": 2850, - "title": "fix: do not confuse booleans for alernatives in strict mode", - "url": "https://github.com/hapijs/joi/pull/2850" - }, - { - "id": 1386182303, - "labels": ["bug", "support", "types"], - "number": 2848, - "title": "Strict object schema with a boolean property expects alternative, not boolean", - "url": "https://github.com/hapijs/joi/issues/2848" - } - ], - "number": 181, - "url": "https://github.com/hapijs/joi/milestone/181", - "version": "17.6.2" - }, - { - "date": "2022-09-22T12:01:44Z", - "id": 7613961, - "issues": [ - { - "id": 1382305421, - "labels": ["types"], - "number": 2844, - "title": "types: support strict alternatives", - "url": "https://github.com/hapijs/joi/pull/2844" - }, - { - "id": 1381290506, - "labels": ["documentation"], - "number": 2843, - "title": "chore: update license", - "url": "https://github.com/hapijs/joi/pull/2843" - }, - { - "id": 1379928615, - "labels": ["documentation"], - "number": 2842, - "title": "Fix spelling", - "url": "https://github.com/hapijs/joi/pull/2842" - }, - { - "id": 1379928379, - "labels": ["types"], - "number": 2841, - "title": "Allow sub-objects for TypeScript strict object schema", - "url": "https://github.com/hapijs/joi/pull/2841" - }, - { - "id": 1376827292, - "labels": ["types"], - "number": 2838, - "title": "feat: change validateAsync return type to match options", - "url": "https://github.com/hapijs/joi/pull/2838" - }, - { - "id": 1369594276, - "labels": ["bug", "types"], - "number": 2836, - "title": "fix(d.ts): allow nested object schema for strictly typed object", - "url": "https://github.com/hapijs/joi/pull/2836" - }, - { - "id": 1358610733, - "labels": ["types"], - "number": 2829, - "title": "fix(d.ts)!: type details param of ValidationError constructor", - "url": "https://github.com/hapijs/joi/pull/2829" - }, - { - "id": 1342785924, - "labels": ["types"], - "number": 2819, - "title": "Add artifact to typings.", - "url": "https://github.com/hapijs/joi/pull/2819" - }, - { - "id": 1342775051, - "labels": ["types"], - "number": 2818, - "title": "Typescript support for .artifact()", - "url": "https://github.com/hapijs/joi/issues/2818" - }, - { - "id": 1327774733, - "labels": [], - "number": 2813, - "title": "Fix Joi issue #2746", - "url": "https://github.com/hapijs/joi/pull/2813" - }, - { - "id": 1320932027, - "labels": ["types"], - "number": 2808, - "title": "feat(d.ts): Add type information for `maxDomainSegments` to `EmailOptions` and `DomainOptions` interfaces", - "url": "https://github.com/hapijs/joi/pull/2808" - }, - { - "id": 1284095708, - "labels": ["types"], - "number": 2797, - "title": "feat(d.ts): improve attempt return type", - "url": "https://github.com/hapijs/joi/pull/2797" - }, - { - "id": 1256690639, - "labels": ["types"], - "number": 2788, - "title": "Include local into `ErrorReport` type", - "url": "https://github.com/hapijs/joi/pull/2788" - }, - { - "id": 1243930480, - "labels": ["bug", "types"], - "number": 2785, - "title": "fix(typings): incompatible type issue for nested strict object schemas", - "url": "https://github.com/hapijs/joi/pull/2785" - }, - { - "id": 1202296754, - "labels": ["bug", "types"], - "number": 2764, - "title": "Incompatible type expected for object schemas nested in strict object schemas", - "url": "https://github.com/hapijs/joi/issues/2764" - }, - { - "id": 1152372226, - "labels": ["bug"], - "number": 2749, - "title": "fixed typo", - "url": "https://github.com/hapijs/joi/pull/2749" - }, - { - "id": 1146226674, - "labels": ["bug"], - "number": 2746, - "title": "Using `Joi.attempt` with `{ convert: false }` does not prevent conversion.", - "url": "https://github.com/hapijs/joi/issues/2746" - }, - { - "id": 1110310979, - "labels": ["bug", "types"], - "number": 2727, - "title": "Fix validateAsync return type", - "url": "https://github.com/hapijs/joi/pull/2727" - }, - { - "id": 976096206, - "labels": ["types"], - "number": 2663, - "title": "Property \"local\" does not exist on type \"ErrorReport\" ", - "url": "https://github.com/hapijs/joi/issues/2663" - } - ], - "number": 180, - "url": "https://github.com/hapijs/joi/milestone/180", - "version": "17.6.1" - }, - { - "date": "2022-01-26T23:07:42Z", - "id": 7449614, - "issues": [ - { - "id": 1115588030, - "labels": ["feature"], - "number": 2732, - "title": "Support length() in templates", - "url": "https://github.com/hapijs/joi/issues/2732" - } - ], - "number": 179, - "url": "https://github.com/hapijs/joi/milestone/179", - "version": "17.6.0" - }, - { - "date": "2021-12-02T06:39:50Z", - "id": 7446145, - "issues": [ - { - "id": 1065127444, - "labels": ["feature"], - "number": 2708, - "title": "How can I define both specific error messages and a default error message?", - "url": "https://github.com/hapijs/joi/issues/2708" - }, - { - "id": 1059455491, - "labels": ["feature"], - "number": 2706, - "title": "Error messages do not distinguish between numbers and strings!Easily misleading", - "url": "https://github.com/hapijs/joi/issues/2706" - }, - { - "id": 1053374439, - "labels": ["types"], - "number": 2703, - "title": "issue #2606: pass TSchema from ObjectSchema to .validate function", - "url": "https://github.com/hapijs/joi/pull/2703" - }, - { - "id": 1048657219, - "labels": ["types"], - "number": 2698, - "title": "Add Date -> Joi.DateSchema map to ObjectPropertiesSchema", - "url": "https://github.com/hapijs/joi/pull/2698" - }, - { - "id": 1022108922, - "labels": ["feature"], - "number": 2687, - "title": "string().min(0) is failing to validate a zero-length string", - "url": "https://github.com/hapijs/joi/issues/2687" - }, - { - "id": 981051830, - "labels": ["bug"], - "number": 2666, - "title": "Updated `multiple` rule to support decimal/float base", - "url": "https://github.com/hapijs/joi/pull/2666" - }, - { - "id": 979154463, - "labels": ["bug", "types"], - "number": 2665, - "title": "Fix typings on any.external(): add helpers argument", - "url": "https://github.com/hapijs/joi/pull/2665" - }, - { - "id": 962148619, - "labels": ["bug"], - "number": 2651, - "title": "Fix label elimination for externals", - "url": "https://github.com/hapijs/joi/pull/2651" - }, - { - "id": 958351880, - "labels": ["bug"], - "number": 2649, - "title": "fix: Joi.string().hostname() not returning errors for CIDR notation", - "url": "https://github.com/hapijs/joi/pull/2649" - }, - { - "id": 958349612, - "labels": ["bug"], - "number": 2648, - "title": "Incorrect hostname validation", - "url": "https://github.com/hapijs/joi/issues/2648" - }, - { - "id": 943251026, - "labels": ["bug"], - "number": 2635, - "title": "any.external: can't disable label", - "url": "https://github.com/hapijs/joi/issues/2635" - }, - { - "id": 876890865, - "labels": ["bug", "types"], - "number": 2605, - "title": "\"ExternalValidationFunction\" type is missing \"helpers\" parameter in index.d.ts", - "url": "https://github.com/hapijs/joi/issues/2605" - }, - { - "id": 866910880, - "labels": ["bug"], - "number": 2600, - "title": "Joi.external() error message", - "url": "https://github.com/hapijs/joi/issues/2600" - }, - { - "id": 846952220, - "labels": ["bug"], - "number": 2590, - "title": "defaults in alternatives should work recursively", - "url": "https://github.com/hapijs/joi/issues/2590" - }, - { - "id": 846945517, - "labels": ["bug"], - "number": 2589, - "title": "merge subschema matches when subchemas are objects, or alternatives of objects", - "url": "https://github.com/hapijs/joi/pull/2589" - }, - { - "id": 826666841, - "labels": ["feature"], - "number": 2577, - "title": "add subschema property validation failures to context", - "url": "https://github.com/hapijs/joi/pull/2577" - } - ], - "number": 178, - "url": "https://github.com/hapijs/joi/milestone/178", - "version": "17.5.0" - }, - { - "date": "2021-12-01T08:48:44Z", - "id": 7021782, - "issues": [ - { - "id": 1016225490, - "labels": ["bug", "dependency"], - "number": 2685, - "title": "Joi.string().email() passes for `foo@bar%2ecom`", - "url": "https://github.com/hapijs/joi/issues/2685" - } - ], - "number": 177, - "url": "https://github.com/hapijs/joi/milestone/177", - "version": "17.4.3" - }, - { - "date": "2021-08-01T21:18:00Z", - "id": 6934782, - "issues": [ - { - "id": 950895186, - "labels": ["bug"], - "number": 2642, - "title": "Fix issue with only required items. Fixes #2620.", - "url": "https://github.com/hapijs/joi/pull/2642" - }, - { - "id": 927946530, - "labels": ["bug"], - "number": 2624, - "title": "Fix Web Workers compatibility", - "url": "https://github.com/hapijs/joi/pull/2624" - }, - { - "id": 919358309, - "labels": ["bug"], - "number": 2620, - "title": "If all elements of array is required, it does not validate unknown items", - "url": "https://github.com/hapijs/joi/issues/2620" - }, - { - "id": 539748053, - "labels": ["bug"], - "number": 2251, - "title": "`dist/joi-browser.min.js` doesn't work in workers", - "url": "https://github.com/hapijs/joi/issues/2251" - } - ], - "number": 176, - "url": "https://github.com/hapijs/joi/milestone/176", - "version": "17.4.2" - }, - { - "date": "2021-07-11T05:04:34Z", - "id": 6403312, - "issues": [ - { - "id": 931137268, - "labels": ["types"], - "number": 2627, - "title": "Add object type guards schema", - "url": "https://github.com/hapijs/joi/pull/2627" - }, - { - "id": 842846439, - "labels": ["bug", "types"], - "number": 2586, - "title": "fix isSchema type definition", - "url": "https://github.com/hapijs/joi/pull/2586" - }, - { - "id": 842842325, - "labels": ["bug", "types"], - "number": 2585, - "title": "type problem in Joi.isSchema function", - "url": "https://github.com/hapijs/joi/issues/2585" - }, - { - "id": 823225132, - "labels": ["bug", "types"], - "number": 2573, - "title": "Add option array type to AlternativesSchema.conditional", - "url": "https://github.com/hapijs/joi/pull/2573" - } - ], - "number": 175, - "url": "https://github.com/hapijs/joi/milestone/175", - "version": "17.4.1" - }, - { - "date": "2021-02-08T01:06:29Z", - "id": 6026845, - "issues": [ - { - "id": 800384866, - "labels": ["bug", "types"], - "number": 2556, - "title": "fix: any.when() options parameters not supported as Array in index.d.ts", - "url": "https://github.com/hapijs/joi/pull/2556" - }, - { - "id": 800298641, - "labels": ["bug", "types"], - "number": 2555, - "title": "Type definition for the function `any.when()` mismatch the documentation and usage", - "url": "https://github.com/hapijs/joi/issues/2555" - }, - { - "id": 796794319, - "labels": ["types"], - "number": 2551, - "title": "feat: Make Joi.Schema generic", - "url": "https://github.com/hapijs/joi/pull/2551" - }, - { - "id": 795511635, - "labels": ["bug", "feature"], - "number": 2548, - "title": "fix: defaults in ordered array are not filled", - "url": "https://github.com/hapijs/joi/pull/2548" - }, - { - "id": 792464975, - "labels": ["bug"], - "number": 2543, - "title": "URI validation, allowRelative with domain", - "url": "https://github.com/hapijs/joi/issues/2543" - }, - { - "id": 781638166, - "labels": ["bug"], - "number": 2536, - "title": "merge the results of a .match('all') if all the subschemas are objects", - "url": "https://github.com/hapijs/joi/pull/2536" - }, - { - "id": 781603104, - "labels": ["bug"], - "number": 2535, - "title": "defaults in alternatives with a match mode set are not returned", - "url": "https://github.com/hapijs/joi/issues/2535" - }, - { - "id": 780582804, - "labels": ["bug", "types"], - "number": 2534, - "title": "Remove incorrect errors type", - "url": "https://github.com/hapijs/joi/pull/2534" - }, - { - "id": 777175773, - "labels": ["bug"], - "number": 2532, - "title": "Fix confusing message when refs are passed", - "url": "https://github.com/hapijs/joi/pull/2532" - }, - { - "id": 771928689, - "labels": ["bug", "types"], - "number": 2528, - "title": "Added guid separator and made version optional", - "url": "https://github.com/hapijs/joi/pull/2528" - }, - { - "id": 757668840, - "labels": ["bug", "types"], - "number": 2523, - "title": "errors is always undefined in ValidationResult", - "url": "https://github.com/hapijs/joi/issues/2523" - }, - { - "id": 757000750, - "labels": ["bug", "types"], - "number": 2521, - "title": "Fix type of schema passed to alter functions", - "url": "https://github.com/hapijs/joi/pull/2521" - }, - { - "id": 751579156, - "labels": ["bug"], - "number": 2518, - "title": "fix for stripUnknown not working for nested object on invalid object", - "url": "https://github.com/hapijs/joi/pull/2518" - }, - { - "id": 734030120, - "labels": ["bug", "types"], - "number": 2502, - "title": "Appends the allowed object keys in typescript", - "url": "https://github.com/hapijs/joi/pull/2502" - }, - { - "id": 715713227, - "labels": ["bug"], - "number": 2479, - "title": "Inconsistency with stripUnknown: true and failing validation rules", - "url": "https://github.com/hapijs/joi/issues/2479" - }, - { - "id": 707508553, - "labels": ["bug"], - "number": 2471, - "title": "Joi.object().xor() throws with \"must be a string or a reference\" when passed a reference", - "url": "https://github.com/hapijs/joi/issues/2471" - }, - { - "id": 691090715, - "labels": ["bug"], - "number": 2459, - "title": "stripUnknown doesn't work for nested objects", - "url": "https://github.com/hapijs/joi/issues/2459" - }, - { - "id": 657206357, - "labels": ["bug"], - "number": 2404, - "title": "defaults in ordered array are not filled", - "url": "https://github.com/hapijs/joi/issues/2404" - } - ], - "number": 174, - "url": "https://github.com/hapijs/joi/milestone/174", - "version": "17.4.0" - }, - { - "date": "2020-10-24T07:26:46Z", - "id": 5789852, - "issues": [ - { - "id": 713554250, - "labels": ["bug", "types"], - "number": 2477, - "title": "Add RegExp to the supported types for Extension.type", - "url": "https://github.com/hapijs/joi/pull/2477" - }, - { - "id": 713153983, - "labels": ["bug", "types"], - "number": 2475, - "title": "Add render property to ReferenceOptions TS def", - "url": "https://github.com/hapijs/joi/pull/2475" - }, - { - "id": 700968762, - "labels": ["bug"], - "number": 2465, - "title": "@hapi/formula@2.0.0 Deprecated", - "url": "https://github.com/hapijs/joi/issues/2465" - }, - { - "id": 686244539, - "labels": ["feature"], - "number": 2455, - "title": "Expose prefs in external()", - "url": "https://github.com/hapijs/joi/pull/2455" - }, - { - "id": 685414463, - "labels": ["bug", "types"], - "number": 2454, - "title": "CustomValidator return type adjusted in typescript", - "url": "https://github.com/hapijs/joi/pull/2454" - }, - { - "id": 676405382, - "labels": ["bug", "types"], - "number": 2442, - "title": "Update index.d.ts", - "url": "https://github.com/hapijs/joi/pull/2442" - }, - { - "id": 676264698, - "labels": ["bug", "types"], - "number": 2441, - "title": "Wrong field name in ValidationError (index.d.ts)", - "url": "https://github.com/hapijs/joi/issues/2441" - } - ], - "number": 173, - "url": "https://github.com/hapijs/joi/milestone/173", - "version": "17.3.0" - }, - { - "date": "2020-08-19T16:57:59Z", - "id": 5734564, - "issues": [ - { - "id": 681995650, - "labels": ["documentation"], - "number": 2450, - "title": "Update dev site", - "url": "https://github.com/hapijs/joi/issues/2450" - } - ], - "number": 171, - "url": "https://github.com/hapijs/joi/milestone/171", - "version": "17.2.1" - }, - { - "date": "2020-08-05T02:12:08Z", - "id": 5202228, - "issues": [ - { - "id": 673189440, - "labels": ["types"], - "number": 2431, - "title": "Import types from DT", - "url": "https://github.com/hapijs/joi/issues/2431" - }, - { - "id": 667115914, - "labels": ["bug"], - "number": 2421, - "title": "Support ISO8601 with hours timeshift only", - "url": "https://github.com/hapijs/joi/pull/2421" - }, - { - "id": 666933236, - "labels": ["bug"], - "number": 2419, - "title": "isoDate doesn't recognize correct string", - "url": "https://github.com/hapijs/joi/issues/2419" - }, - { - "id": 659018435, - "labels": ["bug"], - "number": 2408, - "title": "Fix number padding (e.g. 00000) and trailing decimal points (e.g. 2.)", - "url": "https://github.com/hapijs/joi/pull/2408" - }, - { - "id": 659003848, - "labels": ["bug"], - "number": 2407, - "title": "\"2.\" throws number.unsafe", - "url": "https://github.com/hapijs/joi/issues/2407" - }, - { - "id": 659000586, - "labels": ["bug"], - "number": 2406, - "title": "\"00000\" throws number.unsafe", - "url": "https://github.com/hapijs/joi/issues/2406" - }, - { - "id": 651179864, - "labels": ["feature"], - "number": 2398, - "title": "Support maxDomainSegments", - "url": "https://github.com/hapijs/joi/issues/2398" - }, - { - "id": 632975052, - "labels": ["bug"], - "number": 2380, - "title": "Joi.build() does not work with complex extension bases", - "url": "https://github.com/hapijs/joi/issues/2380" - }, - { - "id": 630679048, - "labels": ["feature"], - "number": 2377, - "title": "Add extension validation for \"cast\"", - "url": "https://github.com/hapijs/joi/pull/2377" - }, - { - "id": 611092709, - "labels": ["feature"], - "number": 2361, - "title": "Validation artifacts collected from successful rules", - "url": "https://github.com/hapijs/joi/issues/2361" - }, - { - "id": 598279675, - "labels": ["bug"], - "number": 2348, - "title": "object.default() broke when object is extended", - "url": "https://github.com/hapijs/joi/issues/2348" - }, - { - "id": 591991328, - "labels": ["bug"], - "number": 2337, - "title": "tlds fails to error on invalid segment", - "url": "https://github.com/hapijs/joi/issues/2337" - }, - { - "id": 589821134, - "labels": ["bug", "feature"], - "number": 2330, - "title": "Consistently apply wrap setting", - "url": "https://github.com/hapijs/joi/issues/2330" - }, - { - "id": 585005069, - "labels": ["feature"], - "number": 2320, - "title": "invalid GUID/UUID is validated as valid", - "url": "https://github.com/hapijs/joi/issues/2320" - }, - { - "id": 582564448, - "labels": ["bug"], - "number": 2318, - "title": "`larger than` is incorrect for comparing quanties", - "url": "https://github.com/hapijs/joi/issues/2318" - }, - { - "id": 567138401, - "labels": ["feature"], - "number": 2303, - "title": "Add option to resolve `.ref()` and `.in()` values in error messages.", - "url": "https://github.com/hapijs/joi/issues/2303" - }, - { - "id": 555405548, - "labels": ["bug", "breaking changes"], - "number": 2284, - "title": "Array item could not be an Error", - "url": "https://github.com/hapijs/joi/issues/2284" - } - ], - "number": 170, - "url": "https://github.com/hapijs/joi/milestone/170", - "version": "17.2.0" - }, - { - "date": "2020-03-14T21:26:52Z", - "id": 5022433, - "issues": [ - { - "id": 580942719, - "labels": ["bug", "dependency"], - "number": 2316, - "title": "Validate domain in relative uri", - "url": "https://github.com/hapijs/joi/issues/2316" - }, - { - "id": 559954254, - "labels": ["bug"], - "number": 2293, - "title": "Fix error on changeless forks. Fixes #2292.", - "url": "https://github.com/hapijs/joi/pull/2293" - }, - { - "id": 559901729, - "labels": ["bug"], - "number": 2292, - "title": "Fork object with option already applied", - "url": "https://github.com/hapijs/joi/issues/2292" - } - ], - "number": 169, - "url": "https://github.com/hapijs/joi/milestone/169", - "version": "17.1.1" - }, - { - "date": "2020-01-20T00:03:02Z", - "id": 4992194, - "issues": [ - { - "id": 552005117, - "labels": ["feature"], - "number": 2280, - "title": "isError()", - "url": "https://github.com/hapijs/joi/issues/2280" - }, - { - "id": 551949636, - "labels": ["bug"], - "number": 2279, - "title": "Remove annotate() from assert() when used in the browser", - "url": "https://github.com/hapijs/joi/issues/2279" - } - ], - "number": 168, - "url": "https://github.com/hapijs/joi/milestone/168", - "version": "17.1.0" - }, - { - "date": "2020-01-09T18:47:40Z", - "id": 4992167, - "issues": [ - { - "id": 547654883, - "labels": ["bug"], - "number": 2269, - "title": "Ensure keys term always has right constructor", - "url": "https://github.com/hapijs/joi/issues/2269" - } - ], - "number": 167, - "url": "https://github.com/hapijs/joi/milestone/167", - "version": "17.0.2" - }, - { - "date": "2020-01-09T18:37:15Z", - "id": 4979069, - "issues": [ - { - "id": 547649044, - "labels": ["bug"], - "number": 2268, - "title": "Move flag back to proto", - "url": "https://github.com/hapijs/joi/issues/2268" - } - ], - "number": 166, - "url": "https://github.com/hapijs/joi/milestone/166", - "version": "17.0.1" - }, - { - "date": "2020-01-06T19:40:08Z", - "id": 4797017, - "issues": [ - { - "id": 545259143, - "labels": ["dependency"], - "number": 2263, - "title": "Update deps", - "url": "https://github.com/hapijs/joi/issues/2263" - }, - { - "id": 545258955, - "labels": ["breaking changes", "release notes"], - "number": 2262, - "title": "17.0.0 Release Notes", - "url": "https://github.com/hapijs/joi/issues/2262" - }, - { - "id": 545243016, - "labels": ["breaking changes"], - "number": 2261, - "title": "Remove ValidationError.annotate() from browser build", - "url": "https://github.com/hapijs/joi/issues/2261" - }, - { - "id": 545220874, - "labels": ["feature"], - "number": 2260, - "title": "object.regex()", - "url": "https://github.com/hapijs/joi/issues/2260" - }, - { - "id": 542077557, - "labels": ["bug"], - "number": 2254, - "title": "Giving an array argument to any.valid returns incorrect error", - "url": "https://github.com/hapijs/joi/issues/2254" - }, - { - "id": 535937306, - "labels": ["bug"], - "number": 2243, - "title": "Allow `_` in alias, arg, flag, modifier, override, rule, and term names", - "url": "https://github.com/hapijs/joi/pull/2243" - }, - { - "id": 535769742, - "labels": ["bug"], - "number": 2242, - "title": "Can you allow `_` in rule names?", - "url": "https://github.com/hapijs/joi/issues/2242" - }, - { - "id": 529698356, - "labels": ["breaking changes"], - "number": 2231, - "title": "Change errors.wrapArrays to errors.wrap.array", - "url": "https://github.com/hapijs/joi/issues/2231" - }, - { - "id": 522427823, - "labels": ["feature"], - "number": 2219, - "title": "Add the ability to extend all types in place", - "url": "https://github.com/hapijs/joi/issues/2219" - }, - { - "id": 514306299, - "labels": ["non issue"], - "number": 2200, - "title": "Move ip and uri logic to address", - "url": "https://github.com/hapijs/joi/issues/2200" - }, - { - "id": 514305737, - "labels": ["breaking changes", "dependency"], - "number": 2199, - "title": "Remove node 8, 10", - "url": "https://github.com/hapijs/joi/issues/2199" - }, - { - "id": 509090188, - "labels": ["feature", "breaking changes"], - "number": 2189, - "title": "Change default function second argument to full helpers (from prefs)", - "url": "https://github.com/hapijs/joi/issues/2189" - }, - { - "id": 507538924, - "labels": ["feature", "breaking changes"], - "number": 2182, - "title": "Remove quotation marks from error messages", - "url": "https://github.com/hapijs/joi/issues/2182" - }, - { - "id": 501937158, - "labels": ["feature"], - "number": 2163, - "title": "string().hostiname() - validation of non-ASCII chars containing domains", - "url": "https://github.com/hapijs/joi/issues/2163" - } - ], - "number": 164, - "url": "https://github.com/hapijs/joi/milestone/164", - "version": "17.0.0" - }, - { - "date": "2019-11-24T10:02:03Z", - "id": 4724216, - "issues": [ - { - "id": 526516921, - "labels": ["bug"], - "number": 2226, - "title": "object.with and object.without throw error on $ prefixed keys", - "url": "https://github.com/hapijs/joi/issues/2226" - }, - { - "id": 522065305, - "labels": ["bug"], - "number": 2218, - "title": "Maximum call stack size exceeded​​ error for dataUri validation", - "url": "https://github.com/hapijs/joi/issues/2218" - }, - { - "id": 518514150, - "labels": ["bug"], - "number": 2212, - "title": "Joi.string().email() considers \"a@a.com/asd\" as valid email", - "url": "https://github.com/hapijs/joi/issues/2212" - }, - { - "id": 517182026, - "labels": ["bug"], - "number": 2208, - "title": "fix: describe() on schema with default value null", - "url": "https://github.com/hapijs/joi/pull/2208" - }, - { - "id": 517156454, - "labels": ["bug"], - "number": 2207, - "title": "describe() on schema with default value null results in \"Cannot read property 'Symbol(literal)' of null\"", - "url": "https://github.com/hapijs/joi/issues/2207" - }, - { - "id": 515547271, - "labels": ["bug"], - "number": 2205, - "title": "Cannot require a minimal number of matching object properties with `pattern`", - "url": "https://github.com/hapijs/joi/issues/2205" - }, - { - "id": 509557279, - "labels": ["bug"], - "number": 2190, - "title": "Joi.string().domain() treats an email address as a valid domain name", - "url": "https://github.com/hapijs/joi/issues/2190" - }, - { - "id": 508598304, - "labels": ["bug"], - "number": 2187, - "title": "Giving an array argument to any.allow(...values) gives incorrect error", - "url": "https://github.com/hapijs/joi/issues/2187" - }, - { - "id": 506899409, - "labels": ["non issue"], - "number": 2181, - "title": " Joi.alternatives produces confusing message when used with nested object and `{ abortEarly: false }`", - "url": "https://github.com/hapijs/joi/issues/2181" - }, - { - "id": 506282593, - "labels": ["bug"], - "number": 2176, - "title": "joi.types() is missing `func` alias", - "url": "https://github.com/hapijs/joi/issues/2176" - }, - { - "id": 504105644, - "labels": ["documentation", "support"], - "number": 2173, - "title": "[Request] Allow mixing patch version", - "url": "https://github.com/hapijs/joi/issues/2173" - } - ], - "number": 163, - "url": "https://github.com/hapijs/joi/milestone/163", - "version": "16.1.8" - }, - { - "date": "2019-10-05T17:37:42Z", - "id": 4723324, - "issues": [ - { - "id": 502992707, - "labels": ["bug"], - "number": 2168, - "title": "Date fails to enforce format when value is a number string", - "url": "https://github.com/hapijs/joi/issues/2168" - } - ], - "number": 162, - "url": "https://github.com/hapijs/joi/milestone/162", - "version": "16.1.7" - }, - { - "date": "2019-10-05T03:41:01Z", - "id": 4712266, - "issues": [ - { - "id": 502861807, - "labels": ["bug"], - "number": 2167, - "title": "Error.captureStackTrace can't be used in all browser builds", - "url": "https://github.com/hapijs/joi/issues/2167" - }, - { - "id": 502462420, - "labels": ["bug"], - "number": 2165, - "title": "Cannot read property 'delete' of undefined", - "url": "https://github.com/hapijs/joi/issues/2165" - } - ], - "number": 161, - "url": "https://github.com/hapijs/joi/milestone/161", - "version": "16.1.6" - }, - { - "date": "2019-10-02T07:36:01Z", - "id": 4678539, - "issues": [ - { - "id": 499817149, - "labels": ["bug"], - "number": 2156, - "title": "node.get is not a function when validating", - "url": "https://github.com/hapijs/joi/issues/2156" - }, - { - "id": 498227884, - "labels": ["bug"], - "number": 2147, - "title": "Joi v16: TypeError issue with valid(Joi.ref(x)).error()", - "url": "https://github.com/hapijs/joi/issues/2147" - } - ], - "number": 160, - "url": "https://github.com/hapijs/joi/milestone/160", - "version": "16.1.5" - }, - { - "date": "2019-09-20T22:14:42Z", - "id": 4678511, - "issues": [ - { - "id": 496526120, - "labels": ["bug"], - "number": 2134, - "title": "Joi.any().default().describe() throws validation errors", - "url": "https://github.com/hapijs/joi/issues/2134" - } - ], - "number": 159, - "url": "https://github.com/hapijs/joi/milestone/159", - "version": "16.1.4" - }, - { - "date": "2019-09-20T21:57:44Z", - "id": 4673271, - "issues": [ - { - "id": 496276352, - "labels": ["bug"], - "number": 2131, - "title": "TypeError: false.byteLength is not a function", - "url": "https://github.com/hapijs/joi/issues/2131" - } - ], - "number": 158, - "url": "https://github.com/hapijs/joi/milestone/158", - "version": "16.1.3" - }, - { - "date": "2019-09-19T06:10:27Z", - "id": 4665584, - "issues": [ - { - "id": 495581507, - "labels": ["bug"], - "number": 2128, - "title": "when() fails when combined with prefs()", - "url": "https://github.com/hapijs/joi/issues/2128" - } - ], - "number": 157, - "url": "https://github.com/hapijs/joi/milestone/157", - "version": "16.1.2" - }, - { - "date": "2019-09-17T06:39:55Z", - "id": 4665447, - "issues": [ - { - "id": 494431026, - "labels": ["dependency"], - "number": 2119, - "title": "Use ^version", - "url": "https://github.com/hapijs/joi/issues/2119" - } - ], - "number": 156, - "url": "https://github.com/hapijs/joi/milestone/156", - "version": "16.1.1" - }, - { - "date": "2019-09-17T05:48:07Z", - "id": 4657957, - "issues": [ - { - "id": 494395930, - "labels": ["bug"], - "number": 2118, - "title": "array.items() fails to invalidate when custom item error is used", - "url": "https://github.com/hapijs/joi/issues/2118" - }, - { - "id": 494229372, - "labels": ["feature"], - "number": 2116, - "title": "Support `.when({ is, then })` without subject ref", - "url": "https://github.com/hapijs/joi/issues/2116" - } - ], - "number": 155, - "url": "https://github.com/hapijs/joi/milestone/155", - "version": "16.1.0" - }, - { - "date": "2019-09-13T17:39:25Z", - "id": 4652428, - "issues": [ - { - "id": 493302452, - "labels": ["bug"], - "number": 2113, - "title": "Valid emails are considered invalid", - "url": "https://github.com/hapijs/joi/issues/2113" - }, - { - "id": 493254773, - "labels": ["non issue"], - "number": 2111, - "title": "Joi.only is not a function ", - "url": "https://github.com/hapijs/joi/issues/2111" - } - ], - "number": 154, - "url": "https://github.com/hapijs/joi/milestone/154", - "version": "16.0.1" - }, - { - "date": "2019-09-11T22:59:28Z", - "id": 3833006, - "issues": [ - { - "id": 490676870, - "labels": ["bug"], - "number": 2103, - "title": "Support errors in manifest", - "url": "https://github.com/hapijs/joi/issues/2103" - }, - { - "id": 490668242, - "labels": ["bug", "breaking changes"], - "number": 2102, - "title": "Always convert -0 to 0", - "url": "https://github.com/hapijs/joi/issues/2102" - }, - { - "id": 490537727, - "labels": ["feature"], - "number": 2101, - "title": "Apply link.concat() on resolved schema", - "url": "https://github.com/hapijs/joi/issues/2101" - }, - { - "id": 490207007, - "labels": ["feature"], - "number": 2099, - "title": "Add when() break", - "url": "https://github.com/hapijs/joi/issues/2099" - }, - { - "id": 488462553, - "labels": ["bug"], - "number": 2097, - "title": "Number validation fails with \"1E3\"", - "url": "https://github.com/hapijs/joi/issues/2097" - }, - { - "id": 488408155, - "labels": ["feature"], - "number": 2096, - "title": "Apply link whens on linked schema, not the link", - "url": "https://github.com/hapijs/joi/issues/2096" - }, - { - "id": 487846687, - "labels": ["bug"], - "number": 2093, - "title": "Manifest type conflicts with key type", - "url": "https://github.com/hapijs/joi/issues/2093" - }, - { - "id": 487812688, - "labels": ["feature"], - "number": 2092, - "title": "Support Joi.in() for object keys", - "url": "https://github.com/hapijs/joi/issues/2092" - }, - { - "id": 487693904, - "labels": ["bug"], - "number": 2091, - "title": "\"-0\" throw number.unsafe", - "url": "https://github.com/hapijs/joi/issues/2091" - }, - { - "id": 487317502, - "labels": ["feature"], - "number": 2089, - "title": "Joi.in()", - "url": "https://github.com/hapijs/joi/issues/2089" - }, - { - "id": 487309224, - "labels": ["feature", "breaking changes"], - "number": 2088, - "title": "Always perform deep equal on valid() and invalid()", - "url": "https://github.com/hapijs/joi/issues/2088" - }, - { - "id": 486807081, - "labels": ["bug", "breaking changes"], - "number": 2087, - "title": "Fix comparison of array values (literals and references)", - "url": "https://github.com/hapijs/joi/issues/2087" - }, - { - "id": 486757521, - "labels": ["feature"], - "number": 2086, - "title": "Preference to change label to path edge instead of full path", - "url": "https://github.com/hapijs/joi/issues/2086" - }, - { - "id": 486749094, - "labels": ["bug"], - "number": 2085, - "title": "Default assert() to include stack", - "url": "https://github.com/hapijs/joi/issues/2085" - }, - { - "id": 486593052, - "labels": ["feature"], - "number": 2084, - "title": "Shared schemas in links", - "url": "https://github.com/hapijs/joi/issues/2084" - }, - { - "id": 486445237, - "labels": ["feature"], - "number": 2083, - "title": "Add a browser build to the github repo and npm package", - "url": "https://github.com/hapijs/joi/issues/2083" - }, - { - "id": 486433885, - "labels": ["bug"], - "number": 2082, - "title": "Fix error thrown in the browser build. Closes #2081", - "url": "https://github.com/hapijs/joi/pull/2082" - }, - { - "id": 486432248, - "labels": ["bug"], - "number": 2081, - "title": "The browser build (produced by webpack) throws an error when loading", - "url": "https://github.com/hapijs/joi/issues/2081" - }, - { - "id": 486177653, - "labels": ["feature"], - "number": 2080, - "title": "Named schema links", - "url": "https://github.com/hapijs/joi/issues/2080" - }, - { - "id": 486060001, - "labels": ["feature"], - "number": 2079, - "title": "Support `no` in when()", - "url": "https://github.com/hapijs/joi/issues/2079" - }, - { - "id": 486042042, - "labels": ["feature"], - "number": 2078, - "title": "Default `is` to Joi.invalid(null, false, 0, '').required()", - "url": "https://github.com/hapijs/joi/issues/2078" - }, - { - "id": 485961723, - "labels": ["breaking changes"], - "number": 2077, - "title": "Compile valid values into valid+override", - "url": "https://github.com/hapijs/joi/issues/2077" - }, - { - "id": 485948029, - "labels": ["feature"], - "number": 2076, - "title": "Allow/disallow list override", - "url": "https://github.com/hapijs/joi/issues/2076" - }, - { - "id": 485908614, - "labels": ["feature"], - "number": 2075, - "title": "Log when() partials", - "url": "https://github.com/hapijs/joi/issues/2075" - }, - { - "id": 485074471, - "labels": ["feature"], - "number": 2074, - "title": "Compile function into Joi.custom()", - "url": "https://github.com/hapijs/joi/issues/2074" - }, - { - "id": 485053537, - "labels": ["feature"], - "number": 2073, - "title": "When object.pattern() matches option is not an array(), apply to each item", - "url": "https://github.com/hapijs/joi/issues/2073" - }, - { - "id": 485053397, - "labels": ["feature"], - "number": 2072, - "title": "Custom function error shortcut", - "url": "https://github.com/hapijs/joi/issues/2072" - }, - { - "id": 484626076, - "labels": ["bug"], - "number": 2068, - "title": "schema.describe() does not work, when default value is assigned to array in schema", - "url": "https://github.com/hapijs/joi/issues/2068" - }, - { - "id": 483713767, - "labels": ["breaking changes"], - "number": 2065, - "title": "Change alternatives to be consistent with other spread arguments", - "url": "https://github.com/hapijs/joi/issues/2065" - }, - { - "id": 483710438, - "labels": ["breaking changes"], - "number": 2064, - "title": "Throw on invalid schema during validation", - "url": "https://github.com/hapijs/joi/issues/2064" - }, - { - "id": 483676913, - "labels": ["bug", "feature", "breaking changes"], - "number": 2062, - "title": "Support chained when()", - "url": "https://github.com/hapijs/joi/issues/2062" - }, - { - "id": 483676765, - "labels": ["non issue"], - "number": 2061, - "title": "Keep switch as single condition on when() and conditional()", - "url": "https://github.com/hapijs/joi/issues/2061" - }, - { - "id": 483676522, - "labels": ["bug", "breaking changes"], - "number": 2060, - "title": "object.assert() ref should be relative to parent, not self", - "url": "https://github.com/hapijs/joi/issues/2060" - }, - { - "id": 483555336, - "labels": ["feature"], - "number": 2059, - "title": "Support multiple usage of same schema with id", - "url": "https://github.com/hapijs/joi/issues/2059" - }, - { - "id": 482700993, - "labels": ["feature"], - "number": 2056, - "title": "Schema test coverage", - "url": "https://github.com/hapijs/joi/issues/2056" - }, - { - "id": 482682692, - "labels": ["breaking changes"], - "number": 2054, - "title": "Rename alternatives.when() to alternatives.conditional()", - "url": "https://github.com/hapijs/joi/issues/2054" - }, - { - "id": 481957401, - "labels": ["feature"], - "number": 2051, - "title": "Support for combine schema: allOf, oneOf, anyOf", - "url": "https://github.com/hapijs/joi/issues/2051" - }, - { - "id": 481431498, - "labels": ["breaking changes"], - "number": 2049, - "title": "Compile literals into any type with exact literal", - "url": "https://github.com/hapijs/joi/issues/2049" - }, - { - "id": 481389665, - "labels": ["bug"], - "number": 2048, - "title": "Replace marker with Symbol.for()", - "url": "https://github.com/hapijs/joi/issues/2048" - }, - { - "id": 480986370, - "labels": ["feature", "breaking changes"], - "number": 2046, - "title": "Cast multi values of into a single type with valid()", - "url": "https://github.com/hapijs/joi/issues/2046" - }, - { - "id": 479424418, - "labels": ["feature", "breaking changes"], - "number": 2041, - "title": "Exclude error stack trace by default", - "url": "https://github.com/hapijs/joi/issues/2041" - }, - { - "id": 479318280, - "labels": ["bug", "breaking changes"], - "number": 2040, - "title": "Replace boolean.insensitive() with sensitive() and not apply to allow()", - "url": "https://github.com/hapijs/joi/issues/2040" - }, - { - "id": 479242013, - "labels": ["feature"], - "number": 2039, - "title": "Allow mapping flags to rule methods with a different name", - "url": "https://github.com/hapijs/joi/issues/2039" - }, - { - "id": 479231804, - "labels": ["breaking changes"], - "number": 2038, - "title": "Stop matching object patterns once a match is found", - "url": "https://github.com/hapijs/joi/issues/2038" - }, - { - "id": 479228909, - "labels": ["breaking changes", "release notes"], - "number": 2037, - "title": "v16.0.0 Release Notes", - "url": "https://github.com/hapijs/joi/issues/2037" - }, - { - "id": 479209642, - "labels": ["breaking changes"], - "number": 2036, - "title": "{ result, error } changed to error undefined instead of null", - "url": "https://github.com/hapijs/joi/issues/2036" - }, - { - "id": 478895524, - "labels": ["feature"], - "number": 2035, - "title": "Skip error rendering preference", - "url": "https://github.com/hapijs/joi/issues/2035" - }, - { - "id": 478859408, - "labels": ["breaking changes"], - "number": 2034, - "title": "Consolidate date format errors", - "url": "https://github.com/hapijs/joi/issues/2034" - }, - { - "id": 478858891, - "labels": ["feature"], - "number": 2033, - "title": "msg() template function to access other messages", - "url": "https://github.com/hapijs/joi/issues/2033" - }, - { - "id": 478858236, - "labels": ["feature"], - "number": 2032, - "title": "Support custom sync functions for rules", - "url": "https://github.com/hapijs/joi/issues/2032" - }, - { - "id": 478670587, - "labels": ["breaking changes"], - "number": 2031, - "title": "Remove object and array string coerce", - "url": "https://github.com/hapijs/joi/issues/2031" - }, - { - "id": 478626408, - "labels": ["bug", "breaking changes"], - "number": 2030, - "title": "string.isoDate() fails on allow() and convert:false", - "url": "https://github.com/hapijs/joi/issues/2030" - }, - { - "id": 478291888, - "labels": ["feature"], - "number": 2027, - "title": "Support templates as object.assert() subject", - "url": "https://github.com/hapijs/joi/issues/2027" - }, - { - "id": 478291691, - "labels": ["breaking changes"], - "number": 2026, - "title": "Change object.assert error context and rule argument name", - "url": "https://github.com/hapijs/joi/issues/2026" - }, - { - "id": 478179010, - "labels": ["breaking changes"], - "number": 2024, - "title": "Remove binary and string encoding support from the browser", - "url": "https://github.com/hapijs/joi/issues/2024" - }, - { - "id": 477543341, - "labels": ["feature"], - "number": 2023, - "title": "Rule arguments validation", - "url": "https://github.com/hapijs/joi/issues/2023" - }, - { - "id": 477519304, - "labels": ["feature"], - "number": 2022, - "title": "Support reverse order coerce", - "url": "https://github.com/hapijs/joi/issues/2022" - }, - { - "id": 476963802, - "labels": ["non issue"], - "number": 2019, - "title": "Consolidate refs with args", - "url": "https://github.com/hapijs/joi/issues/2019" - }, - { - "id": 476963390, - "labels": ["feature"], - "number": 2018, - "title": "Support joi schema in refs assert", - "url": "https://github.com/hapijs/joi/issues/2018" - }, - { - "id": 476746095, - "labels": ["non issue"], - "number": 2016, - "title": "Consolidate refs assert's message/code", - "url": "https://github.com/hapijs/joi/issues/2016" - }, - { - "id": 476744784, - "labels": ["bug"], - "number": 2015, - "title": "Ensure all levels of coerce are only called on non-undefined values", - "url": "https://github.com/hapijs/joi/issues/2015" - }, - { - "id": 476744529, - "labels": ["non issue"], - "number": 2014, - "title": "Change all _methods used on schema to use definition", - "url": "https://github.com/hapijs/joi/issues/2014" - }, - { - "id": 476744263, - "labels": ["feature"], - "number": 2013, - "title": "Expose all internal extend() options externally", - "url": "https://github.com/hapijs/joi/issues/2013" - }, - { - "id": 476734404, - "labels": ["breaking changes"], - "number": 2012, - "title": "Rename func to function", - "url": "https://github.com/hapijs/joi/issues/2012" - }, - { - "id": 476519704, - "labels": ["breaking changes"], - "number": 2010, - "title": "New extension API", - "url": "https://github.com/hapijs/joi/issues/2010" - }, - { - "id": 476347403, - "labels": ["feature"], - "number": 2009, - "title": "Global defaults", - "url": "https://github.com/hapijs/joi/issues/2009" - }, - { - "id": 475853465, - "labels": ["breaking changes"], - "number": 2007, - "title": "Change Infinity errors from any.invalid to number.infinity", - "url": "https://github.com/hapijs/joi/issues/2007" - }, - { - "id": 475843489, - "labels": ["breaking changes"], - "number": 2006, - "title": "Change error code any.empty to string.empty", - "url": "https://github.com/hapijs/joi/issues/2006" - }, - { - "id": 475842438, - "labels": ["bug"], - "number": 2005, - "title": "Merging of two empty() should allow '' if it was explicitly defined", - "url": "https://github.com/hapijs/joi/issues/2005" - }, - { - "id": 474456413, - "labels": ["feature"], - "number": 2002, - "title": "Remove prefs schema validation", - "url": "https://github.com/hapijs/joi/issues/2002" - }, - { - "id": 474373731, - "labels": ["non issue"], - "number": 2001, - "title": "Remove joi.defaults()", - "url": "https://github.com/hapijs/joi/issues/2001" - }, - { - "id": 474111637, - "labels": ["documentation"], - "number": 1999, - "title": "Fix outdated use of Joi.func().ref()", - "url": "https://github.com/hapijs/joi/pull/1999" - }, - { - "id": 474005263, - "labels": ["feature", "breaking changes"], - "number": 1998, - "title": "Split validate() to sync and async versions", - "url": "https://github.com/hapijs/joi/issues/1998" - }, - { - "id": 473200030, - "labels": ["breaking changes"], - "number": 1995, - "title": "Replace strip flag with result flag", - "url": "https://github.com/hapijs/joi/issues/1995" - }, - { - "id": 473069049, - "labels": ["bug"], - "number": 1994, - "title": "Joi.string().uri() accepts 'http:/' as valid URL", - "url": "https://github.com/hapijs/joi/issues/1994" - }, - { - "id": 473034640, - "labels": ["feature"], - "number": 1993, - "title": "Root reference", - "url": "https://github.com/hapijs/joi/issues/1993" - }, - { - "id": 472450953, - "labels": ["feature", "breaking changes"], - "number": 1987, - "title": "Extension build() support", - "url": "https://github.com/hapijs/joi/issues/1987" - }, - { - "id": 472450722, - "labels": ["feature"], - "number": 1986, - "title": "Improve schema description validation", - "url": "https://github.com/hapijs/joi/issues/1986" - }, - { - "id": 471952255, - "labels": ["breaking changes"], - "number": 1985, - "title": "Refactor root", - "url": "https://github.com/hapijs/joi/issues/1985" - }, - { - "id": 471479727, - "labels": ["breaking changes"], - "number": 1983, - "title": "Change any.notes() to any.note() and require separate arguments", - "url": "https://github.com/hapijs/joi/issues/1983" - }, - { - "id": 471476892, - "labels": ["breaking changes"], - "number": 1982, - "title": "Change any.tags() to any.tag() and require separate arguments", - "url": "https://github.com/hapijs/joi/issues/1982" - }, - { - "id": 471473774, - "labels": ["breaking changes"], - "number": 1981, - "title": "Change any.example() to append by default", - "url": "https://github.com/hapijs/joi/issues/1981" - }, - { - "id": 471463151, - "labels": ["breaking changes"], - "number": 1980, - "title": "Rename string.regex() to string.pattern()", - "url": "https://github.com/hapijs/joi/issues/1980" - }, - { - "id": 470833796, - "labels": ["feature"], - "number": 1979, - "title": "Link to root (regardless of depth)", - "url": "https://github.com/hapijs/joi/issues/1979" - }, - { - "id": 470823226, - "labels": ["breaking changes"], - "number": 1978, - "title": "Change only() to flag instead of alias of valid()", - "url": "https://github.com/hapijs/joi/issues/1978" - }, - { - "id": 470822381, - "labels": ["breaking changes"], - "number": 1977, - "title": "Replace date multiple and timestamp flag with format", - "url": "https://github.com/hapijs/joi/issues/1977" - }, - { - "id": 470741373, - "labels": ["breaking changes"], - "number": 1976, - "title": "Rename object.allowUnknown error to object.unknown", - "url": "https://github.com/hapijs/joi/issues/1976" - }, - { - "id": 470708834, - "labels": ["breaking changes"], - "number": 1975, - "title": "Remove description for `default()` function", - "url": "https://github.com/hapijs/joi/issues/1975" - }, - { - "id": 470699519, - "labels": ["bug"], - "number": 1974, - "title": "Deep clone all values returned in describe()", - "url": "https://github.com/hapijs/joi/issues/1974" - }, - { - "id": 470316560, - "labels": ["bug"], - "number": 1973, - "title": "Behavior of .concat() with tests redefinition", - "url": "https://github.com/hapijs/joi/issues/1973" - }, - { - "id": 470264502, - "labels": ["feature", "breaking changes"], - "number": 1972, - "title": "Applying `raw` after successful validation", - "url": "https://github.com/hapijs/joi/issues/1972" - }, - { - "id": 467500728, - "labels": ["feature", "breaking changes"], - "number": 1968, - "title": "Repalce lazy with link", - "url": "https://github.com/hapijs/joi/issues/1968" - }, - { - "id": 465791028, - "labels": ["support"], - "number": 1965, - "title": "How to properly detect domains?", - "url": "https://github.com/hapijs/joi/issues/1965" - }, - { - "id": 463097176, - "labels": ["feature"], - "number": 1962, - "title": "Don't require pre function to take 3 arguments", - "url": "https://github.com/hapijs/joi/issues/1962" - }, - { - "id": 462988293, - "labels": ["bug", "breaking changes"], - "number": 1961, - "title": "Lazy once ignored when using with when()", - "url": "https://github.com/hapijs/joi/issues/1961" - }, - { - "id": 462816562, - "labels": ["bug", "breaking changes"], - "number": 1960, - "title": "Fix object peer dependencies error path", - "url": "https://github.com/hapijs/joi/issues/1960" - }, - { - "id": 462816231, - "labels": ["feature"], - "number": 1959, - "title": "Debug tools", - "url": "https://github.com/hapijs/joi/issues/1959" - }, - { - "id": 462502268, - "labels": ["feature"], - "number": 1958, - "title": "Warnings", - "url": "https://github.com/hapijs/joi/issues/1958" - }, - { - "id": 462414296, - "labels": ["feature"], - "number": 1957, - "title": "Feature: Marking options as deprecated", - "url": "https://github.com/hapijs/joi/issues/1957" - }, - { - "id": 462370766, - "labels": ["breaking changes"], - "number": 1956, - "title": "Extension messages override base", - "url": "https://github.com/hapijs/joi/issues/1956" - }, - { - "id": 462185076, - "labels": ["feature"], - "number": 1954, - "title": "Schema specialization", - "url": "https://github.com/hapijs/joi/issues/1954" - }, - { - "id": 461925863, - "labels": ["feature"], - "number": 1952, - "title": "Support fork into array and alternatives", - "url": "https://github.com/hapijs/joi/issues/1952" - }, - { - "id": 461924986, - "labels": ["breaking changes"], - "number": 1951, - "title": "Remove requiredKeys(), optionalKeys(), and forbiddenKeys()", - "url": "https://github.com/hapijs/joi/issues/1951" - }, - { - "id": 461924814, - "labels": ["feature"], - "number": 1950, - "title": "any.fork()", - "url": "https://github.com/hapijs/joi/issues/1950" - }, - { - "id": 461873853, - "labels": ["feature", "breaking changes"], - "number": 1949, - "title": "Replace Joi.reach() with schema.extract()", - "url": "https://github.com/hapijs/joi/issues/1949" - }, - { - "id": 461811241, - "labels": ["bug"], - "number": 1948, - "title": "Cannot read property 'ancestors' of null", - "url": "https://github.com/hapijs/joi/issues/1948" - }, - { - "id": 461629913, - "labels": ["breaking changes"], - "number": 1946, - "title": "Remove applyFunctionToChildren()", - "url": "https://github.com/hapijs/joi/issues/1946" - }, - { - "id": 461402649, - "labels": ["bug", "breaking changes"], - "number": 1945, - "title": "Throw when Joi.reach() is reaching into non-object", - "url": "https://github.com/hapijs/joi/issues/1945" - }, - { - "id": 461384308, - "labels": ["breaking changes"], - "number": 1944, - "title": "Remove any._getLabel()", - "url": "https://github.com/hapijs/joi/issues/1944" - }, - { - "id": 461382541, - "labels": ["breaking changes"], - "number": 1943, - "title": "Rename any.schemaType to any.type", - "url": "https://github.com/hapijs/joi/issues/1943" - }, - { - "id": 461379629, - "labels": ["breaking changes"], - "number": 1942, - "title": "Rename object.type() to object.instance()", - "url": "https://github.com/hapijs/joi/issues/1942" - }, - { - "id": 461354094, - "labels": ["breaking changes"], - "number": 1941, - "title": "Remove root.validate() and root.describe()", - "url": "https://github.com/hapijs/joi/issues/1941" - }, - { - "id": 461351325, - "labels": ["bug"], - "number": 1940, - "title": "Array validation with .error()", - "url": "https://github.com/hapijs/joi/issues/1940" - }, - { - "id": 461345460, - "labels": ["non issue"], - "number": 1939, - "title": "Replace attempt() with assert() alias", - "url": "https://github.com/hapijs/joi/issues/1939" - }, - { - "id": 461330029, - "labels": ["breaking changes"], - "number": 1938, - "title": "Remove callback support", - "url": "https://github.com/hapijs/joi/issues/1938" - }, - { - "id": 461131382, - "labels": ["feature"], - "number": 1937, - "title": "Support post-validation async operations", - "url": "https://github.com/hapijs/joi/issues/1937" - }, - { - "id": 460591392, - "labels": ["non issue"], - "number": 1935, - "title": "Rename var to expression and x", - "url": "https://github.com/hapijs/joi/issues/1935" - }, - { - "id": 460356274, - "labels": ["feature"], - "number": 1932, - "title": "Support base parameters in extend()", - "url": "https://github.com/hapijs/joi/issues/1932" - }, - { - "id": 460094725, - "labels": ["feature"], - "number": 1930, - "title": "Template calculations", - "url": "https://github.com/hapijs/joi/issues/1930" - }, - { - "id": 459590459, - "labels": ["feature"], - "number": 1929, - "title": "Cast date and boolean to number", - "url": "https://github.com/hapijs/joi/issues/1929" - }, - { - "id": 459503684, - "labels": ["feature"], - "number": 1925, - "title": "Cast to string", - "url": "https://github.com/hapijs/joi/issues/1925" - }, - { - "id": 459503640, - "labels": ["non issue"], - "number": 1924, - "title": "Move dateFormat pref out of errors", - "url": "https://github.com/hapijs/joi/issues/1924" - }, - { - "id": 459442841, - "labels": ["feature"], - "number": 1922, - "title": "Support ref into Set and Map cast values", - "url": "https://github.com/hapijs/joi/issues/1922" - }, - { - "id": 459439774, - "labels": ["breaking changes"], - "number": 1921, - "title": "Replace raw flag with result flag in description", - "url": "https://github.com/hapijs/joi/issues/1921" - }, - { - "id": 459439292, - "labels": ["non issue"], - "number": 1920, - "title": "Remove support for raw(false)", - "url": "https://github.com/hapijs/joi/issues/1920" - }, - { - "id": 459434975, - "labels": ["bug"], - "number": 1919, - "title": "Cannot combine function rules with object keys", - "url": "https://github.com/hapijs/joi/issues/1919" - }, - { - "id": 459079541, - "labels": ["feature"], - "number": 1917, - "title": "Complex conditional validation", - "url": "https://github.com/hapijs/joi/issues/1917" - }, - { - "id": 457947429, - "labels": ["feature"], - "number": 1914, - "title": "A way to cast the result of a array to Set and object to Map", - "url": "https://github.com/hapijs/joi/issues/1914" - }, - { - "id": 457929916, - "labels": ["breaking changes"], - "number": 1913, - "title": "Prevent mixing different versions of joi schema types", - "url": "https://github.com/hapijs/joi/issues/1913" - }, - { - "id": 457825597, - "labels": ["bug", "breaking changes"], - "number": 1912, - "title": "Identify blocked schema (valid + invalid = no valid options)", - "url": "https://github.com/hapijs/joi/issues/1912" - }, - { - "id": 457796385, - "labels": ["bug", "breaking changes"], - "number": 1911, - "title": "Unknown object keys ignore abortEarly flag", - "url": "https://github.com/hapijs/joi/issues/1911" - }, - { - "id": 457266750, - "labels": ["feature"], - "number": 1907, - "title": "Support ref in prefs.errors.language", - "url": "https://github.com/hapijs/joi/issues/1907" - }, - { - "id": 456744255, - "labels": ["feature"], - "number": 1906, - "title": "Precompile prefs.messages and extensions", - "url": "https://github.com/hapijs/joi/issues/1906" - }, - { - "id": 456732430, - "labels": ["breaking changes"], - "number": 1905, - "title": "Move error related prefs to `errors`", - "url": "https://github.com/hapijs/joi/issues/1905" - }, - { - "id": 456724595, - "labels": ["breaking changes"], - "number": 1904, - "title": "Remove ability to change template for implicit label prefix in error messages", - "url": "https://github.com/hapijs/joi/issues/1904" - }, - { - "id": 456724432, - "labels": ["breaking changes"], - "number": 1903, - "title": "Remove implicit label prefix for error messages", - "url": "https://github.com/hapijs/joi/issues/1903" - }, - { - "id": 456700980, - "labels": ["breaking changes"], - "number": 1902, - "title": "Rename `language` preference to `messages`", - "url": "https://github.com/hapijs/joi/issues/1902" - }, - { - "id": 456700792, - "labels": ["breaking changes"], - "number": 1901, - "title": "Rename messages.wrapArrays with wrapArrays", - "url": "https://github.com/hapijs/joi/issues/1901" - }, - { - "id": 456581789, - "labels": ["breaking changes"], - "number": 1898, - "title": "Change object.rename() from description to { regex } when using from pattern", - "url": "https://github.com/hapijs/joi/issues/1898" - }, - { - "id": 456508216, - "labels": ["feature"], - "number": 1896, - "title": "Support `{.}` in error for value", - "url": "https://github.com/hapijs/joi/issues/1896" - }, - { - "id": 456491132, - "labels": ["breaking changes"], - "number": 1895, - "title": "Remove isJoi from Errors.Report", - "url": "https://github.com/hapijs/joi/issues/1895" - }, - { - "id": 456480917, - "labels": ["feature"], - "number": 1894, - "title": "Pre-compile error messages", - "url": "https://github.com/hapijs/joi/issues/1894" - }, - { - "id": 456476176, - "labels": ["breaking changes"], - "number": 1893, - "title": "Language format requires # prefix for error context", - "url": "https://github.com/hapijs/joi/issues/1893" - }, - { - "id": 456467047, - "labels": ["breaking changes"], - "number": 1892, - "title": "Change \"context:\" ref prefix in errors to \"ref:global:\"", - "url": "https://github.com/hapijs/joi/issues/1892" - }, - { - "id": 456465624, - "labels": ["breaking changes"], - "number": 1891, - "title": "Replace ref.type description to ref.ref", - "url": "https://github.com/hapijs/joi/issues/1891" - }, - { - "id": 456459379, - "labels": ["breaking changes"], - "number": 1890, - "title": "Replace {{!var}} notation with {var}", - "url": "https://github.com/hapijs/joi/issues/1890" - }, - { - "id": 456459286, - "labels": ["breaking changes"], - "number": 1889, - "title": "Replace escapeHtml with escapeErrors", - "url": "https://github.com/hapijs/joi/issues/1889" - }, - { - "id": 456395797, - "labels": ["breaking changes"], - "number": 1888, - "title": "Joi.ref() is not a function", - "url": "https://github.com/hapijs/joi/issues/1888" - }, - { - "id": 456104664, - "labels": ["breaking changes"], - "number": 1887, - "title": "Remove object.rename.regex.multiple and object.rename.regex.override errors", - "url": "https://github.com/hapijs/joi/issues/1887" - }, - { - "id": 456096365, - "labels": ["bug", "breaking changes"], - "number": 1886, - "title": "Change object.rename() override option to not delete existing if nothing match", - "url": "https://github.com/hapijs/joi/issues/1886" - }, - { - "id": 456056403, - "labels": ["feature"], - "number": 1885, - "title": "array().sort([{ order, by }])", - "url": "https://github.com/hapijs/joi/issues/1885" - }, - { - "id": 455853433, - "labels": ["bug"], - "number": 1884, - "title": "Fix: Exponential decimal #1876", - "url": "https://github.com/hapijs/joi/pull/1884" - }, - { - "id": 454836031, - "labels": ["feature"], - "number": 1881, - "title": "Mark rule for keep", - "url": "https://github.com/hapijs/joi/issues/1881" - }, - { - "id": 454489123, - "labels": ["breaking changes"], - "number": 1878, - "title": "Flatten language object", - "url": "https://github.com/hapijs/joi/issues/1878" - }, - { - "id": 454407272, - "labels": ["feature"], - "number": 1877, - "title": "Rule sets", - "url": "https://github.com/hapijs/joi/issues/1877" - }, - { - "id": 454147627, - "labels": ["bug"], - "number": 1876, - "title": "Joi.number() throws error for \"0.00000095\" string.", - "url": "https://github.com/hapijs/joi/issues/1876" - }, - { - "id": 454038061, - "labels": ["breaking changes"], - "number": 1875, - "title": "Labels only used on path edge", - "url": "https://github.com/hapijs/joi/issues/1875" - }, - { - "id": 454031351, - "labels": ["breaking changes"], - "number": 1874, - "title": "Remove flags argument from createError()", - "url": "https://github.com/hapijs/joi/issues/1874" - }, - { - "id": 453948415, - "labels": ["feature"], - "number": 1873, - "title": "Add object.schema() type support", - "url": "https://github.com/hapijs/joi/issues/1873" - }, - { - "id": 453941922, - "labels": ["breaking changes"], - "number": 1872, - "title": "Replace alternatives.child with alternatives.match error code", - "url": "https://github.com/hapijs/joi/issues/1872" - }, - { - "id": 453937112, - "labels": ["feature", "breaking changes"], - "number": 1870, - "title": "New alternatives.types error code", - "url": "https://github.com/hapijs/joi/issues/1870" - }, - { - "id": 453937038, - "labels": ["breaking changes"], - "number": 1869, - "title": "Remove support for string or array or errors return value from error() function", - "url": "https://github.com/hapijs/joi/issues/1869" - }, - { - "id": 453916870, - "labels": ["feature", "breaking changes"], - "number": 1867, - "title": "Bidirectional describe() <-> build()", - "url": "https://github.com/hapijs/joi/issues/1867" - }, - { - "id": 453915279, - "labels": ["feature"], - "number": 1866, - "title": "Support multiple languages at the same time", - "url": "https://github.com/hapijs/joi/issues/1866" - }, - { - "id": 453915229, - "labels": ["feature"], - "number": 1865, - "title": "Joi.ref() map option", - "url": "https://github.com/hapijs/joi/issues/1865" - }, - { - "id": 453914924, - "labels": ["breaking changes"], - "number": 1864, - "title": "Merge positive and negative number rules into single sign rule", - "url": "https://github.com/hapijs/joi/issues/1864" - }, - { - "id": 453912013, - "labels": ["feature"], - "number": 1862, - "title": "Consistently use Utils.assertOptions() in all rules with options", - "url": "https://github.com/hapijs/joi/issues/1862" - }, - { - "id": 453911526, - "labels": ["feature"], - "number": 1860, - "title": "when() switch statement", - "url": "https://github.com/hapijs/joi/issues/1860" - }, - { - "id": 453865198, - "labels": ["breaking changes"], - "number": 1859, - "title": "Remove any.createOverrideError()", - "url": "https://github.com/hapijs/joi/issues/1859" - }, - { - "id": 453864922, - "labels": ["breaking changes"], - "number": 1858, - "title": "Remove this from error() function", - "url": "https://github.com/hapijs/joi/issues/1858" - }, - { - "id": 453843674, - "labels": ["breaking changes"], - "number": 1857, - "title": "Remove self option from error()", - "url": "https://github.com/hapijs/joi/issues/1857" - }, - { - "id": 453841888, - "labels": ["breaking changes"], - "number": 1856, - "title": "Remove automatic example validation", - "url": "https://github.com/hapijs/joi/issues/1856" - }, - { - "id": 453807923, - "labels": ["bug"], - "number": 1854, - "title": ".rename() causes errors when nothing has to be renamed", - "url": "https://github.com/hapijs/joi/issues/1854" - }, - { - "id": 453759531, - "labels": ["breaking changes"], - "number": 1853, - "title": "Remove case flag", - "url": "https://github.com/hapijs/joi/issues/1853" - }, - { - "id": 453757908, - "labels": ["breaking changes"], - "number": 1852, - "title": "Remove trim flag", - "url": "https://github.com/hapijs/joi/issues/1852" - }, - { - "id": 453750204, - "labels": ["breaking changes"], - "number": 1851, - "title": "Remove byteAligned flag", - "url": "https://github.com/hapijs/joi/issues/1851" - }, - { - "id": 453748135, - "labels": ["breaking changes"], - "number": 1850, - "title": "Remove precision flag", - "url": "https://github.com/hapijs/joi/issues/1850" - }, - { - "id": 453723856, - "labels": ["bug"], - "number": 1849, - "title": "Error on unreachable when() statement", - "url": "https://github.com/hapijs/joi/issues/1849" - }, - { - "id": 453719995, - "labels": ["breaking changes"], - "number": 1848, - "title": "Forbid chaining when() calls when the first was not on alternatives type", - "url": "https://github.com/hapijs/joi/issues/1848" - }, - { - "id": 453717749, - "labels": ["bug"], - "number": 1847, - "title": "any.error() fails to clear self option in override call", - "url": "https://github.com/hapijs/joi/issues/1847" - }, - { - "id": 453647301, - "labels": ["breaking changes"], - "number": 1846, - "title": "Skip type check if valids fail", - "url": "https://github.com/hapijs/joi/issues/1846" - }, - { - "id": 452264252, - "labels": ["breaking changes"], - "number": 1843, - "title": "Change object and array errors to use path instead of nested errors", - "url": "https://github.com/hapijs/joi/issues/1843" - }, - { - "id": 451482607, - "labels": ["feature"], - "number": 1842, - "title": "String multiple email address", - "url": "https://github.com/hapijs/joi/pull/1842" - }, - { - "id": 451212859, - "labels": ["breaking changes"], - "number": 1840, - "title": "Limit array.single() to only non-array items", - "url": "https://github.com/hapijs/joi/issues/1840" - }, - { - "id": 451158024, - "labels": ["breaking changes"], - "number": 1839, - "title": "Remove Hoek.reach() options from Ref", - "url": "https://github.com/hapijs/joi/issues/1839" - }, - { - "id": 451129076, - "labels": ["bug"], - "number": 1838, - "title": "Unique tests duplicated on concat()", - "url": "https://github.com/hapijs/joi/issues/1838" - }, - { - "id": 451126529, - "labels": ["breaking changes"], - "number": 1837, - "title": "Perform base type conversions before extension pre", - "url": "https://github.com/hapijs/joi/issues/1837" - }, - { - "id": 451124684, - "labels": ["breaking changes"], - "number": 1836, - "title": "Apply array.single() regardless of options.convert", - "url": "https://github.com/hapijs/joi/issues/1836" - }, - { - "id": 451119672, - "labels": ["breaking changes"], - "number": 1835, - "title": "Run extension coerce only if options.convert is true", - "url": "https://github.com/hapijs/joi/issues/1835" - }, - { - "id": 451061071, - "labels": ["breaking changes"], - "number": 1834, - "title": "Remove isJoi from schema", - "url": "https://github.com/hapijs/joi/issues/1834" - }, - { - "id": 451005508, - "labels": ["bug"], - "number": 1833, - "title": "Array items using references to array peers are ignored in order of processing", - "url": "https://github.com/hapijs/joi/issues/1833" - }, - { - "id": 451000291, - "labels": ["breaking changes"], - "number": 1832, - "title": "Change reference view in array item rules", - "url": "https://github.com/hapijs/joi/issues/1832" - }, - { - "id": 450938778, - "labels": ["breaking changes"], - "number": 1831, - "title": "Move func().ref() to object().ref()", - "url": "https://github.com/hapijs/joi/issues/1831" - }, - { - "id": 450933919, - "labels": ["breaking changes"], - "number": 1830, - "title": "Change Ref to class", - "url": "https://github.com/hapijs/joi/issues/1830" - }, - { - "id": 450038000, - "labels": ["breaking changes"], - "number": 1828, - "title": "Remove isRegExp from object.rename description", - "url": "https://github.com/hapijs/joi/issues/1828" - }, - { - "id": 449688315, - "labels": ["bug", "breaking changes"], - "number": 1827, - "title": "string min/max/length description missing encoding", - "url": "https://github.com/hapijs/joi/issues/1827" - }, - { - "id": 449684885, - "labels": ["bug"], - "number": 1826, - "title": "string.truncate() doesn't account for max with ref", - "url": "https://github.com/hapijs/joi/issues/1826" - }, - { - "id": 449679605, - "labels": ["bug", "breaking changes"], - "number": 1825, - "title": "Apply only last min/max/length rules", - "url": "https://github.com/hapijs/joi/issues/1825" - }, - { - "id": 449669944, - "labels": ["bug", "breaking changes"], - "number": 1824, - "title": "string methods change provided options", - "url": "https://github.com/hapijs/joi/issues/1824" - }, - { - "id": 449547905, - "labels": ["breaking changes"], - "number": 1823, - "title": "Description changes", - "url": "https://github.com/hapijs/joi/issues/1823" - }, - { - "id": 449361548, - "labels": ["bug", "breaking changes"], - "number": 1822, - "title": "Inconsistent reference error reporting", - "url": "https://github.com/hapijs/joi/issues/1822" - }, - { - "id": 449070784, - "labels": ["feature"], - "number": 1819, - "title": "Reduce reach", - "url": "https://github.com/hapijs/joi/pull/1819" - }, - { - "id": 445894700, - "labels": ["feature"], - "number": 1812, - "title": "Multiple email address validation", - "url": "https://github.com/hapijs/joi/issues/1812" - }, - { - "id": 443012238, - "labels": ["feature"], - "number": 1807, - "title": "Ability to perform custom calculations on referenced fields ", - "url": "https://github.com/hapijs/joi/issues/1807" - }, - { - "id": 441845404, - "labels": ["bug"], - "number": 1806, - "title": "Number validation fails with a valid number (\".30\")", - "url": "https://github.com/hapijs/joi/issues/1806" - }, - { - "id": 437663458, - "labels": ["bug"], - "number": 1796, - "title": "fix: copy object including Symbols", - "url": "https://github.com/hapijs/joi/pull/1796" - }, - { - "id": 428598360, - "labels": ["bug", "breaking changes"], - "number": 1778, - "title": "Make certain rules (min/max/length) override themselves revisited", - "url": "https://github.com/hapijs/joi/issues/1778" - }, - { - "id": 427228413, - "labels": ["bug"], - "number": 1770, - "title": "Don't delete object key when it equals the rename.to in a rename with regex", - "url": "https://github.com/hapijs/joi/pull/1770" - }, - { - "id": 427194779, - "labels": ["non issue"], - "number": 1769, - "title": "Merge v14 changes", - "url": "https://github.com/hapijs/joi/pull/1769" - }, - { - "id": 427162986, - "labels": ["non issue"], - "number": 1767, - "title": "V14 temp", - "url": "https://github.com/hapijs/joi/pull/1767" - }, - { - "id": 426112360, - "labels": ["feature", "breaking changes"], - "number": 1762, - "title": "Customize formatting for dates in error messages of min/max/greater/less (with ISO default)", - "url": "https://github.com/hapijs/joi/issues/1762" - }, - { - "id": 419128109, - "labels": ["feature"], - "number": 1746, - "title": "Validate base64 URI safe strings", - "url": "https://github.com/hapijs/joi/issues/1746" - }, - { - "id": 415097817, - "labels": ["feature"], - "number": 1737, - "title": "Translate validation messages based on header request", - "url": "https://github.com/hapijs/joi/issues/1737" - }, - { - "id": 415055516, - "labels": ["bug"], - "number": 1736, - "title": "truthy() / falsy() values apply when convert is false", - "url": "https://github.com/hapijs/joi/issues/1736" - }, - { - "id": 414141121, - "labels": ["bug"], - "number": 1732, - "title": "Joi.string().uri() accepts \"https://\" as a valid url", - "url": "https://github.com/hapijs/joi/issues/1732" - }, - { - "id": 413075250, - "labels": ["feature"], - "number": 1730, - "title": "Continue array validation even if items() fails", - "url": "https://github.com/hapijs/joi/issues/1730" - }, - { - "id": 410816329, - "labels": ["feature"], - "number": 1727, - "title": "Caching for strings / numbers / booleans", - "url": "https://github.com/hapijs/joi/issues/1727" - }, - { - "id": 409492570, - "labels": ["feature"], - "number": 1723, - "title": "Allow validate options to be passed through assert/attempt #1722", - "url": "https://github.com/hapijs/joi/pull/1723" - }, - { - "id": 409030086, - "labels": ["feature"], - "number": 1722, - "title": "Check all errors on joi.assert and joi.attempt", - "url": "https://github.com/hapijs/joi/issues/1722" - }, - { - "id": 401290660, - "labels": ["feature"], - "number": 1705, - "title": "Validate URI domain", - "url": "https://github.com/hapijs/joi/issues/1705" - }, - { - "id": 400388491, - "labels": ["feature"], - "number": 1702, - "title": "Ref inside top-level array items/ordered", - "url": "https://github.com/hapijs/joi/issues/1702" - }, - { - "id": 398033304, - "labels": ["feature"], - "number": 1696, - "title": "Joi should not strip non-enumerable properties of an object", - "url": "https://github.com/hapijs/joi/issues/1696" - }, - { - "id": 397884387, - "labels": ["bug", "feature"], - "number": 1695, - "title": "Support schema keys with '.' (without forcing path reach)", - "url": "https://github.com/hapijs/joi/issues/1695" - }, - { - "id": 392508641, - "labels": ["non issue"], - "number": 1687, - "title": "Validation fails with valid UUID 3", - "url": "https://github.com/hapijs/joi/issues/1687" - }, - { - "id": 381001678, - "labels": ["feature"], - "number": 1652, - "title": "Throw typed ValidationErrors", - "url": "https://github.com/hapijs/joi/pull/1652" - }, - { - "id": 380586757, - "labels": ["feature", "breaking changes"], - "number": 1651, - "title": "Reference above parent. Closes #1650", - "url": "https://github.com/hapijs/joi/pull/1651" - }, - { - "id": 380586560, - "labels": ["feature", "breaking changes"], - "number": 1650, - "title": "Support references above the parent", - "url": "https://github.com/hapijs/joi/issues/1650" - }, - { - "id": 379665617, - "labels": ["non issue"], - "number": 1648, - "title": "Move object rename to own function", - "url": "https://github.com/hapijs/joi/pull/1648" - }, - { - "id": 379639244, - "labels": ["breaking changes"], - "number": 1646, - "title": "Remove flatten arguments. Closes #1644", - "url": "https://github.com/hapijs/joi/pull/1646" - }, - { - "id": 379573789, - "labels": ["feature"], - "number": 1645, - "title": "Support self references. Closes #1569", - "url": "https://github.com/hapijs/joi/pull/1645" - }, - { - "id": 379563908, - "labels": ["breaking changes"], - "number": 1644, - "title": "Remove all arguments flattening", - "url": "https://github.com/hapijs/joi/issues/1644" - }, - { - "id": 373930207, - "labels": ["feature", "breaking changes"], - "number": 1623, - "title": "Check for valid/invalid values after conversion only", - "url": "https://github.com/hapijs/joi/issues/1623" - }, - { - "id": 369706091, - "labels": ["feature"], - "number": 1613, - "title": "Support ISO 8601 duration as a string validator", - "url": "https://github.com/hapijs/joi/pull/1613" - }, - { - "id": 369201050, - "labels": ["feature"], - "number": 1612, - "title": "Validate ISO Duration string", - "url": "https://github.com/hapijs/joi/issues/1612" - }, - { - "id": 367630177, - "labels": ["feature", "breaking changes"], - "number": 1606, - "title": "schema.describe minor issues and feature suggestions", - "url": "https://github.com/hapijs/joi/issues/1606" - }, - { - "id": 351422384, - "labels": ["feature"], - "number": 1569, - "title": "Allow self references", - "url": "https://github.com/hapijs/joi/issues/1569" - }, - { - "id": 336638596, - "labels": ["feature"], - "number": 1535, - "title": "failover() support for default on errors", - "url": "https://github.com/hapijs/joi/issues/1535" - }, - { - "id": 305889892, - "labels": ["feature"], - "number": 1457, - "title": "Specify required matches for .pattern()", - "url": "https://github.com/hapijs/joi/issues/1457" - }, - { - "id": 289759876, - "labels": ["feature"], - "number": 1403, - "title": "Support regexp capture group for rename ", - "url": "https://github.com/hapijs/joi/issues/1403" - }, - { - "id": 248201113, - "labels": ["feature"], - "number": 1264, - "title": "Override rule message with any.message() rule", - "url": "https://github.com/hapijs/joi/issues/1264" - }, - { - "id": 242526169, - "labels": ["feature", "support"], - "number": 1244, - "title": "Throw typed errors", - "url": "https://github.com/hapijs/joi/issues/1244" - }, - { - "id": 160444878, - "labels": ["feature"], - "number": 925, - "title": "Validating a FQDN", - "url": "https://github.com/hapijs/joi/issues/925" - }, - { - "id": 85263211, - "labels": ["feature"], - "number": 667, - "title": "Validate a number, which depends on other validate numbers", - "url": "https://github.com/hapijs/joi/issues/667" - } - ], - "number": 138, - "url": "https://github.com/hapijs/joi/milestone/138", - "version": "16.0.0" - }, - { - "date": "2019-08-16T04:02:00Z", - "id": 4577328, - "issues": [ - { - "id": 481389133, - "labels": ["bug"], - "number": 2047, - "title": "Replace marker with Symbol.for()", - "url": "https://github.com/hapijs/joi/issues/2047" - } - ], - "number": 152, - "url": "https://github.com/hapijs/joi/milestone/152", - "version": "15.1.1" - }, - { - "date": "2019-06-22T23:41:14Z", - "id": 4432663, - "issues": [ - { - "id": 459519505, - "labels": ["feature"], - "number": 1926, - "title": "Add legacy API", - "url": "https://github.com/hapijs/joi/issues/1926" - } - ], - "number": 150, - "url": "https://github.com/hapijs/joi/milestone/150", - "version": "15.1.0" - }, - { - "date": "2019-05-13T08:11:12Z", - "id": 4307781, - "issues": [ - { - "id": 443074958, - "labels": ["bug"], - "number": 1808, - "title": "bool() cannot be binded", - "url": "https://github.com/hapijs/joi/issues/1808" - } - ], - "number": 149, - "url": "https://github.com/hapijs/joi/milestone/149", - "version": "15.0.3" - }, - { - "date": "2019-05-08T15:05:14Z", - "id": 4296105, - "issues": [ - { - "id": 438895502, - "labels": ["bug"], - "number": 1801, - "title": "remove strip from defaults now that it has been removed", - "url": "https://github.com/hapijs/joi/pull/1801" - } - ], - "number": 148, - "url": "https://github.com/hapijs/joi/milestone/148", - "version": "15.0.2" - }, - { - "date": "2019-04-30T15:46:07Z", - "id": 4206402, - "issues": [ - { - "id": 425289224, - "labels": ["bug"], - "number": 1761, - "title": "Validate object keys related to another value", - "url": "https://github.com/hapijs/joi/issues/1761" - }, - { - "id": 421919014, - "labels": ["bug", "breaking changes"], - "number": 1753, - "title": "Override extension language", - "url": "https://github.com/hapijs/joi/issues/1753" - }, - { - "id": 420564025, - "labels": ["bug"], - "number": 1750, - "title": "Pass options to pattern validation to support refs", - "url": "https://github.com/hapijs/joi/pull/1750" - }, - { - "id": 420231970, - "labels": ["bug"], - "number": 1748, - "title": ".pattern doesn't respect .valid when using .ref", - "url": "https://github.com/hapijs/joi/issues/1748" - }, - { - "id": 420181826, - "labels": ["bug"], - "number": 1747, - "title": "Extension which has a return value in setup() does not call validate()", - "url": "https://github.com/hapijs/joi/issues/1747" - }, - { - "id": 405792943, - "labels": ["bug"], - "number": 1714, - "title": "Undocumented strip option on Joi.validate", - "url": "https://github.com/hapijs/joi/issues/1714" - }, - { - "id": 401085101, - "labels": ["bug"], - "number": 1704, - "title": "Resolved issue of maximum call stack exceeded", - "url": "https://github.com/hapijs/joi/pull/1704" - }, - { - "id": 400135974, - "labels": ["bug"], - "number": 1700, - "title": "base64 validation returns RangeError", - "url": "https://github.com/hapijs/joi/issues/1700" - } - ], - "number": 147, - "url": "https://github.com/hapijs/joi/milestone/147", - "version": "15.0.1" - }, - { - "date": "2019-04-02T04:49:34Z", - "id": 4184453, - "issues": [ - { - "id": 428021291, - "labels": ["breaking changes", "dependency", "release notes"], - "number": 1776, - "title": "Replace isemail with @hapi/address", - "url": "https://github.com/hapijs/joi/issues/1776" - }, - { - "id": 427192172, - "labels": ["bug"], - "number": 1768, - "title": "Fix dependency", - "url": "https://github.com/hapijs/joi/issues/1768" - } - ], - "number": 146, - "url": "https://github.com/hapijs/joi/milestone/146", - "version": "15.0.0" - }, - { - "date": "2019-06-23T02:19:48Z", - "id": 4432713, - "issues": [ - { - "id": 459528226, - "labels": ["feature"], - "number": 1928, - "title": "Add legacy API", - "url": "https://github.com/hapijs/joi/issues/1928" - } - ], - "number": 151, - "url": "https://github.com/hapijs/joi/milestone/151", - "version": "14.5.0" - }, - { - "date": "2019-03-29T20:21:54Z", - "id": 4184290, - "issues": [ - { - "id": 427161638, - "labels": ["non issue"], - "number": 1766, - "title": "Change module namespace", - "url": "https://github.com/hapijs/joi/issues/1766" - } - ], - "number": 145, - "url": "https://github.com/hapijs/joi/milestone/145", - "version": "14.4.0" - }, - { - "date": "2018-12-28T09:00:00Z", - "id": 3927174, - "issues": [ - { - "id": 394542338, - "labels": ["bug"], - "number": 1691, - "title": "joi.bind yields any() methods not fully bound", - "url": "https://github.com/hapijs/joi/issues/1691" - } - ], - "number": 142, - "url": "https://github.com/hapijs/joi/milestone/142", - "version": "14.3.1" - }, - { - "date": "2018-11-25T19:26:13Z", - "id": 3845940, - "issues": [ - { - "id": 384094400, - "labels": ["bug"], - "number": 1665, - "title": "path-related methods (`with(), `nand()`...) broken when applied on `func()`", - "url": "https://github.com/hapijs/joi/issues/1665" - }, - { - "id": 376417853, - "labels": ["feature"], - "number": 1631, - "title": "Destructuring Throws Fatal", - "url": "https://github.com/hapijs/joi/issues/1631" - } - ], - "number": 141, - "url": "https://github.com/hapijs/joi/milestone/141", - "version": "14.3.0" - }, - { - "date": "2018-11-25T13:53:31Z", - "id": 3844960, - "issues": [ - { - "id": 383284008, - "labels": ["feature"], - "number": 1659, - "title": "Add array().assertItem(). Closes #1656", - "url": "https://github.com/hapijs/joi/pull/1659" - }, - { - "id": 382347027, - "labels": ["support"], - "number": 1656, - "title": "Complex array validation requirements", - "url": "https://github.com/hapijs/joi/issues/1656" - }, - { - "id": 367826814, - "labels": ["feature", "non issue"], - "number": 1608, - "title": "Custom message overload another one ", - "url": "https://github.com/hapijs/joi/issues/1608" - }, - { - "id": 332685310, - "labels": ["support"], - "number": 1528, - "title": "joi errors not overriding for nested objects", - "url": "https://github.com/hapijs/joi/issues/1528" - }, - { - "id": 235510680, - "labels": ["feature"], - "number": 1219, - "title": "In case custom error messages are passed to Joi.any.error, joi.validate returning parent object error even if child validation fails.", - "url": "https://github.com/hapijs/joi/issues/1219" - } - ], - "number": 140, - "url": "https://github.com/hapijs/joi/milestone/140", - "version": "14.2.0" - }, - { - "date": "2018-11-24T11:32:05Z", - "id": 3844943, - "issues": [ - { - "id": 382674282, - "labels": ["bug"], - "number": 1658, - "title": "Extensions remove language of previous extension with the same base", - "url": "https://github.com/hapijs/joi/issues/1658" - } - ], - "number": 139, - "url": "https://github.com/hapijs/joi/milestone/139", - "version": "14.1.1" - }, - { - "date": "2018-11-24T11:13:32Z", - "id": 3812255, - "issues": [ - { - "id": 381859725, - "labels": ["test", "dependency"], - "number": 1654, - "title": "Bump to lab@18. Fixes #1653.", - "url": "https://github.com/hapijs/joi/pull/1654" - }, - { - "id": 379651118, - "labels": ["feature"], - "number": 1647, - "title": "Add object().oxor(). Closes #1628", - "url": "https://github.com/hapijs/joi/pull/1647" - }, - { - "id": 375786964, - "labels": ["feature"], - "number": 1628, - "title": "xor but none required", - "url": "https://github.com/hapijs/joi/issues/1628" - } - ], - "number": 137, - "url": "https://github.com/hapijs/joi/milestone/137", - "version": "14.1.0" - }, - { - "date": "2018-11-12T00:10:33Z", - "id": 3812011, - "issues": [ - { - "id": 367641201, - "labels": ["bug"], - "number": 1607, - "title": "invalid mime types on data uri", - "url": "https://github.com/hapijs/joi/issues/1607" - } - ], - "number": 136, - "url": "https://github.com/hapijs/joi/milestone/136", - "version": "14.0.6" - }, - { - "date": "2018-11-11T14:07:57Z", - "id": 3792284, - "issues": [ - { - "id": 378174072, - "labels": ["bug"], - "number": 1638, - "title": "fix condition, add tests for safe numbers", - "url": "https://github.com/hapijs/joi/pull/1638" - }, - { - "id": 377812126, - "labels": ["bug"], - "number": 1637, - "title": "Using Number.MAX_SAFE_INTEGER throw error that number unsafe.", - "url": "https://github.com/hapijs/joi/issues/1637" - } - ], - "number": 135, - "url": "https://github.com/hapijs/joi/milestone/135", - "version": "14.0.5" - }, - { - "date": "2018-11-03T00:30:30Z", - "id": 3792283, - "issues": [ - { - "id": 377002109, - "labels": ["non issue"], - "number": 1634, - "title": "Remove engines", - "url": "https://github.com/hapijs/joi/issues/1634" - } - ], - "number": 134, - "url": "https://github.com/hapijs/joi/milestone/134", - "version": "14.0.4" - }, - { - "date": "2018-10-29T22:09:10Z", - "id": 3768118, - "issues": [ - { - "id": 373474359, - "labels": ["bug"], - "number": 1622, - "title": "Maximum call stack size exceeded​​ error from Joi.defaults with Joi.empty flags", - "url": "https://github.com/hapijs/joi/issues/1622" - } - ], - "number": 133, - "url": "https://github.com/hapijs/joi/milestone/133", - "version": "14.0.2" - }, - { - "date": "2018-10-22T21:22:31Z", - "id": 3754985, - "issues": [ - { - "id": 372299707, - "labels": ["bug"], - "number": 1617, - "title": "object().with using nested paths validates when it shouldn't in Joi 14", - "url": "https://github.com/hapijs/joi/issues/1617" - } - ], - "number": 132, - "url": "https://github.com/hapijs/joi/milestone/132", - "version": "14.0.1" - }, - { - "date": "2018-10-22T21:22:37Z", - "id": 3544952, - "issues": [ - { - "id": 369916473, - "labels": ["breaking changes", "release notes"], - "number": 1615, - "title": "14.0.0 Release Notes", - "url": "https://github.com/hapijs/joi/issues/1615" - }, - { - "id": 369915091, - "labels": ["breaking changes"], - "number": 1614, - "title": "Default stripUnknown = true to only strip object keys, not arrays", - "url": "https://github.com/hapijs/joi/issues/1614" - }, - { - "id": 363087205, - "labels": ["feature", "breaking changes"], - "number": 1595, - "title": "Overriding array.min() when using reach", - "url": "https://github.com/hapijs/joi/issues/1595" - }, - { - "id": 351263536, - "labels": ["feature", "breaking changes"], - "number": 1568, - "title": "Trying to get multiple custom error messages in details array with {abortEarly: false}", - "url": "https://github.com/hapijs/joi/issues/1568" - }, - { - "id": 346916431, - "labels": ["feature", "breaking changes"], - "number": 1555, - "title": "Chaining multiple examples does not overwrite the old examples", - "url": "https://github.com/hapijs/joi/issues/1555" - }, - { - "id": 346844464, - "labels": ["feature", "breaking changes"], - "number": 1554, - "title": "#1477 Add Support for nested path with Joi.object().or(), .nand(), .and(), .with(), .without(), .xor()", - "url": "https://github.com/hapijs/joi/pull/1554" - }, - { - "id": 341880786, - "labels": ["bug", "breaking changes"], - "number": 1544, - "title": "Error at integer validation", - "url": "https://github.com/hapijs/joi/issues/1544" - }, - { - "id": 324485906, - "labels": ["feature", "breaking changes"], - "number": 1504, - "title": "Max safe integers", - "url": "https://github.com/hapijs/joi/issues/1504" - }, - { - "id": 315322518, - "labels": ["feature", "breaking changes"], - "number": 1478, - "title": ".example SHOULD perform validation on the provided value", - "url": "https://github.com/hapijs/joi/issues/1478" - }, - { - "id": 315143974, - "labels": ["feature", "breaking changes"], - "number": 1477, - "title": "Joi.object().or() does not support nested paths ", - "url": "https://github.com/hapijs/joi/issues/1477" - }, - { - "id": 295852145, - "labels": ["feature", "breaking changes"], - "number": 1429, - "title": "Joi.string().regex() with support for all modifiers", - "url": "https://github.com/hapijs/joi/issues/1429" - }, - { - "id": 276084183, - "labels": ["bug", "breaking changes"], - "number": 1364, - "title": "Need to override twice the key name for error messages", - "url": "https://github.com/hapijs/joi/issues/1364" - }, - { - "id": 245288679, - "labels": ["feature", "breaking changes"], - "number": 1258, - "title": "Feature Request: lazy once", - "url": "https://github.com/hapijs/joi/issues/1258" - }, - { - "id": 243005187, - "labels": ["bug", "breaking changes"], - "number": 1247, - "title": "Year-only iso date string is parsed incorrectly", - "url": "https://github.com/hapijs/joi/issues/1247" - }, - { - "id": 229557855, - "labels": ["bug", "breaking changes"], - "number": 1191, - "title": "Chaining string.insensitive() will not convert values with lowercase/uppercase modifiers", - "url": "https://github.com/hapijs/joi/issues/1191" - }, - { - "id": 214964128, - "labels": ["feature", "breaking changes"], - "number": 1127, - "title": "Make certain rules override themselves", - "url": "https://github.com/hapijs/joi/issues/1127" - }, - { - "id": 210302297, - "labels": ["bug", "feature"], - "number": 1113, - "title": "Number validation on '0x1' reports no error with a value of 0.", - "url": "https://github.com/hapijs/joi/issues/1113" - } - ], - "number": 130, - "url": "https://github.com/hapijs/joi/milestone/130", - "version": "14.0.0" - }, - { - "date": "2018-09-29T08:49:35Z", - "id": 3564622, - "issues": [ - { - "id": 348277928, - "labels": ["feature"], - "number": 1562, - "title": "Add symbol() type", - "url": "https://github.com/hapijs/joi/pull/1562" - }, - { - "id": 294694439, - "labels": ["feature"], - "number": 1420, - "title": "Add Symbol() support", - "url": "https://github.com/hapijs/joi/issues/1420" - } - ], - "number": 131, - "url": "https://github.com/hapijs/joi/milestone/131", - "version": "13.7.0" - }, - { - "date": "2018-08-10T16:12:02Z", - "id": 3544948, - "issues": [ - { - "id": 347427543, - "labels": ["feature"], - "number": 1558, - "title": "Add value to number.base errors", - "url": "https://github.com/hapijs/joi/issues/1558" - } - ], - "number": 129, - "url": "https://github.com/hapijs/joi/milestone/129", - "version": "13.6.0" - }, - { - "date": "2018-07-30T19:03:38Z", - "id": 3533470, - "issues": [], - "number": 128, - "url": "https://github.com/hapijs/joi/milestone/128", - "version": "13.5.2" - }, - { - "date": "2018-07-30T16:12:55Z", - "id": 3532912, - "issues": [], - "number": 127, - "url": "https://github.com/hapijs/joi/milestone/127", - "version": "13.5.1" - }, - { - "date": "2018-07-30T15:47:01Z", - "id": 3412505, - "issues": [ - { - "id": 335091908, - "labels": ["feature"], - "number": 1532, - "title": "Add enabled flag to string.trim()", - "url": "https://github.com/hapijs/joi/pull/1532" - }, - { - "id": 331463119, - "labels": ["feature"], - "number": 1525, - "title": "Add boolean flag to Joi.string().trim()", - "url": "https://github.com/hapijs/joi/issues/1525" - }, - { - "id": 326157125, - "labels": ["feature"], - "number": 1511, - "title": "Add optional \"config\" param to array.unique for ignoreUndefined. Closes #1498", - "url": "https://github.com/hapijs/joi/pull/1511" - }, - { - "id": 326090791, - "labels": ["feature"], - "number": 1510, - "title": "Data uri validation", - "url": "https://github.com/hapijs/joi/pull/1510" - }, - { - "id": 322263900, - "labels": ["feature"], - "number": 1498, - "title": "Validating unique optional fields in array elements.", - "url": "https://github.com/hapijs/joi/issues/1498" - }, - { - "id": 319193302, - "labels": ["feature"], - "number": 1487, - "title": "Allow square braces in URL validation", - "url": "https://github.com/hapijs/joi/pull/1487" - }, - { - "id": 307195797, - "labels": ["bug"], - "number": 1461, - "title": "URI validator rejects query param square brackets", - "url": "https://github.com/hapijs/joi/issues/1461" - }, - { - "id": 181357844, - "labels": ["documentation"], - "number": 999, - "title": "Where is the documentation for `this.createError()`?", - "url": "https://github.com/hapijs/joi/issues/999" - } - ], - "number": 126, - "url": "https://github.com/hapijs/joi/milestone/126", - "version": "13.5.0" - }, - { - "date": "2018-06-06T09:44:19Z", - "id": 3359682, - "issues": [ - { - "id": 329609311, - "labels": ["bug"], - "number": 1521, - "title": "Extended object does not parse JSON", - "url": "https://github.com/hapijs/joi/issues/1521" - }, - { - "id": 326755555, - "labels": ["bug"], - "number": 1515, - "title": "Joi.reach() can no longer handles empty string path", - "url": "https://github.com/hapijs/joi/issues/1515" - }, - { - "id": 326755401, - "labels": ["feature"], - "number": 1514, - "title": "remove indirect require reference to index.js", - "url": "https://github.com/hapijs/joi/pull/1514" - }, - { - "id": 326753430, - "labels": ["feature"], - "number": 1513, - "title": "require('../') statement in schemas.js causing bundler issues.", - "url": "https://github.com/hapijs/joi/issues/1513" - }, - { - "id": 324259930, - "labels": ["feature"], - "number": 1500, - "title": "add date greater less rules", - "url": "https://github.com/hapijs/joi/pull/1500" - }, - { - "id": 322485325, - "labels": ["feature"], - "number": 1499, - "title": "Allow object keys to be verified by schema", - "url": "https://github.com/hapijs/joi/pull/1499" - }, - { - "id": 283037901, - "labels": ["feature"], - "number": 1382, - "title": "Add a key validator with Joi objects", - "url": "https://github.com/hapijs/joi/issues/1382" - }, - { - "id": 181377285, - "labels": ["bug"], - "number": 1000, - "title": "Correct way to write an \"identity\" extension?", - "url": "https://github.com/hapijs/joi/issues/1000" - } - ], - "number": 125, - "url": "https://github.com/hapijs/joi/milestone/125", - "version": "13.4.0" - }, - { - "date": "2018-05-08T16:36:50Z", - "id": 3304087, - "issues": [ - { - "id": 315762313, - "labels": ["feature"], - "number": 1479, - "title": "Is it possible to capture the value of field being validated in custom error messages using the options - language", - "url": "https://github.com/hapijs/joi/issues/1479" - }, - { - "id": 297603748, - "labels": ["feature"], - "number": 1438, - "title": "Use Set() for handling of unprocessed keys", - "url": "https://github.com/hapijs/joi/pull/1438" - }, - { - "id": 294792261, - "labels": ["feature"], - "number": 1422, - "title": "Add byteAligned option to hex string", - "url": "https://github.com/hapijs/joi/pull/1422" - }, - { - "id": 292852186, - "labels": ["feature"], - "number": 1415, - "title": "Use Set() for internal Set backend", - "url": "https://github.com/hapijs/joi/pull/1415" - } - ], - "number": 124, - "url": "https://github.com/hapijs/joi/milestone/124", - "version": "13.3.0" - }, - { - "date": "2018-04-17T12:07:45Z", - "id": 3103767, - "issues": [ - { - "id": 314718373, - "labels": ["bug"], - "number": 1476, - "title": "Cannot validate an array with 'constructor' as unique entry", - "url": "https://github.com/hapijs/joi/issues/1476" - }, - { - "id": 304150136, - "labels": ["feature"], - "number": 1452, - "title": "Add new validation number().port()", - "url": "https://github.com/hapijs/joi/pull/1452" - }, - { - "id": 303224595, - "labels": ["documentation"], - "number": 1448, - "title": "Include describe() documentation in API. Fixes #1447", - "url": "https://github.com/hapijs/joi/pull/1448" - }, - { - "id": 297164372, - "labels": ["feature"], - "number": 1435, - "title": "Add an object.append() method. Fixes #1381.", - "url": "https://github.com/hapijs/joi/pull/1435" - }, - { - "id": 296415118, - "labels": ["feature"], - "number": 1433, - "title": "Changed a separator for path parameter to pre-split array approach for Joi.reach", - "url": "https://github.com/hapijs/joi/pull/1433" - }, - { - "id": 294813572, - "labels": ["feature"], - "number": 1423, - "title": "Avoid redundant copies of settings", - "url": "https://github.com/hapijs/joi/pull/1423" - }, - { - "id": 292808080, - "labels": ["feature"], - "number": 1414, - "title": "Fix cloned valid() / invalid() object values", - "url": "https://github.com/hapijs/joi/pull/1414" - }, - { - "id": 283039455, - "labels": ["feature"], - "number": 1383, - "title": "Add an separator parameter to Joi.reach", - "url": "https://github.com/hapijs/joi/issues/1383" - }, - { - "id": 282884730, - "labels": ["feature"], - "number": 1381, - "title": "Add an object.append() method", - "url": "https://github.com/hapijs/joi/issues/1381" - }, - { - "id": 270030262, - "labels": ["feature"], - "number": 1346, - "title": "Validate port numbers", - "url": "https://github.com/hapijs/joi/issues/1346" - } - ], - "number": 123, - "url": "https://github.com/hapijs/joi/milestone/123", - "version": "13.2.0" - }, - { - "date": "2018-02-09T19:51:47Z", - "id": 3084722, - "issues": [ - { - "id": 286179863, - "labels": ["bug"], - "number": 1392, - "title": "undefined in the array with label returns wrong missing value message", - "url": "https://github.com/hapijs/joi/issues/1392" - } - ], - "number": 122, - "url": "https://github.com/hapijs/joi/milestone/122", - "version": "13.1.2" - }, - { - "date": "2018-01-19T13:24:10Z", - "id": 3048494, - "issues": [ - { - "id": 287916926, - "labels": ["feature"], - "number": 1395, - "title": "Asserts that two arguments are provided to object.with() and object.without()", - "url": "https://github.com/hapijs/joi/pull/1395" - } - ], - "number": 121, - "url": "https://github.com/hapijs/joi/milestone/121", - "version": "13.1.1" - }, - { - "date": "2018-01-04T14:44:12Z", - "id": 3013036, - "issues": [ - { - "id": 283521529, - "labels": [], - "number": 1386, - "title": "Fix object pattern in combination with empty", - "url": "https://github.com/hapijs/joi/pull/1386" - } - ], - "number": 120, - "url": "https://github.com/hapijs/joi/milestone/120", - "version": "13.1.0" - }, - { - "date": "2017-11-12T20:19:03Z", - "id": 2906228, - "issues": [ - { - "id": 273254625, - "labels": ["bug"], - "number": 1354, - "title": "Remove validation from .example", - "url": "https://github.com/hapijs/joi/pull/1354" - }, - { - "id": 271830762, - "labels": ["bug"], - "number": 1350, - "title": "joi.ref doesn't work properly with max() function for dependant dates ", - "url": "https://github.com/hapijs/joi/issues/1350" - }, - { - "id": 229383333, - "labels": ["bug", "support"], - "number": 1189, - "title": "Should .example perform validation on the provided value?", - "url": "https://github.com/hapijs/joi/issues/1189" - } - ], - "number": 119, - "url": "https://github.com/hapijs/joi/milestone/119", - "version": "13.0.2" - }, - { - "date": "2017-10-19T12:52:08Z", - "id": 2850464, - "issues": [ - { - "id": 266775659, - "labels": ["bug"], - "number": 1334, - "title": "Impossible to disable language.key in options", - "url": "https://github.com/hapijs/joi/issues/1334" - } - ], - "number": 118, - "url": "https://github.com/hapijs/joi/milestone/118", - "version": "13.0.1" - }, - { - "date": "2017-10-14T15:07:21Z", - "id": 2837334, - "issues": [ - { - "id": 265497514, - "labels": ["breaking changes", "release notes"], - "number": 1328, - "title": "13.0.0 Release Notes", - "url": "https://github.com/hapijs/joi/issues/1328" - }, - { - "id": 265496379, - "labels": ["breaking changes"], - "number": 1327, - "title": "Bump joi to node 8+", - "url": "https://github.com/hapijs/joi/issues/1327" - } - ], - "number": 117, - "url": "https://github.com/hapijs/joi/milestone/117", - "version": "13.0.0" - }, - { - "date": "2019-03-24T23:19:53Z", - "id": 4162837, - "issues": [ - { - "id": 424065331, - "labels": ["breaking changes"], - "number": 1757, - "title": "Commercial version of v12 branch", - "url": "https://github.com/hapijs/joi/issues/1757" - } - ], - "number": 143, - "url": "https://github.com/hapijs/joi/milestone/143", - "version": "12.1.0" - }, - { - "date": "2017-10-14T15:07:23Z", - "id": 2821546, - "issues": [ - { - "id": 265495234, - "labels": ["security", "breaking changes", "release notes"], - "number": 1326, - "title": "12.0.0 Release Notes", - "url": "https://github.com/hapijs/joi/issues/1326" - }, - { - "id": 159834932, - "labels": ["feature", "breaking changes"], - "number": 921, - "title": "$-sign in object keys are escaped in the ValidationError message", - "url": "https://github.com/hapijs/joi/issues/921" - } - ], - "number": 112, - "url": "https://github.com/hapijs/joi/milestone/112", - "version": "12.0.0" - }, - { - "date": "2017-10-14T12:44:02Z", - "id": 2837264, - "issues": [ - { - "id": 265487048, - "labels": ["feature"], - "number": 1325, - "title": "Allow `alternatives.when` to \"peek\" inside the current value", - "url": "https://github.com/hapijs/joi/issues/1325" - } - ], - "number": 116, - "url": "https://github.com/hapijs/joi/milestone/116", - "version": "11.4.0" - }, - { - "date": "2017-10-09T17:44:43Z", - "id": 2825376, - "issues": [ - { - "id": 238790400, - "labels": ["feature"], - "number": 1230, - "title": "Missing `language` entry in `joi.extend` causes obscure runtime error", - "url": "https://github.com/hapijs/joi/issues/1230" - } - ], - "number": 115, - "url": "https://github.com/hapijs/joi/milestone/115", - "version": "11.3.4" - }, - { - "date": "2017-10-08T19:33:33Z", - "id": 2823033, - "issues": [ - { - "id": 259408938, - "labels": ["non issue"], - "number": 1311, - "title": "import { any } does not work on v11", - "url": "https://github.com/hapijs/joi/issues/1311" - } - ], - "number": 114, - "url": "https://github.com/hapijs/joi/milestone/114", - "version": "11.3.1" - }, - { - "date": "2017-10-08T16:22:06Z", - "id": 2822789, - "issues": [ - { - "id": 241053503, - "labels": ["feature"], - "number": 1240, - "title": "Fixes [#1239]", - "url": "https://github.com/hapijs/joi/pull/1240" - }, - { - "id": 240790711, - "labels": ["feature"], - "number": 1239, - "title": "Rename multiple keys to another name", - "url": "https://github.com/hapijs/joi/issues/1239" - } - ], - "number": 113, - "url": "https://github.com/hapijs/joi/milestone/113", - "version": "11.3.0" - }, - { - "date": "2017-10-07T21:44:01Z", - "id": 2787810, - "issues": [ - { - "id": 258673170, - "labels": [], - "number": 1308, - "title": "Add Joi.func().class()", - "url": "https://github.com/hapijs/joi/pull/1308" - } - ], - "number": 111, - "url": "https://github.com/hapijs/joi/milestone/111", - "version": "11.2.0" - }, - { - "date": "2017-10-07T13:12:23Z", - "id": 2787736, - "issues": [ - { - "id": 260172662, - "labels": ["dependency"], - "number": 1316, - "title": "Remove items module dependency", - "url": "https://github.com/hapijs/joi/issues/1316" - } - ], - "number": 110, - "url": "https://github.com/hapijs/joi/milestone/110", - "version": "11.1.1" - }, - { - "date": "2017-09-24T17:20:32Z", - "id": 2781668, - "issues": [ - { - "id": 260080943, - "labels": ["feature"], - "number": 1315, - "title": "Add promise-like API to validate. Fixes #1314.", - "url": "https://github.com/hapijs/joi/pull/1315" - }, - { - "id": 260080719, - "labels": ["feature"], - "number": 1314, - "title": "Support promises on `validate()`", - "url": "https://github.com/hapijs/joi/issues/1314" - }, - { - "id": 254855872, - "labels": ["feature"], - "number": 1291, - "title": "Add string.normalize for unicode normalization", - "url": "https://github.com/hapijs/joi/pull/1291" - }, - { - "id": 254795495, - "labels": ["feature"], - "number": 1289, - "title": "Feature request: Unicode normalization", - "url": "https://github.com/hapijs/joi/issues/1289" - } - ], - "number": 109, - "url": "https://github.com/hapijs/joi/milestone/109", - "version": "11.1.0" - }, - { - "date": "2017-09-20T22:41:06Z", - "id": 2781655, - "issues": [ - { - "id": 248384414, - "labels": ["bug"], - "number": 1266, - "title": "remove empty flag if only reset is used", - "url": "https://github.com/hapijs/joi/pull/1266" - }, - { - "id": 243963879, - "labels": ["bug"], - "number": 1249, - "title": "describe doesn't work for empty() breaking lout", - "url": "https://github.com/hapijs/joi/issues/1249" - } - ], - "number": 108, - "url": "https://github.com/hapijs/joi/milestone/108", - "version": "11.0.3" - }, - { - "date": "2017-09-19T09:20:01Z", - "id": 2777065, - "issues": [ - { - "id": 258034140, - "labels": ["bug"], - "number": 1303, - "title": "empty string is wrongly accepted as a timestamp", - "url": "https://github.com/hapijs/joi/issues/1303" - } - ], - "number": 107, - "url": "https://github.com/hapijs/joi/milestone/107", - "version": "11.0.2" - }, - { - "date": "2017-09-19T09:19:59Z", - "id": 2405282, - "issues": [ - { - "id": 257758091, - "labels": ["breaking changes", "release notes"], - "number": 1302, - "title": "11.0.0 Release Notes", - "url": "https://github.com/hapijs/joi/issues/1302" - }, - { - "id": 253580300, - "labels": ["bug"], - "number": 1283, - "title": "Error: Item cannot come after itself", - "url": "https://github.com/hapijs/joi/issues/1283" - }, - { - "id": 253078184, - "labels": ["documentation"], - "number": 1282, - "title": "There is a bug in 10.6.0 API Reference.", - "url": "https://github.com/hapijs/joi/issues/1282" - }, - { - "id": 251494878, - "labels": ["bug"], - "number": 1278, - "title": "Joi.defaults(): Cannot default object type", - "url": "https://github.com/hapijs/joi/issues/1278" - }, - { - "id": 245177379, - "labels": ["feature"], - "number": 1256, - "title": "Add `Joi.defaults()`", - "url": "https://github.com/hapijs/joi/pull/1256" - }, - { - "id": 244915977, - "labels": ["bug"], - "number": 1254, - "title": "ipv6 with cidr greater than 32", - "url": "https://github.com/hapijs/joi/issues/1254" - }, - { - "id": 239819574, - "labels": ["bug"], - "number": 1235, - "title": "Fix Value Range for IPv6 CIDRs", - "url": "https://github.com/hapijs/joi/pull/1235" - }, - { - "id": 239776383, - "labels": ["bug"], - "number": 1232, - "title": "ipv6 string with mask between 33 and 128 are rejected.", - "url": "https://github.com/hapijs/joi/issues/1232" - }, - { - "id": 237881491, - "labels": ["breaking changes", "dependency"], - "number": 1229, - "title": "Update isemail from 2.x.x to 3.x.x", - "url": "https://github.com/hapijs/joi/pull/1229" - }, - { - "id": 230856182, - "labels": ["bug", "breaking changes"], - "number": 1197, - "title": "Allow passing an option to string().isoDate()", - "url": "https://github.com/hapijs/joi/pull/1197" - }, - { - "id": 230856109, - "labels": ["bug", "feature", "breaking changes"], - "number": 1196, - "title": "string isoDate should allow the string to be converted to same format as date iso schema", - "url": "https://github.com/hapijs/joi/issues/1196" - }, - { - "id": 223869943, - "labels": ["bug", "breaking changes"], - "number": 1167, - "title": "Errors: context.key is actually the label, not the key", - "url": "https://github.com/hapijs/joi/issues/1167" - }, - { - "id": 214846303, - "labels": ["feature", "breaking changes"], - "number": 1126, - "title": "Passes the \"default\" function to the schema description", - "url": "https://github.com/hapijs/joi/pull/1126" - }, - { - "id": 212581606, - "labels": ["feature"], - "number": 1121, - "title": "[Request] Add detail to .describe for function defaults", - "url": "https://github.com/hapijs/joi/issues/1121" - }, - { - "id": 161200713, - "labels": ["feature"], - "number": 931, - "title": "Email validation doesn't allow emails which are compliant with RFC 6530", - "url": "https://github.com/hapijs/joi/issues/931" - } - ], - "number": 95, - "url": "https://github.com/hapijs/joi/milestone/95", - "version": "11.0.0" - }, - { - "date": "2017-06-15T17:41:32Z", - "id": 2559175, - "issues": [ - { - "id": 234289593, - "labels": ["feature"], - "number": 1215, - "title": "#1201 - setup can return joi object to replace origin schema", - "url": "https://github.com/hapijs/joi/pull/1215" - }, - { - "id": 233493027, - "labels": ["feature"], - "number": 1211, - "title": "Performance Improvements for string().guid()", - "url": "https://github.com/hapijs/joi/pull/1211" - }, - { - "id": 232954554, - "labels": ["feature"], - "number": 1206, - "title": "Added the ability to use a reference for Array min/max/length", - "url": "https://github.com/hapijs/joi/pull/1206" - }, - { - "id": 231523010, - "labels": ["feature"], - "number": 1201, - "title": "Question: how to extend joi to add some key by rule?", - "url": "https://github.com/hapijs/joi/issues/1201" - }, - { - "id": 225597589, - "labels": ["feature"], - "number": 1174, - "title": "Fix #1156 - Adds support for optional base64 padding validation.", - "url": "https://github.com/hapijs/joi/pull/1174" - }, - { - "id": 221024691, - "labels": ["feature"], - "number": 1156, - "title": "base64 validation too strict; padding is optional", - "url": "https://github.com/hapijs/joi/issues/1156" - }, - { - "id": 186069209, - "labels": ["feature"], - "number": 1017, - "title": "Array length cannot reference to another field", - "url": "https://github.com/hapijs/joi/issues/1017" - } - ], - "number": 106, - "url": "https://github.com/hapijs/joi/milestone/106", - "version": "10.6.0" - }, - { - "date": "2017-06-02T20:49:11Z", - "id": 2549786, - "issues": [ - { - "id": 231271861, - "labels": ["dependency"], - "number": 1199, - "title": "Make isemail an optional dependency", - "url": "https://github.com/hapijs/joi/pull/1199" - } - ], - "number": 105, - "url": "https://github.com/hapijs/joi/milestone/105", - "version": "10.5.2" - }, - { - "date": "2017-05-28T22:19:30Z", - "id": 2547244, - "issues": [ - { - "id": 231898595, - "labels": ["bug"], - "number": 1203, - "title": "Nested child/uncle condition causes annotate() to throw ", - "url": "https://github.com/hapijs/joi/issues/1203" - } - ], - "number": 104, - "url": "https://github.com/hapijs/joi/milestone/104", - "version": "10.5.1" - }, - { - "date": "2017-05-18T15:45:07Z", - "id": 2518475, - "issues": [ - { - "id": 227638594, - "labels": ["feature"], - "number": 1183, - "title": "add forbiddenKeys method to object", - "url": "https://github.com/hapijs/joi/pull/1183" - } - ], - "number": 103, - "url": "https://github.com/hapijs/joi/milestone/103", - "version": "10.5.0" - }, - { - "date": "2017-05-13T10:41:57Z", - "id": 2428429, - "issues": [ - { - "id": 221894356, - "labels": ["bug"], - "number": 1161, - "title": "Alternatives respect subsequent \"when\"s if first has only \"otherwise\"", - "url": "https://github.com/hapijs/joi/pull/1161" - }, - { - "id": 220013181, - "labels": ["bug"], - "number": 1151, - "title": "Alternatives based on a type with only otherwise take precedence over any following one", - "url": "https://github.com/hapijs/joi/issues/1151" - }, - { - "id": 218796000, - "labels": ["bug"], - "number": 1146, - "title": "Keep converted values even when stripped for reference uses", - "url": "https://github.com/hapijs/joi/issues/1146" - }, - { - "id": 215568352, - "labels": ["feature"], - "number": 1132, - "title": "Add \"options\" to describe output", - "url": "https://github.com/hapijs/joi/pull/1132" - }, - { - "id": 215506277, - "labels": ["feature"], - "number": 1130, - "title": "Joi.any().options() should be reported in .describe()", - "url": "https://github.com/hapijs/joi/issues/1130" - } - ], - "number": 102, - "url": "https://github.com/hapijs/joi/milestone/102", - "version": "10.4.2" - }, - { - "date": "2017-04-02T21:46:25Z", - "id": 2427982, - "issues": [ - { - "id": 212541495, - "labels": ["bug"], - "number": 1119, - "title": "alternatives doesn't work with error", - "url": "https://github.com/hapijs/joi/issues/1119" - }, - { - "id": 140122010, - "labels": ["bug"], - "number": 844, - "title": "Label in object.and()", - "url": "https://github.com/hapijs/joi/issues/844" - } - ], - "number": 101, - "url": "https://github.com/hapijs/joi/milestone/101", - "version": "10.4.1" - }, - { - "date": "2017-04-02T15:56:59Z", - "id": 2427457, - "issues": [ - { - "id": 215521626, - "labels": ["feature", "support"], - "number": 1131, - "title": "Add basic error overriding", - "url": "https://github.com/hapijs/joi/pull/1131" - } - ], - "number": 100, - "url": "https://github.com/hapijs/joi/milestone/100", - "version": "10.4.0" - }, - { - "date": "2017-04-01T08:19:08Z", - "id": 2427020, - "issues": [ - { - "id": 218458441, - "labels": ["bug"], - "number": 1143, - "title": "number().integer() can fail for values outside MAX_SAFE_INTEGER", - "url": "https://github.com/hapijs/joi/issues/1143" - } - ], - "number": 99, - "url": "https://github.com/hapijs/joi/milestone/99", - "version": "10.3.4" - }, - { - "date": "2017-04-01T07:47:43Z", - "id": 2424847, - "issues": [ - { - "id": 218548189, - "labels": ["bug"], - "number": 1145, - "title": "Don't try to touch custom error messages with attempt message", - "url": "https://github.com/hapijs/joi/issues/1145" - } - ], - "number": 98, - "url": "https://github.com/hapijs/joi/milestone/98", - "version": "10.3.3" - }, - { - "date": "2017-03-31T15:52:16Z", - "id": 2424817, - "issues": [ - { - "id": 218538231, - "labels": ["bug"], - "number": 1144, - "title": "Possible bug in custom Error message", - "url": "https://github.com/hapijs/joi/issues/1144" - } - ], - "number": 97, - "url": "https://github.com/hapijs/joi/milestone/97", - "version": "10.3.2" - }, - { - "date": "2017-03-26T13:21:11Z", - "id": 2411581, - "issues": [ - { - "id": 205118190, - "labels": ["bug"], - "number": 1097, - "title": "Fix #964 Joi wrong value parsing", - "url": "https://github.com/hapijs/joi/pull/1097" - }, - { - "id": 168354866, - "labels": ["bug"], - "number": 964, - "title": "Joi wrong value parsing", - "url": "https://github.com/hapijs/joi/issues/964" - } - ], - "number": 96, - "url": "https://github.com/hapijs/joi/milestone/96", - "version": "10.3.1" - }, - { - "date": "2017-03-22T11:19:44Z", - "id": 2394787, - "issues": [ - { - "id": 215198486, - "labels": ["feature"], - "number": 1128, - "title": "Avoid unnecessary clones", - "url": "https://github.com/hapijs/joi/issues/1128" - }, - { - "id": 195884201, - "labels": ["bug"], - "number": 1067, - "title": "\"Describe\" behavior changes for \"implicit\" Any with extended Joi", - "url": "https://github.com/hapijs/joi/issues/1067" - }, - { - "id": 191470098, - "labels": ["feature"], - "number": 1047, - "title": "Creating multiple extensions for the same base type", - "url": "https://github.com/hapijs/joi/issues/1047" - }, - { - "id": 177225536, - "labels": ["bug"], - "number": 983, - "title": "Unexpected interaction between Joi.object().unknown() and stripUnknown", - "url": "https://github.com/hapijs/joi/issues/983" - }, - { - "id": 135118394, - "labels": ["feature"], - "number": 831, - "title": "Joi valid fails, when ref is used with a stripped key.", - "url": "https://github.com/hapijs/joi/issues/831" - } - ], - "number": 94, - "url": "https://github.com/hapijs/joi/milestone/94", - "version": "10.3.0" - }, - { - "date": "2017-02-09T20:53:03Z", - "id": 2312948, - "issues": [ - { - "id": 206615421, - "labels": ["bug"], - "number": 1103, - "title": "allow param defaults to be set by the param validations", - "url": "https://github.com/hapijs/joi/pull/1103" - } - ], - "number": 93, - "url": "https://github.com/hapijs/joi/milestone/93", - "version": "10.2.2" - }, - { - "date": "2017-02-02T15:34:04Z", - "id": 2295381, - "issues": [ - { - "id": 204891935, - "labels": ["bug"], - "number": 1095, - "title": "noDefaults behaviour with any.empty()", - "url": "https://github.com/hapijs/joi/issues/1095" - } - ], - "number": 92, - "url": "https://github.com/hapijs/joi/milestone/92", - "version": "10.2.1" - }, - { - "date": "2017-01-15T19:11:28Z", - "id": 2253005, - "issues": [ - { - "id": 197919729, - "labels": ["feature"], - "number": 1076, - "title": "Added support for ISO_8601 expansion (+/-YYYYYY)", - "url": "https://github.com/hapijs/joi/pull/1076" - } - ], - "number": 91, - "url": "https://github.com/hapijs/joi/milestone/91", - "version": "10.2.0" - }, - { - "date": "2016-12-23T15:53:47Z", - "id": 2212247, - "issues": [ - { - "id": 197373388, - "labels": ["feature"], - "number": 1075, - "title": "Allow shorthand accessor string in array().unique()", - "url": "https://github.com/hapijs/joi/issues/1075" - }, - { - "id": 197202607, - "labels": ["feature"], - "number": 1073, - "title": "Provide value which duplicates an item in array().unique()", - "url": "https://github.com/hapijs/joi/issues/1073" - }, - { - "id": 197202210, - "labels": ["bug"], - "number": 1072, - "title": "Path of array().unique() is wrong", - "url": "https://github.com/hapijs/joi/issues/1072" - } - ], - "number": 90, - "url": "https://github.com/hapijs/joi/milestone/90", - "version": "10.1.0" - }, - { - "date": "2016-12-14T13:23:59Z", - "id": 2196448, - "issues": [ - { - "id": 195528654, - "labels": ["bug", "breaking changes"], - "number": 1065, - "title": "Fix boolean strings parsing", - "url": "https://github.com/hapijs/joi/issues/1065" - } - ], - "number": 89, - "url": "https://github.com/hapijs/joi/milestone/89", - "version": "10.0.6" - }, - { - "date": "2016-12-14T13:19:21Z", - "id": 2176153, - "issues": [], - "number": 88, - "url": "https://github.com/hapijs/joi/milestone/88", - "version": "10.0.4" - }, - { - "date": "2016-12-04T15:05:24Z", - "id": 2174139, - "issues": [ - { - "id": 193353555, - "labels": ["bug"], - "number": 1054, - "title": "adding validation for unnecessary arguments in primary types.", - "url": "https://github.com/hapijs/joi/pull/1054" - }, - { - "id": 183545881, - "labels": ["feature"], - "number": 1009, - "title": "Request: Warn when functions are passed unexpected arguments", - "url": "https://github.com/hapijs/joi/issues/1009" - } - ], - "number": 87, - "url": "https://github.com/hapijs/joi/milestone/87", - "version": "10.0.3" - }, - { - "date": "2016-12-01T23:17:22Z", - "id": 2170062, - "issues": [ - { - "id": 192951005, - "labels": ["bug"], - "number": 1052, - "title": "[Request] truthy/falsy case insensitive", - "url": "https://github.com/hapijs/joi/issues/1052" - } - ], - "number": 86, - "url": "https://github.com/hapijs/joi/milestone/86", - "version": "10.0.2" - }, - { - "date": "2016-11-18T18:54:10Z", - "id": 2144787, - "issues": [ - { - "id": 190359996, - "labels": ["feature"], - "number": 1039, - "title": "trim + empty confuses me", - "url": "https://github.com/hapijs/joi/issues/1039" - } - ], - "number": 85, - "url": "https://github.com/hapijs/joi/milestone/85", - "version": "10.0.1" - }, - { - "date": "2016-11-18T00:08:25Z", - "id": 2117170, - "issues": [ - { - "id": 190199095, - "labels": ["breaking changes", "release notes"], - "number": 1037, - "title": "10.0.0 Release Notes", - "url": "https://github.com/hapijs/joi/issues/1037" - }, - { - "id": 189167502, - "labels": ["feature"], - "number": 1035, - "title": "Implement String.regex \"invalidate\" configuration", - "url": "https://github.com/hapijs/joi/pull/1035" - }, - { - "id": 188949918, - "labels": ["feature"], - "number": 1034, - "title": "added support for string.uri relativeOnly option", - "url": "https://github.com/hapijs/joi/pull/1034" - }, - { - "id": 188773249, - "labels": ["non issue"], - "number": 1032, - "title": "Clean up any.valid code", - "url": "https://github.com/hapijs/joi/pull/1032" - }, - { - "id": 188031721, - "labels": ["bug"], - "number": 1030, - "title": "Conditional validation of object properties with different parent key", - "url": "https://github.com/hapijs/joi/issues/1030" - }, - { - "id": 187540191, - "labels": ["feature"], - "number": 1028, - "title": "Extend describe() for type", - "url": "https://github.com/hapijs/joi/pull/1028" - }, - { - "id": 187537578, - "labels": ["feature"], - "number": 1027, - "title": "Extending describe() to include renames in metadata", - "url": "https://github.com/hapijs/joi/pull/1027" - }, - { - "id": 187504946, - "labels": ["feature"], - "number": 1026, - "title": "object renames do not appear in describe api.", - "url": "https://github.com/hapijs/joi/issues/1026" - }, - { - "id": 186452424, - "labels": ["feature"], - "number": 1020, - "title": "Joi.string().invalid (not, disallow) doesn't support regex?", - "url": "https://github.com/hapijs/joi/issues/1020" - }, - { - "id": 186047148, - "labels": ["feature"], - "number": 1016, - "title": "Added a string.base64() method.", - "url": "https://github.com/hapijs/joi/pull/1016" - }, - { - "id": 185357624, - "labels": ["feature"], - "number": 1015, - "title": "Suggestion: Joi.string().uri({ allowRelativeOnly })", - "url": "https://github.com/hapijs/joi/issues/1015" - }, - { - "id": 184002318, - "labels": ["bug"], - "number": 1010, - "title": "Update Joi.validate options with removal of error", - "url": "https://github.com/hapijs/joi/pull/1010" - }, - { - "id": 181166957, - "labels": ["feature", "breaking changes"], - "number": 998, - "title": "Add support for truthy/falsy boolean values", - "url": "https://github.com/hapijs/joi/pull/998" - }, - { - "id": 177349171, - "labels": ["breaking changes", "dependency"], - "number": 985, - "title": "Move time rules to an extension", - "url": "https://github.com/hapijs/joi/issues/985" - } - ], - "number": 84, - "url": "https://github.com/hapijs/joi/milestone/84", - "version": "10.0.0" - }, - { - "date": "2016-10-18T08:41:16Z", - "id": 2076622, - "issues": [ - { - "id": 182905253, - "labels": ["bug", "feature"], - "number": 1008, - "title": "Bugfix/error annotate", - "url": "https://github.com/hapijs/joi/pull/1008" - } - ], - "number": 83, - "url": "https://github.com/hapijs/joi/milestone/83", - "version": "9.2.0" - }, - { - "date": "2016-10-12T17:48:01Z", - "id": 2065628, - "issues": [ - { - "id": 181847138, - "labels": ["bug"], - "number": 1002, - "title": "Ref will not be converted if it is inside array passed to default", - "url": "https://github.com/hapijs/joi/issues/1002" - } - ], - "number": 82, - "url": "https://github.com/hapijs/joi/milestone/82", - "version": "9.1.1" - }, - { - "date": "2016-09-29T17:30:15Z", - "id": 2038254, - "issues": [ - { - "id": 178191519, - "labels": ["feature"], - "number": 989, - "title": "Adds UUID Support", - "url": "https://github.com/hapijs/joi/pull/989" - } - ], - "number": 81, - "url": "https://github.com/hapijs/joi/milestone/81", - "version": "9.1.0" - }, - { - "date": "2016-07-24T18:35:02Z", - "id": 1901086, - "issues": [ - { - "id": 165671291, - "labels": ["bug", "support"], - "number": 947, - "title": ".without(), runs before .empty()", - "url": "https://github.com/hapijs/joi/issues/947" - } - ], - "number": 80, - "url": "https://github.com/hapijs/joi/milestone/80", - "version": "9.0.4" - }, - { - "date": "2016-07-24T18:24:02Z", - "id": 1900949, - "issues": [ - { - "id": 165371154, - "labels": ["bug"], - "number": 945, - "title": "required() does not catch specific empty values", - "url": "https://github.com/hapijs/joi/issues/945" - } - ], - "number": 79, - "url": "https://github.com/hapijs/joi/milestone/79", - "version": "9.0.3" - }, - { - "date": "2016-07-24T14:11:26Z", - "id": 1900886, - "issues": [ - { - "id": 167232702, - "labels": ["bug"], - "number": 960, - "title": "Coercion doesn't run early enough", - "url": "https://github.com/hapijs/joi/issues/960" - } - ], - "number": 78, - "url": "https://github.com/hapijs/joi/milestone/78", - "version": "9.0.2" - }, - { - "date": "2016-07-24T14:11:24Z", - "id": 1886228, - "issues": [ - { - "id": 165839191, - "labels": ["bug"], - "number": 949, - "title": "Returning credit card number when is valid, fixes #948", - "url": "https://github.com/hapijs/joi/pull/949" - }, - { - "id": 165838266, - "labels": ["bug"], - "number": 948, - "title": "Credit Card returning null when valid", - "url": "https://github.com/hapijs/joi/issues/948" - } - ], - "number": 77, - "url": "https://github.com/hapijs/joi/milestone/77", - "version": "9.0.1" - }, - { - "date": "2016-07-09T13:55:49Z", - "id": 1578120, - "issues": [ - { - "id": 162310369, - "labels": ["bug"], - "number": 934, - "title": "Fix missing top-level methods", - "url": "https://github.com/hapijs/joi/pull/934" - }, - { - "id": 162310345, - "labels": ["bug"], - "number": 933, - "title": "Extended Joi does not contain certain top-level functions", - "url": "https://github.com/hapijs/joi/issues/933" - }, - { - "id": 161040658, - "labels": ["bug"], - "number": 929, - "title": "labels don't always get included in error messages with Joi.extend()", - "url": "https://github.com/hapijs/joi/issues/929" - }, - { - "id": 161034945, - "labels": ["bug", "breaking changes"], - "number": 928, - "title": "Different error message for date().format()", - "url": "https://github.com/hapijs/joi/issues/928" - }, - { - "id": 161034924, - "labels": ["test"], - "number": 927, - "title": "Check error messages in tests", - "url": "https://github.com/hapijs/joi/issues/927" - }, - { - "id": 159792405, - "labels": ["breaking changes", "release notes"], - "number": 920, - "title": "9.0.0 Release Notes", - "url": "https://github.com/hapijs/joi/issues/920" - }, - { - "id": 159769849, - "labels": ["feature"], - "number": 918, - "title": "number.multiple() enhancement - Issue #916", - "url": "https://github.com/hapijs/joi/pull/918" - }, - { - "id": 159655264, - "labels": ["feature"], - "number": 916, - "title": "number.multiple() throws exception for non-integer and ref values", - "url": "https://github.com/hapijs/joi/issues/916" - }, - { - "id": 156303046, - "labels": ["feature"], - "number": 899, - "title": "Treat empty string as null", - "url": "https://github.com/hapijs/joi/issues/899" - }, - { - "id": 154900494, - "labels": ["feature"], - "number": 894, - "title": "Add Joi.object().schema()", - "url": "https://github.com/hapijs/joi/issues/894" - }, - { - "id": 154818106, - "labels": ["bug"], - "number": 893, - "title": "Fix item ref. Closes #892", - "url": "https://github.com/hapijs/joi/pull/893" - }, - { - "id": 154817507, - "labels": ["bug"], - "number": 892, - "title": "References in array items() do not work", - "url": "https://github.com/hapijs/joi/issues/892" - }, - { - "id": 153314196, - "labels": ["feature"], - "number": 880, - "title": "Add synchronous extensibility", - "url": "https://github.com/hapijs/joi/pull/880" - }, - { - "id": 151004056, - "labels": ["feature", "breaking changes"], - "number": 874, - "title": "any.label() significantly slows validation of large arrays", - "url": "https://github.com/hapijs/joi/issues/874" - }, - { - "id": 144451615, - "labels": ["feature"], - "number": 860, - "title": "Add the ability to specify a comparator for `array.unique()` for objects only", - "url": "https://github.com/hapijs/joi/pull/860" - }, - { - "id": 144392152, - "labels": ["feature"], - "number": 859, - "title": "custom compare for Joi.array().unique()", - "url": "https://github.com/hapijs/joi/issues/859" - }, - { - "id": 143346039, - "labels": ["breaking changes"], - "number": 856, - "title": "Allow 1 to be true and 0 to be false.", - "url": "https://github.com/hapijs/joi/pull/856" - }, - { - "id": 59351629, - "labels": ["feature", "support"], - "number": 577, - "title": "RFC: Joi plugins/extensions/custom functions", - "url": "https://github.com/hapijs/joi/issues/577" - } - ], - "number": 64, - "url": "https://github.com/hapijs/joi/milestone/64", - "version": "9.0.0" - }, - { - "date": "2016-06-12T14:51:03Z", - "id": 1822141, - "issues": [ - { - "id": 159775751, - "labels": ["bug"], - "number": 919, - "title": "joi.date().timestamp() failing validation for millisecond value", - "url": "https://github.com/hapijs/joi/issues/919" - } - ], - "number": 76, - "url": "https://github.com/hapijs/joi/milestone/76", - "version": "8.4.2" - }, - { - "date": "2016-06-12T14:50:51Z", - "id": 1806741, - "issues": [ - { - "id": 158179947, - "labels": ["bug"], - "number": 909, - "title": "Using empty in items on sparse array allows undefined elements.", - "url": "https://github.com/hapijs/joi/issues/909" - } - ], - "number": 75, - "url": "https://github.com/hapijs/joi/milestone/75", - "version": "8.4.1" - }, - { - "date": "2016-05-29T21:33:07Z", - "id": 1794773, - "issues": [ - { - "id": 153768890, - "labels": ["feature"], - "number": 884, - "title": "Synchronous schema.validate fails if called with options", - "url": "https://github.com/hapijs/joi/issues/884" - } - ], - "number": 74, - "url": "https://github.com/hapijs/joi/milestone/74", - "version": "8.4.0" - }, - { - "date": "2016-05-28T19:50:23Z", - "id": 1793767, - "issues": [ - { - "id": 157309796, - "labels": ["feature"], - "number": 904, - "title": "Add stripUnknownKeys option to Joi.validate", - "url": "https://github.com/hapijs/joi/issues/904" - }, - { - "id": 157028219, - "labels": ["feature"], - "number": 903, - "title": "stripUnknown: What is the expected behavior when validating nested data? (array)", - "url": "https://github.com/hapijs/joi/issues/903" - } - ], - "number": 73, - "url": "https://github.com/hapijs/joi/milestone/73", - "version": "8.3.0" - }, - { - "date": "2016-05-28T16:42:35Z", - "id": 1753277, - "issues": [ - { - "id": 135483456, - "labels": ["feature"], - "number": 833, - "title": "Proposal: string().truncate()", - "url": "https://github.com/hapijs/joi/issues/833" - }, - { - "id": 37544474, - "labels": ["feature"], - "number": 379, - "title": "Recursive schema (tree-like) validation", - "url": "https://github.com/hapijs/joi/issues/379" - } - ], - "number": 71, - "url": "https://github.com/hapijs/joi/milestone/71", - "version": "8.2.0" - }, - { - "date": "2016-05-24T18:28:59Z", - "id": 1785454, - "issues": [ - { - "id": 156558391, - "labels": ["bug"], - "number": 900, - "title": "When using reach, changing the label doesn't get applied, when an existing label is there", - "url": "https://github.com/hapijs/joi/issues/900" - } - ], - "number": 72, - "url": "https://github.com/hapijs/joi/milestone/72", - "version": "8.1.1" - }, - { - "date": "2016-05-07T20:43:13Z", - "id": 1631663, - "issues": [ - { - "id": 153614187, - "labels": ["feature"], - "number": 883, - "title": "Support error override per rule. Closes #882", - "url": "https://github.com/hapijs/joi/pull/883" - }, - { - "id": 153614165, - "labels": ["feature"], - "number": 882, - "title": "Support error override per rule", - "url": "https://github.com/hapijs/joi/issues/882" - } - ], - "number": 69, - "url": "https://github.com/hapijs/joi/milestone/69", - "version": "8.1.0" - }, - { - "date": "2016-03-18T19:28:38Z", - "id": 1654246, - "issues": [ - { - "id": 141942624, - "labels": ["bug"], - "number": 851, - "title": "Joi 8.x breaks describe().meta in alternatives", - "url": "https://github.com/hapijs/joi/issues/851" - } - ], - "number": 70, - "url": "https://github.com/hapijs/joi/milestone/70", - "version": "8.0.5" - }, - { - "date": "2016-03-01T12:12:48Z", - "id": 1614902, - "issues": [ - { - "id": 137500618, - "labels": ["bug"], - "number": 837, - "title": "Fix RegEx translation of IP6 BNF, where [] denotes an option", - "url": "https://github.com/hapijs/joi/pull/837" - } - ], - "number": 68, - "url": "https://github.com/hapijs/joi/milestone/68", - "version": "8.0.4" - }, - { - "date": "2016-03-01T12:12:47Z", - "id": 1604914, - "issues": [ - { - "id": 136220846, - "labels": ["bug"], - "number": 834, - "title": "TypeError: cannot delete property '0' of [object String]", - "url": "https://github.com/hapijs/joi/issues/834" - } - ], - "number": 67, - "url": "https://github.com/hapijs/joi/milestone/67", - "version": "8.0.3" - }, - { - "date": "2016-02-19T11:38:24Z", - "id": 1591981, - "issues": [ - { - "id": 134831649, - "labels": ["bug"], - "number": 830, - "title": "Return any.empty error for trimmed whitespace (fixes #827)", - "url": "https://github.com/hapijs/joi/pull/830" - }, - { - "id": 134735763, - "labels": ["bug"], - "number": 828, - "title": "Example for Array Schema Not Possible", - "url": "https://github.com/hapijs/joi/issues/828" - }, - { - "id": 134709834, - "labels": ["bug"], - "number": 827, - "title": "Unexpected Errors with Strings", - "url": "https://github.com/hapijs/joi/issues/827" - } - ], - "number": 66, - "url": "https://github.com/hapijs/joi/milestone/66", - "version": "8.0.2" - }, - { - "date": "2016-02-15T12:49:26Z", - "id": 1582932, - "issues": [ - { - "id": 133675371, - "labels": ["bug"], - "number": 824, - "title": "Description of assert modifying the original value", - "url": "https://github.com/hapijs/joi/issues/824" - } - ], - "number": 65, - "url": "https://github.com/hapijs/joi/milestone/65", - "version": "8.0.1" - }, - { - "date": "2016-02-14T21:08:12Z", - "id": 1000113, - "issues": [ - { - "id": 133579364, - "labels": ["breaking changes", "release notes"], - "number": 823, - "title": "8.0.0 Release Notes", - "url": "https://github.com/hapijs/joi/issues/823" - }, - { - "id": 132957481, - "labels": ["bug", "breaking changes"], - "number": 822, - "title": "Problem with multiple when and conditional forbidden field", - "url": "https://github.com/hapijs/joi/issues/822" - }, - { - "id": 115019489, - "labels": ["bug", "breaking changes"], - "number": 763, - "title": "Multiple alternatives with default", - "url": "https://github.com/hapijs/joi/issues/763" - }, - { - "id": 110386123, - "labels": ["feature"], - "number": 735, - "title": "Print string versions of NaN, Infinity and -Infinity - resolves #696", - "url": "https://github.com/hapijs/joi/pull/735" - }, - { - "id": 97079096, - "labels": ["bug"], - "number": 696, - "title": "NaN printed in cosole as null", - "url": "https://github.com/hapijs/joi/issues/696" - }, - { - "id": 60124142, - "labels": ["bug", "breaking changes"], - "number": 592, - "title": "Some refs not converted in .describe()", - "url": "https://github.com/hapijs/joi/issues/592" - } - ], - "number": 30, - "url": "https://github.com/hapijs/joi/milestone/30", - "version": "8.0.0" - }, - { - "date": "2016-02-11T15:36:41Z", - "id": 1572615, - "issues": [ - { - "id": 131237402, - "labels": ["bug", "feature"], - "number": 815, - "title": "uri() fails RFC3986 4.2 relative reference URIs", - "url": "https://github.com/hapijs/joi/issues/815" - }, - { - "id": 127818084, - "labels": ["feature", "support"], - "number": 807, - "title": "Question: Validate against sub-schema?", - "url": "https://github.com/hapijs/joi/issues/807" - }, - { - "id": 58991086, - "labels": ["support"], - "number": 565, - "title": "Combine uppercase with valid", - "url": "https://github.com/hapijs/joi/issues/565" - } - ], - "number": 63, - "url": "https://github.com/hapijs/joi/milestone/63", - "version": "7.3.0" - }, - { - "date": "2016-01-29T13:44:42Z", - "id": 1551036, - "issues": [ - { - "id": 129528912, - "labels": ["bug"], - "number": 812, - "title": "Improve error message", - "url": "https://github.com/hapijs/joi/issues/812" - } - ], - "number": 62, - "url": "https://github.com/hapijs/joi/milestone/62", - "version": "7.2.3" - }, - { - "date": "2016-01-19T14:52:40Z", - "id": 1515216, - "issues": [ - { - "id": 127442805, - "labels": ["bug"], - "number": 803, - "title": "Label declaration/Validation", - "url": "https://github.com/hapijs/joi/issues/803" - } - ], - "number": 61, - "url": "https://github.com/hapijs/joi/milestone/61", - "version": "7.2.2" - }, - { - "date": "2016-01-16T19:24:01Z", - "id": 1510423, - "issues": [ - { - "id": 127045674, - "labels": ["documentation"], - "number": 800, - "title": "Generate versioned API Reference link in README", - "url": "https://github.com/hapijs/joi/pull/800" - } - ], - "number": 60, - "url": "https://github.com/hapijs/joi/milestone/60", - "version": "7.2.1" - }, - { - "date": "2016-01-14T18:29:12Z", - "id": 1475693, - "issues": [ - { - "id": 124500461, - "labels": ["bug", "feature"], - "number": 791, - "title": "Date enhancements and support for Unix Timestamps", - "url": "https://github.com/hapijs/joi/pull/791" - }, - { - "id": 124276811, - "labels": ["bug"], - "number": 789, - "title": "Date() does not validate Unix timestamp with fractional seconds (decimals)", - "url": "https://github.com/hapijs/joi/issues/789" - }, - { - "id": 123972804, - "labels": ["feature"], - "number": 787, - "title": "Add a arity predicate for functions", - "url": "https://github.com/hapijs/joi/pull/787" - } - ], - "number": 59, - "url": "https://github.com/hapijs/joi/milestone/59", - "version": "7.2.0" - }, - { - "date": "2015-12-26T18:20:49Z", - "id": 1474788, - "issues": [ - { - "id": 119134283, - "labels": ["feature"], - "number": 779, - "title": "Throw custom Joi Errors", - "url": "https://github.com/hapijs/joi/issues/779" - } - ], - "number": 58, - "url": "https://github.com/hapijs/joi/milestone/58", - "version": "7.1.0" - }, - { - "date": "2015-11-26T12:15:45Z", - "id": 1429293, - "issues": [ - { - "id": 118848681, - "labels": ["bug"], - "number": 774, - "title": "Fix any.default() returns default object reference", - "url": "https://github.com/hapijs/joi/pull/774" - }, - { - "id": 118832624, - "labels": ["bug"], - "number": 773, - "title": "`Joi.validate()` returns default object reference instead of clone", - "url": "https://github.com/hapijs/joi/issues/773" - } - ], - "number": 56, - "url": "https://github.com/hapijs/joi/milestone/56", - "version": "7.0.1" - }, - { - "date": "2015-11-02T09:41:53Z", - "id": 1387648, - "issues": [ - { - "id": 114560357, - "labels": ["breaking changes", "release notes"], - "number": 759, - "title": "7.0.0 Release Notes", - "url": "https://github.com/hapijs/joi/issues/759" - }, - { - "id": 114495871, - "labels": ["bug", "breaking changes"], - "number": 756, - "title": "es6. Closes #754. Closes 755", - "url": "https://github.com/hapijs/joi/pull/756" - }, - { - "id": 114493973, - "labels": ["bug"], - "number": 755, - "title": "Don't annotate non-object values", - "url": "https://github.com/hapijs/joi/issues/755" - }, - { - "id": 114488994, - "labels": ["breaking changes"], - "number": 754, - "title": "ES6 style changes and node v4", - "url": "https://github.com/hapijs/joi/issues/754" - } - ], - "number": 55, - "url": "https://github.com/hapijs/joi/milestone/55", - "version": "7.0.0" - }, - { - "date": "2015-11-26T12:15:53Z", - "id": 1431031, - "issues": [ - { - "id": 119031624, - "labels": ["bug"], - "number": 777, - "title": "Fix any.default() returns default object reference", - "url": "https://github.com/hapijs/joi/pull/777" - } - ], - "number": 57, - "url": "https://github.com/hapijs/joi/milestone/57", - "version": "6.10.1" - }, - { - "date": "2015-11-01T22:02:46Z", - "id": 1337958, - "issues": [ - { - "id": 114123394, - "labels": ["bug", "feature"], - "number": 753, - "title": "Add default status 400 to error thrown by Joi.assert()", - "url": "https://github.com/hapijs/joi/issues/753" - }, - { - "id": 112898811, - "labels": ["bug"], - "number": 747, - "title": "removes leading \".\" from path at root object level", - "url": "https://github.com/hapijs/joi/pull/747" - }, - { - "id": 111104483, - "labels": ["feature"], - "number": 740, - "title": "Exception throw on undefined object key makes it difficult to track down issue", - "url": "https://github.com/hapijs/joi/issues/740" - } - ], - "number": 53, - "url": "https://github.com/hapijs/joi/milestone/53", - "version": "6.10.0" - }, - { - "date": "2015-10-15T20:55:01Z", - "id": 1357614, - "issues": [ - { - "id": 111685055, - "labels": ["bug"], - "number": 745, - "title": "Describe ordered arrays", - "url": "https://github.com/hapijs/joi/issues/745" - }, - { - "id": 110724465, - "labels": ["bug"], - "number": 737, - "title": "makes allow/valid/invalid not accept undefined #734", - "url": "https://github.com/hapijs/joi/pull/737" - }, - { - "id": 110254524, - "labels": ["bug"], - "number": 734, - "title": "Joi shouldn't allow Joi.any().valid(undefined).required()", - "url": "https://github.com/hapijs/joi/issues/734" - } - ], - "number": 54, - "url": "https://github.com/hapijs/joi/milestone/54", - "version": "6.9.1" - }, - { - "date": "2015-10-05T11:14:43Z", - "id": 1335297, - "issues": [ - { - "id": 95901619, - "labels": ["feature"], - "number": 688, - "title": "Toggable ordered flag for array to match items against input in order", - "url": "https://github.com/hapijs/joi/pull/688" - }, - { - "id": 81505276, - "labels": ["feature"], - "number": 659, - "title": "Allow treating arrays as objects", - "url": "https://github.com/hapijs/joi/issues/659" - } - ], - "number": 51, - "url": "https://github.com/hapijs/joi/milestone/51", - "version": "6.9.0" - }, - { - "date": "2015-10-02T19:20:54Z", - "id": 1335332, - "issues": [ - { - "id": 109545996, - "labels": ["bug"], - "number": 730, - "title": "Fix function properties validation. Closes #729", - "url": "https://github.com/hapijs/joi/pull/730" - }, - { - "id": 109545904, - "labels": ["bug"], - "number": 729, - "title": "Function keys validation converts function to object", - "url": "https://github.com/hapijs/joi/issues/729" - } - ], - "number": 52, - "url": "https://github.com/hapijs/joi/milestone/52", - "version": "6.8.1" - }, - { - "date": "2015-10-02T17:43:03Z", - "id": 1302961, - "issues": [ - { - "id": 109531683, - "labels": ["feature"], - "number": 728, - "title": "Allow functions to act as objects. Closes #727", - "url": "https://github.com/hapijs/joi/pull/728" - }, - { - "id": 109531571, - "labels": ["feature"], - "number": 727, - "title": "Allow function types to behave as object (e.g. have keys)", - "url": "https://github.com/hapijs/joi/issues/727" - } - ], - "number": 49, - "url": "https://github.com/hapijs/joi/milestone/49", - "version": "6.8.0" - }, - { - "date": "2015-10-02T17:19:05Z", - "id": 1309369, - "issues": [ - { - "id": 106563973, - "labels": ["bug"], - "number": 721, - "title": "The index of an incorrect array entry is returned instead of the field name", - "url": "https://github.com/hapijs/joi/issues/721" - } - ], - "number": 50, - "url": "https://github.com/hapijs/joi/milestone/50", - "version": "6.7.1" - }, - { - "date": "2015-09-13T11:39:48Z", - "id": 1219129, - "issues": [ - { - "id": 101779037, - "labels": ["bug", "support"], - "number": 710, - "title": "Extending a schema", - "url": "https://github.com/hapijs/joi/issues/710" - }, - { - "id": 101446681, - "labels": ["feature"], - "number": 708, - "title": "add attempt function", - "url": "https://github.com/hapijs/joi/pull/708" - }, - { - "id": 99174818, - "labels": ["bug"], - "number": 703, - "title": "No dependency validation when object stripUnknown set to true", - "url": "https://github.com/hapijs/joi/issues/703" - }, - { - "id": 98798636, - "labels": ["feature"], - "number": 702, - "title": "add hapi to package.json keywords so joi is searchable", - "url": "https://github.com/hapijs/joi/pull/702" - } - ], - "number": 47, - "url": "https://github.com/hapijs/joi/milestone/47", - "version": "6.7.0" - }, - { - "date": "2015-07-22T22:32:08Z", - "id": 1221166, - "issues": [ - { - "id": 96650125, - "labels": ["bug"], - "number": 693, - "title": "Use hasOwnProperty from native object", - "url": "https://github.com/hapijs/joi/issues/693" - } - ], - "number": 48, - "url": "https://github.com/hapijs/joi/milestone/48", - "version": "6.6.1" - }, - { - "date": "2015-07-21T21:24:04Z", - "id": 1202685, - "issues": [ - { - "id": 96159994, - "labels": ["bug"], - "number": 690, - "title": "removes trailing \".\" from or path", - "url": "https://github.com/hapijs/joi/pull/690" - }, - { - "id": 94599661, - "labels": ["bug"], - "number": 684, - "title": "fix unknown nested key path", - "url": "https://github.com/hapijs/joi/pull/684" - }, - { - "id": 94359335, - "labels": ["feature"], - "number": 683, - "title": "Add the \"noDefaults\" option", - "url": "https://github.com/hapijs/joi/pull/683" - }, - { - "id": 94300857, - "labels": ["feature"], - "number": 682, - "title": "Validate without applying default values", - "url": "https://github.com/hapijs/joi/issues/682" - } - ], - "number": 46, - "url": "https://github.com/hapijs/joi/milestone/46", - "version": "6.6.0" - }, - { - "date": "2015-06-24T10:14:48Z", - "id": 1151470, - "issues": [ - { - "id": 86679973, - "labels": ["feature"], - "number": 668, - "title": "allow passing an error object as message to assert", - "url": "https://github.com/hapijs/joi/pull/668" - }, - { - "id": 80666468, - "labels": ["bug"], - "number": 656, - "title": "Updated regexp for more robust ISO 8601 validation", - "url": "https://github.com/hapijs/joi/pull/656" - }, - { - "id": 77724506, - "labels": ["feature"], - "number": 649, - "title": "Implementation of white space normalisation.", - "url": "https://github.com/hapijs/joi/pull/649" - }, - { - "id": 77719915, - "labels": ["feature"], - "number": 648, - "title": "Allow normalisation of white space", - "url": "https://github.com/hapijs/joi/issues/648" - }, - { - "id": 59955566, - "labels": ["feature"], - "number": 586, - "title": "[request] string().replace(pattern)", - "url": "https://github.com/hapijs/joi/issues/586" - } - ], - "number": 45, - "url": "https://github.com/hapijs/joi/milestone/45", - "version": "6.5.0" - }, - { - "date": "2015-05-27T21:06:57Z", - "id": 1136856, - "issues": [ - { - "id": 81620894, - "labels": ["bug"], - "number": 660, - "title": "stripUnkown on arrays removes valid objects when multiple items are defined", - "url": "https://github.com/hapijs/joi/issues/660" - } - ], - "number": 44, - "url": "https://github.com/hapijs/joi/milestone/44", - "version": "6.4.3" - }, - { - "date": "2015-05-23T14:29:30Z", - "id": 1126930, - "issues": [ - { - "id": 79855155, - "labels": ["bug"], - "number": 654, - "title": "Fix allowing context refs on some string, number and date methods", - "url": "https://github.com/hapijs/joi/pull/654" - } - ], - "number": 43, - "url": "https://github.com/hapijs/joi/milestone/43", - "version": "6.4.2" - }, - { - "date": "2015-05-23T14:19:39Z", - "id": 1084005, - "issues": [ - { - "id": 68675091, - "labels": ["support"], - "number": 629, - "title": "help with `.or()`", - "url": "https://github.com/hapijs/joi/issues/629" - } - ], - "number": 42, - "url": "https://github.com/hapijs/joi/milestone/42", - "version": "6.4.0" - }, - { - "date": "2015-04-23T21:40:58Z", - "id": 1081294, - "issues": [ - { - "id": 70241860, - "labels": ["bug", "feature"], - "number": 632, - "title": "Nested whens don't work", - "url": "https://github.com/hapijs/joi/issues/632" - } - ], - "number": 41, - "url": "https://github.com/hapijs/joi/milestone/41", - "version": "6.3.0" - }, - { - "date": "2015-04-23T21:36:03Z", - "id": 1071390, - "issues": [ - { - "id": 41548193, - "labels": ["feature"], - "number": 413, - "title": "Create default [highly nested] object easily?", - "url": "https://github.com/hapijs/joi/issues/413" - } - ], - "number": 40, - "url": "https://github.com/hapijs/joi/milestone/40", - "version": "6.2.0" - }, - { - "date": "2015-04-13T16:40:03Z", - "id": 1065325, - "issues": [ - { - "id": 68126368, - "labels": ["bug"], - "number": 628, - "title": "Alternatives throw typeError when \"is: null\" is used", - "url": "https://github.com/hapijs/joi/issues/628" - } - ], - "number": 39, - "url": "https://github.com/hapijs/joi/milestone/39", - "version": "6.1.2" - }, - { - "date": "2015-04-09T23:11:31Z", - "id": 1061146, - "issues": [ - { - "id": 67434007, - "labels": ["bug"], - "number": 627, - "title": "Property is always required even when my When() condition isn't met.", - "url": "https://github.com/hapijs/joi/issues/627" - } - ], - "number": 38, - "url": "https://github.com/hapijs/joi/milestone/38", - "version": "6.1.1" - }, - { - "date": "2015-04-02T21:51:22Z", - "id": 1014225, - "issues": [ - { - "id": 64686803, - "labels": ["feature"], - "number": 619, - "title": "Add IP Address Validation and Separate IP and URI Logic to Files", - "url": "https://github.com/hapijs/joi/pull/619" - }, - { - "id": 64305243, - "labels": ["feature"], - "number": 616, - "title": "Add ignoreUndefined flag for rename()", - "url": "https://github.com/hapijs/joi/pull/616" - }, - { - "id": 64221467, - "labels": ["feature"], - "number": 614, - "title": "Error when .rename() from undefined", - "url": "https://github.com/hapijs/joi/issues/614" - }, - { - "id": 62754880, - "labels": ["bug"], - "number": 611, - "title": "Number compare functions allow decimal numbers", - "url": "https://github.com/hapijs/joi/pull/611" - }, - { - "id": 62552338, - "labels": ["bug"], - "number": 610, - "title": "Support for decimal numbers for min, max, less, greater number methods", - "url": "https://github.com/hapijs/joi/pull/610" - }, - { - "id": 62545962, - "labels": ["bug"], - "number": 609, - "title": "number min/max/greater/less do not allow decimal values", - "url": "https://github.com/hapijs/joi/issues/609" - }, - { - "id": 60448484, - "labels": ["feature"], - "number": 597, - "title": "Add reference support for String.min/max/length", - "url": "https://github.com/hapijs/joi/pull/597" - }, - { - "id": 60446363, - "labels": ["feature"], - "number": 596, - "title": "Add reference support for Number.min/max/greater/less", - "url": "https://github.com/hapijs/joi/pull/596" - }, - { - "id": 59920223, - "labels": ["bug"], - "number": 583, - "title": "do ref-able operations support referring to a list?", - "url": "https://github.com/hapijs/joi/issues/583" - }, - { - "id": 58622981, - "labels": ["feature"], - "number": 560, - "title": "References for Number comparisons?", - "url": "https://github.com/hapijs/joi/issues/560" - }, - { - "id": 37710898, - "labels": ["feature"], - "number": 380, - "title": "Comparison between fields", - "url": "https://github.com/hapijs/joi/issues/380" - } - ], - "number": 34, - "url": "https://github.com/hapijs/joi/milestone/34", - "version": "6.1.0" - }, - { - "date": "2015-03-11T18:26:39Z", - "id": 1016988, - "issues": [ - { - "id": 59569274, - "labels": ["bug"], - "number": 580, - "title": "Annotate fails on circular objects", - "url": "https://github.com/hapijs/joi/issues/580" - } - ], - "number": 37, - "url": "https://github.com/hapijs/joi/milestone/37", - "version": "6.0.7" - }, - { - "date": "2015-03-11T11:22:39Z", - "id": 1016232, - "issues": [ - { - "id": 60641754, - "labels": ["bug"], - "number": 602, - "title": "Validate multiple options with presence key in it", - "url": "https://github.com/hapijs/joi/pull/602" - }, - { - "id": 60637536, - "labels": ["bug"], - "number": 601, - "title": "Error: stripUnknown should be one of required, optional, forbidden, ignore", - "url": "https://github.com/hapijs/joi/issues/601" - } - ], - "number": 36, - "url": "https://github.com/hapijs/joi/milestone/36", - "version": "6.0.6" - }, - { - "date": "2015-03-10T23:50:02Z", - "id": 1015698, - "issues": [ - { - "id": 60587682, - "labels": ["bug"], - "number": 600, - "title": "Fix regression on unsafe string escaping in language", - "url": "https://github.com/hapijs/joi/issues/600" - } - ], - "number": 35, - "url": "https://github.com/hapijs/joi/milestone/35", - "version": "6.0.5" - }, - { - "date": "2015-03-08T14:35:20Z", - "id": 1011168, - "issues": [ - { - "id": 60235130, - "labels": ["bug"], - "number": 593, - "title": ".rename() does not work when new value is undefined", - "url": "https://github.com/hapijs/joi/issues/593" - } - ], - "number": 33, - "url": "https://github.com/hapijs/joi/milestone/33", - "version": "6.0.4" - }, - { - "date": "2015-03-05T21:27:49Z", - "id": 1008241, - "issues": [ - { - "id": 59993946, - "labels": ["bug"], - "number": 589, - "title": "Joi.array().items(...) error message changes", - "url": "https://github.com/hapijs/joi/issues/589" - } - ], - "number": 32, - "url": "https://github.com/hapijs/joi/milestone/32", - "version": "6.0.3" - }, - { - "date": "2015-03-05T13:29:32Z", - "id": 1007506, - "issues": [ - { - "id": 59949924, - "labels": ["bug"], - "number": 585, - "title": "No conversion is done inside Joi.array().items", - "url": "https://github.com/hapijs/joi/issues/585" - } - ], - "number": 31, - "url": "https://github.com/hapijs/joi/milestone/31", - "version": "6.0.1" - }, - { - "date": "2015-03-02T22:30:19Z", - "id": 946814, - "issues": [ - { - "id": 59562209, - "labels": ["breaking changes", "release notes"], - "number": 579, - "title": "6.0.0 Release Notes", - "url": "https://github.com/hapijs/joi/issues/579" - }, - { - "id": 59353596, - "labels": ["feature", "breaking changes"], - "number": 578, - "title": "respect stripUnknown in arrays", - "url": "https://github.com/hapijs/joi/pull/578" - }, - { - "id": 59157357, - "labels": ["feature"], - "number": 572, - "title": "add any.strip for objects and arrays", - "url": "https://github.com/hapijs/joi/pull/572" - }, - { - "id": 59063423, - "labels": ["bug"], - "number": 569, - "title": "Lost key after validation on assert", - "url": "https://github.com/hapijs/joi/issues/569" - }, - { - "id": 59055670, - "labels": ["bug"], - "number": 567, - "title": "Object with 'or', keys contains an array with a 'null' element", - "url": "https://github.com/hapijs/joi/issues/567" - }, - { - "id": 58831912, - "labels": ["bug", "breaking changes"], - "number": 561, - "title": "how to concat array of objects inside an object property", - "url": "https://github.com/hapijs/joi/issues/561" - }, - { - "id": 58426717, - "labels": ["feature", "breaking changes"], - "number": 559, - "title": "deprecate array.includes and array.excludes, use array.items and allow required and forbidden within", - "url": "https://github.com/hapijs/joi/pull/559" - }, - { - "id": 58343853, - "labels": ["bug", "breaking changes"], - "number": 557, - "title": "Incomplete validation message", - "url": "https://github.com/hapijs/joi/issues/557" - }, - { - "id": 58115671, - "labels": ["bug"], - "number": 555, - "title": "add some additional guards and tests for #363", - "url": "https://github.com/hapijs/joi/pull/555" - }, - { - "id": 57976093, - "labels": ["bug", "breaking changes"], - "number": 553, - "title": "Does array include allow nested object properties ", - "url": "https://github.com/hapijs/joi/issues/553" - }, - { - "id": 57045087, - "labels": ["feature"], - "number": 547, - "title": "string hex characters only", - "url": "https://github.com/hapijs/joi/issues/547" - }, - { - "id": 56911466, - "labels": ["feature"], - "number": 546, - "title": "Really custom messages are impossible", - "url": "https://github.com/hapijs/joi/issues/546" - }, - { - "id": 56725072, - "labels": ["feature"], - "number": 545, - "title": "allow passing a method to .default(), for #363", - "url": "https://github.com/hapijs/joi/pull/545" - }, - { - "id": 55884147, - "labels": ["feature"], - "number": 538, - "title": "added number.multiple()", - "url": "https://github.com/hapijs/joi/pull/538" - }, - { - "id": 55356251, - "labels": ["feature"], - "number": 536, - "title": "Consider renaming 'valid' to 'enum' or an alias", - "url": "https://github.com/hapijs/joi/issues/536" - }, - { - "id": 54921275, - "labels": ["bug", "breaking changes"], - "number": 534, - "title": "Bad behavior of Joi.object().concat()", - "url": "https://github.com/hapijs/joi/issues/534" - }, - { - "id": 54743101, - "labels": ["feature"], - "number": 532, - "title": "multipleOf method for Number?", - "url": "https://github.com/hapijs/joi/issues/532" - }, - { - "id": 51468467, - "labels": ["bug"], - "number": 511, - "title": "throw when invalid options are provided", - "url": "https://github.com/hapijs/joi/issues/511" - }, - { - "id": 50068392, - "labels": ["bug", "breaking changes"], - "number": 495, - "title": "joi.array().includes path and errors mismatch", - "url": "https://github.com/hapijs/joi/issues/495" - }, - { - "id": 49324331, - "labels": ["feature"], - "number": 488, - "title": "Allow options to be passed to string.email().", - "url": "https://github.com/hapijs/joi/pull/488" - }, - { - "id": 48609370, - "labels": ["feature", "breaking changes"], - "number": 484, - "title": "Helpful regexp message", - "url": "https://github.com/hapijs/joi/pull/484" - }, - { - "id": 46061239, - "labels": ["feature"], - "number": 457, - "title": "Add URI Validation", - "url": "https://github.com/hapijs/joi/pull/457" - }, - { - "id": 35643200, - "labels": ["feature"], - "number": 363, - "title": "support factory-function in .default() ?", - "url": "https://github.com/hapijs/joi/issues/363" - } - ], - "number": 29, - "url": "https://github.com/hapijs/joi/milestone/29", - "version": "6.0.0" - }, - { - "date": "2015-01-02T11:41:48Z", - "id": 884563, - "issues": [ - { - "id": 53235102, - "labels": ["bug"], - "number": 525, - "title": "Strange behaviour with date + raw", - "url": "https://github.com/hapijs/joi/issues/525" - }, - { - "id": 51725830, - "labels": ["feature"], - "number": 513, - "title": "Make alternatives.describe more consistent", - "url": "https://github.com/hapijs/joi/pull/513" - }, - { - "id": 51202722, - "labels": ["feature"], - "number": 510, - "title": "Add new requiredKeys option specifically for object keys", - "url": "https://github.com/hapijs/joi/issues/510" - }, - { - "id": 51098888, - "labels": ["feature"], - "number": 509, - "title": "Option to validate a date format but not convert to a date object", - "url": "https://github.com/hapijs/joi/issues/509" - }, - { - "id": 48085687, - "labels": ["feature"], - "number": 477, - "title": "Support for references in `date.min()` and `date.max()`?", - "url": "https://github.com/hapijs/joi/issues/477" - }, - { - "id": 40900534, - "labels": ["feature"], - "number": 404, - "title": "Possible referencing date field to other date field?", - "url": "https://github.com/hapijs/joi/issues/404" - } - ], - "number": 24, - "url": "https://github.com/hapijs/joi/milestone/24", - "version": "5.1.0" - }, - { - "date": "2014-12-02T09:52:53Z", - "id": 885815, - "issues": [ - { - "id": 50510189, - "labels": ["bug"], - "number": 505, - "title": "Convert date regex to date before comparison. Closes #503.", - "url": "https://github.com/hapijs/joi/pull/505" - }, - { - "id": 50508171, - "labels": ["bug"], - "number": 503, - "title": "Joi.date().iso() throws error when required() is used.", - "url": "https://github.com/hapijs/joi/issues/503" - } - ], - "number": 26, - "url": "https://github.com/hapijs/joi/milestone/26", - "version": "5.0.2" - }, - { - "date": "2014-12-01T07:21:58Z", - "id": 885024, - "issues": [ - { - "id": 50468910, - "labels": ["bug"], - "number": 502, - "title": "Joi.array() modifies original array", - "url": "https://github.com/hapijs/joi/issues/502" - } - ], - "number": 25, - "url": "https://github.com/hapijs/joi/milestone/25", - "version": "5.0.1" - }, - { - "date": "2014-11-30T00:35:52Z", - "id": 869763, - "issues": [ - { - "id": 50442181, - "labels": ["breaking changes", "release notes"], - "number": 501, - "title": "5.0.0 Release Notes", - "url": "https://github.com/hapijs/joi/issues/501" - }, - { - "id": 50117171, - "labels": ["feature"], - "number": 498, - "title": "array().single()", - "url": "https://github.com/hapijs/joi/issues/498" - }, - { - "id": 50109820, - "labels": ["bug", "breaking changes"], - "number": 497, - "title": "array.unique doesn't validate duplicate dates", - "url": "https://github.com/hapijs/joi/issues/497" - }, - { - "id": 49887168, - "labels": ["feature", "breaking changes"], - "number": 494, - "title": "Joi.number allows Infinity", - "url": "https://github.com/hapijs/joi/issues/494" - }, - { - "id": 49400426, - "labels": ["bug"], - "number": 489, - "title": "add missing semicolon", - "url": "https://github.com/hapijs/joi/pull/489" - }, - { - "id": 48965142, - "labels": ["bug", "breaking changes"], - "number": 486, - "title": "array().includes() should not allow undefined", - "url": "https://github.com/hapijs/joi/issues/486" - }, - { - "id": 48655093, - "labels": ["feature", "breaking changes"], - "number": 485, - "title": "Round number.precision if options.convert", - "url": "https://github.com/hapijs/joi/issues/485" - }, - { - "id": 47025509, - "labels": ["feature"], - "number": 462, - "title": "Return context with errors.", - "url": "https://github.com/hapijs/joi/issues/462" - }, - { - "id": 37710968, - "labels": ["feature"], - "number": 381, - "title": "Transformation support", - "url": "https://github.com/hapijs/joi/issues/381" - } - ], - "number": 23, - "url": "https://github.com/hapijs/joi/milestone/23", - "version": "5.0.0" - }, - { - "date": "2014-11-17T20:02:16Z", - "id": 858087, - "issues": [ - { - "id": 48965208, - "labels": ["test"], - "number": 487, - "title": "Code assertions requires () for exist tests", - "url": "https://github.com/hapijs/joi/issues/487" - }, - { - "id": 48339909, - "labels": ["feature"], - "number": 481, - "title": "Validate object constructor.", - "url": "https://github.com/hapijs/joi/pull/481" - }, - { - "id": 41162565, - "labels": ["feature"], - "number": 408, - "title": "Check if value is a RegEx", - "url": "https://github.com/hapijs/joi/issues/408" - } - ], - "number": 21, - "url": "https://github.com/hapijs/joi/milestone/21", - "version": "4.9.0" - }, - { - "date": "2014-11-11T11:55:26Z", - "id": 859020, - "issues": [ - { - "id": 48180973, - "labels": ["bug"], - "number": 480, - "title": "Date \"now\" refers to date when schema was compiled", - "url": "https://github.com/hapijs/joi/issues/480" - } - ], - "number": 22, - "url": "https://github.com/hapijs/joi/milestone/22", - "version": "4.8.1" - }, - { - "date": "2014-11-07T23:14:12Z", - "id": 796568, - "issues": [ - { - "id": 48116762, - "labels": ["bug"], - "number": 478, - "title": "Retain object reference when no rules specified", - "url": "https://github.com/hapijs/joi/pull/478" - }, - { - "id": 48079308, - "labels": ["dependency"], - "number": 476, - "title": "Upgrade Lab", - "url": "https://github.com/hapijs/joi/issues/476" - }, - { - "id": 47660458, - "labels": ["bug"], - "number": 470, - "title": "Address internationalization issues.", - "url": "https://github.com/hapijs/joi/pull/470" - }, - { - "id": 47411034, - "labels": ["bug"], - "number": 469, - "title": "change implementation of creditcard to use string", - "url": "https://github.com/hapijs/joi/pull/469" - }, - { - "id": 47212674, - "labels": ["feature"], - "number": 466, - "title": "Named string regex patterns.", - "url": "https://github.com/hapijs/joi/pull/466" - }, - { - "id": 47210262, - "labels": ["feature"], - "number": 465, - "title": "implements credit card validation", - "url": "https://github.com/hapijs/joi/pull/465" - }, - { - "id": 47185404, - "labels": ["feature"], - "number": 464, - "title": "implements nand", - "url": "https://github.com/hapijs/joi/pull/464" - }, - { - "id": 46868208, - "labels": ["feature"], - "number": 461, - "title": "Add greater() and less() to number type. Closes #411", - "url": "https://github.com/hapijs/joi/pull/461" - }, - { - "id": 45987323, - "labels": ["bug"], - "number": 456, - "title": "correction for Describe with a \"0\" argument ", - "url": "https://github.com/hapijs/joi/pull/456" - }, - { - "id": 45848419, - "labels": ["bug"], - "number": 454, - "title": "Describe with a \"0\" argument ", - "url": "https://github.com/hapijs/joi/issues/454" - }, - { - "id": 44743652, - "labels": ["feature"], - "number": 449, - "title": "Enable to pass \"now\" in date.min and date.max", - "url": "https://github.com/hapijs/joi/pull/449" - }, - { - "id": 43928096, - "labels": ["feature"], - "number": 446, - "title": "Use Object.create in Any.clone to improve IE9 support", - "url": "https://github.com/hapijs/joi/pull/446" - }, - { - "id": 43328342, - "labels": ["feature"], - "number": 440, - "title": "Added any.label method", - "url": "https://github.com/hapijs/joi/pull/440" - }, - { - "id": 43290155, - "labels": ["feature"], - "number": 435, - "title": "Add format and iso to date type", - "url": "https://github.com/hapijs/joi/pull/435" - }, - { - "id": 42151721, - "labels": ["feature"], - "number": 422, - "title": "Credit card validation", - "url": "https://github.com/hapijs/joi/issues/422" - }, - { - "id": 41447074, - "labels": ["feature"], - "number": 411, - "title": "Number min/max exclusive or closed ranges respectively?", - "url": "https://github.com/hapijs/joi/issues/411" - }, - { - "id": 41161249, - "labels": ["feature"], - "number": 407, - "title": "ensure date does not occur in the past", - "url": "https://github.com/hapijs/joi/issues/407" - }, - { - "id": 40022307, - "labels": ["bug", "test"], - "number": 396, - "title": "Negative-Integer-Strings are not properly converted to Date instances", - "url": "https://github.com/hapijs/joi/pull/396" - }, - { - "id": 35639181, - "labels": ["feature"], - "number": 362, - "title": "Support NAND", - "url": "https://github.com/hapijs/joi/issues/362" - } - ], - "number": 20, - "url": "https://github.com/hapijs/joi/milestone/20", - "version": "4.8.0" - }, - { - "date": "2014-09-20T07:26:58Z", - "id": 740876, - "issues": [ - { - "id": 43303669, - "labels": ["feature"], - "number": 437, - "title": "Support optional message prefix in assert()", - "url": "https://github.com/hapijs/joi/issues/437" - }, - { - "id": 43276958, - "labels": ["bug"], - "number": 434, - "title": "Fix typo.", - "url": "https://github.com/hapijs/joi/pull/434" - }, - { - "id": 43272650, - "labels": ["feature"], - "number": 433, - "title": "Override default presence", - "url": "https://github.com/hapijs/joi/pull/433" - }, - { - "id": 43271348, - "labels": ["feature"], - "number": 432, - "title": "Set different default presence mode (required, forbidden)", - "url": "https://github.com/hapijs/joi/issues/432" - }, - { - "id": 42819150, - "labels": ["feature"], - "number": 427, - "title": "Added ability to validate the number of decimal places", - "url": "https://github.com/hapijs/joi/pull/427" - }, - { - "id": 40812206, - "labels": ["feature"], - "number": 403, - "title": "Add duplicates validation to array", - "url": "https://github.com/hapijs/joi/pull/403" - }, - { - "id": 40208149, - "labels": ["dependency"], - "number": 398, - "title": "Upgrade lab 4.0", - "url": "https://github.com/hapijs/joi/issues/398" - }, - { - "id": 40177165, - "labels": ["bug"], - "number": 397, - "title": "Added check for global flag in pattern.", - "url": "https://github.com/hapijs/joi/pull/397" - }, - { - "id": 39235433, - "labels": ["feature"], - "number": 389, - "title": "Default Assert Message", - "url": "https://github.com/hapijs/joi/pull/389" - }, - { - "id": 38582785, - "labels": ["bug"], - "number": 385, - "title": "Path for array includes to contain key", - "url": "https://github.com/hapijs/joi/pull/385" - }, - { - "id": 37725440, - "labels": ["feature"], - "number": 383, - "title": "Describe object.pattern", - "url": "https://github.com/hapijs/joi/issues/383" - } - ], - "number": 19, - "url": "https://github.com/hapijs/joi/milestone/19", - "version": "4.7.0" - }, - { - "date": "2014-08-03T07:10:20Z", - "id": 690963, - "issues": [ - { - "id": 37287834, - "labels": ["non issue"], - "number": 378, - "title": "Removed unused sys import.", - "url": "https://github.com/hapijs/joi/pull/378" - } - ], - "number": 18, - "url": "https://github.com/hapijs/joi/milestone/18", - "version": "4.6.2" - }, - { - "date": "2014-06-14T05:04:18Z", - "id": 684659, - "issues": [ - { - "id": 35703485, - "labels": ["bug"], - "number": 366, - "title": "Bug Hunt: empty object() + pattern() + unknown(false) fails to error", - "url": "https://github.com/hapijs/joi/pull/366" - }, - { - "id": 35094670, - "labels": ["bug"], - "number": 359, - "title": "Allow empty string after trim", - "url": "https://github.com/hapijs/joi/pull/359" - }, - { - "id": 35034580, - "labels": ["bug"], - "number": 357, - "title": "Cast milisecond strings to a date object", - "url": "https://github.com/hapijs/joi/pull/357" - }, - { - "id": 34446227, - "labels": ["bug"], - "number": 355, - "title": "Don't rename when there is nothing to rename.", - "url": "https://github.com/hapijs/joi/pull/355" - }, - { - "id": 32190219, - "labels": ["feature"], - "number": 299, - "title": "Sanitizing blanks", - "url": "https://github.com/hapijs/joi/issues/299" - } - ], - "number": 17, - "url": "https://github.com/hapijs/joi/milestone/17", - "version": "4.6.1" - }, - { - "date": "2014-06-13T23:07:01Z", - "id": 671135, - "issues": [ - { - "id": 35245349, - "labels": ["feature"], - "number": 360, - "title": "Joi.assert()", - "url": "https://github.com/hapijs/joi/issues/360" - }, - { - "id": 34400342, - "labels": ["feature"], - "number": 354, - "title": "isemail 1.0", - "url": "https://github.com/hapijs/joi/issues/354" - } - ], - "number": 16, - "url": "https://github.com/hapijs/joi/milestone/16", - "version": "4.6.0" - }, - { - "date": "2014-05-26T18:23:45Z", - "id": 669484, - "issues": [ - { - "id": 34321578, - "labels": ["feature"], - "number": 351, - "title": "Add Hoek isImmutable flag", - "url": "https://github.com/hapijs/joi/issues/351" - } - ], - "number": 15, - "url": "https://github.com/hapijs/joi/milestone/15", - "version": "4.5.0" - }, - { - "date": "2014-05-24T19:16:41Z", - "id": 668354, - "issues": [ - { - "id": 34240516, - "labels": ["feature"], - "number": 349, - "title": "Support {{!key}} notation to securely encode unsafe values", - "url": "https://github.com/hapijs/joi/issues/349" - }, - { - "id": 33926197, - "labels": ["feature"], - "number": 335, - "title": "Recognize Joi errors", - "url": "https://github.com/hapijs/joi/issues/335" - } - ], - "number": 14, - "url": "https://github.com/hapijs/joi/milestone/14", - "version": "4.4.0" - }, - { - "date": "2014-05-22T17:32:57Z", - "id": 663576, - "issues": [ - { - "id": 34037962, - "labels": ["bug", "breaking changes"], - "number": 341, - "title": "Array includes fails if called multiple times", - "url": "https://github.com/hapijs/joi/issues/341" - }, - { - "id": 34032281, - "labels": ["feature", "breaking changes"], - "number": 340, - "title": "Replace internal implementation of required/optional/forbidden", - "url": "https://github.com/hapijs/joi/issues/340" - }, - { - "id": 34025241, - "labels": ["bug"], - "number": 339, - "title": "when() option 'is' cannot be falsey", - "url": "https://github.com/hapijs/joi/issues/339" - }, - { - "id": 33961321, - "labels": ["bug"], - "number": 337, - "title": "alternatives().when() behaves inconsistently with any().when()", - "url": "https://github.com/hapijs/joi/issues/337" - }, - { - "id": 33959104, - "labels": ["bug"], - "number": 336, - "title": "concat() fails to remove valid/invalid values", - "url": "https://github.com/hapijs/joi/issues/336" - }, - { - "id": 33863888, - "labels": ["bug"], - "number": 334, - "title": "Bug hunt: Joi.any().when is not evaluated it its value is empty even if the when condition is fulfilled.", - "url": "https://github.com/hapijs/joi/pull/334" - }, - { - "id": 33842766, - "labels": ["bug"], - "number": 332, - "title": "Joi.any().when is not evaluated if empty", - "url": "https://github.com/hapijs/joi/issues/332" - }, - { - "id": 33738647, - "labels": ["bug"], - "number": 326, - "title": "Bug Hunt: unable to rename keys that are empty strings", - "url": "https://github.com/hapijs/joi/pull/326" - }, - { - "id": 33736309, - "labels": ["bug"], - "number": 325, - "title": "Bug Hunt: empty string key causes incorrect validation", - "url": "https://github.com/hapijs/joi/pull/325" - }, - { - "id": 33540346, - "labels": ["feature"], - "number": 321, - "title": "add uppercase, lowercase, and trim for strings", - "url": "https://github.com/hapijs/joi/pull/321" - }, - { - "id": 33446326, - "labels": ["bug"], - "number": 317, - "title": "Bug Hunt: invalid Date objects do not cause failure.", - "url": "https://github.com/hapijs/joi/pull/317" - }, - { - "id": 33348783, - "labels": ["bug"], - "number": 313, - "title": "Recursively describes the includes of array schemas #312", - "url": "https://github.com/hapijs/joi/pull/313" - }, - { - "id": 33264227, - "labels": ["bug"], - "number": 312, - "title": "Describe should also compile and describe array's rules", - "url": "https://github.com/hapijs/joi/issues/312" - }, - { - "id": 33199467, - "labels": ["feature"], - "number": 311, - "title": "Feature/meta", - "url": "https://github.com/hapijs/joi/pull/311" - }, - { - "id": 33144642, - "labels": ["bug"], - "number": 310, - "title": "Bug Hunt: email addresses longer than 254 should not be valid", - "url": "https://github.com/hapijs/joi/pull/310" - }, - { - "id": 33144403, - "labels": ["bug"], - "number": 309, - "title": "Bug Hunt: email addresses with a \"local part\" > 64 characters should not be validated", - "url": "https://github.com/hapijs/joi/pull/309" - }, - { - "id": 32161878, - "labels": ["bug"], - "number": 293, - "title": "Verify encoding type is string", - "url": "https://github.com/hapijs/joi/pull/293" - }, - { - "id": 32160271, - "labels": ["bug"], - "number": 292, - "title": "Add test to check for valid encoding param to binary", - "url": "https://github.com/hapijs/joi/pull/292" - }, - { - "id": 32123559, - "labels": ["bug"], - "number": 288, - "title": "Bug Hunt: valid IPv6 domain literals in email addresses fail validation", - "url": "https://github.com/hapijs/joi/pull/288" - }, - { - "id": 32095003, - "labels": [], - "number": 282, - "title": "Bug Hunt: double-quoted local-parts of email addresses cause validation failure", - "url": "https://github.com/hapijs/joi/pull/282" - }, - { - "id": 31710177, - "labels": ["feature"], - "number": 261, - "title": "Object key rules by patterns", - "url": "https://github.com/hapijs/joi/issues/261" - }, - { - "id": 31288153, - "labels": ["feature"], - "number": 241, - "title": "Thoughts on something like any.meta(obj)?", - "url": "https://github.com/hapijs/joi/issues/241" - }, - { - "id": 30381277, - "labels": ["feature"], - "number": 220, - "title": "string().lowercase() and string().uppsercase()", - "url": "https://github.com/hapijs/joi/issues/220" - } - ], - "number": 12, - "url": "https://github.com/hapijs/joi/milestone/12", - "version": "4.3.0" - }, - { - "date": "2014-05-19T18:03:49Z", - "id": 662660, - "issues": [ - { - "id": 33819269, - "labels": ["bug"], - "number": 330, - "title": "Cannot override context", - "url": "https://github.com/hapijs/joi/issues/330" - }, - { - "id": 33819198, - "labels": ["bug"], - "number": 329, - "title": "Joi.forbidden() fails when added to an existing type", - "url": "https://github.com/hapijs/joi/issues/329" - } - ], - "number": 11, - "url": "https://github.com/hapijs/joi/milestone/11", - "version": "4.2.1" - }, - { - "date": "2014-05-18T22:41:20Z", - "id": 658333, - "issues": [ - { - "id": 33757034, - "labels": ["feature"], - "number": 328, - "title": "Support references to external context", - "url": "https://github.com/hapijs/joi/issues/328" - }, - { - "id": 33708144, - "labels": ["test"], - "number": 324, - "title": "Test for retaining ignored values", - "url": "https://github.com/hapijs/joi/issues/324" - }, - { - "id": 33704606, - "labels": ["feature"], - "number": 323, - "title": "Joi.forbidden()", - "url": "https://github.com/hapijs/joi/issues/323" - }, - { - "id": 33556741, - "labels": ["feature"], - "number": 322, - "title": "Make callback optional argument", - "url": "https://github.com/hapijs/joi/issues/322" - }, - { - "id": 33466617, - "labels": ["test"], - "number": 318, - "title": "Convert tests to actual async style", - "url": "https://github.com/hapijs/joi/issues/318" - } - ], - "number": 10, - "url": "https://github.com/hapijs/joi/milestone/10", - "version": "4.2.0" - }, - { - "date": "2014-05-14T07:06:53Z", - "id": 637766, - "issues": [ - { - "id": 32171449, - "labels": ["feature"], - "number": 296, - "title": "Allow valid to take buffer values", - "url": "https://github.com/hapijs/joi/issues/296" - }, - { - "id": 32157881, - "labels": ["bug"], - "number": 291, - "title": "remove extra var internals. Closes #290", - "url": "https://github.com/hapijs/joi/pull/291" - }, - { - "id": 32157692, - "labels": ["bug"], - "number": 290, - "title": "extra var internals in binary.js", - "url": "https://github.com/hapijs/joi/issues/290" - }, - { - "id": 32108620, - "labels": ["feature"], - "number": 287, - "title": "object.unknown()", - "url": "https://github.com/hapijs/joi/issues/287" - }, - { - "id": 32106004, - "labels": ["bug"], - "number": 285, - "title": "Fix to make object.and all-or-nothing - fixes #284", - "url": "https://github.com/hapijs/joi/pull/285" - }, - { - "id": 32105627, - "labels": [], - "number": 284, - "title": "Bug Hunt: object.and is supposed to be all-or-nothing", - "url": "https://github.com/hapijs/joi/pull/284" - } - ], - "number": 9, - "url": "https://github.com/hapijs/joi/milestone/9", - "version": "4.1.0" - }, - { - "date": "2014-04-23T07:51:04Z", - "id": 625777, - "issues": [ - { - "id": 32038222, - "labels": ["feature", "breaking changes"], - "number": 278, - "title": "Cleanup language file", - "url": "https://github.com/hapijs/joi/issues/278" - }, - { - "id": 32024151, - "labels": ["bug"], - "number": 277, - "title": "date() allows boolean value", - "url": "https://github.com/hapijs/joi/issues/277" - }, - { - "id": 32013776, - "labels": ["feature"], - "number": 276, - "title": "binary().encoding()", - "url": "https://github.com/hapijs/joi/issues/276" - }, - { - "id": 32012679, - "labels": ["feature"], - "number": 275, - "title": "Support when() on any()", - "url": "https://github.com/hapijs/joi/issues/275" - }, - { - "id": 31996279, - "labels": ["breaking changes"], - "number": 274, - "title": "Undo #273, remove options from schema.validate()", - "url": "https://github.com/hapijs/joi/issues/274" - }, - { - "id": 31940165, - "labels": ["non issue"], - "number": 273, - "title": "Remove module generic validate() and describe()", - "url": "https://github.com/hapijs/joi/issues/273" - }, - { - "id": 31940148, - "labels": ["non issue"], - "number": 272, - "title": "Undo 268", - "url": "https://github.com/hapijs/joi/issues/272" - }, - { - "id": 31934254, - "labels": ["feature"], - "number": 271, - "title": "schema concat()", - "url": "https://github.com/hapijs/joi/issues/271" - }, - { - "id": 31926541, - "labels": ["bug"], - "number": 270, - "title": "Alt fails to report references", - "url": "https://github.com/hapijs/joi/issues/270" - }, - { - "id": 31923071, - "labels": ["feature", "breaking changes"], - "number": 269, - "title": "Rename alternatives.attempt() with try()", - "url": "https://github.com/hapijs/joi/issues/269" - }, - { - "id": 31861441, - "labels": ["non issue"], - "number": 268, - "title": "Move interfaces from func at root to const", - "url": "https://github.com/hapijs/joi/issues/268" - }, - { - "id": 31859640, - "labels": ["feature"], - "number": 267, - "title": "Add alternatives.attempt() to allow adding more schemas", - "url": "https://github.com/hapijs/joi/issues/267" - }, - { - "id": 31857809, - "labels": ["breaking changes"], - "number": 266, - "title": "Make [] and alternatives() behave exactly the same", - "url": "https://github.com/hapijs/joi/issues/266" - }, - { - "id": 31853418, - "labels": ["feature"], - "number": 265, - "title": "object.and()", - "url": "https://github.com/hapijs/joi/issues/265" - }, - { - "id": 31852612, - "labels": ["feature"], - "number": 264, - "title": "Support references in default()", - "url": "https://github.com/hapijs/joi/issues/264" - }, - { - "id": 31840438, - "labels": ["feature"], - "number": 263, - "title": "object.assert()", - "url": "https://github.com/hapijs/joi/issues/263" - }, - { - "id": 31838297, - "labels": ["feature"], - "number": 262, - "title": "object.keys() append behavior", - "url": "https://github.com/hapijs/joi/issues/262" - }, - { - "id": 31708765, - "labels": ["feature"], - "number": 260, - "title": "Allow referencing the value of other keys in conditions", - "url": "https://github.com/hapijs/joi/issues/260" - }, - { - "id": 31707504, - "labels": ["feature"], - "number": 259, - "title": "Error messages should not include ", - "url": "https://github.com/hapijs/joi/issues/259" - }, - { - "id": 31707437, - "labels": ["bug"], - "number": 258, - "title": "Array should only convert string arrays", - "url": "https://github.com/hapijs/joi/issues/258" - }, - { - "id": 31702182, - "labels": ["breaking changes"], - "number": 257, - "title": "Move dependencies (with,without, or, xor) to object level", - "url": "https://github.com/hapijs/joi/issues/257" - }, - { - "id": 31702142, - "labels": ["breaking changes"], - "number": 256, - "title": "Keep input const and return modified value via validate callback", - "url": "https://github.com/hapijs/joi/issues/256" - }, - { - "id": 31613961, - "labels": ["breaking changes"], - "number": 255, - "title": "Remove modify option", - "url": "https://github.com/hapijs/joi/issues/255" - }, - { - "id": 31613516, - "labels": ["breaking changes"], - "number": 254, - "title": "4.0.0", - "url": "https://github.com/hapijs/joi/issues/254" - }, - { - "id": 31613393, - "labels": [], - "number": 253, - "title": "Validate callback, rename move to object", - "url": "https://github.com/hapijs/joi/pull/253" - }, - { - "id": 31613177, - "labels": ["breaking changes"], - "number": 252, - "title": "Move rename() to object()", - "url": "https://github.com/hapijs/joi/issues/252" - }, - { - "id": 31527042, - "labels": ["breaking changes"], - "number": 250, - "title": "Change validate() to return value via callback", - "url": "https://github.com/hapijs/joi/issues/250" - }, - { - "id": 31522686, - "labels": ["bug"], - "number": 249, - "title": "Alternatives bug fixes", - "url": "https://github.com/hapijs/joi/pull/249" - }, - { - "id": 31432816, - "labels": ["feature"], - "number": 248, - "title": "Move object() constructor args to keys() method", - "url": "https://github.com/hapijs/joi/issues/248" - }, - { - "id": 31432506, - "labels": ["feature"], - "number": 247, - "title": "unit() documentation method", - "url": "https://github.com/hapijs/joi/issues/247" - }, - { - "id": 31432449, - "labels": ["bug"], - "number": 246, - "title": "rename() applied incorrectly", - "url": "https://github.com/hapijs/joi/issues/246" - }, - { - "id": 31424986, - "labels": ["bug"], - "number": 245, - "title": "alternatives() fails to apply conversion when lower priority match has valid()", - "url": "https://github.com/hapijs/joi/issues/245" - }, - { - "id": 31424950, - "labels": ["bug"], - "number": 244, - "title": "alternatives() fails to apply conversion of matching schema", - "url": "https://github.com/hapijs/joi/issues/244" - }, - { - "id": 31421885, - "labels": ["bug"], - "number": 243, - "title": "alternatives() incorrectly allows null when no valids present", - "url": "https://github.com/hapijs/joi/issues/243" - }, - { - "id": 31264764, - "labels": ["bug", "breaking changes"], - "number": 239, - "title": "Error inheritance is troublesome", - "url": "https://github.com/hapijs/joi/issues/239" - }, - { - "id": 31243626, - "labels": ["feature"], - "number": 238, - "title": "match() -> test()", - "url": "https://github.com/hapijs/joi/pull/238" - }, - { - "id": 31211908, - "labels": ["feature"], - "number": 237, - "title": "Support literal values as valid() condition", - "url": "https://github.com/hapijs/joi/issues/237" - }, - { - "id": 31154821, - "labels": ["test"], - "number": 234, - "title": "testling support", - "url": "https://github.com/hapijs/joi/pull/234" - }, - { - "id": 31130547, - "labels": ["test"], - "number": 233, - "title": "Add testling-ci badges", - "url": "https://github.com/hapijs/joi/issues/233" - }, - { - "id": 31014999, - "labels": ["feature"], - "number": 226, - "title": "Add support for binary type", - "url": "https://github.com/hapijs/joi/pull/226" - }, - { - "id": 30343676, - "labels": ["feature"], - "number": 217, - "title": "Incorrect ValidationError.annotated() output with abortEarly", - "url": "https://github.com/hapijs/joi/issues/217" - }, - { - "id": 30231813, - "labels": ["feature"], + { + "date": "2026-05-04T16:09:20Z", + "id": 15790448, + "issues": [ + { + "id": 4377943724, + "labels": ["bug"], + "number": 3113, + "title": "fix: protect link recursion from max call stack", + "url": "https://github.com/hapijs/joi/pull/3113" + } + ], "number": 214, - "title": "example() documentation method", - "url": "https://github.com/hapijs/joi/issues/214" - }, - { - "id": 29990586, - "labels": ["feature"], + "url": "https://github.com/hapijs/joi/milestone/214", + "version": "18.2.1" + }, + { + "date": "2026-05-04T15:16:15Z", + "id": 15789816, + "issues": [ + { + "id": 4377623767, + "labels": ["feature"], + "number": 3111, + "title": "feat: add maxRecursion limit to links", + "url": "https://github.com/hapijs/joi/pull/3111" + }, + { + "id": 1150539161, + "labels": ["support"], + "number": 2747, + "title": "Limit depth of self-referencing schema", + "url": "https://github.com/hapijs/joi/issues/2747" + } + ], + "number": 213, + "url": "https://github.com/hapijs/joi/milestone/213", + "version": "18.2.0" + }, + { + "date": "2026-03-30T18:05:09Z", + "id": 15356910, + "issues": [ + { + "id": 4166157537, + "labels": ["bug"], + "number": 3107, + "title": "fix: improve JSON Schema conversion for number.port() and number.sign()", + "url": "https://github.com/hapijs/joi/pull/3107" + } + ], + "number": 212, + "url": "https://github.com/hapijs/joi/milestone/212", + "version": "18.1.2" + }, + { + "date": "2026-03-23T17:52:59Z", + "id": 15258251, + "issues": [ + { + "id": 4114694252, + "labels": ["bug"], + "number": 3103, + "title": "fix: allow NaN in schema describe() output validation", + "url": "https://github.com/hapijs/joi/pull/3103" + }, + { + "id": 3936661366, + "labels": ["bug"], + "number": 3099, + "title": "Fix braces escaping when template doesn't contains any variable", + "url": "https://github.com/hapijs/joi/pull/3099" + }, + { + "id": 3927008897, + "labels": ["bug"], + "number": 3098, + "title": "Support libraryOptions in standard validator validate()", + "url": "https://github.com/hapijs/joi/issues/3098" + }, + { + "id": 3926990031, + "labels": ["bug"], + "number": 3097, + "title": "feat: enhance validation to support options in standard function", + "url": "https://github.com/hapijs/joi/pull/3097" + }, + { + "id": 3749176772, + "labels": ["bug"], + "number": 3094, + "title": "any.describe() throws an error if the schema contains .allow(NaN)", + "url": "https://github.com/hapijs/joi/issues/3094" + } + ], + "number": 211, + "url": "https://github.com/hapijs/joi/milestone/211", + "version": "18.1.1" + }, + { + "date": "2026-03-23T17:05:08Z", + "id": 15216237, + "issues": [ + { + "id": 4098194752, + "labels": ["feature"], + "number": 3102, + "title": "feat: add Standard JSON Schema", + "url": "https://github.com/hapijs/joi/pull/3102" + }, + { + "id": 3922339917, + "labels": ["feature"], + "number": 3096, + "title": "Consider implementing Standard JSON Schema", + "url": "https://github.com/hapijs/joi/issues/3096" + } + ], "number": 210, - "title": "Add hostname matching to Joi.String", - "url": "https://github.com/hapijs/joi/pull/210" - }, - { - "id": 29608890, - "labels": ["feature"], + "url": "https://github.com/hapijs/joi/milestone/210", + "version": "18.1.0" + }, + { + "date": "2025-11-19T15:50:15Z", + "id": 14176130, + "issues": [ + { + "id": 3563309382, + "labels": ["bug"], + "number": 3092, + "title": "fix: allow coercion of string booleans with trailing whitespace", + "url": "https://github.com/hapijs/joi/pull/3092" + }, + { + "id": 3546328972, + "labels": ["bug"], + "number": 3091, + "title": "Joi.boolean() does not handle strings with trailing spaces", + "url": "https://github.com/hapijs/joi/issues/3091" + } + ], + "number": 209, + "url": "https://github.com/hapijs/joi/milestone/209", + "version": "18.0.2" + }, + { + "date": "2025-08-20T08:21:01Z", + "id": 13527492, + "issues": [ + { + "id": 3306222585, + "labels": ["types"], + "number": 3087, + "title": "fix: proper types for more complex cases of array", + "url": "https://github.com/hapijs/joi/pull/3087" + }, + { + "id": 3305853768, + "labels": ["bug", "types"], + "number": 3086, + "title": ".array().items() dynamic type item type schema causes issues in typescript", + "url": "https://github.com/hapijs/joi/issues/3086" + } + ], + "number": 208, + "url": "https://github.com/hapijs/joi/milestone/208", + "version": "18.0.1" + }, + { + "date": "2025-08-03T15:02:01Z", + "id": 9147309, + "issues": [ + { + "id": 3278056010, + "labels": ["feature"], + "number": 3084, + "title": "feat: add isAsync() helper", + "url": "https://github.com/hapijs/joi/pull/3084" + }, + { + "id": 3150627812, + "labels": ["feature"], + "number": 3082, + "title": "Added wrapper option to uuid function", + "url": "https://github.com/hapijs/joi/pull/3082" + }, + { + "id": 3101562683, + "labels": ["feature"], + "number": 3080, + "title": "feat: implement standard schema spec", + "url": "https://github.com/hapijs/joi/pull/3080" + }, + { + "id": 3092026275, + "labels": ["feature"], + "number": 3078, + "title": "Implement Standard Schema", + "url": "https://github.com/hapijs/joi/issues/3078" + }, + { + "id": 1953253079, + "labels": ["support"], + "number": 2993, + "title": "What version of node does this library support?", + "url": "https://github.com/hapijs/joi/issues/2993" + }, + { + "id": 1865188160, + "labels": ["types"], + "number": 2982, + "title": "feat: Improve array().items type", + "url": "https://github.com/hapijs/joi/pull/2982" + }, + { + "id": 1865047279, + "labels": ["types"], + "number": 2981, + "title": "feat: Improve alternatives type", + "url": "https://github.com/hapijs/joi/pull/2981" + }, + { + "id": 1620062252, + "labels": ["feature", "breaking changes", "release notes"], + "number": 2926, + "title": "18.0.0 Release Notes", + "url": "https://github.com/hapijs/joi/issues/2926" + }, + { + "id": 1620047715, + "labels": ["feature", "breaking changes", "dependency"], + "number": 2925, + "title": "chore: upgrade modules", + "url": "https://github.com/hapijs/joi/pull/2925" + } + ], + "number": 190, + "url": "https://github.com/hapijs/joi/milestone/190", + "version": "18.0.0" + }, + { + "date": "2026-06-17T07:55:02Z", + "id": 16328265, + "issues": [ + { + "id": 4647957887, + "labels": ["security"], + "number": 3123, + "title": "chore: backport #3113 to v17", + "url": "https://github.com/hapijs/joi/pull/3123" + } + ], + "number": 216, + "url": "https://github.com/hapijs/joi/milestone/216", + "version": "17.13.4" + }, + { + "date": "2024-06-19T15:17:24Z", + "id": 11206916, + "issues": [ + { + "id": 2362616850, + "labels": ["bug"], + "number": 3043, + "title": "fix: correct function type in alternatives error", + "url": "https://github.com/hapijs/joi/pull/3043" + } + ], + "number": 207, + "url": "https://github.com/hapijs/joi/milestone/207", + "version": "17.13.3" + }, + { + "date": "2024-06-19T12:37:04Z", + "id": 11205378, + "issues": [ + { + "id": 2295899329, + "labels": ["bug"], + "number": 3037, + "title": "fix: `stripUnknown` should honor local explicit `.unknown(false)`", + "url": "https://github.com/hapijs/joi/pull/3037" + } + ], "number": 206, - "title": "Find full path to nested errors", - "url": "https://github.com/hapijs/joi/pull/206" - }, - { - "id": 29476950, - "labels": ["feature"], + "url": "https://github.com/hapijs/joi/milestone/206", + "version": "17.13.2" + }, + { + "date": "2024-06-19T09:15:12Z", + "id": 11000255, + "issues": [ + { + "id": 2274746403, + "labels": ["bug"], + "number": 3034, + "title": "fix: label false should also hide explicit labels", + "url": "https://github.com/hapijs/joi/pull/3034" + }, + { + "id": 2273576913, + "labels": ["bug"], + "number": 3033, + "title": "Setting `errors.label` to `false` does not remove labels from error messages for keys with labels", + "url": "https://github.com/hapijs/joi/issues/3033" + } + ], + "number": 205, + "url": "https://github.com/hapijs/joi/milestone/205", + "version": "17.13.1" + }, + { + "date": "2024-04-23T08:35:37Z", + "id": 10769457, + "issues": [ + { + "id": 2258261381, + "labels": ["feature"], + "number": 3032, + "title": "feat: support encoding uri (follow-up to #3027)", + "url": "https://github.com/hapijs/joi/pull/3032" + }, + { + "id": 2216423112, + "labels": ["feature"], + "number": 3027, + "title": "feat: Support encoding uri", + "url": "https://github.com/hapijs/joi/pull/3027" + }, + { + "id": 1489081742, + "labels": ["feature"], + "number": 2889, + "title": "string().uri() not working with accented characters", + "url": "https://github.com/hapijs/joi/issues/2889" + } + ], + "number": 204, + "url": "https://github.com/hapijs/joi/milestone/204", + "version": "17.13.0" + }, + { + "date": "2024-04-03T21:37:44Z", + "id": 10769395, + "issues": [ + { + "id": 2215661765, + "labels": ["bug"], + "number": 3026, + "title": "fix: handle bigint in unique rule", + "url": "https://github.com/hapijs/joi/pull/3026" + } + ], + "number": 203, + "url": "https://github.com/hapijs/joi/milestone/203", + "version": "17.12.3" + }, + { + "date": "2024-02-21T18:44:59Z", + "id": 10588351, + "issues": [ + { + "id": 2139645423, + "labels": ["types"], + "number": 3018, + "title": "Fix issue 2730 - Wrong State['path'] type", + "url": "https://github.com/hapijs/joi/pull/3018" + }, + { + "id": 1111849600, + "labels": ["types"], + "number": 2730, + "title": "Wrong `State['path']` type", + "url": "https://github.com/hapijs/joi/issues/2730" + } + ], "number": 202, - "title": "array() should set a specific detail.path", - "url": "https://github.com/hapijs/joi/issues/202" - }, - { - "id": 29141937, - "labels": ["feature"], - "number": 196, - "title": "Precompile schema", - "url": "https://github.com/hapijs/joi/issues/196" - }, - { - "id": 29036804, - "labels": ["feature"], - "number": 194, - "title": "Conditional rule based on value of another key", - "url": "https://github.com/hapijs/joi/issues/194" - }, - { - "id": 28977326, - "labels": ["bug"], - "number": 192, - "title": "64-bit limits in min()/max()/integer()", - "url": "https://github.com/hapijs/joi/issues/192" - }, - { - "id": 28856639, - "labels": ["feature"], - "number": 191, - "title": "Added support for buffer length", - "url": "https://github.com/hapijs/joi/pull/191" - } - ], - "number": 8, - "url": "https://github.com/hapijs/joi/milestone/8", - "version": "4.0.0" - }, - { - "date": "2014-05-23T20:24:22Z", - "id": 667165, - "issues": [ - { - "id": 34108621, - "labels": ["bug"], - "number": 345, - "title": "Describe references as such", - "url": "https://github.com/hapijs/joi/issues/345" - }, - { - "id": 34096088, - "labels": ["bug"], - "number": 343, - "title": "Ref and Alternatives.when don't handle empty string keys", - "url": "https://github.com/hapijs/joi/issues/343" - } - ], - "number": 13, - "url": "https://github.com/hapijs/joi/milestone/13", - "version": "3.4.1" - }, - { - "date": "2014-04-10T03:05:30Z", - "id": 611366, - "issues": [ - { - "id": 31046211, - "labels": ["feature", "breaking changes"], - "number": 231, - "title": "Remove language file support", - "url": "https://github.com/hapijs/joi/issues/231" - }, - { - "id": 31046174, - "labels": ["breaking changes"], - "number": 230, - "title": "3.0.0", - "url": "https://github.com/hapijs/joi/issues/230" - }, - { - "id": 31036084, - "labels": ["test"], - "number": 229, - "title": "Bring coverage back to 100% after lab logical statement support", - "url": "https://github.com/hapijs/joi/issues/229" - }, - { - "id": 31036060, - "labels": ["feature"], - "number": 228, - "title": "hoek 2.0", - "url": "https://github.com/hapijs/joi/issues/228" - }, - { - "id": 31035988, - "labels": ["bug"], - "number": 227, - "title": "number allows string even with strict()", - "url": "https://github.com/hapijs/joi/issues/227" - }, - { - "id": 30806500, - "labels": [], - "number": 224, - "title": "Immutable schema objects. Closes #221", - "url": "https://github.com/hapijs/joi/pull/224" - }, - { - "id": 30750016, - "labels": ["feature", "breaking changes"], - "number": 221, - "title": "Change object to immutable", - "url": "https://github.com/hapijs/joi/issues/221" - }, - { - "id": 30283015, - "labels": ["feature"], - "number": 216, - "title": "Change locale support to something that works with browserify.", - "url": "https://github.com/hapijs/joi/issues/216" - } - ], - "number": 7, - "url": "https://github.com/hapijs/joi/milestone/7", - "version": "3.0.0" - }, - { - "date": "2014-03-27T00:23:33Z", - "id": 603550, - "issues": [ - { - "id": 30264280, - "labels": ["bug", "feature"], - "number": 215, - "title": "Enable all any() methods on array()", - "url": "https://github.com/hapijs/joi/issues/215" - }, - { - "id": 29471905, - "labels": ["bug"], + "url": "https://github.com/hapijs/joi/milestone/202", + "version": "17.12.2" + }, + { + "date": "2024-01-29T13:44:48Z", + "id": 10482661, + "issues": [ + { + "id": 2105483334, + "labels": ["bug"], + "number": 3016, + "title": "fix: domain default tld validation", + "url": "https://github.com/hapijs/joi/pull/3016" + }, + { + "id": 2097724714, + "labels": ["bug"], + "number": 3015, + "title": "fix: domain default tld validation", + "url": "https://github.com/hapijs/joi/pull/3015" + }, + { + "id": 2049526270, + "labels": ["bug"], + "number": 3007, + "title": "Domain validation not checking IANA registry by default", + "url": "https://github.com/hapijs/joi/issues/3007" + } + ], "number": 201, - "title": "Allows using any.rename() and any.default() together", - "url": "https://github.com/hapijs/joi/pull/201" - } - ], - "number": 6, - "url": "https://github.com/hapijs/joi/milestone/6", - "version": "2.9.0" - }, - { - "date": "2014-03-20T09:06:38Z", - "id": 591611, - "issues": [ - { - "id": 29227780, - "labels": ["feature"], + "url": "https://github.com/hapijs/joi/milestone/201", + "version": "17.12.1" + }, + { + "date": "2024-01-18T00:04:23Z", + "id": 10431827, + "issues": [ + { + "id": 2087195431, + "labels": ["feature"], + "number": 3014, + "title": "feat: hex prefix", + "url": "https://github.com/hapijs/joi/pull/3014" + }, + { + "id": 2073453048, + "labels": ["feature"], + "number": 3011, + "title": "Allow 0x prefix for hex strings", + "url": "https://github.com/hapijs/joi/pull/3011" + }, + { + "id": 641339086, + "labels": ["bug", "feature"], + "number": 2386, + "title": "Allow 0x prefix for hex strings", + "url": "https://github.com/hapijs/joi/issues/2386" + } + ], + "number": 200, + "url": "https://github.com/hapijs/joi/milestone/200", + "version": "17.12.0" + }, + { + "date": "2024-01-15T13:06:38Z", + "id": 10419385, + "issues": [ + { + "id": 2081693958, + "labels": ["bug"], + "number": 3013, + "title": "fix: precision issue on number().multiple()", + "url": "https://github.com/hapijs/joi/pull/3013" + }, + { + "id": 2068151437, + "labels": ["bug", "types"], + "number": 3009, + "title": "fix: LanguageMessages type now supports languages in TypeScript", + "url": "https://github.com/hapijs/joi/pull/3009" + }, + { + "id": 1990728854, + "labels": ["bug"], + "number": 3001, + "title": "fix: do not override existing labels of underlying schemas in alternatives", + "url": "https://github.com/hapijs/joi/pull/3001" + }, + { + "id": 1787687666, + "labels": ["bug", "support"], + "number": 2962, + "title": "Multiple doesn't work correct", + "url": "https://github.com/hapijs/joi/issues/2962" + }, + { + "id": 1440500562, + "labels": ["documentation", "types"], + "number": 2875, + "title": "Fix for #2874", + "url": "https://github.com/hapijs/joi/pull/2875" + }, + { + "id": 1440478135, + "labels": ["support"], + "number": 2874, + "title": "Missing helper.error() method parameter type definition", + "url": "https://github.com/hapijs/joi/issues/2874" + }, + { + "id": 1097031270, + "labels": ["types"], + "number": 2720, + "title": "Type declaration for `messages` option of any.validate() inconsistent with the documentation and actual code", + "url": "https://github.com/hapijs/joi/issues/2720" + } + ], + "number": 199, + "url": "https://github.com/hapijs/joi/milestone/199", + "version": "17.11.1" + }, + { + "date": "2023-10-04T14:25:52Z", + "id": 10001154, + "issues": [ + { + "id": 1926334194, + "labels": ["feature"], + "number": 2988, + "title": "feat: allow custom expression functions", + "url": "https://github.com/hapijs/joi/pull/2988" + } + ], "number": 198, - "title": "Allow language override directly via options", - "url": "https://github.com/hapijs/joi/issues/198" - }, - { - "id": 29208636, - "labels": ["feature"], + "url": "https://github.com/hapijs/joi/milestone/198", + "version": "17.11.0" + }, + { + "date": "2023-09-17T15:57:12Z", + "id": 9931143, + "issues": [ + { + "id": 1899827281, + "labels": ["bug"], + "number": 2986, + "title": "fix: missing template reference", + "url": "https://github.com/hapijs/joi/pull/2986" + }, + { + "id": 1895279030, + "labels": ["bug"], + "number": 2985, + "title": "Unit test showing example of formula parsing bug", + "url": "https://github.com/hapijs/joi/pull/2985" + }, + { + "id": 1850594151, + "labels": ["bug", "support"], + "number": 2974, + "title": "Unable to access object property with a space in its key via expression templates", + "url": "https://github.com/hapijs/joi/issues/2974" + } + ], "number": 197, - "title": "Support for union types in schemas.", - "url": "https://github.com/hapijs/joi/issues/197" - }, - { - "id": 29079071, - "labels": ["test"], + "url": "https://github.com/hapijs/joi/milestone/197", + "version": "17.10.2" + }, + { + "date": "2023-08-31T15:49:29Z", + "id": 9865466, + "issues": [ + { + "id": 1875799190, + "labels": ["types"], + "number": 2983, + "title": "fix: allow any.error() return type to be ErrorReport[]", + "url": "https://github.com/hapijs/joi/pull/2983" + } + ], + "number": 196, + "url": "https://github.com/hapijs/joi/milestone/196", + "version": "17.10.1" + }, + { + "date": "2023-08-27T17:04:32Z", + "id": 9846520, + "issues": [ + { + "id": 1853085465, + "labels": ["types"], + "number": 2975, + "title": "property metas in Description", + "url": "https://github.com/hapijs/joi/pull/2975" + }, + { + "id": 1790067587, + "labels": ["types"], + "number": 2964, + "title": "#2963 make return value of validate match type definitions", + "url": "https://github.com/hapijs/joi/pull/2964" + }, + { + "id": 1781265663, + "labels": ["types"], + "number": 2961, + "title": "Associate Buffer with BinarySchema", + "url": "https://github.com/hapijs/joi/pull/2961" + }, + { + "id": 1777924204, + "labels": ["feature"], + "number": 2960, + "title": "feat: support bindary buffer that has been JSON.parse(JSON.strinified())", + "url": "https://github.com/hapijs/joi/pull/2960" + }, + { + "id": 1761576894, + "labels": ["feature"], + "number": 2957, + "title": "feat: support uuidv6, uuidv7 and uuidv8 guid types", + "url": "https://github.com/hapijs/joi/pull/2957" + }, + { + "id": 1741458259, + "labels": ["feature"], + "number": 2954, + "title": "Coerce toJSON'ed Buffer to real Buffer", + "url": "https://github.com/hapijs/joi/issues/2954" + } + ], "number": 195, - "title": "Bring coverage back to 100% after lab fix", - "url": "https://github.com/hapijs/joi/issues/195" - }, - { - "id": 28557109, - "labels": ["bug"], + "url": "https://github.com/hapijs/joi/milestone/195", + "version": "17.10.0" + }, + { + "date": "2023-04-24T20:47:29Z", + "id": 9321545, + "issues": [ + { + "id": 1681703485, + "labels": ["bug"], + "number": 2945, + "title": "fix: commit states to avoid memory leak", + "url": "https://github.com/hapijs/joi/pull/2945" + } + ], + "number": 194, + "url": "https://github.com/hapijs/joi/milestone/194", + "version": "17.9.2" + }, + { + "date": "2023-03-21T08:42:49Z", + "id": 9183895, + "issues": [ + { + "id": 1632983659, + "labels": ["bug"], + "number": 2932, + "title": "fix: do not trigger warnings and externals on arrays and alternatives mismatches", + "url": "https://github.com/hapijs/joi/pull/2932" + } + ], + "number": 193, + "url": "https://github.com/hapijs/joi/milestone/193", + "version": "17.9.1" + }, + { + "date": "2023-03-20T08:25:14Z", + "id": 9175644, + "issues": [ + { + "id": 1630304936, + "labels": ["feature"], + "number": 2931, + "title": "feat: improve external helpers", + "url": "https://github.com/hapijs/joi/pull/2931" + } + ], + "number": 192, + "url": "https://github.com/hapijs/joi/milestone/192", + "version": "17.9.0" + }, + { + "date": "2023-03-20T08:25:12Z", + "id": 9156029, + "issues": [ + { + "id": 1622804267, + "labels": ["bug", "types"], + "number": 2928, + "title": "fix: validation warning types", + "url": "https://github.com/hapijs/joi/pull/2928" + }, + { + "id": 1620230465, + "labels": ["support", "types"], + "number": 2927, + "title": "Type definition incorrect for \"warning\" return type from validateAsync", + "url": "https://github.com/hapijs/joi/issues/2927" + } + ], + "number": 191, + "url": "https://github.com/hapijs/joi/milestone/191", + "version": "17.8.4" + }, + { + "date": "2023-03-20T08:25:09Z", + "id": 9070660, + "issues": [ + { + "id": 1593084729, + "labels": [], + "number": 2919, + "title": "chore: revert 17.8.x line", + "url": "https://github.com/hapijs/joi/pull/2919" + }, + { + "id": 1593002882, + "labels": ["support"], + "number": 2917, + "title": "Cannot find module '@hapi/hoek/assert' from 'index.js'", + "url": "https://github.com/hapijs/joi/issues/2917" + }, + { + "id": 1592248117, + "labels": ["support"], + "number": 2914, + "title": "Support for older Node versions maybe lost in v17.8", + "url": "https://github.com/hapijs/joi/issues/2914" + }, + { + "id": 1591944994, + "labels": ["support"], + "number": 2913, + "title": "node_modules/@hapi/hoek/lib/deepEqual.js:274  ", + "url": "https://github.com/hapijs/joi/issues/2913" + } + ], + "number": 189, + "url": "https://github.com/hapijs/joi/milestone/189", + "version": "17.8.3" + }, + { + "date": "2023-03-20T08:25:06Z", + "id": 9070155, + "issues": [ + { + "id": 1592981259, + "labels": ["bug"], + "number": 2916, + "title": "fix: properly transform domain", + "url": "https://github.com/hapijs/joi/pull/2916" + }, + { + "id": 1592497687, + "labels": ["bug", "support"], + "number": 2915, + "title": "Email validation error in v17.8.1", + "url": "https://github.com/hapijs/joi/issues/2915" + } + ], + "number": 188, + "url": "https://github.com/hapijs/joi/milestone/188", + "version": "17.8.2" + }, + { + "date": "2023-02-19T12:33:29Z", + "id": 9063278, + "issues": [ + { + "id": 1590670833, + "labels": ["bug"], + "number": 2910, + "title": "fix: transpile optional chaining", + "url": "https://github.com/hapijs/joi/pull/2910" + } + ], "number": 187, - "title": "Polluted request.payload by adding undefined field", - "url": "https://github.com/hapijs/joi/issues/187" - }, - { - "id": 27857389, - "labels": ["bug"], + "url": "https://github.com/hapijs/joi/milestone/187", + "version": "17.8.1" + }, + { + "date": "2023-02-19T11:51:58Z", + "id": 9063202, + "issues": [ + { + "id": 1590656187, + "labels": ["feature"], + "number": 2909, + "title": "chore: use latest address module", + "url": "https://github.com/hapijs/joi/pull/2909" + }, + { + "id": 936359343, + "labels": ["feature"], + "number": 2630, + "title": "Joi.string().domain() treats '_http._tcp.archive.ubuntu.com' as invalid domain name, even though it works", + "url": "https://github.com/hapijs/joi/issues/2630" + } + ], + "number": 186, + "url": "https://github.com/hapijs/joi/milestone/186", + "version": "17.8.0" + }, + { + "date": "2023-02-19T11:51:56Z", + "id": 9004988, + "issues": [ + { + "id": 1578167134, + "labels": [], + "number": 2905, + "title": "Upgrade `@sideway/formula` to `3.0.1` for `CVE-2023-25166`", + "url": "https://github.com/hapijs/joi/pull/2905" + }, + { + "id": 1504691590, + "labels": [], + "number": 2892, + "title": "Allow null values in BooleanSchema methods", + "url": "https://github.com/hapijs/joi/pull/2892" + } + ], + "number": 185, + "url": "https://github.com/hapijs/joi/milestone/185", + "version": "17.7.1" + }, + { + "date": "2022-11-10T10:33:24Z", + "id": 8569458, + "issues": [ + { + "id": 1419419908, + "labels": ["bug"], + "number": 2867, + "title": "fix: better unsafe check of exponential numbers", + "url": "https://github.com/hapijs/joi/pull/2867" + }, + { + "id": 1193366281, + "labels": ["feature"], + "number": 2762, + "title": "Add isPresent option to object dependencies", + "url": "https://github.com/hapijs/joi/pull/2762" + }, + { + "id": 992008366, + "labels": ["bug"], + "number": 2672, + "title": "Some exponential notation strings are validated as unsafe numbers", + "url": "https://github.com/hapijs/joi/issues/2672" + }, + { + "id": 790848333, + "labels": ["bug"], + "number": 2542, + "title": "Number validation fails on some strings with E-notation", + "url": "https://github.com/hapijs/joi/issues/2542" + } + ], "number": 184, - "title": "Throws error when field is missing and abortEarly=false", - "url": "https://github.com/hapijs/joi/issues/184" - }, - { - "id": 27840646, - "labels": ["feature"], + "url": "https://github.com/hapijs/joi/milestone/184", + "version": "17.7.0" + }, + { + "date": "2022-10-22T10:08:17Z", + "id": 8538155, + "issues": [ + { + "id": 1401515258, + "labels": ["bug"], + "number": 2859, + "title": "Fix/throwing errors if required argument is omitted", + "url": "https://github.com/hapijs/joi/pull/2859" + }, + { + "id": 1111295993, + "labels": ["bug"], + "number": 2729, + "title": "Some validation methods don't throw an error when their required argument is omitted", + "url": "https://github.com/hapijs/joi/issues/2729" + } + ], "number": 183, - "title": "set defaults #181", - "url": "https://github.com/hapijs/joi/pull/183" - }, - { - "id": 27545453, - "labels": ["feature"], + "url": "https://github.com/hapijs/joi/milestone/183", + "version": "17.6.4" + }, + { + "date": "2022-10-11T10:04:10Z", + "id": 8527121, + "issues": [ + { + "id": 1404259103, + "labels": ["types"], + "number": 2860, + "title": "fix: allow all schema types to be defined and inferred", + "url": "https://github.com/hapijs/joi/pull/2860" + }, + { + "id": 1399539454, + "labels": ["support", "types"], + "number": 2857, + "title": "Typing issues with `attempt()`", + "url": "https://github.com/hapijs/joi/issues/2857" + }, + { + "id": 1168824082, + "labels": ["types"], + "number": 2753, + "title": "Typescript typing on `Joi.string().validate(...)`", + "url": "https://github.com/hapijs/joi/issues/2753" + } + ], + "number": 182, + "url": "https://github.com/hapijs/joi/milestone/182", + "version": "17.6.3" + }, + { + "date": "2022-09-29T16:09:13Z", + "id": 8474927, + "issues": [ + { + "id": 1390907633, + "labels": ["bug", "types"], + "number": 2851, + "title": "Try improving handling of unions", + "url": "https://github.com/hapijs/joi/pull/2851" + }, + { + "id": 1389694070, + "labels": ["bug", "types"], + "number": 2850, + "title": "fix: do not confuse booleans for alernatives in strict mode", + "url": "https://github.com/hapijs/joi/pull/2850" + }, + { + "id": 1386182303, + "labels": ["bug", "support", "types"], + "number": 2848, + "title": "Strict object schema with a boolean property expects alternative, not boolean", + "url": "https://github.com/hapijs/joi/issues/2848" + } + ], "number": 181, - "title": "setting defaults", - "url": "https://github.com/hapijs/joi/issues/181" - }, - { - "id": 27463016, - "labels": ["non issue"], + "url": "https://github.com/hapijs/joi/milestone/181", + "version": "17.6.2" + }, + { + "date": "2022-09-22T12:01:44Z", + "id": 7613961, + "issues": [ + { + "id": 1382305421, + "labels": ["types"], + "number": 2844, + "title": "types: support strict alternatives", + "url": "https://github.com/hapijs/joi/pull/2844" + }, + { + "id": 1381290506, + "labels": ["documentation"], + "number": 2843, + "title": "chore: update license", + "url": "https://github.com/hapijs/joi/pull/2843" + }, + { + "id": 1379928615, + "labels": ["documentation"], + "number": 2842, + "title": "Fix spelling", + "url": "https://github.com/hapijs/joi/pull/2842" + }, + { + "id": 1379928379, + "labels": ["types"], + "number": 2841, + "title": "Allow sub-objects for TypeScript strict object schema", + "url": "https://github.com/hapijs/joi/pull/2841" + }, + { + "id": 1376827292, + "labels": ["types"], + "number": 2838, + "title": "feat: change validateAsync return type to match options", + "url": "https://github.com/hapijs/joi/pull/2838" + }, + { + "id": 1369594276, + "labels": ["bug", "types"], + "number": 2836, + "title": "fix(d.ts): allow nested object schema for strictly typed object", + "url": "https://github.com/hapijs/joi/pull/2836" + }, + { + "id": 1358610733, + "labels": ["types"], + "number": 2829, + "title": "fix(d.ts)!: type details param of ValidationError constructor", + "url": "https://github.com/hapijs/joi/pull/2829" + }, + { + "id": 1342785924, + "labels": ["types"], + "number": 2819, + "title": "Add artifact to typings.", + "url": "https://github.com/hapijs/joi/pull/2819" + }, + { + "id": 1342775051, + "labels": ["types"], + "number": 2818, + "title": "Typescript support for .artifact()", + "url": "https://github.com/hapijs/joi/issues/2818" + }, + { + "id": 1327774733, + "labels": [], + "number": 2813, + "title": "Fix Joi issue #2746", + "url": "https://github.com/hapijs/joi/pull/2813" + }, + { + "id": 1320932027, + "labels": ["types"], + "number": 2808, + "title": "feat(d.ts): Add type information for `maxDomainSegments` to `EmailOptions` and `DomainOptions` interfaces", + "url": "https://github.com/hapijs/joi/pull/2808" + }, + { + "id": 1284095708, + "labels": ["types"], + "number": 2797, + "title": "feat(d.ts): improve attempt return type", + "url": "https://github.com/hapijs/joi/pull/2797" + }, + { + "id": 1256690639, + "labels": ["types"], + "number": 2788, + "title": "Include local into `ErrorReport` type", + "url": "https://github.com/hapijs/joi/pull/2788" + }, + { + "id": 1243930480, + "labels": ["bug", "types"], + "number": 2785, + "title": "fix(typings): incompatible type issue for nested strict object schemas", + "url": "https://github.com/hapijs/joi/pull/2785" + }, + { + "id": 1202296754, + "labels": ["bug", "types"], + "number": 2764, + "title": "Incompatible type expected for object schemas nested in strict object schemas", + "url": "https://github.com/hapijs/joi/issues/2764" + }, + { + "id": 1152372226, + "labels": ["bug"], + "number": 2749, + "title": "fixed typo", + "url": "https://github.com/hapijs/joi/pull/2749" + }, + { + "id": 1146226674, + "labels": ["bug"], + "number": 2746, + "title": "Using `Joi.attempt` with `{ convert: false }` does not prevent conversion.", + "url": "https://github.com/hapijs/joi/issues/2746" + }, + { + "id": 1110310979, + "labels": ["bug", "types"], + "number": 2727, + "title": "Fix validateAsync return type", + "url": "https://github.com/hapijs/joi/pull/2727" + }, + { + "id": 976096206, + "labels": ["types"], + "number": 2663, + "title": "Property \"local\" does not exist on type \"ErrorReport\" ", + "url": "https://github.com/hapijs/joi/issues/2663" + } + ], "number": 180, - "title": "#179; add failing test for renames nested within array", - "url": "https://github.com/hapijs/joi/pull/180" - }, - { - "id": 27320128, - "labels": ["feature"], + "url": "https://github.com/hapijs/joi/milestone/180", + "version": "17.6.1" + }, + { + "date": "2022-01-26T23:07:42Z", + "id": 7449614, + "issues": [ + { + "id": 1115588030, + "labels": ["feature"], + "number": 2732, + "title": "Support length() in templates", + "url": "https://github.com/hapijs/joi/issues/2732" + } + ], + "number": 179, + "url": "https://github.com/hapijs/joi/milestone/179", + "version": "17.6.0" + }, + { + "date": "2021-12-02T06:39:50Z", + "id": 7446145, + "issues": [ + { + "id": 1065127444, + "labels": ["feature"], + "number": 2708, + "title": "How can I define both specific error messages and a default error message?", + "url": "https://github.com/hapijs/joi/issues/2708" + }, + { + "id": 1059455491, + "labels": ["feature"], + "number": 2706, + "title": "Error messages do not distinguish between numbers and strings!Easily misleading", + "url": "https://github.com/hapijs/joi/issues/2706" + }, + { + "id": 1053374439, + "labels": ["types"], + "number": 2703, + "title": "issue #2606: pass TSchema from ObjectSchema to .validate function", + "url": "https://github.com/hapijs/joi/pull/2703" + }, + { + "id": 1048657219, + "labels": ["types"], + "number": 2698, + "title": "Add Date -> Joi.DateSchema map to ObjectPropertiesSchema", + "url": "https://github.com/hapijs/joi/pull/2698" + }, + { + "id": 1022108922, + "labels": ["feature"], + "number": 2687, + "title": "string().min(0) is failing to validate a zero-length string", + "url": "https://github.com/hapijs/joi/issues/2687" + }, + { + "id": 981051830, + "labels": ["bug"], + "number": 2666, + "title": "Updated `multiple` rule to support decimal/float base", + "url": "https://github.com/hapijs/joi/pull/2666" + }, + { + "id": 979154463, + "labels": ["bug", "types"], + "number": 2665, + "title": "Fix typings on any.external(): add helpers argument", + "url": "https://github.com/hapijs/joi/pull/2665" + }, + { + "id": 962148619, + "labels": ["bug"], + "number": 2651, + "title": "Fix label elimination for externals", + "url": "https://github.com/hapijs/joi/pull/2651" + }, + { + "id": 958351880, + "labels": ["bug"], + "number": 2649, + "title": "fix: Joi.string().hostname() not returning errors for CIDR notation", + "url": "https://github.com/hapijs/joi/pull/2649" + }, + { + "id": 958349612, + "labels": ["bug"], + "number": 2648, + "title": "Incorrect hostname validation", + "url": "https://github.com/hapijs/joi/issues/2648" + }, + { + "id": 943251026, + "labels": ["bug"], + "number": 2635, + "title": "any.external: can't disable label", + "url": "https://github.com/hapijs/joi/issues/2635" + }, + { + "id": 876890865, + "labels": ["bug", "types"], + "number": 2605, + "title": "\"ExternalValidationFunction\" type is missing \"helpers\" parameter in index.d.ts", + "url": "https://github.com/hapijs/joi/issues/2605" + }, + { + "id": 866910880, + "labels": ["bug"], + "number": 2600, + "title": "Joi.external() error message", + "url": "https://github.com/hapijs/joi/issues/2600" + }, + { + "id": 846952220, + "labels": ["bug"], + "number": 2590, + "title": "defaults in alternatives should work recursively", + "url": "https://github.com/hapijs/joi/issues/2590" + }, + { + "id": 846945517, + "labels": ["bug"], + "number": 2589, + "title": "merge subschema matches when subchemas are objects, or alternatives of objects", + "url": "https://github.com/hapijs/joi/pull/2589" + }, + { + "id": 826666841, + "labels": ["feature"], + "number": 2577, + "title": "add subschema property validation failures to context", + "url": "https://github.com/hapijs/joi/pull/2577" + } + ], "number": 178, - "title": "Embedded validators in Array().includes don't work ", - "url": "https://github.com/hapijs/joi/issues/178" - }, - { - "id": 27235520, - "labels": ["bug"], + "url": "https://github.com/hapijs/joi/milestone/178", + "version": "17.5.0" + }, + { + "date": "2021-12-01T08:48:44Z", + "id": 7021782, + "issues": [ + { + "id": 1016225490, + "labels": ["bug", "dependency"], + "number": 2685, + "title": "Joi.string().email() passes for `foo@bar%2ecom`", + "url": "https://github.com/hapijs/joi/issues/2685" + } + ], "number": 177, - "title": "Modify does not change internal values in array", - "url": "https://github.com/hapijs/joi/issues/177" - }, - { - "id": 27226035, - "labels": ["bug"], + "url": "https://github.com/hapijs/joi/milestone/177", + "version": "17.4.3" + }, + { + "date": "2021-08-01T21:18:00Z", + "id": 6934782, + "issues": [ + { + "id": 950895186, + "labels": ["bug"], + "number": 2642, + "title": "Fix issue with only required items. Fixes #2620.", + "url": "https://github.com/hapijs/joi/pull/2642" + }, + { + "id": 927946530, + "labels": ["bug"], + "number": 2624, + "title": "Fix Web Workers compatibility", + "url": "https://github.com/hapijs/joi/pull/2624" + }, + { + "id": 919358309, + "labels": ["bug"], + "number": 2620, + "title": "If all elements of array is required, it does not validate unknown items", + "url": "https://github.com/hapijs/joi/issues/2620" + }, + { + "id": 539748053, + "labels": ["bug"], + "number": 2251, + "title": "`dist/joi-browser.min.js` doesn't work in workers", + "url": "https://github.com/hapijs/joi/issues/2251" + } + ], "number": 176, - "title": "closes #175. missing required keys no longer throws.", - "url": "https://github.com/hapijs/joi/pull/176" - }, - { - "id": 26586182, - "labels": ["feature"], + "url": "https://github.com/hapijs/joi/milestone/176", + "version": "17.4.2" + }, + { + "date": "2021-07-11T05:04:34Z", + "id": 6403312, + "issues": [ + { + "id": 931137268, + "labels": ["types"], + "number": 2627, + "title": "Add object type guards schema", + "url": "https://github.com/hapijs/joi/pull/2627" + }, + { + "id": 842846439, + "labels": ["bug", "types"], + "number": 2586, + "title": "fix isSchema type definition", + "url": "https://github.com/hapijs/joi/pull/2586" + }, + { + "id": 842842325, + "labels": ["bug", "types"], + "number": 2585, + "title": "type problem in Joi.isSchema function", + "url": "https://github.com/hapijs/joi/issues/2585" + }, + { + "id": 823225132, + "labels": ["bug", "types"], + "number": 2573, + "title": "Add option array type to AlternativesSchema.conditional", + "url": "https://github.com/hapijs/joi/pull/2573" + } + ], + "number": 175, + "url": "https://github.com/hapijs/joi/milestone/175", + "version": "17.4.1" + }, + { + "date": "2021-02-08T01:06:29Z", + "id": 6026845, + "issues": [ + { + "id": 800384866, + "labels": ["bug", "types"], + "number": 2556, + "title": "fix: any.when() options parameters not supported as Array in index.d.ts", + "url": "https://github.com/hapijs/joi/pull/2556" + }, + { + "id": 800298641, + "labels": ["bug", "types"], + "number": 2555, + "title": "Type definition for the function `any.when()` mismatch the documentation and usage", + "url": "https://github.com/hapijs/joi/issues/2555" + }, + { + "id": 796794319, + "labels": ["types"], + "number": 2551, + "title": "feat: Make Joi.Schema generic", + "url": "https://github.com/hapijs/joi/pull/2551" + }, + { + "id": 795511635, + "labels": ["bug", "feature"], + "number": 2548, + "title": "fix: defaults in ordered array are not filled", + "url": "https://github.com/hapijs/joi/pull/2548" + }, + { + "id": 792464975, + "labels": ["bug"], + "number": 2543, + "title": "URI validation, allowRelative with domain", + "url": "https://github.com/hapijs/joi/issues/2543" + }, + { + "id": 781638166, + "labels": ["bug"], + "number": 2536, + "title": "merge the results of a .match('all') if all the subschemas are objects", + "url": "https://github.com/hapijs/joi/pull/2536" + }, + { + "id": 781603104, + "labels": ["bug"], + "number": 2535, + "title": "defaults in alternatives with a match mode set are not returned", + "url": "https://github.com/hapijs/joi/issues/2535" + }, + { + "id": 780582804, + "labels": ["bug", "types"], + "number": 2534, + "title": "Remove incorrect errors type", + "url": "https://github.com/hapijs/joi/pull/2534" + }, + { + "id": 777175773, + "labels": ["bug"], + "number": 2532, + "title": "Fix confusing message when refs are passed", + "url": "https://github.com/hapijs/joi/pull/2532" + }, + { + "id": 771928689, + "labels": ["bug", "types"], + "number": 2528, + "title": "Added guid separator and made version optional", + "url": "https://github.com/hapijs/joi/pull/2528" + }, + { + "id": 757668840, + "labels": ["bug", "types"], + "number": 2523, + "title": "errors is always undefined in ValidationResult", + "url": "https://github.com/hapijs/joi/issues/2523" + }, + { + "id": 757000750, + "labels": ["bug", "types"], + "number": 2521, + "title": "Fix type of schema passed to alter functions", + "url": "https://github.com/hapijs/joi/pull/2521" + }, + { + "id": 751579156, + "labels": ["bug"], + "number": 2518, + "title": "fix for stripUnknown not working for nested object on invalid object", + "url": "https://github.com/hapijs/joi/pull/2518" + }, + { + "id": 734030120, + "labels": ["bug", "types"], + "number": 2502, + "title": "Appends the allowed object keys in typescript", + "url": "https://github.com/hapijs/joi/pull/2502" + }, + { + "id": 715713227, + "labels": ["bug"], + "number": 2479, + "title": "Inconsistency with stripUnknown: true and failing validation rules", + "url": "https://github.com/hapijs/joi/issues/2479" + }, + { + "id": 707508553, + "labels": ["bug"], + "number": 2471, + "title": "Joi.object().xor() throws with \"must be a string or a reference\" when passed a reference", + "url": "https://github.com/hapijs/joi/issues/2471" + }, + { + "id": 691090715, + "labels": ["bug"], + "number": 2459, + "title": "stripUnknown doesn't work for nested objects", + "url": "https://github.com/hapijs/joi/issues/2459" + }, + { + "id": 657206357, + "labels": ["bug"], + "number": 2404, + "title": "defaults in ordered array are not filled", + "url": "https://github.com/hapijs/joi/issues/2404" + } + ], + "number": 174, + "url": "https://github.com/hapijs/joi/milestone/174", + "version": "17.4.0" + }, + { + "date": "2020-10-24T07:26:46Z", + "id": 5789852, + "issues": [ + { + "id": 713554250, + "labels": ["bug", "types"], + "number": 2477, + "title": "Add RegExp to the supported types for Extension.type", + "url": "https://github.com/hapijs/joi/pull/2477" + }, + { + "id": 713153983, + "labels": ["bug", "types"], + "number": 2475, + "title": "Add render property to ReferenceOptions TS def", + "url": "https://github.com/hapijs/joi/pull/2475" + }, + { + "id": 700968762, + "labels": ["bug"], + "number": 2465, + "title": "@hapi/formula@2.0.0 Deprecated", + "url": "https://github.com/hapijs/joi/issues/2465" + }, + { + "id": 686244539, + "labels": ["feature"], + "number": 2455, + "title": "Expose prefs in external()", + "url": "https://github.com/hapijs/joi/pull/2455" + }, + { + "id": 685414463, + "labels": ["bug", "types"], + "number": 2454, + "title": "CustomValidator return type adjusted in typescript", + "url": "https://github.com/hapijs/joi/pull/2454" + }, + { + "id": 676405382, + "labels": ["bug", "types"], + "number": 2442, + "title": "Update index.d.ts", + "url": "https://github.com/hapijs/joi/pull/2442" + }, + { + "id": 676264698, + "labels": ["bug", "types"], + "number": 2441, + "title": "Wrong field name in ValidationError (index.d.ts)", + "url": "https://github.com/hapijs/joi/issues/2441" + } + ], + "number": 173, + "url": "https://github.com/hapijs/joi/milestone/173", + "version": "17.3.0" + }, + { + "date": "2020-08-19T16:57:59Z", + "id": 5734564, + "issues": [ + { + "id": 681995650, + "labels": ["documentation"], + "number": 2450, + "title": "Update dev site", + "url": "https://github.com/hapijs/joi/issues/2450" + } + ], + "number": 171, + "url": "https://github.com/hapijs/joi/milestone/171", + "version": "17.2.1" + }, + { + "date": "2020-08-05T02:12:08Z", + "id": 5202228, + "issues": [ + { + "id": 673189440, + "labels": ["types"], + "number": 2431, + "title": "Import types from DT", + "url": "https://github.com/hapijs/joi/issues/2431" + }, + { + "id": 667115914, + "labels": ["bug"], + "number": 2421, + "title": "Support ISO8601 with hours timeshift only", + "url": "https://github.com/hapijs/joi/pull/2421" + }, + { + "id": 666933236, + "labels": ["bug"], + "number": 2419, + "title": "isoDate doesn't recognize correct string", + "url": "https://github.com/hapijs/joi/issues/2419" + }, + { + "id": 659018435, + "labels": ["bug"], + "number": 2408, + "title": "Fix number padding (e.g. 00000) and trailing decimal points (e.g. 2.)", + "url": "https://github.com/hapijs/joi/pull/2408" + }, + { + "id": 659003848, + "labels": ["bug"], + "number": 2407, + "title": "\"2.\" throws number.unsafe", + "url": "https://github.com/hapijs/joi/issues/2407" + }, + { + "id": 659000586, + "labels": ["bug"], + "number": 2406, + "title": "\"00000\" throws number.unsafe", + "url": "https://github.com/hapijs/joi/issues/2406" + }, + { + "id": 651179864, + "labels": ["feature"], + "number": 2398, + "title": "Support maxDomainSegments", + "url": "https://github.com/hapijs/joi/issues/2398" + }, + { + "id": 632975052, + "labels": ["bug"], + "number": 2380, + "title": "Joi.build() does not work with complex extension bases", + "url": "https://github.com/hapijs/joi/issues/2380" + }, + { + "id": 630679048, + "labels": ["feature"], + "number": 2377, + "title": "Add extension validation for \"cast\"", + "url": "https://github.com/hapijs/joi/pull/2377" + }, + { + "id": 611092709, + "labels": ["feature"], + "number": 2361, + "title": "Validation artifacts collected from successful rules", + "url": "https://github.com/hapijs/joi/issues/2361" + }, + { + "id": 598279675, + "labels": ["bug"], + "number": 2348, + "title": "object.default() broke when object is extended", + "url": "https://github.com/hapijs/joi/issues/2348" + }, + { + "id": 591991328, + "labels": ["bug"], + "number": 2337, + "title": "tlds fails to error on invalid segment", + "url": "https://github.com/hapijs/joi/issues/2337" + }, + { + "id": 589821134, + "labels": ["bug", "feature"], + "number": 2330, + "title": "Consistently apply wrap setting", + "url": "https://github.com/hapijs/joi/issues/2330" + }, + { + "id": 585005069, + "labels": ["feature"], + "number": 2320, + "title": "invalid GUID/UUID is validated as valid", + "url": "https://github.com/hapijs/joi/issues/2320" + }, + { + "id": 582564448, + "labels": ["bug"], + "number": 2318, + "title": "`larger than` is incorrect for comparing quanties", + "url": "https://github.com/hapijs/joi/issues/2318" + }, + { + "id": 567138401, + "labels": ["feature"], + "number": 2303, + "title": "Add option to resolve `.ref()` and `.in()` values in error messages.", + "url": "https://github.com/hapijs/joi/issues/2303" + }, + { + "id": 555405548, + "labels": ["bug", "breaking changes"], + "number": 2284, + "title": "Array item could not be an Error", + "url": "https://github.com/hapijs/joi/issues/2284" + } + ], + "number": 170, + "url": "https://github.com/hapijs/joi/milestone/170", + "version": "17.2.0" + }, + { + "date": "2020-03-14T21:26:52Z", + "id": 5022433, + "issues": [ + { + "id": 580942719, + "labels": ["bug", "dependency"], + "number": 2316, + "title": "Validate domain in relative uri", + "url": "https://github.com/hapijs/joi/issues/2316" + }, + { + "id": 559954254, + "labels": ["bug"], + "number": 2293, + "title": "Fix error on changeless forks. Fixes #2292.", + "url": "https://github.com/hapijs/joi/pull/2293" + }, + { + "id": 559901729, + "labels": ["bug"], + "number": 2292, + "title": "Fork object with option already applied", + "url": "https://github.com/hapijs/joi/issues/2292" + } + ], + "number": 169, + "url": "https://github.com/hapijs/joi/milestone/169", + "version": "17.1.1" + }, + { + "date": "2020-01-20T00:03:02Z", + "id": 4992194, + "issues": [ + { + "id": 552005117, + "labels": ["feature"], + "number": 2280, + "title": "isError()", + "url": "https://github.com/hapijs/joi/issues/2280" + }, + { + "id": 551949636, + "labels": ["bug"], + "number": 2279, + "title": "Remove annotate() from assert() when used in the browser", + "url": "https://github.com/hapijs/joi/issues/2279" + } + ], + "number": 168, + "url": "https://github.com/hapijs/joi/milestone/168", + "version": "17.1.0" + }, + { + "date": "2020-01-09T18:47:40Z", + "id": 4992167, + "issues": [ + { + "id": 547654883, + "labels": ["bug"], + "number": 2269, + "title": "Ensure keys term always has right constructor", + "url": "https://github.com/hapijs/joi/issues/2269" + } + ], + "number": 167, + "url": "https://github.com/hapijs/joi/milestone/167", + "version": "17.0.2" + }, + { + "date": "2020-01-09T18:37:15Z", + "id": 4979069, + "issues": [ + { + "id": 547649044, + "labels": ["bug"], + "number": 2268, + "title": "Move flag back to proto", + "url": "https://github.com/hapijs/joi/issues/2268" + } + ], "number": 166, - "title": "Required based on value on other key", - "url": "https://github.com/hapijs/joi/issues/166" - }, - { - "id": 22683660, - "labels": ["feature"], + "url": "https://github.com/hapijs/joi/milestone/166", + "version": "17.0.1" + }, + { + "date": "2020-01-06T19:40:08Z", + "id": 4797017, + "issues": [ + { + "id": 545259143, + "labels": ["dependency"], + "number": 2263, + "title": "Update deps", + "url": "https://github.com/hapijs/joi/issues/2263" + }, + { + "id": 545258955, + "labels": ["breaking changes", "release notes"], + "number": 2262, + "title": "17.0.0 Release Notes", + "url": "https://github.com/hapijs/joi/issues/2262" + }, + { + "id": 545243016, + "labels": ["breaking changes"], + "number": 2261, + "title": "Remove ValidationError.annotate() from browser build", + "url": "https://github.com/hapijs/joi/issues/2261" + }, + { + "id": 545220874, + "labels": ["feature"], + "number": 2260, + "title": "object.regex()", + "url": "https://github.com/hapijs/joi/issues/2260" + }, + { + "id": 542077557, + "labels": ["bug"], + "number": 2254, + "title": "Giving an array argument to any.valid returns incorrect error", + "url": "https://github.com/hapijs/joi/issues/2254" + }, + { + "id": 535937306, + "labels": ["bug"], + "number": 2243, + "title": "Allow `_` in alias, arg, flag, modifier, override, rule, and term names", + "url": "https://github.com/hapijs/joi/pull/2243" + }, + { + "id": 535769742, + "labels": ["bug"], + "number": 2242, + "title": "Can you allow `_` in rule names?", + "url": "https://github.com/hapijs/joi/issues/2242" + }, + { + "id": 529698356, + "labels": ["breaking changes"], + "number": 2231, + "title": "Change errors.wrapArrays to errors.wrap.array", + "url": "https://github.com/hapijs/joi/issues/2231" + }, + { + "id": 522427823, + "labels": ["feature"], + "number": 2219, + "title": "Add the ability to extend all types in place", + "url": "https://github.com/hapijs/joi/issues/2219" + }, + { + "id": 514306299, + "labels": ["non issue"], + "number": 2200, + "title": "Move ip and uri logic to address", + "url": "https://github.com/hapijs/joi/issues/2200" + }, + { + "id": 514305737, + "labels": ["breaking changes", "dependency"], + "number": 2199, + "title": "Remove node 8, 10", + "url": "https://github.com/hapijs/joi/issues/2199" + }, + { + "id": 509090188, + "labels": ["feature", "breaking changes"], + "number": 2189, + "title": "Change default function second argument to full helpers (from prefs)", + "url": "https://github.com/hapijs/joi/issues/2189" + }, + { + "id": 507538924, + "labels": ["feature", "breaking changes"], + "number": 2182, + "title": "Remove quotation marks from error messages", + "url": "https://github.com/hapijs/joi/issues/2182" + }, + { + "id": 501937158, + "labels": ["feature"], + "number": 2163, + "title": "string().hostiname() - validation of non-ASCII chars containing domains", + "url": "https://github.com/hapijs/joi/issues/2163" + } + ], + "number": 164, + "url": "https://github.com/hapijs/joi/milestone/164", + "version": "17.0.0" + }, + { + "date": "2019-11-24T10:02:03Z", + "id": 4724216, + "issues": [ + { + "id": 526516921, + "labels": ["bug"], + "number": 2226, + "title": "object.with and object.without throw error on $ prefixed keys", + "url": "https://github.com/hapijs/joi/issues/2226" + }, + { + "id": 522065305, + "labels": ["bug"], + "number": 2218, + "title": "Maximum call stack size exceeded​​ error for dataUri validation", + "url": "https://github.com/hapijs/joi/issues/2218" + }, + { + "id": 518514150, + "labels": ["bug"], + "number": 2212, + "title": "Joi.string().email() considers \"a@a.com/asd\" as valid email", + "url": "https://github.com/hapijs/joi/issues/2212" + }, + { + "id": 517182026, + "labels": ["bug"], + "number": 2208, + "title": "fix: describe() on schema with default value null", + "url": "https://github.com/hapijs/joi/pull/2208" + }, + { + "id": 517156454, + "labels": ["bug"], + "number": 2207, + "title": "describe() on schema with default value null results in \"Cannot read property 'Symbol(literal)' of null\"", + "url": "https://github.com/hapijs/joi/issues/2207" + }, + { + "id": 515547271, + "labels": ["bug"], + "number": 2205, + "title": "Cannot require a minimal number of matching object properties with `pattern`", + "url": "https://github.com/hapijs/joi/issues/2205" + }, + { + "id": 509557279, + "labels": ["bug"], + "number": 2190, + "title": "Joi.string().domain() treats an email address as a valid domain name", + "url": "https://github.com/hapijs/joi/issues/2190" + }, + { + "id": 508598304, + "labels": ["bug"], + "number": 2187, + "title": "Giving an array argument to any.allow(...values) gives incorrect error", + "url": "https://github.com/hapijs/joi/issues/2187" + }, + { + "id": 506899409, + "labels": ["non issue"], + "number": 2181, + "title": " Joi.alternatives produces confusing message when used with nested object and `{ abortEarly: false }`", + "url": "https://github.com/hapijs/joi/issues/2181" + }, + { + "id": 506282593, + "labels": ["bug"], + "number": 2176, + "title": "joi.types() is missing `func` alias", + "url": "https://github.com/hapijs/joi/issues/2176" + }, + { + "id": 504105644, + "labels": ["documentation", "support"], + "number": 2173, + "title": "[Request] Allow mixing patch version", + "url": "https://github.com/hapijs/joi/issues/2173" + } + ], + "number": 163, + "url": "https://github.com/hapijs/joi/milestone/163", + "version": "16.1.8" + }, + { + "date": "2019-10-05T17:37:42Z", + "id": 4723324, + "issues": [ + { + "id": 502992707, + "labels": ["bug"], + "number": 2168, + "title": "Date fails to enforce format when value is a number string", + "url": "https://github.com/hapijs/joi/issues/2168" + } + ], + "number": 162, + "url": "https://github.com/hapijs/joi/milestone/162", + "version": "16.1.7" + }, + { + "date": "2019-10-05T03:41:01Z", + "id": 4712266, + "issues": [ + { + "id": 502861807, + "labels": ["bug"], + "number": 2167, + "title": "Error.captureStackTrace can't be used in all browser builds", + "url": "https://github.com/hapijs/joi/issues/2167" + }, + { + "id": 502462420, + "labels": ["bug"], + "number": 2165, + "title": "Cannot read property 'delete' of undefined", + "url": "https://github.com/hapijs/joi/issues/2165" + } + ], + "number": 161, + "url": "https://github.com/hapijs/joi/milestone/161", + "version": "16.1.6" + }, + { + "date": "2019-10-02T07:36:01Z", + "id": 4678539, + "issues": [ + { + "id": 499817149, + "labels": ["bug"], + "number": 2156, + "title": "node.get is not a function when validating", + "url": "https://github.com/hapijs/joi/issues/2156" + }, + { + "id": 498227884, + "labels": ["bug"], + "number": 2147, + "title": "Joi v16: TypeError issue with valid(Joi.ref(x)).error()", + "url": "https://github.com/hapijs/joi/issues/2147" + } + ], + "number": 160, + "url": "https://github.com/hapijs/joi/milestone/160", + "version": "16.1.5" + }, + { + "date": "2019-09-20T22:14:42Z", + "id": 4678511, + "issues": [ + { + "id": 496526120, + "labels": ["bug"], + "number": 2134, + "title": "Joi.any().default().describe() throws validation errors", + "url": "https://github.com/hapijs/joi/issues/2134" + } + ], + "number": 159, + "url": "https://github.com/hapijs/joi/milestone/159", + "version": "16.1.4" + }, + { + "date": "2019-09-20T21:57:44Z", + "id": 4673271, + "issues": [ + { + "id": 496276352, + "labels": ["bug"], + "number": 2131, + "title": "TypeError: false.byteLength is not a function", + "url": "https://github.com/hapijs/joi/issues/2131" + } + ], + "number": 158, + "url": "https://github.com/hapijs/joi/milestone/158", + "version": "16.1.3" + }, + { + "date": "2019-09-19T06:10:27Z", + "id": 4665584, + "issues": [ + { + "id": 495581507, + "labels": ["bug"], + "number": 2128, + "title": "when() fails when combined with prefs()", + "url": "https://github.com/hapijs/joi/issues/2128" + } + ], + "number": 157, + "url": "https://github.com/hapijs/joi/milestone/157", + "version": "16.1.2" + }, + { + "date": "2019-09-17T06:39:55Z", + "id": 4665447, + "issues": [ + { + "id": 494431026, + "labels": ["dependency"], + "number": 2119, + "title": "Use ^version", + "url": "https://github.com/hapijs/joi/issues/2119" + } + ], + "number": 156, + "url": "https://github.com/hapijs/joi/milestone/156", + "version": "16.1.1" + }, + { + "date": "2019-09-17T05:48:07Z", + "id": 4657957, + "issues": [ + { + "id": 494395930, + "labels": ["bug"], + "number": 2118, + "title": "array.items() fails to invalidate when custom item error is used", + "url": "https://github.com/hapijs/joi/issues/2118" + }, + { + "id": 494229372, + "labels": ["feature"], + "number": 2116, + "title": "Support `.when({ is, then })` without subject ref", + "url": "https://github.com/hapijs/joi/issues/2116" + } + ], + "number": 155, + "url": "https://github.com/hapijs/joi/milestone/155", + "version": "16.1.0" + }, + { + "date": "2019-09-13T17:39:25Z", + "id": 4652428, + "issues": [ + { + "id": 493302452, + "labels": ["bug"], + "number": 2113, + "title": "Valid emails are considered invalid", + "url": "https://github.com/hapijs/joi/issues/2113" + }, + { + "id": 493254773, + "labels": ["non issue"], + "number": 2111, + "title": "Joi.only is not a function ", + "url": "https://github.com/hapijs/joi/issues/2111" + } + ], + "number": 154, + "url": "https://github.com/hapijs/joi/milestone/154", + "version": "16.0.1" + }, + { + "date": "2019-09-11T22:59:28Z", + "id": 3833006, + "issues": [ + { + "id": 490676870, + "labels": ["bug"], + "number": 2103, + "title": "Support errors in manifest", + "url": "https://github.com/hapijs/joi/issues/2103" + }, + { + "id": 490668242, + "labels": ["bug", "breaking changes"], + "number": 2102, + "title": "Always convert -0 to 0", + "url": "https://github.com/hapijs/joi/issues/2102" + }, + { + "id": 490537727, + "labels": ["feature"], + "number": 2101, + "title": "Apply link.concat() on resolved schema", + "url": "https://github.com/hapijs/joi/issues/2101" + }, + { + "id": 490207007, + "labels": ["feature"], + "number": 2099, + "title": "Add when() break", + "url": "https://github.com/hapijs/joi/issues/2099" + }, + { + "id": 488462553, + "labels": ["bug"], + "number": 2097, + "title": "Number validation fails with \"1E3\"", + "url": "https://github.com/hapijs/joi/issues/2097" + }, + { + "id": 488408155, + "labels": ["feature"], + "number": 2096, + "title": "Apply link whens on linked schema, not the link", + "url": "https://github.com/hapijs/joi/issues/2096" + }, + { + "id": 487846687, + "labels": ["bug"], + "number": 2093, + "title": "Manifest type conflicts with key type", + "url": "https://github.com/hapijs/joi/issues/2093" + }, + { + "id": 487812688, + "labels": ["feature"], + "number": 2092, + "title": "Support Joi.in() for object keys", + "url": "https://github.com/hapijs/joi/issues/2092" + }, + { + "id": 487693904, + "labels": ["bug"], + "number": 2091, + "title": "\"-0\" throw number.unsafe", + "url": "https://github.com/hapijs/joi/issues/2091" + }, + { + "id": 487317502, + "labels": ["feature"], + "number": 2089, + "title": "Joi.in()", + "url": "https://github.com/hapijs/joi/issues/2089" + }, + { + "id": 487309224, + "labels": ["feature", "breaking changes"], + "number": 2088, + "title": "Always perform deep equal on valid() and invalid()", + "url": "https://github.com/hapijs/joi/issues/2088" + }, + { + "id": 486807081, + "labels": ["bug", "breaking changes"], + "number": 2087, + "title": "Fix comparison of array values (literals and references)", + "url": "https://github.com/hapijs/joi/issues/2087" + }, + { + "id": 486757521, + "labels": ["feature"], + "number": 2086, + "title": "Preference to change label to path edge instead of full path", + "url": "https://github.com/hapijs/joi/issues/2086" + }, + { + "id": 486749094, + "labels": ["bug"], + "number": 2085, + "title": "Default assert() to include stack", + "url": "https://github.com/hapijs/joi/issues/2085" + }, + { + "id": 486593052, + "labels": ["feature"], + "number": 2084, + "title": "Shared schemas in links", + "url": "https://github.com/hapijs/joi/issues/2084" + }, + { + "id": 486445237, + "labels": ["feature"], + "number": 2083, + "title": "Add a browser build to the github repo and npm package", + "url": "https://github.com/hapijs/joi/issues/2083" + }, + { + "id": 486433885, + "labels": ["bug"], + "number": 2082, + "title": "Fix error thrown in the browser build. Closes #2081", + "url": "https://github.com/hapijs/joi/pull/2082" + }, + { + "id": 486432248, + "labels": ["bug"], + "number": 2081, + "title": "The browser build (produced by webpack) throws an error when loading", + "url": "https://github.com/hapijs/joi/issues/2081" + }, + { + "id": 486177653, + "labels": ["feature"], + "number": 2080, + "title": "Named schema links", + "url": "https://github.com/hapijs/joi/issues/2080" + }, + { + "id": 486060001, + "labels": ["feature"], + "number": 2079, + "title": "Support `no` in when()", + "url": "https://github.com/hapijs/joi/issues/2079" + }, + { + "id": 486042042, + "labels": ["feature"], + "number": 2078, + "title": "Default `is` to Joi.invalid(null, false, 0, '').required()", + "url": "https://github.com/hapijs/joi/issues/2078" + }, + { + "id": 485961723, + "labels": ["breaking changes"], + "number": 2077, + "title": "Compile valid values into valid+override", + "url": "https://github.com/hapijs/joi/issues/2077" + }, + { + "id": 485948029, + "labels": ["feature"], + "number": 2076, + "title": "Allow/disallow list override", + "url": "https://github.com/hapijs/joi/issues/2076" + }, + { + "id": 485908614, + "labels": ["feature"], + "number": 2075, + "title": "Log when() partials", + "url": "https://github.com/hapijs/joi/issues/2075" + }, + { + "id": 485074471, + "labels": ["feature"], + "number": 2074, + "title": "Compile function into Joi.custom()", + "url": "https://github.com/hapijs/joi/issues/2074" + }, + { + "id": 485053537, + "labels": ["feature"], + "number": 2073, + "title": "When object.pattern() matches option is not an array(), apply to each item", + "url": "https://github.com/hapijs/joi/issues/2073" + }, + { + "id": 485053397, + "labels": ["feature"], + "number": 2072, + "title": "Custom function error shortcut", + "url": "https://github.com/hapijs/joi/issues/2072" + }, + { + "id": 484626076, + "labels": ["bug"], + "number": 2068, + "title": "schema.describe() does not work, when default value is assigned to array in schema", + "url": "https://github.com/hapijs/joi/issues/2068" + }, + { + "id": 483713767, + "labels": ["breaking changes"], + "number": 2065, + "title": "Change alternatives to be consistent with other spread arguments", + "url": "https://github.com/hapijs/joi/issues/2065" + }, + { + "id": 483710438, + "labels": ["breaking changes"], + "number": 2064, + "title": "Throw on invalid schema during validation", + "url": "https://github.com/hapijs/joi/issues/2064" + }, + { + "id": 483676913, + "labels": ["bug", "feature", "breaking changes"], + "number": 2062, + "title": "Support chained when()", + "url": "https://github.com/hapijs/joi/issues/2062" + }, + { + "id": 483676765, + "labels": ["non issue"], + "number": 2061, + "title": "Keep switch as single condition on when() and conditional()", + "url": "https://github.com/hapijs/joi/issues/2061" + }, + { + "id": 483676522, + "labels": ["bug", "breaking changes"], + "number": 2060, + "title": "object.assert() ref should be relative to parent, not self", + "url": "https://github.com/hapijs/joi/issues/2060" + }, + { + "id": 483555336, + "labels": ["feature"], + "number": 2059, + "title": "Support multiple usage of same schema with id", + "url": "https://github.com/hapijs/joi/issues/2059" + }, + { + "id": 482700993, + "labels": ["feature"], + "number": 2056, + "title": "Schema test coverage", + "url": "https://github.com/hapijs/joi/issues/2056" + }, + { + "id": 482682692, + "labels": ["breaking changes"], + "number": 2054, + "title": "Rename alternatives.when() to alternatives.conditional()", + "url": "https://github.com/hapijs/joi/issues/2054" + }, + { + "id": 481957401, + "labels": ["feature"], + "number": 2051, + "title": "Support for combine schema: allOf, oneOf, anyOf", + "url": "https://github.com/hapijs/joi/issues/2051" + }, + { + "id": 481431498, + "labels": ["breaking changes"], + "number": 2049, + "title": "Compile literals into any type with exact literal", + "url": "https://github.com/hapijs/joi/issues/2049" + }, + { + "id": 481389665, + "labels": ["bug"], + "number": 2048, + "title": "Replace marker with Symbol.for()", + "url": "https://github.com/hapijs/joi/issues/2048" + }, + { + "id": 480986370, + "labels": ["feature", "breaking changes"], + "number": 2046, + "title": "Cast multi values of into a single type with valid()", + "url": "https://github.com/hapijs/joi/issues/2046" + }, + { + "id": 479424418, + "labels": ["feature", "breaking changes"], + "number": 2041, + "title": "Exclude error stack trace by default", + "url": "https://github.com/hapijs/joi/issues/2041" + }, + { + "id": 479318280, + "labels": ["bug", "breaking changes"], + "number": 2040, + "title": "Replace boolean.insensitive() with sensitive() and not apply to allow()", + "url": "https://github.com/hapijs/joi/issues/2040" + }, + { + "id": 479242013, + "labels": ["feature"], + "number": 2039, + "title": "Allow mapping flags to rule methods with a different name", + "url": "https://github.com/hapijs/joi/issues/2039" + }, + { + "id": 479231804, + "labels": ["breaking changes"], + "number": 2038, + "title": "Stop matching object patterns once a match is found", + "url": "https://github.com/hapijs/joi/issues/2038" + }, + { + "id": 479228909, + "labels": ["breaking changes", "release notes"], + "number": 2037, + "title": "v16.0.0 Release Notes", + "url": "https://github.com/hapijs/joi/issues/2037" + }, + { + "id": 479209642, + "labels": ["breaking changes"], + "number": 2036, + "title": "{ result, error } changed to error undefined instead of null", + "url": "https://github.com/hapijs/joi/issues/2036" + }, + { + "id": 478895524, + "labels": ["feature"], + "number": 2035, + "title": "Skip error rendering preference", + "url": "https://github.com/hapijs/joi/issues/2035" + }, + { + "id": 478859408, + "labels": ["breaking changes"], + "number": 2034, + "title": "Consolidate date format errors", + "url": "https://github.com/hapijs/joi/issues/2034" + }, + { + "id": 478858891, + "labels": ["feature"], + "number": 2033, + "title": "msg() template function to access other messages", + "url": "https://github.com/hapijs/joi/issues/2033" + }, + { + "id": 478858236, + "labels": ["feature"], + "number": 2032, + "title": "Support custom sync functions for rules", + "url": "https://github.com/hapijs/joi/issues/2032" + }, + { + "id": 478670587, + "labels": ["breaking changes"], + "number": 2031, + "title": "Remove object and array string coerce", + "url": "https://github.com/hapijs/joi/issues/2031" + }, + { + "id": 478626408, + "labels": ["bug", "breaking changes"], + "number": 2030, + "title": "string.isoDate() fails on allow() and convert:false", + "url": "https://github.com/hapijs/joi/issues/2030" + }, + { + "id": 478291888, + "labels": ["feature"], + "number": 2027, + "title": "Support templates as object.assert() subject", + "url": "https://github.com/hapijs/joi/issues/2027" + }, + { + "id": 478291691, + "labels": ["breaking changes"], + "number": 2026, + "title": "Change object.assert error context and rule argument name", + "url": "https://github.com/hapijs/joi/issues/2026" + }, + { + "id": 478179010, + "labels": ["breaking changes"], + "number": 2024, + "title": "Remove binary and string encoding support from the browser", + "url": "https://github.com/hapijs/joi/issues/2024" + }, + { + "id": 477543341, + "labels": ["feature"], + "number": 2023, + "title": "Rule arguments validation", + "url": "https://github.com/hapijs/joi/issues/2023" + }, + { + "id": 477519304, + "labels": ["feature"], + "number": 2022, + "title": "Support reverse order coerce", + "url": "https://github.com/hapijs/joi/issues/2022" + }, + { + "id": 476963802, + "labels": ["non issue"], + "number": 2019, + "title": "Consolidate refs with args", + "url": "https://github.com/hapijs/joi/issues/2019" + }, + { + "id": 476963390, + "labels": ["feature"], + "number": 2018, + "title": "Support joi schema in refs assert", + "url": "https://github.com/hapijs/joi/issues/2018" + }, + { + "id": 476746095, + "labels": ["non issue"], + "number": 2016, + "title": "Consolidate refs assert's message/code", + "url": "https://github.com/hapijs/joi/issues/2016" + }, + { + "id": 476744784, + "labels": ["bug"], + "number": 2015, + "title": "Ensure all levels of coerce are only called on non-undefined values", + "url": "https://github.com/hapijs/joi/issues/2015" + }, + { + "id": 476744529, + "labels": ["non issue"], + "number": 2014, + "title": "Change all _methods used on schema to use definition", + "url": "https://github.com/hapijs/joi/issues/2014" + }, + { + "id": 476744263, + "labels": ["feature"], + "number": 2013, + "title": "Expose all internal extend() options externally", + "url": "https://github.com/hapijs/joi/issues/2013" + }, + { + "id": 476734404, + "labels": ["breaking changes"], + "number": 2012, + "title": "Rename func to function", + "url": "https://github.com/hapijs/joi/issues/2012" + }, + { + "id": 476519704, + "labels": ["breaking changes"], + "number": 2010, + "title": "New extension API", + "url": "https://github.com/hapijs/joi/issues/2010" + }, + { + "id": 476347403, + "labels": ["feature"], + "number": 2009, + "title": "Global defaults", + "url": "https://github.com/hapijs/joi/issues/2009" + }, + { + "id": 475853465, + "labels": ["breaking changes"], + "number": 2007, + "title": "Change Infinity errors from any.invalid to number.infinity", + "url": "https://github.com/hapijs/joi/issues/2007" + }, + { + "id": 475843489, + "labels": ["breaking changes"], + "number": 2006, + "title": "Change error code any.empty to string.empty", + "url": "https://github.com/hapijs/joi/issues/2006" + }, + { + "id": 475842438, + "labels": ["bug"], + "number": 2005, + "title": "Merging of two empty() should allow '' if it was explicitly defined", + "url": "https://github.com/hapijs/joi/issues/2005" + }, + { + "id": 474456413, + "labels": ["feature"], + "number": 2002, + "title": "Remove prefs schema validation", + "url": "https://github.com/hapijs/joi/issues/2002" + }, + { + "id": 474373731, + "labels": ["non issue"], + "number": 2001, + "title": "Remove joi.defaults()", + "url": "https://github.com/hapijs/joi/issues/2001" + }, + { + "id": 474111637, + "labels": ["documentation"], + "number": 1999, + "title": "Fix outdated use of Joi.func().ref()", + "url": "https://github.com/hapijs/joi/pull/1999" + }, + { + "id": 474005263, + "labels": ["feature", "breaking changes"], + "number": 1998, + "title": "Split validate() to sync and async versions", + "url": "https://github.com/hapijs/joi/issues/1998" + }, + { + "id": 473200030, + "labels": ["breaking changes"], + "number": 1995, + "title": "Replace strip flag with result flag", + "url": "https://github.com/hapijs/joi/issues/1995" + }, + { + "id": 473069049, + "labels": ["bug"], + "number": 1994, + "title": "Joi.string().uri() accepts 'http:/' as valid URL", + "url": "https://github.com/hapijs/joi/issues/1994" + }, + { + "id": 473034640, + "labels": ["feature"], + "number": 1993, + "title": "Root reference", + "url": "https://github.com/hapijs/joi/issues/1993" + }, + { + "id": 472450953, + "labels": ["feature", "breaking changes"], + "number": 1987, + "title": "Extension build() support", + "url": "https://github.com/hapijs/joi/issues/1987" + }, + { + "id": 472450722, + "labels": ["feature"], + "number": 1986, + "title": "Improve schema description validation", + "url": "https://github.com/hapijs/joi/issues/1986" + }, + { + "id": 471952255, + "labels": ["breaking changes"], + "number": 1985, + "title": "Refactor root", + "url": "https://github.com/hapijs/joi/issues/1985" + }, + { + "id": 471479727, + "labels": ["breaking changes"], + "number": 1983, + "title": "Change any.notes() to any.note() and require separate arguments", + "url": "https://github.com/hapijs/joi/issues/1983" + }, + { + "id": 471476892, + "labels": ["breaking changes"], + "number": 1982, + "title": "Change any.tags() to any.tag() and require separate arguments", + "url": "https://github.com/hapijs/joi/issues/1982" + }, + { + "id": 471473774, + "labels": ["breaking changes"], + "number": 1981, + "title": "Change any.example() to append by default", + "url": "https://github.com/hapijs/joi/issues/1981" + }, + { + "id": 471463151, + "labels": ["breaking changes"], + "number": 1980, + "title": "Rename string.regex() to string.pattern()", + "url": "https://github.com/hapijs/joi/issues/1980" + }, + { + "id": 470833796, + "labels": ["feature"], + "number": 1979, + "title": "Link to root (regardless of depth)", + "url": "https://github.com/hapijs/joi/issues/1979" + }, + { + "id": 470823226, + "labels": ["breaking changes"], + "number": 1978, + "title": "Change only() to flag instead of alias of valid()", + "url": "https://github.com/hapijs/joi/issues/1978" + }, + { + "id": 470822381, + "labels": ["breaking changes"], + "number": 1977, + "title": "Replace date multiple and timestamp flag with format", + "url": "https://github.com/hapijs/joi/issues/1977" + }, + { + "id": 470741373, + "labels": ["breaking changes"], + "number": 1976, + "title": "Rename object.allowUnknown error to object.unknown", + "url": "https://github.com/hapijs/joi/issues/1976" + }, + { + "id": 470708834, + "labels": ["breaking changes"], + "number": 1975, + "title": "Remove description for `default()` function", + "url": "https://github.com/hapijs/joi/issues/1975" + }, + { + "id": 470699519, + "labels": ["bug"], + "number": 1974, + "title": "Deep clone all values returned in describe()", + "url": "https://github.com/hapijs/joi/issues/1974" + }, + { + "id": 470316560, + "labels": ["bug"], + "number": 1973, + "title": "Behavior of .concat() with tests redefinition", + "url": "https://github.com/hapijs/joi/issues/1973" + }, + { + "id": 470264502, + "labels": ["feature", "breaking changes"], + "number": 1972, + "title": "Applying `raw` after successful validation", + "url": "https://github.com/hapijs/joi/issues/1972" + }, + { + "id": 467500728, + "labels": ["feature", "breaking changes"], + "number": 1968, + "title": "Repalce lazy with link", + "url": "https://github.com/hapijs/joi/issues/1968" + }, + { + "id": 465791028, + "labels": ["support"], + "number": 1965, + "title": "How to properly detect domains?", + "url": "https://github.com/hapijs/joi/issues/1965" + }, + { + "id": 463097176, + "labels": ["feature"], + "number": 1962, + "title": "Don't require pre function to take 3 arguments", + "url": "https://github.com/hapijs/joi/issues/1962" + }, + { + "id": 462988293, + "labels": ["bug", "breaking changes"], + "number": 1961, + "title": "Lazy once ignored when using with when()", + "url": "https://github.com/hapijs/joi/issues/1961" + }, + { + "id": 462816562, + "labels": ["bug", "breaking changes"], + "number": 1960, + "title": "Fix object peer dependencies error path", + "url": "https://github.com/hapijs/joi/issues/1960" + }, + { + "id": 462816231, + "labels": ["feature"], + "number": 1959, + "title": "Debug tools", + "url": "https://github.com/hapijs/joi/issues/1959" + }, + { + "id": 462502268, + "labels": ["feature"], + "number": 1958, + "title": "Warnings", + "url": "https://github.com/hapijs/joi/issues/1958" + }, + { + "id": 462414296, + "labels": ["feature"], + "number": 1957, + "title": "Feature: Marking options as deprecated", + "url": "https://github.com/hapijs/joi/issues/1957" + }, + { + "id": 462370766, + "labels": ["breaking changes"], + "number": 1956, + "title": "Extension messages override base", + "url": "https://github.com/hapijs/joi/issues/1956" + }, + { + "id": 462185076, + "labels": ["feature"], + "number": 1954, + "title": "Schema specialization", + "url": "https://github.com/hapijs/joi/issues/1954" + }, + { + "id": 461925863, + "labels": ["feature"], + "number": 1952, + "title": "Support fork into array and alternatives", + "url": "https://github.com/hapijs/joi/issues/1952" + }, + { + "id": 461924986, + "labels": ["breaking changes"], + "number": 1951, + "title": "Remove requiredKeys(), optionalKeys(), and forbiddenKeys()", + "url": "https://github.com/hapijs/joi/issues/1951" + }, + { + "id": 461924814, + "labels": ["feature"], + "number": 1950, + "title": "any.fork()", + "url": "https://github.com/hapijs/joi/issues/1950" + }, + { + "id": 461873853, + "labels": ["feature", "breaking changes"], + "number": 1949, + "title": "Replace Joi.reach() with schema.extract()", + "url": "https://github.com/hapijs/joi/issues/1949" + }, + { + "id": 461811241, + "labels": ["bug"], + "number": 1948, + "title": "Cannot read property 'ancestors' of null", + "url": "https://github.com/hapijs/joi/issues/1948" + }, + { + "id": 461629913, + "labels": ["breaking changes"], + "number": 1946, + "title": "Remove applyFunctionToChildren()", + "url": "https://github.com/hapijs/joi/issues/1946" + }, + { + "id": 461402649, + "labels": ["bug", "breaking changes"], + "number": 1945, + "title": "Throw when Joi.reach() is reaching into non-object", + "url": "https://github.com/hapijs/joi/issues/1945" + }, + { + "id": 461384308, + "labels": ["breaking changes"], + "number": 1944, + "title": "Remove any._getLabel()", + "url": "https://github.com/hapijs/joi/issues/1944" + }, + { + "id": 461382541, + "labels": ["breaking changes"], + "number": 1943, + "title": "Rename any.schemaType to any.type", + "url": "https://github.com/hapijs/joi/issues/1943" + }, + { + "id": 461379629, + "labels": ["breaking changes"], + "number": 1942, + "title": "Rename object.type() to object.instance()", + "url": "https://github.com/hapijs/joi/issues/1942" + }, + { + "id": 461354094, + "labels": ["breaking changes"], + "number": 1941, + "title": "Remove root.validate() and root.describe()", + "url": "https://github.com/hapijs/joi/issues/1941" + }, + { + "id": 461351325, + "labels": ["bug"], + "number": 1940, + "title": "Array validation with .error()", + "url": "https://github.com/hapijs/joi/issues/1940" + }, + { + "id": 461345460, + "labels": ["non issue"], + "number": 1939, + "title": "Replace attempt() with assert() alias", + "url": "https://github.com/hapijs/joi/issues/1939" + }, + { + "id": 461330029, + "labels": ["breaking changes"], + "number": 1938, + "title": "Remove callback support", + "url": "https://github.com/hapijs/joi/issues/1938" + }, + { + "id": 461131382, + "labels": ["feature"], + "number": 1937, + "title": "Support post-validation async operations", + "url": "https://github.com/hapijs/joi/issues/1937" + }, + { + "id": 460591392, + "labels": ["non issue"], + "number": 1935, + "title": "Rename var to expression and x", + "url": "https://github.com/hapijs/joi/issues/1935" + }, + { + "id": 460356274, + "labels": ["feature"], + "number": 1932, + "title": "Support base parameters in extend()", + "url": "https://github.com/hapijs/joi/issues/1932" + }, + { + "id": 460094725, + "labels": ["feature"], + "number": 1930, + "title": "Template calculations", + "url": "https://github.com/hapijs/joi/issues/1930" + }, + { + "id": 459590459, + "labels": ["feature"], + "number": 1929, + "title": "Cast date and boolean to number", + "url": "https://github.com/hapijs/joi/issues/1929" + }, + { + "id": 459503684, + "labels": ["feature"], + "number": 1925, + "title": "Cast to string", + "url": "https://github.com/hapijs/joi/issues/1925" + }, + { + "id": 459503640, + "labels": ["non issue"], + "number": 1924, + "title": "Move dateFormat pref out of errors", + "url": "https://github.com/hapijs/joi/issues/1924" + }, + { + "id": 459442841, + "labels": ["feature"], + "number": 1922, + "title": "Support ref into Set and Map cast values", + "url": "https://github.com/hapijs/joi/issues/1922" + }, + { + "id": 459439774, + "labels": ["breaking changes"], + "number": 1921, + "title": "Replace raw flag with result flag in description", + "url": "https://github.com/hapijs/joi/issues/1921" + }, + { + "id": 459439292, + "labels": ["non issue"], + "number": 1920, + "title": "Remove support for raw(false)", + "url": "https://github.com/hapijs/joi/issues/1920" + }, + { + "id": 459434975, + "labels": ["bug"], + "number": 1919, + "title": "Cannot combine function rules with object keys", + "url": "https://github.com/hapijs/joi/issues/1919" + }, + { + "id": 459079541, + "labels": ["feature"], + "number": 1917, + "title": "Complex conditional validation", + "url": "https://github.com/hapijs/joi/issues/1917" + }, + { + "id": 457947429, + "labels": ["feature"], + "number": 1914, + "title": "A way to cast the result of a array to Set and object to Map", + "url": "https://github.com/hapijs/joi/issues/1914" + }, + { + "id": 457929916, + "labels": ["breaking changes"], + "number": 1913, + "title": "Prevent mixing different versions of joi schema types", + "url": "https://github.com/hapijs/joi/issues/1913" + }, + { + "id": 457825597, + "labels": ["bug", "breaking changes"], + "number": 1912, + "title": "Identify blocked schema (valid + invalid = no valid options)", + "url": "https://github.com/hapijs/joi/issues/1912" + }, + { + "id": 457796385, + "labels": ["bug", "breaking changes"], + "number": 1911, + "title": "Unknown object keys ignore abortEarly flag", + "url": "https://github.com/hapijs/joi/issues/1911" + }, + { + "id": 457266750, + "labels": ["feature"], + "number": 1907, + "title": "Support ref in prefs.errors.language", + "url": "https://github.com/hapijs/joi/issues/1907" + }, + { + "id": 456744255, + "labels": ["feature"], + "number": 1906, + "title": "Precompile prefs.messages and extensions", + "url": "https://github.com/hapijs/joi/issues/1906" + }, + { + "id": 456732430, + "labels": ["breaking changes"], + "number": 1905, + "title": "Move error related prefs to `errors`", + "url": "https://github.com/hapijs/joi/issues/1905" + }, + { + "id": 456724595, + "labels": ["breaking changes"], + "number": 1904, + "title": "Remove ability to change template for implicit label prefix in error messages", + "url": "https://github.com/hapijs/joi/issues/1904" + }, + { + "id": 456724432, + "labels": ["breaking changes"], + "number": 1903, + "title": "Remove implicit label prefix for error messages", + "url": "https://github.com/hapijs/joi/issues/1903" + }, + { + "id": 456700980, + "labels": ["breaking changes"], + "number": 1902, + "title": "Rename `language` preference to `messages`", + "url": "https://github.com/hapijs/joi/issues/1902" + }, + { + "id": 456700792, + "labels": ["breaking changes"], + "number": 1901, + "title": "Rename messages.wrapArrays with wrapArrays", + "url": "https://github.com/hapijs/joi/issues/1901" + }, + { + "id": 456581789, + "labels": ["breaking changes"], + "number": 1898, + "title": "Change object.rename() from description to { regex } when using from pattern", + "url": "https://github.com/hapijs/joi/issues/1898" + }, + { + "id": 456508216, + "labels": ["feature"], + "number": 1896, + "title": "Support `{.}` in error for value", + "url": "https://github.com/hapijs/joi/issues/1896" + }, + { + "id": 456491132, + "labels": ["breaking changes"], + "number": 1895, + "title": "Remove isJoi from Errors.Report", + "url": "https://github.com/hapijs/joi/issues/1895" + }, + { + "id": 456480917, + "labels": ["feature"], + "number": 1894, + "title": "Pre-compile error messages", + "url": "https://github.com/hapijs/joi/issues/1894" + }, + { + "id": 456476176, + "labels": ["breaking changes"], + "number": 1893, + "title": "Language format requires # prefix for error context", + "url": "https://github.com/hapijs/joi/issues/1893" + }, + { + "id": 456467047, + "labels": ["breaking changes"], + "number": 1892, + "title": "Change \"context:\" ref prefix in errors to \"ref:global:\"", + "url": "https://github.com/hapijs/joi/issues/1892" + }, + { + "id": 456465624, + "labels": ["breaking changes"], + "number": 1891, + "title": "Replace ref.type description to ref.ref", + "url": "https://github.com/hapijs/joi/issues/1891" + }, + { + "id": 456459379, + "labels": ["breaking changes"], + "number": 1890, + "title": "Replace {{!var}} notation with {var}", + "url": "https://github.com/hapijs/joi/issues/1890" + }, + { + "id": 456459286, + "labels": ["breaking changes"], + "number": 1889, + "title": "Replace escapeHtml with escapeErrors", + "url": "https://github.com/hapijs/joi/issues/1889" + }, + { + "id": 456395797, + "labels": ["breaking changes"], + "number": 1888, + "title": "Joi.ref() is not a function", + "url": "https://github.com/hapijs/joi/issues/1888" + }, + { + "id": 456104664, + "labels": ["breaking changes"], + "number": 1887, + "title": "Remove object.rename.regex.multiple and object.rename.regex.override errors", + "url": "https://github.com/hapijs/joi/issues/1887" + }, + { + "id": 456096365, + "labels": ["bug", "breaking changes"], + "number": 1886, + "title": "Change object.rename() override option to not delete existing if nothing match", + "url": "https://github.com/hapijs/joi/issues/1886" + }, + { + "id": 456056403, + "labels": ["feature"], + "number": 1885, + "title": "array().sort([{ order, by }])", + "url": "https://github.com/hapijs/joi/issues/1885" + }, + { + "id": 455853433, + "labels": ["bug"], + "number": 1884, + "title": "Fix: Exponential decimal #1876", + "url": "https://github.com/hapijs/joi/pull/1884" + }, + { + "id": 454836031, + "labels": ["feature"], + "number": 1881, + "title": "Mark rule for keep", + "url": "https://github.com/hapijs/joi/issues/1881" + }, + { + "id": 454489123, + "labels": ["breaking changes"], + "number": 1878, + "title": "Flatten language object", + "url": "https://github.com/hapijs/joi/issues/1878" + }, + { + "id": 454407272, + "labels": ["feature"], + "number": 1877, + "title": "Rule sets", + "url": "https://github.com/hapijs/joi/issues/1877" + }, + { + "id": 454147627, + "labels": ["bug"], + "number": 1876, + "title": "Joi.number() throws error for \"0.00000095\" string.", + "url": "https://github.com/hapijs/joi/issues/1876" + }, + { + "id": 454038061, + "labels": ["breaking changes"], + "number": 1875, + "title": "Labels only used on path edge", + "url": "https://github.com/hapijs/joi/issues/1875" + }, + { + "id": 454031351, + "labels": ["breaking changes"], + "number": 1874, + "title": "Remove flags argument from createError()", + "url": "https://github.com/hapijs/joi/issues/1874" + }, + { + "id": 453948415, + "labels": ["feature"], + "number": 1873, + "title": "Add object.schema() type support", + "url": "https://github.com/hapijs/joi/issues/1873" + }, + { + "id": 453941922, + "labels": ["breaking changes"], + "number": 1872, + "title": "Replace alternatives.child with alternatives.match error code", + "url": "https://github.com/hapijs/joi/issues/1872" + }, + { + "id": 453937112, + "labels": ["feature", "breaking changes"], + "number": 1870, + "title": "New alternatives.types error code", + "url": "https://github.com/hapijs/joi/issues/1870" + }, + { + "id": 453937038, + "labels": ["breaking changes"], + "number": 1869, + "title": "Remove support for string or array or errors return value from error() function", + "url": "https://github.com/hapijs/joi/issues/1869" + }, + { + "id": 453916870, + "labels": ["feature", "breaking changes"], + "number": 1867, + "title": "Bidirectional describe() <-> build()", + "url": "https://github.com/hapijs/joi/issues/1867" + }, + { + "id": 453915279, + "labels": ["feature"], + "number": 1866, + "title": "Support multiple languages at the same time", + "url": "https://github.com/hapijs/joi/issues/1866" + }, + { + "id": 453915229, + "labels": ["feature"], + "number": 1865, + "title": "Joi.ref() map option", + "url": "https://github.com/hapijs/joi/issues/1865" + }, + { + "id": 453914924, + "labels": ["breaking changes"], + "number": 1864, + "title": "Merge positive and negative number rules into single sign rule", + "url": "https://github.com/hapijs/joi/issues/1864" + }, + { + "id": 453912013, + "labels": ["feature"], + "number": 1862, + "title": "Consistently use Utils.assertOptions() in all rules with options", + "url": "https://github.com/hapijs/joi/issues/1862" + }, + { + "id": 453911526, + "labels": ["feature"], + "number": 1860, + "title": "when() switch statement", + "url": "https://github.com/hapijs/joi/issues/1860" + }, + { + "id": 453865198, + "labels": ["breaking changes"], + "number": 1859, + "title": "Remove any.createOverrideError()", + "url": "https://github.com/hapijs/joi/issues/1859" + }, + { + "id": 453864922, + "labels": ["breaking changes"], + "number": 1858, + "title": "Remove this from error() function", + "url": "https://github.com/hapijs/joi/issues/1858" + }, + { + "id": 453843674, + "labels": ["breaking changes"], + "number": 1857, + "title": "Remove self option from error()", + "url": "https://github.com/hapijs/joi/issues/1857" + }, + { + "id": 453841888, + "labels": ["breaking changes"], + "number": 1856, + "title": "Remove automatic example validation", + "url": "https://github.com/hapijs/joi/issues/1856" + }, + { + "id": 453807923, + "labels": ["bug"], + "number": 1854, + "title": ".rename() causes errors when nothing has to be renamed", + "url": "https://github.com/hapijs/joi/issues/1854" + }, + { + "id": 453759531, + "labels": ["breaking changes"], + "number": 1853, + "title": "Remove case flag", + "url": "https://github.com/hapijs/joi/issues/1853" + }, + { + "id": 453757908, + "labels": ["breaking changes"], + "number": 1852, + "title": "Remove trim flag", + "url": "https://github.com/hapijs/joi/issues/1852" + }, + { + "id": 453750204, + "labels": ["breaking changes"], + "number": 1851, + "title": "Remove byteAligned flag", + "url": "https://github.com/hapijs/joi/issues/1851" + }, + { + "id": 453748135, + "labels": ["breaking changes"], + "number": 1850, + "title": "Remove precision flag", + "url": "https://github.com/hapijs/joi/issues/1850" + }, + { + "id": 453723856, + "labels": ["bug"], + "number": 1849, + "title": "Error on unreachable when() statement", + "url": "https://github.com/hapijs/joi/issues/1849" + }, + { + "id": 453719995, + "labels": ["breaking changes"], + "number": 1848, + "title": "Forbid chaining when() calls when the first was not on alternatives type", + "url": "https://github.com/hapijs/joi/issues/1848" + }, + { + "id": 453717749, + "labels": ["bug"], + "number": 1847, + "title": "any.error() fails to clear self option in override call", + "url": "https://github.com/hapijs/joi/issues/1847" + }, + { + "id": 453647301, + "labels": ["breaking changes"], + "number": 1846, + "title": "Skip type check if valids fail", + "url": "https://github.com/hapijs/joi/issues/1846" + }, + { + "id": 452264252, + "labels": ["breaking changes"], + "number": 1843, + "title": "Change object and array errors to use path instead of nested errors", + "url": "https://github.com/hapijs/joi/issues/1843" + }, + { + "id": 451482607, + "labels": ["feature"], + "number": 1842, + "title": "String multiple email address", + "url": "https://github.com/hapijs/joi/pull/1842" + }, + { + "id": 451212859, + "labels": ["breaking changes"], + "number": 1840, + "title": "Limit array.single() to only non-array items", + "url": "https://github.com/hapijs/joi/issues/1840" + }, + { + "id": 451158024, + "labels": ["breaking changes"], + "number": 1839, + "title": "Remove Hoek.reach() options from Ref", + "url": "https://github.com/hapijs/joi/issues/1839" + }, + { + "id": 451129076, + "labels": ["bug"], + "number": 1838, + "title": "Unique tests duplicated on concat()", + "url": "https://github.com/hapijs/joi/issues/1838" + }, + { + "id": 451126529, + "labels": ["breaking changes"], + "number": 1837, + "title": "Perform base type conversions before extension pre", + "url": "https://github.com/hapijs/joi/issues/1837" + }, + { + "id": 451124684, + "labels": ["breaking changes"], + "number": 1836, + "title": "Apply array.single() regardless of options.convert", + "url": "https://github.com/hapijs/joi/issues/1836" + }, + { + "id": 451119672, + "labels": ["breaking changes"], + "number": 1835, + "title": "Run extension coerce only if options.convert is true", + "url": "https://github.com/hapijs/joi/issues/1835" + }, + { + "id": 451061071, + "labels": ["breaking changes"], + "number": 1834, + "title": "Remove isJoi from schema", + "url": "https://github.com/hapijs/joi/issues/1834" + }, + { + "id": 451005508, + "labels": ["bug"], + "number": 1833, + "title": "Array items using references to array peers are ignored in order of processing", + "url": "https://github.com/hapijs/joi/issues/1833" + }, + { + "id": 451000291, + "labels": ["breaking changes"], + "number": 1832, + "title": "Change reference view in array item rules", + "url": "https://github.com/hapijs/joi/issues/1832" + }, + { + "id": 450938778, + "labels": ["breaking changes"], + "number": 1831, + "title": "Move func().ref() to object().ref()", + "url": "https://github.com/hapijs/joi/issues/1831" + }, + { + "id": 450933919, + "labels": ["breaking changes"], + "number": 1830, + "title": "Change Ref to class", + "url": "https://github.com/hapijs/joi/issues/1830" + }, + { + "id": 450038000, + "labels": ["breaking changes"], + "number": 1828, + "title": "Remove isRegExp from object.rename description", + "url": "https://github.com/hapijs/joi/issues/1828" + }, + { + "id": 449688315, + "labels": ["bug", "breaking changes"], + "number": 1827, + "title": "string min/max/length description missing encoding", + "url": "https://github.com/hapijs/joi/issues/1827" + }, + { + "id": 449684885, + "labels": ["bug"], + "number": 1826, + "title": "string.truncate() doesn't account for max with ref", + "url": "https://github.com/hapijs/joi/issues/1826" + }, + { + "id": 449679605, + "labels": ["bug", "breaking changes"], + "number": 1825, + "title": "Apply only last min/max/length rules", + "url": "https://github.com/hapijs/joi/issues/1825" + }, + { + "id": 449669944, + "labels": ["bug", "breaking changes"], + "number": 1824, + "title": "string methods change provided options", + "url": "https://github.com/hapijs/joi/issues/1824" + }, + { + "id": 449547905, + "labels": ["breaking changes"], + "number": 1823, + "title": "Description changes", + "url": "https://github.com/hapijs/joi/issues/1823" + }, + { + "id": 449361548, + "labels": ["bug", "breaking changes"], + "number": 1822, + "title": "Inconsistent reference error reporting", + "url": "https://github.com/hapijs/joi/issues/1822" + }, + { + "id": 449070784, + "labels": ["feature"], + "number": 1819, + "title": "Reduce reach", + "url": "https://github.com/hapijs/joi/pull/1819" + }, + { + "id": 445894700, + "labels": ["feature"], + "number": 1812, + "title": "Multiple email address validation", + "url": "https://github.com/hapijs/joi/issues/1812" + }, + { + "id": 443012238, + "labels": ["feature"], + "number": 1807, + "title": "Ability to perform custom calculations on referenced fields ", + "url": "https://github.com/hapijs/joi/issues/1807" + }, + { + "id": 441845404, + "labels": ["bug"], + "number": 1806, + "title": "Number validation fails with a valid number (\".30\")", + "url": "https://github.com/hapijs/joi/issues/1806" + }, + { + "id": 437663458, + "labels": ["bug"], + "number": 1796, + "title": "fix: copy object including Symbols", + "url": "https://github.com/hapijs/joi/pull/1796" + }, + { + "id": 428598360, + "labels": ["bug", "breaking changes"], + "number": 1778, + "title": "Make certain rules (min/max/length) override themselves revisited", + "url": "https://github.com/hapijs/joi/issues/1778" + }, + { + "id": 427228413, + "labels": ["bug"], + "number": 1770, + "title": "Don't delete object key when it equals the rename.to in a rename with regex", + "url": "https://github.com/hapijs/joi/pull/1770" + }, + { + "id": 427194779, + "labels": ["non issue"], + "number": 1769, + "title": "Merge v14 changes", + "url": "https://github.com/hapijs/joi/pull/1769" + }, + { + "id": 427162986, + "labels": ["non issue"], + "number": 1767, + "title": "V14 temp", + "url": "https://github.com/hapijs/joi/pull/1767" + }, + { + "id": 426112360, + "labels": ["feature", "breaking changes"], + "number": 1762, + "title": "Customize formatting for dates in error messages of min/max/greater/less (with ISO default)", + "url": "https://github.com/hapijs/joi/issues/1762" + }, + { + "id": 419128109, + "labels": ["feature"], + "number": 1746, + "title": "Validate base64 URI safe strings", + "url": "https://github.com/hapijs/joi/issues/1746" + }, + { + "id": 415097817, + "labels": ["feature"], + "number": 1737, + "title": "Translate validation messages based on header request", + "url": "https://github.com/hapijs/joi/issues/1737" + }, + { + "id": 415055516, + "labels": ["bug"], + "number": 1736, + "title": "truthy() / falsy() values apply when convert is false", + "url": "https://github.com/hapijs/joi/issues/1736" + }, + { + "id": 414141121, + "labels": ["bug"], + "number": 1732, + "title": "Joi.string().uri() accepts \"https://\" as a valid url", + "url": "https://github.com/hapijs/joi/issues/1732" + }, + { + "id": 413075250, + "labels": ["feature"], + "number": 1730, + "title": "Continue array validation even if items() fails", + "url": "https://github.com/hapijs/joi/issues/1730" + }, + { + "id": 410816329, + "labels": ["feature"], + "number": 1727, + "title": "Caching for strings / numbers / booleans", + "url": "https://github.com/hapijs/joi/issues/1727" + }, + { + "id": 409492570, + "labels": ["feature"], + "number": 1723, + "title": "Allow validate options to be passed through assert/attempt #1722", + "url": "https://github.com/hapijs/joi/pull/1723" + }, + { + "id": 409030086, + "labels": ["feature"], + "number": 1722, + "title": "Check all errors on joi.assert and joi.attempt", + "url": "https://github.com/hapijs/joi/issues/1722" + }, + { + "id": 401290660, + "labels": ["feature"], + "number": 1705, + "title": "Validate URI domain", + "url": "https://github.com/hapijs/joi/issues/1705" + }, + { + "id": 400388491, + "labels": ["feature"], + "number": 1702, + "title": "Ref inside top-level array items/ordered", + "url": "https://github.com/hapijs/joi/issues/1702" + }, + { + "id": 398033304, + "labels": ["feature"], + "number": 1696, + "title": "Joi should not strip non-enumerable properties of an object", + "url": "https://github.com/hapijs/joi/issues/1696" + }, + { + "id": 397884387, + "labels": ["bug", "feature"], + "number": 1695, + "title": "Support schema keys with '.' (without forcing path reach)", + "url": "https://github.com/hapijs/joi/issues/1695" + }, + { + "id": 392508641, + "labels": ["non issue"], + "number": 1687, + "title": "Validation fails with valid UUID 3", + "url": "https://github.com/hapijs/joi/issues/1687" + }, + { + "id": 381001678, + "labels": ["feature"], + "number": 1652, + "title": "Throw typed ValidationErrors", + "url": "https://github.com/hapijs/joi/pull/1652" + }, + { + "id": 380586757, + "labels": ["feature", "breaking changes"], + "number": 1651, + "title": "Reference above parent. Closes #1650", + "url": "https://github.com/hapijs/joi/pull/1651" + }, + { + "id": 380586560, + "labels": ["feature", "breaking changes"], + "number": 1650, + "title": "Support references above the parent", + "url": "https://github.com/hapijs/joi/issues/1650" + }, + { + "id": 379665617, + "labels": ["non issue"], + "number": 1648, + "title": "Move object rename to own function", + "url": "https://github.com/hapijs/joi/pull/1648" + }, + { + "id": 379639244, + "labels": ["breaking changes"], + "number": 1646, + "title": "Remove flatten arguments. Closes #1644", + "url": "https://github.com/hapijs/joi/pull/1646" + }, + { + "id": 379573789, + "labels": ["feature"], + "number": 1645, + "title": "Support self references. Closes #1569", + "url": "https://github.com/hapijs/joi/pull/1645" + }, + { + "id": 379563908, + "labels": ["breaking changes"], + "number": 1644, + "title": "Remove all arguments flattening", + "url": "https://github.com/hapijs/joi/issues/1644" + }, + { + "id": 373930207, + "labels": ["feature", "breaking changes"], + "number": 1623, + "title": "Check for valid/invalid values after conversion only", + "url": "https://github.com/hapijs/joi/issues/1623" + }, + { + "id": 369706091, + "labels": ["feature"], + "number": 1613, + "title": "Support ISO 8601 duration as a string validator", + "url": "https://github.com/hapijs/joi/pull/1613" + }, + { + "id": 369201050, + "labels": ["feature"], + "number": 1612, + "title": "Validate ISO Duration string", + "url": "https://github.com/hapijs/joi/issues/1612" + }, + { + "id": 367630177, + "labels": ["feature", "breaking changes"], + "number": 1606, + "title": "schema.describe minor issues and feature suggestions", + "url": "https://github.com/hapijs/joi/issues/1606" + }, + { + "id": 351422384, + "labels": ["feature"], + "number": 1569, + "title": "Allow self references", + "url": "https://github.com/hapijs/joi/issues/1569" + }, + { + "id": 336638596, + "labels": ["feature"], + "number": 1535, + "title": "failover() support for default on errors", + "url": "https://github.com/hapijs/joi/issues/1535" + }, + { + "id": 305889892, + "labels": ["feature"], + "number": 1457, + "title": "Specify required matches for .pattern()", + "url": "https://github.com/hapijs/joi/issues/1457" + }, + { + "id": 289759876, + "labels": ["feature"], + "number": 1403, + "title": "Support regexp capture group for rename ", + "url": "https://github.com/hapijs/joi/issues/1403" + }, + { + "id": 248201113, + "labels": ["feature"], + "number": 1264, + "title": "Override rule message with any.message() rule", + "url": "https://github.com/hapijs/joi/issues/1264" + }, + { + "id": 242526169, + "labels": ["feature", "support"], + "number": 1244, + "title": "Throw typed errors", + "url": "https://github.com/hapijs/joi/issues/1244" + }, + { + "id": 160444878, + "labels": ["feature"], + "number": 925, + "title": "Validating a FQDN", + "url": "https://github.com/hapijs/joi/issues/925" + }, + { + "id": 85263211, + "labels": ["feature"], + "number": 667, + "title": "Validate a number, which depends on other validate numbers", + "url": "https://github.com/hapijs/joi/issues/667" + } + ], + "number": 138, + "url": "https://github.com/hapijs/joi/milestone/138", + "version": "16.0.0" + }, + { + "date": "2019-08-16T04:02:00Z", + "id": 4577328, + "issues": [ + { + "id": 481389133, + "labels": ["bug"], + "number": 2047, + "title": "Replace marker with Symbol.for()", + "url": "https://github.com/hapijs/joi/issues/2047" + } + ], + "number": 152, + "url": "https://github.com/hapijs/joi/milestone/152", + "version": "15.1.1" + }, + { + "date": "2019-06-22T23:41:14Z", + "id": 4432663, + "issues": [ + { + "id": 459519505, + "labels": ["feature"], + "number": 1926, + "title": "Add legacy API", + "url": "https://github.com/hapijs/joi/issues/1926" + } + ], + "number": 150, + "url": "https://github.com/hapijs/joi/milestone/150", + "version": "15.1.0" + }, + { + "date": "2019-05-13T08:11:12Z", + "id": 4307781, + "issues": [ + { + "id": 443074958, + "labels": ["bug"], + "number": 1808, + "title": "bool() cannot be binded", + "url": "https://github.com/hapijs/joi/issues/1808" + } + ], + "number": 149, + "url": "https://github.com/hapijs/joi/milestone/149", + "version": "15.0.3" + }, + { + "date": "2019-05-08T15:05:14Z", + "id": 4296105, + "issues": [ + { + "id": 438895502, + "labels": ["bug"], + "number": 1801, + "title": "remove strip from defaults now that it has been removed", + "url": "https://github.com/hapijs/joi/pull/1801" + } + ], + "number": 148, + "url": "https://github.com/hapijs/joi/milestone/148", + "version": "15.0.2" + }, + { + "date": "2019-04-30T15:46:07Z", + "id": 4206402, + "issues": [ + { + "id": 425289224, + "labels": ["bug"], + "number": 1761, + "title": "Validate object keys related to another value", + "url": "https://github.com/hapijs/joi/issues/1761" + }, + { + "id": 421919014, + "labels": ["bug", "breaking changes"], + "number": 1753, + "title": "Override extension language", + "url": "https://github.com/hapijs/joi/issues/1753" + }, + { + "id": 420564025, + "labels": ["bug"], + "number": 1750, + "title": "Pass options to pattern validation to support refs", + "url": "https://github.com/hapijs/joi/pull/1750" + }, + { + "id": 420231970, + "labels": ["bug"], + "number": 1748, + "title": ".pattern doesn't respect .valid when using .ref", + "url": "https://github.com/hapijs/joi/issues/1748" + }, + { + "id": 420181826, + "labels": ["bug"], + "number": 1747, + "title": "Extension which has a return value in setup() does not call validate()", + "url": "https://github.com/hapijs/joi/issues/1747" + }, + { + "id": 405792943, + "labels": ["bug"], + "number": 1714, + "title": "Undocumented strip option on Joi.validate", + "url": "https://github.com/hapijs/joi/issues/1714" + }, + { + "id": 401085101, + "labels": ["bug"], + "number": 1704, + "title": "Resolved issue of maximum call stack exceeded", + "url": "https://github.com/hapijs/joi/pull/1704" + }, + { + "id": 400135974, + "labels": ["bug"], + "number": 1700, + "title": "base64 validation returns RangeError", + "url": "https://github.com/hapijs/joi/issues/1700" + } + ], + "number": 147, + "url": "https://github.com/hapijs/joi/milestone/147", + "version": "15.0.1" + }, + { + "date": "2019-04-02T04:49:34Z", + "id": 4184453, + "issues": [ + { + "id": 428021291, + "labels": ["breaking changes", "dependency", "release notes"], + "number": 1776, + "title": "Replace isemail with @hapi/address", + "url": "https://github.com/hapijs/joi/issues/1776" + }, + { + "id": 427192172, + "labels": ["bug"], + "number": 1768, + "title": "Fix dependency", + "url": "https://github.com/hapijs/joi/issues/1768" + } + ], + "number": 146, + "url": "https://github.com/hapijs/joi/milestone/146", + "version": "15.0.0" + }, + { + "date": "2019-06-23T02:19:48Z", + "id": 4432713, + "issues": [ + { + "id": 459528226, + "labels": ["feature"], + "number": 1928, + "title": "Add legacy API", + "url": "https://github.com/hapijs/joi/issues/1928" + } + ], + "number": 151, + "url": "https://github.com/hapijs/joi/milestone/151", + "version": "14.5.0" + }, + { + "date": "2019-03-29T20:21:54Z", + "id": 4184290, + "issues": [ + { + "id": 427161638, + "labels": ["non issue"], + "number": 1766, + "title": "Change module namespace", + "url": "https://github.com/hapijs/joi/issues/1766" + } + ], + "number": 145, + "url": "https://github.com/hapijs/joi/milestone/145", + "version": "14.4.0" + }, + { + "date": "2018-12-28T09:00:00Z", + "id": 3927174, + "issues": [ + { + "id": 394542338, + "labels": ["bug"], + "number": 1691, + "title": "joi.bind yields any() methods not fully bound", + "url": "https://github.com/hapijs/joi/issues/1691" + } + ], "number": 142, - "title": "alternatives()", - "url": "https://github.com/hapijs/joi/issues/142" - } - ], - "number": 5, - "url": "https://github.com/hapijs/joi/milestone/5", - "version": "2.8.0" - }, - { - "date": "2014-03-08T23:43:59Z", - "id": 472326, - "issues": [ - { - "id": 31046235, - "labels": ["breaking changes"], - "number": 232, - "title": "2.0.0", - "url": "https://github.com/hapijs/joi/issues/232" - }, - { - "id": 21261583, - "labels": [], + "url": "https://github.com/hapijs/joi/milestone/142", + "version": "14.3.1" + }, + { + "date": "2018-11-25T19:26:13Z", + "id": 3845940, + "issues": [ + { + "id": 384094400, + "labels": ["bug"], + "number": 1665, + "title": "path-related methods (`with(), `nand()`...) broken when applied on `func()`", + "url": "https://github.com/hapijs/joi/issues/1665" + }, + { + "id": 376417853, + "labels": ["feature"], + "number": 1631, + "title": "Destructuring Throws Fatal", + "url": "https://github.com/hapijs/joi/issues/1631" + } + ], + "number": 141, + "url": "https://github.com/hapijs/joi/milestone/141", + "version": "14.3.0" + }, + { + "date": "2018-11-25T13:53:31Z", + "id": 3844960, + "issues": [ + { + "id": 383284008, + "labels": ["feature"], + "number": 1659, + "title": "Add array().assertItem(). Closes #1656", + "url": "https://github.com/hapijs/joi/pull/1659" + }, + { + "id": 382347027, + "labels": ["support"], + "number": 1656, + "title": "Complex array validation requirements", + "url": "https://github.com/hapijs/joi/issues/1656" + }, + { + "id": 367826814, + "labels": ["feature", "non issue"], + "number": 1608, + "title": "Custom message overload another one ", + "url": "https://github.com/hapijs/joi/issues/1608" + }, + { + "id": 332685310, + "labels": ["support"], + "number": 1528, + "title": "joi errors not overriding for nested objects", + "url": "https://github.com/hapijs/joi/issues/1528" + }, + { + "id": 235510680, + "labels": ["feature"], + "number": 1219, + "title": "In case custom error messages are passed to Joi.any.error, joi.validate returning parent object error even if child validation fails.", + "url": "https://github.com/hapijs/joi/issues/1219" + } + ], + "number": 140, + "url": "https://github.com/hapijs/joi/milestone/140", + "version": "14.2.0" + }, + { + "date": "2018-11-24T11:32:05Z", + "id": 3844943, + "issues": [ + { + "id": 382674282, + "labels": ["bug"], + "number": 1658, + "title": "Extensions remove language of previous extension with the same base", + "url": "https://github.com/hapijs/joi/issues/1658" + } + ], + "number": 139, + "url": "https://github.com/hapijs/joi/milestone/139", + "version": "14.1.1" + }, + { + "date": "2018-11-24T11:13:32Z", + "id": 3812255, + "issues": [ + { + "id": 381859725, + "labels": ["test", "dependency"], + "number": 1654, + "title": "Bump to lab@18. Fixes #1653.", + "url": "https://github.com/hapijs/joi/pull/1654" + }, + { + "id": 379651118, + "labels": ["feature"], + "number": 1647, + "title": "Add object().oxor(). Closes #1628", + "url": "https://github.com/hapijs/joi/pull/1647" + }, + { + "id": 375786964, + "labels": ["feature"], + "number": 1628, + "title": "xor but none required", + "url": "https://github.com/hapijs/joi/issues/1628" + } + ], + "number": 137, + "url": "https://github.com/hapijs/joi/milestone/137", + "version": "14.1.0" + }, + { + "date": "2018-11-12T00:10:33Z", + "id": 3812011, + "issues": [ + { + "id": 367641201, + "labels": ["bug"], + "number": 1607, + "title": "invalid mime types on data uri", + "url": "https://github.com/hapijs/joi/issues/1607" + } + ], + "number": 136, + "url": "https://github.com/hapijs/joi/milestone/136", + "version": "14.0.6" + }, + { + "date": "2018-11-11T14:07:57Z", + "id": 3792284, + "issues": [ + { + "id": 378174072, + "labels": ["bug"], + "number": 1638, + "title": "fix condition, add tests for safe numbers", + "url": "https://github.com/hapijs/joi/pull/1638" + }, + { + "id": 377812126, + "labels": ["bug"], + "number": 1637, + "title": "Using Number.MAX_SAFE_INTEGER throw error that number unsafe.", + "url": "https://github.com/hapijs/joi/issues/1637" + } + ], + "number": 135, + "url": "https://github.com/hapijs/joi/milestone/135", + "version": "14.0.5" + }, + { + "date": "2018-11-03T00:30:30Z", + "id": 3792283, + "issues": [ + { + "id": 377002109, + "labels": ["non issue"], + "number": 1634, + "title": "Remove engines", + "url": "https://github.com/hapijs/joi/issues/1634" + } + ], + "number": 134, + "url": "https://github.com/hapijs/joi/milestone/134", + "version": "14.0.4" + }, + { + "date": "2018-10-29T22:09:10Z", + "id": 3768118, + "issues": [ + { + "id": 373474359, + "labels": ["bug"], + "number": 1622, + "title": "Maximum call stack size exceeded​​ error from Joi.defaults with Joi.empty flags", + "url": "https://github.com/hapijs/joi/issues/1622" + } + ], "number": 133, - "title": "Array.includes() does not support more than 1 type", - "url": "https://github.com/hapijs/joi/issues/133" - }, - { - "id": 20414695, - "labels": ["bug"], + "url": "https://github.com/hapijs/joi/milestone/133", + "version": "14.0.2" + }, + { + "date": "2018-10-22T21:22:31Z", + "id": 3754985, + "issues": [ + { + "id": 372299707, + "labels": ["bug"], + "number": 1617, + "title": "object().with using nested paths validates when it shouldn't in Joi 14", + "url": "https://github.com/hapijs/joi/issues/1617" + } + ], + "number": 132, + "url": "https://github.com/hapijs/joi/milestone/132", + "version": "14.0.1" + }, + { + "date": "2018-10-22T21:22:37Z", + "id": 3544952, + "issues": [ + { + "id": 369916473, + "labels": ["breaking changes", "release notes"], + "number": 1615, + "title": "14.0.0 Release Notes", + "url": "https://github.com/hapijs/joi/issues/1615" + }, + { + "id": 369915091, + "labels": ["breaking changes"], + "number": 1614, + "title": "Default stripUnknown = true to only strip object keys, not arrays", + "url": "https://github.com/hapijs/joi/issues/1614" + }, + { + "id": 363087205, + "labels": ["feature", "breaking changes"], + "number": 1595, + "title": "Overriding array.min() when using reach", + "url": "https://github.com/hapijs/joi/issues/1595" + }, + { + "id": 351263536, + "labels": ["feature", "breaking changes"], + "number": 1568, + "title": "Trying to get multiple custom error messages in details array with {abortEarly: false}", + "url": "https://github.com/hapijs/joi/issues/1568" + }, + { + "id": 346916431, + "labels": ["feature", "breaking changes"], + "number": 1555, + "title": "Chaining multiple examples does not overwrite the old examples", + "url": "https://github.com/hapijs/joi/issues/1555" + }, + { + "id": 346844464, + "labels": ["feature", "breaking changes"], + "number": 1554, + "title": "#1477 Add Support for nested path with Joi.object().or(), .nand(), .and(), .with(), .without(), .xor()", + "url": "https://github.com/hapijs/joi/pull/1554" + }, + { + "id": 341880786, + "labels": ["bug", "breaking changes"], + "number": 1544, + "title": "Error at integer validation", + "url": "https://github.com/hapijs/joi/issues/1544" + }, + { + "id": 324485906, + "labels": ["feature", "breaking changes"], + "number": 1504, + "title": "Max safe integers", + "url": "https://github.com/hapijs/joi/issues/1504" + }, + { + "id": 315322518, + "labels": ["feature", "breaking changes"], + "number": 1478, + "title": ".example SHOULD perform validation on the provided value", + "url": "https://github.com/hapijs/joi/issues/1478" + }, + { + "id": 315143974, + "labels": ["feature", "breaking changes"], + "number": 1477, + "title": "Joi.object().or() does not support nested paths ", + "url": "https://github.com/hapijs/joi/issues/1477" + }, + { + "id": 295852145, + "labels": ["feature", "breaking changes"], + "number": 1429, + "title": "Joi.string().regex() with support for all modifiers", + "url": "https://github.com/hapijs/joi/issues/1429" + }, + { + "id": 276084183, + "labels": ["bug", "breaking changes"], + "number": 1364, + "title": "Need to override twice the key name for error messages", + "url": "https://github.com/hapijs/joi/issues/1364" + }, + { + "id": 245288679, + "labels": ["feature", "breaking changes"], + "number": 1258, + "title": "Feature Request: lazy once", + "url": "https://github.com/hapijs/joi/issues/1258" + }, + { + "id": 243005187, + "labels": ["bug", "breaking changes"], + "number": 1247, + "title": "Year-only iso date string is parsed incorrectly", + "url": "https://github.com/hapijs/joi/issues/1247" + }, + { + "id": 229557855, + "labels": ["bug", "breaking changes"], + "number": 1191, + "title": "Chaining string.insensitive() will not convert values with lowercase/uppercase modifiers", + "url": "https://github.com/hapijs/joi/issues/1191" + }, + { + "id": 214964128, + "labels": ["feature", "breaking changes"], + "number": 1127, + "title": "Make certain rules override themselves", + "url": "https://github.com/hapijs/joi/issues/1127" + }, + { + "id": 210302297, + "labels": ["bug", "feature"], + "number": 1113, + "title": "Number validation on '0x1' reports no error with a value of 0.", + "url": "https://github.com/hapijs/joi/issues/1113" + } + ], + "number": 130, + "url": "https://github.com/hapijs/joi/milestone/130", + "version": "14.0.0" + }, + { + "date": "2018-09-29T08:49:35Z", + "id": 3564622, + "issues": [ + { + "id": 348277928, + "labels": ["feature"], + "number": 1562, + "title": "Add symbol() type", + "url": "https://github.com/hapijs/joi/pull/1562" + }, + { + "id": 294694439, + "labels": ["feature"], + "number": 1420, + "title": "Add Symbol() support", + "url": "https://github.com/hapijs/joi/issues/1420" + } + ], + "number": 131, + "url": "https://github.com/hapijs/joi/milestone/131", + "version": "13.7.0" + }, + { + "date": "2018-08-10T16:12:02Z", + "id": 3544948, + "issues": [ + { + "id": 347427543, + "labels": ["feature"], + "number": 1558, + "title": "Add value to number.base errors", + "url": "https://github.com/hapijs/joi/issues/1558" + } + ], + "number": 129, + "url": "https://github.com/hapijs/joi/milestone/129", + "version": "13.6.0" + }, + { + "date": "2018-07-30T19:03:38Z", + "id": 3533470, + "issues": [], "number": 128, - "title": "with constraint doesn't seem to be respected", - "url": "https://github.com/hapijs/joi/issues/128" - }, - { - "id": 20244505, - "labels": ["feature"], + "url": "https://github.com/hapijs/joi/milestone/128", + "version": "13.5.2" + }, + { + "date": "2018-07-30T16:12:55Z", + "id": 3532912, + "issues": [], + "number": 127, + "url": "https://github.com/hapijs/joi/milestone/127", + "version": "13.5.1" + }, + { + "date": "2018-07-30T15:47:01Z", + "id": 3412505, + "issues": [ + { + "id": 335091908, + "labels": ["feature"], + "number": 1532, + "title": "Add enabled flag to string.trim()", + "url": "https://github.com/hapijs/joi/pull/1532" + }, + { + "id": 331463119, + "labels": ["feature"], + "number": 1525, + "title": "Add boolean flag to Joi.string().trim()", + "url": "https://github.com/hapijs/joi/issues/1525" + }, + { + "id": 326157125, + "labels": ["feature"], + "number": 1511, + "title": "Add optional \"config\" param to array.unique for ignoreUndefined. Closes #1498", + "url": "https://github.com/hapijs/joi/pull/1511" + }, + { + "id": 326090791, + "labels": ["feature"], + "number": 1510, + "title": "Data uri validation", + "url": "https://github.com/hapijs/joi/pull/1510" + }, + { + "id": 322263900, + "labels": ["feature"], + "number": 1498, + "title": "Validating unique optional fields in array elements.", + "url": "https://github.com/hapijs/joi/issues/1498" + }, + { + "id": 319193302, + "labels": ["feature"], + "number": 1487, + "title": "Allow square braces in URL validation", + "url": "https://github.com/hapijs/joi/pull/1487" + }, + { + "id": 307195797, + "labels": ["bug"], + "number": 1461, + "title": "URI validator rejects query param square brackets", + "url": "https://github.com/hapijs/joi/issues/1461" + }, + { + "id": 181357844, + "labels": ["documentation"], + "number": 999, + "title": "Where is the documentation for `this.createError()`?", + "url": "https://github.com/hapijs/joi/issues/999" + } + ], "number": 126, - "title": "Validate date supporting arbitrary format", - "url": "https://github.com/hapijs/joi/issues/126" - }, - { - "id": 19591348, - "labels": ["bug"], + "url": "https://github.com/hapijs/joi/milestone/126", + "version": "13.5.0" + }, + { + "date": "2018-06-06T09:44:19Z", + "id": 3359682, + "issues": [ + { + "id": 329609311, + "labels": ["bug"], + "number": 1521, + "title": "Extended object does not parse JSON", + "url": "https://github.com/hapijs/joi/issues/1521" + }, + { + "id": 326755555, + "labels": ["bug"], + "number": 1515, + "title": "Joi.reach() can no longer handles empty string path", + "url": "https://github.com/hapijs/joi/issues/1515" + }, + { + "id": 326755401, + "labels": ["feature"], + "number": 1514, + "title": "remove indirect require reference to index.js", + "url": "https://github.com/hapijs/joi/pull/1514" + }, + { + "id": 326753430, + "labels": ["feature"], + "number": 1513, + "title": "require('../') statement in schemas.js causing bundler issues.", + "url": "https://github.com/hapijs/joi/issues/1513" + }, + { + "id": 324259930, + "labels": ["feature"], + "number": 1500, + "title": "add date greater less rules", + "url": "https://github.com/hapijs/joi/pull/1500" + }, + { + "id": 322485325, + "labels": ["feature"], + "number": 1499, + "title": "Allow object keys to be verified by schema", + "url": "https://github.com/hapijs/joi/pull/1499" + }, + { + "id": 283037901, + "labels": ["feature"], + "number": 1382, + "title": "Add a key validator with Joi objects", + "url": "https://github.com/hapijs/joi/issues/1382" + }, + { + "id": 181377285, + "labels": ["bug"], + "number": 1000, + "title": "Correct way to write an \"identity\" extension?", + "url": "https://github.com/hapijs/joi/issues/1000" + } + ], + "number": 125, + "url": "https://github.com/hapijs/joi/milestone/125", + "version": "13.4.0" + }, + { + "date": "2018-05-08T16:36:50Z", + "id": 3304087, + "issues": [ + { + "id": 315762313, + "labels": ["feature"], + "number": 1479, + "title": "Is it possible to capture the value of field being validated in custom error messages using the options - language", + "url": "https://github.com/hapijs/joi/issues/1479" + }, + { + "id": 297603748, + "labels": ["feature"], + "number": 1438, + "title": "Use Set() for handling of unprocessed keys", + "url": "https://github.com/hapijs/joi/pull/1438" + }, + { + "id": 294792261, + "labels": ["feature"], + "number": 1422, + "title": "Add byteAligned option to hex string", + "url": "https://github.com/hapijs/joi/pull/1422" + }, + { + "id": 292852186, + "labels": ["feature"], + "number": 1415, + "title": "Use Set() for internal Set backend", + "url": "https://github.com/hapijs/joi/pull/1415" + } + ], "number": 124, - "title": "Array doesn't validate correctly if includes() uses valid()", - "url": "https://github.com/hapijs/joi/issues/124" - }, - { - "id": 18752983, - "labels": ["bug"], + "url": "https://github.com/hapijs/joi/milestone/124", + "version": "13.3.0" + }, + { + "date": "2018-04-17T12:07:45Z", + "id": 3103767, + "issues": [ + { + "id": 314718373, + "labels": ["bug"], + "number": 1476, + "title": "Cannot validate an array with 'constructor' as unique entry", + "url": "https://github.com/hapijs/joi/issues/1476" + }, + { + "id": 304150136, + "labels": ["feature"], + "number": 1452, + "title": "Add new validation number().port()", + "url": "https://github.com/hapijs/joi/pull/1452" + }, + { + "id": 303224595, + "labels": ["documentation"], + "number": 1448, + "title": "Include describe() documentation in API. Fixes #1447", + "url": "https://github.com/hapijs/joi/pull/1448" + }, + { + "id": 297164372, + "labels": ["feature"], + "number": 1435, + "title": "Add an object.append() method. Fixes #1381.", + "url": "https://github.com/hapijs/joi/pull/1435" + }, + { + "id": 296415118, + "labels": ["feature"], + "number": 1433, + "title": "Changed a separator for path parameter to pre-split array approach for Joi.reach", + "url": "https://github.com/hapijs/joi/pull/1433" + }, + { + "id": 294813572, + "labels": ["feature"], + "number": 1423, + "title": "Avoid redundant copies of settings", + "url": "https://github.com/hapijs/joi/pull/1423" + }, + { + "id": 292808080, + "labels": ["feature"], + "number": 1414, + "title": "Fix cloned valid() / invalid() object values", + "url": "https://github.com/hapijs/joi/pull/1414" + }, + { + "id": 283039455, + "labels": ["feature"], + "number": 1383, + "title": "Add an separator parameter to Joi.reach", + "url": "https://github.com/hapijs/joi/issues/1383" + }, + { + "id": 282884730, + "labels": ["feature"], + "number": 1381, + "title": "Add an object.append() method", + "url": "https://github.com/hapijs/joi/issues/1381" + }, + { + "id": 270030262, + "labels": ["feature"], + "number": 1346, + "title": "Validate port numbers", + "url": "https://github.com/hapijs/joi/issues/1346" + } + ], + "number": 123, + "url": "https://github.com/hapijs/joi/milestone/123", + "version": "13.2.0" + }, + { + "date": "2018-02-09T19:51:47Z", + "id": 3084722, + "issues": [ + { + "id": 286179863, + "labels": ["bug"], + "number": 1392, + "title": "undefined in the array with label returns wrong missing value message", + "url": "https://github.com/hapijs/joi/issues/1392" + } + ], "number": 122, - "title": "Update error messages to not have encoded characters", - "url": "https://github.com/hapijs/joi/issues/122" - }, - { - "id": 18553537, - "labels": ["bug"], + "url": "https://github.com/hapijs/joi/milestone/122", + "version": "13.1.2" + }, + { + "date": "2018-01-19T13:24:10Z", + "id": 3048494, + "issues": [ + { + "id": 287916926, + "labels": ["feature"], + "number": 1395, + "title": "Asserts that two arguments are provided to object.with() and object.without()", + "url": "https://github.com/hapijs/joi/pull/1395" + } + ], "number": 121, - "title": "Array is accepted as an Object type", - "url": "https://github.com/hapijs/joi/issues/121" - }, - { - "id": 17290833, - "labels": ["bug"], + "url": "https://github.com/hapijs/joi/milestone/121", + "version": "13.1.1" + }, + { + "date": "2018-01-04T14:44:12Z", + "id": 3013036, + "issues": [ + { + "id": 283521529, + "labels": [], + "number": 1386, + "title": "Fix object pattern in combination with empty", + "url": "https://github.com/hapijs/joi/pull/1386" + } + ], + "number": 120, + "url": "https://github.com/hapijs/joi/milestone/120", + "version": "13.1.0" + }, + { + "date": "2017-11-12T20:19:03Z", + "id": 2906228, + "issues": [ + { + "id": 273254625, + "labels": ["bug"], + "number": 1354, + "title": "Remove validation from .example", + "url": "https://github.com/hapijs/joi/pull/1354" + }, + { + "id": 271830762, + "labels": ["bug"], + "number": 1350, + "title": "joi.ref doesn't work properly with max() function for dependant dates ", + "url": "https://github.com/hapijs/joi/issues/1350" + }, + { + "id": 229383333, + "labels": ["bug", "support"], + "number": 1189, + "title": "Should .example perform validation on the provided value?", + "url": "https://github.com/hapijs/joi/issues/1189" + } + ], + "number": 119, + "url": "https://github.com/hapijs/joi/milestone/119", + "version": "13.0.2" + }, + { + "date": "2017-10-19T12:52:08Z", + "id": 2850464, + "issues": [ + { + "id": 266775659, + "labels": ["bug"], + "number": 1334, + "title": "Impossible to disable language.key in options", + "url": "https://github.com/hapijs/joi/issues/1334" + } + ], + "number": 118, + "url": "https://github.com/hapijs/joi/milestone/118", + "version": "13.0.1" + }, + { + "date": "2017-10-14T15:07:21Z", + "id": 2837334, + "issues": [ + { + "id": 265497514, + "labels": ["breaking changes", "release notes"], + "number": 1328, + "title": "13.0.0 Release Notes", + "url": "https://github.com/hapijs/joi/issues/1328" + }, + { + "id": 265496379, + "labels": ["breaking changes"], + "number": 1327, + "title": "Bump joi to node 8+", + "url": "https://github.com/hapijs/joi/issues/1327" + } + ], + "number": 117, + "url": "https://github.com/hapijs/joi/milestone/117", + "version": "13.0.0" + }, + { + "date": "2019-03-24T23:19:53Z", + "id": 4162837, + "issues": [ + { + "id": 424065331, + "labels": ["breaking changes"], + "number": 1757, + "title": "Commercial version of v12 branch", + "url": "https://github.com/hapijs/joi/issues/1757" + } + ], + "number": 143, + "url": "https://github.com/hapijs/joi/milestone/143", + "version": "12.1.0" + }, + { + "date": "2017-10-14T15:07:23Z", + "id": 2821546, + "issues": [ + { + "id": 265495234, + "labels": ["security", "breaking changes", "release notes"], + "number": 1326, + "title": "12.0.0 Release Notes", + "url": "https://github.com/hapijs/joi/issues/1326" + }, + { + "id": 159834932, + "labels": ["feature", "breaking changes"], + "number": 921, + "title": "$-sign in object keys are escaped in the ValidationError message", + "url": "https://github.com/hapijs/joi/issues/921" + } + ], "number": 112, - "title": "Remove Number.float()", - "url": "https://github.com/hapijs/joi/issues/112" - }, - { - "id": 13572478, - "labels": ["feature"], - "number": 88, - "title": ".valid() and .invalid() need a case-insensitive mode", - "url": "https://github.com/hapijs/joi/issues/88" - } - ], - "number": 4, - "url": "https://github.com/hapijs/joi/milestone/4", - "version": "2.0.0" - }, - { - "date": "2013-11-02T08:13:23Z", - "id": 385931, - "issues": [ - { - "id": 17163181, - "labels": [], + "url": "https://github.com/hapijs/joi/milestone/112", + "version": "12.0.0" + }, + { + "date": "2017-10-14T12:44:02Z", + "id": 2837264, + "issues": [ + { + "id": 265487048, + "labels": ["feature"], + "number": 1325, + "title": "Allow `alternatives.when` to \"peek\" inside the current value", + "url": "https://github.com/hapijs/joi/issues/1325" + } + ], + "number": 116, + "url": "https://github.com/hapijs/joi/milestone/116", + "version": "11.4.0" + }, + { + "date": "2017-10-09T17:44:43Z", + "id": 2825376, + "issues": [ + { + "id": 238790400, + "labels": ["feature"], + "number": 1230, + "title": "Missing `language` entry in `joi.extend` causes obscure runtime error", + "url": "https://github.com/hapijs/joi/issues/1230" + } + ], + "number": 115, + "url": "https://github.com/hapijs/joi/milestone/115", + "version": "11.3.4" + }, + { + "date": "2017-10-08T19:33:33Z", + "id": 2823033, + "issues": [ + { + "id": 259408938, + "labels": ["non issue"], + "number": 1311, + "title": "import { any } does not work on v11", + "url": "https://github.com/hapijs/joi/issues/1311" + } + ], + "number": 114, + "url": "https://github.com/hapijs/joi/milestone/114", + "version": "11.3.1" + }, + { + "date": "2017-10-08T16:22:06Z", + "id": 2822789, + "issues": [ + { + "id": 241053503, + "labels": ["feature"], + "number": 1240, + "title": "Fixes [#1239]", + "url": "https://github.com/hapijs/joi/pull/1240" + }, + { + "id": 240790711, + "labels": ["feature"], + "number": 1239, + "title": "Rename multiple keys to another name", + "url": "https://github.com/hapijs/joi/issues/1239" + } + ], + "number": 113, + "url": "https://github.com/hapijs/joi/milestone/113", + "version": "11.3.0" + }, + { + "date": "2017-10-07T21:44:01Z", + "id": 2787810, + "issues": [ + { + "id": 258673170, + "labels": [], + "number": 1308, + "title": "Add Joi.func().class()", + "url": "https://github.com/hapijs/joi/pull/1308" + } + ], + "number": 111, + "url": "https://github.com/hapijs/joi/milestone/111", + "version": "11.2.0" + }, + { + "date": "2017-10-07T13:12:23Z", + "id": 2787736, + "issues": [ + { + "id": 260172662, + "labels": ["dependency"], + "number": 1316, + "title": "Remove items module dependency", + "url": "https://github.com/hapijs/joi/issues/1316" + } + ], "number": 110, - "title": "Adding support for special Any type", - "url": "https://github.com/hapijs/joi/pull/110" - }, - { - "id": 17111405, - "labels": [], + "url": "https://github.com/hapijs/joi/milestone/110", + "version": "11.1.1" + }, + { + "date": "2017-09-24T17:20:32Z", + "id": 2781668, + "issues": [ + { + "id": 260080943, + "labels": ["feature"], + "number": 1315, + "title": "Add promise-like API to validate. Fixes #1314.", + "url": "https://github.com/hapijs/joi/pull/1315" + }, + { + "id": 260080719, + "labels": ["feature"], + "number": 1314, + "title": "Support promises on `validate()`", + "url": "https://github.com/hapijs/joi/issues/1314" + }, + { + "id": 254855872, + "labels": ["feature"], + "number": 1291, + "title": "Add string.normalize for unicode normalization", + "url": "https://github.com/hapijs/joi/pull/1291" + }, + { + "id": 254795495, + "labels": ["feature"], + "number": 1289, + "title": "Feature request: Unicode normalization", + "url": "https://github.com/hapijs/joi/issues/1289" + } + ], + "number": 109, + "url": "https://github.com/hapijs/joi/milestone/109", + "version": "11.1.0" + }, + { + "date": "2017-09-20T22:41:06Z", + "id": 2781655, + "issues": [ + { + "id": 248384414, + "labels": ["bug"], + "number": 1266, + "title": "remove empty flag if only reset is used", + "url": "https://github.com/hapijs/joi/pull/1266" + }, + { + "id": 243963879, + "labels": ["bug"], + "number": 1249, + "title": "describe doesn't work for empty() breaking lout", + "url": "https://github.com/hapijs/joi/issues/1249" + } + ], + "number": 108, + "url": "https://github.com/hapijs/joi/milestone/108", + "version": "11.0.3" + }, + { + "date": "2017-09-19T09:20:01Z", + "id": 2777065, + "issues": [ + { + "id": 258034140, + "labels": ["bug"], + "number": 1303, + "title": "empty string is wrongly accepted as a timestamp", + "url": "https://github.com/hapijs/joi/issues/1303" + } + ], "number": 107, - "title": ".with and .without accept an array of args as well", - "url": "https://github.com/hapijs/joi/issues/107" - }, - { - "id": 16995673, - "labels": ["feature"], + "url": "https://github.com/hapijs/joi/milestone/107", + "version": "11.0.2" + }, + { + "date": "2017-09-19T09:19:59Z", + "id": 2405282, + "issues": [ + { + "id": 257758091, + "labels": ["breaking changes", "release notes"], + "number": 1302, + "title": "11.0.0 Release Notes", + "url": "https://github.com/hapijs/joi/issues/1302" + }, + { + "id": 253580300, + "labels": ["bug"], + "number": 1283, + "title": "Error: Item cannot come after itself", + "url": "https://github.com/hapijs/joi/issues/1283" + }, + { + "id": 253078184, + "labels": ["documentation"], + "number": 1282, + "title": "There is a bug in 10.6.0 API Reference.", + "url": "https://github.com/hapijs/joi/issues/1282" + }, + { + "id": 251494878, + "labels": ["bug"], + "number": 1278, + "title": "Joi.defaults(): Cannot default object type", + "url": "https://github.com/hapijs/joi/issues/1278" + }, + { + "id": 245177379, + "labels": ["feature"], + "number": 1256, + "title": "Add `Joi.defaults()`", + "url": "https://github.com/hapijs/joi/pull/1256" + }, + { + "id": 244915977, + "labels": ["bug"], + "number": 1254, + "title": "ipv6 with cidr greater than 32", + "url": "https://github.com/hapijs/joi/issues/1254" + }, + { + "id": 239819574, + "labels": ["bug"], + "number": 1235, + "title": "Fix Value Range for IPv6 CIDRs", + "url": "https://github.com/hapijs/joi/pull/1235" + }, + { + "id": 239776383, + "labels": ["bug"], + "number": 1232, + "title": "ipv6 string with mask between 33 and 128 are rejected.", + "url": "https://github.com/hapijs/joi/issues/1232" + }, + { + "id": 237881491, + "labels": ["breaking changes", "dependency"], + "number": 1229, + "title": "Update isemail from 2.x.x to 3.x.x", + "url": "https://github.com/hapijs/joi/pull/1229" + }, + { + "id": 230856182, + "labels": ["bug", "breaking changes"], + "number": 1197, + "title": "Allow passing an option to string().isoDate()", + "url": "https://github.com/hapijs/joi/pull/1197" + }, + { + "id": 230856109, + "labels": ["bug", "feature", "breaking changes"], + "number": 1196, + "title": "string isoDate should allow the string to be converted to same format as date iso schema", + "url": "https://github.com/hapijs/joi/issues/1196" + }, + { + "id": 223869943, + "labels": ["bug", "breaking changes"], + "number": 1167, + "title": "Errors: context.key is actually the label, not the key", + "url": "https://github.com/hapijs/joi/issues/1167" + }, + { + "id": 214846303, + "labels": ["feature", "breaking changes"], + "number": 1126, + "title": "Passes the \"default\" function to the schema description", + "url": "https://github.com/hapijs/joi/pull/1126" + }, + { + "id": 212581606, + "labels": ["feature"], + "number": 1121, + "title": "[Request] Add detail to .describe for function defaults", + "url": "https://github.com/hapijs/joi/issues/1121" + }, + { + "id": 161200713, + "labels": ["feature"], + "number": 931, + "title": "Email validation doesn't allow emails which are compliant with RFC 6530", + "url": "https://github.com/hapijs/joi/issues/931" + } + ], + "number": 95, + "url": "https://github.com/hapijs/joi/milestone/95", + "version": "11.0.0" + }, + { + "date": "2017-06-15T17:41:32Z", + "id": 2559175, + "issues": [ + { + "id": 234289593, + "labels": ["feature"], + "number": 1215, + "title": "#1201 - setup can return joi object to replace origin schema", + "url": "https://github.com/hapijs/joi/pull/1215" + }, + { + "id": 233493027, + "labels": ["feature"], + "number": 1211, + "title": "Performance Improvements for string().guid()", + "url": "https://github.com/hapijs/joi/pull/1211" + }, + { + "id": 232954554, + "labels": ["feature"], + "number": 1206, + "title": "Added the ability to use a reference for Array min/max/length", + "url": "https://github.com/hapijs/joi/pull/1206" + }, + { + "id": 231523010, + "labels": ["feature"], + "number": 1201, + "title": "Question: how to extend joi to add some key by rule?", + "url": "https://github.com/hapijs/joi/issues/1201" + }, + { + "id": 225597589, + "labels": ["feature"], + "number": 1174, + "title": "Fix #1156 - Adds support for optional base64 padding validation.", + "url": "https://github.com/hapijs/joi/pull/1174" + }, + { + "id": 221024691, + "labels": ["feature"], + "number": 1156, + "title": "base64 validation too strict; padding is optional", + "url": "https://github.com/hapijs/joi/issues/1156" + }, + { + "id": 186069209, + "labels": ["feature"], + "number": 1017, + "title": "Array length cannot reference to another field", + "url": "https://github.com/hapijs/joi/issues/1017" + } + ], "number": 106, - "title": "Add Type.Any", - "url": "https://github.com/hapijs/joi/issues/106" - }, - { - "id": 16981014, - "labels": [], + "url": "https://github.com/hapijs/joi/milestone/106", + "version": "10.6.0" + }, + { + "date": "2017-06-02T20:49:11Z", + "id": 2549786, + "issues": [ + { + "id": 231271861, + "labels": ["dependency"], + "number": 1199, + "title": "Make isemail an optional dependency", + "url": "https://github.com/hapijs/joi/pull/1199" + } + ], "number": 105, - "title": "Consistent usage of Array.isArray()", - "url": "https://github.com/hapijs/joi/pull/105" - }, - { - "id": 14919575, - "labels": [], - "number": 95, - "title": "Custom Error Messages", - "url": "https://github.com/hapijs/joi/issues/95" - } - ], - "number": 3, - "url": "https://github.com/hapijs/joi/milestone/3", - "version": "0.4.0" - }, - { - "date": "2013-01-03T19:47:43Z", - "id": 224164, - "issues": [ - { - "id": 9059424, - "labels": ["documentation"], + "url": "https://github.com/hapijs/joi/milestone/105", + "version": "10.5.2" + }, + { + "date": "2017-05-28T22:19:30Z", + "id": 2547244, + "issues": [ + { + "id": 231898595, + "labels": ["bug"], + "number": 1203, + "title": "Nested child/uncle condition causes annotate() to throw ", + "url": "https://github.com/hapijs/joi/issues/1203" + } + ], + "number": 104, + "url": "https://github.com/hapijs/joi/milestone/104", + "version": "10.5.1" + }, + { + "date": "2017-05-18T15:45:07Z", + "id": 2518475, + "issues": [ + { + "id": 227638594, + "labels": ["feature"], + "number": 1183, + "title": "add forbiddenKeys method to object", + "url": "https://github.com/hapijs/joi/pull/1183" + } + ], + "number": 103, + "url": "https://github.com/hapijs/joi/milestone/103", + "version": "10.5.0" + }, + { + "date": "2017-05-13T10:41:57Z", + "id": 2428429, + "issues": [ + { + "id": 221894356, + "labels": ["bug"], + "number": 1161, + "title": "Alternatives respect subsequent \"when\"s if first has only \"otherwise\"", + "url": "https://github.com/hapijs/joi/pull/1161" + }, + { + "id": 220013181, + "labels": ["bug"], + "number": 1151, + "title": "Alternatives based on a type with only otherwise take precedence over any following one", + "url": "https://github.com/hapijs/joi/issues/1151" + }, + { + "id": 218796000, + "labels": ["bug"], + "number": 1146, + "title": "Keep converted values even when stripped for reference uses", + "url": "https://github.com/hapijs/joi/issues/1146" + }, + { + "id": 215568352, + "labels": ["feature"], + "number": 1132, + "title": "Add \"options\" to describe output", + "url": "https://github.com/hapijs/joi/pull/1132" + }, + { + "id": 215506277, + "labels": ["feature"], + "number": 1130, + "title": "Joi.any().options() should be reported in .describe()", + "url": "https://github.com/hapijs/joi/issues/1130" + } + ], + "number": 102, + "url": "https://github.com/hapijs/joi/milestone/102", + "version": "10.4.2" + }, + { + "date": "2017-04-02T21:46:25Z", + "id": 2427982, + "issues": [ + { + "id": 212541495, + "labels": ["bug"], + "number": 1119, + "title": "alternatives doesn't work with error", + "url": "https://github.com/hapijs/joi/issues/1119" + }, + { + "id": 140122010, + "labels": ["bug"], + "number": 844, + "title": "Label in object.and()", + "url": "https://github.com/hapijs/joi/issues/844" + } + ], + "number": 101, + "url": "https://github.com/hapijs/joi/milestone/101", + "version": "10.4.1" + }, + { + "date": "2017-04-02T15:56:59Z", + "id": 2427457, + "issues": [ + { + "id": 215521626, + "labels": ["feature", "support"], + "number": 1131, + "title": "Add basic error overriding", + "url": "https://github.com/hapijs/joi/pull/1131" + } + ], + "number": 100, + "url": "https://github.com/hapijs/joi/milestone/100", + "version": "10.4.0" + }, + { + "date": "2017-04-01T08:19:08Z", + "id": 2427020, + "issues": [ + { + "id": 218458441, + "labels": ["bug"], + "number": 1143, + "title": "number().integer() can fail for values outside MAX_SAFE_INTEGER", + "url": "https://github.com/hapijs/joi/issues/1143" + } + ], + "number": 99, + "url": "https://github.com/hapijs/joi/milestone/99", + "version": "10.3.4" + }, + { + "date": "2017-04-01T07:47:43Z", + "id": 2424847, + "issues": [ + { + "id": 218548189, + "labels": ["bug"], + "number": 1145, + "title": "Don't try to touch custom error messages with attempt message", + "url": "https://github.com/hapijs/joi/issues/1145" + } + ], + "number": 98, + "url": "https://github.com/hapijs/joi/milestone/98", + "version": "10.3.3" + }, + { + "date": "2017-03-31T15:52:16Z", + "id": 2424817, + "issues": [ + { + "id": 218538231, + "labels": ["bug"], + "number": 1144, + "title": "Possible bug in custom Error message", + "url": "https://github.com/hapijs/joi/issues/1144" + } + ], + "number": 97, + "url": "https://github.com/hapijs/joi/milestone/97", + "version": "10.3.2" + }, + { + "date": "2017-03-26T13:21:11Z", + "id": 2411581, + "issues": [ + { + "id": 205118190, + "labels": ["bug"], + "number": 1097, + "title": "Fix #964 Joi wrong value parsing", + "url": "https://github.com/hapijs/joi/pull/1097" + }, + { + "id": 168354866, + "labels": ["bug"], + "number": 964, + "title": "Joi wrong value parsing", + "url": "https://github.com/hapijs/joi/issues/964" + } + ], + "number": 96, + "url": "https://github.com/hapijs/joi/milestone/96", + "version": "10.3.1" + }, + { + "date": "2017-03-22T11:19:44Z", + "id": 2394787, + "issues": [ + { + "id": 215198486, + "labels": ["feature"], + "number": 1128, + "title": "Avoid unnecessary clones", + "url": "https://github.com/hapijs/joi/issues/1128" + }, + { + "id": 195884201, + "labels": ["bug"], + "number": 1067, + "title": "\"Describe\" behavior changes for \"implicit\" Any with extended Joi", + "url": "https://github.com/hapijs/joi/issues/1067" + }, + { + "id": 191470098, + "labels": ["feature"], + "number": 1047, + "title": "Creating multiple extensions for the same base type", + "url": "https://github.com/hapijs/joi/issues/1047" + }, + { + "id": 177225536, + "labels": ["bug"], + "number": 983, + "title": "Unexpected interaction between Joi.object().unknown() and stripUnknown", + "url": "https://github.com/hapijs/joi/issues/983" + }, + { + "id": 135118394, + "labels": ["feature"], + "number": 831, + "title": "Joi valid fails, when ref is used with a stripped key.", + "url": "https://github.com/hapijs/joi/issues/831" + } + ], + "number": 94, + "url": "https://github.com/hapijs/joi/milestone/94", + "version": "10.3.0" + }, + { + "date": "2017-02-09T20:53:03Z", + "id": 2312948, + "issues": [ + { + "id": 206615421, + "labels": ["bug"], + "number": 1103, + "title": "allow param defaults to be set by the param validations", + "url": "https://github.com/hapijs/joi/pull/1103" + } + ], + "number": 93, + "url": "https://github.com/hapijs/joi/milestone/93", + "version": "10.2.2" + }, + { + "date": "2017-02-02T15:34:04Z", + "id": 2295381, + "issues": [ + { + "id": 204891935, + "labels": ["bug"], + "number": 1095, + "title": "noDefaults behaviour with any.empty()", + "url": "https://github.com/hapijs/joi/issues/1095" + } + ], + "number": 92, + "url": "https://github.com/hapijs/joi/milestone/92", + "version": "10.2.1" + }, + { + "date": "2017-01-15T19:11:28Z", + "id": 2253005, + "issues": [ + { + "id": 197919729, + "labels": ["feature"], + "number": 1076, + "title": "Added support for ISO_8601 expansion (+/-YYYYYY)", + "url": "https://github.com/hapijs/joi/pull/1076" + } + ], + "number": 91, + "url": "https://github.com/hapijs/joi/milestone/91", + "version": "10.2.0" + }, + { + "date": "2016-12-23T15:53:47Z", + "id": 2212247, + "issues": [ + { + "id": 197373388, + "labels": ["feature"], + "number": 1075, + "title": "Allow shorthand accessor string in array().unique()", + "url": "https://github.com/hapijs/joi/issues/1075" + }, + { + "id": 197202607, + "labels": ["feature"], + "number": 1073, + "title": "Provide value which duplicates an item in array().unique()", + "url": "https://github.com/hapijs/joi/issues/1073" + }, + { + "id": 197202210, + "labels": ["bug"], + "number": 1072, + "title": "Path of array().unique() is wrong", + "url": "https://github.com/hapijs/joi/issues/1072" + } + ], + "number": 90, + "url": "https://github.com/hapijs/joi/milestone/90", + "version": "10.1.0" + }, + { + "date": "2016-12-14T13:23:59Z", + "id": 2196448, + "issues": [ + { + "id": 195528654, + "labels": ["bug", "breaking changes"], + "number": 1065, + "title": "Fix boolean strings parsing", + "url": "https://github.com/hapijs/joi/issues/1065" + } + ], + "number": 89, + "url": "https://github.com/hapijs/joi/milestone/89", + "version": "10.0.6" + }, + { + "date": "2016-12-14T13:19:21Z", + "id": 2176153, + "issues": [], + "number": 88, + "url": "https://github.com/hapijs/joi/milestone/88", + "version": "10.0.4" + }, + { + "date": "2016-12-04T15:05:24Z", + "id": 2174139, + "issues": [ + { + "id": 193353555, + "labels": ["bug"], + "number": 1054, + "title": "adding validation for unnecessary arguments in primary types.", + "url": "https://github.com/hapijs/joi/pull/1054" + }, + { + "id": 183545881, + "labels": ["feature"], + "number": 1009, + "title": "Request: Warn when functions are passed unexpected arguments", + "url": "https://github.com/hapijs/joi/issues/1009" + } + ], + "number": 87, + "url": "https://github.com/hapijs/joi/milestone/87", + "version": "10.0.3" + }, + { + "date": "2016-12-01T23:17:22Z", + "id": 2170062, + "issues": [ + { + "id": 192951005, + "labels": ["bug"], + "number": 1052, + "title": "[Request] truthy/falsy case insensitive", + "url": "https://github.com/hapijs/joi/issues/1052" + } + ], + "number": 86, + "url": "https://github.com/hapijs/joi/milestone/86", + "version": "10.0.2" + }, + { + "date": "2016-11-18T18:54:10Z", + "id": 2144787, + "issues": [ + { + "id": 190359996, + "labels": ["feature"], + "number": 1039, + "title": "trim + empty confuses me", + "url": "https://github.com/hapijs/joi/issues/1039" + } + ], + "number": 85, + "url": "https://github.com/hapijs/joi/milestone/85", + "version": "10.0.1" + }, + { + "date": "2016-11-18T00:08:25Z", + "id": 2117170, + "issues": [ + { + "id": 190199095, + "labels": ["breaking changes", "release notes"], + "number": 1037, + "title": "10.0.0 Release Notes", + "url": "https://github.com/hapijs/joi/issues/1037" + }, + { + "id": 189167502, + "labels": ["feature"], + "number": 1035, + "title": "Implement String.regex \"invalidate\" configuration", + "url": "https://github.com/hapijs/joi/pull/1035" + }, + { + "id": 188949918, + "labels": ["feature"], + "number": 1034, + "title": "added support for string.uri relativeOnly option", + "url": "https://github.com/hapijs/joi/pull/1034" + }, + { + "id": 188773249, + "labels": ["non issue"], + "number": 1032, + "title": "Clean up any.valid code", + "url": "https://github.com/hapijs/joi/pull/1032" + }, + { + "id": 188031721, + "labels": ["bug"], + "number": 1030, + "title": "Conditional validation of object properties with different parent key", + "url": "https://github.com/hapijs/joi/issues/1030" + }, + { + "id": 187540191, + "labels": ["feature"], + "number": 1028, + "title": "Extend describe() for type", + "url": "https://github.com/hapijs/joi/pull/1028" + }, + { + "id": 187537578, + "labels": ["feature"], + "number": 1027, + "title": "Extending describe() to include renames in metadata", + "url": "https://github.com/hapijs/joi/pull/1027" + }, + { + "id": 187504946, + "labels": ["feature"], + "number": 1026, + "title": "object renames do not appear in describe api.", + "url": "https://github.com/hapijs/joi/issues/1026" + }, + { + "id": 186452424, + "labels": ["feature"], + "number": 1020, + "title": "Joi.string().invalid (not, disallow) doesn't support regex?", + "url": "https://github.com/hapijs/joi/issues/1020" + }, + { + "id": 186047148, + "labels": ["feature"], + "number": 1016, + "title": "Added a string.base64() method.", + "url": "https://github.com/hapijs/joi/pull/1016" + }, + { + "id": 185357624, + "labels": ["feature"], + "number": 1015, + "title": "Suggestion: Joi.string().uri({ allowRelativeOnly })", + "url": "https://github.com/hapijs/joi/issues/1015" + }, + { + "id": 184002318, + "labels": ["bug"], + "number": 1010, + "title": "Update Joi.validate options with removal of error", + "url": "https://github.com/hapijs/joi/pull/1010" + }, + { + "id": 181166957, + "labels": ["feature", "breaking changes"], + "number": 998, + "title": "Add support for truthy/falsy boolean values", + "url": "https://github.com/hapijs/joi/pull/998" + }, + { + "id": 177349171, + "labels": ["breaking changes", "dependency"], + "number": 985, + "title": "Move time rules to an extension", + "url": "https://github.com/hapijs/joi/issues/985" + } + ], + "number": 84, + "url": "https://github.com/hapijs/joi/milestone/84", + "version": "10.0.0" + }, + { + "date": "2016-10-18T08:41:16Z", + "id": 2076622, + "issues": [ + { + "id": 182905253, + "labels": ["bug", "feature"], + "number": 1008, + "title": "Bugfix/error annotate", + "url": "https://github.com/hapijs/joi/pull/1008" + } + ], + "number": 83, + "url": "https://github.com/hapijs/joi/milestone/83", + "version": "9.2.0" + }, + { + "date": "2016-10-12T17:48:01Z", + "id": 2065628, + "issues": [ + { + "id": 181847138, + "labels": ["bug"], + "number": 1002, + "title": "Ref will not be converted if it is inside array passed to default", + "url": "https://github.com/hapijs/joi/issues/1002" + } + ], + "number": 82, + "url": "https://github.com/hapijs/joi/milestone/82", + "version": "9.1.1" + }, + { + "date": "2016-09-29T17:30:15Z", + "id": 2038254, + "issues": [ + { + "id": 178191519, + "labels": ["feature"], + "number": 989, + "title": "Adds UUID Support", + "url": "https://github.com/hapijs/joi/pull/989" + } + ], + "number": 81, + "url": "https://github.com/hapijs/joi/milestone/81", + "version": "9.1.0" + }, + { + "date": "2016-07-24T18:35:02Z", + "id": 1901086, + "issues": [ + { + "id": 165671291, + "labels": ["bug", "support"], + "number": 947, + "title": ".without(), runs before .empty()", + "url": "https://github.com/hapijs/joi/issues/947" + } + ], + "number": 80, + "url": "https://github.com/hapijs/joi/milestone/80", + "version": "9.0.4" + }, + { + "date": "2016-07-24T18:24:02Z", + "id": 1900949, + "issues": [ + { + "id": 165371154, + "labels": ["bug"], + "number": 945, + "title": "required() does not catch specific empty values", + "url": "https://github.com/hapijs/joi/issues/945" + } + ], + "number": 79, + "url": "https://github.com/hapijs/joi/milestone/79", + "version": "9.0.3" + }, + { + "date": "2016-07-24T14:11:26Z", + "id": 1900886, + "issues": [ + { + "id": 167232702, + "labels": ["bug"], + "number": 960, + "title": "Coercion doesn't run early enough", + "url": "https://github.com/hapijs/joi/issues/960" + } + ], + "number": 78, + "url": "https://github.com/hapijs/joi/milestone/78", + "version": "9.0.2" + }, + { + "date": "2016-07-24T14:11:24Z", + "id": 1886228, + "issues": [ + { + "id": 165839191, + "labels": ["bug"], + "number": 949, + "title": "Returning credit card number when is valid, fixes #948", + "url": "https://github.com/hapijs/joi/pull/949" + }, + { + "id": 165838266, + "labels": ["bug"], + "number": 948, + "title": "Credit Card returning null when valid", + "url": "https://github.com/hapijs/joi/issues/948" + } + ], + "number": 77, + "url": "https://github.com/hapijs/joi/milestone/77", + "version": "9.0.1" + }, + { + "date": "2016-07-09T13:55:49Z", + "id": 1578120, + "issues": [ + { + "id": 162310369, + "labels": ["bug"], + "number": 934, + "title": "Fix missing top-level methods", + "url": "https://github.com/hapijs/joi/pull/934" + }, + { + "id": 162310345, + "labels": ["bug"], + "number": 933, + "title": "Extended Joi does not contain certain top-level functions", + "url": "https://github.com/hapijs/joi/issues/933" + }, + { + "id": 161040658, + "labels": ["bug"], + "number": 929, + "title": "labels don't always get included in error messages with Joi.extend()", + "url": "https://github.com/hapijs/joi/issues/929" + }, + { + "id": 161034945, + "labels": ["bug", "breaking changes"], + "number": 928, + "title": "Different error message for date().format()", + "url": "https://github.com/hapijs/joi/issues/928" + }, + { + "id": 161034924, + "labels": ["test"], + "number": 927, + "title": "Check error messages in tests", + "url": "https://github.com/hapijs/joi/issues/927" + }, + { + "id": 159792405, + "labels": ["breaking changes", "release notes"], + "number": 920, + "title": "9.0.0 Release Notes", + "url": "https://github.com/hapijs/joi/issues/920" + }, + { + "id": 159769849, + "labels": ["feature"], + "number": 918, + "title": "number.multiple() enhancement - Issue #916", + "url": "https://github.com/hapijs/joi/pull/918" + }, + { + "id": 159655264, + "labels": ["feature"], + "number": 916, + "title": "number.multiple() throws exception for non-integer and ref values", + "url": "https://github.com/hapijs/joi/issues/916" + }, + { + "id": 156303046, + "labels": ["feature"], + "number": 899, + "title": "Treat empty string as null", + "url": "https://github.com/hapijs/joi/issues/899" + }, + { + "id": 154900494, + "labels": ["feature"], + "number": 894, + "title": "Add Joi.object().schema()", + "url": "https://github.com/hapijs/joi/issues/894" + }, + { + "id": 154818106, + "labels": ["bug"], + "number": 893, + "title": "Fix item ref. Closes #892", + "url": "https://github.com/hapijs/joi/pull/893" + }, + { + "id": 154817507, + "labels": ["bug"], + "number": 892, + "title": "References in array items() do not work", + "url": "https://github.com/hapijs/joi/issues/892" + }, + { + "id": 153314196, + "labels": ["feature"], + "number": 880, + "title": "Add synchronous extensibility", + "url": "https://github.com/hapijs/joi/pull/880" + }, + { + "id": 151004056, + "labels": ["feature", "breaking changes"], + "number": 874, + "title": "any.label() significantly slows validation of large arrays", + "url": "https://github.com/hapijs/joi/issues/874" + }, + { + "id": 144451615, + "labels": ["feature"], + "number": 860, + "title": "Add the ability to specify a comparator for `array.unique()` for objects only", + "url": "https://github.com/hapijs/joi/pull/860" + }, + { + "id": 144392152, + "labels": ["feature"], + "number": 859, + "title": "custom compare for Joi.array().unique()", + "url": "https://github.com/hapijs/joi/issues/859" + }, + { + "id": 143346039, + "labels": ["breaking changes"], + "number": 856, + "title": "Allow 1 to be true and 0 to be false.", + "url": "https://github.com/hapijs/joi/pull/856" + }, + { + "id": 59351629, + "labels": ["feature", "support"], + "number": 577, + "title": "RFC: Joi plugins/extensions/custom functions", + "url": "https://github.com/hapijs/joi/issues/577" + } + ], + "number": 64, + "url": "https://github.com/hapijs/joi/milestone/64", + "version": "9.0.0" + }, + { + "date": "2016-06-12T14:51:03Z", + "id": 1822141, + "issues": [ + { + "id": 159775751, + "labels": ["bug"], + "number": 919, + "title": "joi.date().timestamp() failing validation for millisecond value", + "url": "https://github.com/hapijs/joi/issues/919" + } + ], + "number": 76, + "url": "https://github.com/hapijs/joi/milestone/76", + "version": "8.4.2" + }, + { + "date": "2016-06-12T14:50:51Z", + "id": 1806741, + "issues": [ + { + "id": 158179947, + "labels": ["bug"], + "number": 909, + "title": "Using empty in items on sparse array allows undefined elements.", + "url": "https://github.com/hapijs/joi/issues/909" + } + ], + "number": 75, + "url": "https://github.com/hapijs/joi/milestone/75", + "version": "8.4.1" + }, + { + "date": "2016-05-29T21:33:07Z", + "id": 1794773, + "issues": [ + { + "id": 153768890, + "labels": ["feature"], + "number": 884, + "title": "Synchronous schema.validate fails if called with options", + "url": "https://github.com/hapijs/joi/issues/884" + } + ], + "number": 74, + "url": "https://github.com/hapijs/joi/milestone/74", + "version": "8.4.0" + }, + { + "date": "2016-05-28T19:50:23Z", + "id": 1793767, + "issues": [ + { + "id": 157309796, + "labels": ["feature"], + "number": 904, + "title": "Add stripUnknownKeys option to Joi.validate", + "url": "https://github.com/hapijs/joi/issues/904" + }, + { + "id": 157028219, + "labels": ["feature"], + "number": 903, + "title": "stripUnknown: What is the expected behavior when validating nested data? (array)", + "url": "https://github.com/hapijs/joi/issues/903" + } + ], + "number": 73, + "url": "https://github.com/hapijs/joi/milestone/73", + "version": "8.3.0" + }, + { + "date": "2016-05-28T16:42:35Z", + "id": 1753277, + "issues": [ + { + "id": 135483456, + "labels": ["feature"], + "number": 833, + "title": "Proposal: string().truncate()", + "url": "https://github.com/hapijs/joi/issues/833" + }, + { + "id": 37544474, + "labels": ["feature"], + "number": 379, + "title": "Recursive schema (tree-like) validation", + "url": "https://github.com/hapijs/joi/issues/379" + } + ], + "number": 71, + "url": "https://github.com/hapijs/joi/milestone/71", + "version": "8.2.0" + }, + { + "date": "2016-05-24T18:28:59Z", + "id": 1785454, + "issues": [ + { + "id": 156558391, + "labels": ["bug"], + "number": 900, + "title": "When using reach, changing the label doesn't get applied, when an existing label is there", + "url": "https://github.com/hapijs/joi/issues/900" + } + ], + "number": 72, + "url": "https://github.com/hapijs/joi/milestone/72", + "version": "8.1.1" + }, + { + "date": "2016-05-07T20:43:13Z", + "id": 1631663, + "issues": [ + { + "id": 153614187, + "labels": ["feature"], + "number": 883, + "title": "Support error override per rule. Closes #882", + "url": "https://github.com/hapijs/joi/pull/883" + }, + { + "id": 153614165, + "labels": ["feature"], + "number": 882, + "title": "Support error override per rule", + "url": "https://github.com/hapijs/joi/issues/882" + } + ], + "number": 69, + "url": "https://github.com/hapijs/joi/milestone/69", + "version": "8.1.0" + }, + { + "date": "2016-03-18T19:28:38Z", + "id": 1654246, + "issues": [ + { + "id": 141942624, + "labels": ["bug"], + "number": 851, + "title": "Joi 8.x breaks describe().meta in alternatives", + "url": "https://github.com/hapijs/joi/issues/851" + } + ], + "number": 70, + "url": "https://github.com/hapijs/joi/milestone/70", + "version": "8.0.5" + }, + { + "date": "2016-03-01T12:12:48Z", + "id": 1614902, + "issues": [ + { + "id": 137500618, + "labels": ["bug"], + "number": 837, + "title": "Fix RegEx translation of IP6 BNF, where [] denotes an option", + "url": "https://github.com/hapijs/joi/pull/837" + } + ], + "number": 68, + "url": "https://github.com/hapijs/joi/milestone/68", + "version": "8.0.4" + }, + { + "date": "2016-03-01T12:12:47Z", + "id": 1604914, + "issues": [ + { + "id": 136220846, + "labels": ["bug"], + "number": 834, + "title": "TypeError: cannot delete property '0' of [object String]", + "url": "https://github.com/hapijs/joi/issues/834" + } + ], + "number": 67, + "url": "https://github.com/hapijs/joi/milestone/67", + "version": "8.0.3" + }, + { + "date": "2016-02-19T11:38:24Z", + "id": 1591981, + "issues": [ + { + "id": 134831649, + "labels": ["bug"], + "number": 830, + "title": "Return any.empty error for trimmed whitespace (fixes #827)", + "url": "https://github.com/hapijs/joi/pull/830" + }, + { + "id": 134735763, + "labels": ["bug"], + "number": 828, + "title": "Example for Array Schema Not Possible", + "url": "https://github.com/hapijs/joi/issues/828" + }, + { + "id": 134709834, + "labels": ["bug"], + "number": 827, + "title": "Unexpected Errors with Strings", + "url": "https://github.com/hapijs/joi/issues/827" + } + ], + "number": 66, + "url": "https://github.com/hapijs/joi/milestone/66", + "version": "8.0.2" + }, + { + "date": "2016-02-15T12:49:26Z", + "id": 1582932, + "issues": [ + { + "id": 133675371, + "labels": ["bug"], + "number": 824, + "title": "Description of assert modifying the original value", + "url": "https://github.com/hapijs/joi/issues/824" + } + ], + "number": 65, + "url": "https://github.com/hapijs/joi/milestone/65", + "version": "8.0.1" + }, + { + "date": "2016-02-14T21:08:12Z", + "id": 1000113, + "issues": [ + { + "id": 133579364, + "labels": ["breaking changes", "release notes"], + "number": 823, + "title": "8.0.0 Release Notes", + "url": "https://github.com/hapijs/joi/issues/823" + }, + { + "id": 132957481, + "labels": ["bug", "breaking changes"], + "number": 822, + "title": "Problem with multiple when and conditional forbidden field", + "url": "https://github.com/hapijs/joi/issues/822" + }, + { + "id": 115019489, + "labels": ["bug", "breaking changes"], + "number": 763, + "title": "Multiple alternatives with default", + "url": "https://github.com/hapijs/joi/issues/763" + }, + { + "id": 110386123, + "labels": ["feature"], + "number": 735, + "title": "Print string versions of NaN, Infinity and -Infinity - resolves #696", + "url": "https://github.com/hapijs/joi/pull/735" + }, + { + "id": 97079096, + "labels": ["bug"], + "number": 696, + "title": "NaN printed in cosole as null", + "url": "https://github.com/hapijs/joi/issues/696" + }, + { + "id": 60124142, + "labels": ["bug", "breaking changes"], + "number": 592, + "title": "Some refs not converted in .describe()", + "url": "https://github.com/hapijs/joi/issues/592" + } + ], + "number": 30, + "url": "https://github.com/hapijs/joi/milestone/30", + "version": "8.0.0" + }, + { + "date": "2016-02-11T15:36:41Z", + "id": 1572615, + "issues": [ + { + "id": 131237402, + "labels": ["bug", "feature"], + "number": 815, + "title": "uri() fails RFC3986 4.2 relative reference URIs", + "url": "https://github.com/hapijs/joi/issues/815" + }, + { + "id": 127818084, + "labels": ["feature", "support"], + "number": 807, + "title": "Question: Validate against sub-schema?", + "url": "https://github.com/hapijs/joi/issues/807" + }, + { + "id": 58991086, + "labels": ["support"], + "number": 565, + "title": "Combine uppercase with valid", + "url": "https://github.com/hapijs/joi/issues/565" + } + ], + "number": 63, + "url": "https://github.com/hapijs/joi/milestone/63", + "version": "7.3.0" + }, + { + "date": "2016-01-29T13:44:42Z", + "id": 1551036, + "issues": [ + { + "id": 129528912, + "labels": ["bug"], + "number": 812, + "title": "Improve error message", + "url": "https://github.com/hapijs/joi/issues/812" + } + ], + "number": 62, + "url": "https://github.com/hapijs/joi/milestone/62", + "version": "7.2.3" + }, + { + "date": "2016-01-19T14:52:40Z", + "id": 1515216, + "issues": [ + { + "id": 127442805, + "labels": ["bug"], + "number": 803, + "title": "Label declaration/Validation", + "url": "https://github.com/hapijs/joi/issues/803" + } + ], + "number": 61, + "url": "https://github.com/hapijs/joi/milestone/61", + "version": "7.2.2" + }, + { + "date": "2016-01-16T19:24:01Z", + "id": 1510423, + "issues": [ + { + "id": 127045674, + "labels": ["documentation"], + "number": 800, + "title": "Generate versioned API Reference link in README", + "url": "https://github.com/hapijs/joi/pull/800" + } + ], + "number": 60, + "url": "https://github.com/hapijs/joi/milestone/60", + "version": "7.2.1" + }, + { + "date": "2016-01-14T18:29:12Z", + "id": 1475693, + "issues": [ + { + "id": 124500461, + "labels": ["bug", "feature"], + "number": 791, + "title": "Date enhancements and support for Unix Timestamps", + "url": "https://github.com/hapijs/joi/pull/791" + }, + { + "id": 124276811, + "labels": ["bug"], + "number": 789, + "title": "Date() does not validate Unix timestamp with fractional seconds (decimals)", + "url": "https://github.com/hapijs/joi/issues/789" + }, + { + "id": 123972804, + "labels": ["feature"], + "number": 787, + "title": "Add a arity predicate for functions", + "url": "https://github.com/hapijs/joi/pull/787" + } + ], + "number": 59, + "url": "https://github.com/hapijs/joi/milestone/59", + "version": "7.2.0" + }, + { + "date": "2015-12-26T18:20:49Z", + "id": 1474788, + "issues": [ + { + "id": 119134283, + "labels": ["feature"], + "number": 779, + "title": "Throw custom Joi Errors", + "url": "https://github.com/hapijs/joi/issues/779" + } + ], + "number": 58, + "url": "https://github.com/hapijs/joi/milestone/58", + "version": "7.1.0" + }, + { + "date": "2015-11-26T12:15:45Z", + "id": 1429293, + "issues": [ + { + "id": 118848681, + "labels": ["bug"], + "number": 774, + "title": "Fix any.default() returns default object reference", + "url": "https://github.com/hapijs/joi/pull/774" + }, + { + "id": 118832624, + "labels": ["bug"], + "number": 773, + "title": "`Joi.validate()` returns default object reference instead of clone", + "url": "https://github.com/hapijs/joi/issues/773" + } + ], + "number": 56, + "url": "https://github.com/hapijs/joi/milestone/56", + "version": "7.0.1" + }, + { + "date": "2015-11-02T09:41:53Z", + "id": 1387648, + "issues": [ + { + "id": 114560357, + "labels": ["breaking changes", "release notes"], + "number": 759, + "title": "7.0.0 Release Notes", + "url": "https://github.com/hapijs/joi/issues/759" + }, + { + "id": 114495871, + "labels": ["bug", "breaking changes"], + "number": 756, + "title": "es6. Closes #754. Closes 755", + "url": "https://github.com/hapijs/joi/pull/756" + }, + { + "id": 114493973, + "labels": ["bug"], + "number": 755, + "title": "Don't annotate non-object values", + "url": "https://github.com/hapijs/joi/issues/755" + }, + { + "id": 114488994, + "labels": ["breaking changes"], + "number": 754, + "title": "ES6 style changes and node v4", + "url": "https://github.com/hapijs/joi/issues/754" + } + ], + "number": 55, + "url": "https://github.com/hapijs/joi/milestone/55", + "version": "7.0.0" + }, + { + "date": "2015-11-26T12:15:53Z", + "id": 1431031, + "issues": [ + { + "id": 119031624, + "labels": ["bug"], + "number": 777, + "title": "Fix any.default() returns default object reference", + "url": "https://github.com/hapijs/joi/pull/777" + } + ], + "number": 57, + "url": "https://github.com/hapijs/joi/milestone/57", + "version": "6.10.1" + }, + { + "date": "2015-11-01T22:02:46Z", + "id": 1337958, + "issues": [ + { + "id": 114123394, + "labels": ["bug", "feature"], + "number": 753, + "title": "Add default status 400 to error thrown by Joi.assert()", + "url": "https://github.com/hapijs/joi/issues/753" + }, + { + "id": 112898811, + "labels": ["bug"], + "number": 747, + "title": "removes leading \".\" from path at root object level", + "url": "https://github.com/hapijs/joi/pull/747" + }, + { + "id": 111104483, + "labels": ["feature"], + "number": 740, + "title": "Exception throw on undefined object key makes it difficult to track down issue", + "url": "https://github.com/hapijs/joi/issues/740" + } + ], + "number": 53, + "url": "https://github.com/hapijs/joi/milestone/53", + "version": "6.10.0" + }, + { + "date": "2015-10-15T20:55:01Z", + "id": 1357614, + "issues": [ + { + "id": 111685055, + "labels": ["bug"], + "number": 745, + "title": "Describe ordered arrays", + "url": "https://github.com/hapijs/joi/issues/745" + }, + { + "id": 110724465, + "labels": ["bug"], + "number": 737, + "title": "makes allow/valid/invalid not accept undefined #734", + "url": "https://github.com/hapijs/joi/pull/737" + }, + { + "id": 110254524, + "labels": ["bug"], + "number": 734, + "title": "Joi shouldn't allow Joi.any().valid(undefined).required()", + "url": "https://github.com/hapijs/joi/issues/734" + } + ], + "number": 54, + "url": "https://github.com/hapijs/joi/milestone/54", + "version": "6.9.1" + }, + { + "date": "2015-10-05T11:14:43Z", + "id": 1335297, + "issues": [ + { + "id": 95901619, + "labels": ["feature"], + "number": 688, + "title": "Toggable ordered flag for array to match items against input in order", + "url": "https://github.com/hapijs/joi/pull/688" + }, + { + "id": 81505276, + "labels": ["feature"], + "number": 659, + "title": "Allow treating arrays as objects", + "url": "https://github.com/hapijs/joi/issues/659" + } + ], + "number": 51, + "url": "https://github.com/hapijs/joi/milestone/51", + "version": "6.9.0" + }, + { + "date": "2015-10-02T19:20:54Z", + "id": 1335332, + "issues": [ + { + "id": 109545996, + "labels": ["bug"], + "number": 730, + "title": "Fix function properties validation. Closes #729", + "url": "https://github.com/hapijs/joi/pull/730" + }, + { + "id": 109545904, + "labels": ["bug"], + "number": 729, + "title": "Function keys validation converts function to object", + "url": "https://github.com/hapijs/joi/issues/729" + } + ], + "number": 52, + "url": "https://github.com/hapijs/joi/milestone/52", + "version": "6.8.1" + }, + { + "date": "2015-10-02T17:43:03Z", + "id": 1302961, + "issues": [ + { + "id": 109531683, + "labels": ["feature"], + "number": 728, + "title": "Allow functions to act as objects. Closes #727", + "url": "https://github.com/hapijs/joi/pull/728" + }, + { + "id": 109531571, + "labels": ["feature"], + "number": 727, + "title": "Allow function types to behave as object (e.g. have keys)", + "url": "https://github.com/hapijs/joi/issues/727" + } + ], + "number": 49, + "url": "https://github.com/hapijs/joi/milestone/49", + "version": "6.8.0" + }, + { + "date": "2015-10-02T17:19:05Z", + "id": 1309369, + "issues": [ + { + "id": 106563973, + "labels": ["bug"], + "number": 721, + "title": "The index of an incorrect array entry is returned instead of the field name", + "url": "https://github.com/hapijs/joi/issues/721" + } + ], + "number": 50, + "url": "https://github.com/hapijs/joi/milestone/50", + "version": "6.7.1" + }, + { + "date": "2015-09-13T11:39:48Z", + "id": 1219129, + "issues": [ + { + "id": 101779037, + "labels": ["bug", "support"], + "number": 710, + "title": "Extending a schema", + "url": "https://github.com/hapijs/joi/issues/710" + }, + { + "id": 101446681, + "labels": ["feature"], + "number": 708, + "title": "add attempt function", + "url": "https://github.com/hapijs/joi/pull/708" + }, + { + "id": 99174818, + "labels": ["bug"], + "number": 703, + "title": "No dependency validation when object stripUnknown set to true", + "url": "https://github.com/hapijs/joi/issues/703" + }, + { + "id": 98798636, + "labels": ["feature"], + "number": 702, + "title": "add hapi to package.json keywords so joi is searchable", + "url": "https://github.com/hapijs/joi/pull/702" + } + ], + "number": 47, + "url": "https://github.com/hapijs/joi/milestone/47", + "version": "6.7.0" + }, + { + "date": "2015-07-22T22:32:08Z", + "id": 1221166, + "issues": [ + { + "id": 96650125, + "labels": ["bug"], + "number": 693, + "title": "Use hasOwnProperty from native object", + "url": "https://github.com/hapijs/joi/issues/693" + } + ], + "number": 48, + "url": "https://github.com/hapijs/joi/milestone/48", + "version": "6.6.1" + }, + { + "date": "2015-07-21T21:24:04Z", + "id": 1202685, + "issues": [ + { + "id": 96159994, + "labels": ["bug"], + "number": 690, + "title": "removes trailing \".\" from or path", + "url": "https://github.com/hapijs/joi/pull/690" + }, + { + "id": 94599661, + "labels": ["bug"], + "number": 684, + "title": "fix unknown nested key path", + "url": "https://github.com/hapijs/joi/pull/684" + }, + { + "id": 94359335, + "labels": ["feature"], + "number": 683, + "title": "Add the \"noDefaults\" option", + "url": "https://github.com/hapijs/joi/pull/683" + }, + { + "id": 94300857, + "labels": ["feature"], + "number": 682, + "title": "Validate without applying default values", + "url": "https://github.com/hapijs/joi/issues/682" + } + ], + "number": 46, + "url": "https://github.com/hapijs/joi/milestone/46", + "version": "6.6.0" + }, + { + "date": "2015-06-24T10:14:48Z", + "id": 1151470, + "issues": [ + { + "id": 86679973, + "labels": ["feature"], + "number": 668, + "title": "allow passing an error object as message to assert", + "url": "https://github.com/hapijs/joi/pull/668" + }, + { + "id": 80666468, + "labels": ["bug"], + "number": 656, + "title": "Updated regexp for more robust ISO 8601 validation", + "url": "https://github.com/hapijs/joi/pull/656" + }, + { + "id": 77724506, + "labels": ["feature"], + "number": 649, + "title": "Implementation of white space normalisation.", + "url": "https://github.com/hapijs/joi/pull/649" + }, + { + "id": 77719915, + "labels": ["feature"], + "number": 648, + "title": "Allow normalisation of white space", + "url": "https://github.com/hapijs/joi/issues/648" + }, + { + "id": 59955566, + "labels": ["feature"], + "number": 586, + "title": "[request] string().replace(pattern)", + "url": "https://github.com/hapijs/joi/issues/586" + } + ], + "number": 45, + "url": "https://github.com/hapijs/joi/milestone/45", + "version": "6.5.0" + }, + { + "date": "2015-05-27T21:06:57Z", + "id": 1136856, + "issues": [ + { + "id": 81620894, + "labels": ["bug"], + "number": 660, + "title": "stripUnkown on arrays removes valid objects when multiple items are defined", + "url": "https://github.com/hapijs/joi/issues/660" + } + ], + "number": 44, + "url": "https://github.com/hapijs/joi/milestone/44", + "version": "6.4.3" + }, + { + "date": "2015-05-23T14:29:30Z", + "id": 1126930, + "issues": [ + { + "id": 79855155, + "labels": ["bug"], + "number": 654, + "title": "Fix allowing context refs on some string, number and date methods", + "url": "https://github.com/hapijs/joi/pull/654" + } + ], + "number": 43, + "url": "https://github.com/hapijs/joi/milestone/43", + "version": "6.4.2" + }, + { + "date": "2015-05-23T14:19:39Z", + "id": 1084005, + "issues": [ + { + "id": 68675091, + "labels": ["support"], + "number": 629, + "title": "help with `.or()`", + "url": "https://github.com/hapijs/joi/issues/629" + } + ], + "number": 42, + "url": "https://github.com/hapijs/joi/milestone/42", + "version": "6.4.0" + }, + { + "date": "2015-04-23T21:40:58Z", + "id": 1081294, + "issues": [ + { + "id": 70241860, + "labels": ["bug", "feature"], + "number": 632, + "title": "Nested whens don't work", + "url": "https://github.com/hapijs/joi/issues/632" + } + ], + "number": 41, + "url": "https://github.com/hapijs/joi/milestone/41", + "version": "6.3.0" + }, + { + "date": "2015-04-23T21:36:03Z", + "id": 1071390, + "issues": [ + { + "id": 41548193, + "labels": ["feature"], + "number": 413, + "title": "Create default [highly nested] object easily?", + "url": "https://github.com/hapijs/joi/issues/413" + } + ], + "number": 40, + "url": "https://github.com/hapijs/joi/milestone/40", + "version": "6.2.0" + }, + { + "date": "2015-04-13T16:40:03Z", + "id": 1065325, + "issues": [ + { + "id": 68126368, + "labels": ["bug"], + "number": 628, + "title": "Alternatives throw typeError when \"is: null\" is used", + "url": "https://github.com/hapijs/joi/issues/628" + } + ], + "number": 39, + "url": "https://github.com/hapijs/joi/milestone/39", + "version": "6.1.2" + }, + { + "date": "2015-04-09T23:11:31Z", + "id": 1061146, + "issues": [ + { + "id": 67434007, + "labels": ["bug"], + "number": 627, + "title": "Property is always required even when my When() condition isn't met.", + "url": "https://github.com/hapijs/joi/issues/627" + } + ], + "number": 38, + "url": "https://github.com/hapijs/joi/milestone/38", + "version": "6.1.1" + }, + { + "date": "2015-04-02T21:51:22Z", + "id": 1014225, + "issues": [ + { + "id": 64686803, + "labels": ["feature"], + "number": 619, + "title": "Add IP Address Validation and Separate IP and URI Logic to Files", + "url": "https://github.com/hapijs/joi/pull/619" + }, + { + "id": 64305243, + "labels": ["feature"], + "number": 616, + "title": "Add ignoreUndefined flag for rename()", + "url": "https://github.com/hapijs/joi/pull/616" + }, + { + "id": 64221467, + "labels": ["feature"], + "number": 614, + "title": "Error when .rename() from undefined", + "url": "https://github.com/hapijs/joi/issues/614" + }, + { + "id": 62754880, + "labels": ["bug"], + "number": 611, + "title": "Number compare functions allow decimal numbers", + "url": "https://github.com/hapijs/joi/pull/611" + }, + { + "id": 62552338, + "labels": ["bug"], + "number": 610, + "title": "Support for decimal numbers for min, max, less, greater number methods", + "url": "https://github.com/hapijs/joi/pull/610" + }, + { + "id": 62545962, + "labels": ["bug"], + "number": 609, + "title": "number min/max/greater/less do not allow decimal values", + "url": "https://github.com/hapijs/joi/issues/609" + }, + { + "id": 60448484, + "labels": ["feature"], + "number": 597, + "title": "Add reference support for String.min/max/length", + "url": "https://github.com/hapijs/joi/pull/597" + }, + { + "id": 60446363, + "labels": ["feature"], + "number": 596, + "title": "Add reference support for Number.min/max/greater/less", + "url": "https://github.com/hapijs/joi/pull/596" + }, + { + "id": 59920223, + "labels": ["bug"], + "number": 583, + "title": "do ref-able operations support referring to a list?", + "url": "https://github.com/hapijs/joi/issues/583" + }, + { + "id": 58622981, + "labels": ["feature"], + "number": 560, + "title": "References for Number comparisons?", + "url": "https://github.com/hapijs/joi/issues/560" + }, + { + "id": 37710898, + "labels": ["feature"], + "number": 380, + "title": "Comparison between fields", + "url": "https://github.com/hapijs/joi/issues/380" + } + ], + "number": 34, + "url": "https://github.com/hapijs/joi/milestone/34", + "version": "6.1.0" + }, + { + "date": "2015-03-11T18:26:39Z", + "id": 1016988, + "issues": [ + { + "id": 59569274, + "labels": ["bug"], + "number": 580, + "title": "Annotate fails on circular objects", + "url": "https://github.com/hapijs/joi/issues/580" + } + ], + "number": 37, + "url": "https://github.com/hapijs/joi/milestone/37", + "version": "6.0.7" + }, + { + "date": "2015-03-11T11:22:39Z", + "id": 1016232, + "issues": [ + { + "id": 60641754, + "labels": ["bug"], + "number": 602, + "title": "Validate multiple options with presence key in it", + "url": "https://github.com/hapijs/joi/pull/602" + }, + { + "id": 60637536, + "labels": ["bug"], + "number": 601, + "title": "Error: stripUnknown should be one of required, optional, forbidden, ignore", + "url": "https://github.com/hapijs/joi/issues/601" + } + ], + "number": 36, + "url": "https://github.com/hapijs/joi/milestone/36", + "version": "6.0.6" + }, + { + "date": "2015-03-10T23:50:02Z", + "id": 1015698, + "issues": [ + { + "id": 60587682, + "labels": ["bug"], + "number": 600, + "title": "Fix regression on unsafe string escaping in language", + "url": "https://github.com/hapijs/joi/issues/600" + } + ], + "number": 35, + "url": "https://github.com/hapijs/joi/milestone/35", + "version": "6.0.5" + }, + { + "date": "2015-03-08T14:35:20Z", + "id": 1011168, + "issues": [ + { + "id": 60235130, + "labels": ["bug"], + "number": 593, + "title": ".rename() does not work when new value is undefined", + "url": "https://github.com/hapijs/joi/issues/593" + } + ], + "number": 33, + "url": "https://github.com/hapijs/joi/milestone/33", + "version": "6.0.4" + }, + { + "date": "2015-03-05T21:27:49Z", + "id": 1008241, + "issues": [ + { + "id": 59993946, + "labels": ["bug"], + "number": 589, + "title": "Joi.array().items(...) error message changes", + "url": "https://github.com/hapijs/joi/issues/589" + } + ], + "number": 32, + "url": "https://github.com/hapijs/joi/milestone/32", + "version": "6.0.3" + }, + { + "date": "2015-03-05T13:29:32Z", + "id": 1007506, + "issues": [ + { + "id": 59949924, + "labels": ["bug"], + "number": 585, + "title": "No conversion is done inside Joi.array().items", + "url": "https://github.com/hapijs/joi/issues/585" + } + ], + "number": 31, + "url": "https://github.com/hapijs/joi/milestone/31", + "version": "6.0.1" + }, + { + "date": "2015-03-02T22:30:19Z", + "id": 946814, + "issues": [ + { + "id": 59562209, + "labels": ["breaking changes", "release notes"], + "number": 579, + "title": "6.0.0 Release Notes", + "url": "https://github.com/hapijs/joi/issues/579" + }, + { + "id": 59353596, + "labels": ["feature", "breaking changes"], + "number": 578, + "title": "respect stripUnknown in arrays", + "url": "https://github.com/hapijs/joi/pull/578" + }, + { + "id": 59157357, + "labels": ["feature"], + "number": 572, + "title": "add any.strip for objects and arrays", + "url": "https://github.com/hapijs/joi/pull/572" + }, + { + "id": 59063423, + "labels": ["bug"], + "number": 569, + "title": "Lost key after validation on assert", + "url": "https://github.com/hapijs/joi/issues/569" + }, + { + "id": 59055670, + "labels": ["bug"], + "number": 567, + "title": "Object with 'or', keys contains an array with a 'null' element", + "url": "https://github.com/hapijs/joi/issues/567" + }, + { + "id": 58831912, + "labels": ["bug", "breaking changes"], + "number": 561, + "title": "how to concat array of objects inside an object property", + "url": "https://github.com/hapijs/joi/issues/561" + }, + { + "id": 58426717, + "labels": ["feature", "breaking changes"], + "number": 559, + "title": "deprecate array.includes and array.excludes, use array.items and allow required and forbidden within", + "url": "https://github.com/hapijs/joi/pull/559" + }, + { + "id": 58343853, + "labels": ["bug", "breaking changes"], + "number": 557, + "title": "Incomplete validation message", + "url": "https://github.com/hapijs/joi/issues/557" + }, + { + "id": 58115671, + "labels": ["bug"], + "number": 555, + "title": "add some additional guards and tests for #363", + "url": "https://github.com/hapijs/joi/pull/555" + }, + { + "id": 57976093, + "labels": ["bug", "breaking changes"], + "number": 553, + "title": "Does array include allow nested object properties ", + "url": "https://github.com/hapijs/joi/issues/553" + }, + { + "id": 57045087, + "labels": ["feature"], + "number": 547, + "title": "string hex characters only", + "url": "https://github.com/hapijs/joi/issues/547" + }, + { + "id": 56911466, + "labels": ["feature"], + "number": 546, + "title": "Really custom messages are impossible", + "url": "https://github.com/hapijs/joi/issues/546" + }, + { + "id": 56725072, + "labels": ["feature"], + "number": 545, + "title": "allow passing a method to .default(), for #363", + "url": "https://github.com/hapijs/joi/pull/545" + }, + { + "id": 55884147, + "labels": ["feature"], + "number": 538, + "title": "added number.multiple()", + "url": "https://github.com/hapijs/joi/pull/538" + }, + { + "id": 55356251, + "labels": ["feature"], + "number": 536, + "title": "Consider renaming 'valid' to 'enum' or an alias", + "url": "https://github.com/hapijs/joi/issues/536" + }, + { + "id": 54921275, + "labels": ["bug", "breaking changes"], + "number": 534, + "title": "Bad behavior of Joi.object().concat()", + "url": "https://github.com/hapijs/joi/issues/534" + }, + { + "id": 54743101, + "labels": ["feature"], + "number": 532, + "title": "multipleOf method for Number?", + "url": "https://github.com/hapijs/joi/issues/532" + }, + { + "id": 51468467, + "labels": ["bug"], + "number": 511, + "title": "throw when invalid options are provided", + "url": "https://github.com/hapijs/joi/issues/511" + }, + { + "id": 50068392, + "labels": ["bug", "breaking changes"], + "number": 495, + "title": "joi.array().includes path and errors mismatch", + "url": "https://github.com/hapijs/joi/issues/495" + }, + { + "id": 49324331, + "labels": ["feature"], + "number": 488, + "title": "Allow options to be passed to string.email().", + "url": "https://github.com/hapijs/joi/pull/488" + }, + { + "id": 48609370, + "labels": ["feature", "breaking changes"], + "number": 484, + "title": "Helpful regexp message", + "url": "https://github.com/hapijs/joi/pull/484" + }, + { + "id": 46061239, + "labels": ["feature"], + "number": 457, + "title": "Add URI Validation", + "url": "https://github.com/hapijs/joi/pull/457" + }, + { + "id": 35643200, + "labels": ["feature"], + "number": 363, + "title": "support factory-function in .default() ?", + "url": "https://github.com/hapijs/joi/issues/363" + } + ], + "number": 29, + "url": "https://github.com/hapijs/joi/milestone/29", + "version": "6.0.0" + }, + { + "date": "2015-01-02T11:41:48Z", + "id": 884563, + "issues": [ + { + "id": 53235102, + "labels": ["bug"], + "number": 525, + "title": "Strange behaviour with date + raw", + "url": "https://github.com/hapijs/joi/issues/525" + }, + { + "id": 51725830, + "labels": ["feature"], + "number": 513, + "title": "Make alternatives.describe more consistent", + "url": "https://github.com/hapijs/joi/pull/513" + }, + { + "id": 51202722, + "labels": ["feature"], + "number": 510, + "title": "Add new requiredKeys option specifically for object keys", + "url": "https://github.com/hapijs/joi/issues/510" + }, + { + "id": 51098888, + "labels": ["feature"], + "number": 509, + "title": "Option to validate a date format but not convert to a date object", + "url": "https://github.com/hapijs/joi/issues/509" + }, + { + "id": 48085687, + "labels": ["feature"], + "number": 477, + "title": "Support for references in `date.min()` and `date.max()`?", + "url": "https://github.com/hapijs/joi/issues/477" + }, + { + "id": 40900534, + "labels": ["feature"], + "number": 404, + "title": "Possible referencing date field to other date field?", + "url": "https://github.com/hapijs/joi/issues/404" + } + ], + "number": 24, + "url": "https://github.com/hapijs/joi/milestone/24", + "version": "5.1.0" + }, + { + "date": "2014-12-02T09:52:53Z", + "id": 885815, + "issues": [ + { + "id": 50510189, + "labels": ["bug"], + "number": 505, + "title": "Convert date regex to date before comparison. Closes #503.", + "url": "https://github.com/hapijs/joi/pull/505" + }, + { + "id": 50508171, + "labels": ["bug"], + "number": 503, + "title": "Joi.date().iso() throws error when required() is used.", + "url": "https://github.com/hapijs/joi/issues/503" + } + ], + "number": 26, + "url": "https://github.com/hapijs/joi/milestone/26", + "version": "5.0.2" + }, + { + "date": "2014-12-01T07:21:58Z", + "id": 885024, + "issues": [ + { + "id": 50468910, + "labels": ["bug"], + "number": 502, + "title": "Joi.array() modifies original array", + "url": "https://github.com/hapijs/joi/issues/502" + } + ], "number": 25, - "title": "Rewrite Readme.md", - "url": "https://github.com/hapijs/joi/issues/25" - }, - { - "id": 9058616, - "labels": ["test"], + "url": "https://github.com/hapijs/joi/milestone/25", + "version": "5.0.1" + }, + { + "date": "2014-11-30T00:35:52Z", + "id": 869763, + "issues": [ + { + "id": 50442181, + "labels": ["breaking changes", "release notes"], + "number": 501, + "title": "5.0.0 Release Notes", + "url": "https://github.com/hapijs/joi/issues/501" + }, + { + "id": 50117171, + "labels": ["feature"], + "number": 498, + "title": "array().single()", + "url": "https://github.com/hapijs/joi/issues/498" + }, + { + "id": 50109820, + "labels": ["bug", "breaking changes"], + "number": 497, + "title": "array.unique doesn't validate duplicate dates", + "url": "https://github.com/hapijs/joi/issues/497" + }, + { + "id": 49887168, + "labels": ["feature", "breaking changes"], + "number": 494, + "title": "Joi.number allows Infinity", + "url": "https://github.com/hapijs/joi/issues/494" + }, + { + "id": 49400426, + "labels": ["bug"], + "number": 489, + "title": "add missing semicolon", + "url": "https://github.com/hapijs/joi/pull/489" + }, + { + "id": 48965142, + "labels": ["bug", "breaking changes"], + "number": 486, + "title": "array().includes() should not allow undefined", + "url": "https://github.com/hapijs/joi/issues/486" + }, + { + "id": 48655093, + "labels": ["feature", "breaking changes"], + "number": 485, + "title": "Round number.precision if options.convert", + "url": "https://github.com/hapijs/joi/issues/485" + }, + { + "id": 47025509, + "labels": ["feature"], + "number": 462, + "title": "Return context with errors.", + "url": "https://github.com/hapijs/joi/issues/462" + }, + { + "id": 37710968, + "labels": ["feature"], + "number": 381, + "title": "Transformation support", + "url": "https://github.com/hapijs/joi/issues/381" + } + ], "number": 23, - "title": "Add validation tests for every type's methods with complex combinations", - "url": "https://github.com/hapijs/joi/issues/23" - }, - { - "id": 9045048, - "labels": ["bug"], + "url": "https://github.com/hapijs/joi/milestone/23", + "version": "5.0.0" + }, + { + "date": "2014-11-17T20:02:16Z", + "id": 858087, + "issues": [ + { + "id": 48965208, + "labels": ["test"], + "number": 487, + "title": "Code assertions requires () for exist tests", + "url": "https://github.com/hapijs/joi/issues/487" + }, + { + "id": 48339909, + "labels": ["feature"], + "number": 481, + "title": "Validate object constructor.", + "url": "https://github.com/hapijs/joi/pull/481" + }, + { + "id": 41162565, + "labels": ["feature"], + "number": 408, + "title": "Check if value is a RegEx", + "url": "https://github.com/hapijs/joi/issues/408" + } + ], + "number": 21, + "url": "https://github.com/hapijs/joi/milestone/21", + "version": "4.9.0" + }, + { + "date": "2014-11-11T11:55:26Z", + "id": 859020, + "issues": [ + { + "id": 48180973, + "labels": ["bug"], + "number": 480, + "title": "Date \"now\" refers to date when schema was compiled", + "url": "https://github.com/hapijs/joi/issues/480" + } + ], + "number": 22, + "url": "https://github.com/hapijs/joi/milestone/22", + "version": "4.8.1" + }, + { + "date": "2014-11-07T23:14:12Z", + "id": 796568, + "issues": [ + { + "id": 48116762, + "labels": ["bug"], + "number": 478, + "title": "Retain object reference when no rules specified", + "url": "https://github.com/hapijs/joi/pull/478" + }, + { + "id": 48079308, + "labels": ["dependency"], + "number": 476, + "title": "Upgrade Lab", + "url": "https://github.com/hapijs/joi/issues/476" + }, + { + "id": 47660458, + "labels": ["bug"], + "number": 470, + "title": "Address internationalization issues.", + "url": "https://github.com/hapijs/joi/pull/470" + }, + { + "id": 47411034, + "labels": ["bug"], + "number": 469, + "title": "change implementation of creditcard to use string", + "url": "https://github.com/hapijs/joi/pull/469" + }, + { + "id": 47212674, + "labels": ["feature"], + "number": 466, + "title": "Named string regex patterns.", + "url": "https://github.com/hapijs/joi/pull/466" + }, + { + "id": 47210262, + "labels": ["feature"], + "number": 465, + "title": "implements credit card validation", + "url": "https://github.com/hapijs/joi/pull/465" + }, + { + "id": 47185404, + "labels": ["feature"], + "number": 464, + "title": "implements nand", + "url": "https://github.com/hapijs/joi/pull/464" + }, + { + "id": 46868208, + "labels": ["feature"], + "number": 461, + "title": "Add greater() and less() to number type. Closes #411", + "url": "https://github.com/hapijs/joi/pull/461" + }, + { + "id": 45987323, + "labels": ["bug"], + "number": 456, + "title": "correction for Describe with a \"0\" argument ", + "url": "https://github.com/hapijs/joi/pull/456" + }, + { + "id": 45848419, + "labels": ["bug"], + "number": 454, + "title": "Describe with a \"0\" argument ", + "url": "https://github.com/hapijs/joi/issues/454" + }, + { + "id": 44743652, + "labels": ["feature"], + "number": 449, + "title": "Enable to pass \"now\" in date.min and date.max", + "url": "https://github.com/hapijs/joi/pull/449" + }, + { + "id": 43928096, + "labels": ["feature"], + "number": 446, + "title": "Use Object.create in Any.clone to improve IE9 support", + "url": "https://github.com/hapijs/joi/pull/446" + }, + { + "id": 43328342, + "labels": ["feature"], + "number": 440, + "title": "Added any.label method", + "url": "https://github.com/hapijs/joi/pull/440" + }, + { + "id": 43290155, + "labels": ["feature"], + "number": 435, + "title": "Add format and iso to date type", + "url": "https://github.com/hapijs/joi/pull/435" + }, + { + "id": 42151721, + "labels": ["feature"], + "number": 422, + "title": "Credit card validation", + "url": "https://github.com/hapijs/joi/issues/422" + }, + { + "id": 41447074, + "labels": ["feature"], + "number": 411, + "title": "Number min/max exclusive or closed ranges respectively?", + "url": "https://github.com/hapijs/joi/issues/411" + }, + { + "id": 41161249, + "labels": ["feature"], + "number": 407, + "title": "ensure date does not occur in the past", + "url": "https://github.com/hapijs/joi/issues/407" + }, + { + "id": 40022307, + "labels": ["bug", "test"], + "number": 396, + "title": "Negative-Integer-Strings are not properly converted to Date instances", + "url": "https://github.com/hapijs/joi/pull/396" + }, + { + "id": 35639181, + "labels": ["feature"], + "number": 362, + "title": "Support NAND", + "url": "https://github.com/hapijs/joi/issues/362" + } + ], "number": 20, - "title": "String().valid doesn't invalidate bad values", - "url": "https://github.com/hapijs/joi/issues/20" - }, - { - "id": 9002161, - "labels": ["bug"], + "url": "https://github.com/hapijs/joi/milestone/20", + "version": "4.8.0" + }, + { + "date": "2014-09-20T07:26:58Z", + "id": 740876, + "issues": [ + { + "id": 43303669, + "labels": ["feature"], + "number": 437, + "title": "Support optional message prefix in assert()", + "url": "https://github.com/hapijs/joi/issues/437" + }, + { + "id": 43276958, + "labels": ["bug"], + "number": 434, + "title": "Fix typo.", + "url": "https://github.com/hapijs/joi/pull/434" + }, + { + "id": 43272650, + "labels": ["feature"], + "number": 433, + "title": "Override default presence", + "url": "https://github.com/hapijs/joi/pull/433" + }, + { + "id": 43271348, + "labels": ["feature"], + "number": 432, + "title": "Set different default presence mode (required, forbidden)", + "url": "https://github.com/hapijs/joi/issues/432" + }, + { + "id": 42819150, + "labels": ["feature"], + "number": 427, + "title": "Added ability to validate the number of decimal places", + "url": "https://github.com/hapijs/joi/pull/427" + }, + { + "id": 40812206, + "labels": ["feature"], + "number": 403, + "title": "Add duplicates validation to array", + "url": "https://github.com/hapijs/joi/pull/403" + }, + { + "id": 40208149, + "labels": ["dependency"], + "number": 398, + "title": "Upgrade lab 4.0", + "url": "https://github.com/hapijs/joi/issues/398" + }, + { + "id": 40177165, + "labels": ["bug"], + "number": 397, + "title": "Added check for global flag in pattern.", + "url": "https://github.com/hapijs/joi/pull/397" + }, + { + "id": 39235433, + "labels": ["feature"], + "number": 389, + "title": "Default Assert Message", + "url": "https://github.com/hapijs/joi/pull/389" + }, + { + "id": 38582785, + "labels": ["bug"], + "number": 385, + "title": "Path for array includes to contain key", + "url": "https://github.com/hapijs/joi/pull/385" + }, + { + "id": 37725440, + "labels": ["feature"], + "number": 383, + "title": "Describe object.pattern", + "url": "https://github.com/hapijs/joi/issues/383" + } + ], "number": 19, - "title": "StringType.min(3) doesn't validate undefined correctly", - "url": "https://github.com/hapijs/joi/issues/19" - }, - { - "id": 9001959, - "labels": [], + "url": "https://github.com/hapijs/joi/milestone/19", + "version": "4.7.0" + }, + { + "date": "2014-08-03T07:10:20Z", + "id": 690963, + "issues": [ + { + "id": 37287834, + "labels": ["non issue"], + "number": 378, + "title": "Removed unused sys import.", + "url": "https://github.com/hapijs/joi/pull/378" + } + ], "number": 18, - "title": "Adding tests to joi", - "url": "https://github.com/hapijs/joi/pull/18" - } - ], - "number": 1, - "url": "https://github.com/hapijs/joi/milestone/1", - "version": "0.0.6" - } + "url": "https://github.com/hapijs/joi/milestone/18", + "version": "4.6.2" + }, + { + "date": "2014-06-14T05:04:18Z", + "id": 684659, + "issues": [ + { + "id": 35703485, + "labels": ["bug"], + "number": 366, + "title": "Bug Hunt: empty object() + pattern() + unknown(false) fails to error", + "url": "https://github.com/hapijs/joi/pull/366" + }, + { + "id": 35094670, + "labels": ["bug"], + "number": 359, + "title": "Allow empty string after trim", + "url": "https://github.com/hapijs/joi/pull/359" + }, + { + "id": 35034580, + "labels": ["bug"], + "number": 357, + "title": "Cast milisecond strings to a date object", + "url": "https://github.com/hapijs/joi/pull/357" + }, + { + "id": 34446227, + "labels": ["bug"], + "number": 355, + "title": "Don't rename when there is nothing to rename.", + "url": "https://github.com/hapijs/joi/pull/355" + }, + { + "id": 32190219, + "labels": ["feature"], + "number": 299, + "title": "Sanitizing blanks", + "url": "https://github.com/hapijs/joi/issues/299" + } + ], + "number": 17, + "url": "https://github.com/hapijs/joi/milestone/17", + "version": "4.6.1" + }, + { + "date": "2014-06-13T23:07:01Z", + "id": 671135, + "issues": [ + { + "id": 35245349, + "labels": ["feature"], + "number": 360, + "title": "Joi.assert()", + "url": "https://github.com/hapijs/joi/issues/360" + }, + { + "id": 34400342, + "labels": ["feature"], + "number": 354, + "title": "isemail 1.0", + "url": "https://github.com/hapijs/joi/issues/354" + } + ], + "number": 16, + "url": "https://github.com/hapijs/joi/milestone/16", + "version": "4.6.0" + }, + { + "date": "2014-05-26T18:23:45Z", + "id": 669484, + "issues": [ + { + "id": 34321578, + "labels": ["feature"], + "number": 351, + "title": "Add Hoek isImmutable flag", + "url": "https://github.com/hapijs/joi/issues/351" + } + ], + "number": 15, + "url": "https://github.com/hapijs/joi/milestone/15", + "version": "4.5.0" + }, + { + "date": "2014-05-24T19:16:41Z", + "id": 668354, + "issues": [ + { + "id": 34240516, + "labels": ["feature"], + "number": 349, + "title": "Support {{!key}} notation to securely encode unsafe values", + "url": "https://github.com/hapijs/joi/issues/349" + }, + { + "id": 33926197, + "labels": ["feature"], + "number": 335, + "title": "Recognize Joi errors", + "url": "https://github.com/hapijs/joi/issues/335" + } + ], + "number": 14, + "url": "https://github.com/hapijs/joi/milestone/14", + "version": "4.4.0" + }, + { + "date": "2014-05-22T17:32:57Z", + "id": 663576, + "issues": [ + { + "id": 34037962, + "labels": ["bug", "breaking changes"], + "number": 341, + "title": "Array includes fails if called multiple times", + "url": "https://github.com/hapijs/joi/issues/341" + }, + { + "id": 34032281, + "labels": ["feature", "breaking changes"], + "number": 340, + "title": "Replace internal implementation of required/optional/forbidden", + "url": "https://github.com/hapijs/joi/issues/340" + }, + { + "id": 34025241, + "labels": ["bug"], + "number": 339, + "title": "when() option 'is' cannot be falsey", + "url": "https://github.com/hapijs/joi/issues/339" + }, + { + "id": 33961321, + "labels": ["bug"], + "number": 337, + "title": "alternatives().when() behaves inconsistently with any().when()", + "url": "https://github.com/hapijs/joi/issues/337" + }, + { + "id": 33959104, + "labels": ["bug"], + "number": 336, + "title": "concat() fails to remove valid/invalid values", + "url": "https://github.com/hapijs/joi/issues/336" + }, + { + "id": 33863888, + "labels": ["bug"], + "number": 334, + "title": "Bug hunt: Joi.any().when is not evaluated it its value is empty even if the when condition is fulfilled.", + "url": "https://github.com/hapijs/joi/pull/334" + }, + { + "id": 33842766, + "labels": ["bug"], + "number": 332, + "title": "Joi.any().when is not evaluated if empty", + "url": "https://github.com/hapijs/joi/issues/332" + }, + { + "id": 33738647, + "labels": ["bug"], + "number": 326, + "title": "Bug Hunt: unable to rename keys that are empty strings", + "url": "https://github.com/hapijs/joi/pull/326" + }, + { + "id": 33736309, + "labels": ["bug"], + "number": 325, + "title": "Bug Hunt: empty string key causes incorrect validation", + "url": "https://github.com/hapijs/joi/pull/325" + }, + { + "id": 33540346, + "labels": ["feature"], + "number": 321, + "title": "add uppercase, lowercase, and trim for strings", + "url": "https://github.com/hapijs/joi/pull/321" + }, + { + "id": 33446326, + "labels": ["bug"], + "number": 317, + "title": "Bug Hunt: invalid Date objects do not cause failure.", + "url": "https://github.com/hapijs/joi/pull/317" + }, + { + "id": 33348783, + "labels": ["bug"], + "number": 313, + "title": "Recursively describes the includes of array schemas #312", + "url": "https://github.com/hapijs/joi/pull/313" + }, + { + "id": 33264227, + "labels": ["bug"], + "number": 312, + "title": "Describe should also compile and describe array's rules", + "url": "https://github.com/hapijs/joi/issues/312" + }, + { + "id": 33199467, + "labels": ["feature"], + "number": 311, + "title": "Feature/meta", + "url": "https://github.com/hapijs/joi/pull/311" + }, + { + "id": 33144642, + "labels": ["bug"], + "number": 310, + "title": "Bug Hunt: email addresses longer than 254 should not be valid", + "url": "https://github.com/hapijs/joi/pull/310" + }, + { + "id": 33144403, + "labels": ["bug"], + "number": 309, + "title": "Bug Hunt: email addresses with a \"local part\" > 64 characters should not be validated", + "url": "https://github.com/hapijs/joi/pull/309" + }, + { + "id": 32161878, + "labels": ["bug"], + "number": 293, + "title": "Verify encoding type is string", + "url": "https://github.com/hapijs/joi/pull/293" + }, + { + "id": 32160271, + "labels": ["bug"], + "number": 292, + "title": "Add test to check for valid encoding param to binary", + "url": "https://github.com/hapijs/joi/pull/292" + }, + { + "id": 32123559, + "labels": ["bug"], + "number": 288, + "title": "Bug Hunt: valid IPv6 domain literals in email addresses fail validation", + "url": "https://github.com/hapijs/joi/pull/288" + }, + { + "id": 32095003, + "labels": [], + "number": 282, + "title": "Bug Hunt: double-quoted local-parts of email addresses cause validation failure", + "url": "https://github.com/hapijs/joi/pull/282" + }, + { + "id": 31710177, + "labels": ["feature"], + "number": 261, + "title": "Object key rules by patterns", + "url": "https://github.com/hapijs/joi/issues/261" + }, + { + "id": 31288153, + "labels": ["feature"], + "number": 241, + "title": "Thoughts on something like any.meta(obj)?", + "url": "https://github.com/hapijs/joi/issues/241" + }, + { + "id": 30381277, + "labels": ["feature"], + "number": 220, + "title": "string().lowercase() and string().uppsercase()", + "url": "https://github.com/hapijs/joi/issues/220" + } + ], + "number": 12, + "url": "https://github.com/hapijs/joi/milestone/12", + "version": "4.3.0" + }, + { + "date": "2014-05-19T18:03:49Z", + "id": 662660, + "issues": [ + { + "id": 33819269, + "labels": ["bug"], + "number": 330, + "title": "Cannot override context", + "url": "https://github.com/hapijs/joi/issues/330" + }, + { + "id": 33819198, + "labels": ["bug"], + "number": 329, + "title": "Joi.forbidden() fails when added to an existing type", + "url": "https://github.com/hapijs/joi/issues/329" + } + ], + "number": 11, + "url": "https://github.com/hapijs/joi/milestone/11", + "version": "4.2.1" + }, + { + "date": "2014-05-18T22:41:20Z", + "id": 658333, + "issues": [ + { + "id": 33757034, + "labels": ["feature"], + "number": 328, + "title": "Support references to external context", + "url": "https://github.com/hapijs/joi/issues/328" + }, + { + "id": 33708144, + "labels": ["test"], + "number": 324, + "title": "Test for retaining ignored values", + "url": "https://github.com/hapijs/joi/issues/324" + }, + { + "id": 33704606, + "labels": ["feature"], + "number": 323, + "title": "Joi.forbidden()", + "url": "https://github.com/hapijs/joi/issues/323" + }, + { + "id": 33556741, + "labels": ["feature"], + "number": 322, + "title": "Make callback optional argument", + "url": "https://github.com/hapijs/joi/issues/322" + }, + { + "id": 33466617, + "labels": ["test"], + "number": 318, + "title": "Convert tests to actual async style", + "url": "https://github.com/hapijs/joi/issues/318" + } + ], + "number": 10, + "url": "https://github.com/hapijs/joi/milestone/10", + "version": "4.2.0" + }, + { + "date": "2014-05-14T07:06:53Z", + "id": 637766, + "issues": [ + { + "id": 32171449, + "labels": ["feature"], + "number": 296, + "title": "Allow valid to take buffer values", + "url": "https://github.com/hapijs/joi/issues/296" + }, + { + "id": 32157881, + "labels": ["bug"], + "number": 291, + "title": "remove extra var internals. Closes #290", + "url": "https://github.com/hapijs/joi/pull/291" + }, + { + "id": 32157692, + "labels": ["bug"], + "number": 290, + "title": "extra var internals in binary.js", + "url": "https://github.com/hapijs/joi/issues/290" + }, + { + "id": 32108620, + "labels": ["feature"], + "number": 287, + "title": "object.unknown()", + "url": "https://github.com/hapijs/joi/issues/287" + }, + { + "id": 32106004, + "labels": ["bug"], + "number": 285, + "title": "Fix to make object.and all-or-nothing - fixes #284", + "url": "https://github.com/hapijs/joi/pull/285" + }, + { + "id": 32105627, + "labels": [], + "number": 284, + "title": "Bug Hunt: object.and is supposed to be all-or-nothing", + "url": "https://github.com/hapijs/joi/pull/284" + } + ], + "number": 9, + "url": "https://github.com/hapijs/joi/milestone/9", + "version": "4.1.0" + }, + { + "date": "2014-04-23T07:51:04Z", + "id": 625777, + "issues": [ + { + "id": 32038222, + "labels": ["feature", "breaking changes"], + "number": 278, + "title": "Cleanup language file", + "url": "https://github.com/hapijs/joi/issues/278" + }, + { + "id": 32024151, + "labels": ["bug"], + "number": 277, + "title": "date() allows boolean value", + "url": "https://github.com/hapijs/joi/issues/277" + }, + { + "id": 32013776, + "labels": ["feature"], + "number": 276, + "title": "binary().encoding()", + "url": "https://github.com/hapijs/joi/issues/276" + }, + { + "id": 32012679, + "labels": ["feature"], + "number": 275, + "title": "Support when() on any()", + "url": "https://github.com/hapijs/joi/issues/275" + }, + { + "id": 31996279, + "labels": ["breaking changes"], + "number": 274, + "title": "Undo #273, remove options from schema.validate()", + "url": "https://github.com/hapijs/joi/issues/274" + }, + { + "id": 31940165, + "labels": ["non issue"], + "number": 273, + "title": "Remove module generic validate() and describe()", + "url": "https://github.com/hapijs/joi/issues/273" + }, + { + "id": 31940148, + "labels": ["non issue"], + "number": 272, + "title": "Undo 268", + "url": "https://github.com/hapijs/joi/issues/272" + }, + { + "id": 31934254, + "labels": ["feature"], + "number": 271, + "title": "schema concat()", + "url": "https://github.com/hapijs/joi/issues/271" + }, + { + "id": 31926541, + "labels": ["bug"], + "number": 270, + "title": "Alt fails to report references", + "url": "https://github.com/hapijs/joi/issues/270" + }, + { + "id": 31923071, + "labels": ["feature", "breaking changes"], + "number": 269, + "title": "Rename alternatives.attempt() with try()", + "url": "https://github.com/hapijs/joi/issues/269" + }, + { + "id": 31861441, + "labels": ["non issue"], + "number": 268, + "title": "Move interfaces from func at root to const", + "url": "https://github.com/hapijs/joi/issues/268" + }, + { + "id": 31859640, + "labels": ["feature"], + "number": 267, + "title": "Add alternatives.attempt() to allow adding more schemas", + "url": "https://github.com/hapijs/joi/issues/267" + }, + { + "id": 31857809, + "labels": ["breaking changes"], + "number": 266, + "title": "Make [] and alternatives() behave exactly the same", + "url": "https://github.com/hapijs/joi/issues/266" + }, + { + "id": 31853418, + "labels": ["feature"], + "number": 265, + "title": "object.and()", + "url": "https://github.com/hapijs/joi/issues/265" + }, + { + "id": 31852612, + "labels": ["feature"], + "number": 264, + "title": "Support references in default()", + "url": "https://github.com/hapijs/joi/issues/264" + }, + { + "id": 31840438, + "labels": ["feature"], + "number": 263, + "title": "object.assert()", + "url": "https://github.com/hapijs/joi/issues/263" + }, + { + "id": 31838297, + "labels": ["feature"], + "number": 262, + "title": "object.keys() append behavior", + "url": "https://github.com/hapijs/joi/issues/262" + }, + { + "id": 31708765, + "labels": ["feature"], + "number": 260, + "title": "Allow referencing the value of other keys in conditions", + "url": "https://github.com/hapijs/joi/issues/260" + }, + { + "id": 31707504, + "labels": ["feature"], + "number": 259, + "title": "Error messages should not include ", + "url": "https://github.com/hapijs/joi/issues/259" + }, + { + "id": 31707437, + "labels": ["bug"], + "number": 258, + "title": "Array should only convert string arrays", + "url": "https://github.com/hapijs/joi/issues/258" + }, + { + "id": 31702182, + "labels": ["breaking changes"], + "number": 257, + "title": "Move dependencies (with,without, or, xor) to object level", + "url": "https://github.com/hapijs/joi/issues/257" + }, + { + "id": 31702142, + "labels": ["breaking changes"], + "number": 256, + "title": "Keep input const and return modified value via validate callback", + "url": "https://github.com/hapijs/joi/issues/256" + }, + { + "id": 31613961, + "labels": ["breaking changes"], + "number": 255, + "title": "Remove modify option", + "url": "https://github.com/hapijs/joi/issues/255" + }, + { + "id": 31613516, + "labels": ["breaking changes"], + "number": 254, + "title": "4.0.0", + "url": "https://github.com/hapijs/joi/issues/254" + }, + { + "id": 31613393, + "labels": [], + "number": 253, + "title": "Validate callback, rename move to object", + "url": "https://github.com/hapijs/joi/pull/253" + }, + { + "id": 31613177, + "labels": ["breaking changes"], + "number": 252, + "title": "Move rename() to object()", + "url": "https://github.com/hapijs/joi/issues/252" + }, + { + "id": 31527042, + "labels": ["breaking changes"], + "number": 250, + "title": "Change validate() to return value via callback", + "url": "https://github.com/hapijs/joi/issues/250" + }, + { + "id": 31522686, + "labels": ["bug"], + "number": 249, + "title": "Alternatives bug fixes", + "url": "https://github.com/hapijs/joi/pull/249" + }, + { + "id": 31432816, + "labels": ["feature"], + "number": 248, + "title": "Move object() constructor args to keys() method", + "url": "https://github.com/hapijs/joi/issues/248" + }, + { + "id": 31432506, + "labels": ["feature"], + "number": 247, + "title": "unit() documentation method", + "url": "https://github.com/hapijs/joi/issues/247" + }, + { + "id": 31432449, + "labels": ["bug"], + "number": 246, + "title": "rename() applied incorrectly", + "url": "https://github.com/hapijs/joi/issues/246" + }, + { + "id": 31424986, + "labels": ["bug"], + "number": 245, + "title": "alternatives() fails to apply conversion when lower priority match has valid()", + "url": "https://github.com/hapijs/joi/issues/245" + }, + { + "id": 31424950, + "labels": ["bug"], + "number": 244, + "title": "alternatives() fails to apply conversion of matching schema", + "url": "https://github.com/hapijs/joi/issues/244" + }, + { + "id": 31421885, + "labels": ["bug"], + "number": 243, + "title": "alternatives() incorrectly allows null when no valids present", + "url": "https://github.com/hapijs/joi/issues/243" + }, + { + "id": 31264764, + "labels": ["bug", "breaking changes"], + "number": 239, + "title": "Error inheritance is troublesome", + "url": "https://github.com/hapijs/joi/issues/239" + }, + { + "id": 31243626, + "labels": ["feature"], + "number": 238, + "title": "match() -> test()", + "url": "https://github.com/hapijs/joi/pull/238" + }, + { + "id": 31211908, + "labels": ["feature"], + "number": 237, + "title": "Support literal values as valid() condition", + "url": "https://github.com/hapijs/joi/issues/237" + }, + { + "id": 31154821, + "labels": ["test"], + "number": 234, + "title": "testling support", + "url": "https://github.com/hapijs/joi/pull/234" + }, + { + "id": 31130547, + "labels": ["test"], + "number": 233, + "title": "Add testling-ci badges", + "url": "https://github.com/hapijs/joi/issues/233" + }, + { + "id": 31014999, + "labels": ["feature"], + "number": 226, + "title": "Add support for binary type", + "url": "https://github.com/hapijs/joi/pull/226" + }, + { + "id": 30343676, + "labels": ["feature"], + "number": 217, + "title": "Incorrect ValidationError.annotated() output with abortEarly", + "url": "https://github.com/hapijs/joi/issues/217" + }, + { + "id": 30231813, + "labels": ["feature"], + "number": 214, + "title": "example() documentation method", + "url": "https://github.com/hapijs/joi/issues/214" + }, + { + "id": 29990586, + "labels": ["feature"], + "number": 210, + "title": "Add hostname matching to Joi.String", + "url": "https://github.com/hapijs/joi/pull/210" + }, + { + "id": 29608890, + "labels": ["feature"], + "number": 206, + "title": "Find full path to nested errors", + "url": "https://github.com/hapijs/joi/pull/206" + }, + { + "id": 29476950, + "labels": ["feature"], + "number": 202, + "title": "array() should set a specific detail.path", + "url": "https://github.com/hapijs/joi/issues/202" + }, + { + "id": 29141937, + "labels": ["feature"], + "number": 196, + "title": "Precompile schema", + "url": "https://github.com/hapijs/joi/issues/196" + }, + { + "id": 29036804, + "labels": ["feature"], + "number": 194, + "title": "Conditional rule based on value of another key", + "url": "https://github.com/hapijs/joi/issues/194" + }, + { + "id": 28977326, + "labels": ["bug"], + "number": 192, + "title": "64-bit limits in min()/max()/integer()", + "url": "https://github.com/hapijs/joi/issues/192" + }, + { + "id": 28856639, + "labels": ["feature"], + "number": 191, + "title": "Added support for buffer length", + "url": "https://github.com/hapijs/joi/pull/191" + } + ], + "number": 8, + "url": "https://github.com/hapijs/joi/milestone/8", + "version": "4.0.0" + }, + { + "date": "2014-05-23T20:24:22Z", + "id": 667165, + "issues": [ + { + "id": 34108621, + "labels": ["bug"], + "number": 345, + "title": "Describe references as such", + "url": "https://github.com/hapijs/joi/issues/345" + }, + { + "id": 34096088, + "labels": ["bug"], + "number": 343, + "title": "Ref and Alternatives.when don't handle empty string keys", + "url": "https://github.com/hapijs/joi/issues/343" + } + ], + "number": 13, + "url": "https://github.com/hapijs/joi/milestone/13", + "version": "3.4.1" + }, + { + "date": "2014-04-10T03:05:30Z", + "id": 611366, + "issues": [ + { + "id": 31046211, + "labels": ["feature", "breaking changes"], + "number": 231, + "title": "Remove language file support", + "url": "https://github.com/hapijs/joi/issues/231" + }, + { + "id": 31046174, + "labels": ["breaking changes"], + "number": 230, + "title": "3.0.0", + "url": "https://github.com/hapijs/joi/issues/230" + }, + { + "id": 31036084, + "labels": ["test"], + "number": 229, + "title": "Bring coverage back to 100% after lab logical statement support", + "url": "https://github.com/hapijs/joi/issues/229" + }, + { + "id": 31036060, + "labels": ["feature"], + "number": 228, + "title": "hoek 2.0", + "url": "https://github.com/hapijs/joi/issues/228" + }, + { + "id": 31035988, + "labels": ["bug"], + "number": 227, + "title": "number allows string even with strict()", + "url": "https://github.com/hapijs/joi/issues/227" + }, + { + "id": 30806500, + "labels": [], + "number": 224, + "title": "Immutable schema objects. Closes #221", + "url": "https://github.com/hapijs/joi/pull/224" + }, + { + "id": 30750016, + "labels": ["feature", "breaking changes"], + "number": 221, + "title": "Change object to immutable", + "url": "https://github.com/hapijs/joi/issues/221" + }, + { + "id": 30283015, + "labels": ["feature"], + "number": 216, + "title": "Change locale support to something that works with browserify.", + "url": "https://github.com/hapijs/joi/issues/216" + } + ], + "number": 7, + "url": "https://github.com/hapijs/joi/milestone/7", + "version": "3.0.0" + }, + { + "date": "2014-03-27T00:23:33Z", + "id": 603550, + "issues": [ + { + "id": 30264280, + "labels": ["bug", "feature"], + "number": 215, + "title": "Enable all any() methods on array()", + "url": "https://github.com/hapijs/joi/issues/215" + }, + { + "id": 29471905, + "labels": ["bug"], + "number": 201, + "title": "Allows using any.rename() and any.default() together", + "url": "https://github.com/hapijs/joi/pull/201" + } + ], + "number": 6, + "url": "https://github.com/hapijs/joi/milestone/6", + "version": "2.9.0" + }, + { + "date": "2014-03-20T09:06:38Z", + "id": 591611, + "issues": [ + { + "id": 29227780, + "labels": ["feature"], + "number": 198, + "title": "Allow language override directly via options", + "url": "https://github.com/hapijs/joi/issues/198" + }, + { + "id": 29208636, + "labels": ["feature"], + "number": 197, + "title": "Support for union types in schemas.", + "url": "https://github.com/hapijs/joi/issues/197" + }, + { + "id": 29079071, + "labels": ["test"], + "number": 195, + "title": "Bring coverage back to 100% after lab fix", + "url": "https://github.com/hapijs/joi/issues/195" + }, + { + "id": 28557109, + "labels": ["bug"], + "number": 187, + "title": "Polluted request.payload by adding undefined field", + "url": "https://github.com/hapijs/joi/issues/187" + }, + { + "id": 27857389, + "labels": ["bug"], + "number": 184, + "title": "Throws error when field is missing and abortEarly=false", + "url": "https://github.com/hapijs/joi/issues/184" + }, + { + "id": 27840646, + "labels": ["feature"], + "number": 183, + "title": "set defaults #181", + "url": "https://github.com/hapijs/joi/pull/183" + }, + { + "id": 27545453, + "labels": ["feature"], + "number": 181, + "title": "setting defaults", + "url": "https://github.com/hapijs/joi/issues/181" + }, + { + "id": 27463016, + "labels": ["non issue"], + "number": 180, + "title": "#179; add failing test for renames nested within array", + "url": "https://github.com/hapijs/joi/pull/180" + }, + { + "id": 27320128, + "labels": ["feature"], + "number": 178, + "title": "Embedded validators in Array().includes don't work ", + "url": "https://github.com/hapijs/joi/issues/178" + }, + { + "id": 27235520, + "labels": ["bug"], + "number": 177, + "title": "Modify does not change internal values in array", + "url": "https://github.com/hapijs/joi/issues/177" + }, + { + "id": 27226035, + "labels": ["bug"], + "number": 176, + "title": "closes #175. missing required keys no longer throws.", + "url": "https://github.com/hapijs/joi/pull/176" + }, + { + "id": 26586182, + "labels": ["feature"], + "number": 166, + "title": "Required based on value on other key", + "url": "https://github.com/hapijs/joi/issues/166" + }, + { + "id": 22683660, + "labels": ["feature"], + "number": 142, + "title": "alternatives()", + "url": "https://github.com/hapijs/joi/issues/142" + } + ], + "number": 5, + "url": "https://github.com/hapijs/joi/milestone/5", + "version": "2.8.0" + }, + { + "date": "2014-03-08T23:43:59Z", + "id": 472326, + "issues": [ + { + "id": 31046235, + "labels": ["breaking changes"], + "number": 232, + "title": "2.0.0", + "url": "https://github.com/hapijs/joi/issues/232" + }, + { + "id": 21261583, + "labels": [], + "number": 133, + "title": "Array.includes() does not support more than 1 type", + "url": "https://github.com/hapijs/joi/issues/133" + }, + { + "id": 20414695, + "labels": ["bug"], + "number": 128, + "title": "with constraint doesn't seem to be respected", + "url": "https://github.com/hapijs/joi/issues/128" + }, + { + "id": 20244505, + "labels": ["feature"], + "number": 126, + "title": "Validate date supporting arbitrary format", + "url": "https://github.com/hapijs/joi/issues/126" + }, + { + "id": 19591348, + "labels": ["bug"], + "number": 124, + "title": "Array doesn't validate correctly if includes() uses valid()", + "url": "https://github.com/hapijs/joi/issues/124" + }, + { + "id": 18752983, + "labels": ["bug"], + "number": 122, + "title": "Update error messages to not have encoded characters", + "url": "https://github.com/hapijs/joi/issues/122" + }, + { + "id": 18553537, + "labels": ["bug"], + "number": 121, + "title": "Array is accepted as an Object type", + "url": "https://github.com/hapijs/joi/issues/121" + }, + { + "id": 17290833, + "labels": ["bug"], + "number": 112, + "title": "Remove Number.float()", + "url": "https://github.com/hapijs/joi/issues/112" + }, + { + "id": 13572478, + "labels": ["feature"], + "number": 88, + "title": ".valid() and .invalid() need a case-insensitive mode", + "url": "https://github.com/hapijs/joi/issues/88" + } + ], + "number": 4, + "url": "https://github.com/hapijs/joi/milestone/4", + "version": "2.0.0" + }, + { + "date": "2013-11-02T08:13:23Z", + "id": 385931, + "issues": [ + { + "id": 17163181, + "labels": [], + "number": 110, + "title": "Adding support for special Any type", + "url": "https://github.com/hapijs/joi/pull/110" + }, + { + "id": 17111405, + "labels": [], + "number": 107, + "title": ".with and .without accept an array of args as well", + "url": "https://github.com/hapijs/joi/issues/107" + }, + { + "id": 16995673, + "labels": ["feature"], + "number": 106, + "title": "Add Type.Any", + "url": "https://github.com/hapijs/joi/issues/106" + }, + { + "id": 16981014, + "labels": [], + "number": 105, + "title": "Consistent usage of Array.isArray()", + "url": "https://github.com/hapijs/joi/pull/105" + }, + { + "id": 14919575, + "labels": [], + "number": 95, + "title": "Custom Error Messages", + "url": "https://github.com/hapijs/joi/issues/95" + } + ], + "number": 3, + "url": "https://github.com/hapijs/joi/milestone/3", + "version": "0.4.0" + }, + { + "date": "2013-01-03T19:47:43Z", + "id": 224164, + "issues": [ + { + "id": 9059424, + "labels": ["documentation"], + "number": 25, + "title": "Rewrite Readme.md", + "url": "https://github.com/hapijs/joi/issues/25" + }, + { + "id": 9058616, + "labels": ["test"], + "number": 23, + "title": "Add validation tests for every type's methods with complex combinations", + "url": "https://github.com/hapijs/joi/issues/23" + }, + { + "id": 9045048, + "labels": ["bug"], + "number": 20, + "title": "String().valid doesn't invalidate bad values", + "url": "https://github.com/hapijs/joi/issues/20" + }, + { + "id": 9002161, + "labels": ["bug"], + "number": 19, + "title": "StringType.min(3) doesn't validate undefined correctly", + "url": "https://github.com/hapijs/joi/issues/19" + }, + { + "id": 9001959, + "labels": [], + "number": 18, + "title": "Adding tests to joi", + "url": "https://github.com/hapijs/joi/pull/18" + } + ], + "number": 1, + "url": "https://github.com/hapijs/joi/milestone/1", + "version": "0.0.6" + } ] diff --git a/generated/modules/joi/info.json b/generated/modules/joi/info.json index 071fe85..67be2e5 100644 --- a/generated/modules/joi/info.json +++ b/generated/modules/joi/info.json @@ -1,25 +1,25 @@ { - "api": true, - "forks": 1509, - "link": "https://github.com/hapijs/joi", - "name": "joi", - "package": "joi", - "slogan": "The most powerful schema description language and data validator for JavaScript.", - "stars": 21202, - "updated": "2026-03-30T17:24:52Z", - "versions": [ - { - "branch": "v17.13.3", - "license": "BSD", - "name": "17.13.3", - "node": ">= 14" - }, - { - "branch": "v18.2.1", - "license": "BSD", - "name": "18.2.1", - "node": ">= 20" - } - ], - "versionsArray": ["18.2.1", "17.13.3"] + "api": true, + "forks": 1509, + "link": "https://github.com/hapijs/joi", + "name": "joi", + "package": "joi", + "slogan": "The most powerful schema description language and data validator for JavaScript.", + "stars": 21202, + "updated": "2026-03-30T17:24:52Z", + "versions": [ + { + "branch": "v17.13.4", + "license": "BSD", + "name": "17.13.4", + "node": ">= 14" + }, + { + "branch": "v18.2.1", + "license": "BSD", + "name": "18.2.1", + "node": ">= 20" + } + ], + "versionsArray": ["18.2.1", "17.13.4"] } diff --git a/generated/modules/pinpoint/changelog.json b/generated/modules/pinpoint/changelog.json index c8c1ba5..7e303e3 100644 --- a/generated/modules/pinpoint/changelog.json +++ b/generated/modules/pinpoint/changelog.json @@ -1,66 +1,66 @@ [ - { - "date": "2023-02-19T10:39:22Z", - "id": 4972533, - "issues": [ - { - "id": 1590638297, - "labels": [], - "number": 9, - "title": "chore: change package namespace", - "url": "https://github.com/hapijs/pinpoint/pull/9" - } - ], - "number": 5, - "url": "https://github.com/hapijs/pinpoint/milestone/5", - "version": "2.0.1" - }, - { - "date": "2020-01-04T08:57:53Z", - "id": 4972532, - "issues": [ - { - "id": 545260681, - "labels": ["dependency", "breaking changes"], - "number": 7, - "title": "Only node 12", - "url": "https://github.com/hapijs/pinpoint/issues/7" - } - ], - "number": 4, - "url": "https://github.com/hapijs/pinpoint/milestone/4", - "version": "2.0.0" - }, - { - "date": "2019-09-12T08:36:35Z", - "id": 4599691, - "issues": [ - { - "id": 492663574, - "labels": ["bug"], - "number": 3, - "title": "Fix TS namespace", - "url": "https://github.com/hapijs/pinpoint/issues/3" - } - ], - "number": 2, - "url": "https://github.com/hapijs/pinpoint/milestone/2", - "version": "1.0.2" - }, - { - "date": "2019-08-24T06:33:58Z", - "id": 4599658, - "issues": [ - { - "id": 484785221, - "labels": ["bug"], + { + "date": "2023-02-19T10:39:22Z", + "id": 4972533, + "issues": [ + { + "id": 1590638297, + "labels": [], + "number": 9, + "title": "chore: change package namespace", + "url": "https://github.com/hapijs/pinpoint/pull/9" + } + ], + "number": 5, + "url": "https://github.com/hapijs/pinpoint/milestone/5", + "version": "2.0.1" + }, + { + "date": "2020-01-04T08:57:53Z", + "id": 4972532, + "issues": [ + { + "id": 545260681, + "labels": ["dependency", "breaking changes"], + "number": 7, + "title": "Only node 12", + "url": "https://github.com/hapijs/pinpoint/issues/7" + } + ], + "number": 4, + "url": "https://github.com/hapijs/pinpoint/milestone/4", + "version": "2.0.0" + }, + { + "date": "2019-09-12T08:36:35Z", + "id": 4599691, + "issues": [ + { + "id": 492663574, + "labels": ["bug"], + "number": 3, + "title": "Fix TS namespace", + "url": "https://github.com/hapijs/pinpoint/issues/3" + } + ], "number": 2, - "title": "Change default depth to be 0", - "url": "https://github.com/hapijs/pinpoint/issues/2" - } - ], - "number": 1, - "url": "https://github.com/hapijs/pinpoint/milestone/1", - "version": "1.0.1" - } + "url": "https://github.com/hapijs/pinpoint/milestone/2", + "version": "1.0.2" + }, + { + "date": "2019-08-24T06:33:58Z", + "id": 4599658, + "issues": [ + { + "id": 484785221, + "labels": ["bug"], + "number": 2, + "title": "Change default depth to be 0", + "url": "https://github.com/hapijs/pinpoint/issues/2" + } + ], + "number": 1, + "url": "https://github.com/hapijs/pinpoint/milestone/1", + "version": "1.0.1" + } ] diff --git a/generated/modules/pinpoint/info.json b/generated/modules/pinpoint/info.json index b9ea4ff..d01e7f1 100644 --- a/generated/modules/pinpoint/info.json +++ b/generated/modules/pinpoint/info.json @@ -1,19 +1,19 @@ { - "api": true, - "forks": 6, - "link": "https://github.com/hapijs/pinpoint", - "name": "pinpoint", - "package": "@hapi/pinpoint", - "slogan": "Return the filename and line number of the calling function.", - "stars": 6, - "updated": "2023-11-12T09:48:56Z", - "versions": [ - { - "branch": "v2.0.1", - "license": "BSD", - "name": "2.0.1", - "node": ">= 14" - } - ], - "versionsArray": ["2.0.1"] + "api": true, + "forks": 6, + "link": "https://github.com/hapijs/pinpoint", + "name": "pinpoint", + "package": "@hapi/pinpoint", + "slogan": "Return the filename and line number of the calling function.", + "stars": 6, + "updated": "2023-11-12T09:48:56Z", + "versions": [ + { + "branch": "v2.0.1", + "license": "BSD", + "name": "2.0.1", + "node": ">= 14" + } + ], + "versionsArray": ["2.0.1"] } diff --git a/generated/modules/tlds/changelog.json b/generated/modules/tlds/changelog.json index 8a8e18f..e20ee05 100644 --- a/generated/modules/tlds/changelog.json +++ b/generated/modules/tlds/changelog.json @@ -1,226 +1,242 @@ [ - { - "date": "2026-02-17T14:10:31Z", - "id": 14842553, - "issues": [ - { - "id": 3942686668, - "labels": ["bug"], - "number": 19, - "title": "Update TLDs", - "url": "https://github.com/hapijs/tlds/pull/19" - } - ], - "number": 14, - "url": "https://github.com/hapijs/tlds/milestone/14", - "version": "1.1.6" - }, - { - "date": "2026-02-10T17:43:02Z", - "id": 14771796, - "issues": [ - { - "id": 3911656405, - "labels": ["bug"], - "number": 18, - "title": "Update TLDs", - "url": "https://github.com/hapijs/tlds/pull/18" - } - ], - "number": 13, - "url": "https://github.com/hapijs/tlds/milestone/13", - "version": "1.1.5" - }, - { - "date": "2025-10-23T07:58:41Z", - "id": 13960822, - "issues": [ - { - "id": 3542734394, - "labels": ["bug"], - "number": 17, - "title": "Update TLDs", - "url": "https://github.com/hapijs/tlds/pull/17" - } - ], - "number": 12, - "url": "https://github.com/hapijs/tlds/milestone/12", - "version": "1.1.4" - }, - { - "date": "2025-08-28T10:40:27Z", - "id": 13573111, - "issues": [ - { - "id": 3361285890, - "labels": ["bug"], - "number": 16, - "title": "Update TLDs", - "url": "https://github.com/hapijs/tlds/pull/16" - } - ], - "number": 11, - "url": "https://github.com/hapijs/tlds/milestone/11", - "version": "1.1.3" - }, - { - "date": "2025-05-21T15:07:29Z", - "id": 12933562, - "issues": [ - { - "id": 3071189686, - "labels": ["bug"], + { + "date": "2026-06-10T10:29:38Z", + "id": 16286332, + "issues": [ + { + "id": 4289583287, + "labels": ["bug"], + "number": 20, + "title": "Update TLDs", + "url": "https://github.com/hapijs/tlds/pull/20" + } + ], "number": 15, - "title": "Update TLDs", - "url": "https://github.com/hapijs/tlds/pull/15" - } - ], - "number": 10, - "url": "https://github.com/hapijs/tlds/milestone/10", - "version": "1.1.2" - }, - { - "date": "2025-05-14T08:35:46Z", - "id": 12891565, - "issues": [ - { - "id": 3062293368, - "labels": ["bug"], + "url": "https://github.com/hapijs/tlds/milestone/15", + "version": "1.1.7" + }, + { + "date": "2026-02-17T14:10:31Z", + "id": 14842553, + "issues": [ + { + "id": 3942686668, + "labels": ["bug"], + "number": 19, + "title": "Update TLDs", + "url": "https://github.com/hapijs/tlds/pull/19" + } + ], "number": 14, - "title": "Update TLDs", - "url": "https://github.com/hapijs/tlds/pull/14" - } - ], - "number": 9, - "url": "https://github.com/hapijs/tlds/milestone/9", - "version": "1.1.1" - }, - { - "date": "2024-10-23T09:18:14Z", - "id": 11779611, - "issues": [ - { - "id": 2607832652, - "labels": ["feature"], + "url": "https://github.com/hapijs/tlds/milestone/14", + "version": "1.1.6" + }, + { + "date": "2026-02-10T17:43:02Z", + "id": 14771796, + "issues": [ + { + "id": 3911656405, + "labels": ["bug"], + "number": 18, + "title": "Update TLDs", + "url": "https://github.com/hapijs/tlds/pull/18" + } + ], "number": 13, - "title": "chore: convert to hybrid module", - "url": "https://github.com/hapijs/tlds/pull/13" - } - ], - "number": 8, - "url": "https://github.com/hapijs/tlds/milestone/8", - "version": "1.1.0" - }, - { - "date": "2024-10-23T08:52:50Z", - "id": 11779463, - "issues": [ - { - "id": 2551720983, - "labels": ["bug"], + "url": "https://github.com/hapijs/tlds/milestone/13", + "version": "1.1.5" + }, + { + "date": "2025-10-23T07:58:41Z", + "id": 13960822, + "issues": [ + { + "id": 3542734394, + "labels": ["bug"], + "number": 17, + "title": "Update TLDs", + "url": "https://github.com/hapijs/tlds/pull/17" + } + ], "number": 12, - "title": "Update TLDs", - "url": "https://github.com/hapijs/tlds/pull/12" - } - ], - "number": 7, - "url": "https://github.com/hapijs/tlds/milestone/7", - "version": "1.0.7" - }, - { - "date": "2024-10-23T08:46:54Z", - "id": 11318593, - "issues": [ - { - "id": 2401949990, - "labels": ["bug"], + "url": "https://github.com/hapijs/tlds/milestone/12", + "version": "1.1.4" + }, + { + "date": "2025-08-28T10:40:27Z", + "id": 13573111, + "issues": [ + { + "id": 3361285890, + "labels": ["bug"], + "number": 16, + "title": "Update TLDs", + "url": "https://github.com/hapijs/tlds/pull/16" + } + ], "number": 11, - "title": "Update TLDs", - "url": "https://github.com/hapijs/tlds/pull/11" - } - ], - "number": 6, - "url": "https://github.com/hapijs/tlds/milestone/6", - "version": "1.0.6" - }, - { - "date": "2024-06-20T08:29:24Z", - "id": 11205414, - "issues": [ - { - "id": 2361845457, - "labels": ["bug"], + "url": "https://github.com/hapijs/tlds/milestone/11", + "version": "1.1.3" + }, + { + "date": "2025-05-21T15:07:29Z", + "id": 12933562, + "issues": [ + { + "id": 3071189686, + "labels": ["bug"], + "number": 15, + "title": "Update TLDs", + "url": "https://github.com/hapijs/tlds/pull/15" + } + ], "number": 10, - "title": "Update TLDs", - "url": "https://github.com/hapijs/tlds/pull/10" - } - ], - "number": 5, - "url": "https://github.com/hapijs/tlds/milestone/5", - "version": "1.0.5" - }, - { - "date": "2024-03-28T22:48:27Z", - "id": 10748776, - "issues": [ - { - "id": 2214250247, - "labels": ["bug"], + "url": "https://github.com/hapijs/tlds/milestone/10", + "version": "1.1.2" + }, + { + "date": "2025-05-14T08:35:46Z", + "id": 12891565, + "issues": [ + { + "id": 3062293368, + "labels": ["bug"], + "number": 14, + "title": "Update TLDs", + "url": "https://github.com/hapijs/tlds/pull/14" + } + ], + "number": 9, + "url": "https://github.com/hapijs/tlds/milestone/9", + "version": "1.1.1" + }, + { + "date": "2024-10-23T09:18:14Z", + "id": 11779611, + "issues": [ + { + "id": 2607832652, + "labels": ["feature"], + "number": 13, + "title": "chore: convert to hybrid module", + "url": "https://github.com/hapijs/tlds/pull/13" + } + ], "number": 8, - "title": "Update TLDs", - "url": "https://github.com/hapijs/tlds/pull/8" - } - ], - "number": 4, - "url": "https://github.com/hapijs/tlds/milestone/4", - "version": "1.0.4" - }, - { - "date": "2024-03-28T22:48:25Z", - "id": 10738602, - "issues": [ - { - "id": 2203186784, - "labels": ["bug"], + "url": "https://github.com/hapijs/tlds/milestone/8", + "version": "1.1.0" + }, + { + "date": "2024-10-23T08:52:50Z", + "id": 11779463, + "issues": [ + { + "id": 2551720983, + "labels": ["bug"], + "number": 12, + "title": "Update TLDs", + "url": "https://github.com/hapijs/tlds/pull/12" + } + ], + "number": 7, + "url": "https://github.com/hapijs/tlds/milestone/7", + "version": "1.0.7" + }, + { + "date": "2024-10-23T08:46:54Z", + "id": 11318593, + "issues": [ + { + "id": 2401949990, + "labels": ["bug"], + "number": 11, + "title": "Update TLDs", + "url": "https://github.com/hapijs/tlds/pull/11" + } + ], + "number": 6, + "url": "https://github.com/hapijs/tlds/milestone/6", + "version": "1.0.6" + }, + { + "date": "2024-06-20T08:29:24Z", + "id": 11205414, + "issues": [ + { + "id": 2361845457, + "labels": ["bug"], + "number": 10, + "title": "Update TLDs", + "url": "https://github.com/hapijs/tlds/pull/10" + } + ], "number": 5, - "title": "Update TLDs to version 2024032200", - "url": "https://github.com/hapijs/tlds/pull/5" - } - ], - "number": 3, - "url": "https://github.com/hapijs/tlds/milestone/3", - "version": "1.0.3" - }, - { - "date": "2023-09-13T13:24:24Z", - "id": 9917343, - "issues": [ - { - "id": 1893182002, - "labels": ["bug"], + "url": "https://github.com/hapijs/tlds/milestone/5", + "version": "1.0.5" + }, + { + "date": "2024-03-28T22:48:27Z", + "id": 10748776, + "issues": [ + { + "id": 2214250247, + "labels": ["bug"], + "number": 8, + "title": "Update TLDs", + "url": "https://github.com/hapijs/tlds/pull/8" + } + ], + "number": 4, + "url": "https://github.com/hapijs/tlds/milestone/4", + "version": "1.0.4" + }, + { + "date": "2024-03-28T22:48:25Z", + "id": 10738602, + "issues": [ + { + "id": 2203186784, + "labels": ["bug"], + "number": 5, + "title": "Update TLDs to version 2024032200", + "url": "https://github.com/hapijs/tlds/pull/5" + } + ], + "number": 3, + "url": "https://github.com/hapijs/tlds/milestone/3", + "version": "1.0.3" + }, + { + "date": "2023-09-13T13:24:24Z", + "id": 9917343, + "issues": [ + { + "id": 1893182002, + "labels": ["bug"], + "number": 2, + "title": "Update tlds", + "url": "https://github.com/hapijs/tlds/pull/2" + } + ], "number": 2, - "title": "Update tlds", - "url": "https://github.com/hapijs/tlds/pull/2" - } - ], - "number": 2, - "url": "https://github.com/hapijs/tlds/milestone/2", - "version": "1.0.2" - }, - { - "date": "2023-09-13T13:24:26Z", - "id": 8546104, - "issues": [ - { - "id": 1410559815, - "labels": ["bug"], + "url": "https://github.com/hapijs/tlds/milestone/2", + "version": "1.0.2" + }, + { + "date": "2023-09-13T13:24:26Z", + "id": 8546104, + "issues": [ + { + "id": 1410559815, + "labels": ["bug"], + "number": 1, + "title": "chore: change module scope", + "url": "https://github.com/hapijs/tlds/pull/1" + } + ], "number": 1, - "title": "chore: change module scope", - "url": "https://github.com/hapijs/tlds/pull/1" - } - ], - "number": 1, - "url": "https://github.com/hapijs/tlds/milestone/1", - "version": "1.0.1" - } + "url": "https://github.com/hapijs/tlds/milestone/1", + "version": "1.0.1" + } ] diff --git a/generated/modules/tlds/info.json b/generated/modules/tlds/info.json index 9241e33..bbde576 100644 --- a/generated/modules/tlds/info.json +++ b/generated/modules/tlds/info.json @@ -1,19 +1,19 @@ { - "api": true, - "forks": 2, - "link": "https://github.com/hapijs/tlds", - "name": "tlds", - "package": "@hapi/tlds", - "slogan": "TLDS list for domain validation.", - "stars": 2, - "updated": "2026-02-17T14:09:37Z", - "versions": [ - { - "branch": "v1.1.6", - "license": "BSD", - "name": "1.1.6", - "node": ">= 14" - } - ], - "versionsArray": ["1.1.6"] + "api": true, + "forks": 2, + "link": "https://github.com/hapijs/tlds", + "name": "tlds", + "package": "@hapi/tlds", + "slogan": "TLDS list for domain validation.", + "stars": 2, + "updated": "2026-02-17T14:09:37Z", + "versions": [ + { + "branch": "v1.1.7", + "license": "BSD", + "name": "1.1.7", + "node": ">= 14" + } + ], + "versionsArray": ["1.1.7"] } diff --git a/oxfmt.config.ts b/oxfmt.config.ts new file mode 100644 index 0000000..df770dd --- /dev/null +++ b/oxfmt.config.ts @@ -0,0 +1,16 @@ +import DefaultOxfmtConfig from '@hapi/oxc-plugin/oxfmt'; +import { defineConfig } from 'oxfmt'; + +import type { OxfmtConfig } from 'oxfmt'; + +export default defineConfig({ + ...DefaultOxfmtConfig, + overrides: [ + { + files: ['generated/**'], + options: { + printWidth: 80, + }, + }, + ], +}) as OxfmtConfig; diff --git a/oxlint.config.ts b/oxlint.config.ts new file mode 100644 index 0000000..323739c --- /dev/null +++ b/oxlint.config.ts @@ -0,0 +1,17 @@ +import HapiRecommended from '@hapi/oxc-plugin/oxlint'; +import { defineConfig } from 'oxlint'; + +import type { OxlintConfig } from 'oxlint'; + +export default defineConfig({ + extends: [HapiRecommended], + env: { + ...HapiRecommended.env, + browser: true, + }, + globals: { + defineProps: 'readonly', + defineModel: 'readonly', + defineExpose: 'readonly', + }, +}) as OxlintConfig; diff --git a/package.json b/package.json index 3da215d..ddc267e 100644 --- a/package.json +++ b/package.json @@ -1,56 +1,57 @@ { - "name": "joiSite", - "version": "1.0.0", - "private": true, - "type": "module", - "packageManager": "pnpm@10.32.1", - "scripts": { - "dev": "vitepress dev", - "fetch-data": "tsx cli/getModuleInfo.ts", - "build": "vitepress build", - "preview": "vitepress preview", - "generate": "tsx cli/getModuleInfo.ts && vitepress build", - "lint": "oxlint", - "lint:fix": "oxlint --fix", - "fmt": "oxfmt --check", - "fmt:fix": "oxfmt", - "test": "pnpm run lint && pnpm run fmt && tsc --noEmit" - }, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/runtime": "^7.29.2", - "@codemirror/autocomplete": "^6.20.1", - "@codemirror/lang-javascript": "^6.2.5", - "@codemirror/lang-json": "^6.0.2", - "@codemirror/language": "^6.12.3", - "@codemirror/state": "^6.6.0", - "@codemirror/view": "^6.41.0", - "@lezer/highlight": "^1.2.3", - "@standard-schema/spec": "^1.1.0", - "@typescript/vfs": "^1.6.4", - "@uiw/codemirror-theme-darcula": "^4.25.9", - "@uiw/codemirror-theme-eclipse": "^4.25.9", - "@vueuse/core": "^14.2.1", - "codemirror": "^6.0.2", - "es-toolkit": "^1.45.1", - "feed": "^5.2.0", - "github-slugger": "^2.0.0", - "joi-17": "npm:joi@17.13.3", - "joi-18": "npm:joi@18.2.1", - "prettier": "^3.8.1", - "semver": "^7.7.4", - "vitepress-plugin-group-icons": "^1.7.3", - "vue": "^3.5.32" - }, - "devDependencies": { - "@octokit/plugin-throttling": "^11.0.3", - "@octokit/rest": "^22.0.1", - "@types/node": "^24.12.2", - "@types/semver": "^7.7.1", - "oxfmt": "^0.44.0", - "oxlint": "^1.59.0", - "tsx": "^4.21.0", - "typescript": "^6.0.2", - "vitepress": "2.0.0-alpha.17" - } + "name": "joiSite", + "version": "1.0.0", + "private": true, + "license": "BSD-3-Clause", + "type": "module", + "scripts": { + "dev": "vitepress dev", + "fetch-data": "tsx cli/getModuleInfo.ts", + "build": "vitepress build", + "preview": "vitepress preview", + "generate": "tsx cli/getModuleInfo.ts && vitepress build", + "lint": "oxlint", + "lint:fix": "oxlint --fix", + "fmt": "oxfmt --check", + "fmt:fix": "oxfmt", + "test": "pnpm run lint && pnpm run fmt && tsc --noEmit" + }, + "dependencies": { + "@babel/runtime": "^7.29.2", + "@codemirror/autocomplete": "^6.20.3", + "@codemirror/lang-javascript": "^6.2.5", + "@codemirror/lang-json": "^6.0.2", + "@codemirror/language": "^6.12.3", + "@codemirror/state": "^6.6.0", + "@codemirror/view": "^6.43.1", + "@lezer/highlight": "^1.2.3", + "@standard-schema/spec": "^1.1.0", + "@typescript/vfs": "^1.6.4", + "@uiw/codemirror-theme-darcula": "^4.25.10", + "@uiw/codemirror-theme-eclipse": "^4.25.10", + "@vueuse/core": "^14.3.0", + "codemirror": "^6.0.2", + "es-toolkit": "^1.47.1", + "feed": "^5.2.1", + "github-slugger": "^2.0.0", + "joi-17": "npm:joi@17.13.4", + "joi-18": "npm:joi@18.2.1", + "prettier": "^3.8.4", + "semver": "^7.8.4", + "vitepress-plugin-group-icons": "^1.7.5", + "vue": "^3.5.38" + }, + "devDependencies": { + "@hapi/oxc-plugin": "^1.0.1", + "@octokit/plugin-throttling": "^11.0.3", + "@octokit/rest": "^22.0.1", + "@types/node": "^24.12.2", + "@types/semver": "^7.7.1", + "oxfmt": "^0.55.0", + "oxlint": "^1.70.0", + "tsx": "^4.22.4", + "typescript": "^6.0.3", + "vitepress": "2.0.0-alpha.17" + }, + "packageManager": "pnpm@10.32.1" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0113c9b..0f141de 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,8 +12,8 @@ importers: specifier: ^7.29.2 version: 7.29.2 '@codemirror/autocomplete': - specifier: ^6.20.1 - version: 6.20.1 + specifier: ^6.20.3 + version: 6.20.3 '@codemirror/lang-javascript': specifier: ^6.2.5 version: 6.2.5 @@ -27,8 +27,8 @@ importers: specifier: ^6.6.0 version: 6.6.0 '@codemirror/view': - specifier: ^6.41.0 - version: 6.41.0 + specifier: ^6.43.1 + version: 6.43.1 '@lezer/highlight': specifier: ^1.2.3 version: 1.2.3 @@ -37,47 +37,50 @@ importers: version: 1.1.0 '@typescript/vfs': specifier: ^1.6.4 - version: 1.6.4(typescript@6.0.2) + version: 1.6.4(typescript@6.0.3) '@uiw/codemirror-theme-darcula': - specifier: ^4.25.9 - version: 4.25.9(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0) + specifier: ^4.25.10 + version: 4.25.10(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.43.1) '@uiw/codemirror-theme-eclipse': - specifier: ^4.25.9 - version: 4.25.9(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0) + specifier: ^4.25.10 + version: 4.25.10(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.43.1) '@vueuse/core': - specifier: ^14.2.1 - version: 14.2.1(vue@3.5.32(typescript@6.0.2)) + specifier: ^14.3.0 + version: 14.3.0(vue@3.5.38(typescript@6.0.3)) codemirror: specifier: ^6.0.2 version: 6.0.2 es-toolkit: - specifier: ^1.45.1 - version: 1.45.1 + specifier: ^1.47.1 + version: 1.47.1 feed: - specifier: ^5.2.0 - version: 5.2.0 + specifier: ^5.2.1 + version: 5.2.1 github-slugger: specifier: ^2.0.0 version: 2.0.0 joi-17: - specifier: npm:joi@17.13.3 - version: joi@17.13.3 + specifier: npm:joi@17.13.4 + version: joi@17.13.4 joi-18: specifier: npm:joi@18.2.1 version: joi@18.2.1 prettier: - specifier: ^3.8.1 - version: 3.8.1 + specifier: ^3.8.4 + version: 3.8.4 semver: - specifier: ^7.7.4 - version: 7.7.4 + specifier: ^7.8.4 + version: 7.8.4 vitepress-plugin-group-icons: - specifier: ^1.7.3 - version: 1.7.3(vite@7.3.2(@types/node@24.12.2)(terser@5.46.1)(tsx@4.21.0)) + specifier: ^1.7.5 + version: 1.7.5(vite@7.3.5(@types/node@24.12.2)(terser@5.46.1)(tsx@4.22.4)) vue: - specifier: ^3.5.32 - version: 3.5.32(typescript@6.0.2) + specifier: ^3.5.38 + version: 3.5.38(typescript@6.0.3) devDependencies: + '@hapi/oxc-plugin': + specifier: ^1.0.1 + version: 1.0.1(oxfmt@0.55.0)(oxlint@1.70.0) '@octokit/plugin-throttling': specifier: ^11.0.3 version: 11.0.3(@octokit/core@7.0.6) @@ -91,36 +94,36 @@ importers: specifier: ^7.7.1 version: 7.7.1 oxfmt: - specifier: ^0.44.0 - version: 0.44.0 + specifier: ^0.55.0 + version: 0.55.0 oxlint: - specifier: ^1.59.0 - version: 1.59.0 + specifier: ^1.70.0 + version: 1.70.0 tsx: - specifier: ^4.21.0 - version: 4.21.0 + specifier: ^4.22.4 + version: 4.22.4 typescript: - specifier: ^6.0.2 - version: 6.0.2 + specifier: ^6.0.3 + version: 6.0.3 vitepress: specifier: 2.0.0-alpha.17 - version: 2.0.0-alpha.17(@types/node@24.12.2)(postcss@8.5.8)(terser@5.46.1)(tsx@4.21.0)(typescript@6.0.2) + version: 2.0.0-alpha.17(@types/node@24.12.2)(postcss@8.5.15)(terser@5.46.1)(tsx@4.22.4)(typescript@6.0.3) packages: '@antfu/install-pkg@1.1.0': resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.2': - resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} engines: {node: '>=6.0.0'} hasBin: true @@ -128,12 +131,12 @@ packages: resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} engines: {node: '>=6.9.0'} - '@babel/types@7.29.0': - resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} engines: {node: '>=6.9.0'} - '@codemirror/autocomplete@6.20.1': - resolution: {integrity: sha512-1cvg3Vz1dSSToCNlJfRA2WSI4ht3K+WplO0UMOgmUYPivCyy2oueZY6Lx7M9wThm7SDUBViRmuT+OG/i8+ON9A==} + '@codemirror/autocomplete@6.20.3': + resolution: {integrity: sha512-tlosUqb+3BbxCxZdu4tKeRghPFC+QM7q4X5YhKV2eCmPG+1r2F3f4AaSz5sCrFqUtX4Jh20VFTKecl16MgiV9g==} '@codemirror/commands@6.10.3': resolution: {integrity: sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q==} @@ -156,8 +159,8 @@ packages: '@codemirror/state@6.6.0': resolution: {integrity: sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ==} - '@codemirror/view@6.41.0': - resolution: {integrity: sha512-6H/qadXsVuDY219Yljhohglve8xf4B8xJkVOEWfA5uiYKiTFppjqsvsfR5iPA0RbvRBoOyTZpbLIxe9+0UR8xA==} + '@codemirror/view@6.43.1': + resolution: {integrity: sha512-+BIjw/AG3tDQ4pJgTLPYdAW25eDE66YsvM4LKyVPgGzVgZ4a9Wj1SRX8kPVKgBDdPt8oHtZ15F0qx7p0oOHdHw==} '@docsearch/css@4.6.0': resolution: {integrity: sha512-YlcAimkXclvqta47g47efzCM5CFxDwv2ClkDfEs/fC/Ak0OxPH2b3czwa4o8O1TRBf+ujFF2RiUwszz2fPVNJQ==} @@ -174,156 +177,312 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.28.1': + resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.27.4': resolution: {integrity: sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.28.1': + resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.27.4': resolution: {integrity: sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.28.1': + resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.27.4': resolution: {integrity: sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.28.1': + resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.27.4': resolution: {integrity: sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.28.1': + resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.27.4': resolution: {integrity: sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.28.1': + resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.27.4': resolution: {integrity: sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.28.1': + resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.27.4': resolution: {integrity: sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.28.1': + resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.27.4': resolution: {integrity: sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.28.1': + resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.27.4': resolution: {integrity: sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.28.1': + resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.27.4': resolution: {integrity: sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.28.1': + resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.27.4': resolution: {integrity: sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.28.1': + resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.27.4': resolution: {integrity: sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.28.1': + resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.27.4': resolution: {integrity: sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.28.1': + resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.27.4': resolution: {integrity: sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.28.1': + resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.27.4': resolution: {integrity: sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.28.1': + resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.27.4': resolution: {integrity: sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==} engines: {node: '>=18'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.28.1': + resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.27.4': resolution: {integrity: sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.28.1': + resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.27.4': resolution: {integrity: sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.28.1': + resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.27.4': resolution: {integrity: sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.28.1': + resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.27.4': resolution: {integrity: sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.28.1': + resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openharmony-arm64@0.27.4': resolution: {integrity: sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] + '@esbuild/openharmony-arm64@0.28.1': + resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.27.4': resolution: {integrity: sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.28.1': + resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.27.4': resolution: {integrity: sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.28.1': + resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.27.4': resolution: {integrity: sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.28.1': + resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.27.4': resolution: {integrity: sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==} engines: {node: '>=18'} cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.28.1': + resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@hapi/address@5.1.1': resolution: {integrity: sha512-A+po2d/dVoY7cYajycYI43ZbYMXukuopIsqCjh5QzsBCipDtdofHntljDlpccMjIfTy6UOkg+5KPriwYch2bXA==} engines: {node: '>=14.0.0'} @@ -337,6 +496,13 @@ packages: '@hapi/hoek@9.3.0': resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + '@hapi/oxc-plugin@1.0.1': + resolution: {integrity: sha512-lgZF6H4w+778+YkguMkBLEkTo5aXJThxTwuPj+TFoD6BDOQ3HT4P9sJWoscwjjPPMHzxTUbq0pP6qjkzr5keSg==} + engines: {node: '>=22'} + peerDependencies: + oxfmt: '>=0.53.0' + oxlint: '>=1.68.0' + '@hapi/pinpoint@2.0.1': resolution: {integrity: sha512-EKQmr16tM8s16vTT3cA5L0kZZcTMU5DUOZTuvpnY738m+jyP3JIUj+Mm1xc1rsLkGBQ/gVnfKYPwOmPg1tUR4Q==} @@ -356,14 +522,14 @@ packages: '@iconify-json/simple-icons@1.2.74': resolution: {integrity: sha512-yqaohfY6jnYjTVpuTkaBQHrWbdUrQyWXhau0r/0EZiNWYXPX/P8WWwl1DoLH5CbvDjjcWQw5J0zADhgCUklOqA==} - '@iconify-json/vscode-icons@1.2.45': - resolution: {integrity: sha512-ow+ueibMIq79ueM1kv6cOWgHx8jfh1XJQi2RrqMHb4HLbvIBlxpy5PCMvOJXlA68R6fBAHpWQeh6uWx7VKEVsA==} + '@iconify-json/vscode-icons@1.2.58': + resolution: {integrity: sha512-ZM6O1GpImQ+n2+/dVijB4uDR1OVgfwoPgnVlKMnUxzJwExPTzuBb/Hd2iwnHj4gWbgBba9Io1qRolVJwYty50A==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - '@iconify/utils@3.1.0': - resolution: {integrity: sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==} + '@iconify/utils@3.1.3': + resolution: {integrity: sha512-LPKOXPn/zV+zis1oOfGWogaXVpqUybF3ZS6SCZIsz8vg0ivVp9+fVqyYB7xq0aiST/VhUQYGO1qo6uoYSiEJqw==} '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -381,8 +547,8 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@lezer/common@1.5.1': - resolution: {integrity: sha512-6YRVG9vBkaY7p1IVxL4s44n5nUnaNnGM2/AckNgYOnxTG2kWh1vR8BMxPseWPjRNpb5VtXnMpeYAEAADoRV1Iw==} + '@lezer/common@1.5.2': + resolution: {integrity: sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ==} '@lezer/highlight@1.2.3': resolution: {integrity: sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==} @@ -457,250 +623,254 @@ packages: '@octokit/types@16.0.0': resolution: {integrity: sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==} - '@oxfmt/binding-android-arm-eabi@0.44.0': - resolution: {integrity: sha512-5UvghMd9SA/yvKTWCAxMAPXS1d2i054UeOf4iFjZjfayTwCINcC3oaSXjtbZfCaEpxgJod7XiOjTtby5yEv/BQ==} + '@oxfmt/binding-android-arm-eabi@0.55.0': + resolution: {integrity: sha512-+rFDOqQe5LOWgxrAJaZgLRudr6GQm0wGI6gtu7vVkrdLGjNMUSGbAlaCr8j7F2H2Er97vYQCU8WDb30onqMM1g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxfmt/binding-android-arm64@0.44.0': - resolution: {integrity: sha512-IVudM1BWfvrYO++Khtzr8q9n5Rxu7msUvoFMqzGJVdX7HfUXUDHwaH2zHZNB58svx2J56pmCUzophyaPFkcG/A==} + '@oxfmt/binding-android-arm64@0.55.0': + resolution: {integrity: sha512-ctulLq8s3x8Zmvw6+iccB09TIKERAklRSmbJ10gk8mlAn05qZxoyo52dj3Hi9IJcmDSwF54fQaTVh2CbL6PInw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxfmt/binding-darwin-arm64@0.44.0': - resolution: {integrity: sha512-eWCLAIKAHfx88EqEP1Ga2yz7qVcqDU5lemn4xck+07bH182hDdprOHjbogyk0In1Djys3T0/pO2JepFnRJ41Mg==} + '@oxfmt/binding-darwin-arm64@0.55.0': + resolution: {integrity: sha512-xDQczLH9pw/RBk1h/GH0qcGMm8hQtmtVHBNLSH3lk1gEIR09hZ4L+mJQl4VqiVAvPK9VG9PYrWWuSQLt7xTbiA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxfmt/binding-darwin-x64@0.44.0': - resolution: {integrity: sha512-eHTBznHLM49++dwz07MblQ2cOXyIgeedmE3Wgy4ptUESj38/qYZyRi1MPwC9olQJWssMeY6WI3UZ7YmU5ggvyQ==} + '@oxfmt/binding-darwin-x64@0.55.0': + resolution: {integrity: sha512-JaNoFCkF2CJdGgpPSMbuO9HVyXyoNGIhMHPvp6NYAjeVKw9XEYc0HcUWJLPQa3Q69WV5wMa9m5jPMJPtbLtcRg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxfmt/binding-freebsd-x64@0.44.0': - resolution: {integrity: sha512-jLMmbj0u0Ft43QpkUVr/0v1ZfQCGWAvU+WznEHcN3wZC/q6ox7XeSJtk9P36CCpiDSUf3sGnzbIuG1KdEMEDJQ==} + '@oxfmt/binding-freebsd-x64@0.55.0': + resolution: {integrity: sha512-DNbszhpg6S2MIzax5azdHFTTBIVkR5xr8yyRZuA4yoDAwOkzIp3tmldgKZM2+VlT+hJIG0xUksA+elISzMEAfA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxfmt/binding-linux-arm-gnueabihf@0.44.0': - resolution: {integrity: sha512-n+A/u/ByK1qV8FVGOwyaSpw5NPNl0qlZfgTBqHeGIqr8Qzq1tyWZ4lAaxPoe5mZqE3w88vn3+jZtMxriHPE7tg==} + '@oxfmt/binding-linux-arm-gnueabihf@0.55.0': + resolution: {integrity: sha512-2snoaoRfFFyGnbOcKUK36rREBYxe/Xgz3uHbiA5zbCB/s6R4DQj4mHqYAaWWhgizCUSDxV8cE9zAZ0XleNpKGw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm-musleabihf@0.44.0': - resolution: {integrity: sha512-5eax+FkxyCqAi3Rw0mrZFr7+KTt/XweFsbALR+B5ljWBLBl8nHe4ADrUnb1gLEfQCJLl+Ca5FIVD4xEt95AwIw==} + '@oxfmt/binding-linux-arm-musleabihf@0.55.0': + resolution: {integrity: sha512-q1aktHF/WRpSK81BX1dE/9vWrS2jGw1Nax2kb4DBLGAewubCLcoNyp4Zl/NSMgbv3vUS46Z33wIQkBVYOP3PYg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm64-gnu@0.44.0': - resolution: {integrity: sha512-58l8JaHxSGOmOMOG2CIrNsnkRJAj0YcHQCmvNACniOa/vd1iRHhlPajczegzS5jwMENlqgreyiTR9iNlke8qCw==} + '@oxfmt/binding-linux-arm64-gnu@0.55.0': + resolution: {integrity: sha512-VD0y36aENezl/3tsclA/4G53Cc7iV+7Uoh7gz4yvcOTaEYBtJpQsE6PKDGTtUtOvGS4kv51ybfXY/nWZejO5IA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-arm64-musl@0.44.0': - resolution: {integrity: sha512-AlObQIXyVRZ96LbtVljtFq0JqH5B92NU+BQeDFrXWBUWlCKAM0wF5GLfIhCLT5kQ3Sl+U0YjRJ7Alqj5hGQaCg==} + '@oxfmt/binding-linux-arm64-musl@0.55.0': + resolution: {integrity: sha512-r8xlKJFcsRmn0H5jZrdORae6RX9jDBrZVvOoxF+bCQtampQJClv80aZEHsv+NsLsp2KCE5ql79O7DpPVzYWpXA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-ppc64-gnu@0.44.0': - resolution: {integrity: sha512-YcFE8/q/BbrCiIiM5piwbkA6GwJc5QqhMQp2yDrqQ2fuVkZ7CInb1aIijZ/k8EXc72qXMSwKpVlBv1w/MsGO/A==} + '@oxfmt/binding-linux-ppc64-gnu@0.55.0': + resolution: {integrity: sha512-GRKv/HXHcwIVld/WU61rF0g0R16hl5EJ+ScKdpjevT57lnLnagj/U2YUbXf2mT+2Pg1uCzWC+mvGicPV3CDdLQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-gnu@0.44.0': - resolution: {integrity: sha512-eOdzs6RqkRzuqNHUX5C8ISN5xfGh4xDww8OEd9YAmc3OWN8oAe5bmlIqQ+rrHLpv58/0BuU48bxkhnIGjA/ATQ==} + '@oxfmt/binding-linux-riscv64-gnu@0.55.0': + resolution: {integrity: sha512-rdv57enTiPtpSYRMKfAiEbQb0Puw5t9N7isVinDoo5qeLDScro2gznmZqSgSWbVZRzLisTeCTW8Qwgw0bOHv3A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-musl@0.44.0': - resolution: {integrity: sha512-YBgNTxntD/QvlFUfgvh8bEdwOhXiquX8gaofZJAwYa/Xp1S1DQrFVZEeck7GFktr24DztsSp8N8WtWCBwxs0Hw==} + '@oxfmt/binding-linux-riscv64-musl@0.55.0': + resolution: {integrity: sha512-7v1nNrlD43VY6+sYQ6efYyb3lE6QY182304PD/768ZxTjOmFd/3dQa3u/nGBUAXYdGSWOQc5N3PnS0QzUXyEIA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-s390x-gnu@0.44.0': - resolution: {integrity: sha512-GLIh1R6WHWshl/i4QQDNgj0WtT25aRO4HNUWEoitxiywyRdhTFmFEYT2rXlcl9U6/26vhmOqG5cRlMLG3ocaIA==} + '@oxfmt/binding-linux-s390x-gnu@0.55.0': + resolution: {integrity: sha512-f4lJLUSPOgScjFl9LiflKCTocyNRwE25JmTMbN4XQdDjoZzEHjqf3wA3VESF1/csg7i8m7+EQLbrZyYDqe10UQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-gnu@0.44.0': - resolution: {integrity: sha512-gZOpgTlOsLcLfAF9qgpTr7FIIFSKnQN3hDf/0JvQ4CIwMY7h+eilNjxq/CorqvYcEOu+LRt1W4ZS7KccEHLOdA==} + '@oxfmt/binding-linux-x64-gnu@0.55.0': + resolution: {integrity: sha512-MihqiPziJNoWy4MqNSV+jVA1g+07iQDjZiR0vaCaDoPgFEiJpCMsxamktzLV07cEeQsSJ04vQaU4CzCQwIvtDA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-musl@0.44.0': - resolution: {integrity: sha512-1CyS9JTB+pCUFYFI6pkQGGZaT/AY5gnhHVrQQLhFba6idP9AzVYm1xbdWfywoldTYvjxQJV6x4SuduCIfP3W+A==} + '@oxfmt/binding-linux-x64-musl@0.55.0': + resolution: {integrity: sha512-Yqghym7KYAVjP9MmSrNZiDeerMuoejNjo0r3ox5H3GDKk8eAfl8VyJm9i+pWCLDCTnAbcTUMMN2ZKjUYXH1v3g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxfmt/binding-openharmony-arm64@0.44.0': - resolution: {integrity: sha512-bmEv70Ak6jLr1xotCbF5TxIKjsmQaiX+jFRtnGtfA03tJPf6VG3cKh96S21boAt3JZc+Vjx8PYcDuLj39vM2Pw==} + '@oxfmt/binding-openharmony-arm64@0.55.0': + resolution: {integrity: sha512-s5SDvVVSbyQl1V5UU3Yl12M+XLUQ3rl5SglNqgAA2K4PXUtQhyNSS00wivONPEnNo5W01rCou8WkDNyvI/RGHg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxfmt/binding-win32-arm64-msvc@0.44.0': - resolution: {integrity: sha512-yWzB+oCpSnP/dmw85eFLAT5o35Ve5pkGS2uF/UCISpIwDqf1xa7OpmtomiqY/Vzg8VyvMbuf6vroF2khF/+1Vg==} + '@oxfmt/binding-win32-arm64-msvc@0.55.0': + resolution: {integrity: sha512-7p9FB5R32tw2KyyNX3wpQrR2WHwEHvMEiBlGXxeTCaRMCVNx3UtFMAUbaQ/pRNWIrEUZmYhJ6tcUH52uPTRYjQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxfmt/binding-win32-ia32-msvc@0.44.0': - resolution: {integrity: sha512-TcWpo18xEIE3AmIG2kpr3kz5IEhQgnx0lazl2+8L+3eTopOAUevQcmlr4nhguImNWz0OMeOZrYZOhJNCf16nlQ==} + '@oxfmt/binding-win32-ia32-msvc@0.55.0': + resolution: {integrity: sha512-ZYqj3fDnOT1IaVGMP5kpmkQl4F3tQIm2ZyAxvqkJYmI0xgWWak4ss4XYwv3VDfM+TWXeC9K4uQ/wW5jm/5XABA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxfmt/binding-win32-x64-msvc@0.44.0': - resolution: {integrity: sha512-oj8aLkPJZppIM4CMQNsyir9ybM1Xw/CfGPTSsTnzpVGyljgfbdP0EVUlURiGM0BDrmw5psQ6ArmGCcUY/yABaQ==} + '@oxfmt/binding-win32-x64-msvc@0.55.0': + resolution: {integrity: sha512-eEYT5tivGnGbPHuOHuQpi6CGLObhh0re/5jcNQHihD2GRYkTM85dyi5a19zjP8Q00t1uqAx+/QGLUGdHeqzWyg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@oxlint/binding-android-arm-eabi@1.59.0': - resolution: {integrity: sha512-etYDw/UaEv936AQUd/CRMBVd+e+XuuU6wC+VzOv1STvsTyZenLChepLWqLtnyTTp4YMlM22ypzogDDwqYxv5cg==} + '@oxlint/binding-android-arm-eabi@1.70.0': + resolution: {integrity: sha512-zFh0P4cswmRvw6nkyb89dr18rRanuaCPAsEXsFDoQY8WdaquI8Pt4NWFjaMJg6L23cy5NeN8J9cBnREbWzZhaw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxlint/binding-android-arm64@1.59.0': - resolution: {integrity: sha512-TgLc7XVLKH2a4h8j3vn1MDjfK33i9MY60f/bKhRGWyVzbk5LCZ4X01VZG7iHrMmi5vYbAp8//Ponigx03CLsdw==} + '@oxlint/binding-android-arm64@1.70.0': + resolution: {integrity: sha512-qI8o4HZjeGiBrWv+pJv4lH0Yi2Gl/JSp/EumBUApezJprIKa5PS4nU0lQsQngtky8k+SplQIOjv6hwu0SSxeyg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxlint/binding-darwin-arm64@1.59.0': - resolution: {integrity: sha512-DXyFPf5ZKldMLloRHx/B9fsxsiTQomaw7cmEW3YIJko2HgCh+GUhp9gGYwHrqlLJPsEe3dYj9JebjX92D3j3AA==} + '@oxlint/binding-darwin-arm64@1.70.0': + resolution: {integrity: sha512-8KjgVVHI5F9nVwHCRwwA78Ty7zNKP4Wd9OeN5PSv3iu/F/u1RVXoOCgLhWqust6HmwQG6xc8c+RCyaWENy24+w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxlint/binding-darwin-x64@1.59.0': - resolution: {integrity: sha512-LgvrsdgVLX1qWqIEmNsSmMXJhpAWdtUQ0M+oR0CySwi+9IHWyOGuIL8w8+u/kbZNMyZr4WUyYB5i0+D+AKgkLg==} + '@oxlint/binding-darwin-x64@1.70.0': + resolution: {integrity: sha512-WVydssv5PSUBXFJTdNBWlmGkbNmvPGaFt/2SUT/EZRB6bq6bEOHmMlbnupZD5jmlEvi9+mZJHi8TCw15lyfSfQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxlint/binding-freebsd-x64@1.59.0': - resolution: {integrity: sha512-bOJhqX/ny4hrFuTPlyk8foSRx/vLRpxJh0jOOKN2NWW6FScXHPAA5rQbrwdQPcgGB5V8Ua51RS03fke8ssBcug==} + '@oxlint/binding-freebsd-x64@1.70.0': + resolution: {integrity: sha512-hJucmUf8OlinHNb1R7fI4Fw6WsAstOz7i8nmkWQfiHoZXtbufNm+MxiDTIMk1ggh2Ro4vLzgQ+bKvRY54MZoRA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxlint/binding-linux-arm-gnueabihf@1.59.0': - resolution: {integrity: sha512-vVUXxYMF9trXCsz4m9H6U0IjehosVHxBzVgJUxly1uz4W1PdDyicaBnpC0KRXsHYretLVe+uS9pJy8iM57Kujw==} + '@oxlint/binding-linux-arm-gnueabihf@1.70.0': + resolution: {integrity: sha512-1BnS7wbCYDSXwWzJJ+mc3NURoha6m6m6RT5c6vgAY3oz7C3OVXP+S0awo2mRq97arrJkVvO3qRQfyAHL+76xtQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm-musleabihf@1.59.0': - resolution: {integrity: sha512-TULQW8YBPGRWg5yZpFPL54HLOnJ3/HiX6VenDPi6YfxB/jlItwSMFh3/hCeSNbh+DAMaE1Py0j5MOaivHkI/9Q==} + '@oxlint/binding-linux-arm-musleabihf@1.70.0': + resolution: {integrity: sha512-yKy/UdbR55+M2yEcuiV5DCNC/gdQAjr/GioUy50QwBzSrKm8ueWADqyRLS9Xk+qjNeCYGg6A8FvUBds56ttfqg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm64-gnu@1.59.0': - resolution: {integrity: sha512-Gt54Y4eqSgYJ90xipm24xeyaPV854706o/kiT8oZvUt3VDY7qqxdqyGqchMaujd87ib+/MXvnl9WkK8Cc1BExg==} + '@oxlint/binding-linux-arm64-gnu@1.70.0': + resolution: {integrity: sha512-0A5XJ4alvmqFUFP/4oYSyaO+qLto/HrKEWTSaegiVl+HOufFngK2BjYw9x4RbwBt/du5QG6l5q1zeWiJYYG5yg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-arm64-musl@1.59.0': - resolution: {integrity: sha512-3CtsKp7NFB3OfqQzbuAecrY7GIZeiv7AD+xutU4tefVQzlfmTI7/ygWLrvkzsDEjTlMq41rYHxgsn6Yh8tybmA==} + '@oxlint/binding-linux-arm64-musl@1.70.0': + resolution: {integrity: sha512-JiylyurlB0CLSedNtx1gzv3FvfWPF1h/2Y3BJszPLNt5XQFlBsH5ke0Jle3iJb3uqu5m2e7A/DwzpuCAHdiU+A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxlint/binding-linux-ppc64-gnu@1.59.0': - resolution: {integrity: sha512-K0diOpT3ncDmOfl9I1HuvpEsAuTxkts0VYwIv/w6Xiy9CdwyPBVX88Ga9l8VlGgMrwBMnSY4xIvVlVY/fkQk7Q==} + '@oxlint/binding-linux-ppc64-gnu@1.70.0': + resolution: {integrity: sha512-J8VPG7I3/HmgaU4u8pNU2kFx2+0U+vPLS1dXFxXOaR/2TQ0f8AC7DRz0SRGRI1bfphnX2hVYTTtLuhL4nYKL+Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-gnu@1.59.0': - resolution: {integrity: sha512-xAU7+QDU6kTJJ7mJLOGgo7oOjtAtkKyFZ0Yjdb5cEo3DiCCPFLvyr08rWiQh6evZ7RiUTf+o65NY/bqttzJiQQ==} + '@oxlint/binding-linux-riscv64-gnu@1.70.0': + resolution: {integrity: sha512-N2+4lV2KLN+oXTIIIwmWDhwkrnvqf5oX7Hw0zPjk+RuIVgiBQSOlJWF7uQoFx2siEYX0ZQ5cfSbEAHm+J3t7Wg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-musl@1.59.0': - resolution: {integrity: sha512-KUmZmKlTTyauOnvUNVxK7G40sSSx0+w5l1UhaGsC6KPpOYHenx2oqJTnabmpLJicok7IC+3Y6fXAUOMyexaeJQ==} + '@oxlint/binding-linux-riscv64-musl@1.70.0': + resolution: {integrity: sha512-1e2L7cFCvx9QDzq6NPP+0tABKb5z6nWHyddWTNKprEsjO9xNrAtPowuCGpjNXxkTdsMiZ4jc8YQ5SstZd4XK6g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxlint/binding-linux-s390x-gnu@1.59.0': - resolution: {integrity: sha512-4usRxC8gS0PGdkHnRmwJt/4zrQNZyk6vL0trCxwZSsAKM+OxhB8nKiR+mhjdBbl8lbMh2gc3bZpNN/ik8c4c2A==} + '@oxlint/binding-linux-s390x-gnu@1.70.0': + resolution: {integrity: sha512-Kwu/l/8GcYibCWA9m9N5pRXMIKVSsL/YbgpLzYkqDhWTiqdRfnNJ/+nqIKRKQiFbHWsdlHEhzMwruJK+qcEruA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-gnu@1.59.0': - resolution: {integrity: sha512-s/rNE2gDmbwAOOP493xk2X7M8LZfI1LJFSSW1+yanz3vuQCFPiHkx4GY+O1HuLUDtkzGlhtMrIcxxzyYLv308w==} + '@oxlint/binding-linux-x64-gnu@1.70.0': + resolution: {integrity: sha512-tap04CsHYOl0nSAQJfPNIuBxqEPB2HnhQqwaOXLg1jnp2XfRo8Fa814dA4QC4zpvTWXCjAAaCY1W5LOORkEQuQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-musl@1.59.0': - resolution: {integrity: sha512-+yYj1udJa2UvvIUmEm0IcKgc0UlPMgz0nsSTvkPL2y6n0uU5LgIHSwVu4AHhrve6j9BpVSoRksnz8c9QcvITJA==} + '@oxlint/binding-linux-x64-musl@1.70.0': + resolution: {integrity: sha512-hzJa/WgvtJpbBD9rgfy0qe+MjbxOXNUT0bfR1S6EQQzfTtBFA9xg5q8KSwRrQ2QfSS+TaP4j+4mVPQrfNc6UNg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxlint/binding-openharmony-arm64@1.59.0': - resolution: {integrity: sha512-bUplUb48LYsB3hHlQXP2ZMOenpieWoOyppLAnnAhuPag3MGPnt+7caxE3w/Vl9wpQsTA3gzLntQi9rxWrs7Xqg==} + '@oxlint/binding-openharmony-arm64@1.70.0': + resolution: {integrity: sha512-xbsaNSNzVSnaJACCUYr1HQMyY/Q/Q1LkePmHG3UvZPvGCYGNxrsZp9OmtA6ick8xH47ltRRbRrPCM1YXYcyC+A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxlint/binding-win32-arm64-msvc@1.59.0': - resolution: {integrity: sha512-/HLsLuz42rWl7h7ePdmMTpHm2HIDmPtcEMYgm5BBEHiEiuNOrzMaUpd2z7UnNni5LGN9obJy2YoAYBLXQwazrA==} + '@oxlint/binding-win32-arm64-msvc@1.70.0': + resolution: {integrity: sha512-icAEsUI7JbW1TMRdEXV83mVAInhRVQYuuAlPpxdGwJ95chNdnCzjloRW8GglT0WvzOEZSio6fnYSk2DJ2Hv7LQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxlint/binding-win32-ia32-msvc@1.59.0': - resolution: {integrity: sha512-rUPy+JnanpPwV/aJCPnxAD1fW50+XPI0VkWr7f0vEbqcdsS8NpB24Rw6RsS7SdpFv8Dw+8ugCwao5nCFbqOUSg==} + '@oxlint/binding-win32-ia32-msvc@1.70.0': + resolution: {integrity: sha512-FHMSWbVsPVs/f+Jcl04ws4JJ2wUnauyTzlpxWRG/lSO/8GpX08Fo2gQZqdA6CrRFI+zvkxl+N/KwJGWfUwYVZA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxlint/binding-win32-x64-msvc@1.59.0': - resolution: {integrity: sha512-xkE7puteDS/vUyRngLXW0t8WgdWoS/tfxXjhP/P7SMqPDx+hs44SpssO3h3qmTqECYEuXBUPzcAw5257Ka+ofA==} + '@oxlint/binding-win32-x64-msvc@1.70.0': + resolution: {integrity: sha512-ptOlKwCz7n4AKs5VweMqG6DAg677FmKOK+vBkkL9DMNgFATIQ+upqUYBTOEwRQyRAx1ncGlPlXleV2hIcm3z4g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] + '@oxlint/plugins@1.70.0': + resolution: {integrity: sha512-Ut6i0mPdferb+8YJFPaVAg95Fcqduk6fL3PlA4CX58OaPJOi8vvTAcm6iO40Krd5FFMWP+hAhIxlYEhvgvYA6w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@rolldown/pluginutils@1.0.0-rc.2': resolution: {integrity: sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==} @@ -913,14 +1083,14 @@ packages: peerDependencies: typescript: '*' - '@uiw/codemirror-theme-darcula@4.25.9': - resolution: {integrity: sha512-lrex1DXg/mx2BX1UtnyFlat7w6c3RyE5GMvyR8uPfXNAXMUEKjYxNRdUuQ9WGlOMzQZ3x+UbKnUZd/r6AmXwsw==} + '@uiw/codemirror-theme-darcula@4.25.10': + resolution: {integrity: sha512-vdIGN/7jaxtwgEgpCbXTTKNHGgJWvID0DGN7P2ycza39fRabjwFhJRvcWIelAsJerLloN17iQqk3hPOEdMrc5A==} - '@uiw/codemirror-theme-eclipse@4.25.9': - resolution: {integrity: sha512-0pT0vRyLAotj5UjIZbHSmsZ8oz7l8IU5bhx5p7MDrTOdi73ZjyTsG4YsDzSXndERnfgkBbZJrlZiExBkXnhtUA==} + '@uiw/codemirror-theme-eclipse@4.25.10': + resolution: {integrity: sha512-KuabEwh0cTZNh7DW3tQY4vA7W6jlZFpf8NTan4fq8gHRtwX/uPe315OedlCFCrz9p8aOyYLrr13XfZfQ5GpdmA==} - '@uiw/codemirror-themes@4.25.9': - resolution: {integrity: sha512-DAHKb/L9ELwjY4nCf/MP/mIllHOn4GQe7RR4x8AMJuNeh9nGRRoo1uPxrxMmUL/bKqe6kDmDbIZ2AlhlqyIJuw==} + '@uiw/codemirror-themes@4.25.10': + resolution: {integrity: sha512-Fqiz1HIuDlDftcL+/O53V333UOH6MqQ84VbiQB5egn6u+uDwAqACp1FrdAoi4wgpR3b3TGW4Gr0wIYcrJSSz1A==} peerDependencies: '@codemirror/language': '>=6.0.0' '@codemirror/state': '>=6.0.0' @@ -928,6 +1098,7 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + deprecated: Potential CWE-502 - Update to 1.3.1 or higher '@vitejs/plugin-vue@6.0.5': resolution: {integrity: sha512-bL3AxKuQySfk1iGcBsQnoRVexTPJq0Z/ixFVM8OhVJAP6ZXXXLtM7NFKWhLl30Kg7uTBqIaPXbh+nuQCuBDedg==} @@ -936,17 +1107,17 @@ packages: vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 vue: ^3.2.25 - '@vue/compiler-core@3.5.32': - resolution: {integrity: sha512-4x74Tbtqnda8s/NSD6e1Dr5p1c8HdMU5RWSjMSUzb8RTcUQqevDCxVAitcLBKT+ie3o0Dl9crc/S/opJM7qBGQ==} + '@vue/compiler-core@3.5.38': + resolution: {integrity: sha512-s99aGxWYig9ErHbct27KXEGhrBYlRI6c4MwAgXErOAbX9xiW37/uMa+XUDO69zLz83dng8UUZ70CTOJrLrYrEQ==} - '@vue/compiler-dom@3.5.32': - resolution: {integrity: sha512-ybHAu70NtiEI1fvAUz3oXZqkUYEe5J98GjMDpTGl5iHb0T15wQYLR4wE3h9xfuTNA+Cm2f4czfe8B4s+CCH57Q==} + '@vue/compiler-dom@3.5.38': + resolution: {integrity: sha512-JTqp25l8aFfJYF7/KmsXZjAxJz7T+SjmTJLoXVjHtc2BrSgSiW2n9Aem/cWq1OPe68A8JL06B3eVdhlP0H4TVw==} - '@vue/compiler-sfc@3.5.32': - resolution: {integrity: sha512-8UYUYo71cP/0YHMO814TRZlPuUUw3oifHuMR7Wp9SNoRSrxRQnhMLNlCeaODNn6kNTJsjFoQ/kqIj4qGvya4Xg==} + '@vue/compiler-sfc@3.5.38': + resolution: {integrity: sha512-DuA2GiZawSEW442iw/9+Fkol8hTgb4Ke5KkhmSry65QA7YuyMbIdy8p0XZRMvNwJdgRz307W8g1CSzdvS4nuNg==} - '@vue/compiler-ssr@3.5.32': - resolution: {integrity: sha512-Gp4gTs22T3DgRotZ8aA/6m2jMR+GMztvBXUBEUOYOcST+giyGWJ4WvFd7QLHBkzTxkfOt8IELKNdpzITLbA2rw==} + '@vue/compiler-ssr@3.5.38': + resolution: {integrity: sha512-7s+W5Gc42FGxZMcuwl8H5B29T8BJPMdBT7KHFE+BbAuZ/iTEdTtv7z2XiMjiaUUw4w3ZcCEdHs36RuYJ2VA7bA==} '@vue/devtools-api@8.1.0': resolution: {integrity: sha512-O44X57jjkLKbLEc4OgL/6fEPOOanRJU8kYpCE8qfKlV96RQZcdzrcLI5mxMuVRUeXhHKIHGhCpHacyCk0HyO4w==} @@ -957,31 +1128,33 @@ packages: '@vue/devtools-shared@8.1.0': resolution: {integrity: sha512-h8uCb4Qs8UT8VdTT5yjY6tOJ//qH7EpxToixR0xqejR55t5OdISIg7AJ7eBkhBs8iu1qG5gY3QQNN1DF1EelAA==} - '@vue/reactivity@3.5.32': - resolution: {integrity: sha512-/ORasxSGvZ6MN5gc+uE364SxFdJ0+WqVG0CENXaGW58TOCdrAW76WWaplDtECeS1qphvtBZtR+3/o1g1zL4xPQ==} + '@vue/reactivity@3.5.38': + resolution: {integrity: sha512-pG6LV/NDNRbKizcUjFFLAfjaL8mcv4DmR9avNcUw2gDHBzZneuS2TWCmp633ynzxz9YYKNeEPK2I8Wraqy2HUQ==} - '@vue/runtime-core@3.5.32': - resolution: {integrity: sha512-pDrXCejn4UpFDFmMd27AcJEbHaLemaE5o4pbb7sLk79SRIhc6/t34BQA7SGNgYtbMnvbF/HHOftYBgFJtUoJUQ==} + '@vue/runtime-core@3.5.38': + resolution: {integrity: sha512-iyW8WVfF1CpCXxncZY5Ei6rSd6oZr5DgEom//fUjRBRl56AXPD+s9ATvukRt77ZFTuYlnVA1bxY+dJB94tWVYw==} - '@vue/runtime-dom@3.5.32': - resolution: {integrity: sha512-1CDVv7tv/IV13V8Nip1k/aaObVbWqRlVCVezTwx3K07p7Vxossp5JU1dcPNhJk3w347gonIUT9jQOGutyJrSVQ==} + '@vue/runtime-dom@3.5.38': + resolution: {integrity: sha512-apX2wt9sdfDshS+a2xueFZLVpt0GkRJZSoPmrW/SA4yzXTznhfcMVW59gr7h4YQeY0vJhdJkk2rsIDwgfFgC5A==} - '@vue/server-renderer@3.5.32': - resolution: {integrity: sha512-IOjm2+JQwRFS7W28HNuJeXQle9KdZbODFY7hFGVtnnghF51ta20EWAZJHX+zLGtsHhaU6uC9BGPV52KVpYryMQ==} + '@vue/server-renderer@3.5.38': + resolution: {integrity: sha512-vue8vbf2QlV4quHqzwmJy6dWfmRhP1J8l4wtZg60CL6VoKqcPY2oe7may3+1d9qfpedjK5PRLFqd5k3Isj9mUw==} peerDependencies: - vue: 3.5.32 + vue: 3.5.38 - '@vue/shared@3.5.30': - resolution: {integrity: sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==} - - '@vue/shared@3.5.32': - resolution: {integrity: sha512-ksNyrmRQzWJJ8n3cRDuSF7zNNontuJg1YHnmWRJd2AMu8Ij2bqwiiri2lH5rHtYPZjj4STkNcgcmiQqlOjiYGg==} + '@vue/shared@3.5.38': + resolution: {integrity: sha512-FTW0AFZNaK5/mOqvGBwVfUlNLU38TiQn4+DQgIFUnrBBJQ1crMJ82yeGQLV5jyKFsO8yRukpbuP7x+nRbH6aug==} '@vueuse/core@14.2.1': resolution: {integrity: sha512-3vwDzV+GDUNpdegRY6kzpLm4Igptq+GA0QkJ3W61Iv27YWwW/ufSlOfgQIpN6FZRMG0mkaz4gglJRtq5SeJyIQ==} peerDependencies: vue: ^3.5.0 + '@vueuse/core@14.3.0': + resolution: {integrity: sha512-aHfz47g0ZhMtTVHmIzMVpJy8ePhhOy68GY5bv110+5DVtZ+W7BsOx+m61UNQqfrWyPztIHIanWa3E2tib3NFIw==} + peerDependencies: + vue: ^3.5.0 + '@vueuse/integrations@14.2.1': resolution: {integrity: sha512-2LIUpBi/67PoXJGqSDQUF0pgQWpNHh7beiA+KG2AbybcNm+pTGWT6oPGlBgUoDWmYwfeQqM/uzOHqcILpKL7nA==} peerDependencies: @@ -1027,13 +1200,21 @@ packages: '@vueuse/metadata@14.2.1': resolution: {integrity: sha512-1ButlVtj5Sb/HDtIy1HFr1VqCP4G6Ypqt5MAo0lCgjokrk2mvQKsK2uuy0vqu/Ks+sHfuHo0B9Y9jn9xKdjZsw==} + '@vueuse/metadata@14.3.0': + resolution: {integrity: sha512-BwxmbAzwAVF50+MW57GXOUEV61nFBGnlBvrTqj49PqWJu3uw7hdu72ztXeZ33RdZtDY6kO+bfCAE1PCn88Tktw==} + '@vueuse/shared@14.2.1': resolution: {integrity: sha512-shTJncjV9JTI4oVNyF1FQonetYAiTBd+Qj7cY89SWbXSkx7gyhrgtEdF2ZAVWS1S3SHlaROO6F2IesJxQEkZBw==} peerDependencies: vue: ^3.5.0 - acorn@8.16.0: - resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + '@vueuse/shared@14.3.0': + resolution: {integrity: sha512-bZpge9eSXwa4ToSiqJ7j6KRwhAsneMFoSz3LMWKQDkqimm3D/tbFlrklrs/IOqC8tEcYmXQZJ6N0UrjhBirVCg==} + peerDependencies: + vue: ^3.5.0 + + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} engines: {node: '>=0.4.0'} hasBin: true @@ -1067,9 +1248,6 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - confbox@0.1.8: - resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - crelt@1.0.6: resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} @@ -1096,14 +1274,19 @@ packages: resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} engines: {node: '>=0.12'} - es-toolkit@1.45.1: - resolution: {integrity: sha512-/jhoOj/Fx+A+IIyDNOvO3TItGmlMKhtX8ISAHKE90c4b/k1tqaqEZ+uUqfpU8DMnW5cgNJv606zS55jGvza0Xw==} + es-toolkit@1.47.1: + resolution: {integrity: sha512-5RAqEwf4P4E17p+W75KLOWw/nOvKZzSQpxM32IpI2KZLaVonjTrZ0Ai5ghMaVI9eKC2p8eoQgcBdkEDgzFk6+Q==} esbuild@0.27.4: resolution: {integrity: sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==} engines: {node: '>=18'} hasBin: true + esbuild@0.28.1: + resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} + engines: {node: '>=18'} + hasBin: true + estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -1119,8 +1302,8 @@ packages: picomatch: optional: true - feed@5.2.0: - resolution: {integrity: sha512-hgH6CCb+7+0c8PBlakI2KubG6R+Rb1MhpNcdvqUXZTBwBHf32piwY255diAkAmkGZ6AWlywOU88AkOgP9q8Rdw==} + feed@5.2.1: + resolution: {integrity: sha512-jTynzYPWs9ALjro0GW8j7sv9y7cJBeOdD4Y88kVqYy/eyusIX3g+499JiTDIlD9Ge/unebx57T4Uzo6vpYvMtA==} engines: {node: '>=20', pnpm: '>=10'} focus-trap@8.0.0: @@ -1131,9 +1314,6 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - get-tsconfig@4.13.6: - resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==} - github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} @@ -1149,8 +1329,11 @@ packages: html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - joi@17.13.3: - resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + + joi@17.13.4: + resolution: {integrity: sha512-1RuuER6kmt8K8I3nIWvPZKi5RQCb568ZPyY4Pwjlua+yo+63ZTmIwxLZH0heBmiKN4uxjvCiarDrjaeH84xicQ==} joi@18.2.1: resolution: {integrity: sha512-2/OKlogiESf2Nh3TFCrRjrr9z1DRHeW0I+KReF67+4J0Ns+8hBtHRmoWAZ2OFU6I5+TWLEe6sVlSdXPjHm5UbQ==} @@ -1186,14 +1369,11 @@ packages: minisearch@7.2.0: resolution: {integrity: sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==} - mlly@1.8.2: - resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -1203,27 +1383,35 @@ packages: oniguruma-to-es@4.3.5: resolution: {integrity: sha512-Zjygswjpsewa0NLTsiizVuMQZbp0MDyM6lIt66OxsF21npUDlzpHi1Mgb/qhQdkb+dWFTzJmFbEWdvZgRho8eQ==} - oxfmt@0.44.0: - resolution: {integrity: sha512-lnncqvHewyRvaqdrnntVIrZV2tEddz8lbvPsQzG/zlkfvgZkwy0HP1p/2u1aCDToeg1jb9zBpbJdfkV73Itw+w==} + oxfmt@0.55.0: + resolution: {integrity: sha512-jSj2wCTakwgPMxkfiVZX0jf+nX+Nz6xlyAZjqNE0qXTFdCBPYlP6JAN+ODjmealw7DXBjOzYbdsqwBMAZnPZ6A==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + peerDependencies: + svelte: ^5.0.0 + vite-plus: '*' + peerDependenciesMeta: + svelte: + optional: true + vite-plus: + optional: true - oxlint@1.59.0: - resolution: {integrity: sha512-0xBLeGGjP4vD9pygRo8iuOkOzEU1MqOnfiOl7KYezL/QvWL8NUg6n03zXc7ZVqltiOpUxBk2zgHI3PnRIEdAvw==} + oxlint@1.70.0: + resolution: {integrity: sha512-D6JgHtzkhRwvEC+A0Nw5AEc5bk8x5i1pHzvZIEf/a0C4hOzmAACNGtkDGPyFaxxX3ZVGxCPeig3P3rMM8XU3/g==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - oxlint-tsgolint: '>=0.18.0' + oxlint-tsgolint: '>=0.22.1' + vite-plus: '*' peerDependenciesMeta: oxlint-tsgolint: optional: true + vite-plus: + optional: true package-manager-detector@1.6.0: resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} - pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - perfect-debounce@2.1.0: resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} @@ -1234,15 +1422,12 @@ packages: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} - pkg-types@1.3.1: - resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - - postcss@8.5.8: - resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} + postcss@8.5.15: + resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} engines: {node: ^10 || ^12 || >=14} - prettier@3.8.1: - resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + prettier@3.8.4: + resolution: {integrity: sha512-N2MylSdi48+5N/6S5j+maeHbUSIzzZ5uOcX5Hm4QpV8Dkb1HFjfAKTKX6yNPJQD9AhcT3ifHNB66tWTTJDi11Q==} engines: {node: '>=14'} hasBin: true @@ -1258,9 +1443,6 @@ packages: regex@6.1.0: resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - rollup@4.59.0: resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -1270,8 +1452,8 @@ packages: resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} engines: {node: '>=11.0.0'} - semver@7.7.4: - resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + semver@7.8.4: + resolution: {integrity: sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==} engines: {node: '>=10'} hasBin: true @@ -1306,8 +1488,8 @@ packages: engines: {node: '>=10'} hasBin: true - tinyexec@1.0.4: - resolution: {integrity: sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==} + tinyexec@1.2.4: + resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} engines: {node: '>=18'} tinyglobby@0.2.15: @@ -1321,19 +1503,16 @@ packages: trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - tsx@4.21.0: - resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + tsx@4.22.4: + resolution: {integrity: sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==} engines: {node: '>=18.0.0'} hasBin: true - typescript@6.0.2: - resolution: {integrity: sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==} + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true - ufo@1.6.3: - resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} - undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} @@ -1361,8 +1540,8 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite@7.3.2: - resolution: {integrity: sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==} + vite@7.3.5: + resolution: {integrity: sha512-KuOaNhcnGFN2zIPGA7wRmzF+lJA1sea7rHq17aiJ++9lzY1WWG6Jpwqwe1KNbRVPIqHmr8GLYx7jbrQcN/7/ww==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -1401,8 +1580,8 @@ packages: yaml: optional: true - vitepress-plugin-group-icons@1.7.3: - resolution: {integrity: sha512-Nj2znOveQC7KH1CQ1k2WlVvEDAuymhumcUvD51ognVUv2yjrfAhOzL1VEESPzoJN0kWoRxXK+iu+OKNLe7unGQ==} + vitepress-plugin-group-icons@1.7.5: + resolution: {integrity: sha512-QzcroUuIiVKyXpmEiiHVbfRTQIy9Zbwxpk5JC/zavO8mavitwumz2RZWlwTchMCCHducYyPptkYvXvdnNUWkog==} peerDependencies: vite: '>=3' peerDependenciesMeta: @@ -1424,8 +1603,8 @@ packages: postcss: optional: true - vue@3.5.32: - resolution: {integrity: sha512-vM4z4Q9tTafVfMAK7IVzmxg34rSzTFMyIe0UUEijUCkn9+23lj0WRfA83dg7eQZIUlgOSGrkViIaCfqSAUXsMw==} + vue@3.5.38: + resolution: {integrity: sha512-vAMKHfImQlYSy0C+PBue4s3ERZ2xGKfgZg5GXAsLInq1dyh2H78ILVP5sK0KPFPVW4kv+OGCIvBEondcjpZp7A==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -1447,45 +1626,45 @@ snapshots: '@antfu/install-pkg@1.1.0': dependencies: package-manager-detector: 1.6.0 - tinyexec: 1.0.4 + tinyexec: 1.2.4 - '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@7.29.7': {} - '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-identifier@7.29.7': {} - '@babel/parser@7.29.2': + '@babel/parser@7.29.7': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 '@babel/runtime@7.29.2': {} - '@babel/types@7.29.0': + '@babel/types@7.29.7': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 - '@codemirror/autocomplete@6.20.1': + '@codemirror/autocomplete@6.20.3': dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 - '@codemirror/view': 6.41.0 - '@lezer/common': 1.5.1 + '@codemirror/view': 6.43.1 + '@lezer/common': 1.5.2 '@codemirror/commands@6.10.3': dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 - '@codemirror/view': 6.41.0 - '@lezer/common': 1.5.1 + '@codemirror/view': 6.43.1 + '@lezer/common': 1.5.2 '@codemirror/lang-javascript@6.2.5': dependencies: - '@codemirror/autocomplete': 6.20.1 + '@codemirror/autocomplete': 6.20.3 '@codemirror/language': 6.12.3 '@codemirror/lint': 6.9.5 '@codemirror/state': 6.6.0 - '@codemirror/view': 6.41.0 - '@lezer/common': 1.5.1 + '@codemirror/view': 6.43.1 + '@lezer/common': 1.5.2 '@lezer/javascript': 1.5.4 '@codemirror/lang-json@6.0.2': @@ -1496,8 +1675,8 @@ snapshots: '@codemirror/language@6.12.3': dependencies: '@codemirror/state': 6.6.0 - '@codemirror/view': 6.41.0 - '@lezer/common': 1.5.1 + '@codemirror/view': 6.43.1 + '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 '@lezer/lr': 1.4.8 style-mod: 4.1.3 @@ -1505,20 +1684,20 @@ snapshots: '@codemirror/lint@6.9.5': dependencies: '@codemirror/state': 6.6.0 - '@codemirror/view': 6.41.0 + '@codemirror/view': 6.43.1 crelt: 1.0.6 '@codemirror/search@6.6.0': dependencies: '@codemirror/state': 6.6.0 - '@codemirror/view': 6.41.0 + '@codemirror/view': 6.43.1 crelt: 1.0.6 '@codemirror/state@6.6.0': dependencies: '@marijn/find-cluster-break': 1.0.2 - '@codemirror/view@6.41.0': + '@codemirror/view@6.43.1': dependencies: '@codemirror/state': 6.6.0 crelt: 1.0.6 @@ -1534,81 +1713,159 @@ snapshots: '@esbuild/aix-ppc64@0.27.4': optional: true + '@esbuild/aix-ppc64@0.28.1': + optional: true + '@esbuild/android-arm64@0.27.4': optional: true + '@esbuild/android-arm64@0.28.1': + optional: true + '@esbuild/android-arm@0.27.4': optional: true + '@esbuild/android-arm@0.28.1': + optional: true + '@esbuild/android-x64@0.27.4': optional: true + '@esbuild/android-x64@0.28.1': + optional: true + '@esbuild/darwin-arm64@0.27.4': optional: true + '@esbuild/darwin-arm64@0.28.1': + optional: true + '@esbuild/darwin-x64@0.27.4': optional: true + '@esbuild/darwin-x64@0.28.1': + optional: true + '@esbuild/freebsd-arm64@0.27.4': optional: true + '@esbuild/freebsd-arm64@0.28.1': + optional: true + '@esbuild/freebsd-x64@0.27.4': optional: true + '@esbuild/freebsd-x64@0.28.1': + optional: true + '@esbuild/linux-arm64@0.27.4': optional: true + '@esbuild/linux-arm64@0.28.1': + optional: true + '@esbuild/linux-arm@0.27.4': optional: true + '@esbuild/linux-arm@0.28.1': + optional: true + '@esbuild/linux-ia32@0.27.4': optional: true + '@esbuild/linux-ia32@0.28.1': + optional: true + '@esbuild/linux-loong64@0.27.4': optional: true + '@esbuild/linux-loong64@0.28.1': + optional: true + '@esbuild/linux-mips64el@0.27.4': optional: true + '@esbuild/linux-mips64el@0.28.1': + optional: true + '@esbuild/linux-ppc64@0.27.4': optional: true + '@esbuild/linux-ppc64@0.28.1': + optional: true + '@esbuild/linux-riscv64@0.27.4': optional: true + '@esbuild/linux-riscv64@0.28.1': + optional: true + '@esbuild/linux-s390x@0.27.4': optional: true + '@esbuild/linux-s390x@0.28.1': + optional: true + '@esbuild/linux-x64@0.27.4': optional: true + '@esbuild/linux-x64@0.28.1': + optional: true + '@esbuild/netbsd-arm64@0.27.4': optional: true + '@esbuild/netbsd-arm64@0.28.1': + optional: true + '@esbuild/netbsd-x64@0.27.4': optional: true + '@esbuild/netbsd-x64@0.28.1': + optional: true + '@esbuild/openbsd-arm64@0.27.4': optional: true + '@esbuild/openbsd-arm64@0.28.1': + optional: true + '@esbuild/openbsd-x64@0.27.4': optional: true + '@esbuild/openbsd-x64@0.28.1': + optional: true + '@esbuild/openharmony-arm64@0.27.4': optional: true + '@esbuild/openharmony-arm64@0.28.1': + optional: true + '@esbuild/sunos-x64@0.27.4': optional: true + '@esbuild/sunos-x64@0.28.1': + optional: true + '@esbuild/win32-arm64@0.27.4': optional: true + '@esbuild/win32-arm64@0.28.1': + optional: true + '@esbuild/win32-ia32@0.27.4': optional: true + '@esbuild/win32-ia32@0.28.1': + optional: true + '@esbuild/win32-x64@0.27.4': optional: true + '@esbuild/win32-x64@0.28.1': + optional: true + '@hapi/address@5.1.1': dependencies: '@hapi/hoek': 11.0.7 @@ -1619,6 +1876,12 @@ snapshots: '@hapi/hoek@9.3.0': {} + '@hapi/oxc-plugin@1.0.1(oxfmt@0.55.0)(oxlint@1.70.0)': + dependencies: + '@oxlint/plugins': 1.70.0 + oxfmt: 0.55.0 + oxlint: 1.70.0 + '@hapi/pinpoint@2.0.1': {} '@hapi/tlds@1.1.6': {} @@ -1639,17 +1902,17 @@ snapshots: dependencies: '@iconify/types': 2.0.0 - '@iconify-json/vscode-icons@1.2.45': + '@iconify-json/vscode-icons@1.2.58': dependencies: '@iconify/types': 2.0.0 '@iconify/types@2.0.0': {} - '@iconify/utils@3.1.0': + '@iconify/utils@3.1.3': dependencies: '@antfu/install-pkg': 1.1.0 '@iconify/types': 2.0.0 - mlly: 1.8.2 + import-meta-resolve: 4.2.0 '@jridgewell/gen-mapping@0.3.13': dependencies: @@ -1674,27 +1937,27 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.5 optional: true - '@lezer/common@1.5.1': {} + '@lezer/common@1.5.2': {} '@lezer/highlight@1.2.3': dependencies: - '@lezer/common': 1.5.1 + '@lezer/common': 1.5.2 '@lezer/javascript@1.5.4': dependencies: - '@lezer/common': 1.5.1 + '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 '@lezer/lr': 1.4.8 '@lezer/json@1.0.3': dependencies: - '@lezer/common': 1.5.1 + '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 '@lezer/lr': 1.4.8 '@lezer/lr@1.4.8': dependencies: - '@lezer/common': 1.5.1 + '@lezer/common': 1.5.2 '@marijn/find-cluster-break@1.0.2': {} @@ -1767,120 +2030,122 @@ snapshots: dependencies: '@octokit/openapi-types': 27.0.0 - '@oxfmt/binding-android-arm-eabi@0.44.0': + '@oxfmt/binding-android-arm-eabi@0.55.0': optional: true - '@oxfmt/binding-android-arm64@0.44.0': + '@oxfmt/binding-android-arm64@0.55.0': optional: true - '@oxfmt/binding-darwin-arm64@0.44.0': + '@oxfmt/binding-darwin-arm64@0.55.0': optional: true - '@oxfmt/binding-darwin-x64@0.44.0': + '@oxfmt/binding-darwin-x64@0.55.0': optional: true - '@oxfmt/binding-freebsd-x64@0.44.0': + '@oxfmt/binding-freebsd-x64@0.55.0': optional: true - '@oxfmt/binding-linux-arm-gnueabihf@0.44.0': + '@oxfmt/binding-linux-arm-gnueabihf@0.55.0': optional: true - '@oxfmt/binding-linux-arm-musleabihf@0.44.0': + '@oxfmt/binding-linux-arm-musleabihf@0.55.0': optional: true - '@oxfmt/binding-linux-arm64-gnu@0.44.0': + '@oxfmt/binding-linux-arm64-gnu@0.55.0': optional: true - '@oxfmt/binding-linux-arm64-musl@0.44.0': + '@oxfmt/binding-linux-arm64-musl@0.55.0': optional: true - '@oxfmt/binding-linux-ppc64-gnu@0.44.0': + '@oxfmt/binding-linux-ppc64-gnu@0.55.0': optional: true - '@oxfmt/binding-linux-riscv64-gnu@0.44.0': + '@oxfmt/binding-linux-riscv64-gnu@0.55.0': optional: true - '@oxfmt/binding-linux-riscv64-musl@0.44.0': + '@oxfmt/binding-linux-riscv64-musl@0.55.0': optional: true - '@oxfmt/binding-linux-s390x-gnu@0.44.0': + '@oxfmt/binding-linux-s390x-gnu@0.55.0': optional: true - '@oxfmt/binding-linux-x64-gnu@0.44.0': + '@oxfmt/binding-linux-x64-gnu@0.55.0': optional: true - '@oxfmt/binding-linux-x64-musl@0.44.0': + '@oxfmt/binding-linux-x64-musl@0.55.0': optional: true - '@oxfmt/binding-openharmony-arm64@0.44.0': + '@oxfmt/binding-openharmony-arm64@0.55.0': optional: true - '@oxfmt/binding-win32-arm64-msvc@0.44.0': + '@oxfmt/binding-win32-arm64-msvc@0.55.0': optional: true - '@oxfmt/binding-win32-ia32-msvc@0.44.0': + '@oxfmt/binding-win32-ia32-msvc@0.55.0': optional: true - '@oxfmt/binding-win32-x64-msvc@0.44.0': + '@oxfmt/binding-win32-x64-msvc@0.55.0': optional: true - '@oxlint/binding-android-arm-eabi@1.59.0': + '@oxlint/binding-android-arm-eabi@1.70.0': optional: true - '@oxlint/binding-android-arm64@1.59.0': + '@oxlint/binding-android-arm64@1.70.0': optional: true - '@oxlint/binding-darwin-arm64@1.59.0': + '@oxlint/binding-darwin-arm64@1.70.0': optional: true - '@oxlint/binding-darwin-x64@1.59.0': + '@oxlint/binding-darwin-x64@1.70.0': optional: true - '@oxlint/binding-freebsd-x64@1.59.0': + '@oxlint/binding-freebsd-x64@1.70.0': optional: true - '@oxlint/binding-linux-arm-gnueabihf@1.59.0': + '@oxlint/binding-linux-arm-gnueabihf@1.70.0': optional: true - '@oxlint/binding-linux-arm-musleabihf@1.59.0': + '@oxlint/binding-linux-arm-musleabihf@1.70.0': optional: true - '@oxlint/binding-linux-arm64-gnu@1.59.0': + '@oxlint/binding-linux-arm64-gnu@1.70.0': optional: true - '@oxlint/binding-linux-arm64-musl@1.59.0': + '@oxlint/binding-linux-arm64-musl@1.70.0': optional: true - '@oxlint/binding-linux-ppc64-gnu@1.59.0': + '@oxlint/binding-linux-ppc64-gnu@1.70.0': optional: true - '@oxlint/binding-linux-riscv64-gnu@1.59.0': + '@oxlint/binding-linux-riscv64-gnu@1.70.0': optional: true - '@oxlint/binding-linux-riscv64-musl@1.59.0': + '@oxlint/binding-linux-riscv64-musl@1.70.0': optional: true - '@oxlint/binding-linux-s390x-gnu@1.59.0': + '@oxlint/binding-linux-s390x-gnu@1.70.0': optional: true - '@oxlint/binding-linux-x64-gnu@1.59.0': + '@oxlint/binding-linux-x64-gnu@1.70.0': optional: true - '@oxlint/binding-linux-x64-musl@1.59.0': + '@oxlint/binding-linux-x64-musl@1.70.0': optional: true - '@oxlint/binding-openharmony-arm64@1.59.0': + '@oxlint/binding-openharmony-arm64@1.70.0': optional: true - '@oxlint/binding-win32-arm64-msvc@1.59.0': + '@oxlint/binding-win32-arm64-msvc@1.70.0': optional: true - '@oxlint/binding-win32-ia32-msvc@1.59.0': + '@oxlint/binding-win32-ia32-msvc@1.70.0': optional: true - '@oxlint/binding-win32-x64-msvc@1.59.0': + '@oxlint/binding-win32-x64-msvc@1.70.0': optional: true + '@oxlint/plugins@1.70.0': {} + '@rolldown/pluginutils@1.0.0-rc.2': {} '@rollup/rollup-android-arm-eabi@4.59.0': @@ -2035,72 +2300,72 @@ snapshots: '@types/web-bluetooth@0.0.21': {} - '@typescript/vfs@1.6.4(typescript@6.0.2)': + '@typescript/vfs@1.6.4(typescript@6.0.3)': dependencies: debug: 4.4.3 - typescript: 6.0.2 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@uiw/codemirror-theme-darcula@4.25.9(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)': + '@uiw/codemirror-theme-darcula@4.25.10(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.43.1)': dependencies: - '@uiw/codemirror-themes': 4.25.9(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0) + '@uiw/codemirror-themes': 4.25.10(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.43.1) transitivePeerDependencies: - '@codemirror/language' - '@codemirror/state' - '@codemirror/view' - '@uiw/codemirror-theme-eclipse@4.25.9(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)': + '@uiw/codemirror-theme-eclipse@4.25.10(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.43.1)': dependencies: - '@uiw/codemirror-themes': 4.25.9(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0) + '@uiw/codemirror-themes': 4.25.10(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.43.1) transitivePeerDependencies: - '@codemirror/language' - '@codemirror/state' - '@codemirror/view' - '@uiw/codemirror-themes@4.25.9(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)': + '@uiw/codemirror-themes@4.25.10(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.43.1)': dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 - '@codemirror/view': 6.41.0 + '@codemirror/view': 6.43.1 '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-vue@6.0.5(vite@7.3.2(@types/node@24.12.2)(terser@5.46.1)(tsx@4.21.0))(vue@3.5.32(typescript@6.0.2))': + '@vitejs/plugin-vue@6.0.5(vite@7.3.5(@types/node@24.12.2)(terser@5.46.1)(tsx@4.22.4))(vue@3.5.38(typescript@6.0.3))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.2 - vite: 7.3.2(@types/node@24.12.2)(terser@5.46.1)(tsx@4.21.0) - vue: 3.5.32(typescript@6.0.2) + vite: 7.3.5(@types/node@24.12.2)(terser@5.46.1)(tsx@4.22.4) + vue: 3.5.38(typescript@6.0.3) - '@vue/compiler-core@3.5.32': + '@vue/compiler-core@3.5.38': dependencies: - '@babel/parser': 7.29.2 - '@vue/shared': 3.5.32 + '@babel/parser': 7.29.7 + '@vue/shared': 3.5.38 entities: 7.0.1 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.32': + '@vue/compiler-dom@3.5.38': dependencies: - '@vue/compiler-core': 3.5.32 - '@vue/shared': 3.5.32 + '@vue/compiler-core': 3.5.38 + '@vue/shared': 3.5.38 - '@vue/compiler-sfc@3.5.32': + '@vue/compiler-sfc@3.5.38': dependencies: - '@babel/parser': 7.29.2 - '@vue/compiler-core': 3.5.32 - '@vue/compiler-dom': 3.5.32 - '@vue/compiler-ssr': 3.5.32 - '@vue/shared': 3.5.32 + '@babel/parser': 7.29.7 + '@vue/compiler-core': 3.5.38 + '@vue/compiler-dom': 3.5.38 + '@vue/compiler-ssr': 3.5.38 + '@vue/shared': 3.5.38 estree-walker: 2.0.2 magic-string: 0.30.21 - postcss: 8.5.8 + postcss: 8.5.15 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.32': + '@vue/compiler-ssr@3.5.38': dependencies: - '@vue/compiler-dom': 3.5.32 - '@vue/shared': 3.5.32 + '@vue/compiler-dom': 3.5.38 + '@vue/shared': 3.5.38 '@vue/devtools-api@8.1.0': dependencies: @@ -2115,54 +2380,66 @@ snapshots: '@vue/devtools-shared@8.1.0': {} - '@vue/reactivity@3.5.32': + '@vue/reactivity@3.5.38': dependencies: - '@vue/shared': 3.5.32 + '@vue/shared': 3.5.38 - '@vue/runtime-core@3.5.32': + '@vue/runtime-core@3.5.38': dependencies: - '@vue/reactivity': 3.5.32 - '@vue/shared': 3.5.32 + '@vue/reactivity': 3.5.38 + '@vue/shared': 3.5.38 - '@vue/runtime-dom@3.5.32': + '@vue/runtime-dom@3.5.38': dependencies: - '@vue/reactivity': 3.5.32 - '@vue/runtime-core': 3.5.32 - '@vue/shared': 3.5.32 + '@vue/reactivity': 3.5.38 + '@vue/runtime-core': 3.5.38 + '@vue/shared': 3.5.38 csstype: 3.2.3 - '@vue/server-renderer@3.5.32(vue@3.5.32(typescript@6.0.2))': + '@vue/server-renderer@3.5.38(vue@3.5.38(typescript@6.0.3))': dependencies: - '@vue/compiler-ssr': 3.5.32 - '@vue/shared': 3.5.32 - vue: 3.5.32(typescript@6.0.2) + '@vue/compiler-ssr': 3.5.38 + '@vue/shared': 3.5.38 + vue: 3.5.38(typescript@6.0.3) - '@vue/shared@3.5.30': {} + '@vue/shared@3.5.38': {} - '@vue/shared@3.5.32': {} - - '@vueuse/core@14.2.1(vue@3.5.32(typescript@6.0.2))': + '@vueuse/core@14.2.1(vue@3.5.38(typescript@6.0.3))': dependencies: '@types/web-bluetooth': 0.0.21 '@vueuse/metadata': 14.2.1 - '@vueuse/shared': 14.2.1(vue@3.5.32(typescript@6.0.2)) - vue: 3.5.32(typescript@6.0.2) + '@vueuse/shared': 14.2.1(vue@3.5.38(typescript@6.0.3)) + vue: 3.5.38(typescript@6.0.3) - '@vueuse/integrations@14.2.1(focus-trap@8.0.0)(vue@3.5.32(typescript@6.0.2))': + '@vueuse/core@14.3.0(vue@3.5.38(typescript@6.0.3))': dependencies: - '@vueuse/core': 14.2.1(vue@3.5.32(typescript@6.0.2)) - '@vueuse/shared': 14.2.1(vue@3.5.32(typescript@6.0.2)) - vue: 3.5.32(typescript@6.0.2) + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 14.3.0 + '@vueuse/shared': 14.3.0(vue@3.5.38(typescript@6.0.3)) + vue: 3.5.38(typescript@6.0.3) + + '@vueuse/integrations@14.2.1(focus-trap@8.0.0)(vue@3.5.38(typescript@6.0.3))': + dependencies: + '@vueuse/core': 14.2.1(vue@3.5.38(typescript@6.0.3)) + '@vueuse/shared': 14.2.1(vue@3.5.38(typescript@6.0.3)) + vue: 3.5.38(typescript@6.0.3) optionalDependencies: focus-trap: 8.0.0 '@vueuse/metadata@14.2.1': {} - '@vueuse/shared@14.2.1(vue@3.5.32(typescript@6.0.2))': + '@vueuse/metadata@14.3.0': {} + + '@vueuse/shared@14.2.1(vue@3.5.38(typescript@6.0.3))': + dependencies: + vue: 3.5.38(typescript@6.0.3) + + '@vueuse/shared@14.3.0(vue@3.5.38(typescript@6.0.3))': dependencies: - vue: 3.5.32(typescript@6.0.2) + vue: 3.5.38(typescript@6.0.3) - acorn@8.16.0: {} + acorn@8.17.0: + optional: true before-after-hook@4.0.0: {} @@ -2181,21 +2458,19 @@ snapshots: codemirror@6.0.2: dependencies: - '@codemirror/autocomplete': 6.20.1 + '@codemirror/autocomplete': 6.20.3 '@codemirror/commands': 6.10.3 '@codemirror/language': 6.12.3 '@codemirror/lint': 6.9.5 '@codemirror/search': 6.6.0 '@codemirror/state': 6.6.0 - '@codemirror/view': 6.41.0 + '@codemirror/view': 6.43.1 comma-separated-tokens@2.0.3: {} commander@2.20.3: optional: true - confbox@0.1.8: {} - crelt@1.0.6: {} csstype@3.2.3: {} @@ -2212,7 +2487,7 @@ snapshots: entities@7.0.1: {} - es-toolkit@1.45.1: {} + es-toolkit@1.47.1: {} esbuild@0.27.4: optionalDependencies: @@ -2243,6 +2518,35 @@ snapshots: '@esbuild/win32-ia32': 0.27.4 '@esbuild/win32-x64': 0.27.4 + esbuild@0.28.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.1 + '@esbuild/android-arm': 0.28.1 + '@esbuild/android-arm64': 0.28.1 + '@esbuild/android-x64': 0.28.1 + '@esbuild/darwin-arm64': 0.28.1 + '@esbuild/darwin-x64': 0.28.1 + '@esbuild/freebsd-arm64': 0.28.1 + '@esbuild/freebsd-x64': 0.28.1 + '@esbuild/linux-arm': 0.28.1 + '@esbuild/linux-arm64': 0.28.1 + '@esbuild/linux-ia32': 0.28.1 + '@esbuild/linux-loong64': 0.28.1 + '@esbuild/linux-mips64el': 0.28.1 + '@esbuild/linux-ppc64': 0.28.1 + '@esbuild/linux-riscv64': 0.28.1 + '@esbuild/linux-s390x': 0.28.1 + '@esbuild/linux-x64': 0.28.1 + '@esbuild/netbsd-arm64': 0.28.1 + '@esbuild/netbsd-x64': 0.28.1 + '@esbuild/openbsd-arm64': 0.28.1 + '@esbuild/openbsd-x64': 0.28.1 + '@esbuild/openharmony-arm64': 0.28.1 + '@esbuild/sunos-x64': 0.28.1 + '@esbuild/win32-arm64': 0.28.1 + '@esbuild/win32-ia32': 0.28.1 + '@esbuild/win32-x64': 0.28.1 + estree-walker@2.0.2: {} fast-content-type-parse@3.0.0: {} @@ -2251,7 +2555,7 @@ snapshots: optionalDependencies: picomatch: 4.0.4 - feed@5.2.0: + feed@5.2.1: dependencies: xml-js: 1.6.11 @@ -2262,10 +2566,6 @@ snapshots: fsevents@2.3.3: optional: true - get-tsconfig@4.13.6: - dependencies: - resolve-pkg-maps: 1.0.0 - github-slugger@2.0.0: {} hast-util-to-html@9.0.5: @@ -2290,7 +2590,9 @@ snapshots: html-void-elements@3.0.0: {} - joi@17.13.3: + import-meta-resolve@4.2.0: {} + + joi@17.13.4: dependencies: '@hapi/hoek': 9.3.0 '@hapi/topo': 5.1.0 @@ -2347,16 +2649,9 @@ snapshots: minisearch@7.2.0: {} - mlly@1.8.2: - dependencies: - acorn: 8.16.0 - pathe: 2.0.3 - pkg-types: 1.3.1 - ufo: 1.6.3 - ms@2.1.3: {} - nanoid@3.3.11: {} + nanoid@3.3.12: {} oniguruma-parser@0.12.1: {} @@ -2366,75 +2661,67 @@ snapshots: regex: 6.1.0 regex-recursion: 6.0.2 - oxfmt@0.44.0: + oxfmt@0.55.0: dependencies: tinypool: 2.1.0 optionalDependencies: - '@oxfmt/binding-android-arm-eabi': 0.44.0 - '@oxfmt/binding-android-arm64': 0.44.0 - '@oxfmt/binding-darwin-arm64': 0.44.0 - '@oxfmt/binding-darwin-x64': 0.44.0 - '@oxfmt/binding-freebsd-x64': 0.44.0 - '@oxfmt/binding-linux-arm-gnueabihf': 0.44.0 - '@oxfmt/binding-linux-arm-musleabihf': 0.44.0 - '@oxfmt/binding-linux-arm64-gnu': 0.44.0 - '@oxfmt/binding-linux-arm64-musl': 0.44.0 - '@oxfmt/binding-linux-ppc64-gnu': 0.44.0 - '@oxfmt/binding-linux-riscv64-gnu': 0.44.0 - '@oxfmt/binding-linux-riscv64-musl': 0.44.0 - '@oxfmt/binding-linux-s390x-gnu': 0.44.0 - '@oxfmt/binding-linux-x64-gnu': 0.44.0 - '@oxfmt/binding-linux-x64-musl': 0.44.0 - '@oxfmt/binding-openharmony-arm64': 0.44.0 - '@oxfmt/binding-win32-arm64-msvc': 0.44.0 - '@oxfmt/binding-win32-ia32-msvc': 0.44.0 - '@oxfmt/binding-win32-x64-msvc': 0.44.0 - - oxlint@1.59.0: + '@oxfmt/binding-android-arm-eabi': 0.55.0 + '@oxfmt/binding-android-arm64': 0.55.0 + '@oxfmt/binding-darwin-arm64': 0.55.0 + '@oxfmt/binding-darwin-x64': 0.55.0 + '@oxfmt/binding-freebsd-x64': 0.55.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.55.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.55.0 + '@oxfmt/binding-linux-arm64-gnu': 0.55.0 + '@oxfmt/binding-linux-arm64-musl': 0.55.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.55.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.55.0 + '@oxfmt/binding-linux-riscv64-musl': 0.55.0 + '@oxfmt/binding-linux-s390x-gnu': 0.55.0 + '@oxfmt/binding-linux-x64-gnu': 0.55.0 + '@oxfmt/binding-linux-x64-musl': 0.55.0 + '@oxfmt/binding-openharmony-arm64': 0.55.0 + '@oxfmt/binding-win32-arm64-msvc': 0.55.0 + '@oxfmt/binding-win32-ia32-msvc': 0.55.0 + '@oxfmt/binding-win32-x64-msvc': 0.55.0 + + oxlint@1.70.0: optionalDependencies: - '@oxlint/binding-android-arm-eabi': 1.59.0 - '@oxlint/binding-android-arm64': 1.59.0 - '@oxlint/binding-darwin-arm64': 1.59.0 - '@oxlint/binding-darwin-x64': 1.59.0 - '@oxlint/binding-freebsd-x64': 1.59.0 - '@oxlint/binding-linux-arm-gnueabihf': 1.59.0 - '@oxlint/binding-linux-arm-musleabihf': 1.59.0 - '@oxlint/binding-linux-arm64-gnu': 1.59.0 - '@oxlint/binding-linux-arm64-musl': 1.59.0 - '@oxlint/binding-linux-ppc64-gnu': 1.59.0 - '@oxlint/binding-linux-riscv64-gnu': 1.59.0 - '@oxlint/binding-linux-riscv64-musl': 1.59.0 - '@oxlint/binding-linux-s390x-gnu': 1.59.0 - '@oxlint/binding-linux-x64-gnu': 1.59.0 - '@oxlint/binding-linux-x64-musl': 1.59.0 - '@oxlint/binding-openharmony-arm64': 1.59.0 - '@oxlint/binding-win32-arm64-msvc': 1.59.0 - '@oxlint/binding-win32-ia32-msvc': 1.59.0 - '@oxlint/binding-win32-x64-msvc': 1.59.0 + '@oxlint/binding-android-arm-eabi': 1.70.0 + '@oxlint/binding-android-arm64': 1.70.0 + '@oxlint/binding-darwin-arm64': 1.70.0 + '@oxlint/binding-darwin-x64': 1.70.0 + '@oxlint/binding-freebsd-x64': 1.70.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.70.0 + '@oxlint/binding-linux-arm-musleabihf': 1.70.0 + '@oxlint/binding-linux-arm64-gnu': 1.70.0 + '@oxlint/binding-linux-arm64-musl': 1.70.0 + '@oxlint/binding-linux-ppc64-gnu': 1.70.0 + '@oxlint/binding-linux-riscv64-gnu': 1.70.0 + '@oxlint/binding-linux-riscv64-musl': 1.70.0 + '@oxlint/binding-linux-s390x-gnu': 1.70.0 + '@oxlint/binding-linux-x64-gnu': 1.70.0 + '@oxlint/binding-linux-x64-musl': 1.70.0 + '@oxlint/binding-openharmony-arm64': 1.70.0 + '@oxlint/binding-win32-arm64-msvc': 1.70.0 + '@oxlint/binding-win32-ia32-msvc': 1.70.0 + '@oxlint/binding-win32-x64-msvc': 1.70.0 package-manager-detector@1.6.0: {} - pathe@2.0.3: {} - perfect-debounce@2.1.0: {} picocolors@1.1.1: {} picomatch@4.0.4: {} - pkg-types@1.3.1: - dependencies: - confbox: 0.1.8 - mlly: 1.8.2 - pathe: 2.0.3 - - postcss@8.5.8: + postcss@8.5.15: dependencies: - nanoid: 3.3.11 + nanoid: 3.3.12 picocolors: 1.1.1 source-map-js: 1.2.1 - prettier@3.8.1: {} + prettier@3.8.4: {} property-information@7.1.0: {} @@ -2448,8 +2735,6 @@ snapshots: dependencies: regex-utilities: 2.3.0 - resolve-pkg-maps@1.0.0: {} - rollup@4.59.0: dependencies: '@types/estree': 1.0.8 @@ -2483,7 +2768,7 @@ snapshots: sax@1.6.0: {} - semver@7.7.4: {} + semver@7.8.4: {} shiki@3.23.0: dependencies: @@ -2521,12 +2806,12 @@ snapshots: terser@5.46.1: dependencies: '@jridgewell/source-map': 0.3.11 - acorn: 8.16.0 + acorn: 8.17.0 commander: 2.20.3 source-map-support: 0.5.21 optional: true - tinyexec@1.0.4: {} + tinyexec@1.2.4: {} tinyglobby@0.2.15: dependencies: @@ -2537,16 +2822,13 @@ snapshots: trim-lines@3.0.1: {} - tsx@4.21.0: + tsx@4.22.4: dependencies: - esbuild: 0.27.4 - get-tsconfig: 4.13.6 + esbuild: 0.28.1 optionalDependencies: fsevents: 2.3.3 - typescript@6.0.2: {} - - ufo@1.6.3: {} + typescript@6.0.3: {} undici-types@7.16.0: {} @@ -2585,29 +2867,29 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@7.3.2(@types/node@24.12.2)(terser@5.46.1)(tsx@4.21.0): + vite@7.3.5(@types/node@24.12.2)(terser@5.46.1)(tsx@4.22.4): dependencies: esbuild: 0.27.4 fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 - postcss: 8.5.8 + postcss: 8.5.15 rollup: 4.59.0 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 24.12.2 fsevents: 2.3.3 terser: 5.46.1 - tsx: 4.21.0 + tsx: 4.22.4 - vitepress-plugin-group-icons@1.7.3(vite@7.3.2(@types/node@24.12.2)(terser@5.46.1)(tsx@4.21.0)): + vitepress-plugin-group-icons@1.7.5(vite@7.3.5(@types/node@24.12.2)(terser@5.46.1)(tsx@4.22.4)): dependencies: '@iconify-json/logos': 1.2.11 - '@iconify-json/vscode-icons': 1.2.45 - '@iconify/utils': 3.1.0 + '@iconify-json/vscode-icons': 1.2.58 + '@iconify/utils': 3.1.3 optionalDependencies: - vite: 7.3.2(@types/node@24.12.2)(terser@5.46.1)(tsx@4.21.0) + vite: 7.3.5(@types/node@24.12.2)(terser@5.46.1)(tsx@4.22.4) - vitepress@2.0.0-alpha.17(@types/node@24.12.2)(postcss@8.5.8)(terser@5.46.1)(tsx@4.21.0)(typescript@6.0.2): + vitepress@2.0.0-alpha.17(@types/node@24.12.2)(postcss@8.5.15)(terser@5.46.1)(tsx@4.22.4)(typescript@6.0.3): dependencies: '@docsearch/css': 4.6.0 '@docsearch/js': 4.6.0 @@ -2617,19 +2899,19 @@ snapshots: '@shikijs/transformers': 3.23.0 '@shikijs/types': 3.23.0 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 6.0.5(vite@7.3.2(@types/node@24.12.2)(terser@5.46.1)(tsx@4.21.0))(vue@3.5.32(typescript@6.0.2)) + '@vitejs/plugin-vue': 6.0.5(vite@7.3.5(@types/node@24.12.2)(terser@5.46.1)(tsx@4.22.4))(vue@3.5.38(typescript@6.0.3)) '@vue/devtools-api': 8.1.0 - '@vue/shared': 3.5.30 - '@vueuse/core': 14.2.1(vue@3.5.32(typescript@6.0.2)) - '@vueuse/integrations': 14.2.1(focus-trap@8.0.0)(vue@3.5.32(typescript@6.0.2)) + '@vue/shared': 3.5.38 + '@vueuse/core': 14.3.0(vue@3.5.38(typescript@6.0.3)) + '@vueuse/integrations': 14.2.1(focus-trap@8.0.0)(vue@3.5.38(typescript@6.0.3)) focus-trap: 8.0.0 mark.js: 8.11.1 minisearch: 7.2.0 shiki: 3.23.0 - vite: 7.3.2(@types/node@24.12.2)(terser@5.46.1)(tsx@4.21.0) - vue: 3.5.32(typescript@6.0.2) + vite: 7.3.5(@types/node@24.12.2)(terser@5.46.1)(tsx@4.22.4) + vue: 3.5.38(typescript@6.0.3) optionalDependencies: - postcss: 8.5.8 + postcss: 8.5.15 transitivePeerDependencies: - '@types/node' - async-validator @@ -2655,15 +2937,15 @@ snapshots: - universal-cookie - yaml - vue@3.5.32(typescript@6.0.2): + vue@3.5.38(typescript@6.0.3): dependencies: - '@vue/compiler-dom': 3.5.32 - '@vue/compiler-sfc': 3.5.32 - '@vue/runtime-dom': 3.5.32 - '@vue/server-renderer': 3.5.32(vue@3.5.32(typescript@6.0.2)) - '@vue/shared': 3.5.32 + '@vue/compiler-dom': 3.5.38 + '@vue/compiler-sfc': 3.5.38 + '@vue/runtime-dom': 3.5.38 + '@vue/server-renderer': 3.5.38(vue@3.5.38(typescript@6.0.3)) + '@vue/shared': 3.5.38 optionalDependencies: - typescript: 6.0.2 + typescript: 6.0.3 w3c-keyname@2.2.8: {} diff --git a/tsconfig.json b/tsconfig.json index cd90d99..f700188 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,13 +1,13 @@ { - "include": [".vitepress/**/*.ts", "**/*.ts", "**/*.tsx"], - "compilerOptions": { - "target": "es2024", - "module": "node20", - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "strict": true, - "skipLibCheck": true, - "resolveJsonModule": true, - "types": ["node", "./env.d.ts"] - } + "include": [".vitepress/**/*.ts", "**/*.ts", "**/*.tsx"], + "compilerOptions": { + "target": "es2024", + "module": "node20", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "resolveJsonModule": true, + "types": ["node", "./env.d.ts"] + } }