{"id":15268,"date":"2025-06-08T07:08:53","date_gmt":"2025-06-07T22:08:53","guid":{"rendered":"https:\/\/www.sambuichi.jp\/?p=15268"},"modified":"2025-06-08T07:19:37","modified_gmt":"2025-06-07T22:19:37","slug":"aws-ec2-%e4%b8%8a%e3%81%a7-json-schema-draft-2020-12-un-cefact-%e3%82%b9%e3%82%ad%e3%83%bc%e3%83%9e%e3%82%92%e6%a4%9c%e8%a8%bc%e3%81%99%e3%82%8b%e7%92%b0%e5%a2%83%e6%a7%8b%e7%af%89%e6%89%8b%e9%a0%86","status":"publish","type":"post","link":"https:\/\/www.sambuichi.jp\/?p=15268","title":{"rendered":"AWS EC2 \u4e0a\u3067 JSON Schema Draft 2020-12 + UN\/CEFACT \u30b9\u30ad\u30fc\u30de\u3092\u691c\u8a3c\u3059\u308b\u74b0\u5883\u69cb\u7bc9\u624b\u9806"},"content":{"rendered":"<p>Views: 13<\/p><div id=\"header\">\n<h1>AWS EC2 \u4e0a\u3067 JSON Schema Draft 2020-12 + UN\/CEFACT \u30b9\u30ad\u30fc\u30de\u3092\u691c\u8a3c\u3059\u308b\u74b0\u5883\u69cb\u7bc9\u624b\u9806<\/h1>\n<div class=\"details\">\n<span id=\"author\" class=\"author\">ChatGPT (\u7de8\u96c6\uff1a\u4e09\u5206\u4e00\u4fe1\u4e4b\uff09<\/span><br \/>\n<span id=\"revdate\">2025-06-07<\/span>\n<\/div>\n<\/div>\n<div id=\"content\">\n<div id=\"preamble\">\n<div class=\"sectionbody\">\n<div class=\"quoteblock abstract\">\n<blockquote><p>\n\u672c\u8a18\u4e8b\u3067\u306f\u3001UN\/CEFACT \u306b\u3088\u3063\u3066\u516c\u958b\u3055\u308c\u3066\u3044\u308b JSON Schema \u5b9a\u7fa9\u3068 XBRL GL \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u4f7f\u7528\u3057\u3066\u3001Amazon EC2 \u4e0a\u306b JSON Schema Draft 2020-12 \u6e96\u62e0\u306e\u691c\u8a3c\u74b0\u5883\u3092\u69cb\u7bc9\u3059\u308b\u624b\u9806\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002\n<\/p><\/blockquote>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_\u524d\u63d0\u74b0\u5883\u306e\u69cb\u7bc9\">1. \u524d\u63d0\u74b0\u5883\u306e\u69cb\u7bc9<\/h2>\n<div class=\"sectionbody\">\n<div class=\"sect2\">\n<h3 id=\"_os_\u3068_node_js_\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u78ba\u8a8d\">1.1. OS \u3068 Node.js \u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u78ba\u8a8d<\/h3>\n<div class=\"paragraph\">\n<p>Amazon Linux 2 \u3067\u306f <code>fs\/promises<\/code> \u3084 <code>ajv\/dist\/2020<\/code> \u306e\u8aad\u307f\u8fbc\u307f\u306a\u3069\u306b\u554f\u984c\u304c\u3042\u3063\u305f\u305f\u3081\u3001Amazon Linux 2023 \u3092\u4f7f\u7528\u3057\u307e\u3057\u305f\u3002<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-shell\" data-lang=\"shell\">$ uname -a\r\nLinux ip-xxx.ap-northeast-1.compute.internal ...\r\n$ cat \/etc\/os-release\r\nNAME=\"Amazon Linux\"\r\nVERSION=\"2023\"<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Node.js \u306f\u4ee5\u4e0b\u306e\u3068\u304a\u308a\u30d0\u30fc\u30b8\u30e7\u30f3 18.20.8 \u3092\u4f7f\u7528\uff1a<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-shell\" data-lang=\"shell\">$ node -v\r\nv18.20.8<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_\u5fc5\u8981\u306a\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\">1.2. \u5fc5\u8981\u306a\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/h3>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-shell\" data-lang=\"shell\">$ npm install ajv@8.17.1 ajv-formats@3.0.1<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"admonitionblock note\">\n<table>\n<tr>\n<td class=\"icon\">\n<div class=\"title\">Note<\/div>\n<\/td>\n<td class=\"content\">\n<div class=\"paragraph\">\n<p>\u958b\u767a\u521d\u671f\u6bb5\u968e\u3067\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306b <code>@latest<\/code> \u3092\u6307\u5b9a\u3057\u3066\u6700\u65b0\u5b89\u5b9a\u7248\u3092\u53d6\u5f97\u3059\u308b\u3053\u3068\u3082\u53ef\u80fd\u3067\u3059\u3002<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-shell\" data-lang=\"shell\">$ npm install ajv@latest ajv-formats@latest<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>\u305f\u3060\u3057\u3001<code>@latest<\/code> \u3092\u4f7f\u7528\u3059\u308b\u3068\u5c06\u6765\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u30a2\u30c3\u30d7\u306b\u3088\u3063\u3066\u52d5\u4f5c\u304c\u5909\u308f\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002<br \/>\n\u672c\u8a18\u4e8b\u3067\u306f\u518d\u73fe\u6027\u3092\u91cd\u8996\u3059\u308b\u305f\u3081\u3001\u52d5\u4f5c\u78ba\u8a8d\u6e08\u307f\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u660e\u793a\u7684\u306b\u6307\u5b9a\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_uncefact_\u30b9\u30ad\u30fc\u30de\u306e\u53d6\u5f97\">2. UN\/CEFACT \u30b9\u30ad\u30fc\u30de\u306e\u53d6\u5f97<\/h2>\n<div class=\"sectionbody\">\n<div class=\"sect2\">\n<h3 id=\"_github_\u304b\u3089\u306e\u53d6\u5f97\u65b9\u6cd5\u63a8\u5968\">2.1. GitHub \u304b\u3089\u306e\u53d6\u5f97\u65b9\u6cd5\uff08\u63a8\u5968\uff09<\/h3>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-shell\" data-lang=\"shell\">$ git clone https:\/\/github.com\/uncefact\/spec-JSONschema.git\r\n$ cd spec-JSONschema\/JSONschema2020-12\/library\/BuyShipPay\/D23B\/<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_curl_\u3067\u500b\u5225\u53d6\u5f97\u3059\u308b\u5834\u5408\">2.2. curl \u3067\u500b\u5225\u53d6\u5f97\u3059\u308b\u5834\u5408<\/h3>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-shell\" data-lang=\"shell\">$ mkdir -p schemas\/meta schemas\/codelists\r\n\r\n$ curl -L -o schemas\/meta\/metadata.json \\\r\n  https:\/\/raw.githubusercontent.com\/uncefact\/spec-JSONschema\/main\/JSONschema2020-12\/library\/BuyShipPay\/D23B\/meta\/metadata.json\r\n\r\n$ curl -L -o schemas\/UNECE-BasicComponents.json \\\r\n  https:\/\/raw.githubusercontent.com\/uncefact\/spec-JSONschema\/main\/JSONschema2020-12\/library\/BuyShipPay\/D23B\/UNECE-BasicComponents.json\r\n\r\n$ curl -L -o schemas\/codelists\/UnitCode.json \\\r\n  https:\/\/raw.githubusercontent.com\/uncefact\/spec-JSONschema\/main\/JSONschema2020-12\/library\/BuyShipPay\/D23B\/codelists\/UnitCode.json<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_draft_2020_12_\u30b9\u30ad\u30fc\u30de\u306e\u53d6\u5f97\">2.3. Draft 2020-12 \u30b9\u30ad\u30fc\u30de\u306e\u53d6\u5f97<\/h3>\n<div class=\"paragraph\">\n<p>JSON Schema \u306e <code>$schema<\/code> URI \u306b\u6307\u5b9a\u3055\u308c\u308b\uff1a<br \/>\n<a href=\"https:\/\/json-schema.org\/draft\/2020-12\/schema\" class=\"bare\">https:\/\/json-schema.org\/draft\/2020-12\/schema<\/a><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>\u3053\u306e\u30e1\u30bf\u30b9\u30ad\u30fc\u30de\u306f curl \u3067\u53d6\u5f97\u6642\u306b\u30ea\u30c0\u30a4\u30ec\u30af\u30c8\u3055\u308c\u308b\u305f\u3081\u3001\u5fc5\u305a <code>-L<\/code> \u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-shell\" data-lang=\"shell\">$ curl -L -o schemas\/draft2020-12.json https:\/\/json-schema.org\/draft\/2020-12\/schema<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p><code>-L<\/code> \u3092\u7701\u7565\u3059\u308b\u3068 HTML \u304c\u4fdd\u5b58\u3055\u308c\u3066\u3057\u307e\u3044\u3001AJV \u304c <code>\"Unknown format\"<\/code> \u3068\u3044\u3046\u30a8\u30e9\u30fc\u3067\u30b9\u30ad\u30fc\u30de\u3092\u51e6\u7406\u3067\u304d\u306a\u304f\u306a\u308a\u307e\u3059\u3002<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_\u691c\u8a3c\u30b9\u30af\u30ea\u30d7\u30c8_validate_js\">3. \u691c\u8a3c\u30b9\u30af\u30ea\u30d7\u30c8 validate.js<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>\u4ee5\u4e0b\u306f <code>validate.js<\/code> \u306e\u4e3b\u8981\u90e8\u5206\u3067\u3059\u3002<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-javascript\" data-lang=\"javascript\">const Ajv2020 = require(\"ajv\/dist\/2020\");\r\nconst addFormats = require(\"ajv-formats\");\r\nconst fs = require(\"fs\/promises\");\r\n\r\nconst ajv = new Ajv2020({ loadSchema, strict: false });\r\naddFormats(ajv);<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_ref_\u3092\u89e3\u6c7a\u3059\u308b_loadschema_\u95a2\u6570\">3.1. <code>$ref<\/code> \u3092\u89e3\u6c7a\u3059\u308b loadSchema \u95a2\u6570<\/h3>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-javascript\" data-lang=\"javascript\">async function loadSchema(uri) {\r\n  if (uri === \"http:\/\/json-schema.org\/draft\/2020-12\/schema\") {\r\n    return JSON.parse(await fs.readFile(\"schemas\/draft2020-12.json\", \"utf8\"));\r\n  }\r\n  if (uri.endsWith(\"metadata.json\")) {\r\n    return JSON.parse(await fs.readFile(\"schemas\/meta\/metadata.json\", \"utf8\"));\r\n  }\r\n  if (uri.includes(\"UNECE-BasicComponents\")) {\r\n    return JSON.parse(await fs.readFile(\"schemas\/UNECE-BasicComponents.json\", \"utf8\"));\r\n  }\r\n  if (uri.includes(\"UnitCode.json\")) {\r\n    return JSON.parse(await fs.readFile(\"schemas\/codelists\/UnitCode.json\", \"utf8\"));\r\n  }\r\n  throw new Error(\"Unresolved schema: \" + uri);\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_\u30b9\u30ad\u30fc\u30de\u3068\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u691c\u8a3c\u5b9f\u884c\">3.2. \u30b9\u30ad\u30fc\u30de\u3068\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u691c\u8a3c\u5b9f\u884c<\/h3>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-javascript\" data-lang=\"javascript\">const schema = await ajv.compileAsync(\r\n  JSON.parse(await fs.readFile(\"schemas\/xbrl-gl-cor-schema.json\"))\r\n);\r\nconst data = JSON.parse(await fs.readFile(\"samples\/xbrl-gl-instance.json\"));\r\n\r\nif (schema(data)) {\r\n  console.log(\"\u2705 Validation passed\");\r\n} else {\r\n  console.error(\"\u274c Validation errors:\", schema.errors);\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_metadata_json_\u306e\u5f79\u5272\u3068\u6df7\u4e71\">4. metadata.json \u306e\u5f79\u5272\u3068\u6df7\u4e71<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>UN\/CEFACT \u30b9\u30ad\u30fc\u30de\u3067\u306f\u3001<code>\"meta\/metadata\"<\/code> \u306e\u3088\u3046\u306b <code>$ref<\/code> \u3092\u901a\u3058\u3066\u30e1\u30bf\u60c5\u5831\u3092\u53c2\u7167\u3057\u307e\u3059\u3002<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>\u8aa4\u3063\u3066\u30d5\u30a1\u30a4\u30eb\u540d\u3092 <code>metadata.json<\/code> \u3067\u306f\u306a\u304f <code>meta-data.json<\/code> \u3068\u3057\u3066\u51e6\u7406\u3057\u3088\u3046\u3068\u3059\u308b\u3068\u3001<code>loadSchema()<\/code> \u3067\u6b63\u3057\u304f\u8aad\u307f\u8fbc\u3081\u305a\u306b\u691c\u8a3c\u306b\u5931\u6557\u3057\u307e\u3059\u3002<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-json\" data-lang=\"json\">\"unece:metadata\": {\r\n  \"$ref\": \"meta\/metadata\"\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u69cb\u6210\u4f8b\">5. \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u69cb\u6210\u4f8b<\/h2>\n<div class=\"sectionbody\">\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code>project-root\/\r\n\u251c\u2500\u2500 validate.js\r\n\u251c\u2500\u2500 schemas\/\r\n\u2502   \u251c\u2500\u2500 draft2020-12.json\r\n\u2502   \u251c\u2500\u2500 meta\/\r\n\u2502   \u2502   \u2514\u2500\u2500 metadata.json\r\n\u2502   \u251c\u2500\u2500 codelists\/\r\n\u2502   \u2502   \u2514\u2500\u2500 UnitCode.json\r\n\u2502   \u251c\u2500\u2500 UNECE-BasicComponents.json\r\n\u2502   \u2514\u2500\u2500 xbrl-gl-cor-schema.json\r\n\u2514\u2500\u2500 samples\/\r\n    \u2514\u2500\u2500 xbrl-gl-instance.json<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_format_\u691c\u8a3c\u306e\u6709\u52b9\u5316\">6. format \u691c\u8a3c\u306e\u6709\u52b9\u5316<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>\u4ee5\u4e0b\u306e\u3088\u3046\u306b <code>format<\/code> \u30ad\u30fc\u30ef\u30fc\u30c9\u3092\u4f7f\u3046\u3068\u3001<code>ajv-formats<\/code> \u306b\u3088\u308a\u81ea\u52d5\u7684\u306b\u691c\u8a3c\u3055\u308c\u307e\u3059\u3002<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-json\" data-lang=\"json\">{\r\n  \"type\": \"string\",\r\n  \"format\": \"date-time\"\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_\u307e\u3068\u3081\">7. \u307e\u3068\u3081<\/h2>\n<div class=\"sectionbody\">\n<div class=\"ulist\">\n<ul>\n<li>\n<p>Amazon Linux 2023 + Node.js v18.20.8 \u306f Draft 2020-12 \u306b\u9069\u3057\u305f\u74b0\u5883<\/p>\n<\/li>\n<li>\n<p><code>ajv@8.17.1<\/code> \u3068 <code>ajv-formats@3.0.1<\/code> \u306f Draft 2020-12 \u3068 format \u691c\u8a3c\u306b\u5b8c\u5168\u5bfe\u5fdc<\/p>\n<\/li>\n<li>\n<p>GitHub \u306e UN\/CEFACT \u30b9\u30ad\u30fc\u30de\u306f\u30ed\u30fc\u30ab\u30eb\u4fdd\u5b58\u3057 <code>$ref<\/code> \u89e3\u6c7a\u7d4c\u8def\u3092\u660e\u793a\u3059\u308b<\/p>\n<\/li>\n<li>\n<p><code>curl -L<\/code> \u3092\u5fd8\u308c\u305a\u306b\u4f7f\u7528\u3057\u3001\u8aa4\u3063\u3066 HTML \u3092\u4fdd\u5b58\u3057\u306a\u3044\u3088\u3046\u6ce8\u610f<\/p>\n<\/li>\n<li>\n<p><code>meta-data.json<\/code> \u3068\u8aa4\u8a18\u3059\u308b\u3068 <code>metadata.json<\/code> \u306e <code>$ref<\/code> \u89e3\u6c7a\u306b\u5931\u6557\u3059\u308b\u305f\u3081\u6ce8\u610f\u304c\u5fc5\u8981<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_\u53c2\u8003\u30ea\u30f3\u30af\">8. \u53c2\u8003\u30ea\u30f3\u30af<\/h2>\n<div class=\"sectionbody\">\n<div class=\"ulist\">\n<ul>\n<li>\n<p>UN\/CEFACT JSON Schema:<br \/>\n<i class=\"fa fa-link\"><\/i> <a href=\"https:\/\/github.com\/uncefact\/spec-JSONschema\" class=\"bare\">https:\/\/github.com\/uncefact\/spec-JSONschema<\/a><\/p>\n<\/li>\n<li>\n<p>JSON Schema:<br \/>\n<i class=\"fa fa-link\"><\/i> <a href=\"https:\/\/json-schema.org\/\" class=\"bare\">https:\/\/json-schema.org\/<\/a><\/p>\n<\/li>\n<li>\n<p>AJV GitHub:<br \/>\n<i class=\"fa fa-link\"><\/i> <a href=\"https:\/\/github.com\/ajv-validator\/ajv\" class=\"bare\">https:\/\/github.com\/ajv-validator\/ajv<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_validate_js\">9. validate.js<\/h2>\n<div class=\"sectionbody\">\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-js\" data-lang=\"js\">const fs = require(\"fs\").promises;\r\nconst path = require(\"path\");\r\nconst Ajv2020 = require(\"ajv\/dist\/2020\");\r\nconst addFormats = require(\"ajv-formats\");\r\n\r\nasync function loadSchema(uri) {\r\n  const base = path.resolve(__dirname, \"schemas\");\r\n\r\n  \/\/ Draft 2020-12 \u30e1\u30a4\u30f3\u30b9\u30ad\u30fc\u30de\r\n  if (uri === \"http:\/\/json-schema.org\/draft\/2020-12\/schema\") {\r\n    const fullPath = path.join(base, \"draft2020-12.json\");\r\n    const schema = JSON.parse(await fs.readFile(fullPath, \"utf8\"));\r\n    delete schema[\"$id\"];\r\n    return schema;\r\n  }\r\n\r\n  \/\/ \u5404 vocabulary \u30e1\u30bf\u30b9\u30ad\u30fc\u30de\r\n  const vocabularies = [\r\n    \"core\",\r\n    \"applicator\",\r\n    \"unevaluated\",\r\n    \"validation\",\r\n    \"meta-data\",\r\n    \"format-annotation\",\r\n    \"content\"\r\n  ];\r\n\r\n  for (const name of vocabularies) {\r\n    if (uri === `http:\/\/json-schema.org\/draft\/2020-12\/meta\/${name}`) {\r\n      const fullPath = path.join(base, \"meta\", `${name}.json`);\r\n      const schema = JSON.parse(await fs.readFile(fullPath, \"utf8\"));\r\n      delete schema[\"$id\"];\r\n      return schema;\r\n    }\r\n  }\r\n\r\n  \/\/ \u305d\u306e\u4ed6\u30ab\u30b9\u30bf\u30e0\u30b9\u30ad\u30fc\u30de\r\n  if (uri.includes(\"UNECE-BasicComponents.json\")) {\r\n    const fullPath = path.join(\r\n      __dirname,\r\n      \"..\/uncefact\/spec-JSONschema\/JSONschema2020-12\/library\/BuyShipPay\/D23B\/UNECE-BasicComponents.json\"\r\n    );\r\n    return JSON.parse(await fs.readFile(fullPath, \"utf8\"));\r\n  }\r\n\r\n  if (uri.includes(\"codelists\/\")) {\r\n    const fileName = path.basename(uri);\r\n    const fullPath = path.join(\r\n      __dirname,\r\n      \"..\/uncefact\/spec-JSONschema\/JSONschema2020-12\/library\/BuyShipPay\/D23B\/codelists\",\r\n      fileName\r\n    );\r\n    return JSON.parse(await fs.readFile(fullPath, \"utf8\"));\r\n  }\r\n\r\n  throw new Error(`Unknown schema URI: ${uri}`);\r\n}\r\n\r\nconst ajv = new Ajv2020({\r\n  loadSchema,\r\n  strict: false\r\n});\r\naddFormats(ajv);\r\n\r\n(async () =&gt; {\r\n  try {\r\n    const schemaPath = path.join(__dirname, \"schemas\/xbrl-gl-cor-schema.json\");\r\n    const instancePath = path.join(__dirname, \"samples\/xbrl-gl-instance.json\");\r\n\r\n    const schema = JSON.parse(await fs.readFile(schemaPath, \"utf8\"));\r\n    const data = JSON.parse(await fs.readFile(instancePath, \"utf8\"));\r\n\r\n    const validate = await ajv.compileAsync(schema);\r\n    const valid = validate(data);\r\n\r\n    if (valid) {\r\n      console.log(\"\u2705 Validation successful: data is valid against the schema.\");\r\n    } else {\r\n      console.error(\"\u274c Validation errors:\");\r\n      console.error(validate.errors);\r\n    }\r\n  } catch (err) {\r\n    console.error(\"\ud83d\udca5 Runtime error:\", err);\r\n  }\r\n})();<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div id=\"footer\">\n<div id=\"footer-text\">\nLast updated 2025-06-08 07:18:50 +0900\n<\/div>\n<\/div>\n<div id=\"toc\" class=\"toc2\">\n<div id=\"toctitle\">\u76ee\u6b21<\/div>\n<ul class=\"sectlevel1\">\n<li><a href=\"#_\u524d\u63d0\u74b0\u5883\u306e\u69cb\u7bc9\">1. \u524d\u63d0\u74b0\u5883\u306e\u69cb\u7bc9<\/a>\n<ul class=\"sectlevel2\">\n<li><a href=\"#_os_\u3068_node_js_\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u78ba\u8a8d\">1.1. OS \u3068 Node.js \u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u78ba\u8a8d<\/a><\/li>\n<li><a href=\"#_\u5fc5\u8981\u306a\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\">1.2. \u5fc5\u8981\u306a\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#_uncefact_\u30b9\u30ad\u30fc\u30de\u306e\u53d6\u5f97\">2. UN\/CEFACT \u30b9\u30ad\u30fc\u30de\u306e\u53d6\u5f97<\/a>\n<ul class=\"sectlevel2\">\n<li><a href=\"#_github_\u304b\u3089\u306e\u53d6\u5f97\u65b9\u6cd5\u63a8\u5968\">2.1. GitHub \u304b\u3089\u306e\u53d6\u5f97\u65b9\u6cd5\uff08\u63a8\u5968\uff09<\/a><\/li>\n<li><a href=\"#_curl_\u3067\u500b\u5225\u53d6\u5f97\u3059\u308b\u5834\u5408\">2.2. curl \u3067\u500b\u5225\u53d6\u5f97\u3059\u308b\u5834\u5408<\/a><\/li>\n<li><a href=\"#_draft_2020_12_\u30b9\u30ad\u30fc\u30de\u306e\u53d6\u5f97\">2.3. Draft 2020-12 \u30b9\u30ad\u30fc\u30de\u306e\u53d6\u5f97<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#_\u691c\u8a3c\u30b9\u30af\u30ea\u30d7\u30c8_validate_js\">3. \u691c\u8a3c\u30b9\u30af\u30ea\u30d7\u30c8 validate.js<\/a>\n<ul class=\"sectlevel2\">\n<li><a href=\"#_ref_\u3092\u89e3\u6c7a\u3059\u308b_loadschema_\u95a2\u6570\">3.1. <code>$ref<\/code> \u3092\u89e3\u6c7a\u3059\u308b loadSchema \u95a2\u6570<\/a><\/li>\n<li><a href=\"#_\u30b9\u30ad\u30fc\u30de\u3068\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u691c\u8a3c\u5b9f\u884c\">3.2. \u30b9\u30ad\u30fc\u30de\u3068\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u691c\u8a3c\u5b9f\u884c<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#_metadata_json_\u306e\u5f79\u5272\u3068\u6df7\u4e71\">4. metadata.json \u306e\u5f79\u5272\u3068\u6df7\u4e71<\/a><\/li>\n<li><a href=\"#_\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u69cb\u6210\u4f8b\">5. \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u69cb\u6210\u4f8b<\/a><\/li>\n<li><a href=\"#_format_\u691c\u8a3c\u306e\u6709\u52b9\u5316\">6. format \u691c\u8a3c\u306e\u6709\u52b9\u5316<\/a><\/li>\n<li><a href=\"#_\u307e\u3068\u3081\">7. \u307e\u3068\u3081<\/a><\/li>\n<li><a href=\"#_\u53c2\u8003\u30ea\u30f3\u30af\">8. \u53c2\u8003\u30ea\u30f3\u30af<\/a><\/li>\n<li><a href=\"#_validate_js\">9. validate.js<\/a><\/li>\n<\/ul>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Views: 13 AWS EC2 \u4e0a\u3067 JSON Schema Draft 2020-12 + UN\/CEFACT \u30b9\u30ad\u30fc\u30de\u3092\u691c\u8a3c\u3059\u308b\u74b0\u5883\u69cb\u7bc9\u624b\u9806 ChatGPT (\u7de8\u96c6\uff1a\u4e09\u5206\u4e00\u4fe1\u4e4b\uff09 2025-06-07 \u672c\u8a18\u4e8b\u3067\u306f [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":15209,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[71,21,65,82],"tags":[],"_links":{"self":[{"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=\/wp\/v2\/posts\/15268"}],"collection":[{"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=15268"}],"version-history":[{"count":5,"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=\/wp\/v2\/posts\/15268\/revisions"}],"predecessor-version":[{"id":15273,"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=\/wp\/v2\/posts\/15268\/revisions\/15273"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=\/wp\/v2\/media\/15209"}],"wp:attachment":[{"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=15268"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=15268"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sambuichi.jp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=15268"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}