diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index 6b4d2ba5c..16e7296ce 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -32,9 +32,3 @@ Thanks for submitting a pull request! Please provide enough information so that
**Does this PR introduce a breaking change?**
-
-# Checklist
-
-Please ensure the following tasks are completed before submitting this pull request.
-
-- [ ] Read, understood, and followed the [contributing guidelines](https://github.com/json-schema-org/website/blob/main/CONTRIBUTING.md).
\ No newline at end of file
diff --git a/.github/workflows/README.md b/.github/workflows/README.md
index 615b6739b..4a3620353 100644
--- a/.github/workflows/README.md
+++ b/.github/workflows/README.md
@@ -13,7 +13,7 @@ This document outlines the guidelines for contributing to and maintaining GitHub
Our YAML files are organized based on specific roles and event triggers. When creating or modifying workflows, ensure that:
- The file roles described below are strictly maintained.
-- Job sequences within workflows are preserved using [GitHub Action job dependencies](https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/using-jobs-in-a-workflow#defining-prerequisite-jobs).
+- Job sequences within workflows are preserved using [GitHub Action job dependencies](https://docs.github.com/en/actions/using-workflows/using-jobs-in-a-workflow#defining-prerequisite-jobs).
### File Categorization
@@ -42,7 +42,7 @@ Separate files may be created for workflows that:
- Only work correctly if they have a dedicated file.
Examples:
- - [Preview Deployment](./deploy-preview.yml): Deploys preview environments for pull requests.
+ - [Preview Deployment](./preview-deployment.yml): Deploys preview environments for pull requests.
- [Production Deployment](./production-deployment.yml): Handles production deployments.
- [CodeQL Code Scanning](./codeql.yml): Performs code security analysis.
- [Check PR Dependencies](./pr-dependencies.yml): Enforces dependencies between PRs based on opening comments.
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index f78310092..315f1b55e 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -81,7 +81,7 @@ jobs:
- name: Get Changed Unauthorized files
id: changed-unauth-files
- uses: tj-actions/changed-files@v46
+ uses: tj-actions/changed-files@v45
with:
files: |
.github/**
diff --git a/.github/workflows/pr-body-validation.yml b/.github/workflows/pr-body-validation.yml
deleted file mode 100644
index 8b2aaf89f..000000000
--- a/.github/workflows/pr-body-validation.yml
+++ /dev/null
@@ -1,110 +0,0 @@
-name: PR Body Validation
-
-on:
- pull_request_target:
- types: [opened, edited, synchronize, reopened]
-
-jobs:
- check-pr-content:
- runs-on: ubuntu-latest
- permissions:
- pull-requests: write
-
- steps:
- - name: Checkout code
- uses: actions/checkout@v4
-
- - name: Check PR content
- uses: actions/github-script@v7
- with:
- github-token: ${{ secrets.GITHUB_TOKEN }}
- script: |
- const pr = context.payload.pull_request;
- const prBody = pr.body || '';
-
- let missingItems = [];
-
- // Helper function to extract content between section headers
- function extractSectionContent(content, sectionHeader) {
- const regex = new RegExp(`\\*\\*${sectionHeader}\\*\\*(.*?)(?=\\*\\*|$)`, 's');
- const match = content.match(regex);
- if (!match) return '';
-
- // Remove HTML comments and trim whitespace
- return match[1].replace(//g, '').trim();
- }
-
- // Helper function to check if content is meaningful
- function hasMeaningfulContent(content) {
- // Remove HTML comments, markdown symbols, and extra whitespace
- const cleanContent = content
- .replace(//g, '')
- .replace(/[#*\[\]()_]/g, '')
- .trim();
- return cleanContent.length >= 3; // Requiring at least 3 characters
- }
-
- // Check for issue links
- const issueRegex = /(closes|related to)\s+#\d+/i;
- if (!issueRegex.test(prBody)) {
- missingItems.push('issue reference');
- }
-
- // Check for kind of change
- const changeContent = extractSectionContent(prBody, 'What kind of change does this PR introduce\\?');
- if (!hasMeaningfulContent(changeContent)) {
- missingItems.push('kind of change description');
- }
-
- // Check for unchecked items in checklist
- const checklistMatch = prBody.match(/# Checklist([\s\S]*?)(?=(?:#|$))/);
- if (checklistMatch && checklistMatch[1].includes('- [ ]')) {
- missingItems.push('completed checklist items');
- }
-
- // Get current labels
- const { data: currentLabels } = await github.rest.issues.listLabelsOnIssue({
- owner: context.repo.owner,
- repo: context.repo.repo,
- issue_number: context.issue.number
- });
-
- const hasNeedsInfoLabel = currentLabels.some(label => label.name === 'needs-info');
-
- if (missingItems.length > 0) {
- // If there are missing items, add comment and label
- const missingItemsList = missingItems.join(', ');
- const comment = `Hi @${pr.user.login}! Thanks a lot for your contribution!
-
- I noticed that the following required information is missing or incomplete: ${missingItemsList}
-
- Please update the PR description to include this information. You can find placeholders in the PR template for these items.
-
- Thanks a lot!`;
-
- await github.rest.issues.createComment({
- owner: context.repo.owner,
- repo: context.repo.repo,
- issue_number: context.issue.number,
- body: comment
- });
-
- // Add needs-info label if not already present
- if (!hasNeedsInfoLabel) {
- await github.rest.issues.addLabels({
- owner: context.repo.owner,
- repo: context.repo.repo,
- issue_number: context.issue.number,
- labels: ['needs-info']
- });
- }
- core.setFailed(`The following required information is missing or incomplete: ${missingItemsList}`);
- } else if (hasNeedsInfoLabel) {
- // If all requirements are met and the needs-info label exists, remove it
- await github.rest.issues.removeLabel({
- owner: context.repo.owner,
- repo: context.repo.repo,
- issue_number: context.issue.number,
- name: 'needs-info'
- });
- }
diff --git a/INSTALLATION.md b/INSTALLATION.md
index 55ee890d0..f78296c42 100644
--- a/INSTALLATION.md
+++ b/INSTALLATION.md
@@ -26,7 +26,7 @@ This guide provides step-by-step instructions for installing the JSON Schema Web
- [Formatting](#formatting)
- [Linting](#linting)
- [Husky for Git Hooks](#husky-for-git-hooks)
-6. [Run locally using Docker](#run-locally-using-docker)
+6. [Run locally using Docker](#docker-deployment)
- [Prerequisites](#prerequisites)
- [Steps](#steps)
diff --git a/components/AmbassadorsBanner.tsx b/components/AmbassadorsBanner.tsx
index c159b1e98..68514fb21 100644
--- a/components/AmbassadorsBanner.tsx
+++ b/components/AmbassadorsBanner.tsx
@@ -15,7 +15,7 @@ const AmbassadorBanner: React.FC = () => {
Become Ambassador
diff --git a/components/Layout.tsx b/components/Layout.tsx
index 892fe5a76..441b83188 100644
--- a/components/Layout.tsx
+++ b/components/Layout.tsx
@@ -8,6 +8,7 @@ import useStore from '~/store';
import { SectionContext } from '~/context';
import { useTheme } from 'next-themes';
import DarkModeToggle from './DarkModeToggle';
+import extractPathWithoutFragment from '~/lib/extractPathWithoutFragment';
import ScrollButton from './ScrollButton';
import Image from 'next/image';
@@ -137,7 +138,7 @@ const MainNavLink = ({
className?: string;
}) => {
const router = useRouter();
- const isActiveNav = router.asPath.startsWith(uri);
+ const isActiveNav = extractPathWithoutFragment(router.asPath) === uri;
return (
JSON Bin Pack"
+ "summary": "Compress JSON data for storage/transmission. For example:
https://jsonbinpack.sourcemeta.com "
},
{
"title": "Fuzzing, enumeration, and generation",
@@ -37,7 +37,7 @@
},
{
"title": "Automated Testing",
- "summary": "Good definitions of input/output that schemas provide enable contract and property-based testing scenarios. For example:
Schemathesis "
+ "summary": "Good definitions of input/output that schemas provide enable contract and property based testing scenarios. For example:
https://schemathesis.readthedocs.io/en/stable/ "
},
{
"title": "Machine-readable profiles of Web resources",
diff --git a/package.json b/package.json
index c5619ac71..662304e73 100644
--- a/package.json
+++ b/package.json
@@ -59,7 +59,7 @@
"devDependencies": {
"@babel/core": "^7.26.0",
"@babel/preset-env": "^7.26.0",
- "@cypress/code-coverage": "^3.13.12",
+ "@cypress/code-coverage": "^3.13.6",
"@next/eslint-plugin-next": "^14.0.1",
"@svgr/webpack": "^8.1.0",
"@types/babel__core": "^7",
@@ -72,7 +72,7 @@
"@types/react-text-truncate": "^0.19.0",
"@typescript-eslint/eslint-plugin": "^6.21.0",
"@typescript-eslint/parser": "^6.21.0",
- "autoprefixer": "^10.4.21",
+ "autoprefixer": "^10.4.20",
"babel-plugin-istanbul": "^7.0.0",
"cypress": "^13.13.1",
"eslint": "8.57.0",
diff --git a/pages/404.page.tsx b/pages/404.page.tsx
deleted file mode 100644
index ce3753c68..000000000
--- a/pages/404.page.tsx
+++ /dev/null
@@ -1,51 +0,0 @@
-import React, { useEffect, useState } from 'react';
-import Link from 'next/link';
-import { useTheme } from 'next-themes';
-
-const Logo = () => {
- const { resolvedTheme } = useTheme();
- const [imageSrc, setImageSrc] = useState('/img/logos/logo-blue.svg');
-
- useEffect(() => {
- const src =
- resolvedTheme === 'dark'
- ? '/img/logos/logo-white.svg'
- : '/img/logos/logo-blue.svg';
- setImageSrc(src);
- }, [resolvedTheme]);
-
- return (
-
-
-
- );
-};
-
-export default function PageNotFound() {
- return (
-
-
-
- 404 - Page Not Found!
-
-
-
- 404
-
-
Page Not Found!
-
-
- The page you were looking for doesn't exist.
-
-
- BACK TO HOME
-
-
- );
-}
diff --git a/pages/blog/index.page.tsx b/pages/blog/index.page.tsx
index d497f0e60..a866346cf 100644
--- a/pages/blog/index.page.tsx
+++ b/pages/blog/index.page.tsx
@@ -122,9 +122,9 @@ export default function StaticMarkdownPage({
JSON Schema Blog
-
+
{recentBlog[0] && (
-
+
-
+
-
+
@@ -281,7 +277,7 @@ export default function StaticMarkdownPage({
{frontmatter.type || 'Unknown Type'}
-
+
{frontmatter.title}
diff --git a/pages/blog/posts/[slug].page.tsx b/pages/blog/posts/[slug].page.tsx
index 4f4ce4d9a..14301176d 100644
--- a/pages/blog/posts/[slug].page.tsx
+++ b/pages/blog/posts/[slug].page.tsx
@@ -112,7 +112,7 @@ export default function StaticMarkdownPage({
diff --git a/pages/community/index.page.tsx b/pages/community/index.page.tsx
index 6a4c582c3..576467680 100644
--- a/pages/community/index.page.tsx
+++ b/pages/community/index.page.tsx
@@ -155,19 +155,16 @@ export default function communityPages(props: any) {
Ambassadors Program
-
+
The JSON Schema Ambassadors Program recognize the people who
drive adoption, innovation and knowledge sharing in the JSON
Schema community.
-
+
Become an ambassador
@@ -179,18 +176,15 @@ export default function communityPages(props: any) {
-
-
+
+
Join the JSON Schema Slack workspace!
-
diff --git a/pages/learn/getting-started-step-by-step/getting-started-step-by-step.md b/pages/learn/getting-started-step-by-step/getting-started-step-by-step.md
index e768b85ac..df3383540 100644
--- a/pages/learn/getting-started-step-by-step/getting-started-step-by-step.md
+++ b/pages/learn/getting-started-step-by-step/getting-started-step-by-step.md
@@ -581,10 +581,10 @@ With the external schema reference, the overall schema looks like this:
## Validate JSON data against the schema
-Now that you have your JSON Schema, it is time to validate [JSON data](https://json-schema.org/learn/glossary#instance) against it using a [JSON Schema Validator](https://json-schema.org/tools?query=&sortBy=name&sortOrder=ascending&groupBy=toolingTypes&licenses=&languages=&drafts=&toolingTypes=validator).
+Now that you have your JSON Schema is time to validate [JSON data](https://json-schema.org/learn/glossary#instance) against it using a [JSON Schema Validator](https://json-schema.org/tools?query=&sortBy=name&sortOrder=ascending&groupBy=toolingTypes&licenses=&languages=&drafts=&toolingTypes=validator).
-A Validator is a tool that implements the JSON Schema specification. All validators works in a similar way: they take a JSON Schema and a JSON Instance as input and they return the validation result as output.
+A Validator is a tool that implements the JSON Schema specification. All validators works in a similar way: they take a JSON Schema and a JSON Instance as input and they returns the validation result as output.

-To try it yourself, please visit [Tools](https://json-schema.org/tools#validators) and select the validator that best suits your needs, or use the editors available below to explore the different Schemas and Instances and see the different validation results.
+To try it yourself, please visit [Tools](https://json-schema.org/tools#validators) and select the validator that better suit your needs, or use the editors available below to explore the different Schemas and Instances and see the different validation results.
diff --git a/pages/overview/use-cases/index.page.tsx b/pages/overview/use-cases/index.page.tsx
index 6dbf7905a..466a59158 100644
--- a/pages/overview/use-cases/index.page.tsx
+++ b/pages/overview/use-cases/index.page.tsx
@@ -18,12 +18,12 @@ export default function Content() {
{newTitle}
{newTitle}
-
+
Discover everything you can do with JSON Schema. This section presents
the most common use cases for JSON Schema, but there may be many more
applications waiting to be discovered.
-
+
{data.map((element, index) => (
;
transform: Transform;
@@ -91,14 +79,8 @@ export default function Sidebar({
{filters.map(({ label, accessorKey }) => {
const checkedValues = transform[accessorKey as keyof Transform] || [];
- const IconComponent =
- filterIcons[accessorKey as keyof typeof filterIcons];
return (
- }
- >
+ }>
{filterCriteria[accessorKey as FilterCriteriaFields]
?.map(String)
.map((filterOption) => (
diff --git a/pages/tools/components/ui/DropdownMenu.tsx b/pages/tools/components/ui/DropdownMenu.tsx
index 78beb8144..56fc69389 100644
--- a/pages/tools/components/ui/DropdownMenu.tsx
+++ b/pages/tools/components/ui/DropdownMenu.tsx
@@ -26,7 +26,7 @@ export default function DropdownMenu({
}, [router]);
return (
-
+
{
@@ -34,7 +34,7 @@ export default function DropdownMenu({
}}
>
{React.cloneElement(icon, {
- className: 'mr-2 ml-2',
+ className: 'mr-2',
})}
{label}
diff --git a/pages/understanding-json-schema/reference/metadata.md b/pages/understanding-json-schema/reference/metadata.md
index 4cdd46b8d..55edd9aa7 100644
--- a/pages/understanding-json-schema/reference/metadata.md
+++ b/pages/understanding-json-schema/reference/metadata.md
@@ -6,7 +6,7 @@ prev:
url: /understanding-json-schema/reference/const
next:
label: Annotations
- url: /understanding-json-schema/reference/annotations
+ url: http://localhost:3000/understanding-json-schema/reference/annotations
---
Annotations and comments are not directly related to the core structure and constraints of the JSON Schema itself. As such, keywords for annotations and comments are not required, however, using them can improve the maintainability of your schemas.
diff --git a/public/icons/dialect.svg b/public/icons/dialect.svg
deleted file mode 100644
index 45d952058..000000000
--- a/public/icons/dialect.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/public/icons/environment.svg b/public/icons/environment.svg
deleted file mode 100644
index 976203d0a..000000000
--- a/public/icons/environment.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/public/icons/language.svg b/public/icons/language.svg
deleted file mode 100644
index bbc79105e..000000000
--- a/public/icons/language.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/public/icons/license.svg b/public/icons/license.svg
deleted file mode 100644
index cbc1dc79d..000000000
--- a/public/icons/license.svg
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/public/icons/tooling.svg b/public/icons/tooling.svg
deleted file mode 100644
index 7e32827d1..000000000
--- a/public/icons/tooling.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/yarn.lock b/yarn.lock
index 49d82b30c..d7233f64a 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2846,14 +2846,14 @@ __metadata:
languageName: node
linkType: hard
-"@cypress/code-coverage@npm:^3.13.12":
- version: 3.13.12
- resolution: "@cypress/code-coverage@npm:3.13.12"
+"@cypress/code-coverage@npm:^3.13.6":
+ version: 3.13.6
+ resolution: "@cypress/code-coverage@npm:3.13.6"
dependencies:
"@cypress/webpack-preprocessor": "npm:^6.0.0"
chalk: "npm:4.1.2"
dayjs: "npm:1.11.13"
- debug: "npm:4.4.0"
+ debug: "npm:4.3.7"
execa: "npm:4.1.0"
globby: "npm:11.1.0"
istanbul-lib-coverage: "npm:^3.0.0"
@@ -2865,7 +2865,7 @@ __metadata:
babel-loader: ^8.3 || ^9
cypress: "*"
webpack: ^4 || ^5
- checksum: 10c0/6ec9c618a38d4b0f2a7e415588cf618fd016da56250cc1ac2228b09a9a9be874370168875720c0c157d08a01da00690c65ca51e7656089200027fd2cc1a8e7d2
+ checksum: 10c0/2b4407c7edcbf6a8e83d963ebf5c99b6506c2c96f62e18df6cd0addae54b0b4f9abfc180e720b673cd0ad6ba5dbaa4e03dda0ec9b36035bcf2d338979a312511
languageName: node
linkType: hard
@@ -4482,21 +4482,21 @@ __metadata:
languageName: node
linkType: hard
-"autoprefixer@npm:^10.4.21":
- version: 10.4.21
- resolution: "autoprefixer@npm:10.4.21"
+"autoprefixer@npm:^10.4.20":
+ version: 10.4.20
+ resolution: "autoprefixer@npm:10.4.20"
dependencies:
- browserslist: "npm:^4.24.4"
- caniuse-lite: "npm:^1.0.30001702"
+ browserslist: "npm:^4.23.3"
+ caniuse-lite: "npm:^1.0.30001646"
fraction.js: "npm:^4.3.7"
normalize-range: "npm:^0.1.2"
- picocolors: "npm:^1.1.1"
+ picocolors: "npm:^1.0.1"
postcss-value-parser: "npm:^4.2.0"
peerDependencies:
postcss: ^8.1.0
bin:
autoprefixer: bin/autoprefixer
- checksum: 10c0/de5b71d26d0baff4bbfb3d59f7cf7114a6030c9eeb66167acf49a32c5b61c68e308f1e0f869d92334436a221035d08b51cd1b2f2c4689b8d955149423c16d4d4
+ checksum: 10c0/e1f00978a26e7c5b54ab12036d8c13833fad7222828fc90914771b1263f51b28c7ddb5803049de4e77696cbd02bb25cfc3634e80533025bb26c26aacdf938940
languageName: node
linkType: hard
@@ -4784,20 +4784,6 @@ __metadata:
languageName: node
linkType: hard
-"browserslist@npm:^4.24.4":
- version: 4.24.4
- resolution: "browserslist@npm:4.24.4"
- dependencies:
- caniuse-lite: "npm:^1.0.30001688"
- electron-to-chromium: "npm:^1.5.73"
- node-releases: "npm:^2.0.19"
- update-browserslist-db: "npm:^1.1.1"
- bin:
- browserslist: cli.js
- checksum: 10c0/db7ebc1733cf471e0b490b4f47e3e2ea2947ce417192c9246644e92c667dd56a71406cc58f62ca7587caf828364892e9952904a02b7aead752bc65b62a37cfe9
- languageName: node
- linkType: hard
-
"buffer-crc32@npm:~0.2.3":
version: 0.2.13
resolution: "buffer-crc32@npm:0.2.13"
@@ -4966,13 +4952,6 @@ __metadata:
languageName: node
linkType: hard
-"caniuse-lite@npm:^1.0.30001688, caniuse-lite@npm:^1.0.30001702":
- version: 1.0.30001705
- resolution: "caniuse-lite@npm:1.0.30001705"
- checksum: 10c0/f135a9075e36cc28a66a8f37145dca2bdc45ea18fd9fae2569e781e0f7156962d4fcac374640aa6421a70c6e8d23587bf9386f5561a1fe81bbbf36055b807243
- languageName: node
- linkType: hard
-
"caseless@npm:~0.12.0":
version: 0.12.0
resolution: "caseless@npm:0.12.0"
@@ -5517,15 +5496,15 @@ __metadata:
languageName: node
linkType: hard
-"debug@npm:4.4.0":
- version: 4.4.0
- resolution: "debug@npm:4.4.0"
+"debug@npm:4.3.7":
+ version: 4.3.7
+ resolution: "debug@npm:4.3.7"
dependencies:
ms: "npm:^2.1.3"
peerDependenciesMeta:
supports-color:
optional: true
- checksum: 10c0/db94f1a182bf886f57b4755f85b3a74c39b5114b9377b7ab375dc2cfa3454f09490cc6c30f829df3fc8042bc8b8995f6567ce5cd96f3bc3688bd24027197d9de
+ checksum: 10c0/1471db19c3b06d485a622d62f65947a19a23fbd0dd73f7fd3eafb697eec5360cde447fb075919987899b1a2096e85d35d4eb5a4de09a57600ac9cf7e6c8e768b
languageName: node
linkType: hard
@@ -5782,13 +5761,6 @@ __metadata:
languageName: node
linkType: hard
-"electron-to-chromium@npm:^1.5.73":
- version: 1.5.119
- resolution: "electron-to-chromium@npm:1.5.119"
- checksum: 10c0/f4ca0eb3af21d16d2c1fd480c5a43428ce4423ca887338d69bd3eadae818b6d6e799c62b1baac1bc4f76e4226f5fb15a6b0dc8965f601ac053e86508d3e8e41c
- languageName: node
- linkType: hard
-
"emoji-regex@npm:^8.0.0":
version: 8.0.0
resolution: "emoji-regex@npm:8.0.0"
@@ -8329,7 +8301,7 @@ __metadata:
dependencies:
"@babel/core": "npm:^7.26.0"
"@babel/preset-env": "npm:^7.26.0"
- "@cypress/code-coverage": "npm:^3.13.12"
+ "@cypress/code-coverage": "npm:^3.13.6"
"@docsearch/react": "npm:3.8.0"
"@next/eslint-plugin-next": "npm:^14.0.1"
"@svgr/webpack": "npm:^8.1.0"
@@ -8344,7 +8316,7 @@ __metadata:
"@types/react-text-truncate": "npm:^0.19.0"
"@typescript-eslint/eslint-plugin": "npm:^6.21.0"
"@typescript-eslint/parser": "npm:^6.21.0"
- autoprefixer: "npm:^10.4.21"
+ autoprefixer: "npm:^10.4.20"
axios: "npm:1.7.7"
babel-loader: "npm:^9.2.1"
babel-plugin-istanbul: "npm:^7.0.0"
@@ -9225,13 +9197,6 @@ __metadata:
languageName: node
linkType: hard
-"node-releases@npm:^2.0.19":
- version: 2.0.19
- resolution: "node-releases@npm:2.0.19"
- checksum: 10c0/52a0dbd25ccf545892670d1551690fe0facb6a471e15f2cfa1b20142a5b255b3aa254af5f59d6ecb69c2bec7390bc643c43aa63b13bf5e64b6075952e716b1aa
- languageName: node
- linkType: hard
-
"nopt@npm:^7.0.0":
version: 7.2.1
resolution: "nopt@npm:7.2.1"
@@ -9708,7 +9673,7 @@ __metadata:
languageName: node
linkType: hard
-"picocolors@npm:^1.1.0, picocolors@npm:^1.1.1":
+"picocolors@npm:^1.1.0":
version: 1.1.1
resolution: "picocolors@npm:1.1.1"
checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58