diff --git a/package-lock.json b/package-lock.json index 5fa6484..def788e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,19 +7,24 @@ "": { "name": "greenwood-demo-adapter-netlify", "version": "1.0.0", + "hasInstallScript": true, "license": "ISC", + "dependencies": { + "urlpattern-polyfill": "^10.1.0" + }, "devDependencies": { - "@greenwood/cli": "~0.33.0", - "@greenwood/plugin-adapter-netlify": "~0.33.0" + "@greenwood/cli": "~0.34.0-alpha.1", + "@greenwood/plugin-adapter-netlify": "~0.34.0-alpha.1", + "patch-package": "^8.0.1" }, "optionalDependencies": { "@rollup/rollup-linux-x64-gnu": "^4.50.0" } }, "node_modules/@greenwood/cli": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@greenwood/cli/-/cli-0.33.0.tgz", - "integrity": "sha512-73gbvGdqbXVIv4h+30lYW+ccEZF47LpKdxNhlzvYvYjrJGHSQ/qfktA5KmKVCkW+a/+TJLToz0bhITN39lw4wA==", + "version": "0.34.0-alpha.1", + "resolved": "https://registry.npmjs.org/@greenwood/cli/-/cli-0.34.0-alpha.1.tgz", + "integrity": "sha512-64No9HeZyQqGi5R3a29OJUv+SnsWuUBIpPTyLUQQKP6UYaW7gUsqhWS+ehpMQWa9X3Z6pihlyEkq2IjyX+rgMw==", "dev": true, "license": "MIT", "dependencies": { @@ -37,7 +42,7 @@ "livereload": "^0.9.1", "node-html-parser": "^7.0.1", "rollup": "^4.26.0", - "wc-compiler": "~0.17.0" + "wc-compiler": "~0.18.0" }, "bin": { "greenwood": "src/bin.js" @@ -47,9 +52,9 @@ } }, "node_modules/@greenwood/plugin-adapter-netlify": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@greenwood/plugin-adapter-netlify/-/plugin-adapter-netlify-0.33.0.tgz", - "integrity": "sha512-lG+wwEBK1gw324D9+aW95UCXg2pPF6QTJ7OsdoSZpF8KDoKycPzSYKhBr48adsnjNR4Wsphm0VNiQ2GY+yV96g==", + "version": "0.34.0-alpha.1", + "resolved": "https://registry.npmjs.org/@greenwood/plugin-adapter-netlify/-/plugin-adapter-netlify-0.34.0-alpha.1.tgz", + "integrity": "sha512-LpDxYALHrLySAXyGyxUZ/54LdQsP0+GE1Oh7oarq47seUUnQGJf8CGw9qmdFfDMl1ogWjrFuID3ZcUJUzESR4g==", "dev": true, "license": "MIT", "dependencies": { @@ -65,6 +70,7 @@ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -77,85 +83,6 @@ "node": ">=12" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", @@ -219,6 +146,7 @@ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=14" @@ -229,6 +157,7 @@ "resolved": "https://registry.npmjs.org/@projectevergreen/acorn-jsx-esm/-/acorn-jsx-esm-0.1.0.tgz", "integrity": "sha512-ZBSkr0e2M4ylq74dTGHSkWI2dF3Mz8zwBLyzIXZMftecKDADcsCTj7bWltVgtdl8Rh4+bmY1jNWUw7AlSV/r7A==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -793,6 +722,13 @@ "@types/node": "*" } }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true, + "license": "BSD-2-Clause" + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -824,6 +760,7 @@ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, + "license": "MIT", "dependencies": { "acorn": "^8.11.0" }, @@ -842,24 +779,26 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" @@ -869,7 +808,8 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/anymatch": { "version": "3.1.3", @@ -957,6 +897,7 @@ "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", "dev": true, + "license": "MIT", "bin": { "astring": "bin/astring" } @@ -1150,6 +1091,56 @@ "node": ">= 0.4" } }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -1177,6 +1168,22 @@ "fsevents": "~2.3.2" } }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/co-body": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz", @@ -1194,6 +1201,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -1205,7 +1213,8 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/commander": { "version": "2.20.3", @@ -1337,10 +1346,11 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -1541,7 +1551,8 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ee-first": { "version": "1.1.1", @@ -1551,10 +1562,11 @@ "license": "MIT" }, "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" }, "node_modules/encodeurl": { "version": "2.0.0", @@ -1679,13 +1691,24 @@ "node": ">=8" } }, + "node_modules/find-yarn-workspace-root": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", + "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "micromatch": "^4.0.2" + } + }, "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, + "license": "ISC", "dependencies": { - "cross-spawn": "^7.0.0", + "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" }, "engines": { @@ -1735,6 +1758,21 @@ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", "dev": true }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -1854,6 +1892,16 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", @@ -2084,6 +2132,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2098,6 +2162,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -2129,6 +2194,19 @@ "@types/estree": "*" } }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -2139,7 +2217,24 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } }, "node_modules/js-yaml": { "version": "3.14.1", @@ -2154,9 +2249,59 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/keygrip": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "node_modules/json-stable-stringify": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz", + "integrity": "sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/json-stable-stringify/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true, + "license": "Public Domain", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/keygrip": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", "dev": true, "license": "MIT", @@ -2167,6 +2312,16 @@ "node": ">= 0.6" } }, + "node_modules/klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.11" + } + }, "node_modules/koa": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/koa/-/koa-3.0.1.tgz", @@ -2282,7 +2437,8 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/livereload": { "version": "0.9.3", @@ -2342,7 +2498,8 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/magic-string": { "version": "0.30.17", @@ -2378,6 +2535,20 @@ "node": ">= 0.6" } }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -2411,6 +2582,16 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", @@ -2426,6 +2607,7 @@ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", "dev": true, + "license": "MIT", "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", @@ -18470,6 +18652,7 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -18483,6 +18666,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -18505,6 +18698,23 @@ "wrappy": "1" } }, + "node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/opts": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/opts/-/opts-2.0.2.tgz", @@ -18515,21 +18725,35 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true + "dev": true, + "license": "BlueOak-1.0.0" }, "node_modules/parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "dev": true, "license": "MIT", "dependencies": { - "entities": "^4.5.0" + "entities": "^6.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -18540,6 +18764,36 @@ "node": ">= 0.8" } }, + "node_modules/patch-package": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.1.tgz", + "integrity": "sha512-VsKRIA8f5uqHQ7NGhwIna6Bx6D9s/1iXlA1hthBVBEbkq+t4kXD0HHt+rJhf/Z+Ci0F/HCB2hvn0qLdLG+Qxlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^4.1.2", + "ci-info": "^3.7.0", + "cross-spawn": "^7.0.3", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^10.0.0", + "json-stable-stringify": "^1.0.2", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.6", + "open": "^7.4.2", + "semver": "^7.5.3", + "slash": "^2.0.0", + "tmp": "^0.2.4", + "yaml": "^2.2.2" + }, + "bin": { + "patch-package": "index.js" + }, + "engines": { + "node": ">=14", + "npm": ">5" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -18554,6 +18808,7 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -18569,6 +18824,7 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -18597,6 +18853,7 @@ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } @@ -18804,6 +19061,19 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", @@ -18841,6 +19111,7 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -18853,6 +19124,7 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -18872,10 +19144,11 @@ } }, "node_modules/signal-exit": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.1.tgz", - "integrity": "sha512-uUWsN4aOxJAS8KOuf3QMyFtgm1pkb6I+KRZbRF/ghdf5T7sM+B1lLLzPDxswUjkmHyxQAVzEgG35E3NzDM9GVw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, + "license": "ISC", "engines": { "node": ">=14" }, @@ -18883,6 +19156,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/smob": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/smob/-/smob-1.4.1.tgz", @@ -18949,17 +19232,21 @@ "dev": true }, "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/string-width-cjs": { @@ -18968,6 +19255,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -18977,11 +19265,29 @@ "node": ">=8" } }, - "node_modules/strip-ansi": { + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -18989,12 +19295,29 @@ "node": ">=8" } }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -19002,11 +19325,22 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/sucrase": { "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", @@ -19025,10 +19359,11 @@ } }, "node_modules/sucrase/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -19038,6 +19373,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } @@ -19047,6 +19383,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -19062,26 +19399,12 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/sucrase/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, "node_modules/sucrase/node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -19092,6 +19415,19 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -19157,6 +19493,7 @@ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", "dev": true, + "license": "MIT", "dependencies": { "any-promise": "^1.0.0" } @@ -19166,6 +19503,7 @@ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", "dev": true, + "license": "MIT", "dependencies": { "thenify": ">= 3.1.0 < 4" }, @@ -19173,6 +19511,16 @@ "node": ">=0.8" } }, + "node_modules/tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -19209,7 +19557,8 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/tsscmp": { "version": "1.0.6", @@ -19234,6 +19583,16 @@ "node": ">= 0.6" } }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -19243,6 +19602,12 @@ "node": ">= 0.8" } }, + "node_modules/urlpattern-polyfill": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.1.0.tgz", + "integrity": "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==", + "license": "MIT" + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -19260,10 +19625,11 @@ } }, "node_modules/wc-compiler": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/wc-compiler/-/wc-compiler-0.17.0.tgz", - "integrity": "sha512-08d31qhYjlJiTEfTEW3kpSdcNnx0j0eGaUIA1/+oyczJCxya7+tvbQ/Tz3wbS2kzd/t8iSxNYdfhpf43o6RVuA==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/wc-compiler/-/wc-compiler-0.18.0.tgz", + "integrity": "sha512-zwhalz5/C3c/FOpIfq2S8sjSwNJEC3vJdS/Ddfvm41kuxGywu6cec7f68y5l31x+mERMa2I5DuX6gLOt4w2Qkw==", "dev": true, + "license": "MIT", "dependencies": { "@projectevergreen/acorn-jsx-esm": "~0.1.0", "acorn": "^8.14.0", @@ -19281,6 +19647,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -19291,12 +19658,31 @@ "node": ">= 8" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -19309,6 +19695,67 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -19336,6 +19783,19 @@ } } }, + "node_modules/yaml": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, "node_modules/zip-a-folder": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/zip-a-folder/-/zip-a-folder-2.0.0.tgz", diff --git a/package.json b/package.json index 4821c49..77e1bf7 100644 --- a/package.json +++ b/package.json @@ -23,11 +23,16 @@ "build": "greenwood build", "serve": "greenwood build && greenwood serve", "serve:netlify": "greenwood build && netlify dev", - "start": "npm run serve" + "start": "npm run serve", + "postinstall": "patch-package" + }, + "dependencies": { + "urlpattern-polyfill": "^10.1.0" }, "devDependencies": { - "@greenwood/cli": "~0.33.0", - "@greenwood/plugin-adapter-netlify": "~0.33.0" + "@greenwood/cli": "~0.34.0-alpha.1", + "@greenwood/plugin-adapter-netlify": "~0.34.0-alpha.1", + "patch-package": "^8.0.1" }, "optionalDependencies": { "@rollup/rollup-linux-x64-gnu": "^4.50.0" diff --git a/patches/@greenwood+cli+0.34.0-alpha.1.patch b/patches/@greenwood+cli+0.34.0-alpha.1.patch new file mode 100644 index 0000000..366726e --- /dev/null +++ b/patches/@greenwood+cli+0.34.0-alpha.1.patch @@ -0,0 +1,482 @@ +diff --git a/node_modules/@greenwood/cli/src/index.js b/node_modules/@greenwood/cli/src/index.js +index af47ef1..da76415 100755 +--- a/node_modules/@greenwood/cli/src/index.js ++++ b/node_modules/@greenwood/cli/src/index.js +@@ -3,6 +3,10 @@ import { generateCompilation } from "./lifecycles/compile.js"; + async function run(command) { + process.env.__GWD_COMMAND__ = command; + ++ if (!globalThis.URLPattern) { ++ await import("urlpattern-polyfill"); ++ } ++ + try { + console.info(`Running Greenwood with the ${command} command.`); + const compilation = await generateCompilation(); +diff --git a/node_modules/@greenwood/cli/src/lib/api-route-worker.js b/node_modules/@greenwood/cli/src/lib/api-route-worker.js +index 231e379..61f8825 100644 +--- a/node_modules/@greenwood/cli/src/lib/api-route-worker.js ++++ b/node_modules/@greenwood/cli/src/lib/api-route-worker.js +@@ -29,7 +29,7 @@ async function responseAsObject(response) { + }; + } + +-async function executeRouteModule({ href, request }) { ++async function executeRouteModule({ href, request, props }) { + const { body, headers = {}, method, url } = request; + const contentType = headers["content-type"] || ""; + // @ts-expect-error see https://github.com/microsoft/TypeScript/issues/42866 +@@ -47,11 +47,16 @@ async function executeRouteModule({ href, request }) { + header: headers, + body: format, + }), ++ { ++ props: { ++ ...props, ++ }, ++ }, + ); + + parentPort.postMessage(await responseAsObject(response)); + } + +-parentPort.on("message", async (task) => { +- await executeRouteModule(task); ++parentPort.on("message", async (task, props) => { ++ await executeRouteModule(task, props); + }); +diff --git a/node_modules/@greenwood/cli/src/lib/execute-route-module.js b/node_modules/@greenwood/cli/src/lib/execute-route-module.js +index 43f9534..3731201 100644 +--- a/node_modules/@greenwood/cli/src/lib/execute-route-module.js ++++ b/node_modules/@greenwood/cli/src/lib/execute-route-module.js +@@ -8,6 +8,7 @@ async function executeRouteModule({ + htmlContents = null, + scripts = [], + request, ++ props, + contentOptions = {}, + }) { + const data = { +@@ -35,10 +36,15 @@ async function executeRouteModule({ + + if (body) { + if (module.default) { +- const { html } = await renderToString(new URL(moduleUrl), false, { request, compilation }); ++ const { html } = await renderToString(new URL(moduleUrl), false, { ++ request, ++ compilation, ++ props, ++ }); + + data.body = html; + } else if (getBody) { ++ // TODO do we need to pass props here too? + data.body = await getBody(compilation, page, request); + } + } +diff --git a/node_modules/@greenwood/cli/src/lib/ssr-route-worker.js b/node_modules/@greenwood/cli/src/lib/ssr-route-worker.js +index b10d823..df15559 100644 +--- a/node_modules/@greenwood/cli/src/lib/ssr-route-worker.js ++++ b/node_modules/@greenwood/cli/src/lib/ssr-route-worker.js +@@ -11,6 +11,7 @@ async function executeModule({ + scripts = "[]", + request, + contentOptions = "{}", ++ props, + }) { + const { executeRouteModule } = await import(executeModuleUrl); + const data = await executeRouteModule({ +@@ -22,6 +23,7 @@ async function executeModule({ + scripts: JSON.parse(scripts), + request, + contentOptions: JSON.parse(contentOptions), ++ props, + }); + + parentPort.postMessage(data); +diff --git a/node_modules/@greenwood/cli/src/lib/url-utils.js b/node_modules/@greenwood/cli/src/lib/url-utils.js +new file mode 100644 +index 0000000..b42a2e4 +--- /dev/null ++++ b/node_modules/@greenwood/cli/src/lib/url-utils.js +@@ -0,0 +1,47 @@ ++function getDynamicSegmentsFromRoute({ route, relativePagePath, extension, basePath }) { ++ const dynamicRoute = route.replace("[", ":").replace("]", ""); ++ const pattern = new URLPattern({ pathname: route.replace("[", ":").replace("]", "") }); ++ const dynamicSegments = pattern.test(`https://example.com${basePath}${route}`); ++ const segmentKey = relativePagePath ++ .split("/") ++ [relativePagePath.split("/").length - 1].replace(extension, "") ++ .replace("[", "") ++ .replace("]", "") ++ .replace('.', ''); ++ ++ return { dynamicSegments, segmentKey, dynamicRoute }; ++} ++ ++function getMatchingDynamicApiRoute(apis, pathname) { ++ return Array.from(apis.keys()).find((key) => { ++ const route = apis.get(key); ++ return ( ++ route.segment && ++ new URLPattern({ pathname: `${route.segment.pathname}*` }).test( ++ `https://example.com${pathname}`, ++ ) ++ ); ++ }); ++} ++ ++function getMatchingDynamicSsrRoute(graph, pathname) { ++ return graph.find((node) => { ++ return ( ++ (pathname !== "/404/") !== "/404/" && ++ node.segment && ++ new URLPattern({ pathname: node.segment.pathname }).test(`https://example.com${pathname}`) ++ ); ++ }); ++} ++ ++function getPropsFromSegment(segment, pathname) { ++ return new URLPattern({ pathname: segment.pathname }).exec(`https://example.com${pathname}`) ++ .pathname.groups; ++} ++ ++export { ++ getDynamicSegmentsFromRoute, ++ getMatchingDynamicApiRoute, ++ getPropsFromSegment, ++ getMatchingDynamicSsrRoute, ++}; +diff --git a/node_modules/@greenwood/cli/src/lifecycles/bundle.js b/node_modules/@greenwood/cli/src/lifecycles/bundle.js +index 6149e09..1ef0356 100644 +--- a/node_modules/@greenwood/cli/src/lifecycles/bundle.js ++++ b/node_modules/@greenwood/cli/src/lifecycles/bundle.js +@@ -298,7 +298,7 @@ async function bundleSsrPages(compilation, optimizePlugins) { + // would be nice to see if this can be done in a single pass though... + await asyncForEach(ssrPages, async (page) => { + const { route } = page; +- let staticHtml = ""; ++ let staticHtml = ``; + + staticHtml = await getPageLayout(staticHtml, compilation, page); + staticHtml = await getAppLayout(staticHtml, compilation, page); +@@ -361,7 +361,7 @@ async function bundleSsrPages(compilation, optimizePlugins) { + + const moduleUrl = new URL('${relativeDepth}${pagesPathDiff}${pagePath.replace("./", "")}', import.meta.url); + +- export async function handler(request) { ++ export async function handler(request, props) { + const compilation = JSON.parse(\`${JSON.stringify({ + ...compilation, + graph: pruneGraph(compilation.graph), +@@ -371,11 +371,11 @@ async function bundleSsrPages(compilation, optimizePlugins) { + const page = JSON.parse(\`${JSON.stringify(pruneGraph([page])[0]) + .replace(/\\"/g, ""e") + .replace(/\\n/g, "")}\`); +- const data = await executeRouteModule({ moduleUrl, compilation, page, request, contentOptions: { body: true } }); ++ const data = await executeRouteModule({ moduleUrl, compilation, page, request, contentOptions: { body: true }, props }); + let staticHtml = \`${staticHtml}\`; + + if (data.body) { +- staticHtml = staticHtml.replace(\/\(.*)<\\/content-outlet>\/s, data.body); ++ staticHtml = staticHtml.replace(\/\(.*)<\\/output>\/s, data.body); + } + + return new Response(staticHtml, { +diff --git a/node_modules/@greenwood/cli/src/lifecycles/graph.js b/node_modules/@greenwood/cli/src/lifecycles/graph.js +index 90d4c16..9bf4183 100644 +--- a/node_modules/@greenwood/cli/src/lifecycles/graph.js ++++ b/node_modules/@greenwood/cli/src/lifecycles/graph.js +@@ -3,6 +3,7 @@ import fs from "node:fs/promises"; + import fm from "front-matter"; + import { checkResourceExists, requestAsObject } from "../lib/resource-utils.js"; + import { activeFrontmatterKeys } from "../lib/content-utils.js"; ++import { getDynamicSegmentsFromRoute } from "../lib/url-utils.js"; + import { Worker } from "node:worker_threads"; + + function getLabelFromRoute(_route) { +@@ -26,7 +27,12 @@ function getLabelFromRoute(_route) { + } + + function getIdFromRelativePathPath(relativePathPath, extension) { +- return relativePathPath.replace(`.${extension}`, "").replace("./", "").replace(/\//g, "-"); ++ return relativePathPath ++ .replace(`.${extension}`, "") ++ .replace("./", "") ++ .replace(/\//g, "-") ++ .replace("[", "-") ++ .replace("]", "-"); + } + + function trackCollectionsForPage(page, collections) { +@@ -104,7 +110,13 @@ const generateGraph = async (compilation) => { + + // TODO should API routes be run in isolation mode like SSR pages? + const { isolation } = await import(filenameUrl).then((module) => module); +- ++ const { dynamicSegments, segmentKey, dynamicRoute } = getDynamicSegmentsFromRoute({ ++ route, ++ relativePagePath, ++ extension, ++ basePath, ++ }); ++ console.log({ dynamicSegments, segmentKey, dynamicRoute }) + /* + * API Properties (per route) + *---------------------- +@@ -122,6 +134,7 @@ const generateGraph = async (compilation) => { + outputHref: new URL(relativePagePath, outputDir).href.replace(`.${extension}`, ".js"), + route: `${basePath}${route}`, + isolation, ++ segment: dynamicRoute.indexOf(':') > 0 ? { key: segmentKey, pathname: dynamicRoute } : null, + }); + } else if (isPage) { + let root = filename +@@ -245,6 +258,14 @@ const generateGraph = async (compilation) => { + * hydration: if this page needs hydration support + * servePage: signal that this is a custom page file type (static | dynamic) + */ ++ ++ const { dynamicSegments, segmentKey, dynamicRoute } = getDynamicSegmentsFromRoute({ ++ route, ++ relativePagePath, ++ extension, ++ basePath, ++ }); ++ + const page = { + id: decodeURIComponent(getIdFromRelativePathPath(relativePagePath, extension)), + label: decodeURIComponent(label), +@@ -264,6 +285,7 @@ const generateGraph = async (compilation) => { + isolation, + hydration, + servePage: isCustom, ++ segment: dynamicRoute.indexOf(':') > 0 ? { key: segmentKey, pathname: dynamicRoute } : null, + }; + + pages.push(page); +diff --git a/node_modules/@greenwood/cli/src/lifecycles/serve.js b/node_modules/@greenwood/cli/src/lifecycles/serve.js +index 10039a8..99dd3a1 100644 +--- a/node_modules/@greenwood/cli/src/lifecycles/serve.js ++++ b/node_modules/@greenwood/cli/src/lifecycles/serve.js +@@ -9,6 +9,11 @@ import { + transformKoaRequestIntoStandardRequest, + requestAsObject, + } from "../lib/resource-utils.js"; ++import { ++ getMatchingDynamicApiRoute, ++ getMatchingDynamicSsrRoute, ++ getPropsFromSegment, ++} from "../lib/url-utils.js"; + import { Readable } from "node:stream"; + import { Worker } from "node:worker_threads"; + +@@ -360,12 +365,30 @@ async function getHybridServer(compilation) { + app.use(async (ctx) => { + try { + const url = new URL(`http://localhost:${config.port}${ctx.url}`); ++ const { pathname } = url; + const matchingRoute = graph.find((node) => node.route === url.pathname) || { data: {} }; + const isApiRoute = manifest.apis.has(url.pathname); + const request = transformKoaRequestIntoStandardRequest(url, ctx.request); ++ const matchingApiRouteWithSegment = getMatchingDynamicApiRoute( ++ compilation.manifest.apis, ++ pathname, ++ ); ++ const matchingRouteWithSegment = ++ getMatchingDynamicSsrRoute(compilation.graph, pathname) || {}; ++ ++ if ( ++ !config.prerender && ++ (matchingRoute.isSSR || matchingRouteWithSegment.isSSR) && ++ !matchingRoute.prerender ++ ) { ++ const entryPointUrl = new URL( ++ matchingRoute?.outputHref ?? matchingRouteWithSegment.outputHref, ++ ); ++ const props = ++ matchingRouteWithSegment && matchingRouteWithSegment.segment ++ ? getPropsFromSegment(matchingRouteWithSegment.segment, pathname) ++ : undefined; + +- if (!config.prerender && matchingRoute.isSSR && !matchingRoute.prerender) { +- const entryPointUrl = new URL(matchingRoute.outputHref); + let html; + + if (matchingRoute.isolation || isolationMode) { +@@ -393,12 +416,13 @@ async function getHybridServer(compilation) { + routeModuleUrl: entryPointUrl.href, + request, + compilation: JSON.stringify(compilation), ++ props, + }); + }); + } else { + // @ts-expect-error see https://github.com/microsoft/TypeScript/issues/42866 + const { handler } = await import(entryPointUrl); +- const response = await handler(request, compilation); ++ const response = await handler(request, props); + + html = Readable.from(response.body); + } +@@ -407,8 +431,13 @@ async function getHybridServer(compilation) { + ctx.message = "OK"; + ctx.set("Content-Type", "text/html"); + ctx.status = 200; +- } else if (isApiRoute) { +- const apiRoute = manifest.apis.get(url.pathname); ++ } else if (isApiRoute || matchingApiRouteWithSegment) { ++ const apiRoute = manifest.apis.get(matchingApiRouteWithSegment ?? pathname); ++ const props = ++ matchingRouteWithSegment && apiRoute.segment ++ ? getPropsFromSegment(apiRoute.segment, pathname) ++ : undefined; ++ + const entryPointUrl = new URL(apiRoute.outputHref); + let body, status, headers, statusText; + +@@ -439,12 +468,13 @@ async function getHybridServer(compilation) { + worker.postMessage({ + href: entryPointUrl.href, + request: req, ++ props, + }); + }); + } else { + // @ts-expect-error see https://github.com/microsoft/TypeScript/issues/42866 + const { handler } = await import(entryPointUrl); +- const response = await handler(request); ++ const response = await handler(request, { props }); + + body = response.body; + status = response.status; +diff --git a/node_modules/@greenwood/cli/src/plugins/resource/plugin-api-routes.js b/node_modules/@greenwood/cli/src/plugins/resource/plugin-api-routes.js +index 4e2a2e8..d9a68d5 100644 +--- a/node_modules/@greenwood/cli/src/plugins/resource/plugin-api-routes.js ++++ b/node_modules/@greenwood/cli/src/plugins/resource/plugin-api-routes.js +@@ -4,6 +4,7 @@ + * + */ + import { requestAsObject } from "../../lib/resource-utils.js"; ++import { getMatchingDynamicApiRoute, getPropsFromSegment } from "../../lib/url-utils.js"; + import { Worker } from "node:worker_threads"; + + class ApiRoutesResource { +@@ -13,15 +14,34 @@ class ApiRoutesResource { + } + + async shouldServe(url) { ++ const { basePath } = this.compilation.config; + const { protocol, pathname } = url; + +- return protocol.startsWith("http") && this.compilation.manifest.apis.has(pathname); ++ if (!protocol.startsWith("http") || !pathname.startsWith(`${basePath}/api/`)) { ++ return; ++ } ++ ++ const matchingRouteWithSegment = getMatchingDynamicApiRoute( ++ this.compilation.manifest.apis, ++ pathname, ++ ); ++ ++ return matchingRouteWithSegment || this.compilation.manifest.apis.has(pathname); + } + + async serve(url, request) { +- const api = this.compilation.manifest.apis.get(url.pathname); ++ const { pathname } = url; ++ const matchingRouteWithSegment = getMatchingDynamicApiRoute( ++ this.compilation.manifest.apis, ++ pathname, ++ ); ++ const api = this.compilation.manifest.apis.get(matchingRouteWithSegment ?? pathname); + const apiUrl = new URL(api.pageHref); + const href = apiUrl.href; ++ const props = ++ matchingRouteWithSegment && api.segment ++ ? getPropsFromSegment(api.segment, pathname) ++ : undefined; + + if (process.env.__GWD_COMMAND__ === "develop") { + const workerUrl = new URL("../../lib/api-route-worker.js", import.meta.url); +@@ -40,7 +60,7 @@ class ApiRoutesResource { + } + }); + +- worker.postMessage({ href, request: req }); ++ worker.postMessage({ href, request: req, props }); + }); + const { headers, body, status, statusText } = response; + +@@ -52,7 +72,7 @@ class ApiRoutesResource { + } else { + const { handler } = await import(href); + +- return await handler(request); ++ return await handler(request, props); + } + } + } +diff --git a/node_modules/@greenwood/cli/src/plugins/resource/plugin-standard-html.js b/node_modules/@greenwood/cli/src/plugins/resource/plugin-standard-html.js +index f1d1153..ffd333d 100644 +--- a/node_modules/@greenwood/cli/src/plugins/resource/plugin-standard-html.js ++++ b/node_modules/@greenwood/cli/src/plugins/resource/plugin-standard-html.js +@@ -7,6 +7,7 @@ + import fs from "node:fs/promises"; + import { getPageLayout, getAppLayout, getGreenwoodScripts } from "../../lib/layout-utils.js"; + import { requestAsObject } from "../../lib/resource-utils.js"; ++import { getMatchingDynamicSsrRoute, getPropsFromSegment } from "../../lib/url-utils.js"; + import { Worker } from "node:worker_threads"; + import { parse } from "node-html-parser"; + +@@ -21,10 +22,13 @@ class StandardHtmlResource { + const { protocol, pathname } = url; + const hasMatchingPageRoute = this.compilation.graph.find((node) => node.route === pathname); + const isSPA = this.compilation.graph.find((node) => node.isSPA) && pathname.indexOf(".") < 0; ++ const matchingRouteWithSegment = getMatchingDynamicSsrRoute(this.compilation.graph, pathname); + + return ( + protocol.startsWith("http") && +- (hasMatchingPageRoute || (isSPA && request.headers.get("Accept").indexOf("text/html") >= 0)) ++ (hasMatchingPageRoute || ++ matchingRouteWithSegment || ++ (isSPA && request.headers.get("Accept").indexOf("text/html") >= 0)) + ); + } + +@@ -34,6 +38,8 @@ class StandardHtmlResource { + const { pathname } = url; + const isSpaRoute = this.compilation.graph.find((node) => node.isSPA); + const matchingRoute = this.compilation.graph.find((node) => node.route === pathname) || {}; ++ const matchingRouteWithSegment = ++ getMatchingDynamicSsrRoute(this.compilation.graph, pathname) || {}; + const { pageHref } = matchingRoute; + const filePath = + !matchingRoute.external && pageHref +@@ -68,12 +74,16 @@ class StandardHtmlResource { + break; + } + } +- } else if (matchingRoute.isSSR) { +- const routeModuleLocationUrl = new URL(pageHref); ++ } else if (matchingRoute.isSSR || matchingRouteWithSegment.isSSR) { ++ const routeModuleLocationUrl = new URL(pageHref ?? matchingRouteWithSegment.pageHref); + const routeWorkerUrl = this.compilation.config.plugins + .find((plugin) => plugin.type === "renderer") + .provider().executeModuleUrl; + const req = await requestAsObject(request); ++ const props = ++ matchingRouteWithSegment && matchingRouteWithSegment.segment ++ ? getPropsFromSegment(matchingRouteWithSegment.segment, pathname) ++ : undefined; + + await new Promise((resolve, reject) => { + const worker = new Worker(new URL("../../lib/ssr-route-worker.js", import.meta.url)); +@@ -101,6 +111,7 @@ class StandardHtmlResource { + contentOptions: JSON.stringify({ + body: true, + }), ++ props, + }); + }); + } diff --git a/patches/@greenwood+plugin-adapter-netlify+0.34.0-alpha.1.patch b/patches/@greenwood+plugin-adapter-netlify+0.34.0-alpha.1.patch new file mode 100644 index 0000000..d691116 --- /dev/null +++ b/patches/@greenwood+plugin-adapter-netlify+0.34.0-alpha.1.patch @@ -0,0 +1,122 @@ +diff --git a/node_modules/@greenwood/plugin-adapter-netlify/src/index.js b/node_modules/@greenwood/plugin-adapter-netlify/src/index.js +index 549448a..77ab519 100644 +--- a/node_modules/@greenwood/plugin-adapter-netlify/src/index.js ++++ b/node_modules/@greenwood/plugin-adapter-netlify/src/index.js +@@ -7,15 +7,26 @@ import { + import { zip } from "zip-a-folder"; + + // https://docs.netlify.com/functions/create/?fn-language=js +-function generateOutputFormat(id) { ++function generateOutputFormat(id, type, segmentKey) { + const handlerAlias = "$handler"; +- ++ // TODO: use `URLPattern` for extracting props after we upgrade to Node24 ++ const extractProps = segmentKey ++ ? type === 'page' ++ ? `const props = { ${segmentKey}: rawUrl.split('/')[rawUrl.split('/').length - 2] }` ++ : `const props = { ${segmentKey}: rawUrl.split('?')[0].split('/').pop() }` ++ : 'const props = {}'; ++ // const path = segment ? segment.pathname : route; ++ // export const config = { ++ // path: ['${path}'] ++ // }; + return ` + import { handler as ${handlerAlias} } from './${id}.js'; + + export async function handler (event, context = {}) { + const { rawUrl, body, headers = {}, httpMethod } = event; + const contentType = headers['content-type'] || ''; ++ ${extractProps} ++ console.log({ rawUrl, body, headers, httpMethod }); + let format = body; + + if (['GET', 'HEAD'].includes(httpMethod.toUpperCase())) { +@@ -41,7 +52,11 @@ function generateOutputFormat(id) { + method: httpMethod, + headers: new Headers(headers) + }); +- const response = await ${handlerAlias}(request, context); ++ // TODO: what to do about context? ++ // const response = await ${handlerAlias}(request, context); ++ const response = '${type}' === 'page' ++ ? await ${handlerAlias}(request, props) ++ : await ${handlerAlias}(request, { props }); + + return { + statusCode: response.status, +@@ -52,10 +67,10 @@ function generateOutputFormat(id) { + `; + } + +-async function setupOutputDirectory(id, outputRoot, outputType) { ++async function setupOutputDirectory(id, outputRoot, outputType, segmentKey) { + const entryPoint = outputType === "api" ? id : `${id}.route`; + const filename = outputType === "api" ? `api-${id}` : id; +- const outputFormat = generateOutputFormat(entryPoint); ++ const outputFormat = generateOutputFormat(entryPoint, outputType, segmentKey); + + await fs.mkdir(outputRoot, { recursive: true }); + await fs.writeFile(new URL(`./${filename}.js`, outputRoot), outputFormat); +@@ -101,14 +116,14 @@ async function netlifyAdapter(compilation) { + await fs.mkdir(adapterOutputUrl, { recursive: true }); + + for (const page of ssrPages) { +- const { id, outputHref, route } = page; ++ const { id, outputHref, route, segment } = page; + const outputType = "page"; + const chunks = (await fs.readdir(outputDir)).filter( + (file) => file.startsWith(`${id}.route.chunk`) && file.endsWith(".js"), + ); + const outputRoot = new URL(`./${id}/`, adapterOutputScratchUrl); + +- await setupOutputDirectory(id, outputRoot, outputType); ++ await setupOutputDirectory(id, outputRoot, outputType, segment?.key); + + // handle user's actual route entry file + await fs.cp( +@@ -131,17 +146,21 @@ async function netlifyAdapter(compilation) { + projectDirectory, + ); + +- redirects += `${route} /.netlify/functions/${id} 200 ++ console.log({ segment, route, id }); ++ redirects += segment ++ ? `${segment.pathname.replace(`/:${segment.key}/`, `/:${segment.key}`)} /.netlify/functions/${id} 200 ++` ++ : `${route} /.netlify/functions/${id} 200 + `; + } + + for (const [key, value] of apiRoutes.entries()) { + const outputType = "api"; +- const { id, outputHref, route } = apiRoutes.get(key); ++ const { id, outputHref, route, segment } = apiRoutes.get(key); + const outputRoot = new URL(`./api/${id}/`, adapterOutputScratchUrl); + const { assets = [] } = value; + +- await setupOutputDirectory(id, outputRoot, outputType); ++ await setupOutputDirectory(id, outputRoot, outputType, segment?.key); + + await fs.cp(new URL(outputHref), new URL(`./${id}.js`, outputRoot), { recursive: true }); + +@@ -155,11 +174,18 @@ async function netlifyAdapter(compilation) { + // https://github.com/netlify/netlify-lambda/issues/90#issuecomment-486047201 + await createOutputZip(id, outputType, outputRoot, projectDirectory); + +- redirects += `${route} /.netlify/functions/api-${id} 200 ++ console.log({ segment, route, id }); ++ redirects += segment ++ ? `${segment.pathname} /.netlify/functions/api-${id} 200 ++` ++ : `${route} /.netlify/functions/api-${id} 200 + `; +- } ++} + ++ // id: "/product/[id]", ++ // pattern: /^\/product\/([^/]+?)\/?$/, + if (redirects !== "") { ++ console.log({ redirects, outputDir }) + await fs.writeFile(new URL("./_redirects", outputDir), redirects); + } + } diff --git a/src/components/card.js b/src/components/card.js index 767db13..40c3bc8 100644 --- a/src/components/card.js +++ b/src/components/card.js @@ -14,7 +14,11 @@ export default class Card extends HTMLElement { if (!this.shadowRoot) { const thumbnail = this.getAttribute('thumbnail'); const title = this.getAttribute('title'); + const id = this.getAttribute('id'); const template = document.createElement('template'); + const link = id + ? `View Item Details` + : ''; template.innerHTML = `