From 13eb767fa059aa59f2779a5bd729884cca4cf7e2 Mon Sep 17 00:00:00 2001 From: Niccolo Borgioli Date: Fri, 22 Nov 2024 00:36:46 +0100 Subject: [PATCH 01/13] delete old state --- .env | 1 - .gitattributes | 2 - .gitignore | 8 - .graphqlrc.yml | 1 - .npmrc | 1 - README.md | 38 - codegen.yaml | 14 - package.json | 37 - pnpm-lock.yaml | 4470 --------- src/app.css | 114 - src/app.html | 23 - src/global.d.ts | 1 - src/lib/actions/cloudinary.ts | 8 - src/lib/components/ArticleOverview.svelte | 55 - src/lib/components/Discussion.svelte | 29 - src/lib/components/Icon.svelte | 67 - src/lib/components/IconList.svelte | 61 - src/lib/components/ImageFrame.svelte | 25 - src/lib/components/Nav.svelte | 120 - src/lib/components/PageTitle.svelte | 19 - src/lib/components/PostAttributes.svelte | 34 - src/lib/components/PostPreview.svelte | 61 - src/lib/components/Progress.svelte | 62 - src/lib/components/Project.svelte | 69 - src/lib/components/SearchResult.svelte | 59 - src/lib/components/SimplePage.svelte | 24 - src/lib/components/SpacedLetters.svelte | 36 - src/lib/components/Tag.svelte | 28 - src/lib/components/Tags.svelte | 34 - src/lib/components/WPAdapter.svelte | 160 - src/lib/components/Work.svelte | 65 - src/lib/gql/gen.ts | 9512 ------------------- src/lib/gql/index.ts | 5 - src/lib/gql/root.graphql | 173 - src/lib/icons/IconAnalytics.svelte | 5 - src/lib/icons/IconCafe.svelte | 5 - src/lib/icons/IconCaretUpCircle.svelte | 5 - src/lib/icons/IconChatbubblesOutline.svelte | 19 - src/lib/icons/IconFingerPrintOutline.svelte | 7 - src/lib/icons/IconHeartSharp.svelte | 7 - src/lib/icons/IconLinkOutline.svelte | 11 - src/lib/icons/IconLogoGithub.svelte | 7 - src/lib/icons/IconMailOutline.svelte | 24 - src/lib/icons/IconPaypal.svelte | 7 - src/lib/icons/IconSearchOutline.svelte | 18 - src/lib/stores.ts | 3 - src/lib/svgs/Signature.svelte | 24 - src/lib/utils.ts | 5 - src/routes/__layout.svelte | 83 - src/routes/about.svelte | 57 - src/routes/api/[type]/[slug].json.ts | 73 - src/routes/api/search.json.ts | 30 - src/routes/blog/[slug].svelte | 36 - src/routes/blog/index.svelte | 42 - src/routes/blog/tags/[slug].svelte | 31 - src/routes/contact.svelte | 35 - src/routes/index.svelte | 100 - src/routes/privacy.svelte | 29 - src/routes/projects.svelte | 29 - src/routes/search.svelte | 86 - src/routes/support.svelte | 27 - src/routes/works/[slug].svelte | 27 - src/routes/works/index.svelte | 29 - static/images/monogramm.png | Bin 8317 -> 0 bytes svelte.config.js | 13 - tsconfig.json | 34 - 66 files changed, 16324 deletions(-) delete mode 100644 .env delete mode 100644 .gitattributes delete mode 100644 .gitignore delete mode 100644 .graphqlrc.yml delete mode 100644 .npmrc delete mode 100644 README.md delete mode 100644 codegen.yaml delete mode 100644 package.json delete mode 100644 pnpm-lock.yaml delete mode 100644 src/app.css delete mode 100644 src/app.html delete mode 100644 src/global.d.ts delete mode 100644 src/lib/actions/cloudinary.ts delete mode 100644 src/lib/components/ArticleOverview.svelte delete mode 100644 src/lib/components/Discussion.svelte delete mode 100644 src/lib/components/Icon.svelte delete mode 100644 src/lib/components/IconList.svelte delete mode 100644 src/lib/components/ImageFrame.svelte delete mode 100644 src/lib/components/Nav.svelte delete mode 100644 src/lib/components/PageTitle.svelte delete mode 100644 src/lib/components/PostAttributes.svelte delete mode 100644 src/lib/components/PostPreview.svelte delete mode 100644 src/lib/components/Progress.svelte delete mode 100644 src/lib/components/Project.svelte delete mode 100644 src/lib/components/SearchResult.svelte delete mode 100644 src/lib/components/SimplePage.svelte delete mode 100644 src/lib/components/SpacedLetters.svelte delete mode 100644 src/lib/components/Tag.svelte delete mode 100644 src/lib/components/Tags.svelte delete mode 100644 src/lib/components/WPAdapter.svelte delete mode 100644 src/lib/components/Work.svelte delete mode 100644 src/lib/gql/gen.ts delete mode 100644 src/lib/gql/index.ts delete mode 100644 src/lib/gql/root.graphql delete mode 100644 src/lib/icons/IconAnalytics.svelte delete mode 100644 src/lib/icons/IconCafe.svelte delete mode 100644 src/lib/icons/IconCaretUpCircle.svelte delete mode 100644 src/lib/icons/IconChatbubblesOutline.svelte delete mode 100644 src/lib/icons/IconFingerPrintOutline.svelte delete mode 100644 src/lib/icons/IconHeartSharp.svelte delete mode 100644 src/lib/icons/IconLinkOutline.svelte delete mode 100644 src/lib/icons/IconLogoGithub.svelte delete mode 100644 src/lib/icons/IconMailOutline.svelte delete mode 100644 src/lib/icons/IconPaypal.svelte delete mode 100644 src/lib/icons/IconSearchOutline.svelte delete mode 100644 src/lib/stores.ts delete mode 100644 src/lib/svgs/Signature.svelte delete mode 100644 src/lib/utils.ts delete mode 100644 src/routes/__layout.svelte delete mode 100644 src/routes/about.svelte delete mode 100644 src/routes/api/[type]/[slug].json.ts delete mode 100644 src/routes/api/search.json.ts delete mode 100644 src/routes/blog/[slug].svelte delete mode 100644 src/routes/blog/index.svelte delete mode 100644 src/routes/blog/tags/[slug].svelte delete mode 100644 src/routes/contact.svelte delete mode 100644 src/routes/index.svelte delete mode 100644 src/routes/privacy.svelte delete mode 100644 src/routes/projects.svelte delete mode 100644 src/routes/search.svelte delete mode 100644 src/routes/support.svelte delete mode 100644 src/routes/works/[slug].svelte delete mode 100644 src/routes/works/index.svelte delete mode 100644 static/images/monogramm.png delete mode 100644 svelte.config.js delete mode 100644 tsconfig.json diff --git a/.env b/.env deleted file mode 100644 index f9c0785..0000000 --- a/.env +++ /dev/null @@ -1 +0,0 @@ -VITE_API_URL=https://api.nicco.io/graphql \ No newline at end of file diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 08e70e8..0000000 --- a/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -*.afphoto filter=lfs diff=lfs merge=lfs -text -*.afdesign filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 6480c5e..0000000 --- a/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -.DS_Store -node_modules -/.svelte-kit -/package -/build -.vercel_build_output -.vercel -*.wpress diff --git a/.graphqlrc.yml b/.graphqlrc.yml deleted file mode 100644 index 09719dc..0000000 --- a/.graphqlrc.yml +++ /dev/null @@ -1 +0,0 @@ -schema: "https://api.nicco.io/graphql" diff --git a/.npmrc b/.npmrc deleted file mode 100644 index b6f27f1..0000000 --- a/.npmrc +++ /dev/null @@ -1 +0,0 @@ -engine-strict=true diff --git a/README.md b/README.md deleted file mode 100644 index 82510ca..0000000 --- a/README.md +++ /dev/null @@ -1,38 +0,0 @@ -# create-svelte - -Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/master/packages/create-svelte); - -## Creating a project - -If you're seeing this, you've probably already done this step. Congrats! - -```bash -# create a new project in the current directory -npm init svelte@next - -# create a new project in my-app -npm init svelte@next my-app -``` - -> Note: the `@next` is temporary - -## Developing - -Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: - -```bash -npm run dev - -# or start the server and open the app in a new browser tab -npm run dev -- --open -``` - -## Building - -Before creating a production version of your app, install an [adapter](https://kit.svelte.dev/docs#adapters) for your target environment. Then: - -```bash -npm run build -``` - -> You can preview the built app with `npm run preview`, regardless of whether you installed an adapter. This should _not_ be used to serve your app in production. diff --git a/codegen.yaml b/codegen.yaml deleted file mode 100644 index 60a00ea..0000000 --- a/codegen.yaml +++ /dev/null @@ -1,14 +0,0 @@ -schema: https://api.nicco.io/graphql -documents: "src/**/*.graphql" -generates: - ./src/lib/gql/gen.ts: - plugins: - - "@graphql-codegen/typescript" - - "@graphql-codegen/typescript-operations" - - "@graphql-codegen/typescript-graphql-request" - config: - maybeValue: "T" - typesPrefix: GQL - immutableTypes: true - useTypeImports: true - avoidOptionals: true diff --git a/package.json b/package.json deleted file mode 100644 index 9e09bae..0000000 --- a/package.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "private": true, - "scripts": { - "dev": "svelte-kit dev", - "build": "svelte-kit build", - "preview": "svelte-kit preview", - "check": "svelte-check --tsconfig ./tsconfig.json", - "check:watch": "svelte-check --tsconfig ./tsconfig.json --watch", - "generate": "graphql-codegen", - "ci": "pnpm run generate && pnpm run check && pnpm run build" - }, - "type": "module", - "devDependencies": { - "@graphql-codegen/cli": "^2.6.2", - "@graphql-codegen/typescript": "^2.4.7", - "@graphql-codegen/typescript-graphql-request": "^4.4.2", - "@graphql-codegen/typescript-operations": "^2.3.4", - "@sveltejs/adapter-static": "^1.0.0-next.29", - "@sveltejs/kit": "^1.0.0-next.295", - "@types/lunr": "^2.3.4", - "graphql": "^15.8.0", - "graphql-request": "^3.7.0", - "graphql-tag": "^2.12.6", - "svelte": "^3.46.4", - "svelte-check": "^2.4.5", - "svelte-preprocess": "^4.10.4", - "tslib": "^2.3.1", - "typescript": "^4.6.2" - }, - "dependencies": { - "dayjs": "^1.10.8", - "highlight.js": "^11.5.0", - "lodash": "^4.17.21", - "lunr": "^2.3.9", - "svelte-cloudinary": "^0.2.5" - } -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index f919205..0000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,4470 +0,0 @@ -lockfileVersion: '6.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -dependencies: - dayjs: - specifier: ^1.10.8 - version: 1.10.8 - highlight.js: - specifier: ^11.5.0 - version: 11.5.0 - lodash: - specifier: ^4.17.21 - version: 4.17.21 - lunr: - specifier: ^2.3.9 - version: 2.3.9 - svelte-cloudinary: - specifier: ^0.2.5 - version: 0.2.5(lodash@4.17.21) - -devDependencies: - '@graphql-codegen/cli': - specifier: ^2.6.2 - version: 2.6.2(graphql@15.8.0)(typescript@4.6.2) - '@graphql-codegen/typescript': - specifier: ^2.4.7 - version: 2.4.7(graphql@15.8.0) - '@graphql-codegen/typescript-graphql-request': - specifier: ^4.4.2 - version: 4.4.2(graphql-request@3.7.0)(graphql-tag@2.12.6)(graphql@15.8.0) - '@graphql-codegen/typescript-operations': - specifier: ^2.3.4 - version: 2.3.4(graphql@15.8.0) - '@sveltejs/adapter-static': - specifier: ^1.0.0-next.29 - version: 1.0.0-next.29 - '@sveltejs/kit': - specifier: ^1.0.0-next.295 - version: 1.0.0-next.295(svelte@3.46.4) - '@types/lunr': - specifier: ^2.3.4 - version: 2.3.4 - graphql: - specifier: ^15.8.0 - version: 15.8.0 - graphql-request: - specifier: ^3.7.0 - version: 3.7.0(graphql@15.8.0) - graphql-tag: - specifier: ^2.12.6 - version: 2.12.6(graphql@15.8.0) - svelte: - specifier: ^3.46.4 - version: 3.46.4 - svelte-check: - specifier: ^2.4.5 - version: 2.4.5(@babel/core@7.17.5)(svelte@3.46.4) - svelte-preprocess: - specifier: ^4.10.4 - version: 4.10.4(@babel/core@7.17.5)(svelte@3.46.4)(typescript@4.6.2) - tslib: - specifier: ^2.3.1 - version: 2.3.1 - typescript: - specifier: ^4.6.2 - version: 4.6.2 - -packages: - - /@ampproject/remapping@2.1.2: - resolution: {integrity: sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/trace-mapping': 0.3.4 - dev: true - - /@babel/code-frame@7.16.7: - resolution: {integrity: sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.16.10 - dev: true - - /@babel/code-frame@7.22.13: - resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.22.20 - chalk: 2.4.2 - dev: true - - /@babel/compat-data@7.17.0: - resolution: {integrity: sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/core@7.17.5: - resolution: {integrity: sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.1.2 - '@babel/code-frame': 7.16.7 - '@babel/generator': 7.17.3 - '@babel/helper-compilation-targets': 7.16.7(@babel/core@7.17.5) - '@babel/helper-module-transforms': 7.17.6 - '@babel/helpers': 7.17.2 - '@babel/parser': 7.17.3 - '@babel/template': 7.16.7 - '@babel/traverse': 7.23.2 - '@babel/types': 7.17.0 - convert-source-map: 1.8.0 - debug: 4.3.3 - gensync: 1.0.0-beta.2 - json5: 2.2.0 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/generator@7.17.3: - resolution: {integrity: sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 - jsesc: 2.5.2 - source-map: 0.5.7 - dev: true - - /@babel/generator@7.23.0: - resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 - jsesc: 2.5.2 - dev: true - - /@babel/helper-annotate-as-pure@7.16.7: - resolution: {integrity: sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 - dev: true - - /@babel/helper-compilation-targets@7.16.7(@babel/core@7.17.5): - resolution: {integrity: sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.17.0 - '@babel/core': 7.17.5 - '@babel/helper-validator-option': 7.16.7 - browserslist: 4.20.0 - semver: 6.3.0 - dev: true - - /@babel/helper-create-class-features-plugin@7.17.6(@babel/core@7.17.5): - resolution: {integrity: sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-annotate-as-pure': 7.16.7 - '@babel/helper-environment-visitor': 7.16.7 - '@babel/helper-function-name': 7.16.7 - '@babel/helper-member-expression-to-functions': 7.16.7 - '@babel/helper-optimise-call-expression': 7.16.7 - '@babel/helper-replace-supers': 7.16.7 - '@babel/helper-split-export-declaration': 7.16.7 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-environment-visitor@7.16.7: - resolution: {integrity: sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 - dev: true - - /@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-function-name@7.16.7: - resolution: {integrity: sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-get-function-arity': 7.16.7 - '@babel/template': 7.16.7 - '@babel/types': 7.17.0 - dev: true - - /@babel/helper-function-name@7.23.0: - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.0 - dev: true - - /@babel/helper-get-function-arity@7.16.7: - resolution: {integrity: sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 - dev: true - - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - dev: true - - /@babel/helper-member-expression-to-functions@7.16.7: - resolution: {integrity: sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 - dev: true - - /@babel/helper-module-imports@7.16.7: - resolution: {integrity: sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 - dev: true - - /@babel/helper-module-transforms@7.17.6: - resolution: {integrity: sha512-2ULmRdqoOMpdvkbT8jONrZML/XALfzxlb052bldftkicAUy8AxSCkD5trDPQcwHNmolcl7wP6ehNqMlyUw6AaA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-environment-visitor': 7.16.7 - '@babel/helper-module-imports': 7.16.7 - '@babel/helper-simple-access': 7.16.7 - '@babel/helper-split-export-declaration': 7.16.7 - '@babel/helper-validator-identifier': 7.16.7 - '@babel/template': 7.16.7 - '@babel/traverse': 7.23.2 - '@babel/types': 7.17.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-optimise-call-expression@7.16.7: - resolution: {integrity: sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 - dev: true - - /@babel/helper-plugin-utils@7.16.7: - resolution: {integrity: sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-replace-supers@7.16.7: - resolution: {integrity: sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-environment-visitor': 7.16.7 - '@babel/helper-member-expression-to-functions': 7.16.7 - '@babel/helper-optimise-call-expression': 7.16.7 - '@babel/traverse': 7.23.2 - '@babel/types': 7.17.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-simple-access@7.16.7: - resolution: {integrity: sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 - dev: true - - /@babel/helper-skip-transparent-expression-wrappers@7.16.0: - resolution: {integrity: sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 - dev: true - - /@babel/helper-split-export-declaration@7.16.7: - resolution: {integrity: sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 - dev: true - - /@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - dev: true - - /@babel/helper-string-parser@7.22.5: - resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-identifier@7.16.7: - resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-option@7.16.7: - resolution: {integrity: sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helpers@7.17.2: - resolution: {integrity: sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.16.7 - '@babel/traverse': 7.23.2 - '@babel/types': 7.17.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/highlight@7.16.10: - resolution: {integrity: sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.16.7 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true - - /@babel/highlight@7.22.20: - resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true - - /@babel/parser@7.17.3: - resolution: {integrity: sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.17.0 - dev: true - - /@babel/parser@7.23.0: - resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.23.0 - dev: true - - /@babel/plugin-proposal-class-properties@7.16.7(@babel/core@7.17.5): - resolution: {integrity: sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-create-class-features-plugin': 7.17.6(@babel/core@7.17.5) - '@babel/helper-plugin-utils': 7.16.7 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-object-rest-spread@7.17.3(@babel/core@7.17.5): - resolution: {integrity: sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.17.0 - '@babel/core': 7.17.5 - '@babel/helper-compilation-targets': 7.16.7(@babel/core@7.17.5) - '@babel/helper-plugin-utils': 7.16.7 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.17.5) - '@babel/plugin-transform-parameters': 7.16.7(@babel/core@7.17.5) - dev: true - - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.17.5): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-syntax-flow@7.16.7(@babel/core@7.17.5): - resolution: {integrity: sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-syntax-jsx@7.16.7(@babel/core@7.17.5): - resolution: {integrity: sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.17.5): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-transform-arrow-functions@7.16.7(@babel/core@7.17.5): - resolution: {integrity: sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-transform-block-scoped-functions@7.16.7(@babel/core@7.17.5): - resolution: {integrity: sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-transform-block-scoping@7.16.7(@babel/core@7.17.5): - resolution: {integrity: sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-transform-classes@7.16.7(@babel/core@7.17.5): - resolution: {integrity: sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-annotate-as-pure': 7.16.7 - '@babel/helper-environment-visitor': 7.16.7 - '@babel/helper-function-name': 7.16.7 - '@babel/helper-optimise-call-expression': 7.16.7 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/helper-replace-supers': 7.16.7 - '@babel/helper-split-export-declaration': 7.16.7 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-computed-properties@7.16.7(@babel/core@7.17.5): - resolution: {integrity: sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-transform-destructuring@7.17.3(@babel/core@7.17.5): - resolution: {integrity: sha512-dDFzegDYKlPqa72xIlbmSkly5MluLoaC1JswABGktyt6NTXSBcUuse/kWE/wvKFWJHPETpi158qJZFS3JmykJg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-transform-flow-strip-types@7.16.7(@babel/core@7.17.5): - resolution: {integrity: sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/plugin-syntax-flow': 7.16.7(@babel/core@7.17.5) - dev: true - - /@babel/plugin-transform-for-of@7.16.7(@babel/core@7.17.5): - resolution: {integrity: sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-transform-function-name@7.16.7(@babel/core@7.17.5): - resolution: {integrity: sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-compilation-targets': 7.16.7(@babel/core@7.17.5) - '@babel/helper-function-name': 7.16.7 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-transform-literals@7.16.7(@babel/core@7.17.5): - resolution: {integrity: sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-transform-member-expression-literals@7.16.7(@babel/core@7.17.5): - resolution: {integrity: sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-transform-modules-commonjs@7.16.8(@babel/core@7.17.5): - resolution: {integrity: sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-module-transforms': 7.17.6 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/helper-simple-access': 7.16.7 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-object-super@7.16.7(@babel/core@7.17.5): - resolution: {integrity: sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/helper-replace-supers': 7.16.7 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-parameters@7.16.7(@babel/core@7.17.5): - resolution: {integrity: sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-transform-property-literals@7.16.7(@babel/core@7.17.5): - resolution: {integrity: sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-transform-react-display-name@7.16.7(@babel/core@7.17.5): - resolution: {integrity: sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-transform-react-jsx@7.17.3(@babel/core@7.17.5): - resolution: {integrity: sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-annotate-as-pure': 7.16.7 - '@babel/helper-module-imports': 7.16.7 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/plugin-syntax-jsx': 7.16.7(@babel/core@7.17.5) - '@babel/types': 7.17.0 - dev: true - - /@babel/plugin-transform-shorthand-properties@7.16.7(@babel/core@7.17.5): - resolution: {integrity: sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/plugin-transform-spread@7.16.7(@babel/core@7.17.5): - resolution: {integrity: sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-plugin-utils': 7.16.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 - dev: true - - /@babel/plugin-transform-template-literals@7.16.7(@babel/core@7.17.5): - resolution: {integrity: sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.5 - '@babel/helper-plugin-utils': 7.16.7 - dev: true - - /@babel/runtime@7.17.2: - resolution: {integrity: sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.13.9 - dev: true - - /@babel/template@7.16.7: - resolution: {integrity: sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.16.7 - '@babel/parser': 7.17.3 - '@babel/types': 7.17.0 - dev: true - - /@babel/template@7.22.15: - resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 - dev: true - - /@babel/traverse@7.23.2: - resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.23.0 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 - debug: 4.3.3 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/types@7.17.0: - resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.16.7 - to-fast-properties: 2.0.0 - dev: true - - /@babel/types@7.23.0: - resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 - dev: true - - /@endemolshinegroup/cosmiconfig-typescript-loader@3.0.2(cosmiconfig@7.0.1)(typescript@4.6.2): - resolution: {integrity: sha512-QRVtqJuS1mcT56oHpVegkKBlgtWjXw/gHNWO3eL9oyB5Sc7HBoc2OLG/nYpVfT/Jejvo3NUrD0Udk7XgoyDKkA==} - engines: {node: '>=10.0.0'} - peerDependencies: - cosmiconfig: '>=6' - dependencies: - cosmiconfig: 7.0.1 - lodash.get: 4.4.2 - make-error: 1.3.6 - ts-node: 9.1.1(typescript@4.6.2) - tslib: 2.3.1 - transitivePeerDependencies: - - typescript - dev: true - - /@graphql-codegen/cli@2.6.2(graphql@15.8.0)(typescript@4.6.2): - resolution: {integrity: sha512-UO75msoVgvLEvfjCezM09cQQqp32+mR8Ma1ACsBpr7nroFvHbgcu2ulx1cMovg4sxDBCsvd9Eq/xOOMpARUxtw==} - hasBin: true - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - '@graphql-codegen/core': 2.5.1(graphql@15.8.0) - '@graphql-codegen/plugin-helpers': 2.4.2(graphql@15.8.0) - '@graphql-tools/apollo-engine-loader': 7.2.3(graphql@15.8.0) - '@graphql-tools/code-file-loader': 7.2.4(graphql@15.8.0) - '@graphql-tools/git-loader': 7.1.3(graphql@15.8.0) - '@graphql-tools/github-loader': 7.2.4(graphql@15.8.0) - '@graphql-tools/graphql-file-loader': 7.3.4(graphql@15.8.0) - '@graphql-tools/json-file-loader': 7.3.4(graphql@15.8.0) - '@graphql-tools/load': 7.5.2(graphql@15.8.0) - '@graphql-tools/prisma-loader': 7.1.2(graphql@15.8.0) - '@graphql-tools/url-loader': 7.9.2(graphql@15.8.0) - '@graphql-tools/utils': 8.6.2(graphql@15.8.0) - ansi-escapes: 4.3.2 - chalk: 4.1.2 - change-case-all: 1.0.14 - chokidar: 3.5.3 - common-tags: 1.8.2 - cosmiconfig: 7.0.1 - debounce: 1.2.1 - dependency-graph: 0.11.0 - detect-indent: 6.1.0 - glob: 7.2.0 - globby: 11.1.0 - graphql: 15.8.0 - graphql-config: 4.1.0(graphql@15.8.0)(typescript@4.6.2) - inquirer: 8.2.1 - is-glob: 4.0.3 - json-to-pretty-yaml: 1.2.2 - latest-version: 5.1.0 - listr: 0.14.3 - listr-update-renderer: 0.5.0(listr@0.14.3) - log-symbols: 4.1.0 - minimatch: 4.2.1 - mkdirp: 1.0.4 - string-env-interpolation: 1.0.1 - ts-log: 2.2.4 - tslib: 2.3.1 - valid-url: 1.0.9 - wrap-ansi: 7.0.0 - yaml: 1.10.2 - yargs: 17.3.1 - transitivePeerDependencies: - - '@types/node' - - bufferutil - - encoding - - supports-color - - typescript - - utf-8-validate - - zen-observable - - zenObservable - dev: true - - /@graphql-codegen/core@2.5.1(graphql@15.8.0): - resolution: {integrity: sha512-alctBVl2hMnBXDLwkgmnFPrZVIiBDsWJSmxJcM4GKg1PB23+xuov35GE47YAyAhQItE1B1fbYnbb1PtGiDZ4LA==} - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - '@graphql-codegen/plugin-helpers': 2.4.2(graphql@15.8.0) - '@graphql-tools/schema': 8.3.2(graphql@15.8.0) - '@graphql-tools/utils': 8.6.2(graphql@15.8.0) - graphql: 15.8.0 - tslib: 2.3.1 - dev: true - - /@graphql-codegen/plugin-helpers@2.4.2(graphql@15.8.0): - resolution: {integrity: sha512-LJNvwAPv/sKtI3RnRDm+nPD+JeOfOuSOS4FFIpQCMUCyMnFcchV/CPTTv7tT12fLUpEg6XjuFfDBvOwndti30Q==} - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - '@graphql-tools/utils': 8.6.2(graphql@15.8.0) - change-case-all: 1.0.14 - common-tags: 1.8.2 - graphql: 15.8.0 - import-from: 4.0.0 - lodash: 4.17.21 - tslib: 2.3.1 - dev: true - - /@graphql-codegen/schema-ast@2.4.1(graphql@15.8.0): - resolution: {integrity: sha512-bIWlKk/ShoVJfghA4Rt1OWnd34/dQmZM/vAe6fu6QKyOh44aAdqPtYQ2dbTyFXoknmu504etKJGEDllYNUJRfg==} - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - '@graphql-codegen/plugin-helpers': 2.4.2(graphql@15.8.0) - '@graphql-tools/utils': 8.6.2(graphql@15.8.0) - graphql: 15.8.0 - tslib: 2.3.1 - dev: true - - /@graphql-codegen/typescript-graphql-request@4.4.2(graphql-request@3.7.0)(graphql-tag@2.12.6)(graphql@15.8.0): - resolution: {integrity: sha512-mwc3EwnSF72Fl7HMblKKDz8bZO4nk4OZnwwAp4+l9LrFxhrGeUymEFeWSrQI2JLWsbu1gKQ9RFzxpkAeim4u5w==} - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - graphql-request: ^3.4.0 || ^4.0.0 - graphql-tag: ^2.0.0 - dependencies: - '@graphql-codegen/plugin-helpers': 2.4.2(graphql@15.8.0) - '@graphql-codegen/visitor-plugin-common': 2.7.3(graphql@15.8.0) - auto-bind: 4.0.0 - graphql: 15.8.0 - graphql-request: 3.7.0(graphql@15.8.0) - graphql-tag: 2.12.6(graphql@15.8.0) - tslib: 2.3.1 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /@graphql-codegen/typescript-operations@2.3.4(graphql@15.8.0): - resolution: {integrity: sha512-Jnsx+YTCqwq8F0ebyZAJGVtt+PQNuB/0uv9mEMbgcUbo/7w6EX6NZ8JArRuuz8MUb/gbpeO+GkfuNX+F6A8ikw==} - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - '@graphql-codegen/plugin-helpers': 2.4.2(graphql@15.8.0) - '@graphql-codegen/typescript': 2.4.7(graphql@15.8.0) - '@graphql-codegen/visitor-plugin-common': 2.7.3(graphql@15.8.0) - auto-bind: 4.0.0 - graphql: 15.8.0 - tslib: 2.3.1 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /@graphql-codegen/typescript@2.4.7(graphql@15.8.0): - resolution: {integrity: sha512-1YAK+m9SZRS1Uy8hdXVQAaAG/WF2jdFD76wbMRQ8Lf5e9YbmtJuy1RpI13nZJTZbhFopd9zqoWFJHsU/oy4i7g==} - peerDependencies: - graphql: ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - '@graphql-codegen/plugin-helpers': 2.4.2(graphql@15.8.0) - '@graphql-codegen/schema-ast': 2.4.1(graphql@15.8.0) - '@graphql-codegen/visitor-plugin-common': 2.7.3(graphql@15.8.0) - auto-bind: 4.0.0 - graphql: 15.8.0 - tslib: 2.3.1 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /@graphql-codegen/visitor-plugin-common@2.7.3(graphql@15.8.0): - resolution: {integrity: sha512-rODPGkrHEf9aHD8SgVWS0xie8VmJoYXLWgQR8PFKrwCUFjf7nvDuATAL2lTFiHATlVBWg1meXVPdUlkKeJj/0Q==} - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - '@graphql-codegen/plugin-helpers': 2.4.2(graphql@15.8.0) - '@graphql-tools/optimize': 1.2.0(graphql@15.8.0) - '@graphql-tools/relay-operation-optimizer': 6.4.2(graphql@15.8.0) - '@graphql-tools/utils': 8.6.2(graphql@15.8.0) - auto-bind: 4.0.0 - change-case-all: 1.0.14 - dependency-graph: 0.11.0 - graphql: 15.8.0 - graphql-tag: 2.12.6(graphql@15.8.0) - parse-filepath: 1.0.2 - tslib: 2.3.1 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /@graphql-tools/apollo-engine-loader@7.2.3(graphql@15.8.0): - resolution: {integrity: sha512-c1AVwAoKf/dSQw6yn/OfwobybplDuAJWLvJS7K7Bm4BiFv0/YXiizPTMsYvxlJYg3uGvmA7fsoeicrzBdlwOpA==} - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - '@graphql-tools/utils': 8.6.2(graphql@15.8.0) - cross-undici-fetch: 0.1.25 - graphql: 15.8.0 - sync-fetch: 0.3.1 - tslib: 2.3.1 - transitivePeerDependencies: - - encoding - dev: true - - /@graphql-tools/batch-execute@8.3.2(graphql@15.8.0): - resolution: {integrity: sha512-ICWqM+MvEkIPHm18Q0cmkvm134zeQMomBKmTRxyxMNhL/ouz6Nqld52/brSlaHnzA3fczupeRJzZ0YatruGBcQ==} - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - '@graphql-tools/utils': 8.6.2(graphql@15.8.0) - dataloader: 2.0.0 - graphql: 15.8.0 - tslib: 2.3.1 - value-or-promise: 1.0.11 - dev: true - - /@graphql-tools/code-file-loader@7.2.4(graphql@15.8.0): - resolution: {integrity: sha512-KjIxYKDIbrtRGzeboYC98OnRnCvDVDC3E+suH48J4/KxweSjrG+ZpD++T/A11FdIcFb1Y5OceCw+OwjHI5OoyQ==} - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - '@graphql-tools/graphql-tag-pluck': 7.1.6(graphql@15.8.0) - '@graphql-tools/utils': 8.6.2(graphql@15.8.0) - globby: 11.1.0 - graphql: 15.8.0 - tslib: 2.3.1 - unixify: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@graphql-tools/delegate@8.5.3(graphql@15.8.0): - resolution: {integrity: sha512-e65cEmAccodc3tlVskU0JgEbHgJUGB4sbd/dk2v15nOFzjj9izBTsTdvebI1Bm28Mip10vBJj9G0jJcTeOIyhg==} - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - '@graphql-tools/batch-execute': 8.3.2(graphql@15.8.0) - '@graphql-tools/schema': 8.3.2(graphql@15.8.0) - '@graphql-tools/utils': 8.6.2(graphql@15.8.0) - dataloader: 2.0.0 - graphql: 15.8.0 - graphql-executor: 0.0.18(graphql@15.8.0) - tslib: 2.3.1 - value-or-promise: 1.0.11 - dev: true - - /@graphql-tools/git-loader@7.1.3(graphql@15.8.0): - resolution: {integrity: sha512-Ya0jRizD6F1hbajk2rwfqJKAp6dQRvzW1gzkOQmlNcQOTtTjWITsFtzk7fS02gZRWkfFBenlTBguGufh91I6bg==} - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - '@graphql-tools/graphql-tag-pluck': 7.1.6(graphql@15.8.0) - '@graphql-tools/utils': 8.6.2(graphql@15.8.0) - graphql: 15.8.0 - is-glob: 4.0.3 - micromatch: 4.0.4 - tslib: 2.3.1 - unixify: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@graphql-tools/github-loader@7.2.4(graphql@15.8.0): - resolution: {integrity: sha512-QuSN2GWgm/h3lp7o5zpi8TzHnzom4b/f5Zq4Hvprn1OsGaOviHLXQUx6AaWa07cmFvPL0se79R0sEkMZlXlpQQ==} - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - '@graphql-tools/graphql-tag-pluck': 7.1.6(graphql@15.8.0) - '@graphql-tools/utils': 8.6.2(graphql@15.8.0) - cross-undici-fetch: 0.1.25 - graphql: 15.8.0 - sync-fetch: 0.3.1 - tslib: 2.3.1 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /@graphql-tools/graphql-file-loader@7.3.4(graphql@15.8.0): - resolution: {integrity: sha512-Q0/YtDq0APR6syRclsQMNguWKRlchd8nFTOpLhfc7Xeiy21VhEEi4Ik+quRySfb7ubDfJGhiUq4MQW43FhWJvg==} - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - '@graphql-tools/import': 6.6.6(graphql@15.8.0) - '@graphql-tools/utils': 8.6.2(graphql@15.8.0) - globby: 11.1.0 - graphql: 15.8.0 - tslib: 2.3.1 - unixify: 1.0.0 - dev: true - - /@graphql-tools/graphql-tag-pluck@7.1.6(graphql@15.8.0): - resolution: {integrity: sha512-VdubvdS8pIrAPVDq6hV7ARXz2Yh8/2153+RO6i+RJOMgyFw8wOW3jRCKE93eN+Hk2pZBC2x3kzdNeUAyVpuslg==} - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - '@babel/parser': 7.17.3 - '@babel/traverse': 7.23.2 - '@babel/types': 7.17.0 - '@graphql-tools/utils': 8.6.2(graphql@15.8.0) - graphql: 15.8.0 - tslib: 2.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@graphql-tools/import@6.6.6(graphql@15.8.0): - resolution: {integrity: sha512-a0aVajxqu1MsL8EwavA44Osw20lBOIhq8IM2ZIHFPP62cPAcOB26P+Sq57DHMsSyX5YQ0ab9XPM2o4e1dQhs0w==} - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - '@graphql-tools/utils': 8.6.2(graphql@15.8.0) - graphql: 15.8.0 - resolve-from: 5.0.0 - tslib: 2.3.1 - dev: true - - /@graphql-tools/json-file-loader@7.3.4(graphql@15.8.0): - resolution: {integrity: sha512-1AROMFh8Lyorf2gTWXgVaUbU3ic84gzAgpRmJCsCla/Nnvn6JiCs4aWHsalk4ZWVXCaK04c8gk8Px1uNQUj02Q==} - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - '@graphql-tools/utils': 8.6.2(graphql@15.8.0) - globby: 11.1.0 - graphql: 15.8.0 - tslib: 2.3.1 - unixify: 1.0.0 - dev: true - - /@graphql-tools/load@7.5.2(graphql@15.8.0): - resolution: {integrity: sha512-URPqVP77mYxdZxT895DzrWf2C23S3yC/oAmXD4D4YlxR5eVVH/fxu0aZR78WcEKF331fWSiFwWy9j7BZWvkj7g==} - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - '@graphql-tools/schema': 8.3.2(graphql@15.8.0) - '@graphql-tools/utils': 8.6.2(graphql@15.8.0) - graphql: 15.8.0 - p-limit: 3.1.0 - tslib: 2.3.1 - dev: true - - /@graphql-tools/merge@8.2.3(graphql@15.8.0): - resolution: {integrity: sha512-XCSmL6/Xg8259OTWNp69B57CPWiVL69kB7pposFrufG/zaAlI9BS68dgzrxmmSqZV5ZHU4r/6Tbf6fwnEJGiSw==} - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - '@graphql-tools/utils': 8.6.2(graphql@15.8.0) - graphql: 15.8.0 - tslib: 2.3.1 - dev: true - - /@graphql-tools/optimize@1.2.0(graphql@15.8.0): - resolution: {integrity: sha512-l0PTqgHeorQdeOizUor6RB49eOAng9+abSxiC5/aHRo6hMmXVaqv5eqndlmxCpx9BkgNb3URQbK+ZZHVktkP/g==} - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - graphql: 15.8.0 - tslib: 2.3.1 - dev: true - - /@graphql-tools/prisma-loader@7.1.2(graphql@15.8.0): - resolution: {integrity: sha512-AK/MIEaCDtcV41JTtdTmRBV8I6DM102FWJDbb3rTOVtIYSjU62G23yrPca8aMVcnIneQQNJ7MKYO18agCYXzqw==} - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - '@graphql-tools/url-loader': 7.9.2(graphql@15.8.0) - '@graphql-tools/utils': 8.6.2(graphql@15.8.0) - '@types/js-yaml': 4.0.5 - '@types/json-stable-stringify': 1.0.34 - '@types/jsonwebtoken': 8.5.8 - chalk: 4.1.2 - debug: 4.3.3 - dotenv: 16.0.0 - graphql: 15.8.0 - graphql-request: 4.1.0(graphql@15.8.0) - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.0 - isomorphic-fetch: 3.0.0 - js-yaml: 4.1.0 - json-stable-stringify: 1.0.1 - jsonwebtoken: 8.5.1 - lodash: 4.17.21 - replaceall: 0.1.6 - scuid: 1.1.0 - tslib: 2.3.1 - yaml-ast-parser: 0.0.43 - transitivePeerDependencies: - - '@types/node' - - bufferutil - - encoding - - supports-color - - utf-8-validate - dev: true - - /@graphql-tools/relay-operation-optimizer@6.4.2(graphql@15.8.0): - resolution: {integrity: sha512-pc/cliYO0veVbMyM5H54lZzQh+9SxnjawqR623rc+jPuY9JUQcuIKkZzM1+E5blbtr4dvh7Bi4uzf3rJ0sxG0Q==} - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - '@graphql-tools/utils': 8.6.2(graphql@15.8.0) - graphql: 15.8.0 - relay-compiler: 12.0.0(graphql@15.8.0) - tslib: 2.3.1 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /@graphql-tools/schema@8.3.2(graphql@15.8.0): - resolution: {integrity: sha512-77feSmIuHdoxMXRbRyxE8rEziKesd/AcqKV6fmxe7Zt+PgIQITxNDew2XJJg7qFTMNM43W77Ia6njUSBxNOkwg==} - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - '@graphql-tools/merge': 8.2.3(graphql@15.8.0) - '@graphql-tools/utils': 8.6.2(graphql@15.8.0) - graphql: 15.8.0 - tslib: 2.3.1 - value-or-promise: 1.0.11 - dev: true - - /@graphql-tools/url-loader@7.9.2(graphql@15.8.0): - resolution: {integrity: sha512-CmRKGg9iao8AW1p3BgZLPwzGZoVeIiIwUfCoaxgTTOqFfJceIaIee362mbJyQD1zD0R74yCnj4CQnLbs3bd30A==} - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - '@graphql-tools/delegate': 8.5.3(graphql@15.8.0) - '@graphql-tools/utils': 8.6.2(graphql@15.8.0) - '@graphql-tools/wrap': 8.4.4(graphql@15.8.0) - '@n1ru4l/graphql-live-query': 0.9.0(graphql@15.8.0) - '@types/websocket': 1.0.5 - '@types/ws': 8.5.3 - cross-undici-fetch: 0.1.25 - dset: 3.1.1 - extract-files: 11.0.0 - graphql: 15.8.0 - graphql-sse: 1.1.0(graphql@15.8.0) - graphql-ws: 5.6.3(graphql@15.8.0) - isomorphic-ws: 4.0.1(ws@8.5.0) - meros: 1.2.0 - subscriptions-transport-ws: 0.11.0(graphql@15.8.0) - sync-fetch: 0.3.1 - tslib: 2.3.1 - value-or-promise: 1.0.11 - ws: 8.5.0 - transitivePeerDependencies: - - '@types/node' - - bufferutil - - encoding - - utf-8-validate - dev: true - - /@graphql-tools/utils@8.6.2(graphql@15.8.0): - resolution: {integrity: sha512-x1DG0cJgpJtImUlNE780B/dfp8pxvVxOD6UeykFH5rHes26S4kGokbgU8F1IgrJ1vAPm/OVBHtd2kicTsPfwdA==} - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - graphql: 15.8.0 - tslib: 2.3.1 - dev: true - - /@graphql-tools/wrap@8.4.4(graphql@15.8.0): - resolution: {integrity: sha512-roBa4FC65QLlpFCtLtmip3SibGRoLnlLUXyQgOSzW5V+lcDpbGu2GIx9A0VerKC8Cf0iqWaYgI7mhGn+mharkg==} - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - '@graphql-tools/delegate': 8.5.3(graphql@15.8.0) - '@graphql-tools/schema': 8.3.2(graphql@15.8.0) - '@graphql-tools/utils': 8.6.2(graphql@15.8.0) - graphql: 15.8.0 - tslib: 2.3.1 - value-or-promise: 1.0.11 - dev: true - - /@iarna/toml@2.2.5: - resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} - dev: true - - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.11 - '@jridgewell/trace-mapping': 0.3.20 - dev: true - - /@jridgewell/resolve-uri@3.0.5: - resolution: {integrity: sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/sourcemap-codec@1.4.11: - resolution: {integrity: sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==} - dev: true - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true - - /@jridgewell/trace-mapping@0.3.20: - resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - - /@jridgewell/trace-mapping@0.3.4: - resolution: {integrity: sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==} - dependencies: - '@jridgewell/resolve-uri': 3.0.5 - '@jridgewell/sourcemap-codec': 1.4.11 - dev: true - - /@n1ru4l/graphql-live-query@0.9.0(graphql@15.8.0): - resolution: {integrity: sha512-BTpWy1e+FxN82RnLz4x1+JcEewVdfmUhV1C6/XYD5AjS7PQp9QFF7K8bCD6gzPTr2l+prvqOyVueQhFJxB1vfg==} - peerDependencies: - graphql: ^15.4.0 || ^16.0.0 - dependencies: - graphql: 15.8.0 - dev: true - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: true - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: true - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.13.0 - dev: true - - /@rollup/pluginutils@4.2.0: - resolution: {integrity: sha512-2WUyJNRkyH5p487pGnn4tWAsxhEFKN/pT8CMgHshd5H+IXkOnKvKZwsz5ZWz+YCXkleZRAU5kwbfgF8CPfDRqA==} - engines: {node: '>= 8.0.0'} - dependencies: - estree-walker: 2.0.2 - picomatch: 2.3.1 - dev: true - - /@samverschueren/stream-to-observable@0.3.1(rxjs@6.6.7): - resolution: {integrity: sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==} - engines: {node: '>=6'} - peerDependencies: - rxjs: '*' - zen-observable: '*' - peerDependenciesMeta: - rxjs: - optional: true - zen-observable: - optional: true - dependencies: - any-observable: 0.3.0(rxjs@6.6.7) - rxjs: 6.6.7 - transitivePeerDependencies: - - zenObservable - dev: true - - /@sindresorhus/is@0.14.0: - resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} - engines: {node: '>=6'} - dev: true - - /@sveltejs/adapter-static@1.0.0-next.29: - resolution: {integrity: sha512-0hjGnfT3BRyoHnzJ2w0/xL+xICRpKneDTm45ZzggiRrc0r71WJfF6toGeg8N4QUQnj8EJ3Itm453gsS1kt7VUQ==} - dependencies: - tiny-glob: 0.2.9 - dev: true - - /@sveltejs/kit@1.0.0-next.295(svelte@3.46.4): - resolution: {integrity: sha512-4pO/swXByhU+7bhNikTjh1d4QxAMP9TZ74p7sdPuyJf5cg7Zrfk1nBtaMt0R+8+5j1xfC/XWRcxa3WnhT9bQMA==} - engines: {node: '>=14.13'} - hasBin: true - peerDependencies: - svelte: ^3.44.0 - dependencies: - '@sveltejs/vite-plugin-svelte': 1.0.0-next.39(svelte@3.46.4)(vite@2.8.6) - sade: 1.8.1 - svelte: 3.46.4 - vite: 2.8.6 - transitivePeerDependencies: - - diff-match-patch - - less - - sass - - stylus - - supports-color - dev: true - - /@sveltejs/vite-plugin-svelte@1.0.0-next.39(svelte@3.46.4)(vite@2.8.6): - resolution: {integrity: sha512-gnvvcAW2LK+KnUn8lKb2ypcXKwSp2K57mem5C4VNKfjxdRpM6+XwNavWwVf6otnDhz3qPYl/TKKW6/dRr6eeAw==} - engines: {node: ^14.13.1 || >= 16} - peerDependencies: - diff-match-patch: ^1.0.5 - svelte: ^3.44.0 - vite: ^2.7.0 - peerDependenciesMeta: - diff-match-patch: - optional: true - dependencies: - '@rollup/pluginutils': 4.2.0 - debug: 4.3.3 - kleur: 4.1.4 - magic-string: 0.25.9 - svelte: 3.46.4 - svelte-hmr: 0.14.11(svelte@3.46.4) - vite: 2.8.6 - transitivePeerDependencies: - - supports-color - dev: true - - /@szmarczak/http-timer@1.1.2: - resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} - engines: {node: '>=6'} - dependencies: - defer-to-connect: 1.1.3 - dev: true - - /@tootallnate/once@2.0.0: - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - dev: true - - /@types/js-yaml@4.0.5: - resolution: {integrity: sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==} - dev: true - - /@types/json-stable-stringify@1.0.34: - resolution: {integrity: sha512-s2cfwagOQAS8o06TcwKfr9Wx11dNGbH2E9vJz1cqV+a/LOyhWNLUNd6JSRYNzvB4d29UuJX2M0Dj9vE1T8fRXw==} - dev: true - - /@types/jsonwebtoken@8.5.8: - resolution: {integrity: sha512-zm6xBQpFDIDM6o9r6HSgDeIcLy82TKWctCXEPbJJcXb5AKmi5BNNdLXneixK4lplX3PqIVcwLBCGE/kAGnlD4A==} - dependencies: - '@types/node': 17.0.21 - dev: true - - /@types/keyv@3.1.4: - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} - dependencies: - '@types/node': 17.0.21 - dev: true - - /@types/lunr@2.3.4: - resolution: {integrity: sha512-j4x4XJwZvorEUbA519VdQ5b9AOU9TSvfi8tvxMAfP8XzNLtFex7A8vFQwqOx3WACbV0KMXbACV3cZl4/gynQ7g==} - dev: true - - /@types/node@17.0.21: - resolution: {integrity: sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==} - dev: true - - /@types/parse-json@4.0.0: - resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} - dev: true - - /@types/pug@2.0.6: - resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==} - dev: true - - /@types/responselike@1.0.0: - resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} - dependencies: - '@types/node': 17.0.21 - dev: true - - /@types/sass@1.43.1: - resolution: {integrity: sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==} - dependencies: - '@types/node': 17.0.21 - dev: true - - /@types/websocket@1.0.5: - resolution: {integrity: sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==} - dependencies: - '@types/node': 17.0.21 - dev: true - - /@types/ws@8.5.3: - resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} - dependencies: - '@types/node': 17.0.21 - dev: true - - /abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - dependencies: - event-target-shim: 5.0.1 - dev: true - - /agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - dependencies: - debug: 4.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /ansi-escapes@3.2.0: - resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==} - engines: {node: '>=4'} - dev: true - - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.21.3 - dev: true - - /ansi-regex@2.1.1: - resolution: {integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8=} - engines: {node: '>=0.10.0'} - dev: true - - /ansi-regex@3.0.0: - resolution: {integrity: sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=} - engines: {node: '>=4'} - dev: true - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true - - /ansi-styles@2.2.1: - resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} - engines: {node: '>=0.10.0'} - dev: true - - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - dev: true - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: true - - /any-observable@0.3.0(rxjs@6.6.7): - resolution: {integrity: sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==} - engines: {node: '>=6'} - peerDependencies: - rxjs: '*' - zenObservable: '*' - peerDependenciesMeta: - rxjs: - optional: true - zenObservable: - optional: true - dependencies: - rxjs: 6.6.7 - dev: true - - /anymatch@3.1.2: - resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - dev: true - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true - - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true - - /asap@2.0.6: - resolution: {integrity: sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=} - dev: true - - /asynckit@0.4.0: - resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=} - dev: true - - /auto-bind@4.0.0: - resolution: {integrity: sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==} - engines: {node: '>=8'} - dev: true - - /babel-plugin-dynamic-import-node@2.3.3: - resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==} - dependencies: - object.assign: 4.1.2 - dev: true - - /babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0: - resolution: {integrity: sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==} - dev: true - - /babel-preset-fbjs@3.4.0(@babel/core@7.17.5): - resolution: {integrity: sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.17.5 - '@babel/plugin-proposal-class-properties': 7.16.7(@babel/core@7.17.5) - '@babel/plugin-proposal-object-rest-spread': 7.17.3(@babel/core@7.17.5) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.17.5) - '@babel/plugin-syntax-flow': 7.16.7(@babel/core@7.17.5) - '@babel/plugin-syntax-jsx': 7.16.7(@babel/core@7.17.5) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.17.5) - '@babel/plugin-transform-arrow-functions': 7.16.7(@babel/core@7.17.5) - '@babel/plugin-transform-block-scoped-functions': 7.16.7(@babel/core@7.17.5) - '@babel/plugin-transform-block-scoping': 7.16.7(@babel/core@7.17.5) - '@babel/plugin-transform-classes': 7.16.7(@babel/core@7.17.5) - '@babel/plugin-transform-computed-properties': 7.16.7(@babel/core@7.17.5) - '@babel/plugin-transform-destructuring': 7.17.3(@babel/core@7.17.5) - '@babel/plugin-transform-flow-strip-types': 7.16.7(@babel/core@7.17.5) - '@babel/plugin-transform-for-of': 7.16.7(@babel/core@7.17.5) - '@babel/plugin-transform-function-name': 7.16.7(@babel/core@7.17.5) - '@babel/plugin-transform-literals': 7.16.7(@babel/core@7.17.5) - '@babel/plugin-transform-member-expression-literals': 7.16.7(@babel/core@7.17.5) - '@babel/plugin-transform-modules-commonjs': 7.16.8(@babel/core@7.17.5) - '@babel/plugin-transform-object-super': 7.16.7(@babel/core@7.17.5) - '@babel/plugin-transform-parameters': 7.16.7(@babel/core@7.17.5) - '@babel/plugin-transform-property-literals': 7.16.7(@babel/core@7.17.5) - '@babel/plugin-transform-react-display-name': 7.16.7(@babel/core@7.17.5) - '@babel/plugin-transform-react-jsx': 7.17.3(@babel/core@7.17.5) - '@babel/plugin-transform-shorthand-properties': 7.16.7(@babel/core@7.17.5) - '@babel/plugin-transform-spread': 7.16.7(@babel/core@7.17.5) - '@babel/plugin-transform-template-literals': 7.16.7(@babel/core@7.17.5) - babel-plugin-syntax-trailing-function-commas: 7.0.0-beta.0 - transitivePeerDependencies: - - supports-color - dev: true - - /backo2@1.0.2: - resolution: {integrity: sha1-MasayLEpNjRj41s+u2n038+6eUc=} - dev: true - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true - - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: true - - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: true - - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.0 - dev: true - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: true - - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - dev: true - - /browserslist@4.20.0: - resolution: {integrity: sha512-bnpOoa+DownbciXj0jVGENf8VYQnE2LNWomhYuCsMmmx9Jd9lwq0WXODuwpSsp8AVdKM2/HorrzxAfbKvWTByQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001316 - electron-to-chromium: 1.4.82 - escalade: 3.1.1 - node-releases: 2.0.2 - picocolors: 1.0.0 - dev: true - - /bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - dependencies: - node-int64: 0.4.0 - dev: true - - /buffer-crc32@0.2.13: - resolution: {integrity: sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=} - dev: true - - /buffer-equal-constant-time@1.0.1: - resolution: {integrity: sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=} - dev: true - - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true - - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: true - - /cacheable-request@6.1.0: - resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} - engines: {node: '>=8'} - dependencies: - clone-response: 1.0.2 - get-stream: 5.2.0 - http-cache-semantics: 4.1.0 - keyv: 3.1.0 - lowercase-keys: 2.0.0 - normalize-url: 4.5.1 - responselike: 1.0.2 - dev: true - - /call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} - dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.1.1 - dev: true - - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true - - /camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} - dependencies: - pascal-case: 3.1.2 - tslib: 2.3.1 - dev: true - - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: true - - /caniuse-lite@1.0.30001316: - resolution: {integrity: sha512-JgUdNoZKxPZFzbzJwy4hDSyGuH/gXz2rN51QmoR8cBQsVo58llD3A0vlRKKRt8FGf5u69P9eQyIH8/z9vN/S0Q==} - dev: true - - /capital-case@1.0.4: - resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} - dependencies: - no-case: 3.0.4 - tslib: 2.3.1 - upper-case-first: 2.0.2 - dev: true - - /chalk@1.1.3: - resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-styles: 2.2.1 - escape-string-regexp: 1.0.5 - has-ansi: 2.0.0 - strip-ansi: 3.0.1 - supports-color: 2.0.0 - dev: true - - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: true - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - - /change-case-all@1.0.14: - resolution: {integrity: sha512-CWVm2uT7dmSHdO/z1CXT/n47mWonyypzBbuCy5tN7uMg22BsfkhwT6oHmFCAk+gL1LOOxhdbB9SZz3J1KTY3gA==} - dependencies: - change-case: 4.1.2 - is-lower-case: 2.0.2 - is-upper-case: 2.0.2 - lower-case: 2.0.2 - lower-case-first: 2.0.2 - sponge-case: 1.0.1 - swap-case: 2.0.2 - title-case: 3.0.3 - upper-case: 2.0.2 - upper-case-first: 2.0.2 - dev: true - - /change-case@4.1.2: - resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} - dependencies: - camel-case: 4.1.2 - capital-case: 1.0.4 - constant-case: 3.0.4 - dot-case: 3.0.4 - header-case: 2.0.4 - no-case: 3.0.4 - param-case: 3.0.4 - pascal-case: 3.1.2 - path-case: 3.0.4 - sentence-case: 3.0.4 - snake-case: 3.0.4 - tslib: 2.3.1 - dev: true - - /chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - dev: true - - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.2 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /cli-cursor@2.1.0: - resolution: {integrity: sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=} - engines: {node: '>=4'} - dependencies: - restore-cursor: 2.0.0 - dev: true - - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - dependencies: - restore-cursor: 3.1.0 - dev: true - - /cli-spinners@2.6.1: - resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==} - engines: {node: '>=6'} - dev: true - - /cli-truncate@0.2.1: - resolution: {integrity: sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=} - engines: {node: '>=0.10.0'} - dependencies: - slice-ansi: 0.0.4 - string-width: 1.0.2 - dev: true - - /cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} - dev: true - - /cliui@6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - dev: true - - /cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - - /clone-response@1.0.2: - resolution: {integrity: sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=} - dependencies: - mimic-response: 1.0.1 - dev: true - - /clone@1.0.4: - resolution: {integrity: sha1-2jCcwmPfFZlMaIypAheco8fNfH4=} - engines: {node: '>=0.8'} - dev: true - - /cloudinary-core@2.12.3(lodash@4.17.21): - resolution: {integrity: sha512-Ll4eDzcrIVn4zCttMh3Mdi+KNz07p5EEjBT2PQSRx8Eok1lKPt3uBBenOk/w88RKK3B8SFIWcEe/mN4BHQ0p8A==} - peerDependencies: - lodash: '>=4.0' - dependencies: - lodash: 4.17.21 - dev: false - - /code-point-at@1.1.0: - resolution: {integrity: sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=} - engines: {node: '>=0.10.0'} - dev: true - - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 - dev: true - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: true - - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true - - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: true - - /common-tags@1.8.2: - resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} - engines: {node: '>=4.0.0'} - dev: true - - /concat-map@0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} - dev: true - - /constant-case@3.0.4: - resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} - dependencies: - no-case: 3.0.4 - tslib: 2.3.1 - upper-case: 2.0.2 - dev: true - - /convert-source-map@1.8.0: - resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} - dependencies: - safe-buffer: 5.1.2 - dev: true - - /cosmiconfig-toml-loader@1.0.0: - resolution: {integrity: sha512-H/2gurFWVi7xXvCyvsWRLCMekl4tITJcX0QEsDMpzxtuxDyM59xLatYNg4s/k9AA/HdtCYfj2su8mgA0GSDLDA==} - dependencies: - '@iarna/toml': 2.2.5 - dev: true - - /cosmiconfig@7.0.1: - resolution: {integrity: sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==} - engines: {node: '>=10'} - dependencies: - '@types/parse-json': 4.0.0 - import-fresh: 3.3.0 - parse-json: 5.2.0 - path-type: 4.0.0 - yaml: 1.10.2 - dev: true - - /create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - dev: true - - /cross-fetch@3.1.5: - resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} - dependencies: - node-fetch: 2.6.7 - transitivePeerDependencies: - - encoding - dev: true - - /cross-undici-fetch@0.1.25: - resolution: {integrity: sha512-KS6hm/VuRO+3jIrg4uidz3mQ8NWvCbiTTOg3yoH30zuGVUvjqZlnXw66h0kuzyfP21hDkrdIbufXCW6BAQdSNw==} - dependencies: - abort-controller: 3.0.0 - form-data-encoder: 1.7.1 - formdata-node: 4.3.2 - node-fetch: 2.6.7 - undici: 4.15.1 - web-streams-polyfill: 3.2.0 - transitivePeerDependencies: - - encoding - dev: true - - /dataloader@2.0.0: - resolution: {integrity: sha512-YzhyDAwA4TaQIhM5go+vCLmU0UikghC/t9DTQYZR2M/UvZ1MdOhPezSDZcjj9uqQJOMqjLcpWtyW2iNINdlatQ==} - dev: true - - /date-fns@1.30.1: - resolution: {integrity: sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==} - dev: true - - /dayjs@1.10.8: - resolution: {integrity: sha512-wbNwDfBHHur9UOzNUjeKUOJ0fCb0a52Wx0xInmQ7Y8FstyajiV1NmK1e00cxsr9YrE9r7yAChE0VvpuY5Rnlow==} - dev: false - - /debounce@1.2.1: - resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} - dev: true - - /debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - dev: true - - /decamelize@1.2.0: - resolution: {integrity: sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=} - engines: {node: '>=0.10.0'} - dev: true - - /decompress-response@3.3.0: - resolution: {integrity: sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=} - engines: {node: '>=4'} - dependencies: - mimic-response: 1.0.1 - dev: true - - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - dev: true - - /defaults@1.0.3: - resolution: {integrity: sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=} - dependencies: - clone: 1.0.4 - dev: true - - /defer-to-connect@1.1.3: - resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} - dev: true - - /define-properties@1.1.3: - resolution: {integrity: sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==} - engines: {node: '>= 0.4'} - dependencies: - object-keys: 1.1.1 - dev: true - - /delayed-stream@1.0.0: - resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=} - engines: {node: '>=0.4.0'} - dev: true - - /dependency-graph@0.11.0: - resolution: {integrity: sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==} - engines: {node: '>= 0.6.0'} - dev: true - - /detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - dev: true - - /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - dev: true - - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: true - - /dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} - dependencies: - no-case: 3.0.4 - tslib: 2.3.1 - dev: true - - /dotenv@16.0.0: - resolution: {integrity: sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q==} - engines: {node: '>=12'} - dev: true - - /dset@3.1.1: - resolution: {integrity: sha512-hYf+jZNNqJBD2GiMYb+5mqOIX4R4RRHXU3qWMWYN+rqcR2/YpRL2bUHr8C8fU+5DNvqYjJ8YvMGSLuVPWU1cNg==} - engines: {node: '>=4'} - dev: true - - /duplexer3@0.1.4: - resolution: {integrity: sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=} - dev: true - - /ecdsa-sig-formatter@1.0.11: - resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /electron-to-chromium@1.4.82: - resolution: {integrity: sha512-Ks+ANzLoIrFDUOJdjxYMH6CMKB8UQo5modAwvSZTxgF+vEs/U7G5IbWFUp6dS4klPkTDVdxbORuk8xAXXhMsWw==} - dev: true - - /elegant-spinner@1.0.1: - resolution: {integrity: sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=} - engines: {node: '>=0.10.0'} - dev: true - - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true - - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 - dev: true - - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - dependencies: - is-arrayish: 0.2.1 - dev: true - - /es6-promise@3.3.1: - resolution: {integrity: sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=} - dev: true - - /esbuild-android-64@0.14.26: - resolution: {integrity: sha512-HIyJ3VvigHfseaI0D+vsD8zKQ4roDUD962/vtO/KXzav6wR//Y//Qx1HUX8k5bQeQ7/0yCXlltY9VBw1MFnWFQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /esbuild-android-arm64@0.14.26: - resolution: {integrity: sha512-TxRCLxyU5yj3U8Bud9fCg3IxzIXXKaWcmDbvURm8JkRr0WvCAmwZBdLi5T8BasT1v5vrVE//M0KSHZod6HC6lA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /esbuild-darwin-64@0.14.26: - resolution: {integrity: sha512-oZJBN+CkR47Fc7KB1vowZy2kb5r+WSnsBjVEw7aI8HmR6louAgTr4bs1NwzaF6MbLi41ajaw6RdipfsM1H9PvQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /esbuild-darwin-arm64@0.14.26: - resolution: {integrity: sha512-eYW+cmP3BGVPDp+wd9bRI5CN5HjkZnrMQtj46Mj//UsSh4SRvflAp3pjs3ooA+MCpIa9xZ8091HqLqpYi7KFWA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /esbuild-freebsd-64@0.14.26: - resolution: {integrity: sha512-Q+Hs27fSBkNfUHNhphSyWfF5lxl3o9S6LFlzkC5KofxLCnCESP+7YTzAWTosYGANsPT2mvYFOraFeYEokG+5DA==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /esbuild-freebsd-arm64@0.14.26: - resolution: {integrity: sha512-MT+FuC/63oz6j/jvWOMCNqnHBYm/bNhGPArUgQX8GRhofFCeqe0NRmJbhtlHZaEeErIIjHPZQ/nXs34mfiqo/Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-32@0.14.26: - resolution: {integrity: sha512-9gqSfJ8qMDvz7wXZoinNoe9/ekPpbT+/ZgVfZEeB72ETITVPHvMbG8i0E12wG366G01vMXtlxbD9IYJsMVhe6w==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-64@0.14.26: - resolution: {integrity: sha512-aPku1lCxxXmBr5LkENSlGIbY33jjQExDzaSrNV+dDA5bHXhFnpI9UkSe+vQzrSkxgO66vNjSTNDcxg3pOXBaBw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-arm64@0.14.26: - resolution: {integrity: sha512-S0boyzv5Yx+IN1A8253nEPzHqn/W/y+CRcLYFZ1E5DscqkY7EvBao6rhff3ZxaHU9Zrkn0pLVqlJdMx3rm6D4Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-arm@0.14.26: - resolution: {integrity: sha512-m7ozLQozfgBmh9l3HWxDEVYEEG8GuTqzRoFuf9iX0xAlbtqmhhlm7M4zNMa2eyPEG+ejgHndAuvuB1hcOWvdJw==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-mips64le@0.14.26: - resolution: {integrity: sha512-TyMRc2ctQV1g9ruHg1Y793e18uDigKKsgzcZPzfxZi2z+hGK1uaSdaejGdULEJBJVMXt3/NC1T1yq0vCTiYYgg==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-ppc64le@0.14.26: - resolution: {integrity: sha512-aOJPP80m2gV8CyDqEMGbwZaGKuR45tZU1qYZ0+Cy8lWV4CWmd9iBWhCLP3eI9d7163m6t+0YO/6N3iLSVlNnpA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-riscv64@0.14.26: - resolution: {integrity: sha512-2E5xK7SNZFXhFzRbZGtUqg3MbHnrx5XzqHaGLOLdHBqOSWIAdJKB3w6WtjpLkZvPuWrKeh51XnRpk1jm0TsUjQ==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-linux-s390x@0.14.26: - resolution: {integrity: sha512-kfSuFea857mTYMp/RAFmMp9TBjf1T8F/dTRqLn2p+g8Ok30Cp1+mI2+YCmxz5Uw2JOfxyvpND0Ek1PGPMo1UsQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /esbuild-netbsd-64@0.14.26: - resolution: {integrity: sha512-tWhLwfOOqdZRwvaSYIWuic9Cj+WRRCLHe//Bmlf0ThBur9/EssRTtVh6/rC2Okp7Eb4QcerA/1wjWLYLECYD7g==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /esbuild-openbsd-64@0.14.26: - resolution: {integrity: sha512-Xj7IWpsPn/hgKNzwjLpnf6wMtV0lfw5bzn7N9vmiCKx9TBA28L2hI8G15O0s9atLKny4HpmCGwZWmReNF1Ui6g==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /esbuild-sunos-64@0.14.26: - resolution: {integrity: sha512-5odPsuhghCUYc3c1gEtz6pGq9cuGRDq1+iNdLBjZcz6IUebd0ay/AVORWchs5WddzyJA9hguxrKsPjECxX6OzQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /esbuild-windows-32@0.14.26: - resolution: {integrity: sha512-xSVyGV6xGQlAC/K+oBXC9YiGGqoKqQGXVEFQKlDGXD6rxHGK5Fch0ynuvkjaYWW/p8OWqxGVYcof5BvGjY49RA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /esbuild-windows-64@0.14.26: - resolution: {integrity: sha512-Q0Bm42+wIqHJ8yF96T7nXosILXROegRtMmuI1L0kry0YBHnCFMtjNRTyUwv8yi7o2XvVYh7DF0NHLDL4N34MuA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /esbuild-windows-arm64@0.14.26: - resolution: {integrity: sha512-+l0DB0VV4LiSoDfNsGviK/2M88IR+/fOUfQoQx08RPu7OZ7gv9BqhRLZCSCT4qHT351OTH1nPv7avRXX6JRQcg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /esbuild@0.14.26: - resolution: {integrity: sha512-v0zIYlFB9NZ82/hFljhvpA7f8rob66r68ymB7juMz6TYAAMYjKGoW+hrMfRRvic5MAOI2wE/SuykFvsELLa6eA==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - esbuild-android-64: 0.14.26 - esbuild-android-arm64: 0.14.26 - esbuild-darwin-64: 0.14.26 - esbuild-darwin-arm64: 0.14.26 - esbuild-freebsd-64: 0.14.26 - esbuild-freebsd-arm64: 0.14.26 - esbuild-linux-32: 0.14.26 - esbuild-linux-64: 0.14.26 - esbuild-linux-arm: 0.14.26 - esbuild-linux-arm64: 0.14.26 - esbuild-linux-mips64le: 0.14.26 - esbuild-linux-ppc64le: 0.14.26 - esbuild-linux-riscv64: 0.14.26 - esbuild-linux-s390x: 0.14.26 - esbuild-netbsd-64: 0.14.26 - esbuild-openbsd-64: 0.14.26 - esbuild-sunos-64: 0.14.26 - esbuild-windows-32: 0.14.26 - esbuild-windows-64: 0.14.26 - esbuild-windows-arm64: 0.14.26 - dev: true - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - dev: true - - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - dev: true - - /estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - dev: true - - /event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - dev: true - - /eventemitter3@3.1.2: - resolution: {integrity: sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==} - dev: true - - /external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - dev: true - - /extract-files@11.0.0: - resolution: {integrity: sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ==} - engines: {node: ^12.20 || >= 14.13} - dev: true - - /extract-files@9.0.0: - resolution: {integrity: sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ==} - engines: {node: ^10.17.0 || ^12.0.0 || >= 13.7.0} - dev: true - - /fast-glob@3.2.11: - resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.4 - dev: true - - /fastq@1.13.0: - resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} - dependencies: - reusify: 1.0.4 - dev: true - - /fb-watchman@2.0.1: - resolution: {integrity: sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==} - dependencies: - bser: 2.1.1 - dev: true - - /fbjs-css-vars@1.0.2: - resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} - dev: true - - /fbjs@3.0.4: - resolution: {integrity: sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==} - dependencies: - cross-fetch: 3.1.5 - fbjs-css-vars: 1.0.2 - loose-envify: 1.4.0 - object-assign: 4.1.1 - promise: 7.3.1 - setimmediate: 1.0.5 - ua-parser-js: 0.7.31 - transitivePeerDependencies: - - encoding - dev: true - - /figures@1.7.0: - resolution: {integrity: sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=} - engines: {node: '>=0.10.0'} - dependencies: - escape-string-regexp: 1.0.5 - object-assign: 4.1.1 - dev: true - - /figures@2.0.0: - resolution: {integrity: sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=} - engines: {node: '>=4'} - dependencies: - escape-string-regexp: 1.0.5 - dev: true - - /figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} - dependencies: - escape-string-regexp: 1.0.5 - dev: true - - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: true - - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - dev: true - - /form-data-encoder@1.7.1: - resolution: {integrity: sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==} - dev: true - - /form-data@3.0.1: - resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: true - - /formdata-node@4.3.2: - resolution: {integrity: sha512-k7lYJyzDOSL6h917favP8j1L0/wNyylzU+x+1w4p5haGVHNlP58dbpdJhiCUsDbWsa9HwEtLp89obQgXl2e0qg==} - engines: {node: '>= 12.20'} - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 4.0.0-beta.1 - dev: true - - /fs.realpath@1.0.0: - resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} - dev: true - - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true - - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: true - - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: true - - /get-intrinsic@1.1.1: - resolution: {integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==} - dependencies: - function-bind: 1.1.1 - has: 1.0.3 - has-symbols: 1.0.3 - dev: true - - /get-stream@4.1.0: - resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} - engines: {node: '>=6'} - dependencies: - pump: 3.0.0 - dev: true - - /get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - dependencies: - pump: 3.0.0 - dev: true - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: true - - /globalyzer@0.1.0: - resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} - dev: true - - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.2.11 - ignore: 5.2.0 - merge2: 1.4.1 - slash: 3.0.0 - dev: true - - /globrex@0.1.2: - resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - dev: true - - /got@9.6.0: - resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==} - engines: {node: '>=8.6'} - dependencies: - '@sindresorhus/is': 0.14.0 - '@szmarczak/http-timer': 1.1.2 - '@types/keyv': 3.1.4 - '@types/responselike': 1.0.0 - cacheable-request: 6.1.0 - decompress-response: 3.3.0 - duplexer3: 0.1.4 - get-stream: 4.1.0 - lowercase-keys: 1.0.1 - mimic-response: 1.0.1 - p-cancelable: 1.1.0 - to-readable-stream: 1.0.0 - url-parse-lax: 3.0.0 - dev: true - - /graceful-fs@4.2.9: - resolution: {integrity: sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==} - dev: true - - /graphql-config@4.1.0(graphql@15.8.0)(typescript@4.6.2): - resolution: {integrity: sha512-Myqay6pmdcmX3KqoH+bMbeKZ1cTODpHS2CxF1ZzNnfTE+YUpGTcp01bOw6LpzamRb0T/WTYtGFbZeXGo9Hab2Q==} - engines: {node: '>= 10.0.0'} - peerDependencies: - graphql: ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - '@endemolshinegroup/cosmiconfig-typescript-loader': 3.0.2(cosmiconfig@7.0.1)(typescript@4.6.2) - '@graphql-tools/graphql-file-loader': 7.3.4(graphql@15.8.0) - '@graphql-tools/json-file-loader': 7.3.4(graphql@15.8.0) - '@graphql-tools/load': 7.5.2(graphql@15.8.0) - '@graphql-tools/merge': 8.2.3(graphql@15.8.0) - '@graphql-tools/url-loader': 7.9.2(graphql@15.8.0) - '@graphql-tools/utils': 8.6.2(graphql@15.8.0) - cosmiconfig: 7.0.1 - cosmiconfig-toml-loader: 1.0.0 - graphql: 15.8.0 - minimatch: 3.0.4 - string-env-interpolation: 1.0.1 - transitivePeerDependencies: - - '@types/node' - - bufferutil - - encoding - - typescript - - utf-8-validate - dev: true - - /graphql-executor@0.0.18(graphql@15.8.0): - resolution: {integrity: sha512-upUSl7tfZCZ5dWG1XkOvpG70Yk3duZKcCoi/uJso4WxJVT6KIrcK4nZ4+2X/hzx46pL8wAukgYHY6iNmocRN+g==} - engines: {node: ^12.22.0 || ^14.16.0 || >=16.0.0} - peerDependencies: - graphql: ^15.0.0 || ^16.0.0 - dependencies: - graphql: 15.8.0 - dev: true - - /graphql-request@3.7.0(graphql@15.8.0): - resolution: {integrity: sha512-dw5PxHCgBneN2DDNqpWu8QkbbJ07oOziy8z+bK/TAXufsOLaETuVO4GkXrbs0WjhdKhBMN3BkpN/RIvUHkmNUQ==} - peerDependencies: - graphql: 14 - 16 - dependencies: - cross-fetch: 3.1.5 - extract-files: 9.0.0 - form-data: 3.0.1 - graphql: 15.8.0 - transitivePeerDependencies: - - encoding - dev: true - - /graphql-request@4.1.0(graphql@15.8.0): - resolution: {integrity: sha512-CBFcO6LP7cg+aBMc+x9C1dZEQsKTBZKR2J+HzuB0cR/6aaU4K4/tRXTQu8CDMp5195ZU+DTNKZZOSK1WRbTeAg==} - peerDependencies: - graphql: 14 - 16 - dependencies: - cross-fetch: 3.1.5 - extract-files: 9.0.0 - form-data: 3.0.1 - graphql: 15.8.0 - transitivePeerDependencies: - - encoding - dev: true - - /graphql-sse@1.1.0(graphql@15.8.0): - resolution: {integrity: sha512-xE8AGPJa5X+g7iFmRQw/8H+7lXIDJvSkW6lou/XSSq17opPQl+dbKOMiqraHMx52VrDgS061ZVx90OSuqS6ykA==} - engines: {node: '>=12'} - peerDependencies: - graphql: '>=0.11 <=16' - dependencies: - graphql: 15.8.0 - dev: true - - /graphql-tag@2.12.6(graphql@15.8.0): - resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} - engines: {node: '>=10'} - peerDependencies: - graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - graphql: 15.8.0 - tslib: 2.3.1 - dev: true - - /graphql-ws@5.6.3(graphql@15.8.0): - resolution: {integrity: sha512-ZolWOi6bzI35ovGROCZROB9nDbwZiJdIsaPdzW/jkICCGNb3qL/33IONY/yQiBa+Je2uA11HfY4Uxse4+/ePYA==} - engines: {node: '>=10'} - peerDependencies: - graphql: '>=0.11 <=16' - dependencies: - graphql: 15.8.0 - dev: true - - /graphql@15.8.0: - resolution: {integrity: sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==} - engines: {node: '>= 10.x'} - dev: true - - /has-ansi@2.0.0: - resolution: {integrity: sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=} - engines: {node: '>=0.10.0'} - dependencies: - ansi-regex: 2.1.1 - dev: true - - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: true - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true - - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: true - - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - dependencies: - function-bind: 1.1.1 - dev: true - - /header-case@2.0.4: - resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} - dependencies: - capital-case: 1.0.4 - tslib: 2.3.1 - dev: true - - /highlight.js@11.5.0: - resolution: {integrity: sha512-SM6WDj5/C+VfIY8pZ6yW6Xa0Fm1tniYVYWYW1Q/DcMnISZFrC3aQAZZZFAAZtybKNrGId3p/DNbFTtcTXXgYBw==} - engines: {node: '>=12.0.0'} - dev: false - - /http-cache-semantics@4.1.0: - resolution: {integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==} - dev: true - - /http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} - dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 - debug: 4.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /https-proxy-agent@5.0.0: - resolution: {integrity: sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==} - engines: {node: '>= 6'} - dependencies: - agent-base: 6.0.2 - debug: 4.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - dev: true - - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true - - /ignore@5.2.0: - resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} - engines: {node: '>= 4'} - dev: true - - /immutable@3.7.6: - resolution: {integrity: sha1-E7TTyxK++hVIKib+Gy665kAHHks=} - engines: {node: '>=0.8.0'} - dev: true - - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - dev: true - - /import-from@4.0.0: - resolution: {integrity: sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==} - engines: {node: '>=12.2'} - dev: true - - /indent-string@3.2.0: - resolution: {integrity: sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=} - engines: {node: '>=4'} - dev: true - - /inflight@1.0.6: - resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: true - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true - - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: true - - /inquirer@8.2.1: - resolution: {integrity: sha512-pxhBaw9cyTFMjwKtkjePWDhvwzvrNGAw7En4hottzlPvz80GZaMZthdDU35aA6/f5FRZf3uhE057q8w1DE3V2g==} - engines: {node: '>=12.0.0'} - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - ora: 5.4.1 - run-async: 2.4.1 - rxjs: 7.5.5 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 - dev: true - - /invariant@2.2.4: - resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} - dependencies: - loose-envify: 1.4.0 - dev: true - - /is-absolute@1.0.0: - resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} - engines: {node: '>=0.10.0'} - dependencies: - is-relative: 1.0.0 - is-windows: 1.0.2 - dev: true - - /is-arrayish@0.2.1: - resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=} - dev: true - - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: true - - /is-core-module@2.8.1: - resolution: {integrity: sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==} - dependencies: - has: 1.0.3 - dev: true - - /is-extglob@2.1.1: - resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} - engines: {node: '>=0.10.0'} - dev: true - - /is-fullwidth-code-point@1.0.0: - resolution: {integrity: sha1-754xOG8DGn8NZDr4L95QxFfvAMs=} - engines: {node: '>=0.10.0'} - dependencies: - number-is-nan: 1.0.1 - dev: true - - /is-fullwidth-code-point@2.0.0: - resolution: {integrity: sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=} - engines: {node: '>=4'} - dev: true - - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: true - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: true - - /is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - dev: true - - /is-lower-case@2.0.2: - resolution: {integrity: sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==} - dependencies: - tslib: 2.3.1 - dev: true - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true - - /is-observable@1.1.0: - resolution: {integrity: sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==} - engines: {node: '>=4'} - dependencies: - symbol-observable: 1.2.0 - dev: true - - /is-promise@2.2.2: - resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} - dev: true - - /is-relative@1.0.0: - resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} - engines: {node: '>=0.10.0'} - dependencies: - is-unc-path: 1.0.0 - dev: true - - /is-stream@1.1.0: - resolution: {integrity: sha1-EtSj3U5o4Lec6428hBc66A2RykQ=} - engines: {node: '>=0.10.0'} - dev: true - - /is-unc-path@1.0.0: - resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} - engines: {node: '>=0.10.0'} - dependencies: - unc-path-regex: 0.1.2 - dev: true - - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - dev: true - - /is-upper-case@2.0.2: - resolution: {integrity: sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==} - dependencies: - tslib: 2.3.1 - dev: true - - /is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - dev: true - - /isomorphic-fetch@3.0.0: - resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==} - dependencies: - node-fetch: 2.6.7 - whatwg-fetch: 3.6.2 - transitivePeerDependencies: - - encoding - dev: true - - /isomorphic-ws@4.0.1(ws@8.5.0): - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - dependencies: - ws: 8.5.0 - dev: true - - /iterall@1.3.0: - resolution: {integrity: sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==} - dev: true - - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: true - - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - dev: true - - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /json-buffer@3.0.0: - resolution: {integrity: sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=} - dev: true - - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true - - /json-stable-stringify@1.0.1: - resolution: {integrity: sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=} - dependencies: - jsonify: 0.0.0 - dev: true - - /json-to-pretty-yaml@1.2.2: - resolution: {integrity: sha1-9M0L0KXo/h3yWq9boRiwmf2ZLVs=} - engines: {node: '>= 0.2.0'} - dependencies: - remedial: 1.0.8 - remove-trailing-spaces: 1.0.8 - dev: true - - /json5@2.2.0: - resolution: {integrity: sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==} - engines: {node: '>=6'} - hasBin: true - dependencies: - minimist: 1.2.5 - dev: true - - /jsonify@0.0.0: - resolution: {integrity: sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=} - dev: true - - /jsonwebtoken@8.5.1: - resolution: {integrity: sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==} - engines: {node: '>=4', npm: '>=1.4.28'} - dependencies: - jws: 3.2.2 - lodash.includes: 4.3.0 - lodash.isboolean: 3.0.3 - lodash.isinteger: 4.0.4 - lodash.isnumber: 3.0.3 - lodash.isplainobject: 4.0.6 - lodash.isstring: 4.0.1 - lodash.once: 4.1.1 - ms: 2.1.3 - semver: 5.7.1 - dev: true - - /jwa@1.4.1: - resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} - dependencies: - buffer-equal-constant-time: 1.0.1 - ecdsa-sig-formatter: 1.0.11 - safe-buffer: 5.2.1 - dev: true - - /jws@3.2.2: - resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} - dependencies: - jwa: 1.4.1 - safe-buffer: 5.2.1 - dev: true - - /keyv@3.1.0: - resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} - dependencies: - json-buffer: 3.0.0 - dev: true - - /kleur@4.1.4: - resolution: {integrity: sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==} - engines: {node: '>=6'} - dev: true - - /latest-version@5.1.0: - resolution: {integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==} - engines: {node: '>=8'} - dependencies: - package-json: 6.5.0 - dev: true - - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true - - /listr-silent-renderer@1.1.1: - resolution: {integrity: sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=} - engines: {node: '>=4'} - dev: true - - /listr-update-renderer@0.5.0(listr@0.14.3): - resolution: {integrity: sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==} - engines: {node: '>=6'} - peerDependencies: - listr: ^0.14.2 - dependencies: - chalk: 1.1.3 - cli-truncate: 0.2.1 - elegant-spinner: 1.0.1 - figures: 1.7.0 - indent-string: 3.2.0 - listr: 0.14.3 - log-symbols: 1.0.2 - log-update: 2.3.0 - strip-ansi: 3.0.1 - dev: true - - /listr-verbose-renderer@0.5.0: - resolution: {integrity: sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==} - engines: {node: '>=4'} - dependencies: - chalk: 2.4.2 - cli-cursor: 2.1.0 - date-fns: 1.30.1 - figures: 2.0.0 - dev: true - - /listr@0.14.3: - resolution: {integrity: sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==} - engines: {node: '>=6'} - dependencies: - '@samverschueren/stream-to-observable': 0.3.1(rxjs@6.6.7) - is-observable: 1.1.0 - is-promise: 2.2.2 - is-stream: 1.1.0 - listr-silent-renderer: 1.1.1 - listr-update-renderer: 0.5.0(listr@0.14.3) - listr-verbose-renderer: 0.5.0 - p-map: 2.1.0 - rxjs: 6.6.7 - transitivePeerDependencies: - - zen-observable - - zenObservable - dev: true - - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - dependencies: - p-locate: 4.1.0 - dev: true - - /lodash.get@4.4.2: - resolution: {integrity: sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=} - dev: true - - /lodash.includes@4.3.0: - resolution: {integrity: sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=} - dev: true - - /lodash.isboolean@3.0.3: - resolution: {integrity: sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=} - dev: true - - /lodash.isinteger@4.0.4: - resolution: {integrity: sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=} - dev: true - - /lodash.isnumber@3.0.3: - resolution: {integrity: sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=} - dev: true - - /lodash.isplainobject@4.0.6: - resolution: {integrity: sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=} - dev: true - - /lodash.isstring@4.0.1: - resolution: {integrity: sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=} - dev: true - - /lodash.once@4.1.1: - resolution: {integrity: sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=} - dev: true - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - /log-symbols@1.0.2: - resolution: {integrity: sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=} - engines: {node: '>=0.10.0'} - dependencies: - chalk: 1.1.3 - dev: true - - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - dev: true - - /log-update@2.3.0: - resolution: {integrity: sha1-iDKP19HOeTiykoN0bwsbwSayRwg=} - engines: {node: '>=4'} - dependencies: - ansi-escapes: 3.2.0 - cli-cursor: 2.1.0 - wrap-ansi: 3.0.1 - dev: true - - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - dependencies: - js-tokens: 4.0.0 - dev: true - - /lower-case-first@2.0.2: - resolution: {integrity: sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg==} - dependencies: - tslib: 2.3.1 - dev: true - - /lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - dependencies: - tslib: 2.3.1 - dev: true - - /lowercase-keys@1.0.1: - resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} - engines: {node: '>=0.10.0'} - dev: true - - /lowercase-keys@2.0.0: - resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} - engines: {node: '>=8'} - dev: true - - /lunr@2.3.9: - resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} - dev: false - - /magic-string@0.25.9: - resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} - dependencies: - sourcemap-codec: 1.4.8 - dev: true - - /make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - dev: true - - /map-cache@0.2.2: - resolution: {integrity: sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=} - engines: {node: '>=0.10.0'} - dev: true - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true - - /meros@1.2.0: - resolution: {integrity: sha512-3QRZIS707pZQnijHdhbttXRWwrHhZJ/gzolneoxKVz9N/xmsvY/7Ls8lpnI9gxbgxjcHsAVEW3mgwiZCo6kkJQ==} - engines: {node: '>=12'} - peerDependencies: - '@types/node': '>=12' - peerDependenciesMeta: - '@types/node': - optional: true - dev: true - - /micromatch@4.0.4: - resolution: {integrity: sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: true - - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: true - - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: true - - /mimic-fn@1.2.0: - resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} - engines: {node: '>=4'} - dev: true - - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: true - - /mimic-response@1.0.1: - resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} - engines: {node: '>=4'} - dev: true - - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true - - /minimatch@3.0.4: - resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} - dependencies: - brace-expansion: 1.1.11 - dev: true - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - dev: true - - /minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 1.1.11 - dev: true - - /minimist@1.2.5: - resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} - dev: true - - /mkdirp@0.5.5: - resolution: {integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==} - hasBin: true - dependencies: - minimist: 1.2.5 - dev: true - - /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - dev: true - - /mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - dev: true - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true - - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true - - /mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - dev: true - - /nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true - - /no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} - dependencies: - lower-case: 2.0.2 - tslib: 2.3.1 - dev: true - - /node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - dev: true - - /node-fetch@2.6.7: - resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - dev: true - - /node-int64@0.4.0: - resolution: {integrity: sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=} - dev: true - - /node-releases@2.0.2: - resolution: {integrity: sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==} - dev: true - - /normalize-path@2.1.1: - resolution: {integrity: sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=} - engines: {node: '>=0.10.0'} - dependencies: - remove-trailing-separator: 1.1.0 - dev: true - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true - - /normalize-url@4.5.1: - resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} - engines: {node: '>=8'} - dev: true - - /nullthrows@1.1.1: - resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} - dev: true - - /number-is-nan@1.0.1: - resolution: {integrity: sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=} - engines: {node: '>=0.10.0'} - dev: true - - /object-assign@4.1.1: - resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} - engines: {node: '>=0.10.0'} - dev: true - - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: true - - /object.assign@4.1.2: - resolution: {integrity: sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.3 - has-symbols: 1.0.3 - object-keys: 1.1.1 - dev: true - - /once@1.4.0: - resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} - dependencies: - wrappy: 1.0.2 - dev: true - - /onetime@2.0.1: - resolution: {integrity: sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=} - engines: {node: '>=4'} - dependencies: - mimic-fn: 1.2.0 - dev: true - - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - dependencies: - mimic-fn: 2.1.0 - dev: true - - /ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} - dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.6.1 - is-interactive: 1.0.0 - is-unicode-supported: 0.1.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - dev: true - - /os-tmpdir@1.0.2: - resolution: {integrity: sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=} - engines: {node: '>=0.10.0'} - dev: true - - /p-cancelable@1.1.0: - resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} - engines: {node: '>=6'} - dev: true - - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - dependencies: - p-try: 2.2.0 - dev: true - - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - dev: true - - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - dependencies: - p-limit: 2.3.0 - dev: true - - /p-map@2.1.0: - resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} - engines: {node: '>=6'} - dev: true - - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true - - /package-json@6.5.0: - resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==} - engines: {node: '>=8'} - dependencies: - got: 9.6.0 - registry-auth-token: 4.2.1 - registry-url: 5.1.0 - semver: 6.3.0 - dev: true - - /param-case@3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} - dependencies: - dot-case: 3.0.4 - tslib: 2.3.1 - dev: true - - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - dev: true - - /parse-filepath@1.0.2: - resolution: {integrity: sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=} - engines: {node: '>=0.8'} - dependencies: - is-absolute: 1.0.0 - map-cache: 0.2.2 - path-root: 0.1.1 - dev: true - - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - dependencies: - '@babel/code-frame': 7.16.7 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - dev: true - - /pascal-case@3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} - dependencies: - no-case: 3.0.4 - tslib: 2.3.1 - dev: true - - /path-case@3.0.4: - resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} - dependencies: - dot-case: 3.0.4 - tslib: 2.3.1 - dev: true - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true - - /path-is-absolute@1.0.1: - resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} - engines: {node: '>=0.10.0'} - dev: true - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true - - /path-root-regex@0.1.2: - resolution: {integrity: sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=} - engines: {node: '>=0.10.0'} - dev: true - - /path-root@0.1.1: - resolution: {integrity: sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=} - engines: {node: '>=0.10.0'} - dependencies: - path-root-regex: 0.1.2 - dev: true - - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true - - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: true - - /postcss@8.4.8: - resolution: {integrity: sha512-2tXEqGxrjvAO6U+CJzDL2Fk2kPHTv1jQsYkSoMeOis2SsYaXRO2COxTdQp99cYvif9JTXaAk9lYGc3VhJt7JPQ==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.1 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: true - - /prepend-http@2.0.0: - resolution: {integrity: sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=} - engines: {node: '>=4'} - dev: true - - /promise@7.3.1: - resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} - dependencies: - asap: 2.0.6 - dev: true - - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - dev: true - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true - - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.5 - strip-json-comments: 2.0.1 - dev: true - - /readable-stream@3.6.0: - resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: true - - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: true - - /regenerator-runtime@0.13.9: - resolution: {integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==} - dev: true - - /registry-auth-token@4.2.1: - resolution: {integrity: sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==} - engines: {node: '>=6.0.0'} - dependencies: - rc: 1.2.8 - dev: true - - /registry-url@5.1.0: - resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==} - engines: {node: '>=8'} - dependencies: - rc: 1.2.8 - dev: true - - /relay-compiler@12.0.0(graphql@15.8.0): - resolution: {integrity: sha512-SWqeSQZ+AMU/Cr7iZsHi1e78Z7oh00I5SvR092iCJq79aupqJ6Ds+I1Pz/Vzo5uY5PY0jvC4rBJXzlIN5g9boQ==} - hasBin: true - peerDependencies: - graphql: ^15.0.0 - dependencies: - '@babel/core': 7.17.5 - '@babel/generator': 7.17.3 - '@babel/parser': 7.17.3 - '@babel/runtime': 7.17.2 - '@babel/traverse': 7.23.2 - '@babel/types': 7.17.0 - babel-preset-fbjs: 3.4.0(@babel/core@7.17.5) - chalk: 4.1.2 - fb-watchman: 2.0.1 - fbjs: 3.0.4 - glob: 7.2.0 - graphql: 15.8.0 - immutable: 3.7.6 - invariant: 2.2.4 - nullthrows: 1.1.1 - relay-runtime: 12.0.0 - signedsource: 1.0.0 - yargs: 15.4.1 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /relay-runtime@12.0.0: - resolution: {integrity: sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug==} - dependencies: - '@babel/runtime': 7.17.2 - fbjs: 3.0.4 - invariant: 2.2.4 - transitivePeerDependencies: - - encoding - dev: true - - /remedial@1.0.8: - resolution: {integrity: sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg==} - dev: true - - /remove-trailing-separator@1.1.0: - resolution: {integrity: sha1-wkvOKig62tW8P1jg1IJJuSN52O8=} - dev: true - - /remove-trailing-spaces@1.0.8: - resolution: {integrity: sha512-O3vsMYfWighyFbTd8hk8VaSj9UAGENxAtX+//ugIst2RMk5e03h6RoIS+0ylsFxY1gvmPuAY/PO4It+gPEeySA==} - dev: true - - /replaceall@0.1.6: - resolution: {integrity: sha1-gdgax663LX9cSUKt8ml6MiBojY4=} - engines: {node: '>= 0.8.x'} - dev: true - - /require-directory@2.1.1: - resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=} - engines: {node: '>=0.10.0'} - dev: true - - /require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - dev: true - - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true - - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true - - /resolve@1.22.0: - resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==} - hasBin: true - dependencies: - is-core-module: 2.8.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /responselike@1.0.2: - resolution: {integrity: sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=} - dependencies: - lowercase-keys: 1.0.1 - dev: true - - /restore-cursor@2.0.0: - resolution: {integrity: sha1-n37ih/gv0ybU/RYpI9YhKe7g368=} - engines: {node: '>=4'} - dependencies: - onetime: 2.0.1 - signal-exit: 3.0.7 - dev: true - - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - dev: true - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true - - /rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} - hasBin: true - dependencies: - glob: 7.2.0 - dev: true - - /rollup@2.70.1: - resolution: {integrity: sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA==} - engines: {node: '>=10.0.0'} - hasBin: true - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /run-async@2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} - dev: true - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - dev: true - - /rxjs@6.6.7: - resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} - engines: {npm: '>=2.0.0'} - dependencies: - tslib: 1.14.1 - dev: true - - /rxjs@7.5.5: - resolution: {integrity: sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==} - dependencies: - tslib: 2.3.1 - dev: true - - /sade@1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} - engines: {node: '>=6'} - dependencies: - mri: 1.2.0 - dev: true - - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true - - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: true - - /sander@0.5.1: - resolution: {integrity: sha1-dB4kXiMfB8r7b98PEzrfohalAq0=} - dependencies: - es6-promise: 3.3.1 - graceful-fs: 4.2.9 - mkdirp: 0.5.5 - rimraf: 2.7.1 - dev: true - - /scuid@1.1.0: - resolution: {integrity: sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg==} - dev: true - - /semver@5.7.1: - resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} - hasBin: true - dev: true - - /semver@6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} - hasBin: true - dev: true - - /sentence-case@3.0.4: - resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} - dependencies: - no-case: 3.0.4 - tslib: 2.3.1 - upper-case-first: 2.0.2 - dev: true - - /set-blocking@2.0.0: - resolution: {integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc=} - dev: true - - /setimmediate@1.0.5: - resolution: {integrity: sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=} - dev: true - - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true - - /signedsource@1.0.0: - resolution: {integrity: sha1-HdrOSYF5j5O9gzlzgD2A1S6TrWo=} - dev: true - - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true - - /slice-ansi@0.0.4: - resolution: {integrity: sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=} - engines: {node: '>=0.10.0'} - dev: true - - /snake-case@3.0.4: - resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} - dependencies: - dot-case: 3.0.4 - tslib: 2.3.1 - dev: true - - /sorcery@0.10.0: - resolution: {integrity: sha1-iukK19fLBfxZ8asMY3hF1cFaUrc=} - hasBin: true - dependencies: - buffer-crc32: 0.2.13 - minimist: 1.2.5 - sander: 0.5.1 - sourcemap-codec: 1.4.8 - dev: true - - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - dev: true - - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - - /source-map@0.5.7: - resolution: {integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=} - engines: {node: '>=0.10.0'} - dev: true - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true - - /source-map@0.7.3: - resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==} - engines: {node: '>= 8'} - dev: true - - /sourcemap-codec@1.4.8: - resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} - dev: true - - /sponge-case@1.0.1: - resolution: {integrity: sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA==} - dependencies: - tslib: 2.3.1 - dev: true - - /string-env-interpolation@1.0.1: - resolution: {integrity: sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg==} - dev: true - - /string-width@1.0.2: - resolution: {integrity: sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=} - engines: {node: '>=0.10.0'} - dependencies: - code-point-at: 1.1.0 - is-fullwidth-code-point: 1.0.0 - strip-ansi: 3.0.1 - dev: true - - /string-width@2.1.1: - resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} - engines: {node: '>=4'} - dependencies: - is-fullwidth-code-point: 2.0.0 - strip-ansi: 4.0.0 - dev: true - - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - dev: true - - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /strip-ansi@3.0.1: - resolution: {integrity: sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=} - engines: {node: '>=0.10.0'} - dependencies: - ansi-regex: 2.1.1 - dev: true - - /strip-ansi@4.0.0: - resolution: {integrity: sha1-qEeQIusaw2iocTibY1JixQXuNo8=} - engines: {node: '>=4'} - dependencies: - ansi-regex: 3.0.0 - dev: true - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - dev: true - - /strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - dependencies: - min-indent: 1.0.1 - dev: true - - /strip-json-comments@2.0.1: - resolution: {integrity: sha1-PFMZQukIwml8DsNEhYwobHygpgo=} - engines: {node: '>=0.10.0'} - dev: true - - /subscriptions-transport-ws@0.11.0(graphql@15.8.0): - resolution: {integrity: sha512-8D4C6DIH5tGiAIpp5I0wD/xRlNiZAPGHygzCe7VzyzUoxHtawzjNAY9SUTXU05/EY2NMY9/9GF0ycizkXr1CWQ==} - deprecated: The `subscriptions-transport-ws` package is no longer maintained. We recommend you use `graphql-ws` instead. For help migrating Apollo software to `graphql-ws`, see https://www.apollographql.com/docs/apollo-server/data/subscriptions/#switching-from-subscriptions-transport-ws For general help using `graphql-ws`, see https://github.com/enisdenjo/graphql-ws/blob/master/README.md - peerDependencies: - graphql: ^15.7.2 || ^16.0.0 - dependencies: - backo2: 1.0.2 - eventemitter3: 3.1.2 - graphql: 15.8.0 - iterall: 1.3.0 - symbol-observable: 1.2.0 - ws: 7.5.7 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: true - - /supports-color@2.0.0: - resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} - engines: {node: '>=0.8.0'} - dev: true - - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - dev: true - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: true - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true - - /svelte-check@2.4.5(@babel/core@7.17.5)(svelte@3.46.4): - resolution: {integrity: sha512-nRft8BbG2wcxyCdHDZ7X43xLcvDzua3xLwq6wzHGcAF3ka3Jyhv2rvgq0+SF9NwHLMefp9C2XkM6etzsxK/cMQ==} - hasBin: true - peerDependencies: - svelte: ^3.24.0 - dependencies: - chokidar: 3.5.3 - fast-glob: 3.2.11 - import-fresh: 3.3.0 - minimist: 1.2.5 - picocolors: 1.0.0 - sade: 1.8.1 - source-map: 0.7.3 - svelte: 3.46.4 - svelte-preprocess: 4.10.4(@babel/core@7.17.5)(svelte@3.46.4)(typescript@4.6.2) - typescript: 4.6.2 - transitivePeerDependencies: - - '@babel/core' - - coffeescript - - less - - node-sass - - postcss - - postcss-load-config - - pug - - sass - - stylus - - sugarss - dev: true - - /svelte-cloudinary@0.2.5(lodash@4.17.21): - resolution: {integrity: sha512-zKTuv/AmHOFVvdFLvp9hDJP1hYW/XVJ7JbCK80u93BWWNhHVOmJaSSgonfrxjfmVoV6Uu6h6LWzclzaMzLHqUg==} - dependencies: - cloudinary-core: 2.12.3(lodash@4.17.21) - transitivePeerDependencies: - - lodash - dev: false - - /svelte-hmr@0.14.11(svelte@3.46.4): - resolution: {integrity: sha512-R9CVfX6DXxW1Kn45Jtmx+yUe+sPhrbYSUp7TkzbW0jI5fVPn6lsNG9NEs5dFg5qRhFNAoVdRw5qQDLALNKhwbQ==} - engines: {node: ^12.20 || ^14.13.1 || >= 16} - peerDependencies: - svelte: '>=3.19.0' - dependencies: - svelte: 3.46.4 - dev: true - - /svelte-preprocess@4.10.4(@babel/core@7.17.5)(svelte@3.46.4)(typescript@4.6.2): - resolution: {integrity: sha512-fuwol0N4UoHsNQolLFbMqWivqcJ9N0vfWO9IuPAiX/5okfoGXURyJ6nECbuEIv0nU3M8Xe2I1ONNje2buk7l6A==} - engines: {node: '>= 9.11.2'} - requiresBuild: true - peerDependencies: - '@babel/core': ^7.10.2 - coffeescript: ^2.5.1 - less: ^3.11.3 || ^4.0.0 - node-sass: '*' - postcss: ^7 || ^8 - postcss-load-config: ^2.1.0 || ^3.0.0 - pug: ^3.0.0 - sass: ^1.26.8 - stylus: ^0.55.0 - sugarss: ^2.0.0 - svelte: ^3.23.0 - typescript: ^3.9.5 || ^4.0.0 - peerDependenciesMeta: - '@babel/core': - optional: true - coffeescript: - optional: true - less: - optional: true - node-sass: - optional: true - postcss: - optional: true - postcss-load-config: - optional: true - pug: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - typescript: - optional: true - dependencies: - '@babel/core': 7.17.5 - '@types/pug': 2.0.6 - '@types/sass': 1.43.1 - detect-indent: 6.1.0 - magic-string: 0.25.9 - sorcery: 0.10.0 - strip-indent: 3.0.0 - svelte: 3.46.4 - typescript: 4.6.2 - dev: true - - /svelte@3.46.4: - resolution: {integrity: sha512-qKJzw6DpA33CIa+C/rGp4AUdSfii0DOTCzj/2YpSKKayw5WGSS624Et9L1nU1k2OVRS9vaENQXp2CVZNU+xvIg==} - engines: {node: '>= 8'} - dev: true - - /swap-case@2.0.2: - resolution: {integrity: sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw==} - dependencies: - tslib: 2.3.1 - dev: true - - /symbol-observable@1.2.0: - resolution: {integrity: sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==} - engines: {node: '>=0.10.0'} - dev: true - - /sync-fetch@0.3.1: - resolution: {integrity: sha512-xj5qiCDap/03kpci5a+qc5wSJjc8ZSixgG2EUmH1B8Ea2sfWclQA7eH40hiHPCtkCn6MCk4Wb+dqcXdCy2PP3g==} - engines: {node: '>=8'} - dependencies: - buffer: 5.7.1 - node-fetch: 2.6.7 - transitivePeerDependencies: - - encoding - dev: true - - /through@2.3.8: - resolution: {integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=} - dev: true - - /tiny-glob@0.2.9: - resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} - dependencies: - globalyzer: 0.1.0 - globrex: 0.1.2 - dev: true - - /title-case@3.0.3: - resolution: {integrity: sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==} - dependencies: - tslib: 2.3.1 - dev: true - - /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - dependencies: - os-tmpdir: 1.0.2 - dev: true - - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: true - - /to-readable-stream@1.0.0: - resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} - engines: {node: '>=6'} - dev: true - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - dev: true - - /tr46@0.0.3: - resolution: {integrity: sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=} - dev: true - - /ts-log@2.2.4: - resolution: {integrity: sha512-DEQrfv6l7IvN2jlzc/VTdZJYsWUnQNCsueYjMkC/iXoEoi5fNan6MjeDqkvhfzbmHgdz9UxDUluX3V5HdjTydQ==} - dev: true - - /ts-node@9.1.1(typescript@4.6.2): - resolution: {integrity: sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==} - engines: {node: '>=10.0.0'} - hasBin: true - peerDependencies: - typescript: '>=2.7' - dependencies: - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - source-map-support: 0.5.21 - typescript: 4.6.2 - yn: 3.1.1 - dev: true - - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true - - /tslib@2.3.1: - resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} - dev: true - - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - dev: true - - /typescript@4.6.2: - resolution: {integrity: sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==} - engines: {node: '>=4.2.0'} - hasBin: true - dev: true - - /ua-parser-js@0.7.31: - resolution: {integrity: sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==} - dev: true - - /unc-path-regex@0.1.2: - resolution: {integrity: sha1-5z3T17DXxe2G+6xrCufYxqadUPo=} - engines: {node: '>=0.10.0'} - dev: true - - /undici@4.15.1: - resolution: {integrity: sha512-h8LJybhMKD09IyQZoQadNtIR/GmugVhTOVREunJrpV6RStriKBFdSVoFzEzTihwXi/27DIBO+Z0OGF+Mzfi0lA==} - engines: {node: '>=12.18'} - dev: true - - /unixify@1.0.0: - resolution: {integrity: sha1-OmQcjC/7zk2mg6XHDwOkYpQMIJA=} - engines: {node: '>=0.10.0'} - dependencies: - normalize-path: 2.1.1 - dev: true - - /upper-case-first@2.0.2: - resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} - dependencies: - tslib: 2.3.1 - dev: true - - /upper-case@2.0.2: - resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} - dependencies: - tslib: 2.3.1 - dev: true - - /url-parse-lax@3.0.0: - resolution: {integrity: sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=} - engines: {node: '>=4'} - dependencies: - prepend-http: 2.0.0 - dev: true - - /util-deprecate@1.0.2: - resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} - dev: true - - /valid-url@1.0.9: - resolution: {integrity: sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA=} - dev: true - - /value-or-promise@1.0.11: - resolution: {integrity: sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg==} - engines: {node: '>=12'} - dev: true - - /vite@2.8.6: - resolution: {integrity: sha512-e4H0QpludOVKkmOsRyqQ7LTcMUDF3mcgyNU4lmi0B5JUbe0ZxeBBl8VoZ8Y6Rfn9eFKYtdXNPcYK97ZwH+K2ug==} - engines: {node: '>=12.2.0'} - hasBin: true - peerDependencies: - less: '*' - sass: '*' - stylus: '*' - peerDependenciesMeta: - less: - optional: true - sass: - optional: true - stylus: - optional: true - dependencies: - esbuild: 0.14.26 - postcss: 8.4.8 - resolve: 1.22.0 - rollup: 2.70.1 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /wcwidth@1.0.1: - resolution: {integrity: sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=} - dependencies: - defaults: 1.0.3 - dev: true - - /web-streams-polyfill@3.2.0: - resolution: {integrity: sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA==} - engines: {node: '>= 8'} - dev: true - - /web-streams-polyfill@4.0.0-beta.1: - resolution: {integrity: sha512-3ux37gEX670UUphBF9AMCq8XM6iQ8Ac6A+DSRRjDoRBm1ufCkaCDdNVbaqq60PsEkdNlLKrGtv/YBP4EJXqNtQ==} - engines: {node: '>= 12'} - dev: true - - /webidl-conversions@3.0.1: - resolution: {integrity: sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=} - dev: true - - /whatwg-fetch@3.6.2: - resolution: {integrity: sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==} - dev: true - - /whatwg-url@5.0.0: - resolution: {integrity: sha1-lmRU6HZUYuN2RNNib2dCzotwll0=} - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - dev: true - - /which-module@2.0.0: - resolution: {integrity: sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=} - dev: true - - /wrap-ansi@3.0.1: - resolution: {integrity: sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=} - engines: {node: '>=4'} - dependencies: - string-width: 2.1.1 - strip-ansi: 4.0.0 - dev: true - - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true - - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true - - /wrappy@1.0.2: - resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} - dev: true - - /ws@7.5.7: - resolution: {integrity: sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true - - /ws@8.5.0: - resolution: {integrity: sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true - - /y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} - dev: true - - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: true - - /yaml-ast-parser@0.0.43: - resolution: {integrity: sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==} - dev: true - - /yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - dev: true - - /yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} - dependencies: - camelcase: 5.3.1 - decamelize: 1.2.0 - dev: true - - /yargs-parser@21.0.1: - resolution: {integrity: sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==} - engines: {node: '>=12'} - dev: true - - /yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} - dependencies: - cliui: 6.0.0 - decamelize: 1.2.0 - find-up: 4.1.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - require-main-filename: 2.0.0 - set-blocking: 2.0.0 - string-width: 4.2.3 - which-module: 2.0.0 - y18n: 4.0.3 - yargs-parser: 18.1.3 - dev: true - - /yargs@17.3.1: - resolution: {integrity: sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==} - engines: {node: '>=12'} - dependencies: - cliui: 7.0.4 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.0.1 - dev: true - - /yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - dev: true - - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true diff --git a/src/app.css b/src/app.css deleted file mode 100644 index 65603ee..0000000 --- a/src/app.css +++ /dev/null @@ -1,114 +0,0 @@ -@import url('https://fonts.googleapis.com/css2?family=Jost:wght@300;400&family=Playfair+Display&display=swap'); - -* { - box-sizing: border-box; - -webkit-overflow-scrolling: touch; - scroll-behavior: smooth; -} - -:root { - --ff: 'Jost', Roboto, -apple-system, BlinkMacSystemFont, Segoe UI, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, - Helvetica Neue, sans-serif; - --ff-alt: 'Playfair Display', serif; - --clr-light: #ffffff; - --clr-dark: #010101; - --clr-primary: hsl(219, 90%, 80%); - --clr-secondary: hsl(64, 93%, 51%); - --clr-error: hsl(0, 73.9%, 65.5%); - --clr-transparent-0: hsla(0, 0%, 0%, 0.1); - --animation: all 250ms ease; -} - -@media (prefers-color-scheme: dark) { - :root { - --clr-light: #010101; - --clr-dark: #ffffff; - --clr-primary: hsl(219, 90%, 30%); - --clr-transparent-0: hsla(0, 0%, 100%, 0.1); - } -} - -body { - margin: 0; - overflow: hidden; - - background-color: var(--clr-light); - - font-family: var(--ff); - font-size: 16px; - font-weight: lighter; - color: var(--clr-dark); - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - text-rendering: optimizeLegibility; - text-shadow: rgba(0, 0, 0, 0.01) 0 0 1px; -} - -@media (min-width: 30em) { - body { - font-size: 18px; - } -} - -h1, -h2, -h3, -h4, -h5, -h6 { - font-family: var(--ff-alt); - font-weight: normal; - margin: 1em 0 0.5em 0; - line-height: 1.2; -} - -p { - text-align: justify; - line-height: 1.5; -} - -hr { - border: 0.1px solid var(--clr-primary); -} - -a { - color: inherit; - text-decoration: none; -} - -ul { - margin: 0; - padding: 0; - padding-left: 0px; - padding-left: 1em; - list-style: square; -} - -.progress { - box-sizing: border-box; - width: 100%; - position: relative; - background: var(--clr-light); - margin: 0.5em 0; - padding: 0.1em 0.5em; - border: 1px solid var(--clr-dark); -} - -.progress > span { - position: relative; - z-index: 1; -} - -.progress > div { - height: 100%; - background: var(--clr-primary); - position: absolute; - top: 0; - left: 0; - z-index: 0; -} - -svg { - fill: currentColor; - height: auto; -} diff --git a/src/app.html b/src/app.html deleted file mode 100644 index 42e8119..0000000 --- a/src/app.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - %svelte.head% - - -
%svelte.body%
- - - - diff --git a/src/global.d.ts b/src/global.d.ts deleted file mode 100644 index 63908c6..0000000 --- a/src/global.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/src/lib/actions/cloudinary.ts b/src/lib/actions/cloudinary.ts deleted file mode 100644 index 4052937..0000000 --- a/src/lib/actions/cloudinary.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { initialize, image } from 'svelte-cloudinary' - -initialize({ cloud_name: 'cupcakearmy', secure: true }) - -export function cdn(el: HTMLImageElement, src: string) { - const cleaned = src.replace('https://api.nicco.io', '/nicco') - return image(el, { src: cleaned, bind: { width: true }, lazy: true }) -} diff --git a/src/lib/components/ArticleOverview.svelte b/src/lib/components/ArticleOverview.svelte deleted file mode 100644 index 834d1c8..0000000 --- a/src/lib/components/ArticleOverview.svelte +++ /dev/null @@ -1,55 +0,0 @@ - - - - -
- Outline - {#each headings as { text, level, href }} -
- - - {text} - -
- {/each} -
- - diff --git a/src/lib/components/Discussion.svelte b/src/lib/components/Discussion.svelte deleted file mode 100644 index 99d541e..0000000 --- a/src/lib/components/Discussion.svelte +++ /dev/null @@ -1,29 +0,0 @@ - - -
- -
- - diff --git a/src/lib/components/Icon.svelte b/src/lib/components/Icon.svelte deleted file mode 100644 index 77c3d26..0000000 --- a/src/lib/components/Icon.svelte +++ /dev/null @@ -1,67 +0,0 @@ - - - - -{#if component} - - - -{/if} - - diff --git a/src/lib/components/IconList.svelte b/src/lib/components/IconList.svelte deleted file mode 100644 index f1702e6..0000000 --- a/src/lib/components/IconList.svelte +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - diff --git a/src/lib/components/ImageFrame.svelte b/src/lib/components/ImageFrame.svelte deleted file mode 100644 index 087ce6d..0000000 --- a/src/lib/components/ImageFrame.svelte +++ /dev/null @@ -1,25 +0,0 @@ - - - - - diff --git a/src/lib/components/Nav.svelte b/src/lib/components/Nav.svelte deleted file mode 100644 index 82453e9..0000000 --- a/src/lib/components/Nav.svelte +++ /dev/null @@ -1,120 +0,0 @@ - - - - - diff --git a/src/lib/components/PageTitle.svelte b/src/lib/components/PageTitle.svelte deleted file mode 100644 index 974d0f5..0000000 --- a/src/lib/components/PageTitle.svelte +++ /dev/null @@ -1,19 +0,0 @@ - - -
-

- -

-
- - diff --git a/src/lib/components/PostAttributes.svelte b/src/lib/components/PostAttributes.svelte deleted file mode 100644 index d5ab197..0000000 --- a/src/lib/components/PostAttributes.svelte +++ /dev/null @@ -1,34 +0,0 @@ - - -
-
- {created} - {#if full && created !== modified}
Last update: {modified}{/if} -
- {#if post.content} -
~ {readingTimeInMinutes(post.content)} min
- {/if} -
- - diff --git a/src/lib/components/PostPreview.svelte b/src/lib/components/PostPreview.svelte deleted file mode 100644 index 7633697..0000000 --- a/src/lib/components/PostPreview.svelte +++ /dev/null @@ -1,61 +0,0 @@ - - - - {#if post.post.featured} - - {/if} - -

- {@html post.title} -

- -
- - diff --git a/src/lib/components/Progress.svelte b/src/lib/components/Progress.svelte deleted file mode 100644 index 66dc911..0000000 --- a/src/lib/components/Progress.svelte +++ /dev/null @@ -1,62 +0,0 @@ - - -
- - - - {$scroll.toFixed(2)} -
- - diff --git a/src/lib/components/Project.svelte b/src/lib/components/Project.svelte deleted file mode 100644 index 37118fd..0000000 --- a/src/lib/components/Project.svelte +++ /dev/null @@ -1,69 +0,0 @@ - - -
- -

{project.title}

-
-
- {project.project.description} - {dayjs(project.project.date, 'X').format('MMM YY')} -
- -

- {@html project.content} -

- - -
- - diff --git a/src/lib/components/SearchResult.svelte b/src/lib/components/SearchResult.svelte deleted file mode 100644 index b21ddc1..0000000 --- a/src/lib/components/SearchResult.svelte +++ /dev/null @@ -1,59 +0,0 @@ - - - - -
  • - -

    {slug.replace(/-/g, ' ')}

    - {type} - Score: {result.score.toFixed(1)} -
    -
  • - - diff --git a/src/lib/components/SimplePage.svelte b/src/lib/components/SimplePage.svelte deleted file mode 100644 index dcb7a1b..0000000 --- a/src/lib/components/SimplePage.svelte +++ /dev/null @@ -1,24 +0,0 @@ - - - - -
    - -
    - - diff --git a/src/lib/components/SpacedLetters.svelte b/src/lib/components/SpacedLetters.svelte deleted file mode 100644 index 3b1a818..0000000 --- a/src/lib/components/SpacedLetters.svelte +++ /dev/null @@ -1,36 +0,0 @@ - - -
    - {#if even} - {#each letters as letter}{letter}{/each} - {:else}{letters}{/if} -
    - - diff --git a/src/lib/components/Tag.svelte b/src/lib/components/Tag.svelte deleted file mode 100644 index 3020be6..0000000 --- a/src/lib/components/Tag.svelte +++ /dev/null @@ -1,28 +0,0 @@ - - - -
    - {name} {count} -
    -
    - - diff --git a/src/lib/components/Tags.svelte b/src/lib/components/Tags.svelte deleted file mode 100644 index d30b2c0..0000000 --- a/src/lib/components/Tags.svelte +++ /dev/null @@ -1,34 +0,0 @@ - - -
    - {#each tags as { slug, name, count }} - - {/each} -
    - - diff --git a/src/lib/components/WPAdapter.svelte b/src/lib/components/WPAdapter.svelte deleted file mode 100644 index c38517c..0000000 --- a/src/lib/components/WPAdapter.svelte +++ /dev/null @@ -1,160 +0,0 @@ - - -
    - {#if legend && headings} - - {/if} - {@html content} -
    - - diff --git a/src/lib/components/Work.svelte b/src/lib/components/Work.svelte deleted file mode 100644 index 73d881e..0000000 --- a/src/lib/components/Work.svelte +++ /dev/null @@ -1,65 +0,0 @@ - - -
    - - - - - -
    -
    {work.work.role}
    -
    {dayjs(work.work.date, 'X').format('MMM YY')}
    -
    - {#if work.content} -

    - {@html work.content} -

    - {/if} -
    - - diff --git a/src/lib/gql/gen.ts b/src/lib/gql/gen.ts deleted file mode 100644 index 1b5ea05..0000000 --- a/src/lib/gql/gen.ts +++ /dev/null @@ -1,9512 +0,0 @@ -import type { GraphQLClient } from 'graphql-request'; -import type * as Dom from 'graphql-request/dist/types.dom'; -import gql from 'graphql-tag'; -export type Maybe = T; -export type InputMaybe = T; -export type Exact = { [K in keyof T]: T[K] }; -export type MakeOptional = Omit & { [SubKey in K]?: Maybe }; -export type MakeMaybe = Omit & { [SubKey in K]: Maybe }; -/** All built-in and custom scalars, mapped to their actual values */ -export type Scalars = { - ID: string; - String: string; - Boolean: boolean; - Int: number; - Float: number; -}; - -/** A Field Group registered by ACF */ -export type GQLAcfFieldGroup = { - /** The name of the ACF Field Group */ - readonly fieldGroupName: Maybe; -}; - -/** Avatars are profile images for users. WordPress by default uses the Gravatar service to host and fetch avatars from. */ -export type GQLAvatar = { - readonly __typename?: 'Avatar'; - /** URL for the default image or a default type. Accepts '404' (return a 404 instead of a default image), 'retro' (8bit), 'monsterid' (monster), 'wavatar' (cartoon face), 'indenticon' (the 'quilt'), 'mystery', 'mm', or 'mysteryman' (The Oyster Man), 'blank' (transparent GIF), or 'gravatar_default' (the Gravatar logo). */ - readonly default: Maybe; - /** HTML attributes to insert in the IMG element. Is not sanitized. */ - readonly extraAttr: Maybe; - /** Whether to always show the default image, never the Gravatar. */ - readonly forceDefault: Maybe; - /** Whether the avatar was successfully found. */ - readonly foundAvatar: Maybe; - /** Height of the avatar image. */ - readonly height: Maybe; - /** Whether the object is restricted from the current viewer */ - readonly isRestricted: Maybe; - /** What rating to display avatars up to. Accepts 'G', 'PG', 'R', 'X', and are judged in that order. */ - readonly rating: Maybe; - /** Type of url scheme to use. Typically HTTP vs. HTTPS. */ - readonly scheme: Maybe; - /** The size of the avatar in pixels. A value of 96 will match a 96px x 96px gravatar image. */ - readonly size: Maybe; - /** URL for the gravatar image source. */ - readonly url: Maybe; - /** Width of the avatar image. */ - readonly width: Maybe; -}; - -/** What rating to display avatars up to. Accepts 'G', 'PG', 'R', 'X', and are judged in that order. Default is the value of the 'avatar_rating' option */ -export enum GQLAvatarRatingEnum { - /** Indicates a G level avatar rating level. */ - G = 'G', - /** Indicates a PG level avatar rating level. */ - Pg = 'PG', - /** Indicates an R level avatar rating level. */ - R = 'R', - /** Indicates an X level avatar rating level. */ - X = 'X' -} - -/** The category type */ -export type GQLCategory = GQLDatabaseIdentifier & GQLHierarchicalTermNode & GQLMenuItemLinkable & GQLNode & GQLTermNode & GQLUniformResourceIdentifiable & { - readonly __typename?: 'Category'; - /** The ancestors of the node. Default ordered as lowest (closest to the child) to highest (closest to the root). */ - readonly ancestors: Maybe; - /** - * The id field matches the WP_Post->ID field. - * @deprecated Deprecated in favor of databaseId - */ - readonly categoryId: Maybe; - /** Connection between the category type and the category type */ - readonly children: Maybe; - /** Connection between the category type and the ContentNode type */ - readonly contentNodes: Maybe; - /** The number of objects connected to the object */ - readonly count: Maybe; - /** The unique resource identifier path */ - readonly databaseId: Scalars['Int']; - /** The description of the object */ - readonly description: Maybe; - /** Connection between the TermNode type and the EnqueuedScript type */ - readonly enqueuedScripts: Maybe; - /** Connection between the TermNode type and the EnqueuedStylesheet type */ - readonly enqueuedStylesheets: Maybe; - /** The unique resource identifier path */ - readonly id: Scalars['ID']; - /** Whether the node is a Content Node */ - readonly isContentNode: Scalars['Boolean']; - /** Whether the object is restricted from the current viewer */ - readonly isRestricted: Maybe; - /** Whether the node is a Term */ - readonly isTermNode: Scalars['Boolean']; - /** The link to the term */ - readonly link: Maybe; - /** The human friendly name of the object. */ - readonly name: Maybe; - /** Connection between the category type and the category type */ - readonly parent: Maybe; - /** Database id of the parent node */ - readonly parentDatabaseId: Maybe; - /** The globally unique identifier of the parent node. */ - readonly parentId: Maybe; - /** Connection between the category type and the post type */ - readonly posts: Maybe; - /** An alphanumeric identifier for the object unique to its type. */ - readonly slug: Maybe; - /** Connection between the category type and the Taxonomy type */ - readonly taxonomy: Maybe; - /** The name of the taxonomy that the object is associated with */ - readonly taxonomyName: Maybe; - /** The ID of the term group that this term object belongs to */ - readonly termGroupId: Maybe; - /** The taxonomy ID that the object is associated with */ - readonly termTaxonomyId: Maybe; - /** The unique resource identifier path */ - readonly uri: Maybe; -}; - - -/** The category type */ -export type GQLCategoryAncestorsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - - -/** The category type */ -export type GQLCategoryChildrenArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The category type */ -export type GQLCategoryContentNodesArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The category type */ -export type GQLCategoryEnqueuedScriptsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - - -/** The category type */ -export type GQLCategoryEnqueuedStylesheetsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - - -/** The category type */ -export type GQLCategoryPostsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - -/** The Type of Identifier used to fetch a single resource. Default is ID. */ -export enum GQLCategoryIdType { - /** The Database ID for the node */ - DatabaseId = 'DATABASE_ID', - /** The hashed Global ID */ - Id = 'ID', - /** The name of the node */ - Name = 'NAME', - /** Url friendly name of the node */ - Slug = 'SLUG', - /** The URI for the node */ - Uri = 'URI' -} - -/** Connection between the category type and the category type */ -export type GQLCategoryToAncestorsCategoryConnection = { - readonly __typename?: 'CategoryToAncestorsCategoryConnection'; - /** Edges for the CategoryToAncestorsCategoryConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLCategoryToAncestorsCategoryConnectionEdge = { - readonly __typename?: 'CategoryToAncestorsCategoryConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Connection between the category type and the category type */ -export type GQLCategoryToCategoryConnection = { - readonly __typename?: 'CategoryToCategoryConnection'; - /** Edges for the CategoryToCategoryConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLCategoryToCategoryConnectionEdge = { - readonly __typename?: 'CategoryToCategoryConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the CategoryToCategoryConnection connection */ -export type GQLCategoryToCategoryConnectionWhereArgs = { - /** Unique cache key to be produced when this query is stored in an object cache. Default is 'core'. */ - readonly cacheDomain: InputMaybe; - /** Term ID to retrieve child terms of. If multiple taxonomies are passed, $child_of is ignored. Default 0. */ - readonly childOf: InputMaybe; - /** True to limit results to terms that have no children. This parameter has no effect on non-hierarchical taxonomies. Default false. */ - readonly childless: InputMaybe; - /** Retrieve terms where the description is LIKE the input value. Default empty. */ - readonly descriptionLike: InputMaybe; - /** Array of term ids to exclude. If $include is non-empty, $exclude is ignored. Default empty array. */ - readonly exclude: InputMaybe>>; - /** Array of term ids to exclude along with all of their descendant terms. If $include is non-empty, $exclude_tree is ignored. Default empty array. */ - readonly excludeTree: InputMaybe>>; - /** Whether to hide terms not assigned to any posts. Accepts true or false. Default false */ - readonly hideEmpty: InputMaybe; - /** Whether to include terms that have non-empty descendants (even if $hide_empty is set to true). Default true. */ - readonly hierarchical: InputMaybe; - /** Array of term ids to include. Default empty array. */ - readonly include: InputMaybe>>; - /** Array of names to return term(s) for. Default empty. */ - readonly name: InputMaybe>>; - /** Retrieve terms where the name is LIKE the input value. Default empty. */ - readonly nameLike: InputMaybe; - /** Array of object IDs. Results will be limited to terms associated with these objects. */ - readonly objectIds: InputMaybe>>; - /** Direction the connection should be ordered in */ - readonly order: InputMaybe; - /** Field(s) to order terms by. Defaults to 'name'. */ - readonly orderby: InputMaybe; - /** Whether to pad the quantity of a term's children in the quantity of each term's "count" object variable. Default false. */ - readonly padCounts: InputMaybe; - /** Parent term ID to retrieve direct-child terms of. Default empty. */ - readonly parent: InputMaybe; - /** Search criteria to match terms. Will be SQL-formatted with wildcards before and after. Default empty. */ - readonly search: InputMaybe; - /** Array of slugs to return term(s) for. Default empty. */ - readonly slug: InputMaybe>>; - /** Array of term taxonomy IDs, to match when querying terms. */ - readonly termTaxonomId: InputMaybe>>; - /** Whether to prime meta caches for matched terms. Default true. */ - readonly updateTermMetaCache: InputMaybe; -}; - -/** Connection between the category type and the ContentNode type */ -export type GQLCategoryToContentNodeConnection = { - readonly __typename?: 'CategoryToContentNodeConnection'; - /** Edges for the CategoryToContentNodeConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLCategoryToContentNodeConnectionEdge = { - readonly __typename?: 'CategoryToContentNodeConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the CategoryToContentNodeConnection connection */ -export type GQLCategoryToContentNodeConnectionWhereArgs = { - /** The Types of content to filter */ - readonly contentTypes: InputMaybe>>; - /** Filter the connection based on dates */ - readonly dateQuery: InputMaybe; - /** True for objects with passwords; False for objects without passwords; null for all objects with or without passwords */ - readonly hasPassword: InputMaybe; - /** Specific ID of the object */ - readonly id: InputMaybe; - /** Array of IDs for the objects to retrieve */ - readonly in: InputMaybe>>; - /** Get objects with a specific mimeType property */ - readonly mimeType: InputMaybe; - /** Slug / post_name of the object */ - readonly name: InputMaybe; - /** Specify objects to retrieve. Use slugs */ - readonly nameIn: InputMaybe>>; - /** Specify IDs NOT to retrieve. If this is used in the same query as "in", it will be ignored */ - readonly notIn: InputMaybe>>; - /** What paramater to use to order the objects by. */ - readonly orderby: InputMaybe>>; - /** Use ID to return only children. Use 0 to return only top-level items */ - readonly parent: InputMaybe; - /** Specify objects whose parent is in an array */ - readonly parentIn: InputMaybe>>; - /** Specify posts whose parent is not in an array */ - readonly parentNotIn: InputMaybe>>; - /** Show posts with a specific password. */ - readonly password: InputMaybe; - /** Show Posts based on a keyword search */ - readonly search: InputMaybe; - /** Retrieve posts where post status is in an array. */ - readonly stati: InputMaybe>>; - /** Show posts with a specific status. */ - readonly status: InputMaybe; - /** Title of the object */ - readonly title: InputMaybe; -}; - -/** Connection between the category type and the category type */ -export type GQLCategoryToParentCategoryConnectionEdge = { - readonly __typename?: 'CategoryToParentCategoryConnectionEdge'; - /** The node of the connection, without the edges */ - readonly node: Maybe; -}; - -/** Connection between the category type and the post type */ -export type GQLCategoryToPostConnection = { - readonly __typename?: 'CategoryToPostConnection'; - /** Edges for the CategoryToPostConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLCategoryToPostConnectionEdge = { - readonly __typename?: 'CategoryToPostConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the CategoryToPostConnection connection */ -export type GQLCategoryToPostConnectionWhereArgs = { - /** The user that's connected as the author of the object. Use the userId for the author object. */ - readonly author: InputMaybe; - /** Find objects connected to author(s) in the array of author's userIds */ - readonly authorIn: InputMaybe>>; - /** Find objects connected to the author by the author's nicename */ - readonly authorName: InputMaybe; - /** Find objects NOT connected to author(s) in the array of author's userIds */ - readonly authorNotIn: InputMaybe>>; - /** Category ID */ - readonly categoryId: InputMaybe; - /** Array of category IDs, used to display objects from one category OR another */ - readonly categoryIn: InputMaybe>>; - /** Use Category Slug */ - readonly categoryName: InputMaybe; - /** Array of category IDs, used to display objects from one category OR another */ - readonly categoryNotIn: InputMaybe>>; - /** Filter the connection based on dates */ - readonly dateQuery: InputMaybe; - /** True for objects with passwords; False for objects without passwords; null for all objects with or without passwords */ - readonly hasPassword: InputMaybe; - /** Specific ID of the object */ - readonly id: InputMaybe; - /** Array of IDs for the objects to retrieve */ - readonly in: InputMaybe>>; - /** Get objects with a specific mimeType property */ - readonly mimeType: InputMaybe; - /** Slug / post_name of the object */ - readonly name: InputMaybe; - /** Specify objects to retrieve. Use slugs */ - readonly nameIn: InputMaybe>>; - /** Specify IDs NOT to retrieve. If this is used in the same query as "in", it will be ignored */ - readonly notIn: InputMaybe>>; - /** What paramater to use to order the objects by. */ - readonly orderby: InputMaybe>>; - /** Use ID to return only children. Use 0 to return only top-level items */ - readonly parent: InputMaybe; - /** Specify objects whose parent is in an array */ - readonly parentIn: InputMaybe>>; - /** Specify posts whose parent is not in an array */ - readonly parentNotIn: InputMaybe>>; - /** Show posts with a specific password. */ - readonly password: InputMaybe; - /** Show Posts based on a keyword search */ - readonly search: InputMaybe; - /** Retrieve posts where post status is in an array. */ - readonly stati: InputMaybe>>; - /** Show posts with a specific status. */ - readonly status: InputMaybe; - /** Tag Slug */ - readonly tag: InputMaybe; - /** Use Tag ID */ - readonly tagId: InputMaybe; - /** Array of tag IDs, used to display objects from one tag OR another */ - readonly tagIn: InputMaybe>>; - /** Array of tag IDs, used to display objects from one tag OR another */ - readonly tagNotIn: InputMaybe>>; - /** Array of tag slugs, used to display objects from one tag OR another */ - readonly tagSlugAnd: InputMaybe>>; - /** Array of tag slugs, used to exclude objects in specified tags */ - readonly tagSlugIn: InputMaybe>>; - /** Title of the object */ - readonly title: InputMaybe; -}; - -/** Connection between the category type and the Taxonomy type */ -export type GQLCategoryToTaxonomyConnectionEdge = { - readonly __typename?: 'CategoryToTaxonomyConnectionEdge'; - /** The node of the connection, without the edges */ - readonly node: Maybe; -}; - -/** A Comment object */ -export type GQLComment = GQLDatabaseIdentifier & GQLNode & { - readonly __typename?: 'Comment'; - /** User agent used to post the comment. This field is equivalent to WP_Comment->comment_agent and the value matching the "comment_agent" column in SQL. */ - readonly agent: Maybe; - /** The approval status of the comment. This field is equivalent to WP_Comment->comment_approved and the value matching the "comment_approved" column in SQL. */ - readonly approved: Maybe; - /** The author of the comment */ - readonly author: Maybe; - /** IP address for the author. This field is equivalent to WP_Comment->comment_author_IP and the value matching the "comment_author_IP" column in SQL. */ - readonly authorIp: Maybe; - /** - * ID for the comment, unique among comments. - * @deprecated Deprecated in favor of databaseId - */ - readonly commentId: Maybe; - /** Connection between the Comment type and the ContentNode type */ - readonly commentedOn: Maybe; - /** Content of the comment. This field is equivalent to WP_Comment->comment_content and the value matching the "comment_content" column in SQL. */ - readonly content: Maybe; - /** The unique identifier stored in the database */ - readonly databaseId: Scalars['Int']; - /** Date the comment was posted in local time. This field is equivalent to WP_Comment->date and the value matching the "date" column in SQL. */ - readonly date: Maybe; - /** Date the comment was posted in GMT. This field is equivalent to WP_Comment->date_gmt and the value matching the "date_gmt" column in SQL. */ - readonly dateGmt: Maybe; - /** The globally unique identifier for the comment object */ - readonly id: Scalars['ID']; - /** Whether the object is restricted from the current viewer */ - readonly isRestricted: Maybe; - /** Karma value for the comment. This field is equivalent to WP_Comment->comment_karma and the value matching the "comment_karma" column in SQL. */ - readonly karma: Maybe; - /** Connection between the Comment type and the Comment type */ - readonly parent: Maybe; - /** The database id of the parent comment node or null if it is the root comment */ - readonly parentDatabaseId: Maybe; - /** The globally unique identifier of the parent comment node. */ - readonly parentId: Maybe; - /** Connection between the Comment type and the Comment type */ - readonly replies: Maybe; - /** Type of comment. This field is equivalent to WP_Comment->comment_type and the value matching the "comment_type" column in SQL. */ - readonly type: Maybe; -}; - - -/** A Comment object */ -export type GQLCommentContentArgs = { - format: InputMaybe; -}; - - -/** A Comment object */ -export type GQLCommentParentArgs = { - where: InputMaybe; -}; - - -/** A Comment object */ -export type GQLCommentRepliesArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - -/** A Comment Author object */ -export type GQLCommentAuthor = GQLCommenter & GQLNode & { - readonly __typename?: 'CommentAuthor'; - /** Avatar object for user. The avatar object can be retrieved in different sizes by specifying the size argument. */ - readonly avatar: Maybe; - /** Identifies the primary key from the database. */ - readonly databaseId: Scalars['Int']; - /** The email for the comment author */ - readonly email: Maybe; - /** The globally unique identifier for the comment author object */ - readonly id: Scalars['ID']; - /** Whether the object is restricted from the current viewer */ - readonly isRestricted: Maybe; - /** The name for the comment author. */ - readonly name: Maybe; - /** The url the comment author. */ - readonly url: Maybe; -}; - - -/** A Comment Author object */ -export type GQLCommentAuthorAvatarArgs = { - forceDefault: InputMaybe; - rating: InputMaybe; - size?: InputMaybe; -}; - -/** Connection between the Comment type and the Comment type */ -export type GQLCommentToCommentConnection = { - readonly __typename?: 'CommentToCommentConnection'; - /** Edges for the CommentToCommentConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLCommentToCommentConnectionEdge = { - readonly __typename?: 'CommentToCommentConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the CommentToCommentConnection connection */ -export type GQLCommentToCommentConnectionWhereArgs = { - /** Comment author email address. */ - readonly authorEmail: InputMaybe; - /** Array of author IDs to include comments for. */ - readonly authorIn: InputMaybe>>; - /** Array of author IDs to exclude comments for. */ - readonly authorNotIn: InputMaybe>>; - /** Comment author URL. */ - readonly authorUrl: InputMaybe; - /** Array of comment IDs to include. */ - readonly commentIn: InputMaybe>>; - /** Array of IDs of users whose unapproved comments will be returned by the query regardless of status. */ - readonly commentNotIn: InputMaybe>>; - /** Include comments of a given type. */ - readonly commentType: InputMaybe; - /** Include comments from a given array of comment types. */ - readonly commentTypeIn: InputMaybe>>; - /** Exclude comments from a given array of comment types. */ - readonly commentTypeNotIn: InputMaybe; - /** Content object author ID to limit results by. */ - readonly contentAuthor: InputMaybe>>; - /** Array of author IDs to retrieve comments for. */ - readonly contentAuthorIn: InputMaybe>>; - /** Array of author IDs *not* to retrieve comments for. */ - readonly contentAuthorNotIn: InputMaybe>>; - /** Limit results to those affiliated with a given content object ID. */ - readonly contentId: InputMaybe; - /** Array of content object IDs to include affiliated comments for. */ - readonly contentIdIn: InputMaybe>>; - /** Array of content object IDs to exclude affiliated comments for. */ - readonly contentIdNotIn: InputMaybe>>; - /** Content object name to retrieve affiliated comments for. */ - readonly contentName: InputMaybe; - /** Content Object parent ID to retrieve affiliated comments for. */ - readonly contentParent: InputMaybe; - /** Array of content object statuses to retrieve affiliated comments for. Pass 'any' to match any value. */ - readonly contentStatus: InputMaybe>>; - /** Content object type or array of types to retrieve affiliated comments for. Pass 'any' to match any value. */ - readonly contentType: InputMaybe>>; - /** Array of IDs or email addresses of users whose unapproved comments will be returned by the query regardless of $status. Default empty */ - readonly includeUnapproved: InputMaybe>>; - /** Karma score to retrieve matching comments for. */ - readonly karma: InputMaybe; - /** The cardinality of the order of the connection */ - readonly order: InputMaybe; - /** Field to order the comments by. */ - readonly orderby: InputMaybe; - /** Parent ID of comment to retrieve children of. */ - readonly parent: InputMaybe; - /** Array of parent IDs of comments to retrieve children for. */ - readonly parentIn: InputMaybe>>; - /** Array of parent IDs of comments *not* to retrieve children for. */ - readonly parentNotIn: InputMaybe>>; - /** Search term(s) to retrieve matching comments for. */ - readonly search: InputMaybe; - /** Comment status to limit results by. */ - readonly status: InputMaybe; - /** Include comments for a specific user ID. */ - readonly userId: InputMaybe; -}; - -/** Connection between the Comment type and the Commenter type */ -export type GQLCommentToCommenterConnectionEdge = { - readonly __typename?: 'CommentToCommenterConnectionEdge'; - /** The node of the connection, without the edges */ - readonly node: Maybe; -}; - -/** Connection between the Comment type and the ContentNode type */ -export type GQLCommentToContentNodeConnectionEdge = { - readonly __typename?: 'CommentToContentNodeConnectionEdge'; - /** The node of the connection, without the edges */ - readonly node: Maybe; -}; - -/** Connection between the Comment type and the Comment type */ -export type GQLCommentToParentCommentConnectionEdge = { - readonly __typename?: 'CommentToParentCommentConnectionEdge'; - /** The node of the connection, without the edges */ - readonly node: Maybe; -}; - -/** Arguments for filtering the CommentToParentCommentConnection connection */ -export type GQLCommentToParentCommentConnectionWhereArgs = { - /** Comment author email address. */ - readonly authorEmail: InputMaybe; - /** Array of author IDs to include comments for. */ - readonly authorIn: InputMaybe>>; - /** Array of author IDs to exclude comments for. */ - readonly authorNotIn: InputMaybe>>; - /** Comment author URL. */ - readonly authorUrl: InputMaybe; - /** Array of comment IDs to include. */ - readonly commentIn: InputMaybe>>; - /** Array of IDs of users whose unapproved comments will be returned by the query regardless of status. */ - readonly commentNotIn: InputMaybe>>; - /** Include comments of a given type. */ - readonly commentType: InputMaybe; - /** Include comments from a given array of comment types. */ - readonly commentTypeIn: InputMaybe>>; - /** Exclude comments from a given array of comment types. */ - readonly commentTypeNotIn: InputMaybe; - /** Content object author ID to limit results by. */ - readonly contentAuthor: InputMaybe>>; - /** Array of author IDs to retrieve comments for. */ - readonly contentAuthorIn: InputMaybe>>; - /** Array of author IDs *not* to retrieve comments for. */ - readonly contentAuthorNotIn: InputMaybe>>; - /** Limit results to those affiliated with a given content object ID. */ - readonly contentId: InputMaybe; - /** Array of content object IDs to include affiliated comments for. */ - readonly contentIdIn: InputMaybe>>; - /** Array of content object IDs to exclude affiliated comments for. */ - readonly contentIdNotIn: InputMaybe>>; - /** Content object name to retrieve affiliated comments for. */ - readonly contentName: InputMaybe; - /** Content Object parent ID to retrieve affiliated comments for. */ - readonly contentParent: InputMaybe; - /** Array of content object statuses to retrieve affiliated comments for. Pass 'any' to match any value. */ - readonly contentStatus: InputMaybe>>; - /** Content object type or array of types to retrieve affiliated comments for. Pass 'any' to match any value. */ - readonly contentType: InputMaybe>>; - /** Array of IDs or email addresses of users whose unapproved comments will be returned by the query regardless of $status. Default empty */ - readonly includeUnapproved: InputMaybe>>; - /** Karma score to retrieve matching comments for. */ - readonly karma: InputMaybe; - /** The cardinality of the order of the connection */ - readonly order: InputMaybe; - /** Field to order the comments by. */ - readonly orderby: InputMaybe; - /** Parent ID of comment to retrieve children of. */ - readonly parent: InputMaybe; - /** Array of parent IDs of comments to retrieve children for. */ - readonly parentIn: InputMaybe>>; - /** Array of parent IDs of comments *not* to retrieve children for. */ - readonly parentNotIn: InputMaybe>>; - /** Search term(s) to retrieve matching comments for. */ - readonly search: InputMaybe; - /** Comment status to limit results by. */ - readonly status: InputMaybe; - /** Include comments for a specific user ID. */ - readonly userId: InputMaybe; -}; - -/** The author of a comment */ -export type GQLCommenter = { - /** Avatar object for user. The avatar object can be retrieved in different sizes by specifying the size argument. */ - readonly avatar: Maybe; - /** Identifies the primary key from the database. */ - readonly databaseId: Scalars['Int']; - /** The email address of the author of a comment. */ - readonly email: Maybe; - /** The globally unique identifier for the comment author. */ - readonly id: Scalars['ID']; - /** Whether the author information is considered restricted. (not fully public) */ - readonly isRestricted: Maybe; - /** The name of the author of a comment. */ - readonly name: Maybe; - /** The url of the author of a comment. */ - readonly url: Maybe; -}; - -/** Options for ordering the connection */ -export enum GQLCommentsConnectionOrderbyEnum { - /** Order by browser user agent of the commenter. */ - CommentAgent = 'COMMENT_AGENT', - /** Order by true/false approval of the comment. */ - CommentApproved = 'COMMENT_APPROVED', - /** Order by name of the comment author. */ - CommentAuthor = 'COMMENT_AUTHOR', - /** Order by e-mail of the comment author. */ - CommentAuthorEmail = 'COMMENT_AUTHOR_EMAIL', - /** Order by IP address of the comment author. */ - CommentAuthorIp = 'COMMENT_AUTHOR_IP', - /** Order by URL address of the comment author. */ - CommentAuthorUrl = 'COMMENT_AUTHOR_URL', - /** Order by the comment contents. */ - CommentContent = 'COMMENT_CONTENT', - /** Order by date/time timestamp of the comment. */ - CommentDate = 'COMMENT_DATE', - /** Order by GMT timezone date/time timestamp of the comment. */ - CommentDateGmt = 'COMMENT_DATE_GMT', - /** Order by the globally unique identifier for the comment object */ - CommentId = 'COMMENT_ID', - /** Order by the array list of comment IDs listed in the where clause. */ - CommentIn = 'COMMENT_IN', - /** Order by the comment karma score. */ - CommentKarma = 'COMMENT_KARMA', - /** Order by the comment parent ID. */ - CommentParent = 'COMMENT_PARENT', - /** Order by the post object ID. */ - CommentPostId = 'COMMENT_POST_ID', - /** Order by the the type of comment, such as 'comment', 'pingback', or 'trackback'. */ - CommentType = 'COMMENT_TYPE', - /** Order by the user ID. */ - UserId = 'USER_ID' -} - -/** Nodes used to manage content */ -export type GQLContentNode = { - /** Connection between the ContentNode type and the ContentType type */ - readonly contentType: Maybe; - /** The name of the Content Type the node belongs to */ - readonly contentTypeName: Scalars['String']; - /** The ID of the node in the database. */ - readonly databaseId: Scalars['Int']; - /** Post publishing date. */ - readonly date: Maybe; - /** The publishing date set in GMT. */ - readonly dateGmt: Maybe; - /** The desired slug of the post */ - readonly desiredSlug: Maybe; - /** If a user has edited the node within the past 15 seconds, this will return the user that last edited. Null if the edit lock doesn't exist or is greater than 15 seconds */ - readonly editingLockedBy: Maybe; - /** The RSS enclosure for the object */ - readonly enclosure: Maybe; - /** Connection between the ContentNode type and the EnqueuedScript type */ - readonly enqueuedScripts: Maybe; - /** Connection between the ContentNode type and the EnqueuedStylesheet type */ - readonly enqueuedStylesheets: Maybe; - /** The global unique identifier for this post. This currently matches the value stored in WP_Post->guid and the guid column in the "post_objects" database table. */ - readonly guid: Maybe; - /** The unique resource identifier path */ - readonly id: Scalars['ID']; - /** Whether the node is a Content Node */ - readonly isContentNode: Scalars['Boolean']; - /** Whether the object is a node in the preview state */ - readonly isPreview: Maybe; - /** Whether the object is restricted from the current viewer */ - readonly isRestricted: Maybe; - /** Whether the node is a Term */ - readonly isTermNode: Scalars['Boolean']; - /** The user that most recently edited the node */ - readonly lastEditedBy: Maybe; - /** The permalink of the post */ - readonly link: Maybe; - /** The local modified time for a post. If a post was recently updated the modified field will change to match the corresponding time. */ - readonly modified: Maybe; - /** The GMT modified time for a post. If a post was recently updated the modified field will change to match the corresponding time in GMT. */ - readonly modifiedGmt: Maybe; - /** The database id of the preview node */ - readonly previewRevisionDatabaseId: Maybe; - /** Whether the object is a node in the preview state */ - readonly previewRevisionId: Maybe; - /** The uri slug for the post. This is equivalent to the WP_Post->post_name field and the post_name column in the database for the "post_objects" table. */ - readonly slug: Maybe; - /** The current status of the object */ - readonly status: Maybe; - /** The template assigned to a node of content */ - readonly template: Maybe; - /** The unique resource identifier path */ - readonly uri: Maybe; -}; - - -/** Nodes used to manage content */ -export type GQLContentNodeEnqueuedScriptsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - - -/** Nodes used to manage content */ -export type GQLContentNodeEnqueuedStylesheetsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - -/** The Type of Identifier used to fetch a single resource. Default is ID. */ -export enum GQLContentNodeIdTypeEnum { - /** Identify a resource by the Database ID. */ - DatabaseId = 'DATABASE_ID', - /** Identify a resource by the (hashed) Global ID. */ - Id = 'ID', - /** Identify a resource by the URI. */ - Uri = 'URI' -} - -/** Connection between the ContentNode type and the ContentType type */ -export type GQLContentNodeToContentTypeConnectionEdge = { - readonly __typename?: 'ContentNodeToContentTypeConnectionEdge'; - /** The node of the connection, without the edges */ - readonly node: Maybe; -}; - -/** Connection between the ContentNode type and the User type */ -export type GQLContentNodeToEditLastConnectionEdge = { - readonly __typename?: 'ContentNodeToEditLastConnectionEdge'; - /** The node of the connection, without the edges */ - readonly node: Maybe; -}; - -/** Connection between the ContentNode type and the User type */ -export type GQLContentNodeToEditLockConnectionEdge = { - readonly __typename?: 'ContentNodeToEditLockConnectionEdge'; - /** The timestamp for when the node was last edited */ - readonly lockTimestamp: Maybe; - /** The node of the connection, without the edges */ - readonly node: Maybe; -}; - -/** Connection between the ContentNode type and the EnqueuedScript type */ -export type GQLContentNodeToEnqueuedScriptConnection = { - readonly __typename?: 'ContentNodeToEnqueuedScriptConnection'; - /** Edges for the ContentNodeToEnqueuedScriptConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLContentNodeToEnqueuedScriptConnectionEdge = { - readonly __typename?: 'ContentNodeToEnqueuedScriptConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Connection between the ContentNode type and the EnqueuedStylesheet type */ -export type GQLContentNodeToEnqueuedStylesheetConnection = { - readonly __typename?: 'ContentNodeToEnqueuedStylesheetConnection'; - /** Edges for the ContentNodeToEnqueuedStylesheetConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLContentNodeToEnqueuedStylesheetConnectionEdge = { - readonly __typename?: 'ContentNodeToEnqueuedStylesheetConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** A union of Content Node Types that support revisions */ -export type GQLContentRevisionUnion = GQLPage | GQLPost; - -/** The template assigned to a node of content */ -export type GQLContentTemplate = { - /** The name of the template */ - readonly templateName: Maybe; -}; - -/** An Post Type object */ -export type GQLContentType = GQLNode & GQLUniformResourceIdentifiable & { - readonly __typename?: 'ContentType'; - /** Whether this content type should can be exported. */ - readonly canExport: Maybe; - /** Connection between the ContentType type and the Taxonomy type */ - readonly connectedTaxonomies: Maybe; - /** Connection between the ContentType type and the ContentNode type */ - readonly contentNodes: Maybe; - /** Whether content of this type should be deleted when the author of it is deleted from the system. */ - readonly deleteWithUser: Maybe; - /** Description of the content type. */ - readonly description: Maybe; - /** Whether to exclude nodes of this content type from front end search results. */ - readonly excludeFromSearch: Maybe; - /** The plural name of the content type within the GraphQL Schema. */ - readonly graphqlPluralName: Maybe; - /** The singular name of the content type within the GraphQL Schema. */ - readonly graphqlSingleName: Maybe; - /** Whether this content type should have archives. Content archives are generated by type and by date. */ - readonly hasArchive: Maybe; - /** Whether the content type is hierarchical, for example pages. */ - readonly hierarchical: Maybe; - /** The globally unique identifier of the post-type object. */ - readonly id: Scalars['ID']; - /** Whether the node is a Content Node */ - readonly isContentNode: Scalars['Boolean']; - /** Whether this page is set to the static front page. */ - readonly isFrontPage: Scalars['Boolean']; - /** Whether this page is set to the blog posts page. */ - readonly isPostsPage: Scalars['Boolean']; - /** Whether the object is restricted from the current viewer */ - readonly isRestricted: Maybe; - /** Whether the node is a Term */ - readonly isTermNode: Scalars['Boolean']; - /** Display name of the content type. */ - readonly label: Maybe; - /** Details about the content type labels. */ - readonly labels: Maybe; - /** The name of the icon file to display as a menu icon. */ - readonly menuIcon: Maybe; - /** The position of this post type in the menu. Only applies if show_in_menu is true. */ - readonly menuPosition: Maybe; - /** The internal name of the post type. This should not be used for display purposes. */ - readonly name: Maybe; - /** Whether a content type is intended for use publicly either via the admin interface or by front-end users. While the default settings of exclude_from_search, publicly_queryable, show_ui, and show_in_nav_menus are inherited from public, each does not rely on this relationship and controls a very specific intention. */ - readonly public: Maybe; - /** Whether queries can be performed on the front end for the content type as part of parse_request(). */ - readonly publiclyQueryable: Maybe; - /** Name of content type to display in REST API "wp/v2" namespace. */ - readonly restBase: Maybe; - /** The REST Controller class assigned to handling this content type. */ - readonly restControllerClass: Maybe; - /** Makes this content type available via the admin bar. */ - readonly showInAdminBar: Maybe; - /** Whether to add the content type to the GraphQL Schema. */ - readonly showInGraphql: Maybe; - /** Where to show the content type in the admin menu. To work, $show_ui must be true. If true, the post type is shown in its own top level menu. If false, no menu is shown. If a string of an existing top level menu (eg. "tools.php" or "edit.php?post_type=page"), the post type will be placed as a sub-menu of that. */ - readonly showInMenu: Maybe; - /** Makes this content type available for selection in navigation menus. */ - readonly showInNavMenus: Maybe; - /** Whether the content type is associated with a route under the the REST API "wp/v2" namespace. */ - readonly showInRest: Maybe; - /** Whether to generate and allow a UI for managing this content type in the admin. */ - readonly showUi: Maybe; - /** The unique resource identifier path */ - readonly uri: Maybe; -}; - - -/** An Post Type object */ -export type GQLContentTypeConnectedTaxonomiesArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - - -/** An Post Type object */ -export type GQLContentTypeContentNodesArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - -/** Allowed Content Types */ -export enum GQLContentTypeEnum { - /** The Type of Content object */ - Attachment = 'ATTACHMENT', - /** The Type of Content object */ - Page = 'PAGE', - /** The Type of Content object */ - Post = 'POST', - /** The Type of Content object */ - Projects = 'PROJECTS', - /** The Type of Content object */ - Works = 'WORKS' -} - -/** The Type of Identifier used to fetch a single Content Type node. To be used along with the "id" field. Default is "ID". */ -export enum GQLContentTypeIdTypeEnum { - /** The globally unique ID */ - Id = 'ID', - /** The name of the content type. */ - Name = 'NAME' -} - -/** Connection between the ContentType type and the ContentNode type */ -export type GQLContentTypeToContentNodeConnection = { - readonly __typename?: 'ContentTypeToContentNodeConnection'; - /** Edges for the ContentTypeToContentNodeConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLContentTypeToContentNodeConnectionEdge = { - readonly __typename?: 'ContentTypeToContentNodeConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the ContentTypeToContentNodeConnection connection */ -export type GQLContentTypeToContentNodeConnectionWhereArgs = { - /** The Types of content to filter */ - readonly contentTypes: InputMaybe>>; - /** Filter the connection based on dates */ - readonly dateQuery: InputMaybe; - /** True for objects with passwords; False for objects without passwords; null for all objects with or without passwords */ - readonly hasPassword: InputMaybe; - /** Specific ID of the object */ - readonly id: InputMaybe; - /** Array of IDs for the objects to retrieve */ - readonly in: InputMaybe>>; - /** Get objects with a specific mimeType property */ - readonly mimeType: InputMaybe; - /** Slug / post_name of the object */ - readonly name: InputMaybe; - /** Specify objects to retrieve. Use slugs */ - readonly nameIn: InputMaybe>>; - /** Specify IDs NOT to retrieve. If this is used in the same query as "in", it will be ignored */ - readonly notIn: InputMaybe>>; - /** What paramater to use to order the objects by. */ - readonly orderby: InputMaybe>>; - /** Use ID to return only children. Use 0 to return only top-level items */ - readonly parent: InputMaybe; - /** Specify objects whose parent is in an array */ - readonly parentIn: InputMaybe>>; - /** Specify posts whose parent is not in an array */ - readonly parentNotIn: InputMaybe>>; - /** Show posts with a specific password. */ - readonly password: InputMaybe; - /** Show Posts based on a keyword search */ - readonly search: InputMaybe; - /** Retrieve posts where post status is in an array. */ - readonly stati: InputMaybe>>; - /** Show posts with a specific status. */ - readonly status: InputMaybe; - /** Title of the object */ - readonly title: InputMaybe; -}; - -/** Connection between the ContentType type and the Taxonomy type */ -export type GQLContentTypeToTaxonomyConnection = { - readonly __typename?: 'ContentTypeToTaxonomyConnection'; - /** Edges for the ContentTypeToTaxonomyConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLContentTypeToTaxonomyConnectionEdge = { - readonly __typename?: 'ContentTypeToTaxonomyConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Allowed Content Types of the Category taxonomy. */ -export enum GQLContentTypesOfCategoryEnum { - /** The Type of Content object */ - Post = 'POST' -} - -/** Allowed Content Types of the PostFormat taxonomy. */ -export enum GQLContentTypesOfPostFormatEnum { - /** The Type of Content object */ - Post = 'POST' -} - -/** Allowed Content Types of the Tag taxonomy. */ -export enum GQLContentTypesOfTagEnum { - /** The Type of Content object */ - Post = 'POST' -} - -/** Allowed Content Types of the Technology taxonomy. */ -export enum GQLContentTypesOfTechnologyEnum { - /** The Type of Content object */ - Projects = 'PROJECTS', - /** The Type of Content object */ - Works = 'WORKS' -} - -/** Input for the createCategory mutation */ -export type GQLCreateCategoryInput = { - /** The slug that the category will be an alias of */ - readonly aliasOf: InputMaybe; - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** The description of the category object */ - readonly description: InputMaybe; - /** The name of the category object to mutate */ - readonly name: Scalars['String']; - /** The ID of the category that should be set as the parent */ - readonly parentId: InputMaybe; - /** If this argument exists then the slug will be checked to see if it is not an existing valid term. If that check succeeds (it is not a valid term), then it is added and the term id is given. If it fails, then a check is made to whether the taxonomy is hierarchical and the parent argument is not empty. If the second check succeeds, the term will be inserted and the term id will be given. If the slug argument is empty, then it will be calculated from the term name. */ - readonly slug: InputMaybe; -}; - -/** The payload for the createCategory mutation */ -export type GQLCreateCategoryPayload = { - readonly __typename?: 'CreateCategoryPayload'; - /** The created category */ - readonly category: Maybe; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; -}; - -/** Input for the createComment mutation */ -export type GQLCreateCommentInput = { - /** The approval status of the comment. */ - readonly approved: InputMaybe; - /** The name of the comment's author. */ - readonly author: InputMaybe; - /** The email of the comment's author. */ - readonly authorEmail: InputMaybe; - /** The url of the comment's author. */ - readonly authorUrl: InputMaybe; - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** The ID of the post object the comment belongs to. */ - readonly commentOn: InputMaybe; - /** Content of the comment. */ - readonly content: InputMaybe; - /** The date of the object. Preferable to enter as year/month/day ( e.g. 01/31/2017 ) as it will rearrange date as fit if it is not specified. Incomplete dates may have unintended results for example, "2017" as the input will use current date with timestamp 20:17 */ - readonly date: InputMaybe; - /** Parent comment of current comment. */ - readonly parent: InputMaybe; - /** Type of comment. */ - readonly type: InputMaybe; -}; - -/** The payload for the createComment mutation */ -export type GQLCreateCommentPayload = { - readonly __typename?: 'CreateCommentPayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The comment that was created */ - readonly comment: Maybe; - /** Whether the mutation succeeded. If the comment is not approved, the server will not return the comment to a non authenticated user, but a success message can be returned if the create succeeded, and the client can optimistically add the comment to the client cache */ - readonly success: Maybe; -}; - -/** Input for the createMediaItem mutation */ -export type GQLCreateMediaItemInput = { - /** Alternative text to display when mediaItem is not displayed */ - readonly altText: InputMaybe; - /** The userId to assign as the author of the mediaItem */ - readonly authorId: InputMaybe; - /** The caption for the mediaItem */ - readonly caption: InputMaybe; - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** The comment status for the mediaItem */ - readonly commentStatus: InputMaybe; - /** The date of the mediaItem */ - readonly date: InputMaybe; - /** The date (in GMT zone) of the mediaItem */ - readonly dateGmt: InputMaybe; - /** Description of the mediaItem */ - readonly description: InputMaybe; - /** The file name of the mediaItem */ - readonly filePath: InputMaybe; - /** The file type of the mediaItem */ - readonly fileType: InputMaybe; - /** The WordPress post ID or the graphQL postId of the parent object */ - readonly parentId: InputMaybe; - /** The ping status for the mediaItem */ - readonly pingStatus: InputMaybe; - /** The slug of the mediaItem */ - readonly slug: InputMaybe; - /** The status of the mediaItem */ - readonly status: InputMaybe; - /** The title of the mediaItem */ - readonly title: InputMaybe; -}; - -/** The payload for the createMediaItem mutation */ -export type GQLCreateMediaItemPayload = { - readonly __typename?: 'CreateMediaItemPayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The MediaItem object mutation type. */ - readonly mediaItem: Maybe; -}; - -/** Input for the createPage mutation */ -export type GQLCreatePageInput = { - /** The userId to assign as the author of the object */ - readonly authorId: InputMaybe; - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** The comment status for the object */ - readonly commentStatus: InputMaybe; - /** The content of the object */ - readonly content: InputMaybe; - /** The date of the object. Preferable to enter as year/month/day (e.g. 01/31/2017) as it will rearrange date as fit if it is not specified. Incomplete dates may have unintended results for example, "2017" as the input will use current date with timestamp 20:17 */ - readonly date: InputMaybe; - /** A field used for ordering posts. This is typically used with nav menu items or for special ordering of hierarchical content types. */ - readonly menuOrder: InputMaybe; - /** The ID of the parent object */ - readonly parentId: InputMaybe; - /** The password used to protect the content of the object */ - readonly password: InputMaybe; - /** The slug of the object */ - readonly slug: InputMaybe; - /** The status of the object */ - readonly status: InputMaybe; - /** The title of the object */ - readonly title: InputMaybe; -}; - -/** The payload for the createPage mutation */ -export type GQLCreatePagePayload = { - readonly __typename?: 'CreatePagePayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The Post object mutation type. */ - readonly page: Maybe; -}; - -/** Input for the createPostFormat mutation */ -export type GQLCreatePostFormatInput = { - /** The slug that the post_format will be an alias of */ - readonly aliasOf: InputMaybe; - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** The description of the post_format object */ - readonly description: InputMaybe; - /** The name of the post_format object to mutate */ - readonly name: Scalars['String']; - /** If this argument exists then the slug will be checked to see if it is not an existing valid term. If that check succeeds (it is not a valid term), then it is added and the term id is given. If it fails, then a check is made to whether the taxonomy is hierarchical and the parent argument is not empty. If the second check succeeds, the term will be inserted and the term id will be given. If the slug argument is empty, then it will be calculated from the term name. */ - readonly slug: InputMaybe; -}; - -/** The payload for the createPostFormat mutation */ -export type GQLCreatePostFormatPayload = { - readonly __typename?: 'CreatePostFormatPayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The created post_format */ - readonly postFormat: Maybe; -}; - -/** Input for the createPost mutation */ -export type GQLCreatePostInput = { - /** The userId to assign as the author of the object */ - readonly authorId: InputMaybe; - /** Set connections between the post and categories */ - readonly categories: InputMaybe; - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** The comment status for the object */ - readonly commentStatus: InputMaybe; - /** The content of the object */ - readonly content: InputMaybe; - /** The date of the object. Preferable to enter as year/month/day (e.g. 01/31/2017) as it will rearrange date as fit if it is not specified. Incomplete dates may have unintended results for example, "2017" as the input will use current date with timestamp 20:17 */ - readonly date: InputMaybe; - /** The excerpt of the object */ - readonly excerpt: InputMaybe; - /** A field used for ordering posts. This is typically used with nav menu items or for special ordering of hierarchical content types. */ - readonly menuOrder: InputMaybe; - /** The password used to protect the content of the object */ - readonly password: InputMaybe; - /** The ping status for the object */ - readonly pingStatus: InputMaybe; - /** URLs that have been pinged. */ - readonly pinged: InputMaybe>>; - /** Set connections between the post and postFormats */ - readonly postFormats: InputMaybe; - /** The slug of the object */ - readonly slug: InputMaybe; - /** The status of the object */ - readonly status: InputMaybe; - /** Set connections between the post and tags */ - readonly tags: InputMaybe; - /** The title of the object */ - readonly title: InputMaybe; - /** URLs queued to be pinged. */ - readonly toPing: InputMaybe>>; -}; - -/** The payload for the createPost mutation */ -export type GQLCreatePostPayload = { - readonly __typename?: 'CreatePostPayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The Post object mutation type. */ - readonly post: Maybe; -}; - -/** Input for the createProject mutation */ -export type GQLCreateProjectInput = { - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** The content of the object */ - readonly content: InputMaybe; - /** The date of the object. Preferable to enter as year/month/day (e.g. 01/31/2017) as it will rearrange date as fit if it is not specified. Incomplete dates may have unintended results for example, "2017" as the input will use current date with timestamp 20:17 */ - readonly date: InputMaybe; - /** A field used for ordering posts. This is typically used with nav menu items or for special ordering of hierarchical content types. */ - readonly menuOrder: InputMaybe; - /** The password used to protect the content of the object */ - readonly password: InputMaybe; - /** The slug of the object */ - readonly slug: InputMaybe; - /** The status of the object */ - readonly status: InputMaybe; - /** Set connections between the Project and Technologies */ - readonly technologies: InputMaybe; - /** The title of the object */ - readonly title: InputMaybe; -}; - -/** The payload for the createProject mutation */ -export type GQLCreateProjectPayload = { - readonly __typename?: 'CreateProjectPayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The Post object mutation type. */ - readonly project: Maybe; -}; - -/** Input for the createTag mutation */ -export type GQLCreateTagInput = { - /** The slug that the post_tag will be an alias of */ - readonly aliasOf: InputMaybe; - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** The description of the post_tag object */ - readonly description: InputMaybe; - /** The name of the post_tag object to mutate */ - readonly name: Scalars['String']; - /** If this argument exists then the slug will be checked to see if it is not an existing valid term. If that check succeeds (it is not a valid term), then it is added and the term id is given. If it fails, then a check is made to whether the taxonomy is hierarchical and the parent argument is not empty. If the second check succeeds, the term will be inserted and the term id will be given. If the slug argument is empty, then it will be calculated from the term name. */ - readonly slug: InputMaybe; -}; - -/** The payload for the createTag mutation */ -export type GQLCreateTagPayload = { - readonly __typename?: 'CreateTagPayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The created post_tag */ - readonly tag: Maybe; -}; - -/** Input for the createTechnology mutation */ -export type GQLCreateTechnologyInput = { - /** The slug that the technology will be an alias of */ - readonly aliasOf: InputMaybe; - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** The description of the technology object */ - readonly description: InputMaybe; - /** The name of the technology object to mutate */ - readonly name: Scalars['String']; - /** If this argument exists then the slug will be checked to see if it is not an existing valid term. If that check succeeds (it is not a valid term), then it is added and the term id is given. If it fails, then a check is made to whether the taxonomy is hierarchical and the parent argument is not empty. If the second check succeeds, the term will be inserted and the term id will be given. If the slug argument is empty, then it will be calculated from the term name. */ - readonly slug: InputMaybe; -}; - -/** The payload for the createTechnology mutation */ -export type GQLCreateTechnologyPayload = { - readonly __typename?: 'CreateTechnologyPayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The created technology */ - readonly technology: Maybe; -}; - -/** Input for the createUser mutation */ -export type GQLCreateUserInput = { - /** User's AOL IM account. */ - readonly aim: InputMaybe; - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** A string containing content about the user. */ - readonly description: InputMaybe; - /** A string that will be shown on the site. Defaults to user's username. It is likely that you will want to change this, for both appearance and security through obscurity (that is if you dont use and delete the default admin user). */ - readonly displayName: InputMaybe; - /** A string containing the user's email address. */ - readonly email: InputMaybe; - /** The user's first name. */ - readonly firstName: InputMaybe; - /** User's Jabber account. */ - readonly jabber: InputMaybe; - /** The user's last name. */ - readonly lastName: InputMaybe; - /** User's locale. */ - readonly locale: InputMaybe; - /** A string that contains a URL-friendly name for the user. The default is the user's username. */ - readonly nicename: InputMaybe; - /** The user's nickname, defaults to the user's username. */ - readonly nickname: InputMaybe; - /** A string that contains the plain text password for the user. */ - readonly password: InputMaybe; - /** The date the user registered. Format is Y-m-d H:i:s. */ - readonly registered: InputMaybe; - /** A string for whether to enable the rich editor or not. False if not empty. */ - readonly richEditing: InputMaybe; - /** An array of roles to be assigned to the user. */ - readonly roles: InputMaybe>>; - /** A string that contains the user's username for logging in. */ - readonly username: Scalars['String']; - /** A string containing the user's URL for the user's web site. */ - readonly websiteUrl: InputMaybe; - /** User's Yahoo IM account. */ - readonly yim: InputMaybe; -}; - -/** The payload for the createUser mutation */ -export type GQLCreateUserPayload = { - readonly __typename?: 'CreateUserPayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The User object mutation type. */ - readonly user: Maybe; -}; - -/** Input for the createWork mutation */ -export type GQLCreateWorkInput = { - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** The content of the object */ - readonly content: InputMaybe; - /** The date of the object. Preferable to enter as year/month/day (e.g. 01/31/2017) as it will rearrange date as fit if it is not specified. Incomplete dates may have unintended results for example, "2017" as the input will use current date with timestamp 20:17 */ - readonly date: InputMaybe; - /** A field used for ordering posts. This is typically used with nav menu items or for special ordering of hierarchical content types. */ - readonly menuOrder: InputMaybe; - /** The password used to protect the content of the object */ - readonly password: InputMaybe; - /** The slug of the object */ - readonly slug: InputMaybe; - /** The status of the object */ - readonly status: InputMaybe; - /** Set connections between the Work and Technologies */ - readonly technologies: InputMaybe; - /** The title of the object */ - readonly title: InputMaybe; -}; - -/** The payload for the createWork mutation */ -export type GQLCreateWorkPayload = { - readonly __typename?: 'CreateWorkPayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The Post object mutation type. */ - readonly work: Maybe; -}; - -/** Object that can be identified with a Database ID */ -export type GQLDatabaseIdentifier = { - /** The unique identifier stored in the database */ - readonly databaseId: Scalars['Int']; -}; - -/** Date values */ -export type GQLDateInput = { - /** Day of the month (from 1 to 31) */ - readonly day: InputMaybe; - /** Month number (from 1 to 12) */ - readonly month: InputMaybe; - /** 4 digit year (e.g. 2017) */ - readonly year: InputMaybe; -}; - -/** Filter the connection based on input */ -export type GQLDateQueryInput = { - /** Nodes should be returned after this date */ - readonly after: InputMaybe; - /** Nodes should be returned before this date */ - readonly before: InputMaybe; - /** Column to query against */ - readonly column: InputMaybe; - /** For after/before, whether exact value should be matched or not */ - readonly compare: InputMaybe; - /** Day of the month (from 1 to 31) */ - readonly day: InputMaybe; - /** Hour (from 0 to 23) */ - readonly hour: InputMaybe; - /** For after/before, whether exact value should be matched or not */ - readonly inclusive: InputMaybe; - /** Minute (from 0 to 59) */ - readonly minute: InputMaybe; - /** Month number (from 1 to 12) */ - readonly month: InputMaybe; - /** OR or AND, how the sub-arrays should be compared */ - readonly relation: InputMaybe; - /** Second (0 to 59) */ - readonly second: InputMaybe; - /** Week of the year (from 0 to 53) */ - readonly week: InputMaybe; - /** 4 digit year (e.g. 2017) */ - readonly year: InputMaybe; -}; - -/** The template assigned to the node */ -export type GQLDefaultTemplate = GQLContentTemplate & { - readonly __typename?: 'DefaultTemplate'; - /** The name of the template */ - readonly templateName: Maybe; -}; - -/** Input for the deleteCategory mutation */ -export type GQLDeleteCategoryInput = { - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** The ID of the category to delete */ - readonly id: Scalars['ID']; -}; - -/** The payload for the deleteCategory mutation */ -export type GQLDeleteCategoryPayload = { - readonly __typename?: 'DeleteCategoryPayload'; - /** The deteted term object */ - readonly category: Maybe; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The ID of the deleted object */ - readonly deletedId: Maybe; -}; - -/** Input for the deleteComment mutation */ -export type GQLDeleteCommentInput = { - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** Whether the comment should be force deleted instead of being moved to the trash */ - readonly forceDelete: InputMaybe; - /** The deleted comment ID */ - readonly id: Scalars['ID']; -}; - -/** The payload for the deleteComment mutation */ -export type GQLDeleteCommentPayload = { - readonly __typename?: 'DeleteCommentPayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The deleted comment object */ - readonly comment: Maybe; - /** The deleted comment ID */ - readonly deletedId: Maybe; -}; - -/** Input for the deleteMediaItem mutation */ -export type GQLDeleteMediaItemInput = { - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** Whether the mediaItem should be force deleted instead of being moved to the trash */ - readonly forceDelete: InputMaybe; - /** The ID of the mediaItem to delete */ - readonly id: Scalars['ID']; -}; - -/** The payload for the deleteMediaItem mutation */ -export type GQLDeleteMediaItemPayload = { - readonly __typename?: 'DeleteMediaItemPayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The ID of the deleted mediaItem */ - readonly deletedId: Maybe; - /** The mediaItem before it was deleted */ - readonly mediaItem: Maybe; -}; - -/** Input for the deletePage mutation */ -export type GQLDeletePageInput = { - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** Whether the object should be force deleted instead of being moved to the trash */ - readonly forceDelete: InputMaybe; - /** The ID of the page to delete */ - readonly id: Scalars['ID']; -}; - -/** The payload for the deletePage mutation */ -export type GQLDeletePagePayload = { - readonly __typename?: 'DeletePagePayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The ID of the deleted object */ - readonly deletedId: Maybe; - /** The object before it was deleted */ - readonly page: Maybe; -}; - -/** Input for the deletePostFormat mutation */ -export type GQLDeletePostFormatInput = { - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** The ID of the postFormat to delete */ - readonly id: Scalars['ID']; -}; - -/** The payload for the deletePostFormat mutation */ -export type GQLDeletePostFormatPayload = { - readonly __typename?: 'DeletePostFormatPayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The ID of the deleted object */ - readonly deletedId: Maybe; - /** The deteted term object */ - readonly postFormat: Maybe; -}; - -/** Input for the deletePost mutation */ -export type GQLDeletePostInput = { - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** Whether the object should be force deleted instead of being moved to the trash */ - readonly forceDelete: InputMaybe; - /** The ID of the post to delete */ - readonly id: Scalars['ID']; -}; - -/** The payload for the deletePost mutation */ -export type GQLDeletePostPayload = { - readonly __typename?: 'DeletePostPayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The ID of the deleted object */ - readonly deletedId: Maybe; - /** The object before it was deleted */ - readonly post: Maybe; -}; - -/** Input for the deleteProject mutation */ -export type GQLDeleteProjectInput = { - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** Whether the object should be force deleted instead of being moved to the trash */ - readonly forceDelete: InputMaybe; - /** The ID of the Project to delete */ - readonly id: Scalars['ID']; -}; - -/** The payload for the deleteProject mutation */ -export type GQLDeleteProjectPayload = { - readonly __typename?: 'DeleteProjectPayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The ID of the deleted object */ - readonly deletedId: Maybe; - /** The object before it was deleted */ - readonly project: Maybe; -}; - -/** Input for the deleteTag mutation */ -export type GQLDeleteTagInput = { - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** The ID of the tag to delete */ - readonly id: Scalars['ID']; -}; - -/** The payload for the deleteTag mutation */ -export type GQLDeleteTagPayload = { - readonly __typename?: 'DeleteTagPayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The ID of the deleted object */ - readonly deletedId: Maybe; - /** The deteted term object */ - readonly tag: Maybe; -}; - -/** Input for the deleteTechnology mutation */ -export type GQLDeleteTechnologyInput = { - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** The ID of the Technology to delete */ - readonly id: Scalars['ID']; -}; - -/** The payload for the deleteTechnology mutation */ -export type GQLDeleteTechnologyPayload = { - readonly __typename?: 'DeleteTechnologyPayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The ID of the deleted object */ - readonly deletedId: Maybe; - /** The deteted term object */ - readonly technology: Maybe; -}; - -/** Input for the deleteUser mutation */ -export type GQLDeleteUserInput = { - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** The ID of the user you want to delete */ - readonly id: Scalars['ID']; - /** Reassign posts and links to new User ID. */ - readonly reassignId: InputMaybe; -}; - -/** The payload for the deleteUser mutation */ -export type GQLDeleteUserPayload = { - readonly __typename?: 'DeleteUserPayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The ID of the user that you just deleted */ - readonly deletedId: Maybe; - /** The deleted user object */ - readonly user: Maybe; -}; - -/** Input for the deleteWork mutation */ -export type GQLDeleteWorkInput = { - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** Whether the object should be force deleted instead of being moved to the trash */ - readonly forceDelete: InputMaybe; - /** The ID of the Work to delete */ - readonly id: Scalars['ID']; -}; - -/** The payload for the deleteWork mutation */ -export type GQLDeleteWorkPayload = { - readonly __typename?: 'DeleteWorkPayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The ID of the deleted object */ - readonly deletedId: Maybe; - /** The object before it was deleted */ - readonly work: Maybe; -}; - -/** The discussion setting type */ -export type GQLDiscussionSettings = { - readonly __typename?: 'DiscussionSettings'; - /** Allow people to submit comments on new posts. */ - readonly defaultCommentStatus: Maybe; - /** Allow link notifications from other blogs (pingbacks and trackbacks) on new articles. */ - readonly defaultPingStatus: Maybe; -}; - -/** Asset enqueued by the CMS */ -export type GQLEnqueuedAsset = { - /** @todo */ - readonly args: Maybe; - /** Dependencies needed to use this asset */ - readonly dependencies: Maybe>>; - /** Extra information needed for the script */ - readonly extra: Maybe; - /** The handle of the enqueued asset */ - readonly handle: Maybe; - /** The ID of the enqueued asset */ - readonly id: Scalars['ID']; - /** The source of the asset */ - readonly src: Maybe; - /** The version of the enqueued asset */ - readonly version: Maybe; -}; - -/** Script enqueued by the CMS */ -export type GQLEnqueuedScript = GQLEnqueuedAsset & GQLNode & { - readonly __typename?: 'EnqueuedScript'; - /** @todo */ - readonly args: Maybe; - /** Dependencies needed to use this asset */ - readonly dependencies: Maybe>>; - /** Extra information needed for the script */ - readonly extra: Maybe; - /** The handle of the enqueued asset */ - readonly handle: Maybe; - /** The ID of the enqueued asset */ - readonly id: Scalars['ID']; - /** The source of the asset */ - readonly src: Maybe; - /** The version of the enqueued asset */ - readonly version: Maybe; -}; - -/** Stylesheet enqueued by the CMS */ -export type GQLEnqueuedStylesheet = GQLEnqueuedAsset & GQLNode & { - readonly __typename?: 'EnqueuedStylesheet'; - /** @todo */ - readonly args: Maybe; - /** Dependencies needed to use this asset */ - readonly dependencies: Maybe>>; - /** Extra information needed for the script */ - readonly extra: Maybe; - /** The handle of the enqueued asset */ - readonly handle: Maybe; - /** The ID of the enqueued asset */ - readonly id: Scalars['ID']; - /** The source of the asset */ - readonly src: Maybe; - /** The version of the enqueued asset */ - readonly version: Maybe; -}; - -/** The general setting type */ -export type GQLGeneralSettings = { - readonly __typename?: 'GeneralSettings'; - /** A date format for all date strings. */ - readonly dateFormat: Maybe; - /** Site tagline. */ - readonly description: Maybe; - /** This address is used for admin purposes, like new user notification. */ - readonly email: Maybe; - /** WordPress locale code. */ - readonly language: Maybe; - /** A day number of the week that the week should start on. */ - readonly startOfWeek: Maybe; - /** A time format for all time strings. */ - readonly timeFormat: Maybe; - /** A city in the same timezone as you. */ - readonly timezone: Maybe; - /** Site title. */ - readonly title: Maybe; - /** Site URL. */ - readonly url: Maybe; -}; - -/** Content node with hierarchical (parent/child) relationships */ -export type GQLHierarchicalContentNode = { - /** Returns ancestors of the node. Default ordered as lowest (closest to the child) to highest (closest to the root). */ - readonly ancestors: Maybe; - /** Connection between the HierarchicalContentNode type and the ContentNode type */ - readonly children: Maybe; - /** The parent of the node. The parent object can be of various types */ - readonly parent: Maybe; - /** Database id of the parent node */ - readonly parentDatabaseId: Maybe; - /** The globally unique identifier of the parent node. */ - readonly parentId: Maybe; -}; - - -/** Content node with hierarchical (parent/child) relationships */ -export type GQLHierarchicalContentNodeAncestorsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** Content node with hierarchical (parent/child) relationships */ -export type GQLHierarchicalContentNodeChildrenArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - -/** Connection between the HierarchicalContentNode type and the ContentNode type */ -export type GQLHierarchicalContentNodeToContentNodeAncestorsConnection = { - readonly __typename?: 'HierarchicalContentNodeToContentNodeAncestorsConnection'; - /** Edges for the HierarchicalContentNodeToContentNodeAncestorsConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLHierarchicalContentNodeToContentNodeAncestorsConnectionEdge = { - readonly __typename?: 'HierarchicalContentNodeToContentNodeAncestorsConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the HierarchicalContentNodeToContentNodeAncestorsConnection connection */ -export type GQLHierarchicalContentNodeToContentNodeAncestorsConnectionWhereArgs = { - /** The Types of content to filter */ - readonly contentTypes: InputMaybe>>; - /** Filter the connection based on dates */ - readonly dateQuery: InputMaybe; - /** True for objects with passwords; False for objects without passwords; null for all objects with or without passwords */ - readonly hasPassword: InputMaybe; - /** Specific ID of the object */ - readonly id: InputMaybe; - /** Array of IDs for the objects to retrieve */ - readonly in: InputMaybe>>; - /** Get objects with a specific mimeType property */ - readonly mimeType: InputMaybe; - /** Slug / post_name of the object */ - readonly name: InputMaybe; - /** Specify objects to retrieve. Use slugs */ - readonly nameIn: InputMaybe>>; - /** Specify IDs NOT to retrieve. If this is used in the same query as "in", it will be ignored */ - readonly notIn: InputMaybe>>; - /** What paramater to use to order the objects by. */ - readonly orderby: InputMaybe>>; - /** Use ID to return only children. Use 0 to return only top-level items */ - readonly parent: InputMaybe; - /** Specify objects whose parent is in an array */ - readonly parentIn: InputMaybe>>; - /** Specify posts whose parent is not in an array */ - readonly parentNotIn: InputMaybe>>; - /** Show posts with a specific password. */ - readonly password: InputMaybe; - /** Show Posts based on a keyword search */ - readonly search: InputMaybe; - /** Retrieve posts where post status is in an array. */ - readonly stati: InputMaybe>>; - /** Show posts with a specific status. */ - readonly status: InputMaybe; - /** Title of the object */ - readonly title: InputMaybe; -}; - -/** Connection between the HierarchicalContentNode type and the ContentNode type */ -export type GQLHierarchicalContentNodeToContentNodeChildrenConnection = { - readonly __typename?: 'HierarchicalContentNodeToContentNodeChildrenConnection'; - /** Edges for the HierarchicalContentNodeToContentNodeChildrenConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLHierarchicalContentNodeToContentNodeChildrenConnectionEdge = { - readonly __typename?: 'HierarchicalContentNodeToContentNodeChildrenConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the HierarchicalContentNodeToContentNodeChildrenConnection connection */ -export type GQLHierarchicalContentNodeToContentNodeChildrenConnectionWhereArgs = { - /** The Types of content to filter */ - readonly contentTypes: InputMaybe>>; - /** Filter the connection based on dates */ - readonly dateQuery: InputMaybe; - /** True for objects with passwords; False for objects without passwords; null for all objects with or without passwords */ - readonly hasPassword: InputMaybe; - /** Specific ID of the object */ - readonly id: InputMaybe; - /** Array of IDs for the objects to retrieve */ - readonly in: InputMaybe>>; - /** Get objects with a specific mimeType property */ - readonly mimeType: InputMaybe; - /** Slug / post_name of the object */ - readonly name: InputMaybe; - /** Specify objects to retrieve. Use slugs */ - readonly nameIn: InputMaybe>>; - /** Specify IDs NOT to retrieve. If this is used in the same query as "in", it will be ignored */ - readonly notIn: InputMaybe>>; - /** What paramater to use to order the objects by. */ - readonly orderby: InputMaybe>>; - /** Use ID to return only children. Use 0 to return only top-level items */ - readonly parent: InputMaybe; - /** Specify objects whose parent is in an array */ - readonly parentIn: InputMaybe>>; - /** Specify posts whose parent is not in an array */ - readonly parentNotIn: InputMaybe>>; - /** Show posts with a specific password. */ - readonly password: InputMaybe; - /** Show Posts based on a keyword search */ - readonly search: InputMaybe; - /** Retrieve posts where post status is in an array. */ - readonly stati: InputMaybe>>; - /** Show posts with a specific status. */ - readonly status: InputMaybe; - /** Title of the object */ - readonly title: InputMaybe; -}; - -/** Connection between the HierarchicalContentNode type and the ContentNode type */ -export type GQLHierarchicalContentNodeToParentContentNodeConnectionEdge = { - readonly __typename?: 'HierarchicalContentNodeToParentContentNodeConnectionEdge'; - /** The node of the connection, without the edges */ - readonly node: Maybe; -}; - -/** Term node with hierarchical (parent/child) relationships */ -export type GQLHierarchicalTermNode = { - /** Database id of the parent node */ - readonly parentDatabaseId: Maybe; - /** The globally unique identifier of the parent node. */ - readonly parentId: Maybe; -}; - -/** File details for a Media Item */ -export type GQLMediaDetails = { - readonly __typename?: 'MediaDetails'; - /** The filename of the mediaItem */ - readonly file: Maybe; - /** The height of the mediaItem */ - readonly height: Maybe; - /** Meta information associated with the mediaItem */ - readonly meta: Maybe; - /** The available sizes of the mediaItem */ - readonly sizes: Maybe>>; - /** The width of the mediaItem */ - readonly width: Maybe; -}; - -/** The mediaItem type */ -export type GQLMediaItem = GQLContentNode & GQLDatabaseIdentifier & GQLHierarchicalContentNode & GQLNode & GQLNodeWithAuthor & GQLNodeWithComments & GQLNodeWithTemplate & GQLNodeWithTitle & GQLUniformResourceIdentifiable & { - readonly __typename?: 'MediaItem'; - /** Alternative text to display when resource is not displayed */ - readonly altText: Maybe; - /** Returns ancestors of the node. Default ordered as lowest (closest to the child) to highest (closest to the root). */ - readonly ancestors: Maybe; - /** Connection between the NodeWithAuthor type and the User type */ - readonly author: Maybe; - /** The database identifier of the author of the node */ - readonly authorDatabaseId: Maybe; - /** The globally unique identifier of the author of the node */ - readonly authorId: Maybe; - /** The caption for the resource */ - readonly caption: Maybe; - /** Connection between the HierarchicalContentNode type and the ContentNode type */ - readonly children: Maybe; - /** The number of comments. Even though WPGraphQL denotes this field as an integer, in WordPress this field should be saved as a numeric string for compatibility. */ - readonly commentCount: Maybe; - /** Whether the comments are open or closed for this particular post. */ - readonly commentStatus: Maybe; - /** Connection between the mediaItem type and the Comment type */ - readonly comments: Maybe; - /** Connection between the ContentNode type and the ContentType type */ - readonly contentType: Maybe; - /** The name of the Content Type the node belongs to */ - readonly contentTypeName: Scalars['String']; - /** The unique identifier stored in the database */ - readonly databaseId: Scalars['Int']; - /** Post publishing date. */ - readonly date: Maybe; - /** The publishing date set in GMT. */ - readonly dateGmt: Maybe; - /** Description of the image (stored as post_content) */ - readonly description: Maybe; - /** The desired slug of the post */ - readonly desiredSlug: Maybe; - /** If a user has edited the node within the past 15 seconds, this will return the user that last edited. Null if the edit lock doesn't exist or is greater than 15 seconds */ - readonly editingLockedBy: Maybe; - /** The RSS enclosure for the object */ - readonly enclosure: Maybe; - /** Connection between the ContentNode type and the EnqueuedScript type */ - readonly enqueuedScripts: Maybe; - /** Connection between the ContentNode type and the EnqueuedStylesheet type */ - readonly enqueuedStylesheets: Maybe; - /** The filesize in bytes of the resource */ - readonly fileSize: Maybe; - /** The global unique identifier for this post. This currently matches the value stored in WP_Post->guid and the guid column in the "post_objects" database table. */ - readonly guid: Maybe; - /** The globally unique identifier of the attachment object. */ - readonly id: Scalars['ID']; - /** Whether the node is a Content Node */ - readonly isContentNode: Scalars['Boolean']; - /** Whether the object is a node in the preview state */ - readonly isPreview: Maybe; - /** Whether the object is restricted from the current viewer */ - readonly isRestricted: Maybe; - /** Whether the node is a Term */ - readonly isTermNode: Scalars['Boolean']; - /** The user that most recently edited the node */ - readonly lastEditedBy: Maybe; - /** The permalink of the post */ - readonly link: Maybe; - /** Details about the mediaItem */ - readonly mediaDetails: Maybe; - /** - * The id field matches the WP_Post->ID field. - * @deprecated Deprecated in favor of the databaseId field - */ - readonly mediaItemId: Scalars['Int']; - /** Url of the mediaItem */ - readonly mediaItemUrl: Maybe; - /** Type of resource */ - readonly mediaType: Maybe; - /** The mime type of the mediaItem */ - readonly mimeType: Maybe; - /** The local modified time for a post. If a post was recently updated the modified field will change to match the corresponding time. */ - readonly modified: Maybe; - /** The GMT modified time for a post. If a post was recently updated the modified field will change to match the corresponding time in GMT. */ - readonly modifiedGmt: Maybe; - /** The parent of the node. The parent object can be of various types */ - readonly parent: Maybe; - /** Database id of the parent node */ - readonly parentDatabaseId: Maybe; - /** The globally unique identifier of the parent node. */ - readonly parentId: Maybe; - /** The database id of the preview node */ - readonly previewRevisionDatabaseId: Maybe; - /** Whether the object is a node in the preview state */ - readonly previewRevisionId: Maybe; - /** The sizes attribute value for an image. */ - readonly sizes: Maybe; - /** The uri slug for the post. This is equivalent to the WP_Post->post_name field and the post_name column in the database for the "post_objects" table. */ - readonly slug: Maybe; - /** Url of the mediaItem */ - readonly sourceUrl: Maybe; - /** The srcset attribute specifies the URL of the image to use in different situations. It is a comma separated string of urls and their widths. */ - readonly srcSet: Maybe; - /** The current status of the object */ - readonly status: Maybe; - /** The template assigned to the node */ - readonly template: Maybe; - /** The title of the post. This is currently just the raw title. An amendment to support rendered title needs to be made. */ - readonly title: Maybe; - /** The unique resource identifier path */ - readonly uri: Maybe; -}; - - -/** The mediaItem type */ -export type GQLMediaItemAncestorsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The mediaItem type */ -export type GQLMediaItemCaptionArgs = { - format: InputMaybe; -}; - - -/** The mediaItem type */ -export type GQLMediaItemChildrenArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The mediaItem type */ -export type GQLMediaItemCommentsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The mediaItem type */ -export type GQLMediaItemDescriptionArgs = { - format: InputMaybe; -}; - - -/** The mediaItem type */ -export type GQLMediaItemEnqueuedScriptsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - - -/** The mediaItem type */ -export type GQLMediaItemEnqueuedStylesheetsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - - -/** The mediaItem type */ -export type GQLMediaItemFileSizeArgs = { - size: InputMaybe; -}; - - -/** The mediaItem type */ -export type GQLMediaItemSizesArgs = { - size: InputMaybe; -}; - - -/** The mediaItem type */ -export type GQLMediaItemSourceUrlArgs = { - size: InputMaybe; -}; - - -/** The mediaItem type */ -export type GQLMediaItemSrcSetArgs = { - size: InputMaybe; -}; - - -/** The mediaItem type */ -export type GQLMediaItemTitleArgs = { - format: InputMaybe; -}; - -/** The Type of Identifier used to fetch a single resource. Default is ID. */ -export enum GQLMediaItemIdType { - /** Identify a resource by the Database ID. */ - DatabaseId = 'DATABASE_ID', - /** Identify a resource by the (hashed) Global ID. */ - Id = 'ID', - /** Identify a resource by the slug. Available to non-hierarchcial Types where the slug is a unique identifier. */ - Slug = 'SLUG', - /** Identify a media item by its source url */ - SourceUrl = 'SOURCE_URL', - /** Identify a resource by the URI. */ - Uri = 'URI' -} - -/** Meta connected to a MediaItem */ -export type GQLMediaItemMeta = { - readonly __typename?: 'MediaItemMeta'; - /** Aperture measurement of the media item. */ - readonly aperture: Maybe; - /** Information about the camera used to create the media item. */ - readonly camera: Maybe; - /** The text string description associated with the media item. */ - readonly caption: Maybe; - /** Copyright information associated with the media item. */ - readonly copyright: Maybe; - /** The date/time when the media was created. */ - readonly createdTimestamp: Maybe; - /** The original creator of the media item. */ - readonly credit: Maybe; - /** The focal length value of the media item. */ - readonly focalLength: Maybe; - /** The ISO (International Organization for Standardization) value of the media item. */ - readonly iso: Maybe; - /** List of keywords used to describe or identfy the media item. */ - readonly keywords: Maybe>>; - /** The vertical or horizontal aspect of the media item. */ - readonly orientation: Maybe; - /** The shutter speed information of the media item. */ - readonly shutterSpeed: Maybe; - /** A useful title for the media item. */ - readonly title: Maybe; -}; - -/** The size of the media item object. */ -export enum GQLMediaItemSizeEnum { - /** MediaItem with the large size */ - Large = 'LARGE', - /** MediaItem with the lg size */ - Lg = 'LG', - /** MediaItem with the md size */ - Md = 'MD', - /** MediaItem with the medium size */ - Medium = 'MEDIUM', - /** MediaItem with the medium_large size */ - MediumLarge = 'MEDIUM_LARGE', - /** MediaItem with the sm size */ - Sm = 'SM', - /** MediaItem with the thumbnail size */ - Thumbnail = 'THUMBNAIL', - /** MediaItem with the xl size */ - Xl = 'XL', - /** MediaItem with the xs size */ - Xs = 'XS', - /** MediaItem with the xxl size */ - Xxl = 'XXL', - /** MediaItem with the xxxl size */ - Xxxl = 'XXXL', - /** MediaItem with the 1536x1536 size */ - '1536X1536' = '_1536X1536', - /** MediaItem with the 2048x2048 size */ - '2048X2048' = '_2048X2048' -} - -/** The status of the media item object. */ -export enum GQLMediaItemStatusEnum { - /** Objects with the auto-draft status */ - AutoDraft = 'AUTO_DRAFT', - /** Objects with the inherit status */ - Inherit = 'INHERIT', - /** Objects with the private status */ - Private = 'PRIVATE', - /** Objects with the trash status */ - Trash = 'TRASH' -} - -/** Connection between the mediaItem type and the Comment type */ -export type GQLMediaItemToCommentConnection = { - readonly __typename?: 'MediaItemToCommentConnection'; - /** Edges for the MediaItemToCommentConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLMediaItemToCommentConnectionEdge = { - readonly __typename?: 'MediaItemToCommentConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the MediaItemToCommentConnection connection */ -export type GQLMediaItemToCommentConnectionWhereArgs = { - /** Comment author email address. */ - readonly authorEmail: InputMaybe; - /** Array of author IDs to include comments for. */ - readonly authorIn: InputMaybe>>; - /** Array of author IDs to exclude comments for. */ - readonly authorNotIn: InputMaybe>>; - /** Comment author URL. */ - readonly authorUrl: InputMaybe; - /** Array of comment IDs to include. */ - readonly commentIn: InputMaybe>>; - /** Array of IDs of users whose unapproved comments will be returned by the query regardless of status. */ - readonly commentNotIn: InputMaybe>>; - /** Include comments of a given type. */ - readonly commentType: InputMaybe; - /** Include comments from a given array of comment types. */ - readonly commentTypeIn: InputMaybe>>; - /** Exclude comments from a given array of comment types. */ - readonly commentTypeNotIn: InputMaybe; - /** Content object author ID to limit results by. */ - readonly contentAuthor: InputMaybe>>; - /** Array of author IDs to retrieve comments for. */ - readonly contentAuthorIn: InputMaybe>>; - /** Array of author IDs *not* to retrieve comments for. */ - readonly contentAuthorNotIn: InputMaybe>>; - /** Limit results to those affiliated with a given content object ID. */ - readonly contentId: InputMaybe; - /** Array of content object IDs to include affiliated comments for. */ - readonly contentIdIn: InputMaybe>>; - /** Array of content object IDs to exclude affiliated comments for. */ - readonly contentIdNotIn: InputMaybe>>; - /** Content object name to retrieve affiliated comments for. */ - readonly contentName: InputMaybe; - /** Content Object parent ID to retrieve affiliated comments for. */ - readonly contentParent: InputMaybe; - /** Array of content object statuses to retrieve affiliated comments for. Pass 'any' to match any value. */ - readonly contentStatus: InputMaybe>>; - /** Content object type or array of types to retrieve affiliated comments for. Pass 'any' to match any value. */ - readonly contentType: InputMaybe>>; - /** Array of IDs or email addresses of users whose unapproved comments will be returned by the query regardless of $status. Default empty */ - readonly includeUnapproved: InputMaybe>>; - /** Karma score to retrieve matching comments for. */ - readonly karma: InputMaybe; - /** The cardinality of the order of the connection */ - readonly order: InputMaybe; - /** Field to order the comments by. */ - readonly orderby: InputMaybe; - /** Parent ID of comment to retrieve children of. */ - readonly parent: InputMaybe; - /** Array of parent IDs of comments to retrieve children for. */ - readonly parentIn: InputMaybe>>; - /** Array of parent IDs of comments *not* to retrieve children for. */ - readonly parentNotIn: InputMaybe>>; - /** Search term(s) to retrieve matching comments for. */ - readonly search: InputMaybe; - /** Comment status to limit results by. */ - readonly status: InputMaybe; - /** Include comments for a specific user ID. */ - readonly userId: InputMaybe; -}; - -/** Details of an available size for a media item */ -export type GQLMediaSize = { - readonly __typename?: 'MediaSize'; - /** The filename of the referenced size */ - readonly file: Maybe; - /** The filesize of the resource */ - readonly fileSize: Maybe; - /** The height of the referenced size */ - readonly height: Maybe; - /** The mime type of the referenced size */ - readonly mimeType: Maybe; - /** The referenced size name */ - readonly name: Maybe; - /** The url of the referenced size */ - readonly sourceUrl: Maybe; - /** The width of the referenced size */ - readonly width: Maybe; -}; - -/** Menus are the containers for navigation items. Menus can be assigned to menu locations, which are typically registered by the active theme. */ -export type GQLMenu = GQLDatabaseIdentifier & GQLNode & { - readonly __typename?: 'Menu'; - /** The number of items in the menu */ - readonly count: Maybe; - /** The unique identifier stored in the database */ - readonly databaseId: Scalars['Int']; - /** The globally unique identifier of the nav menu object. */ - readonly id: Scalars['ID']; - /** Whether the object is restricted from the current viewer */ - readonly isRestricted: Maybe; - /** The locations a menu is assigned to */ - readonly locations: Maybe>>; - /** - * WP ID of the nav menu. - * @deprecated Deprecated in favor of the databaseId field - */ - readonly menuId: Maybe; - /** Connection between the Menu type and the MenuItem type */ - readonly menuItems: Maybe; - /** Display name of the menu. Equivalent to WP_Term->name. */ - readonly name: Maybe; - /** The url friendly name of the menu. Equivalent to WP_Term->slug */ - readonly slug: Maybe; -}; - - -/** Menus are the containers for navigation items. Menus can be assigned to menu locations, which are typically registered by the active theme. */ -export type GQLMenuMenuItemsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - -/** Navigation menu items are the individual items assigned to a menu. These are rendered as the links in a navigation menu. */ -export type GQLMenuItem = GQLDatabaseIdentifier & GQLNode & { - readonly __typename?: 'MenuItem'; - /** Connection between the MenuItem type and the MenuItem type */ - readonly childItems: Maybe; - /** Connection from MenuItem to it's connected node */ - readonly connectedNode: Maybe; - /** - * The object connected to this menu item. - * @deprecated Deprecated in favor of the connectedNode field - */ - readonly connectedObject: Maybe; - /** Class attribute for the menu item link */ - readonly cssClasses: Maybe>>; - /** The unique identifier stored in the database */ - readonly databaseId: Scalars['Int']; - /** Description of the menu item. */ - readonly description: Maybe; - /** The globally unique identifier of the nav menu item object. */ - readonly id: Scalars['ID']; - /** Whether the object is restricted from the current viewer */ - readonly isRestricted: Maybe; - /** Label or title of the menu item. */ - readonly label: Maybe; - /** Link relationship (XFN) of the menu item. */ - readonly linkRelationship: Maybe; - /** The locations the menu item's Menu is assigned to */ - readonly locations: Maybe>>; - /** The Menu a MenuItem is part of */ - readonly menu: Maybe; - /** - * WP ID of the menu item. - * @deprecated Deprecated in favor of the databaseId field - */ - readonly menuItemId: Maybe; - /** Menu item order */ - readonly order: Maybe; - /** The database id of the parent menu item or null if it is the root */ - readonly parentDatabaseId: Maybe; - /** The globally unique identifier of the parent nav menu item object. */ - readonly parentId: Maybe; - /** Path for the resource. Relative path for internal resources. Absolute path for external resources. */ - readonly path: Maybe; - /** Target attribute for the menu item link. */ - readonly target: Maybe; - /** Title attribute for the menu item link */ - readonly title: Maybe; - /** URL or destination of the menu item. */ - readonly url: Maybe; -}; - - -/** Navigation menu items are the individual items assigned to a menu. These are rendered as the links in a navigation menu. */ -export type GQLMenuItemChildItemsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - -/** Nodes that can be linked to as Menu Items */ -export type GQLMenuItemLinkable = { - /** The unique resource identifier path */ - readonly databaseId: Scalars['Int']; - /** The unique resource identifier path */ - readonly id: Scalars['ID']; - /** The unique resource identifier path */ - readonly uri: Maybe; -}; - -/** The Type of Identifier used to fetch a single node. Default is "ID". To be used along with the "id" field. */ -export enum GQLMenuItemNodeIdTypeEnum { - /** Identify a resource by the Database ID. */ - DatabaseId = 'DATABASE_ID', - /** Identify a resource by the (hashed) Global ID. */ - Id = 'ID' -} - -/** Deprecated in favor of MenuItemLinkeable Interface */ -export type GQLMenuItemObjectUnion = GQLCategory | GQLPage | GQLPost | GQLProject | GQLTag | GQLTechnology | GQLWork; - -/** Connection between the MenuItem type and the Menu type */ -export type GQLMenuItemToMenuConnectionEdge = { - readonly __typename?: 'MenuItemToMenuConnectionEdge'; - /** The node of the connection, without the edges */ - readonly node: Maybe; -}; - -/** Connection between the MenuItem type and the MenuItem type */ -export type GQLMenuItemToMenuItemConnection = { - readonly __typename?: 'MenuItemToMenuItemConnection'; - /** Edges for the MenuItemToMenuItemConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLMenuItemToMenuItemConnectionEdge = { - readonly __typename?: 'MenuItemToMenuItemConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the MenuItemToMenuItemConnection connection */ -export type GQLMenuItemToMenuItemConnectionWhereArgs = { - /** The ID of the object */ - readonly id: InputMaybe; - /** The menu location for the menu being queried */ - readonly location: InputMaybe; - /** The database ID of the parent menu object */ - readonly parentDatabaseId: InputMaybe; - /** The ID of the parent menu object */ - readonly parentId: InputMaybe; -}; - -/** Connection between the MenuItem type and the MenuItemLinkable type */ -export type GQLMenuItemToMenuItemLinkableConnectionEdge = { - readonly __typename?: 'MenuItemToMenuItemLinkableConnectionEdge'; - /** The node of the connection, without the edges */ - readonly node: Maybe; -}; - -/** Registered menu locations */ -export enum GQLMenuLocationEnum { - /** Empty menu location */ - Empty = 'EMPTY' -} - -/** The Type of Identifier used to fetch a single node. Default is "ID". To be used along with the "id" field. */ -export enum GQLMenuNodeIdTypeEnum { - /** Identify a menu node by the Database ID. */ - DatabaseId = 'DATABASE_ID', - /** Identify a menu node by the (hashed) Global ID. */ - Id = 'ID', - /** Identify a menu node by it's name */ - Name = 'NAME' -} - -/** Connection between the Menu type and the MenuItem type */ -export type GQLMenuToMenuItemConnection = { - readonly __typename?: 'MenuToMenuItemConnection'; - /** Edges for the MenuToMenuItemConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLMenuToMenuItemConnectionEdge = { - readonly __typename?: 'MenuToMenuItemConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the MenuToMenuItemConnection connection */ -export type GQLMenuToMenuItemConnectionWhereArgs = { - /** The ID of the object */ - readonly id: InputMaybe; - /** The menu location for the menu being queried */ - readonly location: InputMaybe; - /** The database ID of the parent menu object */ - readonly parentDatabaseId: InputMaybe; - /** The ID of the parent menu object */ - readonly parentId: InputMaybe; -}; - -/** The MimeType of the object */ -export enum GQLMimeTypeEnum { - /** MimeType application/java */ - ApplicationJava = 'APPLICATION_JAVA', - /** MimeType application/msword */ - ApplicationMsword = 'APPLICATION_MSWORD', - /** MimeType application/octet-stream */ - ApplicationOctetStream = 'APPLICATION_OCTET_STREAM', - /** MimeType application/onenote */ - ApplicationOnenote = 'APPLICATION_ONENOTE', - /** MimeType application/oxps */ - ApplicationOxps = 'APPLICATION_OXPS', - /** MimeType application/pdf */ - ApplicationPdf = 'APPLICATION_PDF', - /** MimeType application/rar */ - ApplicationRar = 'APPLICATION_RAR', - /** MimeType application/rtf */ - ApplicationRtf = 'APPLICATION_RTF', - /** MimeType application/ttaf+xml */ - ApplicationTtafXml = 'APPLICATION_TTAF_XML', - /** MimeType application/vnd.apple.keynote */ - ApplicationVndAppleKeynote = 'APPLICATION_VND_APPLE_KEYNOTE', - /** MimeType application/vnd.apple.numbers */ - ApplicationVndAppleNumbers = 'APPLICATION_VND_APPLE_NUMBERS', - /** MimeType application/vnd.apple.pages */ - ApplicationVndApplePages = 'APPLICATION_VND_APPLE_PAGES', - /** MimeType application/vnd.ms-access */ - ApplicationVndMsAccess = 'APPLICATION_VND_MS_ACCESS', - /** MimeType application/vnd.ms-excel */ - ApplicationVndMsExcel = 'APPLICATION_VND_MS_EXCEL', - /** MimeType application/vnd.ms-excel.addin.macroEnabled.12 */ - ApplicationVndMsExcelAddinMacroenabled_12 = 'APPLICATION_VND_MS_EXCEL_ADDIN_MACROENABLED_12', - /** MimeType application/vnd.ms-excel.sheet.binary.macroEnabled.12 */ - ApplicationVndMsExcelSheetBinaryMacroenabled_12 = 'APPLICATION_VND_MS_EXCEL_SHEET_BINARY_MACROENABLED_12', - /** MimeType application/vnd.ms-excel.sheet.macroEnabled.12 */ - ApplicationVndMsExcelSheetMacroenabled_12 = 'APPLICATION_VND_MS_EXCEL_SHEET_MACROENABLED_12', - /** MimeType application/vnd.ms-excel.template.macroEnabled.12 */ - ApplicationVndMsExcelTemplateMacroenabled_12 = 'APPLICATION_VND_MS_EXCEL_TEMPLATE_MACROENABLED_12', - /** MimeType application/vnd.ms-powerpoint */ - ApplicationVndMsPowerpoint = 'APPLICATION_VND_MS_POWERPOINT', - /** MimeType application/vnd.ms-powerpoint.addin.macroEnabled.12 */ - ApplicationVndMsPowerpointAddinMacroenabled_12 = 'APPLICATION_VND_MS_POWERPOINT_ADDIN_MACROENABLED_12', - /** MimeType application/vnd.ms-powerpoint.presentation.macroEnabled.12 */ - ApplicationVndMsPowerpointPresentationMacroenabled_12 = 'APPLICATION_VND_MS_POWERPOINT_PRESENTATION_MACROENABLED_12', - /** MimeType application/vnd.ms-powerpoint.slideshow.macroEnabled.12 */ - ApplicationVndMsPowerpointSlideshowMacroenabled_12 = 'APPLICATION_VND_MS_POWERPOINT_SLIDESHOW_MACROENABLED_12', - /** MimeType application/vnd.ms-powerpoint.slide.macroEnabled.12 */ - ApplicationVndMsPowerpointSlideMacroenabled_12 = 'APPLICATION_VND_MS_POWERPOINT_SLIDE_MACROENABLED_12', - /** MimeType application/vnd.ms-powerpoint.template.macroEnabled.12 */ - ApplicationVndMsPowerpointTemplateMacroenabled_12 = 'APPLICATION_VND_MS_POWERPOINT_TEMPLATE_MACROENABLED_12', - /** MimeType application/vnd.ms-project */ - ApplicationVndMsProject = 'APPLICATION_VND_MS_PROJECT', - /** MimeType application/vnd.ms-word.document.macroEnabled.12 */ - ApplicationVndMsWordDocumentMacroenabled_12 = 'APPLICATION_VND_MS_WORD_DOCUMENT_MACROENABLED_12', - /** MimeType application/vnd.ms-word.template.macroEnabled.12 */ - ApplicationVndMsWordTemplateMacroenabled_12 = 'APPLICATION_VND_MS_WORD_TEMPLATE_MACROENABLED_12', - /** MimeType application/vnd.ms-write */ - ApplicationVndMsWrite = 'APPLICATION_VND_MS_WRITE', - /** MimeType application/vnd.ms-xpsdocument */ - ApplicationVndMsXpsdocument = 'APPLICATION_VND_MS_XPSDOCUMENT', - /** MimeType application/vnd.oasis.opendocument.chart */ - ApplicationVndOasisOpendocumentChart = 'APPLICATION_VND_OASIS_OPENDOCUMENT_CHART', - /** MimeType application/vnd.oasis.opendocument.database */ - ApplicationVndOasisOpendocumentDatabase = 'APPLICATION_VND_OASIS_OPENDOCUMENT_DATABASE', - /** MimeType application/vnd.oasis.opendocument.formula */ - ApplicationVndOasisOpendocumentFormula = 'APPLICATION_VND_OASIS_OPENDOCUMENT_FORMULA', - /** MimeType application/vnd.oasis.opendocument.graphics */ - ApplicationVndOasisOpendocumentGraphics = 'APPLICATION_VND_OASIS_OPENDOCUMENT_GRAPHICS', - /** MimeType application/vnd.oasis.opendocument.presentation */ - ApplicationVndOasisOpendocumentPresentation = 'APPLICATION_VND_OASIS_OPENDOCUMENT_PRESENTATION', - /** MimeType application/vnd.oasis.opendocument.spreadsheet */ - ApplicationVndOasisOpendocumentSpreadsheet = 'APPLICATION_VND_OASIS_OPENDOCUMENT_SPREADSHEET', - /** MimeType application/vnd.oasis.opendocument.text */ - ApplicationVndOasisOpendocumentText = 'APPLICATION_VND_OASIS_OPENDOCUMENT_TEXT', - /** MimeType application/vnd.openxmlformats-officedocument.presentationml.presentation */ - ApplicationVndOpenxmlformatsOfficedocumentPresentationmlPresentation = 'APPLICATION_VND_OPENXMLFORMATS_OFFICEDOCUMENT_PRESENTATIONML_PRESENTATION', - /** MimeType application/vnd.openxmlformats-officedocument.presentationml.slide */ - ApplicationVndOpenxmlformatsOfficedocumentPresentationmlSlide = 'APPLICATION_VND_OPENXMLFORMATS_OFFICEDOCUMENT_PRESENTATIONML_SLIDE', - /** MimeType application/vnd.openxmlformats-officedocument.presentationml.slideshow */ - ApplicationVndOpenxmlformatsOfficedocumentPresentationmlSlideshow = 'APPLICATION_VND_OPENXMLFORMATS_OFFICEDOCUMENT_PRESENTATIONML_SLIDESHOW', - /** MimeType application/vnd.openxmlformats-officedocument.presentationml.template */ - ApplicationVndOpenxmlformatsOfficedocumentPresentationmlTemplate = 'APPLICATION_VND_OPENXMLFORMATS_OFFICEDOCUMENT_PRESENTATIONML_TEMPLATE', - /** MimeType application/vnd.openxmlformats-officedocument.spreadsheetml.sheet */ - ApplicationVndOpenxmlformatsOfficedocumentSpreadsheetmlSheet = 'APPLICATION_VND_OPENXMLFORMATS_OFFICEDOCUMENT_SPREADSHEETML_SHEET', - /** MimeType application/vnd.openxmlformats-officedocument.spreadsheetml.template */ - ApplicationVndOpenxmlformatsOfficedocumentSpreadsheetmlTemplate = 'APPLICATION_VND_OPENXMLFORMATS_OFFICEDOCUMENT_SPREADSHEETML_TEMPLATE', - /** MimeType application/vnd.openxmlformats-officedocument.wordprocessingml.document */ - ApplicationVndOpenxmlformatsOfficedocumentWordprocessingmlDocument = 'APPLICATION_VND_OPENXMLFORMATS_OFFICEDOCUMENT_WORDPROCESSINGML_DOCUMENT', - /** MimeType application/vnd.openxmlformats-officedocument.wordprocessingml.template */ - ApplicationVndOpenxmlformatsOfficedocumentWordprocessingmlTemplate = 'APPLICATION_VND_OPENXMLFORMATS_OFFICEDOCUMENT_WORDPROCESSINGML_TEMPLATE', - /** MimeType application/wordperfect */ - ApplicationWordperfect = 'APPLICATION_WORDPERFECT', - /** MimeType application/x-7z-compressed */ - ApplicationX_7ZCompressed = 'APPLICATION_X_7Z_COMPRESSED', - /** MimeType application/x-gzip */ - ApplicationXGzip = 'APPLICATION_X_GZIP', - /** MimeType application/x-tar */ - ApplicationXTar = 'APPLICATION_X_TAR', - /** MimeType application/zip */ - ApplicationZip = 'APPLICATION_ZIP', - /** MimeType audio/aac */ - AudioAac = 'AUDIO_AAC', - /** MimeType audio/flac */ - AudioFlac = 'AUDIO_FLAC', - /** MimeType audio/midi */ - AudioMidi = 'AUDIO_MIDI', - /** MimeType audio/mpeg */ - AudioMpeg = 'AUDIO_MPEG', - /** MimeType audio/ogg */ - AudioOgg = 'AUDIO_OGG', - /** MimeType audio/wav */ - AudioWav = 'AUDIO_WAV', - /** MimeType audio/x-matroska */ - AudioXMatroska = 'AUDIO_X_MATROSKA', - /** MimeType audio/x-ms-wax */ - AudioXMsWax = 'AUDIO_X_MS_WAX', - /** MimeType audio/x-ms-wma */ - AudioXMsWma = 'AUDIO_X_MS_WMA', - /** MimeType audio/x-realaudio */ - AudioXRealaudio = 'AUDIO_X_REALAUDIO', - /** MimeType image/bmp */ - ImageBmp = 'IMAGE_BMP', - /** MimeType image/gif */ - ImageGif = 'IMAGE_GIF', - /** MimeType image/heic */ - ImageHeic = 'IMAGE_HEIC', - /** MimeType image/jpeg */ - ImageJpeg = 'IMAGE_JPEG', - /** MimeType image/png */ - ImagePng = 'IMAGE_PNG', - /** MimeType image/svg+xml */ - ImageSvgXml = 'IMAGE_SVG_XML', - /** MimeType image/tiff */ - ImageTiff = 'IMAGE_TIFF', - /** MimeType image/webp */ - ImageWebp = 'IMAGE_WEBP', - /** MimeType image/x-icon */ - ImageXIcon = 'IMAGE_X_ICON', - /** MimeType text/calendar */ - TextCalendar = 'TEXT_CALENDAR', - /** MimeType text/css */ - TextCss = 'TEXT_CSS', - /** MimeType text/csv */ - TextCsv = 'TEXT_CSV', - /** MimeType text/plain */ - TextPlain = 'TEXT_PLAIN', - /** MimeType text/richtext */ - TextRichtext = 'TEXT_RICHTEXT', - /** MimeType text/tab-separated-values */ - TextTabSeparatedValues = 'TEXT_TAB_SEPARATED_VALUES', - /** MimeType text/vtt */ - TextVtt = 'TEXT_VTT', - /** MimeType video/3gpp */ - Video_3Gpp = 'VIDEO_3GPP', - /** MimeType video/3gpp2 */ - Video_3Gpp2 = 'VIDEO_3GPP2', - /** MimeType video/avi */ - VideoAvi = 'VIDEO_AVI', - /** MimeType video/divx */ - VideoDivx = 'VIDEO_DIVX', - /** MimeType video/mp4 */ - VideoMp4 = 'VIDEO_MP4', - /** MimeType video/mpeg */ - VideoMpeg = 'VIDEO_MPEG', - /** MimeType video/ogg */ - VideoOgg = 'VIDEO_OGG', - /** MimeType video/quicktime */ - VideoQuicktime = 'VIDEO_QUICKTIME', - /** MimeType video/webm */ - VideoWebm = 'VIDEO_WEBM', - /** MimeType video/x-flv */ - VideoXFlv = 'VIDEO_X_FLV', - /** MimeType video/x-matroska */ - VideoXMatroska = 'VIDEO_X_MATROSKA', - /** MimeType video/x-ms-asf */ - VideoXMsAsf = 'VIDEO_X_MS_ASF', - /** MimeType video/x-ms-wm */ - VideoXMsWm = 'VIDEO_X_MS_WM', - /** MimeType video/x-ms-wmv */ - VideoXMsWmv = 'VIDEO_X_MS_WMV', - /** MimeType video/x-ms-wmx */ - VideoXMsWmx = 'VIDEO_X_MS_WMX' -} - -/** An object with an ID */ -export type GQLNode = { - /** The globally unique ID for the object */ - readonly id: Scalars['ID']; -}; - -/** A node that can have an author assigned to it */ -export type GQLNodeWithAuthor = { - /** Connection between the NodeWithAuthor type and the User type */ - readonly author: Maybe; - /** The database identifier of the author of the node */ - readonly authorDatabaseId: Maybe; - /** The globally unique identifier of the author of the node */ - readonly authorId: Maybe; -}; - -/** Connection between the NodeWithAuthor type and the User type */ -export type GQLNodeWithAuthorToUserConnectionEdge = { - readonly __typename?: 'NodeWithAuthorToUserConnectionEdge'; - /** The node of the connection, without the edges */ - readonly node: Maybe; -}; - -/** A node that can have comments associated with it */ -export type GQLNodeWithComments = { - /** The number of comments. Even though WPGraphQL denotes this field as an integer, in WordPress this field should be saved as a numeric string for compatibility. */ - readonly commentCount: Maybe; - /** Whether the comments are open or closed for this particular post. */ - readonly commentStatus: Maybe; -}; - -/** A node that supports the content editor */ -export type GQLNodeWithContentEditor = { - /** The content of the post. */ - readonly content: Maybe; -}; - - -/** A node that supports the content editor */ -export type GQLNodeWithContentEditorContentArgs = { - format: InputMaybe; -}; - -/** A node that can have an excerpt */ -export type GQLNodeWithExcerpt = { - /** The excerpt of the post. */ - readonly excerpt: Maybe; -}; - - -/** A node that can have an excerpt */ -export type GQLNodeWithExcerptExcerptArgs = { - format: InputMaybe; -}; - -/** A node that can have a featured image set */ -export type GQLNodeWithFeaturedImage = { - /** Connection between the ContentNode type and the ContentType type */ - readonly contentType: Maybe; - /** The name of the Content Type the node belongs to */ - readonly contentTypeName: Scalars['String']; - /** The unique identifier stored in the database */ - readonly databaseId: Scalars['Int']; - /** Post publishing date. */ - readonly date: Maybe; - /** The publishing date set in GMT. */ - readonly dateGmt: Maybe; - /** The desired slug of the post */ - readonly desiredSlug: Maybe; - /** If a user has edited the node within the past 15 seconds, this will return the user that last edited. Null if the edit lock doesn't exist or is greater than 15 seconds */ - readonly editingLockedBy: Maybe; - /** The RSS enclosure for the object */ - readonly enclosure: Maybe; - /** Connection between the ContentNode type and the EnqueuedScript type */ - readonly enqueuedScripts: Maybe; - /** Connection between the ContentNode type and the EnqueuedStylesheet type */ - readonly enqueuedStylesheets: Maybe; - /** Connection between the NodeWithFeaturedImage type and the MediaItem type */ - readonly featuredImage: Maybe; - /** The database identifier for the featured image node assigned to the content node */ - readonly featuredImageDatabaseId: Maybe; - /** Globally unique ID of the featured image assigned to the node */ - readonly featuredImageId: Maybe; - /** The global unique identifier for this post. This currently matches the value stored in WP_Post->guid and the guid column in the "post_objects" database table. */ - readonly guid: Maybe; - /** The unique resource identifier path */ - readonly id: Scalars['ID']; - /** Whether the node is a Content Node */ - readonly isContentNode: Scalars['Boolean']; - /** Whether the object is a node in the preview state */ - readonly isPreview: Maybe; - /** Whether the object is restricted from the current viewer */ - readonly isRestricted: Maybe; - /** Whether the node is a Term */ - readonly isTermNode: Scalars['Boolean']; - /** The user that most recently edited the node */ - readonly lastEditedBy: Maybe; - /** The permalink of the post */ - readonly link: Maybe; - /** The local modified time for a post. If a post was recently updated the modified field will change to match the corresponding time. */ - readonly modified: Maybe; - /** The GMT modified time for a post. If a post was recently updated the modified field will change to match the corresponding time in GMT. */ - readonly modifiedGmt: Maybe; - /** The database id of the preview node */ - readonly previewRevisionDatabaseId: Maybe; - /** Whether the object is a node in the preview state */ - readonly previewRevisionId: Maybe; - /** The uri slug for the post. This is equivalent to the WP_Post->post_name field and the post_name column in the database for the "post_objects" table. */ - readonly slug: Maybe; - /** The current status of the object */ - readonly status: Maybe; - /** The template assigned to a node of content */ - readonly template: Maybe; - /** The unique resource identifier path */ - readonly uri: Maybe; -}; - - -/** A node that can have a featured image set */ -export type GQLNodeWithFeaturedImageEnqueuedScriptsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - - -/** A node that can have a featured image set */ -export type GQLNodeWithFeaturedImageEnqueuedStylesheetsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - -/** Connection between the NodeWithFeaturedImage type and the MediaItem type */ -export type GQLNodeWithFeaturedImageToMediaItemConnectionEdge = { - readonly __typename?: 'NodeWithFeaturedImageToMediaItemConnectionEdge'; - /** The node of the connection, without the edges */ - readonly node: Maybe; -}; - -/** A node that can have page attributes */ -export type GQLNodeWithPageAttributes = { - /** A field used for ordering posts. This is typically used with nav menu items or for special ordering of hierarchical content types. */ - readonly menuOrder: Maybe; -}; - -/** A node that can have revisions */ -export type GQLNodeWithRevisions = { - /** True if the node is a revision of another node */ - readonly isRevision: Maybe; - /** If the current node is a revision, this field exposes the node this is a revision of. Returns null if the node is not a revision of another node. */ - readonly revisionOf: Maybe; -}; - -/** Connection between the NodeWithRevisions type and the ContentNode type */ -export type GQLNodeWithRevisionsToContentNodeConnectionEdge = { - readonly __typename?: 'NodeWithRevisionsToContentNodeConnectionEdge'; - /** The node of the connection, without the edges */ - readonly node: Maybe; -}; - -/** A node that can have a template associated with it */ -export type GQLNodeWithTemplate = { - /** The template assigned to the node */ - readonly template: Maybe; -}; - -/** A node that NodeWith a title */ -export type GQLNodeWithTitle = { - /** The title of the post. This is currently just the raw title. An amendment to support rendered title needs to be made. */ - readonly title: Maybe; -}; - - -/** A node that NodeWith a title */ -export type GQLNodeWithTitleTitleArgs = { - format: InputMaybe; -}; - -/** A node that can have trackbacks and pingbacks */ -export type GQLNodeWithTrackbacks = { - /** Whether the pings are open or closed for this particular post. */ - readonly pingStatus: Maybe; - /** URLs that have been pinged. */ - readonly pinged: Maybe>>; - /** URLs queued to be pinged. */ - readonly toPing: Maybe>>; -}; - -/** The cardinality of the connection order */ -export enum GQLOrderEnum { - /** Sort the query result set in an ascending order */ - Asc = 'ASC', - /** Sort the query result set in a descending order */ - Desc = 'DESC' -} - -/** The page type */ -export type GQLPage = GQLContentNode & GQLDatabaseIdentifier & GQLHierarchicalContentNode & GQLMenuItemLinkable & GQLNode & GQLNodeWithAuthor & GQLNodeWithComments & GQLNodeWithContentEditor & GQLNodeWithFeaturedImage & GQLNodeWithPageAttributes & GQLNodeWithRevisions & GQLNodeWithTemplate & GQLNodeWithTitle & GQLUniformResourceIdentifiable & { - readonly __typename?: 'Page'; - /** Returns ancestors of the node. Default ordered as lowest (closest to the child) to highest (closest to the root). */ - readonly ancestors: Maybe; - /** Connection between the NodeWithAuthor type and the User type */ - readonly author: Maybe; - /** The database identifier of the author of the node */ - readonly authorDatabaseId: Maybe; - /** The globally unique identifier of the author of the node */ - readonly authorId: Maybe; - /** Connection between the HierarchicalContentNode type and the ContentNode type */ - readonly children: Maybe; - /** The number of comments. Even though WPGraphQL denotes this field as an integer, in WordPress this field should be saved as a numeric string for compatibility. */ - readonly commentCount: Maybe; - /** Whether the comments are open or closed for this particular post. */ - readonly commentStatus: Maybe; - /** Connection between the page type and the Comment type */ - readonly comments: Maybe; - /** The content of the post. */ - readonly content: Maybe; - /** Connection between the ContentNode type and the ContentType type */ - readonly contentType: Maybe; - /** The name of the Content Type the node belongs to */ - readonly contentTypeName: Scalars['String']; - /** The unique resource identifier path */ - readonly databaseId: Scalars['Int']; - /** Post publishing date. */ - readonly date: Maybe; - /** The publishing date set in GMT. */ - readonly dateGmt: Maybe; - /** The desired slug of the post */ - readonly desiredSlug: Maybe; - /** If a user has edited the node within the past 15 seconds, this will return the user that last edited. Null if the edit lock doesn't exist or is greater than 15 seconds */ - readonly editingLockedBy: Maybe; - /** The RSS enclosure for the object */ - readonly enclosure: Maybe; - /** Connection between the ContentNode type and the EnqueuedScript type */ - readonly enqueuedScripts: Maybe; - /** Connection between the ContentNode type and the EnqueuedStylesheet type */ - readonly enqueuedStylesheets: Maybe; - /** Connection between the NodeWithFeaturedImage type and the MediaItem type */ - readonly featuredImage: Maybe; - /** The database identifier for the featured image node assigned to the content node */ - readonly featuredImageDatabaseId: Maybe; - /** Globally unique ID of the featured image assigned to the node */ - readonly featuredImageId: Maybe; - /** The global unique identifier for this post. This currently matches the value stored in WP_Post->guid and the guid column in the "post_objects" database table. */ - readonly guid: Maybe; - /** The globally unique identifier of the page object. */ - readonly id: Scalars['ID']; - /** Whether the node is a Content Node */ - readonly isContentNode: Scalars['Boolean']; - /** Whether this page is set to the static front page. */ - readonly isFrontPage: Scalars['Boolean']; - /** Whether this page is set to the blog posts page. */ - readonly isPostsPage: Scalars['Boolean']; - /** Whether the object is a node in the preview state */ - readonly isPreview: Maybe; - /** Whether this page is set to the privacy page. */ - readonly isPrivacyPage: Scalars['Boolean']; - /** Whether the object is restricted from the current viewer */ - readonly isRestricted: Maybe; - /** True if the node is a revision of another node */ - readonly isRevision: Maybe; - /** Whether the node is a Term */ - readonly isTermNode: Scalars['Boolean']; - /** The user that most recently edited the node */ - readonly lastEditedBy: Maybe; - /** The permalink of the post */ - readonly link: Maybe; - /** A field used for ordering posts. This is typically used with nav menu items or for special ordering of hierarchical content types. */ - readonly menuOrder: Maybe; - /** The local modified time for a post. If a post was recently updated the modified field will change to match the corresponding time. */ - readonly modified: Maybe; - /** The GMT modified time for a post. If a post was recently updated the modified field will change to match the corresponding time in GMT. */ - readonly modifiedGmt: Maybe; - /** - * The id field matches the WP_Post->ID field. - * @deprecated Deprecated in favor of the databaseId field - */ - readonly pageId: Scalars['Int']; - /** The parent of the node. The parent object can be of various types */ - readonly parent: Maybe; - /** Database id of the parent node */ - readonly parentDatabaseId: Maybe; - /** The globally unique identifier of the parent node. */ - readonly parentId: Maybe; - /** Connection between the page type and the page type */ - readonly preview: Maybe; - /** The database id of the preview node */ - readonly previewRevisionDatabaseId: Maybe; - /** Whether the object is a node in the preview state */ - readonly previewRevisionId: Maybe; - /** If the current node is a revision, this field exposes the node this is a revision of. Returns null if the node is not a revision of another node. */ - readonly revisionOf: Maybe; - /** Connection between the page type and the page type */ - readonly revisions: Maybe; - /** The uri slug for the post. This is equivalent to the WP_Post->post_name field and the post_name column in the database for the "post_objects" table. */ - readonly slug: Maybe; - /** The current status of the object */ - readonly status: Maybe; - /** The template assigned to a node of content */ - readonly template: Maybe; - /** The title of the post. This is currently just the raw title. An amendment to support rendered title needs to be made. */ - readonly title: Maybe; - /** The unique resource identifier path */ - readonly uri: Maybe; -}; - - -/** The page type */ -export type GQLPageAncestorsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The page type */ -export type GQLPageChildrenArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The page type */ -export type GQLPageCommentsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The page type */ -export type GQLPageContentArgs = { - format: InputMaybe; -}; - - -/** The page type */ -export type GQLPageEnqueuedScriptsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - - -/** The page type */ -export type GQLPageEnqueuedStylesheetsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - - -/** The page type */ -export type GQLPageRevisionsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The page type */ -export type GQLPageTitleArgs = { - format: InputMaybe; -}; - -/** The Type of Identifier used to fetch a single resource. Default is ID. */ -export enum GQLPageIdType { - /** Identify a resource by the Database ID. */ - DatabaseId = 'DATABASE_ID', - /** Identify a resource by the (hashed) Global ID. */ - Id = 'ID', - /** Identify a resource by the URI. */ - Uri = 'URI' -} - -/** Connection between the page type and the Comment type */ -export type GQLPageToCommentConnection = { - readonly __typename?: 'PageToCommentConnection'; - /** Edges for the PageToCommentConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLPageToCommentConnectionEdge = { - readonly __typename?: 'PageToCommentConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the PageToCommentConnection connection */ -export type GQLPageToCommentConnectionWhereArgs = { - /** Comment author email address. */ - readonly authorEmail: InputMaybe; - /** Array of author IDs to include comments for. */ - readonly authorIn: InputMaybe>>; - /** Array of author IDs to exclude comments for. */ - readonly authorNotIn: InputMaybe>>; - /** Comment author URL. */ - readonly authorUrl: InputMaybe; - /** Array of comment IDs to include. */ - readonly commentIn: InputMaybe>>; - /** Array of IDs of users whose unapproved comments will be returned by the query regardless of status. */ - readonly commentNotIn: InputMaybe>>; - /** Include comments of a given type. */ - readonly commentType: InputMaybe; - /** Include comments from a given array of comment types. */ - readonly commentTypeIn: InputMaybe>>; - /** Exclude comments from a given array of comment types. */ - readonly commentTypeNotIn: InputMaybe; - /** Content object author ID to limit results by. */ - readonly contentAuthor: InputMaybe>>; - /** Array of author IDs to retrieve comments for. */ - readonly contentAuthorIn: InputMaybe>>; - /** Array of author IDs *not* to retrieve comments for. */ - readonly contentAuthorNotIn: InputMaybe>>; - /** Limit results to those affiliated with a given content object ID. */ - readonly contentId: InputMaybe; - /** Array of content object IDs to include affiliated comments for. */ - readonly contentIdIn: InputMaybe>>; - /** Array of content object IDs to exclude affiliated comments for. */ - readonly contentIdNotIn: InputMaybe>>; - /** Content object name to retrieve affiliated comments for. */ - readonly contentName: InputMaybe; - /** Content Object parent ID to retrieve affiliated comments for. */ - readonly contentParent: InputMaybe; - /** Array of content object statuses to retrieve affiliated comments for. Pass 'any' to match any value. */ - readonly contentStatus: InputMaybe>>; - /** Content object type or array of types to retrieve affiliated comments for. Pass 'any' to match any value. */ - readonly contentType: InputMaybe>>; - /** Array of IDs or email addresses of users whose unapproved comments will be returned by the query regardless of $status. Default empty */ - readonly includeUnapproved: InputMaybe>>; - /** Karma score to retrieve matching comments for. */ - readonly karma: InputMaybe; - /** The cardinality of the order of the connection */ - readonly order: InputMaybe; - /** Field to order the comments by. */ - readonly orderby: InputMaybe; - /** Parent ID of comment to retrieve children of. */ - readonly parent: InputMaybe; - /** Array of parent IDs of comments to retrieve children for. */ - readonly parentIn: InputMaybe>>; - /** Array of parent IDs of comments *not* to retrieve children for. */ - readonly parentNotIn: InputMaybe>>; - /** Search term(s) to retrieve matching comments for. */ - readonly search: InputMaybe; - /** Comment status to limit results by. */ - readonly status: InputMaybe; - /** Include comments for a specific user ID. */ - readonly userId: InputMaybe; -}; - -/** Connection between the page type and the page type */ -export type GQLPageToPreviewConnectionEdge = { - readonly __typename?: 'PageToPreviewConnectionEdge'; - /** The node of the connection, without the edges */ - readonly node: Maybe; -}; - -/** Connection between the page type and the page type */ -export type GQLPageToRevisionConnection = { - readonly __typename?: 'PageToRevisionConnection'; - /** Edges for the pageToRevisionConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLPageToRevisionConnectionEdge = { - readonly __typename?: 'PageToRevisionConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the pageToRevisionConnection connection */ -export type GQLPageToRevisionConnectionWhereArgs = { - /** The user that's connected as the author of the object. Use the userId for the author object. */ - readonly author: InputMaybe; - /** Find objects connected to author(s) in the array of author's userIds */ - readonly authorIn: InputMaybe>>; - /** Find objects connected to the author by the author's nicename */ - readonly authorName: InputMaybe; - /** Find objects NOT connected to author(s) in the array of author's userIds */ - readonly authorNotIn: InputMaybe>>; - /** Filter the connection based on dates */ - readonly dateQuery: InputMaybe; - /** True for objects with passwords; False for objects without passwords; null for all objects with or without passwords */ - readonly hasPassword: InputMaybe; - /** Specific ID of the object */ - readonly id: InputMaybe; - /** Array of IDs for the objects to retrieve */ - readonly in: InputMaybe>>; - /** Get objects with a specific mimeType property */ - readonly mimeType: InputMaybe; - /** Slug / post_name of the object */ - readonly name: InputMaybe; - /** Specify objects to retrieve. Use slugs */ - readonly nameIn: InputMaybe>>; - /** Specify IDs NOT to retrieve. If this is used in the same query as "in", it will be ignored */ - readonly notIn: InputMaybe>>; - /** What paramater to use to order the objects by. */ - readonly orderby: InputMaybe>>; - /** Use ID to return only children. Use 0 to return only top-level items */ - readonly parent: InputMaybe; - /** Specify objects whose parent is in an array */ - readonly parentIn: InputMaybe>>; - /** Specify posts whose parent is not in an array */ - readonly parentNotIn: InputMaybe>>; - /** Show posts with a specific password. */ - readonly password: InputMaybe; - /** Show Posts based on a keyword search */ - readonly search: InputMaybe; - /** Retrieve posts where post status is in an array. */ - readonly stati: InputMaybe>>; - /** Show posts with a specific status. */ - readonly status: InputMaybe; - /** Title of the object */ - readonly title: InputMaybe; -}; - -/** An plugin object */ -export type GQLPlugin = GQLNode & { - readonly __typename?: 'Plugin'; - /** Name of the plugin author(s), may also be a company name. */ - readonly author: Maybe; - /** URI for the related author(s)/company website. */ - readonly authorUri: Maybe; - /** Description of the plugin. */ - readonly description: Maybe; - /** The globally unique identifier of the plugin object. */ - readonly id: Scalars['ID']; - /** Whether the object is restricted from the current viewer */ - readonly isRestricted: Maybe; - /** Display name of the plugin. */ - readonly name: Maybe; - /** Plugin path. */ - readonly path: Maybe; - /** URI for the plugin website. This is useful for directing users for support requests etc. */ - readonly pluginUri: Maybe; - /** Current version of the plugin. */ - readonly version: Maybe; -}; - -/** The post type */ -export type GQLPost = GQLContentNode & GQLDatabaseIdentifier & GQLMenuItemLinkable & GQLNode & GQLNodeWithAuthor & GQLNodeWithComments & GQLNodeWithContentEditor & GQLNodeWithExcerpt & GQLNodeWithFeaturedImage & GQLNodeWithRevisions & GQLNodeWithTemplate & GQLNodeWithTitle & GQLNodeWithTrackbacks & GQLUniformResourceIdentifiable & { - readonly __typename?: 'Post'; - /** Connection between the NodeWithAuthor type and the User type */ - readonly author: Maybe; - /** The database identifier of the author of the node */ - readonly authorDatabaseId: Maybe; - /** The globally unique identifier of the author of the node */ - readonly authorId: Maybe; - /** Connection between the post type and the category type */ - readonly categories: Maybe; - /** The number of comments. Even though WPGraphQL denotes this field as an integer, in WordPress this field should be saved as a numeric string for compatibility. */ - readonly commentCount: Maybe; - /** Whether the comments are open or closed for this particular post. */ - readonly commentStatus: Maybe; - /** Connection between the post type and the Comment type */ - readonly comments: Maybe; - /** The content of the post. */ - readonly content: Maybe; - /** Connection between the ContentNode type and the ContentType type */ - readonly contentType: Maybe; - /** The name of the Content Type the node belongs to */ - readonly contentTypeName: Scalars['String']; - /** The unique resource identifier path */ - readonly databaseId: Scalars['Int']; - /** Post publishing date. */ - readonly date: Maybe; - /** The publishing date set in GMT. */ - readonly dateGmt: Maybe; - /** The desired slug of the post */ - readonly desiredSlug: Maybe; - /** If a user has edited the node within the past 15 seconds, this will return the user that last edited. Null if the edit lock doesn't exist or is greater than 15 seconds */ - readonly editingLockedBy: Maybe; - /** The RSS enclosure for the object */ - readonly enclosure: Maybe; - /** Connection between the ContentNode type and the EnqueuedScript type */ - readonly enqueuedScripts: Maybe; - /** Connection between the ContentNode type and the EnqueuedStylesheet type */ - readonly enqueuedStylesheets: Maybe; - /** The excerpt of the post. */ - readonly excerpt: Maybe; - /** Connection between the NodeWithFeaturedImage type and the MediaItem type */ - readonly featuredImage: Maybe; - /** The database identifier for the featured image node assigned to the content node */ - readonly featuredImageDatabaseId: Maybe; - /** Globally unique ID of the featured image assigned to the node */ - readonly featuredImageId: Maybe; - /** The global unique identifier for this post. This currently matches the value stored in WP_Post->guid and the guid column in the "post_objects" database table. */ - readonly guid: Maybe; - /** The globally unique identifier of the post object. */ - readonly id: Scalars['ID']; - /** Whether the node is a Content Node */ - readonly isContentNode: Scalars['Boolean']; - /** Whether the object is a node in the preview state */ - readonly isPreview: Maybe; - /** Whether the object is restricted from the current viewer */ - readonly isRestricted: Maybe; - /** True if the node is a revision of another node */ - readonly isRevision: Maybe; - /** Whether this page is sticky */ - readonly isSticky: Scalars['Boolean']; - /** Whether the node is a Term */ - readonly isTermNode: Scalars['Boolean']; - /** The user that most recently edited the node */ - readonly lastEditedBy: Maybe; - /** The permalink of the post */ - readonly link: Maybe; - /** The local modified time for a post. If a post was recently updated the modified field will change to match the corresponding time. */ - readonly modified: Maybe; - /** The GMT modified time for a post. If a post was recently updated the modified field will change to match the corresponding time in GMT. */ - readonly modifiedGmt: Maybe; - /** Whether the pings are open or closed for this particular post. */ - readonly pingStatus: Maybe; - /** URLs that have been pinged. */ - readonly pinged: Maybe>>; - /** Added to the GraphQL Schema because the ACF Field Group "Post" was set to Show in GraphQL. */ - readonly post: Maybe; - /** Connection between the post type and the postFormat type */ - readonly postFormats: Maybe; - /** - * The id field matches the WP_Post->ID field. - * @deprecated Deprecated in favor of the databaseId field - */ - readonly postId: Scalars['Int']; - /** Connection between the post type and the post type */ - readonly preview: Maybe; - /** The database id of the preview node */ - readonly previewRevisionDatabaseId: Maybe; - /** Whether the object is a node in the preview state */ - readonly previewRevisionId: Maybe; - /** If the current node is a revision, this field exposes the node this is a revision of. Returns null if the node is not a revision of another node. */ - readonly revisionOf: Maybe; - /** Connection between the post type and the post type */ - readonly revisions: Maybe; - /** The uri slug for the post. This is equivalent to the WP_Post->post_name field and the post_name column in the database for the "post_objects" table. */ - readonly slug: Maybe; - /** The current status of the object */ - readonly status: Maybe; - /** Connection between the post type and the tag type */ - readonly tags: Maybe; - /** The template assigned to a node of content */ - readonly template: Maybe; - /** Connection between the post type and the TermNode type */ - readonly terms: Maybe; - /** The title of the post. This is currently just the raw title. An amendment to support rendered title needs to be made. */ - readonly title: Maybe; - /** URLs queued to be pinged. */ - readonly toPing: Maybe>>; - /** The unique resource identifier path */ - readonly uri: Maybe; -}; - - -/** The post type */ -export type GQLPostCategoriesArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The post type */ -export type GQLPostCommentsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The post type */ -export type GQLPostContentArgs = { - format: InputMaybe; -}; - - -/** The post type */ -export type GQLPostEnqueuedScriptsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - - -/** The post type */ -export type GQLPostEnqueuedStylesheetsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - - -/** The post type */ -export type GQLPostExcerptArgs = { - format: InputMaybe; -}; - - -/** The post type */ -export type GQLPostPostFormatsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The post type */ -export type GQLPostRevisionsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The post type */ -export type GQLPostTagsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The post type */ -export type GQLPostTermsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The post type */ -export type GQLPostTitleArgs = { - format: InputMaybe; -}; - -/** Set relationships between the post to categories */ -export type GQLPostCategoriesInput = { - /** If true, this will append the category to existing related categories. If false, this will replace existing relationships. Default true. */ - readonly append: InputMaybe; - /** The input list of items to set. */ - readonly nodes: InputMaybe>>; -}; - -/** List of categories to connect the post to. If an ID is set, it will be used to create the connection. If not, it will look for a slug. If neither are valid existing terms, and the site is configured to allow terms to be created during post mutations, a term will be created using the Name if it exists in the input, then fallback to the slug if it exists. */ -export type GQLPostCategoriesNodeInput = { - /** The description of the category. This field is used to set a description of the category if a new one is created during the mutation. */ - readonly description: InputMaybe; - /** The ID of the category. If present, this will be used to connect to the post. If no existing category exists with this ID, no connection will be made. */ - readonly id: InputMaybe; - /** The name of the category. This field is used to create a new term, if term creation is enabled in nested mutations, and if one does not already exist with the provided slug or ID or if a slug or ID is not provided. If no name is included and a term is created, the creation will fallback to the slug field. */ - readonly name: InputMaybe; - /** The slug of the category. If no ID is present, this field will be used to make a connection. If no existing term exists with this slug, this field will be used as a fallback to the Name field when creating a new term to connect to, if term creation is enabled as a nested mutation. */ - readonly slug: InputMaybe; -}; - -/** The postFormat type */ -export type GQLPostFormat = GQLDatabaseIdentifier & GQLNode & GQLTermNode & GQLUniformResourceIdentifiable & { - readonly __typename?: 'PostFormat'; - /** Connection between the postFormat type and the ContentNode type */ - readonly contentNodes: Maybe; - /** The number of objects connected to the object */ - readonly count: Maybe; - /** The unique identifier stored in the database */ - readonly databaseId: Scalars['Int']; - /** The description of the object */ - readonly description: Maybe; - /** Connection between the TermNode type and the EnqueuedScript type */ - readonly enqueuedScripts: Maybe; - /** Connection between the TermNode type and the EnqueuedStylesheet type */ - readonly enqueuedStylesheets: Maybe; - /** The unique resource identifier path */ - readonly id: Scalars['ID']; - /** Whether the node is a Content Node */ - readonly isContentNode: Scalars['Boolean']; - /** Whether the object is restricted from the current viewer */ - readonly isRestricted: Maybe; - /** Whether the node is a Term */ - readonly isTermNode: Scalars['Boolean']; - /** The link to the term */ - readonly link: Maybe; - /** The human friendly name of the object. */ - readonly name: Maybe; - /** - * The id field matches the WP_Post->ID field. - * @deprecated Deprecated in favor of databaseId - */ - readonly postFormatId: Maybe; - /** Connection between the postFormat type and the post type */ - readonly posts: Maybe; - /** An alphanumeric identifier for the object unique to its type. */ - readonly slug: Maybe; - /** Connection between the postFormat type and the Taxonomy type */ - readonly taxonomy: Maybe; - /** The name of the taxonomy that the object is associated with */ - readonly taxonomyName: Maybe; - /** The ID of the term group that this term object belongs to */ - readonly termGroupId: Maybe; - /** The taxonomy ID that the object is associated with */ - readonly termTaxonomyId: Maybe; - /** The unique resource identifier path */ - readonly uri: Maybe; -}; - - -/** The postFormat type */ -export type GQLPostFormatContentNodesArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The postFormat type */ -export type GQLPostFormatEnqueuedScriptsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - - -/** The postFormat type */ -export type GQLPostFormatEnqueuedStylesheetsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - - -/** The postFormat type */ -export type GQLPostFormatPostsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - -/** The Type of Identifier used to fetch a single resource. Default is ID. */ -export enum GQLPostFormatIdType { - /** The Database ID for the node */ - DatabaseId = 'DATABASE_ID', - /** The hashed Global ID */ - Id = 'ID', - /** The name of the node */ - Name = 'NAME', - /** Url friendly name of the node */ - Slug = 'SLUG', - /** The URI for the node */ - Uri = 'URI' -} - -/** Connection between the postFormat type and the ContentNode type */ -export type GQLPostFormatToContentNodeConnection = { - readonly __typename?: 'PostFormatToContentNodeConnection'; - /** Edges for the PostFormatToContentNodeConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLPostFormatToContentNodeConnectionEdge = { - readonly __typename?: 'PostFormatToContentNodeConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the PostFormatToContentNodeConnection connection */ -export type GQLPostFormatToContentNodeConnectionWhereArgs = { - /** The Types of content to filter */ - readonly contentTypes: InputMaybe>>; - /** Filter the connection based on dates */ - readonly dateQuery: InputMaybe; - /** True for objects with passwords; False for objects without passwords; null for all objects with or without passwords */ - readonly hasPassword: InputMaybe; - /** Specific ID of the object */ - readonly id: InputMaybe; - /** Array of IDs for the objects to retrieve */ - readonly in: InputMaybe>>; - /** Get objects with a specific mimeType property */ - readonly mimeType: InputMaybe; - /** Slug / post_name of the object */ - readonly name: InputMaybe; - /** Specify objects to retrieve. Use slugs */ - readonly nameIn: InputMaybe>>; - /** Specify IDs NOT to retrieve. If this is used in the same query as "in", it will be ignored */ - readonly notIn: InputMaybe>>; - /** What paramater to use to order the objects by. */ - readonly orderby: InputMaybe>>; - /** Use ID to return only children. Use 0 to return only top-level items */ - readonly parent: InputMaybe; - /** Specify objects whose parent is in an array */ - readonly parentIn: InputMaybe>>; - /** Specify posts whose parent is not in an array */ - readonly parentNotIn: InputMaybe>>; - /** Show posts with a specific password. */ - readonly password: InputMaybe; - /** Show Posts based on a keyword search */ - readonly search: InputMaybe; - /** Retrieve posts where post status is in an array. */ - readonly stati: InputMaybe>>; - /** Show posts with a specific status. */ - readonly status: InputMaybe; - /** Title of the object */ - readonly title: InputMaybe; -}; - -/** Connection between the postFormat type and the post type */ -export type GQLPostFormatToPostConnection = { - readonly __typename?: 'PostFormatToPostConnection'; - /** Edges for the PostFormatToPostConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLPostFormatToPostConnectionEdge = { - readonly __typename?: 'PostFormatToPostConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the PostFormatToPostConnection connection */ -export type GQLPostFormatToPostConnectionWhereArgs = { - /** The user that's connected as the author of the object. Use the userId for the author object. */ - readonly author: InputMaybe; - /** Find objects connected to author(s) in the array of author's userIds */ - readonly authorIn: InputMaybe>>; - /** Find objects connected to the author by the author's nicename */ - readonly authorName: InputMaybe; - /** Find objects NOT connected to author(s) in the array of author's userIds */ - readonly authorNotIn: InputMaybe>>; - /** Category ID */ - readonly categoryId: InputMaybe; - /** Array of category IDs, used to display objects from one category OR another */ - readonly categoryIn: InputMaybe>>; - /** Use Category Slug */ - readonly categoryName: InputMaybe; - /** Array of category IDs, used to display objects from one category OR another */ - readonly categoryNotIn: InputMaybe>>; - /** Filter the connection based on dates */ - readonly dateQuery: InputMaybe; - /** True for objects with passwords; False for objects without passwords; null for all objects with or without passwords */ - readonly hasPassword: InputMaybe; - /** Specific ID of the object */ - readonly id: InputMaybe; - /** Array of IDs for the objects to retrieve */ - readonly in: InputMaybe>>; - /** Get objects with a specific mimeType property */ - readonly mimeType: InputMaybe; - /** Slug / post_name of the object */ - readonly name: InputMaybe; - /** Specify objects to retrieve. Use slugs */ - readonly nameIn: InputMaybe>>; - /** Specify IDs NOT to retrieve. If this is used in the same query as "in", it will be ignored */ - readonly notIn: InputMaybe>>; - /** What paramater to use to order the objects by. */ - readonly orderby: InputMaybe>>; - /** Use ID to return only children. Use 0 to return only top-level items */ - readonly parent: InputMaybe; - /** Specify objects whose parent is in an array */ - readonly parentIn: InputMaybe>>; - /** Specify posts whose parent is not in an array */ - readonly parentNotIn: InputMaybe>>; - /** Show posts with a specific password. */ - readonly password: InputMaybe; - /** Show Posts based on a keyword search */ - readonly search: InputMaybe; - /** Retrieve posts where post status is in an array. */ - readonly stati: InputMaybe>>; - /** Show posts with a specific status. */ - readonly status: InputMaybe; - /** Tag Slug */ - readonly tag: InputMaybe; - /** Use Tag ID */ - readonly tagId: InputMaybe; - /** Array of tag IDs, used to display objects from one tag OR another */ - readonly tagIn: InputMaybe>>; - /** Array of tag IDs, used to display objects from one tag OR another */ - readonly tagNotIn: InputMaybe>>; - /** Array of tag slugs, used to display objects from one tag OR another */ - readonly tagSlugAnd: InputMaybe>>; - /** Array of tag slugs, used to exclude objects in specified tags */ - readonly tagSlugIn: InputMaybe>>; - /** Title of the object */ - readonly title: InputMaybe; -}; - -/** Connection between the postFormat type and the Taxonomy type */ -export type GQLPostFormatToTaxonomyConnectionEdge = { - readonly __typename?: 'PostFormatToTaxonomyConnectionEdge'; - /** The node of the connection, without the edges */ - readonly node: Maybe; -}; - -/** The Type of Identifier used to fetch a single resource. Default is ID. */ -export enum GQLPostIdType { - /** Identify a resource by the Database ID. */ - DatabaseId = 'DATABASE_ID', - /** Identify a resource by the (hashed) Global ID. */ - Id = 'ID', - /** Identify a resource by the slug. Available to non-hierarchcial Types where the slug is a unique identifier. */ - Slug = 'SLUG', - /** Identify a resource by the URI. */ - Uri = 'URI' -} - -/** The format of post field data. */ -export enum GQLPostObjectFieldFormatEnum { - /** Provide the field value directly from database */ - Raw = 'RAW', - /** Apply the default WordPress rendering */ - Rendered = 'RENDERED' -} - -/** The column to use when filtering by date */ -export enum GQLPostObjectsConnectionDateColumnEnum { - /** The date the comment was created in local time. */ - Date = 'DATE', - /** The most recent modification date of the comment. */ - Modified = 'MODIFIED' -} - -/** Field to order the connection by */ -export enum GQLPostObjectsConnectionOrderbyEnum { - /** Order by author */ - Author = 'AUTHOR', - /** Order by the number of comments it has acquired */ - CommentCount = 'COMMENT_COUNT', - /** Order by publish date */ - Date = 'DATE', - /** Preserve the ID order given in the IN array */ - In = 'IN', - /** Order by the menu order value */ - MenuOrder = 'MENU_ORDER', - /** Order by last modified date */ - Modified = 'MODIFIED', - /** Preserve slug order given in the NAME_IN array */ - NameIn = 'NAME_IN', - /** Order by parent ID */ - Parent = 'PARENT', - /** Order by slug */ - Slug = 'SLUG', - /** Order by title */ - Title = 'TITLE' -} - -/** Options for ordering the connection */ -export type GQLPostObjectsConnectionOrderbyInput = { - /** The field to order the connection by */ - readonly field: GQLPostObjectsConnectionOrderbyEnum; - /** Possible directions in which to order a list of items */ - readonly order: GQLOrderEnum; -}; - -/** Set relationships between the post to postFormats */ -export type GQLPostPostFormatsInput = { - /** If true, this will append the postFormat to existing related postFormats. If false, this will replace existing relationships. Default true. */ - readonly append: InputMaybe; - /** The input list of items to set. */ - readonly nodes: InputMaybe>>; -}; - -/** List of postFormats to connect the post to. If an ID is set, it will be used to create the connection. If not, it will look for a slug. If neither are valid existing terms, and the site is configured to allow terms to be created during post mutations, a term will be created using the Name if it exists in the input, then fallback to the slug if it exists. */ -export type GQLPostPostFormatsNodeInput = { - /** The description of the postFormat. This field is used to set a description of the postFormat if a new one is created during the mutation. */ - readonly description: InputMaybe; - /** The ID of the postFormat. If present, this will be used to connect to the post. If no existing postFormat exists with this ID, no connection will be made. */ - readonly id: InputMaybe; - /** The name of the postFormat. This field is used to create a new term, if term creation is enabled in nested mutations, and if one does not already exist with the provided slug or ID or if a slug or ID is not provided. If no name is included and a term is created, the creation will fallback to the slug field. */ - readonly name: InputMaybe; - /** The slug of the postFormat. If no ID is present, this field will be used to make a connection. If no existing term exists with this slug, this field will be used as a fallback to the Name field when creating a new term to connect to, if term creation is enabled as a nested mutation. */ - readonly slug: InputMaybe; -}; - -/** The status of the object. */ -export enum GQLPostStatusEnum { - /** Objects with the acf-disabled status */ - AcfDisabled = 'ACF_DISABLED', - /** Objects with the auto-draft status */ - AutoDraft = 'AUTO_DRAFT', - /** Objects with the draft status */ - Draft = 'DRAFT', - /** Objects with the future status */ - Future = 'FUTURE', - /** Objects with the inherit status */ - Inherit = 'INHERIT', - /** Objects with the pending status */ - Pending = 'PENDING', - /** Objects with the private status */ - Private = 'PRIVATE', - /** Objects with the publish status */ - Publish = 'PUBLISH', - /** Objects with the request-completed status */ - RequestCompleted = 'REQUEST_COMPLETED', - /** Objects with the request-confirmed status */ - RequestConfirmed = 'REQUEST_CONFIRMED', - /** Objects with the request-failed status */ - RequestFailed = 'REQUEST_FAILED', - /** Objects with the request-pending status */ - RequestPending = 'REQUEST_PENDING', - /** Objects with the trash status */ - Trash = 'TRASH' -} - -/** Set relationships between the post to tags */ -export type GQLPostTagsInput = { - /** If true, this will append the tag to existing related tags. If false, this will replace existing relationships. Default true. */ - readonly append: InputMaybe; - /** The input list of items to set. */ - readonly nodes: InputMaybe>>; -}; - -/** List of tags to connect the post to. If an ID is set, it will be used to create the connection. If not, it will look for a slug. If neither are valid existing terms, and the site is configured to allow terms to be created during post mutations, a term will be created using the Name if it exists in the input, then fallback to the slug if it exists. */ -export type GQLPostTagsNodeInput = { - /** The description of the tag. This field is used to set a description of the tag if a new one is created during the mutation. */ - readonly description: InputMaybe; - /** The ID of the tag. If present, this will be used to connect to the post. If no existing tag exists with this ID, no connection will be made. */ - readonly id: InputMaybe; - /** The name of the tag. This field is used to create a new term, if term creation is enabled in nested mutations, and if one does not already exist with the provided slug or ID or if a slug or ID is not provided. If no name is included and a term is created, the creation will fallback to the slug field. */ - readonly name: InputMaybe; - /** The slug of the tag. If no ID is present, this field will be used to make a connection. If no existing term exists with this slug, this field will be used as a fallback to the Name field when creating a new term to connect to, if term creation is enabled as a nested mutation. */ - readonly slug: InputMaybe; -}; - -/** Connection between the post type and the category type */ -export type GQLPostToCategoryConnection = { - readonly __typename?: 'PostToCategoryConnection'; - /** Edges for the PostToCategoryConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLPostToCategoryConnectionEdge = { - readonly __typename?: 'PostToCategoryConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the PostToCategoryConnection connection */ -export type GQLPostToCategoryConnectionWhereArgs = { - /** Unique cache key to be produced when this query is stored in an object cache. Default is 'core'. */ - readonly cacheDomain: InputMaybe; - /** Term ID to retrieve child terms of. If multiple taxonomies are passed, $child_of is ignored. Default 0. */ - readonly childOf: InputMaybe; - /** True to limit results to terms that have no children. This parameter has no effect on non-hierarchical taxonomies. Default false. */ - readonly childless: InputMaybe; - /** Retrieve terms where the description is LIKE the input value. Default empty. */ - readonly descriptionLike: InputMaybe; - /** Array of term ids to exclude. If $include is non-empty, $exclude is ignored. Default empty array. */ - readonly exclude: InputMaybe>>; - /** Array of term ids to exclude along with all of their descendant terms. If $include is non-empty, $exclude_tree is ignored. Default empty array. */ - readonly excludeTree: InputMaybe>>; - /** Whether to hide terms not assigned to any posts. Accepts true or false. Default false */ - readonly hideEmpty: InputMaybe; - /** Whether to include terms that have non-empty descendants (even if $hide_empty is set to true). Default true. */ - readonly hierarchical: InputMaybe; - /** Array of term ids to include. Default empty array. */ - readonly include: InputMaybe>>; - /** Array of names to return term(s) for. Default empty. */ - readonly name: InputMaybe>>; - /** Retrieve terms where the name is LIKE the input value. Default empty. */ - readonly nameLike: InputMaybe; - /** Array of object IDs. Results will be limited to terms associated with these objects. */ - readonly objectIds: InputMaybe>>; - /** Direction the connection should be ordered in */ - readonly order: InputMaybe; - /** Field(s) to order terms by. Defaults to 'name'. */ - readonly orderby: InputMaybe; - /** Whether to pad the quantity of a term's children in the quantity of each term's "count" object variable. Default false. */ - readonly padCounts: InputMaybe; - /** Parent term ID to retrieve direct-child terms of. Default empty. */ - readonly parent: InputMaybe; - /** Search criteria to match terms. Will be SQL-formatted with wildcards before and after. Default empty. */ - readonly search: InputMaybe; - /** Array of slugs to return term(s) for. Default empty. */ - readonly slug: InputMaybe>>; - /** Array of term taxonomy IDs, to match when querying terms. */ - readonly termTaxonomId: InputMaybe>>; - /** Whether to prime meta caches for matched terms. Default true. */ - readonly updateTermMetaCache: InputMaybe; -}; - -/** Connection between the post type and the Comment type */ -export type GQLPostToCommentConnection = { - readonly __typename?: 'PostToCommentConnection'; - /** Edges for the PostToCommentConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLPostToCommentConnectionEdge = { - readonly __typename?: 'PostToCommentConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the PostToCommentConnection connection */ -export type GQLPostToCommentConnectionWhereArgs = { - /** Comment author email address. */ - readonly authorEmail: InputMaybe; - /** Array of author IDs to include comments for. */ - readonly authorIn: InputMaybe>>; - /** Array of author IDs to exclude comments for. */ - readonly authorNotIn: InputMaybe>>; - /** Comment author URL. */ - readonly authorUrl: InputMaybe; - /** Array of comment IDs to include. */ - readonly commentIn: InputMaybe>>; - /** Array of IDs of users whose unapproved comments will be returned by the query regardless of status. */ - readonly commentNotIn: InputMaybe>>; - /** Include comments of a given type. */ - readonly commentType: InputMaybe; - /** Include comments from a given array of comment types. */ - readonly commentTypeIn: InputMaybe>>; - /** Exclude comments from a given array of comment types. */ - readonly commentTypeNotIn: InputMaybe; - /** Content object author ID to limit results by. */ - readonly contentAuthor: InputMaybe>>; - /** Array of author IDs to retrieve comments for. */ - readonly contentAuthorIn: InputMaybe>>; - /** Array of author IDs *not* to retrieve comments for. */ - readonly contentAuthorNotIn: InputMaybe>>; - /** Limit results to those affiliated with a given content object ID. */ - readonly contentId: InputMaybe; - /** Array of content object IDs to include affiliated comments for. */ - readonly contentIdIn: InputMaybe>>; - /** Array of content object IDs to exclude affiliated comments for. */ - readonly contentIdNotIn: InputMaybe>>; - /** Content object name to retrieve affiliated comments for. */ - readonly contentName: InputMaybe; - /** Content Object parent ID to retrieve affiliated comments for. */ - readonly contentParent: InputMaybe; - /** Array of content object statuses to retrieve affiliated comments for. Pass 'any' to match any value. */ - readonly contentStatus: InputMaybe>>; - /** Content object type or array of types to retrieve affiliated comments for. Pass 'any' to match any value. */ - readonly contentType: InputMaybe>>; - /** Array of IDs or email addresses of users whose unapproved comments will be returned by the query regardless of $status. Default empty */ - readonly includeUnapproved: InputMaybe>>; - /** Karma score to retrieve matching comments for. */ - readonly karma: InputMaybe; - /** The cardinality of the order of the connection */ - readonly order: InputMaybe; - /** Field to order the comments by. */ - readonly orderby: InputMaybe; - /** Parent ID of comment to retrieve children of. */ - readonly parent: InputMaybe; - /** Array of parent IDs of comments to retrieve children for. */ - readonly parentIn: InputMaybe>>; - /** Array of parent IDs of comments *not* to retrieve children for. */ - readonly parentNotIn: InputMaybe>>; - /** Search term(s) to retrieve matching comments for. */ - readonly search: InputMaybe; - /** Comment status to limit results by. */ - readonly status: InputMaybe; - /** Include comments for a specific user ID. */ - readonly userId: InputMaybe; -}; - -/** Connection between the post type and the postFormat type */ -export type GQLPostToPostFormatConnection = { - readonly __typename?: 'PostToPostFormatConnection'; - /** Edges for the PostToPostFormatConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLPostToPostFormatConnectionEdge = { - readonly __typename?: 'PostToPostFormatConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the PostToPostFormatConnection connection */ -export type GQLPostToPostFormatConnectionWhereArgs = { - /** Unique cache key to be produced when this query is stored in an object cache. Default is 'core'. */ - readonly cacheDomain: InputMaybe; - /** Term ID to retrieve child terms of. If multiple taxonomies are passed, $child_of is ignored. Default 0. */ - readonly childOf: InputMaybe; - /** True to limit results to terms that have no children. This parameter has no effect on non-hierarchical taxonomies. Default false. */ - readonly childless: InputMaybe; - /** Retrieve terms where the description is LIKE the input value. Default empty. */ - readonly descriptionLike: InputMaybe; - /** Array of term ids to exclude. If $include is non-empty, $exclude is ignored. Default empty array. */ - readonly exclude: InputMaybe>>; - /** Array of term ids to exclude along with all of their descendant terms. If $include is non-empty, $exclude_tree is ignored. Default empty array. */ - readonly excludeTree: InputMaybe>>; - /** Whether to hide terms not assigned to any posts. Accepts true or false. Default false */ - readonly hideEmpty: InputMaybe; - /** Whether to include terms that have non-empty descendants (even if $hide_empty is set to true). Default true. */ - readonly hierarchical: InputMaybe; - /** Array of term ids to include. Default empty array. */ - readonly include: InputMaybe>>; - /** Array of names to return term(s) for. Default empty. */ - readonly name: InputMaybe>>; - /** Retrieve terms where the name is LIKE the input value. Default empty. */ - readonly nameLike: InputMaybe; - /** Array of object IDs. Results will be limited to terms associated with these objects. */ - readonly objectIds: InputMaybe>>; - /** Direction the connection should be ordered in */ - readonly order: InputMaybe; - /** Field(s) to order terms by. Defaults to 'name'. */ - readonly orderby: InputMaybe; - /** Whether to pad the quantity of a term's children in the quantity of each term's "count" object variable. Default false. */ - readonly padCounts: InputMaybe; - /** Parent term ID to retrieve direct-child terms of. Default empty. */ - readonly parent: InputMaybe; - /** Search criteria to match terms. Will be SQL-formatted with wildcards before and after. Default empty. */ - readonly search: InputMaybe; - /** Array of slugs to return term(s) for. Default empty. */ - readonly slug: InputMaybe>>; - /** Array of term taxonomy IDs, to match when querying terms. */ - readonly termTaxonomId: InputMaybe>>; - /** Whether to prime meta caches for matched terms. Default true. */ - readonly updateTermMetaCache: InputMaybe; -}; - -/** Connection between the post type and the post type */ -export type GQLPostToPreviewConnectionEdge = { - readonly __typename?: 'PostToPreviewConnectionEdge'; - /** The node of the connection, without the edges */ - readonly node: Maybe; -}; - -/** Connection between the post type and the post type */ -export type GQLPostToRevisionConnection = { - readonly __typename?: 'PostToRevisionConnection'; - /** Edges for the postToRevisionConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLPostToRevisionConnectionEdge = { - readonly __typename?: 'PostToRevisionConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the postToRevisionConnection connection */ -export type GQLPostToRevisionConnectionWhereArgs = { - /** The user that's connected as the author of the object. Use the userId for the author object. */ - readonly author: InputMaybe; - /** Find objects connected to author(s) in the array of author's userIds */ - readonly authorIn: InputMaybe>>; - /** Find objects connected to the author by the author's nicename */ - readonly authorName: InputMaybe; - /** Find objects NOT connected to author(s) in the array of author's userIds */ - readonly authorNotIn: InputMaybe>>; - /** Category ID */ - readonly categoryId: InputMaybe; - /** Array of category IDs, used to display objects from one category OR another */ - readonly categoryIn: InputMaybe>>; - /** Use Category Slug */ - readonly categoryName: InputMaybe; - /** Array of category IDs, used to display objects from one category OR another */ - readonly categoryNotIn: InputMaybe>>; - /** Filter the connection based on dates */ - readonly dateQuery: InputMaybe; - /** True for objects with passwords; False for objects without passwords; null for all objects with or without passwords */ - readonly hasPassword: InputMaybe; - /** Specific ID of the object */ - readonly id: InputMaybe; - /** Array of IDs for the objects to retrieve */ - readonly in: InputMaybe>>; - /** Get objects with a specific mimeType property */ - readonly mimeType: InputMaybe; - /** Slug / post_name of the object */ - readonly name: InputMaybe; - /** Specify objects to retrieve. Use slugs */ - readonly nameIn: InputMaybe>>; - /** Specify IDs NOT to retrieve. If this is used in the same query as "in", it will be ignored */ - readonly notIn: InputMaybe>>; - /** What paramater to use to order the objects by. */ - readonly orderby: InputMaybe>>; - /** Use ID to return only children. Use 0 to return only top-level items */ - readonly parent: InputMaybe; - /** Specify objects whose parent is in an array */ - readonly parentIn: InputMaybe>>; - /** Specify posts whose parent is not in an array */ - readonly parentNotIn: InputMaybe>>; - /** Show posts with a specific password. */ - readonly password: InputMaybe; - /** Show Posts based on a keyword search */ - readonly search: InputMaybe; - /** Retrieve posts where post status is in an array. */ - readonly stati: InputMaybe>>; - /** Show posts with a specific status. */ - readonly status: InputMaybe; - /** Tag Slug */ - readonly tag: InputMaybe; - /** Use Tag ID */ - readonly tagId: InputMaybe; - /** Array of tag IDs, used to display objects from one tag OR another */ - readonly tagIn: InputMaybe>>; - /** Array of tag IDs, used to display objects from one tag OR another */ - readonly tagNotIn: InputMaybe>>; - /** Array of tag slugs, used to display objects from one tag OR another */ - readonly tagSlugAnd: InputMaybe>>; - /** Array of tag slugs, used to exclude objects in specified tags */ - readonly tagSlugIn: InputMaybe>>; - /** Title of the object */ - readonly title: InputMaybe; -}; - -/** Connection between the post type and the tag type */ -export type GQLPostToTagConnection = { - readonly __typename?: 'PostToTagConnection'; - /** Edges for the PostToTagConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLPostToTagConnectionEdge = { - readonly __typename?: 'PostToTagConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the PostToTagConnection connection */ -export type GQLPostToTagConnectionWhereArgs = { - /** Unique cache key to be produced when this query is stored in an object cache. Default is 'core'. */ - readonly cacheDomain: InputMaybe; - /** Term ID to retrieve child terms of. If multiple taxonomies are passed, $child_of is ignored. Default 0. */ - readonly childOf: InputMaybe; - /** True to limit results to terms that have no children. This parameter has no effect on non-hierarchical taxonomies. Default false. */ - readonly childless: InputMaybe; - /** Retrieve terms where the description is LIKE the input value. Default empty. */ - readonly descriptionLike: InputMaybe; - /** Array of term ids to exclude. If $include is non-empty, $exclude is ignored. Default empty array. */ - readonly exclude: InputMaybe>>; - /** Array of term ids to exclude along with all of their descendant terms. If $include is non-empty, $exclude_tree is ignored. Default empty array. */ - readonly excludeTree: InputMaybe>>; - /** Whether to hide terms not assigned to any posts. Accepts true or false. Default false */ - readonly hideEmpty: InputMaybe; - /** Whether to include terms that have non-empty descendants (even if $hide_empty is set to true). Default true. */ - readonly hierarchical: InputMaybe; - /** Array of term ids to include. Default empty array. */ - readonly include: InputMaybe>>; - /** Array of names to return term(s) for. Default empty. */ - readonly name: InputMaybe>>; - /** Retrieve terms where the name is LIKE the input value. Default empty. */ - readonly nameLike: InputMaybe; - /** Array of object IDs. Results will be limited to terms associated with these objects. */ - readonly objectIds: InputMaybe>>; - /** Direction the connection should be ordered in */ - readonly order: InputMaybe; - /** Field(s) to order terms by. Defaults to 'name'. */ - readonly orderby: InputMaybe; - /** Whether to pad the quantity of a term's children in the quantity of each term's "count" object variable. Default false. */ - readonly padCounts: InputMaybe; - /** Parent term ID to retrieve direct-child terms of. Default empty. */ - readonly parent: InputMaybe; - /** Search criteria to match terms. Will be SQL-formatted with wildcards before and after. Default empty. */ - readonly search: InputMaybe; - /** Array of slugs to return term(s) for. Default empty. */ - readonly slug: InputMaybe>>; - /** Array of term taxonomy IDs, to match when querying terms. */ - readonly termTaxonomId: InputMaybe>>; - /** Whether to prime meta caches for matched terms. Default true. */ - readonly updateTermMetaCache: InputMaybe; -}; - -/** Connection between the post type and the TermNode type */ -export type GQLPostToTermNodeConnection = { - readonly __typename?: 'PostToTermNodeConnection'; - /** Edges for the PostToTermNodeConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLPostToTermNodeConnectionEdge = { - readonly __typename?: 'PostToTermNodeConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the PostToTermNodeConnection connection */ -export type GQLPostToTermNodeConnectionWhereArgs = { - /** Unique cache key to be produced when this query is stored in an object cache. Default is 'core'. */ - readonly cacheDomain: InputMaybe; - /** Term ID to retrieve child terms of. If multiple taxonomies are passed, $child_of is ignored. Default 0. */ - readonly childOf: InputMaybe; - /** True to limit results to terms that have no children. This parameter has no effect on non-hierarchical taxonomies. Default false. */ - readonly childless: InputMaybe; - /** Retrieve terms where the description is LIKE the input value. Default empty. */ - readonly descriptionLike: InputMaybe; - /** Array of term ids to exclude. If $include is non-empty, $exclude is ignored. Default empty array. */ - readonly exclude: InputMaybe>>; - /** Array of term ids to exclude along with all of their descendant terms. If $include is non-empty, $exclude_tree is ignored. Default empty array. */ - readonly excludeTree: InputMaybe>>; - /** Whether to hide terms not assigned to any posts. Accepts true or false. Default false */ - readonly hideEmpty: InputMaybe; - /** Whether to include terms that have non-empty descendants (even if $hide_empty is set to true). Default true. */ - readonly hierarchical: InputMaybe; - /** Array of term ids to include. Default empty array. */ - readonly include: InputMaybe>>; - /** Array of names to return term(s) for. Default empty. */ - readonly name: InputMaybe>>; - /** Retrieve terms where the name is LIKE the input value. Default empty. */ - readonly nameLike: InputMaybe; - /** Array of object IDs. Results will be limited to terms associated with these objects. */ - readonly objectIds: InputMaybe>>; - /** Direction the connection should be ordered in */ - readonly order: InputMaybe; - /** Field(s) to order terms by. Defaults to 'name'. */ - readonly orderby: InputMaybe; - /** Whether to pad the quantity of a term's children in the quantity of each term's "count" object variable. Default false. */ - readonly padCounts: InputMaybe; - /** Parent term ID to retrieve direct-child terms of. Default empty. */ - readonly parent: InputMaybe; - /** Search criteria to match terms. Will be SQL-formatted with wildcards before and after. Default empty. */ - readonly search: InputMaybe; - /** Array of slugs to return term(s) for. Default empty. */ - readonly slug: InputMaybe>>; - /** The Taxonomy to filter terms by */ - readonly taxonomies: InputMaybe>>; - /** Array of term taxonomy IDs, to match when querying terms. */ - readonly termTaxonomId: InputMaybe>>; - /** Whether to prime meta caches for matched terms. Default true. */ - readonly updateTermMetaCache: InputMaybe; -}; - -/** Details for labels of the PostType */ -export type GQLPostTypeLabelDetails = { - readonly __typename?: 'PostTypeLabelDetails'; - /** Default is ‘Add New’ for both hierarchical and non-hierarchical types. */ - readonly addNew: Maybe; - /** Label for adding a new singular item. */ - readonly addNewItem: Maybe; - /** Label to signify all items in a submenu link. */ - readonly allItems: Maybe; - /** Label for archives in nav menus */ - readonly archives: Maybe; - /** Label for the attributes meta box. */ - readonly attributes: Maybe; - /** Label for editing a singular item. */ - readonly editItem: Maybe; - /** Label for the Featured Image meta box title. */ - readonly featuredImage: Maybe; - /** Label for the table views hidden heading. */ - readonly filterItemsList: Maybe; - /** Label for the media frame button. */ - readonly insertIntoItem: Maybe; - /** Label for the table hidden heading. */ - readonly itemsList: Maybe; - /** Label for the table pagination hidden heading. */ - readonly itemsListNavigation: Maybe; - /** Label for the menu name. */ - readonly menuName: Maybe; - /** General name for the post type, usually plural. */ - readonly name: Maybe; - /** Label for the new item page title. */ - readonly newItem: Maybe; - /** Label used when no items are found. */ - readonly notFound: Maybe; - /** Label used when no items are in the trash. */ - readonly notFoundInTrash: Maybe; - /** Label used to prefix parents of hierarchical items. */ - readonly parentItemColon: Maybe; - /** Label for removing the featured image. */ - readonly removeFeaturedImage: Maybe; - /** Label for searching plural items. */ - readonly searchItems: Maybe; - /** Label for setting the featured image. */ - readonly setFeaturedImage: Maybe; - /** Name for one object of this post type. */ - readonly singularName: Maybe; - /** Label for the media frame filter. */ - readonly uploadedToThisItem: Maybe; - /** Label in the media frame for using a featured image. */ - readonly useFeaturedImage: Maybe; - /** Label for viewing a singular item. */ - readonly viewItem: Maybe; - /** Label for viewing post type archives. */ - readonly viewItems: Maybe; -}; - -/** Field Group */ -export type GQLPost_Post = GQLAcfFieldGroup & { - readonly __typename?: 'Post_Post'; - readonly featured: Maybe; - /** The name of the ACF Field Group */ - readonly fieldGroupName: Maybe; -}; - -/** The Project type */ -export type GQLProject = GQLContentNode & GQLDatabaseIdentifier & GQLMenuItemLinkable & GQLNode & GQLNodeWithContentEditor & GQLNodeWithFeaturedImage & GQLNodeWithTemplate & GQLNodeWithTitle & GQLUniformResourceIdentifiable & { - readonly __typename?: 'Project'; - /** The content of the post. */ - readonly content: Maybe; - /** Connection between the ContentNode type and the ContentType type */ - readonly contentType: Maybe; - /** The name of the Content Type the node belongs to */ - readonly contentTypeName: Scalars['String']; - /** The unique resource identifier path */ - readonly databaseId: Scalars['Int']; - /** Post publishing date. */ - readonly date: Maybe; - /** The publishing date set in GMT. */ - readonly dateGmt: Maybe; - /** The desired slug of the post */ - readonly desiredSlug: Maybe; - /** If a user has edited the node within the past 15 seconds, this will return the user that last edited. Null if the edit lock doesn't exist or is greater than 15 seconds */ - readonly editingLockedBy: Maybe; - /** The RSS enclosure for the object */ - readonly enclosure: Maybe; - /** Connection between the ContentNode type and the EnqueuedScript type */ - readonly enqueuedScripts: Maybe; - /** Connection between the ContentNode type and the EnqueuedStylesheet type */ - readonly enqueuedStylesheets: Maybe; - /** Connection between the NodeWithFeaturedImage type and the MediaItem type */ - readonly featuredImage: Maybe; - /** The database identifier for the featured image node assigned to the content node */ - readonly featuredImageDatabaseId: Maybe; - /** Globally unique ID of the featured image assigned to the node */ - readonly featuredImageId: Maybe; - /** The global unique identifier for this post. This currently matches the value stored in WP_Post->guid and the guid column in the "post_objects" database table. */ - readonly guid: Maybe; - /** The globally unique identifier of the projects object. */ - readonly id: Scalars['ID']; - /** Whether the node is a Content Node */ - readonly isContentNode: Scalars['Boolean']; - /** Whether the object is a node in the preview state */ - readonly isPreview: Maybe; - /** Whether the object is restricted from the current viewer */ - readonly isRestricted: Maybe; - /** Whether the node is a Term */ - readonly isTermNode: Scalars['Boolean']; - /** The user that most recently edited the node */ - readonly lastEditedBy: Maybe; - /** The permalink of the post */ - readonly link: Maybe; - /** The local modified time for a post. If a post was recently updated the modified field will change to match the corresponding time. */ - readonly modified: Maybe; - /** The GMT modified time for a post. If a post was recently updated the modified field will change to match the corresponding time in GMT. */ - readonly modifiedGmt: Maybe; - /** Connection between the Project type and the Project type */ - readonly preview: Maybe; - /** The database id of the preview node */ - readonly previewRevisionDatabaseId: Maybe; - /** Whether the object is a node in the preview state */ - readonly previewRevisionId: Maybe; - /** Added to the GraphQL Schema because the ACF Field Group "Projects" was set to Show in GraphQL. */ - readonly project: Maybe; - /** - * The id field matches the WP_Post->ID field. - * @deprecated Deprecated in favor of the databaseId field - */ - readonly projectId: Scalars['Int']; - /** The uri slug for the post. This is equivalent to the WP_Post->post_name field and the post_name column in the database for the "post_objects" table. */ - readonly slug: Maybe; - /** The current status of the object */ - readonly status: Maybe; - /** Connection between the Project type and the Technology type */ - readonly technologies: Maybe; - /** The template assigned to a node of content */ - readonly template: Maybe; - /** Connection between the Project type and the TermNode type */ - readonly terms: Maybe; - /** The title of the post. This is currently just the raw title. An amendment to support rendered title needs to be made. */ - readonly title: Maybe; - /** The unique resource identifier path */ - readonly uri: Maybe; -}; - - -/** The Project type */ -export type GQLProjectContentArgs = { - format: InputMaybe; -}; - - -/** The Project type */ -export type GQLProjectEnqueuedScriptsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - - -/** The Project type */ -export type GQLProjectEnqueuedStylesheetsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - - -/** The Project type */ -export type GQLProjectTechnologiesArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The Project type */ -export type GQLProjectTermsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The Project type */ -export type GQLProjectTitleArgs = { - format: InputMaybe; -}; - -/** The Type of Identifier used to fetch a single resource. Default is ID. */ -export enum GQLProjectIdType { - /** Identify a resource by the Database ID. */ - DatabaseId = 'DATABASE_ID', - /** Identify a resource by the (hashed) Global ID. */ - Id = 'ID', - /** Identify a resource by the slug. Available to non-hierarchcial Types where the slug is a unique identifier. */ - Slug = 'SLUG', - /** Identify a resource by the URI. */ - Uri = 'URI' -} - -/** Set relationships between the Project to Technologies */ -export type GQLProjectTechnologiesInput = { - /** If true, this will append the Technology to existing related Technologies. If false, this will replace existing relationships. Default true. */ - readonly append: InputMaybe; - /** The input list of items to set. */ - readonly nodes: InputMaybe>>; -}; - -/** List of Technologies to connect the Project to. If an ID is set, it will be used to create the connection. If not, it will look for a slug. If neither are valid existing terms, and the site is configured to allow terms to be created during post mutations, a term will be created using the Name if it exists in the input, then fallback to the slug if it exists. */ -export type GQLProjectTechnologiesNodeInput = { - /** The description of the Technology. This field is used to set a description of the Technology if a new one is created during the mutation. */ - readonly description: InputMaybe; - /** The ID of the Technology. If present, this will be used to connect to the Project. If no existing Technology exists with this ID, no connection will be made. */ - readonly id: InputMaybe; - /** The name of the Technology. This field is used to create a new term, if term creation is enabled in nested mutations, and if one does not already exist with the provided slug or ID or if a slug or ID is not provided. If no name is included and a term is created, the creation will fallback to the slug field. */ - readonly name: InputMaybe; - /** The slug of the Technology. If no ID is present, this field will be used to make a connection. If no existing term exists with this slug, this field will be used as a fallback to the Name field when creating a new term to connect to, if term creation is enabled as a nested mutation. */ - readonly slug: InputMaybe; -}; - -/** Connection between the Project type and the Project type */ -export type GQLProjectToPreviewConnectionEdge = { - readonly __typename?: 'ProjectToPreviewConnectionEdge'; - /** The node of the connection, without the edges */ - readonly node: Maybe; -}; - -/** Connection between the Project type and the Technology type */ -export type GQLProjectToTechnologyConnection = { - readonly __typename?: 'ProjectToTechnologyConnection'; - /** Edges for the ProjectToTechnologyConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLProjectToTechnologyConnectionEdge = { - readonly __typename?: 'ProjectToTechnologyConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the ProjectToTechnologyConnection connection */ -export type GQLProjectToTechnologyConnectionWhereArgs = { - /** Unique cache key to be produced when this query is stored in an object cache. Default is 'core'. */ - readonly cacheDomain: InputMaybe; - /** Term ID to retrieve child terms of. If multiple taxonomies are passed, $child_of is ignored. Default 0. */ - readonly childOf: InputMaybe; - /** True to limit results to terms that have no children. This parameter has no effect on non-hierarchical taxonomies. Default false. */ - readonly childless: InputMaybe; - /** Retrieve terms where the description is LIKE the input value. Default empty. */ - readonly descriptionLike: InputMaybe; - /** Array of term ids to exclude. If $include is non-empty, $exclude is ignored. Default empty array. */ - readonly exclude: InputMaybe>>; - /** Array of term ids to exclude along with all of their descendant terms. If $include is non-empty, $exclude_tree is ignored. Default empty array. */ - readonly excludeTree: InputMaybe>>; - /** Whether to hide terms not assigned to any posts. Accepts true or false. Default false */ - readonly hideEmpty: InputMaybe; - /** Whether to include terms that have non-empty descendants (even if $hide_empty is set to true). Default true. */ - readonly hierarchical: InputMaybe; - /** Array of term ids to include. Default empty array. */ - readonly include: InputMaybe>>; - /** Array of names to return term(s) for. Default empty. */ - readonly name: InputMaybe>>; - /** Retrieve terms where the name is LIKE the input value. Default empty. */ - readonly nameLike: InputMaybe; - /** Array of object IDs. Results will be limited to terms associated with these objects. */ - readonly objectIds: InputMaybe>>; - /** Direction the connection should be ordered in */ - readonly order: InputMaybe; - /** Field(s) to order terms by. Defaults to 'name'. */ - readonly orderby: InputMaybe; - /** Whether to pad the quantity of a term's children in the quantity of each term's "count" object variable. Default false. */ - readonly padCounts: InputMaybe; - /** Parent term ID to retrieve direct-child terms of. Default empty. */ - readonly parent: InputMaybe; - /** Search criteria to match terms. Will be SQL-formatted with wildcards before and after. Default empty. */ - readonly search: InputMaybe; - /** Array of slugs to return term(s) for. Default empty. */ - readonly slug: InputMaybe>>; - /** Array of term taxonomy IDs, to match when querying terms. */ - readonly termTaxonomId: InputMaybe>>; - /** Whether to prime meta caches for matched terms. Default true. */ - readonly updateTermMetaCache: InputMaybe; -}; - -/** Connection between the Project type and the TermNode type */ -export type GQLProjectToTermNodeConnection = { - readonly __typename?: 'ProjectToTermNodeConnection'; - /** Edges for the ProjectToTermNodeConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLProjectToTermNodeConnectionEdge = { - readonly __typename?: 'ProjectToTermNodeConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the ProjectToTermNodeConnection connection */ -export type GQLProjectToTermNodeConnectionWhereArgs = { - /** Unique cache key to be produced when this query is stored in an object cache. Default is 'core'. */ - readonly cacheDomain: InputMaybe; - /** Term ID to retrieve child terms of. If multiple taxonomies are passed, $child_of is ignored. Default 0. */ - readonly childOf: InputMaybe; - /** True to limit results to terms that have no children. This parameter has no effect on non-hierarchical taxonomies. Default false. */ - readonly childless: InputMaybe; - /** Retrieve terms where the description is LIKE the input value. Default empty. */ - readonly descriptionLike: InputMaybe; - /** Array of term ids to exclude. If $include is non-empty, $exclude is ignored. Default empty array. */ - readonly exclude: InputMaybe>>; - /** Array of term ids to exclude along with all of their descendant terms. If $include is non-empty, $exclude_tree is ignored. Default empty array. */ - readonly excludeTree: InputMaybe>>; - /** Whether to hide terms not assigned to any posts. Accepts true or false. Default false */ - readonly hideEmpty: InputMaybe; - /** Whether to include terms that have non-empty descendants (even if $hide_empty is set to true). Default true. */ - readonly hierarchical: InputMaybe; - /** Array of term ids to include. Default empty array. */ - readonly include: InputMaybe>>; - /** Array of names to return term(s) for. Default empty. */ - readonly name: InputMaybe>>; - /** Retrieve terms where the name is LIKE the input value. Default empty. */ - readonly nameLike: InputMaybe; - /** Array of object IDs. Results will be limited to terms associated with these objects. */ - readonly objectIds: InputMaybe>>; - /** Direction the connection should be ordered in */ - readonly order: InputMaybe; - /** Field(s) to order terms by. Defaults to 'name'. */ - readonly orderby: InputMaybe; - /** Whether to pad the quantity of a term's children in the quantity of each term's "count" object variable. Default false. */ - readonly padCounts: InputMaybe; - /** Parent term ID to retrieve direct-child terms of. Default empty. */ - readonly parent: InputMaybe; - /** Search criteria to match terms. Will be SQL-formatted with wildcards before and after. Default empty. */ - readonly search: InputMaybe; - /** Array of slugs to return term(s) for. Default empty. */ - readonly slug: InputMaybe>>; - /** The Taxonomy to filter terms by */ - readonly taxonomies: InputMaybe>>; - /** Array of term taxonomy IDs, to match when querying terms. */ - readonly termTaxonomId: InputMaybe>>; - /** Whether to prime meta caches for matched terms. Default true. */ - readonly updateTermMetaCache: InputMaybe; -}; - -/** Field Group */ -export type GQLProject_Project = GQLAcfFieldGroup & { - readonly __typename?: 'Project_Project'; - readonly date: Maybe; - readonly description: Maybe; - /** The name of the ACF Field Group */ - readonly fieldGroupName: Maybe; - readonly link: Maybe; - readonly tags: Maybe>>; -}; - -/** The reading setting type */ -export type GQLReadingSettings = { - readonly __typename?: 'ReadingSettings'; - /** Blog pages show at most. */ - readonly postsPerPage: Maybe; -}; - -/** Input for the registerUser mutation */ -export type GQLRegisterUserInput = { - /** User's AOL IM account. */ - readonly aim: InputMaybe; - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** A string containing content about the user. */ - readonly description: InputMaybe; - /** A string that will be shown on the site. Defaults to user's username. It is likely that you will want to change this, for both appearance and security through obscurity (that is if you dont use and delete the default admin user). */ - readonly displayName: InputMaybe; - /** A string containing the user's email address. */ - readonly email: InputMaybe; - /** The user's first name. */ - readonly firstName: InputMaybe; - /** User's Jabber account. */ - readonly jabber: InputMaybe; - /** The user's last name. */ - readonly lastName: InputMaybe; - /** User's locale. */ - readonly locale: InputMaybe; - /** A string that contains a URL-friendly name for the user. The default is the user's username. */ - readonly nicename: InputMaybe; - /** The user's nickname, defaults to the user's username. */ - readonly nickname: InputMaybe; - /** A string that contains the plain text password for the user. */ - readonly password: InputMaybe; - /** The date the user registered. Format is Y-m-d H:i:s. */ - readonly registered: InputMaybe; - /** A string for whether to enable the rich editor or not. False if not empty. */ - readonly richEditing: InputMaybe; - /** A string that contains the user's username. */ - readonly username: Scalars['String']; - /** A string containing the user's URL for the user's web site. */ - readonly websiteUrl: InputMaybe; - /** User's Yahoo IM account. */ - readonly yim: InputMaybe; -}; - -/** The payload for the registerUser mutation */ -export type GQLRegisterUserPayload = { - readonly __typename?: 'RegisterUserPayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The User object mutation type. */ - readonly user: Maybe; -}; - -/** The logical relation between each item in the array when there are more than one. */ -export enum GQLRelationEnum { - /** The logical AND condition returns true if both operands are true, otherwise, it returns false. */ - And = 'AND', - /** The logical OR condition returns false if both operands are false, otherwise, it returns true. */ - Or = 'OR' -} - -/** Input for the resetUserPassword mutation */ -export type GQLResetUserPasswordInput = { - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** Password reset key */ - readonly key: InputMaybe; - /** The user's login (username). */ - readonly login: InputMaybe; - /** The new password. */ - readonly password: InputMaybe; -}; - -/** The payload for the resetUserPassword mutation */ -export type GQLResetUserPasswordPayload = { - readonly __typename?: 'ResetUserPasswordPayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The User object mutation type. */ - readonly user: Maybe; -}; - -/** Input for the restoreComment mutation */ -export type GQLRestoreCommentInput = { - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** The ID of the comment to be restored */ - readonly id: Scalars['ID']; -}; - -/** The payload for the restoreComment mutation */ -export type GQLRestoreCommentPayload = { - readonly __typename?: 'RestoreCommentPayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The restored comment object */ - readonly comment: Maybe; - /** The ID of the restored comment */ - readonly restoredId: Maybe; -}; - -/** The root mutation */ -export type GQLRootMutation = { - readonly __typename?: 'RootMutation'; - /** The payload for the createCategory mutation */ - readonly createCategory: Maybe; - /** The payload for the createComment mutation */ - readonly createComment: Maybe; - /** The payload for the createMediaItem mutation */ - readonly createMediaItem: Maybe; - /** The payload for the createPage mutation */ - readonly createPage: Maybe; - /** The payload for the createPost mutation */ - readonly createPost: Maybe; - /** The payload for the createPostFormat mutation */ - readonly createPostFormat: Maybe; - /** The payload for the createProject mutation */ - readonly createProject: Maybe; - /** The payload for the createTag mutation */ - readonly createTag: Maybe; - /** The payload for the createTechnology mutation */ - readonly createTechnology: Maybe; - /** The payload for the createUser mutation */ - readonly createUser: Maybe; - /** The payload for the createWork mutation */ - readonly createWork: Maybe; - /** The payload for the deleteCategory mutation */ - readonly deleteCategory: Maybe; - /** The payload for the deleteComment mutation */ - readonly deleteComment: Maybe; - /** The payload for the deleteMediaItem mutation */ - readonly deleteMediaItem: Maybe; - /** The payload for the deletePage mutation */ - readonly deletePage: Maybe; - /** The payload for the deletePost mutation */ - readonly deletePost: Maybe; - /** The payload for the deletePostFormat mutation */ - readonly deletePostFormat: Maybe; - /** The payload for the deleteProject mutation */ - readonly deleteProject: Maybe; - /** The payload for the deleteTag mutation */ - readonly deleteTag: Maybe; - /** The payload for the deleteTechnology mutation */ - readonly deleteTechnology: Maybe; - /** The payload for the deleteUser mutation */ - readonly deleteUser: Maybe; - /** The payload for the deleteWork mutation */ - readonly deleteWork: Maybe; - /** Increase the count. */ - readonly increaseCount: Maybe; - /** The payload for the registerUser mutation */ - readonly registerUser: Maybe; - /** The payload for the resetUserPassword mutation */ - readonly resetUserPassword: Maybe; - /** The payload for the restoreComment mutation */ - readonly restoreComment: Maybe; - /** The payload for the sendPasswordResetEmail mutation */ - readonly sendPasswordResetEmail: Maybe; - /** The payload for the UpdateCategory mutation */ - readonly updateCategory: Maybe; - /** The payload for the updateComment mutation */ - readonly updateComment: Maybe; - /** The payload for the updateMediaItem mutation */ - readonly updateMediaItem: Maybe; - /** The payload for the updatePage mutation */ - readonly updatePage: Maybe; - /** The payload for the updatePost mutation */ - readonly updatePost: Maybe; - /** The payload for the UpdatePostFormat mutation */ - readonly updatePostFormat: Maybe; - /** The payload for the updateProject mutation */ - readonly updateProject: Maybe; - /** The payload for the updateSettings mutation */ - readonly updateSettings: Maybe; - /** The payload for the UpdateTag mutation */ - readonly updateTag: Maybe; - /** The payload for the UpdateTechnology mutation */ - readonly updateTechnology: Maybe; - /** The payload for the updateUser mutation */ - readonly updateUser: Maybe; - /** The payload for the updateWork mutation */ - readonly updateWork: Maybe; -}; - - -/** The root mutation */ -export type GQLRootMutationCreateCategoryArgs = { - input: GQLCreateCategoryInput; -}; - - -/** The root mutation */ -export type GQLRootMutationCreateCommentArgs = { - input: GQLCreateCommentInput; -}; - - -/** The root mutation */ -export type GQLRootMutationCreateMediaItemArgs = { - input: GQLCreateMediaItemInput; -}; - - -/** The root mutation */ -export type GQLRootMutationCreatePageArgs = { - input: GQLCreatePageInput; -}; - - -/** The root mutation */ -export type GQLRootMutationCreatePostArgs = { - input: GQLCreatePostInput; -}; - - -/** The root mutation */ -export type GQLRootMutationCreatePostFormatArgs = { - input: GQLCreatePostFormatInput; -}; - - -/** The root mutation */ -export type GQLRootMutationCreateProjectArgs = { - input: GQLCreateProjectInput; -}; - - -/** The root mutation */ -export type GQLRootMutationCreateTagArgs = { - input: GQLCreateTagInput; -}; - - -/** The root mutation */ -export type GQLRootMutationCreateTechnologyArgs = { - input: GQLCreateTechnologyInput; -}; - - -/** The root mutation */ -export type GQLRootMutationCreateUserArgs = { - input: GQLCreateUserInput; -}; - - -/** The root mutation */ -export type GQLRootMutationCreateWorkArgs = { - input: GQLCreateWorkInput; -}; - - -/** The root mutation */ -export type GQLRootMutationDeleteCategoryArgs = { - input: GQLDeleteCategoryInput; -}; - - -/** The root mutation */ -export type GQLRootMutationDeleteCommentArgs = { - input: GQLDeleteCommentInput; -}; - - -/** The root mutation */ -export type GQLRootMutationDeleteMediaItemArgs = { - input: GQLDeleteMediaItemInput; -}; - - -/** The root mutation */ -export type GQLRootMutationDeletePageArgs = { - input: GQLDeletePageInput; -}; - - -/** The root mutation */ -export type GQLRootMutationDeletePostArgs = { - input: GQLDeletePostInput; -}; - - -/** The root mutation */ -export type GQLRootMutationDeletePostFormatArgs = { - input: GQLDeletePostFormatInput; -}; - - -/** The root mutation */ -export type GQLRootMutationDeleteProjectArgs = { - input: GQLDeleteProjectInput; -}; - - -/** The root mutation */ -export type GQLRootMutationDeleteTagArgs = { - input: GQLDeleteTagInput; -}; - - -/** The root mutation */ -export type GQLRootMutationDeleteTechnologyArgs = { - input: GQLDeleteTechnologyInput; -}; - - -/** The root mutation */ -export type GQLRootMutationDeleteUserArgs = { - input: GQLDeleteUserInput; -}; - - -/** The root mutation */ -export type GQLRootMutationDeleteWorkArgs = { - input: GQLDeleteWorkInput; -}; - - -/** The root mutation */ -export type GQLRootMutationIncreaseCountArgs = { - count: InputMaybe; -}; - - -/** The root mutation */ -export type GQLRootMutationRegisterUserArgs = { - input: GQLRegisterUserInput; -}; - - -/** The root mutation */ -export type GQLRootMutationResetUserPasswordArgs = { - input: GQLResetUserPasswordInput; -}; - - -/** The root mutation */ -export type GQLRootMutationRestoreCommentArgs = { - input: GQLRestoreCommentInput; -}; - - -/** The root mutation */ -export type GQLRootMutationSendPasswordResetEmailArgs = { - input: GQLSendPasswordResetEmailInput; -}; - - -/** The root mutation */ -export type GQLRootMutationUpdateCategoryArgs = { - input: GQLUpdateCategoryInput; -}; - - -/** The root mutation */ -export type GQLRootMutationUpdateCommentArgs = { - input: GQLUpdateCommentInput; -}; - - -/** The root mutation */ -export type GQLRootMutationUpdateMediaItemArgs = { - input: GQLUpdateMediaItemInput; -}; - - -/** The root mutation */ -export type GQLRootMutationUpdatePageArgs = { - input: GQLUpdatePageInput; -}; - - -/** The root mutation */ -export type GQLRootMutationUpdatePostArgs = { - input: GQLUpdatePostInput; -}; - - -/** The root mutation */ -export type GQLRootMutationUpdatePostFormatArgs = { - input: GQLUpdatePostFormatInput; -}; - - -/** The root mutation */ -export type GQLRootMutationUpdateProjectArgs = { - input: GQLUpdateProjectInput; -}; - - -/** The root mutation */ -export type GQLRootMutationUpdateSettingsArgs = { - input: GQLUpdateSettingsInput; -}; - - -/** The root mutation */ -export type GQLRootMutationUpdateTagArgs = { - input: GQLUpdateTagInput; -}; - - -/** The root mutation */ -export type GQLRootMutationUpdateTechnologyArgs = { - input: GQLUpdateTechnologyInput; -}; - - -/** The root mutation */ -export type GQLRootMutationUpdateUserArgs = { - input: GQLUpdateUserInput; -}; - - -/** The root mutation */ -export type GQLRootMutationUpdateWorkArgs = { - input: GQLUpdateWorkInput; -}; - -/** The root entry point into the Graph */ -export type GQLRootQuery = { - readonly __typename?: 'RootQuery'; - /** Entry point to get all settings for the site */ - readonly allSettings: Maybe; - /** Connection between the RootQuery type and the category type */ - readonly categories: Maybe; - /** A 0bject */ - readonly category: Maybe; - /** Returns a Comment */ - readonly comment: Maybe; - /** Connection between the RootQuery type and the Comment type */ - readonly comments: Maybe; - /** A node used to manage content */ - readonly contentNode: Maybe; - /** Connection between the RootQuery type and the ContentNode type */ - readonly contentNodes: Maybe; - /** Fetch a Content Type node by unique Identifier */ - readonly contentType: Maybe; - /** Connection between the RootQuery type and the ContentType type */ - readonly contentTypes: Maybe; - /** Fields of the 'DiscussionSettings' settings group */ - readonly discussionSettings: Maybe; - /** Fields of the 'GeneralSettings' settings group */ - readonly generalSettings: Maybe; - /** An object of the mediaItem Type. */ - readonly mediaItem: Maybe; - /** - * A mediaItem object - * @deprecated Deprecated in favor of using the single entry point for this type with ID and IDType fields. For example, instead of postBy( id: "" ), use post(id: "" idType: "") - */ - readonly mediaItemBy: Maybe; - /** Connection between the RootQuery type and the mediaItem type */ - readonly mediaItems: Maybe; - /** A WordPress navigation menu */ - readonly menu: Maybe; - /** A WordPress navigation menu item */ - readonly menuItem: Maybe; - /** Connection between the RootQuery type and the MenuItem type */ - readonly menuItems: Maybe; - /** Connection between the RootQuery type and the Menu type */ - readonly menus: Maybe; - /** Fetches an object given its ID */ - readonly node: Maybe; - /** Fetches an object given its Unique Resource Identifier */ - readonly nodeByUri: Maybe; - /** An object of the page Type. */ - readonly page: Maybe; - /** - * A page object - * @deprecated Deprecated in favor of using the single entry point for this type with ID and IDType fields. For example, instead of postBy( id: "" ), use post(id: "" idType: "") - */ - readonly pageBy: Maybe; - /** Connection between the RootQuery type and the page type */ - readonly pages: Maybe; - /** A WordPress plugin */ - readonly plugin: Maybe; - /** Connection between the RootQuery type and the Plugin type */ - readonly plugins: Maybe; - /** An object of the post Type. */ - readonly post: Maybe; - /** - * A post object - * @deprecated Deprecated in favor of using the single entry point for this type with ID and IDType fields. For example, instead of postBy( id: "" ), use post(id: "" idType: "") - */ - readonly postBy: Maybe; - /** A 0bject */ - readonly postFormat: Maybe; - /** Connection between the RootQuery type and the postFormat type */ - readonly postFormats: Maybe; - /** Connection between the RootQuery type and the post type */ - readonly posts: Maybe; - /** An object of the Project Type. */ - readonly project: Maybe; - /** - * A Project object - * @deprecated Deprecated in favor of using the single entry point for this type with ID and IDType fields. For example, instead of postBy( id: "" ), use post(id: "" idType: "") - */ - readonly projectBy: Maybe; - /** Connection between the RootQuery type and the Project type */ - readonly projects: Maybe; - /** Fields of the 'ReadingSettings' settings group */ - readonly readingSettings: Maybe; - /** Connection between the RootQuery type and the EnqueuedScript type */ - readonly registeredScripts: Maybe; - /** Connection between the RootQuery type and the EnqueuedStylesheet type */ - readonly registeredStylesheets: Maybe; - /** Connection between the RootQuery type and the ContentRevisionUnion type */ - readonly revisions: Maybe; - /** A 0bject */ - readonly tag: Maybe; - /** Connection between the RootQuery type and the tag type */ - readonly tags: Maybe; - /** Connection between the RootQuery type and the Taxonomy type */ - readonly taxonomies: Maybe; - /** Fetch a Taxonomy node by unique Identifier */ - readonly taxonomy: Maybe; - /** Connection between the RootQuery type and the Technology type */ - readonly technologies: Maybe; - /** A 0bject */ - readonly technology: Maybe; - /** A node in a taxonomy used to group and relate content nodes */ - readonly termNode: Maybe; - /** Connection between the RootQuery type and the TermNode type */ - readonly terms: Maybe; - /** A Theme object */ - readonly theme: Maybe; - /** Connection between the RootQuery type and the Theme type */ - readonly themes: Maybe; - /** Returns a user */ - readonly user: Maybe; - /** Returns a user role */ - readonly userRole: Maybe; - /** Connection between the RootQuery type and the UserRole type */ - readonly userRoles: Maybe; - /** Connection between the RootQuery type and the User type */ - readonly users: Maybe; - /** Returns the current user */ - readonly viewer: Maybe; - /** An object of the Work Type. */ - readonly work: Maybe; - /** - * A Work object - * @deprecated Deprecated in favor of using the single entry point for this type with ID and IDType fields. For example, instead of postBy( id: "" ), use post(id: "" idType: "") - */ - readonly workBy: Maybe; - /** Connection between the RootQuery type and the Work type */ - readonly works: Maybe; - /** Fields of the 'WritingSettings' settings group */ - readonly writingSettings: Maybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryCategoriesArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryCategoryArgs = { - id: Scalars['ID']; - idType: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryCommentArgs = { - id: Scalars['ID']; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryCommentsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryContentNodeArgs = { - asPreview: InputMaybe; - contentType: InputMaybe; - id: Scalars['ID']; - idType: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryContentNodesArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryContentTypeArgs = { - id: Scalars['ID']; - idType: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryContentTypesArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryMediaItemArgs = { - asPreview: InputMaybe; - id: Scalars['ID']; - idType: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryMediaItemByArgs = { - id: InputMaybe; - mediaItemId: InputMaybe; - slug: InputMaybe; - uri: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryMediaItemsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryMenuArgs = { - id: Scalars['ID']; - idType: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryMenuItemArgs = { - id: Scalars['ID']; - idType: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryMenuItemsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryMenusArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryNodeArgs = { - id: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryNodeByUriArgs = { - uri: Scalars['String']; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryPageArgs = { - asPreview: InputMaybe; - id: Scalars['ID']; - idType: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryPageByArgs = { - id: InputMaybe; - pageId: InputMaybe; - uri: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryPagesArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryPluginArgs = { - id: Scalars['ID']; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryPluginsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryPostArgs = { - asPreview: InputMaybe; - id: Scalars['ID']; - idType: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryPostByArgs = { - id: InputMaybe; - postId: InputMaybe; - slug: InputMaybe; - uri: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryPostFormatArgs = { - id: Scalars['ID']; - idType: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryPostFormatsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryPostsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryProjectArgs = { - asPreview: InputMaybe; - id: Scalars['ID']; - idType: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryProjectByArgs = { - id: InputMaybe; - projectId: InputMaybe; - slug: InputMaybe; - uri: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryProjectsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryRegisteredScriptsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryRegisteredStylesheetsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryRevisionsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryTagArgs = { - id: Scalars['ID']; - idType: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryTagsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryTaxonomiesArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryTaxonomyArgs = { - id: Scalars['ID']; - idType: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryTechnologiesArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryTechnologyArgs = { - id: Scalars['ID']; - idType: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryTermNodeArgs = { - id: Scalars['ID']; - idType: InputMaybe; - taxonomy: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryTermsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryThemeArgs = { - id: Scalars['ID']; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryThemesArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryUserArgs = { - id: Scalars['ID']; - idType: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryUserRoleArgs = { - id: Scalars['ID']; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryUserRolesArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryUsersArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryWorkArgs = { - asPreview: InputMaybe; - id: Scalars['ID']; - idType: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryWorkByArgs = { - id: InputMaybe; - slug: InputMaybe; - uri: InputMaybe; - workId: InputMaybe; -}; - - -/** The root entry point into the Graph */ -export type GQLRootQueryWorksArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - -/** Connection between the RootQuery type and the category type */ -export type GQLRootQueryToCategoryConnection = { - readonly __typename?: 'RootQueryToCategoryConnection'; - /** Edges for the RootQueryToCategoryConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLRootQueryToCategoryConnectionEdge = { - readonly __typename?: 'RootQueryToCategoryConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the RootQueryToCategoryConnection connection */ -export type GQLRootQueryToCategoryConnectionWhereArgs = { - /** Unique cache key to be produced when this query is stored in an object cache. Default is 'core'. */ - readonly cacheDomain: InputMaybe; - /** Term ID to retrieve child terms of. If multiple taxonomies are passed, $child_of is ignored. Default 0. */ - readonly childOf: InputMaybe; - /** True to limit results to terms that have no children. This parameter has no effect on non-hierarchical taxonomies. Default false. */ - readonly childless: InputMaybe; - /** Retrieve terms where the description is LIKE the input value. Default empty. */ - readonly descriptionLike: InputMaybe; - /** Array of term ids to exclude. If $include is non-empty, $exclude is ignored. Default empty array. */ - readonly exclude: InputMaybe>>; - /** Array of term ids to exclude along with all of their descendant terms. If $include is non-empty, $exclude_tree is ignored. Default empty array. */ - readonly excludeTree: InputMaybe>>; - /** Whether to hide terms not assigned to any posts. Accepts true or false. Default false */ - readonly hideEmpty: InputMaybe; - /** Whether to include terms that have non-empty descendants (even if $hide_empty is set to true). Default true. */ - readonly hierarchical: InputMaybe; - /** Array of term ids to include. Default empty array. */ - readonly include: InputMaybe>>; - /** Array of names to return term(s) for. Default empty. */ - readonly name: InputMaybe>>; - /** Retrieve terms where the name is LIKE the input value. Default empty. */ - readonly nameLike: InputMaybe; - /** Array of object IDs. Results will be limited to terms associated with these objects. */ - readonly objectIds: InputMaybe>>; - /** Direction the connection should be ordered in */ - readonly order: InputMaybe; - /** Field(s) to order terms by. Defaults to 'name'. */ - readonly orderby: InputMaybe; - /** Whether to pad the quantity of a term's children in the quantity of each term's "count" object variable. Default false. */ - readonly padCounts: InputMaybe; - /** Parent term ID to retrieve direct-child terms of. Default empty. */ - readonly parent: InputMaybe; - /** Search criteria to match terms. Will be SQL-formatted with wildcards before and after. Default empty. */ - readonly search: InputMaybe; - /** Array of slugs to return term(s) for. Default empty. */ - readonly slug: InputMaybe>>; - /** Array of term taxonomy IDs, to match when querying terms. */ - readonly termTaxonomId: InputMaybe>>; - /** Whether to prime meta caches for matched terms. Default true. */ - readonly updateTermMetaCache: InputMaybe; -}; - -/** Connection between the RootQuery type and the Comment type */ -export type GQLRootQueryToCommentConnection = { - readonly __typename?: 'RootQueryToCommentConnection'; - /** Edges for the RootQueryToCommentConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLRootQueryToCommentConnectionEdge = { - readonly __typename?: 'RootQueryToCommentConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the RootQueryToCommentConnection connection */ -export type GQLRootQueryToCommentConnectionWhereArgs = { - /** Comment author email address. */ - readonly authorEmail: InputMaybe; - /** Array of author IDs to include comments for. */ - readonly authorIn: InputMaybe>>; - /** Array of author IDs to exclude comments for. */ - readonly authorNotIn: InputMaybe>>; - /** Comment author URL. */ - readonly authorUrl: InputMaybe; - /** Array of comment IDs to include. */ - readonly commentIn: InputMaybe>>; - /** Array of IDs of users whose unapproved comments will be returned by the query regardless of status. */ - readonly commentNotIn: InputMaybe>>; - /** Include comments of a given type. */ - readonly commentType: InputMaybe; - /** Include comments from a given array of comment types. */ - readonly commentTypeIn: InputMaybe>>; - /** Exclude comments from a given array of comment types. */ - readonly commentTypeNotIn: InputMaybe; - /** Content object author ID to limit results by. */ - readonly contentAuthor: InputMaybe>>; - /** Array of author IDs to retrieve comments for. */ - readonly contentAuthorIn: InputMaybe>>; - /** Array of author IDs *not* to retrieve comments for. */ - readonly contentAuthorNotIn: InputMaybe>>; - /** Limit results to those affiliated with a given content object ID. */ - readonly contentId: InputMaybe; - /** Array of content object IDs to include affiliated comments for. */ - readonly contentIdIn: InputMaybe>>; - /** Array of content object IDs to exclude affiliated comments for. */ - readonly contentIdNotIn: InputMaybe>>; - /** Content object name to retrieve affiliated comments for. */ - readonly contentName: InputMaybe; - /** Content Object parent ID to retrieve affiliated comments for. */ - readonly contentParent: InputMaybe; - /** Array of content object statuses to retrieve affiliated comments for. Pass 'any' to match any value. */ - readonly contentStatus: InputMaybe>>; - /** Content object type or array of types to retrieve affiliated comments for. Pass 'any' to match any value. */ - readonly contentType: InputMaybe>>; - /** Array of IDs or email addresses of users whose unapproved comments will be returned by the query regardless of $status. Default empty */ - readonly includeUnapproved: InputMaybe>>; - /** Karma score to retrieve matching comments for. */ - readonly karma: InputMaybe; - /** The cardinality of the order of the connection */ - readonly order: InputMaybe; - /** Field to order the comments by. */ - readonly orderby: InputMaybe; - /** Parent ID of comment to retrieve children of. */ - readonly parent: InputMaybe; - /** Array of parent IDs of comments to retrieve children for. */ - readonly parentIn: InputMaybe>>; - /** Array of parent IDs of comments *not* to retrieve children for. */ - readonly parentNotIn: InputMaybe>>; - /** Search term(s) to retrieve matching comments for. */ - readonly search: InputMaybe; - /** Comment status to limit results by. */ - readonly status: InputMaybe; - /** Include comments for a specific user ID. */ - readonly userId: InputMaybe; -}; - -/** Connection between the RootQuery type and the ContentNode type */ -export type GQLRootQueryToContentNodeConnection = { - readonly __typename?: 'RootQueryToContentNodeConnection'; - /** Edges for the RootQueryToContentNodeConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLRootQueryToContentNodeConnectionEdge = { - readonly __typename?: 'RootQueryToContentNodeConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the RootQueryToContentNodeConnection connection */ -export type GQLRootQueryToContentNodeConnectionWhereArgs = { - /** The Types of content to filter */ - readonly contentTypes: InputMaybe>>; - /** Filter the connection based on dates */ - readonly dateQuery: InputMaybe; - /** True for objects with passwords; False for objects without passwords; null for all objects with or without passwords */ - readonly hasPassword: InputMaybe; - /** Specific ID of the object */ - readonly id: InputMaybe; - /** Array of IDs for the objects to retrieve */ - readonly in: InputMaybe>>; - /** Get objects with a specific mimeType property */ - readonly mimeType: InputMaybe; - /** Slug / post_name of the object */ - readonly name: InputMaybe; - /** Specify objects to retrieve. Use slugs */ - readonly nameIn: InputMaybe>>; - /** Specify IDs NOT to retrieve. If this is used in the same query as "in", it will be ignored */ - readonly notIn: InputMaybe>>; - /** What paramater to use to order the objects by. */ - readonly orderby: InputMaybe>>; - /** Use ID to return only children. Use 0 to return only top-level items */ - readonly parent: InputMaybe; - /** Specify objects whose parent is in an array */ - readonly parentIn: InputMaybe>>; - /** Specify posts whose parent is not in an array */ - readonly parentNotIn: InputMaybe>>; - /** Show posts with a specific password. */ - readonly password: InputMaybe; - /** Show Posts based on a keyword search */ - readonly search: InputMaybe; - /** Retrieve posts where post status is in an array. */ - readonly stati: InputMaybe>>; - /** Show posts with a specific status. */ - readonly status: InputMaybe; - /** Title of the object */ - readonly title: InputMaybe; -}; - -/** Connection between the RootQuery type and the ContentRevisionUnion type */ -export type GQLRootQueryToContentRevisionUnionConnection = { - readonly __typename?: 'RootQueryToContentRevisionUnionConnection'; - /** Edges for the RootQueryToContentRevisionUnionConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLRootQueryToContentRevisionUnionConnectionEdge = { - readonly __typename?: 'RootQueryToContentRevisionUnionConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the RootQueryToContentRevisionUnionConnection connection */ -export type GQLRootQueryToContentRevisionUnionConnectionWhereArgs = { - /** The Types of content to filter */ - readonly contentTypes: InputMaybe>>; - /** Filter the connection based on dates */ - readonly dateQuery: InputMaybe; - /** True for objects with passwords; False for objects without passwords; null for all objects with or without passwords */ - readonly hasPassword: InputMaybe; - /** Specific ID of the object */ - readonly id: InputMaybe; - /** Array of IDs for the objects to retrieve */ - readonly in: InputMaybe>>; - /** Get objects with a specific mimeType property */ - readonly mimeType: InputMaybe; - /** Slug / post_name of the object */ - readonly name: InputMaybe; - /** Specify objects to retrieve. Use slugs */ - readonly nameIn: InputMaybe>>; - /** Specify IDs NOT to retrieve. If this is used in the same query as "in", it will be ignored */ - readonly notIn: InputMaybe>>; - /** What paramater to use to order the objects by. */ - readonly orderby: InputMaybe>>; - /** Use ID to return only children. Use 0 to return only top-level items */ - readonly parent: InputMaybe; - /** Specify objects whose parent is in an array */ - readonly parentIn: InputMaybe>>; - /** Specify posts whose parent is not in an array */ - readonly parentNotIn: InputMaybe>>; - /** Show posts with a specific password. */ - readonly password: InputMaybe; - /** Show Posts based on a keyword search */ - readonly search: InputMaybe; - /** Retrieve posts where post status is in an array. */ - readonly stati: InputMaybe>>; - /** Show posts with a specific status. */ - readonly status: InputMaybe; - /** Title of the object */ - readonly title: InputMaybe; -}; - -/** Connection between the RootQuery type and the ContentType type */ -export type GQLRootQueryToContentTypeConnection = { - readonly __typename?: 'RootQueryToContentTypeConnection'; - /** Edges for the RootQueryToContentTypeConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLRootQueryToContentTypeConnectionEdge = { - readonly __typename?: 'RootQueryToContentTypeConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Connection between the RootQuery type and the EnqueuedScript type */ -export type GQLRootQueryToEnqueuedScriptConnection = { - readonly __typename?: 'RootQueryToEnqueuedScriptConnection'; - /** Edges for the RootQueryToEnqueuedScriptConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLRootQueryToEnqueuedScriptConnectionEdge = { - readonly __typename?: 'RootQueryToEnqueuedScriptConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Connection between the RootQuery type and the EnqueuedStylesheet type */ -export type GQLRootQueryToEnqueuedStylesheetConnection = { - readonly __typename?: 'RootQueryToEnqueuedStylesheetConnection'; - /** Edges for the RootQueryToEnqueuedStylesheetConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLRootQueryToEnqueuedStylesheetConnectionEdge = { - readonly __typename?: 'RootQueryToEnqueuedStylesheetConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Connection between the RootQuery type and the mediaItem type */ -export type GQLRootQueryToMediaItemConnection = { - readonly __typename?: 'RootQueryToMediaItemConnection'; - /** Edges for the RootQueryToMediaItemConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLRootQueryToMediaItemConnectionEdge = { - readonly __typename?: 'RootQueryToMediaItemConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the RootQueryToMediaItemConnection connection */ -export type GQLRootQueryToMediaItemConnectionWhereArgs = { - /** The user that's connected as the author of the object. Use the userId for the author object. */ - readonly author: InputMaybe; - /** Find objects connected to author(s) in the array of author's userIds */ - readonly authorIn: InputMaybe>>; - /** Find objects connected to the author by the author's nicename */ - readonly authorName: InputMaybe; - /** Find objects NOT connected to author(s) in the array of author's userIds */ - readonly authorNotIn: InputMaybe>>; - /** Filter the connection based on dates */ - readonly dateQuery: InputMaybe; - /** True for objects with passwords; False for objects without passwords; null for all objects with or without passwords */ - readonly hasPassword: InputMaybe; - /** Specific ID of the object */ - readonly id: InputMaybe; - /** Array of IDs for the objects to retrieve */ - readonly in: InputMaybe>>; - /** Get objects with a specific mimeType property */ - readonly mimeType: InputMaybe; - /** Slug / post_name of the object */ - readonly name: InputMaybe; - /** Specify objects to retrieve. Use slugs */ - readonly nameIn: InputMaybe>>; - /** Specify IDs NOT to retrieve. If this is used in the same query as "in", it will be ignored */ - readonly notIn: InputMaybe>>; - /** What paramater to use to order the objects by. */ - readonly orderby: InputMaybe>>; - /** Use ID to return only children. Use 0 to return only top-level items */ - readonly parent: InputMaybe; - /** Specify objects whose parent is in an array */ - readonly parentIn: InputMaybe>>; - /** Specify posts whose parent is not in an array */ - readonly parentNotIn: InputMaybe>>; - /** Show posts with a specific password. */ - readonly password: InputMaybe; - /** Show Posts based on a keyword search */ - readonly search: InputMaybe; - /** Retrieve posts where post status is in an array. */ - readonly stati: InputMaybe>>; - /** Show posts with a specific status. */ - readonly status: InputMaybe; - /** Title of the object */ - readonly title: InputMaybe; -}; - -/** Connection between the RootQuery type and the Menu type */ -export type GQLRootQueryToMenuConnection = { - readonly __typename?: 'RootQueryToMenuConnection'; - /** Edges for the RootQueryToMenuConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLRootQueryToMenuConnectionEdge = { - readonly __typename?: 'RootQueryToMenuConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the RootQueryToMenuConnection connection */ -export type GQLRootQueryToMenuConnectionWhereArgs = { - /** The ID of the object */ - readonly id: InputMaybe; - /** The menu location for the menu being queried */ - readonly location: InputMaybe; - /** The slug of the menu to query items for */ - readonly slug: InputMaybe; -}; - -/** Connection between the RootQuery type and the MenuItem type */ -export type GQLRootQueryToMenuItemConnection = { - readonly __typename?: 'RootQueryToMenuItemConnection'; - /** Edges for the RootQueryToMenuItemConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLRootQueryToMenuItemConnectionEdge = { - readonly __typename?: 'RootQueryToMenuItemConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the RootQueryToMenuItemConnection connection */ -export type GQLRootQueryToMenuItemConnectionWhereArgs = { - /** The ID of the object */ - readonly id: InputMaybe; - /** The menu location for the menu being queried */ - readonly location: InputMaybe; - /** The database ID of the parent menu object */ - readonly parentDatabaseId: InputMaybe; - /** The ID of the parent menu object */ - readonly parentId: InputMaybe; -}; - -/** Connection between the RootQuery type and the page type */ -export type GQLRootQueryToPageConnection = { - readonly __typename?: 'RootQueryToPageConnection'; - /** Edges for the RootQueryToPageConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLRootQueryToPageConnectionEdge = { - readonly __typename?: 'RootQueryToPageConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the RootQueryToPageConnection connection */ -export type GQLRootQueryToPageConnectionWhereArgs = { - /** The user that's connected as the author of the object. Use the userId for the author object. */ - readonly author: InputMaybe; - /** Find objects connected to author(s) in the array of author's userIds */ - readonly authorIn: InputMaybe>>; - /** Find objects connected to the author by the author's nicename */ - readonly authorName: InputMaybe; - /** Find objects NOT connected to author(s) in the array of author's userIds */ - readonly authorNotIn: InputMaybe>>; - /** Filter the connection based on dates */ - readonly dateQuery: InputMaybe; - /** True for objects with passwords; False for objects without passwords; null for all objects with or without passwords */ - readonly hasPassword: InputMaybe; - /** Specific ID of the object */ - readonly id: InputMaybe; - /** Array of IDs for the objects to retrieve */ - readonly in: InputMaybe>>; - /** Get objects with a specific mimeType property */ - readonly mimeType: InputMaybe; - /** Slug / post_name of the object */ - readonly name: InputMaybe; - /** Specify objects to retrieve. Use slugs */ - readonly nameIn: InputMaybe>>; - /** Specify IDs NOT to retrieve. If this is used in the same query as "in", it will be ignored */ - readonly notIn: InputMaybe>>; - /** What paramater to use to order the objects by. */ - readonly orderby: InputMaybe>>; - /** Use ID to return only children. Use 0 to return only top-level items */ - readonly parent: InputMaybe; - /** Specify objects whose parent is in an array */ - readonly parentIn: InputMaybe>>; - /** Specify posts whose parent is not in an array */ - readonly parentNotIn: InputMaybe>>; - /** Show posts with a specific password. */ - readonly password: InputMaybe; - /** Show Posts based on a keyword search */ - readonly search: InputMaybe; - /** Retrieve posts where post status is in an array. */ - readonly stati: InputMaybe>>; - /** Show posts with a specific status. */ - readonly status: InputMaybe; - /** Title of the object */ - readonly title: InputMaybe; -}; - -/** Connection between the RootQuery type and the Plugin type */ -export type GQLRootQueryToPluginConnection = { - readonly __typename?: 'RootQueryToPluginConnection'; - /** Edges for the RootQueryToPluginConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLRootQueryToPluginConnectionEdge = { - readonly __typename?: 'RootQueryToPluginConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Connection between the RootQuery type and the post type */ -export type GQLRootQueryToPostConnection = { - readonly __typename?: 'RootQueryToPostConnection'; - /** Edges for the RootQueryToPostConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLRootQueryToPostConnectionEdge = { - readonly __typename?: 'RootQueryToPostConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the RootQueryToPostConnection connection */ -export type GQLRootQueryToPostConnectionWhereArgs = { - /** The user that's connected as the author of the object. Use the userId for the author object. */ - readonly author: InputMaybe; - /** Find objects connected to author(s) in the array of author's userIds */ - readonly authorIn: InputMaybe>>; - /** Find objects connected to the author by the author's nicename */ - readonly authorName: InputMaybe; - /** Find objects NOT connected to author(s) in the array of author's userIds */ - readonly authorNotIn: InputMaybe>>; - /** Category ID */ - readonly categoryId: InputMaybe; - /** Array of category IDs, used to display objects from one category OR another */ - readonly categoryIn: InputMaybe>>; - /** Use Category Slug */ - readonly categoryName: InputMaybe; - /** Array of category IDs, used to display objects from one category OR another */ - readonly categoryNotIn: InputMaybe>>; - /** Filter the connection based on dates */ - readonly dateQuery: InputMaybe; - /** True for objects with passwords; False for objects without passwords; null for all objects with or without passwords */ - readonly hasPassword: InputMaybe; - /** Specific ID of the object */ - readonly id: InputMaybe; - /** Array of IDs for the objects to retrieve */ - readonly in: InputMaybe>>; - /** Get objects with a specific mimeType property */ - readonly mimeType: InputMaybe; - /** Slug / post_name of the object */ - readonly name: InputMaybe; - /** Specify objects to retrieve. Use slugs */ - readonly nameIn: InputMaybe>>; - /** Specify IDs NOT to retrieve. If this is used in the same query as "in", it will be ignored */ - readonly notIn: InputMaybe>>; - /** What paramater to use to order the objects by. */ - readonly orderby: InputMaybe>>; - /** Use ID to return only children. Use 0 to return only top-level items */ - readonly parent: InputMaybe; - /** Specify objects whose parent is in an array */ - readonly parentIn: InputMaybe>>; - /** Specify posts whose parent is not in an array */ - readonly parentNotIn: InputMaybe>>; - /** Show posts with a specific password. */ - readonly password: InputMaybe; - /** Show Posts based on a keyword search */ - readonly search: InputMaybe; - /** Retrieve posts where post status is in an array. */ - readonly stati: InputMaybe>>; - /** Show posts with a specific status. */ - readonly status: InputMaybe; - /** Tag Slug */ - readonly tag: InputMaybe; - /** Use Tag ID */ - readonly tagId: InputMaybe; - /** Array of tag IDs, used to display objects from one tag OR another */ - readonly tagIn: InputMaybe>>; - /** Array of tag IDs, used to display objects from one tag OR another */ - readonly tagNotIn: InputMaybe>>; - /** Array of tag slugs, used to display objects from one tag OR another */ - readonly tagSlugAnd: InputMaybe>>; - /** Array of tag slugs, used to exclude objects in specified tags */ - readonly tagSlugIn: InputMaybe>>; - /** Title of the object */ - readonly title: InputMaybe; -}; - -/** Connection between the RootQuery type and the postFormat type */ -export type GQLRootQueryToPostFormatConnection = { - readonly __typename?: 'RootQueryToPostFormatConnection'; - /** Edges for the RootQueryToPostFormatConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLRootQueryToPostFormatConnectionEdge = { - readonly __typename?: 'RootQueryToPostFormatConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the RootQueryToPostFormatConnection connection */ -export type GQLRootQueryToPostFormatConnectionWhereArgs = { - /** Unique cache key to be produced when this query is stored in an object cache. Default is 'core'. */ - readonly cacheDomain: InputMaybe; - /** Term ID to retrieve child terms of. If multiple taxonomies are passed, $child_of is ignored. Default 0. */ - readonly childOf: InputMaybe; - /** True to limit results to terms that have no children. This parameter has no effect on non-hierarchical taxonomies. Default false. */ - readonly childless: InputMaybe; - /** Retrieve terms where the description is LIKE the input value. Default empty. */ - readonly descriptionLike: InputMaybe; - /** Array of term ids to exclude. If $include is non-empty, $exclude is ignored. Default empty array. */ - readonly exclude: InputMaybe>>; - /** Array of term ids to exclude along with all of their descendant terms. If $include is non-empty, $exclude_tree is ignored. Default empty array. */ - readonly excludeTree: InputMaybe>>; - /** Whether to hide terms not assigned to any posts. Accepts true or false. Default false */ - readonly hideEmpty: InputMaybe; - /** Whether to include terms that have non-empty descendants (even if $hide_empty is set to true). Default true. */ - readonly hierarchical: InputMaybe; - /** Array of term ids to include. Default empty array. */ - readonly include: InputMaybe>>; - /** Array of names to return term(s) for. Default empty. */ - readonly name: InputMaybe>>; - /** Retrieve terms where the name is LIKE the input value. Default empty. */ - readonly nameLike: InputMaybe; - /** Array of object IDs. Results will be limited to terms associated with these objects. */ - readonly objectIds: InputMaybe>>; - /** Direction the connection should be ordered in */ - readonly order: InputMaybe; - /** Field(s) to order terms by. Defaults to 'name'. */ - readonly orderby: InputMaybe; - /** Whether to pad the quantity of a term's children in the quantity of each term's "count" object variable. Default false. */ - readonly padCounts: InputMaybe; - /** Parent term ID to retrieve direct-child terms of. Default empty. */ - readonly parent: InputMaybe; - /** Search criteria to match terms. Will be SQL-formatted with wildcards before and after. Default empty. */ - readonly search: InputMaybe; - /** Array of slugs to return term(s) for. Default empty. */ - readonly slug: InputMaybe>>; - /** Array of term taxonomy IDs, to match when querying terms. */ - readonly termTaxonomId: InputMaybe>>; - /** Whether to prime meta caches for matched terms. Default true. */ - readonly updateTermMetaCache: InputMaybe; -}; - -/** Connection between the RootQuery type and the Project type */ -export type GQLRootQueryToProjectConnection = { - readonly __typename?: 'RootQueryToProjectConnection'; - /** Edges for the RootQueryToProjectConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLRootQueryToProjectConnectionEdge = { - readonly __typename?: 'RootQueryToProjectConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the RootQueryToProjectConnection connection */ -export type GQLRootQueryToProjectConnectionWhereArgs = { - /** Filter the connection based on dates */ - readonly dateQuery: InputMaybe; - /** True for objects with passwords; False for objects without passwords; null for all objects with or without passwords */ - readonly hasPassword: InputMaybe; - /** Specific ID of the object */ - readonly id: InputMaybe; - /** Array of IDs for the objects to retrieve */ - readonly in: InputMaybe>>; - /** Get objects with a specific mimeType property */ - readonly mimeType: InputMaybe; - /** Slug / post_name of the object */ - readonly name: InputMaybe; - /** Specify objects to retrieve. Use slugs */ - readonly nameIn: InputMaybe>>; - /** Specify IDs NOT to retrieve. If this is used in the same query as "in", it will be ignored */ - readonly notIn: InputMaybe>>; - /** What paramater to use to order the objects by. */ - readonly orderby: InputMaybe>>; - /** Use ID to return only children. Use 0 to return only top-level items */ - readonly parent: InputMaybe; - /** Specify objects whose parent is in an array */ - readonly parentIn: InputMaybe>>; - /** Specify posts whose parent is not in an array */ - readonly parentNotIn: InputMaybe>>; - /** Show posts with a specific password. */ - readonly password: InputMaybe; - /** Show Posts based on a keyword search */ - readonly search: InputMaybe; - /** Retrieve posts where post status is in an array. */ - readonly stati: InputMaybe>>; - /** Show posts with a specific status. */ - readonly status: InputMaybe; - /** Title of the object */ - readonly title: InputMaybe; -}; - -/** Connection between the RootQuery type and the tag type */ -export type GQLRootQueryToTagConnection = { - readonly __typename?: 'RootQueryToTagConnection'; - /** Edges for the RootQueryToTagConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLRootQueryToTagConnectionEdge = { - readonly __typename?: 'RootQueryToTagConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the RootQueryToTagConnection connection */ -export type GQLRootQueryToTagConnectionWhereArgs = { - /** Unique cache key to be produced when this query is stored in an object cache. Default is 'core'. */ - readonly cacheDomain: InputMaybe; - /** Term ID to retrieve child terms of. If multiple taxonomies are passed, $child_of is ignored. Default 0. */ - readonly childOf: InputMaybe; - /** True to limit results to terms that have no children. This parameter has no effect on non-hierarchical taxonomies. Default false. */ - readonly childless: InputMaybe; - /** Retrieve terms where the description is LIKE the input value. Default empty. */ - readonly descriptionLike: InputMaybe; - /** Array of term ids to exclude. If $include is non-empty, $exclude is ignored. Default empty array. */ - readonly exclude: InputMaybe>>; - /** Array of term ids to exclude along with all of their descendant terms. If $include is non-empty, $exclude_tree is ignored. Default empty array. */ - readonly excludeTree: InputMaybe>>; - /** Whether to hide terms not assigned to any posts. Accepts true or false. Default false */ - readonly hideEmpty: InputMaybe; - /** Whether to include terms that have non-empty descendants (even if $hide_empty is set to true). Default true. */ - readonly hierarchical: InputMaybe; - /** Array of term ids to include. Default empty array. */ - readonly include: InputMaybe>>; - /** Array of names to return term(s) for. Default empty. */ - readonly name: InputMaybe>>; - /** Retrieve terms where the name is LIKE the input value. Default empty. */ - readonly nameLike: InputMaybe; - /** Array of object IDs. Results will be limited to terms associated with these objects. */ - readonly objectIds: InputMaybe>>; - /** Direction the connection should be ordered in */ - readonly order: InputMaybe; - /** Field(s) to order terms by. Defaults to 'name'. */ - readonly orderby: InputMaybe; - /** Whether to pad the quantity of a term's children in the quantity of each term's "count" object variable. Default false. */ - readonly padCounts: InputMaybe; - /** Parent term ID to retrieve direct-child terms of. Default empty. */ - readonly parent: InputMaybe; - /** Search criteria to match terms. Will be SQL-formatted with wildcards before and after. Default empty. */ - readonly search: InputMaybe; - /** Array of slugs to return term(s) for. Default empty. */ - readonly slug: InputMaybe>>; - /** Array of term taxonomy IDs, to match when querying terms. */ - readonly termTaxonomId: InputMaybe>>; - /** Whether to prime meta caches for matched terms. Default true. */ - readonly updateTermMetaCache: InputMaybe; -}; - -/** Connection between the RootQuery type and the Taxonomy type */ -export type GQLRootQueryToTaxonomyConnection = { - readonly __typename?: 'RootQueryToTaxonomyConnection'; - /** Edges for the RootQueryToTaxonomyConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLRootQueryToTaxonomyConnectionEdge = { - readonly __typename?: 'RootQueryToTaxonomyConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Connection between the RootQuery type and the Technology type */ -export type GQLRootQueryToTechnologyConnection = { - readonly __typename?: 'RootQueryToTechnologyConnection'; - /** Edges for the RootQueryToTechnologyConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLRootQueryToTechnologyConnectionEdge = { - readonly __typename?: 'RootQueryToTechnologyConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the RootQueryToTechnologyConnection connection */ -export type GQLRootQueryToTechnologyConnectionWhereArgs = { - /** Unique cache key to be produced when this query is stored in an object cache. Default is 'core'. */ - readonly cacheDomain: InputMaybe; - /** Term ID to retrieve child terms of. If multiple taxonomies are passed, $child_of is ignored. Default 0. */ - readonly childOf: InputMaybe; - /** True to limit results to terms that have no children. This parameter has no effect on non-hierarchical taxonomies. Default false. */ - readonly childless: InputMaybe; - /** Retrieve terms where the description is LIKE the input value. Default empty. */ - readonly descriptionLike: InputMaybe; - /** Array of term ids to exclude. If $include is non-empty, $exclude is ignored. Default empty array. */ - readonly exclude: InputMaybe>>; - /** Array of term ids to exclude along with all of their descendant terms. If $include is non-empty, $exclude_tree is ignored. Default empty array. */ - readonly excludeTree: InputMaybe>>; - /** Whether to hide terms not assigned to any posts. Accepts true or false. Default false */ - readonly hideEmpty: InputMaybe; - /** Whether to include terms that have non-empty descendants (even if $hide_empty is set to true). Default true. */ - readonly hierarchical: InputMaybe; - /** Array of term ids to include. Default empty array. */ - readonly include: InputMaybe>>; - /** Array of names to return term(s) for. Default empty. */ - readonly name: InputMaybe>>; - /** Retrieve terms where the name is LIKE the input value. Default empty. */ - readonly nameLike: InputMaybe; - /** Array of object IDs. Results will be limited to terms associated with these objects. */ - readonly objectIds: InputMaybe>>; - /** Direction the connection should be ordered in */ - readonly order: InputMaybe; - /** Field(s) to order terms by. Defaults to 'name'. */ - readonly orderby: InputMaybe; - /** Whether to pad the quantity of a term's children in the quantity of each term's "count" object variable. Default false. */ - readonly padCounts: InputMaybe; - /** Parent term ID to retrieve direct-child terms of. Default empty. */ - readonly parent: InputMaybe; - /** Search criteria to match terms. Will be SQL-formatted with wildcards before and after. Default empty. */ - readonly search: InputMaybe; - /** Array of slugs to return term(s) for. Default empty. */ - readonly slug: InputMaybe>>; - /** Array of term taxonomy IDs, to match when querying terms. */ - readonly termTaxonomId: InputMaybe>>; - /** Whether to prime meta caches for matched terms. Default true. */ - readonly updateTermMetaCache: InputMaybe; -}; - -/** Connection between the RootQuery type and the TermNode type */ -export type GQLRootQueryToTermNodeConnection = { - readonly __typename?: 'RootQueryToTermNodeConnection'; - /** Edges for the RootQueryToTermNodeConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLRootQueryToTermNodeConnectionEdge = { - readonly __typename?: 'RootQueryToTermNodeConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the RootQueryToTermNodeConnection connection */ -export type GQLRootQueryToTermNodeConnectionWhereArgs = { - /** Unique cache key to be produced when this query is stored in an object cache. Default is 'core'. */ - readonly cacheDomain: InputMaybe; - /** Term ID to retrieve child terms of. If multiple taxonomies are passed, $child_of is ignored. Default 0. */ - readonly childOf: InputMaybe; - /** True to limit results to terms that have no children. This parameter has no effect on non-hierarchical taxonomies. Default false. */ - readonly childless: InputMaybe; - /** Retrieve terms where the description is LIKE the input value. Default empty. */ - readonly descriptionLike: InputMaybe; - /** Array of term ids to exclude. If $include is non-empty, $exclude is ignored. Default empty array. */ - readonly exclude: InputMaybe>>; - /** Array of term ids to exclude along with all of their descendant terms. If $include is non-empty, $exclude_tree is ignored. Default empty array. */ - readonly excludeTree: InputMaybe>>; - /** Whether to hide terms not assigned to any posts. Accepts true or false. Default false */ - readonly hideEmpty: InputMaybe; - /** Whether to include terms that have non-empty descendants (even if $hide_empty is set to true). Default true. */ - readonly hierarchical: InputMaybe; - /** Array of term ids to include. Default empty array. */ - readonly include: InputMaybe>>; - /** Array of names to return term(s) for. Default empty. */ - readonly name: InputMaybe>>; - /** Retrieve terms where the name is LIKE the input value. Default empty. */ - readonly nameLike: InputMaybe; - /** Array of object IDs. Results will be limited to terms associated with these objects. */ - readonly objectIds: InputMaybe>>; - /** Direction the connection should be ordered in */ - readonly order: InputMaybe; - /** Field(s) to order terms by. Defaults to 'name'. */ - readonly orderby: InputMaybe; - /** Whether to pad the quantity of a term's children in the quantity of each term's "count" object variable. Default false. */ - readonly padCounts: InputMaybe; - /** Parent term ID to retrieve direct-child terms of. Default empty. */ - readonly parent: InputMaybe; - /** Search criteria to match terms. Will be SQL-formatted with wildcards before and after. Default empty. */ - readonly search: InputMaybe; - /** Array of slugs to return term(s) for. Default empty. */ - readonly slug: InputMaybe>>; - /** The Taxonomy to filter terms by */ - readonly taxonomies: InputMaybe>>; - /** Array of term taxonomy IDs, to match when querying terms. */ - readonly termTaxonomId: InputMaybe>>; - /** Whether to prime meta caches for matched terms. Default true. */ - readonly updateTermMetaCache: InputMaybe; -}; - -/** Connection between the RootQuery type and the Theme type */ -export type GQLRootQueryToThemeConnection = { - readonly __typename?: 'RootQueryToThemeConnection'; - /** Edges for the RootQueryToThemeConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLRootQueryToThemeConnectionEdge = { - readonly __typename?: 'RootQueryToThemeConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Connection between the RootQuery type and the User type */ -export type GQLRootQueryToUserConnection = { - readonly __typename?: 'RootQueryToUserConnection'; - /** Edges for the RootQueryToUserConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLRootQueryToUserConnectionEdge = { - readonly __typename?: 'RootQueryToUserConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the RootQueryToUserConnection connection */ -export type GQLRootQueryToUserConnectionWhereArgs = { - /** Array of userIds to exclude. */ - readonly exclude: InputMaybe>>; - /** Pass an array of post types to filter results to users who have published posts in those post types. */ - readonly hasPublishedPosts: InputMaybe>>; - /** Array of userIds to include. */ - readonly include: InputMaybe>>; - /** The user login. */ - readonly login: InputMaybe; - /** An array of logins to include. Users matching one of these logins will be included in results. */ - readonly loginIn: InputMaybe>>; - /** An array of logins to exclude. Users matching one of these logins will not be included in results. */ - readonly loginNotIn: InputMaybe>>; - /** The user nicename. */ - readonly nicename: InputMaybe; - /** An array of nicenames to include. Users matching one of these nicenames will be included in results. */ - readonly nicenameIn: InputMaybe>>; - /** An array of nicenames to exclude. Users matching one of these nicenames will not be included in results. */ - readonly nicenameNotIn: InputMaybe>>; - /** What paramater to use to order the objects by. */ - readonly orderby: InputMaybe>>; - /** An array of role names that users must match to be included in results. Note that this is an inclusive list: users must match *each* role. */ - readonly role: InputMaybe; - /** An array of role names. Matched users must have at least one of these roles. */ - readonly roleIn: InputMaybe>>; - /** An array of role names to exclude. Users matching one or more of these roles will not be included in results. */ - readonly roleNotIn: InputMaybe>>; - /** Search keyword. Searches for possible string matches on columns. When "searchColumns" is left empty, it tries to determine which column to search in based on search string. */ - readonly search: InputMaybe; - /** Array of column names to be searched. Accepts 'ID', 'login', 'nicename', 'email', 'url'. */ - readonly searchColumns: InputMaybe>>; -}; - -/** Connection between the RootQuery type and the UserRole type */ -export type GQLRootQueryToUserRoleConnection = { - readonly __typename?: 'RootQueryToUserRoleConnection'; - /** Edges for the RootQueryToUserRoleConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLRootQueryToUserRoleConnectionEdge = { - readonly __typename?: 'RootQueryToUserRoleConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Connection between the RootQuery type and the Work type */ -export type GQLRootQueryToWorkConnection = { - readonly __typename?: 'RootQueryToWorkConnection'; - /** Edges for the RootQueryToWorkConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLRootQueryToWorkConnectionEdge = { - readonly __typename?: 'RootQueryToWorkConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the RootQueryToWorkConnection connection */ -export type GQLRootQueryToWorkConnectionWhereArgs = { - /** Filter the connection based on dates */ - readonly dateQuery: InputMaybe; - /** True for objects with passwords; False for objects without passwords; null for all objects with or without passwords */ - readonly hasPassword: InputMaybe; - /** Specific ID of the object */ - readonly id: InputMaybe; - /** Array of IDs for the objects to retrieve */ - readonly in: InputMaybe>>; - /** Get objects with a specific mimeType property */ - readonly mimeType: InputMaybe; - /** Slug / post_name of the object */ - readonly name: InputMaybe; - /** Specify objects to retrieve. Use slugs */ - readonly nameIn: InputMaybe>>; - /** Specify IDs NOT to retrieve. If this is used in the same query as "in", it will be ignored */ - readonly notIn: InputMaybe>>; - /** What paramater to use to order the objects by. */ - readonly orderby: InputMaybe>>; - /** Use ID to return only children. Use 0 to return only top-level items */ - readonly parent: InputMaybe; - /** Specify objects whose parent is in an array */ - readonly parentIn: InputMaybe>>; - /** Specify posts whose parent is not in an array */ - readonly parentNotIn: InputMaybe>>; - /** Show posts with a specific password. */ - readonly password: InputMaybe; - /** Show Posts based on a keyword search */ - readonly search: InputMaybe; - /** Retrieve posts where post status is in an array. */ - readonly stati: InputMaybe>>; - /** Show posts with a specific status. */ - readonly status: InputMaybe; - /** Title of the object */ - readonly title: InputMaybe; -}; - -/** Input for the sendPasswordResetEmail mutation */ -export type GQLSendPasswordResetEmailInput = { - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** A string that contains the user's username or email address. */ - readonly username: Scalars['String']; -}; - -/** The payload for the sendPasswordResetEmail mutation */ -export type GQLSendPasswordResetEmailPayload = { - readonly __typename?: 'SendPasswordResetEmailPayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The user that the password reset email was sent to */ - readonly user: Maybe; -}; - -/** All of the registered settings */ -export type GQLSettings = { - readonly __typename?: 'Settings'; - /** Settings of the the string Settings Group */ - readonly discussionSettingsDefaultCommentStatus: Maybe; - /** Settings of the the string Settings Group */ - readonly discussionSettingsDefaultPingStatus: Maybe; - /** Settings of the the string Settings Group */ - readonly generalSettingsDateFormat: Maybe; - /** Settings of the the string Settings Group */ - readonly generalSettingsDescription: Maybe; - /** Settings of the the string Settings Group */ - readonly generalSettingsEmail: Maybe; - /** Settings of the the string Settings Group */ - readonly generalSettingsLanguage: Maybe; - /** Settings of the the integer Settings Group */ - readonly generalSettingsStartOfWeek: Maybe; - /** Settings of the the string Settings Group */ - readonly generalSettingsTimeFormat: Maybe; - /** Settings of the the string Settings Group */ - readonly generalSettingsTimezone: Maybe; - /** Settings of the the string Settings Group */ - readonly generalSettingsTitle: Maybe; - /** Settings of the the string Settings Group */ - readonly generalSettingsUrl: Maybe; - /** Settings of the the integer Settings Group */ - readonly readingSettingsPostsPerPage: Maybe; - /** Settings of the the integer Settings Group */ - readonly writingSettingsDefaultCategory: Maybe; - /** Settings of the the string Settings Group */ - readonly writingSettingsDefaultPostFormat: Maybe; - /** Settings of the the boolean Settings Group */ - readonly writingSettingsUseSmilies: Maybe; -}; - -/** The tag type */ -export type GQLTag = GQLDatabaseIdentifier & GQLMenuItemLinkable & GQLNode & GQLTermNode & GQLUniformResourceIdentifiable & { - readonly __typename?: 'Tag'; - /** Connection between the tag type and the ContentNode type */ - readonly contentNodes: Maybe; - /** The number of objects connected to the object */ - readonly count: Maybe; - /** The unique resource identifier path */ - readonly databaseId: Scalars['Int']; - /** The description of the object */ - readonly description: Maybe; - /** Connection between the TermNode type and the EnqueuedScript type */ - readonly enqueuedScripts: Maybe; - /** Connection between the TermNode type and the EnqueuedStylesheet type */ - readonly enqueuedStylesheets: Maybe; - /** The unique resource identifier path */ - readonly id: Scalars['ID']; - /** Whether the node is a Content Node */ - readonly isContentNode: Scalars['Boolean']; - /** Whether the object is restricted from the current viewer */ - readonly isRestricted: Maybe; - /** Whether the node is a Term */ - readonly isTermNode: Scalars['Boolean']; - /** The link to the term */ - readonly link: Maybe; - /** The human friendly name of the object. */ - readonly name: Maybe; - /** Connection between the tag type and the post type */ - readonly posts: Maybe; - /** An alphanumeric identifier for the object unique to its type. */ - readonly slug: Maybe; - /** - * The id field matches the WP_Post->ID field. - * @deprecated Deprecated in favor of databaseId - */ - readonly tagId: Maybe; - /** Connection between the tag type and the Taxonomy type */ - readonly taxonomy: Maybe; - /** The name of the taxonomy that the object is associated with */ - readonly taxonomyName: Maybe; - /** The ID of the term group that this term object belongs to */ - readonly termGroupId: Maybe; - /** The taxonomy ID that the object is associated with */ - readonly termTaxonomyId: Maybe; - /** The unique resource identifier path */ - readonly uri: Maybe; -}; - - -/** The tag type */ -export type GQLTagContentNodesArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The tag type */ -export type GQLTagEnqueuedScriptsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - - -/** The tag type */ -export type GQLTagEnqueuedStylesheetsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - - -/** The tag type */ -export type GQLTagPostsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - -/** The Type of Identifier used to fetch a single resource. Default is ID. */ -export enum GQLTagIdType { - /** The Database ID for the node */ - DatabaseId = 'DATABASE_ID', - /** The hashed Global ID */ - Id = 'ID', - /** The name of the node */ - Name = 'NAME', - /** Url friendly name of the node */ - Slug = 'SLUG', - /** The URI for the node */ - Uri = 'URI' -} - -/** Connection between the tag type and the ContentNode type */ -export type GQLTagToContentNodeConnection = { - readonly __typename?: 'TagToContentNodeConnection'; - /** Edges for the TagToContentNodeConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLTagToContentNodeConnectionEdge = { - readonly __typename?: 'TagToContentNodeConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the TagToContentNodeConnection connection */ -export type GQLTagToContentNodeConnectionWhereArgs = { - /** The Types of content to filter */ - readonly contentTypes: InputMaybe>>; - /** Filter the connection based on dates */ - readonly dateQuery: InputMaybe; - /** True for objects with passwords; False for objects without passwords; null for all objects with or without passwords */ - readonly hasPassword: InputMaybe; - /** Specific ID of the object */ - readonly id: InputMaybe; - /** Array of IDs for the objects to retrieve */ - readonly in: InputMaybe>>; - /** Get objects with a specific mimeType property */ - readonly mimeType: InputMaybe; - /** Slug / post_name of the object */ - readonly name: InputMaybe; - /** Specify objects to retrieve. Use slugs */ - readonly nameIn: InputMaybe>>; - /** Specify IDs NOT to retrieve. If this is used in the same query as "in", it will be ignored */ - readonly notIn: InputMaybe>>; - /** What paramater to use to order the objects by. */ - readonly orderby: InputMaybe>>; - /** Use ID to return only children. Use 0 to return only top-level items */ - readonly parent: InputMaybe; - /** Specify objects whose parent is in an array */ - readonly parentIn: InputMaybe>>; - /** Specify posts whose parent is not in an array */ - readonly parentNotIn: InputMaybe>>; - /** Show posts with a specific password. */ - readonly password: InputMaybe; - /** Show Posts based on a keyword search */ - readonly search: InputMaybe; - /** Retrieve posts where post status is in an array. */ - readonly stati: InputMaybe>>; - /** Show posts with a specific status. */ - readonly status: InputMaybe; - /** Title of the object */ - readonly title: InputMaybe; -}; - -/** Connection between the tag type and the post type */ -export type GQLTagToPostConnection = { - readonly __typename?: 'TagToPostConnection'; - /** Edges for the TagToPostConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLTagToPostConnectionEdge = { - readonly __typename?: 'TagToPostConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the TagToPostConnection connection */ -export type GQLTagToPostConnectionWhereArgs = { - /** The user that's connected as the author of the object. Use the userId for the author object. */ - readonly author: InputMaybe; - /** Find objects connected to author(s) in the array of author's userIds */ - readonly authorIn: InputMaybe>>; - /** Find objects connected to the author by the author's nicename */ - readonly authorName: InputMaybe; - /** Find objects NOT connected to author(s) in the array of author's userIds */ - readonly authorNotIn: InputMaybe>>; - /** Category ID */ - readonly categoryId: InputMaybe; - /** Array of category IDs, used to display objects from one category OR another */ - readonly categoryIn: InputMaybe>>; - /** Use Category Slug */ - readonly categoryName: InputMaybe; - /** Array of category IDs, used to display objects from one category OR another */ - readonly categoryNotIn: InputMaybe>>; - /** Filter the connection based on dates */ - readonly dateQuery: InputMaybe; - /** True for objects with passwords; False for objects without passwords; null for all objects with or without passwords */ - readonly hasPassword: InputMaybe; - /** Specific ID of the object */ - readonly id: InputMaybe; - /** Array of IDs for the objects to retrieve */ - readonly in: InputMaybe>>; - /** Get objects with a specific mimeType property */ - readonly mimeType: InputMaybe; - /** Slug / post_name of the object */ - readonly name: InputMaybe; - /** Specify objects to retrieve. Use slugs */ - readonly nameIn: InputMaybe>>; - /** Specify IDs NOT to retrieve. If this is used in the same query as "in", it will be ignored */ - readonly notIn: InputMaybe>>; - /** What paramater to use to order the objects by. */ - readonly orderby: InputMaybe>>; - /** Use ID to return only children. Use 0 to return only top-level items */ - readonly parent: InputMaybe; - /** Specify objects whose parent is in an array */ - readonly parentIn: InputMaybe>>; - /** Specify posts whose parent is not in an array */ - readonly parentNotIn: InputMaybe>>; - /** Show posts with a specific password. */ - readonly password: InputMaybe; - /** Show Posts based on a keyword search */ - readonly search: InputMaybe; - /** Retrieve posts where post status is in an array. */ - readonly stati: InputMaybe>>; - /** Show posts with a specific status. */ - readonly status: InputMaybe; - /** Tag Slug */ - readonly tag: InputMaybe; - /** Use Tag ID */ - readonly tagId: InputMaybe; - /** Array of tag IDs, used to display objects from one tag OR another */ - readonly tagIn: InputMaybe>>; - /** Array of tag IDs, used to display objects from one tag OR another */ - readonly tagNotIn: InputMaybe>>; - /** Array of tag slugs, used to display objects from one tag OR another */ - readonly tagSlugAnd: InputMaybe>>; - /** Array of tag slugs, used to exclude objects in specified tags */ - readonly tagSlugIn: InputMaybe>>; - /** Title of the object */ - readonly title: InputMaybe; -}; - -/** Connection between the tag type and the Taxonomy type */ -export type GQLTagToTaxonomyConnectionEdge = { - readonly __typename?: 'TagToTaxonomyConnectionEdge'; - /** The node of the connection, without the edges */ - readonly node: Maybe; -}; - -/** A taxonomy object */ -export type GQLTaxonomy = GQLNode & { - readonly __typename?: 'Taxonomy'; - /** List of Content Types associated with the Taxonomy */ - readonly connectedContentTypes: Maybe; - /** Description of the taxonomy. This field is equivalent to WP_Taxonomy->description */ - readonly description: Maybe; - /** The plural name of the post type within the GraphQL Schema. */ - readonly graphqlPluralName: Maybe; - /** The singular name of the post type within the GraphQL Schema. */ - readonly graphqlSingleName: Maybe; - /** Whether the taxonomy is hierarchical */ - readonly hierarchical: Maybe; - /** The globally unique identifier of the taxonomy object. */ - readonly id: Scalars['ID']; - /** Whether the object is restricted from the current viewer */ - readonly isRestricted: Maybe; - /** Name of the taxonomy shown in the menu. Usually plural. */ - readonly label: Maybe; - /** The display name of the taxonomy. This field is equivalent to WP_Taxonomy->label */ - readonly name: Maybe; - /** Whether the taxonomy is publicly queryable */ - readonly public: Maybe; - /** Name of content type to diplay in REST API "wp/v2" namespace. */ - readonly restBase: Maybe; - /** The REST Controller class assigned to handling this content type. */ - readonly restControllerClass: Maybe; - /** Whether to show the taxonomy as part of a tag cloud widget. This field is equivalent to WP_Taxonomy->show_tagcloud */ - readonly showCloud: Maybe; - /** Whether to display a column for the taxonomy on its post type listing screens. */ - readonly showInAdminColumn: Maybe; - /** Whether to add the post type to the GraphQL Schema. */ - readonly showInGraphql: Maybe; - /** Whether to show the taxonomy in the admin menu */ - readonly showInMenu: Maybe; - /** Whether the taxonomy is available for selection in navigation menus. */ - readonly showInNavMenus: Maybe; - /** Whether to show the taxonomy in the quick/bulk edit panel. */ - readonly showInQuickEdit: Maybe; - /** Whether to add the post type route in the REST API "wp/v2" namespace. */ - readonly showInRest: Maybe; - /** Whether to generate and allow a UI for managing terms in this taxonomy in the admin */ - readonly showUi: Maybe; -}; - - -/** A taxonomy object */ -export type GQLTaxonomyConnectedContentTypesArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - -/** Allowed taxonomies */ -export enum GQLTaxonomyEnum { - /** Taxonomy enum category */ - Category = 'CATEGORY', - /** Taxonomy enum post_format */ - Postformat = 'POSTFORMAT', - /** Taxonomy enum post_tag */ - Tag = 'TAG', - /** Taxonomy enum technology */ - Technology = 'TECHNOLOGY' -} - -/** The Type of Identifier used to fetch a single Taxonomy node. To be used along with the "id" field. Default is "ID". */ -export enum GQLTaxonomyIdTypeEnum { - /** The globally unique ID */ - Id = 'ID', - /** The name of the taxonomy */ - Name = 'NAME' -} - -/** Connection between the Taxonomy type and the ContentType type */ -export type GQLTaxonomyToContentTypeConnection = { - readonly __typename?: 'TaxonomyToContentTypeConnection'; - /** Edges for the TaxonomyToContentTypeConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLTaxonomyToContentTypeConnectionEdge = { - readonly __typename?: 'TaxonomyToContentTypeConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** The Technology type */ -export type GQLTechnology = GQLDatabaseIdentifier & GQLMenuItemLinkable & GQLNode & GQLTermNode & GQLUniformResourceIdentifiable & { - readonly __typename?: 'Technology'; - /** Connection between the Technology type and the ContentNode type */ - readonly contentNodes: Maybe; - /** The number of objects connected to the object */ - readonly count: Maybe; - /** The unique resource identifier path */ - readonly databaseId: Scalars['Int']; - /** The description of the object */ - readonly description: Maybe; - /** Connection between the TermNode type and the EnqueuedScript type */ - readonly enqueuedScripts: Maybe; - /** Connection between the TermNode type and the EnqueuedStylesheet type */ - readonly enqueuedStylesheets: Maybe; - /** The unique resource identifier path */ - readonly id: Scalars['ID']; - /** Whether the node is a Content Node */ - readonly isContentNode: Scalars['Boolean']; - /** Whether the object is restricted from the current viewer */ - readonly isRestricted: Maybe; - /** Whether the node is a Term */ - readonly isTermNode: Scalars['Boolean']; - /** The link to the term */ - readonly link: Maybe; - /** The human friendly name of the object. */ - readonly name: Maybe; - /** Connection between the Technology type and the Project type */ - readonly projects: Maybe; - /** An alphanumeric identifier for the object unique to its type. */ - readonly slug: Maybe; - /** Connection between the Technology type and the Taxonomy type */ - readonly taxonomy: Maybe; - /** The name of the taxonomy that the object is associated with */ - readonly taxonomyName: Maybe; - /** - * The id field matches the WP_Post->ID field. - * @deprecated Deprecated in favor of databaseId - */ - readonly technologyId: Maybe; - /** The ID of the term group that this term object belongs to */ - readonly termGroupId: Maybe; - /** The taxonomy ID that the object is associated with */ - readonly termTaxonomyId: Maybe; - /** The unique resource identifier path */ - readonly uri: Maybe; - /** Connection between the Technology type and the Work type */ - readonly works: Maybe; -}; - - -/** The Technology type */ -export type GQLTechnologyContentNodesArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The Technology type */ -export type GQLTechnologyEnqueuedScriptsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - - -/** The Technology type */ -export type GQLTechnologyEnqueuedStylesheetsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - - -/** The Technology type */ -export type GQLTechnologyProjectsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The Technology type */ -export type GQLTechnologyWorksArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - -/** The Type of Identifier used to fetch a single resource. Default is ID. */ -export enum GQLTechnologyIdType { - /** The Database ID for the node */ - DatabaseId = 'DATABASE_ID', - /** The hashed Global ID */ - Id = 'ID', - /** The name of the node */ - Name = 'NAME', - /** Url friendly name of the node */ - Slug = 'SLUG', - /** The URI for the node */ - Uri = 'URI' -} - -/** Connection between the Technology type and the ContentNode type */ -export type GQLTechnologyToContentNodeConnection = { - readonly __typename?: 'TechnologyToContentNodeConnection'; - /** Edges for the TechnologyToContentNodeConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLTechnologyToContentNodeConnectionEdge = { - readonly __typename?: 'TechnologyToContentNodeConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the TechnologyToContentNodeConnection connection */ -export type GQLTechnologyToContentNodeConnectionWhereArgs = { - /** The Types of content to filter */ - readonly contentTypes: InputMaybe>>; - /** Filter the connection based on dates */ - readonly dateQuery: InputMaybe; - /** True for objects with passwords; False for objects without passwords; null for all objects with or without passwords */ - readonly hasPassword: InputMaybe; - /** Specific ID of the object */ - readonly id: InputMaybe; - /** Array of IDs for the objects to retrieve */ - readonly in: InputMaybe>>; - /** Get objects with a specific mimeType property */ - readonly mimeType: InputMaybe; - /** Slug / post_name of the object */ - readonly name: InputMaybe; - /** Specify objects to retrieve. Use slugs */ - readonly nameIn: InputMaybe>>; - /** Specify IDs NOT to retrieve. If this is used in the same query as "in", it will be ignored */ - readonly notIn: InputMaybe>>; - /** What paramater to use to order the objects by. */ - readonly orderby: InputMaybe>>; - /** Use ID to return only children. Use 0 to return only top-level items */ - readonly parent: InputMaybe; - /** Specify objects whose parent is in an array */ - readonly parentIn: InputMaybe>>; - /** Specify posts whose parent is not in an array */ - readonly parentNotIn: InputMaybe>>; - /** Show posts with a specific password. */ - readonly password: InputMaybe; - /** Show Posts based on a keyword search */ - readonly search: InputMaybe; - /** Retrieve posts where post status is in an array. */ - readonly stati: InputMaybe>>; - /** Show posts with a specific status. */ - readonly status: InputMaybe; - /** Title of the object */ - readonly title: InputMaybe; -}; - -/** Connection between the Technology type and the Project type */ -export type GQLTechnologyToProjectConnection = { - readonly __typename?: 'TechnologyToProjectConnection'; - /** Edges for the TechnologyToProjectConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLTechnologyToProjectConnectionEdge = { - readonly __typename?: 'TechnologyToProjectConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the TechnologyToProjectConnection connection */ -export type GQLTechnologyToProjectConnectionWhereArgs = { - /** Filter the connection based on dates */ - readonly dateQuery: InputMaybe; - /** True for objects with passwords; False for objects without passwords; null for all objects with or without passwords */ - readonly hasPassword: InputMaybe; - /** Specific ID of the object */ - readonly id: InputMaybe; - /** Array of IDs for the objects to retrieve */ - readonly in: InputMaybe>>; - /** Get objects with a specific mimeType property */ - readonly mimeType: InputMaybe; - /** Slug / post_name of the object */ - readonly name: InputMaybe; - /** Specify objects to retrieve. Use slugs */ - readonly nameIn: InputMaybe>>; - /** Specify IDs NOT to retrieve. If this is used in the same query as "in", it will be ignored */ - readonly notIn: InputMaybe>>; - /** What paramater to use to order the objects by. */ - readonly orderby: InputMaybe>>; - /** Use ID to return only children. Use 0 to return only top-level items */ - readonly parent: InputMaybe; - /** Specify objects whose parent is in an array */ - readonly parentIn: InputMaybe>>; - /** Specify posts whose parent is not in an array */ - readonly parentNotIn: InputMaybe>>; - /** Show posts with a specific password. */ - readonly password: InputMaybe; - /** Show Posts based on a keyword search */ - readonly search: InputMaybe; - /** Retrieve posts where post status is in an array. */ - readonly stati: InputMaybe>>; - /** Show posts with a specific status. */ - readonly status: InputMaybe; - /** Title of the object */ - readonly title: InputMaybe; -}; - -/** Connection between the Technology type and the Taxonomy type */ -export type GQLTechnologyToTaxonomyConnectionEdge = { - readonly __typename?: 'TechnologyToTaxonomyConnectionEdge'; - /** The node of the connection, without the edges */ - readonly node: Maybe; -}; - -/** Connection between the Technology type and the Work type */ -export type GQLTechnologyToWorkConnection = { - readonly __typename?: 'TechnologyToWorkConnection'; - /** Edges for the TechnologyToWorkConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLTechnologyToWorkConnectionEdge = { - readonly __typename?: 'TechnologyToWorkConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the TechnologyToWorkConnection connection */ -export type GQLTechnologyToWorkConnectionWhereArgs = { - /** Filter the connection based on dates */ - readonly dateQuery: InputMaybe; - /** True for objects with passwords; False for objects without passwords; null for all objects with or without passwords */ - readonly hasPassword: InputMaybe; - /** Specific ID of the object */ - readonly id: InputMaybe; - /** Array of IDs for the objects to retrieve */ - readonly in: InputMaybe>>; - /** Get objects with a specific mimeType property */ - readonly mimeType: InputMaybe; - /** Slug / post_name of the object */ - readonly name: InputMaybe; - /** Specify objects to retrieve. Use slugs */ - readonly nameIn: InputMaybe>>; - /** Specify IDs NOT to retrieve. If this is used in the same query as "in", it will be ignored */ - readonly notIn: InputMaybe>>; - /** What paramater to use to order the objects by. */ - readonly orderby: InputMaybe>>; - /** Use ID to return only children. Use 0 to return only top-level items */ - readonly parent: InputMaybe; - /** Specify objects whose parent is in an array */ - readonly parentIn: InputMaybe>>; - /** Specify posts whose parent is not in an array */ - readonly parentNotIn: InputMaybe>>; - /** Show posts with a specific password. */ - readonly password: InputMaybe; - /** Show Posts based on a keyword search */ - readonly search: InputMaybe; - /** Retrieve posts where post status is in an array. */ - readonly stati: InputMaybe>>; - /** Show posts with a specific status. */ - readonly status: InputMaybe; - /** Title of the object */ - readonly title: InputMaybe; -}; - -/** Terms are nodes within a Taxonomy, used to group and relate other nodes. */ -export type GQLTermNode = { - /** The number of objects connected to the object */ - readonly count: Maybe; - /** Identifies the primary key from the database. */ - readonly databaseId: Scalars['Int']; - /** The description of the object */ - readonly description: Maybe; - /** Connection between the TermNode type and the EnqueuedScript type */ - readonly enqueuedScripts: Maybe; - /** Connection between the TermNode type and the EnqueuedStylesheet type */ - readonly enqueuedStylesheets: Maybe; - /** The unique resource identifier path */ - readonly id: Scalars['ID']; - /** Whether the node is a Content Node */ - readonly isContentNode: Scalars['Boolean']; - /** Whether the object is restricted from the current viewer */ - readonly isRestricted: Maybe; - /** Whether the node is a Term */ - readonly isTermNode: Scalars['Boolean']; - /** The link to the term */ - readonly link: Maybe; - /** The human friendly name of the object. */ - readonly name: Maybe; - /** An alphanumeric identifier for the object unique to its type. */ - readonly slug: Maybe; - /** The name of the taxonomy that the object is associated with */ - readonly taxonomyName: Maybe; - /** The ID of the term group that this term object belongs to */ - readonly termGroupId: Maybe; - /** The taxonomy ID that the object is associated with */ - readonly termTaxonomyId: Maybe; - /** The unique resource identifier path */ - readonly uri: Maybe; -}; - - -/** Terms are nodes within a Taxonomy, used to group and relate other nodes. */ -export type GQLTermNodeEnqueuedScriptsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - - -/** Terms are nodes within a Taxonomy, used to group and relate other nodes. */ -export type GQLTermNodeEnqueuedStylesheetsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - -/** The Type of Identifier used to fetch a single resource. Default is "ID". To be used along with the "id" field. */ -export enum GQLTermNodeIdTypeEnum { - /** The Database ID for the node */ - DatabaseId = 'DATABASE_ID', - /** The hashed Global ID */ - Id = 'ID', - /** The name of the node */ - Name = 'NAME', - /** Url friendly name of the node */ - Slug = 'SLUG', - /** The URI for the node */ - Uri = 'URI' -} - -/** Connection between the TermNode type and the EnqueuedScript type */ -export type GQLTermNodeToEnqueuedScriptConnection = { - readonly __typename?: 'TermNodeToEnqueuedScriptConnection'; - /** Edges for the TermNodeToEnqueuedScriptConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLTermNodeToEnqueuedScriptConnectionEdge = { - readonly __typename?: 'TermNodeToEnqueuedScriptConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Connection between the TermNode type and the EnqueuedStylesheet type */ -export type GQLTermNodeToEnqueuedStylesheetConnection = { - readonly __typename?: 'TermNodeToEnqueuedStylesheetConnection'; - /** Edges for the TermNodeToEnqueuedStylesheetConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLTermNodeToEnqueuedStylesheetConnectionEdge = { - readonly __typename?: 'TermNodeToEnqueuedStylesheetConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Options for ordering the connection by */ -export enum GQLTermObjectsConnectionOrderbyEnum { - /** Order the connection by item count. */ - Count = 'COUNT', - /** Order the connection by description. */ - Description = 'DESCRIPTION', - /** Order the connection by name. */ - Name = 'NAME', - /** Order the connection by slug. */ - Slug = 'SLUG', - /** Order the connection by term group. */ - TermGroup = 'TERM_GROUP', - /** Order the connection by term id. */ - TermId = 'TERM_ID', - /** Order the connection by term order. */ - TermOrder = 'TERM_ORDER' -} - -/** A theme object */ -export type GQLTheme = GQLNode & { - readonly __typename?: 'Theme'; - /** Name of the theme author(s), could also be a company name. This field is equivalent to WP_Theme->get( "Author" ). */ - readonly author: Maybe; - /** URI for the author/company website. This field is equivalent to WP_Theme->get( "AuthorURI" ). */ - readonly authorUri: Maybe; - /** The description of the theme. This field is equivalent to WP_Theme->get( "Description" ). */ - readonly description: Maybe; - /** The globally unique identifier of the theme object. */ - readonly id: Scalars['ID']; - /** Whether the object is restricted from the current viewer */ - readonly isRestricted: Maybe; - /** Display name of the theme. This field is equivalent to WP_Theme->get( "Name" ). */ - readonly name: Maybe; - /** The URL of the screenshot for the theme. The screenshot is intended to give an overview of what the theme looks like. This field is equivalent to WP_Theme->get_screenshot(). */ - readonly screenshot: Maybe; - /** The theme slug is used to internally match themes. Theme slugs can have subdirectories like: my-theme/sub-theme. This field is equivalent to WP_Theme->get_stylesheet(). */ - readonly slug: Maybe; - /** URI for the author/company website. This field is equivalent to WP_Theme->get( "Tags" ). */ - readonly tags: Maybe>>; - /** A URI if the theme has a website associated with it. The Theme URI is handy for directing users to a theme site for support etc. This field is equivalent to WP_Theme->get( "ThemeURI" ). */ - readonly themeUri: Maybe; - /** The current version of the theme. This field is equivalent to WP_Theme->get( "Version" ). */ - readonly version: Maybe; -}; - -/** Any node that has a URI */ -export type GQLUniformResourceIdentifiable = { - /** The unique resource identifier path */ - readonly id: Scalars['ID']; - /** Whether the node is a Content Node */ - readonly isContentNode: Scalars['Boolean']; - /** Whether the node is a Term */ - readonly isTermNode: Scalars['Boolean']; - /** The unique resource identifier path */ - readonly uri: Maybe; -}; - -/** Input for the UpdateCategory mutation */ -export type GQLUpdateCategoryInput = { - /** The slug that the category will be an alias of */ - readonly aliasOf: InputMaybe; - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** The description of the category object */ - readonly description: InputMaybe; - /** The ID of the category object to update */ - readonly id: Scalars['ID']; - /** The name of the category object to mutate */ - readonly name: InputMaybe; - /** The ID of the category that should be set as the parent */ - readonly parentId: InputMaybe; - /** If this argument exists then the slug will be checked to see if it is not an existing valid term. If that check succeeds (it is not a valid term), then it is added and the term id is given. If it fails, then a check is made to whether the taxonomy is hierarchical and the parent argument is not empty. If the second check succeeds, the term will be inserted and the term id will be given. If the slug argument is empty, then it will be calculated from the term name. */ - readonly slug: InputMaybe; -}; - -/** The payload for the UpdateCategory mutation */ -export type GQLUpdateCategoryPayload = { - readonly __typename?: 'UpdateCategoryPayload'; - /** The created category */ - readonly category: Maybe; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; -}; - -/** Input for the updateComment mutation */ -export type GQLUpdateCommentInput = { - /** The approval status of the comment. */ - readonly approved: InputMaybe; - /** The name of the comment's author. */ - readonly author: InputMaybe; - /** The email of the comment's author. */ - readonly authorEmail: InputMaybe; - /** The url of the comment's author. */ - readonly authorUrl: InputMaybe; - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** The ID of the post object the comment belongs to. */ - readonly commentOn: InputMaybe; - /** Content of the comment. */ - readonly content: InputMaybe; - /** The date of the object. Preferable to enter as year/month/day ( e.g. 01/31/2017 ) as it will rearrange date as fit if it is not specified. Incomplete dates may have unintended results for example, "2017" as the input will use current date with timestamp 20:17 */ - readonly date: InputMaybe; - /** The ID of the comment being updated. */ - readonly id: Scalars['ID']; - /** Parent comment of current comment. */ - readonly parent: InputMaybe; - /** Type of comment. */ - readonly type: InputMaybe; -}; - -/** The payload for the updateComment mutation */ -export type GQLUpdateCommentPayload = { - readonly __typename?: 'UpdateCommentPayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The comment that was created */ - readonly comment: Maybe; - /** Whether the mutation succeeded. If the comment is not approved, the server will not return the comment to a non authenticated user, but a success message can be returned if the create succeeded, and the client can optimistically add the comment to the client cache */ - readonly success: Maybe; -}; - -/** Input for the updateMediaItem mutation */ -export type GQLUpdateMediaItemInput = { - /** Alternative text to display when mediaItem is not displayed */ - readonly altText: InputMaybe; - /** The userId to assign as the author of the mediaItem */ - readonly authorId: InputMaybe; - /** The caption for the mediaItem */ - readonly caption: InputMaybe; - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** The comment status for the mediaItem */ - readonly commentStatus: InputMaybe; - /** The date of the mediaItem */ - readonly date: InputMaybe; - /** The date (in GMT zone) of the mediaItem */ - readonly dateGmt: InputMaybe; - /** Description of the mediaItem */ - readonly description: InputMaybe; - /** The file name of the mediaItem */ - readonly filePath: InputMaybe; - /** The file type of the mediaItem */ - readonly fileType: InputMaybe; - /** The ID of the mediaItem object */ - readonly id: Scalars['ID']; - /** The WordPress post ID or the graphQL postId of the parent object */ - readonly parentId: InputMaybe; - /** The ping status for the mediaItem */ - readonly pingStatus: InputMaybe; - /** The slug of the mediaItem */ - readonly slug: InputMaybe; - /** The status of the mediaItem */ - readonly status: InputMaybe; - /** The title of the mediaItem */ - readonly title: InputMaybe; -}; - -/** The payload for the updateMediaItem mutation */ -export type GQLUpdateMediaItemPayload = { - readonly __typename?: 'UpdateMediaItemPayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The MediaItem object mutation type. */ - readonly mediaItem: Maybe; -}; - -/** Input for the updatePage mutation */ -export type GQLUpdatePageInput = { - /** The userId to assign as the author of the object */ - readonly authorId: InputMaybe; - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** The comment status for the object */ - readonly commentStatus: InputMaybe; - /** The content of the object */ - readonly content: InputMaybe; - /** The date of the object. Preferable to enter as year/month/day (e.g. 01/31/2017) as it will rearrange date as fit if it is not specified. Incomplete dates may have unintended results for example, "2017" as the input will use current date with timestamp 20:17 */ - readonly date: InputMaybe; - /** The ID of the page object */ - readonly id: Scalars['ID']; - /** A field used for ordering posts. This is typically used with nav menu items or for special ordering of hierarchical content types. */ - readonly menuOrder: InputMaybe; - /** The ID of the parent object */ - readonly parentId: InputMaybe; - /** The password used to protect the content of the object */ - readonly password: InputMaybe; - /** The slug of the object */ - readonly slug: InputMaybe; - /** The status of the object */ - readonly status: InputMaybe; - /** The title of the object */ - readonly title: InputMaybe; -}; - -/** The payload for the updatePage mutation */ -export type GQLUpdatePagePayload = { - readonly __typename?: 'UpdatePagePayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The Post object mutation type. */ - readonly page: Maybe; -}; - -/** Input for the UpdatePostFormat mutation */ -export type GQLUpdatePostFormatInput = { - /** The slug that the post_format will be an alias of */ - readonly aliasOf: InputMaybe; - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** The description of the post_format object */ - readonly description: InputMaybe; - /** The ID of the postFormat object to update */ - readonly id: Scalars['ID']; - /** The name of the post_format object to mutate */ - readonly name: InputMaybe; - /** If this argument exists then the slug will be checked to see if it is not an existing valid term. If that check succeeds (it is not a valid term), then it is added and the term id is given. If it fails, then a check is made to whether the taxonomy is hierarchical and the parent argument is not empty. If the second check succeeds, the term will be inserted and the term id will be given. If the slug argument is empty, then it will be calculated from the term name. */ - readonly slug: InputMaybe; -}; - -/** The payload for the UpdatePostFormat mutation */ -export type GQLUpdatePostFormatPayload = { - readonly __typename?: 'UpdatePostFormatPayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The created post_format */ - readonly postFormat: Maybe; -}; - -/** Input for the updatePost mutation */ -export type GQLUpdatePostInput = { - /** The userId to assign as the author of the object */ - readonly authorId: InputMaybe; - /** Set connections between the post and categories */ - readonly categories: InputMaybe; - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** The comment status for the object */ - readonly commentStatus: InputMaybe; - /** The content of the object */ - readonly content: InputMaybe; - /** The date of the object. Preferable to enter as year/month/day (e.g. 01/31/2017) as it will rearrange date as fit if it is not specified. Incomplete dates may have unintended results for example, "2017" as the input will use current date with timestamp 20:17 */ - readonly date: InputMaybe; - /** The excerpt of the object */ - readonly excerpt: InputMaybe; - /** The ID of the post object */ - readonly id: Scalars['ID']; - /** A field used for ordering posts. This is typically used with nav menu items or for special ordering of hierarchical content types. */ - readonly menuOrder: InputMaybe; - /** The password used to protect the content of the object */ - readonly password: InputMaybe; - /** The ping status for the object */ - readonly pingStatus: InputMaybe; - /** URLs that have been pinged. */ - readonly pinged: InputMaybe>>; - /** Set connections between the post and postFormats */ - readonly postFormats: InputMaybe; - /** The slug of the object */ - readonly slug: InputMaybe; - /** The status of the object */ - readonly status: InputMaybe; - /** Set connections between the post and tags */ - readonly tags: InputMaybe; - /** The title of the object */ - readonly title: InputMaybe; - /** URLs queued to be pinged. */ - readonly toPing: InputMaybe>>; -}; - -/** The payload for the updatePost mutation */ -export type GQLUpdatePostPayload = { - readonly __typename?: 'UpdatePostPayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The Post object mutation type. */ - readonly post: Maybe; -}; - -/** Input for the updateProject mutation */ -export type GQLUpdateProjectInput = { - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** The content of the object */ - readonly content: InputMaybe; - /** The date of the object. Preferable to enter as year/month/day (e.g. 01/31/2017) as it will rearrange date as fit if it is not specified. Incomplete dates may have unintended results for example, "2017" as the input will use current date with timestamp 20:17 */ - readonly date: InputMaybe; - /** The ID of the Project object */ - readonly id: Scalars['ID']; - /** A field used for ordering posts. This is typically used with nav menu items or for special ordering of hierarchical content types. */ - readonly menuOrder: InputMaybe; - /** The password used to protect the content of the object */ - readonly password: InputMaybe; - /** The slug of the object */ - readonly slug: InputMaybe; - /** The status of the object */ - readonly status: InputMaybe; - /** Set connections between the Project and Technologies */ - readonly technologies: InputMaybe; - /** The title of the object */ - readonly title: InputMaybe; -}; - -/** The payload for the updateProject mutation */ -export type GQLUpdateProjectPayload = { - readonly __typename?: 'UpdateProjectPayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The Post object mutation type. */ - readonly project: Maybe; -}; - -/** Input for the updateSettings mutation */ -export type GQLUpdateSettingsInput = { - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** Allow people to submit comments on new posts. */ - readonly discussionSettingsDefaultCommentStatus: InputMaybe; - /** Allow link notifications from other blogs (pingbacks and trackbacks) on new articles. */ - readonly discussionSettingsDefaultPingStatus: InputMaybe; - /** A date format for all date strings. */ - readonly generalSettingsDateFormat: InputMaybe; - /** Site tagline. */ - readonly generalSettingsDescription: InputMaybe; - /** This address is used for admin purposes, like new user notification. */ - readonly generalSettingsEmail: InputMaybe; - /** WordPress locale code. */ - readonly generalSettingsLanguage: InputMaybe; - /** A day number of the week that the week should start on. */ - readonly generalSettingsStartOfWeek: InputMaybe; - /** A time format for all time strings. */ - readonly generalSettingsTimeFormat: InputMaybe; - /** A city in the same timezone as you. */ - readonly generalSettingsTimezone: InputMaybe; - /** Site title. */ - readonly generalSettingsTitle: InputMaybe; - /** Site URL. */ - readonly generalSettingsUrl: InputMaybe; - /** Blog pages show at most. */ - readonly readingSettingsPostsPerPage: InputMaybe; - /** Default post category. */ - readonly writingSettingsDefaultCategory: InputMaybe; - /** Default post format. */ - readonly writingSettingsDefaultPostFormat: InputMaybe; - /** Convert emoticons like :-) and :-P to graphics on display. */ - readonly writingSettingsUseSmilies: InputMaybe; -}; - -/** The payload for the updateSettings mutation */ -export type GQLUpdateSettingsPayload = { - readonly __typename?: 'UpdateSettingsPayload'; - /** Update all settings. */ - readonly allSettings: Maybe; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** Update the DiscussionSettings setting. */ - readonly discussionSettings: Maybe; - /** Update the GeneralSettings setting. */ - readonly generalSettings: Maybe; - /** Update the ReadingSettings setting. */ - readonly readingSettings: Maybe; - /** Update the WritingSettings setting. */ - readonly writingSettings: Maybe; -}; - -/** Input for the UpdateTag mutation */ -export type GQLUpdateTagInput = { - /** The slug that the post_tag will be an alias of */ - readonly aliasOf: InputMaybe; - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** The description of the post_tag object */ - readonly description: InputMaybe; - /** The ID of the tag object to update */ - readonly id: Scalars['ID']; - /** The name of the post_tag object to mutate */ - readonly name: InputMaybe; - /** If this argument exists then the slug will be checked to see if it is not an existing valid term. If that check succeeds (it is not a valid term), then it is added and the term id is given. If it fails, then a check is made to whether the taxonomy is hierarchical and the parent argument is not empty. If the second check succeeds, the term will be inserted and the term id will be given. If the slug argument is empty, then it will be calculated from the term name. */ - readonly slug: InputMaybe; -}; - -/** The payload for the UpdateTag mutation */ -export type GQLUpdateTagPayload = { - readonly __typename?: 'UpdateTagPayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The created post_tag */ - readonly tag: Maybe; -}; - -/** Input for the UpdateTechnology mutation */ -export type GQLUpdateTechnologyInput = { - /** The slug that the technology will be an alias of */ - readonly aliasOf: InputMaybe; - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** The description of the technology object */ - readonly description: InputMaybe; - /** The ID of the Technology object to update */ - readonly id: Scalars['ID']; - /** The name of the technology object to mutate */ - readonly name: InputMaybe; - /** If this argument exists then the slug will be checked to see if it is not an existing valid term. If that check succeeds (it is not a valid term), then it is added and the term id is given. If it fails, then a check is made to whether the taxonomy is hierarchical and the parent argument is not empty. If the second check succeeds, the term will be inserted and the term id will be given. If the slug argument is empty, then it will be calculated from the term name. */ - readonly slug: InputMaybe; -}; - -/** The payload for the UpdateTechnology mutation */ -export type GQLUpdateTechnologyPayload = { - readonly __typename?: 'UpdateTechnologyPayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The created technology */ - readonly technology: Maybe; -}; - -/** Input for the updateUser mutation */ -export type GQLUpdateUserInput = { - /** User's AOL IM account. */ - readonly aim: InputMaybe; - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** A string containing content about the user. */ - readonly description: InputMaybe; - /** A string that will be shown on the site. Defaults to user's username. It is likely that you will want to change this, for both appearance and security through obscurity (that is if you dont use and delete the default admin user). */ - readonly displayName: InputMaybe; - /** A string containing the user's email address. */ - readonly email: InputMaybe; - /** The user's first name. */ - readonly firstName: InputMaybe; - /** The ID of the user */ - readonly id: Scalars['ID']; - /** User's Jabber account. */ - readonly jabber: InputMaybe; - /** The user's last name. */ - readonly lastName: InputMaybe; - /** User's locale. */ - readonly locale: InputMaybe; - /** A string that contains a URL-friendly name for the user. The default is the user's username. */ - readonly nicename: InputMaybe; - /** The user's nickname, defaults to the user's username. */ - readonly nickname: InputMaybe; - /** A string that contains the plain text password for the user. */ - readonly password: InputMaybe; - /** The date the user registered. Format is Y-m-d H:i:s. */ - readonly registered: InputMaybe; - /** A string for whether to enable the rich editor or not. False if not empty. */ - readonly richEditing: InputMaybe; - /** An array of roles to be assigned to the user. */ - readonly roles: InputMaybe>>; - /** A string containing the user's URL for the user's web site. */ - readonly websiteUrl: InputMaybe; - /** User's Yahoo IM account. */ - readonly yim: InputMaybe; -}; - -/** The payload for the updateUser mutation */ -export type GQLUpdateUserPayload = { - readonly __typename?: 'UpdateUserPayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The User object mutation type. */ - readonly user: Maybe; -}; - -/** Input for the updateWork mutation */ -export type GQLUpdateWorkInput = { - /** This is an ID that can be passed to a mutation by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: InputMaybe; - /** The content of the object */ - readonly content: InputMaybe; - /** The date of the object. Preferable to enter as year/month/day (e.g. 01/31/2017) as it will rearrange date as fit if it is not specified. Incomplete dates may have unintended results for example, "2017" as the input will use current date with timestamp 20:17 */ - readonly date: InputMaybe; - /** The ID of the Work object */ - readonly id: Scalars['ID']; - /** A field used for ordering posts. This is typically used with nav menu items or for special ordering of hierarchical content types. */ - readonly menuOrder: InputMaybe; - /** The password used to protect the content of the object */ - readonly password: InputMaybe; - /** The slug of the object */ - readonly slug: InputMaybe; - /** The status of the object */ - readonly status: InputMaybe; - /** Set connections between the Work and Technologies */ - readonly technologies: InputMaybe; - /** The title of the object */ - readonly title: InputMaybe; -}; - -/** The payload for the updateWork mutation */ -export type GQLUpdateWorkPayload = { - readonly __typename?: 'UpdateWorkPayload'; - /** If a 'clientMutationId' input is provided to the mutation, it will be returned as output on the mutation. This ID can be used by the client to track the progress of mutations and catch possible duplicate mutation submissions. */ - readonly clientMutationId: Maybe; - /** The Post object mutation type. */ - readonly work: Maybe; -}; - -/** A User object */ -export type GQLUser = GQLCommenter & GQLDatabaseIdentifier & GQLNode & GQLUniformResourceIdentifiable & { - readonly __typename?: 'User'; - /** Avatar object for user. The avatar object can be retrieved in different sizes by specifying the size argument. */ - readonly avatar: Maybe; - /** User metadata option name. Usually it will be "wp_capabilities". */ - readonly capKey: Maybe; - /** A list of capabilities (permissions) granted to the user */ - readonly capabilities: Maybe>>; - /** Connection between the User type and the Comment type */ - readonly comments: Maybe; - /** Identifies the primary key from the database. */ - readonly databaseId: Scalars['Int']; - /** Description of the user. */ - readonly description: Maybe; - /** Email address of the user. This is equivalent to the WP_User->user_email property. */ - readonly email: Maybe; - /** Connection between the User type and the EnqueuedScript type */ - readonly enqueuedScripts: Maybe; - /** Connection between the User type and the EnqueuedStylesheet type */ - readonly enqueuedStylesheets: Maybe; - /** A complete list of capabilities including capabilities inherited from a role. This is equivalent to the array keys of WP_User->allcaps. */ - readonly extraCapabilities: Maybe>>; - /** First name of the user. This is equivalent to the WP_User->user_first_name property. */ - readonly firstName: Maybe; - /** The globally unique identifier for the user object. */ - readonly id: Scalars['ID']; - /** Whether the node is a Content Node */ - readonly isContentNode: Scalars['Boolean']; - /** Whether the object is restricted from the current viewer */ - readonly isRestricted: Maybe; - /** Whether the node is a Term */ - readonly isTermNode: Scalars['Boolean']; - /** Last name of the user. This is equivalent to the WP_User->user_last_name property. */ - readonly lastName: Maybe; - /** The preferred language locale set for the user. Value derived from get_user_locale(). */ - readonly locale: Maybe; - /** Connection between the User type and the mediaItem type */ - readonly mediaItems: Maybe; - /** Display name of the user. This is equivalent to the WP_User->dispaly_name property. */ - readonly name: Maybe; - /** The nicename for the user. This field is equivalent to WP_User->user_nicename */ - readonly nicename: Maybe; - /** Nickname of the user. */ - readonly nickname: Maybe; - /** Connection between the User type and the page type */ - readonly pages: Maybe; - /** Connection between the User type and the post type */ - readonly posts: Maybe; - /** The date the user registered or was created. The field follows a full ISO8601 date string format. */ - readonly registeredDate: Maybe; - /** Connection between the User and Revisions authored by the user */ - readonly revisions: Maybe; - /** Connection between the User type and the UserRole type */ - readonly roles: Maybe; - /** The slug for the user. This field is equivalent to WP_User->user_nicename */ - readonly slug: Maybe; - /** The unique resource identifier path */ - readonly uri: Maybe; - /** A website url that is associated with the user. */ - readonly url: Maybe; - /** - * The Id of the user. Equivalent to WP_User->ID - * @deprecated Deprecated in favor of the databaseId field - */ - readonly userId: Maybe; - /** Username for the user. This field is equivalent to WP_User->user_login. */ - readonly username: Maybe; -}; - - -/** A User object */ -export type GQLUserAvatarArgs = { - forceDefault: InputMaybe; - rating: InputMaybe; - size?: InputMaybe; -}; - - -/** A User object */ -export type GQLUserCommentsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** A User object */ -export type GQLUserEnqueuedScriptsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - - -/** A User object */ -export type GQLUserEnqueuedStylesheetsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - - -/** A User object */ -export type GQLUserMediaItemsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** A User object */ -export type GQLUserPagesArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** A User object */ -export type GQLUserPostsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** A User object */ -export type GQLUserRevisionsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** A User object */ -export type GQLUserRolesArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - -/** The Type of Identifier used to fetch a single User node. To be used along with the "id" field. Default is "ID". */ -export enum GQLUserNodeIdTypeEnum { - /** The Database ID for the node */ - DatabaseId = 'DATABASE_ID', - /** The Email of the User */ - Email = 'EMAIL', - /** The hashed Global ID */ - Id = 'ID', - /** The slug of the User */ - Slug = 'SLUG', - /** The URI for the node */ - Uri = 'URI', - /** The username the User uses to login with */ - Username = 'USERNAME' -} - -/** A user role object */ -export type GQLUserRole = GQLNode & { - readonly __typename?: 'UserRole'; - /** The capabilities that belong to this role */ - readonly capabilities: Maybe>>; - /** The display name of the role */ - readonly displayName: Maybe; - /** The globally unique identifier for the user role object. */ - readonly id: Scalars['ID']; - /** Whether the object is restricted from the current viewer */ - readonly isRestricted: Maybe; - /** The registered name of the role */ - readonly name: Maybe; -}; - -/** Names of available user roles */ -export enum GQLUserRoleEnum { - /** User role with specific capabilities */ - Administrator = 'ADMINISTRATOR', - /** User role with specific capabilities */ - Author = 'AUTHOR', - /** User role with specific capabilities */ - Contributor = 'CONTRIBUTOR', - /** User role with specific capabilities */ - Editor = 'EDITOR', - /** User role with specific capabilities */ - Subscriber = 'SUBSCRIBER' -} - -/** Connection between the User type and the Comment type */ -export type GQLUserToCommentConnection = { - readonly __typename?: 'UserToCommentConnection'; - /** Edges for the UserToCommentConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLUserToCommentConnectionEdge = { - readonly __typename?: 'UserToCommentConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the UserToCommentConnection connection */ -export type GQLUserToCommentConnectionWhereArgs = { - /** Comment author email address. */ - readonly authorEmail: InputMaybe; - /** Array of author IDs to include comments for. */ - readonly authorIn: InputMaybe>>; - /** Array of author IDs to exclude comments for. */ - readonly authorNotIn: InputMaybe>>; - /** Comment author URL. */ - readonly authorUrl: InputMaybe; - /** Array of comment IDs to include. */ - readonly commentIn: InputMaybe>>; - /** Array of IDs of users whose unapproved comments will be returned by the query regardless of status. */ - readonly commentNotIn: InputMaybe>>; - /** Include comments of a given type. */ - readonly commentType: InputMaybe; - /** Include comments from a given array of comment types. */ - readonly commentTypeIn: InputMaybe>>; - /** Exclude comments from a given array of comment types. */ - readonly commentTypeNotIn: InputMaybe; - /** Content object author ID to limit results by. */ - readonly contentAuthor: InputMaybe>>; - /** Array of author IDs to retrieve comments for. */ - readonly contentAuthorIn: InputMaybe>>; - /** Array of author IDs *not* to retrieve comments for. */ - readonly contentAuthorNotIn: InputMaybe>>; - /** Limit results to those affiliated with a given content object ID. */ - readonly contentId: InputMaybe; - /** Array of content object IDs to include affiliated comments for. */ - readonly contentIdIn: InputMaybe>>; - /** Array of content object IDs to exclude affiliated comments for. */ - readonly contentIdNotIn: InputMaybe>>; - /** Content object name to retrieve affiliated comments for. */ - readonly contentName: InputMaybe; - /** Content Object parent ID to retrieve affiliated comments for. */ - readonly contentParent: InputMaybe; - /** Array of content object statuses to retrieve affiliated comments for. Pass 'any' to match any value. */ - readonly contentStatus: InputMaybe>>; - /** Content object type or array of types to retrieve affiliated comments for. Pass 'any' to match any value. */ - readonly contentType: InputMaybe>>; - /** Array of IDs or email addresses of users whose unapproved comments will be returned by the query regardless of $status. Default empty */ - readonly includeUnapproved: InputMaybe>>; - /** Karma score to retrieve matching comments for. */ - readonly karma: InputMaybe; - /** The cardinality of the order of the connection */ - readonly order: InputMaybe; - /** Field to order the comments by. */ - readonly orderby: InputMaybe; - /** Parent ID of comment to retrieve children of. */ - readonly parent: InputMaybe; - /** Array of parent IDs of comments to retrieve children for. */ - readonly parentIn: InputMaybe>>; - /** Array of parent IDs of comments *not* to retrieve children for. */ - readonly parentNotIn: InputMaybe>>; - /** Search term(s) to retrieve matching comments for. */ - readonly search: InputMaybe; - /** Comment status to limit results by. */ - readonly status: InputMaybe; - /** Include comments for a specific user ID. */ - readonly userId: InputMaybe; -}; - -/** Connection between the User type and the ContentRevisionUnion type */ -export type GQLUserToContentRevisionUnionConnection = { - readonly __typename?: 'UserToContentRevisionUnionConnection'; - /** Edges for the UserToContentRevisionUnionConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLUserToContentRevisionUnionConnectionEdge = { - readonly __typename?: 'UserToContentRevisionUnionConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the UserToContentRevisionUnionConnection connection */ -export type GQLUserToContentRevisionUnionConnectionWhereArgs = { - /** The Types of content to filter */ - readonly contentTypes: InputMaybe>>; - /** Filter the connection based on dates */ - readonly dateQuery: InputMaybe; - /** True for objects with passwords; False for objects without passwords; null for all objects with or without passwords */ - readonly hasPassword: InputMaybe; - /** Specific ID of the object */ - readonly id: InputMaybe; - /** Array of IDs for the objects to retrieve */ - readonly in: InputMaybe>>; - /** Get objects with a specific mimeType property */ - readonly mimeType: InputMaybe; - /** Slug / post_name of the object */ - readonly name: InputMaybe; - /** Specify objects to retrieve. Use slugs */ - readonly nameIn: InputMaybe>>; - /** Specify IDs NOT to retrieve. If this is used in the same query as "in", it will be ignored */ - readonly notIn: InputMaybe>>; - /** What paramater to use to order the objects by. */ - readonly orderby: InputMaybe>>; - /** Use ID to return only children. Use 0 to return only top-level items */ - readonly parent: InputMaybe; - /** Specify objects whose parent is in an array */ - readonly parentIn: InputMaybe>>; - /** Specify posts whose parent is not in an array */ - readonly parentNotIn: InputMaybe>>; - /** Show posts with a specific password. */ - readonly password: InputMaybe; - /** Show Posts based on a keyword search */ - readonly search: InputMaybe; - /** Retrieve posts where post status is in an array. */ - readonly stati: InputMaybe>>; - /** Show posts with a specific status. */ - readonly status: InputMaybe; - /** Title of the object */ - readonly title: InputMaybe; -}; - -/** Connection between the User type and the EnqueuedScript type */ -export type GQLUserToEnqueuedScriptConnection = { - readonly __typename?: 'UserToEnqueuedScriptConnection'; - /** Edges for the UserToEnqueuedScriptConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLUserToEnqueuedScriptConnectionEdge = { - readonly __typename?: 'UserToEnqueuedScriptConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Connection between the User type and the EnqueuedStylesheet type */ -export type GQLUserToEnqueuedStylesheetConnection = { - readonly __typename?: 'UserToEnqueuedStylesheetConnection'; - /** Edges for the UserToEnqueuedStylesheetConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLUserToEnqueuedStylesheetConnectionEdge = { - readonly __typename?: 'UserToEnqueuedStylesheetConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Connection between the User type and the mediaItem type */ -export type GQLUserToMediaItemConnection = { - readonly __typename?: 'UserToMediaItemConnection'; - /** Edges for the UserToMediaItemConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLUserToMediaItemConnectionEdge = { - readonly __typename?: 'UserToMediaItemConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the UserToMediaItemConnection connection */ -export type GQLUserToMediaItemConnectionWhereArgs = { - /** The user that's connected as the author of the object. Use the userId for the author object. */ - readonly author: InputMaybe; - /** Find objects connected to author(s) in the array of author's userIds */ - readonly authorIn: InputMaybe>>; - /** Find objects connected to the author by the author's nicename */ - readonly authorName: InputMaybe; - /** Find objects NOT connected to author(s) in the array of author's userIds */ - readonly authorNotIn: InputMaybe>>; - /** Filter the connection based on dates */ - readonly dateQuery: InputMaybe; - /** True for objects with passwords; False for objects without passwords; null for all objects with or without passwords */ - readonly hasPassword: InputMaybe; - /** Specific ID of the object */ - readonly id: InputMaybe; - /** Array of IDs for the objects to retrieve */ - readonly in: InputMaybe>>; - /** Get objects with a specific mimeType property */ - readonly mimeType: InputMaybe; - /** Slug / post_name of the object */ - readonly name: InputMaybe; - /** Specify objects to retrieve. Use slugs */ - readonly nameIn: InputMaybe>>; - /** Specify IDs NOT to retrieve. If this is used in the same query as "in", it will be ignored */ - readonly notIn: InputMaybe>>; - /** What paramater to use to order the objects by. */ - readonly orderby: InputMaybe>>; - /** Use ID to return only children. Use 0 to return only top-level items */ - readonly parent: InputMaybe; - /** Specify objects whose parent is in an array */ - readonly parentIn: InputMaybe>>; - /** Specify posts whose parent is not in an array */ - readonly parentNotIn: InputMaybe>>; - /** Show posts with a specific password. */ - readonly password: InputMaybe; - /** Show Posts based on a keyword search */ - readonly search: InputMaybe; - /** Retrieve posts where post status is in an array. */ - readonly stati: InputMaybe>>; - /** Show posts with a specific status. */ - readonly status: InputMaybe; - /** Title of the object */ - readonly title: InputMaybe; -}; - -/** Connection between the User type and the page type */ -export type GQLUserToPageConnection = { - readonly __typename?: 'UserToPageConnection'; - /** Edges for the UserToPageConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLUserToPageConnectionEdge = { - readonly __typename?: 'UserToPageConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the UserToPageConnection connection */ -export type GQLUserToPageConnectionWhereArgs = { - /** The user that's connected as the author of the object. Use the userId for the author object. */ - readonly author: InputMaybe; - /** Find objects connected to author(s) in the array of author's userIds */ - readonly authorIn: InputMaybe>>; - /** Find objects connected to the author by the author's nicename */ - readonly authorName: InputMaybe; - /** Find objects NOT connected to author(s) in the array of author's userIds */ - readonly authorNotIn: InputMaybe>>; - /** Filter the connection based on dates */ - readonly dateQuery: InputMaybe; - /** True for objects with passwords; False for objects without passwords; null for all objects with or without passwords */ - readonly hasPassword: InputMaybe; - /** Specific ID of the object */ - readonly id: InputMaybe; - /** Array of IDs for the objects to retrieve */ - readonly in: InputMaybe>>; - /** Get objects with a specific mimeType property */ - readonly mimeType: InputMaybe; - /** Slug / post_name of the object */ - readonly name: InputMaybe; - /** Specify objects to retrieve. Use slugs */ - readonly nameIn: InputMaybe>>; - /** Specify IDs NOT to retrieve. If this is used in the same query as "in", it will be ignored */ - readonly notIn: InputMaybe>>; - /** What paramater to use to order the objects by. */ - readonly orderby: InputMaybe>>; - /** Use ID to return only children. Use 0 to return only top-level items */ - readonly parent: InputMaybe; - /** Specify objects whose parent is in an array */ - readonly parentIn: InputMaybe>>; - /** Specify posts whose parent is not in an array */ - readonly parentNotIn: InputMaybe>>; - /** Show posts with a specific password. */ - readonly password: InputMaybe; - /** Show Posts based on a keyword search */ - readonly search: InputMaybe; - /** Retrieve posts where post status is in an array. */ - readonly stati: InputMaybe>>; - /** Show posts with a specific status. */ - readonly status: InputMaybe; - /** Title of the object */ - readonly title: InputMaybe; -}; - -/** Connection between the User type and the post type */ -export type GQLUserToPostConnection = { - readonly __typename?: 'UserToPostConnection'; - /** Edges for the UserToPostConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLUserToPostConnectionEdge = { - readonly __typename?: 'UserToPostConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the UserToPostConnection connection */ -export type GQLUserToPostConnectionWhereArgs = { - /** The user that's connected as the author of the object. Use the userId for the author object. */ - readonly author: InputMaybe; - /** Find objects connected to author(s) in the array of author's userIds */ - readonly authorIn: InputMaybe>>; - /** Find objects connected to the author by the author's nicename */ - readonly authorName: InputMaybe; - /** Find objects NOT connected to author(s) in the array of author's userIds */ - readonly authorNotIn: InputMaybe>>; - /** Category ID */ - readonly categoryId: InputMaybe; - /** Array of category IDs, used to display objects from one category OR another */ - readonly categoryIn: InputMaybe>>; - /** Use Category Slug */ - readonly categoryName: InputMaybe; - /** Array of category IDs, used to display objects from one category OR another */ - readonly categoryNotIn: InputMaybe>>; - /** Filter the connection based on dates */ - readonly dateQuery: InputMaybe; - /** True for objects with passwords; False for objects without passwords; null for all objects with or without passwords */ - readonly hasPassword: InputMaybe; - /** Specific ID of the object */ - readonly id: InputMaybe; - /** Array of IDs for the objects to retrieve */ - readonly in: InputMaybe>>; - /** Get objects with a specific mimeType property */ - readonly mimeType: InputMaybe; - /** Slug / post_name of the object */ - readonly name: InputMaybe; - /** Specify objects to retrieve. Use slugs */ - readonly nameIn: InputMaybe>>; - /** Specify IDs NOT to retrieve. If this is used in the same query as "in", it will be ignored */ - readonly notIn: InputMaybe>>; - /** What paramater to use to order the objects by. */ - readonly orderby: InputMaybe>>; - /** Use ID to return only children. Use 0 to return only top-level items */ - readonly parent: InputMaybe; - /** Specify objects whose parent is in an array */ - readonly parentIn: InputMaybe>>; - /** Specify posts whose parent is not in an array */ - readonly parentNotIn: InputMaybe>>; - /** Show posts with a specific password. */ - readonly password: InputMaybe; - /** Show Posts based on a keyword search */ - readonly search: InputMaybe; - /** Retrieve posts where post status is in an array. */ - readonly stati: InputMaybe>>; - /** Show posts with a specific status. */ - readonly status: InputMaybe; - /** Tag Slug */ - readonly tag: InputMaybe; - /** Use Tag ID */ - readonly tagId: InputMaybe; - /** Array of tag IDs, used to display objects from one tag OR another */ - readonly tagIn: InputMaybe>>; - /** Array of tag IDs, used to display objects from one tag OR another */ - readonly tagNotIn: InputMaybe>>; - /** Array of tag slugs, used to display objects from one tag OR another */ - readonly tagSlugAnd: InputMaybe>>; - /** Array of tag slugs, used to exclude objects in specified tags */ - readonly tagSlugIn: InputMaybe>>; - /** Title of the object */ - readonly title: InputMaybe; -}; - -/** Connection between the User type and the UserRole type */ -export type GQLUserToUserRoleConnection = { - readonly __typename?: 'UserToUserRoleConnection'; - /** Edges for the UserToUserRoleConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLUserToUserRoleConnectionEdge = { - readonly __typename?: 'UserToUserRoleConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Field to order the connection by */ -export enum GQLUsersConnectionOrderbyEnum { - /** Order by display name */ - DisplayName = 'DISPLAY_NAME', - /** Order by email address */ - Email = 'EMAIL', - /** Order by login */ - Login = 'LOGIN', - /** Preserve the login order given in the LOGIN_IN array */ - LoginIn = 'LOGIN_IN', - /** Order by nice name */ - NiceName = 'NICE_NAME', - /** Preserve the nice name order given in the NICE_NAME_IN array */ - NiceNameIn = 'NICE_NAME_IN', - /** Order by registration date */ - Registered = 'REGISTERED', - /** Order by URL */ - Url = 'URL' -} - -/** Options for ordering the connection */ -export type GQLUsersConnectionOrderbyInput = { - /** The field name used to sort the results. */ - readonly field: GQLUsersConnectionOrderbyEnum; - /** The cardinality of the order of the connection */ - readonly order: InputMaybe; -}; - -/** Column used for searching for users. */ -export enum GQLUsersConnectionSearchColumnEnum { - /** The user's email address. */ - Email = 'EMAIL', - /** The globally unique ID. */ - Id = 'ID', - /** The username the User uses to login with. */ - Login = 'LOGIN', - /** A URL-friendly name for the user. The default is the user's username. */ - Nicename = 'NICENAME', - /** The URL of the user\s website. */ - Url = 'URL' -} - -/** Information about pagination in a connection. */ -export type GQLWpPageInfo = { - readonly __typename?: 'WPPageInfo'; - /** When paginating forwards, the cursor to continue. */ - readonly endCursor: Maybe; - /** When paginating forwards, are there more items? */ - readonly hasNextPage: Scalars['Boolean']; - /** When paginating backwards, are there more items? */ - readonly hasPreviousPage: Scalars['Boolean']; - /** When paginating backwards, the cursor to continue. */ - readonly startCursor: Maybe; -}; - -/** The Work type */ -export type GQLWork = GQLContentNode & GQLDatabaseIdentifier & GQLMenuItemLinkable & GQLNode & GQLNodeWithContentEditor & GQLNodeWithFeaturedImage & GQLNodeWithTemplate & GQLNodeWithTitle & GQLUniformResourceIdentifiable & { - readonly __typename?: 'Work'; - /** The content of the post. */ - readonly content: Maybe; - /** Connection between the ContentNode type and the ContentType type */ - readonly contentType: Maybe; - /** The name of the Content Type the node belongs to */ - readonly contentTypeName: Scalars['String']; - /** The unique resource identifier path */ - readonly databaseId: Scalars['Int']; - /** Post publishing date. */ - readonly date: Maybe; - /** The publishing date set in GMT. */ - readonly dateGmt: Maybe; - /** The desired slug of the post */ - readonly desiredSlug: Maybe; - /** If a user has edited the node within the past 15 seconds, this will return the user that last edited. Null if the edit lock doesn't exist or is greater than 15 seconds */ - readonly editingLockedBy: Maybe; - /** The RSS enclosure for the object */ - readonly enclosure: Maybe; - /** Connection between the ContentNode type and the EnqueuedScript type */ - readonly enqueuedScripts: Maybe; - /** Connection between the ContentNode type and the EnqueuedStylesheet type */ - readonly enqueuedStylesheets: Maybe; - /** Connection between the NodeWithFeaturedImage type and the MediaItem type */ - readonly featuredImage: Maybe; - /** The database identifier for the featured image node assigned to the content node */ - readonly featuredImageDatabaseId: Maybe; - /** Globally unique ID of the featured image assigned to the node */ - readonly featuredImageId: Maybe; - /** The global unique identifier for this post. This currently matches the value stored in WP_Post->guid and the guid column in the "post_objects" database table. */ - readonly guid: Maybe; - /** The globally unique identifier of the works object. */ - readonly id: Scalars['ID']; - /** Whether the node is a Content Node */ - readonly isContentNode: Scalars['Boolean']; - /** Whether the object is a node in the preview state */ - readonly isPreview: Maybe; - /** Whether the object is restricted from the current viewer */ - readonly isRestricted: Maybe; - /** Whether the node is a Term */ - readonly isTermNode: Scalars['Boolean']; - /** The user that most recently edited the node */ - readonly lastEditedBy: Maybe; - /** The permalink of the post */ - readonly link: Maybe; - /** The local modified time for a post. If a post was recently updated the modified field will change to match the corresponding time. */ - readonly modified: Maybe; - /** The GMT modified time for a post. If a post was recently updated the modified field will change to match the corresponding time in GMT. */ - readonly modifiedGmt: Maybe; - /** Connection between the Work type and the Work type */ - readonly preview: Maybe; - /** The database id of the preview node */ - readonly previewRevisionDatabaseId: Maybe; - /** Whether the object is a node in the preview state */ - readonly previewRevisionId: Maybe; - /** The uri slug for the post. This is equivalent to the WP_Post->post_name field and the post_name column in the database for the "post_objects" table. */ - readonly slug: Maybe; - /** The current status of the object */ - readonly status: Maybe; - /** Connection between the Work type and the Technology type */ - readonly technologies: Maybe; - /** The template assigned to a node of content */ - readonly template: Maybe; - /** Connection between the Work type and the TermNode type */ - readonly terms: Maybe; - /** The title of the post. This is currently just the raw title. An amendment to support rendered title needs to be made. */ - readonly title: Maybe; - /** The unique resource identifier path */ - readonly uri: Maybe; - /** Added to the GraphQL Schema because the ACF Field Group "Works" was set to Show in GraphQL. */ - readonly work: Maybe; - /** - * The id field matches the WP_Post->ID field. - * @deprecated Deprecated in favor of the databaseId field - */ - readonly workId: Scalars['Int']; -}; - - -/** The Work type */ -export type GQLWorkContentArgs = { - format: InputMaybe; -}; - - -/** The Work type */ -export type GQLWorkEnqueuedScriptsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - - -/** The Work type */ -export type GQLWorkEnqueuedStylesheetsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; -}; - - -/** The Work type */ -export type GQLWorkTechnologiesArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The Work type */ -export type GQLWorkTermsArgs = { - after: InputMaybe; - before: InputMaybe; - first: InputMaybe; - last: InputMaybe; - where: InputMaybe; -}; - - -/** The Work type */ -export type GQLWorkTitleArgs = { - format: InputMaybe; -}; - -/** The Type of Identifier used to fetch a single resource. Default is ID. */ -export enum GQLWorkIdType { - /** Identify a resource by the Database ID. */ - DatabaseId = 'DATABASE_ID', - /** Identify a resource by the (hashed) Global ID. */ - Id = 'ID', - /** Identify a resource by the slug. Available to non-hierarchcial Types where the slug is a unique identifier. */ - Slug = 'SLUG', - /** Identify a resource by the URI. */ - Uri = 'URI' -} - -/** Set relationships between the Work to Technologies */ -export type GQLWorkTechnologiesInput = { - /** If true, this will append the Technology to existing related Technologies. If false, this will replace existing relationships. Default true. */ - readonly append: InputMaybe; - /** The input list of items to set. */ - readonly nodes: InputMaybe>>; -}; - -/** List of Technologies to connect the Work to. If an ID is set, it will be used to create the connection. If not, it will look for a slug. If neither are valid existing terms, and the site is configured to allow terms to be created during post mutations, a term will be created using the Name if it exists in the input, then fallback to the slug if it exists. */ -export type GQLWorkTechnologiesNodeInput = { - /** The description of the Technology. This field is used to set a description of the Technology if a new one is created during the mutation. */ - readonly description: InputMaybe; - /** The ID of the Technology. If present, this will be used to connect to the Work. If no existing Technology exists with this ID, no connection will be made. */ - readonly id: InputMaybe; - /** The name of the Technology. This field is used to create a new term, if term creation is enabled in nested mutations, and if one does not already exist with the provided slug or ID or if a slug or ID is not provided. If no name is included and a term is created, the creation will fallback to the slug field. */ - readonly name: InputMaybe; - /** The slug of the Technology. If no ID is present, this field will be used to make a connection. If no existing term exists with this slug, this field will be used as a fallback to the Name field when creating a new term to connect to, if term creation is enabled as a nested mutation. */ - readonly slug: InputMaybe; -}; - -/** Connection between the Work type and the Work type */ -export type GQLWorkToPreviewConnectionEdge = { - readonly __typename?: 'WorkToPreviewConnectionEdge'; - /** The node of the connection, without the edges */ - readonly node: Maybe; -}; - -/** Connection between the Work type and the Technology type */ -export type GQLWorkToTechnologyConnection = { - readonly __typename?: 'WorkToTechnologyConnection'; - /** Edges for the WorkToTechnologyConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLWorkToTechnologyConnectionEdge = { - readonly __typename?: 'WorkToTechnologyConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the WorkToTechnologyConnection connection */ -export type GQLWorkToTechnologyConnectionWhereArgs = { - /** Unique cache key to be produced when this query is stored in an object cache. Default is 'core'. */ - readonly cacheDomain: InputMaybe; - /** Term ID to retrieve child terms of. If multiple taxonomies are passed, $child_of is ignored. Default 0. */ - readonly childOf: InputMaybe; - /** True to limit results to terms that have no children. This parameter has no effect on non-hierarchical taxonomies. Default false. */ - readonly childless: InputMaybe; - /** Retrieve terms where the description is LIKE the input value. Default empty. */ - readonly descriptionLike: InputMaybe; - /** Array of term ids to exclude. If $include is non-empty, $exclude is ignored. Default empty array. */ - readonly exclude: InputMaybe>>; - /** Array of term ids to exclude along with all of their descendant terms. If $include is non-empty, $exclude_tree is ignored. Default empty array. */ - readonly excludeTree: InputMaybe>>; - /** Whether to hide terms not assigned to any posts. Accepts true or false. Default false */ - readonly hideEmpty: InputMaybe; - /** Whether to include terms that have non-empty descendants (even if $hide_empty is set to true). Default true. */ - readonly hierarchical: InputMaybe; - /** Array of term ids to include. Default empty array. */ - readonly include: InputMaybe>>; - /** Array of names to return term(s) for. Default empty. */ - readonly name: InputMaybe>>; - /** Retrieve terms where the name is LIKE the input value. Default empty. */ - readonly nameLike: InputMaybe; - /** Array of object IDs. Results will be limited to terms associated with these objects. */ - readonly objectIds: InputMaybe>>; - /** Direction the connection should be ordered in */ - readonly order: InputMaybe; - /** Field(s) to order terms by. Defaults to 'name'. */ - readonly orderby: InputMaybe; - /** Whether to pad the quantity of a term's children in the quantity of each term's "count" object variable. Default false. */ - readonly padCounts: InputMaybe; - /** Parent term ID to retrieve direct-child terms of. Default empty. */ - readonly parent: InputMaybe; - /** Search criteria to match terms. Will be SQL-formatted with wildcards before and after. Default empty. */ - readonly search: InputMaybe; - /** Array of slugs to return term(s) for. Default empty. */ - readonly slug: InputMaybe>>; - /** Array of term taxonomy IDs, to match when querying terms. */ - readonly termTaxonomId: InputMaybe>>; - /** Whether to prime meta caches for matched terms. Default true. */ - readonly updateTermMetaCache: InputMaybe; -}; - -/** Connection between the Work type and the TermNode type */ -export type GQLWorkToTermNodeConnection = { - readonly __typename?: 'WorkToTermNodeConnection'; - /** Edges for the WorkToTermNodeConnection connection */ - readonly edges: Maybe>>; - /** The nodes of the connection, without the edges */ - readonly nodes: Maybe>>; - /** Information about pagination in a connection. */ - readonly pageInfo: Maybe; -}; - -/** An edge in a connection */ -export type GQLWorkToTermNodeConnectionEdge = { - readonly __typename?: 'WorkToTermNodeConnectionEdge'; - /** A cursor for use in pagination */ - readonly cursor: Maybe; - /** The item at the end of the edge */ - readonly node: Maybe; -}; - -/** Arguments for filtering the WorkToTermNodeConnection connection */ -export type GQLWorkToTermNodeConnectionWhereArgs = { - /** Unique cache key to be produced when this query is stored in an object cache. Default is 'core'. */ - readonly cacheDomain: InputMaybe; - /** Term ID to retrieve child terms of. If multiple taxonomies are passed, $child_of is ignored. Default 0. */ - readonly childOf: InputMaybe; - /** True to limit results to terms that have no children. This parameter has no effect on non-hierarchical taxonomies. Default false. */ - readonly childless: InputMaybe; - /** Retrieve terms where the description is LIKE the input value. Default empty. */ - readonly descriptionLike: InputMaybe; - /** Array of term ids to exclude. If $include is non-empty, $exclude is ignored. Default empty array. */ - readonly exclude: InputMaybe>>; - /** Array of term ids to exclude along with all of their descendant terms. If $include is non-empty, $exclude_tree is ignored. Default empty array. */ - readonly excludeTree: InputMaybe>>; - /** Whether to hide terms not assigned to any posts. Accepts true or false. Default false */ - readonly hideEmpty: InputMaybe; - /** Whether to include terms that have non-empty descendants (even if $hide_empty is set to true). Default true. */ - readonly hierarchical: InputMaybe; - /** Array of term ids to include. Default empty array. */ - readonly include: InputMaybe>>; - /** Array of names to return term(s) for. Default empty. */ - readonly name: InputMaybe>>; - /** Retrieve terms where the name is LIKE the input value. Default empty. */ - readonly nameLike: InputMaybe; - /** Array of object IDs. Results will be limited to terms associated with these objects. */ - readonly objectIds: InputMaybe>>; - /** Direction the connection should be ordered in */ - readonly order: InputMaybe; - /** Field(s) to order terms by. Defaults to 'name'. */ - readonly orderby: InputMaybe; - /** Whether to pad the quantity of a term's children in the quantity of each term's "count" object variable. Default false. */ - readonly padCounts: InputMaybe; - /** Parent term ID to retrieve direct-child terms of. Default empty. */ - readonly parent: InputMaybe; - /** Search criteria to match terms. Will be SQL-formatted with wildcards before and after. Default empty. */ - readonly search: InputMaybe; - /** Array of slugs to return term(s) for. Default empty. */ - readonly slug: InputMaybe>>; - /** The Taxonomy to filter terms by */ - readonly taxonomies: InputMaybe>>; - /** Array of term taxonomy IDs, to match when querying terms. */ - readonly termTaxonomId: InputMaybe>>; - /** Whether to prime meta caches for matched terms. Default true. */ - readonly updateTermMetaCache: InputMaybe; -}; - -/** Field Group */ -export type GQLWork_Work = GQLAcfFieldGroup & { - readonly __typename?: 'Work_Work'; - readonly date: Maybe; - /** The name of the ACF Field Group */ - readonly fieldGroupName: Maybe; - readonly image: Maybe; - readonly link: Maybe; - readonly role: Maybe; -}; - -/** The writing setting type */ -export type GQLWritingSettings = { - readonly __typename?: 'WritingSettings'; - /** Default post category. */ - readonly defaultCategory: Maybe; - /** Default post format. */ - readonly defaultPostFormat: Maybe; - /** Convert emoticons like :-) and :-P to graphics on display. */ - readonly useSmilies: Maybe; -}; - -export type GQLBaseMediaItemFragment = { readonly __typename?: 'MediaItem', readonly srcSet: string, readonly altText: string, readonly sourceUrl: string }; - -export type GQLMediaItemsManyQueryVariables = Exact<{ [key: string]: never; }>; - - -export type GQLMediaItemsManyQuery = { readonly __typename?: 'RootQuery', readonly mediaItems: { readonly __typename?: 'RootQueryToMediaItemConnection', readonly nodes: ReadonlyArray<{ readonly __typename?: 'MediaItem', readonly srcSet: string, readonly altText: string, readonly sourceUrl: string }> } }; - -export type GQLMediaItemsOneQueryVariables = Exact<{ - slug: Scalars['ID']; -}>; - - -export type GQLMediaItemsOneQuery = { readonly __typename?: 'RootQuery', readonly mediaItem: { readonly __typename?: 'MediaItem', readonly srcSet: string, readonly altText: string, readonly sourceUrl: string } }; - -export type GQLBasePageFragment = { readonly __typename?: 'Page', readonly id: string, readonly slug: string, readonly title: string, readonly content: string, readonly status: string }; - -export type GQLPagesManyQueryVariables = Exact<{ [key: string]: never; }>; - - -export type GQLPagesManyQuery = { readonly __typename?: 'RootQuery', readonly pages: { readonly __typename?: 'RootQueryToPageConnection', readonly nodes: ReadonlyArray<{ readonly __typename?: 'Page', readonly id: string, readonly slug: string, readonly title: string, readonly content: string, readonly status: string }> } }; - -export type GQLPagesOneQueryVariables = Exact<{ - slug: Scalars['ID']; -}>; - - -export type GQLPagesOneQuery = { readonly __typename?: 'RootQuery', readonly page: { readonly __typename?: 'Page', readonly id: string, readonly slug: string, readonly title: string, readonly content: string, readonly status: string } }; - -export type GQLBaseWorkFragment = { readonly __typename?: 'Work', readonly id: string, readonly slug: string, readonly title: string, readonly content: string, readonly status: string, readonly work: { readonly __typename?: 'Work_Work', readonly date: string, readonly link: string, readonly role: string, readonly image: { readonly __typename?: 'MediaItem', readonly srcSet: string, readonly altText: string, readonly sourceUrl: string } } }; - -export type GQLWorksManyQueryVariables = Exact<{ [key: string]: never; }>; - - -export type GQLWorksManyQuery = { readonly __typename?: 'RootQuery', readonly works: { readonly __typename?: 'RootQueryToWorkConnection', readonly nodes: ReadonlyArray<{ readonly __typename?: 'Work', readonly id: string, readonly slug: string, readonly title: string, readonly content: string, readonly status: string, readonly work: { readonly __typename?: 'Work_Work', readonly date: string, readonly link: string, readonly role: string, readonly image: { readonly __typename?: 'MediaItem', readonly srcSet: string, readonly altText: string, readonly sourceUrl: string } } }> } }; - -export type GQLWorksOneQueryVariables = Exact<{ - slug: Scalars['ID']; -}>; - - -export type GQLWorksOneQuery = { readonly __typename?: 'RootQuery', readonly work: { readonly __typename?: 'Work', readonly id: string, readonly slug: string, readonly title: string, readonly content: string, readonly status: string, readonly work: { readonly __typename?: 'Work_Work', readonly date: string, readonly link: string, readonly role: string, readonly image: { readonly __typename?: 'MediaItem', readonly srcSet: string, readonly altText: string, readonly sourceUrl: string } } } }; - -export type GQLBaseProjectFragment = { readonly __typename?: 'Project', readonly id: string, readonly slug: string, readonly title: string, readonly content: string, readonly status: string, readonly project: { readonly __typename?: 'Project_Project', readonly date: string, readonly link: string, readonly description: string } }; - -export type GQLProjectsManyQueryVariables = Exact<{ [key: string]: never; }>; - - -export type GQLProjectsManyQuery = { readonly __typename?: 'RootQuery', readonly projects: { readonly __typename?: 'RootQueryToProjectConnection', readonly nodes: ReadonlyArray<{ readonly __typename?: 'Project', readonly id: string, readonly slug: string, readonly title: string, readonly content: string, readonly status: string, readonly project: { readonly __typename?: 'Project_Project', readonly date: string, readonly link: string, readonly description: string } }> } }; - -export type GQLProjectsOneQueryVariables = Exact<{ - slug: Scalars['ID']; -}>; - - -export type GQLProjectsOneQuery = { readonly __typename?: 'RootQuery', readonly project: { readonly __typename?: 'Project', readonly id: string, readonly slug: string, readonly title: string, readonly content: string, readonly status: string, readonly project: { readonly __typename?: 'Project_Project', readonly date: string, readonly link: string, readonly description: string } } }; - -export type GQLBasePostFragment = { readonly __typename?: 'Post', readonly id: string, readonly slug: string, readonly title: string, readonly content: string, readonly status: string, readonly date: string, readonly modified: string, readonly tags: { readonly __typename?: 'PostToTagConnection', readonly nodes: ReadonlyArray<{ readonly __typename?: 'Tag', readonly id: string, readonly slug: string, readonly name: string, readonly count: number }> }, readonly post: { readonly __typename?: 'Post_Post', readonly featured: { readonly __typename?: 'MediaItem', readonly srcSet: string, readonly altText: string, readonly sourceUrl: string } } }; - -export type GQLPostsManyQueryVariables = Exact<{ [key: string]: never; }>; - - -export type GQLPostsManyQuery = { readonly __typename?: 'RootQuery', readonly posts: { readonly __typename?: 'RootQueryToPostConnection', readonly nodes: ReadonlyArray<{ readonly __typename?: 'Post', readonly id: string, readonly slug: string, readonly title: string, readonly content: string, readonly status: string, readonly date: string, readonly modified: string, readonly tags: { readonly __typename?: 'PostToTagConnection', readonly nodes: ReadonlyArray<{ readonly __typename?: 'Tag', readonly id: string, readonly slug: string, readonly name: string, readonly count: number }> }, readonly post: { readonly __typename?: 'Post_Post', readonly featured: { readonly __typename?: 'MediaItem', readonly srcSet: string, readonly altText: string, readonly sourceUrl: string } } }> } }; - -export type GQLPostsOneQueryVariables = Exact<{ - slug: Scalars['ID']; -}>; - - -export type GQLPostsOneQuery = { readonly __typename?: 'RootQuery', readonly post: { readonly __typename?: 'Post', readonly id: string, readonly slug: string, readonly title: string, readonly content: string, readonly status: string, readonly date: string, readonly modified: string, readonly tags: { readonly __typename?: 'PostToTagConnection', readonly nodes: ReadonlyArray<{ readonly __typename?: 'Tag', readonly id: string, readonly slug: string, readonly name: string, readonly count: number }> }, readonly post: { readonly __typename?: 'Post_Post', readonly featured: { readonly __typename?: 'MediaItem', readonly srcSet: string, readonly altText: string, readonly sourceUrl: string } } } }; - -export type GQLPostsManyByTagQueryVariables = Exact<{ - tag: Scalars['String']; -}>; - - -export type GQLPostsManyByTagQuery = { readonly __typename?: 'RootQuery', readonly posts: { readonly __typename?: 'RootQueryToPostConnection', readonly nodes: ReadonlyArray<{ readonly __typename?: 'Post', readonly id: string, readonly slug: string, readonly title: string, readonly content: string, readonly status: string, readonly date: string, readonly modified: string, readonly tags: { readonly __typename?: 'PostToTagConnection', readonly nodes: ReadonlyArray<{ readonly __typename?: 'Tag', readonly id: string, readonly slug: string, readonly name: string, readonly count: number }> }, readonly post: { readonly __typename?: 'Post_Post', readonly featured: { readonly __typename?: 'MediaItem', readonly srcSet: string, readonly altText: string, readonly sourceUrl: string } } }> } }; - -export type GQLSearchQueryVariables = Exact<{ [key: string]: never; }>; - - -export type GQLSearchQuery = { readonly __typename?: 'RootQuery', readonly posts: { readonly __typename?: 'RootQueryToPostConnection', readonly nodes: ReadonlyArray<{ readonly __typename?: 'Post', readonly id: string, readonly slug: string, readonly title: string, readonly content: string, readonly status: string, readonly date: string, readonly modified: string, readonly tags: { readonly __typename?: 'PostToTagConnection', readonly nodes: ReadonlyArray<{ readonly __typename?: 'Tag', readonly id: string, readonly slug: string, readonly name: string, readonly count: number }> }, readonly post: { readonly __typename?: 'Post_Post', readonly featured: { readonly __typename?: 'MediaItem', readonly srcSet: string, readonly altText: string, readonly sourceUrl: string } } }> }, readonly projects: { readonly __typename?: 'RootQueryToProjectConnection', readonly nodes: ReadonlyArray<{ readonly __typename?: 'Project', readonly id: string, readonly slug: string, readonly title: string, readonly content: string, readonly status: string, readonly project: { readonly __typename?: 'Project_Project', readonly date: string, readonly link: string, readonly description: string } }> }, readonly works: { readonly __typename?: 'RootQueryToWorkConnection', readonly nodes: ReadonlyArray<{ readonly __typename?: 'Work', readonly id: string, readonly slug: string, readonly title: string, readonly content: string, readonly status: string, readonly work: { readonly __typename?: 'Work_Work', readonly date: string, readonly link: string, readonly role: string, readonly image: { readonly __typename?: 'MediaItem', readonly srcSet: string, readonly altText: string, readonly sourceUrl: string } } }> } }; - -export type GQLBaseTagFragment = { readonly __typename?: 'Tag', readonly id: string, readonly slug: string, readonly name: string, readonly count: number }; - -export type GQLTagsManyQueryVariables = Exact<{ [key: string]: never; }>; - - -export type GQLTagsManyQuery = { readonly __typename?: 'RootQuery', readonly tags: { readonly __typename?: 'RootQueryToTagConnection', readonly nodes: ReadonlyArray<{ readonly __typename?: 'Tag', readonly id: string, readonly slug: string, readonly name: string, readonly count: number }> } }; - -export const BasePageFragmentDoc = gql` - fragment BasePage on Page { - id - slug - title - content - status -} - `; -export const BaseMediaItemFragmentDoc = gql` - fragment BaseMediaItem on MediaItem { - srcSet - altText - sourceUrl -} - `; -export const BaseWorkFragmentDoc = gql` - fragment BaseWork on Work { - id - slug - title - content - status - work { - date - image { - ...BaseMediaItem - } - link - role - } -} - ${BaseMediaItemFragmentDoc}`; -export const BaseProjectFragmentDoc = gql` - fragment BaseProject on Project { - id - slug - title - content - status - project { - date - link - description - } -} - `; -export const BaseTagFragmentDoc = gql` - fragment BaseTag on Tag { - id - slug - name - count -} - `; -export const BasePostFragmentDoc = gql` - fragment BasePost on Post { - id - slug - title - content - status - date - modified - tags { - nodes { - ...BaseTag - } - } - post { - featured { - ...BaseMediaItem - } - } -} - ${BaseTagFragmentDoc} -${BaseMediaItemFragmentDoc}`; -export const MediaItemsManyDocument = gql` - query MediaItemsMany { - mediaItems(first: 100, where: {status: PUBLISH}) { - nodes { - ...BaseMediaItem - } - } -} - ${BaseMediaItemFragmentDoc}`; -export const MediaItemsOneDocument = gql` - query MediaItemsOne($slug: ID!) { - mediaItem(id: $slug, idType: URI) { - ...BaseMediaItem - } -} - ${BaseMediaItemFragmentDoc}`; -export const PagesManyDocument = gql` - query PagesMany { - pages(first: 100, where: {status: PUBLISH}) { - nodes { - ...BasePage - } - } -} - ${BasePageFragmentDoc}`; -export const PagesOneDocument = gql` - query PagesOne($slug: ID!) { - page(id: $slug, idType: URI) { - ...BasePage - } -} - ${BasePageFragmentDoc}`; -export const WorksManyDocument = gql` - query WorksMany { - works(first: 100, where: {status: PUBLISH}) { - nodes { - ...BaseWork - } - } -} - ${BaseWorkFragmentDoc}`; -export const WorksOneDocument = gql` - query WorksOne($slug: ID!) { - work(id: $slug, idType: URI) { - ...BaseWork - } -} - ${BaseWorkFragmentDoc}`; -export const ProjectsManyDocument = gql` - query ProjectsMany { - projects(first: 100, where: {status: PUBLISH}) { - nodes { - ...BaseProject - } - } -} - ${BaseProjectFragmentDoc}`; -export const ProjectsOneDocument = gql` - query ProjectsOne($slug: ID!) { - project(id: $slug, idType: URI) { - ...BaseProject - } -} - ${BaseProjectFragmentDoc}`; -export const PostsManyDocument = gql` - query PostsMany { - posts(first: 100, where: {status: PUBLISH}) { - nodes { - ...BasePost - } - } -} - ${BasePostFragmentDoc}`; -export const PostsOneDocument = gql` - query PostsOne($slug: ID!) { - post(id: $slug, idType: URI) { - ...BasePost - } -} - ${BasePostFragmentDoc}`; -export const PostsManyByTagDocument = gql` - query PostsManyByTag($tag: String!) { - posts(first: 100, where: {status: PUBLISH, tag: $tag}) { - nodes { - ...BasePost - } - } -} - ${BasePostFragmentDoc}`; -export const SearchDocument = gql` - query Search { - posts(first: 100) { - nodes { - ...BasePost - } - } - projects(first: 100) { - nodes { - ...BaseProject - } - } - works(first: 100) { - nodes { - ...BaseWork - } - } -} - ${BasePostFragmentDoc} -${BaseProjectFragmentDoc} -${BaseWorkFragmentDoc}`; -export const TagsManyDocument = gql` - query TagsMany { - tags(first: 100) { - nodes { - ...BaseTag - } - } -} - ${BaseTagFragmentDoc}`; - -export type SdkFunctionWrapper = (action: (requestHeaders?:Record) => Promise, operationName: string, operationType?: string) => Promise; - - -const defaultWrapper: SdkFunctionWrapper = (action, _operationName, _operationType) => action(); - -export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = defaultWrapper) { - return { - MediaItemsMany(variables?: GQLMediaItemsManyQueryVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise { - return withWrapper((wrappedRequestHeaders) => client.request(MediaItemsManyDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'MediaItemsMany', 'query'); - }, - MediaItemsOne(variables: GQLMediaItemsOneQueryVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise { - return withWrapper((wrappedRequestHeaders) => client.request(MediaItemsOneDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'MediaItemsOne', 'query'); - }, - PagesMany(variables?: GQLPagesManyQueryVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise { - return withWrapper((wrappedRequestHeaders) => client.request(PagesManyDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'PagesMany', 'query'); - }, - PagesOne(variables: GQLPagesOneQueryVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise { - return withWrapper((wrappedRequestHeaders) => client.request(PagesOneDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'PagesOne', 'query'); - }, - WorksMany(variables?: GQLWorksManyQueryVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise { - return withWrapper((wrappedRequestHeaders) => client.request(WorksManyDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'WorksMany', 'query'); - }, - WorksOne(variables: GQLWorksOneQueryVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise { - return withWrapper((wrappedRequestHeaders) => client.request(WorksOneDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'WorksOne', 'query'); - }, - ProjectsMany(variables?: GQLProjectsManyQueryVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise { - return withWrapper((wrappedRequestHeaders) => client.request(ProjectsManyDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'ProjectsMany', 'query'); - }, - ProjectsOne(variables: GQLProjectsOneQueryVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise { - return withWrapper((wrappedRequestHeaders) => client.request(ProjectsOneDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'ProjectsOne', 'query'); - }, - PostsMany(variables?: GQLPostsManyQueryVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise { - return withWrapper((wrappedRequestHeaders) => client.request(PostsManyDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'PostsMany', 'query'); - }, - PostsOne(variables: GQLPostsOneQueryVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise { - return withWrapper((wrappedRequestHeaders) => client.request(PostsOneDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'PostsOne', 'query'); - }, - PostsManyByTag(variables: GQLPostsManyByTagQueryVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise { - return withWrapper((wrappedRequestHeaders) => client.request(PostsManyByTagDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'PostsManyByTag', 'query'); - }, - Search(variables?: GQLSearchQueryVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise { - return withWrapper((wrappedRequestHeaders) => client.request(SearchDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'Search', 'query'); - }, - TagsMany(variables?: GQLTagsManyQueryVariables, requestHeaders?: Dom.RequestInit["headers"]): Promise { - return withWrapper((wrappedRequestHeaders) => client.request(TagsManyDocument, variables, {...requestHeaders, ...wrappedRequestHeaders}), 'TagsMany', 'query'); - } - }; -} -export type Sdk = ReturnType; \ No newline at end of file diff --git a/src/lib/gql/index.ts b/src/lib/gql/index.ts deleted file mode 100644 index a4c81dd..0000000 --- a/src/lib/gql/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { GraphQLClient } from 'graphql-request' -import { getSdk } from './gen' - -const client = new GraphQLClient('https://api.nicco.io/graphql') -export const SDK = getSdk(client) diff --git a/src/lib/gql/root.graphql b/src/lib/gql/root.graphql deleted file mode 100644 index 595f7b0..0000000 --- a/src/lib/gql/root.graphql +++ /dev/null @@ -1,173 +0,0 @@ -fragment BaseMediaItem on MediaItem { - srcSet - altText - sourceUrl -} - -query MediaItemsMany { - mediaItems(first: 100, where: { status: PUBLISH }) { - nodes { - ...BaseMediaItem - } - } -} - -query MediaItemsOne($slug: ID!) { - mediaItem(id: $slug, idType: URI) { - ...BaseMediaItem - } -} - -fragment BasePage on Page { - id - slug - title - content - status -} - -query PagesMany { - pages(first: 100, where: { status: PUBLISH }) { - nodes { - ...BasePage - } - } -} - -query PagesOne($slug: ID!) { - page(id: $slug, idType: URI) { - ...BasePage - } -} - -fragment BaseWork on Work { - id - slug - title - content - status - work { - date - image { - ...BaseMediaItem - } - link - role - } -} - -query WorksMany { - works(first: 100, where: { status: PUBLISH }) { - nodes { - ...BaseWork - } - } -} - -query WorksOne($slug: ID!) { - work(id: $slug, idType: URI) { - ...BaseWork - } -} - -fragment BaseProject on Project { - id - slug - title - content - status - project { - date - link - description - } -} - -query ProjectsMany { - projects(first: 100, where: { status: PUBLISH }) { - nodes { - ...BaseProject - } - } -} - -query ProjectsOne($slug: ID!) { - project(id: $slug, idType: URI) { - ...BaseProject - } -} - -fragment BasePost on Post { - id - slug - title - content - status - date - modified - tags { - nodes { - ...BaseTag - } - } - post { - featured { - ...BaseMediaItem - } - } -} - -query PostsMany { - posts(first: 100, where: { status: PUBLISH }) { - nodes { - ...BasePost - } - } -} - -query PostsOne($slug: ID!) { - post(id: $slug, idType: URI) { - ...BasePost - } -} - -query PostsManyByTag($tag: String!) { - posts(first: 100, where: { status: PUBLISH, tag: $tag }) { - nodes { - ...BasePost - } - } -} - -query Search { - posts(first: 100) { - nodes { - ...BasePost - } - } - projects(first: 100) { - nodes { - ...BaseProject - } - } - works(first: 100) { - nodes { - ...BaseWork - } - } -} - -fragment BaseTag on Tag { - id - slug - name - count -} - -query TagsMany { - tags(first: 100) { - nodes { - ...BaseTag - } - } -} diff --git a/src/lib/icons/IconAnalytics.svelte b/src/lib/icons/IconAnalytics.svelte deleted file mode 100644 index a2cff4f..0000000 --- a/src/lib/icons/IconAnalytics.svelte +++ /dev/null @@ -1,5 +0,0 @@ -Analytics diff --git a/src/lib/icons/IconCafe.svelte b/src/lib/icons/IconCafe.svelte deleted file mode 100644 index 1c5da7a..0000000 --- a/src/lib/icons/IconCafe.svelte +++ /dev/null @@ -1,5 +0,0 @@ -Cafe diff --git a/src/lib/icons/IconCaretUpCircle.svelte b/src/lib/icons/IconCaretUpCircle.svelte deleted file mode 100644 index fd14c00..0000000 --- a/src/lib/icons/IconCaretUpCircle.svelte +++ /dev/null @@ -1,5 +0,0 @@ -Caret Up Circle diff --git a/src/lib/icons/IconChatbubblesOutline.svelte b/src/lib/icons/IconChatbubblesOutline.svelte deleted file mode 100644 index 13e49c2..0000000 --- a/src/lib/icons/IconChatbubblesOutline.svelte +++ /dev/null @@ -1,19 +0,0 @@ - - Chatbubbles - - - diff --git a/src/lib/icons/IconFingerPrintOutline.svelte b/src/lib/icons/IconFingerPrintOutline.svelte deleted file mode 100644 index 8d3956c..0000000 --- a/src/lib/icons/IconFingerPrintOutline.svelte +++ /dev/null @@ -1,7 +0,0 @@ - - Finger Print - - diff --git a/src/lib/icons/IconHeartSharp.svelte b/src/lib/icons/IconHeartSharp.svelte deleted file mode 100644 index 4c3cb4e..0000000 --- a/src/lib/icons/IconHeartSharp.svelte +++ /dev/null @@ -1,7 +0,0 @@ - - Heart - - diff --git a/src/lib/icons/IconLinkOutline.svelte b/src/lib/icons/IconLinkOutline.svelte deleted file mode 100644 index 33fbe86..0000000 --- a/src/lib/icons/IconLinkOutline.svelte +++ /dev/null @@ -1,11 +0,0 @@ - - Link - - diff --git a/src/lib/icons/IconLogoGithub.svelte b/src/lib/icons/IconLogoGithub.svelte deleted file mode 100644 index 5b0834f..0000000 --- a/src/lib/icons/IconLogoGithub.svelte +++ /dev/null @@ -1,7 +0,0 @@ - - Logo Github - - diff --git a/src/lib/icons/IconMailOutline.svelte b/src/lib/icons/IconMailOutline.svelte deleted file mode 100644 index 802d947..0000000 --- a/src/lib/icons/IconMailOutline.svelte +++ /dev/null @@ -1,24 +0,0 @@ - - Mail - - - diff --git a/src/lib/icons/IconPaypal.svelte b/src/lib/icons/IconPaypal.svelte deleted file mode 100644 index 1380188..0000000 --- a/src/lib/icons/IconPaypal.svelte +++ /dev/null @@ -1,7 +0,0 @@ -Logo Paypal diff --git a/src/lib/icons/IconSearchOutline.svelte b/src/lib/icons/IconSearchOutline.svelte deleted file mode 100644 index 6d49667..0000000 --- a/src/lib/icons/IconSearchOutline.svelte +++ /dev/null @@ -1,18 +0,0 @@ - - Search - - - diff --git a/src/lib/stores.ts b/src/lib/stores.ts deleted file mode 100644 index a907d96..0000000 --- a/src/lib/stores.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { writable } from 'svelte/store' - -export const scroll = writable(0) diff --git a/src/lib/svgs/Signature.svelte b/src/lib/svgs/Signature.svelte deleted file mode 100644 index c928f20..0000000 --- a/src/lib/svgs/Signature.svelte +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - diff --git a/src/lib/utils.ts b/src/lib/utils.ts deleted file mode 100644 index 0581a76..0000000 --- a/src/lib/utils.ts +++ /dev/null @@ -1,5 +0,0 @@ -export function readingTimeInMinutes(text: string, options: { wpm?: number } = {}): number { - const cleaned = text.replace(/(<.*?>)|(\\n)|(&#\d*?;)/g, '') - const words = cleaned.split(' ').length - return Math.round(words / (options.wpm ?? 200)) -} diff --git a/src/routes/__layout.svelte b/src/routes/__layout.svelte deleted file mode 100644 index fd4aefe..0000000 --- a/src/routes/__layout.svelte +++ /dev/null @@ -1,83 +0,0 @@ - - -
    -
    - - diff --git a/src/routes/about.svelte b/src/routes/about.svelte deleted file mode 100644 index 40240fc..0000000 --- a/src/routes/about.svelte +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - {data.title} - - - - {#if data.content} - - decoration - {/if} - - - diff --git a/src/routes/api/[type]/[slug].json.ts b/src/routes/api/[type]/[slug].json.ts deleted file mode 100644 index a8c3dcc..0000000 --- a/src/routes/api/[type]/[slug].json.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { SDK } from '$lib/gql' -import type { RequestHandler } from '@sveltejs/kit' - -export const get: RequestHandler<{ type: string; slug: string }, any> = async (args) => { - const { type, slug } = args.params - const all = slug === '*' - - switch (type) { - case 'pages': { - if (all) { - const data = await SDK.PagesMany() - return { body: data.pages?.nodes } - } else { - const data = await SDK.PagesOne({ slug }) - return { body: data.page } - } - } - case 'works': { - if (all) { - const data = await SDK.WorksMany() - return { body: data.works?.nodes } - } else { - const data = await SDK.WorksOne({ slug }) - return { body: data.work } - } - } - case 'projects': { - if (all) { - const data = await SDK.ProjectsMany() - return { body: data.projects?.nodes } - } else { - const data = await SDK.ProjectsOne({ slug }) - return { body: data.project } - } - } - - case 'media': { - if (all) { - const data = await SDK.MediaItemsMany() - return { body: data.mediaItems?.nodes } - } else { - const data = await SDK.MediaItemsOne({ slug }) - return { body: data.mediaItem } - } - } - - case 'posts': { - if (all) { - const data = await SDK.PostsMany() - return { body: data.posts?.nodes } - } else { - const data = await SDK.PostsOne({ slug }) - return { body: data.post } - } - } - - case 'tags': { - if (all) { - const data = await SDK.TagsMany() - const sorted = [...data.tags.nodes].filter((t) => t.count).sort((a, b) => b.count - a.count) - return { body: sorted } - } - } - - case 'postsByTags': { - const data = await SDK.PostsManyByTag({ tag: slug }) - return { body: data.posts.nodes } - } - - default: - return { status: 404 } - } -} diff --git a/src/routes/api/search.json.ts b/src/routes/api/search.json.ts deleted file mode 100644 index c7a5cd2..0000000 --- a/src/routes/api/search.json.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { SDK } from '$lib/gql' -import type { GQLBasePageFragment } from '$lib/gql/gen' -import lunr from 'lunr' - -function removeHTML(s: string) { - return s.replace(/<.*?>|\s+|&#\d+;/g, ' ').trim() -} - -function convertForIdx(type: string, items: GQLBasePageFragment[]) { - const keys: (keyof GQLBasePageFragment)[] = ['title', 'content', 'slug'] - return items.map((item) => ({ - url: `${type}/${item.slug}`, - data: keys.map((field) => removeHTML(item[field] ?? '')).join(' '), - })) -} - -export const get = async () => { - const { __typename, ...all } = await SDK.Search() - const converted = Object.entries(all) - .map(([type, data]) => convertForIdx(type, data.nodes)) - .flat() - - const idx = lunr(function () { - this.ref('url') - this.field('data') - converted.forEach((doc) => this.add(doc)) - }) - - return { body: idx } -} diff --git a/src/routes/blog/[slug].svelte b/src/routes/blog/[slug].svelte deleted file mode 100644 index b595f92..0000000 --- a/src/routes/blog/[slug].svelte +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - Blog - {data.title} - - - - - {#if data.content} - - {/if} - - - - diff --git a/src/routes/blog/index.svelte b/src/routes/blog/index.svelte deleted file mode 100644 index 6b55d25..0000000 --- a/src/routes/blog/index.svelte +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - Blog - - - - Explore Tags - -
    - - {#each data as post} - - {/each} - - - diff --git a/src/routes/blog/tags/[slug].svelte b/src/routes/blog/tags/[slug].svelte deleted file mode 100644 index 7352d9e..0000000 --- a/src/routes/blog/tags/[slug].svelte +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - Blog - {slug} - - - - {#each data as post} - - {/each} - diff --git a/src/routes/contact.svelte b/src/routes/contact.svelte deleted file mode 100644 index c953c2f..0000000 --- a/src/routes/contact.svelte +++ /dev/null @@ -1,35 +0,0 @@ - - - - Contact - - - - - diff --git a/src/routes/index.svelte b/src/routes/index.svelte deleted file mode 100644 index c97cb1c..0000000 --- a/src/routes/index.svelte +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - Niccolò Borgioli - - -
    -
    -

    - - -

    - -

    Design & Development

    -
    - -
    - decoration - -
    -
    - - diff --git a/src/routes/privacy.svelte b/src/routes/privacy.svelte deleted file mode 100644 index 56fc2d1..0000000 --- a/src/routes/privacy.svelte +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - {data.title} - - - - {#if data.content} - - {/if} - diff --git a/src/routes/projects.svelte b/src/routes/projects.svelte deleted file mode 100644 index b3ab6d6..0000000 --- a/src/routes/projects.svelte +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - Projects - - - - {#each data as project} - - {/each} - diff --git a/src/routes/search.svelte b/src/routes/search.svelte deleted file mode 100644 index 963859e..0000000 --- a/src/routes/search.svelte +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - {#if needle && needle.indexOf('haystack') !== -1} -

    ⛳️✨ Here is a flag for you. ✨⛳

    - {/if} - {#if needle} -
      - {#each results as result (result.ref)} - - {/each} -
    - {/if} -
    - - diff --git a/src/routes/support.svelte b/src/routes/support.svelte deleted file mode 100644 index f9c9277..0000000 --- a/src/routes/support.svelte +++ /dev/null @@ -1,27 +0,0 @@ - - - - Support - - - - - diff --git a/src/routes/works/[slug].svelte b/src/routes/works/[slug].svelte deleted file mode 100644 index 710cfe3..0000000 --- a/src/routes/works/[slug].svelte +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - Works - - - - - diff --git a/src/routes/works/index.svelte b/src/routes/works/index.svelte deleted file mode 100644 index e37fc61..0000000 --- a/src/routes/works/index.svelte +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - Works - - - - {#each data as work} - - {/each} - diff --git a/static/images/monogramm.png b/static/images/monogramm.png deleted file mode 100644 index 90f09b825c076f86436d5f0778b5585716d67272..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8317 zcmcIp2UJtrnvP!NB25IP3mAG0QbVLjCv@puTIeK!(4~kp0RaI4ktQHrKsrkAU_=B9 zAYBBcND*mD$OCuI+nlO>h*Lx2g~QC>D|e(r8) z9Kufq`fFYU_HPO;#Q^a_p*u;gzg@mE9q-@fj_6`U=C6zx1gDV-R zlb0730fYJa`U?4q3Sm4QVb`Rjq+r4#FcA?!pdpC!M|;`$38HcAr&IhfhY|{B=jn{~ za>k(9PUp0-#dv$kK%qd+_UGhY&JKUij>i4DeP9UKsRVXSNEr5y>L@?w|3>{(@-OOG zCyW;c=Y+xjwSj+n#9!in83@ex?}zx=VE>)6me&8Q?(Y6i+rW7#`v61yY1DsO(|p{*o$U+%TT{Ah=Or*ssU^xpr2b^|h;o~i;H zQdv>rnv{fupoq{P(*V~Yz*uJoe0b)}kgs6eANN2V00jm1S49CAf7K)u z8WbW=P;t1mhgl(zGhxoaJOAPp2!tomI}xv;Ab%;UtycGyaDPNBE%isJ!0Q_>H1^@= zsBMT_Bm%ZC?l(@lD%DbaB0hIB!z%VCnF~`b<=s4zJj2+J%I@muC6^~k*>kTC7A0|% zqK@sZbi`aJL}#Fs~V#t+=&@p zPtW*ChmiEMVzZlm7Vv5_1Fh+cKD_DsNt@}7HEwn zSIj9<@G}T<3&8p^@D)65d)ID#R$Fu|c6~ z+p&ljra*Tzv-7i4gG z$JEq6uGQj8tVil|%NHG8Pt^V-cUyPgFj=BJL*c3Npn_r3a5V=f5ove?k?r=O{d2qf zTQst5a%SH-9}>;X+p)a%M;co<=G>lMn%hkGf&{BaALsbu&c@ZKP{)2d^{5|51sAW<1*F5g9bGI22{7%X6u{ zTA*=i9o;swk*r?8mZB~XO>BR)p;vOL+xD6O45r9)>26PtGD(C26*;kuhsVW->YR9w z%<l6Pe~&=+#@^OIFqSKlZxxT}zRCqACCNR8uc zmC2#OagXgaH4bX3*d8|OXf|d_MGk8Jq!V49A75}{jOYAbK9Gmp5fKp~+VTtZ-`O%6 zF_T(f5i@$@Eyft(Bu1L3_GMtB%4E$oGo57BLA4gv4sVCNU=jVi8`c9n9Cjt{R`I zr8MMl7P33oPtcyeM0##y*-I#_1G`)|YUTPkJ$-xyzZ>q3!ltM%sCxwaD^k1(Nyaaz zl^gkbFpo-0N;VXXCLF9lWz!B0{P)L)f*lB7^An!b*MF3jk{Te5P}pv7hwvw=xv?ZT z<|}fL_j!~HrQx;L?jWhjiRZ#D$UYA`-0BmSlX#B>0|Uq(ulOsQ%?%Ad zq$DOLVvp@bOf`anf-K?8!HZRNw6qV#-DC^&N`w;Om5@6`XV38Q@H85jo0~^vEOm6q z8{E9Pg|@M=NmGI%;on}r*0dL<7uwm|o9BvC9wELp*Ae!+T7llhYyN0-1wUh4Qc|iX zG?ApVxY+3-eqm@34BPrHZY)f%WK>p{((Nw@CRY-fschN(RPy@uYYl~5VH*nS=Fs$2TsV;_8zCJCGMj813JMY`_J^Wa&@23-3q)&7%(s}_@cHL zSZcs$T)NVAdvCqYRgBRppmi$_)2O1Vs-Nd5u0#<}r4SJjVaY*Wq094jc9zZApSP&F zIna`wkv#IL`q1HFpt(qdDhN25T!9LFe?Li*dV!GaV_?U(8JO1ekrf_~FdXx!TIVd} z&V7~q*xFVDQBl$DxDf|x97SYh<7>?XVR6vJ z{)y4iG!dt&@{PM~{ zB)vIT_g;87Mb)?)1vK$qnrxj}TyI~WeqK~#hpMXT@CxjT0KQ(0Bgva}BHE3-%TFg0 zUd3)^XjEKW?8nyzFfAo@Uy6Ex7JNy!+=vD#ceAvt%v@OP7DsTGV(6#D>eD~VH0g3A?)YDY>Diu z**~RaWTvz}HzKkq`Gu%R8j(+Pco^e|DOqJFUrAOpG>lr^ym?bckIW+s6ap&Jw&|#{ zhK7b=YvD$ZgjJuWjHsxnlOY_`G58P%56kRjO68_(BgHYQ)-kom(F?K10= zlNMdmEw>wj3>PM5j(xUQh8hiH>!bsIkdz7O@CCIJg>^WzUfc3xR@+rpkM0;P%X=m) zA~NzQE9+aY6q)+ zMW&@a!Z@gsV@Rhl>adXS1Kerk#ESgrKsG9;;{Mn;B?mW~dI&!bYw)wMPp;-DUQBhhFf6jfTvcO8B7c4@on z_X{kO9}O>)wr9)So`ieom3TQaF+*m5?yR~W92{s*?hg+SN6z;p(75X5Jy?=EIT&(; zdw?FG^vS3p@YB8HIH~2 zO~W4Bs@fz&<*N}!Wj!(MI}$iN1tmmSOw6n5$rDIZ`93H?yRg>wfB{wHHI@8}{All} z7W*+;;@=^S{@aD7Y*f~Dr9@%!aG$kDgtBNao{4)V0+E-aw(mO0)W>yz;yU+rIKRAc z3naINrR5bLNr<}3qwMV77$!zW&m^^w33}#Pd~o-|!UB47AJ)2`w*|H%Ucn=Hn))l2XzOTMOVFOW7iz^VOm*14-F7 zGt@*h>QbjY>Drd+?u>=pnK?P$J9ST*$Na`rlVkAF&gcwxNpxpUNeQo2D*4Pg^mS%aQ^UjZ&uFIVB^rT6 zO$2-x_dG7g_KblbF*6*8YUjuXA?V4!$6RBK8{`moa|I^yYq3(*)~4LOB7;D<2=Vgf zy3d=pgGOK~OK`3Gw4R;Kl4tp(p{3&tAQ}T%eP2a`re0iH>SEsXm73E#Q`-M~=FpPHKG|Yx5aBWY z)vJ4}V;4bOVBySyAO{8v3>jBeSDg(}$zPY3k&OYKv+beisIK8m(ks_{ffG*iu>aMo z&eGCTY=yyWoYT9q%saIB!T44=D+5CnXLY4YzQ^?}ZP5~+jk-0Su(XE{Z#X+Ui=vx{ zmgcSe<|2$dV|ZMnRr24Cj*f;)SWS?dq0ir6*sHy1?q`@9)q1p=KTon8m_hH*OyZ!eCw9-QDLV ziTu2rqa)Q1g4X{wv)t%wXW$| zS?A(Z<|(7PCIe0!>51X-xcK<^>a46Rx_#}kO!Dg=fxQ|qGZORhQ|4x7chhbKk861f ztxWYZVVXT!i;MeZCm8&_B;k!+#O&POP0evXCtT%e>ZTtjskuk~N+=l)V3_x#NB4 zo7#&S8XDNOv8wg;b@XRTiH653D=X{O)go3}r5)B(fwHXoN5S-0u0(+DhZCl^=jP(N z!9nd2dIR!S)T$4FiOqvRW{8-MmR6`)IWZ_BEsjIk_z=Rx%wx4d|0JrCM%Vg0qFeGp zX}7{T)LHX~opg-4eE2)~`S~-{p0;&@Rxx};*c%>5=Fa#L(83ObC5$HP6}|KR@bRNW zWS31+^+(Qca)4?cG*kU!s5Qn<6v9cvq|ZGP7R)W>y}GJIl(Tt7Z$p@y4b6UblBjw zoGcJIZ}9l-md#GGjUwCc?`uUtJUBWo^?j)P9CW7UD%$j4cb2)g?EVN-TkXXog$^74XM3(kS| z_8T<-ujc?Huj{;Jh}Y5&4i4sz{_*ZK{XlVV%h2MY@k!`9K0c0QJ^HHZb2rI{6C|l1 zb04P#pDOes==cp91tU+J#ER-bl?9+Kro~f9nkB03Z~+$gG&N;Zhc=TD=_eGu5%T-o14EZTxwLN_{}&(F{A+V>6@o|bHIAYt-GWHCt| zuTM4Y`cC^teQh92-BW^w0-PzieP!_7=%{1JQkL)Y-r;ppP--Td{gd_iQcOU~0waA_ ze%WvM-QtC3fmYGGtAzzm88yNfD=cSj&HrglO~U zYUOq|?F2Yv8I`5%?M#S+@(zHOyBIw==+?mAi>!yUzt@%~afIx5u?j7I`LcP)cxfP2Y{Hj^9UR2VPyt<{R0D1L&D@nfx`6RicyqOX{o6s{1Y#8koMCq4>B-%3bna7nBg;7H^vJwD!a^&_Vi2&0tahqu&25XfTbU%re=4Qm$HS! zV|zYxl)3C-S3i~yVLwwTU>9Dcgcp*Ge>g=^xTQCo@$=8i_>z;8>y54aBP#l$JECd0 zpW87+&QXtJMo)oX+sP3oOd+?uqSVXRw{3OHPfh*PW%@XkHIs0vwEp1tvzw?>Bxjx0 z$&wINUQ*&g4Lr!h%i9sJJW8h_g zhs1%s)=FdW3ocnXIo!Ow<#Q92_TteMoAMN`F_ndxPCaoUhx^wE-|;ZJz72`UsHiGC zZ-k`+;bvH6F2J^lC{u29ppH($(e;@F%5P;!kOuTrCwRO_kjthwJos>*5FLN^7MTJ` z!0p=^UrS#xaczg*Edgexqv%1Hg>EA%OV#n zoqJT=k<-DQ6F5@*!KKRFkcWwegb1Dq2gmw0!qkQt&3GE)Ap?-j!q=OXpyMvQ&Khh~ z&*!>%Q`CLs<>eI!dSP-=fPjfo$#QeOCO0rAWo!rq1? zXmle;((|~VKbGG$;^Y<=7C0w;?=c4c28bN%jp>%61~b){TbpxTh)j68=3-Oefv0O8 zp{RTID}#plngK}ED~5)K%|(bO(isH>oY%E8hn?IOYVfCo4*Xp|+tx@_Y1E^d>m{1+-+FA3QTEd)GP3mqPj`Q)>In z3_Q{X;`n1f0Gy|uHGX@~)z;ihPD4Yp@wxl4W}#91yk8HMq#wwFQlgx!EY7U%)Kf(L zqM)?&)c`l~RU&XCZ`LT=X&2x3S%LU~mV^V?=CkG3=pNe{$DAOCB_`F$*+exWqoKK_ zod6_vRe?p5&tR|c{R|yV6pAykXbd!wz4>nUv<~{xlqgOKYNB&CPDSy{`6Pi4A3m`9NwZ8#5&-;eYI^zd zvBwApdh^!NigA%~+N?^MkjR15kPAPTbwUDy z?d`*Tr_6=Yn&ggt=(`{x7dzF|3ZwXS70Mf-;ZyB_c-23;*pDhfW zfsDJ=bBRbzKib;zsC67-c~%rRV83#@=fa3b9U(`nwgAwWxlfm7|AJ@bfV~SeE4sXQV~;(4-eL&AC_ZIyZgA_63RYAMv*fvC zo52L3>Jq+(8jlUH0qoJ&LCG069wDLD{%V0#i59Dk((>|hjR*;Wu-nos@87iP4xJ$pYZ-Ke9VYUB@R zTAG=4rqo;|S77oz0+eRa_V%{UfW62%IR8E|Dsu-3#uULBuE`aanaMn}w&v!GM4kr( zt0ca9eWC#)NrSYek;2ZlpRBH|Aex4Q0h(4X@B}rrVRY4-1rA=!2 z_NrRo{rmSfyuHOi|2vDX1~mHI+gwHM7Z%5p^8!Lbol7|(XfmR+R3t?0OWX1o4D83w zj=ZYs?~gROK04Hh3kV48%N}lay_aj%3-7UYUR_@g_PlERvs`-B;B;8Dl8*Z+|CCZu z4{Usc4U(%%!oa|wBLTjFB>}|>2^_yH&XS-g&GLKrTm2m4;0sY*IxmMDP^c0ET!Q(`&s0ocVDk>3T(nCJ9#`WsdCoIr zb|wJwy{s)?nEbb4r%Pa+iUd$FlGnRQuFk-Mw_@u-E`lYp(ZZHsKH6BD{JZY_zus(ky}kDT_m1QAZOP-43%{q|)f_H&GKPRZq_VbB Jg@X0n{{V{~HaP$Q diff --git a/svelte.config.js b/svelte.config.js deleted file mode 100644 index 94998a0..0000000 --- a/svelte.config.js +++ /dev/null @@ -1,13 +0,0 @@ -import preprocess from 'svelte-preprocess' -import adapter from '@sveltejs/adapter-static' - -/** @type {import('@sveltejs/kit').Config} */ -const config = { - preprocess: preprocess(), - kit: { - prerender: { default: true }, - adapter: adapter(), - }, -} - -export default config diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 5a3879e..0000000 --- a/tsconfig.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "compilerOptions": { - "moduleResolution": "node", - "module": "es2020", - "lib": ["es2020"], - "target": "es2019", - - "noImplicitAny": true, - "alwaysStrict": true, - "strictNullChecks": true, - /** - svelte-preprocess cannot figure out whether you have a value or a type, so tell TypeScript - to enforce using \`import type\` instead of \`import\` for Types. - */ - "importsNotUsedAsValues": "error", - "isolatedModules": true, - "resolveJsonModule": true, - /** - To have warnings/errors of the Svelte compiler at the correct position, - enable source maps by default. - */ - "sourceMap": true, - "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "baseUrl": ".", - "allowJs": true, - "checkJs": true, - "paths": { - "$lib/*": ["src/lib/*"] - } - }, - "include": ["src/**/*.d.ts", "src/**/*.js", "src/**/*.ts", "src/**/*.svelte"] -} From d4e9b2027e8312d22797f0db9c95d5f2cb66219c Mon Sep 17 00:00:00 2001 From: Niccolo Borgioli Date: Fri, 22 Nov 2024 00:42:48 +0100 Subject: [PATCH 02/13] astro first commit --- .gitattributes | 3 + .gitignore | 24 + .vscode/extensions.json | 4 + .vscode/launch.json | 11 + README.md | 68 + astro.config.mjs | 15 + package.json | 25 + pnpm-lock.yaml | 4557 +++++++++++++++++ public/favicon.svg | 9 + readingTime.js | 10 + src/components/AboutImage.astro | 30 + src/components/BaseHead.astro | 46 + src/components/FormattedDate.astro | 17 + src/components/Nav.astro | 127 + src/components/PostAttributes.astro | 39 + src/components/PostList.astro | 37 + src/components/PostPreview.astro | 76 + src/components/Signature.astro | 30 + src/components/SkillBar.astro | 39 + src/components/SpacedLetters.astro | 38 + src/components/Tag.astro | 33 + src/components/Tags.astro | 36 + src/consts.ts | 5 + .../blog/4-useful-typescript-tricks.md | 232 + ...ains-tipsntricks-i-wish-id-known-sooner.md | 76 + ...to-directus-for-gatsby-or-sapper-as-cms.md | 266 + ...a-practical-introduction-to-react-hooks.md | 302 ++ ...nsuming-graphql-endpoints-in-typescript.md | 199 + .../automate-github-releases-with-drone.md | 137 + ...-mongodb-inside-of-docker-the-right-way.md | 67 + .../blog/be-your-own-tiny-image-cdn.md | 98 + ...wnloaded-google-photos-takeout-archives.md | 79 + .../blog/create-a-qr-code-for-google-drive.md | 82 + .../blog/going-beyond-npm-meet-yarn-pnpm.md | 96 + ...oid-killing-your-macbook-laptop-battery.md | 171 + ...to-bring-your-neural-network-to-the-web.md | 340 ++ src/content/blog/how-to-search-in-the-jam.md | 222 + .../images/Battery-Charge-Voltage-vs-Time.png | 3 + src/content/blog/images/DST-cycles-web2.jpg | 3 + .../blog/images/IMG_0160-1024x436.jpeg | 3 + src/content/blog/images/IMG_0160.jpeg | 3 + src/content/blog/images/IMG_1709.jpeg | 3 + src/content/blog/images/IMG_1710.jpeg | 3 + src/content/blog/images/IMG_1710.png | 3 + .../blog/images/IMG_1711-653x1024.jpeg | 3 + src/content/blog/images/IMG_1711.jpeg | 3 + .../Screenshot-2020-01-29-at-14.55.28.png | 3 + .../Screenshot-2020-01-29-at-14.57.05.png | 3 + .../Screenshot-2020-04-11-at-23.25.48.png | 3 + .../Screenshot-2021-01-28-at-12.12.59.png | 3 + .../Screenshot-2021-01-28-at-12.14.03.png | 3 + .../Screenshot-2021-03-23-at-10.20.32.png | 3 + ...shot-2021-03-23-at-10.58.31-1-1024x325.png | 3 + .../Screenshot-2021-03-23-at-10.58.31-1.png | 3 + .../Screenshot-2021-03-23-at-10.58.31.png | 3 + ...lessandra-caretto-cAY9X4rPG3g-unsplash.jpg | 3 + ...ina-grubnyak-1254785-unsplash-1024x683.jpg | 3 + ...alina-grubnyak-1254785-unsplash-scaled.jpg | 3 + ...loureiro-BVyNlchWqzs-unsplash-1024x685.jpg | 3 + ...r-loureiro-BVyNlchWqzs-unsplash-scaled.jpg | 3 + ...seny-togulev-1513013-unsplash-1024x576.jpg | 3 + ...arseny-togulev-1513013-unsplash-scaled.jpg | 3 + .../asoggetti-418839-unsplash-1024x684.jpg | 3 + .../asoggetti-418839-unsplash-scaled.jpg | 3 + .../auth-sequence-auth-code-pkce-1024x833.png | 3 + .../images/auth-sequence-auth-code-pkce.png | 3 + ...rett-jordan-qUp3bejuzs-unsplash-scaled.jpg | 3 + src/content/blog/images/cards-1024x567.jpg | 3 + src/content/blog/images/cards-scaled.jpg | 3 + ...s-barbalis-Vvvl-mbboKk-unsplash-scaled.jpg | 3 + ...-robbins-Ru09fQONJWo-unsplash-1024x683.jpg | 3 + ...on-robbins-Ru09fQONJWo-unsplash-scaled.jpg | 3 + ...le-franchi-g2fJ7d7eKSM-unsplash-scaled.jpg | 3 + .../daniele-franchi-g2fJ7d7eKSM-unsplash.jpg | 3 + src/content/blog/images/data.gif | 3 + ...davisco-5E5N49RWtbA-unsplash-3240x2160.jpg | 3 + .../davisco-5E5N49RWtbA-unsplash-scaled-1.jpg | 3 + ...ranck-v-U3sOwViXhkY-unsplash-2880x2160.jpg | 3 + ...franck-v-U3sOwViXhkY-unsplash-scaled-1.jpg | 3 + ...llaume-bolduc-259596-unsplash-1024x741.jpg | 3 + ...uillaume-bolduc-259596-unsplash-scaled.jpg | 3 + src/content/blog/images/howto-1.jpg | 3 + src/content/blog/images/howto.jpg | 3 + .../hyeryi-sVk8nrCQ06g-unsplash-1024x683.jpg | 3 + .../hyeryi-sVk8nrCQ06g-unsplash-scaled.jpg | 3 + ...el-palacio-ImcUkZ72oUs-unsplash-scaled.jpg | 3 + ...on-abdilla-jZWmw6007EY-unsplash-scaled.jpg | 3 + ...zq0ZQ-unsplash-e1562783699383-1024x484.jpg | 3 + ...pxzq0ZQ-unsplash-e1562783699383-scaled.jpg | 3 + ...an-chng-HgoKvtKpyHA-unsplash-3504x2160.jpg | 3 + ...han-chng-HgoKvtKpyHA-unsplash-scaled-1.jpg | 3 + ...-chesser-JKUTrJ4vK00-unsplash-1024x683.jpg | 3 + ...ke-chesser-JKUTrJ4vK00-unsplash-scaled.jpg | 3 + ...-autumns-Ssr26I0QWVY-unsplash-1024x683.jpg | 3 + ...rk-autumns-Ssr26I0QWVY-unsplash-scaled.jpg | 3 + ...s-spiske-8CWoXxaqGrs-unsplash-1024x683.jpg | 3 + ...kus-spiske-8CWoXxaqGrs-unsplash-scaled.jpg | 3 + .../matt-artz-353210-unsplash-1024x780.jpg | 3 + .../matt-artz-353210-unsplash-scaled.jpg | 3 + ...rsience-QGnm_F_nd1E-unsplash1-1024x683.jpg | 3 + ...meagan-carsience-QGnm_F_nd1E-unsplash1.jpg | 3 + .../milkovi-kYlYwQze5vI-unsplash-1-scaled.jpg | 3 + ...connell-byp5TTxUbL0-unsplash-2880x2160.jpg | 3 + ...-connell-byp5TTxUbL0-unsplash-scaled-1.jpg | 3 + .../noah-silliman-doBrZnp_wqA-unsplash.jpg | 3 + ...-nolbert-xe-ss5Tg2mo-unsplash-1024x740.jpg | 3 + .../pawel-nolbert-xe-ss5Tg2mo-unsplash.jpg | 3 + src/content/blog/images/permissions.gif | 3 + ...yan-almuslem-1302778-unsplash-1024x683.jpg | 3 + ...rayan-almuslem-1302778-unsplash-scaled.jpg | 3 + src/content/blog/images/register-bot.jpg | 3 + ...gunasekara-GK8x_XCcDZg-unsplash-scaled.jpg | 3 + ...hindra-gunasekara-GK8x_XCcDZg-unsplash.jpg | 3 + src/content/blog/images/status.jpg | 3 + ...-kelley-t20pc32VbrU-unsplash-3240x2160.jpg | 3 + ...s-kelley-t20pc32VbrU-unsplash-scaled-1.jpg | 3 + ...-fischer-PkbZahEG2Ng-unsplash-1024x497.jpg | 3 + ...as-fischer-PkbZahEG2Ng-unsplash-scaled.jpg | 3 + ...oberanes-gCeH4z9m7bg-unsplash-991x1024.jpg | 3 + .../uriel-soberanes-gCeH4z9m7bg-unsplash.jpg | 3 + ...ud-from-heaven-to-the-depths-of-seafile.md | 161 + src/content/blog/matomo-vs-ublock-origin.md | 185 + ...itor-your-self-hosted-services-for-free.md | 166 + ...ing-made-simple-easily-reduce-bundle-js.md | 120 + ...ce-docker-compose-files-with-yaml-magic.md | 53 + src/content/blog/rust-in-python-made-easy.md | 223 + ...up-your-docker-builds-with-dockerignore.md | 74 + .../blog/step-up-oauth-security-with-pkce.md | 79 + ...ting-detecting-dark-mode-in-the-browser.md | 149 + .../blog/tales-of-learning-go-from-ts.md | 144 + src/content/blog/telegram-bots-are-easy.md | 319 ++ ...-security-checklist-for-modern-websites.md | 226 + .../blog/the-powerful-es6-proxy-object.md | 117 + ...traefik-and-regexp-to-bypass-adblockers.md | 87 + ...mes-i-feel-we-shoot-ourself-in-the-foot.md | 36 + ...-the-next-big-thing-a-reacts-lover-view.md | 192 + ...ss-browser-extensions-without-the-tears.md | 211 + ...rite-your-own-drone-plugin-from-scratch.md | 169 + src/content/config.ts | 26 + src/content/images/about.webp | 3 + src/content/images/home.png | 3 + src/content/page/about.mdx | 63 + src/content/page/privacy.md | 28 + src/env.d.ts | 1 + src/layouts/BlogPost.astro | 36 + src/layouts/PageWithTitle.astro | 52 + src/layouts/Root.astro | 34 + src/pages/[...page].astro | 19 + src/pages/blog/[...slug].astro | 19 + src/pages/blog/index.astro | 11 + src/pages/index.astro | 90 + src/pages/rss.xml.js | 16 + src/pages/tag/[...tag].astro | 28 + src/styles/global.css | 86 + src/styles/preflight.css | 462 ++ tsconfig.json | 6 + 156 files changed, 11589 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .vscode/extensions.json create mode 100644 .vscode/launch.json create mode 100644 README.md create mode 100644 astro.config.mjs create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 public/favicon.svg create mode 100644 readingTime.js create mode 100644 src/components/AboutImage.astro create mode 100644 src/components/BaseHead.astro create mode 100644 src/components/FormattedDate.astro create mode 100644 src/components/Nav.astro create mode 100644 src/components/PostAttributes.astro create mode 100644 src/components/PostList.astro create mode 100644 src/components/PostPreview.astro create mode 100644 src/components/Signature.astro create mode 100644 src/components/SkillBar.astro create mode 100644 src/components/SpacedLetters.astro create mode 100644 src/components/Tag.astro create mode 100644 src/components/Tags.astro create mode 100644 src/consts.ts create mode 100644 src/content/blog/4-useful-typescript-tricks.md create mode 100644 src/content/blog/5-jetbrains-tipsntricks-i-wish-id-known-sooner.md create mode 100644 src/content/blog/a-guide-to-directus-for-gatsby-or-sapper-as-cms.md create mode 100644 src/content/blog/a-practical-introduction-to-react-hooks.md create mode 100644 src/content/blog/a-sane-and-efficient-guide-for-consuming-graphql-endpoints-in-typescript.md create mode 100644 src/content/blog/automate-github-releases-with-drone.md create mode 100644 src/content/blog/backup-mongodb-inside-of-docker-the-right-way.md create mode 100644 src/content/blog/be-your-own-tiny-image-cdn.md create mode 100644 src/content/blog/cleanup-downloaded-google-photos-takeout-archives.md create mode 100644 src/content/blog/create-a-qr-code-for-google-drive.md create mode 100644 src/content/blog/going-beyond-npm-meet-yarn-pnpm.md create mode 100644 src/content/blog/how-to-avoid-killing-your-macbook-laptop-battery.md create mode 100644 src/content/blog/how-to-bring-your-neural-network-to-the-web.md create mode 100644 src/content/blog/how-to-search-in-the-jam.md create mode 100644 src/content/blog/images/Battery-Charge-Voltage-vs-Time.png create mode 100644 src/content/blog/images/DST-cycles-web2.jpg create mode 100644 src/content/blog/images/IMG_0160-1024x436.jpeg create mode 100644 src/content/blog/images/IMG_0160.jpeg create mode 100644 src/content/blog/images/IMG_1709.jpeg create mode 100644 src/content/blog/images/IMG_1710.jpeg create mode 100644 src/content/blog/images/IMG_1710.png create mode 100644 src/content/blog/images/IMG_1711-653x1024.jpeg create mode 100644 src/content/blog/images/IMG_1711.jpeg create mode 100644 src/content/blog/images/Screenshot-2020-01-29-at-14.55.28.png create mode 100644 src/content/blog/images/Screenshot-2020-01-29-at-14.57.05.png create mode 100644 src/content/blog/images/Screenshot-2020-04-11-at-23.25.48.png create mode 100644 src/content/blog/images/Screenshot-2021-01-28-at-12.12.59.png create mode 100644 src/content/blog/images/Screenshot-2021-01-28-at-12.14.03.png create mode 100644 src/content/blog/images/Screenshot-2021-03-23-at-10.20.32.png create mode 100644 src/content/blog/images/Screenshot-2021-03-23-at-10.58.31-1-1024x325.png create mode 100644 src/content/blog/images/Screenshot-2021-03-23-at-10.58.31-1.png create mode 100644 src/content/blog/images/Screenshot-2021-03-23-at-10.58.31.png create mode 100644 src/content/blog/images/alessandra-caretto-cAY9X4rPG3g-unsplash.jpg create mode 100644 src/content/blog/images/alina-grubnyak-1254785-unsplash-1024x683.jpg create mode 100644 src/content/blog/images/alina-grubnyak-1254785-unsplash-scaled.jpg create mode 100644 src/content/blog/images/amador-loureiro-BVyNlchWqzs-unsplash-1024x685.jpg create mode 100644 src/content/blog/images/amador-loureiro-BVyNlchWqzs-unsplash-scaled.jpg create mode 100644 src/content/blog/images/arseny-togulev-1513013-unsplash-1024x576.jpg create mode 100644 src/content/blog/images/arseny-togulev-1513013-unsplash-scaled.jpg create mode 100644 src/content/blog/images/asoggetti-418839-unsplash-1024x684.jpg create mode 100644 src/content/blog/images/asoggetti-418839-unsplash-scaled.jpg create mode 100644 src/content/blog/images/auth-sequence-auth-code-pkce-1024x833.png create mode 100644 src/content/blog/images/auth-sequence-auth-code-pkce.png create mode 100644 src/content/blog/images/brett-jordan-qUp3bejuzs-unsplash-scaled.jpg create mode 100644 src/content/blog/images/cards-1024x567.jpg create mode 100644 src/content/blog/images/cards-scaled.jpg create mode 100644 src/content/blog/images/chris-barbalis-Vvvl-mbboKk-unsplash-scaled.jpg create mode 100644 src/content/blog/images/clayton-robbins-Ru09fQONJWo-unsplash-1024x683.jpg create mode 100644 src/content/blog/images/clayton-robbins-Ru09fQONJWo-unsplash-scaled.jpg create mode 100644 src/content/blog/images/daniele-franchi-g2fJ7d7eKSM-unsplash-scaled.jpg create mode 100644 src/content/blog/images/daniele-franchi-g2fJ7d7eKSM-unsplash.jpg create mode 100644 src/content/blog/images/data.gif create mode 100644 src/content/blog/images/davisco-5E5N49RWtbA-unsplash-3240x2160.jpg create mode 100644 src/content/blog/images/davisco-5E5N49RWtbA-unsplash-scaled-1.jpg create mode 100644 src/content/blog/images/franck-v-U3sOwViXhkY-unsplash-2880x2160.jpg create mode 100644 src/content/blog/images/franck-v-U3sOwViXhkY-unsplash-scaled-1.jpg create mode 100644 src/content/blog/images/guillaume-bolduc-259596-unsplash-1024x741.jpg create mode 100644 src/content/blog/images/guillaume-bolduc-259596-unsplash-scaled.jpg create mode 100644 src/content/blog/images/howto-1.jpg create mode 100644 src/content/blog/images/howto.jpg create mode 100644 src/content/blog/images/hyeryi-sVk8nrCQ06g-unsplash-1024x683.jpg create mode 100644 src/content/blog/images/hyeryi-sVk8nrCQ06g-unsplash-scaled.jpg create mode 100644 src/content/blog/images/israel-palacio-ImcUkZ72oUs-unsplash-scaled.jpg create mode 100644 src/content/blog/images/jason-abdilla-jZWmw6007EY-unsplash-scaled.jpg create mode 100644 src/content/blog/images/jielin-chen-pKQIpxzq0ZQ-unsplash-e1562783699383-1024x484.jpg create mode 100644 src/content/blog/images/jielin-chen-pKQIpxzq0ZQ-unsplash-e1562783699383-scaled.jpg create mode 100644 src/content/blog/images/jonathan-chng-HgoKvtKpyHA-unsplash-3504x2160.jpg create mode 100644 src/content/blog/images/jonathan-chng-HgoKvtKpyHA-unsplash-scaled-1.jpg create mode 100644 src/content/blog/images/luke-chesser-JKUTrJ4vK00-unsplash-1024x683.jpg create mode 100644 src/content/blog/images/luke-chesser-JKUTrJ4vK00-unsplash-scaled.jpg create mode 100644 src/content/blog/images/mark-autumns-Ssr26I0QWVY-unsplash-1024x683.jpg create mode 100644 src/content/blog/images/mark-autumns-Ssr26I0QWVY-unsplash-scaled.jpg create mode 100644 src/content/blog/images/markus-spiske-8CWoXxaqGrs-unsplash-1024x683.jpg create mode 100644 src/content/blog/images/markus-spiske-8CWoXxaqGrs-unsplash-scaled.jpg create mode 100644 src/content/blog/images/matt-artz-353210-unsplash-1024x780.jpg create mode 100644 src/content/blog/images/matt-artz-353210-unsplash-scaled.jpg create mode 100644 src/content/blog/images/meagan-carsience-QGnm_F_nd1E-unsplash1-1024x683.jpg create mode 100644 src/content/blog/images/meagan-carsience-QGnm_F_nd1E-unsplash1.jpg create mode 100644 src/content/blog/images/milkovi-kYlYwQze5vI-unsplash-1-scaled.jpg create mode 100644 src/content/blog/images/natasha-connell-byp5TTxUbL0-unsplash-2880x2160.jpg create mode 100644 src/content/blog/images/natasha-connell-byp5TTxUbL0-unsplash-scaled-1.jpg create mode 100644 src/content/blog/images/noah-silliman-doBrZnp_wqA-unsplash.jpg create mode 100644 src/content/blog/images/pawel-nolbert-xe-ss5Tg2mo-unsplash-1024x740.jpg create mode 100644 src/content/blog/images/pawel-nolbert-xe-ss5Tg2mo-unsplash.jpg create mode 100644 src/content/blog/images/permissions.gif create mode 100644 src/content/blog/images/rayan-almuslem-1302778-unsplash-1024x683.jpg create mode 100644 src/content/blog/images/rayan-almuslem-1302778-unsplash-scaled.jpg create mode 100644 src/content/blog/images/register-bot.jpg create mode 100644 src/content/blog/images/ruchindra-gunasekara-GK8x_XCcDZg-unsplash-scaled.jpg create mode 100644 src/content/blog/images/ruchindra-gunasekara-GK8x_XCcDZg-unsplash.jpg create mode 100644 src/content/blog/images/status.jpg create mode 100644 src/content/blog/images/thomas-kelley-t20pc32VbrU-unsplash-3240x2160.jpg create mode 100644 src/content/blog/images/thomas-kelley-t20pc32VbrU-unsplash-scaled-1.jpg create mode 100644 src/content/blog/images/tobias-fischer-PkbZahEG2Ng-unsplash-1024x497.jpg create mode 100644 src/content/blog/images/tobias-fischer-PkbZahEG2Ng-unsplash-scaled.jpg create mode 100644 src/content/blog/images/uriel-soberanes-gCeH4z9m7bg-unsplash-991x1024.jpg create mode 100644 src/content/blog/images/uriel-soberanes-gCeH4z9m7bg-unsplash.jpg create mode 100644 src/content/blog/leaving-nextcloud-from-heaven-to-the-depths-of-seafile.md create mode 100644 src/content/blog/matomo-vs-ublock-origin.md create mode 100644 src/content/blog/monitor-your-self-hosted-services-for-free.md create mode 100644 src/content/blog/react-code-splitting-made-simple-easily-reduce-bundle-js.md create mode 100644 src/content/blog/reduce-docker-compose-files-with-yaml-magic.md create mode 100644 src/content/blog/rust-in-python-made-easy.md create mode 100644 src/content/blog/speed-up-your-docker-builds-with-dockerignore.md create mode 100644 src/content/blog/step-up-oauth-security-with-pkce.md create mode 100644 src/content/blog/supporting-detecting-dark-mode-in-the-browser.md create mode 100644 src/content/blog/tales-of-learning-go-from-ts.md create mode 100644 src/content/blog/telegram-bots-are-easy.md create mode 100644 src/content/blog/the-essential-no-excuses-security-checklist-for-modern-websites.md create mode 100644 src/content/blog/the-powerful-es6-proxy-object.md create mode 100644 src/content/blog/use-traefik-and-regexp-to-bypass-adblockers.md create mode 100644 src/content/blog/why-i-love-js-but-sometimes-i-feel-we-shoot-ourself-in-the-foot.md create mode 100644 src/content/blog/why-i-think-svelte-is-the-next-big-thing-a-reacts-lover-view.md create mode 100644 src/content/blog/write-cross-browser-extensions-without-the-tears.md create mode 100644 src/content/blog/write-your-own-drone-plugin-from-scratch.md create mode 100644 src/content/config.ts create mode 100644 src/content/images/about.webp create mode 100644 src/content/images/home.png create mode 100644 src/content/page/about.mdx create mode 100644 src/content/page/privacy.md create mode 100644 src/env.d.ts create mode 100644 src/layouts/BlogPost.astro create mode 100644 src/layouts/PageWithTitle.astro create mode 100644 src/layouts/Root.astro create mode 100644 src/pages/[...page].astro create mode 100644 src/pages/blog/[...slug].astro create mode 100644 src/pages/blog/index.astro create mode 100644 src/pages/index.astro create mode 100644 src/pages/rss.xml.js create mode 100644 src/pages/tag/[...tag].astro create mode 100644 src/styles/global.css create mode 100644 src/styles/preflight.css create mode 100644 tsconfig.json diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..3ba4998 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +src/images/* filter=lfs diff=lfs merge=lfs -text +*.afphoto filter=lfs diff=lfs merge=lfs -text +*.afdesign filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..16d54bb --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# 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/ diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..56f043d --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,4 @@ +{ + "recommendations": ["astro-build.astro-vscode", "unifiedjs.vscode-mdx"], + "unwantedRecommendations": [] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..d642209 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,11 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "command": "./node_modules/.bin/astro dev", + "name": "Development server", + "request": "launch", + "type": "node-terminal" + } + ] +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..758716e --- /dev/null +++ b/README.md @@ -0,0 +1,68 @@ +# Astro Starter Kit: Blog + +```sh +npm create astro@latest -- --template blog +``` + +[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/withastro/astro/tree/latest/examples/blog) +[![Open with CodeSandbox](https://assets.codesandbox.io/github/button-edit-lime.svg)](https://codesandbox.io/p/sandbox/github/withastro/astro/tree/latest/examples/blog) +[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/withastro/astro?devcontainer_path=.devcontainer/blog/devcontainer.json) + +> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun! + +![blog](https://github.com/withastro/astro/assets/2244813/ff10799f-a816-4703-b967-c78997e8323d) + +Features: + +- ✅ Minimal styling (make it your own!) +- ✅ 100/100 Lighthouse performance +- ✅ SEO-friendly with canonical URLs and OpenGraph data +- ✅ Sitemap support +- ✅ RSS Feed support +- ✅ Markdown & MDX support + +## 🚀 Project Structure + +Inside of your Astro project, you'll see the following folders and files: + +```text +├── public/ +├── src/ +│   ├── components/ +│   ├── content/ +│   ├── layouts/ +│   └── pages/ +├── astro.config.mjs +├── README.md +├── package.json +└── tsconfig.json +``` + +Astro looks for `.astro` or `.md` files in the `src/pages/` directory. Each page is exposed as a route based on its file name. + +There's nothing special about `src/components/`, but that's where we like to put any Astro/React/Vue/Svelte/Preact components. + +The `src/content/` directory contains "collections" of related Markdown and MDX documents. Use `getCollection()` to retrieve posts from `src/content/blog/`, and type-check your frontmatter using an optional schema. See [Astro's Content Collections docs](https://docs.astro.build/en/guides/content-collections/) to learn more. + +Any static assets, like images, can be placed in the `public/` directory. + +## 🧞 Commands + +All commands are run from the root of the project, from a terminal: + +| Command | Action | +| :------------------------ | :----------------------------------------------- | +| `npm install` | Installs dependencies | +| `npm run dev` | Starts local dev server at `localhost:4321` | +| `npm run build` | Build your production site to `./dist/` | +| `npm run preview` | Preview your build locally, before deploying | +| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` | +| `npm run astro -- --help` | Get help using the Astro CLI | + +## 👀 Want to learn more? + +Check out [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat). + +## Credit + +This theme is based off of the lovely [Bear Blog](https://github.com/HermanMartinus/bearblog/). diff --git a/astro.config.mjs b/astro.config.mjs new file mode 100644 index 0000000..489a48a --- /dev/null +++ b/astro.config.mjs @@ -0,0 +1,15 @@ +// @ts-check +import { defineConfig } from 'astro/config' +import mdx from '@astrojs/mdx' + +import sitemap from '@astrojs/sitemap' +import { remarkReadingTime } from './readingTime' + +// https://astro.build/config +export default defineConfig({ + site: 'https://example.com', + integrations: [mdx(), sitemap()], + markdown: { + remarkPlugins: [remarkReadingTime], + }, +}) diff --git a/package.json b/package.json new file mode 100644 index 0000000..f3ebdad --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "private": true, + "type": "module", + "scripts": { + "astro": "astro", + "build": "astro check && astro build", + "dev": "astro dev", + "preview": "astro preview", + "start": "astro dev" + }, + "dependencies": { + "@astrojs/check": "^0.9.4", + "@astrojs/mdx": "^3.1.9", + "@astrojs/rss": "^4.0.9", + "@astrojs/sitemap": "^3.2.1", + "@fontsource-variable/jost": "^5.1.1", + "@fontsource-variable/playfair-display": "^5.1.0", + "astro": "^4.16.13", + "mdast-util-to-string": "^4.0.0", + "reading-time": "^1.5.0", + "sharp": "^0.33.5", + "typescript": "^5.6.3" + }, + "packageManager": "pnpm@9.12.3" +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..903e8bb --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,4557 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@astrojs/check': + specifier: ^0.9.4 + version: 0.9.4(typescript@5.6.3) + '@astrojs/mdx': + specifier: ^3.1.9 + version: 3.1.9(astro@4.16.13(rollup@4.27.3)(typescript@5.6.3)) + '@astrojs/rss': + specifier: ^4.0.9 + version: 4.0.9 + '@astrojs/sitemap': + specifier: ^3.2.1 + version: 3.2.1 + '@fontsource-variable/jost': + specifier: ^5.1.1 + version: 5.1.1 + '@fontsource-variable/playfair-display': + specifier: ^5.1.0 + version: 5.1.0 + astro: + specifier: ^4.16.13 + version: 4.16.13(rollup@4.27.3)(typescript@5.6.3) + mdast-util-to-string: + specifier: ^4.0.0 + version: 4.0.0 + reading-time: + specifier: ^1.5.0 + version: 1.5.0 + sharp: + specifier: ^0.33.5 + version: 0.33.5 + typescript: + specifier: ^5.6.3 + version: 5.6.3 + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@astrojs/check@0.9.4': + resolution: {integrity: sha512-IOheHwCtpUfvogHHsvu0AbeRZEnjJg3MopdLddkJE70mULItS/Vh37BHcI00mcOJcH1vhD3odbpvWokpxam7xA==} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + + '@astrojs/compiler@2.10.3': + resolution: {integrity: sha512-bL/O7YBxsFt55YHU021oL+xz+B/9HvGNId3F9xURN16aeqDK9juHGktdkCSXz+U4nqFACq6ZFvWomOzhV+zfPw==} + + '@astrojs/internal-helpers@0.4.1': + resolution: {integrity: sha512-bMf9jFihO8YP940uD70SI/RDzIhUHJAolWVcO1v5PUivxGKvfLZTLTVVxEYzGYyPsA3ivdLNqMnL5VgmQySa+g==} + + '@astrojs/language-server@2.15.4': + resolution: {integrity: sha512-JivzASqTPR2bao9BWsSc/woPHH7OGSGc9aMxXL4U6egVTqBycB3ZHdBJPuOCVtcGLrzdWTosAqVPz1BVoxE0+A==} + hasBin: true + peerDependencies: + prettier: ^3.0.0 + prettier-plugin-astro: '>=0.11.0' + peerDependenciesMeta: + prettier: + optional: true + prettier-plugin-astro: + optional: true + + '@astrojs/markdown-remark@5.3.0': + resolution: {integrity: sha512-r0Ikqr0e6ozPb5bvhup1qdWnSPUvQu6tub4ZLYaKyG50BXZ0ej6FhGz3GpChKpH7kglRFPObJd/bDyf2VM9pkg==} + + '@astrojs/mdx@3.1.9': + resolution: {integrity: sha512-3jPD4Bff6lIA20RQoonnZkRtZ9T3i0HFm6fcDF7BMsKIZ+xBP2KXzQWiuGu62lrVCmU612N+SQVGl5e0fI+zWg==} + engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0} + peerDependencies: + astro: ^4.8.0 + + '@astrojs/prism@3.1.0': + resolution: {integrity: sha512-Z9IYjuXSArkAUx3N6xj6+Bnvx8OdUSHA8YoOgyepp3+zJmtVYJIl/I18GozdJVW1p5u/CNpl3Km7/gwTJK85cw==} + engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0} + + '@astrojs/rss@4.0.9': + resolution: {integrity: sha512-W1qeLc/WP1vMS5xXa+BnaLU0paeSeGjN8RJVAoBaOIkQuKXjIUA9hvPno89heo73in5i67g40gy70oeeHMqp6A==} + + '@astrojs/sitemap@3.2.1': + resolution: {integrity: sha512-uxMfO8f7pALq0ADL6Lk68UV6dNYjJ2xGUzyjjVj60JLBs5a6smtlkBYv3tQ0DzoqwS7c9n4FUx5lgv0yPo/fgA==} + + '@astrojs/telemetry@3.1.0': + resolution: {integrity: sha512-/ca/+D8MIKEC8/A9cSaPUqQNZm+Es/ZinRv0ZAzvu2ios7POQSsVD+VOj7/hypWNsNM3T7RpfgNq7H2TU1KEHA==} + engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0} + + '@astrojs/yaml2ts@0.2.2': + resolution: {integrity: sha512-GOfvSr5Nqy2z5XiwqTouBBpy5FyI6DEe+/g/Mk5am9SjILN1S5fOEvYK0GuWHg98yS/dobP4m8qyqw/URW35fQ==} + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.26.2': + resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.26.0': + resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.26.2': + resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.25.9': + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.25.9': + resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.25.9': + resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.26.0': + resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.2': + resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-jsx@7.25.9': + resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx@7.25.9': + resolution: {integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.25.9': + resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.0': + resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} + engines: {node: '>=6.9.0'} + + '@emmetio/abbreviation@2.3.3': + resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==} + + '@emmetio/css-abbreviation@2.1.8': + resolution: {integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==} + + '@emmetio/css-parser@0.4.0': + resolution: {integrity: sha512-z7wkxRSZgrQHXVzObGkXG+Vmj3uRlpM11oCZ9pbaz0nFejvCDmAiNDpY75+wgXOcffKpj4rzGtwGaZxfJKsJxw==} + + '@emmetio/html-matcher@1.3.0': + resolution: {integrity: sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==} + + '@emmetio/scanner@1.0.4': + resolution: {integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==} + + '@emmetio/stream-reader-utils@0.1.0': + resolution: {integrity: sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==} + + '@emmetio/stream-reader@2.2.0': + resolution: {integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==} + + '@emnapi/runtime@1.3.1': + resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@fontsource-variable/jost@5.1.1': + resolution: {integrity: sha512-AjyHFqOjU9OKqqniTmptvBK6Z9QAKBcX84yrpglqnKsY5lUrFLZUQE+KKPnFCYa6nIfJtSzW9TaPjazQvIxtCA==} + + '@fontsource-variable/playfair-display@5.1.0': + resolution: {integrity: sha512-51UJAHznXiGkchEOT5AYFuIy9N9m1JE7YxcdOtY0H4SKgzK9YYGKpeCXv3dz2e1gAd+BP2TyR0QXNnVjgeCbgw==} + + '@img/sharp-darwin-arm64@0.33.5': + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.33.5': + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.0.4': + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.0.4': + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.0.4': + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.0.5': + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.0.4': + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.0.4': + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.33.5': + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.33.5': + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-s390x@0.33.5': + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.33.5': + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.33.5': + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.33.5': + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.33.5': + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-ia32@0.33.5': + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.33.5': + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@mdx-js/mdx@3.1.0': + resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@oslojs/encoding@1.1.0': + resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} + + '@rollup/pluginutils@5.1.3': + resolution: {integrity: sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.27.3': + resolution: {integrity: sha512-EzxVSkIvCFxUd4Mgm4xR9YXrcp976qVaHnqom/Tgm+vU79k4vV4eYTjmRvGfeoW8m9LVcsAy/lGjcgVegKEhLQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.27.3': + resolution: {integrity: sha512-LJc5pDf1wjlt9o/Giaw9Ofl+k/vLUaYsE2zeQGH85giX2F+wn/Cg8b3c5CDP3qmVmeO5NzwVUzQQxwZvC2eQKw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.27.3': + resolution: {integrity: sha512-OuRysZ1Mt7wpWJ+aYKblVbJWtVn3Cy52h8nLuNSzTqSesYw1EuN6wKp5NW/4eSre3mp12gqFRXOKTcN3AI3LqA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.27.3': + resolution: {integrity: sha512-xW//zjJMlJs2sOrCmXdB4d0uiilZsOdlGQIC/jjmMWT47lkLLoB1nsNhPUcnoqyi5YR6I4h+FjBpILxbEy8JRg==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.27.3': + resolution: {integrity: sha512-58E0tIcwZ+12nK1WiLzHOD8I0d0kdrY/+o7yFVPRHuVGY3twBwzwDdTIBGRxLmyjciMYl1B/U515GJy+yn46qw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.27.3': + resolution: {integrity: sha512-78fohrpcVwTLxg1ZzBMlwEimoAJmY6B+5TsyAZ3Vok7YabRBUvjYTsRXPTjGEvv/mfgVBepbW28OlMEz4w8wGA==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.27.3': + resolution: {integrity: sha512-h2Ay79YFXyQi+QZKo3ISZDyKaVD7uUvukEHTOft7kh00WF9mxAaxZsNs3o/eukbeKuH35jBvQqrT61fzKfAB/Q==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.27.3': + resolution: {integrity: sha512-Sv2GWmrJfRY57urktVLQ0VKZjNZGogVtASAgosDZ1aUB+ykPxSi3X1nWORL5Jk0sTIIwQiPH7iE3BMi9zGWfkg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.27.3': + resolution: {integrity: sha512-FPoJBLsPW2bDNWjSrwNuTPUt30VnfM8GPGRoLCYKZpPx0xiIEdFip3dH6CqgoT0RnoGXptaNziM0WlKgBc+OWQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.27.3': + resolution: {integrity: sha512-TKxiOvBorYq4sUpA0JT+Fkh+l+G9DScnG5Dqx7wiiqVMiRSkzTclP35pE6eQQYjP4Gc8yEkJGea6rz4qyWhp3g==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.27.3': + resolution: {integrity: sha512-v2M/mPvVUKVOKITa0oCFksnQQ/TqGrT+yD0184/cWHIu0LoIuYHwox0Pm3ccXEz8cEQDLk6FPKd1CCm+PlsISw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.27.3': + resolution: {integrity: sha512-LdrI4Yocb1a/tFVkzmOE5WyYRgEBOyEhWYJe4gsDWDiwnjYKjNs7PS6SGlTDB7maOHF4kxevsuNBl2iOcj3b4A==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.27.3': + resolution: {integrity: sha512-d4wVu6SXij/jyiwPvI6C4KxdGzuZOvJ6y9VfrcleHTwo68fl8vZC5ZYHsCVPUi4tndCfMlFniWgwonQ5CUpQcA==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.27.3': + resolution: {integrity: sha512-/6bn6pp1fsCGEY5n3yajmzZQAh+mW4QPItbiWxs69zskBzJuheb3tNynEjL+mKOsUSFK11X4LYF2BwwXnzWleA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.27.3': + resolution: {integrity: sha512-nBXOfJds8OzUT1qUreT/en3eyOXd2EH5b0wr2bVB5999qHdGKkzGzIyKYaKj02lXk6wpN71ltLIaQpu58YFBoQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.27.3': + resolution: {integrity: sha512-ogfbEVQgIZOz5WPWXF2HVb6En+kWzScuxJo/WdQTqEgeyGkaa2ui5sQav9Zkr7bnNCLK48uxmmK0TySm22eiuw==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.27.3': + resolution: {integrity: sha512-ecE36ZBMLINqiTtSNQ1vzWc5pXLQHlf/oqGp/bSbi7iedcjcNb6QbCBNG73Euyy2C+l/fn8qKWEwxr+0SSfs3w==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.27.3': + resolution: {integrity: sha512-vliZLrDmYKyaUoMzEbMTg2JkerfBjn03KmAw9CykO0Zzkzoyd7o3iZNam/TpyWNjNT+Cz2iO3P9Smv2wgrR+Eg==} + cpu: [x64] + os: [win32] + + '@shikijs/core@1.23.1': + resolution: {integrity: sha512-NuOVgwcHgVC6jBVH5V7iblziw6iQbWWHrj5IlZI3Fqu2yx9awH7OIQkXIcsHsUmY19ckwSgUMgrqExEyP5A0TA==} + + '@shikijs/engine-javascript@1.23.1': + resolution: {integrity: sha512-i/LdEwT5k3FVu07SiApRFwRcSJs5QM9+tod5vYCPig1Ywi8GR30zcujbxGQFJHwYD7A5BUqagi8o5KS+LEVgBg==} + + '@shikijs/engine-oniguruma@1.23.1': + resolution: {integrity: sha512-KQ+lgeJJ5m2ISbUZudLR1qHeH3MnSs2mjFg7bnencgs5jDVPeJ2NVDJ3N5ZHbcTsOIh0qIueyAJnwg7lg7kwXQ==} + + '@shikijs/types@1.23.1': + resolution: {integrity: sha512-98A5hGyEhzzAgQh2dAeHKrWW4HfCMeoFER2z16p5eJ+vmPeF6lZ/elEne6/UCU551F/WqkopqRsr1l2Yu6+A0g==} + + '@shikijs/vscode-textmate@9.3.0': + resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==} + + '@types/acorn@4.0.6': + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + '@types/nlcst@2.0.3': + resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} + + '@types/node@17.0.45': + resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} + + '@types/sax@1.2.7': + resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@volar/kit@2.4.10': + resolution: {integrity: sha512-ul+rLeO9RlFDgkY/FhPWMnpFqAsjvjkKz8VZeOY5YCJMwTblmmSBlNJtFNxSBx9t/k1q80nEthLyxiJ50ZbIAg==} + peerDependencies: + typescript: '*' + + '@volar/language-core@2.4.10': + resolution: {integrity: sha512-hG3Z13+nJmGaT+fnQzAkS0hjJRa2FCeqZt6Bd+oGNhUkQ+mTFsDETg5rqUTxyzIh5pSOGY7FHCWUS8G82AzLCA==} + + '@volar/language-server@2.4.10': + resolution: {integrity: sha512-odQsgrJh8hOXfxkSj/BSnpjThb2/KDhbxZnG/XAEx6E3QGDQv4hAOz9GWuKoNs0tkjgwphQGIwDMT1JYaTgRJw==} + + '@volar/language-service@2.4.10': + resolution: {integrity: sha512-VxUiWS11rnRzakkqw5x1LPhsz+RBfD0CrrFarLGW2/voliYXEdCuSOM3r8JyNRvMvP4uwhD38ccAdTcULQEAIQ==} + + '@volar/source-map@2.4.10': + resolution: {integrity: sha512-OCV+b5ihV0RF3A7vEvNyHPi4G4kFa6ukPmyVocmqm5QzOd8r5yAtiNvaPEjl8dNvgC/lj4JPryeeHLdXd62rWA==} + + '@volar/typescript@2.4.10': + resolution: {integrity: sha512-F8ZtBMhSXyYKuBfGpYwqA5rsONnOwAVvjyE7KPYJ7wgZqo2roASqNWUnianOomJX5u1cxeRooHV59N0PhvEOgw==} + + '@vscode/emmet-helper@2.10.0': + resolution: {integrity: sha512-UHw1EQRgLbSYkyB73/7wR/IzV6zTBnbzEHuuU4Z6b95HKf2lmeTdGwBIwspWBSRrnIA1TI2x2tetBym6ErA7Gw==} + + '@vscode/l10n@0.0.18': + resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + array-iterate@2.0.1: + resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} + + astring@1.9.0: + resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} + hasBin: true + + astro@4.16.13: + resolution: {integrity: sha512-Mtd76+BC0zLWqoXpf9xc731AhdH4MNh5JFHYdLRvSH0Nqn48hA64dPGh/cWsJvh/DZFmC0NTZusM1Qq2gyNaVg==} + engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} + hasBin: true + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + base-64@1.0.0: + resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} + + boxen@8.0.1: + resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} + engines: {node: '>=18'} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.24.2: + resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + camelcase@8.0.0: + resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} + engines: {node: '>=16'} + + caniuse-lite@1.0.30001680: + resolution: {integrity: sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + chokidar@4.0.1: + resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} + engines: {node: '>= 14.16.0'} + + ci-info@4.1.0: + resolution: {integrity: sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==} + engines: {node: '>=8'} + + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + common-ancestor-path@1.0.1: + resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + deterministic-object-hash@2.0.2: + resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==} + engines: {node: '>=18'} + + devalue@5.1.1: + resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + dset@3.1.4: + resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} + engines: {node: '>=4'} + + electron-to-chromium@1.5.63: + resolution: {integrity: sha512-ddeXKuY9BHo/mw145axlyWjlJ1UBt4WK3AlvkT7W2AbqfRQoacVoRUCF6wL3uIx/8wT9oLKXzI+rFqHHscByaA==} + + emmet@2.4.11: + resolution: {integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==} + + emoji-regex-xs@1.0.0: + resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} + + emoji-regex@10.4.0: + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + + esast-util-from-estree@2.0.0: + resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} + + esast-util-from-js@2.0.1: + resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + + estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + estree-util-scope@1.0.0: + resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} + + estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + + estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-uri@3.0.3: + resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==} + + fast-xml-parser@4.5.0: + resolution: {integrity: sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==} + hasBin: true + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up-simple@1.0.0: + resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} + engines: {node: '>=18'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-yarn-workspace-root2@1.2.16: + resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + + flattie@1.1.1: + resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} + engines: {node: '>=8'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.3.0: + resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} + engines: {node: '>=18'} + + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + + hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} + + hast-util-from-parse5@8.0.2: + resolution: {integrity: sha512-SfMzfdAi/zAoZ1KkFEyyeXBn7u/ShQrfd675ZEE9M3qj+PMFX05xubzRyF76CCSJu8au9jgVxDV1+okFvgZU4A==} + + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + + hast-util-to-estree@3.1.0: + resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} + + hast-util-to-html@9.0.3: + resolution: {integrity: sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==} + + hast-util-to-jsx-runtime@2.3.2: + resolution: {integrity: sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==} + + hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + + hast-util-to-text@4.0.2: + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@9.0.0: + resolution: {integrity: sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==} + + html-escaper@3.0.3: + resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + + inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + + inline-style-parser@0.2.4: + resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@2.3.1: + resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==} + + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + load-yaml-file@0.2.0: + resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} + engines: {node: '>=6'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@6.0.0: + resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} + engines: {node: '>=18'} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + magic-string@0.30.13: + resolution: {integrity: sha512-8rYBO+MsWkgjDSOvLomYnzhdwEG51olQ4zL5KXnNJWV5MNmrb4rTZdrtkhxjnD/QyZUqR/Z/XDsUs/4ej2nx0g==} + + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + + markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + mdast-util-definitions@6.0.0: + resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} + + mdast-util-find-and-replace@3.0.1: + resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.0.0: + resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.0.0: + resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.1.3: + resolution: {integrity: sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==} + + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromark-core-commonmark@2.0.2: + resolution: {integrity: sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.0: + resolution: {integrity: sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-extension-mdx-expression@3.0.0: + resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} + + micromark-extension-mdx-jsx@3.0.1: + resolution: {integrity: sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==} + + micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + + micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + + micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-mdx-expression@2.0.2: + resolution: {integrity: sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-events-to-acorn@2.0.2: + resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.0.3: + resolution: {integrity: sha512-VXJJuNxYWSoYL6AJ6OQECCFGhIU2GGHMw8tahogePBrjkG8aCCas3ibkp7RnVOSTClg2is05/R7maAhF1XyQMg==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.1: + resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} + + micromark@4.0.1: + resolution: {integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + mrmime@2.0.0: + resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + neotraverse@0.6.18: + resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} + engines: {node: '>= 10'} + + nlcst-to-string@4.0.0: + resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} + + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + oniguruma-to-es@0.4.1: + resolution: {integrity: sha512-rNcEohFz095QKGRovP/yqPIKc+nP+Sjs4YTHMv33nMePGKrq/r2eu9Yh4646M5XluGJsUnmwoXuiXE69KDs+fQ==} + + ora@8.1.1: + resolution: {integrity: sha512-YWielGi1XzG1UTvOaCFaNgEnuhZVMSHYkW/FQ7UX8O26PtlpdM84c0f7wLPlkvx2RfiQmnzd61d/MGxmpQeJPw==} + engines: {node: '>=18'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@6.1.0: + resolution: {integrity: sha512-H0jc0q1vOzlEk0TqAKXKZxdl7kX3OFUzCnNVUnq5Pc3DGo0kpeaMuPqxQn235HibwBEb0/pm9dgKTjXy66fBkg==} + engines: {node: '>=18'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-queue@8.0.1: + resolution: {integrity: sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==} + engines: {node: '>=18'} + + p-timeout@6.1.3: + resolution: {integrity: sha512-UJUyfKbwvr/uZSV6btANfb+0t/mOhKV/KXcCUTp8FcQI+v/0d+wXqH4htrW0E4rR6WiEO/EPvUFiV9D5OI4vlw==} + engines: {node: '>=14.16'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + + parse-latin@7.0.0: + resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} + + parse5@7.2.1: + resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + postcss@8.4.49: + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + engines: {node: ^10 || ^12 || >=14} + + preferred-pm@4.0.0: + resolution: {integrity: sha512-gYBeFTZLu055D8Vv3cSPox/0iTPtkzxpLroSYYA7WXgRi31WCJ51Uyl8ZiPeUUjyvs2MBzK+S8v9JVUgHU/Sqw==} + engines: {node: '>=18.12'} + + prettier@2.8.7: + resolution: {integrity: sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==} + engines: {node: '>=10.13.0'} + hasBin: true + + prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + readdirp@4.0.2: + resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} + engines: {node: '>= 14.16.0'} + + reading-time@1.5.0: + resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} + + recma-build-jsx@1.0.0: + resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} + + recma-jsx@1.0.0: + resolution: {integrity: sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==} + + recma-parse@1.0.0: + resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} + + recma-stringify@1.0.0: + resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} + + regex-recursion@4.2.1: + resolution: {integrity: sha512-QHNZyZAeKdndD1G3bKAbBEKOSSK4KOHQrAJ01N1LJeb0SoH4DJIeFhp0uUpETgONifS4+P3sOgoA1dhzgrQvhA==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@5.0.2: + resolution: {integrity: sha512-/pczGbKIQgfTMRV0XjABvc5RzLqQmwqxLHdQao2RTXPk+pmTXB2P0IaUHYdYyk412YLwUIkaeMd5T+RzVgTqnQ==} + + rehype-parse@9.0.1: + resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + rehype-recma@1.0.0: + resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} + + rehype-stringify@10.0.1: + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} + + rehype@13.0.2: + resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==} + + remark-gfm@4.0.0: + resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + + remark-mdx@3.1.0: + resolution: {integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.1: + resolution: {integrity: sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==} + + remark-smartypants@3.0.2: + resolution: {integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==} + engines: {node: '>=16.0.0'} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + request-light@0.5.8: + resolution: {integrity: sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==} + + request-light@0.7.0: + resolution: {integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + retext-latin@4.0.0: + resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} + + retext-smartypants@6.2.0: + resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==} + + retext-stringify@4.0.0: + resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==} + + retext@9.0.0: + resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rollup@4.27.3: + resolution: {integrity: sha512-SLsCOnlmGt9VoZ9Ek8yBK8tAdmPHeppkw+Xa7yDlCEhDTvwYei03JlWo1fdc7YTfLZ4tD8riJCUyAgTbszk1fQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + + shiki@1.23.1: + resolution: {integrity: sha512-8kxV9TH4pXgdKGxNOkrSMydn1Xf6It8lsle0fiqxf7a1149K1WGtdOu3Zb91T5r1JpvRPxqxU3C2XdZZXQnrig==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + sitemap@8.0.0: + resolution: {integrity: sha512-+AbdxhM9kJsHtruUF39bwS/B0Fytw6Fr1o4ZAIAEqA6cke2xcoO2GleBw9Zw7nRzILVEgz7zBM5GiTJjie1G9A==} + engines: {node: '>=14.0.0', npm: '>=6.0.0'} + hasBin: true + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stdin-discarder@0.2.2: + resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} + engines: {node: '>=18'} + + stream-replace-string@2.0.0: + resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strnum@1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + + style-to-object@0.4.4: + resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + + style-to-object@1.0.8: + resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} + + tinyexec@0.3.1: + resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + tsconfck@3.1.4: + resolution: {integrity: sha512-kdqWFGVJqe+KGYvlSO9NIaWn9jT1Ny4oKVzAJsKii5eoE9snzTJzL4+MMVOMn+fikWGFmKEylcXL710V/kIPJQ==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-fest@4.27.0: + resolution: {integrity: sha512-3IMSWgP7C5KSQqmo1wjhKrwsvXAtF33jO3QY+Uy++ia7hqvgSK6iXbbg5PbDBc1P2ZbNEDgejOrN4YooXvhwCw==} + engines: {node: '>=16'} + + typesafe-path@0.2.2: + resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==} + + typescript-auto-import-cache@0.3.5: + resolution: {integrity: sha512-fAIveQKsoYj55CozUiBoj4b/7WpN0i4o74wiGY5JVUEoD0XiqDk1tJqTEjgzL2/AizKQrXxyRosSebyDzBZKjw==} + + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + engines: {node: '>=14.17'} + hasBin: true + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-modify-children@4.0.0: + resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} + + unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-children@3.0.0: + resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + update-browserslist-db@1.1.1: + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite@5.4.11: + resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitefu@1.0.3: + resolution: {integrity: sha512-iKKfOMBHob2WxEJbqbJjHAkmYgvFDPhuqrO82om83S8RLk+17FtyMBfcyeH8GqD0ihShtkMW/zzJgiA51hCNCQ==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0-beta.0 + peerDependenciesMeta: + vite: + optional: true + + volar-service-css@0.0.62: + resolution: {integrity: sha512-JwNyKsH3F8PuzZYuqPf+2e+4CTU8YoyUHEHVnoXNlrLe7wy9U3biomZ56llN69Ris7TTy/+DEX41yVxQpM4qvg==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-emmet@0.0.62: + resolution: {integrity: sha512-U4dxWDBWz7Pi4plpbXf4J4Z/ss6kBO3TYrACxWNsE29abu75QzVS0paxDDhI6bhqpbDFXlpsDhZ9aXVFpnfGRQ==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-html@0.0.62: + resolution: {integrity: sha512-Zw01aJsZRh4GTGUjveyfEzEqpULQUdQH79KNEiKVYHZyuGtdBRYCHlrus1sueSNMxwwkuF5WnOHfvBzafs8yyQ==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-prettier@0.0.62: + resolution: {integrity: sha512-h2yk1RqRTE+vkYZaI9KYuwpDfOQRrTEMvoHol0yW4GFKc75wWQRrb5n/5abDrzMPrkQbSip8JH2AXbvrRtYh4w==} + peerDependencies: + '@volar/language-service': ~2.4.0 + prettier: ^2.2 || ^3.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + prettier: + optional: true + + volar-service-typescript-twoslash-queries@0.0.62: + resolution: {integrity: sha512-KxFt4zydyJYYI0kFAcWPTh4u0Ha36TASPZkAnNY784GtgajerUqM80nX/W1d0wVhmcOFfAxkVsf/Ed+tiYU7ng==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-typescript@0.0.62: + resolution: {integrity: sha512-p7MPi71q7KOsH0eAbZwPBiKPp9B2+qrdHAd6VY5oTo9BUXatsOAdakTm9Yf0DUj6uWBAaOT01BSeVOPwucMV1g==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-yaml@0.0.62: + resolution: {integrity: sha512-k7gvv7sk3wa+nGll3MaSKyjwQsJjIGCHFjVkl3wjaSP2nouKyn9aokGmqjrl39mi88Oy49giog2GkZH526wjig==} + peerDependencies: + '@volar/language-service': ~2.4.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + vscode-css-languageservice@6.3.1: + resolution: {integrity: sha512-1BzTBuJfwMc3A0uX4JBdJgoxp74cjj4q2mDJdp49yD/GuAq4X0k5WtK6fNcMYr+FfJ9nqgR6lpfCSZDkARJ5qQ==} + + vscode-html-languageservice@5.3.1: + resolution: {integrity: sha512-ysUh4hFeW/WOWz/TO9gm08xigiSsV/FOAZ+DolgJfeLftna54YdmZ4A+lIn46RbdO3/Qv5QHTn1ZGqmrXQhZyA==} + + vscode-json-languageservice@4.1.8: + resolution: {integrity: sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==} + engines: {npm: '>=7.0.0'} + + vscode-jsonrpc@6.0.0: + resolution: {integrity: sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==} + engines: {node: '>=8.0.0 || >=10.0.0'} + + vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + + vscode-languageserver-protocol@3.16.0: + resolution: {integrity: sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==} + + vscode-languageserver-protocol@3.17.5: + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + + vscode-languageserver-types@3.16.0: + resolution: {integrity: sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==} + + vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + + vscode-languageserver@7.0.0: + resolution: {integrity: sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==} + hasBin: true + + vscode-languageserver@9.0.1: + resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} + hasBin: true + + vscode-nls@5.2.0: + resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} + + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + which-pm-runs@1.1.0: + resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} + engines: {node: '>=4'} + + which-pm@3.0.0: + resolution: {integrity: sha512-ysVYmw6+ZBhx3+ZkcPwRuJi38ZOTLJJ33PSHaitLxSKUMsh0LkKd0nC69zZCwt5D+AYUcMK2hhw4yWny20vSGg==} + engines: {node: '>=18.12'} + + widest-line@5.0.0: + resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} + engines: {node: '>=18'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + + xxhash-wasm@1.1.0: + resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml-language-server@1.15.0: + resolution: {integrity: sha512-N47AqBDCMQmh6mBLmI6oqxryHRzi33aPFPsJhYy3VTUGCdLHYjGh4FZzpUjRlphaADBBkDmnkM/++KNIOHi5Rw==} + hasBin: true + + yaml@2.2.2: + resolution: {integrity: sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==} + engines: {node: '>= 14'} + + yaml@2.6.1: + resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + engines: {node: '>=12.20'} + + zod-to-json-schema@3.23.5: + resolution: {integrity: sha512-5wlSS0bXfF/BrL4jPAbz9da5hDlDptdEppYfe+x4eIJ7jioqKG9uUxOwPzqof09u/XeVdrgFu29lZi+8XNDJtA==} + peerDependencies: + zod: ^3.23.3 + + zod-to-ts@1.2.0: + resolution: {integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==} + peerDependencies: + typescript: ^4.9.4 || ^5.0.2 + zod: ^3 + + zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@astrojs/check@0.9.4(typescript@5.6.3)': + dependencies: + '@astrojs/language-server': 2.15.4(typescript@5.6.3) + chokidar: 4.0.1 + kleur: 4.1.5 + typescript: 5.6.3 + yargs: 17.7.2 + transitivePeerDependencies: + - prettier + - prettier-plugin-astro + + '@astrojs/compiler@2.10.3': {} + + '@astrojs/internal-helpers@0.4.1': {} + + '@astrojs/language-server@2.15.4(typescript@5.6.3)': + dependencies: + '@astrojs/compiler': 2.10.3 + '@astrojs/yaml2ts': 0.2.2 + '@jridgewell/sourcemap-codec': 1.5.0 + '@volar/kit': 2.4.10(typescript@5.6.3) + '@volar/language-core': 2.4.10 + '@volar/language-server': 2.4.10 + '@volar/language-service': 2.4.10 + fast-glob: 3.3.2 + muggle-string: 0.4.1 + volar-service-css: 0.0.62(@volar/language-service@2.4.10) + volar-service-emmet: 0.0.62(@volar/language-service@2.4.10) + volar-service-html: 0.0.62(@volar/language-service@2.4.10) + volar-service-prettier: 0.0.62(@volar/language-service@2.4.10) + volar-service-typescript: 0.0.62(@volar/language-service@2.4.10) + volar-service-typescript-twoslash-queries: 0.0.62(@volar/language-service@2.4.10) + volar-service-yaml: 0.0.62(@volar/language-service@2.4.10) + vscode-html-languageservice: 5.3.1 + vscode-uri: 3.0.8 + transitivePeerDependencies: + - typescript + + '@astrojs/markdown-remark@5.3.0': + dependencies: + '@astrojs/prism': 3.1.0 + github-slugger: 2.0.0 + hast-util-from-html: 2.0.3 + hast-util-to-text: 4.0.2 + import-meta-resolve: 4.1.0 + mdast-util-definitions: 6.0.0 + rehype-raw: 7.0.0 + rehype-stringify: 10.0.1 + remark-gfm: 4.0.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.1 + remark-smartypants: 3.0.2 + shiki: 1.23.1 + 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.3 + transitivePeerDependencies: + - supports-color + + '@astrojs/mdx@3.1.9(astro@4.16.13(rollup@4.27.3)(typescript@5.6.3))': + dependencies: + '@astrojs/markdown-remark': 5.3.0 + '@mdx-js/mdx': 3.1.0(acorn@8.14.0) + acorn: 8.14.0 + astro: 4.16.13(rollup@4.27.3)(typescript@5.6.3) + es-module-lexer: 1.5.4 + estree-util-visit: 2.0.0 + gray-matter: 4.0.3 + hast-util-to-html: 9.0.3 + kleur: 4.1.5 + rehype-raw: 7.0.0 + remark-gfm: 4.0.0 + remark-smartypants: 3.0.2 + source-map: 0.7.4 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@astrojs/prism@3.1.0': + dependencies: + prismjs: 1.29.0 + + '@astrojs/rss@4.0.9': + dependencies: + fast-xml-parser: 4.5.0 + kleur: 4.1.5 + + '@astrojs/sitemap@3.2.1': + dependencies: + sitemap: 8.0.0 + stream-replace-string: 2.0.0 + zod: 3.23.8 + + '@astrojs/telemetry@3.1.0': + dependencies: + ci-info: 4.1.0 + debug: 4.3.7 + dlv: 1.1.3 + dset: 3.1.4 + is-docker: 3.0.0 + is-wsl: 3.1.0 + which-pm-runs: 1.1.0 + transitivePeerDependencies: + - supports-color + + '@astrojs/yaml2ts@0.2.2': + dependencies: + yaml: 2.6.1 + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.26.2': {} + + '@babel/core@7.26.0': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helpers': 7.26.0 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + convert-source-map: 2.0.0 + debug: 4.3.7 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.26.2': + dependencies: + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.0.2 + + '@babel/helper-annotate-as-pure@7.25.9': + dependencies: + '@babel/types': 7.26.0 + + '@babel/helper-compilation-targets@7.25.9': + dependencies: + '@babel/compat-data': 7.26.2 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.25.9': {} + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helpers@7.26.0': + dependencies: + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 + + '@babel/parser@7.26.2': + dependencies: + '@babel/types': 7.26.0 + + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + + '@babel/template@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + + '@babel/traverse@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 + debug: 4.3.7 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.26.0': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@emmetio/abbreviation@2.3.3': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/css-abbreviation@2.1.8': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/css-parser@0.4.0': + dependencies: + '@emmetio/stream-reader': 2.2.0 + '@emmetio/stream-reader-utils': 0.1.0 + + '@emmetio/html-matcher@1.3.0': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/scanner@1.0.4': {} + + '@emmetio/stream-reader-utils@0.1.0': {} + + '@emmetio/stream-reader@2.2.0': {} + + '@emnapi/runtime@1.3.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@fontsource-variable/jost@5.1.1': {} + + '@fontsource-variable/playfair-display@5.1.0': {} + + '@img/sharp-darwin-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + optional: true + + '@img/sharp-darwin-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.0.5': + optional: true + + '@img/sharp-libvips-linux-s390x@1.0.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + optional: true + + '@img/sharp-linux-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + optional: true + + '@img/sharp-linux-arm@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + optional: true + + '@img/sharp-linux-s390x@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + optional: true + + '@img/sharp-linux-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + optional: true + + '@img/sharp-wasm32@0.33.5': + dependencies: + '@emnapi/runtime': 1.3.1 + optional: true + + '@img/sharp-win32-ia32@0.33.5': + optional: true + + '@img/sharp-win32-x64@0.33.5': + optional: true + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@mdx-js/mdx@3.1.0(acorn@8.14.0)': + dependencies: + '@types/estree': 1.0.6 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdx': 2.0.13 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-util-scope: 1.0.0 + estree-walker: 3.0.3 + hast-util-to-jsx-runtime: 2.3.2 + markdown-extensions: 2.0.0 + recma-build-jsx: 1.0.0 + recma-jsx: 1.0.0(acorn@8.14.0) + recma-stringify: 1.0.0 + rehype-recma: 1.0.0 + remark-mdx: 3.1.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.1 + source-map: 0.7.4 + unified: 11.0.5 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - acorn + - supports-color + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@oslojs/encoding@1.1.0': {} + + '@rollup/pluginutils@5.1.3(rollup@4.27.3)': + dependencies: + '@types/estree': 1.0.6 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.27.3 + + '@rollup/rollup-android-arm-eabi@4.27.3': + optional: true + + '@rollup/rollup-android-arm64@4.27.3': + optional: true + + '@rollup/rollup-darwin-arm64@4.27.3': + optional: true + + '@rollup/rollup-darwin-x64@4.27.3': + optional: true + + '@rollup/rollup-freebsd-arm64@4.27.3': + optional: true + + '@rollup/rollup-freebsd-x64@4.27.3': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.27.3': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.27.3': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.27.3': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.27.3': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.27.3': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.27.3': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.27.3': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.27.3': + optional: true + + '@rollup/rollup-linux-x64-musl@4.27.3': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.27.3': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.27.3': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.27.3': + optional: true + + '@shikijs/core@1.23.1': + dependencies: + '@shikijs/engine-javascript': 1.23.1 + '@shikijs/engine-oniguruma': 1.23.1 + '@shikijs/types': 1.23.1 + '@shikijs/vscode-textmate': 9.3.0 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.3 + + '@shikijs/engine-javascript@1.23.1': + dependencies: + '@shikijs/types': 1.23.1 + '@shikijs/vscode-textmate': 9.3.0 + oniguruma-to-es: 0.4.1 + + '@shikijs/engine-oniguruma@1.23.1': + dependencies: + '@shikijs/types': 1.23.1 + '@shikijs/vscode-textmate': 9.3.0 + + '@shikijs/types@1.23.1': + dependencies: + '@shikijs/vscode-textmate': 9.3.0 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@9.3.0': {} + + '@types/acorn@4.0.6': + dependencies: + '@types/estree': 1.0.6 + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.26.0 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + + '@types/babel__traverse@7.20.6': + dependencies: + '@babel/types': 7.26.0 + + '@types/cookie@0.6.0': {} + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 0.7.34 + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.6 + + '@types/estree@1.0.6': {} + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdx@2.0.13': {} + + '@types/ms@0.7.34': {} + + '@types/nlcst@2.0.3': + dependencies: + '@types/unist': 3.0.3 + + '@types/node@17.0.45': {} + + '@types/sax@1.2.7': + dependencies: + '@types/node': 17.0.45 + + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + + '@ungap/structured-clone@1.2.0': {} + + '@volar/kit@2.4.10(typescript@5.6.3)': + dependencies: + '@volar/language-service': 2.4.10 + '@volar/typescript': 2.4.10 + typesafe-path: 0.2.2 + typescript: 5.6.3 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.0.8 + + '@volar/language-core@2.4.10': + dependencies: + '@volar/source-map': 2.4.10 + + '@volar/language-server@2.4.10': + dependencies: + '@volar/language-core': 2.4.10 + '@volar/language-service': 2.4.10 + '@volar/typescript': 2.4.10 + path-browserify: 1.0.1 + request-light: 0.7.0 + vscode-languageserver: 9.0.1 + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.0.8 + + '@volar/language-service@2.4.10': + dependencies: + '@volar/language-core': 2.4.10 + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.0.8 + + '@volar/source-map@2.4.10': {} + + '@volar/typescript@2.4.10': + dependencies: + '@volar/language-core': 2.4.10 + path-browserify: 1.0.1 + vscode-uri: 3.0.8 + + '@vscode/emmet-helper@2.10.0': + dependencies: + emmet: 2.4.11 + jsonc-parser: 2.3.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.0.8 + + '@vscode/l10n@0.0.18': {} + + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + + acorn@8.14.0: {} + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + arg@5.0.2: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + aria-query@5.3.2: {} + + array-iterate@2.0.1: {} + + astring@1.9.0: {} + + astro@4.16.13(rollup@4.27.3)(typescript@5.6.3): + dependencies: + '@astrojs/compiler': 2.10.3 + '@astrojs/internal-helpers': 0.4.1 + '@astrojs/markdown-remark': 5.3.0 + '@astrojs/telemetry': 3.1.0 + '@babel/core': 7.26.0 + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/types': 7.26.0 + '@oslojs/encoding': 1.1.0 + '@rollup/pluginutils': 5.1.3(rollup@4.27.3) + '@types/babel__core': 7.20.5 + '@types/cookie': 0.6.0 + acorn: 8.14.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + boxen: 8.0.1 + ci-info: 4.1.0 + clsx: 2.1.1 + common-ancestor-path: 1.0.1 + cookie: 0.7.2 + cssesc: 3.0.0 + debug: 4.3.7 + deterministic-object-hash: 2.0.2 + devalue: 5.1.1 + diff: 5.2.0 + dlv: 1.1.3 + dset: 3.1.4 + es-module-lexer: 1.5.4 + esbuild: 0.21.5 + estree-walker: 3.0.3 + fast-glob: 3.3.2 + flattie: 1.1.1 + github-slugger: 2.0.0 + gray-matter: 4.0.3 + html-escaper: 3.0.3 + http-cache-semantics: 4.1.1 + js-yaml: 4.1.0 + kleur: 4.1.5 + magic-string: 0.30.13 + magicast: 0.3.5 + micromatch: 4.0.8 + mrmime: 2.0.0 + neotraverse: 0.6.18 + ora: 8.1.1 + p-limit: 6.1.0 + p-queue: 8.0.1 + preferred-pm: 4.0.0 + prompts: 2.4.2 + rehype: 13.0.2 + semver: 7.6.3 + shiki: 1.23.1 + tinyexec: 0.3.1 + tsconfck: 3.1.4(typescript@5.6.3) + unist-util-visit: 5.0.0 + vfile: 6.0.3 + vite: 5.4.11 + vitefu: 1.0.3(vite@5.4.11) + which-pm: 3.0.0 + xxhash-wasm: 1.1.0 + yargs-parser: 21.1.1 + zod: 3.23.8 + zod-to-json-schema: 3.23.5(zod@3.23.8) + zod-to-ts: 1.2.0(typescript@5.6.3)(zod@3.23.8) + optionalDependencies: + sharp: 0.33.5 + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - rollup + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - typescript + + axobject-query@4.1.0: {} + + bail@2.0.2: {} + + base-64@1.0.0: {} + + boxen@8.0.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 8.0.0 + chalk: 5.3.0 + cli-boxes: 3.0.0 + string-width: 7.2.0 + type-fest: 4.27.0 + widest-line: 5.0.0 + wrap-ansi: 9.0.0 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.24.2: + dependencies: + caniuse-lite: 1.0.30001680 + electron-to-chromium: 1.5.63 + node-releases: 2.0.18 + update-browserslist-db: 1.1.1(browserslist@4.24.2) + + camelcase@8.0.0: {} + + caniuse-lite@1.0.30001680: {} + + ccount@2.0.1: {} + + chalk@5.3.0: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + + chokidar@4.0.1: + dependencies: + readdirp: 4.0.2 + + ci-info@4.1.0: {} + + cli-boxes@3.0.0: {} + + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-spinners@2.9.2: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clsx@2.1.1: {} + + collapse-white-space@2.1.0: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + + comma-separated-tokens@2.0.3: {} + + common-ancestor-path@1.0.1: {} + + convert-source-map@2.0.0: {} + + cookie@0.7.2: {} + + cssesc@3.0.0: {} + + debug@4.3.7: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.0.2: + dependencies: + character-entities: 2.0.2 + + dequal@2.0.3: {} + + detect-libc@2.0.3: {} + + deterministic-object-hash@2.0.2: + dependencies: + base-64: 1.0.0 + + devalue@5.1.1: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + diff@5.2.0: {} + + dlv@1.1.3: {} + + dset@3.1.4: {} + + electron-to-chromium@1.5.63: {} + + emmet@2.4.11: + dependencies: + '@emmetio/abbreviation': 2.3.3 + '@emmetio/css-abbreviation': 2.1.8 + + emoji-regex-xs@1.0.0: {} + + emoji-regex@10.4.0: {} + + emoji-regex@8.0.0: {} + + entities@4.5.0: {} + + es-module-lexer@1.5.4: {} + + esast-util-from-estree@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + unist-util-position-from-estree: 2.0.0 + + esast-util-from-js@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + acorn: 8.14.0 + esast-util-from-estree: 2.0.0 + vfile-message: 4.0.2 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + escalade@3.2.0: {} + + escape-string-regexp@5.0.0: {} + + esprima@4.0.1: {} + + estree-util-attach-comments@3.0.0: + dependencies: + '@types/estree': 1.0.6 + + estree-util-build-jsx@3.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + + estree-util-is-identifier-name@3.0.0: {} + + estree-util-scope@1.0.0: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + + estree-util-to-js@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + astring: 1.9.0 + source-map: 0.7.4 + + estree-util-visit@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 3.0.3 + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.6 + + eventemitter3@5.0.1: {} + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend@3.0.2: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-uri@3.0.3: {} + + fast-xml-parser@4.5.0: + dependencies: + strnum: 1.0.5 + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up-simple@1.0.0: {} + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-yarn-workspace-root2@1.2.16: + dependencies: + micromatch: 4.0.8 + pkg-dir: 4.2.0 + + flattie@1.1.1: {} + + fsevents@2.3.3: + optional: true + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.3.0: {} + + github-slugger@2.0.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + globals@11.12.0: {} + + graceful-fs@4.2.11: {} + + gray-matter@4.0.3: + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + + hast-util-from-html@2.0.3: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.2 + parse5: 7.2.1 + vfile: 6.0.3 + vfile-message: 4.0.2 + + hast-util-from-parse5@8.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.0 + property-information: 6.5.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.2.0 + hast-util-from-parse5: 8.0.2 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + parse5: 7.2.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-estree@3.1.0: + dependencies: + '@types/estree': 1.0.6 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-attach-comments: 3.0.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.1.3 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.4.4 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + + hast-util-to-html@9.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-jsx-runtime@2.3.2: + dependencies: + '@types/estree': 1.0.6 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.1.3 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + style-to-object: 1.0.8 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + hast-util-to-parse5@8.0.0: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-text@4.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@9.0.0: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + + html-escaper@3.0.3: {} + + html-void-elements@3.0.0: {} + + http-cache-semantics@4.1.1: {} + + import-meta-resolve@4.1.0: {} + + inline-style-parser@0.1.1: {} + + inline-style-parser@0.2.4: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-arrayish@0.3.2: {} + + is-decimal@2.0.1: {} + + is-docker@3.0.0: {} + + is-extendable@0.1.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hexadecimal@2.0.1: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-interactive@2.0.0: {} + + is-number@7.0.0: {} + + is-plain-obj@4.1.0: {} + + is-unicode-supported@1.3.0: {} + + is-unicode-supported@2.1.0: {} + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + js-tokens@4.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.0.2: {} + + json-schema-traverse@1.0.0: {} + + json5@2.2.3: {} + + jsonc-parser@2.3.1: {} + + jsonc-parser@3.3.1: {} + + kind-of@6.0.3: {} + + kleur@3.0.3: {} + + kleur@4.1.5: {} + + load-yaml-file@0.2.0: + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + lodash@4.17.21: {} + + log-symbols@6.0.0: + dependencies: + chalk: 5.3.0 + is-unicode-supported: 1.3.0 + + longest-streak@3.1.0: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + magic-string@0.30.13: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + magicast@0.3.5: + dependencies: + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + source-map-js: 1.2.1 + + markdown-extensions@2.0.0: {} + + markdown-table@3.0.4: {} + + mdast-util-definitions@6.0.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + unist-util-visit: 5.0.0 + + mdast-util-find-and-replace@3.0.1: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.1 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.0.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.1.3: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.1 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.1.3 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.2.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + merge2@1.4.1: {} + + micromark-core-commonmark@2.0.2: + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.2 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm-table@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.1 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.0 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-mdx-expression@3.0.0: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.2 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-mdx-jsx@3.0.1: + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.6 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.2 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + vfile-message: 4.0.2 + + micromark-extension-mdx-md@2.0.0: + dependencies: + micromark-util-types: 2.0.1 + + micromark-extension-mdxjs-esm@3.0.0: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.2 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-extension-mdxjs@3.0.0: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + micromark-extension-mdx-expression: 3.0.0 + micromark-extension-mdx-jsx: 3.0.1 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-mdx-expression@2.0.2: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.1 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-events-to-acorn@2.0.2: + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.6 + '@types/unist': 3.0.3 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + vfile-message: 4.0.2 + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.1 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.0.3: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.1: {} + + micromark@4.0.1: + dependencies: + '@types/debug': 4.1.12 + debug: 4.3.7 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.2 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mimic-function@5.0.1: {} + + mrmime@2.0.0: {} + + ms@2.1.3: {} + + muggle-string@0.4.1: {} + + nanoid@3.3.7: {} + + neotraverse@0.6.18: {} + + nlcst-to-string@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + + node-releases@2.0.18: {} + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + oniguruma-to-es@0.4.1: + dependencies: + emoji-regex-xs: 1.0.0 + regex: 5.0.2 + regex-recursion: 4.2.1 + + ora@8.1.1: + dependencies: + chalk: 5.3.0 + cli-cursor: 5.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 6.0.0 + stdin-discarder: 0.2.2 + string-width: 7.2.0 + strip-ansi: 7.1.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@6.1.0: + dependencies: + yocto-queue: 1.1.1 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-queue@8.0.1: + dependencies: + eventemitter3: 5.0.1 + p-timeout: 6.1.3 + + p-timeout@6.1.3: {} + + p-try@2.2.0: {} + + parse-entities@4.0.1: + dependencies: + '@types/unist': 2.0.11 + character-entities: 2.0.2 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse-latin@7.0.0: + dependencies: + '@types/nlcst': 2.0.3 + '@types/unist': 3.0.3 + nlcst-to-string: 4.0.0 + unist-util-modify-children: 4.0.0 + unist-util-visit-children: 3.0.0 + vfile: 6.0.3 + + parse5@7.2.1: + dependencies: + entities: 4.5.0 + + path-browserify@1.0.1: {} + + path-exists@4.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + pify@4.0.1: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + postcss@8.4.49: + dependencies: + nanoid: 3.3.7 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + preferred-pm@4.0.0: + dependencies: + find-up-simple: 1.0.0 + find-yarn-workspace-root2: 1.2.16 + which-pm: 3.0.0 + + prettier@2.8.7: + optional: true + + prismjs@1.29.0: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + property-information@6.5.0: {} + + queue-microtask@1.2.3: {} + + readdirp@4.0.2: {} + + reading-time@1.5.0: {} + + recma-build-jsx@1.0.0: + dependencies: + '@types/estree': 1.0.6 + estree-util-build-jsx: 3.0.1 + vfile: 6.0.3 + + recma-jsx@1.0.0(acorn@8.14.0): + dependencies: + acorn-jsx: 5.3.2(acorn@8.14.0) + estree-util-to-js: 2.0.0 + recma-parse: 1.0.0 + recma-stringify: 1.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - acorn + + recma-parse@1.0.0: + dependencies: + '@types/estree': 1.0.6 + esast-util-from-js: 2.0.1 + unified: 11.0.5 + vfile: 6.0.3 + + recma-stringify@1.0.0: + dependencies: + '@types/estree': 1.0.6 + estree-util-to-js: 2.0.0 + unified: 11.0.5 + vfile: 6.0.3 + + regex-recursion@4.2.1: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@5.0.2: + dependencies: + regex-utilities: 2.3.0 + + rehype-parse@9.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-html: 2.0.3 + unified: 11.0.5 + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + rehype-recma@1.0.0: + dependencies: + '@types/estree': 1.0.6 + '@types/hast': 3.0.4 + hast-util-to-estree: 3.1.0 + transitivePeerDependencies: + - supports-color + + rehype-stringify@10.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.3 + unified: 11.0.5 + + rehype@13.0.2: + dependencies: + '@types/hast': 3.0.4 + rehype-parse: 9.0.1 + rehype-stringify: 10.0.1 + unified: 11.0.5 + + remark-gfm@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.0.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-mdx@3.1.0: + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.1 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + vfile: 6.0.3 + + remark-smartypants@3.0.2: + dependencies: + retext: 9.0.0 + retext-smartypants: 6.2.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + request-light@0.5.8: {} + + request-light@0.7.0: {} + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + retext-latin@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + parse-latin: 7.0.0 + unified: 11.0.5 + + retext-smartypants@6.2.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unist-util-visit: 5.0.0 + + retext-stringify@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unified: 11.0.5 + + retext@9.0.0: + dependencies: + '@types/nlcst': 2.0.3 + retext-latin: 4.0.0 + retext-stringify: 4.0.0 + unified: 11.0.5 + + reusify@1.0.4: {} + + rollup@4.27.3: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.27.3 + '@rollup/rollup-android-arm64': 4.27.3 + '@rollup/rollup-darwin-arm64': 4.27.3 + '@rollup/rollup-darwin-x64': 4.27.3 + '@rollup/rollup-freebsd-arm64': 4.27.3 + '@rollup/rollup-freebsd-x64': 4.27.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.27.3 + '@rollup/rollup-linux-arm-musleabihf': 4.27.3 + '@rollup/rollup-linux-arm64-gnu': 4.27.3 + '@rollup/rollup-linux-arm64-musl': 4.27.3 + '@rollup/rollup-linux-powerpc64le-gnu': 4.27.3 + '@rollup/rollup-linux-riscv64-gnu': 4.27.3 + '@rollup/rollup-linux-s390x-gnu': 4.27.3 + '@rollup/rollup-linux-x64-gnu': 4.27.3 + '@rollup/rollup-linux-x64-musl': 4.27.3 + '@rollup/rollup-win32-arm64-msvc': 4.27.3 + '@rollup/rollup-win32-ia32-msvc': 4.27.3 + '@rollup/rollup-win32-x64-msvc': 4.27.3 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + sax@1.4.1: {} + + section-matter@1.0.0: + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + + semver@6.3.1: {} + + semver@7.6.3: {} + + sharp@0.33.5: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.6.3 + optionalDependencies: + '@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 + + shiki@1.23.1: + dependencies: + '@shikijs/core': 1.23.1 + '@shikijs/engine-javascript': 1.23.1 + '@shikijs/engine-oniguruma': 1.23.1 + '@shikijs/types': 1.23.1 + '@shikijs/vscode-textmate': 9.3.0 + '@types/hast': 3.0.4 + + signal-exit@4.1.0: {} + + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + + sisteransi@1.0.5: {} + + sitemap@8.0.0: + dependencies: + '@types/node': 17.0.45 + '@types/sax': 1.2.7 + arg: 5.0.2 + sax: 1.4.1 + + source-map-js@1.2.1: {} + + source-map@0.7.4: {} + + space-separated-tokens@2.0.2: {} + + sprintf-js@1.0.3: {} + + stdin-discarder@0.2.2: {} + + stream-replace-string@2.0.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.4.0 + get-east-asian-width: 1.3.0 + strip-ansi: 7.1.0 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-bom-string@1.0.0: {} + + strip-bom@3.0.0: {} + + strnum@1.0.5: {} + + style-to-object@0.4.4: + dependencies: + inline-style-parser: 0.1.1 + + style-to-object@1.0.8: + dependencies: + inline-style-parser: 0.2.4 + + tinyexec@0.3.1: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + trim-lines@3.0.1: {} + + trough@2.2.0: {} + + tsconfck@3.1.4(typescript@5.6.3): + optionalDependencies: + typescript: 5.6.3 + + tslib@2.8.1: + optional: true + + type-fest@4.27.0: {} + + typesafe-path@0.2.2: {} + + typescript-auto-import-cache@0.3.5: + dependencies: + semver: 7.6.3 + + typescript@5.6.3: {} + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unist-util-find-after@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-modify-children@4.0.0: + dependencies: + '@types/unist': 3.0.3 + array-iterate: 2.0.1 + + unist-util-position-from-estree@2.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-remove-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-visit: 5.0.0 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-children@3.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + update-browserslist-db@1.1.1(browserslist@4.24.2): + dependencies: + browserslist: 4.24.2 + escalade: 3.2.0 + picocolors: 1.1.1 + + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + + vfile-message@4.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.2 + + vite@5.4.11: + dependencies: + esbuild: 0.21.5 + postcss: 8.4.49 + rollup: 4.27.3 + optionalDependencies: + fsevents: 2.3.3 + + vitefu@1.0.3(vite@5.4.11): + optionalDependencies: + vite: 5.4.11 + + volar-service-css@0.0.62(@volar/language-service@2.4.10): + dependencies: + vscode-css-languageservice: 6.3.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.0.8 + optionalDependencies: + '@volar/language-service': 2.4.10 + + volar-service-emmet@0.0.62(@volar/language-service@2.4.10): + dependencies: + '@emmetio/css-parser': 0.4.0 + '@emmetio/html-matcher': 1.3.0 + '@vscode/emmet-helper': 2.10.0 + vscode-uri: 3.0.8 + optionalDependencies: + '@volar/language-service': 2.4.10 + + volar-service-html@0.0.62(@volar/language-service@2.4.10): + dependencies: + vscode-html-languageservice: 5.3.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.0.8 + optionalDependencies: + '@volar/language-service': 2.4.10 + + volar-service-prettier@0.0.62(@volar/language-service@2.4.10): + dependencies: + vscode-uri: 3.0.8 + optionalDependencies: + '@volar/language-service': 2.4.10 + + volar-service-typescript-twoslash-queries@0.0.62(@volar/language-service@2.4.10): + dependencies: + vscode-uri: 3.0.8 + optionalDependencies: + '@volar/language-service': 2.4.10 + + volar-service-typescript@0.0.62(@volar/language-service@2.4.10): + dependencies: + path-browserify: 1.0.1 + semver: 7.6.3 + typescript-auto-import-cache: 0.3.5 + vscode-languageserver-textdocument: 1.0.12 + vscode-nls: 5.2.0 + vscode-uri: 3.0.8 + optionalDependencies: + '@volar/language-service': 2.4.10 + + volar-service-yaml@0.0.62(@volar/language-service@2.4.10): + dependencies: + vscode-uri: 3.0.8 + yaml-language-server: 1.15.0 + optionalDependencies: + '@volar/language-service': 2.4.10 + + vscode-css-languageservice@6.3.1: + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.0.8 + + vscode-html-languageservice@5.3.1: + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.0.8 + + vscode-json-languageservice@4.1.8: + dependencies: + jsonc-parser: 3.3.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-nls: 5.2.0 + vscode-uri: 3.0.8 + + vscode-jsonrpc@6.0.0: {} + + vscode-jsonrpc@8.2.0: {} + + vscode-languageserver-protocol@3.16.0: + dependencies: + vscode-jsonrpc: 6.0.0 + vscode-languageserver-types: 3.16.0 + + vscode-languageserver-protocol@3.17.5: + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + + vscode-languageserver-textdocument@1.0.12: {} + + vscode-languageserver-types@3.16.0: {} + + vscode-languageserver-types@3.17.5: {} + + vscode-languageserver@7.0.0: + dependencies: + vscode-languageserver-protocol: 3.16.0 + + vscode-languageserver@9.0.1: + dependencies: + vscode-languageserver-protocol: 3.17.5 + + vscode-nls@5.2.0: {} + + vscode-uri@3.0.8: {} + + web-namespaces@2.0.1: {} + + which-pm-runs@1.1.0: {} + + which-pm@3.0.0: + dependencies: + load-yaml-file: 0.2.0 + + widest-line@5.0.0: + dependencies: + string-width: 7.2.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@9.0.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.1.0 + + xxhash-wasm@1.1.0: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yaml-language-server@1.15.0: + dependencies: + ajv: 8.17.1 + lodash: 4.17.21 + request-light: 0.5.8 + vscode-json-languageservice: 4.1.8 + vscode-languageserver: 7.0.0 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-nls: 5.2.0 + vscode-uri: 3.0.8 + yaml: 2.2.2 + optionalDependencies: + prettier: 2.8.7 + + yaml@2.2.2: {} + + yaml@2.6.1: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@1.1.1: {} + + zod-to-json-schema@3.23.5(zod@3.23.8): + dependencies: + zod: 3.23.8 + + zod-to-ts@1.2.0(typescript@5.6.3)(zod@3.23.8): + dependencies: + typescript: 5.6.3 + zod: 3.23.8 + + zod@3.23.8: {} + + zwitch@2.0.4: {} diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..f157bd1 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1,9 @@ + + + + diff --git a/readingTime.js b/readingTime.js new file mode 100644 index 0000000..ca6ca03 --- /dev/null +++ b/readingTime.js @@ -0,0 +1,10 @@ +import getReadingTime from 'reading-time' +import { toString } from 'mdast-util-to-string' + +export function remarkReadingTime() { + return function (tree, { data }) { + const textOnPage = toString(tree) + const readingTime = getReadingTime(textOnPage) + data.astro.frontmatter.readingTime = readingTime + } +} diff --git a/src/components/AboutImage.astro b/src/components/AboutImage.astro new file mode 100644 index 0000000..c3760da --- /dev/null +++ b/src/components/AboutImage.astro @@ -0,0 +1,30 @@ +--- +import { Image } from 'astro:assets' +import aboutImage from '../content/images/about.webp' +--- + +{'tiny + + diff --git a/src/components/BaseHead.astro b/src/components/BaseHead.astro new file mode 100644 index 0000000..0e0e173 --- /dev/null +++ b/src/components/BaseHead.astro @@ -0,0 +1,46 @@ +--- +import '@fontsource-variable/jost' +import '@fontsource-variable/playfair-display' + +import '../styles/preflight.css' +import '../styles/global.css' + +interface Props { + image?: string +} + +const canonicalURL = new URL(Astro.url.pathname, Astro.site) + +const { image = '/blog-placeholder-1.jpg' } = Astro.props + +const title = 'Astro Blog' +const description = 'Welcome to my website!' +--- + + + + + + + + + + + +{title} + + + + + + + + + + + + + + + + diff --git a/src/components/FormattedDate.astro b/src/components/FormattedDate.astro new file mode 100644 index 0000000..1bcce73 --- /dev/null +++ b/src/components/FormattedDate.astro @@ -0,0 +1,17 @@ +--- +interface Props { + date: Date; +} + +const { date } = Astro.props; +--- + + diff --git a/src/components/Nav.astro b/src/components/Nav.astro new file mode 100644 index 0000000..dde13dc --- /dev/null +++ b/src/components/Nav.astro @@ -0,0 +1,127 @@ +--- +const { pathname } = Astro.url + +const routes = [ + { name: 'About', href: '/about' }, + { name: 'Projects', href: '/projects' }, + { name: 'Blog', href: '/blog' }, + { name: 'Contact', href: '/contact' }, +] +--- + + + + diff --git a/src/components/PostAttributes.astro b/src/components/PostAttributes.astro new file mode 100644 index 0000000..63a1b52 --- /dev/null +++ b/src/components/PostAttributes.astro @@ -0,0 +1,39 @@ +--- +import type { CollectionEntry } from 'astro:content' +import FormattedDate from './FormattedDate.astro' + +export type Props = { + post: CollectionEntry<'blog'> + full?: boolean +} + +const { post, full = false } = Astro.props + +const { remarkPluginFrontmatter } = await post.render() +--- + +
    +
    + + { + full && post.data.updatedDate && post.data.date !== post.data.updatedDate && ( + <> +
    + + Last update: + + + ) + } +
    +
    ~ {remarkPluginFrontmatter.readingTime.minutes.toFixed(0)} min
    +
    + + diff --git a/src/components/PostList.astro b/src/components/PostList.astro new file mode 100644 index 0000000..6c22ace --- /dev/null +++ b/src/components/PostList.astro @@ -0,0 +1,37 @@ +--- +import type { CollectionEntry } from 'astro:content' +import PostPreview from './PostPreview.astro' + +export type Props = { + posts: CollectionEntry<'blog'>[] +} + +const { posts } = Astro.props +--- + +
    +
      + { + posts.map((post) => ( +
    • + + + +
    • + )) + } +
    +
    + + diff --git a/src/components/PostPreview.astro b/src/components/PostPreview.astro new file mode 100644 index 0000000..bbb35e9 --- /dev/null +++ b/src/components/PostPreview.astro @@ -0,0 +1,76 @@ +--- +import type { CollectionEntry } from 'astro:content' +import Tags from './Tags.astro' +import PostAttributes from './PostAttributes.astro' +import { Image } from 'astro:assets' + +export type Props = { + post: CollectionEntry<'blog'> +} + +const { post } = Astro.props +--- + +
    + {post.data.coverImage && {'foo'}} + +

    + {post.data.title} +

    + ({ count: 1, name: tag, href: `/tag/${tag}` }))} /> +
    + + diff --git a/src/components/Signature.astro b/src/components/Signature.astro new file mode 100644 index 0000000..5907685 --- /dev/null +++ b/src/components/Signature.astro @@ -0,0 +1,30 @@ +--- +import type { HTMLAttributes } from 'astro/types' + +type Props = HTMLAttributes<'svg'> +--- + + + + + + + + diff --git a/src/components/SkillBar.astro b/src/components/SkillBar.astro new file mode 100644 index 0000000..493d8cb --- /dev/null +++ b/src/components/SkillBar.astro @@ -0,0 +1,39 @@ +--- +export type Props = { + progress: number + title: string +} + +const { progress, title } = Astro.props +--- + +
    + {title} +
    +
    + + diff --git a/src/components/SpacedLetters.astro b/src/components/SpacedLetters.astro new file mode 100644 index 0000000..64842a0 --- /dev/null +++ b/src/components/SpacedLetters.astro @@ -0,0 +1,38 @@ +--- +export type Props = { + letters: string + even?: boolean + readable?: boolean +} + +const { letters, readable = false, even = false } = Astro.props +--- + +
    + {even ? [...letters].map((letter) => {letter}) : letters} +
    + + diff --git a/src/components/Tag.astro b/src/components/Tag.astro new file mode 100644 index 0000000..dd0ed44 --- /dev/null +++ b/src/components/Tag.astro @@ -0,0 +1,33 @@ +--- +export type Props = { + name: string + href: string + count: number +} + +const { name, href, count } = Astro.props +--- + + +
    + {name} + {count} +
    +
    + + diff --git a/src/components/Tags.astro b/src/components/Tags.astro new file mode 100644 index 0000000..32305ee --- /dev/null +++ b/src/components/Tags.astro @@ -0,0 +1,36 @@ +--- +import type { ComponentProps } from 'astro/types' +import Tag from './Tag.astro' + +export type Props = { + tags: ComponentProps[] + rows?: number +} + +const { tags, rows = 1 } = Astro.props + +const height = rows * 2 +--- + +
    + {tags.map((tag) => )} +
    + + diff --git a/src/consts.ts b/src/consts.ts new file mode 100644 index 0000000..0df8a61 --- /dev/null +++ b/src/consts.ts @@ -0,0 +1,5 @@ +// Place any global data in this file. +// You can import this data from anywhere in your site by using the `import` keyword. + +export const SITE_TITLE = 'Astro Blog'; +export const SITE_DESCRIPTION = 'Welcome to my website!'; diff --git a/src/content/blog/4-useful-typescript-tricks.md b/src/content/blog/4-useful-typescript-tricks.md new file mode 100644 index 0000000..b872733 --- /dev/null +++ b/src/content/blog/4-useful-typescript-tricks.md @@ -0,0 +1,232 @@ +--- +title: '5 useful Typescript tricks' +date: '2019-10-06' +categories: + - 'coding' +tags: + - 'tips-and-tricks' + - 'typescript' +coverImage: './images/amador-loureiro-BVyNlchWqzs-unsplash-scaled.jpg' +--- + +Typescript is a godsend. It is very easy to get started with and for most developers there is no way back once they get the hang of it. Sometimes it can get pretty advanced and intimidating though. + +This is why I decided to share 5 of my favourite typescript tips and tricks you might have needed in the past. Some are super basic, some are bit more advanced. + +**Update** _07 Okt 2019 @ 07:53_ +Reddit user [jakeboone02](https://www.reddit.com/r/typescript/comments/de17xs/5_useful_typescript_tricks_small_tricks_you_might/f2t9prk?utm_source=share&utm_medium=web2x) found an error in the ternary code. + +**Update** _06 Okt 2019 @ 15:06_ +Reddit user [smeijer87](https://www.reddit.com/r/typescript/comments/de17xs/5_useful_typescript_tricks_small_tricks_you_might/f2qveub?utm_source=share&utm_medium=web2x) found an error in the code for null coalescing. + +**Update** _06 Okt 2019 @ 14:47_ +A fiendly reader pointed out excluding interface type are called discriminated unions. + +1. [react higher-order components](#hoc) +2. [smarter constructor](#constructors) +3. [type checking functions](#type-checking-function) +4. [discriminated unions](#excluding) +5. [optional chaining & null coalescing](#future) + +
    + +![](images/amador-loureiro-BVyNlchWqzs-unsplash-scaled.jpg) + +
    + +Photo by [Amador Loureiro](https://unsplash.com/@amadorloureiroblanco?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/search/photos/type?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +
    + +
    + +## Higher-order Components + +In React [higher order components (HOC)](https://reactjs.org/docs/higher-order-components.html) are very useful tools. Generally they are used to wrap some layout or functionality to some other component. They are simply functions that return another component: basically the same pattern as decorators. + +In typescript it can be confusing how to write them _maintaining the right props_ after wrapping the original component. Here you are: + +``` +import React from 'react' + +function withLayout

    (WrappedComponent: React.ComponentType

    ) { + return (props: P) => ( +

    +
    + +
    +
    + ); +} +``` + +Note also that when using the `withLayout` you don't need to specify the generic type explicitly, as typescript will inherit from the function parameter. Super handy! + +## Smarter constructors + +Let's start by the building block this is based on. It's a basic Javascript trick, not a typescript exclusive at first. + +``` +class Pizza { + slices: number + name: string + + constructor(init) { + Object.assign(this, init) + } +} + +const pizza = new Pizza({ + slices: 8, + name: 'Margherita', +}) +``` + +What is happening here? With the super handy `Object.assign` simply assigns the object to the class. This is super handy when classes have many constructor parameters. But this is NOT type safe as your IDE/Editor will tell you. How do we fix this? + +``` +import { NonFunctionKeys } from 'utility-types' + +class Pizza { + slices!: number + name?: string + + constructor(init: Pick>) { + Object.assign(this, init) + } + + eat() { + this.slices = 0 + } +} + +const pizza = new Pizza({ + slices: 8, + name: 'Margherita', +}) +``` + +Let me explain what happens: +This leverages the awesome [utility-types](https://github.com/piotrwitek/utility-types) package. We first take all the keys that are not a function, so we don't overwrite the `eat` method of the class. Then we pick those from the general Pizza type. + +This means that `slices` will be required, while `name` will be optional, as they are defined. + +## Type-checking Functions + +Did you know you can write functions to tell typescript what type something is? This is awesome! + +Suppose we have the following interfaces + +``` +interface Food { + name: string +} + +interface Pasta extends Food { + type: 'Spaghetti' | 'Fusilli' +} + +interface Pizza extends Food { + slices: number +} +``` + +Now we could write a `cook` function that accepts both Pasta and Pizza. Typescript itself cannot differentiate between the too. + +``` +function cook(what: Food) { + if(what === Pizza) ???? +} +``` + +Fortunately there is a nice solution built into typescript. + +``` +function isPizza(x: Food | Pizza): x is Pizza { + return x.hasOwnProperty('slices') +} + +function isPasta(x: Food | Pasta): x is Pasta { + return x.hasOwnProperty('type') +} + + +function cook(plate: Food) { + if (isPizza(plate)) { + // Plate is now of type Pizza + putInTheOven(plate) + } + if (isPasta(plate)) { + // Plate is now of type Pasta + putInThePan(plate) + } +} +``` + +Here we define two functions that return `x is Sometype` and return a boolean value based on the input. It's up to you of course to define it properly, but this can be very useful in various situations. + +## Discriminated unions + +``` +type Sqlite = { + type: 'sqlite', + database: string, +} + +type PostgreSQL = { + type: 'postgresql', + database: string, + host: string, + post?: number +} + +type PossibleConfigs = Sqlite | PostgreSQL + +function initialize(config: PossibleConfigs) {} +``` + +This might look like a simple one, but I often see people putting those sorts of types all into the same interface. By separating the different type of objects you make sure that they are safe. Also the autocomplete will thank you. + +## Optional Chaining & Null Coalescing + +This are future features that will be introduced in Typescript 3.7 that are very useful and will not be lived without after the release in early November 2019. + +Optional chaining is an obvious shorthand. Every time you need to check if a property (especially if nested) exists, you need to do lots of repetitive checking. No more! + +``` +a && a.b && a.b.c // 🤬 + +a?.b?.c // 🚀 +``` + +Null coalescing is also a very useful shorthand. You all know the `||` shorthand, often used to initialise a variable if no value is given. + +``` +const option = something || 'default' + +// Sugar for +const option = !!something ? something : 'default' +``` + +The problem is with values that are actual values, but result as falsy. + +``` +false || 'default' // => 'default' +0 || 'default' // => 'default' +``` + +This is where the Null Coalescing comes in. + +``` +const option = something ?? 'default' // 🚀 + +// Sugar for +const option = (x === null || x === undefined) + ? 'default' + : x + +0 ?? 'default' // => 0 +false ?? 'default' // => false +``` + +Basically it only assign the default value if the provided one is `null` or `undefined` so that values like `false` or `0` don't get overwritten. diff --git a/src/content/blog/5-jetbrains-tipsntricks-i-wish-id-known-sooner.md b/src/content/blog/5-jetbrains-tipsntricks-i-wish-id-known-sooner.md new file mode 100644 index 0000000..68a14cb --- /dev/null +++ b/src/content/blog/5-jetbrains-tipsntricks-i-wish-id-known-sooner.md @@ -0,0 +1,76 @@ +--- +title: "5 JetBrains tips'n'tricks I wish I'd known sooner" +date: '2019-07-03' +categories: + - 'coding' +tags: + - 'ide' + - 'jetbrains' +coverImage: './images/cards-scaled.jpg' +--- + +Here are some small features that may not be apparent to the newer devs that leverage the JetBrain IDEs. Most of them I discovered by using the. + +1. Double Shift for navigating your codebase +2. cmd/ctrl + shift + f for text search +3. Remote Interpreters +4. Syncing settings +5. Reformatting + +
    + +![](images/cards-1024x567.jpg) + +
    + +Photo by [Matt Flores](https://unsplash.com/@matdflo?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +
    + +
    + +## Double Shift + +For many including myself this is the primary way to navigate code and files. Simply press shift two times, type in the file, class or function you are searching for and press enter. This is by far the quickest and most accurate way to navigate code in any Editor or IDE I've tried so far. +Do it once, and you will not go back. + +## CMD + Shift + F + +**Windows & Linux**: ctrl + shift + f + +This is somewhat similar to 2x Shift. The main difference is that double shifts searches mainly for filenames and symbols (function names, class names, etc.) while CMD shift f functions more like a text search. + +What makes this really powerful is that you can [regex search](https://www.jetbrains.com/help/idea/tutorial-finding-and-replacing-text-using-regular-expressions.html#Tutorial_Finding_and_Replacing_Text_Using_Regular_Expressions.xml), [mask files by extension](https://www.jetbrains.com/help/idea/finding-and-replacing-text-in-project.html#exclude_type), [exclude folders](https://www.jetbrains.com/help/webstorm/configuring-project-structure.html#022f3834) (e.g. build folders) and search only in specific directories. + +If you ever _loose something in your code_ or _maybe your are new to the project_ and don't know where certain parts are located, **this is the way to find it.** + +## Remote Interpreters + +This is a huge one for me! JetBrains allows you tu run the code on remote machines. This extends also to all the packages you install, the shell in the terminal is automatically opened on the host. + +Remote hosts can be either a machine in which you ssh into, a local docker container running a different version of the language that you need. + +_You might ask why?_ + +1. Use a docker container with a specific version of node/python/php/etc. instead of installing it locally on your machine. Basically a virtual environment for every language. Amazing! +2. Maybe you want to run the code on a Raspberry Pi, which has a different architecture. So all the packages you install will be installed on the Raspberry and when you hit _command+r_ the code will execute not on your machine but you still get the logs. Incredible! + +To configure **simply go to the** _**run**_ **menu and add a new remote interpreter**. + +## Sync Settings across devices + +This is very simple. You can sync all your settings, including plugins, to either your JetBrain account or your own git settings repository. When you open the IDE some where else, everything is back to how it was. + +Enable by going to: File -> Sync IDE Settings + +**Note:** The synchronisation is per-IDE-basis, so your WebStorm settings are not synced with your PyCharm settings of course. + +## Reformatting + +Yet again a one of the reasons why I can't go back to VSCode. For each language there is a TON of customisation possible when reformatting. You can decide how your spaces should look, commas, imports, semicolons, everything is completely up to you. + +You can tinker around with it in the Settings under: Editor -> Code Style -> + +**Bonus:** If you select on a folder in the project view, you can reformat all files inside it, quick and easy. This is especially useful if one has imported some external sources for example. + +Thats it, I hope you found some of it useful and that you can enjoy the JetBrain cosmos even more 😉 diff --git a/src/content/blog/a-guide-to-directus-for-gatsby-or-sapper-as-cms.md b/src/content/blog/a-guide-to-directus-for-gatsby-or-sapper-as-cms.md new file mode 100644 index 0000000..6853dca --- /dev/null +++ b/src/content/blog/a-guide-to-directus-for-gatsby-or-sapper-as-cms.md @@ -0,0 +1,266 @@ +--- +title: 'A guide to Directus for Gatsby or Sapper as CMS' +date: '2020-04-11' +categories: + - 'coding' +tags: + - 'cms' + - 'directus' + - 'gatsby' + - 'sapper' + - 'static-generated' +coverImage: './images/noah-silliman-doBrZnp_wqA-unsplash.jpg' +--- + +For those who don't know what [Directus](https://directus.io/) is: an open source database first CMS that generates an api. Lot of buzzwords there, but it's truly a cool project that deserves much more attention IMO. + +Recently I've used it to deliver some static generated websites that needed some sort of CMS. Think of a blog, or small landing pages. For that kind you can combine it with Gatsby or in this case Sapper to generate static html from the API. + +The article will focus on Sapper, but the parts related to Directus are identical for Gatsby, just the frontend will change. + +#### What will we do today? + +1. [Install Directus](#1) +2. [Create some data and make in publicly available](#2) +3. [Create a super small frontend](#3) +4. [Write a custom hook for Directus that automatically triggers the build whenever content changes in the DB.](#4) + +
    + +![](images/noah-silliman-doBrZnp_wqA-unsplash.jpg) + +
    + +Photo by [Noah Silliman](https://unsplash.com/@noahsilliman?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/s/photos/rabbit?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +
    + +
    + +## Installing Directus + +This should be straight forward. These instructions are adopted from the [official docker guide](https://docs.directus.io/installation/docker.html). I will use Docker for this. + +``` +# docker-compose.yml + +version: "3.7" + +services: + + mysql: + image: mysql:5.7 + volumes: + - ./data/db:/var/lib/mysql + env_file: .env + + directus: + image: directus/directus:v8-apache + ports: + - "8000:80" + env_file: .env + volumes: + - ./data/config:/var/directus/config + - ./data/uploads:/var/directus/public/uploads +``` + +The we run `docker-compose up -d`. After a few seconds we need to initialise Directus. + +``` +docker-compose run directus install --email some@email.com --password 1337 +``` + +Now you can go to [localhost:8000](http://localhost:8000) and sign in with the credentials you just specified + +## Create some data + +Now I'm going to create some data to test our blog. First go to the [settings](http://localhost:8080/admin/#/_/settings/collections) and create a new collection. Im a going to call it `posts`. +Then we are going to add a `title` text field and a simple markdown editor with a `body` field. +Lastly we add a simple post with random data. + +
    + +![](images/data.gif) + +
    + +Insert collection and data + +
    + +
    + +## Giving permissions + +Now we need to give permission to the `public` role so that we don't need an API Key. For the most sites this is perfectly fine, since the data we only expose the data that gets displayed in the website anyways. + +Goto the [roles settings](http://localhost:8080/admin/#/_/settings/roles) and click on `public`. There select the tables you want/need for the website. + +Gotcha: If you have files (like photos) you also need to enable them for public viewing. Do this by clicking "Show Directus System Collections" and enabling view access to `Files` + +
    + +![](images/permissions.gif) + +
    + +Give permissions to the public user + +
    + +
    + +## Building a minimal frontend with sapper + +I will not explain how [Sapper](https://sapper.svelte.dev/) works as this is not the focus today. If you don't know Sapper: It's very similar to Nuxt or Next.js with the additional option to even export as static html, so the end result is similar to a Gatsby website. Very powerful and easy to use and code. + +``` +# Setup +npx degit "sveltejs/sapper-template#rollup" my-blog +cd my-blog +yarn +yarn run dev +# open http://localhost:3000 +``` + +### Load data from Directus + +Directus has a [JS SDK](https://docs.directus.io/guides/js-sdk.html) and since we have made data public we don't even need a token or authentication. Awesome 🚀 + +``` +yarn add @directus/sdk-js +``` + +First we are going to initialise the SDK. The default project name is simply `directus` + +``` +// ./src/lib/api.js + +import DirectusSDK from '@directus/sdk-js' + +export const client = new DirectusSDK({ + url: 'http://localhost:8000', + project: 'directus' +}) +``` + +Then lets make a server side json loader so that the exported site will not even contact the server afterwards. Completely static html. + +``` +// ./src/routes/posts.json.js + +import { client } from '../lib/api' + +export async function get (req, res, next) { + try { + const { data } = await client.getItems('posts') + + res.writeHead(200, { + 'Content-Type': 'application/json' + }) + res.end(JSON.stringify(data)) + } catch (e) { + res.writeHead(404, { + 'Content-Type': 'application/json' + }) + res.end(JSON.stringify({ + message: 'Not found' + })) + } +} +``` + +Finally the svelte component. + +``` +// ./src/routes/index.svelte + + + + + +
    + {#each data as post} + + {/each} +
    +``` + +## Write a custom hook to trigger a build every time the data changes + +When it comes to static generated sites often the easiest way to do things is to simply generate the site every "x" time. That kinda works however there will be many build that don't contain any change and you need to wait for a cron job to see changes. That sucks. + +Fortunately Directus supports writing custom hooks! 🎉 +I will illustrate the case for [Drone](https://drone.io/), but the approach can be used for any CI/CD server out there. + +For that we create a new php file and give it a name. In my case: `drone-hook.php` + +``` +# ./hooks/drone-hook.php + + [ + 'item.create' => process, + 'item.update' => process, + 'item.delete' => process, + ] + ]; +``` + +I've also put the token inside of the `.env` file so that I can safely check my code into a repo and not having to worry about having a token lying around in the codebase. + +``` +# .env + +... +DIRECTUS_DATABASE_PASSWORD=directus + +DRONE_TOKEN=my-drone-token +``` + +The last thing to do is actually load the code into Directus. You can simply mount the `./hooks` folder we just created into the container and reload. + +``` +# docker-compose.yml + +version: "3.7" + +... + + directus: + ... + volumes: + ... + - ./hooks:/var/directus/public/extensions/custom/hooks +``` + +This will trigger a curl post request every time items in a collection listed inside of `$collectionsToWatch` get either created, updated, or deleted. + +You will probably need to make some adaptations if you are not using Drone, but at the end it will boil down to making a http request to your build server triggering a new build. diff --git a/src/content/blog/a-practical-introduction-to-react-hooks.md b/src/content/blog/a-practical-introduction-to-react-hooks.md new file mode 100644 index 0000000..3ead4fe --- /dev/null +++ b/src/content/blog/a-practical-introduction-to-react-hooks.md @@ -0,0 +1,302 @@ +--- +title: 'A practical introduction to React Hooks' +date: '2019-05-03' +categories: + - 'coding' +tags: + - 'hooks' + - 'javascript' + - 'react' +coverImage: './images/matt-artz-353210-unsplash-scaled.jpg' +--- + +Since [React](https://reactjs.org/) 16.8 was published in February Hooks are now officially supported and the API finalised and stable. They arose around the idea of functional programming. In short: they allow to have state in functional components and with custom hooks (we'll have a look at those later) they allow us to reuse and share state logic between multiple components. This article assumes a basic understanding of React. + +All the code shown can be found here: [https://git.nicco.io/cupcakearmy/guide-react-hooks](https://git.nicco.io/cupcakearmy/guide-react-hooks) + +
    + +![](images/matt-artz-353210-unsplash-1024x780.jpg) + +
    + +wrenches - new tools + +
    + +
    + +#### What we will look at today + +1. Class Components vs Functional Components +2. Native React hooks + - `useState` + - `useEffect` + - `useRef` +3. Custom hooks + - `useWindow` + - `useApi` (The real power) + +## 1\. Class vs Functional + +Let's first have a look at the 'hello world' of react: A simple counter which we can increment or decrement. + +###### Class + +``` +import React from 'react' + + +class SimpleClass extends React.Component { + + constructor(props) { + super(props) + this.state = { + counter: 0, + } + } + + componentDidMount() { + console.log('Lets goo 🚀') + setTimeout(() => this.setState({ counter: 5 }), 2000) + } + + componentDidUpdate() { + console.log(this.state.counter) + } + + render() { + return
    +
    {this.state.counter}
    +
    + + +
    + } +} +``` + +Easy! Now we will convert the snippet above to the functional equivalent with the help of hooks. + +###### Hooks + +``` +import React, { useEffect, useState } from 'react' + + +const SimpleFC = () => { + const [counter, setCounter] = useState(0) + + return
    +
    {counter}
    +
    + + +
    +} +``` + +Awesome 🚀 Simple enough right? + +## 2\. Native React hooks + +### useState + +Our constructor with `state` is gone and we have a simple `const [counter, setCounter] = useState(0)`. + +How does this work? `useState` returns an array wich deconstructed gives us a getter and a setter. The parameter we pass to it is the initial value. That is all. Simple and useful. + +### useEffect + +How about the timeout and the `console.log`? Welcome `useEffect`! + +`useEffect` takes a function and executes it every time the component updates. So it is basically `componentDidMount` and `componentDidUpdate` together. +The second parameter determines when the function will be triggered. It expects an array and checks whether the variables inside it change. +If no array is passed it will trigger every time the component gets updated and or mounted. +This means that you can pass props into the array and it will effect only when those change. Also, if you pass an empty array it will trigger only once and is equivalent to `componentDidMount`. + +``` +useEffect(myFN) // triggered every time the component gets updated +useEffect(myFN, []) // Only triggered +useEffect(myFN, [prop1, prop2]) // Gets triggered when either the props get changed +``` + +In our example from above we would use it as follows: + +``` +import React, { useEffect, useState } from 'react' + + +const SimpleFC = () => { + const [counter, setCounter] = useState(0) + + useEffect(() => { + setTimeout(() => { + setCounter(5) + }, 1000) + }, []) + + useEffect(() => { + console.log(counter) + }) + + return
    +
    {counter}
    +
    + + +
    +} +``` + +### useRef + +Now let's have a look at `useRef`. We will have a normal class based component and the equivalent functional one with the help of hooks. + +###### Class + +``` +class RefClass extends React.Component { + constructor(props) { + super(props) + this.myRef = React.createRef() + this.change = this.change.bind(this) + } + + change() { + this.myRef.current.style.backgroundColor = '#6ba7ee' + } + + render() { + return
    + +

    +
    +
    + } +} +``` + +###### Hooks + +``` +const RefFN = () => { + const rect = useRef() + + const change = () => rect.current.style.backgroundColor = '#6ba7ee' + + return
    + +

    +
    +
    +} +``` + +That is huge improvement in terms of amount code and most importantly readability. `react.current` points to the Dom element, which we can then modify at our will. + +As a side node: look how much cleaner we can have class functions. instead of needing binding the function to `this`, in functional components we just need to define them. + +## 3\. Custom hooks + +This is where the real power lies. With custom hooks react allows you to reuse stateful logic and share it between components. Very powerful. +We will cover two examples: + +1. Window size +2. Consume an API + +### Window size + +Assume you want to make a component dependent on the window size of the browser. With react hooks this is quick, easy and reusable. + +###### hooks.js + +``` +export const useWindowSize = () => { + const getCurrentSize = () => ({ height: window.innerHeight, width: window.innerWidth }) + + const [size, setSize] = useState(getCurrentSize()) + + useEffect(() => { + const handle = () => setSize(getCurrentSize()) + window.addEventListener('resize', handle) + return () => window.removeEventListener('resize', handle) + }) + + return size +} +``` + +###### component.jsx + +``` +import { useWindowSize } from '../Hooks' + +const Custom = ()=> { + const size = useWindowSize() + + return
    + Width: {size.width} +
    + Height: {size.height} +
    +} +``` + +As we can see we created a custom hook called `useWindowSize`. We now can use our own hook inside of other components. + +Custom components are just arrow functions that use the native `useState` and `useEffect` and some custom logic you add. + +Note the `return () => window.removeEventListener('resize', handle)` inside the effect function. You can return a function in the effect function that will get called whenever the hook will be unmounted. This allows us to do cleanup. In this case we stop listening for window size changes. Neat 💪 + +### API Hook + +Last but definitely not least: API calls. I personally think this is where hooks really show their power. I'll show you the code first and then explain. + +###### hooks.js + +``` +export const useCallApi = (url) => { + const [data, setData] = useState() + + const update = () => { + fetch(url) + .then(response => response.json()) + .then(json => setData(json)) + } + + useEffect(() => { + update() + }, []) + + return [data, update] +} +``` + +###### posts.jsx + +``` +import { useCallApi } from '../Hooks' + + +const Posts = () => { + const [posts] = useCallApi(`https://jsonplaceholder.typicode.com/posts`) + const [users] = useCallApi(`https://jsonplaceholder.typicode.com/users`) + // ... + + if (!posts) return
    Loading 🕰
    + + return
    + {posts.map((post, i) =>
    +

    {post.title}

    +

    {post.body}

    +
    )} +
    +} +``` + +What is happening? We created a custom hook that queries an API and returns the result. How? We pass a url to the hook and we get the data back. + +Internally the hook uses `useState` to save the results. It executes the update functions once (because the use effect has an empty array as second parameter). + +Now we can use the `useCallApi` hook in multiple components or many times inside the same component. Options are endless. diff --git a/src/content/blog/a-sane-and-efficient-guide-for-consuming-graphql-endpoints-in-typescript.md b/src/content/blog/a-sane-and-efficient-guide-for-consuming-graphql-endpoints-in-typescript.md new file mode 100644 index 0000000..ddfb3a0 --- /dev/null +++ b/src/content/blog/a-sane-and-efficient-guide-for-consuming-graphql-endpoints-in-typescript.md @@ -0,0 +1,199 @@ +--- +title: 'A sane and efficient guide for consuming GraphQL endpoints in Typescript' +date: '2021-12-31' +categories: + - 'coding' +tags: + - 'code-generation' + - 'graphql' + - 'typescript' +coverImage: './images/clayton-robbins-Ru09fQONJWo-unsplash-scaled.jpg' +--- + +GraphQL is becoming common practice in the wild, while I feel the workflow with Typescript is still not straight forward. I want to propose one way to go about it and hopefully make your next Typescript GraphQL project a joy to work with! +Lets dive deeper 🤿. + +I created a tiny [companion repository](https://github.com/cupcakearmy/blog-typescript-graphql) if you want to check out the code and try it out. +Or check out the [finished demo](https://blog-typescript-graphql.vercel.app/). + +
    + +![](images/clayton-robbins-Ru09fQONJWo-unsplash-1024x683.jpg) + +
    + +Photo by [Clayton Robbins](https://unsplash.com/@claytonrobbins?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/@claytonrobbins?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +
    + +
    + +## Intro + +First we need to decide on what do we want (and probably need) + +- Editor support for syntax highlighting `gql` and `.graphql` files. +- Strict type safety for our client. +- Easy tooling & workflow + +So our workflow will look something like this: + +``` +GrapQL API -> Schema -> Queries & Mutations -> Typescript -> Client +``` + +For this article we'll build a minuscule one pager using the [SpaceX Land GraphQL API](https://api.spacex.land/graphql/) to display some space travel data. + +## Editor setup + +The setup will be be for VSCode. For that we first install the [GraphQL extension](https://marketplace.visualstudio.com/items?itemName=GraphQL.vscode-graphql). This will enable us to have warnings and autocompletion inside of `gql` tags and `.graphql` files. + +We need to add a `.graphqlrc.yml` file at the root with the following content: + +``` +schema: https://api.spacex.land/graphql/ +``` + +## Writing Queries & Mutations + +Now onto the real stuff. +We want to take our endpoint, generate types and queries from it that can then be used by Typescript safely. To do that we will: + +1. Setup generators for Schema, Queries, Mutations & SDK. +2. Write some Queries & Mutations +3. Generate the SDK +4. Consume the SDK + +### Setup + +There is this amazing project called `@graphql-codegen` which is a collection of tools for helping you generating various things from GraphQL. Let's install: + +``` +# Generators +pnpm i -D @graphql-codegen/cli @graphql-codegen/typescript @graphql-codegen/typescript-operations @graphql-codegen/typescript-graphql-request +# For the SDK +pnpm i -D graphql graphql-request graphql-tag +``` + +I will assume my GraphQL stuff will live under `./src/lib/gql` + +We will create a top level configuration file to handle all of our generation step called `codegen.yaml`. Ignore the `config` option for now, I will explain that later + +``` +schema: https://api.spacex.land/graphql/ +documents: "src/**/*.graphql" +generates: + ./src/lib/gql/gen.ts: + plugins: + - "@graphql-codegen/typescript" + - "@graphql-codegen/typescript-operations" + - "@graphql-codegen/typescript-graphql-request" + config: + maybeValue: "T" + typesPrefix: GQL + immutableTypes: true + useTypeImports: true + avoidOptionals: true +``` + +The property `schema` does not need an explanation. +`generates` has 3 plugin enabled, one for the general types, another for queries and mutations and the last one to generate us a ready to use SDK and will save it under `./src/lib/gql/gen.ts`. +`documents` is a glob that will find all our GraphQL files we write and generate the according code. + +### Creating Queries + +Now let's create a `src/lib/gql/root.graphql` file and write some queries, all autocompleted of course! + +``` +query LaunchpadsMany { + launchpads(limit: 10) { + id + name + location { + name + } + successful_launches + status + } +} + +query LaunchByYear($year: String!) { + launches(find: { launch_year: $year }) { + mission_id + mission_name + launch_date_utc + rocket { + rocket_name + } + } +} +``` + +### Let magic do it's thing + +``` +pnpm exec graphql-codegen +``` + +This will look at all our custom queries and mutations and generate us a ready to consume SDK that is completely typed. Amazing! + +### Leverage the new SDK + +``` +// src/lib/gql/index.ts + +import { GraphQLClient } from 'graphql-request' +import { getSdk } from './gen' + +const client = new GraphQLClient('https://api.spacex.land/graphql/') +export const SDK = getSdk(client) +``` + +``` +import { SDK } from '$lib/gql' + +const data = await SDK.LaunchByYear({ year: '2021' }) +``` + +You can also use the generated types to explicitly set them + +``` +import { SDK } from '$lib/gql' +import type { GQLLaunchByYearQuery } from '$lib/gql/gen' + +const data: GQLLaunchByYearQuery = await SDK.LaunchByYear({ year: '2021' }) +``` + +Every thing is typed now, I can't pass a number to the `year` variable or use return data that does not exist. Typescript will error on me. This not only gives us autocompletion but also the safety of what we are doing. + +### Configuration options + +I promised I would come back to it at some point. + +``` +schema: ... +generates: + ... + config: + maybeValue: "T" + typesPrefix: GQL + immutableTypes: true + useTypeImports: true + avoidOptionals: true +``` + +There are [many options](https://www.graphql-code-generator.com/plugins/typescript#config-api-reference) for the generators, but I think these are quite sensible defaults. + +`maybeValue` is `T | null` as default, but since we only use our queries which are type safe we can just remove uncertainty and use the correct type straight away. + +`avoidOptionals` same thing as the `maybeValue`, just with `prop:?`. Don't want that. + +`typesPrefix` is useful if you have some own type specifications that you don't want to clash with. I like to prefix all my generated GraphQL stuff with `GQL` to keep it tidy. + +`immutableTypes` i prefer using an immutable type, with basically adds a `readonly` to every property. This way we are sure we are not editing data on the client. + +`useTypeImports` this uses `import type` whenever possible. + +## Final thoughts + +I hope this made your GraphQL life a bit easier, it definitely did for me and it's way more fun to consume GraphQL API this way. Also something worth mentioning is that you can use the `@graphql-codegen/typescript-generic-sdk` package instead of the `@graphql-codegen/typescript-graphql-request` if you want to do the network requests yourself. It's easy to use but if you don't really have a reason just stick with the `graphql-request` one I'd say. diff --git a/src/content/blog/automate-github-releases-with-drone.md b/src/content/blog/automate-github-releases-with-drone.md new file mode 100644 index 0000000..d41fba4 --- /dev/null +++ b/src/content/blog/automate-github-releases-with-drone.md @@ -0,0 +1,137 @@ +--- +title: 'Automate Github releases with Drone.' +date: '2020-01-29' +categories: + - 'coding' +tags: + - 'cd' + - 'drone' +coverImage: './images/franck-v-U3sOwViXhkY-unsplash-scaled-1.jpg' +--- + +If you have a project on github that has releases for code or binaries for example it might be a good idea to automate it. Not only this saved a lot of clicks and time, but also it makes releases predictable and therefore less prone to errors in the process. + +For this article I will take my own [project](https://github.com/cupcakearmy/autorestic) as the example here, but of course this can be applied to any project, written in whatever language and/or framework. + +Also I will base this guide on [Drone](https://drone.io/). But I'm sure there is the same workflow for jenkins/circle/whatever CI/CD system you are using. +This means I'm assuming you have a repository already running with Drone. + +
    + +![](images/franck-v-U3sOwViXhkY-unsplash-scaled-1.jpg) + +
    + +Photo by [Franck V.](https://unsplash.com/@franckinjapan?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/s/photos/robot?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +
    + +
    + +The first thing we will need is an access token for the Github API. +You can get them here [https://github.com/settings/tokens](https://github.com/settings/tokens). I called my `Drone` and you need to check the permissions for the repos as follows. + +
    + +![](images/Screenshot-2020-01-29-at-14.57.05.png) + +
    + +How to create a new token in Github + +
    + +
    + +Copy the token and save it somewhere **safe**. You will see it only once. + +We will add this token to our Drone repository settings. For that navigate to your drone instance and open the settings for the repository in question. + +
    + +![](images/Screenshot-2020-01-29-at-14.55.28.png) + +
    + +Add the token to Drone secrets + +
    + +
    + +I've called my secret `github` and I have not allowed it in PRs. Otherwise a PR made by some random user could trigger a release. We don't want that. + +Now it's time to edit our drone file and make everything automatic. The flow at the end will be as follows. + +1. Code, commit and develop +2. When you are ready for the next release we create a tag +3. Once a tag is created and pushed drone will automatically build and release that code attached to the tag. + +Simple right? Lets see how! + +``` +# .drone.yml +--- +kind: pipeline +name: default + +steps: +- name: build + image: node + pull: always + commands: + - yarn + - yarn run bin + when: + event: tag + +- name: publish + image: plugins/github-release + pull: always + settings: + api_key: + from_secret: github + files: bin/* + checksum: + - sha512 + note: CHANGELOG.md + when: + event: tag +--- +kind: signature +hmac: 3b1f235f6a6f0ee1aa3f572d0833c4f0eec931dbe0378f31b9efa336a7462912 + +... +``` + +Lets understand what is happening here: + +First I'm building my project. In this case this is a standalone typescript executable build by [pkg](https://github.com/zeit/pkg). The build binaries will be emitted into the `./bin` folder. But it really does not matter. Could be anything. + +Secondly we tell the [Github release plugin](http://plugins.drone.io/drone-plugins/drone-github-release/) what files we want to include in the release. In my case this was everything inside the `bin` folder. This can also be an array. + +``` +files: + - dist/* + - bin/binary.exe +``` + +The `api_key` includes the token, which we load from a secret so that we don't simply put in the `.drone.yml` file, which could be a huge security issue! + +The `checksum` setting is also amazing because as the name suggests the plugin automatically generates checksums for all the files. That is amazingly practical and there is no reason not to do that. You can choose a few hash functions but I would suggest simply going with `sha512`. + +## So how do a trigger a release now? + +Simple! First tag your code with the following command + +``` +git tag 1.2.3 +``` + +Now push the tag and drone will be on its way + +``` +git push --tags +``` + +Thats it! Hope it made your release journey easier 🙂 diff --git a/src/content/blog/backup-mongodb-inside-of-docker-the-right-way.md b/src/content/blog/backup-mongodb-inside-of-docker-the-right-way.md new file mode 100644 index 0000000..bfc589b --- /dev/null +++ b/src/content/blog/backup-mongodb-inside-of-docker-the-right-way.md @@ -0,0 +1,67 @@ +--- +title: 'Backup MongoDB inside of Docker the easy way' +date: '2019-08-15' +categories: + - 'coding' +tags: + - 'cli' + - 'docker' +coverImage: './images/tobias-fischer-PkbZahEG2Ng-unsplash-scaled.jpg' +--- + +Backing up a mongo instance is more confusing than it should be. Maybe you have run into a `the input device is not a TTY` or you simply don't know how to do it? Here are two 1-Liner to backup and restore a running mongo instance. + +
    + +![](images/tobias-fischer-PkbZahEG2Ng-unsplash-1024x497.jpg) + +
    + +Photo by [Tobias Fischer](https://unsplash.com/@tofi?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/search/photos/database?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +
    + +
    + +## Setup + +First we define our mongo instance like below. Notice that instead of mapping the data directory onto our filesystem we have a native volume. + +###### docker-compose.yml + +``` +version: '3.7' + +volumes: + db: + +services: + db: + image: mongo:3-xenial + restart: always + volumes: + - db:/data/db + ports: + - 27017:27017 +``` + +Then start with `docker-compose up -d`. + +## Backup + +First we will do a backup of our running instance. + +``` +docker-compose exec -T db mongodump --archive --gzip --db mydb > dump.gz +``` + +The `-T` option is for enabling piping the output to our own machine. We also tell mongo to use the `--gzip` option to compress the file significantly. +Lastly we specify the `--db ` that we want to backup. + +## Restore + +Whenever we want to restore a db, or maybe seed it we can run the following: + +``` +docker-compose exec -T db mongorestore --archive --gzip < dump.gz +``` diff --git a/src/content/blog/be-your-own-tiny-image-cdn.md b/src/content/blog/be-your-own-tiny-image-cdn.md new file mode 100644 index 0000000..b975986 --- /dev/null +++ b/src/content/blog/be-your-own-tiny-image-cdn.md @@ -0,0 +1,98 @@ +--- +title: "Be your own (tiny) image CDN" +date: "2023-04-28" +--- + +Today, I want to share how to create and host your own image transformation service, much like the known [Imgix](https://imgix.com/) and [Cloudinary](https://cloudinary.com/). The aim is to have a powerful transformation server for images that caches, so images only need to be computed once. + +The building blocks will be [imgproxy](https://github.com/imgproxy/imgproxy) and [nginx](https://nginx.org/). The former is a battle tested and fast image server with support for most image operations, while nginx should not need an introduction. + +
    + +![](images/meagan-carsience-QGnm_F_nd1E-unsplash1-1024x683.jpg) + +
    + +Photo by [Meagan Carsience](https://unsplash.com/@mcarsience_photography?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/photos/QGnm_F_nd1E?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +
    + +
    + +While imgproxy is the core of this operation, it does not support caching. This is intentional, as it's intended to be run behind a proxy. For that, nginx is the tool of choice, as it enables us to easily setup caching rules to avoid generating the same image twice in a given cache interval. Everything will be done in docker containers, but the concept, of course, extends to bare metal too. + +## Setup + +Imgproxy fortunately is very customisable and options can be passed by env variables, which is wonderful. + +It's generally advised to use signed URLs if possible. In my case, there was no backbend that could sign them, so it was avoided. Whenever omitting signing, it is critical to limit the allowed sources to the minimum with `IMGPROXY_ALLOWED_SOURCES` so that it cannot be abused by other websites. + +Below is docker file used. Required is only the `IMGPROXY_BIND` as otherwise nginx cannot connect to our image container. The other options are up to you and are just here for a quick setup. + +``` +# docker-compose.yaml +version: '3.8' + +volumes: + cache: + +services: + img: + image: darthsim/imgproxy + environment: + # Required for nginx + IMGPROXY_BIND: 0.0.0.0:80 + + # Security + IMGPROXY_MAX_SRC_RESOLUTION: 100 + IMGPROXY_ALLOWED_SOURCES: https://images.example.org/ + + # Transforms + IMGPROXY_ENFORCE_WEBP: true + IMGPROXY_ENFORCE_AVIF: true + IMGPROXY_ONLY_PRESETS: true + IMGPROXY_PRESETS: default=resizing_type:fit,sm=size:250:250,md=size:500:500,lg=size:1000:1000 + + proxy: + image: nginx + ports: + - 80:80 + volumes: + - ./proxy.conf:/etc/nginx/conf.d/default.conf:ro + - cache:/tmp +``` + +The more interesting part is the nginx configuration file below. In this case, we target 30 days as a cache TTL. This could be easily increased if we are only talking about static images. + +``` +# Set cache to 30 days, 1GB. +# Only use the uri as the cache key, as it's the only input for imageproxy. +proxy_cache_path /tmp levels=1:2 keys_zone=images:8m max_size=1g inactive=30d; +proxy_cache_key "$uri"; +proxy_cache_valid 200 30d; + +server +{ + listen 80; + server_name _; + + location / + { + proxy_pass_request_headers off; + proxy_set_header HOST $host; + proxy_set_header Accept $http_accept; + + proxy_pass http://img; + + proxy_cache images; + } +} +``` + +Here we are configuring a few things, so let's elaborate: + +First a cache is configured at the location `/tmp`, with the name `images`, a maximum size of 1 gigabyte and the `inactive` parameter to 30 days. +For the cache key, we use only the `$uri` variable, as all the parameters that affect image generation are included in the path and makes therefore the image transformation unique. +Lastly, we tell nginx to cache all responses with code `200` for 30 days. + +Another important trick is to strip all headers that reach the proxy. This is done by setting `proxy_pass_request_headers` and only passing the `Accept` header, as it's required for automatically determining the image format. diff --git a/src/content/blog/cleanup-downloaded-google-photos-takeout-archives.md b/src/content/blog/cleanup-downloaded-google-photos-takeout-archives.md new file mode 100644 index 0000000..67547a2 --- /dev/null +++ b/src/content/blog/cleanup-downloaded-google-photos-takeout-archives.md @@ -0,0 +1,79 @@ +--- +title: 'Cleanup downloaded Google Photos Takeout archives' +date: '2019-05-04' +categories: + - 'general' +tags: + - 'google-photos' + - 'google-takeout' + - 'icloud-photos' + - 'migration' +coverImage: './images/rayan-almuslem-1302778-unsplash-scaled.jpg' +--- + +Recently I've been taking my tin foil hat a bit more seriously and since I mostly live in the Apple ecosystem (yes, you can judge me) the iCloud Photos felt like a pretty good alternative. Yes, it's still a cloud but the content [is encrypted](https://support.apple.com/en-us/HT202303) and most importantly Apple has no real economical incentive on data mining you data. They are far ahead in terms of privacy. With that out of the way let's go! 🚀 + +TLDR: I wrote this [cleaning script](https://gist.github.com/CupCakeArmy/51070b311e6fd0a3f2d793bee3350ede) (tested only on macOS) to remove all duplicates from the [Google Takeout](https://takeout.google.com/) folders. + +
    + +![](images/rayan-almuslem-1302778-unsplash-1024x683.jpg) + +
    + +Photo by [Rayan Almuslem](https://unsplash.com/photos/_aPYcEKtDQ0?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/search/photos/camera?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +
    + +
    + +The process seemed easy at first. Google offers an awesome tools for exporting data out of their servers. It's called [Takeout](https://takeout.google.com/). So basically you select the Google Photos service and let them create the archives. Then after a few hours you can download them. + +Now at the time I had ~40gb worth of pictures and videos saved in Googles cloud, however the archives I downloaded where about ~90gb. I started looking into it and a lot of photos where duplicates and edited versions that google was keeping. In addition the folders where full of JSON metadata. + +**time for cleanup 🧹** + +Fortunately for us there is the awesome `find` command that will save our lives. Removing metadata and duplicates from more than ~50k files is impossible by hand. + +First we need to remove all `.json` files: + +``` +find ./my_takeout_folder -name "*.json" -type f -delete +``` + +Then all the duplicates that contain a `(1)` at the end of the file. + +``` +# macOS +find -E ./my_takeout_folder -regex ".*\([0-9]+\).*" -type f -delete + +# Unix (Thanks to Stravos F. for pointing that out ❤️) +find ./my_takeout_folder -regextype posix-extended -regex ".*\([0-9]+\).*" -type f -delete +``` + +All the edited photos by google + +``` +find ./my_takeout_folder -name "*edited*" -type f -delete +``` + +And lastly remove all the empty folders. + +``` +find ./my_takeout_folder -type d -empty -delete +``` + +You probably will have multiple folders because you will have to download multiple archives. Simply unpack them all into one folder and run the scripts on to that folder. + +If you are to lazy to run them manually just get this script I wrote + + + +Then... + +``` +chmod +x ./clean +./clean my_folder_with_all_the_google_takouts +``` + +Finally just drag and drop into the Photos app. diff --git a/src/content/blog/create-a-qr-code-for-google-drive.md b/src/content/blog/create-a-qr-code-for-google-drive.md new file mode 100644 index 0000000..56f5f76 --- /dev/null +++ b/src/content/blog/create-a-qr-code-for-google-drive.md @@ -0,0 +1,82 @@ +--- +title: "Create a QR code for Google Drive" +date: "2022-03-17" +--- + +So you want to make a QR code to a google drive file? It's actually quite easy, I'll show you! + +## 1\. Upload the file and get the shared link + +As shown in the video below the first thing is to upload your file (in this case a PDF) and create a sharable link. + +
    + +
    + +Uploading and generating a link for a google drive file + +
    + + + +
    + +## 2\. Convert the link to a download link + +``` +https://drive.google.com/file/d/1LZ09_aJnGy1aHY0DEuOEFGU4mon2ijir/view?usp=sharing +``` + +If we simply use the provided link (example above) it won't download the file, but create a preview of it. + +If we want a direct download we need to change it to that below: + +``` +https://drive.google.com/uc?export=download&id=1LZ09_aJnGy1aHY0DEuOEFGU4mon2ijir +``` + +To summarise: + +``` +https://drive.google.com/file/d//view?usp=sharing +⬇️ +https://drive.google.com/uc?export=download&id= +``` + +Note that the _``_ part will be different for your file. The rest is the same. + +## 3\. Create the QR Code + +To create a QR code there is a very good free website called: [the-qrcode-generator.com](https://www.the-qrcode-generator.com/). Here you simply paste the link and get your QR Code. + +
    + +![](https://api.nicco.io/wp-content/uploads/2022/03/QR-Big.svg) + +
    + +Big QR code + +
    + +
    + +## 4\. Make the QR code smaller and track clicks + +If you want to have a smaller and cleaner QR code you can use a URL shortener like [Cuttly](https://cutt.ly/) to do so. With Cuttly the URL gets shorter and you can see how many people clicked on it. The new link and QR code then look something like this: + +``` +https://cutt.ly/CSonJs9 +``` + +
    + +![](https://api.nicco.io/wp-content/uploads/2022/03/QR-Small.svg) + +
    + +Small QR code + +
    + +
    diff --git a/src/content/blog/going-beyond-npm-meet-yarn-pnpm.md b/src/content/blog/going-beyond-npm-meet-yarn-pnpm.md new file mode 100644 index 0000000..1b2604d --- /dev/null +++ b/src/content/blog/going-beyond-npm-meet-yarn-pnpm.md @@ -0,0 +1,96 @@ +--- +title: 'Going beyond NPM: meet Yarn & pnpm' +date: '2019-08-27' +categories: + - 'coding' +tags: + - 'javascript' + - 'node' + - 'npm' + - 'pnpm' + - 'yarn' +coverImage: './images/ruchindra-gunasekara-GK8x_XCcDZg-unsplash-scaled.jpg' +--- + +If you are a JS developer you probably use NPM multiple times a day without thinking about it. It's the default package manager which ships with node. + +But have you wondered what if there was another way of managing your (probably too many 😉) packages? We will look at [yarn](https://yarnpkg.com/en/) and [pnpm](https://pnpm.js.org/) as worthy rivals. + +**Update** _27 Aug 2019 @ 21:23_ +As [this user](https://www.reddit.com/r/javascript/comments/cw64xt/going_beyond_npm_meet_yarn_pnpm/ey92a0i?utm_source=share&utm_medium=web2x) on reddit pointed out npm now supports offline installs too, so that part is the same for all three package managers. Also apparently the checksums, but I could now verify it. + +**Update** _27 Aug 2019 @ 22:51_ +If you are having troubles with pnpm try using `pnpm i shamefully-flatten`. Thanks to [this reddit user](https://www.reddit.com/r/node/comments/cw64qq/going_beyond_npm_meet_yarn_pnpm/ey9aa1v?utm_source=share&utm_medium=web2x). + +For the lazy readers: [Jump to the conclusion here](#conclusion). + +
    + +![](images/ruchindra-gunasekara-GK8x_XCcDZg-unsplash.jpg) + +
    + +Photo by [Ruchindra Gunasekara](https://unsplash.com/@ruchindra?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +
    + +
    + +You might wonder now: why? _Why should I bother reading this when NPM works perfectly_? Is this just another run to the latest framework? Don't worry: there are actual reasons you might want to switch. + +#### Speed!!... or the lack of it? + +The biggest issue that plagues npm is speed. Unfortunately even with the latest version (6) npm is slow. If you ever had to delete the node_modules folder to do a clean install on a bigger project you will know what I mean. Fans start to spin, laptop gets warm and you can go read an article while npm chews on the dependencies. + +## Yarn to the rescue + +Yarn came along in the early days and you definitely have heard about it wandering across Github. Back in the days (before npm 5 with the `package-lock.json`) Yarn addressed the issues with consistency by being the first to generate a lockfile (`yarn.lock`). This file could be checked in and the devs would have a consistent dependencies across multiple machines. + +#### Speed + +Yarn is often twice as fast as npm. It's truly impressive and you need to see it for yourself to believe it. The CLI output is also way more human-friendly. + +#### Offline + +Every package version is only downloaded once, so if you happen to loose connection or need to download the same package again you will gain a substantial speed boost since they are cached locally. +_See update at the top_. + +#### yarn upgrade-interactive + +This is incredible 😍. If you run `yarn upgrade-interactive` you get an interactive CLI where you can choose what packages to upgrade and which not. It's a simple thing, but one you cannot live without anymore if tried it once. + +#### yarn why + +Similar to the previous command this is a very handy cli goodie. simply run `yarn why some-package` and yarn will tell you why it was installed, from which dependency it came from, etc. + +#### Lack of npx + +Unfortunately Yarn lacks the `npx` equivalent of npm, which is the only drawback I encountered while using yarn. Other than that yarn is a very fast and a solid alternative to npm. + +## PNPM: The underdog + +I truly love this project so I might be biased. They basically implemented a thought I had a while back: **reuse the same packages across your computer**. Confused? Let me explain: + +Have you ever measured the size of the your node_modules? + +``` +du -sh node_modules +# --> 816M node_modules +``` + +What?! 0.8Gb for a react-native project?! +Unfortunately that is a pretty common reality and **pnpm** aims to solve that. + +PNPM links your packages with symlinks. This means that **the same version of a package only exists once** on your computer. If you ever install the same package twice, it will simply symlinked to your node_modules. 🚀 +[On top of that it's even faster than yarn.](https://github.com/pnpm/benchmarks-of-javascript-package-managers) + +#### So perfection is achieved? Let's all switch to pnpm? + +Unfortunately it's not that easy. If you start a new project you can probably go with pnpm, but with existing projects I had some problems with building my apps. So it's definitely experimental at best and should not be used without rigorous testing as it might break your app. pnpm also supports npx with `pnpx`. + +## Conclusion Time + +
    SpeedNPXOfflineWell supported
    npm🐌
    yarn🚄
    pnpm🚀
    + +As you can see above there is no clear winner. NPM is the most compatible of course but really falls behind in terms of speed. **Yarn in my opinion is currently your best bet** and fallback to `npx your-command` when npx is needed. +pnpm is an incredibly cool tool but is not ready yet for production. With react-native I can cause problems, but with the "normal" stacks it works very good. I will use pnpm for my personal projects from now on. diff --git a/src/content/blog/how-to-avoid-killing-your-macbook-laptop-battery.md b/src/content/blog/how-to-avoid-killing-your-macbook-laptop-battery.md new file mode 100644 index 0000000..da32df0 --- /dev/null +++ b/src/content/blog/how-to-avoid-killing-your-macbook-laptop-battery.md @@ -0,0 +1,171 @@ +--- +title: 'How to avoid killing your MacBook / Laptop battery' +date: '2019-07-23' +categories: + - 'general' +tags: + - 'battery' + - 'laptop' + - 'macbook' +coverImage: './images/israel-palacio-ImcUkZ72oUs-unsplash-scaled.jpg' +--- + +As of May of 2020 this is no more relevant! macOS 10.15.5 finally addressed this issue by not charging the battery to 100% depending on battery temperature, health and so on 🚀🚀🚀 + +There are a lot if misleading wisdom out there about batteries (e.g. it is ok to leave your laptop plugged in). The reasons behind it are pretty interesting and not at all trivial. If you want to know why: keep reading. + +**TLDR;** [Jump to the solution](#solution) + +
    + +![](images/israel-palacio-ImcUkZ72oUs-unsplash-scaled.jpg) + +
    + +Photo by [israel palacio](https://unsplash.com/@othentikisra?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/search/photos/electricity?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +
    + +
    + +> The worst situation is keeping a fully charged battery at elevated temperatures. +> +> batteryuniversity.com + +Batteries are consumable items. This means the degrade over time and loose their ability to store energy. We will see how and why this happens and how to combat it. + +## Why do batteries degrade? + +In theoretical chemistry your battery should be able to last forever. But in the real world of course that's not possible. There are 2 main killers for batteries: + +1. Heat +2. Cycles (Especially above ~80%) + +### Killer #1: Heat + +With heat the internal materials of the battery start to loose their chemical form and therefore their capacity. Below is a table that illustrates how batteries react to temperature exposure. + +_Estimated recoverable capacity when storing Li-ion for one year at various temperatures._ + +
    Temperature40% charge100% charge
    0°C98% (after 1 year)94% (after 1 year)
    25°C96% (after 1 year)80% (after 1 year)
    40°C85% (after 1 year)65% (after 1 year)
    60°C75% (after 1 year)60%
    (after 3 months)
    + +As we can see, a heated battery basically is a lost cause, especially when fully charged. + +Unfortunately **there is little we can do for the heat issue** since the thermal design of our Laptop is fixed and the manufacturer will choose where to place the battery and if and how to cool it. + +### Killer #2: Cycles + +Over this one we have much more control. A cycle varies in definition, but basically it is a discharge, followed by a charge. + +Why are cycles bad? Well whenever we move electrons around our battery either by using it or while charging, the chemical material is subjected to wear. Why exactly this happens is beyond my understanding of chemistry, so I won't try to explain it since I would probably do it wrong. + +What I can tell you is how to charge and use your battery in the correct manner: + +1. Ideally leave your battery between 30% and 80% +2. Don't charge over 80% if not strictly required for a long trip or so. + +### Don't believe me, trust the data + +
    + +![](images/DST-cycles-web2.jpg) + +
    + +Capacity loss as a function of charge and discharge bandwidth. [Source](https://batteryuniversity.com/index.php/learn/article/how_to_prolong_lithium_based_batteries) + +
    + +
    + +As we can observe above, all the tested bandwidth that regularly charged to a full 100% degraded the fastest. Don't do that. + +Part of the problem is that as you can see in the graphic below is that while **the first 80% of the capacity is charged easily and quick, the last 80% to 100% have an exponential curve**. Those last percentages are really taxing on the battery because you are trying to stuff the last electrons inside an almost full battery. Imagine you stuffing a last bag into an almost full garbage. You will need to push it. + +Making matters worse, the battery will heat up during the last steps of charging because of the strain that is undergoing. This only adds to the problem, since as we learned above heat is incredibly bad for capacities. + +
    + +![](images/Battery-Charge-Voltage-vs-Time.png) + +
    + +Charging graph for Lithium Batteries. +Graph by [batteryuniversity.com](https://batteryuniversity.com/index.php/learn/article/charging_lithium_ion_batteries) - Colorised by [Android Authority](https://www.androidauthority.com/maximize-battery-life-882395/) + +
    + +
    + +This is also the reason because electric vehicles only charge up to 80%. It increases the lifespan of the battery significantly. On the other hand, consumer **products like laptops and phones are more about selling you maximum battery life.** What they don't tell you is **how quick that advertised battery life is going to last after 6 months** of usage. + +### Myth: It's ok to keep you laptop plugged in + +This is a misconception that arose in recent years. While it is not completely wrong, it overlooks some important aspects. + +What is true? Modern laptops and phones don't overcharge the battery and will switch to using only the powered cable as the source. **However** at some point the battery will dip below 97% and the laptop will start charge it again to 100%. Assuming you use your laptop for work the whole day, this will happen multiple times daily. **It will break it**. + +## Solution + +### For MacBooks (magsafe): + +Put a piece of paper/cloth on your middle connector of your MacBook Magsafe charger **whenever your laptop plugged in for long periods**. + +
    + +![](images/howto.jpg) + +
    + +How-To protect the battery with Magsafe chargers + +
    + +
    + +**Update:** I tried new methods, the one that seems the most practical is to use a little piece of tape that you can bend in front of the connector when needed. + +##### Updated method with tape + +Put a piece of tape on your middle connector. For simplicity you can just cover 3 pins and leave the 2 outside pins (does not matter which side) free. +Now you can easily switch between loading the battery or just working on power **whenever your laptop plugged in for long periods**. + +
    + +![](images/howto-1.jpg) + +
    + +Same method, just with tape. Much easier to use. + +
    + +
    + +
    + +![](images/status.jpg) + +
    + +Status of battery after modification + +
    + +
    + +This will prevent your laptop from using **and** charging your battery while using it for a whole day. +**Credits for the hack**: [https://superuser.com/a/1130375](https://superuser.com/a/1130375) + +### Laptops with removable batteries: + +Simply remove the battery when using laptop for long periods. This will prevent the heat of the laptop being transferred to the battery and it won't charge over and over again to 100%. + +#### Sources + +- [https://batteryuniversity.com/index.php/learn/article/charging_lithium_ion_batteries](https://batteryuniversity.com/index.php/learn/article/charging_lithium_ion_batteries) +- [https://batteryuniversity.com/learn/article/bu_808b_what_causes_li_ion_to_die](https://batteryuniversity.com/learn/article/bu_808b_what_causes_li_ion_to_die) +- [https://batteryuniversity.com/index.php/learn/article/how_to_prolong_lithium_based_batteries](https://batteryuniversity.com/index.php/learn/article/how_to_prolong_lithium_based_batteries) +- [https://batteryuniversity.com/index.php/learn/article/do_and_dont_battery_table](https://batteryuniversity.com/index.php/learn/article/do_and_dont_battery_table) +- [https://www.electricbike.com/how-to-make-lithium-battery-last/](https://www.electricbike.com/how-to-make-lithium-battery-last/) +- [https://www.androidauthority.com/maximize-battery-life-882395/](https://www.androidauthority.com/maximize-battery-life-882395/) diff --git a/src/content/blog/how-to-bring-your-neural-network-to-the-web.md b/src/content/blog/how-to-bring-your-neural-network-to-the-web.md new file mode 100644 index 0000000..a94ef80 --- /dev/null +++ b/src/content/blog/how-to-bring-your-neural-network-to-the-web.md @@ -0,0 +1,340 @@ +--- +title: 'How to bring your neural network to the web' +date: '2020-02-10' +categories: + - 'coding' +tags: + - 'ai' + - 'keras' + - 'machine-learning' + - 'tensorflow' +coverImage: './images/natasha-connell-byp5TTxUbL0-unsplash-scaled-1.jpg' +--- + +Artificial intelligence, neural networks, machine learning. I don't know which of them is the bigger buzzword. If we look past the hype there are some actually very interesting use cases for machine learning in the browser. + +**For the lazy that simply what to just to the source code** +[Here is the git repo](https://github.com/cupcakearmy/mnist) for you :) +**Or simply go to the [finished website](https://mnist.nicco.io/)** + +Today we will look on how to train a simple mnist digit recogniser and then export it into a website where we then can see it in action. Therefore this article will be split into three parts + +1. Training +2. Export & import the pre-trained model into a website +3. Build a simple website where we can use the model. + +Also I am not going to explain what machine learning is, as there are enough guides, videos, podcasts, ... that already do a much better job than I could and would be outside the scope of this article. + +
    + +![](images/natasha-connell-byp5TTxUbL0-unsplash-scaled-1.jpg) + +
    + +Photo by [Natasha Connell](https://unsplash.com/@natcon773?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/s/photos/brain?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +
    + +
    + +So the first thing we need to understand is that we will not train the model in the browser. That is a job for GPUs and the goal here is only to use a pre-trained model inside of the browser. Training is a much more resource intensive task than simply using the net. + +## Training the model + +So, the first step is to actually have a model. I will do this in tensorflow 2.0 using the now included keras api. This means Python 🎉 + +The code below is basically an adapted version of the [keras hello world example](https://keras.io/examples/mnist_cnn/). +If you want to run the code yourself (which you should!) simply head over to [Google Colab](https://colab.research.google.com), create a new file and just paste the code. There you can run it for free on GPUs which is pretty dope! + +``` +from tensorflow.keras.datasets import mnist +from tensorflow.keras.models import Sequential +from tensorflow.keras.layers import Dense, Dropout, Flatten +from tensorflow.keras.layers import Conv2D, MaxPooling2D +from tensorflow.keras.utils import to_categorical + +(x_train, y_train), (x_test, y_test) = mnist.load_data() + +# Reshaping for channels_last (tensorflow) with one channel +size = 28 +print(x_train.shape, x_test.shape) +x_train = x_train.reshape(len(x_train), size, size, 1).astype('float32') +x_test = x_test.reshape(len(x_test), size, size, 1).astype('float32') +print(x_train.shape, x_test.shape) + +# Normalize +upper = max(x_train.max(), x_test.max()) +lower = min(x_train.min(), x_test.min()) +print(f'Max: {upper} Min: {lower}') +x_train /= upper +x_test /= upper + +total_classes = 10 +y_train = to_categorical(y_train, total_classes) +y_test = to_categorical(y_test, total_classes) + +# Make the model +model = Sequential() +model.add(Conv2D(64, (3, 3), activation='relu', input_shape=(size,size, 1), data_format='channels_last')) +model.add(Conv2D(32, (3, 3), activation='relu')) +model.add(MaxPooling2D(pool_size=(2, 2))) +model.add(Dropout(0.25)) +model.add(Flatten()) +model.add(Dense(128, activation='relu')) +model.add(Dropout(0.5)) +model.add(Dense(total_classes, activation='softmax')) + +model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) + +# Train +model.fit(x_train, y_train, + batch_size=32, + epochs=12, + verbose=True) + +score = model.evaluate(x_test, y_test, verbose=0) +print('Test loss:', score[0]) +print('Test accuracy:', score[1]) +``` + +We can run this and we will get a pretty good accuracy. The MNIST dataset ist not very hard to train. + +## Export the model + +Now the conventional way to save a model is to use the `model.save("model.h5")` method provided by keras. This uses the h5 file format. +Unfortunately this is not compatible with tensorflow-js. So we need another way. + +There is a package called tensorflowjs for python (confusing right? 😅) that provides the functionality we need + +``` +import tensorflowjs as tfjs + +tfjs.converters.save_keras_model(model, './js') +``` + +It save the model data inside the `./js` folder ready to be used. +Inside there you will find a `model.json` that basically describes the structure of the model and something like `group1-shard1of1.bin` that contains the fitted weights. + +## Import the model + +Now we are ready to import that. First we need to install the `@tensorflow/tfjs` package. + +``` +import * as tf from '@tensorflow/tfjs'; + +let model + +tf.loadLayersModel('/model.json').then(m => { + model = m +}) +``` + +Ok how do I use that now? + +``` +const tensor = tf.tensor(new Uint8Array(ourData), [1, 28, 28, 1]) +const prediction = model.predict(tensor) +``` + +**What is happening here?** +In order to predict a value we first need a tensor (vector) the same shape as our original input with which we trained the model with. In our case that is 1x28x28x1. +Also we will convert our pixel data into a `Uint8Array`. + +## Using the canvas element to draw and predict numbers + +I'm not gonna talk about what bundler, etc. I'm using. If you interested simply have a look at the [git repo](https://github.com/cupcakearmy/mnist). + +First lets write some basic html for the skeleton of our page. + +``` + + + + + + + +
    +

    MNIST (Pretrained)

    + +
    + +
    + +
    +

    + +

    source code

    +
    +
    + + + + + + +``` + +Next we need come short code for drawing on a canvas. +The code is adapted from [this stackoverflow answer](https://stackoverflow.com/a/8398189) and reduced to the only the basics we need. + +In essence it's a canvas that listens on our mouse events and fills the pixels with black. Nothing more. + +``` +/* jslint esversion: 6, asi: true */ + +var canvas, ctx, flag = false, + prevX = 0, + currX = 0, + prevY = 0, + currY = 0, + dot_flag = false; + +var x = "black", + y = 2; + +function init() { + canvas = document.getElementById('can'); + ctx = canvas.getContext("2d"); + w = canvas.width; + h = canvas.height; + + canvas.addEventListener("mousemove", function (e) { + findxy('move', e) + }, false); + canvas.addEventListener("mousedown", function (e) { + findxy('down', e) + }, false); + canvas.addEventListener("mouseup", function (e) { + findxy('up', e) + }, false); + canvas.addEventListener("mouseout", function (e) { + findxy('out', e) + }, false); + + + window.document.getElementById('clear').addEventListener('click', erase) +} + +function draw() { + ctx.beginPath(); + ctx.moveTo(prevX, prevY); + ctx.lineTo(currX, currY); + ctx.strokeStyle = x; + ctx.lineWidth = y; + ctx.stroke(); + ctx.closePath(); +} + +function erase() { + ctx.clearRect(0, 0, w, h); +} + +function findxy(res, e) { + if (res == 'down') { + prevX = currX; + prevY = currY; + currX = e.clientX - canvas.offsetLeft; + currY = e.clientY - canvas.offsetTop; + + flag = true; + dot_flag = true; + if (dot_flag) { + ctx.beginPath(); + ctx.fillStyle = x; + ctx.fillRect(currX, currY, 2, 2); + ctx.closePath(); + dot_flag = false; + } + } + if (res == 'up' || res == "out") { + flag = false; + } + if (res == 'move') { + if (flag) { + prevX = currX; + prevY = currY; + currX = e.clientX - canvas.offsetLeft; + currY = e.clientY - canvas.offsetTop; + draw(); + } + } +} + +init() +``` + +And not the glue to put this together is the piece of code that listens on the "test" button. + +``` +import * as tf from '@tensorflow/tfjs'; + +let model + +tf.loadLayersModel('/model.json').then(m => { + model = m +}) + +window.document.getElementById('test').addEventListener('click', async () => { + const canvas = window.document.querySelector('canvas') + + const { data, width, height } = canvas.getContext('2d').getImageData(0, 0, 28, 28) + + const tensor = tf.tensor(new Uint8Array(data.filter((_, i) => i % 4 === 3)), [1, 28, 28, 1]) + const prediction = model.predict(tensor) + const result = await prediction.data() + const guessed = result.indexOf(1) + console.log(guessed) + window.document.querySelector('#result').innerText = guessed +}) +``` + +Here we need to explain a few things. +`canvas.getContext('2d').getImageData(0, 0, 28, 28)` simply returns a flattened array of the pixels from the point (0,0) to (28,28). + +Then, instead of simply passing the data to the tensor. we need to do some magic with `data.filter` in order to get only every 3rd pixel. This is because our canvas has 3 channels + 1 alpha, but we only need to know if the pixel is black or not. We do this by simply filtering for the index mod 4 + +``` +data.filter((_, i) => i % 4 === 3) +``` + +Lastly we need to interpret the result. `prediction.data()` return an array with 10 items. Because we have trained it that way that we only have 10 possible outcomes. 10 Digits right? +Well in that case we simply search in which position in the array we have a 1 and the index is out solution. +We search for a 1 because we only have floats from 0 to 1. So 1 is the maximum. + +I hope this helped you understand the process better. It was pretty confusing at first for me too 😬 diff --git a/src/content/blog/how-to-search-in-the-jam.md b/src/content/blog/how-to-search-in-the-jam.md new file mode 100644 index 0000000..a2d405a --- /dev/null +++ b/src/content/blog/how-to-search-in-the-jam.md @@ -0,0 +1,222 @@ +--- +title: "How to search in the JAM" +date: "2020-12-06" +categories: + - "coding" +tags: + - "jam-stack" + - "lunr" + - "search" + - "svelte" +--- + +So a lot (me included) now are building JAM stack landing pages, shops, full-stack apps, etc. and while you can have a backend of course not all of them have. For those who don't: **How do we search?** + +So there is the obvious [Google Programmable Search Engine](https://programmablesearchengine.google.com/about/) but that looks bad and it not really customizable. The results are very good, it's google after all. However for those who want something more custom: Here's one way how. + +A working example can found right here [nicco.io/search](https://nicco.io/search) 😉 +We will look at the following: + +1. How to implement the search +2. Search Accuracy & Precision +3. Performance & Size + +
    + +![Telescope](images/uriel-soberanes-gCeH4z9m7bg-unsplash-991x1024.jpg) + +
    + +Photo by [Uriel Soberanes](https://unsplash.com/@soberanes?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/s/photos/telescope?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +
    + +
    + +We can't rely on a backend as discussed above, so the magic will happen at build time, like everything in the JAM-verse. + +I've decided to go with the free and open source [lunr.js](https://lunrjs.com/) which is a simple but still quite powerful search engine that can run in the client. + +``` +const idx = lunr(function () { + this.ref('name') + this.field('text') + this.add({ name: 'A', text: 'Lorem...' }) +}) +const results = idx.search('Lor*') +``` + +The first question that probably will pop out in your head is: "How will lunr be able to know what is on our website?" Here is where our work begins. + +## Roadmap + +1. Aggregate all the data of your site +2. Prebuild the index and make it available as static JSON +3. Load `lunr.js` into your site and start searching + +## Preparing the Index + +So I'm using [Sapper](https://sapper.svelte.dev/) for this blog so the examples will be based on it, but the same principle applies to all JAM tech. + +First we need to aggregate all our data. In my case this means all the single pages, blog entries, projects and works. So I created a `/src/routes/search.json.js` file and got to work. + +``` +import lunr from 'lunr' + +import { getAll } from '../lib/wp' + +function removeHTML(s) { + return s.replace(/<.*?>|\s+|&#\d+;/g, ' ').trim() +} + +async function convertForIdx(type, fields = []) { + // Load the data from Wordpress + const items = await getAll(type) + // Map only the fields we need and are relevant + const defaults = ['title', 'content', 'slug'] + return items.map((item) => ({ + url: `${item.type}/${item.slug}`, + data: [...defaults, ...fields].map((field) => removeHTML(item[field])).join(' '), + })) +} + +export async function get(req, res) { + const all = await Promise.all([ + convertForIdx('projects', ['description']), + convertForIdx('pages'), + convertForIdx('posts'), + convertForIdx('works', ['role']), + ]) + + const idx = lunr(function () { + this.ref('url') + this.field('data') + + all.flat().forEach((doc) => this.add(doc)) + }) + res.setHeader('Content-Type', 'application/json') + res.end(JSON.stringify(idx)) +} +``` + +First I get all the data from the Wordpress backend and for each item I select at least the `title` and `content` as I want them to be searchable. Then we remove any html tags with a dirty regexp and finally we build the index. + +When we call `JSON.stringify(idx)` the precomputed index will be serialized to JSON. Otherwise every client would had to compute that on their CPU, wasting cycles and possibly battery. We don't want that. + +Now I have the "search model" ready. You can have a look: [nicco.io/search.json](https://nicco.io/search.json) + +## Integrating the search + +It's time to integrate the search into the actual website 🚀 + +``` + + + + + +
      + {#each results as result (result.ref)} + + {/each} +
    +``` + +The first thing we do is load our preloaded `/search.json` and loading into an instance of `lunr`. This only need to happen once, once the index is loaded we ready to go. + +``` +const idx = lunr.Index.load(prebuilt) +``` + +For the searching itself `lunr` has quite a [few options](https://lunrjs.com/guides/searching.html). The most relevant for me where the wildcard and fuzzy search. While wildcard is good for when we don't have completed a word yet, fuzzy helps us with typos. + +``` +const fuzzy = idx.search(needle + '~1') // foo~1 +``` + +While not explicitly said in the docs I'm guessing they use the [Levenshtein Distance](https://en.wikipedia.org/wiki/Levenshtein_distance), which means `~1` will replace at most 1 char. + +``` +const wildcard = idx.search(needle + '*') // fo* +``` + +Wildcard are straight forward. `lunr` supports any kind: `*oo`, `f*o` and `fo*`. + +The result is an array with the `ref` field so you can find the related item and a `score`. They are already sorted by score, so basically you just need to write a for loop. + +## Search Quality + +Now the accuracy and precision are of course on par with Google, but way good enough for a blog or a smaller site. However in 1h you can add search to your JAM site without much work and you stay google free. +Also this approach gives you all the artistic liberties over the design. + +## Performance & Size + +Since we are prebuilding and packaging the whole site into one big `JSON` file it's worth taking a look at the size of the index. + +For this I took the [Iliad by Homer](https://gutenberg.org/ebooks/6130) and slitted it up into different amount of pieces to simulate the amount of pages. At the same tame, the more pieces, the smaller the single content on one "page". + +Please not that it's ~1mb of plain text so it's quite a lot. +You can get the source code for the "test" [here](https://gist.github.com/cupcakearmy/242b54ee6b1a914896390c91846aa4d4). + +### Variable size documents + +
    + +![](https://api.nicco.io/wp-content/uploads/2020/12/Lunr-Index-Size-Compresion.svg) + +
    + +Graph of Lunr Index size + +
    + +
    + +As you can see, with `1000` each around `1.15k` in size we end up with a compressed size of `563 KiB` which starts to get big. + +### A more real example + +Here is an example where each document is around `10k` in size. Roughly double the text amount needed for this blog post. Then we add an ever increasing amount of documents to the index and watch it grow. + +
    + +![](https://api.nicco.io/wp-content/uploads/2020/12/Lunr.js-Index-Size-10k-Document-Size.svg) + +
    + +Chart of 10k sized documents building the index. + +
    + +
    + +The results are very different of course. Please note the the second graph has a logarithmic scale! If we compare the compressed size at `500` documents we have `494kb @2.3k/doc` vs `1.09MiB @10k/doc`. Basically double, which is not that bad if we consider that the documents are around 5 times bigger. + +Hope you enjoyed and learned something, take care ❤️ diff --git a/src/content/blog/images/Battery-Charge-Voltage-vs-Time.png b/src/content/blog/images/Battery-Charge-Voltage-vs-Time.png new file mode 100644 index 0000000..667e56f --- /dev/null +++ b/src/content/blog/images/Battery-Charge-Voltage-vs-Time.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:54ef9ac3fb65009c53d55f103eadb1f6c1b9ac9cb93019f161d5c0d842576e61 +size 191614 diff --git a/src/content/blog/images/DST-cycles-web2.jpg b/src/content/blog/images/DST-cycles-web2.jpg new file mode 100644 index 0000000..9c55921 --- /dev/null +++ b/src/content/blog/images/DST-cycles-web2.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee60b8040150d154afd21faf3112421b9b43cacb0626a5b4c53c0590c69626a0 +size 151085 diff --git a/src/content/blog/images/IMG_0160-1024x436.jpeg b/src/content/blog/images/IMG_0160-1024x436.jpeg new file mode 100644 index 0000000..1f5f2ca --- /dev/null +++ b/src/content/blog/images/IMG_0160-1024x436.jpeg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:01d67cb02737ac3cbfa236c4fed9fa4fc053a495a1d64d3d3aa44a751d1ca73e +size 80573 diff --git a/src/content/blog/images/IMG_0160.jpeg b/src/content/blog/images/IMG_0160.jpeg new file mode 100644 index 0000000..84a46a1 --- /dev/null +++ b/src/content/blog/images/IMG_0160.jpeg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:767f3552e0f0244b006c0bcb5a8d3c39b2fb83d1eb008cd5abb6d8c8012c11da +size 182432 diff --git a/src/content/blog/images/IMG_1709.jpeg b/src/content/blog/images/IMG_1709.jpeg new file mode 100644 index 0000000..f7542d2 --- /dev/null +++ b/src/content/blog/images/IMG_1709.jpeg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f43dfc65d7f710d7cfe7f21d168c5142c450b95b363e23f340d31135676bedc4 +size 33825 diff --git a/src/content/blog/images/IMG_1710.jpeg b/src/content/blog/images/IMG_1710.jpeg new file mode 100644 index 0000000..c1776a7 --- /dev/null +++ b/src/content/blog/images/IMG_1710.jpeg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1e65961b86eb1febbe48eb9292c9a54eebdb61314a7b1223d7c9112423477dcf +size 175459 diff --git a/src/content/blog/images/IMG_1710.png b/src/content/blog/images/IMG_1710.png new file mode 100644 index 0000000..9dedb9b --- /dev/null +++ b/src/content/blog/images/IMG_1710.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e83975d7ec576ef6ca6c4fc7a007fd82d8066cdfc42ee097527f989ccf025756 +size 2027604 diff --git a/src/content/blog/images/IMG_1711-653x1024.jpeg b/src/content/blog/images/IMG_1711-653x1024.jpeg new file mode 100644 index 0000000..46e2404 --- /dev/null +++ b/src/content/blog/images/IMG_1711-653x1024.jpeg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9f831b45aa91bc87f6882e64a702a8a3b6224a1f6a4bf33f8c21e46053409eed +size 68828 diff --git a/src/content/blog/images/IMG_1711.jpeg b/src/content/blog/images/IMG_1711.jpeg new file mode 100644 index 0000000..0030521 --- /dev/null +++ b/src/content/blog/images/IMG_1711.jpeg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f1dfeb6c5d59b355b38a50a0888b178e9fa9fa93bd0d26dd94ffd87ecbc0fae3 +size 136338 diff --git a/src/content/blog/images/Screenshot-2020-01-29-at-14.55.28.png b/src/content/blog/images/Screenshot-2020-01-29-at-14.55.28.png new file mode 100644 index 0000000..25379a0 --- /dev/null +++ b/src/content/blog/images/Screenshot-2020-01-29-at-14.55.28.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a4a5b54dfff9307f3460189e6e80eedd6c80ee64eb3ae25bf5c7df3c3cccf882 +size 56274 diff --git a/src/content/blog/images/Screenshot-2020-01-29-at-14.57.05.png b/src/content/blog/images/Screenshot-2020-01-29-at-14.57.05.png new file mode 100644 index 0000000..b20541b --- /dev/null +++ b/src/content/blog/images/Screenshot-2020-01-29-at-14.57.05.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b0f241b1da4e817d415f8984ce54830276b0631042b31815a5569dd6937eb2ad +size 258865 diff --git a/src/content/blog/images/Screenshot-2020-04-11-at-23.25.48.png b/src/content/blog/images/Screenshot-2020-04-11-at-23.25.48.png new file mode 100644 index 0000000..e65fa9a --- /dev/null +++ b/src/content/blog/images/Screenshot-2020-04-11-at-23.25.48.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2b5d821660053d05743eb6439d652e77a3d4699a45884a9bce88169835c55c8a +size 564881 diff --git a/src/content/blog/images/Screenshot-2021-01-28-at-12.12.59.png b/src/content/blog/images/Screenshot-2021-01-28-at-12.12.59.png new file mode 100644 index 0000000..51094e4 --- /dev/null +++ b/src/content/blog/images/Screenshot-2021-01-28-at-12.12.59.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5db61551895b9969afdb1356560f03c1918faca5e68169b6ac2d200ce700ce90 +size 73938 diff --git a/src/content/blog/images/Screenshot-2021-01-28-at-12.14.03.png b/src/content/blog/images/Screenshot-2021-01-28-at-12.14.03.png new file mode 100644 index 0000000..2fa8b7c --- /dev/null +++ b/src/content/blog/images/Screenshot-2021-01-28-at-12.14.03.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:88c62af32b444a6928c85e8f31cad2f4bef8ebed33893b0a28894d6f87593599 +size 42234 diff --git a/src/content/blog/images/Screenshot-2021-03-23-at-10.20.32.png b/src/content/blog/images/Screenshot-2021-03-23-at-10.20.32.png new file mode 100644 index 0000000..c16fd32 --- /dev/null +++ b/src/content/blog/images/Screenshot-2021-03-23-at-10.20.32.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eb058e043414fe65d83876644ed84a7e2e336ad8b1b4d771062db8494c036e79 +size 101970 diff --git a/src/content/blog/images/Screenshot-2021-03-23-at-10.58.31-1-1024x325.png b/src/content/blog/images/Screenshot-2021-03-23-at-10.58.31-1-1024x325.png new file mode 100644 index 0000000..0cfa995 --- /dev/null +++ b/src/content/blog/images/Screenshot-2021-03-23-at-10.58.31-1-1024x325.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2ca0617aa7989fc9540df159acfe986d2aff6d8d6060f56747ed983b5d5be5fb +size 29477 diff --git a/src/content/blog/images/Screenshot-2021-03-23-at-10.58.31-1.png b/src/content/blog/images/Screenshot-2021-03-23-at-10.58.31-1.png new file mode 100644 index 0000000..0a2a354 --- /dev/null +++ b/src/content/blog/images/Screenshot-2021-03-23-at-10.58.31-1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b70f8cacc7eaa9ec3127c96cf3d3fecddda61a35313b8fd6f42622d1f2983858 +size 50254 diff --git a/src/content/blog/images/Screenshot-2021-03-23-at-10.58.31.png b/src/content/blog/images/Screenshot-2021-03-23-at-10.58.31.png new file mode 100644 index 0000000..0a2a354 --- /dev/null +++ b/src/content/blog/images/Screenshot-2021-03-23-at-10.58.31.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b70f8cacc7eaa9ec3127c96cf3d3fecddda61a35313b8fd6f42622d1f2983858 +size 50254 diff --git a/src/content/blog/images/alessandra-caretto-cAY9X4rPG3g-unsplash.jpg b/src/content/blog/images/alessandra-caretto-cAY9X4rPG3g-unsplash.jpg new file mode 100644 index 0000000..505ff0c --- /dev/null +++ b/src/content/blog/images/alessandra-caretto-cAY9X4rPG3g-unsplash.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:641d3e8a3529e6e026773d16bc105b71a0ae27d8361faada37d52551ef198a0f +size 688323 diff --git a/src/content/blog/images/alina-grubnyak-1254785-unsplash-1024x683.jpg b/src/content/blog/images/alina-grubnyak-1254785-unsplash-1024x683.jpg new file mode 100644 index 0000000..080f025 --- /dev/null +++ b/src/content/blog/images/alina-grubnyak-1254785-unsplash-1024x683.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e6b4a543a812755c5b899512478ce01fba1baea6502cffec3f9f46dc924fab30 +size 178827 diff --git a/src/content/blog/images/alina-grubnyak-1254785-unsplash-scaled.jpg b/src/content/blog/images/alina-grubnyak-1254785-unsplash-scaled.jpg new file mode 100644 index 0000000..6f267c8 --- /dev/null +++ b/src/content/blog/images/alina-grubnyak-1254785-unsplash-scaled.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ef1c569cdcf9851539f06176d0c9e0debc52875976ff330b1cc6971572fe1404 +size 665199 diff --git a/src/content/blog/images/amador-loureiro-BVyNlchWqzs-unsplash-1024x685.jpg b/src/content/blog/images/amador-loureiro-BVyNlchWqzs-unsplash-1024x685.jpg new file mode 100644 index 0000000..7449c47 --- /dev/null +++ b/src/content/blog/images/amador-loureiro-BVyNlchWqzs-unsplash-1024x685.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:18e276ce5aa34268120c268de0f098dc07b0c0bb095d39479d3341af472acf7f +size 180270 diff --git a/src/content/blog/images/amador-loureiro-BVyNlchWqzs-unsplash-scaled.jpg b/src/content/blog/images/amador-loureiro-BVyNlchWqzs-unsplash-scaled.jpg new file mode 100644 index 0000000..5d6a70a --- /dev/null +++ b/src/content/blog/images/amador-loureiro-BVyNlchWqzs-unsplash-scaled.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:641e531b6383c8552a05586e2ac44c53718c0b6130d72f23dcb8edf74ee4b3dd +size 794403 diff --git a/src/content/blog/images/arseny-togulev-1513013-unsplash-1024x576.jpg b/src/content/blog/images/arseny-togulev-1513013-unsplash-1024x576.jpg new file mode 100644 index 0000000..479e959 --- /dev/null +++ b/src/content/blog/images/arseny-togulev-1513013-unsplash-1024x576.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9621fd53443f20b7811c86005dc1c9fc4858dddd4a04c4b9df977592b1a58f04 +size 67338 diff --git a/src/content/blog/images/arseny-togulev-1513013-unsplash-scaled.jpg b/src/content/blog/images/arseny-togulev-1513013-unsplash-scaled.jpg new file mode 100644 index 0000000..722c2f1 --- /dev/null +++ b/src/content/blog/images/arseny-togulev-1513013-unsplash-scaled.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f1402d168936c5ef8b97bc4f30afe3d4bae64136feb8d85b8e85bc15d3810d3 +size 287558 diff --git a/src/content/blog/images/asoggetti-418839-unsplash-1024x684.jpg b/src/content/blog/images/asoggetti-418839-unsplash-1024x684.jpg new file mode 100644 index 0000000..7226396 --- /dev/null +++ b/src/content/blog/images/asoggetti-418839-unsplash-1024x684.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5794d60199ad3f80242f5291b56e98d5d8278bde2d0ed11e3c001017140f0d6e +size 30457 diff --git a/src/content/blog/images/asoggetti-418839-unsplash-scaled.jpg b/src/content/blog/images/asoggetti-418839-unsplash-scaled.jpg new file mode 100644 index 0000000..7e79889 --- /dev/null +++ b/src/content/blog/images/asoggetti-418839-unsplash-scaled.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:40588829e34a45f71777c36e1dfdc9078bdf88d3196051034d20249d3a0ea539 +size 104152 diff --git a/src/content/blog/images/auth-sequence-auth-code-pkce-1024x833.png b/src/content/blog/images/auth-sequence-auth-code-pkce-1024x833.png new file mode 100644 index 0000000..005a1fb --- /dev/null +++ b/src/content/blog/images/auth-sequence-auth-code-pkce-1024x833.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f0fa3d4bb042056f6e9adfdf0829f603b4b5771c7a724b862fe275b57924ca23 +size 98883 diff --git a/src/content/blog/images/auth-sequence-auth-code-pkce.png b/src/content/blog/images/auth-sequence-auth-code-pkce.png new file mode 100644 index 0000000..e409536 --- /dev/null +++ b/src/content/blog/images/auth-sequence-auth-code-pkce.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5e7b72e16d3f5bcd368eb3b39078e32d0ef904023b7984f32fa2d0e364109479 +size 43477 diff --git a/src/content/blog/images/brett-jordan-qUp3bejuzs-unsplash-scaled.jpg b/src/content/blog/images/brett-jordan-qUp3bejuzs-unsplash-scaled.jpg new file mode 100644 index 0000000..66214de --- /dev/null +++ b/src/content/blog/images/brett-jordan-qUp3bejuzs-unsplash-scaled.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:48603b5e68e25cce1593bf8578f5cc882c1612c213d0c3041312f018087a9a78 +size 191775 diff --git a/src/content/blog/images/cards-1024x567.jpg b/src/content/blog/images/cards-1024x567.jpg new file mode 100644 index 0000000..981f973 --- /dev/null +++ b/src/content/blog/images/cards-1024x567.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3a3ed4f673a36c253f694b9590052125c52f2dfdecfa4cce27df5fe33b7f380d +size 84760 diff --git a/src/content/blog/images/cards-scaled.jpg b/src/content/blog/images/cards-scaled.jpg new file mode 100644 index 0000000..c2ce175 --- /dev/null +++ b/src/content/blog/images/cards-scaled.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ebc09fc3389fdd05f9d559692c3d24eb7bd99adba36cabfdcf707975670c2474 +size 483287 diff --git a/src/content/blog/images/chris-barbalis-Vvvl-mbboKk-unsplash-scaled.jpg b/src/content/blog/images/chris-barbalis-Vvvl-mbboKk-unsplash-scaled.jpg new file mode 100644 index 0000000..2d991e9 --- /dev/null +++ b/src/content/blog/images/chris-barbalis-Vvvl-mbboKk-unsplash-scaled.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7856b748cc26c928c9fd5d43af23d43f72a6f11bf277685ef4b63ad8ada0528e +size 495251 diff --git a/src/content/blog/images/clayton-robbins-Ru09fQONJWo-unsplash-1024x683.jpg b/src/content/blog/images/clayton-robbins-Ru09fQONJWo-unsplash-1024x683.jpg new file mode 100644 index 0000000..8199d55 --- /dev/null +++ b/src/content/blog/images/clayton-robbins-Ru09fQONJWo-unsplash-1024x683.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:517f9417837a532be4d3830cdd1e5857582ff85299bd14ab6f8aa52278aed3bd +size 62672 diff --git a/src/content/blog/images/clayton-robbins-Ru09fQONJWo-unsplash-scaled.jpg b/src/content/blog/images/clayton-robbins-Ru09fQONJWo-unsplash-scaled.jpg new file mode 100644 index 0000000..73c5609 --- /dev/null +++ b/src/content/blog/images/clayton-robbins-Ru09fQONJWo-unsplash-scaled.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:366666945890876b458c89ddfb94d4bab8e02f686a08b1d3bc04f0ed0e03e1cc +size 272668 diff --git a/src/content/blog/images/daniele-franchi-g2fJ7d7eKSM-unsplash-scaled.jpg b/src/content/blog/images/daniele-franchi-g2fJ7d7eKSM-unsplash-scaled.jpg new file mode 100644 index 0000000..e89d02e --- /dev/null +++ b/src/content/blog/images/daniele-franchi-g2fJ7d7eKSM-unsplash-scaled.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8cf645981a817db0c7c5e92723d1c1104390a12dc4f68fa8bb82127e98352020 +size 392117 diff --git a/src/content/blog/images/daniele-franchi-g2fJ7d7eKSM-unsplash.jpg b/src/content/blog/images/daniele-franchi-g2fJ7d7eKSM-unsplash.jpg new file mode 100644 index 0000000..66a23b6 --- /dev/null +++ b/src/content/blog/images/daniele-franchi-g2fJ7d7eKSM-unsplash.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3f3295dd8580c51c510f34b5c5252c56d77be75d1a93ce83583c6a4308e636f +size 4596995 diff --git a/src/content/blog/images/data.gif b/src/content/blog/images/data.gif new file mode 100644 index 0000000..41ba811 --- /dev/null +++ b/src/content/blog/images/data.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a326b48b5b9355bdef2a43fe5298559d45ad645f911519b9e398f981a1390e80 +size 318810 diff --git a/src/content/blog/images/davisco-5E5N49RWtbA-unsplash-3240x2160.jpg b/src/content/blog/images/davisco-5E5N49RWtbA-unsplash-3240x2160.jpg new file mode 100644 index 0000000..e11aaa4 --- /dev/null +++ b/src/content/blog/images/davisco-5E5N49RWtbA-unsplash-3240x2160.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1be1853bbb1056dd892fec171870e7bbe6108c4eab7309d13d594dd9b9c5ec28 +size 383858 diff --git a/src/content/blog/images/davisco-5E5N49RWtbA-unsplash-scaled-1.jpg b/src/content/blog/images/davisco-5E5N49RWtbA-unsplash-scaled-1.jpg new file mode 100644 index 0000000..26ed4bf --- /dev/null +++ b/src/content/blog/images/davisco-5E5N49RWtbA-unsplash-scaled-1.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:418f648ed44631401d9b4887c951b1db562cb02d981258f410768284dccd4945 +size 160637 diff --git a/src/content/blog/images/franck-v-U3sOwViXhkY-unsplash-2880x2160.jpg b/src/content/blog/images/franck-v-U3sOwViXhkY-unsplash-2880x2160.jpg new file mode 100644 index 0000000..e11aaa4 --- /dev/null +++ b/src/content/blog/images/franck-v-U3sOwViXhkY-unsplash-2880x2160.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1be1853bbb1056dd892fec171870e7bbe6108c4eab7309d13d594dd9b9c5ec28 +size 383858 diff --git a/src/content/blog/images/franck-v-U3sOwViXhkY-unsplash-scaled-1.jpg b/src/content/blog/images/franck-v-U3sOwViXhkY-unsplash-scaled-1.jpg new file mode 100644 index 0000000..3611efb --- /dev/null +++ b/src/content/blog/images/franck-v-U3sOwViXhkY-unsplash-scaled-1.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:394cb4b320efe0eaafc527569f2e04e57f25f6ca7ad70a6cc951af981012be2a +size 587956 diff --git a/src/content/blog/images/guillaume-bolduc-259596-unsplash-1024x741.jpg b/src/content/blog/images/guillaume-bolduc-259596-unsplash-1024x741.jpg new file mode 100644 index 0000000..0eb6fbe --- /dev/null +++ b/src/content/blog/images/guillaume-bolduc-259596-unsplash-1024x741.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:821eb3943493f35fbdb6881c48ab8c21870e1c7a11f11321e1bb7ee7ec0b6e16 +size 249493 diff --git a/src/content/blog/images/guillaume-bolduc-259596-unsplash-scaled.jpg b/src/content/blog/images/guillaume-bolduc-259596-unsplash-scaled.jpg new file mode 100644 index 0000000..cb3ff46 --- /dev/null +++ b/src/content/blog/images/guillaume-bolduc-259596-unsplash-scaled.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b41d27d824c56267c2cb666d906c1bede2fdaa1de74f9957e26d502c50cbc2b +size 1115156 diff --git a/src/content/blog/images/howto-1.jpg b/src/content/blog/images/howto-1.jpg new file mode 100644 index 0000000..7399a91 --- /dev/null +++ b/src/content/blog/images/howto-1.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:39057dd4352501b6a8ad5aa62f28662cc0b1310fbbf03c5ad3ee67d0ca3abb9a +size 143009 diff --git a/src/content/blog/images/howto.jpg b/src/content/blog/images/howto.jpg new file mode 100644 index 0000000..535e2ab --- /dev/null +++ b/src/content/blog/images/howto.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8aaebdf6ec81ea65d61c9db30a93e0e6da65c06b874a614393d260ef135c3ee9 +size 170032 diff --git a/src/content/blog/images/hyeryi-sVk8nrCQ06g-unsplash-1024x683.jpg b/src/content/blog/images/hyeryi-sVk8nrCQ06g-unsplash-1024x683.jpg new file mode 100644 index 0000000..9f768e4 --- /dev/null +++ b/src/content/blog/images/hyeryi-sVk8nrCQ06g-unsplash-1024x683.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1e8724656a1c04e896de528cc52d2418de73b5dbba1eb94062c826a212b18f19 +size 205615 diff --git a/src/content/blog/images/hyeryi-sVk8nrCQ06g-unsplash-scaled.jpg b/src/content/blog/images/hyeryi-sVk8nrCQ06g-unsplash-scaled.jpg new file mode 100644 index 0000000..03dc9dd --- /dev/null +++ b/src/content/blog/images/hyeryi-sVk8nrCQ06g-unsplash-scaled.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:728917127520026b290af0348ef70dee6d36dbd3ec3f72b76d3c2b1fca3bdfdb +size 1205666 diff --git a/src/content/blog/images/israel-palacio-ImcUkZ72oUs-unsplash-scaled.jpg b/src/content/blog/images/israel-palacio-ImcUkZ72oUs-unsplash-scaled.jpg new file mode 100644 index 0000000..7e13457 --- /dev/null +++ b/src/content/blog/images/israel-palacio-ImcUkZ72oUs-unsplash-scaled.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:24f5c8a7e2fce080c7f9090f9db4f8ae5d2644f08eba8671da802bd76880e679 +size 523148 diff --git a/src/content/blog/images/jason-abdilla-jZWmw6007EY-unsplash-scaled.jpg b/src/content/blog/images/jason-abdilla-jZWmw6007EY-unsplash-scaled.jpg new file mode 100644 index 0000000..c2d3410 --- /dev/null +++ b/src/content/blog/images/jason-abdilla-jZWmw6007EY-unsplash-scaled.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3a7c6f461682a6a5d127655c2d67b90e1a1293c3fbe9bca763db8ab855e1c534 +size 907098 diff --git a/src/content/blog/images/jielin-chen-pKQIpxzq0ZQ-unsplash-e1562783699383-1024x484.jpg b/src/content/blog/images/jielin-chen-pKQIpxzq0ZQ-unsplash-e1562783699383-1024x484.jpg new file mode 100644 index 0000000..84cb6f3 --- /dev/null +++ b/src/content/blog/images/jielin-chen-pKQIpxzq0ZQ-unsplash-e1562783699383-1024x484.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eef5e387e8c930d6eff083bc6b460613253d1d808147515a0430bdbffac3ccfe +size 56082 diff --git a/src/content/blog/images/jielin-chen-pKQIpxzq0ZQ-unsplash-e1562783699383-scaled.jpg b/src/content/blog/images/jielin-chen-pKQIpxzq0ZQ-unsplash-e1562783699383-scaled.jpg new file mode 100644 index 0000000..6c3b3fa --- /dev/null +++ b/src/content/blog/images/jielin-chen-pKQIpxzq0ZQ-unsplash-e1562783699383-scaled.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:82a2dfcd574fef01451a2e62c5efa1975445682c70588bca4e06f1421be4c24d +size 225187 diff --git a/src/content/blog/images/jonathan-chng-HgoKvtKpyHA-unsplash-3504x2160.jpg b/src/content/blog/images/jonathan-chng-HgoKvtKpyHA-unsplash-3504x2160.jpg new file mode 100644 index 0000000..e11aaa4 --- /dev/null +++ b/src/content/blog/images/jonathan-chng-HgoKvtKpyHA-unsplash-3504x2160.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1be1853bbb1056dd892fec171870e7bbe6108c4eab7309d13d594dd9b9c5ec28 +size 383858 diff --git a/src/content/blog/images/jonathan-chng-HgoKvtKpyHA-unsplash-scaled-1.jpg b/src/content/blog/images/jonathan-chng-HgoKvtKpyHA-unsplash-scaled-1.jpg new file mode 100644 index 0000000..8112d96 --- /dev/null +++ b/src/content/blog/images/jonathan-chng-HgoKvtKpyHA-unsplash-scaled-1.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:16f73c9118460e939f16070572407482c45a885a5f28163d3fe21a1ae63efc4f +size 547290 diff --git a/src/content/blog/images/luke-chesser-JKUTrJ4vK00-unsplash-1024x683.jpg b/src/content/blog/images/luke-chesser-JKUTrJ4vK00-unsplash-1024x683.jpg new file mode 100644 index 0000000..18c8b67 --- /dev/null +++ b/src/content/blog/images/luke-chesser-JKUTrJ4vK00-unsplash-1024x683.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a0e78000dcffc29f4e60a546ff72c0b038165b6bb6ba6c2a75fc036628bd50a6 +size 75268 diff --git a/src/content/blog/images/luke-chesser-JKUTrJ4vK00-unsplash-scaled.jpg b/src/content/blog/images/luke-chesser-JKUTrJ4vK00-unsplash-scaled.jpg new file mode 100644 index 0000000..eaf64b5 --- /dev/null +++ b/src/content/blog/images/luke-chesser-JKUTrJ4vK00-unsplash-scaled.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bdd3909cf6516e603c072d23f1ba8a9394dc29cfdaff787c0a6ecd3ce0083c99 +size 351535 diff --git a/src/content/blog/images/mark-autumns-Ssr26I0QWVY-unsplash-1024x683.jpg b/src/content/blog/images/mark-autumns-Ssr26I0QWVY-unsplash-1024x683.jpg new file mode 100644 index 0000000..79feb80 --- /dev/null +++ b/src/content/blog/images/mark-autumns-Ssr26I0QWVY-unsplash-1024x683.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:864ac4e4da80d30f45124e0f377e2453b843017f8442f8b2858f644d3076f1d6 +size 110652 diff --git a/src/content/blog/images/mark-autumns-Ssr26I0QWVY-unsplash-scaled.jpg b/src/content/blog/images/mark-autumns-Ssr26I0QWVY-unsplash-scaled.jpg new file mode 100644 index 0000000..a95df1e --- /dev/null +++ b/src/content/blog/images/mark-autumns-Ssr26I0QWVY-unsplash-scaled.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:012f5cffade95b8952c6da835c5ec9badacce4ab222b8cf6a59ce2d62fb2fd4a +size 645501 diff --git a/src/content/blog/images/markus-spiske-8CWoXxaqGrs-unsplash-1024x683.jpg b/src/content/blog/images/markus-spiske-8CWoXxaqGrs-unsplash-1024x683.jpg new file mode 100644 index 0000000..e3da666 --- /dev/null +++ b/src/content/blog/images/markus-spiske-8CWoXxaqGrs-unsplash-1024x683.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:031b2833eaca905035d9bcee4462ab92d6388ccbeffde7ef775d792231726fbf +size 40933 diff --git a/src/content/blog/images/markus-spiske-8CWoXxaqGrs-unsplash-scaled.jpg b/src/content/blog/images/markus-spiske-8CWoXxaqGrs-unsplash-scaled.jpg new file mode 100644 index 0000000..ec48929 --- /dev/null +++ b/src/content/blog/images/markus-spiske-8CWoXxaqGrs-unsplash-scaled.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:500b324d99022e3410afa467743fff186a85700462e66487c11f5b7c3722e9d1 +size 244788 diff --git a/src/content/blog/images/matt-artz-353210-unsplash-1024x780.jpg b/src/content/blog/images/matt-artz-353210-unsplash-1024x780.jpg new file mode 100644 index 0000000..dea01c0 --- /dev/null +++ b/src/content/blog/images/matt-artz-353210-unsplash-1024x780.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:846aa0ef3c0ad69b286514962c0cf1b9504f0fc74e975f592cfbe79f06ed5076 +size 40291 diff --git a/src/content/blog/images/matt-artz-353210-unsplash-scaled.jpg b/src/content/blog/images/matt-artz-353210-unsplash-scaled.jpg new file mode 100644 index 0000000..0b73d1a --- /dev/null +++ b/src/content/blog/images/matt-artz-353210-unsplash-scaled.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:08eb7d31540d64f49de77452565c48015bc4da3e5753ba9ed93ad19e70eaef48 +size 190710 diff --git a/src/content/blog/images/meagan-carsience-QGnm_F_nd1E-unsplash1-1024x683.jpg b/src/content/blog/images/meagan-carsience-QGnm_F_nd1E-unsplash1-1024x683.jpg new file mode 100644 index 0000000..b915f1a --- /dev/null +++ b/src/content/blog/images/meagan-carsience-QGnm_F_nd1E-unsplash1-1024x683.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f77858db14fe890542ef1c18b112f144f4bdf5a1f9009cdcfa0f9f80eab70c55 +size 19395 diff --git a/src/content/blog/images/meagan-carsience-QGnm_F_nd1E-unsplash1.jpg b/src/content/blog/images/meagan-carsience-QGnm_F_nd1E-unsplash1.jpg new file mode 100644 index 0000000..f73d30b --- /dev/null +++ b/src/content/blog/images/meagan-carsience-QGnm_F_nd1E-unsplash1.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4def0c84923defe516c9d1c7e4be767ff6a7ecfdccf55eb674abf3b5144dbc06 +size 92471 diff --git a/src/content/blog/images/milkovi-kYlYwQze5vI-unsplash-1-scaled.jpg b/src/content/blog/images/milkovi-kYlYwQze5vI-unsplash-1-scaled.jpg new file mode 100644 index 0000000..68338e0 --- /dev/null +++ b/src/content/blog/images/milkovi-kYlYwQze5vI-unsplash-1-scaled.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7302bfcb09c4fcaa7cbc1b51254697333f3a0b46090809779bd4a7c49442454a +size 445129 diff --git a/src/content/blog/images/natasha-connell-byp5TTxUbL0-unsplash-2880x2160.jpg b/src/content/blog/images/natasha-connell-byp5TTxUbL0-unsplash-2880x2160.jpg new file mode 100644 index 0000000..e11aaa4 --- /dev/null +++ b/src/content/blog/images/natasha-connell-byp5TTxUbL0-unsplash-2880x2160.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1be1853bbb1056dd892fec171870e7bbe6108c4eab7309d13d594dd9b9c5ec28 +size 383858 diff --git a/src/content/blog/images/natasha-connell-byp5TTxUbL0-unsplash-scaled-1.jpg b/src/content/blog/images/natasha-connell-byp5TTxUbL0-unsplash-scaled-1.jpg new file mode 100644 index 0000000..4060fcd --- /dev/null +++ b/src/content/blog/images/natasha-connell-byp5TTxUbL0-unsplash-scaled-1.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0160fa88ffe90a0f9a1846e178b4554db761855aea838973bc32eb700cd28af9 +size 247279 diff --git a/src/content/blog/images/noah-silliman-doBrZnp_wqA-unsplash.jpg b/src/content/blog/images/noah-silliman-doBrZnp_wqA-unsplash.jpg new file mode 100644 index 0000000..f45a4c6 --- /dev/null +++ b/src/content/blog/images/noah-silliman-doBrZnp_wqA-unsplash.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ff024e32cdb7fa6fe8624cc7c42f16a3b7c2981646ab0f01c6e81c6b56a02f3 +size 393856 diff --git a/src/content/blog/images/pawel-nolbert-xe-ss5Tg2mo-unsplash-1024x740.jpg b/src/content/blog/images/pawel-nolbert-xe-ss5Tg2mo-unsplash-1024x740.jpg new file mode 100644 index 0000000..db33e63 --- /dev/null +++ b/src/content/blog/images/pawel-nolbert-xe-ss5Tg2mo-unsplash-1024x740.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f03cb447948ec9253aa13c4049dce5d2ae2c663632d8bd1c0a4e813ac9e2f771 +size 67592 diff --git a/src/content/blog/images/pawel-nolbert-xe-ss5Tg2mo-unsplash.jpg b/src/content/blog/images/pawel-nolbert-xe-ss5Tg2mo-unsplash.jpg new file mode 100644 index 0000000..8082c68 --- /dev/null +++ b/src/content/blog/images/pawel-nolbert-xe-ss5Tg2mo-unsplash.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cd058a3a94865f064a2cc5300267657d449d7cb787662b2ceb945ebe80dfafc7 +size 555132 diff --git a/src/content/blog/images/permissions.gif b/src/content/blog/images/permissions.gif new file mode 100644 index 0000000..6ab05cf --- /dev/null +++ b/src/content/blog/images/permissions.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc7bc17cdc583accf94e27eadb4bdb49c91e58c6add60074d24e6b71b1d35e19 +size 485939 diff --git a/src/content/blog/images/rayan-almuslem-1302778-unsplash-1024x683.jpg b/src/content/blog/images/rayan-almuslem-1302778-unsplash-1024x683.jpg new file mode 100644 index 0000000..62dcf02 --- /dev/null +++ b/src/content/blog/images/rayan-almuslem-1302778-unsplash-1024x683.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:84f88b7455367e2ff8f61e1b0cf341437a0eea63aaa07acb3c3e68e7b766527c +size 50981 diff --git a/src/content/blog/images/rayan-almuslem-1302778-unsplash-scaled.jpg b/src/content/blog/images/rayan-almuslem-1302778-unsplash-scaled.jpg new file mode 100644 index 0000000..af876b7 --- /dev/null +++ b/src/content/blog/images/rayan-almuslem-1302778-unsplash-scaled.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f1258ab1f0583e4cb7225f97c777685f0b35021e71ab9ce3ac838fbcaad714d +size 299888 diff --git a/src/content/blog/images/register-bot.jpg b/src/content/blog/images/register-bot.jpg new file mode 100644 index 0000000..b878cb4 --- /dev/null +++ b/src/content/blog/images/register-bot.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4aa44481d72090565e8664bdfbb506f833cabc9a0e1ac988807912d86dc61c71 +size 97464 diff --git a/src/content/blog/images/ruchindra-gunasekara-GK8x_XCcDZg-unsplash-scaled.jpg b/src/content/blog/images/ruchindra-gunasekara-GK8x_XCcDZg-unsplash-scaled.jpg new file mode 100644 index 0000000..63ac7f0 --- /dev/null +++ b/src/content/blog/images/ruchindra-gunasekara-GK8x_XCcDZg-unsplash-scaled.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:979fc17abb2549a5038ff4d0c963fac8549667e4f7efcdcb4d91601a7cdddebd +size 838338 diff --git a/src/content/blog/images/ruchindra-gunasekara-GK8x_XCcDZg-unsplash.jpg b/src/content/blog/images/ruchindra-gunasekara-GK8x_XCcDZg-unsplash.jpg new file mode 100644 index 0000000..30e08ad --- /dev/null +++ b/src/content/blog/images/ruchindra-gunasekara-GK8x_XCcDZg-unsplash.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a9a2b0d913d11a177032bf5c8148c43e64e97dcff8c0224645f82a8e5e7280c9 +size 4819801 diff --git a/src/content/blog/images/status.jpg b/src/content/blog/images/status.jpg new file mode 100644 index 0000000..9f20341 --- /dev/null +++ b/src/content/blog/images/status.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dd832991f433a79e9794b29d80c170486d55187b565e1234f69e2cc141291042 +size 57217 diff --git a/src/content/blog/images/thomas-kelley-t20pc32VbrU-unsplash-3240x2160.jpg b/src/content/blog/images/thomas-kelley-t20pc32VbrU-unsplash-3240x2160.jpg new file mode 100644 index 0000000..e11aaa4 --- /dev/null +++ b/src/content/blog/images/thomas-kelley-t20pc32VbrU-unsplash-3240x2160.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1be1853bbb1056dd892fec171870e7bbe6108c4eab7309d13d594dd9b9c5ec28 +size 383858 diff --git a/src/content/blog/images/thomas-kelley-t20pc32VbrU-unsplash-scaled-1.jpg b/src/content/blog/images/thomas-kelley-t20pc32VbrU-unsplash-scaled-1.jpg new file mode 100644 index 0000000..8869909 --- /dev/null +++ b/src/content/blog/images/thomas-kelley-t20pc32VbrU-unsplash-scaled-1.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a2d827c72bad2602c6f1f9fa29fcb2471de06dd725feb338b247b034480da05 +size 773178 diff --git a/src/content/blog/images/tobias-fischer-PkbZahEG2Ng-unsplash-1024x497.jpg b/src/content/blog/images/tobias-fischer-PkbZahEG2Ng-unsplash-1024x497.jpg new file mode 100644 index 0000000..0e100bc --- /dev/null +++ b/src/content/blog/images/tobias-fischer-PkbZahEG2Ng-unsplash-1024x497.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c48da45eb028f51863c7ca093626e9270ee59ce3aa4807ffbe9ef676e5cfe50d +size 142735 diff --git a/src/content/blog/images/tobias-fischer-PkbZahEG2Ng-unsplash-scaled.jpg b/src/content/blog/images/tobias-fischer-PkbZahEG2Ng-unsplash-scaled.jpg new file mode 100644 index 0000000..705aa02 --- /dev/null +++ b/src/content/blog/images/tobias-fischer-PkbZahEG2Ng-unsplash-scaled.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e195c9ed36de6e74ff814f663d80387de82245685784e9c5b52e2831d860f09 +size 615029 diff --git a/src/content/blog/images/uriel-soberanes-gCeH4z9m7bg-unsplash-991x1024.jpg b/src/content/blog/images/uriel-soberanes-gCeH4z9m7bg-unsplash-991x1024.jpg new file mode 100644 index 0000000..f7f97d7 --- /dev/null +++ b/src/content/blog/images/uriel-soberanes-gCeH4z9m7bg-unsplash-991x1024.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:487107e00c930e0b37bce0312df5c9e1801bb8a41978f67d76c488e14f40ac20 +size 83157 diff --git a/src/content/blog/images/uriel-soberanes-gCeH4z9m7bg-unsplash.jpg b/src/content/blog/images/uriel-soberanes-gCeH4z9m7bg-unsplash.jpg new file mode 100644 index 0000000..c16b2b6 --- /dev/null +++ b/src/content/blog/images/uriel-soberanes-gCeH4z9m7bg-unsplash.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06f7370a7d558d0abef5b4b0213e574ae8de04416135fe37a4ca949d9c587b82 +size 905920 diff --git a/src/content/blog/leaving-nextcloud-from-heaven-to-the-depths-of-seafile.md b/src/content/blog/leaving-nextcloud-from-heaven-to-the-depths-of-seafile.md new file mode 100644 index 0000000..9f15dbd --- /dev/null +++ b/src/content/blog/leaving-nextcloud-from-heaven-to-the-depths-of-seafile.md @@ -0,0 +1,161 @@ +--- +title: 'Leaving Nextcloud: From heaven to the depths of Seafile' +date: '2021-03-23' +categories: + - 'general' +tags: + - 'migration' + - 'nextcloud' + - 'seafile' +coverImage: './images/pawel-nolbert-xe-ss5Tg2mo-unsplash.jpg' +--- + +Today I'll share and explain the motivations that lead me to leave Nextcloud and choose Seafile, while hopefully making the transition smooth for anyone that wants to follow along. Spoiler: Performance and stuff constantly breaking leads to a Seafile beta being way more stable and reliable that a Nextcloud "Production" release. + +Nextcloud is the the de-facto way to go for most self hosted Cloud / Dropbox / Google Drive. So a few years ago in my move to a more ownership driven approach to my data I setup a Nextcloud instance and was quite happy. They have an iOS app and a macOS sync client. +There are numerous of plug-ins that can accomplish anything from contacts syncing with WebDav to GSuite-Like online collaboration with the Collabora integration, a mail client and real time video conferences with Nextcloud Talk. For many (persons & businesses) this means a convenient place where all the tools are combined under one platform. + +## Where the issues started + +Trying to be everything at the same time comes at a cost. And that is generally an experience that at least in my experience never feels polished or finished. While the Nextcloud Plug-Ins are incredibly versatile and powerful they also leave room for segmentation and you will notice it. + +
    + +![](images/pawel-nolbert-xe-ss5Tg2mo-unsplash-1024x740.jpg) + +
    + +Cloud and Ocean + +
    + +
    + +### The permanent alpha + +That's what using Nextcloud feels like 75% of the time. I have no insight into the company behind the project but it feels like they are chasing a release cycle for the sake of paper launching unfinished features that compromise in terms of stability and polish. The thing that bothers me the most is that they are constantly marketed as "production ready" when they clearly had not nearly enough QA. + +2 years ago I tried to install Collabora for an organisation I'm involved with and the setup was everything but straight forward. Docs where limited and the answers buried either in a forum thread or github issue. After many web searches I got it to work, but the performance (at least when I tested) was not really usable. We ended up using Google Docs and Etherpad. + +Then there was the story with end to end encryption (E2EE) for files. This was a feature that was promoted quite extensively by Nextcloud and [released as stable](https://nextcloud.com/blog/production-ready-end-to-end-encryption-and-new-user-interface-arrive-with-nextcloud-desktop-client-3-0/) after many delays. So I followed the instructions on installing it and... [the sync clients broke down](https://github.com/nextcloud/desktop/issues/2593). What happened? Well Nextcloud released software as stable and production ready, but the most basic functionality was simply not ready and a lot of clients stopped syncing, mine included. + +A few weeks ago [Nextcloud 21](https://nextcloud.com/blog/nextcloud-hub-21-out-with-up-to-10x-better-performance-whiteboard-and-more-collaboration-features/) was released and boasted a "10x Speed improvement" which of course is an assumption that cannot hold it's grounds. But I was excited as even a "1.5x-2x" improvement would have been really substantial. I installed the new version and well... performance seemed untouched but as a new feature my UI was stuck in a permanent dark mode UI with unreadable text (see the files sizes). I don't run any custom theme or anything. Is this a complete deal breaker? Of course not, but it goes a long way to show how untested the whole software is if a stable release has unreadable text in the start page of your product. + +
    + +![](images/Screenshot-2021-03-23-at-10.58.31-1-1024x325.png) + +
    + +Screenshot of Nextcloud 21 with colour bugs + +
    + +
    + +In addition to the weird CSS bugs it also introduced a new bug where I have to frequently reload the web UI as it "cannot connect" to the server. Definetely production ready. + +### Performance + +The final issue is the performance as a whole. The web interface regularly takes around 5-10s to load for each action you perform. The only thing that is quite responsive is navigating through folders. It's a drag when you just quickly want to get stuff done and the actual work you have to do takes less than waiting for Nextcloud to serve you the website. It's simply put not fun to use it. + +There is also the issue that you need to spin up a second container for cron jobs like it's 2003 and that every update or so you manually have to go into the console to rebuild some indexes. I'll leave them unjudged as it maybe those are "Enterprise Features" which I don't understand. + +## Seafile to the rescue + +The last update (Nextcloud 21) was the point where I decided to jump ship as explained above. The question was: What options do I have? + +- Pydio +- Seafile + +Pydio reinvented itself with the launch of it's Cells product. However at the time of writing the macOS client did not seem ready and therefore was excluded. + +Seafile on the other hand just had the release of it's 8th version (still in beta afaik) and supports iOS and macOS. + +### Migration + +I had to migrate 2 things: Cal/CardDav for Calendar and Contacts and the files drive itself. +Spinning up a Seafile instance was a breeze as I host every single service with docker. + +``` +# .env +MYSQL_ROOT_PASSWORD=random +DB_HOST=db +DB_ROOT_PASSWD=random + +SEAFILE_ADMIN_EMAIL=me@example.com +SEAFILE_ADMIN_PASSWORD=a_very_secret_password +``` + +``` +version: "2.0" + +services: + db: + image: mariadb:10.5 + env_file: .env + volumes: + - ./data/db:/var/lib/mysql + + memcached: + image: memcached:1.5.6 + entrypoint: memcached -m 256 + + app: + image: seafileltd/seafile-mc:latest + env_file: .env + volumes: + - ./data/app:/shared + depends_on: + - db + - memcached +``` + +I then installed the macOS client and simply copied all the files over. Before actually copying the files I added a `seafile-ignore.txt` file in the root to exclude files from being uploaded to the server. Read more [here](https://help.seafile.com/syncing_client/excluding_files/). + +**Gotcha** +The ignore file can be tricky if you tread it like a `.gitignore` files. `.git/` would not exclude all those directories, only the root one. To exclude all `.git` directories you actually need to insert `*/.git/` into the `seafile-ignore.txt` file. + +The UI and the sync is incredibly fast, especially when compared to Nextcloud and is delightful to use. It has all the features you would expect: 2FA, user groups, quotas, link sharing (with support for expiration, password and upload only), files sharing between users, etc. It also features collaboration features like Nextcloud but I haven't tested them yet. Also it features an actual REST API with tokens that you can generate (as read-write or read only tokens). Another issue I had to battle with in the past with Nextcloud. + +The mobile app on iOS does everything you would expect it to do, including integrating with the native Files API. + +For Notability I use the backup feature that uploads backups as PDFs of my notes to a WebDav server. However Seafile disables the usage of WebDav for users with 2FA as it would be a vulnerability. As a solution I simply created a "Notability" user without 2FA and shared the folder i want to use as target with that user. Awesome! Now I have a scoped user that only has access to the notability backup folder without having access to the rest of my files. + +## CardDav/CalDav + +Since Seafile focuses only on the "Drive" component I had to migrate my contacts and calendars elsewhere. The way to go solution is Radicale and I was surprised to find that there is not official docker image? After a 2-min research I found the most popular docker image did not support Authentication? So I had to create my own. + +You can find my [Radicale docker image here](https://github.com/cupcakearmy/docker-radicale), maybe you find it useful. It supports bcrypt passwords and can be deployed with just the env variables for `USER` and `PASSWORD`. It has been tested with the iOS and macOS native clients. + +``` +# .env +USER=foo +PASSWORD=secret +``` + +``` +# docker-compose.yml +version: '3.7' + +services: + app: + image: cupcakearmy/radicale + env_file: .env + volumes: + - ./data:/data + ports: + - 80:5232 +``` + +The "migration" was done by exporting the calendars I had in Nextcloud with the native macOS calendar app and simply reimporting them into the new server, again with the native client on macOS. Same procedure with the contacts. Sync works like a charm and I'll never go back. + +### The downsides + +As with any project Seafile has some drawbacks compared to Nextcloud. Beside the obvious fact that Nextcloud has tons of plug-ins and Seafile does not, Seafile does store data and therefore files in blobs, so they are not visible to the host machine. That means that you cannot directly access lets say a `hello.txt` directly from the filesystem of the server you are hosting the service on. This might be a deal breaker for some people. + +Another thing that could bother some is that in the free version of Seafile there is no automatic garbage collection, so from time to time you should run the script to cleanup old data. + +## Conclusion + +To conclude the journey: It took me an evening to move everything, create the docker image for radicale and I could not be happier. Seafile feels so much more robust in comparison to the point that Nextcloud feels like a toy product. Of course this is not a fair comparison as Seafile only does file sync and not the other 10-20 big features Nextcloud brings to the table. However if you only use Nextcloud to sync files to your own cloud the comparison is not even close IMO. diff --git a/src/content/blog/matomo-vs-ublock-origin.md b/src/content/blog/matomo-vs-ublock-origin.md new file mode 100644 index 0000000..6e955d1 --- /dev/null +++ b/src/content/blog/matomo-vs-ublock-origin.md @@ -0,0 +1,185 @@ +--- +title: 'Matomo vs uBlock Origin' +date: '2021-01-28' +categories: + - 'general' +tags: + - 'blocker' + - 'matomo' + - 'stats' + - 'tracking' +coverImage: './images/luke-chesser-JKUTrJ4vK00-unsplash-scaled.jpg' +--- + +After [Ackee](https://github.com/electerious/Ackee) got an update and stopped working I wanted to search for an alternative to get some stats on my statically rendered site. As no server is used, I need some 3rd party service. + +I don't want to spy on people, nor set cookies and annoy people with consent banners if they only want to read a damn blog post. The goal is just get a feel for the traffic on the site. +This is important to mention as the next steps could sound a bit nefarious otherwise. +Data collected on this site is 100% anonymous and [GDPR](https://gdpr.eu/) compliant. + +
    + +![](images/luke-chesser-JKUTrJ4vK00-unsplash-1024x683.jpg) + +
    + +Photo by [Luke Chesser](https://unsplash.com/@lukechesser?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/s/photos/data?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +
    + +
    + +Since Matomo is the de facto way to go, I spun up the Matomo server with my trusted docker-traefik setup and was up and running in no time. +( I'll share the config files if anyone is interested at the bottom. ) + +Then I quickly copied the JS tracker code in my main html template and thought that was it. **Wrong**. + +## The problem defaults. + +So turns out that Matomo, being widely used is of course included in many Ad-Blocker lists and therefore my stats did not work. Lets see why: +Basically all ad blockers work with lists. Those lists include pattern that if matched will be filtered out. Let's take a look at the default Matomo tracking code: + +``` + +``` + +We can see that my stats server is `stats.nicco.io`. And we also can see that the tracking script is loaded by `matomo.js`, which then sends the details to `matomo.php`. Well that is of course incredibly easy to block, and it is as you can see below: + +
    + +![](images/Screenshot-2021-01-28-at-12.12.59.png) + +
    + +Part of the EasyList Filter + +
    + +
    + +
    + +![](images/Screenshot-2021-01-28-at-12.14.03.png) + +
    + +Part of the EasyList Filter + +
    + +
    + +That won't work, and since most of the people that visit this site are probably developers which probably have some kind of ad blocker installed. + +## Solution time + +So after a short Ecosia search I landed on the blog of [Christian Mochow](https://christianmochow.de/author/christian-mochow/) that wrote a [blog post](https://christianmochow.de/beitraege/tools/catch-me-if-you-can-adblocker-umgehen-mit-matomo/) on this issue. I got the solution from his article. + +Luckily Apache has the famous Rewrite module, which will solve all our problems. I bet most of you already know where this is headed. + +We can create a `.htaccess` file in the root of our Matomo installation folder, to cloak our requests. + +``` +# .htaccess +RewriteEngine On +RewriteRule ^unicorn matomo.js +RewriteRule ^rainbow matomo.php +``` + +Now if we request `https://stats.nicco.io/unicorn` we actually get the response for `https://stats.nicco.io/matomo.js` and the same for `rainbow` and `matomo.php`. + +``` +// Replace in the client + +_paq.push(['setTrackerUrl', u+'matomo.php']); // Before +_paq.push(['setTrackerUrl', u+'rainbow']); // After + +g.src = u + 'matomo.js' // Before +g.src = u + 'unicorn' // After +``` + +**Awesome!** + +I had to create a minuscule `Dockerfile` as the `Rewrite` module is not enabled per default in the standard Matomo docker image. + +``` +# Dockerfile +FROM matomo +RUN a2enmod rewrite +``` + +## Responsible Usage + +Now as you can see it's incredibly easy to mask tracking stuff, and I bet there are a lot of people doing this in the wild. It is important to respect the privacy of your users and you should never store more data than you need and in the best case don't store data at all. + +**Anonymize as much as possible!** Matomo makes this easy. You can effortlessly delete 2 bytes of each ip address (half of the info), enforce strict no cookie tracking and automatically delete data after `x` days. Please do ❤️ + +### Config Files + +The `Dockerfile` and the `.htaccess` files are shown above. + +``` +# docker-compose.yml +version: "3.7" + +networks: + traefik: + external: true + +services: + db: + image: mariadb + command: --max-allowed-packet=64MB + restart: unless-stopped + volumes: + - ./data/db:/var/lib/mysql + env_file: .env + + app: + build: . + restart: unless-stopped + links: + - db + volumes: + - ./data/matomo:/var/www/html + - ./.htaccess:/var/www/html/.htaccess + env_file: .env + labels: + - traefik.enable=true + - traefik.docker.network=traefik + - traefik.port=80 + - traefik.backend=matomo + - "traefik.frontend.rule=Host:stats.nicco.io;" + networks: + - traefik + - default +``` + +``` +# .env +MYSQL_DATABASE=matomo +MYSQL_USER=matomo +MYSQL_PASSWORD= +MYSQL_RANDOM_ROOT_PASSWORD=yes + +MATOMO_DATABASE_HOST=db +MATOMO_DATABASE_ADAPTER=mysql + +MATOMO_DATABASE_DBNAME=matomo +MATOMO_DATABASE_USERNAME=matomo +MATOMO_DATABASE_PASSWORD= +``` + +See the [code for this website](https://github.com/cupcakearmy/nicco.io/blob/220643770385bebb05094b440c28441b49184556/src/template.html#L37-L64). diff --git a/src/content/blog/monitor-your-self-hosted-services-for-free.md b/src/content/blog/monitor-your-self-hosted-services-for-free.md new file mode 100644 index 0000000..5c8c22d --- /dev/null +++ b/src/content/blog/monitor-your-self-hosted-services-for-free.md @@ -0,0 +1,166 @@ +--- +title: "Monitor your self hosted services for free" +date: "2022-07-07" +--- + +Monitoring services requires external resources, as monitoring your server(s) from the server itself does not make sense. Renting a whole server for monitoring is a bit of a resources (and money) waste. + +
    + +![](images/daniele-franchi-g2fJ7d7eKSM-unsplash.jpg) + +
    + +Photo by [Daniele Franchi](https://unsplash.com/@daniele_franchi?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/s/photos/radar?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +
    + +
    + +## Getting a free VM + +Luckily we can leverage the free tiers of many cloud providers. This gives us a free option and stability as they tend to be very reliable. Below is a list of free tiers available form the big 3 players. All of them offer a free VM per month, which is more than sufficient for our needs. + +- [Google Cloud Project](https://cloud.google.com/free/docs/gcp-free-tier/#compute) +- [Microsoft Azure](https://azure.microsoft.com/en-in/pricing/free-services/) +- [Amazon AWS](https://aws.amazon.com/free/?all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc&awsf.Free%20Tier%20Types=*all&awsf.Free%20Tier%20Categories=categories%23compute) + +Choose your preferred cloud, it does not really matter. I went with Google as I find the interface the nicest to use. For the OS of the VM I went which Ubuntu, but any Linux. + +## Setup + +For monitoring we will use [Uptime Kuma](https://github.com/louislam/uptime-kuma). It's an amazing free, open source monitoring tool, very similar to [UptimeRobot](https://uptimerobot.com/). For simplicity we will run it with Docker and Traefik. + +First we need to [instal docker](https://docs.docker.com/engine/install/debian/#install-using-the-repository) + +``` +curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg + +echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \ + $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null + +apt update +apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin +``` + +Also we want some basic firewall + +``` +apt install ufw +ufw allow 80 +ufw allow 443 +ufw allow 22 +ufw enable +``` + +Don't forget to point your DNS to the server. For example as a subdomain `status.example.org` + +## Depoly Uptime Kuma + +We only need a `docker-compose.yaml` file now and we should be up and running. I'll share the folder structure below. We could but everything in one compose file but I like to keep thinks tidy. + +``` +. +├── kuma +│ └── docker-compose.yaml +└── traefik + ├── docker-compose.yaml + └── traefik.yaml +``` + +### Traefik + +Lets start with Traefik. It will handle all our routing and TLS certificates. Remember to change the acme email down in the `traefik.yaml` + +``` +version: '3.8' + +networks: + default: + external: true + name: proxy + +services: + traefik: + image: traefik:2.8 + restart: unless-stopped + ports: + - "80:80" + - "443:443" + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - ./traefik.yaml:/etc/traefik/traefik.yaml:ro + - ./data:/data + labels: + - "traefik.enable=true" + + # HTTP to HTTPS redirection + - "traefik.http.routers.http_catchall.rule=HostRegexp(`{any:.+}`)" + - "traefik.http.routers.http_catchall.entrypoints=insecure" + - "traefik.http.routers.http_catchall.middlewares=https_redirect" + - "traefik.http.middlewares.https_redirect.redirectscheme.scheme=https" + - "traefik.http.middlewares.https_redirect.redirectscheme.permanent=true" +``` + +``` +#Define HTTP and HTTPS entrypoints +entryPoints: + insecure: + address: ":80" + secure: + address: ":443" + +#Dynamic configuration will come from docker labels +providers: + docker: + endpoint: "unix:///var/run/docker.sock" + network: "proxy" + exposedByDefault: false + +#Enable acme with http file challenge +certificatesResolvers: + le: + acme: + email: me@example.org + storage: /data/acme.json + httpChallenge: + # used during the challenge + entryPoint: insecure +``` + +To get traefik running we just need to type the following + +``` +docker network create proxy +docker compose up -d +``` + +### Kuma + +The compose file for Kuma is compact. Don't forget to change the domain to yours. + +``` +version: '3.8' + +networks: + default: + external: true + name: proxy + +services: + kuma: + image: louislam/uptime-kuma:1 + restart: unless-stopped + volumes: + - ./data:/app/data + labels: + - traefik.enable=true + - traefik.http.routers.kuma.rule=Host(`status.example.org`) + - traefik.http.routers.kuma.entrypoints=secure + - traefik.http.routers.kuma.tls.certresolver=le +``` + +Now you can navigate to your new monitoring website and create and admin account and setup monitors, alert systems and so on. + +Many thanks to [Louis Lam](https://github.com/louislam) for creating and maintaining Utime Kuma! Consider donating! diff --git a/src/content/blog/react-code-splitting-made-simple-easily-reduce-bundle-js.md b/src/content/blog/react-code-splitting-made-simple-easily-reduce-bundle-js.md new file mode 100644 index 0000000..68aab9b --- /dev/null +++ b/src/content/blog/react-code-splitting-made-simple-easily-reduce-bundle-js.md @@ -0,0 +1,120 @@ +--- +title: 'React code splitting made simple. Easily reduce bundle.js' +date: '2019-07-21' +categories: + - 'coding' +tags: + - 'code-splitting' + - 'react' +coverImage: './images/jason-abdilla-jZWmw6007EY-unsplash-scaled.jpg' +--- + +On average right now **around 200-500kb of JS is sent** down the pipe to the client. Way to much for my personal taste. Since a lot of website use react, today we will look how to reduce that in a simple and easy way, applicable to almost any app. + +
    + +![](images/jason-abdilla-jZWmw6007EY-unsplash-scaled.jpg) + +
    + +Photo by [Jason Abdilla](https://unsplash.com/@jabdilla_creative?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/search/photos/axe?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +
    + +
    + +Let's start with why our `bundle.js` even grows that much. In my opinion there are 2 causes for this: + +1. Devs mindlessly running `npm install`. +2. Loading **all** the JS, even if it is not needed in the current screen (e.g. the homepage). + +## Carefully select packages + +The first is not as easily solved if the app is already built. It requires your team to carefully choose your package and realise that often you don't need all the packages you are bundling. Often there is a lighter alternative. + +As an example: a lot of websites use [momentjs](https://github.com/moment/moment/): It's an awesome library, **but it weights [231.7kb](https://bundlephobia.com/result?p=moment)!** There is an even cooler alternative: [DayJS](https://github.com/iamkun/dayjs). It requires only [6.5kb](https://bundlephobia.com/result?p=dayjs) and shares the same API as moment, so there is no rewriting code. There are a lot of similar examples that can be made. If you have a big module, just search for a smaller alternative. + +#### TLDR; + +1. Use the [webpack-bundle-analyser](https://github.com/webpack-contrib/webpack-bundle-analyzer) for already existent packages. +2. Search for lighter alternatives to big packages. +3. **Before installing** check on [bundlephobia](https://bundlephobia.com/) how big your desired package is. + +## Code splitting & lazy loading + +Now to the real deal. The classic problem is that big websites don't split the JS that is sent to the client. This means that the website might receive the JS for the shopping section, while you are only waiting for the homepage to load. This is unnecessary and **waiting for a page to load is always a frustrating experience**. We can do better 👍 + +How are we going to achieve this? **Code splitting & lazy loading.** +We are going to use 2 native react functions, so no external packages. + +- [lazy](https://reactjs.org/docs/code-splitting.html#reactlazy) +- [Suspense](https://reactjs.org/docs/code-splitting.html#suspense) + +Lazy & Suspense require React version **16.6** or newer. Also this does not work with server side rendering. + +**Lazy** is used to lazy load the component (...duh 🙄). This means that the code for the component is only downloaded when a component actually needs to be shown. + +**Suspense** is a handy wrapper for displaying a fallback while the component is loading. + +Let's see below how this is achieved: + +**From** + +``` +import MyList from './MyList' + +const App = () =>
    + // ... + + // ... +
    +``` + +**To** + +``` +const MyList = lazy(() => import('./MyList')) + +const App = () =>
    + // ... + + + + // ... +
    +``` + +This is in fact all you need to do. Now our component `MyList` will lazy load on necessity. Awesome! + +#### Bonus: Little helper function + +This can get repetitive though, so here is a little helper that basically wraps everything into one function: + +``` +export const Split = path => props => { + const Component = lazy(() => import(path)) + return Loading...}> + + +} +``` + +Now we can simply do the following: + +``` +import { Split } from './utils.jsx' + +const MyListLazy = Split('./MyList') + +const App = () =>
    + // ... + + // ... +
    +``` + +There is a little codesanbox below with all the code if you wanna try for yourself (you should! 😉) + + + +This concludes todays look at how to reduce the bundle size and use code splitting in react. Note that this does not work with server side rendering. diff --git a/src/content/blog/reduce-docker-compose-files-with-yaml-magic.md b/src/content/blog/reduce-docker-compose-files-with-yaml-magic.md new file mode 100644 index 0000000..d4b61ba --- /dev/null +++ b/src/content/blog/reduce-docker-compose-files-with-yaml-magic.md @@ -0,0 +1,53 @@ +--- +title: 'Reduce docker-compose files with YAML magic' +date: '2019-05-06' +categories: + - 'coding' +tags: + - 'docker' + - 'docker-compose' + - 'yaml' +coverImage: './images/guillaume-bolduc-259596-unsplash-scaled.jpg' +--- + +If you find yourself writing long docker-compose files because you need to specify the same things over and over again inside of the single services: **fear no more**! + +
    + +![](images/guillaume-bolduc-259596-unsplash-1024x741.jpg) + +
    + +Photo by [Guillaume Bolduc](https://unsplash.com/photos/uBe2mknURG4?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/search/photos/container?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +
    + +
    + +_Without further ado:_ + +``` +version: '3.4' # min version 3.4 + +x-default: &default + restart: always + env_file: .env + + +services: + + web: + <<: *default + image: node + # blablabla + + db: + <<: *default + image: postgres +``` + +Thats it! Now both `web` and `db` inherit the properties of `x-default`. + +The `x-` prefix is a docker specific thing and is required. YAML support references also without the prefix. Also note that **version 3.4 or higher is required**. + +btw: I recently was looking into [Sentry](https://sentry.io/welcome/) and found this [docker-compose](https://github.com/getsentry/onpremise/blob/master/docker-compose.yml) file. Thats how I discovered it. diff --git a/src/content/blog/rust-in-python-made-easy.md b/src/content/blog/rust-in-python-made-easy.md new file mode 100644 index 0000000..a6d30d2 --- /dev/null +++ b/src/content/blog/rust-in-python-made-easy.md @@ -0,0 +1,223 @@ +--- +title: 'Rust in Python made easy' +date: '2020-01-01' +categories: + - 'coding' +tags: + - 'ffi' + - 'python' + - 'rust' +coverImage: './images/jonathan-chng-HgoKvtKpyHA-unsplash-scaled-1.jpg' +--- + +Python is truly amazing. With all that greatness generally there has to be a tradeoff and in the case of Python it's performance. + +Luckily there is an easy way to run computation intensive work in Rust, which is of course orders of magnitude faster. Let's see how! + +Overview + +1. [hello world example](#simple) +2. [parameters & returns](#params-returns) +3. [rust data types compared to pythons ctypes](#types) +4. [lists / arrays](#lists) +5. [complex data types handling](#complex) + +
    + +![](images/jonathan-chng-HgoKvtKpyHA-unsplash-scaled-1.jpg) + +
    + +Photo by [Jonathan Chng](https://unsplash.com/@jon_chng?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/s/photos/run?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +
    + +
    + +Lets assume we want to run the following python code in rust. + +``` +def add(a, b): + return a + b + +add(1, 2) # 3 +``` + +Lets see the steps we need to take to achieve this: + +1. write some rust code +2. compile rust +3. import rust in python +4. run the rust code inside of python + +## Hello world example + +First lets create a new rust project by running: + +``` +cargo new rust_in_python +``` + +Then lets rename `src/main.rs` to `src/lib.rs` as we want a library and not standalone program. + +``` +mv src/main.rs src/lib.rs +``` + +Now we simply write a hello world function in rust + +``` +#[no_mangle] +fn hello() { + println!("Hello from rust 👋"); +} +``` + +For every function that need to be available to other languages (in our case Python) through foreign function call (ffi) we will need to add the `#[no_mangle]` flag to it. + +The last step is to tell rust to compile to a dynamic library. To do so simply add the following to your `Cargo.toml` config file. + +``` +[lib] +crate-type = ["dylib"] +``` + +Now we are ready to build 🚀 + +``` +cargo build --release +``` + +Now just create a `main.py` file and we can import and run our function. + +``` +from ctypes import CDLL + +lib = CDLL("target/release/librust_in_python.dylib") +lib.hello() +``` + +And if you run it you will be greeted from rust. No need to install, the `ctypes` package is included the standard python library. + +``` +python main.py +``` + +## With return & parameters + +Of course without giving parameters to the function and receiving its output this whole endeavour would be useless. + +Before we start I would like to remind you that python is untyped whereas rust of course is strongly typed. This means that we will need to tell python what types the parameters and the return of our rust function we have. + +First lets write the simple add function in rust + +``` +#[no_mangle] +fn add(a: f64, b: f64) -> f64 { + return a + b; +} +``` + +Don't forget to build again 😉 + +``` +cargo build --release +``` + +Now to the python part + +``` +from ctypes import CDLL, c_double + +lib = CDLL("target/release/librust_in_python.dylib") + +lib.add.argtypes = (c_double, c_double) +lib.add.restype = c_double + +result = lib.add(1.5, 2.5) +print(result) # 4.0 +``` + +Lets see what is happening here: + +With `lib.add.argtypes` we must pass a tuple specifying how python should parse the data we pass to the `add` function. The `ctypes` package includes a list of different types we can use. [See the full list here](https://docs.python.org/3.8/library/ctypes.html#fundamental-data-types). + +The same happens with `lib.add.restype`. As you might have guessed this tells python what type is returned from the rust function. + +In our case it's all `c_double` as we are using `f64` in rust. + +## Data types in rust + +Lets see some other data types and their equivalent in rust. + +
    PythonCRust
    c_bool-
    c_bytechari8
    c_ubyteunsigned charu8
    c_shortshorti16
    c_ushortunsigned shortu16
    c_intinti32
    c_uintunsigned intu32
    c_longlongi64
    c_ulongunsigned longu64
    c_floatfloatf32
    c_doubledoublef64
    + +## Arrays & List + +So what about lists? Unfortunately I have not found a way to use Vectors for dynamic size arrays. So for now it's just fixed size arrays. + +###### Rust + +``` +#[no_mangle] +fn sum(arr: [i32; 5]) -> i32 { + let mut total: i32 = 0; + for number in arr.iter() { + total += number; + } + return total; +} +``` + +###### Python + +``` +from ctypes import CDLL, c_int + +lib = CDLL("target/release/librust_in_python.dylib") + +lst = [1, 2, 3, 4, 5] +# Create the memory of the list size +seq = c_int * len(lst) +arr = seq(*lst) + +result = lib.sum(arr) +print(result) +``` + +## Classes and complex data types + +Often it can be very useful to send and/or receive data in a structured, compact way. We can do this using structs. + +###### Rust + +``` +#[repr(C)] +pub struct Point { + pub x: f64, + pub y: f64, +} + +#[no_mangle] +fn greet_point(p: Point) { + println!("x: {}, y: {}", p.x, p.y); +} +``` + +###### Python + +``` +from ctypes import CDLL, Structure, c_double + +lib = CDLL("target/release/librust_in_python.dylib") + +class Point(Structure): + _fields_ = [ + ('x', c_double), + ('y', c_double) + ] + + +p = Point(x=1.2, y=3.4) +lib.greet_point(p) +``` diff --git a/src/content/blog/speed-up-your-docker-builds-with-dockerignore.md b/src/content/blog/speed-up-your-docker-builds-with-dockerignore.md new file mode 100644 index 0000000..656f428 --- /dev/null +++ b/src/content/blog/speed-up-your-docker-builds-with-dockerignore.md @@ -0,0 +1,74 @@ +--- +title: 'Speed up your docker builds with .dockerignore' +date: '2019-12-23' +categories: + - 'coding' +tags: + - 'docker' +coverImage: './images/thomas-kelley-t20pc32VbrU-unsplash-scaled-1.jpg' +--- + +So you ever wondered why your docker build takes so long to startup when all you do is adding a few files to your image and setting which command to run? + +Fear no more! `.dockerignore` to the rescue ⚓️. + +
    + +![](images/thomas-kelley-t20pc32VbrU-unsplash-scaled-1.jpg) + +
    + +Photo by [Thomas Kelley](https://unsplash.com/@thkelley?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/s/photos/whale?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +
    + +
    + +Whenever you build a docker image the first thing you will always see is the following: + +```bash +docker build -t my-image . +Sending build context to Docker daemon 203.2MB +Step 1/6 : FROM ... +``` + +The important thing to note is the context with a size of `203.2MB` in this case. What does it mean? + +Every time a docker image gets built, it requires the context. By default it's simply the directory of your `Dockerfile`. Basically it's the folder from which you can add files to the image you are building. + +This means that for each build, the docker client sends the whole directory to the docker engine to build. +If you are unlucky this includes either the whole node_modules folder, maybe a virtual env folder for your python or simply everything in your dist folder. In my case it was a venv with 200+MB of data. + +This slows down the process significantly and if you are iterating on a dockerfile making only a few tweak this can be very tearing. + +> Waiting is the most boring (duh) and painful thing ever. +> +> Every person on this planet + +## Solution: `.dockerignore` + +Simply create a `.dockerignore` file inside of your context (basically in the same directory as your `Dockerfile`) and specify what to include, what to ignore. It works just like our trusted `.gitignore`. + +Im my case I only wanted to have my `requirements.txt` and the `.py` files inside of my `src` folder. + +###### .dockerignore + +``` +# Ignore everything +** + +!/requirements.txt +!/src + +**/__pycache__ +``` + +If I run `docker build` again watch what happens: + +```bash +docker build -t my-image . +Sending build context to Docker daemon 37.38kB +Step 1/6 : FROM ... +``` + +Awesome! The context shrunk from 200MB to under 50kB and the startup time of docker build was greatly reduced. This will help substantially if you have a lot of files, like e.g. a node_modules folder. diff --git a/src/content/blog/step-up-oauth-security-with-pkce.md b/src/content/blog/step-up-oauth-security-with-pkce.md new file mode 100644 index 0000000..633322b --- /dev/null +++ b/src/content/blog/step-up-oauth-security-with-pkce.md @@ -0,0 +1,79 @@ +--- +title: 'Step up OAuth security with PKCE' +date: '2019-07-10' +categories: + - 'general' +tags: + - 'ietf' + - 'oauth' + - 'security' +coverImage: './images/jielin-chen-pKQIpxzq0ZQ-unsplash-e1562783699383-scaled.jpg' +--- + +We all have used OAuth at some point. Whether with SSOs or a simple authorization server. While OAuth has multiple so called _flows_, the most commonly used are the _**code**_ and the _**implicit**_ flows. Today we will focus on the security aspect of the latter, pros/cons and solutions to make the _implicit_ flow (more) secure. + +I am going to assume some basic OAuth knowledge. [Here](https://medium.com/@darutk/the-simplest-guide-to-oauth-2-0-8c71bd9a15bb) is a basic explanation. [This](https://aaronparecki.com/oauth-2-simplified/) is a quick more in depth article. + +
    + +![](images/jielin-chen-pKQIpxzq0ZQ-unsplash-e1562783699383-1024x484.jpg) + +
    + +Photo by [Jielin Chen](https://unsplash.com/@jerrychan0328?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/search/photos/fence?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +
    + +
    + +#### Quick refresher on implicit vs code flows + +As mentioned above there are [multiple flows](https://oauth.net/2/) in the [OAuth2 spec](https://tools.ietf.org/html/rfc6749), but in reality only the **_code_** and **_implicit_** are really used. The big difference between the two ist that in the **_code_** flow the there is a pre-shared password. This requires a backend, so the code flow cannot be used in SPAs. + +This is where traditionally the **_implicit_** flow comes into play. It is basically a played down version of his **_code_** brother. Instead of generating a code which is then used in combination with the password on the server side to get the token, in **the** _**implicit**_ **flow the token is returned directly**. + +## Issues with security in _implicit_ flows + +The implicit flow contains the `state` parameter. This is random value that the client sends to the authorization server. The server then redirects to the client including the `token` and `state` that was passed. This prevents CSRF and Replay attacks where an attacker could basically redirect some site to your callback path. The client should delete the state variable when getting the token. This is already pretty good, but we need to do more. You can read the details [in the spec](https://tools.ietf.org/html/rfc6749#section-10.12). + +**The server has no way of verifying that the original client actually got the token.** + +This is a big problem! Since the server cannot verify the identity of the original request it could end up giving the token to a 3rd party which did not make the request. Now an attacker has an access token. 😐 + +## PKCE to the saving 🎉 + +So how can our app demonstrate that it is the one that made the request? Of course the smart folks at [IETF](https://www.ietf.org/) have a solution. + +It's called **[Proof Key for Code Exchange](https://tools.ietf.org/html/rfc7636)**. In works in a similar way to the code flow, but instead of a password we use hashing. Confused? Let me explain: + +1. Your client wants to authenticate + 1. On the client side you generate a random string `verifier`. + 2. You then compute the SHA-256 hash of the `verifier` which gives you the `challenge` + 3. Your app makes the classic `/authorize?...&code_challenge=&code_challenge_method=S256` +2. The authorization server saves does the usual + 1. Redirect to user promps. + 2. User accepts. + 3. Server redirect to your callback path with a `code` +3. The client exchanges the `code` for a `token` + In the exchange request the client includes the original `verifier` which was used to generate the `challenge` hash. +4. Server verifies the request + The server takes the `verifier` and generates the `challenge` on its own, then checks whether it matches with the original one associated with the `code` +5. Server send code and client is authenticated. + +In this way, using `state` and the **PKCE** extension both the client and server are secured. The server can be sure that the token was sent only to the client from which the request originally was created and the client is safe agains CSRF & Replay attacks. **WIN WIN**. 💪 + +Below is a diagram by [Auth0](https://auth0.com/) which helped me understand the whole process more easily. + +
    + +![](images/auth-sequence-auth-code-pkce-1024x833.png) + +
    + +[https://auth0.com/docs/flows/concepts/auth-code-pkce](https://auth0.com/docs/flows/concepts/auth-code-pkce) + +
    + +
    + +I hope you found this helpful. I was blown away by the simplicity of PKCE and how sometimes problems can be solved in very elegant ways thanks to smart people. diff --git a/src/content/blog/supporting-detecting-dark-mode-in-the-browser.md b/src/content/blog/supporting-detecting-dark-mode-in-the-browser.md new file mode 100644 index 0000000..5a3b49e --- /dev/null +++ b/src/content/blog/supporting-detecting-dark-mode-in-the-browser.md @@ -0,0 +1,149 @@ +--- +title: 'Supporting & detecting dark mode in the browser' +date: '2020-01-07' +categories: + - 'coding' +tags: + - 'css' + - 'dark-mode' + - 'media-query' +coverImage: './images/davisco-5E5N49RWtbA-unsplash-scaled-1.jpg' +--- + +How do you detect if a user of your website has a preference for light or dark theme? Or maybe has not chosen at all? + +We will look at a few ways how to detect and handle dark modes in 2020: + +1. [Pure CSS](#pure-css) +2. [JS](#js) +3. [React](#react) + +
    + +![](images/davisco-5E5N49RWtbA-unsplash-scaled-1.jpg) + +
    + +Photo by [davisco](https://unsplash.com/@codytdavis?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/s/photos/contrast?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +
    + +
    + +## Pure CSS + +First lets have a look how we can do this using only CSS. There is a new css media query that is supported by [almost any browser](https://caniuse.com/#feat=prefers-color-scheme) right now. +**prefers-color-theme** + +###### Example Time + +```css +.box { + background: #eee; +} + +@media (prefers-color-scheme: dark) { + .box { + background: #000; + } +} + +@media (prefers-color-scheme: light) { + .box { + background: #fff; + } +} +``` + +Just like we use media queries for device width we can easily target specific CSS in case the user has a specific preference. + +For completeness, if the user has no preference you can use the media query `@media (prefers-color-scheme: no-preference)`. + +## JS + +#### Simple + +So how do we do the same thing in JS? There is a little helper called `window.matchMedia` ([also widely supported](https://caniuse.com/#feat=matchmedia)) wich takes a media query and tells us if the media query is true of false. + +###### Example + +```tsx +const isDark = window.matchMedia('(prefers-color-scheme: dark)') +isDark.matched // true or false +``` + +That simple. + +#### Reactive + +If we want to go reactive, the `matchMedia` function also allows us to set a listener, so every time the setting changes, we get notified and can act accordingly. + +###### Example + +```tsx +const isDark = window.matchMedia('(prefers-color-scheme: dark)') +isDark.addListener((event: MediaQueryListEvent) => { + event.matches // true or false +}) +``` + +## React + +And of course react. We love it, we use it. So I made [a little library](https://github.com/cupcakearmy/use-light-switch) because all the libs I found for react did not include typescript typing!! 🤕 + +Of course it comes with hooks 🎣. + +```bash +yarn add use-light-switch +``` + +### `useLightSwitch()` + +This is the basic usage. + +```tsx +import { Mode, useLightSwitch } from 'use-light-switch' + + +const Simple: React.FC = () => { + const mode = useLightSwitch() + + if (mode === Mode.Dark) ... + + return ... +} +``` + +### `useModeSelector()` + +This is the more useful one IMO. + +```tsx +import React from 'react' +import ReactDOM from 'react-dom' +import { useModeSelector } from 'use-light-switch' + +const App: React.FC = () => { + const selected = useModeSelector({ + light: { color: 'green', name: 'Light' }, + dark: { color: 'red', name: 'Dark' }, + unset: { color: 'blue', name: 'Unset' }, + }) + + return ( +
    +

    Try switching your dark mode in macOS or Windows

    +
    + {selected.name} +
    +
    + ) +} + +ReactDOM.render(, window.document.getElementById('root')) +``` diff --git a/src/content/blog/tales-of-learning-go-from-ts.md b/src/content/blog/tales-of-learning-go-from-ts.md new file mode 100644 index 0000000..78193fb --- /dev/null +++ b/src/content/blog/tales-of-learning-go-from-ts.md @@ -0,0 +1,144 @@ +--- +title: 'Tales of learning Go (from TS)' +date: '2021-04-17' +categories: + - 'coding' +tags: + - 'autorestic' + - 'go' + - 'restic' +coverImage: './images/mark-autumns-Ssr26I0QWVY-unsplash-scaled.jpg' +--- + +The story starts about a week ago (April 2021) when I finally got around rewriting a tool called [autorestic](https://github.com/cupcakearmy/autorestic). It's a CLI wrapper around restic, the amazing backup utility. +This is not a guide or tutorial, just a diary of experiences of the process of coding Go for the first time. I'm far far far away from understanding Go at it's fullest, so veterans please correct me! + +### Background + +I started `autorestic` in Typescript as at the time it was the main language I was using and I simply love it. The issue was that JS requires a runtime and does not compile, which is not ideal for a standalone CLI. That ment using [_pkg_](https://github.com/vercel/pkg/) and while originally _pkg_ was quite an awesome project, the binaries are large (`70Mb+`) and the support is starting to dwindle with critical issues not being addressed. This meant that I couldn't create ARM builds due to a pending issue that had been open for more than a year by now. + +The languages that came to mind were Rust, Go, Kotlin and Swift and I wanted to get to know a new language in the process. The choice came down to Go as it seemed to be easy to learn and is used extensively where I work at, so that was an added bonus. + +What follows are the experiences I made as a mostly TS/JS/Python developer going into Go and learning as I went along. I did not have prior Go experience except some hello world examples here and there. + +
    + +![](images/mark-autumns-Ssr26I0QWVY-unsplash-1024x683.jpg) + +
    + +Bridge + +
    + +
    + +## Setup + +I code on macOS so setup was easy: just run `brew install go` and be done with it. Or so I thought so. The whole `GOPATH` and `GOROOT` is not as straight forward. To this day I have not completely comprehended what they do so I will not even try explain it. I set mine to the following and everything worked after that. + +```bash +export GOPATH="$HOME/.go" +export GOROOT=(brew --prefix go)"/libexec" +export PATH="$PATH:$GOPATH/bin:$GOROOT/bin" +``` + +VSCode on the other hand actually just works without an issue, which was pleasant. As I will discover later the whole tooling is a real pleasure to work with. + +### Structure + +There are almost no fixed rules for project structure, but many conventions within the community. A very good starting guide is taking a look at this repo: [golang-standards/project-layout](https://github.com/golang-standards/project-layout). There every "conventional" folder has an explanation of it's meaning. + +A (kind of) weird standard in the Go world is not having a `src` folder, but rather everything is at root level of a project. + +## Basics + +Now to the actual coding. There is come getting used to so buckle up and join the ride. + +#### Types + +Being a typed language Go has a set of basic types and types built on top of them. Basic types are the classic `string`, `int`, `bool`, etc. Then we have arrays (fixed size) and slices (dynamic). We also get `map` and `struct`. + +Complex types like maps and structs can be `nil` (null), while basic types have default values and cannot be `nil`. strings default to `""` and ints to `0`. This means that the only way in Go to check if a value has been initialised (e.g. in a struct) is if the value is different from the default one. + +A gotcha for me was that in Go almost everything is copied by value and not reference. Therefore also the `range` oparator which is used to loop arrays, slices and maps will copy by value and not reference, which for JS and Pyton people will be confusing as there complex objects are always copied by reference. + +#### Missing language features + +Before you start searching "how do I do X in Go?" I will save you the time and give you a list of features that are **not** available in go. + +- No ternary operator +- No optional/default function parameters +- No function overloading +- No generics +- No sum/union type + +So don't bother searching for them, they are not there. Which at first seems quite limiting, and after a week still feel the same. If you ask the Go community the overwhelming answer is that it's by choice to keep the language "lean" and don't bloat it with unnecessary syntax. I'll get back to this point later. + +#### Imports + +In Go you try to group code by functionality, which is quite common in programming languages. These are called "packages" and the import structure is similar to Java. Nothing out of the ordinary. A little gotcha: Go cannot resolve cyclic imports. All in all they work quite well. + +External dependencies have a native solution called _go modules_ and work as you would expect it. There is a descriptory file where all your dependencies are listed called `go.mod` and a lock file `go.sum`, no concerns here. + +#### Error handling + +One of the most obvious patterns in Go is the way errors are handled. Basically whenever a function can "throw" an error instead of _throwing_ and _catching_ in Go we return a nullable (`nil`) value and then check that. + +```go +package main + +import ( + "errors" + "fmt" +) + +func main() { + if result, err := divide(4, 2); err != nil { + fmt.Println("We have broken math") + } else { + fmt.Println("The result: ", result) + } +} + +func divide(x, y int) (int, error) { + if y == 0 { + return 0, errors.New("Cannot divide by 0") + } + return x / y, nil +} +``` + +This is definitely different to what I was used to, but I enforces error checking and I think it's actually not a stupid design concept. The only negative consequence of that is that you will write the following statement over and over and over and over again. Get's quite repetitive. + +```go +if err != nil { + return err +} +``` + +## Speed + +What go lacks in features it makes up in speed. There is no questioning the ease of use and the effective time to code something can be quite low. There will be repetitive tasks, but go makes it possible to move at incredible speed. There is very little holding you back. + +The compiler is super fast, which was one of the design goals of the language. Arguably that is not a difficult task to achieve though as the language has virtually no features a compiler needs to actually think about. + +## Tooling + +Tooling is one of the areas where Go really excels and I have yet to find a comparable language. Many things are opinionated, which I love. There is the default formatter, linter, compiler, etc. Everything simply works and has never stood in the way of coding and getting things done. It was a very refreshing experience, especially after coming from a Electron project where the whole bundling and rest was a real pain to deal with. + +#### Cross compilation + +Compiling for multiple targets is frankly to easy to be true. You simply pass two environment variables to the compiler and he does the rest. No matter if solaris, arm, mips, windows. It does it all just fine. + +```bash +GOOS=linux GOARCH=arm go build main.go +GOOS=darwin GOARCH=amd64 go build main.go +# ... +``` + +## What does it feel like to write GO? + +I have quite mixed feelings about Go. On one hand the tooling and speed really are compelling advantages. However the language omits too many features in favor of remaining as _lean_ as possible. Having to iterate an array manually just to check if it contains a given element feels really outdated and does not help readability. Also in go using constants is basically unheard of, making code harder to understand and review. Not having optional/default parameters for functions often leads to code duplication as it is way easier to copy paste than to write a "one fits all" function. This is mostly due to the unavailability of generics which make it impossible to write a general `includes(element)` function for arrays of slices for example. + +Then again I completely rewrote my CLI tool from scratch in about a week, including cross compiling for multiple platforms while never having touched Go before. That is quite something and not many compiled langauges could have done this. And after getting used to the (many) limitations of the language it's fun to code Go. diff --git a/src/content/blog/telegram-bots-are-easy.md b/src/content/blog/telegram-bots-are-easy.md new file mode 100644 index 0000000..9e18157 --- /dev/null +++ b/src/content/blog/telegram-bots-are-easy.md @@ -0,0 +1,319 @@ +--- +title: 'Telegram bots are easy' +date: '2019-06-24' +categories: + - 'coding' +tags: + - 'automatization' + - 'bot' + - 'python' + - 'telegram' +coverImage: './images/arseny-togulev-1513013-unsplash-scaled.jpg' +--- + +Recently I've been frustrated with mobile stock apps so I started thinking about solutions. a whole app would have been an unnecessary overkill, after all I just want to get market data about my stocks with some indicators to go along. A perfect use case for a telegram bot! + +Today we will have a look at how telegram bots are written and show some base concepts around the platform. We are going to leverage [python-telegram-bot](https://python-telegram-bot.org/) ([latest docs](https://python-telegram-bot.readthedocs.io/en/latest/)). + +#### What we will build today: + +1. A very simple bot that just replies a picture of a doggo whenever we send `/woof`. +2. A bot that has **persistence** and will save a list of items we can add. +3. (bonus round) Dockerize the bot for running it everywhere. + +
    + +![](images/arseny-togulev-1513013-unsplash-1024x576.jpg) + +
    + +Photo by [Arseny Togulev](https://unsplash.com/@tetrakiss?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/search/photos/robot?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +
    + +
    + +#### Here we go 🤖 + +The first thing we need is a bot. To register one you need to talk to the [@BotFather](https://telegram.me/BotFather) (with your normal telegram account). Then simply enter the `[/newbot](tg://bot_command?command=newbot)` command. You will be asked the name and the @handle for your bot. The handle need to end in `bot`. +After that he will answer with your access token. + +
    + +![](images/register-bot.jpg) + +
    + +Response after successful bot registration + +
    + +
    + +## How do bots work? + +
    + +![](images/IMG_0160-1024x436.jpeg) + +
    + +very badly drawn representation of the bot + +
    + +
    + +In its most simple form bots are simple programs that listen to _commands_ send by a user. The cannot initiate a conversation, a user must always message the bot first. After initial contact, the bot can send as many messages as he wants. + +Your code connects to the telegram servers and gets notified if new messages/commands have been sent. Then based on the user input your bot can reply with a message, audio, photo or use external services like sending a slack notification, whatever, there are no real limits. + +When the user firsts contacts a bot telegram automatically sends a `/start` command which you can use to initialise the bot. When a bot is deleted by a user the corresponding `/stop` command is issued. + +## Doggo Bot + +We are going to create a virtual environment for the project and install the dependencies. Our starting point will be the basic bot skeleton from which we will fill out the functionality. + +Note: we need version 12 of _python-telegram-bot_, as the API changed quite a bit in the previous releases. + +```bash +python3 -m venv env +source env/bin/activate +pip install python-telegram-bot==12.0.0b1 +``` + +```python +from telegram.ext import Updater, CommandHandler + +TOKEN = 'myTelegramBotToken' + +def main(): + updater = Updater(TOKEN, use_context=True) + dp = updater.dispatcher + + updater.start_polling() + updater.idle() + + +if __name__ == '__main__': + main() +``` + +Great, now lets write a function to respond to a simple `/ping` message. + +``` +// ... + +def pong(update, context): + update.message.reply_text('Pong') + + +def main(): + updater = Updater(TOKEN, use_context=True) + dp = updater.dispatcher + + dp.add_handler(CommandHandler('ping', pong)) + + updater.start_polling() + updater.idle() + +// ... +``` + +When we now send `/ping` to the bot we get a _Pong_ back. Neat! + +
    + +![](images/IMG_1709.jpeg) + +
    + +result of pong message + +
    + +
    + +#### But we want doggos! 🐶 + +```python +def get_image_url(): + allowed_extension = ['jpg', 'jpeg', 'png'] + while True: + url = requests.get('https://random.dog/woof.json').json()['url'] + file_extension = re.search("([^.]*)$", url).group(1).lower() + if file_extension in allowed_extension: + break + return url + + +def woof(update, context): + update.message.reply_photo(photo=get_image_url()) + + +def main(): + //... + + dp.add_handler(CommandHandler('ping', pong)) + dp.add_handler(CommandHandler('woof', woof)) + + //... +``` + +We define a second command that listens to the `woof` word. Then we have a little helper function that retrieves a url. That url is then passed to the `reply_photo` method and we are done! + +We could also pass a [bite-like](https://docs.python.org/3/glossary.html#term-bytes-like-object) object to the `photo` parameter instead of a string containing the url if we would have an actual photo. + +
    + +![](images/IMG_1710.jpeg) + +
    + +reply to woof + +
    + +
    + +## Persistence Bot + +The doggo bot is a good hello world example, but without persistence a lot of bots would not work. If you want to save something you will need to have some kind of **user base storage**. + +For this we will implement a little bot that saved a list of items that a user can add/delete. A bit like a shopping list if you want. + +#### Commands + +- Add `/add avocados` +- Delete `/delete avocados` +- List all `/all` +- Delete all `/clear` + +First the basic setup again. We will import `PicklePersistence` which uses the python _pickle_ object to save the data on your drive. We need to initialise it and pass it to the `Updater` class. + +```python +from telegram.ext import Updater, CommandHandler, CallbackContext, PicklePersistence +from telegram import Update + +TOKEN = 'myTelegramBotToken' + +persistence = PicklePersistence('./db') + + +def main(): + print('Started 🚀') + updater = Updater(TOKEN, use_context=True, persistence=persistence) + dp = updater.dispatcher + + updater.start_polling() + updater.idle() + + +if __name__ == '__main__': + main() +``` + +Before we beginn lets define 2 helper functions: + +```python +def get_list(context: CallbackContext) -> dict: + return context.user_data.setdefault('list', {}) +``` + +`get_list` will return the object that is unique to every user. The python library generously offers a `user_data` object inside of the `context` parameter that gets passed to each handler. We use `setdefault` in order to get the already present dict of the user or set it to an empty one if undefined. + +```python +def parse_command(update: Update) -> (str, str): + key, value = update.message.text.split(' ', 1) + return key, value +``` + +`parse_command` simply helps us interpret the message of the user. If a user sends us `/add avocado` we only want the _avocado_ part. We simply split at the first space. + +Lets finally add all the methods. + +```python +//... + +def get_list(context: CallbackContext) -> list: + return context.user_data.setdefault('list', []) + + +def parse_command(update: Update) -> (str, str): + key, value = update.message.text.split(' ', 1) + return key, value + + +def list_add(update: Update, context: CallbackContext): + key, value = parse_command(update) + get_list(context).append(value) + update.message.reply_text('Saved 💾') + + +def list_delete(update: Update, context: CallbackContext): + key, value = parse_command(update) + get_list(context).remove(value) + update.message.reply_text('Deleted 🗑') + + +def list_all(update: Update, context: CallbackContext): + items = get_list(context) + update.message.reply_text('\n'.join(items) if len(items) > 0 else 'List empty 😢') + + +def list_clear(update: Update, context: CallbackContext): + get_list(context).clear() + update.message.reply_text('Cleared 🧼') + + +def main(): + //... + + dp.add_handler(CommandHandler('add', list_add)) + dp.add_handler(CommandHandler('delete', list_delete)) + dp.add_handler(CommandHandler('all', list_all)) + dp.add_handler(CommandHandler('clear', list_clear)) + + //... +``` + +![](images/IMG_1711-653x1024.jpeg) + +I believe telegram bots can be a great alternative if a full fledged app is an overkill. There are a lot of featured that where not mentioned here, especially custom keyboards. + +## Dockerize it + +``` +# requirements.txt + +python-telegram-bot==12.0.0b1 +``` + +```Dockerfile +# Dockerfile + +FROM python:3.7-slim +WORKDIR /app + +COPY requirements.txt . +RUN pip install -r requirements.txt && rm -rf /root/.cache + +COPY src . +CMD ["python", "-u", "/app/Mercatus.py"] +``` + +```yaml +# docker-compose.yml + +version: '3.6' + +services: + bot: + build: . + restart: unless-stopped + command: ['python', '-u', '/app/Mercatus.py'] + volumes: + - ./data.db:/app/data.db +``` + +Thats it! I hope you enjoyed the guide. 👋 diff --git a/src/content/blog/the-essential-no-excuses-security-checklist-for-modern-websites.md b/src/content/blog/the-essential-no-excuses-security-checklist-for-modern-websites.md new file mode 100644 index 0000000..fa9a3ea --- /dev/null +++ b/src/content/blog/the-essential-no-excuses-security-checklist-for-modern-websites.md @@ -0,0 +1,226 @@ +--- +title: 'The essential no-excuses security checklist for modern websites.' +date: '2019-09-16' +categories: + - 'security' +tags: + - 'headers' + - 'security' +coverImage: './images/milkovi-kYlYwQze5vI-unsplash-1-scaled.jpg' +--- + +The web and its security has come a long way. As always in security there are constantly ways to improve your defences agains bad actors. This is a list of quick and easy, yet powerful tools that all devs should be using. + +**Update** _18 Sep 2019 @ 16:02_ +As the reddit user [zfa](https://www.reddit.com/user/zfa/) suggested I included the link to the Mozilla Observatory for automatic auditing. + +1. Checklist + 1. [HTTPS](#https) + 2. [TLS Versions](#tls) + 3. [Ciphers](#ciphers) + 4. [HSTS](#hsts) + 5. [CSP](#csp) + 6. [X-Frame-Options](#frame) + 7. [X-Content-Type-Options](#content-type) +2. [Useful Libraries & Tools](#libraries) +3. [Considerations](#considerations) + 1. [Cookies or LocalStorage for JWTs?](#jwt) + 2. [Advanced HTTPS practices](#advanced) +4. [Sources](#sources) + +
    + +![](images/milkovi-kYlYwQze5vI-unsplash-1-scaled.jpg) + +
    + +Photo by [MILKOVÍ](https://unsplash.com/@milkovi?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +
    + +
    + +## 1\. HTTPS + +Let's start with the most obvious. It's almost 2020 and websites not using HTTPS are simply being irresponsible. There is no reason to run plaintext http in the era of [Letsencrypt](https://letsencrypt.org/) where getting a certificate is **easy and free**. I won't go over how to configure that, there are tons of resources out there and generally its as simple as adding a line in your config file. +Also redirect all the http traffic to https automatically, basic stuff. + +## 2\. TLS Versions + +[97.65% of global users](https://caniuse.com/#feat=tls1-1) support TLS version 1.2, so go disable anything below that in your server as it has knows vulnerabilities! + +**Configuration** + +``` +# Nginx +ssl_protocols TLSv1.2; +``` + +``` +# Apache +SSLProtocol -all +TLSv1.2 +``` + +``` +# Traefik +[entryPoints] + [entryPoints.https] + [entryPoints.https.tls] + minVersion = "VersionTLS12" +``` + +## 3\. Ciphers + +Similar to the TLS version you should avoid using anything different than AES or ChaCha20. Limit the ciphers to something secure and modern. + +**Configuration** + +``` +# Nginx +ssl_prefer_server_ciphers on; +ssl_ciphers +'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256'; +``` + +``` +# Apache +SSLCipherSuite +ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256 +SSLHonorCipherOrder on +SSLCompression off +SSLSessionTickets off +``` + +``` +# Traefik +[entryPoints] + [entryPoints.https] + [entryPoints.https.tls] + cipherSuites = [ + "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", + "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", + "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305", + "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", + "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", + "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305", + ] +``` + +## 4\. HSTS + +Once your website runs on HTTPS it's a good idea to tell the browser not to use HTTP anymore. Thats what the HTTP Strict Transport Security (HSTS) is designed for. + +``` +Strict-Transport-Security: max-age=31536000; includeSubDomains +``` + +This basically tells the browser to only talk to your domain via HTTPS for the next year. You can exclude the `includeSubDomains` if you want to just target your root. + +**Configuration** + +``` +# Nginx +add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; +``` + +``` +# Apache +Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" +``` + +## 5\. Content Security Policy (CSP) + +This awesome HTTP header is incredibly powerful! It allows you to specify the allowed origins for all kind of files that will be loaded into your website. + +The basic idea is: "_Javascript can only be loaded from my domain, images only from the unsplash domain and fonts only are only allowed from google fonts"._ + +Awesome right? The header for that example would look like this: + +``` +Content-Security-Policy: "default-src 'self'; img-src https://unsplash.com/; font-src https://fonts.googleapis.com" +``` + +This allows a dev to specify exactly what resources are allowed to load from what domains. Don't worry, you don't need to remember the exact syntax**:** +**Use the generator**: [https://www.cspisawesome.com/](https://www.cspisawesome.com/) + +## 6\. X-Frame-Options + +This is a basic one, but it should not be forgotten. It prevents your website to be displayed inside another one. This prevents shit tons of possible attack vectors. Simply set the header and you're done. + +``` +x-frame-options: SAMEORIGIN +``` + +**Configuration** + +``` +# Nginx +add_header x-frame-options "SAMEORIGIN" always; +``` + +``` +# Apache +header always set x-frame-options "SAMEORIGIN" +``` + +## 7\. X-Content-Type-Options + +Again, a little header that prevents lots of damage. By setting the Content Type header you prevent the browser from guessing what file contents a downloaded resource is. Basically if `/image.jpeg` is actually a `.js` file the browser would still run it if you don't set the header + +``` +x-content-type-options: nosniff +``` + +**Configuration** + +``` +# Nginx +add_header x-content-type-options "nosniff" always; +``` + +``` +# Apache +header always set x-content-type-options "nosniff" +``` + +## Libraries & Tools + +#### Tools + +For some automatic auditing of your website you can use the excellent [Mozilla Observatory](https://observatory.mozilla.org/) tool. You can scan a domain and receive information on Header & TLS. + +#### Libraries + +For a lot of this headers there are some good libraries for automating this which already have good default values, so most of them are plug and play. + +
    Express (Node)helmet
    ASP.NETNWebsec
    Django (Python)django-csp
    Dropwizard (Java)dropwizard-web-security
    Flask (Python)Talisman
    Gosecuresecureheader
    Hapi (Node)blankie
    Koa (Node)koa-helmet
    PHPSecure Headers
    Ruby (and Rails)Secure Headersrack-secure_headers
    + +## Considerations + +I did not talk about the XSS header, since it's not supported at all in Firefox and Chromium will remove it in the near future, so I think it gives a false sense of security to devs not being vulnerable to XSS if they set the header. + +Also I did not touch on the new Feature Policy header wich is currently being drafted. It's very cool and will help a lot in the future. It allows websites to specify what features should be allowed to run, so e.g. if my site does not need the accelerometer just turn it off. That way no 3rd party code is able to access it. Very nice addition, but at the time of writing it's still very alpha and basically not supported. + +### Where to store JWTs? + +Most websites nowadays make use of JWTs for the authentication. A common question people have is: Where do I store my token? Cookies or LocalStorage? **TLDR: LocalStorage.** + +The general knowledge is that LocalStorage is not vulnerable to CRFS and Cookies not to XSS. However as the reddit user [Devstackr](https://www.reddit.com/user/Devstackr/) described [here](https://www.reddit.com/r/reactjs/comments/cubfsa/local_storage_vs_cookies_authentication_tokens/) if you have a XSS vulnerability also your authentication via cookie is compromised, as the injected code can do requests on behalf of the authenticated user. + +So while your token cannot be directly stolen from the victim, the attacker can still do everything, including changing the password for example. Additionally you don't need to worry about CRFS at all, which is a huge bonus. + +### Advanced Practices + +Large websites should additionally consider the following security features: + +- Certificate Authority Authorization (CAA) DNS record which specifies what CA is allowed to sign certificates for the served domain. +- HTTP Public Key Pinning (HPKP) provides the option to validate the certificate via DNS record. If misconfigured this can break you entire site, so use carefully! + +## Sources / Further reading + +- [https://www.keycdn.com/blog/http-security-headers](https://www.keycdn.com/blog/http-security-headers) +- [https://www.youtube.com/watch?v=-DNNlBYIyxQ](https://www.youtube.com/watch?v=-DNNlBYIyxQ) +- [https://helmetjs.github.io/](https://helmetjs.github.io/) +- [https://www.acunetix.com/blog/articles/tls-ssl-cipher-hardening/](https://www.acunetix.com/blog/articles/tls-ssl-cipher-hardening/) +- [https://www.cspisawesome.com/](https://www.cspisawesome.com/) +- [https://observatory.mozilla.org/](https://observatory.mozilla.org/) diff --git a/src/content/blog/the-powerful-es6-proxy-object.md b/src/content/blog/the-powerful-es6-proxy-object.md new file mode 100644 index 0000000..f1fdc20 --- /dev/null +++ b/src/content/blog/the-powerful-es6-proxy-object.md @@ -0,0 +1,117 @@ +--- +title: 'The powerful ES6 proxy object' +date: '2019-05-31' +categories: + - 'coding' +tags: + - 'es6' + - 'javascript' + - 'proxy' +coverImage: './images/alina-grubnyak-1254785-unsplash-scaled.jpg' +--- + +Today: yet another ES6 feature that I think most people don't know about. + +> "The **Proxy** object is used to define custom behavior for fundamental operations (e.g. property lookup, assignment, enumeration, function invocation, etc)." +> +> [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy) + +
    + +![](images/alina-grubnyak-1254785-unsplash-1024x683.jpg) + +
    + +Photo by [Alina Grubnyak](https://unsplash.com/@alinnnaaaa?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +
    + +
    + +Let's dive right in! 🏄‍♂️ + +#### Basic example: + +```tsx +const handler = { + get: (obj, key) => (key in obj ? obj[key] : 42), +} + +const proxy = new Proxy({ a: 1 }, handler) + +console.log(proxy.a, proxy.b) // 1 42 +``` + +We start with a plain object `{a: 1}` and we assign it a handler. Our handler intercepts the `get` statement of a normal object and we can define our own custom logic for it. In this case we return the value if it exists, otherwise a 42. + +We can se that calling `proxy.b` will output the 42, as it is not set in the root object. + +## The handler + +The second argument of the Proxy function is what is called the **handler**. This is simply an object with functions that define the logic of the operations, which are called **traps** (as they get triggered). The available traps are as follows: + +- get +- set +- has +- deleteProperty +- ownKeys +- apply +- construct + +There are a few more, but these are the basic ones. Here is the [full list](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy#Methods_of_the_handler_object). + +#### Some practical examples + +```tsx +var handler = { + set: (obj, key, value) => { + if (key === 'wheels') + if (!Number.isInteger(value) || value % 2 !== 0) throw new Error('Wheels need to come in pairs') + obj[key] = value + }, +} + +// 🚗 +var car = new Proxy({}, handler) + +car.wheels = 4 +car.wheels = 3 // Throws an error +``` + +Here we can see that we can define constrains for the setter. In this case we say that the key `wheels` needs to be and integer and a multiple of 2. This is a trivial example, but we can imagine how useful this can be with forms. + +```tsx +const validators = { + username: /^[A-z]{3,}$/, + password: /(?=.*[\d]).{8,}/, +} + +const handler = { + set: (obj, key, value) => { + if (key in validators && validators[key].test(value)) obj[key] = value + else throw new Error('Invalid input') + }, +} + +const form = new Proxy({}, handler) + +form.username = 'abc' +form.username = 'this contains spaces' // -> Error + +form.password = 'atleast1digit' +form.password = 'withoutanydigitthiswillthrowanerror' // -> Error + +form.something = true // -> Error, since it does not exist in the validator object +``` + +In this example we can validate an object from a form for example. We have a validator object that contains some regex. The Proxy then only allows keys that are inside of the validator and only if they pass the corresponding regex. Vary handy 👌 + +## In real life + +This only available in ES6 (ES2015) but ~92% of the browsers [support it](https://caniuse.com/#feat=proxy). Some real life applications that make use of this are [MobX](https://github.com/mobxjs/mobx) (since v5.0). + +In MobX this allows the developer to skip the tedious `mapStateToProps` and `mapDispatchToProps` and just let MobX handle it. Since with the help of proxies MobX can know what parts of the state are being used by listening on the `get` trap of the state and can then only render the components when the props they are using in the `render()` function are being used. + +There a small package that does the same for the redux world: [https://github.com/dai-shi/reactive-react-redux](https://github.com/dai-shi/reactive-react-redux) + +I hope this helped and was interesting! 👋 diff --git a/src/content/blog/use-traefik-and-regexp-to-bypass-adblockers.md b/src/content/blog/use-traefik-and-regexp-to-bypass-adblockers.md new file mode 100644 index 0000000..4afb9ad --- /dev/null +++ b/src/content/blog/use-traefik-and-regexp-to-bypass-adblockers.md @@ -0,0 +1,87 @@ +--- +title: 'Use Traefik and RegExp to bypass AdBlockers' +date: '2022-01-10' +categories: + - 'general' + - 'security' +tags: + - 'ad-blocker' + - 'tracking' + - 'traefik' + - 'umami' +--- + +**This will be a controversial one, so let me explain the motivations first.** + +I was using Matomo for collecting traffic metrics on different websites, however it's kind of bloated for what I need to do. My goal is to get a grasp on viewership, **without collecting personal data** or any fancy analytics. I wanted to try out Umami as it seems simple and is privacy respecting first (including GDPR), without the need to tweak settings. + +The problem was that my AdBlocker was not letting request through and since most of the people visiting this site will probably devs they surely have some AdBlocker installed. + +**FYI**: All the data collected on this site are accessible and visible to anyone [here](https://spectare.nicco.io/share/Xklie3UU/Nicco). + +
    + +![](images/hyeryi-sVk8nrCQ06g-unsplash-1024x683.jpg) + +
    + +Photo by [逸 韩](https://unsplash.com/@hyeryi?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/s/photos/intersection?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +
    + +
    + +## The issue + +Lets have a look at the typical Umami code: + +```html + +``` + +The problem is that most block list have `umami.js` on it, which make measuring anonymous traffic impossible. Now blocklists are very static (for performance reasons) and therefore quite easy to circumnavigate. + +## Rerouting + +What do you do when the street you are driving on is blocker? You take the detour. + +The solution is not to use `umami.js` directly, but redirect it form another name. With traefik this is very easy using the [ReplacePathRegex middleware](https://doc.traefik.io/traefik/v2.0/middlewares/replacepathregex/). Let's see how: + +```yaml +version: '3.8' + +networks: + proxy: + external: true + +services: + umami: + image: ghcr.io/mikecao/umami:postgresql-latest + networks: + - default + - proxy + labels: + - traefik.enable=true + - traefik.http.routers.umami.rule=Host(`spectare.nicco.io`) + - traefik.http.routers.umami.entrypoints=secure + - traefik.http.routers.umami.tls.certresolver=le + - traefik.http.routers.umami.middlewares=umami-rewrite + - traefik.http.middlewares.umami-rewrite.replacepathregex.regex=/unicorn.js + - traefik.http.middlewares.umami-rewrite.replacepathregex.replacement=/umami.js + + db: + image: postgres:12-alpine + ... +``` + +We need to configure the `regex` and `replacement` parameters for the `replacepathregex` middleware. In my case I chose to use `/unicorn.js` and redirect it internally to `/umami.js`. This way the internal service is doing business as usual while ad blockers do not block the request. + +## Responsibility + +As you can imagine this would enable far more nefarious use cases. You could also mask it as something like `23hf872.min.js` or whatever. So use with caution and **always keep in mind your users privacy and data!** diff --git a/src/content/blog/why-i-love-js-but-sometimes-i-feel-we-shoot-ourself-in-the-foot.md b/src/content/blog/why-i-love-js-but-sometimes-i-feel-we-shoot-ourself-in-the-foot.md new file mode 100644 index 0000000..092d154 --- /dev/null +++ b/src/content/blog/why-i-love-js-but-sometimes-i-feel-we-shoot-ourself-in-the-foot.md @@ -0,0 +1,36 @@ +--- +title: "Why I love JS but sometimes I feel we shoot ourself in the foot." +date: "2020-05-29" +categories: + - "general" +--- + +Let's start by saying this: I absolutely love JS & Typescript, they are my favourite languages and I would not want to live without them. + +Now that being said, whenever I look at Go or Python for example the quality of packages cannot be compared. This is I feel the biggest weakness of the JS ecosystem and is frustrating because it could be so much better. + +## Quality vs Quantity + +Basically this is my main problem with the ecosystem. Whenever we look at other languages generally speaking there is one, maybe two packages for each use case they are trying to solve. And there is a consensus inside of that coding community what the preferred tools should be. + +In the NPM world there are always what feels like never ending alternatives that try to solve the same problems over and over again. + +So an economist might think: "Why is this bad? Competition is always good as it leads to innovation when compared to a monopoly". While this is true in a market I feel it does not reflect perfectly in the world of NPM and open source projects where anyone can contribute and influence decisions and directions taken by a specific piece of software/package. + +What is the consequence of this? Many abandoned, half-finished packages that need to be rewritten every now and then only to be left unmaintained again. Let the cycle repeat itself... + +## Bundle work! Not disperse it + +What if instead of reinventing the wheel over and over again we tune the wheel we have so that it becomes the best, most versatile wheel for everyone. Fragmentation is always a huge amount of work and leads to half-backed projects that always have some downsides. From that downside a new project is born and again, the cycle continues. + +## It's confusing for everyone and especially for beginners + +Ok so lets say I need to do some API calls in my node server. Of course I'm not going to use the native API because it's low level and not very readable. So what do I choose? Do I install `axios` or `node-fetch`, maybe `request`? What about `isomorphic-fetch`? Or `superagent`? + +This is a perfect example of the issue. They all try to solve the same very basic thing, in 5 different ways. Why cannot we have 1 or maybe 2? What if we could simply have the de facto library that does it all? + +Some time ago a friend coming from Python asked me that question and I could not give him an answer. He was visibly confused. In python there is no discussion really: you install `requests` and it will support 99.9% of use cases anyone will ever have. And if something is missing it will be added. Simple. + +Same thing with bundlers. `webpack`, `parcel`, `rollup` and now `snowpack`. Why?! Don't get me wrong, I'm sure all of them have some incredible smart engineering behind it, but what is the need of splitting the knowledge and not combine it to make something greater? + +I would just wish that JS people could start to converge on some best practices to ease the life of everyone developing in this ecosystem. diff --git a/src/content/blog/why-i-think-svelte-is-the-next-big-thing-a-reacts-lover-view.md b/src/content/blog/why-i-think-svelte-is-the-next-big-thing-a-reacts-lover-view.md new file mode 100644 index 0000000..13bd157 --- /dev/null +++ b/src/content/blog/why-i-think-svelte-is-the-next-big-thing-a-reacts-lover-view.md @@ -0,0 +1,192 @@ +--- +title: 'Why I think svelte is the next big thing: a reacts lover view' +date: '2020-10-29' +categories: + - 'coding' +tags: + - 'react' + - 'svelte' +coverImage: './images/alessandra-caretto-cAY9X4rPG3g-unsplash.jpg' +--- + +The first thing I thought when I heard there is this new framework called "Svelte" was: F\*\*\* no, please, not again. Why? Why do we need yet another framework ffs. React is amazing, don't try to reinvent the wheel. + +I was so wrong... + +So maybe one of you is thinking the same thing. Why [Svelte](https://svelte.dev/)? What is all the fuzz about? Well.... let me tell you 🙂 + +This is not a tutorial, for that check the amazing [official tutorial](https://svelte.dev/tutorial/basics) which teaches you everything from the basics to more advanced stuff. + +
    + +![](images/alessandra-caretto-cAY9X4rPG3g-unsplash.jpg) + +
    + +Photo by [Alessandra Caretto](https://unsplash.com/@alessandracaretto?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/s/photos/wheel?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +
    + +
    + +Why is there a wheel? Well quite simply: Svelte IS reinventing the wheel. +You see: what are most of the frameworks doing nowadays? They provide a way to code user interfaces with a component approach. This makes a lot of sense because we can reuse them, they are boxed items that stand for them self. Modularizing and splitting up concerns make big apps easier to write and afterwards maintain. + +What sets Svelte apart from a tecnical standpoint ist that it's foremost a compiler as opposed to a runtime like React or Vue. What does it mean? It means that all the reactivity is done at compile time and not in the browser. Svelte knows before hand what property can change and what doesn't. That's very powerful. + +## Easy of use and simplicity + +This in my opinion might be the biggest driver for svelte. The [official tutorial](https://svelte.dev/tutorial/basics) is great and well thought out. What stood out to me was how easy it was for non web people I know to get up and running in the matter of a day. +Simplicity is really hard however Svelte abtracts everything you need away and breaks it down to simple `html`, `js` and `css`. The learning curve is... well more like a flat line you just need to step on. + +## Taking the fun back to the web + +Personally the greatest feat Svelte achieves is staing out of the way while supporting you, the developer in everything you need to do. It is never in the way, it always makes your life easier. + +### Vue and React had a child + +It is very clear that Svelte was inspired by both React and Vue picking the best features of both worlds. This is probably why Svelte is so amazing. It has the luxury to build on years of experience of what works, and what does not. + +Inspired by React: + +- Components are JS Objects + +Inspired by Vue: + +- 2 Way binding +- Syling +- Making ecosystem first party +- Single file components + +Moslty "Unique" features: + +- Class toggles +- Stores + +## Styling + +Styling in react sucks. There is no way around it. In Vue that problem is solved by simply having scoped css built-in. No need for preprocessors, since we have CSS Variables and namespacing is no longer an issue. + +```svelte + + + + +

    {title}

    + +

    + Virtues sexuality philosophy law chaos society evil strong self christianity sexuality truth. Revaluation convictions decrepit snare passion oneself decieve oneself. Right suicide grandeur fearful play. Right joy merciful transvaluation good truth derive evil contradict intentions. Self salvation faithful disgust marvelous transvaluation aversion. +

    + +Generate more! +``` + +No need to worry that our styles will affect some other stuff and we don't need to pass around classNames from other files. + +## Single File Components + +`.svelte` files are just like `.vue` files and they contain everything: code (`js`/`ts`), markup (`html`) and styling (`css`). No need to separate files for styling which bloats every React project that does not want to rely on css-in-js which in my opinion is just garbage. + +## 2 way binding + +This alone will save you tons of time and makes implementing stuff more intuitive and fun. + +```svelte + + + + +``` + +Yes, it will sync the UI to the variables, but both ways. In react you need to either use some 3rd party lib or juggle `value` and `onChange` events. + +This also works for parent - child props, so no need to write verbose update functions to be called from the children. Everyone hates those. + +## Stores + +So I truly hate Redux. It is the reason I've quit companies and unfortunately it is the way to go in react. In svelte we have build it stores and they are simply put: amazingly powerful and easy. + +```svelte +// store/todos.js +import { writable } from 'svelte/store' +import axios from 'axios' + +export const data = writable([]) + +export async function load() { + const { data: d } = await axios({ + method: 'get', + url: '/api/todos/', + }) + data.set(d) +} +``` + +```svelte + + +{#each $data as todo} + +{/each} +``` + +With a simple `$` in front of a store svelte will update the UI according to the store content. And we simply update it. No complex bootstrapping with context, dispatcher, acitons and so on. + +## Class toggles + +This is a feature I use all the time and it is just so useful. You can basically bind a value to toggle a css class, in this case `done`. No need to to string magic or, again, import some 3rd party module to manage our class names. + +```svelte + + + + +
    + Some task +
    +``` + +## First party support + +Another thing that I cannot stand in React and Svelte does right in my opinion is that in the react world everything is basically up to the community. Even the typing! That means that while there is more choice in theory, in practise it leads to a fragmented unmaintained ecosystem. + +The Svelte is not afraid of incorporating tools from the community into the officials repos. I strongly believe that it is in everybodies interest that tooling and core functionality should always be first party code. Much like Vue does it. + +## Concluding thoughts + +First of all lets all thank Rich Harris which is the creator of Svelte. diff --git a/src/content/blog/write-cross-browser-extensions-without-the-tears.md b/src/content/blog/write-cross-browser-extensions-without-the-tears.md new file mode 100644 index 0000000..2b1401d --- /dev/null +++ b/src/content/blog/write-cross-browser-extensions-without-the-tears.md @@ -0,0 +1,211 @@ +--- +title: 'Write cross browser extensions without the tears' +date: '2021-12-28' +categories: + - 'coding' +tags: + - 'web-extension' +coverImage: './images/markus-spiske-8CWoXxaqGrs-unsplash-scaled.jpg' +--- + +Today I want to cover the process of developing browser extensions, from start to finish and submission to the chrome and firefox stores. +According to Apple the new Safari will have better support for extensions, but as for now (Dec. 2021) this is not the case so we will focus on Firefox and Chromium based browsers. + +This guide and the examples will be based on [Ora](https://github.com/cupcakearmy/ora), a web extension I wrote for both Firefox and Chrome. + +We will not touch on the [controversial](https://www.eff.org/deeplinks/2021/12/chrome-users-beware-manifest-v3-deceitful-and-threatening) manifest version 3. We'll stick to version 2. + +
    + +![](images/markus-spiske-8CWoXxaqGrs-unsplash-1024x683.jpg) + +
    + +Photo by [Markus Spiske](https://unsplash.com/@markusspiske?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/s/photos/lego?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +
    + +
    + +## The Basics + +Let's dive right in! A browser extensions is basically a series of small "websites". Logic is written in Javascript, styled in CSS, etc. This also means that we can use Vanilla JS, React, Svelte, whatever you prefer. + +There are mainly 3 types of content you need to know. + +1. **Content scripts** + These are files that you will be injected into existing tabs of the user. This can be `CSS` or `JS` files. They live on a tab level. +2. **Background scripts** + Here we have files that will run in the background, in a separate thread. They are not bound to any tab/window and have basically the same runtime as the browser itself. These are only `JS` scripts. +3. **Normal websites for your extension** + As we will se later, files inside your extensions will be served as if it was a server, so here you will code you settings page, dashboard and everything else. These are `HTML`, `CSS`, `JS`, images, etc. You name it. + Often this will be an options page, or a dashboard. + +Almost everything I learned about browser extensions I learned from the [MDN Docs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions), they are amazing! If you are stuck this should be the first point to look. + +## The Manifest + +The first thing you'll need to know is a file called `manifest.json`. +Here you will define all the contents, permissions, icons, name, etc. It's the entry point to your app. It's where your high level configuration lives. + +```json +{ + "manifest_version": 2, + "name": "Ora", + "version": "0.8.1", + "description": "See how much time you spend on each website and set limits" +} +``` + +## Icons + +Every extensions has an icon. They are defined in the `manifest.json`. + +`[icons](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/icons)` is for the general icon, in the settings menu e.g. +`[browser_action](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/browser_action)` is for the icon you'll see in the browser interface. Optionally you can specify `theme_icons` for dark mode support. + +As a general rule you can always specify different sizes, but in my experience the easiest method is to just use a good high res (256 or 512px) png. SVGs support is quite hit or miss, would not recommend it. + +Here I chose the same 512px png for both the extension and the interface. + +```json +{ + "manifest_version": 2, + ... + "icons": { + "512": "icons/watch.png" + }, + "browser_action": { + "default_icon": { + "512": "icons/watch.png" + }, + "default_title": "Ora Dashboard", + "theme_icons": [ + { + "light": "./icons/watch.png", + "dark": "./icons/watch-alt.png", + "size": 512 + } + ] + } +} +``` + +## Permission + +Browser extensions are really powerful, but need to request permissions to unlock that power. Most of them you'll find on your way but the most common are `` for injecting scripts/styles into every page. another common one would be `tabs` to be able to get information on all tabs. + +Try to keep permissions to the minimum possible and not request stuff you don't need. Permissions are listed when installing the extensions all at once, unlike on a phone where there is a prompt. + +For ora I needed `` to inject scripts to block a website when the time limit was reached, `tabs` to count the time spent on websites and `unlimitedStorage` & `storage` for saving all that data. + +```json +{ + "manifest_version": 2, + ... + "permissions": ["", "tabs", "unlimitedStorage", "storage"] +} +``` + +## Toolchain + +We all hate it, bundlers, framework setup, etc. I will try to give you the most basic, painless setup. And by far that is a setup using `[parcel.js](https://parceljs.org/)`. + +They have official [support for browser extensions](https://parceljs.org/recipes/web-extension/)! And it works really well. +I would write some little guide, but TBH it would just duplicate their docs so I will just point you to the [official documentation](https://parceljs.org/recipes/web-extension/) which explains the steps perfectly. + +The cool thing about parcel is that we use the `manifest.json` as entry point and just point to the sources we want to use inside of that. Parcel does the rest of the magic. + +```json +{ + "manifest_version": 2, + ... + "background": { + "scripts": ["./src/background/index.ts"] + }, + "content_scripts": [ + { + "matches": [""], + "run_at": "document_start", + "js": ["./src/content/index.ts"] + } + ] +} +``` + +As you can see above we just use `ts` typescript files in our manifest and parcel will compile them for us. And those typescript files can include React, Svelte, whatever framework and it will just work. Amazing 😍 + +For svelte you'll need to add the [typescript transformer](https://github.com/orlov-vo/parcel-transformer-svelte). React works out of the box. + +## Cross browser support without tears + +For this we need to thank the good folks over at Mozilla. They created [webextension-polyfill](https://github.com/mozilla/webextension-polyfill). + +```ts +import browser from 'webextension-polyfill' + +const tabs = await browser.tabs.query({ active: true }) +``` + +Just like that you will have code that will work in both Chrome and Firefox 99% of the time. This can be used in background scripts, client scripts and standalone pages. + +## Building + +```json +{ + ... + "scripts": { + "dev": "parcel watch --target dev --no-hmr ./manifest.json", + "build": "parcel build --target prod ./manifest.json", + "dist": "run-s clean build pack:*", + "pack:zip": "zip -r ./ora.zip dist/prod/*", + "pack:ff": "web-ext build -s dist/prod --overwrite-dest" + }, + "targets": { + "dev": { + "sourceMap": { + "inline": true, + "inlineSources": true + } + }, + "prod": {} + }, +} +``` + +This is the `package.json` of Ora. How is the extension built? + +1. Parcel bundler builds the raw web files, copies images, etc to the `./dist/prod` folder. +2. For Chrome we only need to zip it with `zip -r ./ora.zip dist/prod/*`. +3. For Firefox we use the mozilla own `[web-ext](https://github.com/mozilla/web-ext/)` tool with `web-ext build -s dist/prod --overwrite-dest`. + This results into a `web-ext-artifacts/ota-0.8.1.zip` file. + +## Distributing + +Now you can upload the normal zip file to the chrome web store after paying a one time 5$ fee and the web ext artefact to the mozilla add-on page. + +Mozilla also requires for minified apps (which this one is) to also submit sources. Just zip the source code (without node_modules) and upload them along the minified one. + +## Common use cases + +I also want to add a few notes on common use cases that every extensions uses. + +### Communication between content, background and other scripts. + +The `[postMessage](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage)` API is the way to go. It's basically like IPC in the sense that you can send any serializable content from and to any of your scripts while listening for an answer. + +### Storage / Persistence + +Here you have a lot of options. The easiest way that works for most cases is using the `[storage](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage)` API. Here you get access to `local` and `sync` storage interfaces. `local` is.. well local and `sync` is synced between browsers if the user is logged in. Choose whatever suits you best. + +Another options, which is more powerful for more complex and data hungry is using something like `[Dexie.js](https://dexie.org/)` on top of IndexedDB. This is a full NoSQL kind of local database. A good options for data intensive extensions. + +### Shortcuts + +You can easily add keyboard shortcuts to your browser extension with the `[commands](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/commands)` entry in the `manifest.json`. This has the added benefit that browsers provide an interface where users can customize them. + +A little exception for opening the popup with a keyboard shortcut can be achieved with the `_execute_browser_action` command. + +## Final thoughts + +A browser extension is very fun project for a free Sunday and I'd recommend everyone to try it out, it's easier than you might think! diff --git a/src/content/blog/write-your-own-drone-plugin-from-scratch.md b/src/content/blog/write-your-own-drone-plugin-from-scratch.md new file mode 100644 index 0000000..a6cddce --- /dev/null +++ b/src/content/blog/write-your-own-drone-plugin-from-scratch.md @@ -0,0 +1,169 @@ +--- +title: 'Write your own drone plugin from scratch' +date: '2019-05-25' +categories: + - 'coding' +tags: + - 'cd' + - 'drone' + - 'guide' + - 'plugin' + - 'python' +coverImage: './images/asoggetti-418839-unsplash-scaled.jpg' +--- + +Recently Drone released it 1.0 version update. It came with a cleaner and more useful UI and a new structure for declaring the YAML drone pipelines files. Perfect time for writing our own drone plugin. 🎉 + +**TL;DR** Get the code: [https://github.com/CupCakeArmy/drone-deploy](https://github.com/CupCakeArmy/drone-deploy) + +
    + +![](images/asoggetti-418839-unsplash-1024x684.jpg) + +
    + +Photo by [asoggetti](https://unsplash.com/photos/rSFxBGpnluw?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/search/photos/drone?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) + +
    + +
    + +This should be a starting point to guide you in the right direction towards writing your first drone plugin. **It's easier than it might seems**. Let's go 🚀 + +#### What do we want to achieve? + +- Login with an ssh key from drone secrets +- copy files to a remote location +- execute remote commands + +## How are Drone Plugins written? + +Very simple actually: **drone plugins are nothing more than a docker image**. The process is as follows: + +1. The code gets mounted inside your image at \`/drone/src\` +2. You make slack api calls, deploy, whatever you want. + +Since the source is mounted inside a container you can use **whatever language you prefer**! Cool. For this small project I decided to go with Python, but you could use node, go, whatever runs inside Docker. + +First lets look how a plugin is defined inside the `.drone.yml` file. + +```yaml +kind: pipeline +name: default + +steps: + # build... + + - name: deploy + image: you/your-drone-plugin # public docker image + settings: + host: example.org + user: root + password: h4x0rz +``` + +**How do we get those variables?** Drone mounts them as environment variables inside the plugin container prefixed by `PLUGIN_`. +So `host: example.org` becomes `$PLUGIN_HOST=example.org` and so forth. + +###### In Python + +```python +def main(): + host = os.environ.get('PLUGIN_HOST') + port = os.environ.get('PLUGIN_PORT', 22) + user = os.environ.get('PLUGIN_USER') + password = os.environ.get('PLUGIN_PASSWORD') + key = os.environ.get('PLUGIN_KEY') + +main() +# example.org +# 22 +# root +# h4x0rz +# None +``` + +**How do I get secrets?** We need to use the `from_secret` syntax. Supposing you have saved your private key as a repository secret under `ssh_key` the example would look as follows: + +```yaml +- name: deploy + settings: + key: + from_secret: ssh_key +``` + +Easy 👌**What about arrays**? We want to copy a list of sources to the server. + +```yaml +- name: deploy + settings: + sources: + - ./public + - docker-compose.yml +``` + +This will result into `PLUGIN_SOURCES=./public,docker-compose.yml`. Basically we get a comma-separated-string. + +```yaml +# Takes a string, splits it at the comma and removes empty elements +def clean_array(s: str) -> List[str]: + return list(filter(None, s.split(','))) + +sources = clean_array(os.environ.get('PLUGIN_SOURCES', '')) +``` + +## Putting it all together + +```python +import paramiko + +def execute(c: SSHClient, cmd: str, path: str = None, env:dict = None) -> str: + if path is not None: + cmd = 'cd {}; {}'.format(path, cmd) + stdin, stdout, stderr = c.exec_command(cmd, environment=env) + return stdout.read().decode('utf-8').strip() + + +def main(): + + # Takes a string, splits it at the comma and removes empty elements + def clean_array(s: str) -> List[str]: + return list(filter(None, s.split(','))) + + host = os.environ.get('PLUGIN_HOST') + port = os.environ.get('PLUGIN_PORT', 22) + user = os.environ.get('PLUGIN_USER') + password = os.environ.get('PLUGIN_PASSWORD') + key = os.environ.get('PLUGIN_KEY') + target = os.environ.get('PLUGIN_TARGET') + commands = clean_array(os.environ.get('PLUGIN_COMMANDS', '')) + sources = clean_array(os.environ.get('PLUGIN_SOURCES', '')) + + ssh = paramiko.SSHClient() + try: + k = paramiko.RSAKey.from_private_key(io.StringIO(key)) + ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + ssh.connect(hostname=host, username=user, pkey=k, port=port, password=password) + + sftp = ssh.open_sftp() + try: + # Upload the files + # for file in file.... + sftp.put(archive_local, archive_remote) + finally: + sftp.close() + + for command in commands: + output = execute(ssh, command, target, envs) + print(command) + print(output) + + finally: + ssh.close() +``` + +This of course simplifies the code a lot, but should give a general idea how it's done. + +For a full fledged example check out the repo: [https://github.com/CupCakeArmy/drone-deploy](https://github.com/CupCakeArmy/drone-deploy) + +Enjoy! 👋 diff --git a/src/content/config.ts b/src/content/config.ts new file mode 100644 index 0000000..9c24dfd --- /dev/null +++ b/src/content/config.ts @@ -0,0 +1,26 @@ +import { defineCollection, z } from 'astro:content' + +const blog = defineCollection({ + type: 'content', + // Type-check frontmatter using a schema + schema: ({ image }) => + z.object({ + title: z.string(), + description: z.string().optional(), + // Transform string to Date object + date: z.coerce.date(), + updatedDate: z.coerce.date().optional(), + coverImage: image().optional(), + tags: z.string().array().default([]), + }), +}) + +const page = defineCollection({ + type: 'content', + schema: z.object({ + title: z.string(), + date: z.coerce.date(), + }), +}) + +export const collections = { blog, page } diff --git a/src/content/images/about.webp b/src/content/images/about.webp new file mode 100644 index 0000000..4eb4947 --- /dev/null +++ b/src/content/images/about.webp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:71a2c44560dcfe4896ee9da04a8c7f5116aab137707141bd9226b636a57e09af +size 211186 diff --git a/src/content/images/home.png b/src/content/images/home.png new file mode 100644 index 0000000..39b7f55 --- /dev/null +++ b/src/content/images/home.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:504713159b7a670ceaddcbac590e6c5cbbb0e3141c1e57bdba59636f39a3ec4c +size 4568347 diff --git a/src/content/page/about.mdx b/src/content/page/about.mdx new file mode 100644 index 0000000..0506d86 --- /dev/null +++ b/src/content/page/about.mdx @@ -0,0 +1,63 @@ +--- +title: 'About' +date: '2020-09-21' +--- +import SkillBar from '../../components/SkillBar.astro' +import AboutImage from '../../components/AboutImage.astro' + +Hi, I'm Nicco + +I've been doing programming things and "You do computer science right? Can you fix my printer?" for a while now. +My home is mainly the web, but I wander down many paths of computer science, wherever Ecosia and curiosity bring me that day. + +
    + + + +
    + +## Today + +I do a lot of Typescript, but I always try new things that come up on the interwebs and while most of them turn out to be hype, some are real gems. + +**A list of some "skills" (Pros)** + +- Frontend + - React, Vue & Svelte for Web apps, landing pages, etc. + - Typescript lover + - Electron multiplatform _macOS/Linux/Windows_ apps. + - Mobile apps for _iOS_ and _Android_, mostly in React Native. +- CI/CD + - I've written plug-ins for _Drone_ + - Docker multi stage build, etc. + - Pipelines for testing & deployments of various projects/apps + - Github actions +- Backend + - Serverless backends (in _AWS_) + - Postgres/Maria/Mysql/Mongo experience. + - Python server + - Go CLI utilities + - Web scraping +- Clouds I've deployed production services + - AWS + - GCP + +**And stuff I suck at (Cons)** + +- Testing, hate it. +- Love rewriting stuff from ground up. +- Probably much more... + +## History + +It all started when I turned the Google website pink with the dev tools in IE7 and thought I hacked google only to reload the website and discover that (of course) it was only local. + +That got me onto HTML & CSS and super vanilla JS. +Then of course came PHP it all it's glory which was the revelation for me. +I could write servers! OMG! Wait.. where to save that data? +"MySQL joined the chat" and along came some shady phpMyAdmin interfaces where we designed some databases and wrote SQL queries in plain strings always reminding ourselves to sanitise everything. +Remember kids: before our friendly Docker whale was a thing and we all installed XAMPP on our local machines with the (i believe still today) in beta Sublime Text 3. Good stuff. + +The rest... well I have a bad memory 🐘 + + diff --git a/src/content/page/privacy.md b/src/content/page/privacy.md new file mode 100644 index 0000000..9cafac5 --- /dev/null +++ b/src/content/page/privacy.md @@ -0,0 +1,28 @@ +--- +title: 'Privacy' +date: '2020-09-24' +--- + +### TLDR; + +- There is no personal data collected. +- No data is or will be passed to any third party. +- All the traffic data is publicly available [here](https://spectare.nicco.io/share/Xklie3UU/Nicco). + +## Privacy Policy + +### What data is collected + +We do not collect any personally identifiable information and anonymizes all data collected. Users cannot be identified and are never tracked across websites. Our analytics do contain any tracking code. + +### What is the data used for + +We aggregate statistics for analysing website usage. All this data is available publicly under the following link: [https://spectare.nicco.io/share/Xklie3UU/Nicco](https://spectare.nicco.io/share/Xklie3UU/Nicco). + +### Third Parties + +All the data is collected by us locally and never shared with any third party. + +### Contact + +For questions or issues please contact us at [privacy@nicco.io](mailto:privacy@nicco.io). diff --git a/src/env.d.ts b/src/env.d.ts new file mode 100644 index 0000000..e16c13c --- /dev/null +++ b/src/env.d.ts @@ -0,0 +1 @@ +/// diff --git a/src/layouts/BlogPost.astro b/src/layouts/BlogPost.astro new file mode 100644 index 0000000..c90900e --- /dev/null +++ b/src/layouts/BlogPost.astro @@ -0,0 +1,36 @@ +--- +import type { CollectionEntry } from 'astro:content' +import FormattedDate from '../components/FormattedDate.astro' +import { Image } from 'astro:assets' +import Root from './Root.astro' + +type Props = CollectionEntry<'blog'>['data'] + +const { title, updatedDate, date, tags, coverImage } = Astro.props +--- + + +
    +
    + {coverImage && } +
    +
    +
    +
    + + { + updatedDate && ( +
    + Last updated on +
    + ) + } +
    +

    {title}

    + {tags.map((tag) => {tag})} +
    +
    + +
    +
    +
    diff --git a/src/layouts/PageWithTitle.astro b/src/layouts/PageWithTitle.astro new file mode 100644 index 0000000..d98b8ee --- /dev/null +++ b/src/layouts/PageWithTitle.astro @@ -0,0 +1,52 @@ +--- +import SpacedLetters from '../components/SpacedLetters.astro' +import Root from './Root.astro' + +export type Props = { + title: string + readable?: boolean + expanded?: boolean +} + +const { title, readable = false, expanded = true } = Astro.props +--- + + +
    +

    + +

    +
    + +
    +
    +
    + + diff --git a/src/layouts/Root.astro b/src/layouts/Root.astro new file mode 100644 index 0000000..bc6ec16 --- /dev/null +++ b/src/layouts/Root.astro @@ -0,0 +1,34 @@ +--- +import BaseHead from '../components/BaseHead.astro' +// import Footer from '../components/Footer.astro' +// import Header from '../components/Header.astro' +import Nav from '../components/Nav.astro' +--- + + + + + + + + +