diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..3d9f77f --- /dev/null +++ b/.dockerignore @@ -0,0 +1,33 @@ +# build output +dist/ + +# generated types +.astro/ + +# dependencies +node_modules/ + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# environment variables +#.env +#.env.production + +# macOS-specific files +.DS_Store + +# jetbrains setting folder +.idea/ + +# VS Code setting folder +.vscode/ + +# git repository isn't needed inside the volume +.git/ + +# workaround: https://github.com/npm/cli/issues/4828 +#package-lock.json diff --git a/.env.example b/.env.example index b66d22b..52e2379 100644 --- a/.env.example +++ b/.env.example @@ -2,8 +2,17 @@ AMAZON_PA_ACCESS_KEY=AAAABBBBCCCCDDDDEEEE AMAZON_PA_SECRET_KEY=ABCDABCDABCDABCDABCDABCDABCDABCDABCDAB AMAZON_PA_HOST=webservices.amazon.com AMAZON_PA_REGION=us-east-1 -AMAZON_PA_PARTNER_TYPE=Associate +AMAZON_PA_PARTNER_TYPE=Associates AMAZON_PA_PARTNER_TAG=yourpartnertag-20 GOOGLE_ADSENSE_ADS_TXT="google.com, pub-1234567890abcdef, DIRECT, fedcba9876543210" GOOGLE_ANALYTICS_GTAG=G-1234567890 -SITE_URL=http://localhost \ No newline at end of file +SITE_URL=http://localhost +PORT=4321 +WEBHOOK_PORT=3210 +STRAPI_URL="http://localhost:1337" +STRAPI_API_TOKEN=... +SQUIDEX_APP_NAME= +SQUIDEX_CLIENT_ID= +SQUIDEX_CLIENT_SECRET= +SQUIDEX_ENVIRONMENT=http:// +SQUIDEX_PUBLIC_URL=https:/// \ No newline at end of file diff --git a/.gitignore b/.gitignore index 016b59e..1283530 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,6 @@ pnpm-debug.log* # jetbrains setting folder .idea/ + +# VS Code setting folder +.vscode/ diff --git a/.yarnrc.yml b/.yarnrc.yml new file mode 100644 index 0000000..7f3d03f --- /dev/null +++ b/.yarnrc.yml @@ -0,0 +1 @@ +nodeLinker: "node-modules" diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..781d827 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,45 @@ +FROM node:lts AS core +WORKDIR /opt/app + +FROM core AS base +#COPY package.json package-lock.json ./ +#workaround: https://github.com/npm/cli/issues/4828 +RUN apt update && apt upgrade -y +RUN npm install -g npm@latest +RUN npm install -g pnpm +COPY package.json package-lock.json .yarnrc.yml ./ + +#FROM base AS prod-deps +#RUN pnpm install --fix-lockfile +#RUN pnpm install --lockfile-only +#RUN pnpm install --prod +#RUN npm install --omit=dev + +FROM base AS build-deps +RUN pnpm install --fix-lockfile +RUN pnpm install --lockfile-only +RUN pnpm install +#RUN npm install + +FROM build-deps AS copy +COPY . . + +FROM copy AS build +RUN pnpm run astro build +# RUN npm run build +#RUN npm run-script astro build + +FROM base AS runtime +#COPY --from=prod-deps /opt/app/node_modules ./node_modules +COPY --from=build-deps /opt/app/node_modules ./node_modules +COPY --from=copy /opt/app . +COPY --from=build /opt/app/dist ./dist + +ENV HOST=0.0.0.0 +ENV PORT=4321 +ENV WEBHOOK_PORT=3210 + +EXPOSE 4321 3210 + +CMD pnpm run server +#CMD bash diff --git a/astro.config.mjs b/astro.config.mjs index 124cd35..192d181 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -1,35 +1,65 @@ import { defineConfig } from 'astro/config'; -import sitemap from '@astrojs/sitemap'; import { loadEnv } from "vite"; -import { ALL_PRODUCTS } from './src/data/products'; +import node from '@astrojs/node'; +import sitemap from '@astrojs/sitemap'; import react from "@astrojs/react"; +import commonjs from 'vite-plugin-commonjs' + const { SITE_URL } = loadEnv(process.env.NODE_ENV, process.cwd(), ""); -function generateRedirectsForAmazonProductIds() { - let redirects = {}; - for (let p = 0; p < ALL_PRODUCTS.length; p++) { - let product = ALL_PRODUCTS[p]; - if (product.amazonProductId && product.slug !== product.amazonProductId) { - redirects[`/${product.amazonProductId}`] = `/${product.slug}`; - } - } - return redirects; -} + +// this was used for static generation, but now we're using SSR +// import { ALL_PRODUCTS } from './src/data/products'; +// function generateRedirectsForAmazonProductIds() { +// let redirects = {}; +// for (let p = 0; p < ALL_PRODUCTS.length; p++) { +// let product = ALL_PRODUCTS[p]; +// if (product.ASIN && product.slug !== product.ASIN) { +// redirects[`/${product.ASIN}`] = `/${product.slug}`; +// } +// } +// return redirects; +// } // https://astro.build/config export default defineConfig({ site: SITE_URL || 'http://localhost', integrations: [sitemap(), react()], - redirects: generateRedirectsForAmazonProductIds() - // vite: { + // redirects: generateRedirectsForAmazonProductIds(), + output: 'server', + server: { + host: '0.0.0.0', + }, + // i18n: { + // defaultLocale: 'en', + // locales: ['en', 'es', 'fr'], + // }, + adapter: node({ + mode: 'middleware', + }), + build: { + commonjsOptions: { + transformMixedEsModules: true, + }, + rollupOptions: { + external: ['@squidex/squidex', '../squidex-node-sdk'], + } + }, + vite: { + plugins: [ + commonjs(/**/) + ], + optimizeDeps: { + exclude: ['@squidex/squidex', '../squidex-node-sdk'], + } // resolve: { // alias: [ // { find: /^swiper\/(.+)/, replacement: 'swiper/$1 '}, // ], // }, - // }, + }, // experimental: { // resolveId: (id) => { // if (id === 'swiper') { diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..3055817 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,32 @@ +version: "3" +services: + dashersupply-app: + container_name: dashersupply-app + build: . + image: runtime:latest + restart: unless-stopped + env_file: .env + environment: + SITE_URL: ${SITE_URL} + PORT: ${PORT} + WEBHOOK_PORT: ${WEBHOOK_PORT} + STRAPI_URL: ${STRAPI_URL} + STRAPI_API_TOKEN: ${STRAPI_API_TOKEN} + NODE_ENV: ${NODE_ENV} + #volumes: + # - dashersupply-app:/opt/app + ports: + - "4321:4321" + - "3210:3210" + networks: + - dashersupply + # depends_on: + # - dashersupply-strapi + +volumes: + dashersupply-app: + +networks: + dashersupply: + name: Dasher Supply + driver: bridge diff --git a/package-lock.json b/package-lock.json index a60cf85..2b97e93 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,46 +1,65 @@ { "name": "dashersupply", - "version": "0.0.1", + "version": "0.2.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "dashersupply", - "version": "0.0.1", + "version": "0.2.1", "dependencies": { - "@astrojs/check": "^0.8.1", - "@astrojs/react": "^3.6.0", + "@astrojs/check": "^0.9.3", + "@astrojs/node": "^8.3.3", + "@astrojs/react": "^3.6.2", "@astrojs/sitemap": "^3.1.6", + "@fastify/middie": "^8.3.1", + "@fastify/static": "^7.0.4", + "@squidex/squidex": "^1.2.1", + "@strapi/blocks-react-renderer": "^1.0.1", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", - "amazon-pa-api5-node-ts": "^2.1.4", - "astro": "^4.11.5", + "amazon-pa-api5-node-ts": "^2.3.0", + "astro": "^4.14.2", + "axios": "^1.7.4", "bootstrap": "^5.3.3", "cheerio": "*", + "commander": "^12.1.0", "crawlee": "^3.0.0", "dotenv": "^16.4.5", "dotenv-expand": "^11.0.6", + "fastify": "^4.28.1", + "luxon": "^3.5.0", "markdown-it": "^14.0.0", "markdown-it-attrs": "^4.1.6", + "memfs": "^4.11.1", + "multer": "^1.4.5-lts.1", + "ollama": "^0.5.8", "playwright": "*", "react": "^18.3.1", "react-dom": "^18.3.1", + "slugify": "^1.6.6", "swiper": "^11.1.4", + "vite": "^5.3.5", + "vite-plugin-commonjs": "^0.10.1", "vitest": "^2.0.3" }, "devDependencies": { "@apify/tsconfig": "^0.1.0", "@types/jquery": "^3.5.30", + "@types/luxon": "^3.4.2", "@types/markdown-it": "^14.1.1", "@types/markdown-it-attrs": "^4.1.3", + "@types/multer": "^1.4.11", "@types/node": "^20.0.0", + "ts-node": "^10.9.2", "tsx": "^4.4.0", "typescript": "^5.5.3" } }, "node_modules/@ampproject/remapping": { "version": "2.3.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -50,24 +69,21 @@ } }, "node_modules/@apify/consts": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/@apify/consts/-/consts-2.28.0.tgz", - "integrity": "sha512-WmBCWRqqCQGqk8H5j8o1uvU8T7sBXUL9s0Y4PMfN7YkkFGYSXtipVcT/Rx0CXHG7eGshsazh+A1nlBi3mtOAgg==", - "license": "Apache-2.0" + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/@apify/consts/-/consts-2.29.0.tgz", + "integrity": "sha512-+P9voQVy9j2mq0PDGgj+Ftdd2ZTimwYdaxzdu1aHw5iQXTHHJVH9x4rjMNTdmGhZP/znExmvU1tRFEyy29Vjmg==" }, "node_modules/@apify/datastructures": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@apify/datastructures/-/datastructures-2.0.2.tgz", - "integrity": "sha512-IN9A0s2SCHoZZE1tf4xKgk4fxHM5/0I/UrXhWbn/rSv7E5sA2o0NyHdwcMY2Go9f5qd+E7VAbX6WnESTE6GLeA==", - "license": "Apache-2.0" + "integrity": "sha512-IN9A0s2SCHoZZE1tf4xKgk4fxHM5/0I/UrXhWbn/rSv7E5sA2o0NyHdwcMY2Go9f5qd+E7VAbX6WnESTE6GLeA==" }, "node_modules/@apify/log": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@apify/log/-/log-2.5.2.tgz", - "integrity": "sha512-gq7n0vNGYuvCUd5chHub/yE+pnUBrmz1IkxzXW4fz/PS31Xh+YH3o2t+2KM3SHhbOINCAQQKbr4RBtrlJ/USPg==", - "license": "Apache-2.0", + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/@apify/log/-/log-2.5.5.tgz", + "integrity": "sha512-eO7xNH89urnenB+BDdtm565qAbSt741NNVKWaoJniEziDa1oRBfPieaikVSizyfrgjhiH+3W/tnWTU9VJWi2rw==", "dependencies": { - "@apify/consts": "^2.28.0", + "@apify/consts": "^2.29.0", "ansi-colors": "^4.1.1" } }, @@ -75,7 +91,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@apify/ps-tree/-/ps-tree-1.2.0.tgz", "integrity": "sha512-VHIswI7rD/R4bToeIDuJ9WJXt+qr5SdhfoZ9RzdjmCs9mgy7l0P4RugQEUCcU+WB4sfImbd4CKwzXcn0uYx1yw==", - "license": "MIT", "dependencies": { "event-stream": "3.3.4" }, @@ -87,45 +102,39 @@ } }, "node_modules/@apify/pseudo_url": { - "version": "2.0.42", - "resolved": "https://registry.npmjs.org/@apify/pseudo_url/-/pseudo_url-2.0.42.tgz", - "integrity": "sha512-J0Zrl6u0ZAwredFLGdBp/m0D6Pl8zo1vCxdIYtI2Hk8j5yl7vwwqsrRUiFqqwR10wCuFXjQr1rjulk+nkx5RUA==", - "license": "Apache-2.0", + "version": "2.0.46", + "resolved": "https://registry.npmjs.org/@apify/pseudo_url/-/pseudo_url-2.0.46.tgz", + "integrity": "sha512-dWjSN94lVbxrBbwChF7k4KT8xAMe/fUxFFekzxtUDZVKX0YE+4vqTTV5Ow9rcOcysRsD9idiHRdYOoaFcNhhzw==", "dependencies": { - "@apify/log": "^2.5.2", - "@sapphire/shapeshift": "^3.6.0" + "@apify/log": "^2.5.5" } }, "node_modules/@apify/timeout": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/@apify/timeout/-/timeout-0.3.1.tgz", - "integrity": "sha512-sLIuOqfySki/7AXiQ1yZoCI07vX6aYFLgP6YaJ8e8YLn8CFsRERma/Crxcz0zyCaxhc7C7EPgcs1O+p/djZchw==", - "license": "Apache-2.0" + "integrity": "sha512-sLIuOqfySki/7AXiQ1yZoCI07vX6aYFLgP6YaJ8e8YLn8CFsRERma/Crxcz0zyCaxhc7C7EPgcs1O+p/djZchw==" }, "node_modules/@apify/tsconfig": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@apify/tsconfig/-/tsconfig-0.1.0.tgz", "integrity": "sha512-ba9Y6AMocRucO3AVTb6GM2V+oy1wByNlCDzamK+IC+aqU3pCgJwSN87uNu6iEgu+uetsqYvVbXJYakwiQO1LGA==", - "dev": true, - "license": "Apache-2.0" + "dev": true }, "node_modules/@apify/utilities": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@apify/utilities/-/utilities-2.10.3.tgz", - "integrity": "sha512-Y2T752McA+ToKBVUpCTaskdKd3kRypTdAYh6HzZ4i2xv7HGTOv34WrMb4HQ6U92gEJaMbrz/chNmHKO2X2SwXg==", - "license": "Apache-2.0", + "version": "2.10.6", + "resolved": "https://registry.npmjs.org/@apify/utilities/-/utilities-2.10.6.tgz", + "integrity": "sha512-nDaH6+R0AobyjVQWIdQpQULlp7zJB//xebI7VWzTygu2ZYfNS/8yP6hBUDtT6wwNwzgo+bXXZywdUIGgBO6cyQ==", "dependencies": { - "@apify/consts": "^2.28.0", - "@apify/log": "^2.5.2" + "@apify/consts": "^2.29.0", + "@apify/log": "^2.5.5" } }, "node_modules/@astrojs/check": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@astrojs/check/-/check-0.8.1.tgz", - "integrity": "sha512-QTzCuiBWll3SLSe7OsWtWyZRbwChXwxM4Y0Jb84jdPOdYobzHad9ubU7V23qmK3Y0BNwgzCbEP5C5FPVitb31Q==", - "license": "MIT", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@astrojs/check/-/check-0.9.3.tgz", + "integrity": "sha512-I6Dz45bMI5YRbp4yK2LKWsHH3/kkHRGdPGruGkLap6pqxhdcNh7oCgN04Ac+haDfc9ow5BYPGPmEhkwef15GQQ==", "dependencies": { - "@astrojs/language-server": "^2.11.1", + "@astrojs/language-server": "^2.14.1", "chokidar": "^3.5.3", "fast-glob": "^3.3.1", "kleur": "^4.1.5", @@ -139,38 +148,37 @@ } }, "node_modules/@astrojs/compiler": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.8.2.tgz", - "integrity": "sha512-2v2N2oDnMH6+CX1Wn6f45Afa4tdkUMutdx8pJaokfaOYnAU+u6+UK7o7sXqydKro1cLwVmmOIJv6AqiXnAdLDA==", - "license": "MIT" + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.10.3.tgz", + "integrity": "sha512-bL/O7YBxsFt55YHU021oL+xz+B/9HvGNId3F9xURN16aeqDK9juHGktdkCSXz+U4nqFACq6ZFvWomOzhV+zfPw==" }, "node_modules/@astrojs/internal-helpers": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.4.1.tgz", - "integrity": "sha512-bMf9jFihO8YP940uD70SI/RDzIhUHJAolWVcO1v5PUivxGKvfLZTLTVVxEYzGYyPsA3ivdLNqMnL5VgmQySa+g==", - "license": "MIT" + "integrity": "sha512-bMf9jFihO8YP940uD70SI/RDzIhUHJAolWVcO1v5PUivxGKvfLZTLTVVxEYzGYyPsA3ivdLNqMnL5VgmQySa+g==" }, "node_modules/@astrojs/language-server": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/@astrojs/language-server/-/language-server-2.11.1.tgz", - "integrity": "sha512-WSIBBUK9lSeVD4KhPiZk2u3wsXdj7WEYvYPPs8ZsgbSVIOzUJWAKVcITHiXmcXlzZB5ubK44YUN/Hq+f2GeMyQ==", - "license": "MIT", + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/@astrojs/language-server/-/language-server-2.14.1.tgz", + "integrity": "sha512-mkKtCTPRD4dyKdAqIP0zmmPyO/ZABOqFESnaVca47Dg/sAagJnDSEsDUDzNbHFh1+9Dj1o5y4iwNsxJboGdaNg==", "dependencies": { - "@astrojs/compiler": "^2.7.0", + "@astrojs/compiler": "^2.10.3", + "@astrojs/yaml2ts": "^0.2.1", "@jridgewell/sourcemap-codec": "^1.4.15", - "@volar/kit": "~2.4.0-alpha.15", - "@volar/language-core": "~2.4.0-alpha.15", - "@volar/language-server": "~2.4.0-alpha.15", - "@volar/language-service": "~2.4.0-alpha.15", - "@volar/typescript": "~2.4.0-alpha.15", + "@volar/kit": "~2.4.0", + "@volar/language-core": "~2.4.0", + "@volar/language-server": "~2.4.0", + "@volar/language-service": "~2.4.0", + "@volar/typescript": "~2.4.0", "fast-glob": "^3.2.12", "muggle-string": "^0.4.1", - "volar-service-css": "0.0.59", - "volar-service-emmet": "0.0.59", - "volar-service-html": "0.0.59", - "volar-service-prettier": "0.0.59", - "volar-service-typescript": "0.0.59", - "volar-service-typescript-twoslash-queries": "0.0.59", + "volar-service-css": "0.0.61", + "volar-service-emmet": "0.0.61", + "volar-service-html": "0.0.61", + "volar-service-prettier": "0.0.61", + "volar-service-typescript": "0.0.61", + "volar-service-typescript-twoslash-queries": "0.0.61", + "volar-service-yaml": "0.0.61", "vscode-html-languageservice": "^5.2.0", "vscode-uri": "^3.0.8" }, @@ -191,10 +199,9 @@ } }, "node_modules/@astrojs/markdown-remark": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-5.1.1.tgz", - "integrity": "sha512-rkWWjR9jVo0LAMxQ2+T19RKbQUa7NwBGhFj03bAz3hGf3blqeBIXs1NSPpizshO5kZzcOqKe8OlG6XpYO8esHg==", - "license": "MIT", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-5.2.0.tgz", + "integrity": "sha512-vWGM24KZXz11jR3JO+oqYU3T2qpuOi4uGivJ9SQLCAI01+vEkHC60YJMRvHPc+hwd60F7euNs1PeOEixIIiNQw==", "dependencies": { "@astrojs/prism": "3.1.0", "github-slugger": "^2.0.0", @@ -207,20 +214,31 @@ "remark-gfm": "^4.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.0", - "remark-smartypants": "^3.0.1", - "shiki": "^1.9.0", + "remark-smartypants": "^3.0.2", + "shiki": "^1.10.3", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.0.0", "unist-util-visit-parents": "^6.0.1", - "vfile": "^6.0.1" + "vfile": "^6.0.2" + } + }, + "node_modules/@astrojs/node": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/@astrojs/node/-/node-8.3.3.tgz", + "integrity": "sha512-idrKhnnPSi0ABV+PCQsRQqVNwpOvVDF/+fkwcIiE8sr9J8EMvW9g/oyAt8T4X2OBJ8FUzYPL8klfCdG7r0eB5g==", + "dependencies": { + "send": "^0.18.0", + "server-destroy": "^1.0.1" + }, + "peerDependencies": { + "astro": "^4.2.0" } }, "node_modules/@astrojs/prism": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.1.0.tgz", "integrity": "sha512-Z9IYjuXSArkAUx3N6xj6+Bnvx8OdUSHA8YoOgyepp3+zJmtVYJIl/I18GozdJVW1p5u/CNpl3Km7/gwTJK85cw==", - "license": "MIT", "dependencies": { "prismjs": "^1.29.0" }, @@ -229,9 +247,9 @@ } }, "node_modules/@astrojs/react": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@astrojs/react/-/react-3.6.0.tgz", - "integrity": "sha512-YGLxy5jCU9xKG/HAvYsWMcvrQVIhqVe0Sda3Z5UtP32rfXeG6B9J1xQvnx+kRSFTpIrj+7AwPSDSehLbCHJ56w==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/@astrojs/react/-/react-3.6.2.tgz", + "integrity": "sha512-fK29lYI7zK/KG4ZBy956x4dmauZcZ18osFkuyGa8r3gmmCQa2NZ9XNu9WaVYEUm0j89f4Gii4tbxLoyM8nk2MA==", "dependencies": { "@vitejs/plugin-react": "^4.3.1", "ultrahtml": "^1.5.3" @@ -250,7 +268,6 @@ "version": "3.1.6", "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.1.6.tgz", "integrity": "sha512-1Qp2NvAzVImqA6y+LubKi1DVhve/hXXgFvB0szxiipzh7BvtuKe4oJJ9dXSqaubaTkt4nMa6dv6RCCAYeB6xaQ==", - "license": "MIT", "dependencies": { "sitemap": "^7.1.2", "stream-replace-string": "^2.0.0", @@ -259,7 +276,8 @@ }, "node_modules/@astrojs/telemetry": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.1.0.tgz", + "integrity": "sha512-/ca/+D8MIKEC8/A9cSaPUqQNZm+Es/ZinRv0ZAzvu2ios7POQSsVD+VOj7/hypWNsNM3T7RpfgNq7H2TU1KEHA==", "dependencies": { "ci-info": "^4.0.0", "debug": "^4.3.4", @@ -273,9 +291,18 @@ "node": "^18.17.1 || ^20.3.0 || >=21.0.0" } }, + "node_modules/@astrojs/yaml2ts": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@astrojs/yaml2ts/-/yaml2ts-0.2.1.tgz", + "integrity": "sha512-CBaNwDQJz20E5WxzQh4thLVfhB3JEEGz72wRA+oJp6fQR37QLAqXZJU0mHC+yqMOQ6oj0GfRPJrz6hjf+zm6zA==", + "dependencies": { + "yaml": "^2.5.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.24.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dependencies": { "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" @@ -285,26 +312,28 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.7", - "license": "MIT", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", + "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.7", - "license": "MIT", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helpers": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -319,18 +348,12 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/generator": { - "version": "7.24.7", - "license": "MIT", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", + "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", "dependencies": { - "@babel/types": "^7.24.7", + "@babel/types": "^7.25.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -341,7 +364,8 @@ }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.24.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", "dependencies": { "@babel/types": "^7.24.7" }, @@ -350,12 +374,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.7", - "license": "MIT", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", "dependencies": { - "@babel/compat-data": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -363,47 +388,10 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.7", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.24.7", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.24.7", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-module-imports": { "version": "7.24.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "dependencies": { "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7" @@ -413,14 +401,14 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.7", - "license": "MIT", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-module-imports": "^7.24.7", "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" }, "engines": { "node": ">=6.9.0" @@ -430,15 +418,17 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.7", - "license": "MIT", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { "version": "7.24.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "dependencies": { "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7" @@ -447,43 +437,37 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.7", - "license": "MIT", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { "version": "7.24.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.7", - "license": "MIT", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.7", - "license": "MIT", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", + "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -491,7 +475,8 @@ }, "node_modules/@babel/highlight": { "version": "7.24.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dependencies": { "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", @@ -502,42 +487,13 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk/node_modules/ansi-styles": { - "version": "3.2.1", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk/node_modules/ansi-styles/node_modules/color-convert": { - "version": "1.9.3", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/chalk/node_modules/ansi-styles/node_modules/color-convert/node_modules/color-name": { - "version": "1.1.3", - "license": "MIT" - }, "node_modules/@babel/parser": { - "version": "7.24.7", - "license": "MIT", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", + "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "dependencies": { + "@babel/types": "^7.25.2" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -547,7 +503,8 @@ }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.24.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -559,14 +516,15 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.24.7", - "license": "MIT", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz", + "integrity": "sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/types": "^7.25.2" }, "engines": { "node": ">=6.9.0" @@ -604,29 +562,28 @@ } }, "node_modules/@babel/template": { - "version": "7.24.7", - "license": "MIT", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.7", - "license": "MIT", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", + "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.2", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -635,10 +592,11 @@ } }, "node_modules/@babel/types": { - "version": "7.24.7", - "license": "MIT", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", + "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", "dependencies": { - "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-string-parser": "^7.24.8", "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, @@ -647,17 +605,16 @@ } }, "node_modules/@crawlee/basic": { - "version": "3.10.5", - "resolved": "https://registry.npmjs.org/@crawlee/basic/-/basic-3.10.5.tgz", - "integrity": "sha512-GJq/yYc7gUDA70ogd46C7WU12ALRu2+/R2xuWMYMcXWrDnNfqlxnH68MY8+L9b4SmWuXf9ZuYk1ticmwiqRdjA==", - "license": "Apache-2.0", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@crawlee/basic/-/basic-3.11.1.tgz", + "integrity": "sha512-bWQIAkV4DhCGCsZ1Tb3GHH2Ouz1QTvxAiYvEifu6y/mxAxRcIdH25iyLlvI/5ii7hyQ5sTdhiw8k487ohMvRVA==", "dependencies": { "@apify/log": "^2.4.0", "@apify/timeout": "^0.3.0", "@apify/utilities": "^2.7.10", - "@crawlee/core": "3.10.5", - "@crawlee/types": "3.10.5", - "@crawlee/utils": "3.10.5", + "@crawlee/core": "3.11.1", + "@crawlee/types": "3.11.1", + "@crawlee/utils": "3.11.1", "csv-stringify": "^6.2.0", "fs-extra": "^11.0.0", "got-scraping": "^4.0.0", @@ -671,10 +628,9 @@ } }, "node_modules/@crawlee/basic/node_modules/type-fest": { - "version": "4.20.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.20.1.tgz", - "integrity": "sha512-R6wDsVsoS9xYOpy8vgeBlqpdOyzJ12HNfQhC/aAKWM3YoCV9TtunJzh/QpkMgeDhkoynDcw5f1y+qF9yc/HHyg==", - "license": "(MIT OR CC0-1.0)", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.25.0.tgz", + "integrity": "sha512-bRkIGlXsnGBRBQRAY56UXBm//9qH4bmJfFvq83gSz41N282df+fjy8ofcEgc1sM8geNt5cl6mC2g9Fht1cs8Aw==", "engines": { "node": ">=16" }, @@ -683,16 +639,15 @@ } }, "node_modules/@crawlee/browser": { - "version": "3.10.5", - "resolved": "https://registry.npmjs.org/@crawlee/browser/-/browser-3.10.5.tgz", - "integrity": "sha512-jkJUXU1Z8FYWSuEpgCy6xTKigNrf/7zHMfc4FHUQz4vtSWnoOyOaIVNjpRyVwX7+A6q+L74HRFp5iJCAvPeuSQ==", - "license": "Apache-2.0", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@crawlee/browser/-/browser-3.11.1.tgz", + "integrity": "sha512-B7M9NcACdKz5vyRCUam227bcXr//szpQ3xo47rykTDEXmAD2KMoXiugc7PZXXfoBOLj9BoSdKXkeX3O2+DQYiQ==", "dependencies": { "@apify/timeout": "^0.3.0", - "@crawlee/basic": "3.10.5", - "@crawlee/browser-pool": "3.10.5", - "@crawlee/types": "3.10.5", - "@crawlee/utils": "3.10.5", + "@crawlee/basic": "3.11.1", + "@crawlee/browser-pool": "3.11.1", + "@crawlee/types": "3.11.1", + "@crawlee/utils": "3.11.1", "ow": "^0.28.1", "tslib": "^2.4.0", "type-fest": "^4.0.0" @@ -714,15 +669,14 @@ } }, "node_modules/@crawlee/browser-pool": { - "version": "3.10.5", - "resolved": "https://registry.npmjs.org/@crawlee/browser-pool/-/browser-pool-3.10.5.tgz", - "integrity": "sha512-UEXnnnWeWasJfpgS8EYxKM/CUFkWZMw6pZi+OQCMN30ePvZKuyDo4vkLZ2ucZoJtD5UeSyF/DZGmvzHr42vMqQ==", - "license": "Apache-2.0", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@crawlee/browser-pool/-/browser-pool-3.11.1.tgz", + "integrity": "sha512-Svf/5Sn8pFEZSUO7Ro0dxyW+YJC19H+jm+gQn3ekf/MluLD+wSK+NJJIb4qjpgqleq0N+1Akm3jDInGV8gu3qg==", "dependencies": { "@apify/log": "^2.4.0", "@apify/timeout": "^0.3.0", - "@crawlee/core": "3.10.5", - "@crawlee/types": "3.10.5", + "@crawlee/core": "3.11.1", + "@crawlee/types": "3.11.1", "fingerprint-generator": "^2.0.6", "fingerprint-injector": "^2.0.5", "lodash.merge": "^4.6.2", @@ -754,7 +708,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -769,7 +722,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -778,10 +730,9 @@ } }, "node_modules/@crawlee/browser/node_modules/type-fest": { - "version": "4.20.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.20.1.tgz", - "integrity": "sha512-R6wDsVsoS9xYOpy8vgeBlqpdOyzJ12HNfQhC/aAKWM3YoCV9TtunJzh/QpkMgeDhkoynDcw5f1y+qF9yc/HHyg==", - "license": "(MIT OR CC0-1.0)", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.25.0.tgz", + "integrity": "sha512-bRkIGlXsnGBRBQRAY56UXBm//9qH4bmJfFvq83gSz41N282df+fjy8ofcEgc1sM8geNt5cl6mC2g9Fht1cs8Aw==", "engines": { "node": ">=16" }, @@ -790,14 +741,13 @@ } }, "node_modules/@crawlee/cheerio": { - "version": "3.10.5", - "resolved": "https://registry.npmjs.org/@crawlee/cheerio/-/cheerio-3.10.5.tgz", - "integrity": "sha512-O/VGesrviquL4Hdnrurt2U13d8MrX42I7jnf/6C9gScwGWH6BiJmR0p7CIm0zhN8l4i95Qd78OjrfsJS8Rjt7Q==", - "license": "Apache-2.0", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@crawlee/cheerio/-/cheerio-3.11.1.tgz", + "integrity": "sha512-PFQNp9LniBVYVuJvPn1WIUrEpioTxYOSsd3CcbMF+pGN1tCyeeqt6O8bJAfAs+P99AEoZNruCkblv0uPg8q3wQ==", "dependencies": { - "@crawlee/http": "3.10.5", - "@crawlee/types": "3.10.5", - "@crawlee/utils": "3.10.5", + "@crawlee/http": "3.11.1", + "@crawlee/types": "3.11.1", + "@crawlee/utils": "3.11.1", "cheerio": "^1.0.0-rc.12", "htmlparser2": "^9.0.0", "tslib": "^2.4.0" @@ -806,32 +756,12 @@ "node": ">=16.0.0" } }, - "node_modules/@crawlee/cheerio/node_modules/htmlparser2": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", - "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.1.0", - "entities": "^4.5.0" - } - }, "node_modules/@crawlee/cli": { - "version": "3.10.5", - "resolved": "https://registry.npmjs.org/@crawlee/cli/-/cli-3.10.5.tgz", - "integrity": "sha512-1NggRahtDpL5/Y2ofK3knmjGm2QignEiMx1540vMsJROP7ggYNjeBECXyyvavrZ9l/eUHRlur+pE17Loci7/kA==", - "license": "Apache-2.0", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@crawlee/cli/-/cli-3.11.1.tgz", + "integrity": "sha512-XX4naPjGIRbyr/+ceCFUPbGEXKfUA/xILUa6DWrqp1NOt7+LftIEoQO16WGg6vDo8efYx+ZWpsreei9qPSMPzw==", "dependencies": { - "@crawlee/templates": "3.10.5", + "@crawlee/templates": "3.11.1", "ansi-colors": "^4.1.3", "fs-extra": "^11.0.0", "inquirer": "^8.2.4", @@ -847,10 +777,9 @@ } }, "node_modules/@crawlee/core": { - "version": "3.10.5", - "resolved": "https://registry.npmjs.org/@crawlee/core/-/core-3.10.5.tgz", - "integrity": "sha512-L82EXDTAVZOmLbH5s7BcHCryPNGc//eiLCs0eyS1LIR7sf+dUUosfpmZyNfLNkku0Zysir/RUftqhe9JNT/evQ==", - "license": "Apache-2.0", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@crawlee/core/-/core-3.11.1.tgz", + "integrity": "sha512-Sy7qZJ3pJiolJVQ6YqNp+q8VbGuJfwWaYMFmaWqT+oY74V7Kz3BGw+o677shJ7cIQ+MlXGb8DD+G5fQqBCKswg==", "dependencies": { "@apify/consts": "^2.20.0", "@apify/datastructures": "^2.0.0", @@ -858,9 +787,9 @@ "@apify/pseudo_url": "^2.0.30", "@apify/timeout": "^0.3.0", "@apify/utilities": "^2.7.10", - "@crawlee/memory-storage": "3.10.5", - "@crawlee/types": "3.10.5", - "@crawlee/utils": "3.10.5", + "@crawlee/memory-storage": "3.11.1", + "@crawlee/types": "3.11.1", + "@crawlee/utils": "3.11.1", "@sapphire/async-queue": "^1.5.1", "@types/tough-cookie": "^4.0.2", "@vladfrangu/async_event_emitter": "^2.2.2", @@ -882,10 +811,9 @@ } }, "node_modules/@crawlee/core/node_modules/type-fest": { - "version": "4.20.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.20.1.tgz", - "integrity": "sha512-R6wDsVsoS9xYOpy8vgeBlqpdOyzJ12HNfQhC/aAKWM3YoCV9TtunJzh/QpkMgeDhkoynDcw5f1y+qF9yc/HHyg==", - "license": "(MIT OR CC0-1.0)", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.25.0.tgz", + "integrity": "sha512-bRkIGlXsnGBRBQRAY56UXBm//9qH4bmJfFvq83gSz41N282df+fjy8ofcEgc1sM8geNt5cl6mC2g9Fht1cs8Aw==", "engines": { "node": ">=16" }, @@ -894,16 +822,15 @@ } }, "node_modules/@crawlee/http": { - "version": "3.10.5", - "resolved": "https://registry.npmjs.org/@crawlee/http/-/http-3.10.5.tgz", - "integrity": "sha512-4VG2Z3lh4N5CIZglAdxEE+sk1xEyZ2fi05jJmtay9Li87Z/q524fjkefL5tUqGba8p5dDWEgRO1cnoVv9sXrrg==", - "license": "Apache-2.0", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@crawlee/http/-/http-3.11.1.tgz", + "integrity": "sha512-Jn9U6JQBfmN+ALMpv3JX472qATrTrU6bakoSXC4pY9c5Sr9I+SQqoZq8yEFmE2XZjQgPAhjv8WrysY/yenFMwA==", "dependencies": { "@apify/timeout": "^0.3.0", "@apify/utilities": "^2.7.10", - "@crawlee/basic": "3.10.5", - "@crawlee/types": "3.10.5", - "@crawlee/utils": "3.10.5", + "@crawlee/basic": "3.11.1", + "@crawlee/types": "3.11.1", + "@crawlee/utils": "3.11.1", "@types/content-type": "^1.1.5", "cheerio": "^1.0.0-rc.12", "content-type": "^1.0.4", @@ -919,10 +846,9 @@ } }, "node_modules/@crawlee/http/node_modules/type-fest": { - "version": "4.20.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.20.1.tgz", - "integrity": "sha512-R6wDsVsoS9xYOpy8vgeBlqpdOyzJ12HNfQhC/aAKWM3YoCV9TtunJzh/QpkMgeDhkoynDcw5f1y+qF9yc/HHyg==", - "license": "(MIT OR CC0-1.0)", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.25.0.tgz", + "integrity": "sha512-bRkIGlXsnGBRBQRAY56UXBm//9qH4bmJfFvq83gSz41N282df+fjy8ofcEgc1sM8geNt5cl6mC2g9Fht1cs8Aw==", "engines": { "node": ">=16" }, @@ -931,16 +857,15 @@ } }, "node_modules/@crawlee/jsdom": { - "version": "3.10.5", - "resolved": "https://registry.npmjs.org/@crawlee/jsdom/-/jsdom-3.10.5.tgz", - "integrity": "sha512-cWJ4om0XC9+HLHmP6JgfkKrS/kgxDfqcY0nfdeSAB/JdJxylCxS8Wqu5BIj9DhK3W0/NI6vJ7nUT5tuarbGXyQ==", - "license": "Apache-2.0", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@crawlee/jsdom/-/jsdom-3.11.1.tgz", + "integrity": "sha512-NhUQUDz4l9qJHSpmHDGUBMvHUwQJTYTBF5u4tTMF1ehMJEw8ofJA1uXUrV3VtW/nBOvBqCM0XAvWOlzH95LUCA==", "dependencies": { "@apify/timeout": "^0.3.0", "@apify/utilities": "^2.7.10", - "@crawlee/http": "3.10.5", - "@crawlee/types": "3.10.5", - "@crawlee/utils": "3.10.5", + "@crawlee/http": "3.11.1", + "@crawlee/types": "3.11.1", + "@crawlee/utils": "3.11.1", "@types/jsdom": "^21.0.0", "cheerio": "^1.0.0-rc.12", "jsdom": "^24.0.0", @@ -952,15 +877,14 @@ } }, "node_modules/@crawlee/linkedom": { - "version": "3.10.5", - "resolved": "https://registry.npmjs.org/@crawlee/linkedom/-/linkedom-3.10.5.tgz", - "integrity": "sha512-/VVcaClkYjITFk9yGdkO7k2sUF2hoEuBqb96eS0dcrRSp0i374LCW5yMYSOAgjSDmWKeV6/iuhDCj1zFwKNKaw==", - "license": "Apache-2.0", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@crawlee/linkedom/-/linkedom-3.11.1.tgz", + "integrity": "sha512-Ete9ShFBhKsYOQRcUEs8GB+Tkx7lDVnr+QQs1hw+gdemuXChX9Nppo/Iz0OH8JYWh9nZUOyTvvqrrBJLFKWtow==", "dependencies": { "@apify/timeout": "^0.3.0", "@apify/utilities": "^2.7.10", - "@crawlee/http": "3.10.5", - "@crawlee/types": "3.10.5", + "@crawlee/http": "3.11.1", + "@crawlee/types": "3.11.1", "linkedom": "^0.18.0", "ow": "^0.28.2", "tslib": "^2.4.0" @@ -970,13 +894,12 @@ } }, "node_modules/@crawlee/memory-storage": { - "version": "3.10.5", - "resolved": "https://registry.npmjs.org/@crawlee/memory-storage/-/memory-storage-3.10.5.tgz", - "integrity": "sha512-Pnq8WwrWxwImN/AIZHc5xi4hKSwSEk/jjiN//jZPLLZlqPxqUzwqIMd8SIlexhAptiJ/K2LaR0y7o6VQk5trqw==", - "license": "Apache-2.0", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@crawlee/memory-storage/-/memory-storage-3.11.1.tgz", + "integrity": "sha512-k/rgBmoHE1CC68Jj5flaXJC9wWbScedvJFnqJy52bc2UiYooZvLVykkRXIBfY+aBuuILWvJdrZoT1OIEpm2EgQ==", "dependencies": { "@apify/log": "^2.4.0", - "@crawlee/types": "3.10.5", + "@crawlee/types": "3.11.1", "@sapphire/async-queue": "^1.5.0", "@sapphire/shapeshift": "^3.0.0", "content-type": "^1.0.4", @@ -991,19 +914,18 @@ } }, "node_modules/@crawlee/playwright": { - "version": "3.10.5", - "resolved": "https://registry.npmjs.org/@crawlee/playwright/-/playwright-3.10.5.tgz", - "integrity": "sha512-u95ObQHTWfOaKR1q1CwPp2A8DW5Xl1fF1LSyhAL6OjhywBd9eYazeEoUs/WA7SG98LcNZEyT7Nh3gH3UJ08t2g==", - "license": "Apache-2.0", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@crawlee/playwright/-/playwright-3.11.1.tgz", + "integrity": "sha512-baPuOHZW81pn/tOmJ54ySa+lSq3jpQEVXZbr52JWt5a/GEyMneJlyDNnk8fEVea0GMLZL3d3D5Bgm3NNsMHOzQ==", "dependencies": { "@apify/datastructures": "^2.0.0", "@apify/log": "^2.4.0", "@apify/timeout": "^0.3.1", - "@crawlee/browser": "3.10.5", - "@crawlee/browser-pool": "3.10.5", - "@crawlee/core": "3.10.5", - "@crawlee/types": "3.10.5", - "@crawlee/utils": "3.10.5", + "@crawlee/browser": "3.11.1", + "@crawlee/browser-pool": "3.11.1", + "@crawlee/core": "3.11.1", + "@crawlee/types": "3.11.1", + "@crawlee/utils": "3.11.1", "cheerio": "^1.0.0-rc.12", "idcac-playwright": "^0.1.2", "jquery": "^3.6.0", @@ -1027,17 +949,16 @@ } }, "node_modules/@crawlee/puppeteer": { - "version": "3.10.5", - "resolved": "https://registry.npmjs.org/@crawlee/puppeteer/-/puppeteer-3.10.5.tgz", - "integrity": "sha512-YjEu01Vozn7Qy9s+Gx1qKo6VgxvC9RfPFYeUeDV9rH/6oQ5aKVudj/y2nhgpC+5Ca+ZLbzPCdfXDTHZ4TFBycg==", - "license": "Apache-2.0", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@crawlee/puppeteer/-/puppeteer-3.11.1.tgz", + "integrity": "sha512-1BMIHbmMyKooGR6n6inOKH2uM+cFQclg0mdyn9IQRl/O7tULSNL1jUE0UhdSCNYbKmQV+oxocw6cT/BtqEaCmw==", "dependencies": { "@apify/datastructures": "^2.0.0", "@apify/log": "^2.4.0", - "@crawlee/browser": "3.10.5", - "@crawlee/browser-pool": "3.10.5", - "@crawlee/types": "3.10.5", - "@crawlee/utils": "3.10.5", + "@crawlee/browser": "3.11.1", + "@crawlee/browser-pool": "3.11.1", + "@crawlee/types": "3.11.1", + "@crawlee/utils": "3.11.1", "cheerio": "^1.0.0-rc.12", "devtools-protocol": "*", "idcac-playwright": "^0.1.2", @@ -1058,10 +979,9 @@ } }, "node_modules/@crawlee/templates": { - "version": "3.10.5", - "resolved": "https://registry.npmjs.org/@crawlee/templates/-/templates-3.10.5.tgz", - "integrity": "sha512-ZLDecHJFO/2GQCEqf8ycRMD+VBnQRZMbukdGS135/LBS7MbV/qfAB9a9k3Z0e3d7Kjo1xA4ZmNJueqhukemlyA==", - "license": "Apache-2.0", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@crawlee/templates/-/templates-3.11.1.tgz", + "integrity": "sha512-dkd+oSH0gysSZWOpACMtiTWGkIKkCz0OlEqHRBmx10Q6rA4fzoR3gzYOnnmu6MR6YY3n+HFdOuegMttFGy1EHQ==", "dependencies": { "ansi-colors": "^4.1.3", "inquirer": "^9.0.0", @@ -1077,7 +997,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", "engines": { "node": ">=8" } @@ -1086,7 +1005,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -1101,7 +1019,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1113,47 +1030,47 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@crawlee/templates/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@crawlee/templates/node_modules/cli-width": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "license": "ISC", "engines": { "node": ">= 12" } }, + "node_modules/@crawlee/templates/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@crawlee/templates/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, "node_modules/@crawlee/templates/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==", - "license": "MIT" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/@crawlee/templates/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==", - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@crawlee/templates/node_modules/inquirer": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.3.1.tgz", - "integrity": "sha512-A5IdVr1I04XqPlwrGgTJMKmzRg5ropqNpSeqo0vj1ZmluSCNSFaPZz4eazdPrhVcZfej7fCEYvD2NYa1KjkTJA==", - "license": "MIT", + "version": "9.3.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.3.6.tgz", + "integrity": "sha512-riK/iQB2ctwkpWYgjjWIRv3MBLt2gzb2Sj0JNQNbyTXgyXsLWcDPJ5WS5ZDTCx7BRFnJsARtYh+58fjP5M2Y0Q==", "dependencies": { "@inquirer/figures": "^1.0.3", "ansi-escapes": "^4.3.2", @@ -1161,12 +1078,12 @@ "external-editor": "^3.1.0", "mute-stream": "1.0.0", "ora": "^5.4.1", - "picocolors": "^1.0.1", "run-async": "^3.0.0", "rxjs": "^7.8.1", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0" + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" }, "engines": { "node": ">=18" @@ -1176,7 +1093,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "license": "MIT", "engines": { "node": ">=8" } @@ -1185,7 +1101,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -1197,7 +1112,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "license": "MIT", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -1209,44 +1123,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@crawlee/templates/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@crawlee/templates/node_modules/mute-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@crawlee/templates/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@crawlee/templates/node_modules/ora": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "license": "MIT", "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -1265,39 +1153,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@crawlee/templates/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@crawlee/templates/node_modules/run-async": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", - "license": "MIT", "engines": { "node": ">=0.12.0" } }, - "node_modules/@crawlee/templates/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, "node_modules/@crawlee/templates/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==", - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -1311,7 +1178,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -1323,7 +1189,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -1335,7 +1200,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -1346,10 +1210,9 @@ } }, "node_modules/@crawlee/types": { - "version": "3.10.5", - "resolved": "https://registry.npmjs.org/@crawlee/types/-/types-3.10.5.tgz", - "integrity": "sha512-AnOBspUU4Cydjh/2dg3miKgHHvlTrG2Ccrfhe98y19bpD2ghteEpaJ6aiClOUH73Z9jlhaR0Ztb1mOwNp/R+8A==", - "license": "Apache-2.0", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@crawlee/types/-/types-3.11.1.tgz", + "integrity": "sha512-rbI8HIQonnjMFz8PBWss7AZ1Vmbiwx3C5BbJYYz7z9rd6hoDle/3K61GJJWLjClWpafZr1ywLpeJ2IKTGsonRw==", "dependencies": { "tslib": "^2.4.0" }, @@ -1358,21 +1221,20 @@ } }, "node_modules/@crawlee/utils": { - "version": "3.10.5", - "resolved": "https://registry.npmjs.org/@crawlee/utils/-/utils-3.10.5.tgz", - "integrity": "sha512-u8a35NmLrcXBvN2fsTBXxpBrmUADp0qcy3tsDDs4UAju+URiikEdiU0K+McX3k3A2XwcT/zJBy+x6+4Jzs3JCg==", - "license": "Apache-2.0", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@crawlee/utils/-/utils-3.11.1.tgz", + "integrity": "sha512-PeNQDte8V7rr6t4N5L1Rdvt+KmeMrnMb19H6QqXtBTFBawJfgfyYxTHRgDcDJ/a1ZZ77gZE7UgZ2PsX9DqwAsA==", "dependencies": { "@apify/log": "^2.4.0", "@apify/ps-tree": "^1.2.0", - "@crawlee/types": "3.10.5", + "@crawlee/types": "3.11.1", "@types/sax": "^1.2.7", "cheerio": "^1.0.0-rc.12", "file-type": "^19.0.0", "got-scraping": "^4.0.3", "ow": "^0.28.1", "robots-parser": "^3.0.1", - "sax": "^1.3.0", + "sax": "^1.4.1", "tslib": "^2.4.0", "whatwg-mimetype": "^4.0.0" }, @@ -1380,11 +1242,32 @@ "node": ">=16.0.0" } }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@emmetio/abbreviation": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/@emmetio/abbreviation/-/abbreviation-2.3.3.tgz", "integrity": "sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==", - "license": "MIT", "dependencies": { "@emmetio/scanner": "^1.0.4" } @@ -1393,7 +1276,6 @@ "version": "2.1.8", "resolved": "https://registry.npmjs.org/@emmetio/css-abbreviation/-/css-abbreviation-2.1.8.tgz", "integrity": "sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==", - "license": "MIT", "dependencies": { "@emmetio/scanner": "^1.0.4" } @@ -1402,7 +1284,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/@emmetio/css-parser/-/css-parser-0.4.0.tgz", "integrity": "sha512-z7wkxRSZgrQHXVzObGkXG+Vmj3uRlpM11oCZ9pbaz0nFejvCDmAiNDpY75+wgXOcffKpj4rzGtwGaZxfJKsJxw==", - "license": "MIT", "dependencies": { "@emmetio/stream-reader": "^2.2.0", "@emmetio/stream-reader-utils": "^0.1.0" @@ -1412,7 +1293,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/@emmetio/html-matcher/-/html-matcher-1.3.0.tgz", "integrity": "sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==", - "license": "ISC", "dependencies": { "@emmetio/scanner": "^1.0.0" } @@ -1420,27 +1300,350 @@ "node_modules/@emmetio/scanner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@emmetio/scanner/-/scanner-1.0.4.tgz", - "integrity": "sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==", - "license": "MIT" + "integrity": "sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==" }, "node_modules/@emmetio/stream-reader": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@emmetio/stream-reader/-/stream-reader-2.2.0.tgz", - "integrity": "sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==", - "license": "MIT" + "integrity": "sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==" }, "node_modules/@emmetio/stream-reader-utils": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@emmetio/stream-reader-utils/-/stream-reader-utils-0.1.0.tgz", - "integrity": "sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==", - "license": "MIT" + "integrity": "sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==" }, - "node_modules/@esbuild/win32-x64": { + "node_modules/@emnapi/runtime": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.2.0.tgz", + "integrity": "sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], - "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], "optional": true, "os": [ "win32" @@ -1449,38 +1652,502 @@ "node": ">=12" } }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.33.4", + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ - "x64" + "ia32" ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ "win32" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0", - "npm": ">=9.6.5", - "pnpm": ">=7.1.0", - "yarn": ">=3.2.0" + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@fastify/accept-negotiator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@fastify/accept-negotiator/-/accept-negotiator-1.1.0.tgz", + "integrity": "sha512-OIHZrb2ImZ7XG85HXOONLcJWGosv7sIvM2ifAPQVhg9Lv7qdmMBNVaai4QTdyuaqbKM5eO6sLSQOYI7wEQeCJQ==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@fastify/ajv-compiler": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-3.6.0.tgz", + "integrity": "sha512-LwdXQJjmMD+GwLOkP7TVC68qa+pSSogeWWmznRJ/coyTcfe9qA05AHFSe1eZFwK6q+xVRpChnvFUkf1iYaSZsQ==", + "dependencies": { + "ajv": "^8.11.0", + "ajv-formats": "^2.1.1", + "fast-uri": "^2.0.0" + } + }, + "node_modules/@fastify/error": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.4.1.tgz", + "integrity": "sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==" + }, + "node_modules/@fastify/fast-json-stringify-compiler": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.3.0.tgz", + "integrity": "sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==", + "dependencies": { + "fast-json-stringify": "^5.7.0" + } + }, + "node_modules/@fastify/merge-json-schemas": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.1.1.tgz", + "integrity": "sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + } + }, + "node_modules/@fastify/middie": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@fastify/middie/-/middie-8.3.1.tgz", + "integrity": "sha512-qrQ8U3iCdjNum3+omnIvAyz21ifFx+Pp5jYW7PJJ7b9ueKTCPXsH6vEvaZQrjEZvOpTnWte+CswfBODWD0NqYQ==", + "dependencies": { + "@fastify/error": "^3.2.0", + "fastify-plugin": "^4.0.0", + "path-to-regexp": "^6.1.0", + "reusify": "^1.0.4" + } + }, + "node_modules/@fastify/send": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fastify/send/-/send-2.1.0.tgz", + "integrity": "sha512-yNYiY6sDkexoJR0D8IDy3aRP3+L4wdqCpvx5WP+VtEU58sn7USmKynBzDQex5X42Zzvw2gNzzYgP90UfWShLFA==", + "dependencies": { + "@lukeed/ms": "^2.0.1", + "escape-html": "~1.0.3", + "fast-decode-uri-component": "^1.0.1", + "http-errors": "2.0.0", + "mime": "^3.0.0" + } + }, + "node_modules/@fastify/static": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@fastify/static/-/static-7.0.4.tgz", + "integrity": "sha512-p2uKtaf8BMOZWLs6wu+Ihg7bWNBdjNgCwDza4MJtTqg+5ovKmcbgbR9Xs5/smZ1YISfzKOCNYmZV8LaCj+eJ1Q==", + "dependencies": { + "@fastify/accept-negotiator": "^1.0.0", + "@fastify/send": "^2.0.0", + "content-disposition": "^0.5.3", + "fastify-plugin": "^4.0.0", + "fastq": "^1.17.0", + "glob": "^10.3.4" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "cpu": [ + "wasm32" + ], + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.2.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@inquirer/figures": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.3.tgz", - "integrity": "sha512-ErXXzENMH5pJt5/ssXV0DfWUZqly8nGzf0UcBV9xTnP+KyffE2mqyxIMBrZ8ijQck2nU0TQm40EQB53YreyWHw==", - "license": "MIT", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.5.tgz", + "integrity": "sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==", "engines": { "node": ">=18" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "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==" + }, + "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==", + "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/@jridgewell/gen-mapping": { "version": "0.3.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -1492,33 +2159,97 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { "version": "1.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "license": "MIT" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.1.0.tgz", + "integrity": "sha512-zlQONA+msXPPwHWZMKFVS78ewFczIll5lXiVPwFPCZUsrOKdxc2AvxU1HoNBmMRhqDZUR9HkC3UOm+6pME6Xsg==", + "dependencies": { + "@jsonjoy.com/base64": "^1.1.1", + "@jsonjoy.com/util": "^1.1.2", + "hyperdyperid": "^1.2.0", + "thingies": "^1.20.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.3.0.tgz", + "integrity": "sha512-Cebt4Vk7k1xHy87kHY7KSPLT77A7Ev7IfOblyLZhtYEhrdQ6fX4EoLq3xOQ3O/DRMEh2ok5nyC180E+ABS8Wmw==", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@lukeed/ms": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@lukeed/ms/-/ms-2.0.2.tgz", + "integrity": "sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==", + "engines": { + "node": ">=8" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -1529,14 +2260,16 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -1545,33 +2278,252 @@ "node": ">= 8" } }, + "node_modules/@oslojs/encoding": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-0.4.1.tgz", + "integrity": "sha512-hkjo6MuIK/kQR5CrGNdAPZhS01ZCXuWDRJ187zh6qqF2+yMHZpD9fAYpX8q2bOO6Ryhl3XpCT6kUX76N8hhm4Q==" + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "license": "MIT", "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" } }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.18.0", + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.0.tgz", + "integrity": "sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.0.tgz", + "integrity": "sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.0.tgz", + "integrity": "sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.0.tgz", + "integrity": "sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.0.tgz", + "integrity": "sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.0.tgz", + "integrity": "sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.0.tgz", + "integrity": "sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.0.tgz", + "integrity": "sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.0.tgz", + "integrity": "sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.0.tgz", + "integrity": "sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.0.tgz", + "integrity": "sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.0.tgz", + "integrity": "sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.0.tgz", + "integrity": "sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.0.tgz", + "integrity": "sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.0.tgz", + "integrity": "sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.0.tgz", + "integrity": "sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@sapphire/async-queue": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.2.tgz", - "integrity": "sha512-7X7FFAA4DngXUl95+hYbUF19bp1LGiffjJtu7ygrZrbdCSsdDDBaSjB7Akw0ZbOu6k0xpXyljnJ6/RZUvLfRdg==", - "license": "MIT", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.3.tgz", + "integrity": "sha512-x7zadcfJGxFka1Q3f8gCts1F0xMwCKbZweM85xECGI0hBTeIZJGGCrHgLggihBoprlQ/hBmDR5LKfIPqnmHM3w==", "engines": { "node": ">=v14.0.0", "npm": ">=7.0.0" @@ -1581,7 +2533,6 @@ "version": "3.9.7", "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.9.7.tgz", "integrity": "sha512-4It2mxPSr4OGn4HSQWGmhFMsNFGfFVhWeRPCRwbH972Ek2pzfGRZtb0pJ4Ze6oIzcyh2jw7nUDa6qGlWofgd9g==", - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "lodash": "^4.17.21" @@ -1593,35 +2544,63 @@ "node_modules/@sec-ant/readable-stream": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", - "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", - "license": "MIT" + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==" }, "node_modules/@shikijs/core": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.10.3.tgz", - "integrity": "sha512-D45PMaBaeDHxww+EkcDQtDAtzv00Gcsp72ukBtaLSmqRvh0WgGMq3Al0rl1QQBZfuneO75NXMIzEZGFitThWbg==", - "license": "MIT", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.14.1.tgz", + "integrity": "sha512-KyHIIpKNaT20FtFPFjCQB5WVSTpLR/n+jQXhWHWVUMm9MaOaG9BGOG0MSyt7yA4+Lm+4c9rTc03tt3nYzeYSfw==", "dependencies": { "@types/hast": "^3.0.4" } }, "node_modules/@sindresorhus/is": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-6.3.1.tgz", - "integrity": "sha512-FX4MfcifwJyFOI2lPoX7PQxCqx8BG1HCho7WdiXwpEQx1Ycij0JxkfYtGK7yqNScrZGSlt6RE6sw8QYoH7eKnQ==", - "license": "MIT", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.0.0.tgz", + "integrity": "sha512-WDTlVTyvFivSOuyvMeedzg2hdoBLZ3f1uNVuEida2Rl9BrfjrIRjWA/VZIrMRLvSwJYCAlCRA3usDt1THytxWQ==", "engines": { - "node": ">=16" + "node": ">=18" }, "funding": { "url": "https://github.com/sindresorhus/is?sponsor=1" } }, + "node_modules/@squidex/squidex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@squidex/squidex/-/squidex-1.2.1.tgz", + "integrity": "sha512-+M+J0YulxrflMFdX8ebdlC40sqL/HvlFCCnUoLSD39NmiVb7bUPbgO+wlzsP2wzZMYkK0ASSvBKTQSreYX0fSA==", + "dependencies": { + "@types/url-join": "4.0.1", + "@ungap/url-search-params": "0.2.2", + "axios": "0.27.2", + "form-data": "4.0.0", + "js-base64": "3.7.2", + "url-join": "4.0.1" + } + }, + "node_modules/@squidex/squidex/node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/@strapi/blocks-react-renderer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@strapi/blocks-react-renderer/-/blocks-react-renderer-1.0.1.tgz", + "integrity": "sha512-oHQNYstM/361oJIKrj6wDFZhDWHg8M8sF7SszqWr8zH2EaoL36ccLq7F2XFWShYQshuKgY+V6axurDaxWo4jQA==", + "hasInstallScript": true, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, "node_modules/@szmarczak/http-timer": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "license": "MIT", "dependencies": { "defer-to-connect": "^2.0.1" }, @@ -1632,12 +2611,36 @@ "node_modules/@tokenizer/token": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", - "license": "MIT" + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true }, "node_modules/@types/babel__core": { "version": "7.20.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -1648,14 +2651,16 @@ }, "node_modules/@types/babel__generator": { "version": "7.6.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { "version": "7.4.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" @@ -1663,37 +2668,82 @@ }, "node_modules/@types/babel__traverse": { "version": "7.20.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", "dependencies": { "@babel/types": "^7.20.7" } }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/content-type": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/@types/content-type/-/content-type-1.1.8.tgz", - "integrity": "sha512-1tBhmVUeso3+ahfyaKluXe38p+94lovUZdoVfQ3OnJo9uJC42JT7CBoN3k9HYhAae+GwiBYmHu+N9FZhOG+2Pg==", - "license": "MIT" + "integrity": "sha512-1tBhmVUeso3+ahfyaKluXe38p+94lovUZdoVfQ3OnJo9uJC42JT7CBoN3k9HYhAae+GwiBYmHu+N9FZhOG+2Pg==" }, "node_modules/@types/cookie": { "version": "0.6.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "license": "MIT", "dependencies": { "@types/ms": "*" } }, "node_modules/@types/estree": { "version": "1.0.5", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } }, "node_modules/@types/hast": { "version": "3.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dependencies": { "@types/unist": "*" } @@ -1701,8 +2751,13 @@ "node_modules/@types/http-cache-semantics": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "license": "MIT" + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true }, "node_modules/@types/jquery": { "version": "3.5.30", @@ -1717,7 +2772,6 @@ "version": "21.1.7", "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.7.tgz", "integrity": "sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==", - "license": "MIT", "dependencies": { "@types/node": "*", "@types/tough-cookie": "*", @@ -1728,15 +2782,19 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", - "dev": true, - "license": "MIT" + "dev": true + }, + "node_modules/@types/luxon": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.2.tgz", + "integrity": "sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==", + "dev": true }, "node_modules/@types/markdown-it": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.1.tgz", - "integrity": "sha512-4NpsnpYl2Gt1ljyBGrKMxFYAYvpqbnnkgP/i/g+NLpjEUa3obn1XJCur9YbEXKDAkaXqsR1LbDnGEJ0MmKFxfg==", + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", "dev": true, - "license": "MIT", "dependencies": { "@types/linkify-it": "^5", "@types/mdurl": "^2" @@ -1747,14 +2805,14 @@ "resolved": "https://registry.npmjs.org/@types/markdown-it-attrs/-/markdown-it-attrs-4.1.3.tgz", "integrity": "sha512-1JsseFdHD6rQHsPcy4W3xx/whxvZ09Z+CqPpnOtrGtpmkFW07N11q7oM383//LtoKv54yn+HGnk6r4ZHUTHJVg==", "dev": true, - "license": "MIT", "dependencies": { "@types/markdown-it": "*" } }, "node_modules/@types/mdast": { "version": "4.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", "dependencies": { "@types/unist": "*" } @@ -1763,31 +2821,42 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", - "dev": true, - "license": "MIT" + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true }, "node_modules/@types/ms": { "version": "0.7.34", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", - "license": "MIT" + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, + "node_modules/@types/multer": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.11.tgz", + "integrity": "sha512-svK240gr6LVWvv3YGyhLlA+6LRRWA4mnGIU7RcNmgjBYFl6665wcXrRfxGp5tEPVHUNm5FMcmq7too9bxCwX/w==", + "dev": true, + "dependencies": { + "@types/express": "*" + } }, "node_modules/@types/nlcst": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", - "license": "MIT", "dependencies": { "@types/unist": "*" } }, "node_modules/@types/node": { - "version": "20.14.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz", - "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==", - "license": "MIT", + "version": "20.16.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.1.tgz", + "integrity": "sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.2" } }, "node_modules/@types/prop-types": { @@ -1795,6 +2864,18 @@ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" }, + "node_modules/@types/qs": { + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, "node_modules/@types/react": { "version": "18.3.3", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", @@ -1816,11 +2897,31 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", - "license": "MIT", "dependencies": { "@types/node": "*" } }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, "node_modules/@types/sizzle": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.8.tgz", @@ -1830,16 +2931,27 @@ "node_modules/@types/tough-cookie": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", - "license": "MIT" + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==" }, "node_modules/@types/unist": { - "version": "3.0.2", - "license": "MIT" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" + }, + "node_modules/@types/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-wDXw9LEEUHyV+7UWy7U315nrJGJ7p1BzaCxDpEoLr789Dk1WDVMMlf3iBfbG2F8NdWnYyFbtTxUn2ZNbm1Q4LQ==" }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + }, + "node_modules/@ungap/url-search-params": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@ungap/url-search-params/-/url-search-params-0.2.2.tgz", + "integrity": "sha512-qQsguKXZVKdCixOHX9jqnX/K/1HekPDpGKyEcXHT+zR6EjGA7S4boSuelL4uuPv6YfhN0n8c4UxW+v/Z3gM2iw==" }, "node_modules/@vitejs/plugin-react": { "version": "4.3.1", @@ -1860,12 +2972,12 @@ } }, "node_modules/@vitest/expect": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.3.tgz", - "integrity": "sha512-X6AepoOYePM0lDNUPsGXTxgXZAl3EXd0GYe/MZyVE4HzkUqyUVC6S3PrY5mClDJ6/7/7vALLMV3+xD/Ko60Hqg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz", + "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==", "dependencies": { - "@vitest/spy": "2.0.3", - "@vitest/utils": "2.0.3", + "@vitest/spy": "2.0.5", + "@vitest/utils": "2.0.5", "chai": "^5.1.1", "tinyrainbow": "^1.2.0" }, @@ -1874,9 +2986,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.3.tgz", - "integrity": "sha512-URM4GLsB2xD37nnTyvf6kfObFafxmycCL8un3OC9gaCs5cti2u+5rJdIflZ2fUJUen4NbvF6jCufwViAFLvz1g==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz", + "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==", "dependencies": { "tinyrainbow": "^1.2.0" }, @@ -1885,11 +2997,11 @@ } }, "node_modules/@vitest/runner": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.0.3.tgz", - "integrity": "sha512-EmSP4mcjYhAcuBWwqgpjR3FYVeiA4ROzRunqKltWjBfLNs1tnMLtF+qtgd5ClTwkDP6/DGlKJTNa6WxNK0bNYQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.0.5.tgz", + "integrity": "sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==", "dependencies": { - "@vitest/utils": "2.0.3", + "@vitest/utils": "2.0.5", "pathe": "^1.1.2" }, "funding": { @@ -1897,11 +3009,11 @@ } }, "node_modules/@vitest/snapshot": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.0.3.tgz", - "integrity": "sha512-6OyA6v65Oe3tTzoSuRPcU6kh9m+mPL1vQ2jDlPdn9IQoUxl8rXhBnfICNOC+vwxWY684Vt5UPgtcA2aPFBb6wg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.0.5.tgz", + "integrity": "sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==", "dependencies": { - "@vitest/pretty-format": "2.0.3", + "@vitest/pretty-format": "2.0.5", "magic-string": "^0.30.10", "pathe": "^1.1.2" }, @@ -1910,9 +3022,9 @@ } }, "node_modules/@vitest/spy": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.3.tgz", - "integrity": "sha512-sfqyAw/ypOXlaj4S+w8689qKM1OyPOqnonqOc9T91DsoHbfN5mU7FdifWWv3MtQFf0lEUstEwR9L/q/M390C+A==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz", + "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==", "dependencies": { "tinyspy": "^3.0.0" }, @@ -1921,11 +3033,11 @@ } }, "node_modules/@vitest/utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.3.tgz", - "integrity": "sha512-c/UdELMuHitQbbc/EVctlBaxoYAwQPQdSNwv7z/vHyBKy2edYZaFgptE27BRueZB7eW8po+cllotMNTDpL3HWg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz", + "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==", "dependencies": { - "@vitest/pretty-format": "2.0.3", + "@vitest/pretty-format": "2.0.5", "estree-walker": "^3.0.3", "loupe": "^3.1.1", "tinyrainbow": "^1.2.0" @@ -1935,23 +3047,21 @@ } }, "node_modules/@vladfrangu/async_event_emitter": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.4.0.tgz", - "integrity": "sha512-eNb/9DMwNvhhgn1UuQ8Rl90jhj9PBkYH4oQ522TkiWUVWRfbh3PjdOTFkVGNKs5+xUXalkgFrUSwtY8u0g0S4g==", - "license": "MIT", + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.4.5.tgz", + "integrity": "sha512-J7T3gUr3Wz0l7Ni1f9upgBZ7+J22/Q1B7dl0X6fG+fTsD+H+31DIosMHj4Um1dWQwqbcQ3oQf+YS2foYkDc9cQ==", "engines": { "node": ">=v14.0.0", "npm": ">=7.0.0" } }, "node_modules/@volar/kit": { - "version": "2.4.0-alpha.15", - "resolved": "https://registry.npmjs.org/@volar/kit/-/kit-2.4.0-alpha.15.tgz", - "integrity": "sha512-ZCBErTebCVdzpSo/0wBlrjnZfqQfVIaHUJa3kOQe3TbVR/8Ny/3mij9gSkBTUcSyVtlUFpJpJo/B8aQp0xt/mQ==", - "license": "MIT", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@volar/kit/-/kit-2.4.0.tgz", + "integrity": "sha512-uqwtPKhrbnP+3f8hs+ltDYXLZ6Wdbs54IzkaPocasI4aBhqWLht5qXctE1MqpZU52wbH359E0u9nhxEFmyon+w==", "dependencies": { - "@volar/language-service": "2.4.0-alpha.15", - "@volar/typescript": "2.4.0-alpha.15", + "@volar/language-service": "2.4.0", + "@volar/typescript": "2.4.0", "typesafe-path": "^0.2.2", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" @@ -1961,24 +3071,21 @@ } }, "node_modules/@volar/language-core": { - "version": "2.4.0-alpha.15", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.0-alpha.15.tgz", - "integrity": "sha512-mt8z4Fm2WxfQYoQHPcKVjLQV6PgPqyKLbkCVY2cr5RSaamqCHjhKEpsFX66aL4D/7oYguuaUw9Bx03Vt0TpIIA==", - "license": "MIT", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.0.tgz", + "integrity": "sha512-FTla+khE+sYK0qJP+6hwPAAUwiNHVMph4RUXpxf/FIPKUP61NFrVZorml4mjFShnueR2y9/j8/vnh09YwVdH7A==", "dependencies": { - "@volar/source-map": "2.4.0-alpha.15" + "@volar/source-map": "2.4.0" } }, "node_modules/@volar/language-server": { - "version": "2.4.0-alpha.15", - "resolved": "https://registry.npmjs.org/@volar/language-server/-/language-server-2.4.0-alpha.15.tgz", - "integrity": "sha512-epaF7Rllb29nr25F8hX5bq7ivgStNZzXGkhuPlHCUM+Ij/aQnsBeYQsfm7EttPqqO3abCctpRWyd+icklFEBoQ==", - "license": "MIT", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@volar/language-server/-/language-server-2.4.0.tgz", + "integrity": "sha512-rmGIjAxWekWQiGH97Mosb4juiD/hfFYNQKV5Py9r7vDOLSkbIwRhITbwHm88NJKs8P6TNc6w/PfBXN6yjKadJg==", "dependencies": { - "@volar/language-core": "2.4.0-alpha.15", - "@volar/language-service": "2.4.0-alpha.15", - "@volar/snapshot-document": "2.4.0-alpha.15", - "@volar/typescript": "2.4.0-alpha.15", + "@volar/language-core": "2.4.0", + "@volar/language-service": "2.4.0", + "@volar/typescript": "2.4.0", "path-browserify": "^1.0.1", "request-light": "^0.7.0", "vscode-languageserver": "^9.0.1", @@ -1988,40 +3095,27 @@ } }, "node_modules/@volar/language-service": { - "version": "2.4.0-alpha.15", - "resolved": "https://registry.npmjs.org/@volar/language-service/-/language-service-2.4.0-alpha.15.tgz", - "integrity": "sha512-H5T5JvvqvWhG0PvvKPTM0nczTbTKQ+U87a8r0eahlH/ySi2HvIHO/7PiNKLxKqLNsiT8SX4U3QcGC8ZaNcC07g==", - "license": "MIT", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@volar/language-service/-/language-service-2.4.0.tgz", + "integrity": "sha512-4P3yeQXIL68mLfS3n6P3m02IRg3GnLHUU9k/1PCHEfm5FG9bySkDOc72dbBn2vAa2BxOqm18bmmZXrsWuQ5AOw==", "dependencies": { - "@volar/language-core": "2.4.0-alpha.15", + "@volar/language-core": "2.4.0", "vscode-languageserver-protocol": "^3.17.5", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" } }, - "node_modules/@volar/snapshot-document": { - "version": "2.4.0-alpha.15", - "resolved": "https://registry.npmjs.org/@volar/snapshot-document/-/snapshot-document-2.4.0-alpha.15.tgz", - "integrity": "sha512-8lnX0eZ7/lM+hakO5kspWABi4nijppxTy9XU0f9ns2lZ/JCE0t9EurNNiOaw4MWFO9USr0H72Ut0LCB9o4rpqA==", - "license": "MIT", - "dependencies": { - "vscode-languageserver-protocol": "^3.17.5", - "vscode-languageserver-textdocument": "^1.0.11" - } - }, "node_modules/@volar/source-map": { - "version": "2.4.0-alpha.15", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.0-alpha.15.tgz", - "integrity": "sha512-8Htngw5TmBY4L3ClDqBGyfLhsB8EmoEXUH1xydyEtEoK0O6NX5ur4Jw8jgvscTlwzizyl/wsN1vn0cQXVbbXYg==", - "license": "MIT" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.0.tgz", + "integrity": "sha512-2ceY8/NEZvN6F44TXw2qRP6AQsvCYhV2bxaBPWxV9HqIfkbRydSksTFObCF1DBDNBfKiZTS8G/4vqV6cvjdOIQ==" }, "node_modules/@volar/typescript": { - "version": "2.4.0-alpha.15", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.0-alpha.15.tgz", - "integrity": "sha512-U3StRBbDuxV6Woa4hvGS4kz3XcOzrWUKgFdEFN+ba1x3eaYg7+ytau8ul05xgA+UNGLXXsKur7fTUhDFyISk0w==", - "license": "MIT", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.0.tgz", + "integrity": "sha512-9zx3lQWgHmVd+JRRAHUSRiEhe4TlzL7U7e6ulWXOxHH/WNYxzKwCvZD7WYWEZFdw4dHfTD9vUR0yPQO6GilCaQ==", "dependencies": { - "@volar/language-core": "2.4.0-alpha.15", + "@volar/language-core": "2.4.0", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } @@ -2030,7 +3124,6 @@ "version": "2.9.3", "resolved": "https://registry.npmjs.org/@vscode/emmet-helper/-/emmet-helper-2.9.3.tgz", "integrity": "sha512-rB39LHWWPQYYlYfpv9qCoZOVioPCftKXXqrsyqN1mTWZM6dTnONT63Db+03vgrBbHzJN45IrgS/AGxw9iiqfEw==", - "license": "MIT", "dependencies": { "emmet": "^2.4.3", "jsonc-parser": "^2.3.0", @@ -2042,18 +3135,33 @@ "node_modules/@vscode/emmet-helper/node_modules/vscode-uri": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz", - "integrity": "sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==", - "license": "MIT" + "integrity": "sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==" }, "node_modules/@vscode/l10n": { "version": "0.0.18", "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.18.tgz", - "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==", - "license": "MIT" + "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==" + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==" }, "node_modules/acorn": { - "version": "8.12.0", - "license": "MIT", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "bin": { "acorn": "bin/acorn" }, @@ -2061,11 +3169,22 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-walk": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", + "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", + "dev": true, + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/adm-zip": { - "version": "0.5.14", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.14.tgz", - "integrity": "sha512-DnyqqifT4Jrcvb8USYjp6FHtBpEIz1mnXu6pTRHZ0RL69LbQYiO+0lDFg5+OKA7U29oWSs3a/i8fhn8ZcceIWg==", - "license": "MIT", + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.15.tgz", + "integrity": "sha512-jYPWSeOA8EFoZnucrKCNihqBjoEGQSU4HKgHYQgKNEQ0pQF9a/DYuo/+fAxY76k4qe75LUlLWpAM1QWcBMTOKw==", "engines": { "node": ">=12.0" } @@ -2074,7 +3193,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "license": "MIT", "dependencies": { "debug": "^4.3.4" }, @@ -2082,25 +3200,75 @@ "node": ">= 14" } }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv/node_modules/fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==" + }, "node_modules/amazon-pa-api5-node-ts": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/amazon-pa-api5-node-ts/-/amazon-pa-api5-node-ts-2.1.4.tgz", - "integrity": "sha512-T5Kt+YQyrxEHmH+1cGVUSzM3t5xrACGgCPt3xn2FkxcxWU5Q49jyz3KMN0VI14EiU7J4BHpRKPPFsvhsOgAnbA==", - "license": "Apache-2.0", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/amazon-pa-api5-node-ts/-/amazon-pa-api5-node-ts-2.3.0.tgz", + "integrity": "sha512-dnaBwdoNbSaNwmkaUEjU9qvjZ4l9dzDwu2BbALa8bdy5XCTXuvYLQrwga2M4xDvivK1ldFqR/llUmNrUeOKC0w==", "dependencies": { "superagent": "^9.0.0" } }, "node_modules/ansi-align": { "version": "3.0.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "dependencies": { "string-width": "^4.1.0" } }, + "node_modules/ansi-align/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/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==" + }, "node_modules/ansi-align/node_modules/string-width": { "version": "4.2.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -2110,13 +3278,10 @@ "node": ">=8" } }, - "node_modules/ansi-align/node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "license": "MIT" - }, - "node_modules/ansi-align/node_modules/string-width/node_modules/strip-ansi": { + "node_modules/ansi-align/node_modules/strip-ansi": { "version": "6.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -2124,18 +3289,10 @@ "node": ">=8" } }, - "node_modules/ansi-align/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "license": "MIT", "engines": { "node": ">=6" } @@ -2144,7 +3301,6 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, @@ -2159,7 +3315,6 @@ "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -2169,7 +3324,8 @@ }, "node_modules/ansi-regex": { "version": "6.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "engines": { "node": ">=12" }, @@ -2178,18 +3334,20 @@ } }, "node_modules/ansi-styles": { - "version": "6.2.1", - "license": "MIT", - "engines": { - "node": ">=12" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": ">=4" } }, "node_modules/anymatch": { "version": "3.1.3", - "license": "ISC", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -2198,19 +3356,25 @@ "node": ">= 8" } }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "license": "MIT" + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" }, "node_modules/argparse": { "version": "2.0.1", - "license": "Python-2.0" + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/aria-query": { "version": "5.3.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dependencies": { "dequal": "^2.0.3" } @@ -2219,7 +3383,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", - "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -2228,8 +3391,7 @@ "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "license": "MIT" + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, "node_modules/assertion-error": { "version": "2.0.1", @@ -2240,34 +3402,34 @@ } }, "node_modules/astro": { - "version": "4.11.5", - "resolved": "https://registry.npmjs.org/astro/-/astro-4.11.5.tgz", - "integrity": "sha512-TCRhuaLwrxwMhS8S1GG+ZTdrAXigX9C8E/YUTs/r2t+owHxDgwl86IV9xH1IHrCPoqhK6civyAQNOT+GKmkb0A==", - "license": "MIT", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/astro/-/astro-4.14.2.tgz", + "integrity": "sha512-x9VeYx8Ih6kYKBMVwwsfRzsZVq30+SUhiawnYQ6+46qQnEx3zH05KcH24HsJMe6dVpHD8HdH7CWR5C4o7Q/jeg==", "dependencies": { - "@astrojs/compiler": "^2.8.1", + "@astrojs/compiler": "^2.10.2", "@astrojs/internal-helpers": "0.4.1", - "@astrojs/markdown-remark": "5.1.1", + "@astrojs/markdown-remark": "5.2.0", "@astrojs/telemetry": "3.1.0", - "@babel/core": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/plugin-transform-react-jsx": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/core": "^7.25.2", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/plugin-transform-react-jsx": "^7.25.2", + "@babel/traverse": "^7.25.3", + "@babel/types": "^7.25.2", + "@oslojs/encoding": "^0.4.1", + "@rollup/pluginutils": "^5.1.0", "@types/babel__core": "^7.20.5", "@types/cookie": "^0.6.0", - "acorn": "^8.12.0", + "acorn": "^8.12.1", "aria-query": "^5.3.0", - "axobject-query": "^4.0.0", - "boxen": "^7.1.1", - "chokidar": "^3.6.0", + "axobject-query": "^4.1.0", + "boxen": "7.1.1", "ci-info": "^4.0.0", "clsx": "^2.1.1", "common-ancestor-path": "^1.0.1", "cookie": "^0.6.0", "cssesc": "^3.0.0", - "debug": "^4.3.5", + "debug": "^4.3.6", "deterministic-object-hash": "^2.0.2", "devalue": "^5.0.0", "diff": "^5.2.0", @@ -2285,28 +3447,32 @@ "http-cache-semantics": "^4.1.1", "js-yaml": "^4.1.0", "kleur": "^4.1.5", - "magic-string": "^0.30.10", + "magic-string": "^0.30.11", + "micromatch": "^4.0.7", "mrmime": "^2.0.0", + "neotraverse": "^0.6.9", "ora": "^8.0.1", - "p-limit": "^5.0.0", + "p-limit": "^6.1.0", "p-queue": "^8.0.1", "path-to-regexp": "^6.2.2", - "preferred-pm": "^3.1.3", + "preferred-pm": "^4.0.0", "prompts": "^2.4.2", "rehype": "^13.0.1", - "semver": "^7.6.2", - "shiki": "^1.10.0", + "semver": "^7.6.3", + "shiki": "^1.12.1", "string-width": "^7.2.0", "strip-ansi": "^7.1.0", "tsconfck": "^3.1.1", "unist-util-visit": "^5.0.0", - "vfile": "^6.0.1", - "vite": "^5.3.2", + "vfile": "^6.0.2", + "vite": "^5.4.0", "vitefu": "^0.2.5", - "which-pm": "^2.2.0", + "which-pm": "^3.0.0", + "xxhash-wasm": "^1.0.2", "yargs-parser": "^21.1.1", "zod": "^3.23.8", - "zod-to-json-schema": "^3.23.1" + "zod-to-json-schema": "^3.23.2", + "zod-to-ts": "^1.2.0" }, "bin": { "astro": "astro.js" @@ -2320,22 +3486,61 @@ "sharp": "^0.33.3" } }, + "node_modules/astro/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/avvio": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-8.4.0.tgz", + "integrity": "sha512-CDSwaxINFy59iNwhYnkvALBwZiTydGkOecZyPkqBpABYR1KqGEsET0VOOYDwtleZSUIdeY36DC2bSZ24CO1igA==", + "dependencies": { + "@fastify/error": "^3.3.0", + "fastq": "^1.17.1" + } + }, + "node_modules/axios": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", + "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } }, "node_modules/axobject-query": { - "version": "4.0.0", - "license": "Apache-2.0", - "dependencies": { - "dequal": "^2.0.3" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "engines": { + "node": ">= 0.4" } }, "node_modules/bail": { "version": "2.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -2344,12 +3549,12 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base-64": { "version": "1.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/base-64/-/base-64-1.0.0.tgz", + "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==" }, "node_modules/base64-js": { "version": "1.5.1", @@ -2368,12 +3573,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/binary-extensions": { "version": "2.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "engines": { "node": ">=8" }, @@ -2385,18 +3590,29 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "node_modules/bootstrap": { "version": "5.3.3", @@ -2412,14 +3628,14 @@ "url": "https://opencollective.com/bootstrap" } ], - "license": "MIT", "peerDependencies": { "@popperjs/core": "^2.11.8" } }, "node_modules/boxen": { "version": "7.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", "dependencies": { "ansi-align": "^3.0.1", "camelcase": "^7.0.1", @@ -2437,9 +3653,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/boxen/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/boxen/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==" + }, "node_modules/boxen/node_modules/string-width": { "version": "5.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -2452,22 +3685,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/boxen/node_modules/string-width/node_modules/emoji-regex": { - "version": "9.2.2", - "license": "MIT" - }, "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==", - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/braces": { "version": "3.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dependencies": { "fill-range": "^7.1.1" }, @@ -2476,7 +3705,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.1", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "funding": [ { "type": "opencollective", @@ -2491,12 +3722,11 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001629", - "electron-to-chromium": "^1.4.796", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.16" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -2523,12 +3753,27 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -2541,7 +3786,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "license": "MIT", "engines": { "node": ">=14.16" } @@ -2550,7 +3794,6 @@ "version": "12.0.1", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-12.0.1.tgz", "integrity": "sha512-Yo9wGIQUaAfIbk+qY0X4cDQgCosecfBe3V9NSyeY4qPC2SAkbCS4Xj79VP8WOzitpJUZKc/wsRCYF5ariDIwkg==", - "license": "MIT", "dependencies": { "@types/http-cache-semantics": "^4.0.4", "get-stream": "^9.0.1", @@ -2568,7 +3811,6 @@ "version": "9.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", - "license": "MIT", "dependencies": { "@sec-ant/readable-stream": "^0.4.1", "is-stream": "^4.0.1" @@ -2584,7 +3826,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", - "license": "MIT", "engines": { "node": ">=18" }, @@ -2596,7 +3837,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -2615,14 +3855,14 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/camelcase": { "version": "7.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", "engines": { "node": ">=14.16" }, @@ -2631,7 +3871,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001636", + "version": "1.0.30001651", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", + "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", "funding": [ { "type": "opencollective", @@ -2645,12 +3887,12 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/ccount": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -2672,20 +3914,22 @@ } }, "node_modules/chalk": { - "version": "5.3.0", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "engines": { + "node": ">=4" } }, "node_modules/character-entities": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -2693,7 +3937,8 @@ }, "node_modules/character-entities-html4": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -2701,7 +3946,8 @@ }, "node_modules/character-entities-legacy": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -2710,8 +3956,7 @@ "node_modules/chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "license": "MIT" + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, "node_modules/check-error": { "version": "2.1.1", @@ -2722,21 +3967,24 @@ } }, "node_modules/cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", - "license": "MIT", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz", + "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==", "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" + "domutils": "^3.1.0", + "encoding-sniffer": "^0.2.0", + "htmlparser2": "^9.1.0", + "parse5": "^7.1.2", + "parse5-htmlparser2-tree-adapter": "^7.0.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^6.19.5", + "whatwg-mimetype": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": ">=18.17" }, "funding": { "url": "https://github.com/cheeriojs/cheerio?sponsor=1" @@ -2746,7 +3994,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-select": "^5.1.0", @@ -2761,7 +4008,8 @@ }, "node_modules/chokidar": { "version": "3.6.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -2783,20 +4031,22 @@ }, "node_modules/ci-info": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz", + "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/sibiraj-s" } ], - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/cli-boxes": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", "engines": { "node": ">=10" }, @@ -2805,21 +4055,20 @@ } }, "node_modules/cli-cursor": { - "version": "4.0.0", - "license": "MIT", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dependencies": { - "restore-cursor": "^4.0.0" + "restore-cursor": "^3.1.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/cli-spinners": { "version": "2.9.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "engines": { "node": ">=6" }, @@ -2831,14 +4080,14 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "license": "ISC", "engines": { "node": ">= 10" } }, "node_modules/cliui": { "version": "8.0.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -2848,9 +4097,53 @@ "node": ">=12" } }, + "node_modules/cliui/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cliui/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/cliui/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==" + }, "node_modules/cliui/node_modules/string-width": { "version": "4.2.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -2860,13 +4153,10 @@ "node": ">=8" } }, - "node_modules/cliui/node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "license": "MIT" - }, "node_modules/cliui/node_modules/strip-ansi": { "version": "6.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -2874,16 +4164,10 @@ "node": ">=8" } }, - "node_modules/cliui/node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -2896,38 +4180,26 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/cliui/node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "license": "MIT", "engines": { "node": ">=0.8" } }, "node_modules/clsx": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "engines": { "node": ">=6" } }, "node_modules/color": { "version": "4.2.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", "optional": true, "dependencies": { "color-convert": "^2.0.1", @@ -2938,8 +4210,33 @@ } }, "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "optional": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color/node_modules/color-convert": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "optional": true, "dependencies": { "color-name": "~1.1.4" }, @@ -2947,24 +4244,16 @@ "node": ">=7.0.0" } }, - "node_modules/color-name": { + "node_modules/color/node_modules/color-name": { "version": "1.1.4", - "license": "MIT" - }, - "node_modules/color-string": { - "version": "1.9.1", - "license": "MIT", - "optional": true, - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "optional": true }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -2974,41 +4263,76 @@ }, "node_modules/comma-separated-tokens": { "version": "2.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "engines": { + "node": ">=18" + } + }, "node_modules/common-ancestor-path": { "version": "1.0.1", - "license": "ISC" + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==" }, "node_modules/component-emitter": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/content-type": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/convert-source-map": { "version": "2.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/cookie": { "version": "0.6.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "engines": { "node": ">= 0.6" } @@ -3016,27 +4340,30 @@ "node_modules/cookiejar": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", - "license": "MIT" + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/crawlee": { - "version": "3.10.5", - "resolved": "https://registry.npmjs.org/crawlee/-/crawlee-3.10.5.tgz", - "integrity": "sha512-gQEBJPnm+uUBEE4wgKJ/0lfpBClrOlu84iCfQ8u1YXkchTbPgsJHRfoZlVfgiynq6HkxSbT8gHYGNfIvFNA8Tg==", - "license": "Apache-2.0", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/crawlee/-/crawlee-3.11.1.tgz", + "integrity": "sha512-8YS4qM7k0O/dr5aLJvCUK/V/9wrVtauIc2DQZ12TDy+Lr9Sal6jlHUNRiMSwfo0L3kFopZCppuagtFvMwu6lXw==", "dependencies": { - "@crawlee/basic": "3.10.5", - "@crawlee/browser": "3.10.5", - "@crawlee/browser-pool": "3.10.5", - "@crawlee/cheerio": "3.10.5", - "@crawlee/cli": "3.10.5", - "@crawlee/core": "3.10.5", - "@crawlee/http": "3.10.5", - "@crawlee/jsdom": "3.10.5", - "@crawlee/linkedom": "3.10.5", - "@crawlee/playwright": "3.10.5", - "@crawlee/puppeteer": "3.10.5", - "@crawlee/utils": "3.10.5", + "@crawlee/basic": "3.11.1", + "@crawlee/browser": "3.11.1", + "@crawlee/browser-pool": "3.11.1", + "@crawlee/cheerio": "3.11.1", + "@crawlee/cli": "3.11.1", + "@crawlee/core": "3.11.1", + "@crawlee/http": "3.11.1", + "@crawlee/jsdom": "3.11.1", + "@crawlee/linkedom": "3.11.1", + "@crawlee/playwright": "3.11.1", + "@crawlee/puppeteer": "3.11.1", + "@crawlee/utils": "3.11.1", "import-local": "^3.1.0", "tslib": "^2.4.0" }, @@ -3059,9 +4386,16 @@ } } }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "node_modules/cross-spawn": { "version": "7.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3075,7 +4409,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", @@ -3091,7 +4424,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, @@ -3101,7 +4433,8 @@ }, "node_modules/cssesc": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "bin": { "cssesc": "bin/cssesc" }, @@ -3112,14 +4445,12 @@ "node_modules/cssom": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "license": "MIT" + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" }, "node_modules/cssstyle": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.0.1.tgz", "integrity": "sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==", - "license": "MIT", "dependencies": { "rrweb-cssom": "^0.6.0" }, @@ -3130,8 +4461,7 @@ "node_modules/cssstyle/node_modules/rrweb-cssom": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", - "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", - "license": "MIT" + "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==" }, "node_modules/csstype": { "version": "3.1.3", @@ -3139,16 +4469,14 @@ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "node_modules/csv-stringify": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-6.5.0.tgz", - "integrity": "sha512-edlXFVKcUx7r8Vx5zQucsuMg4wb/xT6qyz+Sr1vnLrdXqlLD1+UKyWNyZ9zn6mUW1ewmGxrpVwAcChGF0HQ/2Q==", - "license": "MIT" + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-6.5.1.tgz", + "integrity": "sha512-+9lpZfwpLntpTIEpFbwQyWuW/hmI/eHuJZD1XzeZpfZTqkf1fyvBbBLXTJJMsBuuS11uTShMqPwzx4A6ffXgRQ==" }, "node_modules/data-urls": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", - "license": "MIT", "dependencies": { "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.0.0" @@ -3158,8 +4486,9 @@ } }, "node_modules/debug": { - "version": "4.3.5", - "license": "MIT", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dependencies": { "ms": "2.1.2" }, @@ -3175,14 +4504,12 @@ "node_modules/decimal.js": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "license": "MIT" + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" }, "node_modules/decode-named-character-reference": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", - "license": "MIT", "dependencies": { "character-entities": "^2.0.0" }, @@ -3195,7 +4522,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "license": "MIT", "dependencies": { "mimic-response": "^3.1.0" }, @@ -3210,7 +4536,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -3230,7 +4555,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "license": "MIT", "dependencies": { "clone": "^1.0.2" }, @@ -3242,7 +4566,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "license": "MIT", "engines": { "node": ">=10" } @@ -3251,7 +4574,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -3268,21 +4590,39 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", "engines": { "node": ">=0.4.0" } }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/dequal": { "version": "2.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "engines": { "node": ">=6" } }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/detect-libc": { "version": "2.0.3", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", "optional": true, "engines": { "node": ">=8" @@ -3290,7 +4630,8 @@ }, "node_modules/deterministic-object-hash": { "version": "2.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/deterministic-object-hash/-/deterministic-object-hash-2.0.2.tgz", + "integrity": "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==", "dependencies": { "base-64": "^1.0.0" }, @@ -3300,11 +4641,13 @@ }, "node_modules/devalue": { "version": "5.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.0.0.tgz", + "integrity": "sha512-gO+/OMXF7488D+u3ue+G7Y4AA3ZmUnB3eHJXmBTgNHvr4ZNzl36A0ZtG+XCRNYCkYx/bFmw4qtkoFLa+wSrwAA==" }, "node_modules/devlop": { "version": "1.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", "dependencies": { "dequal": "^2.0.0" }, @@ -3314,16 +4657,14 @@ } }, "node_modules/devtools-protocol": { - "version": "0.0.1319565", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1319565.tgz", - "integrity": "sha512-Xc1Xrng6tSt5t0IIFCMeYUIqKEbvJVnKakfUCCq9WIk5m+9SbrPIXFtGcwwos8DucDyViEzwjy6PgIZWGUldyQ==", - "license": "BSD-3-Clause" + "version": "0.0.1343927", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1343927.tgz", + "integrity": "sha512-zLdsAdAgNre5BCfM0V62yMjOdwR0CmP+X2xFKIz9lg2PyQQzloWbdcPESwg04uSZ2jUfsl3whRpR3UX+2CCRmA==" }, "node_modules/dezalgo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", - "license": "ISC", "dependencies": { "asap": "^2.0.0", "wrappy": "1" @@ -3331,20 +4672,21 @@ }, "node_modules/diff": { "version": "5.2.0", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "engines": { "node": ">=0.3.1" } }, "node_modules/dlv": { "version": "1.1.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", @@ -3363,14 +4705,12 @@ "type": "github", "url": "https://github.com/sponsors/fb55" } - ], - "license": "BSD-2-Clause" + ] }, "node_modules/domhandler": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" }, @@ -3385,7 +4725,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", @@ -3399,7 +4738,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "license": "MIT", "dependencies": { "is-obj": "^2.0.0" }, @@ -3437,7 +4775,8 @@ }, "node_modules/dset": { "version": "3.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.3.tgz", + "integrity": "sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==", "engines": { "node": ">=4" } @@ -3445,28 +4784,27 @@ "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "license": "MIT" + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" }, "node_modules/eastasianwidth": { "version": "0.2.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.808", - "license": "ISC" + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.12.tgz", + "integrity": "sha512-tIhPkdlEoCL1Y+PToq3zRNehUaKp3wBX/sr7aclAWdIWjvqAe/Im/H0SiCM4c1Q8BLPHCdoJTol+ZblflydehA==" }, "node_modules/emmet": { "version": "2.4.7", "resolved": "https://registry.npmjs.org/emmet/-/emmet-2.4.7.tgz", "integrity": "sha512-O5O5QNqtdlnQM2bmKHtJgyChcrFMgQuulI+WdiOw2NArzprUqqxUW6bgYtKvzKgrsYpuLWalOkdhNP+1jluhCA==", - "license": "MIT", - "workspaces": [ - "./packages/scanner", - "./packages/abbreviation", - "./packages/css-abbreviation", - "./" - ], "dependencies": { "@emmetio/abbreviation": "^2.3.3", "@emmetio/css-abbreviation": "^2.1.8" @@ -3474,11 +4812,33 @@ }, "node_modules/emoji-regex": { "version": "10.3.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding-sniffer": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz", + "integrity": "sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } }, "node_modules/entities": { "version": "4.5.0", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "engines": { "node": ">=0.12" }, @@ -3490,7 +4850,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4" }, @@ -3502,7 +4861,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -3510,13 +4868,13 @@ "node_modules/es-module-lexer": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", - "license": "MIT" + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" }, "node_modules/esbuild": { "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "hasInstallScript": true, - "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -3551,21 +4909,29 @@ }, "node_modules/escalade": { "version": "3.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "engines": { "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, "node_modules/escape-string-regexp": { "version": "1.0.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "engines": { "node": ">=0.8.0" } }, "node_modules/esprima": { "version": "4.0.1", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -3576,16 +4942,24 @@ }, "node_modules/estree-walker": { "version": "3.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dependencies": { "@types/estree": "^1.0.0" } }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/event-stream": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==", - "license": "MIT", "dependencies": { "duplexer": "~0.1.1", "from": "~0", @@ -3596,13 +4970,31 @@ "through": "~2.3.1" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/eventemitter3": { "version": "5.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } }, "node_modules/execa": { "version": "8.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", @@ -3623,11 +5015,13 @@ }, "node_modules/extend": { "version": "3.0.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "node_modules/extend-shallow": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dependencies": { "is-extendable": "^0.1.0" }, @@ -3639,7 +5033,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "license": "MIT", "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -3653,7 +5046,6 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -3661,15 +5053,25 @@ "node": ">=0.10.0" } }, + "node_modules/fast-content-type-parse": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-1.1.0.tgz", + "integrity": "sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==" + }, + "node_modules/fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { "version": "3.3.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -3681,15 +5083,115 @@ "node": ">=8.6.0" } }, + "node_modules/fast-json-stringify": { + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-5.16.1.tgz", + "integrity": "sha512-KAdnLvy1yu/XrRtP+LJnxbBGrhN+xXu+gt3EUvZhYGKCr3lFHq/7UFJHHFgmJKoqlh6B40bZLEv7w46B0mqn1g==", + "dependencies": { + "@fastify/merge-json-schemas": "^0.1.0", + "ajv": "^8.10.0", + "ajv-formats": "^3.0.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^2.1.0", + "json-schema-ref-resolver": "^1.0.1", + "rfdc": "^1.2.0" + } + }, + "node_modules/fast-json-stringify/node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/fast-querystring": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", + "dependencies": { + "fast-decode-uri-component": "^1.0.1" + } + }, + "node_modules/fast-redact": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", + "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", + "engines": { + "node": ">=6" + } + }, "node_modules/fast-safe-stringify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "license": "MIT" + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "node_modules/fast-uri": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.4.0.tgz", + "integrity": "sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==" + }, + "node_modules/fastify": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.28.1.tgz", + "integrity": "sha512-kFWUtpNr4i7t5vY2EJPCN2KgMVpuqfU4NjnJNCgiNB900oiDeYqaNDRcAfeBbOF5hGixixxcKnOU4KN9z6QncQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "dependencies": { + "@fastify/ajv-compiler": "^3.5.0", + "@fastify/error": "^3.4.0", + "@fastify/fast-json-stringify-compiler": "^4.3.0", + "abstract-logging": "^2.0.1", + "avvio": "^8.3.0", + "fast-content-type-parse": "^1.1.0", + "fast-json-stringify": "^5.8.0", + "find-my-way": "^8.0.0", + "light-my-request": "^5.11.0", + "pino": "^9.0.0", + "process-warning": "^3.0.0", + "proxy-addr": "^2.0.7", + "rfdc": "^1.3.0", + "secure-json-parse": "^2.7.0", + "semver": "^7.5.4", + "toad-cache": "^3.3.0" + } + }, + "node_modules/fastify-plugin": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-4.5.1.tgz", + "integrity": "sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==" + }, + "node_modules/fastify/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } }, "node_modules/fastq": { "version": "1.17.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dependencies": { "reusify": "^1.0.4" } @@ -3698,7 +5200,6 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.7.0.tgz", "integrity": "sha512-gO8l3wvqo0V7wEFLXPbkX83b7MVjRrk1oRLfYlZXol8nEpb/ON9pcKLI4qpBv5YtOTfrINtqb7b40iYY2FTWFg==", - "license": "MIT", "bin": { "figlet": "bin/index.js" }, @@ -3710,7 +5211,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -3722,14 +5222,14 @@ } }, "node_modules/file-type": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-19.0.0.tgz", - "integrity": "sha512-s7cxa7/leUWLiXO78DVVfBVse+milos9FitauDLG1pI7lNaJ2+5lzPnr2N24ym+84HVwJL6hVuGfgVE+ALvU8Q==", - "license": "MIT", + "version": "19.4.1", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-19.4.1.tgz", + "integrity": "sha512-RuWzwF2L9tCHS76KR/Mdh+DwJZcFCzrhrPXpOw6MlEfl/o31fjpTikzcKlYuyeV7e7ftdCGVJTNOCzkYD/aLbw==", "dependencies": { - "readable-web-to-node-stream": "^3.0.2", - "strtok3": "^7.0.0", - "token-types": "^5.0.1" + "get-stream": "^9.0.1", + "strtok3": "^8.1.0", + "token-types": "^6.0.0", + "uint8array-extras": "^1.3.0" }, "engines": { "node": ">=18" @@ -3738,9 +5238,36 @@ "url": "https://github.com/sindresorhus/file-type?sponsor=1" } }, + "node_modules/file-type/node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-type/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/fill-range": { "version": "7.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -3748,15 +5275,37 @@ "node": ">=8" } }, - "node_modules/find-up": { - "version": "5.0.0", - "license": "MIT", + "node_modules/find-my-way": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-8.2.0.tgz", + "integrity": "sha512-HdWXgFYc6b1BJcOBDBwjqWuHJj1WYiqrxSh25qtU4DabpMFdj/gSunNBQb83t+8Zt67D7CXEzJWTkxaShMTMOA==", "dependencies": { - "locate-path": "^6.0.0", + "fast-deep-equal": "^3.1.3", + "fast-querystring": "^1.0.0", + "safe-regex2": "^3.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", "path-exists": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" + } + }, + "node_modules/find-up-simple": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz", + "integrity": "sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==", + "engines": { + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3764,20 +5313,20 @@ }, "node_modules/find-yarn-workspace-root2": { "version": "1.2.16", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz", + "integrity": "sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==", "dependencies": { "micromatch": "^4.0.2", "pkg-dir": "^4.2.0" } }, "node_modules/fingerprint-generator": { - "version": "2.1.52", - "resolved": "https://registry.npmjs.org/fingerprint-generator/-/fingerprint-generator-2.1.52.tgz", - "integrity": "sha512-ZdXUn/qIB4vI7pDze5aXidjoFwLdEfbBNj6+3oHzXcgwxzEfCOfNe3wW5NRZDJKgxF40R7TSOA7noBAAehSLgQ==", - "license": "Apache-2.0", + "version": "2.1.54", + "resolved": "https://registry.npmjs.org/fingerprint-generator/-/fingerprint-generator-2.1.54.tgz", + "integrity": "sha512-Hd/t8h+icv9jeDd64hxTyfuP9U0bkq9z9Lna4q/MeIs2e1mTcHuznyJzApqtYdZP3cIY4JEfmDz5yW/QcMz+Ow==", "dependencies": { - "generative-bayesian-network": "^2.1.52", - "header-generator": "^2.1.52", + "generative-bayesian-network": "^2.1.54", + "header-generator": "^2.1.54", "tslib": "^2.4.0" }, "engines": { @@ -3785,12 +5334,11 @@ } }, "node_modules/fingerprint-injector": { - "version": "2.1.52", - "resolved": "https://registry.npmjs.org/fingerprint-injector/-/fingerprint-injector-2.1.52.tgz", - "integrity": "sha512-Sx+ykblqEP/P6nPRIE+C5CUNEfFpMZ3M/r5NDxOkSCTQVdfXXxlFx/UKOQNorvuJxryrtek4T0FvcB/KUbQfCQ==", - "license": "Apache-2.0", + "version": "2.1.54", + "resolved": "https://registry.npmjs.org/fingerprint-injector/-/fingerprint-injector-2.1.54.tgz", + "integrity": "sha512-tBNoBULryyGMpWBIFUfZH4hHgCV575T8/xyiZXe2zuX1oAclpYRy3P7wGCzM4JvoP9NCG2Z3gROGnfsTgfQfVA==", "dependencies": { - "fingerprint-generator": "^2.1.52", + "fingerprint-generator": "^2.1.54", "tslib": "^2.4.0" }, "engines": { @@ -3811,16 +5359,50 @@ }, "node_modules/flattie": { "version": "1.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz", + "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==", "engines": { "node": ">=8" } }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -3834,7 +5416,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.0.2.tgz", "integrity": "sha512-KQVhvhK8ZkWzxKxOr56CPulAhH3dobtuQ4+hNQ+HekH/Wp5gSOafqRAeTphQUJAIk0GBvHZgJ2ZGRWd5kphMuw==", - "license": "MIT", "engines": { "node": ">= 18" } @@ -3843,7 +5424,6 @@ "version": "3.5.1", "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.1.tgz", "integrity": "sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==", - "license": "MIT", "dependencies": { "dezalgo": "^1.0.4", "hexoid": "^1.0.0", @@ -3853,17 +5433,31 @@ "url": "https://ko-fi.com/tunnckoCore/commissions" } }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/from": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", - "license": "MIT" + "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==" }, "node_modules/fs-extra": { "version": "11.2.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -3874,11 +5468,10 @@ } }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "hasInstallScript": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -3891,16 +5484,14 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/generative-bayesian-network": { - "version": "2.1.52", - "resolved": "https://registry.npmjs.org/generative-bayesian-network/-/generative-bayesian-network-2.1.52.tgz", - "integrity": "sha512-8fYemN+uiVPCjoodQX4HUH8RLDqiQeGfemlWO9yR6SqIh/6BsrW52M0YTSafsH0615BhulRy5BR2uKAqLTJ22A==", - "license": "Apache-2.0", + "version": "2.1.54", + "resolved": "https://registry.npmjs.org/generative-bayesian-network/-/generative-bayesian-network-2.1.54.tgz", + "integrity": "sha512-1RIfmYqZqghwjRQGqUU36tZmJkyz77dztmgUHeAGkG0o9eTwN7fBxOCyQLqxZd9Qg72d19IKdcIvrs53TI2KdA==", "dependencies": { "adm-zip": "^0.5.9", "tslib": "^2.4.0" @@ -3908,21 +5499,24 @@ }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "engines": { "node": ">=6.9.0" } }, "node_modules/get-caller-file": { "version": "2.0.5", - "license": "ISC", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-east-asian-width": { "version": "1.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", "engines": { "node": ">=18" }, @@ -3942,7 +5536,6 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -3959,7 +5552,8 @@ }, "node_modules/get-stream": { "version": "8.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "engines": { "node": ">=16" }, @@ -3968,11 +5562,10 @@ } }, "node_modules/get-tsconfig": { - "version": "4.7.5", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz", - "integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==", + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz", + "integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==", "dev": true, - "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" }, @@ -3983,12 +5576,31 @@ "node_modules/github-slugger": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", - "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", - "license": "ISC" + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==" + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/glob-parent": { "version": "5.1.2", - "license": "ISC", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dependencies": { "is-glob": "^4.0.1" }, @@ -3998,7 +5610,8 @@ }, "node_modules/globals": { "version": "11.12.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "engines": { "node": ">=4" } @@ -4007,7 +5620,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -4016,18 +5628,16 @@ } }, "node_modules/got": { - "version": "14.4.1", - "resolved": "https://registry.npmjs.org/got/-/got-14.4.1.tgz", - "integrity": "sha512-IvDJbJBUeexX74xNQuMIVgCRRuNOm5wuK+OC3Dc2pnSoh1AOmgc7JVj7WC+cJ4u0aPcO9KZ2frTXcqK4W/5qTQ==", - "license": "MIT", + "version": "14.4.2", + "resolved": "https://registry.npmjs.org/got/-/got-14.4.2.tgz", + "integrity": "sha512-+Te/qEZ6hr7i+f0FNgXx/6WQteSM/QqueGvxeYQQFm0GDfoxLVJ/oiwUKYMTeioColWUTdewZ06hmrBjw6F7tw==", "dependencies": { - "@sindresorhus/is": "^6.3.1", + "@sindresorhus/is": "^7.0.0", "@szmarczak/http-timer": "^5.0.1", "cacheable-lookup": "^7.0.0", "cacheable-request": "^12.0.1", "decompress-response": "^6.0.0", "form-data-encoder": "^4.0.2", - "get-stream": "^8.0.1", "http2-wrapper": "^2.2.1", "lowercase-keys": "^3.0.0", "p-cancelable": "^4.0.1", @@ -4045,7 +5655,6 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/got-scraping/-/got-scraping-4.0.6.tgz", "integrity": "sha512-bfL/sxJ+HnT2FFVDOs74PbPuWNg/xOX9BWefn7a5CVF5hI1cXUHaa/6y4tm6i1T0KDqomQ/hOKVdpGqSWIBuhA==", - "license": "Apache-2.0", "dependencies": { "got": "^14.2.1", "header-generator": "^2.1.41", @@ -4063,7 +5672,6 @@ "version": "5.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", - "license": "MIT", "engines": { "node": ">=14.16" }, @@ -4075,7 +5683,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-4.2.0.tgz", "integrity": "sha512-kfzR4zzQtAE9PC7CzZsjl3aBNbXWuXiSeOCdLcPpBfGW8YuCqQHcRPFDbr/BPVmd3EEPVpuFzLyuT/cUhPr4OQ==", - "license": "MIT", "engines": { "node": ">=12.20" }, @@ -4087,7 +5694,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-7.2.0.tgz", "integrity": "sha512-Ol/IPXUARn9CSbkrdV4VJo7uCy1I3VuSiWCaFSg+8BdUOzF9n3jefIpcgAydvUZbTdEBZs2vEiTiS9m61ssiDA==", - "license": "MIT", "dependencies": { "type-fest": "^2.11.2" }, @@ -4102,7 +5708,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/ow/-/ow-1.1.1.tgz", "integrity": "sha512-sJBRCbS5vh1Jp9EOgwp1Ws3c16lJrUkJYlvWTYC03oyiYVwS/ns7lKRWow4w4XjDyTrA2pplQv4B2naWSR6yDA==", - "license": "MIT", "dependencies": { "@sindresorhus/is": "^5.3.0", "callsites": "^4.0.0", @@ -4121,7 +5726,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-7.0.0.tgz", "integrity": "sha512-MX8gB7cVYTrYcFfAnfLlhRd0+Toyl8yX8uBx1MrX7K0jegiz9TumwOK27ldXrgDlHRdVi+MqU9Ssw6dr4BNreg==", - "license": "MIT", "engines": { "node": ">=18" }, @@ -4130,10 +5734,9 @@ } }, "node_modules/got/node_modules/type-fest": { - "version": "4.20.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.20.1.tgz", - "integrity": "sha512-R6wDsVsoS9xYOpy8vgeBlqpdOyzJ12HNfQhC/aAKWM3YoCV9TtunJzh/QpkMgeDhkoynDcw5f1y+qF9yc/HHyg==", - "license": "(MIT OR CC0-1.0)", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.25.0.tgz", + "integrity": "sha512-bRkIGlXsnGBRBQRAY56UXBm//9qH4bmJfFvq83gSz41N282df+fjy8ofcEgc1sM8geNt5cl6mC2g9Fht1cs8Aw==", "engines": { "node": ">=16" }, @@ -4143,11 +5746,13 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", - "license": "ISC" + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/gray-matter": { "version": "4.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", "dependencies": { "js-yaml": "^3.13.1", "kind-of": "^6.0.2", @@ -4158,9 +5763,18 @@ "node": ">=6.0" } }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, "node_modules/gray-matter/node_modules/js-yaml": { "version": "3.14.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -4169,18 +5783,15 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/gray-matter/node_modules/js-yaml/node_modules/argparse": { - "version": "1.0.10", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } + "node_modules/gray-matter/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "node_modules/has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", - "license": "MIT", "dependencies": { "ansi-regex": "^2.0.0" }, @@ -4192,14 +5803,14 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/has-flag": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "engines": { "node": ">=4" } @@ -4208,7 +5819,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -4220,7 +5830,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4232,7 +5841,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4244,7 +5852,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -4254,7 +5861,8 @@ }, "node_modules/hast-util-from-html": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.1.tgz", + "integrity": "sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==", "dependencies": { "@types/hast": "^3.0.0", "devlop": "^1.1.0", @@ -4270,7 +5878,8 @@ }, "node_modules/hast-util-from-parse5": { "version": "8.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", + "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", @@ -4290,7 +5899,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", - "license": "MIT", "dependencies": { "@types/hast": "^3.0.0" }, @@ -4301,7 +5909,8 @@ }, "node_modules/hast-util-parse-selector": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", "dependencies": { "@types/hast": "^3.0.0" }, @@ -4312,7 +5921,8 @@ }, "node_modules/hast-util-raw": { "version": "9.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.4.tgz", + "integrity": "sha512-LHE65TD2YiNsHD3YuXcKPHXPLuYh/gjp12mOfU8jxSrm1f/yJpsb0F/KKljS6U9LJoP0Ux+tCe8iJ2AsPzTdgA==", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", @@ -4335,7 +5945,8 @@ }, "node_modules/hast-util-to-html": { "version": "9.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.1.tgz", + "integrity": "sha512-hZOofyZANbyWo+9RP75xIDV/gq+OUKx+T46IlwERnKmfpwp81XBFbT9mi26ws+SJchA4RVUQwIBJpqEOBhMzEQ==", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", @@ -4357,7 +5968,8 @@ }, "node_modules/hast-util-to-parse5": { "version": "8.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", @@ -4376,7 +5988,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", - "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", @@ -4390,7 +6001,8 @@ }, "node_modules/hast-util-whitespace": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", "dependencies": { "@types/hast": "^3.0.0" }, @@ -4401,7 +6013,8 @@ }, "node_modules/hastscript": { "version": "8.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", + "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", @@ -4415,13 +6028,12 @@ } }, "node_modules/header-generator": { - "version": "2.1.52", - "resolved": "https://registry.npmjs.org/header-generator/-/header-generator-2.1.52.tgz", - "integrity": "sha512-2roqbZdd0hc7Bx+6BIQaHaCaSdnTXCnqayFbS8dpj53hmkQAXbSwiuTpfyAY1vePiaKweH6vDYhbtGOW+NmTmw==", - "license": "Apache-2.0", + "version": "2.1.54", + "resolved": "https://registry.npmjs.org/header-generator/-/header-generator-2.1.54.tgz", + "integrity": "sha512-fRitYKX+HwmID0zUeWzsu3wZDa5dTVi7XE/m2kRcP+wZVhVuKHm7zD2jfmxddhVQWgdp0CY4+eTfDOlD5dsBMQ==", "dependencies": { "browserslist": "^4.21.1", - "generative-bayesian-network": "^2.1.52", + "generative-bayesian-network": "^2.1.54", "ow": "^0.28.1", "tslib": "^2.4.0" }, @@ -4433,7 +6045,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", - "license": "MIT", "engines": { "node": ">=8" } @@ -4442,7 +6053,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", - "license": "MIT", "dependencies": { "whatwg-encoding": "^3.1.1" }, @@ -4452,20 +6062,22 @@ }, "node_modules/html-escaper": { "version": "3.0.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==" }, "node_modules/html-void-elements": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -4473,23 +6085,37 @@ "url": "https://github.com/sponsors/fb55" } ], - "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" + "domutils": "^3.1.0", + "entities": "^4.5.0" } }, "node_modules/http-cache-semantics": { "version": "4.1.1", - "license": "BSD-2-Clause" + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } }, "node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "license": "MIT", "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -4502,7 +6128,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", - "license": "MIT", "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" @@ -4515,7 +6140,6 @@ "version": "7.0.5", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", - "license": "MIT", "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -4526,16 +6150,24 @@ }, "node_modules/human-signals": { "version": "5.0.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "engines": { "node": ">=16.17.0" } }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "engines": { + "node": ">=10.18" + } + }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -4546,8 +6178,7 @@ "node_modules/idcac-playwright": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/idcac-playwright/-/idcac-playwright-0.1.2.tgz", - "integrity": "sha512-1YeecryHQC3SzDagSjqJTCDDs6F0x/9LaR8TPIN6x60myYAs7oALxZJdwNITeoR3wL0KeTZF3knVTRJ4gki5NQ==", - "license": "ISC" + "integrity": "sha512-1YeecryHQC3SzDagSjqJTCDDs6F0x/9LaR8TPIN6x60myYAs7oALxZJdwNITeoR3wL0KeTZF3knVTRJ4gki5NQ==" }, "node_modules/ieee754": { "version": "1.2.1", @@ -4566,14 +6197,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "BSD-3-Clause" + ] }, "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "license": "MIT", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -4592,7 +6221,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", - "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -4601,14 +6229,12 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/inquirer": { "version": "8.2.6", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", - "license": "MIT", "dependencies": { "ansi-escapes": "^4.2.1", "chalk": "^4.1.1", @@ -4634,7 +6260,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", "engines": { "node": ">=8" } @@ -4643,7 +6268,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -4658,7 +6282,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4670,29 +6293,31 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/inquirer/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "license": "MIT", + "node_modules/inquirer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { - "restore-cursor": "^3.1.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=8" + "node": ">=7.0.0" } }, + "node_modules/inquirer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, "node_modules/inquirer/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==", - "license": "MIT" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/inquirer/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==", - "license": "MIT", "engines": { "node": ">=8" } @@ -4701,7 +6326,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "license": "MIT", "engines": { "node": ">=8" } @@ -4710,7 +6334,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -4722,7 +6345,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "license": "MIT", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -4734,35 +6356,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/inquirer/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/inquirer/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/inquirer/node_modules/ora": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "license": "MIT", "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -4781,30 +6378,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/inquirer/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, "node_modules/inquirer/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==", - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -4818,7 +6395,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -4830,7 +6406,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -4842,7 +6417,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -4856,7 +6430,6 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "license": "MIT", "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" @@ -4865,26 +6438,29 @@ "node": ">= 12" } }, - "node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "license": "BSD-3-Clause" + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } }, "node_modules/is-any-array": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-any-array/-/is-any-array-2.0.1.tgz", - "integrity": "sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ==", - "license": "MIT" + "integrity": "sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ==" }, "node_modules/is-arrayish": { "version": "0.3.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", "optional": true }, "node_modules/is-binary-path": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -4894,7 +6470,8 @@ }, "node_modules/is-docker": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "bin": { "is-docker": "cli.js" }, @@ -4907,28 +6484,32 @@ }, "node_modules/is-extendable": { "version": "0.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "engines": { "node": ">=0.10.0" } }, "node_modules/is-extglob": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "engines": { "node": ">=8" } }, "node_modules/is-glob": { "version": "4.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dependencies": { "is-extglob": "^2.1.1" }, @@ -4938,7 +6519,8 @@ }, "node_modules/is-inside-container": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dependencies": { "is-docker": "^3.0.0" }, @@ -4954,7 +6536,8 @@ }, "node_modules/is-interactive": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", "engines": { "node": ">=12" }, @@ -4964,7 +6547,8 @@ }, "node_modules/is-number": { "version": "7.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "engines": { "node": ">=0.12.0" } @@ -4973,14 +6557,14 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-plain-obj": { "version": "4.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "engines": { "node": ">=12" }, @@ -4991,12 +6575,12 @@ "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "license": "MIT" + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" }, "node_modules/is-stream": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -5006,7 +6590,8 @@ }, "node_modules/is-unicode-supported": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", + "integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==", "engines": { "node": ">=18" }, @@ -5016,7 +6601,8 @@ }, "node_modules/is-wsl": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", "dependencies": { "is-inside-container": "^1.0.0" }, @@ -5027,23 +6613,49 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, "node_modules/isexe": { "version": "2.0.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "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==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } }, "node_modules/jquery": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", - "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", - "license": "MIT" + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==" + }, + "node_modules/js-base64": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.2.tgz", + "integrity": "sha512-NnRs6dsyqUXejqk/yv2aiXlAvOs56sLkX6nUdeaNezI5LFFLlsZjOThmwnrcwh5ZZRwZlCMnVAY3CvhIhoVEKQ==" }, "node_modules/js-tokens": { "version": "4.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { "version": "4.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dependencies": { "argparse": "^2.0.1" }, @@ -5054,14 +6666,12 @@ "node_modules/jsbn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "license": "MIT" + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" }, "node_modules/jsdom": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.0.tgz", - "integrity": "sha512-6gpM7pRXCwIOKxX47cgOyvyQDN/Eh0f1MeKySBV2xGdKtqJBLj8P25eY3EVCWo2mglDDzozR2r2MW4T+JiNUZA==", - "license": "MIT", + "version": "24.1.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.1.tgz", + "integrity": "sha512-5O1wWV99Jhq4DV7rCLIoZ/UIhyQeDR7wHVyZAHAshbrvZsLs+Xzz7gtwnlJTJDjleiTKh54F4dXrX70vJQTyJQ==", "dependencies": { "cssstyle": "^4.0.1", "data-urls": "^5.0.0", @@ -5069,11 +6679,11 @@ "form-data": "^4.0.0", "html-encoding-sniffer": "^4.0.0", "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.4", + "https-proxy-agent": "^7.0.5", "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.10", + "nwsapi": "^2.2.12", "parse5": "^7.1.2", - "rrweb-cssom": "^0.7.0", + "rrweb-cssom": "^0.7.1", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", "tough-cookie": "^4.1.4", @@ -5082,7 +6692,7 @@ "whatwg-encoding": "^3.1.1", "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.0.0", - "ws": "^8.17.0", + "ws": "^8.18.0", "xml-name-validator": "^5.0.0" }, "engines": { @@ -5099,7 +6709,8 @@ }, "node_modules/jsesc": { "version": "2.5.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "bin": { "jsesc": "bin/jsesc" }, @@ -5110,12 +6721,25 @@ "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "license": "MIT" + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "node_modules/json-schema-ref-resolver": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-1.0.1.tgz", + "integrity": "sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/json5": { "version": "2.2.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "bin": { "json5": "lib/cli.js" }, @@ -5126,14 +6750,12 @@ "node_modules/jsonc-parser": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", - "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==", - "license": "MIT" + "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==" }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -5145,30 +6767,40 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } }, "node_modules/kind-of": { "version": "6.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "engines": { "node": ">=0.10.0" } }, "node_modules/kleur": { "version": "4.1.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "engines": { "node": ">=6" } }, + "node_modules/light-my-request": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.13.0.tgz", + "integrity": "sha512-9IjUN9ZyCS9pTG+KqTDEQo68Sui2lHsYBrfMyVUTTZ3XhH8PMZq7xO94Kr+eP9dhi/kcKsx4N41p2IXEBil1pQ==", + "dependencies": { + "cookie": "^0.6.0", + "process-warning": "^3.0.0", + "set-cookie-parser": "^2.4.1" + } + }, "node_modules/linkedom": { "version": "0.18.4", "resolved": "https://registry.npmjs.org/linkedom/-/linkedom-0.18.4.tgz", "integrity": "sha512-JhLErxMIEOKByMi3fURXgI1fYOzR87L1Cn0+MI9GlMckFrqFZpV1SUGox1jcKtsKN3y6JgclcQf0FzZT//BuGw==", - "license": "ISC", "dependencies": { "css-select": "^5.1.0", "cssom": "^0.5.0", @@ -5177,37 +6809,18 @@ "uhyphen": "^0.2.0" } }, - "node_modules/linkedom/node_modules/htmlparser2": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", - "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.1.0", - "entities": "^4.5.0" - } - }, "node_modules/linkify-it": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", - "license": "MIT", "dependencies": { "uc.micro": "^2.0.0" } }, "node_modules/load-yaml-file": { "version": "0.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz", + "integrity": "sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==", "dependencies": { "graceful-fs": "^4.1.5", "js-yaml": "^3.13.0", @@ -5218,9 +6831,18 @@ "node": ">=6" } }, + "node_modules/load-yaml-file/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, "node_modules/load-yaml-file/node_modules/js-yaml": { "version": "3.14.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -5229,47 +6851,41 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/load-yaml-file/node_modules/js-yaml/node_modules/argparse": { - "version": "1.0.10", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } + "node_modules/load-yaml-file/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "node_modules/locate-path": { - "version": "6.0.0", - "license": "MIT", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dependencies": { - "p-locate": "^5.0.0" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "license": "MIT" + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "license": "MIT" + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, "node_modules/log-symbols": { "version": "6.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", "dependencies": { "chalk": "^5.3.0", "is-unicode-supported": "^1.3.0" @@ -5281,9 +6897,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/log-symbols/node_modules/is-unicode-supported": { "version": "1.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", "engines": { "node": ">=12" }, @@ -5295,7 +6923,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -5324,7 +6951,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -5334,18 +6960,34 @@ }, "node_modules/lru-cache": { "version": "5.1.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dependencies": { "yallist": "^3.0.2" } }, - "node_modules/magic-string": { - "version": "0.30.10", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" + "node_modules/luxon": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz", + "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==", + "engines": { + "node": ">=12" } }, + "node_modules/magic-string": { + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, "node_modules/map-stream": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", @@ -5355,7 +6997,6 @@ "version": "14.1.0", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", - "license": "MIT", "dependencies": { "argparse": "^2.0.1", "entities": "^4.4.0", @@ -5369,10 +7010,9 @@ } }, "node_modules/markdown-it-attrs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/markdown-it-attrs/-/markdown-it-attrs-4.1.6.tgz", - "integrity": "sha512-O7PDKZlN8RFMyDX13JnctQompwrrILuz2y43pW2GagcwpIIElkAdfeek+erHfxUOlXWPsjFeWmZ8ch1xtRLWpA==", - "license": "MIT", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/markdown-it-attrs/-/markdown-it-attrs-4.2.0.tgz", + "integrity": "sha512-m7svtUBythvcGFFZAv9VjMEvs8UbHri2sojJ3juJumoOzv8sdkx9a7W3KxiHbXxAbvL3Xauak8TMwCnvigVPKw==", "engines": { "node": ">=6" }, @@ -5384,7 +7024,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", - "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -5394,7 +7033,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz", "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==", - "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", @@ -5409,7 +7047,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", - "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", @@ -5425,7 +7062,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -5437,7 +7073,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", - "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", @@ -5461,7 +7096,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", - "license": "MIT", "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", @@ -5477,10 +7111,9 @@ } }, "node_modules/mdast-util-gfm-autolink-literal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz", - "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==", - "license": "MIT", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", "dependencies": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", @@ -5497,7 +7130,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", - "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.1.0", @@ -5514,7 +7146,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", - "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", @@ -5529,7 +7160,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", - "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", @@ -5546,7 +7176,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", - "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", @@ -5562,7 +7191,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", - "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" @@ -5574,7 +7202,8 @@ }, "node_modules/mdast-util-to-hast": { "version": "13.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -5595,7 +7224,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", - "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", @@ -5615,7 +7243,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", - "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0" }, @@ -5627,16 +7254,43 @@ "node_modules/mdurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", - "license": "MIT" + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.11.1.tgz", + "integrity": "sha512-LZcMTBAgqUUKNXZagcZxvXXfgF1bHX7Y7nQ0QyEiNbRJgE29GhgPd8Yna1VQcLlPiHt/5RFJMWYN9Uv/VPNvjQ==", + "dependencies": { + "@jsonjoy.com/json-pack": "^1.0.3", + "@jsonjoy.com/util": "^1.3.0", + "tree-dump": "^1.0.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">= 4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + } }, "node_modules/merge-stream": { "version": "2.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "node_modules/merge2": { "version": "1.4.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "engines": { "node": ">= 8" } @@ -5645,7 +7299,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -5664,7 +7317,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", @@ -5699,7 +7351,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", @@ -5723,7 +7374,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", - "license": "MIT", "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", "micromark-extension-gfm-footnote": "^2.0.0", @@ -5743,7 +7393,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", - "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", @@ -5759,7 +7408,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", - "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", @@ -5779,7 +7427,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", - "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", @@ -5797,7 +7444,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz", "integrity": "sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==", - "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", @@ -5814,7 +7460,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", - "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" }, @@ -5827,7 +7472,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", - "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", @@ -5854,7 +7498,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", @@ -5875,7 +7518,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", @@ -5897,7 +7539,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -5917,7 +7558,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", @@ -5939,7 +7579,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", @@ -5949,6 +7588,8 @@ }, "node_modules/micromark-util-character": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "funding": [ { "type": "GitHub Sponsors", @@ -5959,7 +7600,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -5979,7 +7619,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } @@ -5998,7 +7637,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", @@ -6019,7 +7657,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -6039,7 +7676,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } @@ -6058,7 +7694,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", @@ -6068,6 +7703,8 @@ }, "node_modules/micromark-util-encode": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", "funding": [ { "type": "GitHub Sponsors", @@ -6077,8 +7714,7 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark-util-html-tag-name": { "version": "2.0.0", @@ -6093,8 +7729,7 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark-util-normalize-identifier": { "version": "2.0.0", @@ -6110,7 +7745,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } @@ -6129,13 +7763,14 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-sanitize-uri": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", "funding": [ { "type": "GitHub Sponsors", @@ -6146,7 +7781,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", @@ -6167,7 +7801,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", @@ -6177,6 +7810,8 @@ }, "node_modules/micromark-util-symbol": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "funding": [ { "type": "GitHub Sponsors", @@ -6186,11 +7821,12 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromark-util-types": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", "funding": [ { "type": "GitHub Sponsors", @@ -6200,12 +7836,12 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/micromatch": { "version": "4.0.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -6215,22 +7851,20 @@ } }, "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "license": "MIT", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", "bin": { "mime": "cli.js" }, "engines": { - "node": ">=4.0.0" + "node": ">=10.0.0" } }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -6239,7 +7873,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -6249,7 +7882,8 @@ }, "node_modules/mimic-fn": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "engines": { "node": ">=12" }, @@ -6261,7 +7895,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -6273,7 +7906,6 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -6284,11 +7916,37 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "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", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/ml-array-max": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/ml-array-max/-/ml-array-max-1.2.4.tgz", "integrity": "sha512-BlEeg80jI0tW6WaPyGxf5Sa4sqvcyY6lbSn5Vcv44lp1I2GR6AWojfUvLnGTNsIXrZ8uqWmo8VcG1WpkI2ONMQ==", - "license": "MIT", "dependencies": { "is-any-array": "^2.0.0" } @@ -6297,7 +7955,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/ml-array-min/-/ml-array-min-1.2.3.tgz", "integrity": "sha512-VcZ5f3VZ1iihtrGvgfh/q0XlMobG6GQ8FsNyQXD3T+IlstDv85g8kfV0xUG1QPRO/t21aukaJowDzMTc7j5V6Q==", - "license": "MIT", "dependencies": { "is-any-array": "^2.0.0" } @@ -6306,7 +7963,6 @@ "version": "1.3.7", "resolved": "https://registry.npmjs.org/ml-array-rescale/-/ml-array-rescale-1.3.7.tgz", "integrity": "sha512-48NGChTouvEo9KBctDfHC3udWnQKNKEWN0ziELvY3KG25GR5cA8K8wNVzracsqSW1QEkAXjTNx+ycgAv06/1mQ==", - "license": "MIT", "dependencies": { "is-any-array": "^2.0.0", "ml-array-max": "^1.2.4", @@ -6317,7 +7973,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ml-logistic-regression/-/ml-logistic-regression-2.0.0.tgz", "integrity": "sha512-xHhB91ut8GRRbJyB1ZQfKsl1MHmE1PqMeRjxhks96M5BGvCbC9eEojf4KgRMKM2LxFblhVUcVzweAoPB48Nt0A==", - "license": "MIT", "dependencies": { "ml-matrix": "^6.5.0" } @@ -6326,7 +7981,6 @@ "version": "6.11.1", "resolved": "https://registry.npmjs.org/ml-matrix/-/ml-matrix-6.11.1.tgz", "integrity": "sha512-Fvp1xF1O07tt6Ux9NcnEQTei5UlqbRpvvaFZGs7l3Ij+nOaEDcmbSVtxwNa8V4IfdyFI1NLNUteroMJ1S6vcEg==", - "license": "MIT", "dependencies": { "is-any-array": "^2.0.1", "ml-array-rescale": "^1.3.7" @@ -6334,36 +7988,54 @@ }, "node_modules/mrmime": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", "engines": { "node": ">=10" } }, "node_modules/ms": { "version": "2.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/muggle-string": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", - "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", - "license": "MIT" + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==" + }, + "node_modules/multer": { + "version": "1.4.5-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", + "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 6.0.0" + } }, "node_modules/mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "license": "ISC" + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, "node_modules/nanoid": { "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -6371,11 +8043,18 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/neotraverse": { + "version": "0.6.18", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", + "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", + "engines": { + "node": ">= 10" + } + }, "node_modules/nlcst-to-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", - "license": "MIT", "dependencies": { "@types/nlcst": "^2.0.0" }, @@ -6385,12 +8064,14 @@ } }, "node_modules/node-releases": { - "version": "2.0.14", - "license": "MIT" + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" }, "node_modules/normalize-path": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "engines": { "node": ">=0.10.0" } @@ -6399,7 +8080,6 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", - "license": "MIT", "engines": { "node": ">=14.16" }, @@ -6409,7 +8089,8 @@ }, "node_modules/npm-run-path": { "version": "5.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dependencies": { "path-key": "^4.0.0" }, @@ -6422,7 +8103,8 @@ }, "node_modules/npm-run-path/node_modules/path-key": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "engines": { "node": ">=12" }, @@ -6434,7 +8116,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" }, @@ -6443,16 +8124,22 @@ } }, "node_modules/nwsapi": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.10.tgz", - "integrity": "sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==", - "license": "MIT" + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz", + "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } }, "node_modules/object-inspect": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -6460,18 +8147,45 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/ollama": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/ollama/-/ollama-0.5.8.tgz", + "integrity": "sha512-frBGdfSV34i7JybLZUeyCYDx0CMyDiG4On8xOK+cNRWM04HImhoWgIMpF4p7vTkQumadbSxOteR7SZyKqNmOXg==", + "dependencies": { + "whatwg-fetch": "^3.6.20" + } + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/onetime": { "version": "6.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dependencies": { "mimic-fn": "^4.0.0" }, @@ -6484,7 +8198,8 @@ }, "node_modules/ora": { "version": "8.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.0.1.tgz", + "integrity": "sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==", "dependencies": { "chalk": "^5.3.0", "cli-cursor": "^4.0.0", @@ -6503,11 +8218,77 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ora/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6516,7 +8297,6 @@ "version": "0.28.2", "resolved": "https://registry.npmjs.org/ow/-/ow-0.28.2.tgz", "integrity": "sha512-dD4UpyBh/9m4X2NVjA+73/ZPBRF+uF4zIMFvvQsabMiEK8x41L3rQ8EENOi35kyyoaJwNxEeJcP6Fj1H4U409Q==", - "license": "MIT", "dependencies": { "@sindresorhus/is": "^4.2.0", "callsites": "^3.1.0", @@ -6535,7 +8315,6 @@ "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -6547,16 +8326,16 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-4.0.1.tgz", "integrity": "sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==", - "license": "MIT", "engines": { "node": ">=14.16" } }, "node_modules/p-limit": { - "version": "5.0.0", - "license": "MIT", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.1.0.tgz", + "integrity": "sha512-H0jc0q1vOzlEk0TqAKXKZxdl7kX3OFUzCnNVUnq5Pc3DGo0kpeaMuPqxQn235HibwBEb0/pm9dgKTjXy66fBkg==", "dependencies": { - "yocto-queue": "^1.0.0" + "yocto-queue": "^1.1.1" }, "engines": { "node": ">=18" @@ -6566,36 +8345,25 @@ } }, "node_modules/p-locate": { - "version": "5.0.0", - "license": "MIT", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dependencies": { - "p-limit": "^3.0.2" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/p-locate/node_modules/p-limit": { - "version": "3.1.0", - "license": "MIT", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dependencies": { - "yocto-queue": "^0.1.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate/node_modules/p-limit/node_modules/yocto-queue": { - "version": "0.1.0", - "license": "MIT", - "engines": { - "node": ">=10" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -6603,7 +8371,8 @@ }, "node_modules/p-queue": { "version": "8.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.0.1.tgz", + "integrity": "sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==", "dependencies": { "eventemitter3": "^5.0.1", "p-timeout": "^6.1.2" @@ -6617,7 +8386,8 @@ }, "node_modules/p-timeout": { "version": "6.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz", + "integrity": "sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==", "engines": { "node": ">=14.16" }, @@ -6627,11 +8397,17 @@ }, "node_modules/p-try": { "version": "2.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "engines": { "node": ">=6" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" + }, "node_modules/parent-require": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parent-require/-/parent-require-1.0.0.tgz", @@ -6644,7 +8420,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz", "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==", - "license": "MIT", "dependencies": { "@types/nlcst": "^2.0.0", "@types/unist": "^3.0.0", @@ -6660,7 +8435,8 @@ }, "node_modules/parse5": { "version": "7.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dependencies": { "entities": "^4.4.0" }, @@ -6672,7 +8448,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", - "license": "MIT", "dependencies": { "domhandler": "^5.0.2", "parse5": "^7.0.0" @@ -6681,29 +8456,62 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "license": "MIT" + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" }, "node_modules/path-exists": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "engines": { "node": ">=8" } }, "node_modules/path-key": { "version": "3.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "engines": { "node": ">=8" } }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/path-to-regexp": { "version": "6.2.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", + "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==" }, "node_modules/pathe": { "version": "1.1.2", @@ -6722,19 +8530,14 @@ "version": "0.0.11", "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", - "license": [ - "MIT", - "Apache2" - ], "dependencies": { "through": "~2.3" } }, "node_modules/peek-readable": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", - "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==", - "license": "MIT", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.1.4.tgz", + "integrity": "sha512-E7mY2VmKqw9jYuXrSWGHFuPCW2SLQenzXLF3amGaY6lXXg4/b3gj5HVM7h8ZjCO/nZS9ICs0Cz285+32FvNd/A==", "engines": { "node": ">=14.16" }, @@ -6745,11 +8548,13 @@ }, "node_modules/picocolors": { "version": "1.0.1", - "license": "ISC" + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/picomatch": { "version": "2.3.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "engines": { "node": ">=8.6" }, @@ -6759,260 +8564,46 @@ }, "node_modules/pify": { "version": "4.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "engines": { "node": ">=6" } }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "license": "MIT", + "node_modules/pino": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.3.2.tgz", + "integrity": "sha512-WtARBjgZ7LNEkrGWxMBN/jvlFiE17LTbBoH0konmBU684Kd0uIiDwBXlcTCW7iJnA6HfIKwUssS/2AC6cDEanw==", "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up/node_modules/locate-path": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up/node_modules/locate-path/node_modules/p-locate": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up/node_modules/locate-path/node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/playwright": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.45.0.tgz", - "integrity": "sha512-4z3ac3plDfYzGB6r0Q3LF8POPR20Z8D0aXcxbJvmfMgSSq1hkcgvFRXJk9rUq5H/MJ0Ktal869hhOdI/zUTeLA==", - "license": "Apache-2.0", - "dependencies": { - "playwright-core": "1.45.0" + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.2.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^4.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" }, "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "fsevents": "2.3.2" + "pino": "bin.js" } }, - "node_modules/playwright-core": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.45.0.tgz", - "integrity": "sha512-lZmHlFQ0VYSpAs43dRq1/nJ9G/6SiTI7VPqidld9TDefL9tX87bTKExWZZUF5PeRyqtXqd8fQi2qmfIedkwsNQ==", - "license": "Apache-2.0", - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/postcss": { - "version": "8.4.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", - "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", + "node_modules/pino-abstract-transport": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", + "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" + "readable-stream": "^4.0.0", + "split2": "^4.0.0" } }, - "node_modules/preferred-pm": { - "version": "3.1.3", - "license": "MIT", - "dependencies": { - "find-up": "^5.0.0", - "find-yarn-workspace-root2": "1.2.16", - "path-exists": "^4.0.0", - "which-pm": "2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/preferred-pm/node_modules/which-pm": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "load-yaml-file": "^0.2.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8.15" - } - }, - "node_modules/prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prompts/node_modules/kleur": { - "version": "3.0.3", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/proper-lockfile": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", - "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "retry": "^0.12.0", - "signal-exit": "^3.0.2" - } - }, - "node_modules/proper-lockfile/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/property-information": { - "version": "6.5.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/proxy-chain": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/proxy-chain/-/proxy-chain-2.5.1.tgz", - "integrity": "sha512-gGKYJdqE/uk/ncp2LGjbTT7ivjYuRAfhPU4/2VnccF2sSbQDR4YJROVnDkjLbBSLIDesAaoKav8WBLLv6YXwfA==", - "license": "Apache-2.0", - "dependencies": { - "socks": "^2.8.3", - "socks-proxy-agent": "^8.0.3", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "license": "MIT" - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/punycode.js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.3.tgz", - "integrity": "sha512-AWJm14H1vVaO/iNZ4/hO+HyaTehuy9nRqVdkTqlJt0HWvBiBIEXFmb4C0DGeYo3Xes9rrEW+TxHsaigCbN5ICQ==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "license": "MIT" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", + "node_modules/pino-abstract-transport/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "funding": [ { "type": "github", @@ -7027,13 +8618,320 @@ "url": "https://feross.org/support" } ], - "license": "MIT" + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/pino-abstract-transport/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/pino-abstract-transport/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", + "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==" + }, + "node_modules/pino/node_modules/process-warning": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.0.tgz", + "integrity": "sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==" + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/playwright": { + "version": "1.46.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.46.1.tgz", + "integrity": "sha512-oPcr1yqoXLCkgKtD5eNUPLiN40rYEM39odNpIb6VE6S7/15gJmA1NzVv6zJYusV0e7tzvkU/utBFNa/Kpxmwng==", + "dependencies": { + "playwright-core": "1.46.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.46.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.46.1.tgz", + "integrity": "sha512-h9LqIQaAv+CYvWzsZ+h3RsrqCStkBHlgo6/TJlFst3cOTlLghBQlJwPOZKQJTKNaD3QIB7aAVQ+gfWbN3NXB7A==", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/postcss": { + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preferred-pm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-4.0.0.tgz", + "integrity": "sha512-gYBeFTZLu055D8Vv3cSPox/0iTPtkzxpLroSYYA7WXgRi31WCJ51Uyl8ZiPeUUjyvs2MBzK+S8v9JVUgHU/Sqw==", + "dependencies": { + "find-up-simple": "^1.0.0", + "find-yarn-workspace-root2": "1.2.16", + "which-pm": "^3.0.0" + }, + "engines": { + "node": ">=18.12" + } + }, + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "optional": true, + "peer": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/process-warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prompts/node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "node_modules/proper-lockfile/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-chain": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/proxy-chain/-/proxy-chain-2.5.2.tgz", + "integrity": "sha512-sWT6qZA6xTTxeT70QP3pe0QusE7nYAYUswVYQBPZY5HUZ1UDZR/DMYn7scvhQs0+BH/ROIgXHj5mfnzo8wwT4Q==", + "dependencies": { + "socks": "^2.8.3", + "socks-proxy-agent": "^8.0.3", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" }, "node_modules/quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -7041,6 +8939,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -7073,38 +8979,28 @@ } }, "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/readable-web-to-node-stream": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", - "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", - "license": "MIT", - "dependencies": { - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/readdirp": { "version": "3.6.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dependencies": { "picomatch": "^2.2.1" }, @@ -7112,9 +9008,18 @@ "node": ">=8.10.0" } }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "engines": { + "node": ">= 12.13.0" + } + }, "node_modules/rehype": { "version": "13.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.1.tgz", + "integrity": "sha512-AcSLS2mItY+0fYu9xKxOu1LhUZeBZZBx8//5HKzF+0XP+eP8+6a5MXn2+DW2kfXR6Dtp1FEXMVrjyKAcvcU8vg==", "dependencies": { "@types/hast": "^3.0.0", "rehype-parse": "^9.0.0", @@ -7128,7 +9033,8 @@ }, "node_modules/rehype-parse": { "version": "9.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.0.tgz", + "integrity": "sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==", "dependencies": { "@types/hast": "^3.0.0", "hast-util-from-html": "^2.0.0", @@ -7143,7 +9049,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", - "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "hast-util-raw": "^9.0.0", @@ -7156,7 +9061,8 @@ }, "node_modules/rehype-stringify": { "version": "10.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.0.tgz", + "integrity": "sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==", "dependencies": { "@types/hast": "^3.0.0", "hast-util-to-html": "^9.0.0", @@ -7171,7 +9077,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", - "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", @@ -7189,7 +9094,6 @@ "version": "11.0.0", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", - "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", @@ -7205,7 +9109,6 @@ "version": "11.1.0", "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", - "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -7222,7 +9125,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.2.tgz", "integrity": "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==", - "license": "MIT", "dependencies": { "retext": "^9.0.0", "retext-smartypants": "^6.0.0", @@ -7237,7 +9139,6 @@ "version": "11.0.0", "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", - "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", @@ -7251,12 +9152,20 @@ "node_modules/request-light": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.7.0.tgz", - "integrity": "sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==", - "license": "MIT" + "integrity": "sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==" }, "node_modules/require-directory": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "engines": { "node": ">=0.10.0" } @@ -7264,20 +9173,17 @@ "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "license": "MIT" + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "node_modules/resolve-alpn": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "license": "MIT" + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" }, "node_modules/resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" }, @@ -7289,7 +9195,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", "engines": { "node": ">=8" } @@ -7299,7 +9204,6 @@ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } @@ -7308,7 +9212,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "license": "MIT", "dependencies": { "lowercase-keys": "^3.0.0" }, @@ -7320,22 +9223,29 @@ } }, "node_modules/restore-cursor": { - "version": "4.0.0", - "license": "MIT", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" + } + }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" } }, "node_modules/restore-cursor/node_modules/onetime": { "version": "5.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -7346,22 +9256,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/restore-cursor/node_modules/onetime/node_modules/mimic-fn": { - "version": "2.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/restore-cursor/node_modules/signal-exit": { "version": "3.0.7", - "license": "ISC" + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/ret": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.4.3.tgz", + "integrity": "sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==", + "engines": { + "node": ">=10" + } }, "node_modules/retext": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz", "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==", - "license": "MIT", "dependencies": { "@types/nlcst": "^2.0.0", "retext-latin": "^4.0.0", @@ -7377,7 +9288,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-4.0.0.tgz", "integrity": "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==", - "license": "MIT", "dependencies": { "@types/nlcst": "^2.0.0", "parse-latin": "^7.0.0", @@ -7392,7 +9302,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.1.0.tgz", "integrity": "sha512-LDPXg95346bqFZnDMHo0S7Rq5p64+B+N8Vz733+wPMDtwb9rCOs9LIdIEhrUOU+TAywX9St+ocQWJt8wrzivcQ==", - "license": "MIT", "dependencies": { "@types/nlcst": "^2.0.0", "nlcst-to-string": "^4.0.0", @@ -7407,7 +9316,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-4.0.0.tgz", "integrity": "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==", - "license": "MIT", "dependencies": { "@types/nlcst": "^2.0.0", "nlcst-to-string": "^4.0.0", @@ -7422,31 +9330,36 @@ "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/reusify": { "version": "1.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==" + }, "node_modules/robots-parser": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/robots-parser/-/robots-parser-3.0.1.tgz", "integrity": "sha512-s+pyvQeIKIZ0dx5iJiQk1tPLJAWln39+MI5jtM8wnyws+G5azk+dMnMX0qfbqNetKKNgcWWOdi0sfm+FbQbgdQ==", - "license": "MIT", "engines": { "node": ">=10.0.0" } }, "node_modules/rollup": { - "version": "4.18.0", - "license": "MIT", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.0.tgz", + "integrity": "sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ==", "dependencies": { "@types/estree": "1.0.5" }, @@ -7458,42 +9371,42 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.18.0", - "@rollup/rollup-android-arm64": "4.18.0", - "@rollup/rollup-darwin-arm64": "4.18.0", - "@rollup/rollup-darwin-x64": "4.18.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", - "@rollup/rollup-linux-arm-musleabihf": "4.18.0", - "@rollup/rollup-linux-arm64-gnu": "4.18.0", - "@rollup/rollup-linux-arm64-musl": "4.18.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", - "@rollup/rollup-linux-riscv64-gnu": "4.18.0", - "@rollup/rollup-linux-s390x-gnu": "4.18.0", - "@rollup/rollup-linux-x64-gnu": "4.18.0", - "@rollup/rollup-linux-x64-musl": "4.18.0", - "@rollup/rollup-win32-arm64-msvc": "4.18.0", - "@rollup/rollup-win32-ia32-msvc": "4.18.0", - "@rollup/rollup-win32-x64-msvc": "4.18.0", + "@rollup/rollup-android-arm-eabi": "4.21.0", + "@rollup/rollup-android-arm64": "4.21.0", + "@rollup/rollup-darwin-arm64": "4.21.0", + "@rollup/rollup-darwin-x64": "4.21.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.21.0", + "@rollup/rollup-linux-arm-musleabihf": "4.21.0", + "@rollup/rollup-linux-arm64-gnu": "4.21.0", + "@rollup/rollup-linux-arm64-musl": "4.21.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.21.0", + "@rollup/rollup-linux-riscv64-gnu": "4.21.0", + "@rollup/rollup-linux-s390x-gnu": "4.21.0", + "@rollup/rollup-linux-x64-gnu": "4.21.0", + "@rollup/rollup-linux-x64-musl": "4.21.0", + "@rollup/rollup-win32-arm64-msvc": "4.21.0", + "@rollup/rollup-win32-ia32-msvc": "4.21.0", + "@rollup/rollup-win32-x64-msvc": "4.21.0", "fsevents": "~2.3.2" } }, "node_modules/rrweb-cssom": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", - "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", - "license": "MIT" + "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==" }, "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/run-parallel": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "funding": [ { "type": "github", @@ -7508,7 +9421,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -7517,7 +9429,6 @@ "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" } @@ -7539,26 +9450,38 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] + }, + "node_modules/safe-regex2": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-3.1.0.tgz", + "integrity": "sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==", + "dependencies": { + "ret": "~0.4.0" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sax": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", - "license": "ISC" + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" }, "node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "license": "ISC", "dependencies": { "xmlchars": "^2.2.0" }, @@ -7576,7 +9499,8 @@ }, "node_modules/section-matter": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" @@ -7585,21 +9509,85 @@ "node": ">=4" } }, + "node_modules/secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" + }, "node_modules/semver": { - "version": "7.6.2", - "license": "ISC", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" }, "engines": { - "node": ">=10" + "node": ">= 0.8.0" } }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==" + }, + "node_modules/set-cookie-parser": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.0.tgz", + "integrity": "sha512-lXLOiqpkUumhRdFF3k1osNXCy9akgx/dyPZ5p8qAg9seJzXr5ZrlqZuWIMuY6ejOsVLE6flJ5/h3lsn57fQ/PQ==" + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -7612,48 +9600,66 @@ "node": ">= 0.4" } }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, "node_modules/sharp": { - "version": "0.33.4", + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", "hasInstallScript": true, - "license": "Apache-2.0", "optional": true, "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", - "semver": "^7.6.0" + "semver": "^7.6.3" }, "engines": { - "libvips": ">=8.15.2", "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.4", - "@img/sharp-darwin-x64": "0.33.4", - "@img/sharp-libvips-darwin-arm64": "1.0.2", - "@img/sharp-libvips-darwin-x64": "1.0.2", - "@img/sharp-libvips-linux-arm": "1.0.2", - "@img/sharp-libvips-linux-arm64": "1.0.2", - "@img/sharp-libvips-linux-s390x": "1.0.2", - "@img/sharp-libvips-linux-x64": "1.0.2", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.2", - "@img/sharp-libvips-linuxmusl-x64": "1.0.2", - "@img/sharp-linux-arm": "0.33.4", - "@img/sharp-linux-arm64": "0.33.4", - "@img/sharp-linux-s390x": "0.33.4", - "@img/sharp-linux-x64": "0.33.4", - "@img/sharp-linuxmusl-arm64": "0.33.4", - "@img/sharp-linuxmusl-x64": "0.33.4", - "@img/sharp-wasm32": "0.33.4", - "@img/sharp-win32-ia32": "0.33.4", - "@img/sharp-win32-x64": "0.33.4" + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/shebang-command": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -7663,18 +9669,18 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "engines": { "node": ">=8" } }, "node_modules/shiki": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.10.3.tgz", - "integrity": "sha512-eneCLncGuvPdTutJuLyUGS8QNPAVFO5Trvld2wgEq1e002mwctAhJKeMGWtWVXOIEzmlcLRqcgPSorR6AVzOmQ==", - "license": "MIT", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.14.1.tgz", + "integrity": "sha512-FujAN40NEejeXdzPt+3sZ3F2dx1U24BY2XTY01+MG8mbxCiA2XukXdcbyMyLAHJ/1AUUnQd1tZlvIjefWWEJeA==", "dependencies": { - "@shikijs/core": "1.10.3", + "@shikijs/core": "1.14.1", "@types/hast": "^3.0.4" } }, @@ -7682,7 +9688,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -7703,7 +9708,8 @@ }, "node_modules/signal-exit": { "version": "4.1.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "engines": { "node": ">=14" }, @@ -7713,7 +9719,8 @@ }, "node_modules/simple-swizzle": { "version": "0.2.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", "optional": true, "dependencies": { "is-arrayish": "^0.3.1" @@ -7721,13 +9728,13 @@ }, "node_modules/sisteransi": { "version": "1.0.5", - "license": "MIT" + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, "node_modules/sitemap": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.2.tgz", "integrity": "sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==", - "license": "MIT", "dependencies": { "@types/node": "^17.0.5", "@types/sax": "^1.2.1", @@ -7745,14 +9752,20 @@ "node_modules/sitemap/node_modules/@types/node": { "version": "17.0.45", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", - "license": "MIT" + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" + }, + "node_modules/slugify": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", + "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", + "engines": { + "node": ">=8.0.0" + } }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "license": "MIT", "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -7762,7 +9775,6 @@ "version": "2.8.3", "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", - "license": "MIT", "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" @@ -7776,7 +9788,6 @@ "version": "8.0.4", "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", - "license": "MIT", "dependencies": { "agent-base": "^7.1.1", "debug": "^4.3.4", @@ -7786,18 +9797,26 @@ "node": ">= 14" } }, + "node_modules/sonic-boom": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.0.1.tgz", + "integrity": "sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, "node_modules/source-map-js": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/space-separated-tokens": { "version": "2.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -7807,7 +9826,6 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", - "license": "MIT", "dependencies": { "through": "2" }, @@ -7815,15 +9833,32 @@ "node": "*" } }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, "node_modules/sprintf-js": { - "version": "1.0.3", - "license": "BSD-3-Clause" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==" }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/std-env": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", @@ -7831,7 +9866,8 @@ }, "node_modules/stdin-discarder": { "version": "0.2.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", "engines": { "node": ">=18" }, @@ -7842,14 +9878,12 @@ "node_modules/stream-chain": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.2.5.tgz", - "integrity": "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==", - "license": "BSD-3-Clause" + "integrity": "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==" }, "node_modules/stream-combiner": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==", - "license": "MIT", "dependencies": { "duplexer": "~0.1.1" } @@ -7858,7 +9892,6 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.8.0.tgz", "integrity": "sha512-HZfXngYHUAr1exT4fxlbc1IOce1RYxp2ldeaf97LYCOPSoOqY/1Psp7iGvpb+6JIOgkra9zDYnPX01hGAHzEPw==", - "license": "BSD-3-Clause", "dependencies": { "stream-chain": "^2.2.5" } @@ -7866,23 +9899,33 @@ "node_modules/stream-replace-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/stream-replace-string/-/stream-replace-string-2.0.0.tgz", - "integrity": "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==", - "license": "MIT" + "integrity": "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==" + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } }, "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { - "safe-buffer": "~5.2.0" + "safe-buffer": "~5.1.0" } }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, "node_modules/string-comparison": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string-comparison/-/string-comparison-1.3.0.tgz", "integrity": "sha512-46aD+slEwybxAMPRII83ATbgMgTiz5P8mVd7Z6VJsCzSHFjdt1hkAVLeFxPIyEb11tc6ihpJTlIqoO0MCF6NPw==", - "license": "MIT", "engines": { "node": "^16.0.0 || >=18.0.0" } @@ -7891,7 +9934,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "license": "MIT", "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -7904,9 +9946,48 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/string-width-cjs": { + "name": "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==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "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==" + }, + "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==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/stringify-entities": { "version": "4.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" @@ -7918,7 +9999,8 @@ }, "node_modules/strip-ansi": { "version": "7.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -7929,23 +10011,46 @@ "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==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "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==", + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "engines": { "node": ">=4" } }, "node_modules/strip-bom-string": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", "engines": { "node": ">=0.10.0" } }, "node_modules/strip-final-newline": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "engines": { "node": ">=12" }, @@ -7954,16 +10059,15 @@ } }, "node_modules/strtok3": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", - "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", - "license": "MIT", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-8.1.0.tgz", + "integrity": "sha512-ExzDvHYPj6F6QkSNe/JxSlBxTh3OrI6wrAIz53ulxo1c4hBJ1bT9C/JrAthEKHWG9riVH3Xzg7B03Oxty6S2Lw==", "dependencies": { "@tokenizer/token": "^0.3.0", - "peek-readable": "^5.0.0" + "peek-readable": "^5.1.4" }, "engines": { - "node": ">=14.16" + "node": ">=16" }, "funding": { "type": "github", @@ -7974,7 +10078,6 @@ "version": "9.0.2", "resolved": "https://registry.npmjs.org/superagent/-/superagent-9.0.2.tgz", "integrity": "sha512-xuW7dzkUpcJq7QnhOsnNUgtYp3xRwpt2F7abdRYIpCsAt0hhUqia0EdxyXZQQpNmGtsCzYHryaKSV3q3GJnq7w==", - "license": "MIT", "dependencies": { "component-emitter": "^1.3.0", "cookiejar": "^2.1.4", @@ -7990,9 +10093,21 @@ "node": ">=14.18.0" } }, + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/supports-color": { "version": "5.5.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dependencies": { "has-flag": "^3.0.0" }, @@ -8001,9 +10116,9 @@ } }, "node_modules/swiper": { - "version": "11.1.4", - "resolved": "https://registry.npmjs.org/swiper/-/swiper-11.1.4.tgz", - "integrity": "sha512-1n7kbYJB2dFEpUHRFszq7gys/ofIBrMNibwTiMvPHwneKND/t9kImnHt6CfGPScMHgI+dWMbGTycCKGMoOO1KA==", + "version": "11.1.9", + "resolved": "https://registry.npmjs.org/swiper/-/swiper-11.1.9.tgz", + "integrity": "sha512-rflu8zvfGa3x1v/aeSufk4zRJffhOQowyvtJlp46sUBnOqAuk1Rdv5Ldj0AWWBV595iZ+ZMk7VB35ZRtRUomtA==", "funding": [ { "type": "patreon", @@ -8021,30 +10136,46 @@ "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "license": "MIT" + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, + "node_modules/thingies": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", + "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", + "engines": { + "node": ">=10.18" + }, + "peerDependencies": { + "tslib": "^2" + } + }, + "node_modules/thread-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", + "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", + "dependencies": { + "real-require": "^0.2.0" + } }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "license": "MIT" + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, "node_modules/tiny-typed-emitter": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz", - "integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==", - "license": "MIT" + "integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==" }, "node_modules/tinybench": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz", - "integrity": "sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==" + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==" }, "node_modules/tinypool": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.0.tgz", - "integrity": "sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.1.tgz", + "integrity": "sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==", "engines": { "node": "^18.0.0 || >=20.0.0" } @@ -8066,28 +10197,25 @@ } }, "node_modules/tldts": { - "version": "6.1.30", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.30.tgz", - "integrity": "sha512-NErlfxa+LPJynXZ07f86N6ylkXhYaOL4rB2k+qwF69cdvol1IJHmlouXE8c7Hrqr1BiYNWL4qbdTxaX+szfOpQ==", - "license": "MIT", + "version": "6.1.40", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.40.tgz", + "integrity": "sha512-SAvDKQxzqoi2gaC14XdC1egLtBqcCnYTe/hKM07FMXSTKw4Tti3fRDcZopWJGAhXK0H6LfuM0QWwZhECUvLKTg==", "dependencies": { - "tldts-core": "^6.1.30" + "tldts-core": "^6.1.40" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "6.1.30", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.30.tgz", - "integrity": "sha512-CPlL58/oIvnovk5KTHIho/B0bMuvPkZrcC7f4pfQH+BBPY/mMz6CekiIdhjFxk9XZZJNirbwh1rRTSo4e5KXQA==", - "license": "MIT" + "version": "6.1.40", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.40.tgz", + "integrity": "sha512-csGlF+5GtK0qDvkqhZHbMflIvvMqs7JS3Y3KMrfBuhDAjI+oqH90p4KYMeiCPVF7akTeNoLgFaQ+aPZcGBc1kg==" }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "license": "MIT", "dependencies": { "os-tmpdir": "~1.0.2" }, @@ -8097,14 +10225,16 @@ }, "node_modules/to-fast-properties": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "engines": { "node": ">=4" } }, "node_modules/to-regex-range": { "version": "5.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dependencies": { "is-number": "^7.0.0" }, @@ -8112,11 +10242,26 @@ "node": ">=8.0" } }, + "node_modules/toad-cache": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz", + "integrity": "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/token-types": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", - "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", - "license": "MIT", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.0.0.tgz", + "integrity": "sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==", "dependencies": { "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" @@ -8133,7 +10278,6 @@ "version": "4.1.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "license": "BSD-3-Clause", "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -8148,7 +10292,6 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "license": "MIT", "engines": { "node": ">= 4.0.0" } @@ -8157,7 +10300,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", - "license": "MIT", "dependencies": { "punycode": "^2.3.1" }, @@ -8165,9 +10307,25 @@ "node": ">=18" } }, + "node_modules/tree-dump": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", + "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/trim-lines": { "version": "3.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -8175,17 +10333,75 @@ }, "node_modules/trough": { "version": "2.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/tsconfck": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.1.tgz", "integrity": "sha512-00eoI6WY57SvZEVjm13stEVE90VkEdJAFGgpFLTsZbJyW/LwFQ7uQxJHWpZ2hzSWgCPKc9AnBnNP+0X7o3hAmQ==", - "license": "MIT", "bin": { "tsconfck": "bin/tsconfck.js" }, @@ -8203,16 +10419,16 @@ }, "node_modules/tslib": { "version": "2.6.3", - "license": "0BSD" + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, "node_modules/tsx": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.16.0.tgz", - "integrity": "sha512-MPgN+CuY+4iKxGoJNPv+1pyo5YWZAQ5XfsyobUG+zoKG7IkvCPLZDEyoIb8yLS2FcWci1nlxAqmvPlFWD5AFiQ==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.17.0.tgz", + "integrity": "sha512-eN4mnDA5UMKDt4YZixo9tBioibaMBpoxBkD+rIPAjVmYERSG0/dWEY1CEFuV89CgASlKL499q8AhmkMnnjtOJg==", "dev": true, - "license": "MIT", "dependencies": { - "esbuild": "~0.21.5", + "esbuild": "~0.23.0", "get-tsconfig": "^4.7.5" }, "bin": { @@ -8225,24 +10441,417 @@ "fsevents": "~2.3.3" } }, - "node_modules/tsx/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "cpu": [ + "arm64" + ], "dev": true, - "hasInstallScript": true, - "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" } }, "node_modules/type-fest": { "version": "2.19.0", - "license": "(MIT OR CC0-1.0)", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "engines": { "node": ">=12.20" }, @@ -8250,16 +10859,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, "node_modules/typesafe-path": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/typesafe-path/-/typesafe-path-0.2.2.tgz", - "integrity": "sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==", - "license": "MIT" + "integrity": "sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==" }, "node_modules/typescript": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", - "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -8272,37 +10897,64 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/typescript-auto-import-cache/-/typescript-auto-import-cache-0.3.3.tgz", "integrity": "sha512-ojEC7+Ci1ij9eE6hp8Jl9VUNnsEKzztktP5gtYNRMrTmfXVwA1PITYYAkpxCvvupdSYa/Re51B6KMcv1CTZEUA==", - "license": "MIT", "dependencies": { "semver": "^7.3.8" } }, + "node_modules/typescript-auto-import-cache/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/uc.micro": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "license": "MIT" + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==" }, "node_modules/uhyphen": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/uhyphen/-/uhyphen-0.2.0.tgz", - "integrity": "sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==", - "license": "ISC" + "integrity": "sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==" + }, + "node_modules/uint8array-extras": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.4.0.tgz", + "integrity": "sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/ultrahtml": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.5.3.tgz", "integrity": "sha512-GykOvZwgDWZlTQMtp5jrD4BVL+gNn2NVlVafjcFUJ7taY20tqYdwdoWBFy6GBJsNTZe1GkGPkSl5knQAjtgceg==" }, + "node_modules/undici": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.8.tgz", + "integrity": "sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==", + "engines": { + "node": ">=18.17" + } + }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "license": "MIT" + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" }, "node_modules/unified": { "version": "11.0.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", @@ -8321,7 +10973,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", - "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" @@ -8333,7 +10984,8 @@ }, "node_modules/unist-util-is": { "version": "6.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", "dependencies": { "@types/unist": "^3.0.0" }, @@ -8346,7 +10998,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-4.0.0.tgz", "integrity": "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==", - "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "array-iterate": "^2.0.0" @@ -8358,7 +11009,8 @@ }, "node_modules/unist-util-position": { "version": "5.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", "dependencies": { "@types/unist": "^3.0.0" }, @@ -8371,7 +11023,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", - "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" @@ -8383,7 +11034,8 @@ }, "node_modules/unist-util-stringify-position": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "dependencies": { "@types/unist": "^3.0.0" }, @@ -8394,7 +11046,8 @@ }, "node_modules/unist-util-visit": { "version": "5.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", @@ -8409,7 +11062,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-3.0.0.tgz", "integrity": "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==", - "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, @@ -8420,7 +11072,8 @@ }, "node_modules/unist-util-visit-parents": { "version": "6.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" @@ -8434,13 +11087,14 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/update-browserslist-db": { - "version": "1.0.16", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "funding": [ { "type": "opencollective", @@ -8455,7 +11109,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "escalade": "^3.1.2", "picocolors": "^1.0.1" @@ -8467,11 +11120,15 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" + }, "node_modules/url-parse": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "license": "MIT", "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -8480,21 +11137,26 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true }, "node_modules/vali-date": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", "integrity": "sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg==", - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/vfile": { - "version": "6.0.1", - "license": "MIT", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", + "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==", "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0", @@ -8506,8 +11168,9 @@ } }, "node_modules/vfile-location": { - "version": "5.0.2", - "license": "MIT", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" @@ -8519,7 +11182,8 @@ }, "node_modules/vfile-message": { "version": "4.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" @@ -8530,13 +11194,12 @@ } }, "node_modules/vite": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.3.tgz", - "integrity": "sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A==", - "license": "MIT", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.1.tgz", + "integrity": "sha512-1oE6yuNXssjrZdblI9AfBbHCC41nnyoVoEZxQnID6yvQZAFBzxxkqoFLtHUMkYunL8hwOLEjgTuxpkRxvba3kA==", "dependencies": { "esbuild": "^0.21.3", - "postcss": "^8.4.39", + "postcss": "^8.4.41", "rollup": "^4.13.0" }, "bin": { @@ -8556,6 +11219,7 @@ "less": "*", "lightningcss": "^1.21.0", "sass": "*", + "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" @@ -8573,6 +11237,9 @@ "sass": { "optional": true }, + "sass-embedded": { + "optional": true + }, "stylus": { "optional": true }, @@ -8585,9 +11252,9 @@ } }, "node_modules/vite-node": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.0.3.tgz", - "integrity": "sha512-14jzwMx7XTcMB+9BhGQyoEAmSl0eOr3nrnn+Z12WNERtOvLN+d2scbRUvyni05rT3997Bg+rZb47NyP4IQPKXg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.0.5.tgz", + "integrity": "sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==", "dependencies": { "cac": "^6.7.14", "debug": "^4.3.5", @@ -8605,23 +11272,32 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/vite/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node_modules/vite-plugin-commonjs": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/vite-plugin-commonjs/-/vite-plugin-commonjs-0.10.1.tgz", + "integrity": "sha512-taP8R9kYGlCW5OzkVR0UIWRCnG6rSxeWWuA7tnU5b9t5MniibOnDY219NhisTeDhJAeGT8cEnrhVWZ9A5yD+vg==", + "dependencies": { + "acorn": "^8.8.2", + "fast-glob": "^3.2.12", + "magic-string": "^0.30.1", + "vite-plugin-dynamic-import": "^1.5.0" + } + }, + "node_modules/vite-plugin-dynamic-import": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/vite-plugin-dynamic-import/-/vite-plugin-dynamic-import-1.5.0.tgz", + "integrity": "sha512-Qp85c+AVJmLa8MLni74U4BDiWpUeFNx7NJqbGZyR2XJOU7mgW0cb7nwlAMucFyM4arEd92Nfxp4j44xPi6Fu7g==", + "dependencies": { + "acorn": "^8.8.2", + "es-module-lexer": "^1.2.1", + "fast-glob": "^3.2.12", + "magic-string": "^0.30.1" } }, "node_modules/vitefu": { "version": "0.2.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", + "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" }, @@ -8632,17 +11308,17 @@ } }, "node_modules/vitest": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.0.3.tgz", - "integrity": "sha512-o3HRvU93q6qZK4rI2JrhKyZMMuxg/JRt30E6qeQs6ueaiz5hr1cPj+Sk2kATgQzMMqsa2DiNI0TIK++1ULx8Jw==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.0.5.tgz", + "integrity": "sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==", "dependencies": { "@ampproject/remapping": "^2.3.0", - "@vitest/expect": "2.0.3", - "@vitest/pretty-format": "^2.0.3", - "@vitest/runner": "2.0.3", - "@vitest/snapshot": "2.0.3", - "@vitest/spy": "2.0.3", - "@vitest/utils": "2.0.3", + "@vitest/expect": "2.0.5", + "@vitest/pretty-format": "^2.0.5", + "@vitest/runner": "2.0.5", + "@vitest/snapshot": "2.0.5", + "@vitest/spy": "2.0.5", + "@vitest/utils": "2.0.5", "chai": "^5.1.1", "debug": "^4.3.5", "execa": "^8.0.1", @@ -8653,8 +11329,8 @@ "tinypool": "^1.0.0", "tinyrainbow": "^1.2.0", "vite": "^5.0.0", - "vite-node": "2.0.3", - "why-is-node-running": "^2.2.2" + "vite-node": "2.0.5", + "why-is-node-running": "^2.3.0" }, "bin": { "vitest": "vitest.mjs" @@ -8668,8 +11344,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.0.3", - "@vitest/ui": "2.0.3", + "@vitest/browser": "2.0.5", + "@vitest/ui": "2.0.5", "happy-dom": "*", "jsdom": "*" }, @@ -8695,17 +11371,16 @@ } }, "node_modules/volar-service-css": { - "version": "0.0.59", - "resolved": "https://registry.npmjs.org/volar-service-css/-/volar-service-css-0.0.59.tgz", - "integrity": "sha512-gLNjJnECbalPvQB7qeJjhkDN8sR5M3ItbVYjnyio61aHaWptIiXm/HfDahcQ2ApwmvWidkMWWegjGq5L0BENDA==", - "license": "MIT", + "version": "0.0.61", + "resolved": "https://registry.npmjs.org/volar-service-css/-/volar-service-css-0.0.61.tgz", + "integrity": "sha512-Ct9L/w+IB1JU8F4jofcNCGoHy6TF83aiapfZq9A0qYYpq+Kk5dH+ONS+rVZSsuhsunq8UvAuF8Gk6B8IFLfniw==", "dependencies": { "vscode-css-languageservice": "^6.3.0", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" }, "peerDependencies": { - "@volar/language-service": "~2.4.0-alpha.12" + "@volar/language-service": "~2.4.0" }, "peerDependenciesMeta": { "@volar/language-service": { @@ -8714,10 +11389,9 @@ } }, "node_modules/volar-service-emmet": { - "version": "0.0.59", - "resolved": "https://registry.npmjs.org/volar-service-emmet/-/volar-service-emmet-0.0.59.tgz", - "integrity": "sha512-6EynHcuMwMBETpK29TbZvIMmvzdVG+Tkokk9VWfZeI+SwDptk2tgdhEqiXXvIkqYNgbuu73Itp66lpH76cAU+Q==", - "license": "MIT", + "version": "0.0.61", + "resolved": "https://registry.npmjs.org/volar-service-emmet/-/volar-service-emmet-0.0.61.tgz", + "integrity": "sha512-iiYqBxjjcekqrRruw4COQHZME6EZYWVbkHjHDbULpml3g8HGJHzpAMkj9tXNCPxf36A+f1oUYjsvZt36qPg4cg==", "dependencies": { "@emmetio/css-parser": "^0.4.0", "@emmetio/html-matcher": "^1.3.0", @@ -8725,7 +11399,7 @@ "vscode-uri": "^3.0.8" }, "peerDependencies": { - "@volar/language-service": "~2.4.0-alpha.12" + "@volar/language-service": "~2.4.0" }, "peerDependenciesMeta": { "@volar/language-service": { @@ -8734,17 +11408,16 @@ } }, "node_modules/volar-service-html": { - "version": "0.0.59", - "resolved": "https://registry.npmjs.org/volar-service-html/-/volar-service-html-0.0.59.tgz", - "integrity": "sha512-hEXOsYpILDlITZxnqRLV9OepVWD63GZBsyjMxszwdzlxvGZjzbGcBBinJGGJRwFIV8djdJwnt91bkdg1V5tj6Q==", - "license": "MIT", + "version": "0.0.61", + "resolved": "https://registry.npmjs.org/volar-service-html/-/volar-service-html-0.0.61.tgz", + "integrity": "sha512-yFE+YmmgqIL5HI4ORqP++IYb1QaGcv+xBboI0WkCxJJ/M35HZj7f5rbT3eQ24ECLXFbFCFanckwyWJVz5KmN3Q==", "dependencies": { "vscode-html-languageservice": "^5.3.0", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" }, "peerDependencies": { - "@volar/language-service": "~2.4.0-alpha.12" + "@volar/language-service": "~2.4.0" }, "peerDependenciesMeta": { "@volar/language-service": { @@ -8753,15 +11426,14 @@ } }, "node_modules/volar-service-prettier": { - "version": "0.0.59", - "resolved": "https://registry.npmjs.org/volar-service-prettier/-/volar-service-prettier-0.0.59.tgz", - "integrity": "sha512-FmBR4lsgFRGR3V0LnxZZal0WqdOJjuLL6mQSj4p57M15APtQwuocG/FiF+ONGFnwRXMOIBDBTCARdth+TKgL3A==", - "license": "MIT", + "version": "0.0.61", + "resolved": "https://registry.npmjs.org/volar-service-prettier/-/volar-service-prettier-0.0.61.tgz", + "integrity": "sha512-F612nql5I0IS8HxXemCGvOR2Uxd4XooIwqYVUvk7WSBxP/+xu1jYvE3QJ7EVpl8Ty3S4SxPXYiYTsG3bi+gzIQ==", "dependencies": { "vscode-uri": "^3.0.8" }, "peerDependencies": { - "@volar/language-service": "~2.4.0-alpha.12", + "@volar/language-service": "~2.4.0", "prettier": "^2.2 || ^3.0" }, "peerDependenciesMeta": { @@ -8774,10 +11446,9 @@ } }, "node_modules/volar-service-typescript": { - "version": "0.0.59", - "resolved": "https://registry.npmjs.org/volar-service-typescript/-/volar-service-typescript-0.0.59.tgz", - "integrity": "sha512-VCOpfiu+lUo5lapWLB5L5vmQGtwzmNWn5MueV915eku7blpphmE+Z7hCNcL1NApn7AetXWhiblv8ZhmUx/dGIA==", - "license": "MIT", + "version": "0.0.61", + "resolved": "https://registry.npmjs.org/volar-service-typescript/-/volar-service-typescript-0.0.61.tgz", + "integrity": "sha512-4kRHxVbW7wFBHZWRU6yWxTgiKETBDIJNwmJUAWeP0mHaKpnDGj/astdRFKqGFRYVeEYl45lcUPhdJyrzanjsdQ==", "dependencies": { "path-browserify": "^1.0.1", "semver": "^7.6.2", @@ -8787,7 +11458,7 @@ "vscode-uri": "^3.0.8" }, "peerDependencies": { - "@volar/language-service": "~2.4.0-alpha.12" + "@volar/language-service": "~2.4.0" }, "peerDependenciesMeta": { "@volar/language-service": { @@ -8796,15 +11467,42 @@ } }, "node_modules/volar-service-typescript-twoslash-queries": { - "version": "0.0.59", - "resolved": "https://registry.npmjs.org/volar-service-typescript-twoslash-queries/-/volar-service-typescript-twoslash-queries-0.0.59.tgz", - "integrity": "sha512-skm8e6yhCIkqLwJB6S9MqT5lO9LNFuMD3dYxKpmOZs1CKbXmCZZTmLfEaD5VkJae1xdleEDZFFTHl2O5HLjOGQ==", - "license": "MIT", + "version": "0.0.61", + "resolved": "https://registry.npmjs.org/volar-service-typescript-twoslash-queries/-/volar-service-typescript-twoslash-queries-0.0.61.tgz", + "integrity": "sha512-99FICGrEF0r1E2tV+SvprHPw9Knyg7BdW2fUch0tf59kG+KG+Tj4tL6tUg+cy8f23O/VXlmsWFMIE+bx1dXPnQ==", "dependencies": { "vscode-uri": "^3.0.8" }, "peerDependencies": { - "@volar/language-service": "~2.4.0-alpha.12" + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } + }, + "node_modules/volar-service-typescript/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/volar-service-yaml": { + "version": "0.0.61", + "resolved": "https://registry.npmjs.org/volar-service-yaml/-/volar-service-yaml-0.0.61.tgz", + "integrity": "sha512-L+gbDiLDQQ1rZUbJ3mf3doDsoQUa8OZM/xdpk/unMg1Vz24Zmi2Ign8GrZyBD7bRoIQDwOH9gdktGDKzRPpUNw==", + "dependencies": { + "vscode-uri": "^3.0.8", + "yaml-language-server": "~1.15.0" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" }, "peerDependenciesMeta": { "@volar/language-service": { @@ -8816,7 +11514,6 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-6.3.0.tgz", "integrity": "sha512-nU92imtkgzpCL0xikrIb8WvedV553F2BENzgz23wFuok/HLN5BeQmroMy26pUwFxV2eV8oNRmYCUv8iO7kSMhw==", - "license": "MIT", "dependencies": { "@vscode/l10n": "^0.0.18", "vscode-languageserver-textdocument": "^1.0.11", @@ -8828,7 +11525,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.3.0.tgz", "integrity": "sha512-C4Z3KsP5Ih+fjHpiBc5jxmvCl+4iEwvXegIrzu2F5pktbWvQaBT3YkVPk8N+QlSSMk8oCG6PKtZ/Sq2YHb5e8g==", - "license": "MIT", "dependencies": { "@vscode/l10n": "^0.0.18", "vscode-languageserver-textdocument": "^1.0.11", @@ -8836,11 +11532,30 @@ "vscode-uri": "^3.0.8" } }, + "node_modules/vscode-json-languageservice": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-4.1.8.tgz", + "integrity": "sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==", + "dependencies": { + "jsonc-parser": "^3.0.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "^3.16.0", + "vscode-nls": "^5.0.0", + "vscode-uri": "^3.0.2" + }, + "engines": { + "npm": ">=7.0.0" + } + }, + "node_modules/vscode-json-languageservice/node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==" + }, "node_modules/vscode-jsonrpc": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", - "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -8849,7 +11564,6 @@ "version": "9.0.1", "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", - "license": "MIT", "dependencies": { "vscode-languageserver-protocol": "3.17.5" }, @@ -8861,41 +11575,35 @@ "version": "3.17.5", "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", - "license": "MIT", "dependencies": { "vscode-jsonrpc": "8.2.0", "vscode-languageserver-types": "3.17.5" } }, "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz", - "integrity": "sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==", - "license": "MIT" + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==" }, "node_modules/vscode-languageserver-types": { "version": "3.17.5", "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", - "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", - "license": "MIT" + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==" }, "node_modules/vscode-nls": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-5.2.0.tgz", - "integrity": "sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==", - "license": "MIT" + "integrity": "sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==" }, "node_modules/vscode-uri": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", - "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", - "license": "MIT" + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==" }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", - "license": "MIT", "dependencies": { "xml-name-validator": "^5.0.0" }, @@ -8907,14 +11615,14 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "license": "MIT", "dependencies": { "defaults": "^1.0.3" } }, "node_modules/web-namespaces": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -8924,7 +11632,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "license": "BSD-2-Clause", "engines": { "node": ">=12" } @@ -8933,7 +11640,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "license": "MIT", "dependencies": { "iconv-lite": "0.6.3" }, @@ -8941,11 +11647,15 @@ "node": ">=18" } }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==" + }, "node_modules/whatwg-mimetype": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "license": "MIT", "engines": { "node": ">=18" } @@ -8954,7 +11664,6 @@ "version": "14.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", - "license": "MIT", "dependencies": { "tr46": "^5.0.0", "webidl-conversions": "^7.0.0" @@ -8965,7 +11674,8 @@ }, "node_modules/which": { "version": "2.0.2", - "license": "ISC", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dependencies": { "isexe": "^2.0.0" }, @@ -8977,19 +11687,20 @@ } }, "node_modules/which-pm": { - "version": "2.2.0", - "license": "MIT", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-3.0.0.tgz", + "integrity": "sha512-ysVYmw6+ZBhx3+ZkcPwRuJi38ZOTLJJ33PSHaitLxSKUMsh0LkKd0nC69zZCwt5D+AYUcMK2hhw4yWny20vSGg==", "dependencies": { - "load-yaml-file": "^0.2.0", - "path-exists": "^4.0.0" + "load-yaml-file": "^0.2.0" }, "engines": { - "node": ">=8.15" + "node": ">=18.12" } }, "node_modules/which-pm-runs": { "version": "1.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", + "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", "engines": { "node": ">=4" } @@ -9011,7 +11722,8 @@ }, "node_modules/widest-line": { "version": "4.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", "dependencies": { "string-width": "^5.0.1" }, @@ -9022,9 +11734,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/widest-line/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==" + }, "node_modules/widest-line/node_modules/string-width": { "version": "5.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -9037,13 +11755,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/widest-line/node_modules/string-width/node_modules/emoji-regex": { - "version": "9.2.2", - "license": "MIT" - }, "node_modules/wrap-ansi": { "version": "8.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -9056,9 +11771,110 @@ "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==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "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==", + "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==", + "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/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "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==" + }, + "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==", + "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==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/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==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/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==" + }, "node_modules/wrap-ansi/node_modules/string-width": { "version": "5.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -9071,21 +11887,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/wrap-ansi/node_modules/string-width/node_modules/emoji-regex": { - "version": "9.2.2", - "license": "MIT" - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "license": "MIT", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "engines": { "node": ">=10.0.0" }, @@ -9106,7 +11916,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", - "license": "Apache-2.0", "engines": { "node": ">=18" } @@ -9114,25 +11923,133 @@ "node_modules/xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "license": "MIT" + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/xxhash-wasm": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.0.2.tgz", + "integrity": "sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==" }, "node_modules/y18n": { "version": "5.0.8", - "license": "ISC", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "engines": { "node": ">=10" } }, "node_modules/yallist": { "version": "3.1.1", - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yaml": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", + "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yaml-language-server": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/yaml-language-server/-/yaml-language-server-1.15.0.tgz", + "integrity": "sha512-N47AqBDCMQmh6mBLmI6oqxryHRzi33aPFPsJhYy3VTUGCdLHYjGh4FZzpUjRlphaADBBkDmnkM/++KNIOHi5Rw==", + "dependencies": { + "ajv": "^8.11.0", + "lodash": "4.17.21", + "request-light": "^0.5.7", + "vscode-json-languageservice": "4.1.8", + "vscode-languageserver": "^7.0.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "^3.16.0", + "vscode-nls": "^5.0.0", + "vscode-uri": "^3.0.2", + "yaml": "2.2.2" + }, + "bin": { + "yaml-language-server": "bin/yaml-language-server" + }, + "optionalDependencies": { + "prettier": "2.8.7" + } + }, + "node_modules/yaml-language-server/node_modules/prettier": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", + "optional": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/yaml-language-server/node_modules/request-light": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.5.8.tgz", + "integrity": "sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==" + }, + "node_modules/yaml-language-server/node_modules/vscode-jsonrpc": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", + "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==", + "engines": { + "node": ">=8.0.0 || >=10.0.0" + } + }, + "node_modules/yaml-language-server/node_modules/vscode-languageserver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz", + "integrity": "sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==", + "dependencies": { + "vscode-languageserver-protocol": "3.16.0" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/yaml-language-server/node_modules/vscode-languageserver-protocol": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", + "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", + "dependencies": { + "vscode-jsonrpc": "6.0.0", + "vscode-languageserver-types": "3.16.0" + } + }, + "node_modules/yaml-language-server/node_modules/vscode-languageserver-types": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", + "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==" + }, + "node_modules/yaml-language-server/node_modules/yaml": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", + "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", + "engines": { + "node": ">= 14" + } }, "node_modules/yargonaut": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/yargonaut/-/yargonaut-1.1.4.tgz", "integrity": "sha512-rHgFmbgXAAzl+1nngqOcwEljqHGG9uUZoPjsdZEs1w5JW9RXYzrSvH/u70C1JE5qFi0qjsdhnUX/dJRpWqitSA==", - "license": "Apache-2.0", "dependencies": { "chalk": "^1.1.1", "figlet": "^1.1.1", @@ -9143,7 +12060,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9152,7 +12068,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9161,7 +12076,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "license": "MIT", "dependencies": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", @@ -9177,7 +12091,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "license": "MIT", "dependencies": { "ansi-regex": "^2.0.0" }, @@ -9189,14 +12102,14 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/yargs": { "version": "17.7.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -9212,14 +12125,29 @@ }, "node_modules/yargs-parser": { "version": "21.1.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "engines": { "node": ">=12" } }, + "node_modules/yargs/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/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==" + }, "node_modules/yargs/node_modules/string-width": { "version": "4.2.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -9229,13 +12157,10 @@ "node": ">=8" } }, - "node_modules/yargs/node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "license": "MIT" - }, - "node_modules/yargs/node_modules/string-width/node_modules/strip-ansi": { + "node_modules/yargs/node_modules/strip-ansi": { "version": "6.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -9243,16 +12168,19 @@ "node": ">=8" } }, - "node_modules/yargs/node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "license": "MIT", + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, "engines": { - "node": ">=8" + "node": ">=6" } }, "node_modules/yocto-queue": { - "version": "1.0.0", - "license": "MIT", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "engines": { "node": ">=12.20" }, @@ -9260,23 +12188,46 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zod": { "version": "3.23.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", "funding": { "url": "https://github.com/sponsors/colinhacks" } }, "node_modules/zod-to-json-schema": { - "version": "3.23.1", - "license": "ISC", + "version": "3.23.2", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.23.2.tgz", + "integrity": "sha512-uSt90Gzc/tUfyNqxnjlfBs8W6WSGpNBv0rVsNxP/BVSMHMKGdthPYff4xtCHYloJGM0CFxFsb3NbC0eqPhfImw==", "peerDependencies": { "zod": "^3.23.3" } }, + "node_modules/zod-to-ts": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zod-to-ts/-/zod-to-ts-1.2.0.tgz", + "integrity": "sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==", + "peerDependencies": { + "typescript": "^4.9.4 || ^5.0.2", + "zod": "^3" + } + }, "node_modules/zwitch": { "version": "2.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" diff --git a/package.json b/package.json index 37f595f..0dca0d7 100644 --- a/package.json +++ b/package.json @@ -1,42 +1,63 @@ { "name": "dashersupply", "type": "module", - "version": "0.0.1", + "version": "0.2.1", "scripts": { "dev": "astro dev", "start": "astro dev", "build": "astro check && astro build", "preview": "astro preview", "astro": "astro", - "test": "vitest" + "test": "vitest", + "ts-node": "node --loader ts-node", + "server": "node --loader ts-node/esm run-server.mts", + "webhooks": "bun run src/apps/squidex-webhooks.ts" }, "dependencies": { - "@astrojs/check": "^0.8.1", - "@astrojs/react": "^3.6.0", + "@astrojs/check": "^0.9.3", + "@astrojs/node": "^8.3.3", + "@astrojs/react": "^3.6.2", "@astrojs/sitemap": "^3.1.6", + "@fastify/middie": "^8.3.1", + "@fastify/static": "^7.0.4", + "@squidex/squidex": "^1.2.1", + "@strapi/blocks-react-renderer": "^1.0.1", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", - "amazon-pa-api5-node-ts": "^2.1.4", - "astro": "^4.11.5", + "amazon-pa-api5-node-ts": "^2.3.0", + "astro": "^4.14.2", + "axios": "^1.7.4", "bootstrap": "^5.3.3", "cheerio": "*", + "commander": "^12.1.0", "crawlee": "^3.0.0", "dotenv": "^16.4.5", "dotenv-expand": "^11.0.6", + "fastify": "^4.28.1", + "luxon": "^3.5.0", "markdown-it": "^14.0.0", "markdown-it-attrs": "^4.1.6", + "memfs": "^4.11.1", + "multer": "^1.4.5-lts.1", + "ollama": "^0.5.8", "playwright": "*", "react": "^18.3.1", "react-dom": "^18.3.1", + "slugify": "^1.6.6", "swiper": "^11.1.4", + "vite": "^5.3.5", + "vite-plugin-commonjs": "^0.10.1", "vitest": "^2.0.3" }, "devDependencies": { "@apify/tsconfig": "^0.1.0", "@types/jquery": "^3.5.30", + "@types/luxon": "^3.4.2", "@types/markdown-it": "^14.1.1", "@types/markdown-it-attrs": "^4.1.3", + "@types/multer": "^1.4.11", "@types/node": "^20.0.0", + "ts-node": "^10.9.2", "tsx": "^4.4.0", "typescript": "^5.5.3" } diff --git a/public/assets/brands/vortex-optics.svg b/public/assets/brands/vortex-optics.svg index e700f74..0984b01 100644 --- a/public/assets/brands/vortex-optics.svg +++ b/public/assets/brands/vortex-optics.svg @@ -1,9 +1,9 @@ - - + + - + diff --git a/run-server.mts b/run-server.mts new file mode 100644 index 0000000..d25bab4 --- /dev/null +++ b/run-server.mts @@ -0,0 +1,21 @@ +import Fastify from 'fastify'; +import fastifyMiddie from '@fastify/middie'; +import fastifyStatic from '@fastify/static'; +import { fileURLToPath } from 'node:url'; +import { handler as ssrHandler } from './dist/server/entry.mjs'; +import { config } from './src/config.ts'; + +const app = Fastify({ logger: true }); +await app + .register(fastifyStatic, { + root: fileURLToPath(new URL('./dist/client', import.meta.url)), + }) + .register(fastifyMiddie); +app.use(ssrHandler); +app.listen({ host: '0.0.0.0', port: config.port }, (err, address) => { + if (err) { + app.log.error(err); + process.exit(1); + } + app.log.info(`Fastify web server with Astro middleware listening at ${address}.`) +}); diff --git a/src/apiclient/amazon.ts b/src/apiclient/amazon.ts new file mode 100644 index 0000000..9d1da28 --- /dev/null +++ b/src/apiclient/amazon.ts @@ -0,0 +1,86 @@ +import { GetItemsResourceValues } from 'amazon-pa-api5-node-ts/src/model/GetItemsResource.mts'; +// import { amazonPAAPIConfig } from '../data/fetch-site'; +// import { config } from '../config'; +import { getSiteConfig } from '../data/api-client'; +import { client } from '../data/core/client'; +import * as ProductAdvertisingAPIv1 from 'amazon-pa-api5-node-ts'; +// import type { AmazonProductDetails } from '../data/products/amazon-product-details'; +import { title } from 'process'; + +const siteConfig = await getSiteConfig(); + +const defaultClient = ProductAdvertisingAPIv1.ApiClient.instance; + +defaultClient.accessKey = siteConfig.items[0].data?.amazonPAAPIConfig.iv.accessKey!; +defaultClient.secretKey = siteConfig.items[0].data?.amazonPAAPIConfig.iv.secretKey!; +defaultClient.host = siteConfig.items[0].data?.amazonPAAPIConfig.iv.host!; +defaultClient.region = siteConfig.items[0].data?.amazonPAAPIConfig.iv.region!; + +const api = new ProductAdvertisingAPIv1.DefaultApi(); + +export const getItems = (itemIds: string[]): Promise => { + if (itemIds.length < 1 || itemIds.length > 10) { + throw new Error("itemIds must be between 1 and 10."); + } + const getItemsRequest = new ProductAdvertisingAPIv1.GetItemsRequest(); + getItemsRequest['PartnerTag'] = siteConfig.items[0].data?.amazonPAAPIConfig.iv.partnerTag; + getItemsRequest['PartnerType'] = siteConfig.items[0].data?.amazonPAAPIConfig.iv.partnerType; + getItemsRequest['ItemIds'] = itemIds; + getItemsRequest['Condition'] = 'New'; + getItemsRequest['Resources'] = [ + GetItemsResourceValues['Images.Primary.Large'], + GetItemsResourceValues['Images.Variants.Large'], + GetItemsResourceValues['Offers.Listings.Price'], + GetItemsResourceValues['ItemInfo.Title'], + GetItemsResourceValues['ItemInfo.Features'], + GetItemsResourceValues['CustomerReviews.Count'], + GetItemsResourceValues['CustomerReviews.StarRating'], + GetItemsResourceValues['ItemInfo.ProductInfo'] + ]; + + return new Promise((resolve, reject) => { + return api.getItems(getItemsRequest).then( + function(data) { + console.log('API called successfully.'); + const getItemsResponse = ProductAdvertisingAPIv1.GetItemsResponse.constructFromObject(data)!; + console.log('Complete Response: \n' + JSON.stringify(getItemsResponse, null, 1)); + + if (getItemsResponse['Errors'] !== undefined) { + //TODO: Write failure story to Squidex about Amazon PA API call (attach JSON). + + console.error('\nErrors:'); + console.error('Complete Error Response: ' + JSON.stringify(getItemsResponse['Errors'], null, 1)); + console.error('Printing 1st Error:'); + var error_0 = getItemsResponse['Errors'][0]; + console.error('Error Code: ' + error_0['Code']); + console.error('Error Message: ' + error_0['Message']); + reject(`Error ${error_0['Code']}: ${error_0['Message']}`); + } + else { + //TODO: Write success story to Squidex about Amazon PA API call (attach JSON). + + // let parsedItems: ProductAdvertisingAPIv1.GetItemsResponse[] = []; + // for (let item of getItemsResponse.ItemsResult?.Items!) { + // parsedItems.push({ + // ASIN: item.ASIN!, + // amazonLink: item.DetailPageURL!, + // featureBullets: item.ItemInfo?.Features?.DisplayValues!, + // // description: , + // title: item.ItemInfo?.Title?.DisplayValue!, + // }) + // } + // resolve(parsedItems); + resolve(data); + } + }, + function(error) { + console.log('Error calling PA-API 5.0!'); + console.log('Printing Full Error Object:\n' + JSON.stringify(error, null, 1)); + console.log('Status Code: ' + error['status']); + if (error['response'] !== undefined && error['response']['text'] !== undefined) { + console.log('Error Object: ' + JSON.stringify(error['response']['text'], null, 1)); + } + } + ); + }); +} diff --git a/src/apiclient/override-squidex-sdk.ts b/src/apiclient/override-squidex-sdk.ts new file mode 100644 index 0000000..1871946 --- /dev/null +++ b/src/apiclient/override-squidex-sdk.ts @@ -0,0 +1,104 @@ +import { Assets } from "@squidex/squidex/api/resources/assets/client/Client.js" +import { SquidexClient } from "@squidex/squidex" +import * as environments from "@squidex/squidex/environments.js"; +import * as core from "@squidex/squidex/core/index.js"; +import { Squidex } from "@squidex/squidex"; +import urlJoin from "url-join"; +import * as errors from "@squidex/squidex/errors/index.js"; +import * as serializers from "@squidex/squidex/serialization/index.js"; +import * as fs from "fs"; +import { default as FormData } from "form-data"; + + +/** + * You can only upload one file at a time. The mime type of the file is not calculated by Squidex and is required correctly. + * @throws {@link Squidex.BadRequestError} + * @throws {@link Squidex.NotFoundError} + * @throws {@link Squidex.ContentTooLargeError} + * @throws {@link Squidex.InternalServerError} + */ +export function async customPostAsset( + file: File | fs.ReadStream, + requestOptions?: Assets.RequestOptions +): Promise { + const _request = new FormData(); + _request.append("file", file); + const _response = await (this._options.fetcher ?? core.fetcher)({ + url: urlJoin( + (await core.Supplier.get(this._options.environment)) ?? environments.SquidexEnvironment.Default, + `api/apps/${this._options.appName}/assets` + ), + method: "POST", + headers: { + Authorization: await this._getAuthorizationHeader(), + "X-Fern-Language": "JavaScript", + "X-Fern-SDK-Name": "@squidex/squidex", + "X-Fern-SDK-Version": "1.2.1", + "Content-Length": (await core.getFormDataContentLength(_request)).toString(), + }, + contentType: "multipart/form-data; boundary=" + _request.getBoundary(), + body: _request, + timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, + }); + if (_response.ok) { + return await serializers.AssetDto.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + breadcrumbsPrefix: ["response"], + }); + } + + if (_response.error.reason === "status-code") { + switch (_response.error.statusCode) { + case 400: + throw new Squidex.BadRequestError( + await serializers.ErrorDto.parseOrThrow(_response.error.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + breadcrumbsPrefix: ["response"], + }) + ); + case 404: + throw new Squidex.NotFoundError(_response.error.body); + case 413: + throw new Squidex.ContentTooLargeError( + await serializers.ErrorDto.parseOrThrow(_response.error.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + breadcrumbsPrefix: ["response"], + }) + ); + case 500: + throw new Squidex.InternalServerError( + await serializers.ErrorDto.parseOrThrow(_response.error.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + breadcrumbsPrefix: ["response"], + }) + ); + default: + throw new errors.SquidexError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + }); + } + } + + switch (_response.error.reason) { + case "non-json": + throw new errors.SquidexError({ + statusCode: _response.error.statusCode, + body: _response.error.rawBody, + }); + case "timeout": + throw new errors.SquidexTimeoutError(); + case "unknown": + throw new errors.SquidexError({ + message: _response.error.errorMessage, + }); + } +}; \ No newline at end of file diff --git a/src/apps/amazon-catalog.ts b/src/apps/amazon-catalog.ts new file mode 100644 index 0000000..97d259b --- /dev/null +++ b/src/apps/amazon-catalog.ts @@ -0,0 +1,403 @@ +import { getBrandsByLangSlug, getBrandsUsingJsonQuery, getMarketplacesUsingJsonQuery, getProductCategoriesByIds, getProductCategoriesUsingJsonQuery, getProductListingsUsingJsonQuery, getProductsByIds, getProductsUsingJsonQuery, getSellersUsingJsonQuery, performSyncLocalizedSlugs } from '../data/api-client.ts'; +import { program } from 'commander'; +import * as core from '../data/core/client.js' +import type { AmazonMarketplaceConnection } from '../data/models/components/AmazonMarketplaceConnection.js'; +import type { Product } from '../data/models/multis/Product.js'; +import type { Listing } from '../data/models/multis/Listing.js'; +import type { Brand } from '../data/models/multis/Brand.js'; +import { askAiProductSubCategoryEvalQuestionsSet1, askAiProductSubCategoryEvalQuestionsSet2, askAiTopLevelProductCategoryEvalQuestions, designAiTopLevelProductCategoryEvalQuestions, doesProductAlreadyExist, generateAIProductDescription, generateAITagsForProduct, getAddNewBrandDtoByName, getAddNewProductDtoByProduct, getAddNewProductListingDtoByProduct, getAddNewProductSubCategoryDto, getAddNewSellerDtoByName, getAllTopLevelProductCategories, getAmazonMarketplaceConnectionSchemaDto, getAmazonMarketplaceDto, getBrandDtoByName, getMarketplaceConnectionSchemaDto, getSellerDtoByName, isValidASIN, removeQuotes, uploadDownloadedImageToSquidexAsAsset, translateAmazonDescription_from_en_US_to_es_US, translateAmazonDescription_from_en_US_to_fr_CA, translateProductDescription_from_en_US_to_es_US, translateProductName_from_en_US_to_es_US, translateProductName_from_en_US_to_fr_CA, translateTags_from_en_US_to_es_US, translateTags_from_en_US_to_fr_CA, trimPeriods, upsertAssetFolder, getAllAssetsInFolder, getAddNewOfferDto, lookupAmazonASINs, translateProductDescription_from_en_US_to_fr_CA } from './modules/amazon-catalog-helpers.js'; +import slugify from 'slugify'; +import type { Multilingual } from '../data/internals/MultilingualT.js'; +import type { NonMultilingual } from '../data/internals/NonMultilingualT.js'; +import type { MarketplaceConnection } from '../data/models/components/MarketplaceConnection.js'; +import type { Offer } from '../data/models/multis/Offer.js'; +import { SCHEMAS } from '../data/models/schemas.js'; +import { CheerioCrawler, type CheerioCrawlingContext, log } from 'crawlee'; +import { extractProductDetails } from '../scraper/amazon.js'; + +program.command('ls') + .description('List all the products') + .action(async (args: string[]) => { + let productsDto = await getProductsUsingJsonQuery(); + productsDto.items.forEach((productDto, index) => { + console.log(`[ls:${index+1}] ID: ${productDto.id}`) + console.log(`[ls:${index+1}] Product (en-US): ${productDto.data?.productName['en-US']}`); + console.log(`[ls:${index+1}] Product (es-US): ${productDto.data?.productName['es-US']}`); + console.log(`[ls:${index+1}] Product (fr-CA): ${productDto.data?.productName['fr-CA']}`); + let asin = productDto.data?.marketplaceConnections.iv.map((connection) => (connection.connection as AmazonMarketplaceConnection).asin).join(''); + let siteStripUrl = productDto.data?.marketplaceConnections.iv.map((connection) => (connection.connection as AmazonMarketplaceConnection).siteStripeUrl).join(''); + console.log(`[ls:${index+1}] ASIN: ${asin} ${!!(asin||'').match(/[A-Z0-9]{10}/g) ? 'Is a valid ASIN.' : 'Is not a valid ASIN.'}`) + console.log(`[ls:${index+1}] Amazon SiteStripe URL: ${siteStripUrl}`) + console.log(); + }); + console.log(`[ls] Returned ${productsDto.items.length} products.`) + }) + .configureHelp(); + +program.command('crawlee-products') + .alias('crawlee-product') + .argument('') + .description('Attempts to crawl Amazon product data using crawlee') + .action(async (urls: string[]) => { + /** + * Performs the logic of the crawler. It is called for each URL to crawl. + * - Passed to the crawler using the `requestHandler` option. + */ + const requestHandler = async (context: CheerioCrawlingContext) => { + const { $, request } = context; + const { url } = request; + log.info(`Scraping product page`, { url }); + const extractedProduct = extractProductDetails($); + log.info(`Scraped product details for "${extractedProduct.title}", saving...`, { url }); + crawler.pushData(extractedProduct); + }; + /** + * The crawler instance. Crawlee provides a few different crawlers, but we'll use CheerioCrawler, as it's very fast and simple to use. + * - Alternatively, we could use a full browser crawler like `PlaywrightCrawler` to imitate a real browser. + */ + const crawler = new CheerioCrawler({ requestHandler }); + await crawler.run(urls); + }) + .configureHelp(); + +program.command('sync-slugs') + .description('Sync URL slugs for each frontend endpoint.') + .action(async (asin: string, args: string[]) => { + await performSyncLocalizedSlugs(console.log); + }) + .configureHelp(); + +program.command('append-images') + .alias('append-image') + .argument('', 'Amazon Standard Identification Numbers') + .argument('', 'Image URLs to transmit to the database.') + .description('Download images from URL .') + .action(async (asin: string, urls: string[]) => { + if (!isValidASIN(asin)) { + console.error(`[append-images] error: ${asin} is not a valid ASIN. Amazon Standard Identification Numbers are 10-digits long with letters A-Z and numbers 0-9.`); + return; + } + let productsDto = await getProductsUsingJsonQuery(JSON.stringify({ filter: { + op: 'eq', + path: 'data.marketplaceConnections.iv.connection.asin', + value: asin, + }})); + if (productsDto.items.length === 0) { + console.error(`[append-images] error: ${asin} was not found in the database. Please procure or enter the product first.`); + return; + } + let marketplacesDto = await getMarketplacesUsingJsonQuery(JSON.stringify({ filter: { + op: 'eq', + path: 'data.marketplaceName.en-US', + value: 'Amazon', + }})); + if (marketplacesDto.items.length === 0) { + console.error(`[append-images] error: Amazon marketplace not found in database. Please set up Amazon marketplace in database.`); + return; + } + console.log(`[append-images] Upserting Asset Folder products`); + let productsAssetFolder = await upsertAssetFolder('products'); + console.log(`[append-images] Matching Asset Folder: ${productsAssetFolder.folderName} with Asset Folder ID: ${productsAssetFolder.id}`); + + console.log(`[append-images] Upserting Asset Folder ${productsAssetFolder.folderName}/amazon`); + let productsAmazonAssetFolder = await upsertAssetFolder('amazon', productsAssetFolder.id); + console.log(`[append-images] Matching Asset Folder ${productsAssetFolder.folderName}/${productsAmazonAssetFolder.folderName} with Asset Folder ID: ${productsAmazonAssetFolder.id}`); + + console.log(`[append-images] Upserting Asset Folder ${productsAssetFolder.folderName}/${productsAmazonAssetFolder.folderName}/${asin}`); + let productsASINFolder = await upsertAssetFolder(asin, productsAmazonAssetFolder.id); + console.log(`[append-images] Matching Asset Folder ${productsAssetFolder.folderName}/${productsAmazonAssetFolder.folderName}/${productsASINFolder.folderName} with Asset Folder ID: ${productsASINFolder.id}`); + let amazonMarketplaceDto = marketplacesDto.items[0]; + for (let productDto of productsDto.items) { + let listingsDto = await getProductListingsUsingJsonQuery(JSON.stringify({ filter: { + 'and': [ + { + op: 'eq', + path: 'data.product.iv', + value: productDto.id, + }, + { + op: 'eq', + path: 'data.marketplace.iv', + value: amazonMarketplaceDto.id, + } + ] + }})); + if (listingsDto.items.length === 0) { + console.error(`[append-images] error: Product listing for ${asin} on Amazon marketplace was not found in the database. Please procure or enter the product listing first.`); + return; + } + for (let listingDto of listingsDto.items) { + let listing = listingDto.data!; + let didUpdate = false; + + let amazonAssetsDto = await getAllAssetsInFolder(productsASINFolder.id); + + for (let i = 0; i < urls.length; i++) { + console.log(urls[i]); + let foundUploaded = amazonAssetsDto.filter((asset) => (asset.metadata['amazon-url'] as string||'') === urls[i]); + if (!foundUploaded.length) { // is not found + console.log(`[append-images] Transmitting Product Image ${urls[i]} to Squidex Assets`); + let assetDto = await uploadDownloadedImageToSquidexAsAsset(urls[i]!, productsASINFolder.id); + console.log(`[append-images] Saved Asset Id: ${assetDto.id} to Asset Folder Id: ${assetDto.parentId}`); + if (!listing.marketplaceImages) { + listing.marketplaceImages = { iv: [] }; + } + if (!listing.marketplaceImages.iv) { + listing.marketplaceImages.iv = []; + } + listing.marketplaceImages.iv.push(assetDto.id); + didUpdate = true; + } + else { // is found + console.log(`[append-images] Matched Asset Id: ${foundUploaded[0].id}, Amazon Product Image: ${foundUploaded[0].metadata['amazon-url'] as string||''}.`); + } + } + if (didUpdate) { + console.log(`[append-images] Listing did update, updating product listing with appended images.`); + let updatedDto = await core.client.contents.putContent(SCHEMAS.LISTINGS, listingDto.id, { + unpublished: false, + body: listing as any, + }, { + timeoutInSeconds: core.TIMEOUT_IN_SECONDS + }); + console.log(`[append-images] Listing version ${updatedDto.version} stored.`); + } + } + } + }) + .configureHelp(); + + +program.command('procure-asins') + .alias('procure-asin') + .argument('', 'Amazon Standard Identification Numbers') + .description('Begin automated product procurement from Amazon by inputting one or more ASINs separated by spaces.') + .action(async (asins: string[]) => { + if (!asins.length) { + console.error(`[procure-asin] error: You must specify one or more valid ASINs. Amazon Standard Identification Numbers are 10-digits long with letters A-Z and numbers 0-9.`); + return; + } + for (let a = 0; a < asins.length; a++) { + let asin = asins[a].toUpperCase(); + if (!isValidASIN(asin)) { + console.error(`[procure-asin] error: ${asin} is not a valid ASIN. Amazon Standard Identification Numbers are 10-digits long with letters A-Z and numbers 0-9.`); + return; + } + } + console.log(`[procure-asin] You started product enrollment for ${asins.length} items.`); + if (asins.length > 10) { + console.log(`[procure-asin] PA API calls will be broken up into 10 items per Amazon API request.`); + } + const MAX_ITEMS_PER_API_REQUEST = 10; + for (let a = 0; a < asins.length; a += MAX_ITEMS_PER_API_REQUEST) { + let asinsToRequest = asins.slice(a, a + MAX_ITEMS_PER_API_REQUEST).map(asin => asin = asin.toLowerCase()); + console.log(`[procure-asin] Begin product enrollment(s) for ${asins.length} ASINs ${asinsToRequest.join(' ')}.`); + + //get Amazon data ; we will use previously obtained data for the testing phase + //TODO:remove these three lines and replace with code that reads the Amazon PA API + // console.log(`[procure-asin] NOTICE: For testing purposes, using data from stored previous API response.`); + console.log(`[procure-asin] NOTICE: Production Amazon PA API request in progress.`); + const responseDto = await lookupAmazonASINs(asinsToRequest); + const apiResponse = responseDto.items[0].data?.apiResponse.iv!; + + apiResponse.ItemsResult!.Items!.forEach(async (amazonItem) => { + let asin = amazonItem.ASIN!; + console.log(`[procure-asin] Mock data override: product enrollment is for ASIN ${asin}.`); + + // enable this if we're saving data: + // if (await doesProductAlreadyExist(asin)) { + // console.error(`[procure-asin] error: Product with ASIN already exists in the application.`); + // return; + // } + + console.log(`[procure-asin] Amazon PA API Response contains ASIN: ${asin}.`); + const amazonProductName_en_US = amazonItem.ItemInfo?.Title?.DisplayValue!; + console.log(`[procure-asin] Amazon PA API Response contains Product Name: ${amazonProductName_en_US}.`); + console.log(`[procure-asin] Amazon PA API Response contains Product Features: \n${amazonItem.ItemInfo?.Features?.DisplayValues?.map((item) => `- ${item}`).join('\n')}`); + + const amazonProductImages = [amazonItem.Images?.Primary?.Large?.URL, ...(amazonItem.Images?.Variants?.map(variant => variant.Large?.URL)||[])]; + console.log(`[procure-asin] Amazon PA API Response contains Product Images: \n${amazonProductImages.map((url, index) => `${index+1}. ${url}`).join('\n')}`); + + console.log(`[procure-asin] Upserting Asset Folder products`); + let productsAssetFolder = await upsertAssetFolder('products'); + console.log(`[procure-asin] Matching Asset Folder: ${productsAssetFolder.folderName} with Asset Folder ID: ${productsAssetFolder.id}`); + + console.log(`[procure-asin] Upserting Asset Folder ${productsAssetFolder.folderName}/amazon`); + let productsAmazonAssetFolder = await upsertAssetFolder('amazon', productsAssetFolder.id); + console.log(`[procure-asin] Matching Asset Folder ${productsAssetFolder.folderName}/${productsAmazonAssetFolder.folderName} with Asset Folder ID: ${productsAmazonAssetFolder.id}`); + + console.log(`[procure-asin] Upserting Asset Folder ${productsAssetFolder.folderName}/${productsAmazonAssetFolder.folderName}/${asin}`); + let productsASINFolder = await upsertAssetFolder(asin, productsAmazonAssetFolder.id); + console.log(`[procure-asin] Matching Asset Folder ${productsAssetFolder.folderName}/${productsAmazonAssetFolder.folderName}/${productsASINFolder.folderName} with Asset Folder ID: ${productsASINFolder.id}`); + + let amazonAssetsDto = await getAllAssetsInFolder(productsASINFolder.id); + let amazonAssetsIds = amazonAssetsDto.map(asset => asset.id); + let amazonAssetsUrls: string[] = amazonAssetsDto.map(asset => asset.metadata['amazon-url'] as string||'').filter(url => url); + + for (let i = 0; i < amazonProductImages.length; i++) { + let foundUploaded = amazonAssetsDto.filter((asset) => (asset.metadata['amazon-url'] as string||'') === amazonProductImages[i]); + if (!foundUploaded.length) { // is not found + console.log(`[procure-asin] Transmitting Amazon Product Image ${amazonProductImages[i]} to Squidex Assets`); + let assetDto = await uploadDownloadedImageToSquidexAsAsset(amazonProductImages[i]!, productsASINFolder.id); + console.log(`[procure-asin] Saved Asset Id: ${assetDto.id} to Asset Folder Id: ${assetDto.parentId}`); + amazonAssetsDto.push(assetDto); + amazonAssetsIds.push(assetDto.id); + amazonAssetsUrls.push(assetDto.metadata['amazon-url'] as string||''); + } + else { // is found + console.log(`[procure-asin] Matched Asset Id: ${foundUploaded[0].id}, Amazon Product Image: ${foundUploaded[0].metadata['amazon-url'] as string||''}.`); + } + } + + let schemaProductMarketplaceConnectionDto = await getMarketplaceConnectionSchemaDto(); + console.log(`[procure-asin] Matching Schema ID: ${schemaProductMarketplaceConnectionDto.id}, Schema Name: ${schemaProductMarketplaceConnectionDto.name}.`); + + let schemaAmazonMarketplaceConnectionDto = await getAmazonMarketplaceConnectionSchemaDto(); + console.log(`[procure-asin] Matching Schema ID: ${schemaAmazonMarketplaceConnectionDto.id}, Schema Name: ${schemaAmazonMarketplaceConnectionDto.name}.`); + + let amazonMarketplaceDto = await getAmazonMarketplaceDto() + console.log(`[procure-asin] Matching Marketplace ID: ${amazonMarketplaceDto.items[0].id}, Marketplace Name: ${amazonMarketplaceDto.items[0].data?.marketplaceName['en-US']}.`); + + let bylineBrand = amazonItem.ItemInfo!.ByLineInfo!.Brand!.DisplayValue!; + console.log(`[procure-asin] Amazon PA API Response contains Brand ${bylineBrand}. Checking database for brand...`); + let brandsDto = await getBrandDtoByName(bylineBrand); + if (!brandsDto.items.length) { + console.log(`[procure-asin] Brand not found in database. Product requires creation of brand first.`); + brandsDto = await getAddNewBrandDtoByName(bylineBrand); + console.log(`[procure-asin] Brand Id: ${brandsDto.items[0].id}, Brand Name: ${brandsDto.items[0].data?.brandName['en-US']} created in database.`); + } else { + console.log(`[procure-asin] Matching Brand ID: ${brandsDto.items[0].id}, Brand Name: ${brandsDto.items[0].data?.brandName['en-US']}.`); + } + let brandName = brandsDto.items[0].data?.brandName['en-US']!; + let features = amazonItem.ItemInfo?.Features?.DisplayValues!; + + console.log(`[procure-asin] Amazon Product Name (en-US): ${amazonProductName_en_US}`); + console.log(`[procure-asin] Requesting llama3.1 LLM to translate product name from en-US to es-US.`); + const amazonProductName_es_US = await translateProductName_from_en_US_to_es_US(amazonItem, brandName, amazonProductName_en_US); + console.log(`[procure-asin] AI Product Name (es-US): ${amazonProductName_es_US}`); + console.log(`[procure-asin] Requesting llama3.1 LLM to translate product name from en-US to fr-CA.`); + const amazonProductName_fr_CA = await translateProductName_from_en_US_to_fr_CA(amazonItem, brandName, amazonProductName_en_US); + console.log(`[procure-asin] AI Product Name (fr-CA): ${amazonProductName_fr_CA}`); + const aiProductDescriptionResponse_en_US = await generateAIProductDescription(amazonProductName_en_US, features); + console.log(`[procure-asin] Generated AI Product Description (en-US):\n${aiProductDescriptionResponse_en_US}`); + console.log(`[procure-asin] Requesting llama3.1 LLM to translate product description from en-US to es-US.`); + const aiProductDescriptionResponse_es_US = await translateProductDescription_from_en_US_to_es_US(brandName, aiProductDescriptionResponse_en_US); + console.log(`[procure-asin] Translated AI Product Description (es-US):\n${aiProductDescriptionResponse_es_US}`); + console.log(`[procure-asin] Requesting llama3.1 LLM to translate product description from en-US to fr-CA.`); + const aiProductDescriptionResponse_fr_CA = await translateProductDescription_from_en_US_to_fr_CA(brandName, aiProductDescriptionResponse_en_US); + console.log(`[procure-asin] AI Product Description (fr-CA):\n${aiProductDescriptionResponse_fr_CA}`); + const aiTopLevelCategoryChoice = await askAiTopLevelProductCategoryEvalQuestions(brandName, amazonProductName_en_US); + console.log('[procure-asin]', `AI chooses to put product within top level Product Category ID: ${aiTopLevelCategoryChoice}, Product Category Name: ${(await getAllTopLevelProductCategories()).filter((category) => category.id === aiTopLevelCategoryChoice)[0].categoryName!['en-US']}`); + const aiSubCategoryQuestion1Answer = await askAiProductSubCategoryEvalQuestionsSet1(aiTopLevelCategoryChoice, brandName, amazonProductName_en_US, features); + console.log('[procure-asin]', `AI then chooses within the top-level category to ${aiSubCategoryQuestion1Answer?'make a new sub-category':'use an existing sub-category'}.`); + const aiSubCategoryQuestion2Answer = await askAiProductSubCategoryEvalQuestionsSet2(apiResponse, aiTopLevelCategoryChoice, brandName, amazonProductName_en_US, features, aiSubCategoryQuestion1Answer);; + let aiProductCategoriesDto; + if (!aiSubCategoryQuestion1Answer) { + let aiSubCategoryQuestion2AnswerStr = aiSubCategoryQuestion2Answer as string; + console.log(`[procure-asin] AI suggested existing sub-category ${aiSubCategoryQuestion2Answer}`); + aiProductCategoriesDto = await getProductCategoriesByIds(aiSubCategoryQuestion2AnswerStr); + } + else { + let aiSubCategoryQuestion2AnswerObj = aiSubCategoryQuestion2Answer as { + categoryName: Multilingual, + description: Multilingual, + parentCategory: NonMultilingual, + }; + console.log(`[procure-asin] AI suggested new sub-category ${aiSubCategoryQuestion2AnswerObj.categoryName['en-US']}`); + aiProductCategoriesDto = await getAddNewProductSubCategoryDto({ iv: [aiTopLevelCategoryChoice] }, aiSubCategoryQuestion2AnswerObj.categoryName, aiSubCategoryQuestion2AnswerObj.description); + } + let aiProductTags_en_US = await generateAITagsForProduct(amazonProductName_en_US, features); + let aiProductTags_es_US = await translateTags_from_en_US_to_es_US(aiProductTags_en_US); + let aiProductTags_fr_CA = await translateTags_from_en_US_to_fr_CA(aiProductTags_en_US); + let product: Product = { + brand: { iv: [brandsDto.items![0].id!] }, + categories: { iv: aiProductCategoriesDto.items.map(category => category.id) }, + productName: { + "en-US": amazonProductName_en_US, + "es-US": amazonProductName_es_US, + "fr-CA": amazonProductName_fr_CA, + }, + slug: { + "en-US": `${brandsDto.items![0].data?.slug['en-US']}/${slugify(trimPeriods(removeQuotes(amazonProductName_en_US)), { lower: true, trim: true })}`, + "es-US": `${brandsDto.items![0].data?.slug['es-US']}/${slugify(trimPeriods(removeQuotes(amazonProductName_es_US)), { lower: true, trim: true })}`, + "fr-CA": `${brandsDto.items![0].data?.slug['fr-CA']}/${slugify(trimPeriods(removeQuotes(amazonProductName_fr_CA)), { lower: true, trim: true })}`, + }, + description: { + "en-US": aiProductDescriptionResponse_en_US, + "es-US": aiProductDescriptionResponse_es_US, + "fr-CA": aiProductDescriptionResponse_fr_CA, + }, + tags: { + "en-US": aiProductTags_en_US, + "es-US": aiProductTags_es_US, + "fr-CA": aiProductTags_fr_CA, + }, + marketplaceConnections: { + iv: [ + { + schemaId: schemaProductMarketplaceConnectionDto.id, + marketplace: [amazonMarketplaceDto.items[0].id], + connection: { + schemaId: schemaAmazonMarketplaceConnectionDto.id, + asin, + siteStripeUrl: amazonItem.DetailPageURL, + } as AmazonMarketplaceConnection | MarketplaceConnection + } + ] + } + }; + console.log(`[procure-asin] New product to store:`, product); + let productsDto = await getAddNewProductDtoByProduct(product); + console.log(`[procure-asin] Product Id: ${productsDto.items[0].id}, Product Name: ${productsDto.items[0].data?.productName['en-US']} created in database.`); + + let listing: Listing = { + marketplace: { iv: [ amazonMarketplaceDto.items[0].id ] }, + product: { iv: [ productsDto.items[0].id ]}, + marketplaceDescription: { + "en-US": `${features.map((feature) => `- ${feature}`).join('\n')}\n`, + "es-US": await translateAmazonDescription_from_en_US_to_es_US(brandName, features), + "fr-CA": await translateAmazonDescription_from_en_US_to_fr_CA(brandName, features), + }, + marketplaceImages: { iv: amazonAssetsIds }, + }; + console.log(`[procure-asin] New product listing to store:`, listing); + let listingsDto = await getAddNewProductListingDtoByProduct(listing); + console.log(`[procure-asin] Product Listing Id: ${listingsDto.items[0].id}, Product Id: ${listingsDto.items[0].data?.product.iv[0]}, Marketplace Id: ${listingsDto.items[0].data?.marketplace.iv[0]} created in database.`); + + amazonItem.Offers?.Listings?.forEach(async (amazonListing) => { + console.log(`[procure-asin] Amazon PA API Response contains Seller ${amazonListing.MerchantInfo?.Name} offer for ${amazonListing.Price?.Amount} in ${amazonListing.Condition?.Value} condition. Checking database for seller...`); + let sellersDto = await getSellerDtoByName(amazonListing.MerchantInfo!.Name!); + if (!sellersDto.items.length) { + console.log(`[procure-asin] Seller not found in database. Listing requires creation of seller first.`); + sellersDto = await getAddNewSellerDtoByName(amazonListing.MerchantInfo!.Name!); + console.log(`[procure-asin] Seller Id: ${sellersDto.items[0].id}, Seller Name: ${sellersDto.items[0].data?.sellerName['en-US']} created in database.`); + } else { + console.log(`[procure-asin] Matching Seller ID: ${sellersDto.items[0].id}, Seller Name: ${sellersDto.items[0].data?.sellerName['en-US']}.`); + } + let offer: Offer = { + offerDate: { iv: new Date().toISOString() }, + listing: { iv: [ listingsDto.items[0].id ] }, + seller: { iv: [ sellersDto.items[0].id ] }, + newPrice: { iv: null }, + usedPrice: { iv: null }, + }; + if (amazonListing.Condition?.Value === 'New') { + offer.newPrice = { iv: amazonListing.Price?.Amount!}; + offer.usedPrice = { iv: null }; + } + else if (amazonListing.Condition?.Value === 'Used') { + offer.newPrice = { iv: null }; + offer.usedPrice = { iv: amazonListing.Price?.Amount! } + } + console.log('Generated Offer:\n', offer); + let offersDto = await getAddNewOfferDto(offer); + }); + + await performSyncLocalizedSlugs(console.log); + }); + } + }) + .configureHelp(); + + +program.parse(); diff --git a/src/apps/modules/amazon-catalog-helpers.ts b/src/apps/modules/amazon-catalog-helpers.ts new file mode 100644 index 0000000..916386d --- /dev/null +++ b/src/apps/modules/amazon-catalog-helpers.ts @@ -0,0 +1,518 @@ +import type { AmazonGetItem } from '../../data/models/multis/AmazonGetItem.ts'; +import type { Brand } from '../../data/models/multis/Brand.ts'; +import type { ContentsDto } from '../../data/internals/ContentsDtoT.ts'; +import type { GetItemsResponse, Item } from 'amazon-pa-api5-node-ts'; +import type { Listing } from '../../data/models/multis/Listing.ts'; +import type { Multilingual } from '../../data/internals/MultilingualT.ts'; +import type { NonMultilingual } from '../../data/internals/NonMultilingualT.ts'; +import type { Product } from '../../data/models/multis/Product.ts'; +import type { ProductCategory } from '../../data/models/multis/ProductCategory.ts'; +import type { Seller } from '../../data/models/multis/Seller.ts'; +import { arrayBuffer } from 'stream/consumers'; +import { client, getContentsByIds, TIMEOUT_IN_SECONDS } from '../../data/core/client.ts'; +import { createReadStream, type ReadStream } from 'fs'; +import { getItems } from '../../apiclient/amazon.ts'; +import { getBrandsUsingJsonQuery, getMarketplacesUsingJsonQuery, getProductCategoriesUsingJsonQuery, getProductsUsingJsonQuery, getSellersUsingJsonQuery } from '../../data/api-client.ts'; +import { memfs } from 'memfs'; +import { response } from '../../old-data/brands/first-aid-only-example-query-getitems.ts'; +import { SCHEMAS } from '../../data/models/schemas.ts'; +import axios from 'axios'; +import ollama from 'ollama'; +import slugify from 'slugify'; +import type { Offer } from '../../data/models/multis/Offer.ts'; + +export function isValidASIN(asinOrNot: string) { + return asinOrNot.match(/[A-Z0-9]{10}/g) ? true : false; +} + +export async function getAmazonGetItemsRequestSchemaDto() { + return await client.schemas.getSchema('amazon-pa-get-items-request'); +} + +export async function lookupAmazonASINs(asins: string[]) { + let amazonGetItemsRequestSchemaDto = await getAmazonGetItemsRequestSchemaDto(); + let requestDate = new Date().toISOString(); + //TODO: Implement API client + let apiResponse = await getItems(asins); + //TODO: disable when API client is ready: returns mock data for now + //particularly I want to log every Amazon lookup from now until forever in Squidex + // let apiResponse = response as GetItemsResponse; + let amazonGetItem: AmazonGetItem = { + apiResponse: { iv: apiResponse }, + getItemsRequest: { iv: { schemaId: amazonGetItemsRequestSchemaDto.id, ItemIds: [ { + ItemId: (apiResponse.ItemsResult && apiResponse.ItemsResult.Items!.length > 0) ? apiResponse.ItemsResult!.Items![0].ASIN! : asins[0] + } ] } }, + requestDate: { iv: requestDate } + } + let amazonGetItemDto = await client.contents.postContent(SCHEMAS.AMAZON_GET_ITEMS, { + publish: true, + body: amazonGetItem as any, + }) + let amazonGetItemsDto = await getContentsByIds(SCHEMAS.AMAZON_GET_ITEMS, amazonGetItemDto.id); + return amazonGetItemsDto; +} + +export async function getMarketplaceConnectionSchemaDto() { + return await client.schemas.getSchema('product-marketplace-connection'); +} + +export async function getAmazonMarketplaceConnectionSchemaDto() { + return await client.schemas.getSchema('product-marketplace-connection-amazon') +} + +export async function getAmazonMarketplaceDto() { + return await getMarketplacesUsingJsonQuery(JSON.stringify({ + filter: { + op: 'eq', + path: 'data.marketplaceName.en-US', + value: 'Amazon' + } + })); +} + +export async function doesProductAlreadyExist(asin: string) { + return (await getProductsUsingJsonQuery(JSON.stringify({ + filter: { not: { and: [{ + op: 'empty', + path: 'data.marketplaceConnections.iv.connection.asin', + // value: 'Amazon' + }, { + op: 'eq', + path: 'data.marketplaceConnections.iv.marketplace', + eq: (await getAmazonMarketplaceDto()).items[0].id + }] } } + }))).items.length > 0; +} + +export async function getBrandDtoByName(brandName: string) { + return (await getBrandsUsingJsonQuery(JSON.stringify({ + filter: { + op: 'eq', + path: 'data.brandName.en-US', + value: brandName, + } + }))); +} + +export async function getAddNewBrandDtoByName(brandName: string) { + let brandDto = await client.contents.postContent(SCHEMAS.BRANDS, { + body: { + brandName: { + "en-US": brandName!, + "es-US": brandName!, + "fr-CA": brandName! + }, + slug: { + "en-US": `en-US/${slugify(brandName!, { lower: true, trim: true })}`, + "es-US": `es-US/${slugify(brandName!, { lower: true, trim: true })}`, + "fr-CA": `fr-CA/${slugify(brandName!, { lower: true, trim: true })}` + }, + } + }, { + timeoutInSeconds: TIMEOUT_IN_SECONDS, + }); + let brandsDto = await client.contents.getContents(SCHEMAS.BRANDS, { unpublished: true, ids: brandDto.id }, { timeoutInSeconds: TIMEOUT_IN_SECONDS }) as ContentsDto; + return brandsDto; +} + +export async function getSellerDtoByName(sellerName: string) { + return (await getSellersUsingJsonQuery(JSON.stringify({ + filter: { + op: 'eq', + path: 'data.sellerName.en-US', + value: sellerName, + } + }))); +} + +export async function getAddNewSellerDtoByName(sellerName: string) { + let sellerDto = await client.contents.postContent(SCHEMAS.SELLERS, { + body: { + sellerName: { + "en-US": sellerName!, + "es-US": sellerName!, + "fr-CA": sellerName! + }, + slug: { + "en-US": `en-US/${slugify(sellerName!, { lower: true, trim: true })}`, + "es-US": `es-US/${slugify(sellerName!, { lower: true, trim: true })}`, + "fr-CA": `fr-CA/${slugify(sellerName!, { lower: true, trim: true })}` + }, + } + }, { + timeoutInSeconds: TIMEOUT_IN_SECONDS, + }); + let sellersDto = await client.contents.getContents(SCHEMAS.SELLERS, { unpublished: true, ids: sellerDto.id }, {timeoutInSeconds: TIMEOUT_IN_SECONDS}) as ContentsDto; + return sellersDto; +} + +export async function translateProductName_from_en_US_to_es_US(item: Item, brandName: string, productName_en_US: string) { + return (await ollama.chat({ + model: 'llama3.1', + messages: [{ + role: 'user', + content: +`Translate just the product name "${productName_en_US}" into Latin American Spanish, formal, no commentary, no alternatives, ignoring the rest of this text.` + +`The brand name "${brandName}" remains unchanged. Here is the full product description for reference only:\n` + +`${item.ItemInfo?.Features?.DisplayValues?.map((item) => `- ${item}`).join('\n')}\n`, + }] + })).message.content; +} + +export async function translateProductName_from_en_US_to_fr_CA(item: Item, brandName: string, productName_en_US: string) { + return (await ollama.chat({ + model: 'llama3.1', + messages: [{ + role: 'user', + content: +`Translate just the product name "${productName_en_US}" into French Canadian, formal, no commentary, no alternatives, ignoring the rest of this text.` + +`The brand name "${brandName}" remains unchanged. Here is the full product description for reference only:\n` + +`${item.ItemInfo?.Features?.DisplayValues?.map((item) => `- ${item}`).join('\n')}\n`, + }] + })).message.content; +} + +export async function generateAIProductDescription(productName_en_US: string, features: string[]) { + return (await ollama.chat({ + model: 'llama3.1', + messages: [{ + role: 'user', + content: +`I have a niche wish style website called Dasher Supply. It contains many products which are great picks for delivery drivers. `+ +`I need you to write me a product pitch based on the information the following rules: 1. please don't bother with introductions and conclusions, `+ +`those are implied because these are articles on the website; 2. please, whatever you do, do not invent any new information about the products--you should `+ +`only ever produce outputs based on the inputs; 3. if you aren't sure whether to call us Dashers or delivery drivers, do use delivery drivers or drivers, etc., `+ +`as I do not want to cause any issues with the actual DoorDash company; 4. please no commentary, just provide the review based on what you know, but try`+ +`to sell it to a delivery driver. Here is the product name:`+ '`' + productName_en_US + '`. Here are the product features as generally marketed on Amazon: '+ +`${features.map((feature) => `- ${feature}`).join('\n')}.` + }] + })).message.content; +} + +export async function translateProductDescription_from_en_US_to_es_US(brandName: string, productDescription_en_US: string) { + return (await ollama.chat({ + model: 'llama3.1', + messages: [{ + role: 'user', + content: +`I have a product description in United States English that I need to translate to Latin American Spanish. If you aren't sure about something ` + +`please use your best judgement in selecting alternatives. The speech can be informal but we're mostly professionals selling products and we ` + +`want to include options for alternative languages. Please no commentary, just the translation. The brand is ${brandName}, don't translate it. Here is the description in English:\n` + +productDescription_en_US + }] + })).message.content; +} + +export async function translateProductDescription_from_en_US_to_fr_CA(brandName: string, productDescription_en_US: string) { + return (await ollama.chat({ + model: 'llama3.1', + messages: [{ + role: 'user', + content: +`I have a product description in United States English that I need to translate to French Canadian. If you aren't sure about something ` + +`please use your best judgement in selecting alternatives. The speech can be informal but we're mostly professionals selling products and we ` + +`want to include options for alternative languages. Please no commentary such as "Here is the translation to French Canadian:", just the text translation. `+ +`I need to pipe the output of this command. The brand is ${brandName}, don't translate it. Here is the description in English:\n` + +productDescription_en_US + }] + })).message.content; +} + +export async function getAllTopLevelProductCategories() { + return (await getProductCategoriesUsingJsonQuery()).items + .filter((category) => + !!category.data?.parentCategory.iv || !category.data?.parentCategory.iv.length) + .map((category) => { + return { id: category.id, categoryName: category.data?.categoryName, description: category.data?.description, parentCategory: category.data?.parentCategory }; + }); +} + +export async function getAllProductSubCategories(parentProductCategoryId: string) { + return (await getProductCategoriesUsingJsonQuery(JSON.stringify({ filter: { path: 'data.parentCategory.iv', op: 'eq', value: parentProductCategoryId } }))).items.map((category) => { return { id: category.id, categoryName: category.data?.categoryName, description: category.data?.description, parentCategory: category.data?.parentCategory||undefined }; }); +} + +export async function designAiTopLevelProductCategoryEvalQuestions(brandName: string, productName_en_US: string) { + const topLevelProductCategories = await getAllTopLevelProductCategories(); + return [ + // prompt 1 + `My website is called Dasher Supply. It contains products and product categories. I need your help in categorizing a product.`, + // prompt 2 + `I have ${topLevelProductCategories.length} top level product categories. The top level product categories I have already are (in JSON format):\n\n` + + JSON.stringify(topLevelProductCategories), + // prompt 3 + `Which of these top level product categories should I pick to organize this product? ` + + `The brand name for the product is ${brandName}. The name of the product (in en-US) is ${productName_en_US}. ` + + `The product features (in US English) are:\n` + + `${response.ItemsResult?.Items![0].ItemInfo?.Features?.DisplayValues?.map((item) => `- ${item}`).join('\n')}\n`, + // prompt 4 + `I need the answer in a certain format. In this case I must have only the category UUID as a properly escaped valid JavaScript string in double-quotes, no commentary.`, + ]; +} + +export async function askAiTopLevelProductCategoryEvalQuestions(brandName: string, productName_en_US: string) { + const aiTopLevelCategoryEvalQuestions: string[] = await designAiTopLevelProductCategoryEvalQuestions(brandName, productName_en_US); + return JSON.parse((await ollama.chat({ + model: 'llama3.1', + messages: aiTopLevelCategoryEvalQuestions.map(content => { return { role: 'user', content } }), + })).message.content).trim().toLowerCase() as string; +} + +export async function designAiProductSubCategoryEvalQuestionsSet1(parentProductCategoryId: string, brandName: string, productName_en_US: string, features: string[]) { + const topLevelProductCategories = await getAllTopLevelProductCategories(); + const productSubCategories = await getAllProductSubCategories(parentProductCategoryId); + const aiTopLevelCategoryEvalQuestions: string[] = await designAiTopLevelProductCategoryEvalQuestions(brandName, productName_en_US); + return [ + // prompt 1 + aiTopLevelCategoryEvalQuestions[0], + // prompt 2 + aiTopLevelCategoryEvalQuestions[1], + // prompt 3 +`The brand name for the product is ${brandName}. The name of the product (in en-US) is ${productName_en_US}. The product features (in US English) are:\n` + +`${features.map((item) => `- ${item}`).join('\n')}\n` + +`When asked previously about which top level product category, you picked ${parentProductCategoryId} as the closest match.`, + // prompt 4 +`The second level product categories I have already are (in JSON format):\n\n` + +JSON.stringify(productSubCategories) + +` Ignoring the top level product categories, should I pick an existing second level category from the list (if any), or make a new one?`, + // prompt 5 +`I need the answer in a certain format. In this case I must have only the answer as a valid JavaScript boolean to read in with JSON.parse. If you suggest making a new second level category, return true, no commentary. If you suggest using an existing second level category, return false, no commentary.` + ]; +} + +export async function askAiProductSubCategoryEvalQuestionsSet1(parentProductCategoryId: string, brandName: string, productName_en_US: string, features: string[]) { + const aiSubCategoryEvalQuestion1 = await designAiProductSubCategoryEvalQuestionsSet1(parentProductCategoryId, brandName, productName_en_US, features); + return JSON.parse((await ollama.chat({ + model: 'llama3.1', + messages: aiSubCategoryEvalQuestion1.map(content => { return { role: 'user', content } }), + })).message.content) as boolean; +} + +export async function designAiProductSubCategoryEvalQuestionsSet2(response: GetItemsResponse, parentProductCategoryId: string, brandName: string, productName_en_US: string, features: string[], shouldCreateNewProductCategory: boolean) { + const topLevelProductCategories = await getAllTopLevelProductCategories(); + const productSubCategories = await getAllProductSubCategories(parentProductCategoryId); + const aiTopLevelCategoryEvalQuestions: string[] = await designAiTopLevelProductCategoryEvalQuestions(brandName, productName_en_US); + return [ + // prompt 1 + aiTopLevelCategoryEvalQuestions[0], + // prompt 2 + aiTopLevelCategoryEvalQuestions[1], + // prompt 3 + `The brand name for the product is ${brandName}. The name of the product (in en-US) is ${productName_en_US}. The product features (in US English) are:\n` + + `${response.ItemsResult?.Items![0].ItemInfo?.Features?.DisplayValues?.map((item) => `- ${item}`).join('\n')}\n` + + `When asked previously about which top level product category, you picked ${parentProductCategoryId} as the closest match.`, + // prompt 4 + `The second level product categories I have already are (in JSON format):\n\n` + + JSON.stringify(productSubCategories) + + ` When asked whether I should pick an existing second level category from the list (if any) or make a new one you previously responded ${shouldCreateNewProductCategory?" that I should make a new one.":" that I should choose an existing one."}`, + // prompt 5 + shouldCreateNewProductCategory + ? + `What would be a good subcategory to use for this product based on what you know about the product, the existing categories, and the web site?` + : + `Which existing subcategory do you think I should use?` + , + // prompt 6 + shouldCreateNewProductCategory + ? + `In TypeScript, the interface looks like this:\n\n` + + `internals/NonMultilingualT.ts:` + "```\n" + + `export interface NonMultilingual {\n` + + ` [key: string]: T,\n` + + ` iv: T,\n` + + `};\n` + + "```\n" + + `internals/MultilingualT.ts:` + "```" + + `export interface Multilingual {\n` + + ` [key: string]: T,\n` + + ` 'en-US': T,\n` + + ` 'es-US': T,\n` + + ` 'fr-CA': T,\n` + + `};\n` + + "```\n" + + `models/multis/ProductCategory.ts:` + "```\n" + + `import type { Multilingual } from "../../internals/MultilingualT";\n` + + `import type { NonMultilingual } from "../../internals/NonMultilingualT";\n` + + `export interface ProductCategory {\n` + + ` categoryName: Multilingual, //multilingual name of category` + + ` description: Multilingual, //multilingual description of category` + + ` parentCategory: NonMultilingual, //parent category (exactly 1), though due to Squidex / MongoDB this is always an array of UUIDs with the UUID belonging to the UUID of the parent category or an empty array for top-level categories` + + `}` + "```\n\n" + + `I need the answer in a certain format. In this case I must have only the JSON for the new Category containing only the fields categoryName and description in all three languages, no commentary, no code comments, and with the UUID in the string array for parentCategory field, no commentary, no code comments, no id field, not in a markdown codeblock.` + : + `I need the answer in a certain format. In this case I must have only the category UUID as a properly escaped valid JavaScript string, no commentary.`, + ]; +} + +export async function askAiProductSubCategoryEvalQuestionsSet2(response: GetItemsResponse, parentProductCategoryId: string, brandName: string, productName_en_US: string, features: string[], shouldCreateNewProductCategory: boolean): Promise<{ + categoryName: Multilingual, + description: Multilingual, + parentCategory: NonMultilingual, +}|string> { + const aiSubCategoryEvalQuestion2 = await designAiProductSubCategoryEvalQuestionsSet2(response, parentProductCategoryId, brandName, productName_en_US, features, shouldCreateNewProductCategory); + console.log(`>>>${aiSubCategoryEvalQuestion2}`); + const answer = (await ollama.chat({ + model: 'llama3.1', + messages: aiSubCategoryEvalQuestion2.map(content => { return { role: 'user', content } }), + })).message.content; + console.log(`llama3.1>${answer}`); + const aiSubCategoryEvalQuestion2Answer = JSON.parse(answer) as { + categoryName: Multilingual, + description: Multilingual, + parentCategory: string[], + }|string; + if (typeof aiSubCategoryEvalQuestion2Answer === 'string') { + return aiSubCategoryEvalQuestion2Answer as string; + } else { + return { + categoryName: aiSubCategoryEvalQuestion2Answer.categoryName, + description: aiSubCategoryEvalQuestion2Answer.description, + parentCategory: { iv: aiSubCategoryEvalQuestion2Answer.parentCategory }, + }; + } +} + +export async function generateAITagsForProduct(productName_en_US: string, features: string[]) { + const questions: string[] = [ + `Provided the description for the product, please provide a valid JavaScript array of strings which represent tags on a website for the product, no commentary, no code comments, not in a markdown codeblock. The product name is ${productName_en_US}. The product features are:\n ${features.map((feature) => `- ${feature}`).join('\n')}` + ]; + let answer = (await ollama.chat({ + model: 'llama3.1', + messages: questions.map(content => { return { role: 'user', content } }), + })).message.content; + return (JSON.parse(answer) as string[]).map(a => a.trim().toLowerCase()); +} + +export async function translateTags_from_en_US_to_es_US(tags_en_US: string[]) { + const questions: string[] = [ + `Provided these website tags in United States English in the following JavaScript array of strings, please provide a valid JavaScript array of strings which represent the tags translated to Latin American Spanish, no commentary, no code comments, not in a markdown codeblock. The tags are:\n ${JSON.stringify(tags_en_US)}` + ]; + let answer = (await ollama.chat({ + model: 'llama3.1', + messages: questions.map(content => { return { role: 'user', content } }), + })).message.content; + return (JSON.parse(answer) as string[]).map(a => a.trim().toLowerCase()); +} + +export async function translateTags_from_en_US_to_fr_CA(tags_en_US: string[]) { + const questions: string[] = [ + `Provided these website tags in United States English in the following JavaScript array of strings, please provide a valid JavaScript array of strings which represent the tags translated to French Canadian, no commentary, no code comments, not in a markdown codeblock. The tags are:\n ${JSON.stringify(tags_en_US)}` + ]; + let answer = (await ollama.chat({ + model: 'llama3.1', + messages: questions.map(content => { return { role: 'user', content } }), + })).message.content; + return (JSON.parse(answer) as string[]).map(a => a.trim().toLowerCase()); +} + +export async function getAddNewProductSubCategoryDto(parentProductCategoryId: NonMultilingual, categoryName: Multilingual, description: Multilingual) { + let productCategoryDto = await client.contents.postContent(SCHEMAS.PRODUCT_CATEGORIES, { + publish: false, + body: { + categoryName, + description, + parentCategory: parentProductCategoryId, + }, + }, { + timeoutInSeconds: TIMEOUT_IN_SECONDS, + }); + let productCategoriesDto = await client.contents.getContents(SCHEMAS.PRODUCT_CATEGORIES, { unpublished: true, ids: productCategoryDto.id }, {timeoutInSeconds: TIMEOUT_IN_SECONDS}) as ContentsDto; + return productCategoriesDto; +} + +export async function translateAmazonDescription_from_en_US_to_es_US(brandName: string, features: string[]) { + return (await ollama.chat({ + model: 'llama3.1', + messages: [{ + role: 'user', + content: + `Translate the Amazon description into Latin American Spanish, formal, no commentary, no alternatives. ` + + `The brand name ${brandName} remains unchanged. Here is the description:\n` + + `${features.map((feature) => `- ${feature}`).join('\n')}\n`, + }] + })).message.content; +} + +export async function translateAmazonDescription_from_en_US_to_fr_CA(brandName: string, features: string[]) { + return (await ollama.chat({ + model: 'llama3.1', + messages: [{ + role: 'user', + content: + `Translate the Amazon description into French Canadian, formal, no commentary, no alternatives. ` + + `The brand name ${brandName} remains unchanged. Here is the description:\n` + + `${features.map((feature) => `- ${feature}`).join('\n')}\n`, + }] + })).message.content; +} + +export async function getAddNewProductDtoByProduct(product: Product) { + let productDto = await client.contents.postContent(SCHEMAS.PRODUCTS, { + publish: false, + body: { + ...product + }, + }, { + timeoutInSeconds: TIMEOUT_IN_SECONDS, + }); + let productsDto = await client.contents.getContents(SCHEMAS.PRODUCTS, { unpublished: true, ids: productDto.id }, {timeoutInSeconds: TIMEOUT_IN_SECONDS}) as ContentsDto; + return productsDto; +} + +export async function getAddNewProductListingDtoByProduct(listing: Listing) { + let listingDto = await client.contents.postContent(SCHEMAS.LISTINGS, { + publish: true, + body: { + ...listing + } + }, { + timeoutInSeconds: TIMEOUT_IN_SECONDS, + }); + let listingsDto = await client.contents.getContents(SCHEMAS.LISTINGS, { unpublished: true, ids: listingDto.id }, {timeoutInSeconds: TIMEOUT_IN_SECONDS}) as ContentsDto; + return listingsDto; +} + +export function trimPeriods(str: string) { + return str.replace(/^\s+|\s+$/g, '').replace(/\.$/g, ''); +} + +export function removeQuotes(str: string) { + return str.replace(/['"]+/g, ''); +} + +export async function upsertAssetFolder(folderName: string, parentFolderId?: string|undefined) { + const assetFolders = await client.assets.getAssetFolders({ scope: 'Items', parentId: parentFolderId }, { timeoutInSeconds: TIMEOUT_IN_SECONDS }); + let assetFolder; + let assetFolderLookup = assetFolders.items.filter(folder => folder.folderName === folderName); + if (assetFolderLookup.length === 0) { + assetFolder = await client.assets.postAssetFolder({ folderName: folderName, parentId: parentFolderId }, { timeoutInSeconds: TIMEOUT_IN_SECONDS }); + } + else { + assetFolder = assetFolderLookup[0]; + } + return assetFolder; +} + +export async function getAllAssetsInFolder(assetFolderId: string) { + let assetsDto = await client.assets.getAssets({parentId: assetFolderId}); + return assetsDto.items||[]; +} + +export async function uploadDownloadedImageToSquidexAsAsset(downloadUrl: string, assetFolderId: string) { + let filename = downloadUrl.substring(downloadUrl.lastIndexOf('/')+1); + let response = await axios.get(downloadUrl, { timeout: TIMEOUT_IN_SECONDS * 1000, responseType: 'arraybuffer' }); + let assetDto = await client.assets.postAsset({ readable: response.data, fileName: filename }, { timeoutInSeconds: TIMEOUT_IN_SECONDS }); + assetDto = await client.assets.putAsset(assetDto.id, { fileName: filename, metadata: { ...assetDto.metadata, 'amazon-url': downloadUrl }, tags: ['amazon', 'product'] }) + assetDto = await client.assets.putAssetParent(assetDto.id, { parentId: assetFolderId }); + return assetDto; +} + +export async function getAddNewOfferDto(offer: Offer) { + let offerDto = await client.contents.postContent(SCHEMAS.OFFERS, { + publish: true, + body: offer as any, + }, { + timeoutInSeconds: TIMEOUT_IN_SECONDS, + }); + let offersDto = await client.contents.getContents(SCHEMAS.OFFERS, { unpublished: true, ids: offerDto.id }, {timeoutInSeconds: TIMEOUT_IN_SECONDS}) as ContentsDto; + return offersDto; +} diff --git a/src/apps/squidex-webhooks.ts b/src/apps/squidex-webhooks.ts new file mode 100644 index 0000000..d704de4 --- /dev/null +++ b/src/apps/squidex-webhooks.ts @@ -0,0 +1,169 @@ +import Fastify, { type FastifyRequest } from 'fastify'; +import fastifyMiddie from '@fastify/middie'; +// import fastifyStatic from '@fastify/static'; +// import { fileURLToPath } from 'node:url'; +// import { handler as ssrHandler } from './dist/server/entry.mjs'; +import { config } from '../config.ts'; +// import { series } from 'node:async'; +// import { spawn } from 'node:child_process'; +import type { ChildProcess } from 'child_process'; +import { performSyncLocalizedSlugs } from '../data/api-client.ts'; +import util from 'node:util'; +// import { parse as parseQueryString } from 'node:querystring'; + +// const app = Fastify({ logger: true }); +// await app +// .register(fastifyStatic, { +// root: fileURLToPath(new URL('./dist/client', import.meta.url)), +// }) +// .register(fastifyMiddie); +// app.use(ssrHandler); +// app.listen({ host: '0.0.0.0', port: config.port }, (err, address) => { +// if (err) { +// app.log.error(err); +// process.exit(1); +// } +// app.log.info(`Fastify web server with Astro middleware listening at ${address}.`) +// }); + +const webhook = Fastify({ logger: true }); +await webhook + .register(fastifyMiddie); +webhook.get("/", async (req, reply) => { + let buffer = "200 [OK] Webhook server"; + reply.send({ + status: 'ok', + text: buffer + }); + return reply; +}); +webhook.post("/cache-localized-slugs", async (req, reply) => { + let buffer = ''; + const trapLog = (...args: any[]) => { + const line = args.map((val) => typeof val === 'string' ? val : util.inspect(val)).join(' '); + buffer += line + '\n'; + webhook.log.info(line); + }; + performSyncLocalizedSlugs(trapLog).then(() => { + reply.send({ + status: 'ok', + text: buffer + }); + }); + return reply; +}) +webhook.get("/cache-localized-slugs", async (req, reply) => { + let buffer = ''; + const trapLog = (...args: any[]) => { + const line = args.map((val) => typeof val === 'string' ? val : util.inspect(val)).join(' '); + buffer += line + '\n'; + webhook.log.info(line); + }; + performSyncLocalizedSlugs(trapLog).then(() => { + reply.send({ + status: 'ok', + text: buffer + }); + }); + return reply; +}) +// webhook.get("/get-site-data", async (req, reply) => { +// let site = await getSite(); +// reply.send(site); +// return reply; +// }); +// webhook.get("/get-homepage-data", async (req, reply) => { +// let homePage = await getSiteHomePage(SupportedLanguages['en-US']) +// reply.send(homePage); +// return reply; +// }); + +// type GetPageByLangSlugRequest = FastifyRequest<{Querystring:{lang: string,slug: string}}>; +// webhook.get("/get-page-by-lang-slug", async (req: GetPageByLangSlugRequest, reply) => { +// let lang = req.query.lang; +// let slug = req.query.slug; +// let page = await getPageByLangSlug(lang, slug); +// reply.send(page); +// return reply; +// }); +// let rebuildLock: ChildProcess[] = []; +// webhook.post("/rebuild", async (req, reply) => { +// const strapiEventName = req.headers['X-Strapi-Event']; +// console.log('Strapi Event', strapiEventName); +// console.log('Request Body', req.body); +// return "Hello, World!"; +// // let startTime = Date.now(); +// // if (rebuildLock.length < 1) { +// // let instance; +// // Promise.all([ instance = spawn(/^win/.test(process.platform) ? 'npm.cmd' : 'npm', ['run-script', 'astro', 'build'], { +// // stdio: 'overlapped', +// // })]);; +// // rebuildLock.push(instance); +// // let stdout = ''; +// // let stderr = ''; +// // instance.stdout.on('data', (data) => { +// // stdout += data.toString(); +// // }) +// // instance.stderr.on('data', (data) => { +// // stderr += data.toString(); +// // }) +// // instance.on('error', (err) => { +// // let endTime = Date.now(); +// // let duration = endTime - startTime; +// // rebuildLock.splice(0, 1); +// // if (err) { +// // reply.statusCode = 500; +// // } +// // reply.send({ +// // status: err ? 'err' : 'ok', +// // err: err || undefined, +// // stdout, +// // stderr, +// // startTime, +// // endTime, +// // duration, +// // }); +// // }); +// // instance.on('close', (exitCode) => { +// // let endTime = Date.now(); +// // let duration = endTime - startTime; +// // rebuildLock.splice(0, 1); +// // let err = (exitCode != 0); +// // if (err) { +// // reply.statusCode = 500; +// // } +// // reply.send({ +// // status: err ? 'err' : 'ok', +// // err: err || undefined, +// // exitCode, +// // stdout, +// // stderr, +// // startTime, +// // endTime, +// // duration, +// // }); +// // }); +// // } +// // else { +// // reply.statusCode = 503; // inform client of HTTP 503 Service Unavailable +// // reply.header('Retry-After', '10'); // inform client to retry request after 10 seconds +// // reply.send({ +// // status: 'info', +// // err: 'A rebuild is currently in progress and another rebuild is currently queued. Please wait for the rebuild to finish.', +// // }) +// // } +// // return reply; +// }); +webhook.listen({ host: '0.0.0.0', port: config.webhookPort }, (err, address) => { + if (err) { + webhook.log.error(err); + process.exit(1); + } + webhook.log.info(`Fastify web server with webhook middleware listening at ${address}.`) + // webhook.log.info(`You can trigger a site rebuild at ${address}/rebuild.`) + const trapLog = (...args: any[]) => { + const line = args.map((val) => typeof val === 'string' ? val : util.inspect(val)).join(' '); + webhook.log.info(line); + }; + performSyncLocalizedSlugs(trapLog); +}); diff --git a/src/apps/ssr-server.ts b/src/apps/ssr-server.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/components/Banner.astro b/src/components/Banner.astro new file mode 100644 index 0000000..7f12436 --- /dev/null +++ b/src/components/Banner.astro @@ -0,0 +1,30 @@ +--- +interface Banner { + editToken?: string, + homePageLink: string, + siteName: string, +} + +const { editToken, homePageLink, siteName } = Astro.props; +--- +

{siteName}

+ + \ No newline at end of file diff --git a/src/components/Brand.astro b/src/components/Brand.astro new file mode 100644 index 0000000..92c61bd --- /dev/null +++ b/src/components/Brand.astro @@ -0,0 +1,84 @@ +--- +import type { Brand } from "../data/models/multis/Brand"; +import { getAssetById, getLocaleField } from "../data/api-client"; +import path from "node:path"; +import { renderMarkdown } from "../lib/rendering"; + +interface Props { + brand: Brand, + editToken?: string, + locale: string, +} + +const { brand, editToken, locale } = Astro.props; + +let brandLogoImage = path.posix.join('/img', (await getAssetById(brand.logoImage[locale])) + .links['content'] + .href + .split('/') + .reverse() + .filter((_value, index, array) => index < (array.length - index - 2)) + .reverse() + .join('/')); +--- + +
+
+ { brandLogoImage && + {brand.brandName[locale]} + } +
+ {getLocaleField(locale, brand.shortDescription) &&
} +
+
+ {getLocaleField(locale, brand.longDescription) &&
} +
+ + \ No newline at end of file diff --git a/src/components/BrandCard.astro b/src/components/BrandCard.astro index 2349143..77ff6ef 100644 --- a/src/components/BrandCard.astro +++ b/src/components/BrandCard.astro @@ -1,16 +1,33 @@ --- -import type { Brand } from '../data/brands/brand'; +import type { Brand } from "../data/models/multis/Brand"; +import { getAssetById } from "../data/api-client"; +import path from "node:path"; interface Props { - brand: Brand + brand: Brand, + editToken?: string, + locale: string, } -const { brand } = Astro.props; +const { brand, editToken, locale } = Astro.props; + +let brandLogoImage = path.posix.join('/img', (await getAssetById(brand.logoImage[locale])) + .links['content'] + .href + //The purpose of .split('/').reverse().filter(...2...).reverse().join('/') is to + //extract the last two directories from the end of the path, which we will + //use to form the path to the ../pages/img/[...imageLookup].astro handler, e.g., + //in the form of `/img/${uuid}/${fileName}.${ext}`. + .split('/') + .reverse() + .filter((_value, index, array) => index < (array.length - index - 2)) + .reverse() + .join('/')); --- -
  • - - {brand.logoUrl !== undefined && {brand.name}} +
  • + + {brand.brandName[locale]}
  • +} \ No newline at end of file diff --git a/src/components/Callout.astro b/src/components/Callout.astro new file mode 100644 index 0000000..7b9eff6 --- /dev/null +++ b/src/components/Callout.astro @@ -0,0 +1,42 @@ +--- +interface Callout { + editToken?: string, + text: string, +} + +const { editToken, text } = Astro.props; +--- + +
    + + \ No newline at end of file diff --git a/src/components/CategoryCard.astro b/src/components/CategoryCard.astro deleted file mode 100644 index 1182586..0000000 --- a/src/components/CategoryCard.astro +++ /dev/null @@ -1,65 +0,0 @@ ---- -import type { Category } from '../data/categories'; - -interface Props { - category: Category -} - -const { category } = Astro.props; ---- - -
  • - - {category.imageUrl !== undefined && {category.category}} -

    - {category.category} - -

    -

    - {category.description} -

    -
    -
  • - diff --git a/src/components/ComponentRouter.astro b/src/components/ComponentRouter.astro new file mode 100644 index 0000000..66903c2 --- /dev/null +++ b/src/components/ComponentRouter.astro @@ -0,0 +1,340 @@ +--- +// import type { Brand, Page, PageBrand, PageCallout, PageContent, Site, SquidexComponent, QueryComponent } from '../data/squidex-client'; +import type { Brand } from "../data/models/multis/Brand"; +import type { Component } from "../data/internals/Component"; +import type { Marketplace } from "../data/models/multis/Marketplace"; +import type { Page } from "../data/models/multis/Page"; +import type { PageBrand } from "../data/models/components/PageBrand"; +import type { PageProduct } from "../data/models/components/PageProduct"; +import type { PageCallout } from "../data/models/components/PageCallout"; +import type { PageContent } from "../data/models/components/PageContent"; +import type { PageProductCategory } from "../data/models/components/PageProductCategory"; +import type { Product } from "../data/models/multis/Product"; +import type { ProductCategory } from "../data/models/multis/ProductCategory"; +import type { Seller } from "../data/models/multis/Seller"; +import type { Site } from "../data/models/singles/Site"; +import type { QueryComponent } from "../data/models/components/QueryComponent"; +import { SupportedLocales } from "../data/internals/MultilingualT"; +import { getBrandsByIds, getBrandsUsingJsonQuery, getMarketplacesByIds, getMarketplacesUsingJsonQuery, getPagesByIds, getProductCategoriesByIds, getProductCategoriesUsingJsonQuery, getProductsByIds, getProductsUsingJsonQuery, getSellersByIds, getSellersUsingJsonQuery } from '../data/api-client'; +import BrandComponent from './Brand.astro'; +import ProductComponent from './Product.astro'; +import Breadcrumbs, { type Breadcrumb } from './Breadcrumbs.astro'; +import BrandCard from './BrandCard.astro'; +import PageContentComponent from './Content.astro'; +import Callout from './Callout.astro'; +import ProductCard from './ProductCard.astro'; +import ProductCategoryComponent from './ProductCategory.astro'; +import ProductCategoryCard from './ProductCategoryCard.astro'; +import SellerCard from "./SellerCard.astro"; +import SellerComponent from './Seller.astro'; +import MarketplaceComponent from './Marketplace.astro'; +import MarketplaceCard from './MarketplaceCard.astro'; +import { renderMarkdown } from '../lib/rendering'; +import type { ContentsDto } from "../data/internals/ContentsDtoT"; +import type { PageMarketplace } from "../data/models/components/PageMarketplace"; +import type { PageSeller } from "../data/models/components/PageSeller"; +import type { ContentDto } from "../data/internals/ContentDtoT"; + +interface Props { + componentRouter: Component[], + homePage: Page, + isHomePage: boolean, + locale: string, + page: Page, + pageEditToken?: string, + site: Site, + siteEditToken?: string, + brand?: Brand, + marketplace?: Marketplace, + productDto?: ContentsDto, + productCategory?: ProductCategory, + seller?: Seller, +} + +const { brand, componentRouter, homePage, isHomePage, locale, marketplace, page, pageEditToken, productDto, productCategory, seller, site, siteEditToken } = Astro.props; +const renderContext = { ...Astro.props }; + +async function flatWalkSubCategories (productCategoryId: string): Promise[]> { + let mySubCategories = await getProductCategoriesUsingJsonQuery(JSON.stringify({ filter: { op: 'eq', path: 'data.parentCategory.iv', value: productCategoryId}})); + let walked = [...mySubCategories.items]; + for (let sc = 0; sc < mySubCategories.items.length; sc++) { + let deepWalk = await flatWalkSubCategories(mySubCategories.items[sc].id); + walked.push(...deepWalk); + } + return walked; +} + +--- + +{componentRouter.map(async (dynComponent) => { + switch (dynComponent.schemaName) { + case 'page-breadcrumbs': + const siteCrumb = ({ homePage, site, siteEditToken }: { homePage: Page, site: Site, siteEditToken?: string }): Breadcrumb => { + return { + text: site.siteName[locale], + url: `/${homePage.slug[locale]}/`, + gradient: true, + editToken: siteEditToken, + }; + }; + const pageCrumb = ({ page, pageEditToken }: { page: Page, pageEditToken?: string }): Breadcrumb => { + return { + text: page.title[locale], + url: `/${page.slug[locale]}`, + gradient: false, + editToken: pageEditToken, + } + }; + const categoryCrumb = ({ category, categoryEditToken }: { category: ProductCategory, categoryEditToken?: string }): Breadcrumb => { + return { + text: category.categoryName[locale], + url: `/${category.slug[locale]}`, + gradient: false, + editToken: categoryEditToken, + } + }; + const walkParentPagesForCrumbs = async ({homePage, site, startPage, startPageEditToken}: {homePage: Page, site: Site, startPage: Page, startPageEditToken?: string}) => { + const MAX_RECURSION_DEPTH = 10; + const walkParentPagesForCrumbsRecursive = async (recursePage: Page, abortAfterRecursions: number, recursePageEditToken?: string) => { + let parentPages: Breadcrumb[] = []; + if (recursePage.parentPage && recursePage.parentPage.iv && recursePage.parentPage.iv.length > 0) { + if (abortAfterRecursions !== 0) { + let parentPagesDto = await getPagesByIds(recursePage.parentPage.iv[0]); + parentPages = await walkParentPagesForCrumbsRecursive(parentPagesDto.items[0].data!, abortAfterRecursions--); + } + } + if (recursePage.slug[locale] !== homePage.slug[locale]) { + parentPages.push(pageCrumb({ page: recursePage, pageEditToken: recursePageEditToken })); + } + return parentPages; + }; + let breadcrumbs = (await walkParentPagesForCrumbsRecursive(startPage, MAX_RECURSION_DEPTH, startPageEditToken)); + return breadcrumbs; + }; + const walkParentCategoriesForCrumbs = async ({startCategory, startCategoryEditToken}: {startCategory: ProductCategory, startCategoryEditToken: string}) => { + const MAX_RECURSION_DEPTH = 10; + const walkParentCategoriesForCrumbsRecursive = async (recurseCategory: ProductCategory, abortAfterRecursions: number, recurseCategoryEditToken?: string) => { + let parentCategories: Breadcrumb[] = []; + if (recurseCategory.parentCategory && recurseCategory.parentCategory.iv && recurseCategory.parentCategory.iv.length > 0) { + if (abortAfterRecursions !== 0) { + let parentCategoriesDto = await getProductCategoriesByIds(recurseCategory.parentCategory.iv[0]); + parentCategories = await walkParentCategoriesForCrumbsRecursive(parentCategoriesDto.items[0].data!, abortAfterRecursions--, parentCategoriesDto.items[0].editToken); + } + } + if (startCategory.slug !== recurseCategory.slug) { + parentCategories.push(categoryCrumb({ category: recurseCategory, categoryEditToken: recurseCategoryEditToken })); + } + return parentCategories; + }; + let breadcrumbs = (await walkParentCategoriesForCrumbsRecursive(startCategory, MAX_RECURSION_DEPTH)); + return breadcrumbs; + }; + let breadcrumbs: Breadcrumb[] = [ + siteCrumb({ homePage, site, siteEditToken }), + ...productCategory && productCategory.parentCategory && productCategory.parentCategory.iv && productCategory.parentCategory.iv[0] ? await walkParentCategoriesForCrumbs({ startCategory: productCategory, startCategoryEditToken: pageEditToken! }) : [], + ...await walkParentPagesForCrumbs({ homePage, site, startPage: page, startPageEditToken: pageEditToken }), + ...isHomePage?[pageCrumb({ page, pageEditToken })]:[], + ] + return ( + + ) + case 'page-content': + let content = dynComponent as PageContent; + return ( + + ); + case 'page-callout': + let callout = dynComponent as PageCallout; + return ( + + ); + case 'page-brands-query': + let brandsQuery = dynComponent as QueryComponent; + let brandsDto = (await getBrandsUsingJsonQuery(JSON.stringify(brandsQuery.jsonQuery))); + let brands = brandsDto!.items; + let brandsHeading: { [key: string]: string } = { + 'en-US': "Brands", + 'es-US': "Marcas", + 'fr-CA': "Marques", + }; + return ( + brands.length > 0 &&

    {brandsHeading[locale]}

    + + ); + case 'page-brand': + let brandComponent = dynComponent as PageBrand; + let brandId = brandComponent.brand ? brandComponent.brand[0] : ''; + let brandForComponent = brand || (await getBrandsByIds(brandId)).items[0].data!; + return ( + + ); + case 'page-marketplace': + let marketplaceComponent = dynComponent as PageMarketplace; + let marketplaceId = marketplaceComponent.marketplace ? marketplaceComponent.marketplace[0] : ''; + let marketplaceForComponent = marketplace || (await getMarketplacesByIds(marketplaceId)).items[0].data!; + return ( + + ); + case 'page-seller': + let sellerComponent = dynComponent as PageSeller; + let sellerId = sellerComponent.seller ? sellerComponent.seller[0] : ''; + let sellerForComponent = seller || (await getSellersByIds(sellerId)).items[0].data!; + return ( + + ); + case 'page-marketplaces-query': + let marketplacesQuery = dynComponent as QueryComponent; + let marketplacesDto = (await getMarketplacesUsingJsonQuery(JSON.stringify(marketplacesQuery.jsonQuery)))!; + let marketplaces = marketplacesDto.items; + let marketplacesHeading: { [key: string]: string } = { + 'en-US': "Marketplaces", + 'es-US': "Mercados", + 'fr-CA': "Marchés", + }; + return ( + marketplaces.length > 0 &&

    {marketplacesHeading[locale]}

    + + ); + case 'page-sellers-query': + let sellersQuery = dynComponent as QueryComponent; + let sellersDto = (await getSellersUsingJsonQuery(JSON.stringify(sellersQuery.jsonQuery)))!; + let sellers = sellersDto.items; + let sellersHeading: { [key: string]: string } = { + 'en-US': "Sellers", + 'es-US': "Vendedores", + 'fr-CA': "Vendeurs", + }; + return ( + sellers.length > 0 &&

    {sellersHeading[locale]}

    + + ); + case 'page-product-categories-query': + let productCategoriesQuery = dynComponent as QueryComponent; + let productCategoriesDto = (await getProductCategoriesUsingJsonQuery(JSON.stringify(productCategoriesQuery.jsonQuery)))!; + let productCategories = []; + for (let pc = 0; pc < productCategoriesDto.items.length; pc++) { + let productCategoryDto = productCategoriesDto.items[pc]; + let subCategories = await flatWalkSubCategories(productCategoryDto.id); + let subQueryDto = await getProductsUsingJsonQuery(JSON.stringify({ filter: { op: 'in', path: 'data.categories.iv', value: [productCategoryDto.id, ...subCategories.map((sc) => sc.id)] }})); + let hasProducts = subQueryDto.items.length > 0; + if (hasProducts) { + productCategories.push(productCategoryDto); + } + } + let productCategoriesHeading: { [key: string]: string } = { + 'en-US': "Product Categories", + 'es-US': "Categorías de productos", + 'fr-CA': "Catégories de produits", + }; + return ( + (productCategories.length > 0) &&

    {productCategoriesHeading[locale]}

    + + ); + case 'page-products-query': + let productsQuery = dynComponent as QueryComponent; + // console.log(JSON.stringify(productsQuery.jsonQuery)); + let productsDto = (await getProductsUsingJsonQuery(JSON.stringify(productsQuery.jsonQuery)))!; + let products = productsDto.items; + let productsHeading: { [key: string]: string } = { + 'en-US': "Products", + 'es-US': "Productos", + 'fr-CA': "Produits", + }; + return ( + products.length > 0 &&

    {productsHeading[locale]}

    + + ); + case 'page-product-category': + let productCategoryComponent = dynComponent as PageProductCategory; + let productCategoryId = productCategoryComponent.productCategory ? productCategoryComponent.productCategory[0] : ''; + let productCategoryForComponent = productCategory || (await getProductCategoriesByIds(productCategoryId)).items[0].data!; + return ( + + ) + case 'page-product': + let productComponent = dynComponent as PageProduct; + // let productId = productComponent.product ? productComponent.product[0] : ''; + // let productDto = productDto || (await getProductsByIds(productId)).items[0]; + return ( + + ) + default: + return ( +

    Unsupported or unknown dynamic component {dynComponent.schemaName}.

    + ); + } +})} + + diff --git a/src/components/Content.astro b/src/components/Content.astro new file mode 100644 index 0000000..adc6444 --- /dev/null +++ b/src/components/Content.astro @@ -0,0 +1,25 @@ +--- +interface Content { + editToken: string, + text: string, +} + +const { editToken, text } = Astro.props; +--- + +
    + + \ No newline at end of file diff --git a/src/components/Disclaimers.astro b/src/components/Disclaimers.astro new file mode 100644 index 0000000..7fe4206 --- /dev/null +++ b/src/components/Disclaimers.astro @@ -0,0 +1,16 @@ +--- +import type { Marketplace } from "../data/models/multis/Marketplace"; +import { getMarketplacesUsingJsonQuery } from "../data/api-client"; +import { renderMarkdown } from "../lib/rendering"; + +interface Props { + locale: string, +} + +const { locale } = Astro.props; + +const allMarketplacesDto = await getMarketplacesUsingJsonQuery(); +--- +{allMarketplacesDto.items.map((marketplaceDto) => ( + +))} \ No newline at end of file diff --git a/src/components/Marketplace.astro b/src/components/Marketplace.astro new file mode 100644 index 0000000..c314f8b --- /dev/null +++ b/src/components/Marketplace.astro @@ -0,0 +1,115 @@ +--- +import type { Marketplace } from "../data/models/multis/Marketplace"; +import { getAssetById, getLocaleField } from "../data/api-client"; +import path from "node:path"; +import { renderMarkdown } from "../lib/rendering"; + +interface Props { + marketplace: Marketplace, + editToken?: string, + locale: string, +} + +const { marketplace, editToken, locale } = Astro.props; + +let marketplaceLogoImageAsset = await getAssetById(marketplace.logoImage[locale][0]); +let marketplaceLogoImage = path.posix.join('/img', + marketplaceLogoImageAsset.links['content'] + .href + .split('/') + .reverse() + .filter((_value, index, array) => index < (array.length - index - 2)) + .reverse() + .join('/')); +--- + +
    +
    + { marketplaceLogoImage && + marketplaceLogoImageAsset.metadata['background-color'] + ? + {marketplace.marketplaceName[locale]} + : + {marketplace.marketplaceName[locale]} + } +
    + {marketplace.shortDescription && marketplace.shortDescription[locale] &&
    } +
    +
    +
    +
    +
    + {marketplace.longDescription && marketplace.longDescription[locale] &&
    } +
    +
    + + + + \ No newline at end of file diff --git a/src/components/MarketplaceCard.astro b/src/components/MarketplaceCard.astro new file mode 100644 index 0000000..89dfbbd --- /dev/null +++ b/src/components/MarketplaceCard.astro @@ -0,0 +1,84 @@ +--- +import path from "node:path"; +import type { Marketplace } from "../data/models/multis/Marketplace"; +import { getAssetById } from "../data/api-client"; + +interface Props { + editToken?: string, + marketplace: Marketplace, + locale: string, +} + +const { editToken, marketplace, locale } = Astro.props; + +let marketplaceLogoImageAsset = await getAssetById(marketplace.logoImage[locale][0]); +let marketplaceLogoImage = path.posix.join('/img', + marketplaceLogoImageAsset.links['content'] + .href + .split('/') + .reverse() + .filter((_value, index, array) => index < (array.length - index - 2)) + .reverse() + .join('/')); +--- + +
  • + + { marketplaceLogoImageAsset.metadata['background-color'] + ? + {marketplace.marketplaceName[locale]} + : + {marketplace.marketplaceName[locale]} + } + +
  • + diff --git a/src/components/Product.astro b/src/components/Product.astro new file mode 100644 index 0000000..47c4daf --- /dev/null +++ b/src/components/Product.astro @@ -0,0 +1,254 @@ +--- +import type { ContentsDto } from "../data/internals/ContentsDtoT"; +import type { Multilingual } from "../data/internals/MultilingualT"; +import type { Product } from "../data/models/multis/Product"; +import { getAssetById, getBrandsByIds, getMarketplacesByIds, getOffersByListingId } from "../data/api-client"; +import path from "node:path"; +import * as core from "../data/core/client"; +import { renderMarkdown } from "../lib/rendering"; +import { SCHEMAS } from "../data/models/schemas"; +import type { Listing } from "../data/models/multis/Listing"; +import type { Offer } from "../data/models/multis/Offer"; +import type { Marketplace } from "../data/models/multis/Marketplace"; +import ImageCarousel from "./ImageCarousel.astro"; +import type { AmazonMarketplaceConnection } from "../data/models/components/AmazonMarketplaceConnection"; +import { getSellersByIds } from "../data/api-client"; +import { DateTime } from "luxon"; + +interface Props { + productDto: ContentsDto, + editToken?: string, + locale: string, +} +let category={ } as unknown as any;let site={ } as unknown as any +const formatAsCurrency = (amount: number) => amount.toLocaleString(locale, { style: 'currency', currency: 'USD' }); + +const { productDto, editToken, locale } = Astro.props; +const product = productDto.items[0].data!; + +let amazonConnectorSchemaId = (await core.client.schemas.getSchema('product-marketplace-connection-amazon')).id; +let brandDto = (await getBrandsByIds(product.brand.iv[0])); +let possibleAmazonConnectors = product.marketplaceConnections.iv.filter((connection) => connection.connection.schemaId === amazonConnectorSchemaId); +let amazonConnector = possibleAmazonConnectors.length > 0 ? possibleAmazonConnectors[0].connection as AmazonMarketplaceConnection : undefined; + +const listingsDto = await core.getContentsUsingJsonQuery(SCHEMAS.LISTINGS, JSON.stringify({ + filter: { + path: "data.product.iv", + op: "eq", + value: productDto.items[0].id, + } +})); +const listingOffersDtos = listingsDto.items.map(async (listingDto) => await core.getContentsUsingJsonQuery(SCHEMAS.OFFERS, JSON.stringify({ + filter: { + path: "data.listing.iv", + op: "eq", + value: listingDto.id + } +}))); + +// listingsDto.items.forEach(async (listing) => { +// let marketplaceId = listing.data?.marketplace.iv[0]!; +// const marketplaceDto = await core.getContentsByIds(SCHEMAS.MARKETPLACES, marketplaceId); +// const marketplace = marketplaceDto.items[0].data!; +// pushDisclaimer({ renderedText: renderMarkdown(marketplace.disclaimer[locale]), marketplaceEditToken: marketplaceDto.items[0].editToken! }); +// }); + +let productListingImages: string[] = []; +for (let listingDto of listingsDto.items) { + for (let assetId of listingDto.data?.marketplaceImages?.iv||[]) { + let assetDto = await getAssetById(assetId); + let assetUrl = path.posix.join('/img', assetDto.links['content'] + .href + .split('/') + .reverse() + .filter((_value, index, array) => index < (array.length - index - 2)) + .reverse() + .join('/')); + productListingImages.push(assetUrl); + } +} + +let i18n: { [key: string]: Multilingual } = { + 'Brand:': { + 'en-US': "Brand:", + 'es-US': "Marca :", + 'fr-CA': "Marque :", + }, + 'New from': { + 'en-US': "New from", + 'es-US': "Nuevo desde", + 'fr-CA': "Nouveau depuis", + }, + 'Used from': { + 'en-US': "Used from", + 'es-US': "Usado desde", + 'fr-CA': "Utilisé depuis", + }, + 'on': { + 'en-US': "on", + 'es-US': "en", + 'fr-CA': "sur", + }, + 'Price information updated as of': { + 'en-US': "Price information updated as of", + 'es-US': "Información de precio actualizada a partir de", + 'fr-CA': "Information sur le prix mise à jour jusqu\'à", + }, + 'Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon.com at the time of purchase will apply to the purchase of this product.': { + 'en-US': "Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon.com at the time of purchase will apply to the purchase of this product.", + 'es-US': "Precios de los productos y disponibilidad son exactos a la fecha/hora indicada y están sujetos a cambios. Cualquier información sobre precios y disponibilidad que se muestre en Amazon.com al momento del pago se aplicará a la compra de este producto.", + 'fr-CA': "Les prix des produits et la disponibilité sont exacts à la date/heure indiquée et peuvent varier. Toute information sur les prix et la disponibilité affichés sur Amazon.com au moment de l'achat s'appliqueront à l'achat de ce produit." + } +} + +--- +
    + +
    +
    +
    + { productListingImages.length == 1 && + {product.productName[locale]} + } + { productListingImages.length > 1 && + { return { src: productUrl }; } )||[]} /> + } +
    +
    +

    + {product?.productName[locale]} +

    +

    + + { brandDto && brandDto.items.length && + // + + } +

    + + { product?.description && + + } + + +
    +
    + + \ No newline at end of file diff --git a/src/components/ProductCard.astro b/src/components/ProductCard.astro index 3132a0d..a3e22b3 100644 --- a/src/components/ProductCard.astro +++ b/src/components/ProductCard.astro @@ -1,26 +1,76 @@ --- -import { type Product } from '../data/products/product'; +// import { type Product } from '../data/api-models'; +import type { ContentDto } from "../data/internals/ContentDtoT"; +import type { Product } from "../data/models/multis/Product"; import CarouselSwiper from './CarouselSwiper'; import StarRating from './StarRating.astro'; +import * as core from "../data/core/client"; +import { SCHEMAS } from "../data/models/schemas"; +import type { Listing } from "../data/models/multis/Listing"; +import type { Offer } from "../data/models/multis/Offer"; +import { renderMarkdown } from "../lib/rendering"; +import type { Marketplace } from "../data/models/multis/Marketplace"; +import { getAssetById } from "../data/api-client"; +import path from "node:path"; interface Props { - product?: Product, + productDto?: ContentDto, + locale: string, + editToken?: string, } -const { product } = Astro.props; +const { productDto, locale, editToken } = Astro.props; +const product = productDto?.data; + +const listingsDto = await core.getContentsUsingJsonQuery(SCHEMAS.LISTINGS, JSON.stringify({ + filter: { + path: "data.product.iv", + op: "eq", + value: productDto?.id + } +})); +const listingOffersDtos = listingsDto.items.map(async (listingDto) => await core.getContentsUsingJsonQuery(SCHEMAS.OFFERS, JSON.stringify({ + filter: { + path: "data.listing.iv", + op: "eq", + value: listingDto.id + } +}))); + +listingsDto.items.forEach(async (listing) => { + let marketplaceId = listing.data?.marketplace.iv[0]!; + const marketplaceDto = await core.getContentsByIds(SCHEMAS.MARKETPLACES, marketplaceId); + const marketplace = marketplaceDto.items[0].data!; + // disclaimers.pushDisclaimer({ renderedText: renderMarkdown(marketplace.disclaimer[locale]), marketplaceEditToken: marketplaceDto.items[0].editToken! }); +}); + +let productListingImages: string[] = []; +for (let listingDto of listingsDto.items) { + for (let assetId of listingDto.data?.marketplaceImages?.iv!||[]) { + let assetDto = await getAssetById(assetId); + let assetUrl = path.posix.join('/img', assetDto.links['content'] + .href + .split('/') + .reverse() + .filter((_value, index, array) => index < (array.length - index - 2)) + .reverse() + .join('/')); + productListingImages.push(assetUrl); + } +} --- -
    - +
    +

    - {product?.name} + {product?.productName[locale]}

    - {product?.amazonProductDetails?.imageUrls !== undefined && product?.amazonProductDetails.imageUrls.length == 1 && {product?.amazonProductDetails?.title}} - {product?.amazonProductDetails?.imageUrls !== undefined && product?.amazonProductDetails.imageUrls.length > 1 && { return { src: imageUrl }; })} /> } + {productListingImages.length === 1 && {product?.productName[locale]}} + {productListingImages.length > 1 && { return { src: imageUrl }; })} /> }
    - {product?.amazonProductDetails?.reviewCount} Reviews +
    - {product?.title||product?.amazonProductDetails?.title} + {product?.productName[locale]}
    @@ -38,6 +88,7 @@ const { product } = Astro.props; background-position: 100%; transition: background-position 0.6s cubic-bezier(0.22, 1, 0.36, 1); box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.1); + max-width: 29em; } .product-card > a { width: 100%; diff --git a/src/components/ProductCategory.astro b/src/components/ProductCategory.astro new file mode 100644 index 0000000..8089c27 --- /dev/null +++ b/src/components/ProductCategory.astro @@ -0,0 +1,91 @@ +--- +import type { ProductCategory } from "../data/models/multis/ProductCategory"; +import { getAssetById, getLocaleField } from "../data/api-client"; +import path from "node:path"; +import { renderMarkdown } from "../lib/rendering"; +import Callout from "./Callout.astro"; + +interface Props { + productCategory: ProductCategory, + editToken?: string, + locale: string, +} +const { productCategory, editToken, locale } = Astro.props; + +let productCategoryAsset = await getAssetById(productCategory.categoryImage[locale]); +let productCategoryImageBackgroundPosition = productCategoryAsset.metadata['background-position'] || 'center'; +let productCategoryImage = path.posix.join('/img', + productCategoryAsset.links['content'] + .href + .split('/') + .reverse() + .filter((_value, index, array) => index < (array.length - index - 2)) + .reverse() + .join('/')); +--- + +
    +
    +
    +
    + {getLocaleField(locale, productCategory.description) &&
    } +
    +
    +
    + + \ No newline at end of file diff --git a/src/components/ProductCategoryCard.astro b/src/components/ProductCategoryCard.astro new file mode 100644 index 0000000..30443a7 --- /dev/null +++ b/src/components/ProductCategoryCard.astro @@ -0,0 +1,107 @@ +--- +import type { ProductCategory } from "../data/models/multis/ProductCategory"; +import { getAssetById } from '../data/api-client'; +import path from 'node:path'; +import { renderMarkdown } from '../lib/rendering'; +// import { BlocksRenderer, type BlocksContent } from '@strapi/blocks-react-renderer'; + +interface Props { + editToken: string, + productCategory: ProductCategory + locale: string, +} + +const { editToken, productCategory, locale } = Astro.props; + +let productCategoryAsset = await getAssetById(productCategory.categoryImage[locale]); +let productCategoryImageBackgroundPosition = productCategoryAsset.metadata['background-position'] || 'center'; +let productCategoryImage = path.posix.join('/img', + productCategoryAsset.links['content'] + .href + //The purpose of .split('/').reverse().filter(...2...).reverse().join('/') is to + //extract the last two directories from the end of the path, which we will + //use to form the path to the ../pages/img/[...imageLookup].astro handler, e.g., + //in the form of `/img/${uuid}/${fileName}.${ext}`. + .split('/') + .reverse() + .filter((_value, index, array) => index < (array.length - index - 2)) + .reverse() + .join('/')); + +const renderContext = { ...Astro.props, productCategoryImage } +--- + +
  • + +
    +
    + +

    + {productCategory.categoryName[locale]}  +

    + +
    +
    +
  • + + + \ No newline at end of file diff --git a/src/components/Seller.astro b/src/components/Seller.astro new file mode 100644 index 0000000..be99594 --- /dev/null +++ b/src/components/Seller.astro @@ -0,0 +1,114 @@ +--- +import type { Seller } from "../data/models/multis/Seller"; +import { getAssetById, getLocaleField } from "../data/api-client"; +import path from "node:path"; +import { renderMarkdown } from "../lib/rendering"; + +interface Props { + seller: Seller, + editToken?: string, + locale: string, +} + +const { seller, editToken, locale } = Astro.props; + +let sellerLogoImageAsset = seller.logoImage[locale] ? await getAssetById(seller.logoImage[locale][0]) : undefined; +let sellerLogoImage = sellerLogoImageAsset ? path.posix.join('/img', + sellerLogoImageAsset.links['content'] + .href + .split('/') + .reverse() + .filter((_value, index, array) => index < (array.length - index - 2)) + .reverse() + .join('/')) : ''; +--- + +
    +
    + { sellerLogoImage ? + ( sellerLogoImage && + sellerLogoImageAsset?.metadata['background-color'] + ? + {seller.sellerName[locale]} + : + {seller.sellerName[locale]} + ) : seller.sellerName[locale] + } +
    +
    +
    +
    + {seller.sellerBio && seller.sellerBio[locale] &&
    } +
    +
    + + + + \ No newline at end of file diff --git a/src/components/SellerCard.astro b/src/components/SellerCard.astro new file mode 100644 index 0000000..f9a25d5 --- /dev/null +++ b/src/components/SellerCard.astro @@ -0,0 +1,87 @@ +--- +import path from "node:path"; +import type { Seller } from "../data/models/multis/Seller"; +import { getAssetById } from "../data/api-client"; + +interface Props { + editToken?: string, + seller: Seller, + locale: string, +} + +const { editToken, seller, locale } = Astro.props; + +let sellerLogoImageAsset = seller.logoImage[locale] ? await getAssetById(seller.logoImage[locale][0]) : undefined; +let sellerLogoImage = sellerLogoImageAsset ? path.posix.join('/img', + sellerLogoImageAsset.links['content'] + .href + .split('/') + .reverse() + .filter((_value, index, array) => index < (array.length - index - 2)) + .reverse() + .join('/')) : ''; +--- + +
  • + + { sellerLogoImage ? + (sellerLogoImageAsset?.metadata['background-color'] + ? + {seller.sellerName[locale]} + : + {seller.sellerName[locale]} + ) : + seller.sellerName[locale] + } + +
  • + diff --git a/src/components/carousel-swiper.css b/src/components/carousel-swiper.css index 1a6ab0c..f15d538 100644 --- a/src/components/carousel-swiper.css +++ b/src/components/carousel-swiper.css @@ -35,6 +35,14 @@ /* background-color: coral; */ } +.carousel-swiper .swiper-wrapper { + align-items: center !important; +} + +.carousel-swiper .swiper-slide { + align-self: center !important; +} + .carousel-swiper .swiper-wrapper::selection, .carousel-swiper .overlay::selection, .carousel-swiper .swiper-slide::selection, .carousel-swiper .carousel-img::selection { background-color: transparent; color: transparent; @@ -61,15 +69,15 @@ background-color: rgba(35, 38, 45, 0.8); /* filter: invert(1); */ mix-blend-mode: hard-light; - height: 1.1em; - width: 1.1em; + height: 0.7em; + width: 0.7em; + vertical-align: middle; } .carousel-swiper .swiper-pagination-bullet.swiper-pagination-bullet-active { background-color: rgba(225, 20, 4, 0.8); mix-blend-mode: hard-light; - padding: 0.9em; - margin-bottom: -0.3em; + padding: 0.75rem; } .carousel-swiper .swiper-button-next, .carousel-swiper .swiper-button-prev { diff --git a/src/components/meta-social/Facebook.astro b/src/components/meta-social/Facebook.astro new file mode 100644 index 0000000..890703d --- /dev/null +++ b/src/components/meta-social/Facebook.astro @@ -0,0 +1,3 @@ +--- + +--- \ No newline at end of file diff --git a/src/config.ts b/src/config.ts index 016a0ae..25231a6 100644 --- a/src/config.ts +++ b/src/config.ts @@ -11,27 +11,45 @@ const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); export interface ProcessEnv { - AMAZON_PA_ACCESS_KEY?: string; - AMAZON_PA_SECRET_KEY?: string; - AMAZON_PA_HOST?: string; - AMAZON_PA_REGION?: string; - AMAZON_PA_PARTNER_TYPE?: string; - AMAZON_PA_PARTNER_TAG?: string; - GOOGLE_ADSENSE_ADS_TXT?: string; - GOOGLE_ANALYTICS_GTAG?: string; + // AMAZON_PA_ACCESS_KEY?: string; + // AMAZON_PA_SECRET_KEY?: string; + // AMAZON_PA_HOST?: string; + // AMAZON_PA_REGION?: string; + // AMAZON_PA_PARTNER_TYPE?: string; + // AMAZON_PA_PARTNER_TAG?: string; + // GOOGLE_ADSENSE_ADS_TXT?: string; + // GOOGLE_ANALYTICS_GTAG?: string; SITE_URL?: string; + STRAPI_URL?: string; + STRAPI_API_TOKEN?: string; + PORT?: string; + WEBHOOK_PORT?: string; + SQUIDEX_APP_NAME?: string; + SQUIDEX_CLIENT_ID?: string; + SQUIDEX_CLIENT_SECRET?: string; + SQUIDEX_ENVIRONMENT?: string; + SQUIDEX_PUBLIC_URL?: string; } export interface Config { - AmazonProductAdvertisingAPIAccessKey: string; - AmazonProductAdvertisingAPISecretKey: string; - AmazonProductAdvertisingAPIHost: string; - AmazonProductAdvertisingAPIRegion: string; - AmazonProductAdvertisingAPIPartnerType: string; - AmazonProductAdvertisingAPIPartnerTag: string; - GoogleAdsenseAdsTxt: string; - GoogleAnalyticsGTag: string; + // AmazonProductAdvertisingAPIAccessKey: string; + // AmazonProductAdvertisingAPISecretKey: string; + // AmazonProductAdvertisingAPIHost: string; + // AmazonProductAdvertisingAPIRegion: string; + // AmazonProductAdvertisingAPIPartnerType: string; + // AmazonProductAdvertisingAPIPartnerTag: string; + // GoogleAdsenseAdsTxt: string; + // GoogleAnalyticsGTag: string; siteUrl: string; + strapiUrl: string; + strapiApiToken: string; + port: number; + webhookPort: number; + squidexAppName?: string; + squidexClientId?: string; + squidexClientSecret?: string; + squidexEnvironment?: string; + squidexPublicUrl?: string; } const env: ProcessEnv = {}; @@ -44,18 +62,42 @@ dotEnvConfig = dotenvExpand.expand({ processEnv: process.env as dotenvExpand.DotenvParseInput }); -export const getAmazonProductAdvertisingAPIAccessKey = () => (env.AMAZON_PA_ACCESS_KEY||``).trim(); -export const getAmazonProductAdvertisingAPISecretKey = () => (env.AMAZON_PA_SECRET_KEY||``).trim(); -export const getAmazonProductAdvertisingAPIHost = () => (env.AMAZON_PA_HOST||``).trim(); -export const getAmazonProductAdvertisingAPIRegion = () => (env.AMAZON_PA_REGION||``).trim(); -export const getAmazonProductAdvertisingAPIPartnerType = () => (env.AMAZON_PA_PARTNER_TYPE||`Associate`).trim(); -export const getAmazonProductAdvertisingAPIPartnerTag = () => (env.AMAZON_PA_PARTNER_TAG||``).trim(); -export const getGoogleAnalyticsGtag = () => (env.GOOGLE_ANALYTICS_GTAG||``).trim(); -export const getGoogleAdsenseAdsTxt = () => (env.GOOGLE_ADSENSE_ADS_TXT||``).trim()||`google.com, pub-1234567890abcdef, DIRECT, fedcba9876543210`; +// export const getAmazonProductAdvertisingAPIAccessKey = () => (env.AMAZON_PA_ACCESS_KEY||``).trim(); +// export const getAmazonProductAdvertisingAPISecretKey = () => (env.AMAZON_PA_SECRET_KEY||``).trim(); +// export const getAmazonProductAdvertisingAPIHost = () => (env.AMAZON_PA_HOST||``).trim(); +// export const getAmazonProductAdvertisingAPIRegion = () => (env.AMAZON_PA_REGION||``).trim(); +// export const getAmazonProductAdvertisingAPIPartnerType = () => (env.AMAZON_PA_PARTNER_TYPE||`Associate`).trim(); +// export const getAmazonProductAdvertisingAPIPartnerTag = () => (env.AMAZON_PA_PARTNER_TAG||``).trim(); +// export const getGoogleAnalyticsGtag = () => (env.GOOGLE_ANALYTICS_GTAG||``).trim(); +// export const getGoogleAdsenseAdsTxt = () => (env.GOOGLE_ADSENSE_ADS_TXT||``).trim()||`google.com, pub-1234567890abcdef, DIRECT, fedcba9876543210`; export const getSiteUrl = () => trimSlashes(env.SITE_URL||`http://localhost`); +export const getStrapiUrl = () => trimSlashes(env.STRAPI_URL||`http://localhost:1337`); +export const getStrapiApiToken = () => trimSlashes(env.STRAPI_API_TOKEN!); +export const getPort = () => env.PORT ? parseInt(env.PORT!) : 4321; +export const getWebhookPort = () => env.WEBHOOK_PORT ? parseInt(env.WEBHOOK_PORT!) : 3210; +export const getSquidexAppName = () => env.SQUIDEX_APP_NAME || undefined; +export const getSquidexClientId = () => env.SQUIDEX_CLIENT_ID || undefined; +export const getSquidexClientSecret = () => env.SQUIDEX_CLIENT_SECRET || undefined; +export const getSquidexEnvironment = () => env.SQUIDEX_ENVIRONMENT || undefined; +export const getSquidexPublicUrl = () => env.SQUIDEX_PUBLIC_URL || getSquidexEnvironment(); export const config: Config = { - GoogleAnalyticsGTag: getGoogleAnalyticsGtag(), - GoogleAdsenseAdsTxt: getGoogleAdsenseAdsTxt(), + // AmazonProductAdvertisingAPIAccessKey: getAmazonProductAdvertisingAPIAccessKey(), + // AmazonProductAdvertisingAPIHost: getAmazonProductAdvertisingAPIHost(), + // AmazonProductAdvertisingAPIPartnerTag: getAmazonProductAdvertisingAPIPartnerTag(), + // AmazonProductAdvertisingAPIPartnerType: getAmazonProductAdvertisingAPIPartnerType(), + // AmazonProductAdvertisingAPIRegion: getAmazonProductAdvertisingAPIRegion(), + // AmazonProductAdvertisingAPISecretKey: getAmazonProductAdvertisingAPISecretKey(), + // GoogleAnalyticsGTag: getGoogleAnalyticsGtag(), + // GoogleAdsenseAdsTxt: getGoogleAdsenseAdsTxt(), siteUrl: getSiteUrl(), + strapiApiToken: getStrapiApiToken(), + strapiUrl: getStrapiUrl(), + port: getPort(), + webhookPort: getWebhookPort(), + squidexAppName: getSquidexAppName(), + squidexClientId: getSquidexClientId(), + squidexClientSecret: getSquidexClientSecret(), + squidexEnvironment: getSquidexEnvironment(), + squidexPublicUrl: getSquidexPublicUrl(), }; diff --git a/src/data/api-client.ts b/src/data/api-client.ts new file mode 100644 index 0000000..3551435 --- /dev/null +++ b/src/data/api-client.ts @@ -0,0 +1,323 @@ +import * as core from "./core/client"; +import { SCHEMAS } from "./models/schemas"; +import { getContents } from "./core/client.js"; +import { SupportedLocales, type Multilingual } from "./internals/MultilingualT"; +import type { Component } from "./internals/Component"; +import type { Brand } from "./models/multis/Brand"; +import type { Page } from "./models/multis/Page"; +import type { Site } from "./models/singles/Site"; +import type { SiteConfig } from "./models/singles/SiteConfig"; +import type { Marketplace } from "./models/multis/Marketplace"; +import type { ProductCategory } from "./models/multis/ProductCategory"; +import type { Product } from "./models/multis/Product"; +import type { Slug } from "./models/multis/Slug"; +import type { Seller } from "./models/multis/Seller"; +import type { NonMultilingual } from "./internals/NonMultilingualT"; +import type { ContentsDto } from "./internals/ContentsDtoT"; +import type { ContentData } from "@squidex/squidex/api/types/ContentData"; +import type { ContentDto } from "./internals/ContentDtoT"; +import type { Listing } from "./models/multis/Listing.js"; +import type { Offer } from "./models/multis/Offer.js"; + +/** Generic helpers */ + +export const getLocaleField = function (locale: SupportedLocales|string, field: Multilingual) { + if (field && field[locale.toString()]) + return field[locale.toString()]; +} + +export function getPageComponentOfType(component: Component) { + return component as T; +} + +/** Assets handlers */ + +export const getAssetById = core.getAssetById; + +/** Brands handlers */ + +export const getBrandsByIds = async (ids: string) => + await core.getContentsByIds(SCHEMAS.BRANDS, ids); + +export const getBrandsByLangSlug = async (forLang: SupportedLocales|string, slug: string) => + await core.getContentsByLangSlug(SCHEMAS.BRANDS, forLang, slug); + +export const getBrandsUsingJsonQuery = async (jsonQuery: string|undefined = undefined) => + await core.getContentsUsingJsonQuery(SCHEMAS.BRANDS, jsonQuery); + +/** Marketplaces handlers */ + +export const getMarketplacesByIds = async (ids: string) => + await core.getContentsByIds(SCHEMAS.MARKETPLACES, ids); + +export const getMarketplacesByLangSlug = async (forLang: SupportedLocales|string, slug: string) => + await core.getContentsByLangSlug(SCHEMAS.MARKETPLACES, forLang, slug); + +export const getMarketplacesUsingJsonQuery = async (jsonQuery: string|undefined = undefined) => + await core.getContentsUsingJsonQuery(SCHEMAS.MARKETPLACES, jsonQuery); + +/** Marketplaces handlers */ + +export const getSellersByIds = async (ids: string) => + await core.getContentsByIds(SCHEMAS.SELLERS, ids); + +export const getSellersByLangSlug = async (forLang: SupportedLocales|string, slug: string) => + await core.getContentsByLangSlug(SCHEMAS.SELLERS, forLang, slug); + +export const getSellersUsingJsonQuery = async (jsonQuery: string|undefined = undefined) => + await core.getContentsUsingJsonQuery(SCHEMAS.SELLERS, jsonQuery); + +/** Pages handlers */ + +export const getPagesByIds = async (ids: string) => + await core.getContentsByIds(SCHEMAS.PAGES, ids); + +export const getPagesByLangSlug = async (forLang: SupportedLocales|string, slug: string) => + await core.getContentsByLangSlug(SCHEMAS.PAGES, forLang, slug); + +export const getPagesUsingJsonQuery = async (jsonQuery: string|undefined = undefined) => + await core.getContentsUsingJsonQuery(SCHEMAS.PAGES, jsonQuery); + +/** Product Categories handlers */ + +export const getProductCategoriesByIds = async (ids: string) => + await core.getContentsByIds(SCHEMAS.PRODUCT_CATEGORIES, ids); + +export const getProductCategoriesByLangSlug = async (forLang: SupportedLocales|string, slug: string) => + await core.getContentsByLangSlug(SCHEMAS.PRODUCT_CATEGORIES, forLang, slug); + +export const getProductCategoriesUsingJsonQuery = async (jsonQuery: string|undefined = undefined) => + await core.getContentsUsingJsonQuery(SCHEMAS.PRODUCT_CATEGORIES, jsonQuery); + +/** Products handlers */ + +export const getProductsByIds = async (ids: string) => + await core.getContentsByIds(SCHEMAS.PRODUCTS, ids); + +export const getProductsByLangSlug = async (forLang: SupportedLocales|string, slug: string) => + await core.getContentsByLangSlug(SCHEMAS.PRODUCTS, forLang, slug); + +export const getProductsUsingJsonQuery = async (jsonQuery: string|undefined = undefined) => + await core.getContentsUsingJsonQuery(SCHEMAS.PRODUCTS, jsonQuery); + +/** Product Listings handlers */ + +export const getProductListingsByIds = async (ids: string) => + await core.getContentsByIds(SCHEMAS.LISTINGS, ids); + +export const getProductListingsUsingJsonQuery = async (jsonQuery: string|undefined = undefined) => + await core.getContentsUsingJsonQuery(SCHEMAS.LISTINGS, jsonQuery); + +/** Offers handlers */ + +export const getOffersByListingId = async (listingId: string) => + await core.getContentsUsingJsonQuery(SCHEMAS.OFFERS, JSON.stringify({ + filter: { + path: "data.listing.iv", + op: "eq", + value: listingId + } + })); + +/** Slugs handlers */ + +export const getAllSlugs = async () => + await core.getContents(SCHEMAS.SLUGS); + +export const getSlugByLangSlug = async (forLang: SupportedLocales|string, slug: string) => + await core.getContentsUsingJsonQuery(SCHEMAS.SLUGS, JSON.stringify({ + filter: { + and: [ + { path: `data.locale.iv`, op: 'eq', value: forLang }, + { path: `data.localizedSlug.iv`, op: 'eq', value: slug } + ] + } + })); + +/** Site handlers */ + +export const getSite = async () => + await getContents(SCHEMAS.SITE); + +export const getSiteHomePage = async (site: Site) => { + if (site.homePage && site.homePage.iv.length > 0) { + let homePageIds: string[] = site!.homePage.iv; + let pageContents = getPagesByIds(homePageIds[0]); + return pageContents; + } + throw new Error('No site home page exists.'); +} + +export const getSiteConfig = async () => + await getContents(SCHEMAS.SITE_CONFIG); + +export async function performSyncLocalizedSlugs(logFn = console.log) { + logFn("[sync-slugs] Begin sync localized slugs.") + let allSlugs = await getAllSlugs(); + let allPages = await core.getContentsUsingJsonQuery(SCHEMAS.PAGES); + let allBrands = await core.getContentsUsingJsonQuery(SCHEMAS.BRANDS); + let allProducts = await core.getContentsUsingJsonQuery(SCHEMAS.PRODUCTS); + let allProductCategories = await core.getContentsUsingJsonQuery(SCHEMAS.PRODUCT_CATEGORIES); + let allSellers = await core.getContentsUsingJsonQuery(SCHEMAS.SELLERS); + let allMarketplaces = await core.getContentsUsingJsonQuery(SCHEMAS.MARKETPLACES); + const locales = Object.values(SupportedLocales); + const findSlugInMultilingual = function(slug: Slug, schema: SCHEMAS|string, contents: ContentsDto) { + for (let i = 0; i < contents.items.length; i++) { + let item = contents.items[i]; + for (let l = 0; l < locales.length; l++) { + let locale = locales[l]; + let testSlug = (item.data! as any).slug[locale] + if (testSlug) { + if (slug.locale.iv === locale + && slug.localizedSlug.iv === testSlug + && slug.referenceSchema.iv === schema + && slug.reference.iv.length === 1 + && slug.reference.iv[0] === item.id) { + return item; + } + } + } + } + } + const findSlugInSlugs = function(locale: SupportedLocales|string, slug: Multilingual, schema: SCHEMAS|string, referenceId: string) { + for (let i = 0; i < allSlugs.items.length; i++) { + let testSlug = allSlugs.items[i].data!; + if (testSlug.localizedSlug.iv === slug[locale] + && testSlug.locale.iv === locale + && testSlug.referenceSchema.iv === schema + && testSlug.reference.iv.length === 1 + && testSlug.reference.iv[0] === referenceId) { + return allSlugs.items[i]; + } + } + } + let batchAddSlugsQueue: Slug[] = []; + allPages.items.forEach((page) => { + for (let l = 0; l < locales.length; l++) { + let locale = locales[l]; + let foundSlugDto = findSlugInSlugs(locale, (page.data! as Page).slug, SCHEMAS.PAGES, page.id); + if (!foundSlugDto) { + //cache slug for page + batchAddSlugsQueue.push({ + locale: { iv: locale }, + localizedSlug: { iv: (page.data! as Page).slug[locale] }, + referenceSchema: { iv: SCHEMAS.PAGES }, + reference: { iv: [page.id] } + }); + } + } + }); + allBrands.items.forEach((brand) => { + for (let l = 0; l < locales.length; l++) { + let locale = locales[l]; + let foundSlugDto = findSlugInSlugs(locale, (brand.data! as Brand).slug, SCHEMAS.BRANDS, brand.id); + if (!foundSlugDto) { + //cache slug for brand + batchAddSlugsQueue.push({ + locale: { iv: locale }, + localizedSlug: { iv: (brand.data! as Brand).slug[locale] }, + referenceSchema: { iv: SCHEMAS.BRANDS }, + reference: { iv: [brand.id] } + }); + } + } + }); + allProducts.items.forEach((product) => { + for (let l = 0; l < locales.length; l++) { + let locale = locales[l]; + let foundSlugDto = findSlugInSlugs(locale, (product.data! as Product).slug, SCHEMAS.PRODUCTS, product.id); + if (!foundSlugDto) { + //cache slug for product + batchAddSlugsQueue.push({ + locale: { iv: locale }, + localizedSlug: { iv: (product.data! as Product).slug[locale] }, + referenceSchema: { iv: SCHEMAS.PRODUCTS }, + reference: { iv: [product.id] } + }); + } + } + }); + allProductCategories.items.forEach((productCategory) => { + for (let l = 0; l < locales.length; l++) { + let locale = locales[l]; + let foundSlugDto = findSlugInSlugs(locale, (productCategory.data! as ProductCategory).slug, SCHEMAS.PRODUCT_CATEGORIES, productCategory.id); + if (!foundSlugDto) { + //cache slug for product category + batchAddSlugsQueue.push({ + locale: { iv: locale }, + localizedSlug: { iv: (productCategory.data! as ProductCategory).slug[locale] }, + referenceSchema: { iv: SCHEMAS.PRODUCT_CATEGORIES }, + reference: { iv: [productCategory.id] } + }); + } + } + }); + allSellers.items.forEach((seller) => { + for (let l = 0; l < locales.length; l++) { + let locale = locales[l]; + let foundSlugDto = findSlugInSlugs(locale, (seller.data! as Seller).slug, SCHEMAS.SELLERS, seller.id); + if (!foundSlugDto) { + //cache slug for product category + batchAddSlugsQueue.push({ + locale: { iv: locale }, + localizedSlug: { iv: (seller.data! as Seller).slug[locale] }, + referenceSchema: { iv: SCHEMAS.SELLERS }, + reference: { iv: [seller.id] } + }); + } + } + }); + allMarketplaces.items.forEach((marketplace) => { + for (let l = 0; l < locales.length; l++) { + let locale = locales[l]; + let foundSlugDto = findSlugInSlugs(locale, (marketplace.data! as Marketplace).slug, SCHEMAS.MARKETPLACES, marketplace.id); + if (!foundSlugDto) { + //cache slug for product category + batchAddSlugsQueue.push({ + locale: { iv: locale }, + localizedSlug: { iv: (marketplace.data! as Marketplace).slug[locale] }, + referenceSchema: { iv: SCHEMAS.MARKETPLACES }, + reference: { iv: [marketplace.id] } + }); + } + } + }); + let batchRemoveSlugsQueue: string[] = []; + allSlugs.items.forEach((slugDto) => { + const doesSlugExistInPages = findSlugInMultilingual(slugDto.data! as Slug, SCHEMAS.PAGES, allPages); + const doesSlugExistInBrands = findSlugInMultilingual(slugDto.data! as Slug, SCHEMAS.BRANDS, allBrands); + const doesSlugExistInProducts = findSlugInMultilingual(slugDto.data! as Slug, SCHEMAS.PRODUCTS, allProducts); + const doesSlugExistInProductCategories = findSlugInMultilingual(slugDto.data! as Slug, SCHEMAS.PRODUCT_CATEGORIES, allProductCategories); + const doesSlugExistInSellers = findSlugInMultilingual(slugDto.data! as Slug, SCHEMAS.SELLERS, allSellers); + const doesSlugExistInMarketplaces = findSlugInMultilingual(slugDto.data! as Slug, SCHEMAS.MARKETPLACES, allMarketplaces); + const doesSlugExistElsewhere = doesSlugExistInPages||doesSlugExistInBrands||doesSlugExistInProducts||doesSlugExistInProductCategories||doesSlugExistInSellers||doesSlugExistInMarketplaces; + const shouldPruneOrphanSlug = !doesSlugExistElsewhere; + if (shouldPruneOrphanSlug) { + //prune orphan slugs from cache + batchRemoveSlugsQueue.push(slugDto.id); + } + }); + const MAX_TIME_TO_POST_SLUGS = 60;//s + logFn("[sync-slugs] Add", batchAddSlugsQueue.length, "slugs"); + let bulkAddResult = await core.client.contents.postContents(SCHEMAS.SLUGS, { datas: batchAddSlugsQueue as unknown as ContentData[], publish: true }, { timeoutInSeconds: MAX_TIME_TO_POST_SLUGS }); + logFn("[sync-slugs] Remove by id", batchRemoveSlugsQueue.length, "slugs"); + batchRemoveSlugsQueue.forEach(async (removeId) => { + await core.client.contents.deleteContent(SCHEMAS.SLUGS, removeId) + }) + logFn("[sync-slugs] Finish sync localized slugs.") +} + +export class AmazonPAApiSyncClient { + public async getSyncProducts () { + let amazonSlug = `${SupportedLocales["en-US"]}/amazon`; + let amazonMarketplaceId = (await core.getContentsByLangSlug(SCHEMAS.MARKETPLACES, SupportedLocales['en-US'], amazonSlug)).items[0].id; + let allProducts = await core.getContentsUsingJsonQuery(SCHEMAS.PRODUCTS); + return allProducts.items.filter((product) => product.data?.marketplaceConnections.iv[0].marketplace[0] === amazonMarketplaceId); + }; + public async getLastSync (productId: string) { + + } +} + + +// console.log(await (new AmazonPAApiSyncClient()).getSyncProducts()); \ No newline at end of file diff --git a/src/data/core/client.ts b/src/data/core/client.ts new file mode 100644 index 0000000..b56677a --- /dev/null +++ b/src/data/core/client.ts @@ -0,0 +1,41 @@ +import { config } from "../../config.js"; +import { SquidexClient } from "@squidex/squidex"; +import type { ContentsDto } from "../internals/ContentsDtoT.js"; +import type { SupportedLocales } from "../internals/MultilingualT.js"; +import type { SCHEMAS } from "../models/schemas.js"; + +export const client = new SquidexClient({ + appName: config.squidexAppName!, + clientId: config.squidexClientId!, + clientSecret: config.squidexClientSecret!, + environment: config.squidexEnvironment!, + tokenStore: new SquidexClient.InMemoryTokenStore(), + // tokenStore: new SquidexStorageTokenStore() // Keep the tokens in the local store. + // tokenStore: new SquidexStorageTokenStore(sessionStorage, "CustomKey") +}); + +export const TIMEOUT_IN_SECONDS = 10; + +/** Asset Handling */ + +export const getAssetById = async (assetId: string) => ( + await client.assets.getAsset(assetId, {timeoutInSeconds: TIMEOUT_IN_SECONDS}) +); + +/** Generic Content Handling */ + +export const getContents = async (schema: SCHEMAS|string) => ( + await client.contents.getContents(schema, { }, { timeoutInSeconds: TIMEOUT_IN_SECONDS }) +) as ContentsDto; + +export const getContentsByIds = async (schema: SCHEMAS|string, ids: string) => ( + await client.contents.getContents(schema, { ids }, { timeoutInSeconds: TIMEOUT_IN_SECONDS }) +) as ContentsDto; + +export const getContentsUsingJsonQuery = async (schema: SCHEMAS|string, jsonQuery: string|undefined = undefined) => ( + await client.contents.getContents(schema, { q: jsonQuery }, { timeoutInSeconds: TIMEOUT_IN_SECONDS }) +) as ContentsDto; + +export const getContentsByLangSlug = async (schema: SCHEMAS|string, forLang: SupportedLocales|string, slug: string) => ( + await getContentsUsingJsonQuery(schema, JSON.stringify({ filter: { path: `data.slug.${forLang}`, op: 'eq', value: slug }})) +); \ No newline at end of file diff --git a/src/data/disabled-rich-text.ts b/src/data/disabled-rich-text.ts new file mode 100644 index 0000000..005d70a --- /dev/null +++ b/src/data/disabled-rich-text.ts @@ -0,0 +1,43 @@ +//Changed my mind on using this RichText junk + +// export enum RichTextNodeType { +// doc = 'doc', +// text = 'text', +// link = 'link', +// } + +// export interface RichTextBase { +// type: RichTextNodeType, +// } + +// export class RichText implements RichTextBase { +// public type: RichTextNodeType; +// public text: string; +// public marks?: [] +// public constructor(text: string) { +// this.type = RichTextNodeType.text; +// this.text = text; +// } +// } + +// export class RichTextDoc implements RichTextBase { +// public type: RichTextNodeType; +// public content: RichTextBase[]; +// public constructor(content: RichTextBase[] = []) { +// this.type = RichTextNodeType.doc; +// this.content = content; +// } +// } + +// export class RichTextParagraph implements RichTextBase { +// public type: RichTextNodeType; +// public content: RichTextBase[]; +// public constructor(content: RichTextBase[] = []) { +// this.type = RichTextNodeType.doc; +// this.content = content; +// } +// } + +// export interface PageNotFoundError extends Error { +// results: any, +// } diff --git a/src/data/internals/Component.ts b/src/data/internals/Component.ts new file mode 100644 index 0000000..3ecd708 --- /dev/null +++ b/src/data/internals/Component.ts @@ -0,0 +1,4 @@ +export interface Component { + schemaId?: string, + schemaName?: string, +} \ No newline at end of file diff --git a/src/data/internals/ContentDtoT.ts b/src/data/internals/ContentDtoT.ts new file mode 100644 index 0000000..0814628 --- /dev/null +++ b/src/data/internals/ContentDtoT.ts @@ -0,0 +1,5 @@ +import { Squidex } from "@squidex/squidex"; + +export interface ContentDto extends Squidex.ContentDto { + data?: T; +} \ No newline at end of file diff --git a/src/data/internals/ContentsDtoT.ts b/src/data/internals/ContentsDtoT.ts new file mode 100644 index 0000000..25cd9ca --- /dev/null +++ b/src/data/internals/ContentsDtoT.ts @@ -0,0 +1,7 @@ +import type { ContentDto } from "./ContentDtoT"; +import { Squidex } from "@squidex/squidex"; + +export interface ContentsDto extends Squidex.ContentsDto { + /** The generic content items. */ + items: ContentDto[]; +} \ No newline at end of file diff --git a/src/data/internals/MultilingualT.ts b/src/data/internals/MultilingualT.ts new file mode 100644 index 0000000..f6fa7b2 --- /dev/null +++ b/src/data/internals/MultilingualT.ts @@ -0,0 +1,12 @@ +export enum SupportedLocales { + 'en-US' = 'en-US', + 'es-US' = 'es-US', + 'fr-CA' = 'fr-CA', +}; + +export interface Multilingual { + [key: string]: T, + 'en-US': T, + 'es-US': T, + 'fr-CA': T, +}; \ No newline at end of file diff --git a/src/data/internals/NonMultilingualT.ts b/src/data/internals/NonMultilingualT.ts new file mode 100644 index 0000000..1105571 --- /dev/null +++ b/src/data/internals/NonMultilingualT.ts @@ -0,0 +1,4 @@ +export interface NonMultilingual { + [key: string]: T, + iv: T, +} diff --git a/src/data/models/components/AmazonMarketplaceConnection.ts b/src/data/models/components/AmazonMarketplaceConnection.ts new file mode 100644 index 0000000..b8c3c3a --- /dev/null +++ b/src/data/models/components/AmazonMarketplaceConnection.ts @@ -0,0 +1,7 @@ +import type { NonMultilingual } from "../../internals/NonMultilingualT"; +import type { MarketplaceConnection } from "./MarketplaceConnection"; + +export interface AmazonMarketplaceConnection extends MarketplaceConnection { + asin: string, + siteStripeUrl: string, +} \ No newline at end of file diff --git a/src/data/models/components/AmazonPAConfig.ts b/src/data/models/components/AmazonPAConfig.ts new file mode 100644 index 0000000..160dbec --- /dev/null +++ b/src/data/models/components/AmazonPAConfig.ts @@ -0,0 +1,13 @@ +import type { Component } from "../../internals/Component"; + +export interface AmazonPAConfig extends Component { + schemaId: string, + accessKey: string, + secretKey: string, + partnerType: string, + partnerTag: string, + marketplace: string, + service: string, + host: string, + region: string, +}; \ No newline at end of file diff --git a/src/data/models/components/AmazonPAGetItemsRequest.ts b/src/data/models/components/AmazonPAGetItemsRequest.ts new file mode 100644 index 0000000..71d2255 --- /dev/null +++ b/src/data/models/components/AmazonPAGetItemsRequest.ts @@ -0,0 +1,5 @@ +import type { Component } from "../../internals/Component"; + +export interface AmazonPAGetItemsRequest extends Component { + ItemIds: { ItemId: string }[], +} \ No newline at end of file diff --git a/src/data/models/components/GoogleAdSense.ts b/src/data/models/components/GoogleAdSense.ts new file mode 100644 index 0000000..c535351 --- /dev/null +++ b/src/data/models/components/GoogleAdSense.ts @@ -0,0 +1,5 @@ +import type { Component } from "../../internals/Component"; + +export interface GoogleAdSense extends Component { + adsTxt: string, +}; \ No newline at end of file diff --git a/src/data/models/components/GoogleAnalytics.ts b/src/data/models/components/GoogleAnalytics.ts new file mode 100644 index 0000000..f77b75e --- /dev/null +++ b/src/data/models/components/GoogleAnalytics.ts @@ -0,0 +1,5 @@ +import type { Component } from "../../internals/Component"; + +export interface GoogleAnalytics extends Component { + gTag: string, +}; \ No newline at end of file diff --git a/src/data/models/components/MarketplaceConnection.ts b/src/data/models/components/MarketplaceConnection.ts new file mode 100644 index 0000000..54bc044 --- /dev/null +++ b/src/data/models/components/MarketplaceConnection.ts @@ -0,0 +1,3 @@ +import type { Component } from "../../internals/Component"; + +export interface MarketplaceConnection extends Component {} diff --git a/src/data/models/components/PageBrand.ts b/src/data/models/components/PageBrand.ts new file mode 100644 index 0000000..e53d027 --- /dev/null +++ b/src/data/models/components/PageBrand.ts @@ -0,0 +1,5 @@ +import type { Component } from "../../internals/Component"; + +export interface PageBrand extends Component { + brand: string[], +} \ No newline at end of file diff --git a/src/data/models/components/PageCallout.ts b/src/data/models/components/PageCallout.ts new file mode 100644 index 0000000..d6ea6d9 --- /dev/null +++ b/src/data/models/components/PageCallout.ts @@ -0,0 +1,6 @@ +import type { Component } from "../../internals/Component"; +import type { Multilingual } from "../../internals/MultilingualT"; + +export interface PageCallout extends Component { + text: string, +} \ No newline at end of file diff --git a/src/data/models/components/PageContent.ts b/src/data/models/components/PageContent.ts new file mode 100644 index 0000000..402e34a --- /dev/null +++ b/src/data/models/components/PageContent.ts @@ -0,0 +1,5 @@ +import type { Component } from "../../internals/Component"; + +export interface PageContent extends Component { + content: string, +} \ No newline at end of file diff --git a/src/data/models/components/PageMarketplace.ts b/src/data/models/components/PageMarketplace.ts new file mode 100644 index 0000000..03c9094 --- /dev/null +++ b/src/data/models/components/PageMarketplace.ts @@ -0,0 +1,5 @@ +import type { Component } from "../../internals/Component"; + +export interface PageMarketplace extends Component { + marketplace: string[], +} \ No newline at end of file diff --git a/src/data/models/components/PageProduct.ts b/src/data/models/components/PageProduct.ts new file mode 100644 index 0000000..9a0462c --- /dev/null +++ b/src/data/models/components/PageProduct.ts @@ -0,0 +1,5 @@ +import type { Component } from "../../internals/Component"; + +export interface PageProduct extends Component { + product: string[], +} \ No newline at end of file diff --git a/src/data/models/components/PageProductCategory.ts b/src/data/models/components/PageProductCategory.ts new file mode 100644 index 0000000..319d898 --- /dev/null +++ b/src/data/models/components/PageProductCategory.ts @@ -0,0 +1,5 @@ +import type { Component } from "../../internals/Component"; + +export interface PageProductCategory extends Component { + productCategory: string[], +} \ No newline at end of file diff --git a/src/data/models/components/PageSeller.ts b/src/data/models/components/PageSeller.ts new file mode 100644 index 0000000..f28c2aa --- /dev/null +++ b/src/data/models/components/PageSeller.ts @@ -0,0 +1,5 @@ +import type { Component } from "../../internals/Component"; + +export interface PageSeller extends Component { + seller: string[], +} \ No newline at end of file diff --git a/src/data/models/components/PageSeo.ts b/src/data/models/components/PageSeo.ts new file mode 100644 index 0000000..1d86c63 --- /dev/null +++ b/src/data/models/components/PageSeo.ts @@ -0,0 +1,9 @@ +import type { Component } from "../../internals/Component"; + +export interface PageSeo extends Component { + metaTitle: string, + metaDescription: string, + metaImage: string, + keywords: string, + metaSocial: [], +} \ No newline at end of file diff --git a/src/data/models/components/ProductMarketplaceConnection.ts b/src/data/models/components/ProductMarketplaceConnection.ts new file mode 100644 index 0000000..828dc80 --- /dev/null +++ b/src/data/models/components/ProductMarketplaceConnection.ts @@ -0,0 +1,8 @@ +import type { Component } from "../../internals/Component"; +import type { NonMultilingual } from "../../internals/NonMultilingualT"; +import type { MarketplaceConnection } from "./MarketplaceConnection"; + +export interface ProductMarketplaceConnection extends Component { + marketplace: string[], + connection: MarketplaceConnection, +} \ No newline at end of file diff --git a/src/data/models/components/QueryComponent.ts b/src/data/models/components/QueryComponent.ts new file mode 100644 index 0000000..fa04fcd --- /dev/null +++ b/src/data/models/components/QueryComponent.ts @@ -0,0 +1,5 @@ +import type { Component } from "../../internals/Component"; + +export interface QueryComponent extends Component { + jsonQuery?: any, +} \ No newline at end of file diff --git a/src/data/models/multis/AmazonGetItem.ts b/src/data/models/multis/AmazonGetItem.ts new file mode 100644 index 0000000..119aa6b --- /dev/null +++ b/src/data/models/multis/AmazonGetItem.ts @@ -0,0 +1,9 @@ +import type { AmazonPAGetItemsRequest } from "../components/AmazonPAGetItemsRequest"; +import type { GetItemsResponse } from "amazon-pa-api5-node-ts"; +import type { NonMultilingual } from "../../internals/NonMultilingualT"; + +export interface AmazonGetItem { + requestDate: NonMultilingual, + getItemsRequest: NonMultilingual, + apiResponse: NonMultilingual, +} \ No newline at end of file diff --git a/src/data/models/multis/Brand.ts b/src/data/models/multis/Brand.ts new file mode 100644 index 0000000..c02bd5d --- /dev/null +++ b/src/data/models/multis/Brand.ts @@ -0,0 +1,11 @@ +import type { Multilingual } from "../../internals/MultilingualT"; +import type { NonMultilingual } from "../../internals/NonMultilingualT"; + +export interface Brand { + brandName: Multilingual, + logoImage?: Multilingual, + slug: Multilingual, + shortDescription?: Multilingual, + longDescription?: Multilingual, + brandPage?: NonMultilingual, +} \ No newline at end of file diff --git a/src/data/models/multis/Listing.ts b/src/data/models/multis/Listing.ts new file mode 100644 index 0000000..2a111dd --- /dev/null +++ b/src/data/models/multis/Listing.ts @@ -0,0 +1,9 @@ +import type { Multilingual } from "../../internals/MultilingualT"; +import type { NonMultilingual } from "../../internals/NonMultilingualT"; + +export interface Listing { + product: NonMultilingual, + marketplace: NonMultilingual, + marketplaceDescription: Multilingual, + marketplaceImages: NonMultilingual, +} \ No newline at end of file diff --git a/src/data/models/multis/Marketplace.ts b/src/data/models/multis/Marketplace.ts new file mode 100644 index 0000000..7ff3b8b --- /dev/null +++ b/src/data/models/multis/Marketplace.ts @@ -0,0 +1,12 @@ +import type { Multilingual } from "../../internals/MultilingualT"; +import type { NonMultilingual } from "../../internals/NonMultilingualT"; + +export interface Marketplace { + marketplaceName: Multilingual, + slug: Multilingual, + logoImage: Multilingual, + marketplacePage: NonMultilingual, + disclaimer: Multilingual, + shortDescription: Multilingual, + longDescription: Multilingual, +} \ No newline at end of file diff --git a/src/data/models/multis/Offer.ts b/src/data/models/multis/Offer.ts new file mode 100644 index 0000000..8970a72 --- /dev/null +++ b/src/data/models/multis/Offer.ts @@ -0,0 +1,9 @@ +import type { NonMultilingual } from "../../internals/NonMultilingualT"; + +export interface Offer { + offerDate: NonMultilingual, + seller: NonMultilingual, + listing: NonMultilingual, + newPrice: NonMultilingual, + usedPrice: NonMultilingual, +} diff --git a/src/data/models/multis/Page.ts b/src/data/models/multis/Page.ts new file mode 100644 index 0000000..c655b63 --- /dev/null +++ b/src/data/models/multis/Page.ts @@ -0,0 +1,12 @@ +import type { PageSeo } from "../components/PageSeo"; +import type { Multilingual } from "../../internals/MultilingualT"; +import type { NonMultilingual } from "../../internals/NonMultilingualT"; +import type { Component } from "../../internals/Component"; + +export interface Page { + title: Multilingual, + slug: Multilingual, + content: Multilingual, + seo: Multilingual, + parentPage: NonMultilingual, +} \ No newline at end of file diff --git a/src/data/models/multis/Product.ts b/src/data/models/multis/Product.ts new file mode 100644 index 0000000..69145cb --- /dev/null +++ b/src/data/models/multis/Product.ts @@ -0,0 +1,14 @@ +import type { Multilingual } from "../../internals/MultilingualT"; +import type { NonMultilingual } from "../../internals/NonMultilingualT"; +import type { ProductMarketplaceConnection } from "../components/ProductMarketplaceConnection"; + +export interface Product { + productName: Multilingual, + slug: Multilingual, + brand: NonMultilingual, + categories: NonMultilingual, + tags: Multilingual, + description: Multilingual, + marketplaceConnections: NonMultilingual, + productPage?: NonMultilingual, +} \ No newline at end of file diff --git a/src/data/models/multis/ProductCategory.ts b/src/data/models/multis/ProductCategory.ts new file mode 100644 index 0000000..b2f38e4 --- /dev/null +++ b/src/data/models/multis/ProductCategory.ts @@ -0,0 +1,10 @@ +import type { Multilingual } from "../../internals/MultilingualT"; +import type { NonMultilingual } from "../../internals/NonMultilingualT"; + +export interface ProductCategory { + categoryName: Multilingual, + slug: Multilingual, + categoryImage: Multilingual, + description: Multilingual, + parentCategory: NonMultilingual, +} \ No newline at end of file diff --git a/src/data/models/multis/Seller.ts b/src/data/models/multis/Seller.ts new file mode 100644 index 0000000..f4d1105 --- /dev/null +++ b/src/data/models/multis/Seller.ts @@ -0,0 +1,8 @@ +import type { Multilingual } from "../../internals/MultilingualT"; + +export interface Seller { + sellerName: Multilingual, + sellerBio: Multilingual, + slug: Multilingual, + logoImage: Multilingual, +} \ No newline at end of file diff --git a/src/data/models/multis/Slug.ts b/src/data/models/multis/Slug.ts new file mode 100644 index 0000000..e66a009 --- /dev/null +++ b/src/data/models/multis/Slug.ts @@ -0,0 +1,10 @@ +import type { SCHEMAS } from "../schemas"; +import type { SupportedLocales } from "../../internals/MultilingualT"; +import type { NonMultilingual } from "../../internals/NonMultilingualT"; + +export interface Slug { + locale: NonMultilingual, + localizedSlug: NonMultilingual, + referenceSchema: NonMultilingual, + reference: NonMultilingual, +} \ No newline at end of file diff --git a/src/data/models/schemas.ts b/src/data/models/schemas.ts new file mode 100644 index 0000000..e41411f --- /dev/null +++ b/src/data/models/schemas.ts @@ -0,0 +1,15 @@ +export const enum SCHEMAS { + AMAZON_GET_ITEMS = 'amazon-get-items', + BRANDS = 'brands', + PAGES = 'pages', + LISTINGS = 'listings', + MARKETPLACES = 'marketplaces', + OFFERS = 'offers', + PRODUCT_CATEGORIES = 'product-categories', + PRODUCTS = 'products', + SOCIAL_NETWORKS = 'social-networks', + SELLERS = 'sellers', + SITE = 'site', + SITE_CONFIG = 'site-config', + SLUGS = 'slugs', +}; \ No newline at end of file diff --git a/src/data/models/singles/Site.ts b/src/data/models/singles/Site.ts new file mode 100644 index 0000000..8588f46 --- /dev/null +++ b/src/data/models/singles/Site.ts @@ -0,0 +1,11 @@ +import type { Multilingual } from "../../internals/MultilingualT"; +import type { NonMultilingual } from "../../internals/NonMultilingualT"; + +export interface Site { + siteName: Multilingual, + siteUrl: Multilingual, + homePage: NonMultilingual, + siteBrand: Multilingual, + copyright: Multilingual, + footerLinks: Multilingual, +} \ No newline at end of file diff --git a/src/data/models/singles/SiteConfig.ts b/src/data/models/singles/SiteConfig.ts new file mode 100644 index 0000000..b219533 --- /dev/null +++ b/src/data/models/singles/SiteConfig.ts @@ -0,0 +1,10 @@ +import type { NonMultilingual } from "../../internals/NonMultilingualT"; +import type { AmazonPAConfig } from "../components/AmazonPAConfig"; +import type { GoogleAdSense } from "../components/GoogleAdSense"; +import type { GoogleAnalytics } from "../components/GoogleAnalytics"; + +export interface SiteConfig { + amazonPAAPIConfig: NonMultilingual, + googleAdSense: NonMultilingual, + googleAnalytics: NonMultilingual, +} \ No newline at end of file diff --git a/src/env.d.ts b/src/env.d.ts index f964fe0..32e4e18 100644 --- a/src/env.d.ts +++ b/src/env.d.ts @@ -1 +1,14 @@ +/// /// +interface ImportMetaEnv { + readonly SITE_URL?: string; + readonly STRAPI_URL?: string; + readonly STRAPI_API_TOKEN?: string; + readonly PORT?: number; + readonly WEBHOOK_PORT?: number; + readonly SQUIDEX_APP_NAME?: string; + readonly SQUIDEX_CLIENT_ID?: string; + readonly SQUIDEX_CLIENT_SECRET?: string; + readonly SQUIDEX_ENVIRONMENT?: string; + readonly SQUIDEX_PUBLIC_URL?: string; +} \ No newline at end of file diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro index 5262d85..898102f 100644 --- a/src/layouts/Layout.astro +++ b/src/layouts/Layout.astro @@ -2,25 +2,65 @@ import "bootstrap/dist/css/bootstrap.min.css"; import bootstrap from "bootstrap/dist/js/bootstrap.min.js?url"; import { config } from "../config"; +import { getLocaleField } from "../data/api-client"; +import type { Page } from "../data/models/multis/Page"; +import type { Site } from "../data/models/singles/Site"; +import type { SiteConfig } from "../data/models/singles/SiteConfig"; +import { interpolateString, renderMarkdown } from '../lib/rendering'; interface Props { + locale: string; + page: Page; title: string; + site: Site; + siteEditToken: string; + shouldEmbedSquidexSDK: boolean; + siteConfig: SiteConfig, } -const { title } = Astro.props; -const gTag = config.GoogleAnalyticsGTag; +const { locale, page, site, siteConfig, siteEditToken, title, shouldEmbedSquidexSDK } = Astro.props; + +const lang = locale.substring(0, locale.indexOf('-')); +const renderContext = { ...Astro.props, lang, shouldEmbedSquidexSDK }; + +//template adjustment for site to work with layers of squidEx +const cssFixSquidex = ` + +`.replace(/\s*/g, ''); --- - + - - + {title ? `${title} - ${getLocaleField(locale, site.siteName)!}` : `${site.siteName}`} + - - {title} + @@ -31,7 +71,7 @@ const gTag = config.GoogleAnalyticsGTag; - + + )} + .callout p { + display: inline; + margin-bottom: 0rem; + } + .squidex-overlay-border { + transition: 700ms; + /*background: rgba(0, 119, 255, 0.25) !important;*/ + background: linear-gradient(rgba(0, 119, 255, 0.4), rgba(0, 119, 255, 0.1)) !important; + padding: 1em !important; + border: 0.5em solid rgba(0, 119, 255, 0.75) !important; + border-radius: 8px !important; + } + .squidex-overlay-toolbar { + border-radius: 8px !important; + } + .squidex-overlay-border:hover { + border-radius: 8rem; + } + .squidex-overlay-schema { + background: linear-gradient(rgba(var(--accent-dark), 90%), rgba(var(--accent-dark), 33%)) !important; + border-top-left-radius: 5px !important; + border-bottom-left-radius: 5px !important; + border-bottom: 5px; + padding: 5rem; + height: unset !important; + } + .squidex-overlay-links { + background: linear-gradient(rgba(35, 38, 45, 90%), rgba(35, 38, 45, 33%)) !important; + background-color: unset !important; + border-top-right-radius: 5px !important; + height: unset !important; + border-bottom-right-radius: 5px !important; + } + .squidex-overlay, .squidex-overlay-schema, .squidex-overlay-links { + font-family: "Urbanist", system-ui, sans-serif !important; + font-size: 18pt !important; + } + .squidex-overlay-schema, .squidex-overlay-border:hover { + /*background: linear-gradient(rgba(var(--accent-dark), 66%), rgba(var(--accent-dark), 33%)) !important;*/ + } + .squidex-iframe, .squidex-iframe iframe { + border-radius: 0.5em !important; + } + \ No newline at end of file diff --git a/src/lib/accept-language-parser.ts b/src/lib/accept-language-parser.ts new file mode 100644 index 0000000..ea6344c --- /dev/null +++ b/src/lib/accept-language-parser.ts @@ -0,0 +1,80 @@ +/** + * Forked from https://github.com/opentable/accept-language-parser. + */ + +const regex = /((([a-zA-Z]+(-[a-zA-Z0-9]+){0,2})|\*)(;q=[0-1](\.[0-9]+)?)?)*/g; + +const isString = (s: any) => typeof(s) === 'string'; + +export interface ParsedAcceptLanguage { + code: string, + script: any, + region: string, + quality: number, +} + +export interface ParsedAcceptLanguageOptions { + loose?: boolean, +} + +export const parse = (al: string) => { + let strings = (al || "").match(regex); + return strings!.map((m) => { + if(!m){ + return; + } + + let bits = m.split(';'); + let ietf = bits[0].split('-'); + let hasScript = ietf.length === 3; + + return { + code: ietf[0], + script: hasScript ? ietf[1] : null, + region: hasScript ? ietf[2] : ietf[1], + quality: bits[1] ? parseFloat(bits[1].split('=')[1]) : 1.0 + } as ParsedAcceptLanguage; + }) + .filter((r) => r) + .sort((a, b) => b!.quality - a!.quality); +} + +export const pick = (supportedLanguageOrLanguages: string|string[], acceptLanguage: string, options?: ParsedAcceptLanguageOptions) => { + options = options || { loose: false }; + + if (!supportedLanguageOrLanguages || !supportedLanguageOrLanguages.length || !acceptLanguage) { + return null; + } + + let parsedLanguage = parse(acceptLanguage); + let supportedLanguages = isString(supportedLanguageOrLanguages) ? [supportedLanguageOrLanguages] : supportedLanguageOrLanguages; + let supported = supportedLanguages.map((support) => { + let bits = support.split('-'); + let hasScript = bits.length === 3; + + return { + code: bits[0], + script: hasScript ? bits[1] : null, + region: hasScript ? bits[2] : bits[1] + }; + }); + + for (let i = 0; i < parsedLanguage.length; i++) { + const lang = parsedLanguage[i]!; + const langCode = lang.code.toLowerCase(); + const langRegion = lang.region ? lang.region.toLowerCase() : lang.region; + const langScript = lang.script ? lang.script.toLowerCase() : lang.script; + for (let j = 0; j < supported.length; j++) { + const supportedCode = supported[j].code.toLowerCase(); + const supportedScript = supported[j].script ? supported[j].script!.toLowerCase() : supported[j].script; + const supportedRegion = supported[j].region ? supported[j].region!.toLowerCase() : supported[j].region; + if (langCode === supportedCode && + (options.loose || !langScript || langScript === supportedScript) && + (options.loose || !langRegion || langRegion === supportedRegion)) { + return supportedLanguages[j]; + } + } + } + + return null; +} diff --git a/src/lib/disclaimer.ts b/src/lib/disclaimer.ts new file mode 100644 index 0000000..c9a0e72 --- /dev/null +++ b/src/lib/disclaimer.ts @@ -0,0 +1,24 @@ +// export interface DisclaimerDefinition { +// renderedText: string, +// marketplaceEditToken: string, +// }; + +// export class Disclaimers { +// private disclaimers: DisclaimerDefinition[] = []; + +// public pushDisclaimer(disclaimerDefinition: DisclaimerDefinition) { +// // if (0 !== this.disclaimers.filter((searchDisclaimers) => { +// // if (searchDisclaimers.marketplaceEditToken === disclaimerDefinition.marketplaceEditToken) { +// // return true; +// // } +// // }).length) { +// this.disclaimers.push(disclaimerDefinition); +// // } +// } + +// public getDisclaimers() { +// return this.disclaimers; +// } +// } + +// export type PushDisclaimerCallback = (disclaimerDefinition: DisclaimerDefinition) => void; \ No newline at end of file diff --git a/src/lib/locales.ts b/src/lib/locales.ts new file mode 100644 index 0000000..e6b65d9 --- /dev/null +++ b/src/lib/locales.ts @@ -0,0 +1,16 @@ +export const localeUrlTestPatterns = ['en-US', 'es-US', 'fr-CA']; +export const localeFromLang = (lang: string) => { + switch (lang) { + default: return 'en-US'; + case 'es': return 'es-US'; + case 'fr': return 'fr-CA'; + } +}; +export const overrideLocaleFromUrl = (url: string = '', orLang: string) => { + for (let t = 0; t < localeUrlTestPatterns.length; t++) { + if (url === localeUrlTestPatterns[t] || url.startsWith(`${localeUrlTestPatterns[t]}/`)) { + return localeUrlTestPatterns[t]; + } + } + return orLang; +}; \ No newline at end of file diff --git a/src/lib/page-from-models.ts b/src/lib/page-from-models.ts new file mode 100644 index 0000000..ad969b8 --- /dev/null +++ b/src/lib/page-from-models.ts @@ -0,0 +1,411 @@ +import type { Brand } from '../data/models/multis/Brand'; +import type { Page } from '../data/models/multis/Page'; +import type { ProductCategory } from '../data/models/multis/ProductCategory'; +import type { Marketplace } from '../data/models/multis/Marketplace'; +import type { Seller } from '../data/models/multis/Seller'; +import type { Product } from '../data/models/multis/Product'; +import type { QueryComponent } from '../data/models/components/QueryComponent'; + +export interface PageForBrandParams { + brand: Brand, + brandId: string, + homePageId: string, +}; + +export interface PageForProductCategoryParams { + productCategory: ProductCategory, + productCategoryId: string, + homePageId: string, +}; + +export interface PageForMarketplaceParams { + marketplace: Marketplace, + marketplaceId: string, + homePageId: string, +}; + +export interface PageForSellerParams { + seller: Seller, + sellerId: string, + homePageId: string, +}; + +export interface PageForProductParams { + product: Product, + productId: string, + homePageId: string, +}; + +/** + * genericPageForBrand() will generate a default Page object given + * a Brand interface. + */ +export const genericPageForBrand = ({ brand, brandId, homePageId }: PageForBrandParams ): Page => { + let componentsPerLanguage = [ + { + schemaId: '', + schemaName: 'page-breadcrumbs', + }, + { + schemaId: '', + schemaName: 'page-brand', + brand: [brandId], + }, + { + schemaId: '', + schemaName: 'page-products-query', + jsonQuery: { + filter: { + path: 'data.brand.iv', + op: 'eq', + value: brandId + } + }, + } as QueryComponent, + ]; + return { + title: brand.brandName, + slug: brand.slug, + content: { + "en-US": componentsPerLanguage, + "es-US": componentsPerLanguage, + "fr-CA": componentsPerLanguage, + }, + seo: { + "en-US": { + schemaId: '', + schemaName: '', + keywords: brand.brandName['en-US'], + metaDescription: brand.shortDescription['en-US'], + metaImage: '', + metaSocial: [], + metaTitle: brand.brandName['en-US'], + }, + "es-US": { + schemaId: '', + schemaName: '', + keywords: brand.brandName['es-US'], + metaDescription: brand.shortDescription['es-US'], + metaImage: '', + metaSocial: [], + metaTitle: brand.brandName['es-US'], + }, + "fr-CA": { + schemaId: '', + schemaName: '', + keywords: brand.brandName['fr-CA'], + metaDescription: brand.shortDescription['fr-CA'], + metaImage: '', + metaSocial: [], + metaTitle: brand.brandName['fr-CA'], + }, + }, + parentPage: { iv: [homePageId] }, + } +}; + +/** + * genericPageForProductCategory() will generate a default Page object given + * a ProductCategory interface. + */ +export const genericPageForProductCategory = ({ productCategory, productCategoryId, homePageId }: PageForProductCategoryParams ): Page => { + let componentsPerLanguage = [ + { + schemaId: '', + schemaName: 'page-breadcrumbs', + }, + { + schemaId: '', + schemaName: 'page-product-category', + productCategory: [productCategory], + }, + { + schemaId: '', + schemaName: 'page-product-categories-query', + jsonQuery: { + filter: { + path: "data.parentCategory.iv", + op: "eq", + value: productCategoryId, + } + }, + } as QueryComponent, + { + schemaId: '', + schemaName: 'page-products-query', + jsonQuery: { + filter: { + path: "data.categories.iv", + op: "eq", + value: productCategoryId, + } + }, + } as QueryComponent, + ]; + return { + title: productCategory.categoryName, + slug: productCategory.slug, + content: { + "en-US": componentsPerLanguage, + "es-US": componentsPerLanguage, + "fr-CA": componentsPerLanguage, + }, + seo: { + "en-US": { + schemaId: '', + schemaName: '', + keywords: '', + metaDescription: productCategory.description['en-US'], + metaImage: '', + metaSocial: [], + metaTitle: productCategory.categoryName['en-US'], + }, + "es-US": { + schemaId: '', + schemaName: '', + keywords: '', + metaDescription: productCategory.description['es-US'], + metaImage: '', + metaSocial: [], + metaTitle: productCategory.categoryName['es-US'], + }, + "fr-CA": { + schemaId: '', + schemaName: '', + keywords: '', + metaDescription: productCategory.description['fr-CA'], + metaImage: '', + metaSocial: [], + metaTitle: productCategory.categoryName['fr-CA'], + }, + }, + parentPage: { iv: [homePageId] }, + } +}; + +/** + * genericPageForMarketplace() will generate a default Page object given + * a Marketplace interface. + */ +export const genericPageForMarketplace = ({ marketplace, marketplaceId, homePageId }: PageForMarketplaceParams ): Page => { + let componentsPerLanguage = [ + { + schemaId: '', + schemaName: 'page-breadcrumbs', + }, + { + schemaId: '', + schemaName: 'page-marketplace', + productCategory: [marketplace], + }, + { + schemaId: '', + schemaName: 'page-sellers-query', + // jsonQuery: JSON.stringify({ + // filter: { + // path: "data.parentCategory.iv", + // op: "eq", + // value: productCategoryId, + // } + // }), + } as QueryComponent, + { + schemaId: '', + schemaName: 'page-products-query', + // jsonQuery: JSON.stringify({ + // filter: { + // path: "data.parentCategory.iv", + // op: "eq", + // value: productCategoryId, + // } + // }), + } as QueryComponent, + ]; + return { + title: marketplace.marketplaceName, + slug: marketplace.slug, + content: { + "en-US": componentsPerLanguage, + "es-US": componentsPerLanguage, + "fr-CA": componentsPerLanguage, + }, + seo: { + "en-US": { + schemaId: '', + schemaName: '', + keywords: '', + metaDescription: marketplace.shortDescription['en-US'], + metaImage: '', + metaSocial: [], + metaTitle: marketplace.marketplaceName['en-US'], + }, + "es-US": { + schemaId: '', + schemaName: '', + keywords: '', + metaDescription: marketplace.shortDescription['es-US'], + metaImage: '', + metaSocial: [], + metaTitle: marketplace.marketplaceName['es-US'], + }, + "fr-CA": { + schemaId: '', + schemaName: '', + keywords: '', + metaDescription: marketplace.shortDescription['fr-CA'], + metaImage: '', + metaSocial: [], + metaTitle: marketplace.marketplaceName['fr-CA'], + }, + }, + parentPage: { iv: [homePageId] }, + } +}; + +/* + * genericPageForSeller() will generate a default Page object given + * a Seller interface. + */ +export const genericPageForSeller = ({ seller, sellerId, homePageId }: PageForSellerParams ): Page => { + let componentsPerLanguage = [ + { + schemaId: '', + schemaName: 'page-breadcrumbs', + }, + { + schemaId: '', + schemaName: 'page-seller', + productCategory: [seller], + }, + { + schemaId: '', + schemaName: 'page-marketplaces-query', + // jsonQuery: JSON.stringify({ + // filter: { + // path: "data.parentCategory.iv", + // op: "eq", + // value: productCategoryId, + // } + // }), + } as QueryComponent, + { + schemaId: '', + schemaName: 'page-products-query', + // jsonQuery: JSON.stringify({ + // filter: { + // path: "data.parentCategory.iv", + // op: "eq", + // value: productCategoryId, + // } + // }), + } as QueryComponent, + ]; + return { + title: seller.sellerName, + slug: seller.slug, + content: { + "en-US": componentsPerLanguage, + "es-US": componentsPerLanguage, + "fr-CA": componentsPerLanguage, + }, + seo: { + "en-US": { + schemaId: '', + schemaName: '', + keywords: '', + metaDescription: seller.sellerBio['en-US'], + metaImage: '', + metaSocial: [], + metaTitle: seller.sellerName['en-US'], + }, + "es-US": { + schemaId: '', + schemaName: '', + keywords: '', + metaDescription: seller.sellerBio['es-US'], + metaImage: '', + metaSocial: [], + metaTitle: seller.sellerName['es-US'], + }, + "fr-CA": { + schemaId: '', + schemaName: '', + keywords: '', + metaDescription: seller.sellerBio['fr-CA'], + metaImage: '', + metaSocial: [], + metaTitle: seller.sellerName['fr-CA'], + }, + }, + parentPage: { iv: [homePageId] }, + } +}; + +/* + * genericPageForSeller() will generate a default Page object given + * a Seller interface. + */ +export const genericPageForProduct = ({ product, productId, homePageId }: PageForProductParams ): Page => { + let componentsPerLanguage = [ + { + schemaId: '', + schemaName: 'page-breadcrumbs', + }, + { + schemaId: '', + schemaName: 'page-product', + productCategory: [product], + }, + { + schemaId: '', + schemaName: 'page-marketplaces-query', + // jsonQuery: JSON.stringify({ + // filter: { + // path: "data.parentCategory.iv", + // op: "eq", + // value: productCategoryId, + // } + // }), + } as QueryComponent + ]; + return { + title: product.productName, + slug: product.slug, + content: { + "en-US": componentsPerLanguage, + "es-US": componentsPerLanguage, + "fr-CA": componentsPerLanguage, + }, + seo: { + "en-US": { + schemaId: '', + schemaName: '', + keywords: '', + metaDescription: product.description['en-US'], + metaImage: '', + metaSocial: [], + metaTitle: product.productName['en-US'], + }, + "es-US": { + schemaId: '', + schemaName: '', + keywords: '', + metaDescription: product.description['es-US'], + metaImage: '', + metaSocial: [], + metaTitle: product.productName['es-US'], + }, + "fr-CA": { + schemaId: '', + schemaName: '', + keywords: '', + metaDescription: product.description['fr-CA'], + metaImage: '', + metaSocial: [], + metaTitle: product.productName['fr-CA'], + }, + }, + parentPage: { iv: [homePageId] }, + } +}; + diff --git a/src/lib/rendering.ts b/src/lib/rendering.ts new file mode 100644 index 0000000..804253d --- /dev/null +++ b/src/lib/rendering.ts @@ -0,0 +1,75 @@ +import markdownIt from "markdown-it"; +import markdownItAttrs from "markdown-it-attrs"; +import vm from 'node:vm'; + +export const md = markdownIt().use(markdownItAttrs, { +}); + +function escapeRegExp(re: string) { + return re.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +function makeInterpolationRegex(delimStart: string = '${', delimEnd: string = '}') { + delimStart = escapeRegExp(delimStart); + delimEnd = escapeRegExp(delimEnd); + return new RegExp(['(', delimStart, '[^', delimEnd, ']+', delimEnd, ')'].join(''), 'm') +} + +function makeInterpolationEvalRegex(delimStart: string = '${', delimEnd: string = '}') { + delimStart = escapeRegExp(delimStart); + delimEnd = escapeRegExp(delimEnd); + return new RegExp([delimStart, '([^', delimEnd, ']+)', delimEnd].join(''), 'g') +} + +export const interpolateString = (template: string, templateContext?: any) => { + const interpolationRegex = makeInterpolationRegex(); ///(\${[^}]+})/g; + // const interpolationEvalRegex = /\${([^}]+)}/g; + const interpolationEvalRegex = makeInterpolationEvalRegex(); + const vmContext = vm.createContext(templateContext); + let matches = template.match(interpolationRegex); + while (matches && matches.length > 0) { + const jsCode = matches[0].replace(interpolationEvalRegex, '$1'); + const interpolatedOutput = vm.runInContext(jsCode, vmContext, { timeout: 100, breakOnSigint: true, displayErrors: true }); + //interpolate and iterate + template = template.replace(interpolationRegex, interpolatedOutput); + matches = template.match(interpolationRegex); + } + return template; +} + +export const renderHtml = (template: string, templateContext?: any) => { + const interpolationRegex = /(\${[^}]+})/g; + const interpolationEvalRegex = /\${([^}]+)}/g; + const vmContext = vm.createContext(templateContext); + let matches = template.match(interpolationRegex); + while (matches && matches.length > 0) { + const jsCode = matches[0].replace(interpolationEvalRegex, '$1'); + const interpolatedOutput = vm.runInContext(jsCode, vmContext, { timeout: 100, breakOnSigint: true, displayErrors: true }); + //interpolate and iterate + template = template.replace(interpolationRegex, interpolatedOutput); + matches = template.match(interpolationRegex); + } + return template; +} + +const renderCodeblock = (lang: string, template: string, templateContext?: any) => { + const startDelim = '```' + lang + '\n'; + const endDelim = '\n```'; + const interpolationRegex = makeInterpolationRegex(startDelim, endDelim); + const interpolationDeepMdRegex = makeInterpolationEvalRegex(startDelim, endDelim); + let matches = template.match(interpolationRegex); + while (matches && matches.length > 0) { + const cbCode = matches[0].replace(interpolationDeepMdRegex, '$1'); + template = template.replace(interpolationRegex, cbCode); + template = interpolateString(template, templateContext); + matches = template.match(interpolationRegex) + } + return template; +} + +export const renderMarkdown = (template: string, templateContext?: any) => { + // render code blocks inside of the Markdown + template = renderCodeblock('markdown', template, templateContext); + template = md.render(interpolateString(template, templateContext)); + return template; +} \ No newline at end of file diff --git a/src/lib/strapi.ts b/src/lib/strapi.ts new file mode 100644 index 0000000..9db3f59 --- /dev/null +++ b/src/lib/strapi.ts @@ -0,0 +1,88 @@ +import { config } from "../config"; +import * as http from 'node:http'; +import { createWriteStream, existsSync, mkdirSync, unlinkSync } from 'node:fs'; +import fs, { mkdir } from 'node:fs/promises'; +import path from 'node:path'; +import {fileURLToPath} from 'url'; +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +interface Props { + endpoint: string; + query?: Record; + wrappedByKey?: string; + wrappedByList?: boolean; +} + +/** + * Fetches data from the Strapi API + * @param endpoint - The endpoint to fetch from + * @param query - The query parameters to add to the url + * @param wrappedByKey - The key to unwrap the response from + * @param wrappedByList - If the response is a list, unwrap it + * @returns + */ +export async function fetchApi({ + endpoint, + query, + wrappedByKey, + wrappedByList, + }: Props): Promise { + if (endpoint.startsWith('/')) { + endpoint = endpoint.slice(1); + } + + const url = new URL(`${import.meta.env.STRAPI_URL}/api/${endpoint}`); + + if (query) { + Object.entries(query).forEach(([key, value]) => { + url.searchParams.append(key, value); + }); + } + const res = await fetch(url.toString(), { + headers: { + "Authorization": `bearer ${config.strapiApiToken}`, + }, + }); + let data = await res.json(); + + if (wrappedByKey) { + data = data[wrappedByKey]; + } + + if (wrappedByList) { + data = data[0]; + } + + return data as T; +} + +export function downloadMedia(subdir: string, filename: string, url: string) { + // console.log('downloadMedia hit with', subdir, filename, url); + const imageUrl = `${config.strapiUrl}${url}`; + const subdirPath = path.join(__dirname, '..', '..', 'public', 'media', subdir); + if (!existsSync(subdirPath)) { + mkdirSync(subdirPath, { recursive: true }); + } + const imagePath = path.join(subdirPath, filename); + const imageFile = createWriteStream(imagePath); + http.get( + // { + // headers: { + // "Authorization": `bearer ${config.strapiApiToken}`, + // }, + // href: imageUrl, + // }, + imageUrl, + response => { + response.pipe(imageFile); + imageFile.on('finish', () => { + imageFile.close(); + //console.log(`Image downloaded as ${imagePath}`); + }); + }).on('error', err => { + imageFile.close(); + unlinkSync(imagePath); + console.error(`Error downloading image: ${err.message}`); + }); +} diff --git a/src/old-data/api-models.ts b/src/old-data/api-models.ts new file mode 100644 index 0000000..38e1912 --- /dev/null +++ b/src/old-data/api-models.ts @@ -0,0 +1,144 @@ +import { type BlocksContent } from '@strapi/blocks-react-renderer'; + +export interface MetaPagination { + page?: number; + pageSize?: number; + pageCount?: number; + total?: number; +} + +export interface Meta extends MetaPagination { +} + +export interface Response { + data: T; + meta: Meta; +} + +export interface Single { + id: number; + attributes: T; +} + +export interface HasId { + id: number; +} + +// export enum RichTextBlockType { +// 'paragraph', +// 'list', +// 'text', +// } + +// export enum RichTextBlockFormat { +// 'unordered', +// 'ordered', +// } + +// export interface RichTextBlock { +// type: RichTextBlockType; +// format?: RichTextBlockFormat; +// text: string; +// } + +// export interface RichTextBlocks { +// type: RichTextBlockType; +// children: RichTextBlock[]; +// } + +export type RichTextBlocks = BlocksContent; + +export interface CreatedModified { + createdAt: Date; + updatedAt: Date; +} + +export interface Site extends CreatedModified { + siteName: string; + siteUrl: string; + metaDescription: string; + categoriesCallout: RichTextBlocks; + brandsCallout: RichTextBlocks; + marketplaceCallout: RichTextBlocks; +} + +export interface AmazonPAAPIConfig extends CreatedModified { + accessKey: string; + secretKey: string; + partnerType: string; + partnerTag: string; + marketplace: string; + service: string; + host: string; + region: string; +} + +export interface GoogleAdsense extends CreatedModified { + adsTxt: string; +} + +export interface GoogleAnalytics extends CreatedModified { + gTag: string; +} + +export interface Media extends CreatedModified { + name: string; + alternativeText: string; + caption: string; + width: number; + height: number; + format: null|any; + hash: string; + ext: string; + mime: string; + size: number; + url: string; + previewUrl: string|null; + provider: string; + provider_metadata: null|any; +} + +export interface Marketplace extends CreatedModified { + name: string; + slug: string; + shortDescription: RichTextBlocks; + description: RichTextBlocks; + disclaimer: RichTextBlocks; + logoImage: Response>; + // products: Response[]>; +} + +export interface Brand extends CreatedModified { + name: string; + slug: string; + shortDescription: RichTextBlocks; + description: RichTextBlocks; + logoImage: Response>; + products: Response[]>; +} + +export interface Category extends CreatedModified { + name: string; + slug: string; + categoryImage: Response>; + description: RichTextBlocks; + products: Response[]>; + parentCategories: Response[]>; + childCategories: Response[]>; +} + +export interface Tag extends CreatedModified { + slug: string; +} + +export interface Product extends CreatedModified { + name: string; + title: string; + slug: string; + brand: Response>; + callout: RichTextBlocks; + description: RichTextBlocks; + categories: Response[]>; + tags: Response[]>; + components: any[]; +} diff --git a/src/data/brands/bell-ap.ts b/src/old-data/brands/bell-ap.ts similarity index 99% rename from src/data/brands/bell-ap.ts rename to src/old-data/brands/bell-ap.ts index 0450979..42d6a9a 100644 --- a/src/data/brands/bell-ap.ts +++ b/src/old-data/brands/bell-ap.ts @@ -33,7 +33,7 @@ deer-related collisions. Continue to drive safely and rest assured more deer wil Don't let deer-related accidents hold you back from delivering safely and efficiently. Get the Bell Automotive-22-1-01000-8 Black Deer Warning Unit today and enjoy peace of mind behind the wheel! `.trim(), - amazonProductId: 'B000CC4O58', + ASIN: 'B000CC4O58', amazonLink: 'https://www.amazon.com/Bell-Automotive-22-1-01000-8-Black-Warning/dp/B000CC4O58?crid=38OWGTE3CGGTR&dib=eyJ2IjoiMSJ9.2hsaXGo5j3z_PO0DdSqY2dh0ERcaf1BLgOVM5jRO6_8YsWEDMVv1R9XYUsALRJPK7hWsylfyJucQttI1MRPR7YrBuBhDAJVzXue3BLjSRwHS3tzLix_0BMleTroTTDMtOyzuGpJGlkfq4ayiBl1HtOKN1HmSfUWnseEzDdmdYfiPGena7b4L1qIAz5AnMd0zdy0-YuddgQiHjM3Ha57GzK0w-HSTpHUeAIDrFQFEhcbCBnTRYPtrDEqvFlVd2E2-rmbQgqrb9YDaZo-zTNBGuHt2liqz_4hN6fwXQ9-BfPM.Atf0vKmCupgwmiW_lZj49dmQMkvMPIjQsfx3PqYlqIc&dib_tag=se&keywords=deer+alert&qid=1721016740&sprefix=deer+aler%2Caps%2C92&sr=8-17&linkCode=ll1&tag=dashersupply-20&linkId=623763eba9c22a3e4d3618007f6b13ae&language=en_US&ref_=as_li_ss_tl', amazonProductDetails: { "title": "Bell Automotive-22-1-01000-8 Bell Deer Warning Unit, Black, PR", @@ -108,7 +108,7 @@ deer-related collisions. Continue to drive safely and rest assured more deer wil Don't let deer-related accidents hold you back from delivering safely and efficiently. Get the Bell Automotive-22-1-01001-8 Chrome Deer Warning Unit today and enjoy peace of mind behind the wheel! `.trim(), - amazonProductId: 'B000IG5PVU', + ASIN: 'B000IG5PVU', amazonLink: 'https://www.amazon.com/Bell-Automotive-22-1-01001-8-Chrome-Warning/dp/B000IG5PVU?crid=292GBL5WF6BRS&dib=eyJ2IjoiMSJ9.bJ1O7X9g1iSFNRAATSwis8O-HyUVPobiDj9SFPCzloSL6FVx3V5odzkPH8plk5R-Y9JoWUFRYq8qwR-QjxRb6-9pCZYAnCaKv1I_GY6CMUP5F07CSo-gqPd2yMfr1YjiFHMB_CHwA7vs_eUSFT9jkEenaQtEp1_3yDHrjxTpSWUMiJGZwfzksmhStFE82p031qxt2LQxT9YpabM7XMguPc2ZFv4-PIrU55VbXxzqgf9CyVj3S_QSujOZmGuqBqgQQhVXzfL0TwQocB1xsTMVmiFepdozsBMuUFleATwNsyM.CCOSpzyeJTssD33Vns57cdSlHsXfWXPe2k1_lKfGT1M&dib_tag=se&keywords=bell+automotive+deer+alert&qid=1721018357&sprefix=bell+automotive+deer+alert%2Caps%2C69&sr=8-3&linkCode=ll1&tag=dashersupply-20&linkId=a26ad59d6d5109c7d46d43d8b1af4cad&language=en_US&ref_=as_li_ss_tl', amazonProductDetails: { "title": "Bell Automotive 22-1-01001-8 Chrome Deer Warning", diff --git a/src/data/brands/brand.ts b/src/old-data/brands/brand.ts similarity index 100% rename from src/data/brands/brand.ts rename to src/old-data/brands/brand.ts diff --git a/src/data/brands/coast-example-query-and-response.txt b/src/old-data/brands/coast-example-query-and-response.ts similarity index 96% rename from src/data/brands/coast-example-query-and-response.txt rename to src/old-data/brands/coast-example-query-and-response.ts index 1dad960..1aecb89 100644 --- a/src/data/brands/coast-example-query-and-response.txt +++ b/src/old-data/brands/coast-example-query-and-response.ts @@ -1,8 +1,10 @@ +import type { SearchItemsResponse } from "amazon-pa-api5-node-ts"; + /* ********** Signed Request ********** */ -https://webservices.amazon.com/!YW16LTEuMDtjb20uYW1hem9uLnBhYXBpNS52MS5Qcm9kdWN0QWR2ZXJ0aXNpbmdBUEl2MS5TZWFyY2hJdGVtczt7CiAgICAiS2V5d29yZHMiOiAiZmxhc2hsaWdodCIsCiAgICAiUmVzb3VyY2VzIjogWwogICAgICAgICJCcm93c2VOb2RlSW5mby5Ccm93c2VOb2RlcyIsCiAgICAgICAgIkJyb3dzZU5vZGVJbmZvLkJyb3dzZU5vZGVzLkFuY2VzdG9yIiwKICAgICAgICAiQnJvd3NlTm9kZUluZm8uQnJvd3NlTm9kZXMuU2FsZXNSYW5rIiwKICAgICAgICAiQnJvd3NlTm9kZUluZm8uV2Vic2l0ZVNhbGVzUmFuayIsCiAgICAgICAgIkN1c3RvbWVyUmV2aWV3cy5Db3VudCIsCiAgICAgICAgIkN1c3RvbWVyUmV2aWV3cy5TdGFyUmF0aW5nIiwKICAgICAgICAiSW1hZ2VzLlByaW1hcnkuU21hbGwiLAogICAgICAgICJJbWFnZXMuUHJpbWFyeS5NZWRpdW0iLAogICAgICAgICJJbWFnZXMuUHJpbWFyeS5MYXJnZSIsCiAgICAgICAgIkltYWdlcy5QcmltYXJ5LkhpZ2hSZXMiLAogICAgICAgICJJbWFnZXMuVmFyaWFudHMuU21hbGwiLAogICAgICAgICJJbWFnZXMuVmFyaWFudHMuTWVkaXVtIiwKICAgICAgICAiSW1hZ2VzLlZhcmlhbnRzLkxhcmdlIiwKICAgICAgICAiSW1hZ2VzLlZhcmlhbnRzLkhpZ2hSZXMiLAogICAgICAgICJJdGVtSW5mby5CeUxpbmVJbmZvIiwKICAgICAgICAiSXRlbUluZm8uQ29udGVudEluZm8iLAogICAgICAgICJJdGVtSW5mby5Db250ZW50UmF0aW5nIiwKICAgICAgICAiSXRlbUluZm8uQ2xhc3NpZmljYXRpb25zIiwKICAgICAgICAiSXRlbUluZm8uRXh0ZXJuYWxJZHMiLAogICAgICAgICJJdGVtSW5mby5GZWF0dXJlcyIsCiAgICAgICAgIkl0ZW1JbmZvLk1hbnVmYWN0dXJlSW5mbyIsCiAgICAgICAgIkl0ZW1JbmZvLlByb2R1Y3RJbmZvIiwKICAgICAgICAiSXRlbUluZm8uVGVjaG5pY2FsSW5mbyIsCiAgICAgICAgIkl0ZW1JbmZvLlRpdGxlIiwKICAgICAgICAiSXRlbUluZm8uVHJhZGVJbkluZm8iLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuQXZhaWxhYmlsaXR5Lk1heE9yZGVyUXVhbnRpdHkiLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuQXZhaWxhYmlsaXR5Lk1lc3NhZ2UiLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuQXZhaWxhYmlsaXR5Lk1pbk9yZGVyUXVhbnRpdHkiLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuQXZhaWxhYmlsaXR5LlR5cGUiLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuQ29uZGl0aW9uIiwKICAgICAgICAiT2ZmZXJzLkxpc3RpbmdzLkNvbmRpdGlvbi5Db25kaXRpb25Ob3RlIiwKICAgICAgICAiT2ZmZXJzLkxpc3RpbmdzLkNvbmRpdGlvbi5TdWJDb25kaXRpb24iLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuRGVsaXZlcnlJbmZvLklzQW1hem9uRnVsZmlsbGVkIiwKICAgICAgICAiT2ZmZXJzLkxpc3RpbmdzLkRlbGl2ZXJ5SW5mby5Jc0ZyZWVTaGlwcGluZ0VsaWdpYmxlIiwKICAgICAgICAiT2ZmZXJzLkxpc3RpbmdzLkRlbGl2ZXJ5SW5mby5Jc1ByaW1lRWxpZ2libGUiLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuRGVsaXZlcnlJbmZvLlNoaXBwaW5nQ2hhcmdlcyIsCiAgICAgICAgIk9mZmVycy5MaXN0aW5ncy5Jc0J1eUJveFdpbm5lciIsCiAgICAgICAgIk9mZmVycy5MaXN0aW5ncy5Mb3lhbHR5UG9pbnRzLlBvaW50cyIsCiAgICAgICAgIk9mZmVycy5MaXN0aW5ncy5NZXJjaGFudEluZm8iLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuUHJpY2UiLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuUHJvZ3JhbUVsaWdpYmlsaXR5LklzUHJpbWVFeGNsdXNpdmUiLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuUHJvZ3JhbUVsaWdpYmlsaXR5LklzUHJpbWVQYW50cnkiLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuUHJvbW90aW9ucyIsCiAgICAgICAgIk9mZmVycy5MaXN0aW5ncy5TYXZpbmdCYXNpcyIsCiAgICAgICAgIk9mZmVycy5TdW1tYXJpZXMuSGlnaGVzdFByaWNlIiwKICAgICAgICAiT2ZmZXJzLlN1bW1hcmllcy5Mb3dlc3RQcmljZSIsCiAgICAgICAgIk9mZmVycy5TdW1tYXJpZXMuT2ZmZXJDb3VudCIsCiAgICAgICAgIlBhcmVudEFTSU4iLAogICAgICAgICJSZW50YWxPZmZlcnMuTGlzdGluZ3MuQXZhaWxhYmlsaXR5Lk1heE9yZGVyUXVhbnRpdHkiLAogICAgICAgICJSZW50YWxPZmZlcnMuTGlzdGluZ3MuQXZhaWxhYmlsaXR5Lk1lc3NhZ2UiLAogICAgICAgICJSZW50YWxPZmZlcnMuTGlzdGluZ3MuQXZhaWxhYmlsaXR5Lk1pbk9yZGVyUXVhbnRpdHkiLAogICAgICAgICJSZW50YWxPZmZlcnMuTGlzdGluZ3MuQXZhaWxhYmlsaXR5LlR5cGUiLAogICAgICAgICJSZW50YWxPZmZlcnMuTGlzdGluZ3MuQmFzZVByaWNlIiwKICAgICAgICAiUmVudGFsT2ZmZXJzLkxpc3RpbmdzLkNvbmRpdGlvbiIsCiAgICAgICAgIlJlbnRhbE9mZmVycy5MaXN0aW5ncy5Db25kaXRpb24uQ29uZGl0aW9uTm90ZSIsCiAgICAgICAgIlJlbnRhbE9mZmVycy5MaXN0aW5ncy5Db25kaXRpb24uU3ViQ29uZGl0aW9uIiwKICAgICAgICAiUmVudGFsT2ZmZXJzLkxpc3RpbmdzLkRlbGl2ZXJ5SW5mby5Jc0FtYXpvbkZ1bGZpbGxlZCIsCiAgICAgICAgIlJlbnRhbE9mZmVycy5MaXN0aW5ncy5EZWxpdmVyeUluZm8uSXNGcmVlU2hpcHBpbmdFbGlnaWJsZSIsCiAgICAgICAgIlJlbnRhbE9mZmVycy5MaXN0aW5ncy5EZWxpdmVyeUluZm8uSXNQcmltZUVsaWdpYmxlIiwKICAgICAgICAiUmVudGFsT2ZmZXJzLkxpc3RpbmdzLkRlbGl2ZXJ5SW5mby5TaGlwcGluZ0NoYXJnZXMiLAogICAgICAgICJSZW50YWxPZmZlcnMuTGlzdGluZ3MuTWVyY2hhbnRJbmZvIiwKICAgICAgICAiU2VhcmNoUmVmaW5lbWVudHMiCiAgICBdLAogICAgIkJyYW5kIjogIkNPQVNUIiwKICAgICJQYXJ0bmVyVGFnIjogImRhc2hlcnN1cHBseS0yMCIsCiAgICAiUGFydG5lclR5cGUiOiAiQXNzb2NpYXRlcyIsCiAgICAiTWFya2V0cGxhY2UiOiAid3d3LmFtYXpvbi5jb20iCn0= +export const signedRequest = `https://webservices.amazon.com/!YW16LTEuMDtjb20uYW1hem9uLnBhYXBpNS52MS5Qcm9kdWN0QWR2ZXJ0aXNpbmdBUEl2MS5TZWFyY2hJdGVtczt7CiAgICAiS2V5d29yZHMiOiAiZmxhc2hsaWdodCIsCiAgICAiUmVzb3VyY2VzIjogWwogICAgICAgICJCcm93c2VOb2RlSW5mby5Ccm93c2VOb2RlcyIsCiAgICAgICAgIkJyb3dzZU5vZGVJbmZvLkJyb3dzZU5vZGVzLkFuY2VzdG9yIiwKICAgICAgICAiQnJvd3NlTm9kZUluZm8uQnJvd3NlTm9kZXMuU2FsZXNSYW5rIiwKICAgICAgICAiQnJvd3NlTm9kZUluZm8uV2Vic2l0ZVNhbGVzUmFuayIsCiAgICAgICAgIkN1c3RvbWVyUmV2aWV3cy5Db3VudCIsCiAgICAgICAgIkN1c3RvbWVyUmV2aWV3cy5TdGFyUmF0aW5nIiwKICAgICAgICAiSW1hZ2VzLlByaW1hcnkuU21hbGwiLAogICAgICAgICJJbWFnZXMuUHJpbWFyeS5NZWRpdW0iLAogICAgICAgICJJbWFnZXMuUHJpbWFyeS5MYXJnZSIsCiAgICAgICAgIkltYWdlcy5QcmltYXJ5LkhpZ2hSZXMiLAogICAgICAgICJJbWFnZXMuVmFyaWFudHMuU21hbGwiLAogICAgICAgICJJbWFnZXMuVmFyaWFudHMuTWVkaXVtIiwKICAgICAgICAiSW1hZ2VzLlZhcmlhbnRzLkxhcmdlIiwKICAgICAgICAiSW1hZ2VzLlZhcmlhbnRzLkhpZ2hSZXMiLAogICAgICAgICJJdGVtSW5mby5CeUxpbmVJbmZvIiwKICAgICAgICAiSXRlbUluZm8uQ29udGVudEluZm8iLAogICAgICAgICJJdGVtSW5mby5Db250ZW50UmF0aW5nIiwKICAgICAgICAiSXRlbUluZm8uQ2xhc3NpZmljYXRpb25zIiwKICAgICAgICAiSXRlbUluZm8uRXh0ZXJuYWxJZHMiLAogICAgICAgICJJdGVtSW5mby5GZWF0dXJlcyIsCiAgICAgICAgIkl0ZW1JbmZvLk1hbnVmYWN0dXJlSW5mbyIsCiAgICAgICAgIkl0ZW1JbmZvLlByb2R1Y3RJbmZvIiwKICAgICAgICAiSXRlbUluZm8uVGVjaG5pY2FsSW5mbyIsCiAgICAgICAgIkl0ZW1JbmZvLlRpdGxlIiwKICAgICAgICAiSXRlbUluZm8uVHJhZGVJbkluZm8iLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuQXZhaWxhYmlsaXR5Lk1heE9yZGVyUXVhbnRpdHkiLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuQXZhaWxhYmlsaXR5Lk1lc3NhZ2UiLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuQXZhaWxhYmlsaXR5Lk1pbk9yZGVyUXVhbnRpdHkiLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuQXZhaWxhYmlsaXR5LlR5cGUiLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuQ29uZGl0aW9uIiwKICAgICAgICAiT2ZmZXJzLkxpc3RpbmdzLkNvbmRpdGlvbi5Db25kaXRpb25Ob3RlIiwKICAgICAgICAiT2ZmZXJzLkxpc3RpbmdzLkNvbmRpdGlvbi5TdWJDb25kaXRpb24iLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuRGVsaXZlcnlJbmZvLklzQW1hem9uRnVsZmlsbGVkIiwKICAgICAgICAiT2ZmZXJzLkxpc3RpbmdzLkRlbGl2ZXJ5SW5mby5Jc0ZyZWVTaGlwcGluZ0VsaWdpYmxlIiwKICAgICAgICAiT2ZmZXJzLkxpc3RpbmdzLkRlbGl2ZXJ5SW5mby5Jc1ByaW1lRWxpZ2libGUiLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuRGVsaXZlcnlJbmZvLlNoaXBwaW5nQ2hhcmdlcyIsCiAgICAgICAgIk9mZmVycy5MaXN0aW5ncy5Jc0J1eUJveFdpbm5lciIsCiAgICAgICAgIk9mZmVycy5MaXN0aW5ncy5Mb3lhbHR5UG9pbnRzLlBvaW50cyIsCiAgICAgICAgIk9mZmVycy5MaXN0aW5ncy5NZXJjaGFudEluZm8iLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuUHJpY2UiLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuUHJvZ3JhbUVsaWdpYmlsaXR5LklzUHJpbWVFeGNsdXNpdmUiLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuUHJvZ3JhbUVsaWdpYmlsaXR5LklzUHJpbWVQYW50cnkiLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuUHJvbW90aW9ucyIsCiAgICAgICAgIk9mZmVycy5MaXN0aW5ncy5TYXZpbmdCYXNpcyIsCiAgICAgICAgIk9mZmVycy5TdW1tYXJpZXMuSGlnaGVzdFByaWNlIiwKICAgICAgICAiT2ZmZXJzLlN1bW1hcmllcy5Mb3dlc3RQcmljZSIsCiAgICAgICAgIk9mZmVycy5TdW1tYXJpZXMuT2ZmZXJDb3VudCIsCiAgICAgICAgIlBhcmVudEFTSU4iLAogICAgICAgICJSZW50YWxPZmZlcnMuTGlzdGluZ3MuQXZhaWxhYmlsaXR5Lk1heE9yZGVyUXVhbnRpdHkiLAogICAgICAgICJSZW50YWxPZmZlcnMuTGlzdGluZ3MuQXZhaWxhYmlsaXR5Lk1lc3NhZ2UiLAogICAgICAgICJSZW50YWxPZmZlcnMuTGlzdGluZ3MuQXZhaWxhYmlsaXR5Lk1pbk9yZGVyUXVhbnRpdHkiLAogICAgICAgICJSZW50YWxPZmZlcnMuTGlzdGluZ3MuQXZhaWxhYmlsaXR5LlR5cGUiLAogICAgICAgICJSZW50YWxPZmZlcnMuTGlzdGluZ3MuQmFzZVByaWNlIiwKICAgICAgICAiUmVudGFsT2ZmZXJzLkxpc3RpbmdzLkNvbmRpdGlvbiIsCiAgICAgICAgIlJlbnRhbE9mZmVycy5MaXN0aW5ncy5Db25kaXRpb24uQ29uZGl0aW9uTm90ZSIsCiAgICAgICAgIlJlbnRhbE9mZmVycy5MaXN0aW5ncy5Db25kaXRpb24uU3ViQ29uZGl0aW9uIiwKICAgICAgICAiUmVudGFsT2ZmZXJzLkxpc3RpbmdzLkRlbGl2ZXJ5SW5mby5Jc0FtYXpvbkZ1bGZpbGxlZCIsCiAgICAgICAgIlJlbnRhbE9mZmVycy5MaXN0aW5ncy5EZWxpdmVyeUluZm8uSXNGcmVlU2hpcHBpbmdFbGlnaWJsZSIsCiAgICAgICAgIlJlbnRhbE9mZmVycy5MaXN0aW5ncy5EZWxpdmVyeUluZm8uSXNQcmltZUVsaWdpYmxlIiwKICAgICAgICAiUmVudGFsT2ZmZXJzLkxpc3RpbmdzLkRlbGl2ZXJ5SW5mby5TaGlwcGluZ0NoYXJnZXMiLAogICAgICAgICJSZW50YWxPZmZlcnMuTGlzdGluZ3MuTWVyY2hhbnRJbmZvIiwKICAgICAgICAiU2VhcmNoUmVmaW5lbWVudHMiCiAgICBdLAogICAgIkJyYW5kIjogIkNPQVNUIiwKICAgICJQYXJ0bmVyVGFnIjogImRhc2hlcnN1cHBseS0yMCIsCiAgICAiUGFydG5lclR5cGUiOiAiQXNzb2NpYXRlcyIsCiAgICAiTWFya2V0cGxhY2UiOiAid3d3LmFtYXpvbi5jb20iCn0=`; /* ********** Payload ********** */ -{ +export const payload = { "Keywords": "flashlight", "Resources": [ "BrowseNodeInfo.BrowseNodes", @@ -73,10 +75,10 @@ https://webservices.amazon.com/!YW16LTEuMDtjb20uYW1hem9uLnBhYXBpNS52MS5Qcm9kdWN0 "PartnerType": "Associates", "Marketplace": "www.amazon.com", "Operation": "SearchItems" -} +}; /* ********** Response ********** */ -{ +export const response: SearchItemsResponse = { "SearchResult": { "Items": [ { @@ -4304,4 +4306,4 @@ https://webservices.amazon.com/!YW16LTEuMDtjb20uYW1hem9uLnBhYXBpNS52MS5Qcm9kdWN0 "SearchURL": "https://www.amazon.com/s?k=flashlight&rh=p_n_availability%3A-1%2Cp_lbr_brands_browse-bin%3ACOAST&tag=dashersupply-20&linkCode=osi", "TotalResultCount": 181 } -} \ No newline at end of file +}; \ No newline at end of file diff --git a/src/old-data/brands/coast-query-response.json b/src/old-data/brands/coast-query-response.json new file mode 100644 index 0000000..113f074 --- /dev/null +++ b/src/old-data/brands/coast-query-response.json @@ -0,0 +1,4229 @@ +{ + "SearchResult": { + "Items": [ + { + "ASIN": "B00UP3TOEA", + "BrowseNodeInfo": { + "BrowseNodes": [ + { + "Ancestor": { + "Ancestor": { + "Ancestor": { + "Ancestor": { + "ContextFreeName": "Tools & Home Improvement", + "DisplayName": "Tools & Home Improvement", + "Id": "228013" + }, + "ContextFreeName": "Home Improvement", + "DisplayName": "Categories", + "Id": "468240" + }, + "ContextFreeName": "Safety & Security", + "DisplayName": "Safety & Security", + "Id": "3180231" + }, + "ContextFreeName": "Flashlights", + "DisplayName": "Flashlights", + "Id": "3180261" + }, + "ContextFreeName": "Handheld Flashlights", + "DisplayName": "Handheld Flashlights", + "Id": "2445457011", + "IsRoot": false, + "SalesRank": 110 + } + ], + "WebsiteSalesRank": { + "SalesRank": 5442 + } + }, + "DetailPageURL": "https://www.amazon.com/dp/B00UP3TOEA?tag=dashersupply-20&linkCode=osi&th=1&psc=1", + "Images": { + "Primary": { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/310ZTNCzZlL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/310ZTNCzZlL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/310ZTNCzZlL._SL75_.jpg", + "Width": 75 + } + }, + "Variants": [ + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41bzlPNZtTL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41bzlPNZtTL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41bzlPNZtTL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/518WY9Ga6gL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/518WY9Ga6gL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/518WY9Ga6gL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41yx1HiTLdL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41yx1HiTLdL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41yx1HiTLdL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41d4+STQjZL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41d4+STQjZL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41d4+STQjZL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41UaN-JbY4L._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41UaN-JbY4L._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41UaN-JbY4L._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/51zAuRThJWL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/51zAuRThJWL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/51zAuRThJWL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41dvpzGAyDL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41dvpzGAyDL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41dvpzGAyDL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41N7uh5mpjL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41N7uh5mpjL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41N7uh5mpjL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41IvNsW2csL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41IvNsW2csL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41IvNsW2csL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/31Njkc+eXSL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/31Njkc+eXSL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/31Njkc+eXSL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/51LHHPfeA0L._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/51LHHPfeA0L._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/51LHHPfeA0L._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/31G08vaBPzL._SL500_.jpg", + "Width": 245 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/31G08vaBPzL._SL160_.jpg", + "Width": 78 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/31G08vaBPzL._SL75_.jpg", + "Width": 36 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41aDEaU5izL._SL500_.jpg", + "Width": 324 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41aDEaU5izL._SL160_.jpg", + "Width": 103 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41aDEaU5izL._SL75_.jpg", + "Width": 48 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/31G08vaBPzL._SL500_.jpg", + "Width": 245 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/31G08vaBPzL._SL160_.jpg", + "Width": 78 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/31G08vaBPzL._SL75_.jpg", + "Width": 36 + } + } + ] + }, + "ItemInfo": { + "ByLineInfo": { + "Brand": { + "DisplayValue": "Coast", + "Label": "Brand", + "Locale": "en_US" + }, + "Manufacturer": { + "DisplayValue": "Coast Cutlery Company", + "Label": "Manufacturer", + "Locale": "en_US" + } + }, + "Classifications": { + "Binding": { + "DisplayValue": "Tools & Home Improvement", + "Label": "Binding", + "Locale": "en_US" + }, + "ProductGroup": { + "DisplayValue": "Tools", + "Label": "ProductGroup", + "Locale": "en_US" + } + }, + "ExternalIds": { + "EANs": { + "DisplayValues": [ + "0015286215581", + "0015286208187" + ], + "Label": "EAN", + "Locale": "en_US" + }, + "UPCs": { + "DisplayValues": [ + "015286215581", + "015286208187" + ], + "Label": "UPC", + "Locale": "en_US" + } + }, + "Features": { + "DisplayValues": [ + "TWIST FOCUS OPTIC: The Simple Twist Focus System Goes From An Ultra View Flood Beam To Bulls-Eye Spot Beam", + "BRIGHT: 500 Lumens In A Small Package Perfect For A Pocket And Every Day Carry For Medical Personnel, Law Enforcement, Pilots, Military, And More", + "DUAL POWER: This Light Operates With Both Standard Alkaline Batteries And Our Custom Rechargeable Batteries. Battery Cartridge And Batteries Included", + "TOUGH AND RELIABLE: IP54 rated design for water resistance and durable body for 1-meter drop protection. Backed by the COAST Lifetime warranty against defects in materials and workmanship", + "HERITAGE: For 100 Years, And Three Generations Of The Brands Family, Coast Has Made Products That Make People’s Jobs And Recreation Easier, Safer And More Enjoyable" + ], + "Label": "Features", + "Locale": "en_US" + }, + "ManufactureInfo": { + "ItemPartNumber": { + "DisplayValue": "Lumen Penlight", + "Label": "PartNumber", + "Locale": "en_US" + }, + "Model": { + "DisplayValue": "Lumen Penlight", + "Label": "Model", + "Locale": "en_US" + }, + "Warranty": { + "DisplayValue": "Limited lifetime.", + "Label": "Warranty", + "Locale": "en_US" + } + }, + "ProductInfo": { + "Color": { + "DisplayValue": "Black", + "Label": "Color", + "Locale": "en_US" + }, + "IsAdultProduct": { + "DisplayValue": false, + "Label": "IsAdultProduct", + "Locale": "en_US" + }, + "ItemDimensions": { + "Height": { + "DisplayValue": 2.4, + "Label": "Height", + "Locale": "en_US", + "Unit": "inches" + }, + "Length": { + "DisplayValue": 5.8, + "Label": "Length", + "Locale": "en_US", + "Unit": "inches" + }, + "Weight": { + "DisplayValue": 0.220462262, + "Label": "Weight", + "Locale": "en_US", + "Unit": "Pounds" + }, + "Width": { + "DisplayValue": 3.7, + "Label": "Width", + "Locale": "en_US", + "Unit": "inches" + } + }, + "UnitCount": { + "DisplayValue": 1, + "Label": "NumberOfItems", + "Locale": "en_US" + } + }, + "Title": { + "DisplayValue": "COAST HP3R 500 Lumen Rechargeable LED Penlight with TWIST FOCUS, Black", + "Label": "Title", + "Locale": "en_US" + } + }, + "Offers": { + "Listings": [ + { + "Availability": { + "Message": "In Stock", + "MinOrderQuantity": 1, + "Type": "Now" + }, + "Condition": { + "SubCondition": { + "Value": "New" + }, + "Value": "New" + }, + "DeliveryInfo": { + "IsAmazonFulfilled": true, + "IsFreeShippingEligible": true, + "IsPrimeEligible": true + }, + "Id": "tKyp2Ar2%2BdW7Jip3nJxiasvfuHen5smguIkBe5gSHlVeX0mJY5nCZiqp5oRVK0ljVBeE1V4OljxYBRhtvR5%2Fxib2dnRSSQioB02LSpWCuPPmzpRTpOf4zIQ%2ByCbvTIMxPwi%2BjO24XLN32%2F4eds5PkQ%3D%3D", + "IsBuyBoxWinner": true, + "MerchantInfo": { + "FeedbackCount": 385, + "FeedbackRating": 4.68, + "Id": "ATVPDKIKX0DER", + "Name": "Amazon.com" + }, + "Price": { + "Amount": 56.56, + "Currency": "USD", + "DisplayAmount": "$56.56", + "Savings": { + "Amount": 38.43, + "Currency": "USD", + "DisplayAmount": "$38.43 (40%)", + "Percentage": 40 + } + }, + "ProgramEligibility": { + "IsPrimeExclusive": false, + "IsPrimePantry": false + }, + "SavingBasis": { + "Amount": 94.99, + "Currency": "USD", + "DisplayAmount": "$94.99", + "PriceType": "LIST_PRICE" + }, + "ViolatesMAP": false + } + ], + "Summaries": [ + { + "Condition": { + "Value": "Used" + }, + "HighestPrice": { + "Amount": 49.76, + "Currency": "USD", + "DisplayAmount": "$49.76" + }, + "LowestPrice": { + "Amount": 48.25, + "Currency": "USD", + "DisplayAmount": "$48.25" + }, + "OfferCount": 3 + }, + { + "Condition": { + "Value": "New" + }, + "HighestPrice": { + "Amount": 87.29, + "Currency": "USD", + "DisplayAmount": "$87.29" + }, + "LowestPrice": { + "Amount": 56.55, + "Currency": "USD", + "DisplayAmount": "$56.55" + }, + "OfferCount": 9 + } + ] + }, + "ParentASIN": "B0B18LY12L" + }, + { + "ASIN": "B0CXYQ2GGX", + "BrowseNodeInfo": { + "BrowseNodes": [ + { + "Ancestor": { + "Ancestor": { + "Ancestor": { + "Ancestor": { + "ContextFreeName": "Tools & Home Improvement", + "DisplayName": "Tools & Home Improvement", + "Id": "228013" + }, + "ContextFreeName": "Home Improvement", + "DisplayName": "Categories", + "Id": "468240" + }, + "ContextFreeName": "Safety & Security", + "DisplayName": "Safety & Security", + "Id": "3180231" + }, + "ContextFreeName": "Flashlights", + "DisplayName": "Flashlights", + "Id": "3180261" + }, + "ContextFreeName": "Handheld Flashlights", + "DisplayName": "Handheld Flashlights", + "Id": "2445457011", + "IsRoot": false, + "SalesRank": 512 + } + ], + "WebsiteSalesRank": { + "SalesRank": 32747 + } + }, + "DetailPageURL": "https://www.amazon.com/dp/B0CXYQ2GGX?tag=dashersupply-20&linkCode=osi&th=1&psc=1", + "Images": { + "Primary": { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/31v0gpmwuIL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/31v0gpmwuIL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/31v0gpmwuIL._SL75_.jpg", + "Width": 75 + } + }, + "Variants": [ + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41w7wd5nGRL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41w7wd5nGRL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41w7wd5nGRL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/51r6XCD7cWL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/51r6XCD7cWL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/51r6XCD7cWL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/514g1-3gGdL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/514g1-3gGdL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/514g1-3gGdL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41qXAlHmOsL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41qXAlHmOsL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41qXAlHmOsL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41wRrMiMs4L._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41wRrMiMs4L._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41wRrMiMs4L._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41zXsc-9YKL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41zXsc-9YKL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41zXsc-9YKL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/51mBq--8HuL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/51mBq--8HuL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/51mBq--8HuL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/51C5bWaKRML._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/51C5bWaKRML._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/51C5bWaKRML._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41FsusIladL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41FsusIladL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41FsusIladL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41EoCzPK4NL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41EoCzPK4NL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41EoCzPK4NL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/3113vZZmGCL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/3113vZZmGCL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/3113vZZmGCL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/412qQHUlnJL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/412qQHUlnJL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/412qQHUlnJL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41MaT-MvnCL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41MaT-MvnCL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41MaT-MvnCL._SL75_.jpg", + "Width": 75 + } + } + ] + }, + "ItemInfo": { + "ByLineInfo": { + "Brand": { + "DisplayValue": "Coast", + "Label": "Brand", + "Locale": "en_US" + }, + "Manufacturer": { + "DisplayValue": "Coast", + "Label": "Manufacturer", + "Locale": "en_US" + } + }, + "Classifications": { + "Binding": { + "DisplayValue": "Tools & Home Improvement", + "Label": "Binding", + "Locale": "en_US" + }, + "ProductGroup": { + "DisplayValue": "Tools", + "Label": "ProductGroup", + "Locale": "en_US" + } + }, + "ExternalIds": { + "EANs": { + "DisplayValues": [ + "0015286310330" + ], + "Label": "EAN", + "Locale": "en_US" + }, + "UPCs": { + "DisplayValues": [ + "015286310330" + ], + "Label": "UPC", + "Locale": "en_US" + } + }, + "Features": { + "DisplayValues": [ + "PURE BEAM FOCUSING OPTIC: Shine two beams from one optic—using PURE BEAM technology to transition seamlessly between Ultra View Flood Beam and BULLS-EYE Spot Beam.", + "BEAM LOCK and SLIDE FOCUS: Set the beam just how you need it. The SLIDE FOCUS system allows you to twist the bezel and secure the beam as a flood beam, spot beam, or anywhere in between.", + "FIVE LIGHT MODES: Easily select from five light modes—medium, high, low, Turbo, and moon glow—to match the flashlight’s output to your need.", + "RECHARGEABLE: Rely on the ZITHION-X rechargeable batteries for strong performance and cost savings over time.", + "BACKED BY COAST LIFETIME WARRANTY: Take confidence in your product knowing it is backed by COAST’s total commitment to quality and Lifetime Warranty program." + ], + "Label": "Features", + "Locale": "en_US" + }, + "ManufactureInfo": { + "ItemPartNumber": { + "DisplayValue": "31033", + "Label": "PartNumber", + "Locale": "en_US" + }, + "Model": { + "DisplayValue": "31033", + "Label": "Model", + "Locale": "en_US" + }, + "Warranty": { + "DisplayValue": "Lifetime.", + "Label": "Warranty", + "Locale": "en_US" + } + }, + "ProductInfo": { + "Color": { + "DisplayValue": "Black", + "Label": "Color", + "Locale": "en_US" + }, + "ItemDimensions": { + "Height": { + "DisplayValue": 1.9, + "Label": "Height", + "Locale": "en_US", + "Unit": "inches" + }, + "Length": { + "DisplayValue": 9.1, + "Label": "Length", + "Locale": "en_US", + "Unit": "inches" + }, + "Width": { + "DisplayValue": 1.9, + "Label": "Width", + "Locale": "en_US", + "Unit": "inches" + } + }, + "UnitCount": { + "DisplayValue": 1, + "Label": "NumberOfItems", + "Locale": "en_US" + } + }, + "Title": { + "DisplayValue": "Coast XP14R 4500 Lumen USB-C Rechargeable LED Flashlight with SLIDE FOCUS® and PURE BEAM® Focusing Optic, 5 Light Modes", + "Label": "Title", + "Locale": "en_US" + } + }, + "Offers": { + "Listings": [ + { + "Availability": { + "Message": "In Stock", + "MinOrderQuantity": 1, + "Type": "Now" + }, + "Condition": { + "SubCondition": { + "Value": "New" + }, + "Value": "New" + }, + "DeliveryInfo": { + "IsAmazonFulfilled": true, + "IsFreeShippingEligible": true, + "IsPrimeEligible": true + }, + "Id": "tKyp2Ar2%2BdW7Jip3nJxiau7mI2xIASoQLQjSKA2%2FQUJ%2Fh2Ot2sSq0zdd7M5%2BiBr0w3XDHUFE2eB%2BrEnSJxaCAV9C0nqEdC%2F5FFtVU9PNTWGPZVasJFJAE%2Fb4oPnnQkO1KPvVr%2F1hgI4AWowi%2F5lBWA%3D%3D", + "IsBuyBoxWinner": true, + "MerchantInfo": { + "FeedbackCount": 385, + "FeedbackRating": 4.68, + "Id": "ATVPDKIKX0DER", + "Name": "Amazon.com" + }, + "Price": { + "Amount": 74.99, + "Currency": "USD", + "DisplayAmount": "$74.99" + }, + "ProgramEligibility": { + "IsPrimeExclusive": false, + "IsPrimePantry": false + }, + "ViolatesMAP": false + } + ], + "Summaries": [ + { + "Condition": { + "Value": "New" + }, + "HighestPrice": { + "Amount": 79.48, + "Currency": "USD", + "DisplayAmount": "$79.48" + }, + "LowestPrice": { + "Amount": 74.99, + "Currency": "USD", + "DisplayAmount": "$74.99" + }, + "OfferCount": 3 + }, + { + "Condition": { + "Value": "Used" + }, + "HighestPrice": { + "Amount": 63.54, + "Currency": "USD", + "DisplayAmount": "$63.54" + }, + "LowestPrice": { + "Amount": 61.61, + "Currency": "USD", + "DisplayAmount": "$61.61" + }, + "OfferCount": 2 + } + ] + } + }, + { + "ASIN": "B08L8C7DTW", + "BrowseNodeInfo": { + "BrowseNodes": [ + { + "Ancestor": { + "Ancestor": { + "Ancestor": { + "Ancestor": { + "ContextFreeName": "Tools & Home Improvement", + "DisplayName": "Tools & Home Improvement", + "Id": "228013" + }, + "ContextFreeName": "Home Improvement", + "DisplayName": "Categories", + "Id": "468240" + }, + "ContextFreeName": "Safety & Security", + "DisplayName": "Safety & Security", + "Id": "3180231" + }, + "ContextFreeName": "Flashlights", + "DisplayName": "Flashlights", + "Id": "3180261" + }, + "ContextFreeName": "Handheld Flashlights", + "DisplayName": "Handheld Flashlights", + "Id": "2445457011", + "IsRoot": false, + "SalesRank": 320 + } + ], + "WebsiteSalesRank": { + "SalesRank": 19141 + } + }, + "DetailPageURL": "https://www.amazon.com/dp/B08L8C7DTW?tag=dashersupply-20&linkCode=osi&th=1&psc=1", + "Images": { + "Primary": { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/31pPU-a15gL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/31pPU-a15gL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/31pPU-a15gL._SL75_.jpg", + "Width": 75 + } + }, + "Variants": [ + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41X8gWKp1eL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41X8gWKp1eL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41X8gWKp1eL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/51e0GXU9LrL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/51e0GXU9LrL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/51e0GXU9LrL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/51Kz+sBDvTL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/51Kz+sBDvTL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/51Kz+sBDvTL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/51qSxhMcNgL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/51qSxhMcNgL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/51qSxhMcNgL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41hTqN4cLXL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41hTqN4cLXL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41hTqN4cLXL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/51UsGvxJDfL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/51UsGvxJDfL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/51UsGvxJDfL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/31pDCAF-BjL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/31pDCAF-BjL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/31pDCAF-BjL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41OSVfwHp1L._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41OSVfwHp1L._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41OSVfwHp1L._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41hq6QznHCL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41hq6QznHCL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41hq6QznHCL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41JOj9duB1L._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41JOj9duB1L._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41JOj9duB1L._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/51nZNCkvfJL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/51nZNCkvfJL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/51nZNCkvfJL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/410OoPKnopL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/410OoPKnopL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/410OoPKnopL._SL75_.jpg", + "Width": 75 + } + } + ] + }, + "ItemInfo": { + "ByLineInfo": { + "Brand": { + "DisplayValue": "Coast", + "Label": "Brand", + "Locale": "en_US" + }, + "Manufacturer": { + "DisplayValue": "Coast", + "Label": "Manufacturer", + "Locale": "en_US" + } + }, + "Classifications": { + "Binding": { + "DisplayValue": "Tools & Home Improvement", + "Label": "Binding", + "Locale": "en_US" + }, + "ProductGroup": { + "DisplayValue": "Tools", + "Label": "ProductGroup", + "Locale": "en_US" + } + }, + "ExternalIds": { + "EANs": { + "DisplayValues": [ + "0015286303721", + "0015286305756", + "0015286303226", + "0015286303264", + "0015286309471" + ], + "Label": "EAN", + "Locale": "en_US" + }, + "UPCs": { + "DisplayValues": [ + "015286303264", + "015286303721", + "015286309471", + "015286305756", + "015286303226" + ], + "Label": "UPC", + "Locale": "en_US" + } + }, + "Features": { + "DisplayValues": [ + "SLIDE FOCUS: COAST-patented SLIDE FOCUS optical technology shines the Ultra View Flood Beam and BULLS-EYE Spot Beam with seamless transitions at up to 220 meters.", + "TURBO MODE: The XP11R Not Only Features Standard Light Modes But Also Coast’S Signature Turbo Mode For 2600 Lumens Of Light For Critical Situations.", + "RECHARGEABLE-DUAL POWER: Each coast Rechargeable-Dual Power product comes with a ZITHION-X rechargeable battery and is compatible with either Coast Extreme Performance alkaline batteries or other brand-name battery types, depending on the product. This provides you the cost savings of using rechargeable and the flexibility of reverting to alkaline", + "POWER INDICATOR: The XP11R has a real-time power indicator so that you always know when to power up.", + "TOUGH & RELIABLE: Backed by the COAST lifetime warranty against defects in materials and workmanship. IP54 rated design for water resistance and durable body for 1-meter drop protection." + ], + "Label": "Features", + "Locale": "en_US" + }, + "ManufactureInfo": { + "ItemPartNumber": { + "DisplayValue": "30326", + "Label": "PartNumber", + "Locale": "en_US" + }, + "Model": { + "DisplayValue": "30326", + "Label": "Model", + "Locale": "en_US" + }, + "Warranty": { + "DisplayValue": "Coast warranties its coast knives, tools and coast led flashlights/headlamps to be free of defects in materials and workmanship for the life of the original purchaser. This warranty does not cover normal wear and tear, nor damage resulting from misuse or neglect. Warranty does not cover batteries and charging accessories (or damage caused by either). Batteries or damage caused by batteries (i. E. Leakage) not included in the guarantee.", + "Label": "Warranty", + "Locale": "en_US" + } + }, + "ProductInfo": { + "Color": { + "DisplayValue": "Black", + "Label": "Color", + "Locale": "en_US" + }, + "ItemDimensions": { + "Height": { + "DisplayValue": 5.98, + "Label": "Height", + "Locale": "en_US", + "Unit": "Inches" + }, + "Length": { + "DisplayValue": 1.48, + "Label": "Length", + "Locale": "en_US", + "Unit": "Inches" + }, + "Weight": { + "DisplayValue": 0.38, + "Label": "Weight", + "Locale": "en_US", + "Unit": "pounds" + }, + "Width": { + "DisplayValue": 1.48, + "Label": "Width", + "Locale": "en_US", + "Unit": "Inches" + } + }, + "UnitCount": { + "DisplayValue": 1, + "Label": "NumberOfItems", + "Locale": "en_US" + } + }, + "Title": { + "DisplayValue": "COAST XP11R 2600 Lumen USB-C Rechargeable LED Flashlight with SLIDE FOCUS and PURE BEAM Focusing Optic, 4 Light Modes", + "Label": "Title", + "Locale": "en_US" + } + }, + "Offers": { + "Listings": [ + { + "Availability": { + "Message": "In Stock", + "MinOrderQuantity": 1, + "Type": "Now" + }, + "Condition": { + "SubCondition": { + "Value": "New" + }, + "Value": "New" + }, + "DeliveryInfo": { + "IsAmazonFulfilled": true, + "IsFreeShippingEligible": true, + "IsPrimeEligible": true + }, + "Id": "tKyp2Ar2%2BdW7Jip3nJxiatb16Zu16QddVnCwCc66n%2Fin%2BxFxm4RdIZNH%2Bu1Qj%2BpfJnAA9HPq0xZ%2FSnTYaQWmhQbnPQl7da90fSPtKEH229ijRJC5vfNWVxMVidozIkt47VAZc20F2sItdb%2FPgcdXjg%3D%3D", + "IsBuyBoxWinner": true, + "MerchantInfo": { + "FeedbackCount": 385, + "FeedbackRating": 4.68, + "Id": "ATVPDKIKX0DER", + "Name": "Amazon.com" + }, + "Price": { + "Amount": 50.78, + "Currency": "USD", + "DisplayAmount": "$50.78", + "Savings": { + "Amount": 19.21, + "Currency": "USD", + "DisplayAmount": "$19.21 (27%)", + "Percentage": 27 + } + }, + "ProgramEligibility": { + "IsPrimeExclusive": false, + "IsPrimePantry": false + }, + "SavingBasis": { + "Amount": 69.99, + "Currency": "USD", + "DisplayAmount": "$69.99", + "PriceType": "LIST_PRICE" + }, + "ViolatesMAP": false + } + ], + "Summaries": [ + { + "Condition": { + "Value": "New" + }, + "HighestPrice": { + "Amount": 100.5, + "Currency": "USD", + "DisplayAmount": "$100.50" + }, + "LowestPrice": { + "Amount": 49.99, + "Currency": "USD", + "DisplayAmount": "$49.99" + }, + "OfferCount": 14 + }, + { + "Condition": { + "Value": "Used" + }, + "HighestPrice": { + "Amount": 47.84, + "Currency": "USD", + "DisplayAmount": "$47.84" + }, + "LowestPrice": { + "Amount": 47.84, + "Currency": "USD", + "DisplayAmount": "$47.84" + }, + "OfferCount": 2 + } + ] + }, + "ParentASIN": "B0D956X876" + }, + { + "ASIN": "B0D66BXKF5", + "BrowseNodeInfo": { + "BrowseNodes": [ + { + "Ancestor": { + "Ancestor": { + "Ancestor": { + "Ancestor": { + "ContextFreeName": "Tools & Home Improvement", + "DisplayName": "Tools & Home Improvement", + "Id": "228013" + }, + "ContextFreeName": "Home Improvement", + "DisplayName": "Categories", + "Id": "468240" + }, + "ContextFreeName": "Safety & Security", + "DisplayName": "Safety & Security", + "Id": "3180231" + }, + "ContextFreeName": "Flashlights", + "DisplayName": "Flashlights", + "Id": "3180261" + }, + "ContextFreeName": "Handheld Flashlights", + "DisplayName": "Handheld Flashlights", + "Id": "2445457011", + "IsRoot": false, + "SalesRank": 665 + } + ], + "WebsiteSalesRank": { + "SalesRank": 43486 + } + }, + "DetailPageURL": "https://www.amazon.com/dp/B0D66BXKF5?tag=dashersupply-20&linkCode=osi&th=1&psc=1", + "Images": { + "Primary": { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/51c6MXIzzLL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/51c6MXIzzLL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/51c6MXIzzLL._SL75_.jpg", + "Width": 75 + } + }, + "Variants": [ + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/51kEpBzuCcL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/51kEpBzuCcL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/51kEpBzuCcL._SL75_.jpg", + "Width": 75 + } + } + ] + }, + "ItemInfo": { + "ByLineInfo": { + "Brand": { + "DisplayValue": "Coast", + "Label": "Brand", + "Locale": "en_US" + }, + "Manufacturer": { + "DisplayValue": "Coast", + "Label": "Manufacturer", + "Locale": "en_US" + } + }, + "Classifications": { + "ProductGroup": { + "DisplayValue": "Tools", + "Label": "ProductGroup", + "Locale": "en_US" + } + }, + "ExternalIds": { + "EANs": { + "DisplayValues": [ + "0015286311092" + ], + "Label": "EAN", + "Locale": "en_US" + }, + "UPCs": { + "DisplayValues": [ + "015286311092" + ], + "Label": "UPC", + "Locale": "en_US" + } + }, + "Features": { + "DisplayValues": [ + "Bright Illumination: Delivers an impressive 1000 lumens of brilliant LED light for outdoor activities.", + "Rechargeable Convenience: Features a rechargeable battery, eliminating the need for disposable batteries.", + "Long-Lasting: Provides up to 6 hours of runtime on high mode (1000 lumens).", + "Durable Construction: Made with high-quality materials for rugged and reliable performance.", + "Value Pack: Includes 3 flashlights, perfect for outdoor adventures or emergency preparedness." + ], + "Label": "Features", + "Locale": "en_US" + }, + "ManufactureInfo": { + "ItemPartNumber": { + "DisplayValue": "1718612", + "Label": "PartNumber", + "Locale": "en_US" + }, + "Model": { + "DisplayValue": "CF1000R", + "Label": "Model", + "Locale": "en_US" + }, + "Warranty": { + "DisplayValue": "Lifetime manufacturers.", + "Label": "Warranty", + "Locale": "en_US" + } + }, + "ProductInfo": { + "Color": { + "DisplayValue": "Black", + "Label": "Color", + "Locale": "en_US" + }, + "ItemDimensions": { + "Height": { + "DisplayValue": 9.5, + "Label": "Height", + "Locale": "en_US", + "Unit": "inches" + }, + "Length": { + "DisplayValue": 2.5, + "Label": "Length", + "Locale": "en_US", + "Unit": "inches" + }, + "Width": { + "DisplayValue": 12, + "Label": "Width", + "Locale": "en_US", + "Unit": "inches" + } + }, + "UnitCount": { + "DisplayValue": 3, + "Label": "NumberOfItems", + "Locale": "en_US" + } + }, + "Title": { + "DisplayValue": "Coast 1000 Lumen Rechargeable LED Flashlight, Adjustable Focus, Waterproof, Dustproof, Rugged for Fishing, Hiking, Camping, Mechanic Work - Set of 3, Black, CF1000R", + "Label": "Title", + "Locale": "en_US" + } + }, + "Offers": { + "Listings": [ + { + "Availability": { + "Message": "In Stock", + "MinOrderQuantity": 1, + "Type": "Now" + }, + "Condition": { + "SubCondition": { + "Value": "New" + }, + "Value": "New" + }, + "DeliveryInfo": { + "IsAmazonFulfilled": false, + "IsFreeShippingEligible": false, + "IsPrimeEligible": false + }, + "Id": "tKyp2Ar2%2BdW7Jip3nJxiahzZ1FnJKBTNR9%2F%2BzWPMkdfitLpv%2F97Xj53AE816GMLsyJ2%2FlMsGU7WVpINbUwagv8LJDOXeKVA3FN7AscflBLIIE3azqrFV6o%2Bknb3NMhhhkDB%2BJJ2sg0iUNV04sIcq8M2Hs19qS6BGZG9QX6Chc05Af%2Ba%2BcJ%2F%2BmAMo5%2B39CE8N", + "IsBuyBoxWinner": true, + "MerchantInfo": { + "DefaultShippingCountry": "US", + "FeedbackCount": 43, + "FeedbackRating": 4.75, + "Id": "A38RIMN4NBLYL", + "Name": "ValueShop(Serial # recorded)" + }, + "Price": { + "Amount": 29.99, + "Currency": "USD", + "DisplayAmount": "$29.99", + "Savings": { + "Amount": 10, + "Currency": "USD", + "DisplayAmount": "$10.00 (25%)", + "Percentage": 25 + } + }, + "ProgramEligibility": { + "IsPrimeExclusive": false, + "IsPrimePantry": false + }, + "SavingBasis": { + "Amount": 39.99, + "Currency": "USD", + "DisplayAmount": "$39.99", + "PriceType": "WAS_PRICE" + }, + "ViolatesMAP": false + } + ], + "Summaries": [ + { + "Condition": { + "Value": "New" + }, + "HighestPrice": { + "Amount": 49.99, + "Currency": "USD", + "DisplayAmount": "$49.99" + }, + "LowestPrice": { + "Amount": 29.99, + "Currency": "USD", + "DisplayAmount": "$29.99" + }, + "OfferCount": 13 + }, + { + "Condition": { + "Value": "Used" + }, + "HighestPrice": { + "Amount": 35.99, + "Currency": "USD", + "DisplayAmount": "$35.99" + }, + "LowestPrice": { + "Amount": 35.99, + "Currency": "USD", + "DisplayAmount": "$35.99" + }, + "OfferCount": 1 + } + ] + } + }, + { + "ASIN": "B00CO8YV92", + "BrowseNodeInfo": { + "BrowseNodes": [ + { + "Ancestor": { + "Ancestor": { + "Ancestor": { + "Ancestor": { + "ContextFreeName": "Tools & Home Improvement", + "DisplayName": "Tools & Home Improvement", + "Id": "228013" + }, + "ContextFreeName": "Home Improvement", + "DisplayName": "Categories", + "Id": "468240" + }, + "ContextFreeName": "Safety & Security", + "DisplayName": "Safety & Security", + "Id": "3180231" + }, + "ContextFreeName": "Flashlights", + "DisplayName": "Flashlights", + "Id": "3180261" + }, + "ContextFreeName": "Handheld Flashlights", + "DisplayName": "Handheld Flashlights", + "Id": "2445457011", + "IsRoot": false, + "SalesRank": 511 + } + ], + "WebsiteSalesRank": { + "SalesRank": 32732 + } + }, + "DetailPageURL": "https://www.amazon.com/dp/B00CO8YV92?tag=dashersupply-20&linkCode=osi&th=1&psc=1", + "Images": { + "Primary": { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/317FNIcrACL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/317FNIcrACL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/317FNIcrACL._SL75_.jpg", + "Width": 75 + } + }, + "Variants": [ + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/4196R5otB+L._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/4196R5otB+L._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/4196R5otB+L._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/51BPoBlN9RL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/51BPoBlN9RL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/51BPoBlN9RL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41pKhStFBnL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41pKhStFBnL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41pKhStFBnL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41PCF2vXM5L._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41PCF2vXM5L._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41PCF2vXM5L._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41x-6OLpG6L._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41x-6OLpG6L._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41x-6OLpG6L._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41Ad23sZvHL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41Ad23sZvHL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41Ad23sZvHL._SL75_.jpg", + "Width": 75 + } + } + ] + }, + "ItemInfo": { + "ByLineInfo": { + "Brand": { + "DisplayValue": "Coast", + "Label": "Brand", + "Locale": "en_US" + }, + "Manufacturer": { + "DisplayValue": "Coast", + "Label": "Manufacturer", + "Locale": "en_US" + } + }, + "Classifications": { + "Binding": { + "DisplayValue": "Apparel", + "Label": "Binding", + "Locale": "en_US" + }, + "ProductGroup": { + "DisplayValue": "Tools", + "Label": "ProductGroup", + "Locale": "en_US" + } + }, + "ExternalIds": { + "EANs": { + "DisplayValues": [ + "0015286196804" + ], + "Label": "EAN", + "Locale": "en_US" + }, + "UPCs": { + "DisplayValues": [ + "015286196804" + ], + "Label": "UPC", + "Locale": "en_US" + } + }, + "Features": { + "DisplayValues": [ + "Bulls-Eye Spot Beam Optic: Consists Of An Extremely Bright, Centered ‘Hot Spot’ And A Very Consistent Transition Halo To Increase The Effective Viewing Area", + "Quick-Cycle Switch: Control Your Light Power With The Push Of A Button. Cycle Between High Power And Low Power Options", + "Specs: Light Output 415 Lumens (High), 155 Lumens (Low). Beam Distance: 134 Meters (High), 79 Meters (Low). Runtime: 4.5 Hours (High), 16 Hours (Low). Tested And Rated To Ansi/Fl1 Standards", + "Ip54 Rated Design For Water Resistance And Durable Body For 1-Meter Drop Protection" + ], + "Label": "Features", + "Locale": "en_US" + }, + "ManufactureInfo": { + "ItemPartNumber": { + "DisplayValue": "19680", + "Label": "PartNumber", + "Locale": "en_US" + }, + "Model": { + "DisplayValue": "19680", + "Label": "Model", + "Locale": "en_US" + }, + "Warranty": { + "DisplayValue": "Coast warranties its coast knives, tools and coast led flashlights/headlamps to be free of defects in materials and workmanship for the life of the original purchaser. This warranty does not cover normal wear and tear, nor damage resulting from misuse or neglect. Warranty does not cover batteries and charging accessories (or damage caused by either). Batteries or damage caused by batteries (i. E. Leakage) not included in the guarantee.", + "Label": "Warranty", + "Locale": "en_US" + } + }, + "ProductInfo": { + "Color": { + "DisplayValue": "Black", + "Label": "Color", + "Locale": "en_US" + }, + "IsAdultProduct": { + "DisplayValue": false, + "Label": "IsAdultProduct", + "Locale": "en_US" + }, + "ItemDimensions": { + "Height": { + "DisplayValue": 1.06, + "Label": "Height", + "Locale": "en_US", + "Unit": "inches" + }, + "Length": { + "DisplayValue": 6.42, + "Label": "Length", + "Locale": "en_US", + "Unit": "inches" + }, + "Weight": { + "DisplayValue": 0.3, + "Label": "Weight", + "Locale": "en_US", + "Unit": "Pounds" + }, + "Width": { + "DisplayValue": 1.06, + "Label": "Width", + "Locale": "en_US", + "Unit": "inches" + } + }, + "Size": { + "DisplayValue": "1 Pack", + "Label": "Size", + "Locale": "en_US" + }, + "UnitCount": { + "DisplayValue": 1, + "Label": "NumberOfItems", + "Locale": "en_US" + } + }, + "Title": { + "DisplayValue": "Coast® G26 415 Lumen Bulls-Eyeâ„¢ Spot Beam LED Flashlight, Batteries Included, Black", + "Label": "Title", + "Locale": "en_US" + } + }, + "Offers": { + "Listings": [ + { + "Availability": { + "Message": "In Stock", + "MinOrderQuantity": 1, + "Type": "Now" + }, + "Condition": { + "SubCondition": { + "Value": "New" + }, + "Value": "New" + }, + "DeliveryInfo": { + "IsAmazonFulfilled": true, + "IsFreeShippingEligible": true, + "IsPrimeEligible": true + }, + "Id": "tKyp2Ar2%2BdW7Jip3nJxiasvzO0wc8DMKMWlW1OxgtVmzJz4iFhny2wDWXrvyPR65UXMpBhxdWYibRi%2BSLFUQ9QDiC0KbhIjJr1nGG60y80B8vfxl%2BxtiLhgvI1aI5jZ8lJx28ta7vXehr8FzE%2Fq6gA%3D%3D", + "IsBuyBoxWinner": true, + "MerchantInfo": { + "FeedbackCount": 385, + "FeedbackRating": 4.68, + "Id": "ATVPDKIKX0DER", + "Name": "Amazon.com" + }, + "Price": { + "Amount": 14.99, + "Currency": "USD", + "DisplayAmount": "$14.99", + "Savings": { + "Amount": 15, + "Currency": "USD", + "DisplayAmount": "$15.00 (50%)", + "Percentage": 50 + } + }, + "ProgramEligibility": { + "IsPrimeExclusive": false, + "IsPrimePantry": false + }, + "SavingBasis": { + "Amount": 29.99, + "Currency": "USD", + "DisplayAmount": "$29.99", + "PriceType": "LIST_PRICE" + }, + "ViolatesMAP": false + } + ], + "Summaries": [ + { + "Condition": { + "Value": "Used" + }, + "HighestPrice": { + "Amount": 13.85, + "Currency": "USD", + "DisplayAmount": "$13.85" + }, + "LowestPrice": { + "Amount": 13.85, + "Currency": "USD", + "DisplayAmount": "$13.85" + }, + "OfferCount": 1 + }, + { + "Condition": { + "Value": "New" + }, + "HighestPrice": { + "Amount": 36.82, + "Currency": "USD", + "DisplayAmount": "$36.82" + }, + "LowestPrice": { + "Amount": 13.18, + "Currency": "USD", + "DisplayAmount": "$13.18" + }, + "OfferCount": 20 + } + ] + } + }, + { + "ASIN": "B0CFT6H9RZ", + "BrowseNodeInfo": { + "BrowseNodes": [ + { + "Ancestor": { + "Ancestor": { + "Ancestor": { + "Ancestor": { + "ContextFreeName": "Tools & Home Improvement", + "DisplayName": "Tools & Home Improvement", + "Id": "228013" + }, + "ContextFreeName": "Home Improvement", + "DisplayName": "Categories", + "Id": "468240" + }, + "ContextFreeName": "Safety & Security", + "DisplayName": "Safety & Security", + "Id": "3180231" + }, + "ContextFreeName": "Flashlights", + "DisplayName": "Flashlights", + "Id": "3180261" + }, + "ContextFreeName": "Handheld Flashlights", + "DisplayName": "Handheld Flashlights", + "Id": "2445457011", + "IsRoot": false, + "SalesRank": 912 + } + ], + "WebsiteSalesRank": { + "SalesRank": 62521 + } + }, + "DetailPageURL": "https://www.amazon.com/dp/B0CFT6H9RZ?tag=dashersupply-20&linkCode=osi&th=1&psc=1", + "Images": { + "Primary": { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/31gGdKl9TTL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/31gGdKl9TTL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/31gGdKl9TTL._SL75_.jpg", + "Width": 75 + } + }, + "Variants": [ + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41HIiUBdiYL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41HIiUBdiYL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41HIiUBdiYL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/514OP9GR6+L._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/514OP9GR6+L._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/514OP9GR6+L._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/51vNzssLWfL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/51vNzssLWfL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/51vNzssLWfL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/61xExF3DG+L._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/61xExF3DG+L._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/61xExF3DG+L._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/510jhQtrecL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/510jhQtrecL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/510jhQtrecL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/410tyb+9oOL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/410tyb+9oOL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/410tyb+9oOL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41IvTbcjdKL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41IvTbcjdKL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41IvTbcjdKL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41P6TIyCGjL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41P6TIyCGjL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41P6TIyCGjL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/51w+0HoDaRL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/51w+0HoDaRL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/51w+0HoDaRL._SL75_.jpg", + "Width": 75 + } + } + ] + }, + "ItemInfo": { + "ByLineInfo": { + "Brand": { + "DisplayValue": "Coast", + "Label": "Brand", + "Locale": "en_US" + }, + "Manufacturer": { + "DisplayValue": "Coast", + "Label": "Manufacturer", + "Locale": "en_US" + } + }, + "Classifications": { + "Binding": { + "DisplayValue": "Tools & Home Improvement", + "Label": "Binding", + "Locale": "en_US" + }, + "ProductGroup": { + "DisplayValue": "Tools", + "Label": "ProductGroup", + "Locale": "en_US" + } + }, + "ExternalIds": { + "EANs": { + "DisplayValues": [ + "0015286309099" + ], + "Label": "EAN", + "Locale": "en_US" + }, + "UPCs": { + "DisplayValues": [ + "015286309099" + ], + "Label": "UPC", + "Locale": "en_US" + } + }, + "Features": { + "DisplayValues": [ + "PURE BEAM FOCUSING OPTIC: Shine two beams from one optic—using PURE BEAM technology to transition seamlessly between Ultra View Flood Beam and BULLS-EYE Spot Beam.", + "TWIST FOCUS: Adjust the beam shape—flood beam, spot beam, or anywhere in between—by twisting the bezel to focus the light.", + "DUAL POWER: Power your flashlight how it suits you best—with standard alkaline AAAs (included) or a COAST ZITHION-X ZX750 rechargeable battery (purchased separately) for added convenience and savings over time.", + "GRIP-TEXTURED HANDLE: Keep close control of your light with a firm grasp on the grip-textured handle.", + "IP67 WATERPROOF: Shine through just about anything—with a light that stands up to dust and is waterproof against full submersion down to a meter." + ], + "Label": "Features", + "Locale": "en_US" + }, + "ManufactureInfo": { + "ItemPartNumber": { + "DisplayValue": "30909", + "Label": "PartNumber", + "Locale": "en_US" + }, + "Model": { + "DisplayValue": "30909", + "Label": "Model", + "Locale": "en_US" + }, + "Warranty": { + "DisplayValue": "Coast warranties its coast knives, tools and coast led flashlights/headlamps to be free of defects in materials and workmanship for the life of the original purchaser. This warranty does not cover normal wear and tear, nor damage resulting from misuse or neglect. Warranty does not cover batteries and charging accessories (or damage caused by either). Batteries or damage caused by batteries (i. E. Leakage) not included in the guarantee. Warranty exchanges do not cover the cost of shipping and handling.", + "Label": "Warranty", + "Locale": "en_US" + } + }, + "ProductInfo": { + "Color": { + "DisplayValue": "Black", + "Label": "Color", + "Locale": "en_US" + }, + "ItemDimensions": { + "Height": { + "DisplayValue": 6.125, + "Label": "Height", + "Locale": "en_US", + "Unit": "inches" + }, + "Length": { + "DisplayValue": 1.5, + "Label": "Length", + "Locale": "en_US", + "Unit": "inches" + }, + "Weight": { + "DisplayValue": 0.374375, + "Label": "Weight", + "Locale": "en_US", + "Unit": "Pounds" + }, + "Width": { + "DisplayValue": 1.5, + "Label": "Width", + "Locale": "en_US", + "Unit": "inches" + } + }, + "UnitCount": { + "DisplayValue": 1, + "Label": "NumberOfItems", + "Locale": "en_US" + } + }, + "Title": { + "DisplayValue": "Coast GX20 1200 Lumen Waterproof Alkaline-Dual Power LED Flashlight with Twist Focus, Anti-Roll Cap and Textured Handle - Compatible with 4 x AAA Batteries (Included) or ZX750 Rechargeable Battery", + "Label": "Title", + "Locale": "en_US" + } + }, + "Offers": { + "Listings": [ + { + "Availability": { + "Message": "In Stock", + "MinOrderQuantity": 1, + "Type": "Now" + }, + "Condition": { + "SubCondition": { + "Value": "New" + }, + "Value": "New" + }, + "DeliveryInfo": { + "IsAmazonFulfilled": true, + "IsFreeShippingEligible": true, + "IsPrimeEligible": true + }, + "Id": "tKyp2Ar2%2BdW7Jip3nJxiasePDVRb2GVL5%2BvtQoyco%2FGrpwsPli%2Bv9nz3OrC73b%2FkqMs%2FpcPqgVbVlei05yPXg%2FIJ9fbLLyk1IwpYfsNoo68mwvZfsnwDdV9wU4xVoPnFQS2V92%2BokHnvy1i2xew4Uw%3D%3D", + "IsBuyBoxWinner": true, + "MerchantInfo": { + "FeedbackCount": 385, + "FeedbackRating": 4.68, + "Id": "ATVPDKIKX0DER", + "Name": "Amazon.com" + }, + "Price": { + "Amount": 19.99, + "Currency": "USD", + "DisplayAmount": "$19.99" + }, + "ProgramEligibility": { + "IsPrimeExclusive": false, + "IsPrimePantry": false + }, + "ViolatesMAP": false + } + ], + "Summaries": [ + { + "Condition": { + "Value": "Used" + }, + "HighestPrice": { + "Amount": 18.56, + "Currency": "USD", + "DisplayAmount": "$18.56" + }, + "LowestPrice": { + "Amount": 18, + "Currency": "USD", + "DisplayAmount": "$18.00" + }, + "OfferCount": 5 + }, + { + "Condition": { + "Value": "New" + }, + "HighestPrice": { + "Amount": 34.48, + "Currency": "USD", + "DisplayAmount": "$34.48" + }, + "LowestPrice": { + "Amount": 19.99, + "Currency": "USD", + "DisplayAmount": "$19.99" + }, + "OfferCount": 4 + } + ] + } + }, + { + "ASIN": "B005NXPVKS", + "BrowseNodeInfo": { + "BrowseNodes": [ + { + "Ancestor": { + "Ancestor": { + "Ancestor": { + "Ancestor": { + "ContextFreeName": "Tools & Home Improvement", + "DisplayName": "Tools & Home Improvement", + "Id": "228013" + }, + "ContextFreeName": "Home Improvement", + "DisplayName": "Categories", + "Id": "468240" + }, + "ContextFreeName": "Safety & Security", + "DisplayName": "Safety & Security", + "Id": "3180231" + }, + "ContextFreeName": "Flashlights", + "DisplayName": "Flashlights", + "Id": "3180261" + }, + "ContextFreeName": "Handheld Flashlights", + "DisplayName": "Handheld Flashlights", + "Id": "2445457011", + "IsRoot": false, + "SalesRank": 341 + } + ], + "WebsiteSalesRank": { + "SalesRank": 20650 + } + }, + "DetailPageURL": "https://www.amazon.com/dp/B005NXPVKS?tag=dashersupply-20&linkCode=osi&th=1&psc=1", + "Images": { + "Primary": { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41O-h+D7UDL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41O-h+D7UDL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41O-h+D7UDL._SL75_.jpg", + "Width": 75 + } + }, + "Variants": [ + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/51-sObWlVWL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/51-sObWlVWL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/51-sObWlVWL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/31ulPVkLcJL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/31ulPVkLcJL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/31ulPVkLcJL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41yIaCwB-uL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41yIaCwB-uL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41yIaCwB-uL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/31zEiV-fy0L._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/31zEiV-fy0L._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/31zEiV-fy0L._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/4170DS4AWOL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/4170DS4AWOL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/4170DS4AWOL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41QHDzUZGDL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41QHDzUZGDL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41QHDzUZGDL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41vQuXbKdrL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41vQuXbKdrL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41vQuXbKdrL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/51dg9CgXvEL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/51dg9CgXvEL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/51dg9CgXvEL._SL75_.jpg", + "Width": 75 + } + } + ] + }, + "ItemInfo": { + "ByLineInfo": { + "Brand": { + "DisplayValue": "Coast", + "Label": "Brand", + "Locale": "en_US" + }, + "Manufacturer": { + "DisplayValue": "Coast", + "Label": "Manufacturer", + "Locale": "en_US" + } + }, + "Classifications": { + "Binding": { + "DisplayValue": "Automotive", + "Label": "Binding", + "Locale": "en_US" + }, + "ProductGroup": { + "DisplayValue": "Tools", + "Label": "ProductGroup", + "Locale": "en_US" + } + }, + "ContentInfo": { + "Languages": { + "DisplayValues": [ + { + "DisplayValue": "English", + "Type": "Unknown" + } + ], + "Label": "Language", + "Locale": "en_US" + } + }, + "ExternalIds": { + "EANs": { + "DisplayValues": [ + "0015286192868", + "0015286192714", + "0015286216540", + "0015286196729" + ], + "Label": "EAN", + "Locale": "en_US" + }, + "UPCs": { + "DisplayValues": [ + "015286216540", + "015286192714", + "015286192868", + "015286196729" + ], + "Label": "UPC", + "Locale": "en_US" + } + }, + "Features": { + "DisplayValues": [ + "DUAL COLOR: White and Red beams all in one. Red light preserves night vision. Great for versatile work during the night and day.", + "BULLS-EYE SPOT BEAM OPTIC: Consists of an extremely bright, centered ‘hot spot’ and a very consistent transition halo to increase the effective viewing area.", + "SPECS: 315 lumen, 142 meter (465 ft.) beam distance and 1 hour 15 minute runtime. Tested and rated to ANSI/FL1 standards." + ], + "Label": "Features", + "Locale": "en_US" + }, + "ManufactureInfo": { + "ItemPartNumber": { + "DisplayValue": "PX20", + "Label": "PartNumber", + "Locale": "en_US" + }, + "Model": { + "DisplayValue": "19271", + "Label": "Model", + "Locale": "en_US" + }, + "Warranty": { + "DisplayValue": "Backed by coast's lifetime guarantee against defects in materials and workmanship.", + "Label": "Warranty", + "Locale": "en_US" + } + }, + "ProductInfo": { + "Color": { + "DisplayValue": "Black", + "Label": "Color", + "Locale": "en_US" + }, + "ItemDimensions": { + "Height": { + "DisplayValue": 0.46, + "Label": "Height", + "Locale": "en_US", + "Unit": "inches" + }, + "Length": { + "DisplayValue": 1.56, + "Label": "Length", + "Locale": "en_US", + "Unit": "inches" + }, + "Weight": { + "DisplayValue": 0.2, + "Label": "Weight", + "Locale": "en_US", + "Unit": "pounds" + }, + "Width": { + "DisplayValue": 0.4, + "Label": "Width", + "Locale": "en_US", + "Unit": "inches" + } + }, + "Size": { + "DisplayValue": "155 Lumens", + "Label": "Size", + "Locale": "en_US" + }, + "UnitCount": { + "DisplayValue": 1, + "Label": "NumberOfItems", + "Locale": "en_US" + } + }, + "Title": { + "DisplayValue": "COAST PX20 Dual Color 315 Lumen LED Flashlight", + "Label": "Title", + "Locale": "en_US" + } + }, + "Offers": { + "Listings": [ + { + "Availability": { + "Message": "In stock Usually ships within 2 to 3 days.", + "MinOrderQuantity": 1, + "Type": "Now" + }, + "Condition": { + "SubCondition": { + "Value": "New" + }, + "Value": "New" + }, + "DeliveryInfo": { + "IsAmazonFulfilled": false, + "IsFreeShippingEligible": false, + "IsPrimeEligible": false + }, + "Id": "tKyp2Ar2%2BdW7Jip3nJxiaiGkQX6m8NuaBRJcFKHm%2B5PoKob4ZLCjsv2KBA4zd8ldDvbWWEjPJxug7jRC%2FHy%2BbX4GZk%2FYKpVVX812H0FthYRikAoVR7WuuzEaRqtC3gg94RPOgW23pMuepYL3Osh7Dneup%2F8aUokVKB7zXeO3%2Bo%2Bs5X6aXvMLOUiQOx1B%2Fh%2Fo", + "IsBuyBoxWinner": true, + "MerchantInfo": { + "DefaultShippingCountry": "US", + "FeedbackCount": 505, + "FeedbackRating": 3.47, + "Id": "A2LA3R74TUKXEY", + "Name": "Tool Collection Technologies" + }, + "Price": { + "Amount": 24.24, + "Currency": "USD", + "DisplayAmount": "$24.24", + "Savings": { + "Amount": 12.03, + "Currency": "USD", + "DisplayAmount": "$12.03 (33%)", + "Percentage": 33 + } + }, + "ProgramEligibility": { + "IsPrimeExclusive": false, + "IsPrimePantry": false + }, + "SavingBasis": { + "Amount": 36.27, + "Currency": "USD", + "DisplayAmount": "$36.27", + "PriceType": "LIST_PRICE" + }, + "ViolatesMAP": false + } + ], + "Summaries": [ + { + "Condition": { + "Value": "Used" + }, + "HighestPrice": { + "Amount": 13.5, + "Currency": "USD", + "DisplayAmount": "$13.50" + }, + "LowestPrice": { + "Amount": 13.5, + "Currency": "USD", + "DisplayAmount": "$13.50" + }, + "OfferCount": 2 + }, + { + "Condition": { + "Value": "New" + }, + "HighestPrice": { + "Amount": 38.76, + "Currency": "USD", + "DisplayAmount": "$38.76" + }, + "LowestPrice": { + "Amount": 20.3, + "Currency": "USD", + "DisplayAmount": "$20.30" + }, + "OfferCount": 15 + } + ] + } + }, + { + "ASIN": "B0CF7X87TT", + "BrowseNodeInfo": { + "BrowseNodes": [ + { + "Ancestor": { + "Ancestor": { + "Ancestor": { + "Ancestor": { + "ContextFreeName": "Tools & Home Improvement", + "DisplayName": "Tools & Home Improvement", + "Id": "228013" + }, + "ContextFreeName": "Home Improvement", + "DisplayName": "Categories", + "Id": "468240" + }, + "ContextFreeName": "Safety & Security", + "DisplayName": "Safety & Security", + "Id": "3180231" + }, + "ContextFreeName": "Flashlights", + "DisplayName": "Flashlights", + "Id": "3180261" + }, + "ContextFreeName": "Handheld Flashlights", + "DisplayName": "Handheld Flashlights", + "Id": "2445457011", + "IsRoot": false, + "SalesRank": 214 + } + ], + "WebsiteSalesRank": { + "SalesRank": 11840 + } + }, + "DetailPageURL": "https://www.amazon.com/dp/B0CF7X87TT?tag=dashersupply-20&linkCode=osi&th=1&psc=1", + "Images": { + "Primary": { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/31Rvxyey1GL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/31Rvxyey1GL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/31Rvxyey1GL._SL75_.jpg", + "Width": 75 + } + }, + "Variants": [ + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41ELAl7LY1L._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41ELAl7LY1L._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41ELAl7LY1L._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/51zE4vuHyCL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/51zE4vuHyCL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/51zE4vuHyCL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/51smMQV+t7L._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/51smMQV+t7L._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/51smMQV+t7L._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/51kX2jqhQZL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/51kX2jqhQZL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/51kX2jqhQZL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/61T3sNN268L._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/61T3sNN268L._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/61T3sNN268L._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/51ln-fIKiAL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/51ln-fIKiAL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/51ln-fIKiAL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41j-nOmeFSL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41j-nOmeFSL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41j-nOmeFSL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41dJTHrCQFL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41dJTHrCQFL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41dJTHrCQFL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/31tALlIF8fL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/31tALlIF8fL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/31tALlIF8fL._SL75_.jpg", + "Width": 75 + } + } + ] + }, + "ItemInfo": { + "ByLineInfo": { + "Brand": { + "DisplayValue": "Coast", + "Label": "Brand", + "Locale": "en_US" + }, + "Manufacturer": { + "DisplayValue": "Coast", + "Label": "Manufacturer", + "Locale": "en_US" + } + }, + "Classifications": { + "Binding": { + "DisplayValue": "Tools & Home Improvement", + "Label": "Binding", + "Locale": "en_US" + }, + "ProductGroup": { + "DisplayValue": "Tools", + "Label": "ProductGroup", + "Locale": "en_US" + } + }, + "ExternalIds": { + "EANs": { + "DisplayValues": [ + "0015286309488" + ], + "Label": "EAN", + "Locale": "en_US" + }, + "UPCs": { + "DisplayValues": [ + "015286309488" + ], + "Label": "UPC", + "Locale": "en_US" + } + }, + "Features": { + "DisplayValues": [ + "Dual Optic System: Shine the right beam for the situation using separately controlled flood and spot beams.", + "Memory Mode: Set the SLAYER to jump right to your go-to beam choice using COAST Memory Mode to personalize the flashlight.", + "Removable Pocket Clip: Secure the flashlight into any pocket with the metal pocket clip, or remove the clip for an even more streamlined profile. Note: If pocket clip is removed, screws need to be reinstalled into the handle to maintain the IP Rating.", + "IP67 Dust Resistant and WATERPROOF: Shine through just about anything—with a light that stands up to dust and is waterproof against full submersion down to a meter.", + "Rechargeable: Rely on the integrated ZITHION rechargeable power system for strong performance and cost savings over time." + ], + "Label": "Features", + "Locale": "en_US" + }, + "ManufactureInfo": { + "ItemPartNumber": { + "DisplayValue": "30948", + "Label": "PartNumber", + "Locale": "en_US" + }, + "Model": { + "DisplayValue": "30948", + "Label": "Model", + "Locale": "en_US" + }, + "Warranty": { + "DisplayValue": "Coast warranties its coast knives, tools and coast led flashlights/headlamps to be free of defects in materials and workmanship for the life of the original purchaser. This warranty does not cover normal wear and tear, nor damage resulting from misuse or neglect. Warranty does not cover batteries and charging accessories (or damage caused by either). Batteries or damage caused by batteries (i. E. Leakage) not included in the guarantee. Warranty exchanges do not cover the cost of shipping and handling.", + "Label": "Warranty", + "Locale": "en_US" + } + }, + "ProductInfo": { + "Color": { + "DisplayValue": "Silver", + "Label": "Color", + "Locale": "en_US" + }, + "ItemDimensions": { + "Height": { + "DisplayValue": 5.43, + "Label": "Height", + "Locale": "en_US", + "Unit": "inches" + }, + "Length": { + "DisplayValue": 0.8, + "Label": "Length", + "Locale": "en_US", + "Unit": "inches" + }, + "Weight": { + "DisplayValue": 0.4629707502, + "Label": "Weight", + "Locale": "en_US", + "Unit": "Pounds" + }, + "Width": { + "DisplayValue": 1.1, + "Label": "Width", + "Locale": "en_US", + "Unit": "inches" + } + }, + "UnitCount": { + "DisplayValue": 1, + "Label": "NumberOfItems", + "Locale": "en_US" + } + }, + "Title": { + "DisplayValue": "Coast Slayer 1150 Lumen USB-C Rechargeable LED Flashlight with Spot/Flood, Memory Mode and Pocket Clip, Silver", + "Label": "Title", + "Locale": "en_US" + } + }, + "Offers": { + "Listings": [ + { + "Availability": { + "Message": "In Stock", + "MinOrderQuantity": 1, + "Type": "Now" + }, + "Condition": { + "SubCondition": { + "Value": "New" + }, + "Value": "New" + }, + "DeliveryInfo": { + "IsAmazonFulfilled": false, + "IsFreeShippingEligible": false, + "IsPrimeEligible": false + }, + "Id": "tKyp2Ar2%2BdW7Jip3nJxiarR4xrHIVVkGH85vRnZXIc5E4rdKFdtuoUPIlA%2BNsu6mJpybdh4UqwMj4lIE3jwqHU2cV085qf%2BJGkpVjnuabto8UyvEAvoitMUTQpWZU1HxkQeas%2BlFFv1UgtFV2Rwf6UnzFWE82%2BNTW69pJvFhF%2F8bub2CPcRkZQ%3D%3D", + "IsBuyBoxWinner": true, + "MerchantInfo": { + "DefaultShippingCountry": "US", + "FeedbackCount": 10, + "FeedbackRating": 5, + "Id": "A2IHSE1DQ96FE2", + "Name": "Palmetto Resellers LLC" + }, + "Price": { + "Amount": 62.59, + "Currency": "USD", + "DisplayAmount": "$62.59", + "Savings": { + "Amount": 9.6, + "Currency": "USD", + "DisplayAmount": "$9.60 (13%)", + "Percentage": 13 + } + }, + "ProgramEligibility": { + "IsPrimeExclusive": false, + "IsPrimePantry": false + }, + "SavingBasis": { + "Amount": 72.19, + "Currency": "USD", + "DisplayAmount": "$72.19", + "PriceType": "WAS_PRICE" + }, + "ViolatesMAP": false + } + ], + "Summaries": [ + { + "Condition": { + "Value": "Used" + }, + "HighestPrice": { + "Amount": 67.89, + "Currency": "USD", + "DisplayAmount": "$67.89" + }, + "LowestPrice": { + "Amount": 67.89, + "Currency": "USD", + "DisplayAmount": "$67.89" + }, + "OfferCount": 2 + }, + { + "Condition": { + "Value": "New" + }, + "HighestPrice": { + "Amount": 72.19, + "Currency": "USD", + "DisplayAmount": "$72.19" + }, + "LowestPrice": { + "Amount": 62.59, + "Currency": "USD", + "DisplayAmount": "$62.59" + }, + "OfferCount": 2 + } + ] + }, + "ParentASIN": "B0CV3X92ZT" + }, + { + "ASIN": "B00TNOSF3I", + "BrowseNodeInfo": { + "BrowseNodes": [ + { + "Ancestor": { + "Ancestor": { + "Ancestor": { + "Ancestor": { + "ContextFreeName": "Tools & Home Improvement", + "DisplayName": "Tools & Home Improvement", + "Id": "228013" + }, + "ContextFreeName": "Home Improvement", + "DisplayName": "Categories", + "Id": "468240" + }, + "ContextFreeName": "Safety & Security", + "DisplayName": "Safety & Security", + "Id": "3180231" + }, + "ContextFreeName": "Flashlights", + "DisplayName": "Flashlights", + "Id": "3180261" + }, + "ContextFreeName": "Handheld Flashlights", + "DisplayName": "Handheld Flashlights", + "Id": "2445457011", + "IsRoot": false, + "SalesRank": 726 + }, + { + "Ancestor": { + "Ancestor": { + "Ancestor": { + "Ancestor": { + "Ancestor": { + "Ancestor": { + "Ancestor": { + "ContextFreeName": "Tools & Home Improvement", + "DisplayName": "Tools & Home Improvement", + "Id": "228013" + }, + "ContextFreeName": "Arborist Merchandising Root", + "DisplayName": "Arborist Merchandising Root", + "Id": "119968134011" + }, + "ContextFreeName": "Self Service", + "DisplayName": "Self Service", + "Id": "2334101011" + }, + "ContextFreeName": "Special Features Stores", + "DisplayName": "Special Features Stores", + "Id": "2334163011" + }, + "ContextFreeName": "cc8b81c2-6916-4800-975c-a54eacb3a648_0", + "DisplayName": "cc8b81c2-6916-4800-975c-a54eacb3a648_0", + "Id": "119968135011" + }, + "ContextFreeName": "cc8b81c2-6916-4800-975c-a54eacb3a648_501", + "DisplayName": "cc8b81c2-6916-4800-975c-a54eacb3a648_501", + "Id": "119968197011" + }, + "ContextFreeName": "cc8b81c2-6916-4800-975c-a54eacb3a648_750502", + "DisplayName": "cc8b81c2-6916-4800-975c-a54eacb3a648_750502", + "Id": "119968335011" + }, + "ContextFreeName": "V4 Customers Keep It - 50%", + "DisplayName": "V4 Customers Keep It - 50%", + "Id": "20594438011", + "IsRoot": false + } + ], + "WebsiteSalesRank": { + "SalesRank": 48421 + } + }, + "DetailPageURL": "https://www.amazon.com/dp/B00TNOSF3I?tag=dashersupply-20&linkCode=osi&th=1&psc=1", + "Images": { + "Primary": { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/31ahtlt7lrL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/31ahtlt7lrL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/31ahtlt7lrL._SL75_.jpg", + "Width": 75 + } + }, + "Variants": [ + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/510d4IlFAPL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/510d4IlFAPL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/510d4IlFAPL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/51mWbNlY3HL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/51mWbNlY3HL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/51mWbNlY3HL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41549EBDhPL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41549EBDhPL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41549EBDhPL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/51MvkJWO+iL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/51MvkJWO+iL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/51MvkJWO+iL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41aYZ-BBWaL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41aYZ-BBWaL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41aYZ-BBWaL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/417JE7u-lAL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/417JE7u-lAL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/417JE7u-lAL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/410nUOlWo4L._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/410nUOlWo4L._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/410nUOlWo4L._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/31ePvSlmC+L._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/31ePvSlmC+L._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/31ePvSlmC+L._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/313RYLvolwL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/313RYLvolwL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/313RYLvolwL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/31UHiIQFUJL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/31UHiIQFUJL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/31UHiIQFUJL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/51ah2y-ptpL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/51ah2y-ptpL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/51ah2y-ptpL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/51dg9CgXvEL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/51dg9CgXvEL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/51dg9CgXvEL._SL75_.jpg", + "Width": 75 + } + } + ] + }, + "ItemInfo": { + "ByLineInfo": { + "Brand": { + "DisplayValue": "Coast", + "Label": "Brand", + "Locale": "en_US" + }, + "Contributors": [ + { + "Locale": "en_US", + "Name": "Coast", + "Role": "Designer", + "RoleType": "designer" + } + ], + "Manufacturer": { + "DisplayValue": "COAST PRODUCTS, INC.", + "Label": "Manufacturer", + "Locale": "en_US" + } + }, + "Classifications": { + "Binding": { + "DisplayValue": "Tools & Home Improvement", + "Label": "Binding", + "Locale": "en_US" + }, + "ProductGroup": { + "DisplayValue": "Home Improvement", + "Label": "ProductGroup", + "Locale": "en_US" + } + }, + "ExternalIds": { + "EANs": { + "DisplayValues": [ + "0015286208309", + "0015286207692", + "0015286207968" + ], + "Label": "EAN", + "Locale": "en_US" + }, + "UPCs": { + "DisplayValues": [ + "015286207692", + "015286207968", + "015286208309" + ], + "Label": "UPC", + "Locale": "en_US" + } + }, + "Features": { + "DisplayValues": [ + "PURE-BEAM FOCUSING WITH SLIDE FOCUS: Pack two powerful beams into one and seamlessly transition—with no halos or hot spots—between short and long-range viewing. COAST’s patented focusing technology adapts to your need", + "Two-way clip: store It away or shine It forward. The two-way clip enables gives you flexibility to stash the light in your pocket or clip it to the brim of your hat", + "Flexible power: Compatible with not only just standard alkaline AA, but with rechargeable NiMH or rechargeable Lithium 14500’s as well (NiMH & Lithium not included)", + "SPECS: Light Output 410 lumens. Beam Distance: 130 meters. Runtime: 3 hours. Tested and rated to ANSI/FL1 standards.", + "Tough & reliable: backed by the Coast Lifetime against defects in materials and workmanship. IPX4 rated design for water resistance and durable body for 1-meter drop protection" + ], + "Label": "Features", + "Locale": "en_US" + }, + "ManufactureInfo": { + "ItemPartNumber": { + "DisplayValue": "20769", + "Label": "PartNumber", + "Locale": "en_US" + }, + "Model": { + "DisplayValue": "GIDDS2-2496544", + "Label": "Model", + "Locale": "en_US" + }, + "Warranty": { + "DisplayValue": "N/a.", + "Label": "Warranty", + "Locale": "en_US" + } + }, + "ProductInfo": { + "Color": { + "DisplayValue": "Black", + "Label": "Color", + "Locale": "en_US" + }, + "IsAdultProduct": { + "DisplayValue": false, + "Label": "IsAdultProduct", + "Locale": "en_US" + }, + "ItemDimensions": { + "Height": { + "DisplayValue": 8.75, + "Label": "Height", + "Locale": "en_US", + "Unit": "inches" + }, + "Length": { + "DisplayValue": 5.25, + "Label": "Length", + "Locale": "en_US", + "Unit": "inches" + }, + "Weight": { + "DisplayValue": 0.24, + "Label": "Weight", + "Locale": "en_US", + "Unit": "Pounds" + }, + "Width": { + "DisplayValue": 8.63, + "Label": "Width", + "Locale": "en_US", + "Unit": "inches" + } + }, + "Size": { + "DisplayValue": "1-PACK", + "Label": "Size", + "Locale": "en_US" + }, + "UnitCount": { + "DisplayValue": 1, + "Label": "NumberOfItems", + "Locale": "en_US" + } + }, + "Title": { + "DisplayValue": "COAST HX5 410 Lumen LED Flashlight, Pure Beam Focusing, Slide Focus, Pocket Clip, Weatherproof, Pocket Sized, Battery Included, Black.", + "Label": "Title", + "Locale": "en_US" + } + }, + "Offers": { + "Listings": [ + { + "Availability": { + "Message": "In Stock", + "MinOrderQuantity": 1, + "Type": "Now" + }, + "Condition": { + "SubCondition": { + "Value": "New" + }, + "Value": "New" + }, + "DeliveryInfo": { + "IsAmazonFulfilled": true, + "IsFreeShippingEligible": true, + "IsPrimeEligible": true + }, + "Id": "tKyp2Ar2%2BdW7Jip3nJxiasv8L5TjepqfeADtFq%2FBwOCaZrzOOBUSUBpUmsk3tYrKh8DYD9HcKTKbb%2BM%2FhCF7czkbs3ctbkNkEDPDF%2BvHBfmrk8zZayF49r8OFmh809O%2FQbthIP%2BmvTpbqvi18yzDOQ%3D%3D", + "IsBuyBoxWinner": true, + "MerchantInfo": { + "FeedbackCount": 385, + "FeedbackRating": 4.68, + "Id": "ATVPDKIKX0DER", + "Name": "Amazon.com" + }, + "Price": { + "Amount": 25.31, + "Currency": "USD", + "DisplayAmount": "$25.31" + }, + "ProgramEligibility": { + "IsPrimeExclusive": false, + "IsPrimePantry": false + }, + "ViolatesMAP": false + } + ], + "Summaries": [ + { + "Condition": { + "Value": "New" + }, + "HighestPrice": { + "Amount": 39.39, + "Currency": "USD", + "DisplayAmount": "$39.39" + }, + "LowestPrice": { + "Amount": 23.94, + "Currency": "USD", + "DisplayAmount": "$23.94" + }, + "OfferCount": 25 + } + ] + } + }, + { + "ASIN": "B0CXYSCLV8", + "BrowseNodeInfo": { + "BrowseNodes": [ + { + "Ancestor": { + "Ancestor": { + "Ancestor": { + "Ancestor": { + "ContextFreeName": "Tools & Home Improvement", + "DisplayName": "Tools & Home Improvement", + "Id": "228013" + }, + "ContextFreeName": "Home Improvement", + "DisplayName": "Categories", + "Id": "468240" + }, + "ContextFreeName": "Safety & Security", + "DisplayName": "Safety & Security", + "Id": "3180231" + }, + "ContextFreeName": "Flashlights", + "DisplayName": "Flashlights", + "Id": "3180261" + }, + "ContextFreeName": "Handheld Flashlights", + "DisplayName": "Handheld Flashlights", + "Id": "2445457011", + "IsRoot": false, + "SalesRank": 1074 + } + ], + "WebsiteSalesRank": { + "SalesRank": 76416 + } + }, + "DetailPageURL": "https://www.amazon.com/dp/B0CXYSCLV8?tag=dashersupply-20&linkCode=osi&th=1&psc=1", + "Images": { + "Primary": { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/31XP6ybHzHL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/31XP6ybHzHL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/31XP6ybHzHL._SL75_.jpg", + "Width": 75 + } + }, + "Variants": [ + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/4105BN4O3uL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/4105BN4O3uL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/4105BN4O3uL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/51w1O96yA9L._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/51w1O96yA9L._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/51w1O96yA9L._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41qDWR2oRVL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41qDWR2oRVL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41qDWR2oRVL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41kQ5B92xNL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41kQ5B92xNL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41kQ5B92xNL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/512Xr-G6Z5L._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/512Xr-G6Z5L._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/512Xr-G6Z5L._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/51kx0LZ40PL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/51kx0LZ40PL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/51kx0LZ40PL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41Ql+IBmIaL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41Ql+IBmIaL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41Ql+IBmIaL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/31P1pyd5rgL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/31P1pyd5rgL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/31P1pyd5rgL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/51B+SkueW6L._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/51B+SkueW6L._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/51B+SkueW6L._SL75_.jpg", + "Width": 75 + } + } + ] + }, + "ItemInfo": { + "ByLineInfo": { + "Brand": { + "DisplayValue": "Coast", + "Label": "Brand", + "Locale": "en_US" + }, + "Manufacturer": { + "DisplayValue": "Coast", + "Label": "Manufacturer", + "Locale": "en_US" + } + }, + "Classifications": { + "Binding": { + "DisplayValue": "Tools & Home Improvement", + "Label": "Binding", + "Locale": "en_US" + }, + "ProductGroup": { + "DisplayValue": "Tools", + "Label": "ProductGroup", + "Locale": "en_US" + } + }, + "ExternalIds": { + "EANs": { + "DisplayValues": [ + "0015286310309" + ], + "Label": "EAN", + "Locale": "en_US" + }, + "UPCs": { + "DisplayValues": [ + "015286310309" + ], + "Label": "UPC", + "Locale": "en_US" + } + }, + "Features": { + "DisplayValues": [ + "DUAL OPTIC LIGHTING: Choose from two light sources—flood beam or spot beam—or shine them together for more power.", + "GRIP-TEXTURED HANDLE: Keep close control of your light with a firm grip on the textured handle.", + "REVERSIBLE POCKET CLIP: Securely stow the flashlight when not in use, or attach the clip at the opposite end of the handle to use it as a hands-free mount.", + "DUAL POWER: Power your flashlight how it suits you best—with standard alkaline AAs (included) or a COAST ZITHION-X ZX850 rechargeable battery (purchased separately) for added convenience and savings over time.", + "BACKED BY COAST LIFETIME WARRANTY: Take confidence in your product knowing it is backed by COAST’s total commitment to quality and Lifetime Warranty program." + ], + "Label": "Features", + "Locale": "en_US" + }, + "ManufactureInfo": { + "ItemPartNumber": { + "DisplayValue": "31030", + "Label": "PartNumber", + "Locale": "en_US" + }, + "Model": { + "DisplayValue": "31030", + "Label": "Model", + "Locale": "en_US" + }, + "Warranty": { + "DisplayValue": "Lifetime.", + "Label": "Warranty", + "Locale": "en_US" + } + }, + "ProductInfo": { + "Color": { + "DisplayValue": "Black", + "Label": "Color", + "Locale": "en_US" + }, + "ItemDimensions": { + "Height": { + "DisplayValue": 1.18, + "Label": "Height", + "Locale": "en_US", + "Unit": "Inches" + }, + "Length": { + "DisplayValue": 4.72, + "Label": "Length", + "Locale": "en_US", + "Unit": "Inches" + }, + "Width": { + "DisplayValue": 1.18, + "Label": "Width", + "Locale": "en_US", + "Unit": "Inches" + } + }, + "UnitCount": { + "DisplayValue": 1, + "Label": "NumberOfItems", + "Locale": "en_US" + } + }, + "Title": { + "DisplayValue": "Coast PX9R Rechargeable LED Flashlight with Dual Optic Lighting, Pocket Clip and Grip-Textured Handle, 1000 Lumens", + "Label": "Title", + "Locale": "en_US" + } + }, + "Offers": { + "Listings": [ + { + "Availability": { + "MaxOrderQuantity": 27, + "Message": "In Stock", + "MinOrderQuantity": 1, + "Type": "Now" + }, + "Condition": { + "SubCondition": { + "Value": "New" + }, + "Value": "New" + }, + "DeliveryInfo": { + "IsAmazonFulfilled": true, + "IsFreeShippingEligible": true, + "IsPrimeEligible": true + }, + "Id": "tKyp2Ar2%2BdW7Jip3nJxiasy3tUiIBXq5CUu5q%2FMCafOErRT9BqzAx7g6WHOmKS5f7UKpx9lmKnYDzqqHMz2MltJTyULVkZiQ3hg5nz15EI0cdb%2BgF4%2BVldupOKeVN36lgLeA3lMRnSf8SY1c29KvLQ%3D%3D", + "IsBuyBoxWinner": true, + "MerchantInfo": { + "FeedbackCount": 385, + "FeedbackRating": 4.68, + "Id": "ATVPDKIKX0DER", + "Name": "Amazon.com" + }, + "Price": { + "Amount": 34, + "Currency": "USD", + "DisplayAmount": "$34.00", + "Savings": { + "Amount": 5.99, + "Currency": "USD", + "DisplayAmount": "$5.99 (15%)", + "Percentage": 15 + } + }, + "ProgramEligibility": { + "IsPrimeExclusive": false, + "IsPrimePantry": false + }, + "SavingBasis": { + "Amount": 39.99, + "Currency": "USD", + "DisplayAmount": "$39.99", + "PriceType": "LIST_PRICE" + }, + "ViolatesMAP": false + } + ], + "Summaries": [ + { + "Condition": { + "Value": "New" + }, + "HighestPrice": { + "Amount": 34, + "Currency": "USD", + "DisplayAmount": "$34.00" + }, + "LowestPrice": { + "Amount": 34, + "Currency": "USD", + "DisplayAmount": "$34.00" + }, + "OfferCount": 1 + } + ] + } + } + ], + "SearchRefinements": { + "SearchIndex": { + "Bins": [ + { + "DisplayName": "Sports & Outdoors", + "Id": "SportsAndOutdoors" + }, + { + "DisplayName": "Tools & Home Improvement", + "Id": "ToolsAndHomeImprovement" + }, + { + "DisplayName": "Health, Household & Baby Care", + "Id": "HealthPersonalCare" + }, + { + "DisplayName": "Industrial & Scientific", + "Id": "Industrial" + }, + { + "DisplayName": "Automotive Parts & Accessories", + "Id": "Automotive" + }, + { + "DisplayName": "Electronics", + "Id": "Electronics" + }, + { + "DisplayName": "Office Products", + "Id": "OfficeProducts" + } + ], + "DisplayName": "Department", + "Id": "SearchIndex" + } + }, + "SearchURL": "https://www.amazon.com/s?k=flashlight&rh=p_n_availability%3A-1%2Cp_lbr_brands_browse-bin%3ACOAST&tag=dashersupply-20&linkCode=osi", + "TotalResultCount": 181 + } + } \ No newline at end of file diff --git a/src/data/brands/coast.ts b/src/old-data/brands/coast.ts similarity index 81% rename from src/data/brands/coast.ts rename to src/old-data/brands/coast.ts index a4135b1..678cd13 100644 --- a/src/data/brands/coast.ts +++ b/src/old-data/brands/coast.ts @@ -1,8 +1,41 @@ import { type Product } from '../products/product'; import { getCategoryIdForSlug } from '../categories'; +import slugify from 'slugify'; export const BRAND_STORE_SLUG = 'coast'; +import jsonSearchResults from './coast-query-response.json'; +import { type SearchItemsResponse } from 'amazon-pa-api5-node-ts'; +let parsedResults = jsonSearchResults!.SearchResult.Items.map((value) => { + let product: Product = { + categoryId: getCategoryIdForSlug('safety-equipment')!, + name: value.ItemInfo!.Title!.DisplayValue!, + title: value.ItemInfo!.Title!.DisplayValue!, + slug: slugify(value.ItemInfo!.Title!.DisplayValue!, { + replacement: '-', + remove: undefined, + lower: true, + strict: true, + locale: 'en', + trim: true, + }), + tags: ['flashlight', 'safety'], + amazonLink: value.DetailPageURL!, + amazonProductDetails: { + featureBullets: value.ItemInfo!.Features!.DisplayValues!, + imageUrls: [ + value.Images!.Primary!.Large!.URL!, + ...value.Images!.Variants!.map((image) => image.Large.URL) + ], + price: value.Offers!.Listings![0].Price!.Amount!, + }, + ASIN: value.ASIN!, + brandStoreSlug: BRAND_STORE_SLUG, + callout: `House numbers can be tricky to locate late in the evening.` + }; + return product; +}) + export const CoastStoreProducts: Product[] = [ { slug: 'coast-polysteel-600-led-flashlight', @@ -38,7 +71,7 @@ Whether you're navigating through dark alleys, driveways, signaling for help, or the COAST Polysteel 600 LED Flashlight has got your back. Its durable design and rechargeable options make it a reliable companion for delivery drivers like you. `.trim(), - amazonProductId: 'B00SJRDIN2', + ASIN: 'B00SJRDIN2', amazonLink: 'https://www.amazon.com/Polysteel-600-Waterproof-Flashlight-Stainless/dp/B00SJRDIN2?crid=29BV6TGKIV7U4&dib=eyJ2IjoiMSJ9.z_qqGdUikpKLO62rjeDuDoQDki7kToAVTM2kBLri4vs25y739Ll_nFVMziV7A5ZnYGQQYNujGdg5igViybnULLsVCa_T6qCk9HUVk7GuD30Jp0FrydoVV9zm-m-E9Zhi7vGbjJdDxUmYXypCL_GaGT6O6K4gf2P94QITVfbbBrjNT74VL9ZdRfs9ucPUSjkoTNLCMXcAXf4fXnJqniXk4PyFks_YYcZ9K8IDN4Fp-puEBc5lhdIp2hY4ugsmMD2v9zYNTvaTD1EaAnXVA_UXIrGwSTdg3Q2cWoqWF6sw6mo.z0JvreFTZ58D14a2IuwCSDybpR9x_CTUBSRrNlP9aZs&dib_tag=se&keywords=coast+flash+light&qid=1720695258&s=sporting-goods&sprefix=coast+flash+light%2Csporting%2C83&sr=1-27&linkCode=ll1&tag=dashersupply-20&linkId=9cfd6086ba43fac649f6884f72c7c844&language=en_US&ref_=as_li_ss_tl', amazonProductDetails: { "title": "COAST POLYSTEEL 600 1000 Lumen LED Flashlight with Pure Beam Twist Focus, Stainless-Steel Core, Crushproof, Black", @@ -86,5 +119,6 @@ delivery drivers like you. } ] } - } + }, + ...parsedResults ]; \ No newline at end of file diff --git a/src/old-data/brands/first-aid-only-example-query-getitems.ts b/src/old-data/brands/first-aid-only-example-query-getitems.ts new file mode 100644 index 0000000..23e6eb2 --- /dev/null +++ b/src/old-data/brands/first-aid-only-example-query-getitems.ts @@ -0,0 +1,575 @@ +import type { GetItemsResponse } from "amazon-pa-api5-node-ts"; + +/* ********** Signed Request ********** */ +export const signedRequest = `https://webservices.amazon.com/!YW16LTEuMDtjb20uYW1hem9uLnBhYXBpNS52MS5Qcm9kdWN0QWR2ZXJ0aXNpbmdBUEl2MS5HZXRJdGVtczt7CiAgICAiSXRlbUlkcyI6IFsKICAgICAgICAiQjAwMVNHNzZNVSIKICAgIF0sCiAgICAiUmVzb3VyY2VzIjogWwogICAgICAgICJCcm93c2VOb2RlSW5mby5Ccm93c2VOb2RlcyIsCiAgICAgICAgIkJyb3dzZU5vZGVJbmZvLkJyb3dzZU5vZGVzLkFuY2VzdG9yIiwKICAgICAgICAiQnJvd3NlTm9kZUluZm8uQnJvd3NlTm9kZXMuU2FsZXNSYW5rIiwKICAgICAgICAiQnJvd3NlTm9kZUluZm8uV2Vic2l0ZVNhbGVzUmFuayIsCiAgICAgICAgIkN1c3RvbWVyUmV2aWV3cy5Db3VudCIsCiAgICAgICAgIkN1c3RvbWVyUmV2aWV3cy5TdGFyUmF0aW5nIiwKICAgICAgICAiSW1hZ2VzLlByaW1hcnkuU21hbGwiLAogICAgICAgICJJbWFnZXMuUHJpbWFyeS5NZWRpdW0iLAogICAgICAgICJJbWFnZXMuUHJpbWFyeS5MYXJnZSIsCiAgICAgICAgIkltYWdlcy5QcmltYXJ5LkhpZ2hSZXMiLAogICAgICAgICJJbWFnZXMuVmFyaWFudHMuU21hbGwiLAogICAgICAgICJJbWFnZXMuVmFyaWFudHMuTWVkaXVtIiwKICAgICAgICAiSW1hZ2VzLlZhcmlhbnRzLkxhcmdlIiwKICAgICAgICAiSW1hZ2VzLlZhcmlhbnRzLkhpZ2hSZXMiLAogICAgICAgICJJdGVtSW5mby5CeUxpbmVJbmZvIiwKICAgICAgICAiSXRlbUluZm8uQ29udGVudEluZm8iLAogICAgICAgICJJdGVtSW5mby5Db250ZW50UmF0aW5nIiwKICAgICAgICAiSXRlbUluZm8uQ2xhc3NpZmljYXRpb25zIiwKICAgICAgICAiSXRlbUluZm8uRXh0ZXJuYWxJZHMiLAogICAgICAgICJJdGVtSW5mby5GZWF0dXJlcyIsCiAgICAgICAgIkl0ZW1JbmZvLk1hbnVmYWN0dXJlSW5mbyIsCiAgICAgICAgIkl0ZW1JbmZvLlByb2R1Y3RJbmZvIiwKICAgICAgICAiSXRlbUluZm8uVGVjaG5pY2FsSW5mbyIsCiAgICAgICAgIkl0ZW1JbmZvLlRpdGxlIiwKICAgICAgICAiSXRlbUluZm8uVHJhZGVJbkluZm8iLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuQXZhaWxhYmlsaXR5Lk1heE9yZGVyUXVhbnRpdHkiLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuQXZhaWxhYmlsaXR5Lk1lc3NhZ2UiLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuQXZhaWxhYmlsaXR5Lk1pbk9yZGVyUXVhbnRpdHkiLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuQXZhaWxhYmlsaXR5LlR5cGUiLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuQ29uZGl0aW9uIiwKICAgICAgICAiT2ZmZXJzLkxpc3RpbmdzLkNvbmRpdGlvbi5Db25kaXRpb25Ob3RlIiwKICAgICAgICAiT2ZmZXJzLkxpc3RpbmdzLkNvbmRpdGlvbi5TdWJDb25kaXRpb24iLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuRGVsaXZlcnlJbmZvLklzQW1hem9uRnVsZmlsbGVkIiwKICAgICAgICAiT2ZmZXJzLkxpc3RpbmdzLkRlbGl2ZXJ5SW5mby5Jc0ZyZWVTaGlwcGluZ0VsaWdpYmxlIiwKICAgICAgICAiT2ZmZXJzLkxpc3RpbmdzLkRlbGl2ZXJ5SW5mby5Jc1ByaW1lRWxpZ2libGUiLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuRGVsaXZlcnlJbmZvLlNoaXBwaW5nQ2hhcmdlcyIsCiAgICAgICAgIk9mZmVycy5MaXN0aW5ncy5Jc0J1eUJveFdpbm5lciIsCiAgICAgICAgIk9mZmVycy5MaXN0aW5ncy5Mb3lhbHR5UG9pbnRzLlBvaW50cyIsCiAgICAgICAgIk9mZmVycy5MaXN0aW5ncy5NZXJjaGFudEluZm8iLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuUHJpY2UiLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuUHJvZ3JhbUVsaWdpYmlsaXR5LklzUHJpbWVFeGNsdXNpdmUiLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuUHJvZ3JhbUVsaWdpYmlsaXR5LklzUHJpbWVQYW50cnkiLAogICAgICAgICJPZmZlcnMuTGlzdGluZ3MuUHJvbW90aW9ucyIsCiAgICAgICAgIk9mZmVycy5MaXN0aW5ncy5TYXZpbmdCYXNpcyIsCiAgICAgICAgIk9mZmVycy5TdW1tYXJpZXMuSGlnaGVzdFByaWNlIiwKICAgICAgICAiT2ZmZXJzLlN1bW1hcmllcy5Mb3dlc3RQcmljZSIsCiAgICAgICAgIk9mZmVycy5TdW1tYXJpZXMuT2ZmZXJDb3VudCIsCiAgICAgICAgIlBhcmVudEFTSU4iLAogICAgICAgICJSZW50YWxPZmZlcnMuTGlzdGluZ3MuQXZhaWxhYmlsaXR5Lk1heE9yZGVyUXVhbnRpdHkiLAogICAgICAgICJSZW50YWxPZmZlcnMuTGlzdGluZ3MuQXZhaWxhYmlsaXR5Lk1lc3NhZ2UiLAogICAgICAgICJSZW50YWxPZmZlcnMuTGlzdGluZ3MuQXZhaWxhYmlsaXR5Lk1pbk9yZGVyUXVhbnRpdHkiLAogICAgICAgICJSZW50YWxPZmZlcnMuTGlzdGluZ3MuQXZhaWxhYmlsaXR5LlR5cGUiLAogICAgICAgICJSZW50YWxPZmZlcnMuTGlzdGluZ3MuQmFzZVByaWNlIiwKICAgICAgICAiUmVudGFsT2ZmZXJzLkxpc3RpbmdzLkNvbmRpdGlvbiIsCiAgICAgICAgIlJlbnRhbE9mZmVycy5MaXN0aW5ncy5Db25kaXRpb24uQ29uZGl0aW9uTm90ZSIsCiAgICAgICAgIlJlbnRhbE9mZmVycy5MaXN0aW5ncy5Db25kaXRpb24uU3ViQ29uZGl0aW9uIiwKICAgICAgICAiUmVudGFsT2ZmZXJzLkxpc3RpbmdzLkRlbGl2ZXJ5SW5mby5Jc0FtYXpvbkZ1bGZpbGxlZCIsCiAgICAgICAgIlJlbnRhbE9mZmVycy5MaXN0aW5ncy5EZWxpdmVyeUluZm8uSXNGcmVlU2hpcHBpbmdFbGlnaWJsZSIsCiAgICAgICAgIlJlbnRhbE9mZmVycy5MaXN0aW5ncy5EZWxpdmVyeUluZm8uSXNQcmltZUVsaWdpYmxlIiwKICAgICAgICAiUmVudGFsT2ZmZXJzLkxpc3RpbmdzLkRlbGl2ZXJ5SW5mby5TaGlwcGluZ0NoYXJnZXMiLAogICAgICAgICJSZW50YWxPZmZlcnMuTGlzdGluZ3MuTWVyY2hhbnRJbmZvIgogICAgXSwKICAgICJQYXJ0bmVyVGFnIjogImRhc2hlcnN1cHBseS0yMCIsCiAgICAiUGFydG5lclR5cGUiOiAiQXNzb2NpYXRlcyIsCiAgICAiTWFya2V0cGxhY2UiOiAid3d3LmFtYXpvbi5jb20iCn0=`; + +/* ********** Payload ********** */ +export const payload = { + "ItemIds": [ + "B001SG76MU" + ], + "Resources": [ + "BrowseNodeInfo.BrowseNodes", + "BrowseNodeInfo.BrowseNodes.Ancestor", + "BrowseNodeInfo.BrowseNodes.SalesRank", + "BrowseNodeInfo.WebsiteSalesRank", + "CustomerReviews.Count", + "CustomerReviews.StarRating", + "Images.Primary.Small", + "Images.Primary.Medium", + "Images.Primary.Large", + "Images.Primary.HighRes", + "Images.Variants.Small", + "Images.Variants.Medium", + "Images.Variants.Large", + "Images.Variants.HighRes", + "ItemInfo.ByLineInfo", + "ItemInfo.ContentInfo", + "ItemInfo.ContentRating", + "ItemInfo.Classifications", + "ItemInfo.ExternalIds", + "ItemInfo.Features", + "ItemInfo.ManufactureInfo", + "ItemInfo.ProductInfo", + "ItemInfo.TechnicalInfo", + "ItemInfo.Title", + "ItemInfo.TradeInInfo", + "Offers.Listings.Availability.MaxOrderQuantity", + "Offers.Listings.Availability.Message", + "Offers.Listings.Availability.MinOrderQuantity", + "Offers.Listings.Availability.Type", + "Offers.Listings.Condition", + "Offers.Listings.Condition.ConditionNote", + "Offers.Listings.Condition.SubCondition", + "Offers.Listings.DeliveryInfo.IsAmazonFulfilled", + "Offers.Listings.DeliveryInfo.IsFreeShippingEligible", + "Offers.Listings.DeliveryInfo.IsPrimeEligible", + "Offers.Listings.DeliveryInfo.ShippingCharges", + "Offers.Listings.IsBuyBoxWinner", + "Offers.Listings.LoyaltyPoints.Points", + "Offers.Listings.MerchantInfo", + "Offers.Listings.Price", + "Offers.Listings.ProgramEligibility.IsPrimeExclusive", + "Offers.Listings.ProgramEligibility.IsPrimePantry", + "Offers.Listings.Promotions", + "Offers.Listings.SavingBasis", + "Offers.Summaries.HighestPrice", + "Offers.Summaries.LowestPrice", + "Offers.Summaries.OfferCount", + "ParentASIN", + "RentalOffers.Listings.Availability.MaxOrderQuantity", + "RentalOffers.Listings.Availability.Message", + "RentalOffers.Listings.Availability.MinOrderQuantity", + "RentalOffers.Listings.Availability.Type", + "RentalOffers.Listings.BasePrice", + "RentalOffers.Listings.Condition", + "RentalOffers.Listings.Condition.ConditionNote", + "RentalOffers.Listings.Condition.SubCondition", + "RentalOffers.Listings.DeliveryInfo.IsAmazonFulfilled", + "RentalOffers.Listings.DeliveryInfo.IsFreeShippingEligible", + "RentalOffers.Listings.DeliveryInfo.IsPrimeEligible", + "RentalOffers.Listings.DeliveryInfo.ShippingCharges", + "RentalOffers.Listings.MerchantInfo" + ], + "PartnerTag": "dashersupply-20", + "PartnerType": "Associates", + "Marketplace": "www.amazon.com", + "Operation": "GetItems" +}; + +/* ********** Response ********** */ +export const response: GetItemsResponse = { + "ItemsResult": { + "Items": [ + { + "ASIN": "B001SG76MU", + "BrowseNodeInfo": { + "BrowseNodes": [ + { + "Ancestor": { + "Ancestor": { + "Ancestor": { + "Ancestor": { + "Ancestor": { + "ContextFreeName": "Sports & Outdoors", + "DisplayName": "Sports & Outdoors", + "Id": "3375251" + }, + "ContextFreeName": "Sports & Outdoors", + "DisplayName": "Categories", + "Id": "3375301" + }, + "ContextFreeName": "Outdoor Recreation", + "DisplayName": "Outdoor Recreation", + "Id": "706814011" + }, + "ContextFreeName": "Camping & Hiking Equipment", + "DisplayName": "Camping & Hiking", + "Id": "3400371" + }, + "ContextFreeName": "Camping Safety & Survival Equipment", + "DisplayName": "Safety & Survival", + "Id": "3401081" + }, + "ContextFreeName": "Camping First Aid Kits", + "DisplayName": "First Aid Kits", + "Id": "3401101", + "IsRoot": false, + "SalesRank": 7 + }, + { + "Ancestor": { + "Ancestor": { + "Ancestor": { + "Ancestor": { + "Ancestor": { + "Ancestor": { + "ContextFreeName": "Health & Household", + "DisplayName": "Health & Household", + "Id": "3760901" + }, + "ContextFreeName": "Arborist Merchandising Root", + "DisplayName": "Arborist Merchandising Root", + "Id": "119756821011" + }, + "ContextFreeName": "Self Service", + "DisplayName": "Self Service", + "Id": "2334097011" + }, + "ContextFreeName": "Special Features Stores", + "DisplayName": "Special Features Stores", + "Id": "2334159011" + }, + "ContextFreeName": "ab47f18a-1a7a-4dbe-b89a-001bfaccbe8b_0", + "DisplayName": "ab47f18a-1a7a-4dbe-b89a-001bfaccbe8b_0", + "Id": "119756826011" + }, + "ContextFreeName": "ab47f18a-1a7a-4dbe-b89a-001bfaccbe8b_901", + "DisplayName": "ab47f18a-1a7a-4dbe-b89a-001bfaccbe8b_901", + "Id": "119757260011" + }, + "ContextFreeName": "All First Aid", + "DisplayName": "All First Aid", + "Id": "24423742011", + "IsRoot": false + } + ], + "WebsiteSalesRank": { + "SalesRank": 2662 + } + }, + "DetailPageURL": "https://www.amazon.com/dp/B001SG76MU?tag=dashersupply-20&linkCode=ogi&th=1&psc=1", + "Images": { + "Primary": { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/413sfboF0mL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/413sfboF0mL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/413sfboF0mL._SL75_.jpg", + "Width": 75 + } + }, + "Variants": [ + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/51PHxfhu09L._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/51PHxfhu09L._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/51PHxfhu09L._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41DrWanEf2L._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41DrWanEf2L._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41DrWanEf2L._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/51vA72L9CkL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/51vA72L9CkL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/51vA72L9CkL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41UoP-S+XuL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41UoP-S+XuL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41UoP-S+XuL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/51XP7Me5+IL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/51XP7Me5+IL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/51XP7Me5+IL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/51+kXOErgOL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/51+kXOErgOL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/51+kXOErgOL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/41rLINs+hGL._SL500_.jpg", + "Width": 499 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/41rLINs+hGL._SL160_.jpg", + "Width": 159 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/41rLINs+hGL._SL75_.jpg", + "Width": 74 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/31ZSaHsFmTL._SL500_.jpg", + "Width": 499 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/31ZSaHsFmTL._SL160_.jpg", + "Width": 159 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/31ZSaHsFmTL._SL75_.jpg", + "Width": 74 + } + }, + { + "Large": { + "Height": 500, + "URL": "https://m.media-amazon.com/images/I/31-tEgCUzPL._SL500_.jpg", + "Width": 499 + }, + "Medium": { + "Height": 160, + "URL": "https://m.media-amazon.com/images/I/31-tEgCUzPL._SL160_.jpg", + "Width": 159 + }, + "Small": { + "Height": 75, + "URL": "https://m.media-amazon.com/images/I/31-tEgCUzPL._SL75_.jpg", + "Width": 74 + } + }, + { + "Large": { + "Height": 375, + "URL": "https://m.media-amazon.com/images/I/41Rw5lXzcWL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 120, + "URL": "https://m.media-amazon.com/images/I/41Rw5lXzcWL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 56, + "URL": "https://m.media-amazon.com/images/I/41Rw5lXzcWL._SL75_.jpg", + "Width": 75 + } + }, + { + "Large": { + "Height": 375, + "URL": "https://m.media-amazon.com/images/I/41DHqh2WnqL._SL500_.jpg", + "Width": 500 + }, + "Medium": { + "Height": 120, + "URL": "https://m.media-amazon.com/images/I/41DHqh2WnqL._SL160_.jpg", + "Width": 160 + }, + "Small": { + "Height": 56, + "URL": "https://m.media-amazon.com/images/I/41DHqh2WnqL._SL75_.jpg", + "Width": 75 + } + } + ] + }, + "ItemInfo": { + "ByLineInfo": { + "Brand": { + "DisplayValue": "First Aid Only", + "Label": "Brand", + "Locale": "en_US" + }, + "Manufacturer": { + "DisplayValue": "Acme United", + "Label": "Manufacturer", + "Locale": "en_US" + } + }, + "Classifications": { + "Binding": { + "DisplayValue": "Misc.", + "Label": "Binding", + "Locale": "en_US" + }, + "ProductGroup": { + "DisplayValue": "BISS", + "Label": "ProductGroup", + "Locale": "en_US" + } + }, + "ContentInfo": { + "PublicationDate": { + "DisplayValue": "2018-01-01T00:00:01Z", + "Label": "PublicationDate", + "Locale": "en_US" + } + }, + "ExternalIds": { + "EANs": { + "DisplayValues": [ + "0738743060608" + ], + "Label": "EAN", + "Locale": "en_US" + }, + "UPCs": { + "DisplayValues": [ + "738743060608" + ], + "Label": "UPC", + "Locale": "en_US" + } + }, + "Features": { + "DisplayValues": [ + "Comprehensive Emergency Kit: Includes adhesive fabric and plastic bandages, antibiotic ointments, BZK antiseptic towelettes, burn cream packets, gauze roll and pads, gloves, scissors, tweezers, and other multi-use first aid items", + "Convenient Packaging: An ideal worksite or office first aid kit, it features a durable plastic case complete with an easy-to-carry handle for transporting first aid supplies in an emergency", + "Easy Access: This convenient and versatile home, office, and jobsite first aid kit features individual compartments that make accessing first aid supplies quick and easy", + "Compact Size: Small enough to fit nicely into a backpack, vehicle compartment, or desk drawer, this travel-size first aid kit helps you stay prepared for potential emergencies when at home, in the office, or while on the go", + "Personal and Professional First Aid Solutions: First Aid Only offers a full line of first aid kits, cabinets, and stations, Emergency Response Care, individual first aid products, Spill Clean Up kits, CPR care and more" + ], + "Label": "Features", + "Locale": "en_US" + }, + "ManufactureInfo": { + "ItemPartNumber": { + "DisplayValue": "6060", + "Label": "PartNumber", + "Locale": "en_US" + }, + "Model": { + "DisplayValue": "6060", + "Label": "Model", + "Locale": "en_US" + }, + "Warranty": { + "DisplayValue": "Manufacturer", + "Label": "Warranty", + "Locale": "en_US" + } + }, + "ProductInfo": { + "Color": { + "DisplayValue": "White", + "Label": "Color", + "Locale": "en_US" + }, + "IsAdultProduct": { + "DisplayValue": false, + "Label": "IsAdultProduct", + "Locale": "en_US" + }, + "ItemDimensions": { + "Height": { + "DisplayValue": 8, + "Label": "Height", + "Locale": "en_US", + "Unit": "inches" + }, + "Length": { + "DisplayValue": 5, + "Label": "Length", + "Locale": "en_US", + "Unit": "inches" + }, + "Weight": { + "DisplayValue": 0.8, + "Label": "Weight", + "Locale": "en_US", + "Unit": "Pounds" + }, + "Width": { + "DisplayValue": 3, + "Label": "Width", + "Locale": "en_US", + "Unit": "inches" + } + }, + "ReleaseDate": { + "DisplayValue": "2018-01-01T00:00:01Z", + "Label": "ReleaseDate", + "Locale": "en_US" + }, + "Size": { + "DisplayValue": "57 Piece", + "Label": "Size", + "Locale": "en_US" + }, + "UnitCount": { + "DisplayValue": 1, + "Label": "NumberOfItems", + "Locale": "en_US" + } + }, + "Title": { + "DisplayValue": "First Aid Only 6060 10-Person Emergency First Aid Kit for Office, Home, and Worksites, 57 Pieces", + "Label": "Title", + "Locale": "en_US" + } + }, + "Offers": { + "Listings": [ + { + "Availability": { + "Message": "In Stock", + "MinOrderQuantity": 1, + "Type": "Now" + }, + "Condition": { + "SubCondition": { + "Value": "New" + }, + "Value": "New" + }, + "DeliveryInfo": { + "IsAmazonFulfilled": true, + "IsFreeShippingEligible": true, + "IsPrimeEligible": true + }, + "Id": "EeHLy5pUHgzNO7xwG3nGTlyXMscRGCy2TkNM4pN2zPDPyzqCHeou9sueJCz7yOWjlAzQzm28WmVretpxwqlrl1IKry0MFoLOO%2BE6pQSH0spbDH6jSs1bzJVbX8F4W%2BB2zzpLvoo9DOIAzEdoHHYzHA%3D%3D", + "IsBuyBoxWinner": true, + "MerchantInfo": { + "FeedbackCount": 385, + "FeedbackRating": 4.68, + "Id": "ATVPDKIKX0DER", + "Name": "Amazon.com" + }, + "Price": { + "Amount": 20.99, + "Currency": "USD", + "DisplayAmount": "$20.99" + }, + "ProgramEligibility": { + "IsPrimeExclusive": false, + "IsPrimePantry": false + }, + "Promotions": [ + { + "Amount": 20.99, + "Currency": "USD", + "DiscountPercent": 0, + "DisplayAmount": "$20.99 (0%)", + "Type": "SNS" + } + ], + "ViolatesMAP": false + } + ], + "Summaries": [ + { + "Condition": { + "Value": "New" + }, + "HighestPrice": { + "Amount": 41.16, + "Currency": "USD", + "DisplayAmount": "$41.16" + }, + "LowestPrice": { + "Amount": 20.99, + "Currency": "USD", + "DisplayAmount": "$20.99" + }, + "OfferCount": 22 + } + ] + } + } + ] + } +} \ No newline at end of file diff --git a/src/data/brands/first-aid-only.ts b/src/old-data/brands/first-aid-only.ts similarity index 99% rename from src/data/brands/first-aid-only.ts rename to src/old-data/brands/first-aid-only.ts index 59c6ee4..7613cc4 100644 --- a/src/data/brands/first-aid-only.ts +++ b/src/old-data/brands/first-aid-only.ts @@ -6,7 +6,7 @@ export const BRAND_STORE_SLUG = 'first-aid-only'; export const FirstAidOnlyStoreProducts: Product[] = [ { amazonLink: 'https://www.amazon.com/First-Aid-Only-Weatherproof-Plastic/dp/B001SG76MU?crid=17746AVZ2R4TK&dib=eyJ2IjoiMSJ9.nehq12VwBTB17Vyx1YODXq7JYQbnOM8xv6AZRadSceLpsk33o-ES3M7UnJMkq0usrVmB1uKgdw9rxtPf7wcS1fHI_DhXIkjp7ujnBf0xvt-SjW3Xw__yU6NvYnSUmSfQzcqj49ZMu893KSypCAIPiLZ0gHo9HbRPicFsuJVBOCv5aOQoBqlLRymArai_8k9lUwtCxAfhfiDjUGk6K3s_S6IFWUP88Ff8mbyU5lkVRtbE4dRTCp-wNjM6HpxqZPSZ0A3_-PPl75PlgjsmUXIkxArreEPatqaHwyJ13X-DCQU.CWOEqmjYxSJ7yRXLCgtz9iGOSGJD53MSoPw6jzAWx7Q&dib_tag=se&keywords=first+aid+kit&qid=1720746463&sprefix=first+aid+kit%2Caps%2C95&sr=8-3-spons&sp_csd=d2lkZ2V0TmFtZT1zcF9hdGY&psc=1&linkCode=ll1&tag=dashersupply-20&linkId=385f21e08641ef9ce7ad55aebe2d30cf&language=en_US&ref_=as_li_ss_tl', - amazonProductId: 'B001SG76MU', + ASIN: 'B001SG76MU', slug: 'first-aid-only-57-pc-first-aid-kit', categoryId: getCategoryIdForSlug('safety-equipment')!, name: "57-pc First Aid Kit (small)", diff --git a/src/data/brands/index.ts b/src/old-data/brands/index.ts similarity index 100% rename from src/data/brands/index.ts rename to src/old-data/brands/index.ts diff --git a/src/data/brands/invisible-glass.ts b/src/old-data/brands/invisible-glass.ts similarity index 99% rename from src/data/brands/invisible-glass.ts rename to src/old-data/brands/invisible-glass.ts index 3e33d07..ec8771c 100644 --- a/src/data/brands/invisible-glass.ts +++ b/src/old-data/brands/invisible-glass.ts @@ -29,7 +29,7 @@ harsh chemicals behind, making it a true joy to work with. Experience the difference for yourself. With its powerful foaming action and guaranteed streak-free results, you'll be able to drive with confidence and clarity - no matter what the road throws your way. `.trim(), - amazonProductId: 'B0007OWD2M', + ASIN: 'B0007OWD2M', amazonLink: 'https://www.amazon.com/Invisible-Glass-91166-6PK-Premium-Cleaner/dp/B0007OWD2M?hvadid=80607997944702&hvnetw=o&hvqmt=e&hvbmt=be&hvdev=c&hvlocint=&hvlocphy=&hvtargid=pla-4584207585873841&th=1&linkCode=ll1&tag=dashersupply-20&linkId=a81b62e34ab769132cbe8076316b448d&language=en_US&ref_=as_li_ss_tl', amazonProductDetails: { "title": "Invisible Glass 91164 19-Ounce Cleaner for Auto and Home for a Streak-Free Shine, Deep Cleaning Foaming Action, Safe for Tinted and Non-Tinted Windows, Ammonia Free Foam Glass Cleaner", diff --git a/src/data/brands/nvision.ts b/src/old-data/brands/nvision.ts similarity index 99% rename from src/data/brands/nvision.ts rename to src/old-data/brands/nvision.ts index 3e9a30c..cc1b6f9 100644 --- a/src/data/brands/nvision.ts +++ b/src/old-data/brands/nvision.ts @@ -42,7 +42,7 @@ choose from a simulated rattle snake sound that takes advantage of nature's best Don't let deer-related accidents hold you back from delivering packages and efficiently. With the nVISION Trailblazer Deer Alert, the deer will hear you coming. `.trim(), - amazonProductId: 'B0000DYV3N', + ASIN: 'B0000DYV3N', amazonLink: 'https://www.amazon.com/Hopkins-27512VA-nVISION-Trailblazer-Electronic/dp/B0000DYV3N?crid=1OO1GL5ERA30E&dib=eyJ2IjoiMSJ9.zKSyNMASsuqR2JLuPICupB5N0gr3mV9rCY5mDLq0nteE_I7uA99eMpyrFMlp9Rmg8y29jHsu5CXS6D6rVQbf_9X5S1rixss014Om-mY44aaW9aDxw7c2k11jxYHDo9ta6vfjAUMLS_TJ-HKmB4ens05KFPYASmgh7OMturk8CsZFebU5Wl9u3RJ3msToyu4a2iozCQzToauDe_sEWZcsK3k_oPGAwotTRsG5musYpYlTlxxBgxwE3Sii0Z4T-uqDd-BNGp3DkSfu2ZtF6gn7XK1rip8COHws2H8D1C3DxqY.9gjHTeHUVufso-AO7nuU4Zys_CClKElR_HM7Y0WBmMM&dib_tag=se&keywords=trailblazer+electronic+deer+alert&qid=1721017663&sprefix=trailblazer+electronic+deer+alert%2Caps%2C69&sr=8-1&linkCode=ll1&tag=dashersupply-20&linkId=7023f7183f50617ff8e739b6eb4a427a&language=en_US&ref_=as_li_ss_tl', amazonProductDetails:{ "title": "nVISION Hopkins 27512VA Trailblazer Electronic Deer Alert", diff --git a/src/data/brands/rubbermaid.ts b/src/old-data/brands/rubbermaid.ts similarity index 99% rename from src/data/brands/rubbermaid.ts rename to src/old-data/brands/rubbermaid.ts index d2fb249..eb51a45 100644 --- a/src/data/brands/rubbermaid.ts +++ b/src/old-data/brands/rubbermaid.ts @@ -30,7 +30,7 @@ all-purpose caddy is designed to keep your essentials organized and within reach **Get Organized:** With its 8 rounded sections and durable design, this caddy is perfect for transporting frequently used sports drink bottles or even coffee cups. This Rubbermaid Commercial Deluxe Carry Caddy has got you covered. `.trim(), - amazonProductId: 'B00006ICOT', + ASIN: 'B00006ICOT', amazonLink: 'https://www.amazon.com/Rubbermaid-Commercial-Deluxe-Cleaning-FG315488BLA/dp/B00006ICOT?crid=23IAS1CUMM6QG&dib=eyJ2IjoiMSJ9.WRH21whjlnubmVRL4HRNIccU9p3CC9B9pvd9LCCkzqxXQggwnV0UNwmgHs868sL9Jr_1cfUHxsHCU7sTT28EMZOCdxoGo-ylie7hWbrQ75ab9SFUJMawaE14LhyNFAQ69j45EtR9kd0njMvXY9WDrBWj61TMpe6K1vl0BC-kWFz8iQqZgrRsgLNN5jbuF83nWOddYMTMZFxQXuvyPUG13LwYmOe17iPUBa03FNecKl0.-fxaqjBgRSTfoIeqegQhb9rz9lE9LJTt475JTTi0J3A&dib_tag=se&keywords=drink+carrier&qid=1719716583&sprefix=drink+carrier%2Caps%2C162&sr=8-3&linkCode=ll1&tag=dashersupply-20&linkId=1a29425189155a3bbe240c193bd1589e&language=en_US&ref_=as_li_ss_tl', amazonProductDetails: { "title": "Rubbermaid Commercial Products Deluxe Carry Caddy for Take-Out Coffee/Soft Drinks, Postmates/Uber Eats/Food Delivery, Cleaning Products, Sports/Water Bottles, Black", diff --git a/src/data/brands/vortex-optics.ts b/src/old-data/brands/vortex-optics.ts similarity index 99% rename from src/data/brands/vortex-optics.ts rename to src/old-data/brands/vortex-optics.ts index ff568a2..a829e16 100644 --- a/src/data/brands/vortex-optics.ts +++ b/src/old-data/brands/vortex-optics.ts @@ -33,7 +33,7 @@ clarity and confidence in a variety of environments. The Crossfire HD binoculars bring HD optics, rugged performance and high end form-factor. Add in the included GlassPak binocular harness for quick optic deployment in the field and superior protection and comfort. The Crossfire HD truly is a rare find. `.trim(), - amazonProductId: 'B07V3LB5DN', + ASIN: 'B07V3LB5DN', amazonProductDetails: { "title": "Vortex Optics Crossfire HD 10x42 Binoculars - HD Optical System, Tripod Adaptable, Rubber Armor, Waterproof, Fogproof, Shockproof, Included GlassPak - Unlimited, Unconditional Warranty", "description": "The Crossfire HD binoculars bring HD optics, rugged performance and high end form-factor. Add in the included GlassPak binocular harness for quick optic deployment in the field and superior protection and comfort - The Crossfire HD truly is a rare find.", diff --git a/src/old-data/fetch-site.ts b/src/old-data/fetch-site.ts new file mode 100644 index 0000000..def31b5 --- /dev/null +++ b/src/old-data/fetch-site.ts @@ -0,0 +1,172 @@ +import { config } from "../config"; +import { fetchApi, downloadMedia } from '../lib/strapi'; +import { type AmazonPAAPIConfig, type Brand, type Category, type GoogleAdsense, type GoogleAnalytics, type HasId, type Media, type Marketplace, type Product, type Response, type Single, type Site, type Tag } from './api-models'; + +const siteResponse = (await fetchApi>>({ + endpoint: 'site', + query: { + 'populate': '*', + } +})).data; + +export const site: Site = { + ...siteResponse.attributes, +}; + +const amazonPAAPIConfigResponse = (await fetchApi>>({ + endpoint: 'amazon-pa-api-config', + query: { + 'populate': '*', + } +})).data; + +export const amazonPAAPIConfig: AmazonPAAPIConfig = { + ...amazonPAAPIConfigResponse.attributes, +} + +const googleAdSenseResponse = (await fetchApi>>({ + endpoint: 'google-ad-sense', + query: { + 'populate': '*', + } +})).data; + +export const googleAdSense: GoogleAdsense = { + ...googleAdSenseResponse.attributes, +} + +const googleAnalyticsResponse = (await fetchApi>>({ + endpoint: 'google-analytics', + query: { + 'populate': '*', + } +})).data; + +export const googleAnalytics: GoogleAnalytics = { + ...googleAnalyticsResponse.attributes, +} + +const brandsResponse = (await fetchApi[]>>({ + endpoint: 'brands', + query: { + 'populate': '*', + } +})).data; + +export let brands: Brand[]&HasId[] = brandsResponse.map(value => { + return { + id: value.id, + ...value.attributes, + }; +}) // sort by name ascending +.sort((left, right) => left.name.localeCompare(right.name)) +; + +const marketplacesResponse = (await fetchApi[]>>({ + endpoint: 'marketplaces', + query: { + 'populate': '*', + // 'populate[components][populate]': '*', + } +})).data; + +export const marketplaces: Marketplace[]&HasId[] = marketplacesResponse.map(value => { + return { + id: value.id, + ...value.attributes, + }; +}) // sort by name ascending +.sort((left, right) => left.name.localeCompare(right.name)) +; + +const categoriesResponse = (await fetchApi[]>>({ + endpoint: 'categories', + query: { + 'populate': '*', + // 'populate[0]': 'parentCategories', + // 'populate[1]': 'childCategories', + // 'populate[2]': 'products', + // 'populate[parentCategories][populate][0]': 'parentCategories', + // 'populate[parentCategories[0]][populate][parentCategories[0]]': '*', + // 'populate[parentCategories[0]][populate][parentCategories[0]][populate][parentCategories[0]]': '*', + } +})).data; + +export const categories: Category[]&HasId[] = categoriesResponse.map(value => { + return { + id: value.id, + ...value.attributes, + }; +}) // sort by name ascending +.sort((left, right) => left.name.localeCompare(right.name)) +; + +const tagsResponse = (await fetchApi[]>>({ + endpoint: 'tags', + query: { + 'populate': '*', + } +})).data; + +export const tags: Tag[]&HasId[] = tagsResponse.map(value => { + return { + id: value.id, + ...value.attributes, + }; +}) // sort by name ascending +.sort((left, right) => left.slug.localeCompare(right.slug)) +; + +const productsResponse = (await fetchApi[]>>({ + endpoint: 'products', + query: { + 'populate': '*', + // 'populate[components][populate]': '*', + } +})).data; + +export const products: Product[]&HasId[] = productsResponse.map(value => { + return { + id: value.id, + ...value.attributes, + }; +}); + +// download brand images +for (let i = 0; i < brands.length; i++) { + let brand = brands[i]; + if (brand && brand.logoImage && brand.logoImage.data) { + let logoImageUrl = brand.logoImage.data.attributes; + downloadMedia('brands', `${logoImageUrl.hash}${logoImageUrl.ext}`, logoImageUrl.url); + brands[i].logoImage.data.attributes.url = `/media/brands/${logoImageUrl.hash}${logoImageUrl.ext}`; + } +} + +for (let i = 0; i < marketplaces.length; i++) { + let marketplace = marketplaces[i]; + if (marketplace && marketplace.logoImage && marketplace.logoImage.data) { + let logoImageUrl = marketplace.logoImage.data.attributes; + downloadMedia('marketplaces', `${logoImageUrl.hash}${logoImageUrl.ext}`, logoImageUrl.url); + marketplaces[i].logoImage.data.attributes.url = `/media/marketplaces/${logoImageUrl.hash}${logoImageUrl.ext}`; + } +} + +for (let i = 0; i < categories.length; i++) { + let category = categories[i]; + if (category && category.categoryImage && category.categoryImage.data) { + let categoryImageUrl = category.categoryImage.data.attributes; + downloadMedia('categories', `${categoryImageUrl.hash}${categoryImageUrl.ext}`, categoryImageUrl.url); + categories[i].categoryImage.data.attributes.url = `/media/categories/${categoryImageUrl.hash}${categoryImageUrl.ext}`; + } +} + +// console.log('site', site); +// console.log('amazonPAAPIConfig', amazonPAAPIConfig); +// console.log('googleAdSense', googleAdSense); +// console.log('googleAnalytics', googleAnalytics); +// console.log('brands', brands); +// console.log('categories', categories); +// console.log('marketplaces', marketplaces); +// console.log('tags', tags); +// console.log('products', products); +// console.log(products[0].description[0].children); diff --git a/src/data/categories.ts b/src/old-data/offline-category-tree/categories.ts similarity index 100% rename from src/data/categories.ts rename to src/old-data/offline-category-tree/categories.ts diff --git a/src/data/products/amazon-product-details.ts b/src/old-data/products/amazon-product-details.ts similarity index 60% rename from src/data/products/amazon-product-details.ts rename to src/old-data/products/amazon-product-details.ts index b52da80..8163b76 100644 --- a/src/data/products/amazon-product-details.ts +++ b/src/old-data/products/amazon-product-details.ts @@ -1,6 +1,14 @@ import { type ProductAttribute } from "./product-attribute"; -export interface ProductDetails { +export interface AmazonProductDetails { + /** + * Amazon product ID for the product. + */ + ASIN?: string; + /** + * Amazon link for the product. + */ + amazonLink?: string; title?: string; price?: number; // listPrice?: number; @@ -10,4 +18,4 @@ export interface ProductDetails { reviewCount?: number; imageUrls?: string[]; attributes?: ProductAttribute[]; -}; \ No newline at end of file +}; diff --git a/src/data/products/index.ts b/src/old-data/products/index.ts similarity index 61% rename from src/data/products/index.ts rename to src/old-data/products/index.ts index 6358934..2136c08 100644 --- a/src/data/products/index.ts +++ b/src/old-data/products/index.ts @@ -193,8 +193,155 @@ export function getProductsForCategoryId(categoryId: number) { import { config } from "../../config"; import * as ProductAdvertisingAPIv1 from 'amazon-pa-api5-node-ts'; +import { SearchItemsResourceValues } from 'amazon-pa-api5-node-ts/dist/src/model/SearchItemsResource'; let amazonClient = ProductAdvertisingAPIv1.ApiClient.instance; amazonClient.accessKey = config.AmazonProductAdvertisingAPIAccessKey; amazonClient.secretKey = config.AmazonProductAdvertisingAPISecretKey; -amazonClient.region = config.AmazonProductAdvertisingAPIRegion; amazonClient.host = config.AmazonProductAdvertisingAPIHost; +amazonClient.region = config.AmazonProductAdvertisingAPIRegion; + +var api = new ProductAdvertisingAPIv1.DefaultApi(); + +var searchItemsRequest = new ProductAdvertisingAPIv1.SearchItemsRequest(); + +searchItemsRequest.PartnerTag = config.AmazonProductAdvertisingAPIPartnerTag; +searchItemsRequest.PartnerType = config.AmazonProductAdvertisingAPIPartnerType; +searchItemsRequest.Keywords = "flashlight"; +searchItemsRequest.Brand = "COAST"; +searchItemsRequest.Marketplace = "www.amazon.com"; +//Broken needs to be fixed: +searchItemsRequest.Resources = [ + SearchItemsResourceValues["BrowseNodeInfo.BrowseNodes"], + SearchItemsResourceValues["BrowseNodeInfo.BrowseNodes.Ancestor"], + SearchItemsResourceValues["BrowseNodeInfo.BrowseNodes.SalesRank"], + SearchItemsResourceValues["BrowseNodeInfo.WebsiteSalesRank"], + SearchItemsResourceValues["CustomerReviews.Count"], + SearchItemsResourceValues["CustomerReviews.StarRating"], + SearchItemsResourceValues["Images.Primary.Small"], + SearchItemsResourceValues["Images.Primary.Medium"], + SearchItemsResourceValues["Images.Primary.Large"], + SearchItemsResourceValues["Images.Primary.HighRes"], + SearchItemsResourceValues["Images.Variants.Small"], + SearchItemsResourceValues["Images.Variants.Medium"], + SearchItemsResourceValues["Images.Variants.Large"], + SearchItemsResourceValues["Images.Variants.HighRes"], + SearchItemsResourceValues["ItemInfo.ByLineInfo"], + SearchItemsResourceValues["ItemInfo.ContentInfo"], + SearchItemsResourceValues["ItemInfo.ContentRating"], + SearchItemsResourceValues["ItemInfo.Classifications"], + SearchItemsResourceValues["ItemInfo.ExternalIds"], + SearchItemsResourceValues["ItemInfo.Features"], + SearchItemsResourceValues["ItemInfo.ManufactureInfo"], + SearchItemsResourceValues["ItemInfo.ProductInfo"], + SearchItemsResourceValues["ItemInfo.TechnicalInfo"], + SearchItemsResourceValues["ItemInfo.Title"], + SearchItemsResourceValues["ItemInfo.TradeInInfo"], + SearchItemsResourceValues["Offers.Listings.Availability.MaxOrderQuantity"], + SearchItemsResourceValues["Offers.Listings.Availability.Message"], + SearchItemsResourceValues["Offers.Listings.Availability.MinOrderQuantity"], + SearchItemsResourceValues["Offers.Listings.Availability.Type"], + SearchItemsResourceValues["Offers.Listings.Condition"], + SearchItemsResourceValues["Offers.Listings.Condition.ConditionNote"], + SearchItemsResourceValues["Offers.Listings.Condition.SubCondition"], + SearchItemsResourceValues["Offers.Listings.DeliveryInfo.IsAmazonFulfilled"], + SearchItemsResourceValues["Offers.Listings.DeliveryInfo.IsFreeShippingEligible"], + SearchItemsResourceValues["Offers.Listings.DeliveryInfo.IsPrimeEligible"], + SearchItemsResourceValues["Offers.Listings.DeliveryInfo.ShippingCharges"], + SearchItemsResourceValues["Offers.Listings.IsBuyBoxWinner"], + SearchItemsResourceValues["Offers.Listings.LoyaltyPoints.Points"], + SearchItemsResourceValues["Offers.Listings.MerchantInfo"], + SearchItemsResourceValues["Offers.Listings.Price"], + SearchItemsResourceValues["Offers.Listings.ProgramEligibility.IsPrimeExclusive"], + SearchItemsResourceValues["Offers.Listings.ProgramEligibility.IsPrimePantry"], + SearchItemsResourceValues["Offers.Listings.Promotions"], + SearchItemsResourceValues["Offers.Listings.SavingBasis"], + SearchItemsResourceValues["Offers.Summaries.HighestPrice"], + SearchItemsResourceValues["Offers.Summaries.LowestPrice"], + SearchItemsResourceValues["Offers.Summaries.OfferCount"], + SearchItemsResourceValues["ParentASIN"], + SearchItemsResourceValues["RentalOffers.Listings.Availability.MaxOrderQuantity"], + SearchItemsResourceValues["RentalOffers.Listings.Availability.Message"], + SearchItemsResourceValues["RentalOffers.Listings.Availability.MinOrderQuantity"], + SearchItemsResourceValues["RentalOffers.Listings.Availability.Type"], + SearchItemsResourceValues["RentalOffers.Listings.BasePrice"], + SearchItemsResourceValues["RentalOffers.Listings.Condition"], + SearchItemsResourceValues["RentalOffers.Listings.Condition.ConditionNote"], + SearchItemsResourceValues["RentalOffers.Listings.Condition.SubCondition"], + SearchItemsResourceValues["RentalOffers.Listings.DeliveryInfo.IsAmazonFulfilled"], + SearchItemsResourceValues["RentalOffers.Listings.DeliveryInfo.IsFreeShippingEligible"], + SearchItemsResourceValues["RentalOffers.Listings.DeliveryInfo.IsPrimeEligible"], + SearchItemsResourceValues["RentalOffers.Listings.DeliveryInfo.ShippingCharges"], + SearchItemsResourceValues["RentalOffers.Listings.MerchantInfo"], + SearchItemsResourceValues["SearchRefinements"], +]; +// function onSuccess(data) { +// console.log('API called successfully.'); +// var searchItemsResponse = ProductAdvertisingAPIv1.SearchItemsResponse.constructFromObject(data); +// console.log('Complete Response: \n' + JSON.stringify(searchItemsResponse, null, 1)); +// if (searchItemsResponse['SearchResult'] !== undefined) { +// console.log('Printing First Item Information in SearchResult:'); +// var item_0 = searchItemsResponse['SearchResult']['Items'][0]; +// if (item_0 !== undefined) { +// if (item_0['ASIN'] !== undefined) { +// console.log('ASIN: ' + item_0['ASIN']); +// } +// if (item_0['DetailPageURL'] !== undefined) { +// console.log('DetailPageURL: ' + item_0['DetailPageURL']); +// } +// if ( +// item_0['ItemInfo'] !== undefined && +// item_0['ItemInfo']['Title'] !== undefined && +// item_0['ItemInfo']['Title']['DisplayValue'] !== undefined +// ) { +// console.log('Title: ' + item_0['ItemInfo']['Title']['DisplayValue']); +// } +// if ( +// item_0['Offers'] !== undefined && +// item_0['Offers']['Listings'] !== undefined && +// item_0['Offers']['Listings'][0]['Price'] !== undefined && +// item_0['Offers']['Listings'][0]['Price']['DisplayAmount'] !== undefined +// ) { +// console.log('Buying Price: ' + item_0['Offers']['Listings'][0]['Price']['DisplayAmount']); +// } +// } +// } +// if (searchItemsResponse['Errors'] !== undefined) { +// console.log('Errors:'); +// console.log('Complete Error Response: ' + JSON.stringify(searchItemsResponse['Errors'], null, 1)); +// console.log('Printing 1st Error:'); +// var error_0 = searchItemsResponse['Errors'][0]; +// console.log('Error Code: ' + error_0['Code']); +// console.log('Error Message: ' + error_0['Message']); +// } +// } +// function onError(error) { +// console.log('Error calling PA-API 5.0!'); +// console.log('Printing Full Error Object:\n' + JSON.stringify(error, null, 1)); +// console.log('Status Code: ' + error['status']); +// if (error['response'] !== undefined && error['response']['text'] !== undefined) { +// console.log('Error Object: ' + JSON.stringify(error['response']['text'], null, 1)); +// } +// } +// api.searchItems(searchItemsRequest).then( +// function(data) { +// onSuccess(data); +// }, +// function(error) { +// onError(error); +// } +// ); + +// var getItems = new ProductAdvertisingAPIv1.GetItemsRequest(); +//broken: +// getItems.Resources = [ +// "", +// ] +// getItems.ItemIds + +// import { SearchItemsResponse } from 'amazon-pa-api5-node-ts'; +// import jsonSearchResults from '../brands/coast-query-response.json'; + +// const results: SearchItemsResponse = jsonSearchResults as SearchItemsResponse; +// for (let result of results.SearchResult!.Items!) { +// console.log(result.DetailPageURL); +// } diff --git a/src/data/products/product-attribute.ts b/src/old-data/products/product-attribute.ts similarity index 100% rename from src/data/products/product-attribute.ts rename to src/old-data/products/product-attribute.ts diff --git a/src/data/products/product.ts b/src/old-data/products/product.ts similarity index 74% rename from src/data/products/product.ts rename to src/old-data/products/product.ts index 9bb8b3e..b6db962 100644 --- a/src/data/products/product.ts +++ b/src/old-data/products/product.ts @@ -1,4 +1,4 @@ -import { type ProductDetails as AmazonProductDetails } from './amazon-product-details'; +import { type AmazonProductDetails } from './amazon-product-details'; /** * Product details. @@ -36,14 +36,6 @@ export interface Product { * ID of the category this product belongs to. */ categoryId: number; - /** - * Amazon product ID for the product. - */ - amazonProductId?: string; - /** - * Amazon link for the product. - */ - amazonLink?: string; /** * Product Details. */ diff --git a/src/pages/404.astro b/src/pages/404.astro new file mode 100644 index 0000000..7fafdac --- /dev/null +++ b/src/pages/404.astro @@ -0,0 +1,185 @@ +--- +/** Fallback HTTP 404 Page. */ +import Layout from "../layouts/Layout.astro"; +import type { Page } from "../data/models/multis/Page"; +import type { PageCallout } from "../data/models/components/PageCallout"; +import type { PageContent } from "../data/models/components/PageContent"; +import type { Site } from "../data/models/singles/Site"; +import type { SiteConfig } from "../data/models/singles/SiteConfig"; +import { getLocaleField, getPagesByLangSlug, getSite, getSiteConfig, getSiteHomePage } from "../data/api-client"; +import { pick as pickLanguage } from "../lib/accept-language-parser"; +import { localeUrlTestPatterns, overrideLocaleFromUrl, localeFromLang } from "../lib/locales"; +import Banner from "../components/Banner.astro"; +import ComponentRouter from "../components/ComponentRouter.astro"; + +// if you're here you've 404'ed +Astro.response.status = 404; + +const locale = overrideLocaleFromUrl(Astro.request.url, localeFromLang(pickLanguage(['en', 'es', 'fr'], Astro.request.headers.get('Accept-Language')||'en-US', { loose: true })||'en')); +const siteDto = await getSite(); +const site: Site = siteDto.items[0].data!; +const siteConfigDto = await getSiteConfig(); +const siteConfig: SiteConfig = siteConfigDto.items[0].data!; +const siteName = getLocaleField(locale, site.siteName); +const shouldEmbedSquidexSDK = import.meta.env.MODE === 'development'; + +let pageDto; +let page: Page|undefined; +let title = 'HTTP 404'; +let metaDescription = 'This page cannot be displayed.'; +let isHomePage = false; +let homePageDto; +let homePage; +try { + homePageDto = await getSiteHomePage(site); + homePage = homePageDto.items[0].data!; +} catch (error) { + homePage = undefined; +} + +try { + pageDto = await getPagesByLangSlug(locale, `${locale}/404`); + page = pageDto.items[0].data!; + title = page.title[locale] || title; + metaDescription = page.seo[locale].metaDescription || metaDescription; + isHomePage = false; +} catch (error) { + if (!page) { + page = { + parentPage: { iv: [] }, + content: { + "en-US": [ + { + schemaId: '', + schemaName: 'page-breadcrumbs', + }, + { + schemaId: '', + schemaName: 'page-callout', + text: '404 Page Not Found', + } as PageCallout, + { + schemaId: '', + schemaName: 'page-content', + content: 'This page cannot be displayed.', + } as PageContent, + ], + "es-US": [ + { + schemaId: '', + schemaName: 'page-breadcrumbs', + }, + { + schemaId: '', + schemaName: 'page-callout', + text: '404 Page Not Found' + } as PageCallout, + { + schemaId: '', + schemaName: 'page-content', + content: 'This page cannot be displayed.', + } as PageContent, + ], + "fr-CA": [ + { + schemaId: '', + schemaName: 'page-breadcrumbs', + }, + { + schemaId: '', + schemaName: 'page-callout', + text: '404 Page Not Found' + } as PageCallout, + { + schemaId: '', + schemaName: 'page-content', + content: 'This page cannot be displayed.', + } as PageContent, + ] + }, + slug: { + "en-US": Astro.url.pathname.replace(/^[\/\\]|[\/\\]$/g, '').replace(locale, 'en-US'), + "es-US": Astro.url.pathname.replace(/^[\/\\]|[\/\\]$/g, '').replace(locale, 'es-US'), + "fr-CA": Astro.url.pathname.replace(/^[\/\\]|[\/\\]$/g, '').replace(locale, 'fr-CA'), + }, + title: { + "en-US": "HTTP 404", + "es-US": "HTTP 404", + "fr-CA": "HTTP 404" + }, + seo: { + "en-US": { + keywords: "", + metaDescription: "This page cannot be displayed.", + metaImage: "", + metaSocial: [], + metaTitle: "", + schemaId: "", + schemaName: "" + }, + "es-US": { + keywords: "", + metaDescription: "La página que estás buscando no puede ser mostrada.", + metaImage: "", + metaSocial: [], + metaTitle: "", + schemaId: "", + schemaName: "" + }, + "fr-CA": { + keywords: "", + metaDescription: "La page que vous cherchez ne peut pas être affichée.", + metaImage: "", + metaSocial: [], + metaTitle: "", + schemaId: "", + schemaName: "" + } + } + } + } +} +--- + + + + { + // Object.entries(SupportedLanguages).map((supportedLanguage) => { + // return ( + // + // ); + // }) + } + +
    + + +
    +
    + + diff --git a/src/pages/[...routeLookup].astro b/src/pages/[...routeLookup].astro new file mode 100644 index 0000000..aabf532 --- /dev/null +++ b/src/pages/[...routeLookup].astro @@ -0,0 +1,164 @@ +--- +import Layout from "../layouts/Layout.astro"; +import { getBrandsByLangSlug, getLocaleField, getPagesByLangSlug, getProductCategoriesByLangSlug, getSite, getSlugByLangSlug, getSiteConfig, getSiteHomePage, getPagesByIds, getMarketplacesByLangSlug, getProductsByLangSlug, getSellersByLangSlug } from "../data/api-client"; +import { genericPageForBrand, genericPageForMarketplace, genericPageForProduct, genericPageForProductCategory, genericPageForSeller } from "../lib/page-from-models"; +import { SupportedLocales } from "../data/internals/MultilingualT"; +import { SCHEMAS } from "../data/models/schemas"; +import type { Brand } from "../data/models/multis/Brand"; +import type { Page } from "../data/models/multis/Page"; +import type { ProductCategory } from "../data/models/multis/ProductCategory"; +import type { Site } from "../data/models/singles/Site"; +import type { Slug } from "../data/models/multis/Slug"; +import type { SiteConfig } from "../data/models/singles/SiteConfig"; +import { pick as pickLanguage } from "../lib/accept-language-parser"; +import { localeUrlTestPatterns, overrideLocaleFromUrl, localeFromLang } from "../lib/locales"; +import Banner from "../components/Banner.astro"; +import ComponentRouter from "../components/ComponentRouter.astro"; +import { renderMarkdown } from "../lib/rendering"; +import Disclaimers from "../components/Disclaimers.astro"; + +const { routeLookup, resource, id } = Astro.params; + +const isSiteHomepage = (url?: string) => !url || url === '/'; +const isLocaleHomepage = (url: string) => { + for (let t = 0; t < localeUrlTestPatterns.length; t++) { + if (url === localeUrlTestPatterns[t] || url === `${localeUrlTestPatterns[t]}/`) { + return true; + } + } + return false; +} +const locale = overrideLocaleFromUrl(routeLookup!, localeFromLang(pickLanguage(['en', 'es', 'fr'], Astro.request.headers.get('Accept-Language')||'en-US', { loose: true })||'en')); + +const siteConfigDto = await getSiteConfig(); +const siteConfig = siteConfigDto.items[0].data!; + +const siteDto = await getSite(); +const site = siteDto.items[0].data!; +const siteEditToken = siteDto.items[0].editToken; + +let isHomePage: boolean = false; +let homePageDto = await getSiteHomePage(site); +let homePage: Page = homePageDto.items[0].data!; +let homePageId = homePageDto.items[0].id; +let pageDto; +let page: Page; +let brandDto; +let productCategory; +let brand: Brand|undefined; +let pageEditToken: string; + +if (isSiteHomepage(routeLookup)) { + Astro.response.headers.set('Vary', 'Accept-Language'); + return Astro.redirect(`${locale}/`, 303); +} + +Astro.response.headers.set('Content-Type', 'text/html; charset=utf-8'); + +const redirect404NotFound = () => { return Astro.rewrite(`${locale}/404/`); } + +if (isLocaleHomepage(routeLookup!)) { + isHomePage = true; + pageDto = homePageDto; + page = homePage; + pageEditToken = homePageDto.items[0].editToken!; +} +else { + const slugDto = await getSlugByLangSlug(locale, routeLookup!); + if (slugDto && slugDto.items && slugDto.items.length > 0) { + let objectId = (slugDto.items[0].data as unknown as any as Slug).reference.iv[0] + switch (slugDto.items[0].data?.referenceSchema.iv) { + case SCHEMAS.BRANDS: + return Astro.rewrite(`/view/brands/${locale}/${objectId}`); + case SCHEMAS.MARKETPLACES: + return Astro.rewrite(`/view/marketplaces/${locale}/${objectId}`); + case SCHEMAS.PAGES: + return Astro.rewrite(`/view/pages/${locale}/${objectId}`); + case SCHEMAS.PRODUCT_CATEGORIES: + return Astro.rewrite(`/view/product-categories/${locale}/${objectId}`); + case SCHEMAS.PRODUCTS: + return Astro.rewrite(`/view/products/${locale}/${objectId}`); + case SCHEMAS.SELLERS: + return Astro.rewrite(`/view/sellers/${locale}/${objectId}`); + default: + return redirect404NotFound(); + } + } + else { + return redirect404NotFound(); + } +} + +if (!page) { + //this code can never be reached, but if it can be reached then the compiler + //will let me know all return branches for setting page weren't handled + //so leave it here: + return redirect404NotFound(); +} + +const title = getLocaleField(locale, page?.title)||''; +const metaDescription = getLocaleField(locale, page?.seo)?.metaDescription || ''; +const siteName = getLocaleField(locale, site.siteName); +const pageContent = getLocaleField(locale, page?.content)!; +const shouldEmbedSquidexSDK = import.meta.env.MODE === 'development'; +const renderContext = { + ...Astro.params, + title, + metaDescription, + siteName, + pageComponents: pageContent, + page, + site, + isHomePage, + isLocaleHomepage: isLocaleHomepage(routeLookup!), + shouldEmbedSquidexSDK, +} +--- + + + { metaDescription && } + { + Object.entries(SupportedLocales).map((supportedLanguage) => { + return ( + + ); + }) + } + + + +
    + + +
    + + + +
    \ No newline at end of file diff --git a/src/pages/img/[...imageLookup].ts b/src/pages/img/[...imageLookup].ts new file mode 100644 index 0000000..eab1cd9 --- /dev/null +++ b/src/pages/img/[...imageLookup].ts @@ -0,0 +1,36 @@ +import { getImage } from "astro:assets"; +import { config } from "../../config" +import path from "node:path"; +import { getAssetById } from "../../data/api-client"; + +/** + * Proxies the asset resources from Squidex with a properly joined path. + * Access this endpoint using the format `/img/{uuid}/{fileName}.{fileExt}`. + * @param param0 + * @returns + */ +export async function GET({ request, rewrite }) { + const url = new URL(request.url); + const assetId = path.posix.dirname(url.pathname.replace(/^\/img\//, '')); //removes /img/ then extracts the uuid + const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/; + const match = assetId.match(uuidRegex); + if (match) { //validates what we extracted was a valid uuid and not something else + try { //as long as there are no errors + const asset = await getAssetById(assetId); + const mimeType = asset.mimeType; + const imageLookup = path.posix.join(`/api/assets/${config.squidexAppName}`, url.pathname.replace(/^\/img\//, '')); + + const response = await fetch(`${config.squidexEnvironment}${imageLookup}`); + const buffer = Buffer.from(await response.arrayBuffer()); + + return new Response(buffer, { + headers: { "Content-Type": mimeType }, + }); + } catch(err: any) { //but if there's an error, it's probably because it doesn't exist + return rewrite('/404') + } + } + else { + return rewrite('/404') + } +} \ No newline at end of file diff --git a/src/pages/index.astro b/src/pages/index.astro deleted file mode 100644 index 5f9cf5c..0000000 --- a/src/pages/index.astro +++ /dev/null @@ -1,108 +0,0 @@ ---- -import Layout from '../layouts/Layout.astro'; -import CategoryCard from '../components/CategoryCard.astro'; -import BrandCard from '../components/BrandCard.astro'; -import { ALL_CATEGORIES } from '../data/categories'; -import { ALL_BRANDS } from '../data/brands'; -import { getProductsForCategoryId } from '../data/products'; ---- - - -
    -

    Dasher Supply

    -

    - Your one-stop shop for all your after-market Dasher supplies. -

    - -

    - We choose brand names you can trust. As an Amazon Associate I earn from qualifying purchases. -

    - -
    - - { /* Temporarily enabled on full blast. */ } - As an Amazon Associate I earn from qualifying purchases. - Check out the latest Prime Day deals on Amazon. - -
    - - diff --git a/src/pages/preview/pages/[...previewPagesLookup].astro b/src/pages/preview/pages/[...previewPagesLookup].astro new file mode 100644 index 0000000..83caa27 --- /dev/null +++ b/src/pages/preview/pages/[...previewPagesLookup].astro @@ -0,0 +1,8 @@ +--- +import Layout from "../../../layouts/Layout.astro"; + +const { previewPageLookup, resource, id } = Astro.params; + + +--- +{Astro.url.pathname} \ No newline at end of file diff --git a/src/pages/view/brands/[...brandLookup].astro b/src/pages/view/brands/[...brandLookup].astro new file mode 100644 index 0000000..8695721 --- /dev/null +++ b/src/pages/view/brands/[...brandLookup].astro @@ -0,0 +1,115 @@ +--- +import Layout from "../../../layouts/Layout.astro"; +import { getBrandsByIds, getSite, getSiteConfig, getSiteHomePage } from "../../../data/api-client"; +import { genericPageForBrand } from "../../../lib/page-from-models"; +import { SupportedLocales } from "../../../data/internals/MultilingualT"; +import type { Page } from "../../../data/models/multis/Page"; +import type { Site } from "../../../data/models/singles/Site"; +import { pick as pickLanguage } from "../../../lib/accept-language-parser"; +import { overrideLocaleFromUrl, localeFromLang } from "../../../lib/locales"; +import Banner from "../../../components/Banner.astro"; +import ComponentRouter from "../../../components/ComponentRouter.astro"; +import Disclaimers from "../../../components/Disclaimers.astro"; + +const { brandLookup, resource, id } = Astro.params; + +const locale = overrideLocaleFromUrl(brandLookup!, localeFromLang(pickLanguage(['en', 'es', 'fr'], Astro.request.headers.get('Accept-Language')||'en-US', { loose: true })||'en')); + +const brandLookupParts = brandLookup?.split('/')||[]; +if (brandLookupParts?.length < 2) { + return Astro.rewrite(`${locale}/404/`); +} +const brandId = brandLookupParts[1]; +const brandDto = await getBrandsByIds(brandId); + +if (brandDto.items.length < 1) { + return Astro.rewrite(`${locale}/404/`); +} +else if (brandDto.items[0].data && brandDto.items[0].data.brandPage && brandDto.items[0].data.brandPage.iv && brandDto.items[0].data.brandPage.iv.length) { + return Astro.rewrite(`/views/pages/${locale}/${brandDto.items[0].data.brandPage.iv[0]}`); +} + +const siteConfigDto = await getSiteConfig(); +const siteConfig = siteConfigDto.items[0].data!; + +const siteDto = await getSite(); +const site: Site = siteDto.items[0].data!; +const siteEditToken = siteDto.items[0].editToken; + +const homePageId = site.homePage.iv[0]; +const homePageDto = await getSiteHomePage(site); +const homePage: Page = homePageDto.items[0].data!; + +const brand = brandDto.items[0].data!; + +Astro.response.headers.set('Content-Type', 'text/html; charset=utf-8'); + +const page = genericPageForBrand({brand, brandId, homePageId}); +const pageEditToken = brandDto.items[0].editToken; + +const title = page?.title[locale]||''; +const metaDescription = page?.seo[locale]?.metaDescription || ''; +const siteName = site.siteName[locale]; +const pageContent = page?.content[locale]!; +const shouldEmbedSquidexSDK = import.meta.env.MODE === 'development'; +const renderContext = { + ...Astro.params, + title, + metaDescription, + siteName, + pageComponents: pageContent, + page, + site, + isHomePage: false, + isLocaleHomepage: false, + shouldEmbedSquidexSDK, +} +--- + + + { metaDescription && } + { + Object.entries(SupportedLocales).map((supportedLanguage) => { + return ( + + ); + }) + } + +
    + + +
    + + + +
    + + diff --git a/src/pages/view/marketplaces/[...marketplaceLookup].astro b/src/pages/view/marketplaces/[...marketplaceLookup].astro new file mode 100644 index 0000000..9036178 --- /dev/null +++ b/src/pages/view/marketplaces/[...marketplaceLookup].astro @@ -0,0 +1,115 @@ +--- +import Layout from "../../../layouts/Layout.astro"; +import { getMarketplacesByIds, getSite, getSiteConfig, getSiteHomePage } from "../../../data/api-client"; +import { genericPageForMarketplace } from "../../../lib/page-from-models"; +import { SupportedLocales } from "../../../data/internals/MultilingualT"; +import type { Page } from "../../../data/models/multis/Page"; +import type { Site } from "../../../data/models/singles/Site"; +import { pick as pickLanguage } from "../../../lib/accept-language-parser"; +import { overrideLocaleFromUrl, localeFromLang } from "../../../lib/locales"; +import Banner from "../../../components/Banner.astro"; +import ComponentRouter from "../../../components/ComponentRouter.astro"; +import Disclaimers from "../../../components/Disclaimers.astro"; + +const { marketplaceLookup, resource, id } = Astro.params; + +const locale = overrideLocaleFromUrl(marketplaceLookup!, localeFromLang(pickLanguage(['en', 'es', 'fr'], Astro.request.headers.get('Accept-Language')||'en-US', { loose: true })||'en')); + +const marketplaceLookupParts = marketplaceLookup?.split('/')||[]; +if (marketplaceLookupParts?.length < 2) { + return Astro.rewrite(`${locale}/404/`); +} +const marketplaceId = marketplaceLookupParts[1]; +const marketplaceDto = await getMarketplacesByIds(marketplaceId); + +if (marketplaceDto.items.length < 1) { + return Astro.rewrite(`${locale}/404/`); +} +else if (marketplaceDto.items[0].data && marketplaceDto.items[0].data.marketplacePage && marketplaceDto.items[0].data.marketplacePage.iv && marketplaceDto.items[0].data.marketplacePage.iv.length) { + return Astro.rewrite(`/views/pages/${locale}/${marketplaceDto.items[0].data.marketplacePage.iv[0]}`); +} + +const siteConfigDto = await getSiteConfig(); +const siteConfig = siteConfigDto.items[0].data!; + +const siteDto = await getSite(); +const site: Site = siteDto.items[0].data!; +const siteEditToken = siteDto.items[0].editToken; + +const homePageId = site.homePage.iv[0]; +const homePageDto = await getSiteHomePage(site); +const homePage: Page = homePageDto.items[0].data!; + +const marketplace = marketplaceDto.items[0].data!; + +Astro.response.headers.set('Content-Type', 'text/html; charset=utf-8'); + +const page = genericPageForMarketplace({marketplace, marketplaceId, homePageId}); +const pageEditToken = marketplaceDto.items[0].editToken; + +const title = page?.title[locale]||''; +const metaDescription = page?.seo[locale]?.metaDescription || ''; +const siteName = site.siteName[locale]; +const pageContent = page?.content[locale]!; +const shouldEmbedSquidexSDK = import.meta.env.MODE === 'development'; +const renderContext = { + ...Astro.params, + title, + metaDescription, + siteName, + pageComponents: pageContent, + page, + site, + isHomePage: false, + isLocaleHomepage: false, + shouldEmbedSquidexSDK, +} +--- + + + { metaDescription && } + { + Object.entries(SupportedLocales).map((supportedLanguage) => { + return ( + + ); + }) + } + +
    + + +
    + + + +
    + + diff --git a/src/pages/view/pages/[...pageLookup].astro b/src/pages/view/pages/[...pageLookup].astro new file mode 100644 index 0000000..1d7adbf --- /dev/null +++ b/src/pages/view/pages/[...pageLookup].astro @@ -0,0 +1,120 @@ +--- +import Layout from "../../../layouts/Layout.astro"; +import { getPagesByIds, getSite, getSiteConfig, getSiteHomePage } from "../../../data/api-client"; +import { SupportedLocales } from "../../../data/internals/MultilingualT"; +import type { Page } from "../../../data/models/multis/Page"; +import type { Site } from "../../../data/models/singles/Site"; +import { pick as pickLanguage } from "../../../lib/accept-language-parser"; +import { localeUrlTestPatterns, overrideLocaleFromUrl, localeFromLang } from "../../../lib/locales"; +import Banner from "../../../components/Banner.astro"; +import ComponentRouter from "../../../components/ComponentRouter.astro"; +import Disclaimers from "../../../components/Disclaimers.astro"; + +const { pageLookup, resource, id } = Astro.params; + +const isSiteHomepage = (url?: string) => !url || url === '/'; +const isLocaleHomepage = (url: string) => { + for (let t = 0; t < localeUrlTestPatterns.length; t++) { + if (url === localeUrlTestPatterns[t] || url === `${localeUrlTestPatterns[t]}/`) { + return true; + } + } + return false; +} +const locale = overrideLocaleFromUrl(pageLookup!, localeFromLang(pickLanguage(['en', 'es', 'fr'], Astro.request.headers.get('Accept-Language')||'en-US', { loose: true })||'en')); + +const pageLookupParts = pageLookup?.split('/')||[]; +if (pageLookupParts?.length < 2) { + return Astro.rewrite(`${locale}/404/`); +} +const pageId = pageLookupParts[1]; +const pageDto = await getPagesByIds(pageId); +if (pageDto.items.length < 1) { + return Astro.rewrite(`${locale}/404/`); +} + +const siteConfigDto = await getSiteConfig(); +const siteConfig = siteConfigDto.items[0].data!; + +const siteDto = await getSite(); +const site: Site = siteDto.items[0].data!; +const siteEditToken = siteDto.items[0].editToken; + +const homePageId = site.homePage.iv[0]; +const homePageDto = await getSiteHomePage(site); +const homePage: Page = homePageDto.items[0].data!; + +const page = pageDto.items[0].data!; + +Astro.response.headers.set('Content-Type', 'text/html; charset=utf-8'); + +const pageEditToken = pageDto.items[0].editToken; + +const title = page?.title[locale]||''; +const metaDescription = page?.seo[locale]?.metaDescription || ''; +const siteName = site.siteName[locale]; +const pageContent = page?.content[locale]!; +const shouldEmbedSquidexSDK = import.meta.env.MODE === 'development'; + +let isHomePage: boolean = false; + +const renderContext = { + ...Astro.params, + title, + metaDescription, + siteName, + pageComponents: pageContent, + page, + site, + isHomePage: false, + isLocaleHomepage: false, + shouldEmbedSquidexSDK, +} +--- + + + { metaDescription && } + { + Object.entries(SupportedLocales).map((supportedLanguage) => { + return ( + + ); + }) + } + +
    + + +
    + + + +
    + + diff --git a/src/pages/view/product-categories/[...productCategoryLookup].astro b/src/pages/view/product-categories/[...productCategoryLookup].astro new file mode 100644 index 0000000..2eb570e --- /dev/null +++ b/src/pages/view/product-categories/[...productCategoryLookup].astro @@ -0,0 +1,117 @@ +--- +import Layout from "../../../layouts/Layout.astro"; +import { getProductCategoriesByIds, getSite, getSiteConfig, getSiteHomePage } from "../../../data/api-client"; +import { genericPageForProductCategory } from "../../../lib/page-from-models"; +import { SupportedLocales } from "../../../data/internals/MultilingualT"; +import type { Page } from "../../../data/models/multis/Page"; +import type { Site } from "../../../data/models/singles/Site"; +import { pick as pickLanguage } from "../../../lib/accept-language-parser"; +import { overrideLocaleFromUrl, localeFromLang } from "../../../lib/locales"; +import Banner from "../../../components/Banner.astro"; +import ComponentRouter from "../../../components/ComponentRouter.astro"; +import Disclaimers from "../../../components/Disclaimers.astro"; + +const { productCategoryLookup, resource, id } = Astro.params; + +const locale = overrideLocaleFromUrl(productCategoryLookup!, localeFromLang(pickLanguage(['en', 'es', 'fr'], Astro.request.headers.get('Accept-Language')||'en-US', { loose: true })||'en')); + +const productCategoryLookupParts = productCategoryLookup?.split('/')||[]; +if (productCategoryLookupParts?.length < 2) { + return Astro.rewrite(`${locale}/404/`); +} +const productCategoryId = productCategoryLookupParts[1]; +const productCategoryDto = await getProductCategoriesByIds(productCategoryId); + +if (productCategoryDto.items.length < 1) { + return Astro.rewrite(`${locale}/404/`); +} +//to support product category special pages on the backend +// else if (productCategoryDto.items[0].data && productCategoryDto.items[0].data.productCategoryPage && productCategoryDto.items[0].data.productCategoryPage.iv && productCategoryDto.items[0].data.productCategoryPage.iv.length) { +// return Astro.rewrite(`/views/pages/${locale}/${productCategoryDto.items[0].data.productCategoryPage.iv[0]}`); +// } + +const siteConfigDto = await getSiteConfig(); +const siteConfig = siteConfigDto.items[0].data!; + +const siteDto = await getSite(); +const site: Site = siteDto.items[0].data!; +const siteEditToken = siteDto.items[0].editToken; + +const homePageId = site.homePage.iv[0]; +const homePageDto = await getSiteHomePage(site); +const homePage: Page = homePageDto.items[0].data!; + +const productCategory = productCategoryDto.items[0].data!; + +Astro.response.headers.set('Content-Type', 'text/html; charset=utf-8'); + +const page = genericPageForProductCategory({productCategory, productCategoryId, homePageId}); +const pageEditToken = productCategoryDto.items[0].editToken; + +const title = page?.title[locale]||''; +const metaDescription = page?.seo[locale]?.metaDescription || ''; +const siteName = site.siteName[locale]; +const pageContent = page?.content[locale]!; +const shouldEmbedSquidexSDK = import.meta.env.MODE === 'development'; +const renderContext = { + ...Astro.params, + title, + metaDescription, + siteName, + pageComponents: pageContent, + page, + site, + isHomePage: false, + isLocaleHomepage: false, + shouldEmbedSquidexSDK, +} +--- + + + { metaDescription && } + { + Object.entries(SupportedLocales).map((supportedLanguage) => { + return ( + + ); + }) + } + +
    + + +
    + + + +
    + + diff --git a/src/pages/view/products/[...productLookup].astro b/src/pages/view/products/[...productLookup].astro new file mode 100644 index 0000000..97cd671 --- /dev/null +++ b/src/pages/view/products/[...productLookup].astro @@ -0,0 +1,129 @@ +--- +import Layout from "../../../layouts/Layout.astro"; +import { getProductsByIds, getSite, getSiteConfig, getSiteHomePage } from "../../../data/api-client"; +import { genericPageForProduct } from "../../../lib/page-from-models"; +import { SupportedLocales } from "../../../data/internals/MultilingualT"; +import type { Page } from "../../../data/models/multis/Page"; +import type { Site } from "../../../data/models/singles/Site"; +import { pick as pickLanguage } from "../../../lib/accept-language-parser"; +import { overrideLocaleFromUrl, localeFromLang } from "../../../lib/locales"; +import Banner from "../../../components/Banner.astro"; +import ComponentRouter from "../../../components/ComponentRouter.astro"; +// import { Disclaimers } from "../../../lib/disclaimer"; +import { renderMarkdown } from "../../../lib/rendering"; +import Disclaimers from "../../../components/Disclaimers.astro"; + +const { productLookup, resource, id } = Astro.params; + +const locale = overrideLocaleFromUrl(productLookup!, localeFromLang(pickLanguage(['en', 'es', 'fr'], Astro.request.headers.get('Accept-Language')||'en-US', { loose: true })||'en')); + +const productLookupParts = productLookup?.split('/')||[]; +if (productLookupParts?.length < 2) { + return Astro.rewrite(`${locale}/404/`); +} +const productId = productLookupParts[1]; +const productDto = await getProductsByIds(productId); + +if (productDto.items.length < 1) { + return Astro.rewrite(`${locale}/404/`); +} +// to support product category special pages on the backend +// else if (productDto.items[0].data && productDto.items[0].data.productPage && productDto.items[0].data.productPage.iv && productDto.items[0].data.productPage.iv.length) { +// return Astro.rewrite(`/views/pages/${locale}/${productDto.items[0].data.productPage.iv[0]}`); +// } + +const siteConfigDto = await getSiteConfig(); +const siteConfig = siteConfigDto.items[0].data!; + +const siteDto = await getSite(); +const site: Site = siteDto.items[0].data!; +const siteEditToken = siteDto.items[0].editToken; + +const homePageId = site.homePage.iv[0]; +const homePageDto = await getSiteHomePage(site); +const homePage: Page = homePageDto.items[0].data!; + +const product = productDto.items[0].data!; + +Astro.response.headers.set('Content-Type', 'text/html; charset=utf-8'); + +const page = genericPageForProduct({product, productId, homePageId}); +const pageEditToken = productDto.items[0].editToken; + +const title = page?.title[locale]||''; +const metaDescription = page?.seo[locale]?.metaDescription || ''; +const siteName = site.siteName[locale]; +const pageContent = page?.content[locale]!; +const shouldEmbedSquidexSDK = import.meta.env.MODE === 'development'; +const renderContext = { + ...Astro.params, + title, + metaDescription, + siteName, + pageComponents: pageContent, + page, + site, + isHomePage: false, + isLocaleHomepage: false, + shouldEmbedSquidexSDK, + // disclaimers, +} +--- + + + { metaDescription && } + { + Object.entries(SupportedLocales).map((supportedLanguage) => { + return ( + + ); + }) + } + +
    + + +
    + + + + +
    + + diff --git a/src/pages/view/sellers/[...sellerLookup].astro b/src/pages/view/sellers/[...sellerLookup].astro new file mode 100644 index 0000000..2423c6e --- /dev/null +++ b/src/pages/view/sellers/[...sellerLookup].astro @@ -0,0 +1,115 @@ +--- +import Layout from "../../../layouts/Layout.astro"; +import { getSellersByIds, getSite, getSiteConfig, getSiteHomePage } from "../../../data/api-client"; +import { genericPageForSeller } from "../../../lib/page-from-models"; +import { SupportedLocales } from "../../../data/internals/MultilingualT"; +import type { Page } from "../../../data/models/multis/Page"; +import type { Site } from "../../../data/models/singles/Site"; +import { pick as pickLanguage } from "../../../lib/accept-language-parser"; +import { overrideLocaleFromUrl, localeFromLang } from "../../../lib/locales"; +import Banner from "../../../components/Banner.astro"; +import ComponentRouter from "../../../components/ComponentRouter.astro"; +import Disclaimers from "../../../components/Disclaimers.astro"; + +const { sellerLookup, resource, id } = Astro.params; + +const locale = overrideLocaleFromUrl(sellerLookup!, localeFromLang(pickLanguage(['en', 'es', 'fr'], Astro.request.headers.get('Accept-Language')||'en-US', { loose: true })||'en')); + +const sellerLookupParts = sellerLookup?.split('/')||[]; +if (sellerLookupParts?.length < 2) { + return Astro.rewrite(`${locale}/404/`); +} +const sellerId = sellerLookupParts[1]; +const sellerDto = await getSellersByIds(sellerId); + +if (sellerDto.items.length < 1) { + return Astro.rewrite(`${locale}/404/`); +} +// else if (sellerDto.items[0].data && sellerDto.items[0].data.sellerPage && sellerDto.items[0].data.sellerPage.iv && sellerDto.items[0].data.sellerPage.iv.length) { +// return Astro.rewrite(`/views/pages/${locale}/${sellerDto.items[0].data.sellerPage.iv[0]}`); +// } + +const siteConfigDto = await getSiteConfig(); +const siteConfig = siteConfigDto.items[0].data!; + +const siteDto = await getSite(); +const site: Site = siteDto.items[0].data!; +const siteEditToken = siteDto.items[0].editToken; + +const homePageId = site.homePage.iv[0]; +const homePageDto = await getSiteHomePage(site); +const homePage: Page = homePageDto.items[0].data!; + +const seller = sellerDto.items[0].data!; + +Astro.response.headers.set('Content-Type', 'text/html; charset=utf-8'); + +const page = genericPageForSeller({seller, sellerId, homePageId}); +const pageEditToken = sellerDto.items[0].editToken; + +const title = page?.title[locale]||''; +const metaDescription = page?.seo[locale]?.metaDescription || ''; +const siteName = site.siteName[locale]; +const pageContent = page?.content[locale]!; +const shouldEmbedSquidexSDK = import.meta.env.MODE === 'development'; +const renderContext = { + ...Astro.params, + title, + metaDescription, + siteName, + pageComponents: pageContent, + page, + site, + isHomePage: false, + isLocaleHomepage: false, + shouldEmbedSquidexSDK, +} +--- + + + { metaDescription && } + { + Object.entries(SupportedLocales).map((supportedLanguage) => { + return ( + + ); + }) + } + +
    + + +
    + + + +
    + + diff --git a/src/pages/[productLookup].astro b/src/pages1/[...productLookup].astro similarity index 71% rename from src/pages/[productLookup].astro rename to src/pages1/[...productLookup].astro index d91ac13..935bb89 100644 --- a/src/pages/[productLookup].astro +++ b/src/pages1/[...productLookup].astro @@ -1,51 +1,46 @@ --- import Layout from '../layouts/Layout.astro'; -import { type Category, ALL_CATEGORIES } from '../data/categories'; -import { type Product, ALL_PRODUCTS } from '../data/products'; -import { type Brand, ALL_BRANDS } from '../data/brands'; +import { type Brand, type Category, type Product } from '../data/api-models'; +import { brands, categories, marketplaces, products, site } from '../data/fetch-site'; +import { BlocksRenderer, type BlocksContent } from '@strapi/blocks-react-renderer'; import StarRating from '../components/StarRating.astro'; import ImageCarousel from '../components/ImageCarousel.astro'; -import markdownIt from 'markdown-it'; -import markdownItAttrs from 'markdown-it-attrs'; -import type { TreeNode } from '../types/tree'; -const md = markdownIt({ - html: true, - linkify: true, - typographer: true, -}).use( - markdownItAttrs, { - // optional, these are default options - leftDelimiter: '{', - rightDelimiter: '}', - allowedAttributes: [] // empty array = all attributes are allowed - } -); +import Breadcrumbs from '../components/Breadcrumbs.astro'; type ProductStaticPath = { params: { productLookup: string }}; export function getStaticPaths() { - return ALL_PRODUCTS.map((product) => { return { - params: { - productLookup: product.slug - } - }}); + return products.map((product) => { + return { + params: { + productLookup: product.slug + } + } + }) } const formatAsCurrency = (amount: number) => amount.toLocaleString('en-US', { style: 'currency', currency: 'USD' }); const { productLookup } = Astro.params; -const product: Product = ALL_PRODUCTS.find(p => p.slug === productLookup)!; -const categoryNode: TreeNode = ALL_CATEGORIES.findOneRecursive(c => c.id === product.categoryId)!; -const category: Category = categoryNode.value; -const brand: Brand = ALL_BRANDS.find(b => b.slug === product.brandStoreSlug)!; +const product: Product = products.find(p => p.slug === productLookup)!; +const category = product.categories.data[0].attributes; +const brand = product?.brand?.data?.attributes; +const isAnyAmazon = true;//product.amazonLink; +const showDisclaimers = isAnyAmazon; --- - +
    -

    Dasher Supply > {category.category} > {product.name}

    -

    - {product?.callout || category.description} -

    +

    Dasher Supply

    + +
    + +

    {product?.name}

    @@ -66,15 +61,15 @@ const brand: Brand = ALL_BRANDS.find(b => b.slug === product.brandStoreSlug)!;

    {product?.amazonProductDetails?.reviewCount} Reviews - { product?.brandStoreSlug && + { product?.brand?.data && }

    { product?.description && -
    + } { !product?.description && -
      +
        {product?.amazonProductDetails?.featureBullets?.map(featureBullet => (
      • {featureBullet}
      • ))} @@ -90,8 +85,12 @@ const brand: Brand = ALL_BRANDS.find(b => b.slug === product.brandStoreSlug)!;

    - {product?.amazonLink && - As an Amazon Associate I earn from qualifying purchases. Check out the latest Prime Day deals on Amazon. + {showDisclaimers && + + {isAnyAmazon && + marketplaces.filter(marketplace => marketplace.name === 'Amazon').map(marketplace => ) + } + } @@ -114,7 +113,6 @@ const brand: Brand = ALL_BRANDS.find(b => b.slug === product.brandStoreSlug)!; margin-bottom: 1em; font-family: "Holtwood One SC", sans-serif; font-weight: 600; - font-style: bold; text-shadow: -3px -3px 3px rgba(var(--accent-light), 7%), 1px -1px 0 rgba(var(--accent-light), 10%), -2px 2px 0 rgba(var(--accent-light), 5%), 3px 3px 0 rgba(var(--accent-light), 10%); } .text-gradient { @@ -136,7 +134,7 @@ const brand: Brand = ALL_BRANDS.find(b => b.slug === product.brandStoreSlug)!; font-weight: 400; font-style: normal; } - .instructions { + .callout { margin-bottom: 2rem; border: 1px solid rgba(var(--accent-light), 25%); background: linear-gradient(rgba(var(--accent-dark), 66%), rgba(var(--accent-dark), 33%)); @@ -148,7 +146,7 @@ const brand: Brand = ALL_BRANDS.find(b => b.slug === product.brandStoreSlug)!; font-size: 2.2rem; text-align: center; } - .instructions code { + .callout code { font-size: 0.8em; font-weight: bold; background: rgba(var(--accent-light), 12%); @@ -156,7 +154,7 @@ const brand: Brand = ALL_BRANDS.find(b => b.slug === product.brandStoreSlug)!; border-radius: 4px; padding: 0.3em 0.4em; } - .instructions strong { + .callout strong { color: rgb(var(--accent-light)); } .link-card-grid { diff --git a/src/pages/about.astro b/src/pages1/about.astro similarity index 86% rename from src/pages/about.astro rename to src/pages1/about.astro index 3714b3d..48832f4 100644 --- a/src/pages/about.astro +++ b/src/pages1/about.astro @@ -1,15 +1,18 @@ --- import Layout from '../layouts/Layout.astro'; import CategoryCard from '../components/CategoryCard.astro'; -// import { about } from '../data/about'; -import { ALL_CATEGORIES } from '../data/categories'; +import Breadcrumbs from '../components/Breadcrumbs.astro'; +import { site, marketplaces } from '../data/fetch-site'; +import { BlocksRenderer } from '@strapi/blocks-react-renderer'; --- - +
    -

    Dasher Supply > About

    - +

    {site.siteName}

    +

    Your one-stop shop for all your after-market Dasher supplies.

    @@ -17,7 +20,7 @@ import { ALL_CATEGORIES } from '../data/categories';

    Who We Are

    - Dasher Supply is a concept niche wish for delivery drivers of all sorts, including Dashers, like myself. + {site.siteName} is a concept niche wish for delivery drivers of all sorts, including Dashers, like myself. Assisted by artificial intelligence (AI) large language models (LLMs), I have hand-curated these fine products from around the web and presented them to you as they relate to your expertise in delivery services.

    @@ -29,19 +32,19 @@ import { ALL_CATEGORIES } from '../data/categories';

    Our Mission

    - Dasher Supply strives to document the latest and best quality accesories to help you along your route. I have + {site.siteName} strives to document the latest and best quality accesories to help you along your route. I have hand-picked each of these products because I believe each one of these are indispensible tools of the trade from brands you can trust. I've shopped ahead so you don't have to. Cut through the noise. Begin all of your shopping journeys here.

    Who We Aren't

    - Dasher Supply is not endorsed by or affiliated with DoorDash. + {site.siteName} is not endorsed by or affiliated with DoorDash.

    How I Earn Money

    As an Amazon Associate I earn from qualifying purchases. - Apart from this Dasher Supply website, as a DoorDash Dasher I earn by completing deliveries. + Apart from this {site.siteName} website, as a DoorDash Dasher I earn by completing deliveries.

    Cookies?

    @@ -49,7 +52,7 @@ import { ALL_CATEGORIES } from '../data/categories';

    Contact

    - You may contact me about anything related to Dasher Supply at the email address, + You may contact me about anything related to {site.siteName} at the email address, dashersupply@daball.me. I look forward to the opportunity to serve you better. If you have any product suggestions based on your experience, be sure to reach out to me and let me know; provide URL links if you have them. I'm committed to showcasing the products and services that fellow delivery drivers rave about, so that @@ -117,9 +120,7 @@ import { ALL_CATEGORIES } from '../data/categories';

    - { /* Temporarily enabled on full blast. */ } - As an Amazon Associate I earn from qualifying purchases. - Check out the latest Prime Day deals on Amazon. + {marketplaces.map(marketplace => )}
    @@ -143,7 +144,6 @@ import { ALL_CATEGORIES } from '../data/categories'; margin-bottom: 1em; font-family: "Holtwood One SC", sans-serif; font-weight: 600; - font-style: bold; text-shadow: -5px -5px 3px rgba(var(--accent-light), 7%), 3px -3px 0 rgba(var(--accent-light), 10%), -2px 2px 0 rgba(var(--accent-light), 5%), 5px 5px 0 rgba(var(--accent-light), 10%); } .text-gradient { diff --git a/src/pages/ads.txt.ts b/src/pages1/ads.txt.ts similarity index 100% rename from src/pages/ads.txt.ts rename to src/pages1/ads.txt.ts diff --git a/src/pages/brand/[brandLookup].astro b/src/pages1/brand/[brandLookup].astro similarity index 64% rename from src/pages/brand/[brandLookup].astro rename to src/pages1/brand/[brandLookup].astro index e9b80d1..daeeaf6 100644 --- a/src/pages/brand/[brandLookup].astro +++ b/src/pages1/brand/[brandLookup].astro @@ -1,28 +1,15 @@ --- import Layout from '../../layouts/Layout.astro'; -// import { useState, useEffect } from 'react'; -import { type Brand, ALL_BRANDS } from '../../data/brands'; -import { type Product, ALL_PRODUCTS } from '../../data/products'; import ProductCard from '../../components/ProductCard.astro'; -import markdownIt from 'markdown-it'; -import markdownItAttrs from 'markdown-it-attrs'; -const md = markdownIt({ - html: true, - linkify: true, - typographer: true, -}).use( - markdownItAttrs, { - // optional, these are default options - leftDelimiter: '{', - rightDelimiter: '}', - allowedAttributes: [] // empty array = all attributes are allowed - } -); +import { brands, marketplaces, site } from '../../data/fetch-site'; +import type { Brand, Product } from '../../data/api-models'; +import { BlocksRenderer } from '@strapi/blocks-react-renderer'; +import Breadcrumbs from '../../components/Breadcrumbs.astro'; type BrandStaticPath = { params: { brandLookup: string }}; export function getStaticPaths() { - return ALL_BRANDS.map((brand: Brand) => { return { + return brands.map((brand: Brand) => { return { params: { brandLookup: brand.slug } @@ -30,24 +17,34 @@ export function getStaticPaths() { } const { brandLookup } = Astro.params; -const brand: Brand = ALL_BRANDS.find(b => b.slug === brandLookup)!; -const brandProducts: Product[] = ALL_PRODUCTS.filter(p => p.brandStoreSlug === brand.slug)||[]; -const isAnyAmazon = brandProducts.find(p => p.amazonLink) || false; +const brand: Brand = brands.find(b => b.slug === brandLookup)!; +const brandProducts: Product[] = brand.products.data.map(data => data.attributes); +const isAnyAmazon = true; //brandProducts.find(p => p.amazonLink) || false; +const showDisclaimers = isAnyAmazon; --- - +
    -

    Dasher Supply > {brand.name} Store

    +

    Dasher Supply

    +
    - {brand.logoUrl &&
    } + {brand.logoImage && + brand.logoImage.data && + brand.logoImage.data.attributes && + brand.logoImage.data.attributes.url && +
    + }
    - {brand.shortDescription &&
    } + {brand.shortDescription &&
    }
    - {brand.description &&
    } + {brand.description &&
    }
    -
    - {isAnyAmazon && - As an Amazon Associate I earn from qualifying purchases. Check out the latest Prime Day deals on Amazon. + {showDisclaimers && + + {isAnyAmazon && + marketplaces.filter(marketplace => marketplace.name === 'Amazon').map(marketplace => ) + } + }
    @@ -80,7 +81,6 @@ const isAnyAmazon = brandProducts.find(p => p.amazonLink) || false; margin-bottom: 1em; font-family: "Holtwood One SC", sans-serif; font-weight: 600; - font-style: bold; text-shadow: -5px -5px 3px rgba(var(--accent-light), 7%), 3px -3px 0 rgba(var(--accent-light), 10%), -2px 2px 0 rgba(var(--accent-light), 5%), 5px 5px 0 rgba(var(--accent-light), 10%); } .text-gradient { diff --git a/src/pages/category/[...categoryLookup].astro b/src/pages1/category/[...categoryLookup].astro similarity index 50% rename from src/pages/category/[...categoryLookup].astro rename to src/pages1/category/[...categoryLookup].astro index bd77d10..32462d9 100644 --- a/src/pages/category/[...categoryLookup].astro +++ b/src/pages1/category/[...categoryLookup].astro @@ -1,36 +1,72 @@ --- import Layout from '../../layouts/Layout.astro'; -// import { useState, useEffect } from 'react'; -import { ALL_CATEGORIES, type Category, getCategoryNodeForSlug } from '../../data/categories'; -import { ALL_PRODUCTS } from '../../data/products'; import ProductCard from '../../components/ProductCard.astro'; -import { DeepArray } from '../../types/deep-array'; +import { BlocksRenderer } from '@strapi/blocks-react-renderer'; +import { type Category, type HasId, type Product } from '../../data/api-models'; +import { site, categories, marketplaces } from '../../data/fetch-site'; +import Breadcrumbs, { type Breadcrumb } from '../../components/Breadcrumbs.astro'; +import CategoryCard from '../../components/ProductCategoryCard.astro'; type CategoryStaticPath = { params: { categoryLookup: string }}; export function getStaticPaths() { - return ALL_CATEGORIES.getAllNodes().filter(categoryNode => categoryNode.value.slug !== undefined).map(categoryNode => { return { - params: { - categoryLookup: categoryNode.value.slug! - } - }}); + return categories.filter(category => !!category.slug).map(category => { + return { + params: { + categoryLookup: category.slug, + } + }; + }); } const { categoryLookup } = Astro.params; -const categoryNode = getCategoryNodeForSlug(categoryLookup); -const category = categoryNode!.value; -const categoryProducts = ALL_PRODUCTS.filter(p => p.categoryId === category.id)!; -const isAnyAmazon = categoryProducts.find(p => p.amazonLink) || false; +const category: Category&HasId = categories.filter(category => category.slug === categoryLookup)[0]! as Category&HasId; +const categoryProducts: Product[] = category.products.data.map(data => data.attributes); +const listedSubCategories = categories + // show only subcategories + .filter(cat => cat.parentCategories.data.length && cat.parentCategories.data.find(parent => parent.id === category.id)) + // show only categories containing products + // .filter(cat => cat.products.data.length) + ; +const categoryBreadcrumbs: Breadcrumb[] = (() => { + let breadcrumbs: Breadcrumb[] = []; + const addBreadcrumb = (category: Category) => { + breadcrumbs.push({ + text: category.name, + url: `/category/${category.slug}`, + }) + }; + const recurseIntoParent = (category: Category) => { + if (category.slug) { + addBreadcrumb(category); + } + if (category.parentCategories && category.parentCategories.data && category.parentCategories.data.length) { + const parent0 = category.parentCategories.data[0].attributes; + recurseIntoParent(parent0) + } + } + recurseIntoParent(category); + return breadcrumbs.reverse(); +})(); +const isAnyAmazon = true; //categoryProducts.find(p => p.amazonLink) || false; +const showDisclaimers = isAnyAmazon; --- - +
    -

    Dasher Supply > {category.category}

    -

    - {category.description} -

    +

    Dasher Supply

    + +
    + +
    -
    - {isAnyAmazon && - As an Amazon Associate I earn from qualifying purchases. Check out the latest Prime Day deals on Amazon. + {showDisclaimers && + + {isAnyAmazon && + marketplaces.filter(marketplace => marketplace.name === 'Amazon').map(marketplace => ) + } + }
    @@ -65,7 +105,6 @@ const isAnyAmazon = categoryProducts.find(p => p.amazonLink) || false; margin-bottom: 1em; font-family: "Holtwood One SC", sans-serif; font-weight: 600; - font-style: bold; text-shadow: -5px -5px 3px rgba(var(--accent-light), 7%), 3px -3px 0 rgba(var(--accent-light), 10%), -2px 2px 0 rgba(var(--accent-light), 5%), 5px 5px 0 rgba(var(--accent-light), 10%); } .text-gradient { @@ -85,7 +124,7 @@ const isAnyAmazon = categoryProducts.find(p => p.amazonLink) || false; font-weight: 400; font-style: normal; } - .instructions { + .callout { margin-bottom: 2rem; border: 1px solid rgba(var(--accent-light), 25%); background: linear-gradient(rgba(var(--accent-dark), 66%), rgba(var(--accent-dark), 33%)); @@ -97,7 +136,7 @@ const isAnyAmazon = categoryProducts.find(p => p.amazonLink) || false; font-size: 2.2rem; text-align: center; } - .instructions code { + .callout code { font-size: 0.8em; font-weight: bold; background: rgba(var(--accent-light), 12%); @@ -105,7 +144,7 @@ const isAnyAmazon = categoryProducts.find(p => p.amazonLink) || false; border-radius: 4px; padding: 0.3em 0.4em; } - .instructions strong { + .callout strong { color: rgb(var(--accent-light)); } .link-card-grid { diff --git a/src/pages1/index.astro b/src/pages1/index.astro new file mode 100644 index 0000000..cc7d8db --- /dev/null +++ b/src/pages1/index.astro @@ -0,0 +1,127 @@ +--- +import Layout from '../layouts/Layout.astro'; +import CategoryCard from '../components/ProductCategoryCard.astro'; +import BrandCard from '../components/BrandCard.astro'; +import { BlocksRenderer } from '@strapi/blocks-react-renderer'; +import { brands, categories, marketplaces, site } from '../data/fetch-site'; +import MarketplaceCard from '../components/MarketplaceCard.astro'; +import { type Category, type HasId } from '../data/api-models'; + +const topLevelCategoryId: Category&HasId = categories.filter(category => category.parentCategories.data.length === 0)[0]! as Category&HasId; +const listedCategories = categories + // show only top level categories + .filter(category => category.parentCategories.data.length && category.parentCategories.data[0].id === topLevelCategoryId.id) + // show only categories containing products + // .filter(category => category.products.data.length) + ; +--- + + +
    +

    {site.siteName}

    +
    + +
    + +
    + +
    + +
    + +
    + +
    + + {marketplaces.map(marketplace => )} + +
    + + diff --git a/src/pages1/marketplace/[marketplaceLookup].astro b/src/pages1/marketplace/[marketplaceLookup].astro new file mode 100644 index 0000000..1d1209a --- /dev/null +++ b/src/pages1/marketplace/[marketplaceLookup].astro @@ -0,0 +1,174 @@ +--- +import Layout from '../../layouts/Layout.astro'; +import ProductCard from '../../components/ProductCard.astro'; +import { marketplaces, products, site } from '../../data/fetch-site'; +import type { Marketplace, Product } from '../../data/api-models'; +import { BlocksRenderer } from '@strapi/blocks-react-renderer'; +import Breadcrumbs from '../../components/Breadcrumbs.astro'; + +type MarketplaceStaticPath = { params: { marketplaceLookup: string }}; + +export function getStaticPaths() { + return marketplaces.map((marketplace: Marketplace) => { return { + params: { + marketplaceLookup: marketplace.slug + } + }}); +} + +const { marketplaceLookup } = Astro.params; +const marketplace: Marketplace = marketplaces.find(marketplace => marketplace.slug === marketplaceLookup)!; +const marketplaceProducts: Product[] = []; //ALL_PRODUCTS.filter(p => p.brandStoreSlug === brand.slug)||[]; +const isAnyAmazon = true;//brandProducts.find(p => p.amazonLink) || false; +const showDisclaimers = isAnyAmazon; +--- + + +
    +

    Dasher Supply

    + +
    +
    + {marketplace.logoImage && + marketplace.logoImage.data && + marketplace.logoImage.data.attributes && + marketplace.logoImage.data.attributes.url && +
    + } +
    + {marketplace.shortDescription &&
    } +
    +
    + {marketplace.description &&
    } +
    + +
    + {showDisclaimers && + + {isAnyAmazon && + marketplaces.filter(marketplace => marketplace.name === 'Amazon').map(marketplace => ) + } + + } +
    + + diff --git a/src/pages/robots.txt.ts b/src/pages1/robots.txt.ts similarity index 100% rename from src/pages/robots.txt.ts rename to src/pages1/robots.txt.ts diff --git a/src/scraper/amazon.ts b/src/scraper/amazon.ts index 98719fa..14ec63c 100644 --- a/src/scraper/amazon.ts +++ b/src/scraper/amazon.ts @@ -3,7 +3,7 @@ */ import cheerio, { type CheerioAPI } from 'cheerio'; -import { type ProductDetails } from '../data/products/amazon-product-details'; +import { type AmazonProductDetails } from '../data/products/amazon-product-details'; import { type ProductAttribute } from '../data/products/product-attribute'; import { parseNumberFromSelector } from './utils'; @@ -67,7 +67,7 @@ const extractFeatureBullets = ($: CheerioAPI): string[] => { /** * Scrapes the product details from the given Cheerio object. */ -export const extractProductDetails = ($: CheerioAPI): ProductDetails => { +export const extractProductDetails = ($: CheerioAPI): AmazonProductDetails => { const title = $(SELECTORS.TITLE).text().trim(); const description = $(SELECTORS.DESCRIPTION).text()!.trim(); diff --git a/tsconfig.json b/tsconfig.json index 032ad64..1037fa5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,11 @@ { "extends": "astro/tsconfigs/strict", "compilerOptions": { + "extendedDiagnostics": true, "jsx": "react-jsx", "jsxImportSource": "react" + }, + "ts-node": { + "esm": true, } } \ No newline at end of file