From 78de35e44d95761e359ee9772262c0bca350fde6 Mon Sep 17 00:00:00 2001 From: Fabian Jocks <24557998+iamfj@users.noreply.github.com> Date: Mon, 2 Feb 2026 21:05:42 +0100 Subject: [PATCH 01/31] chore: update .gitignore to include graphql codegen files --- .gitignore | 339 ++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 312 insertions(+), 27 deletions(-) diff --git a/.gitignore b/.gitignore index b661854..78fc321 100644 --- a/.gitignore +++ b/.gitignore @@ -1,41 +1,326 @@ -# Dependencies -node_modules/ +# Generated GraphQL code +/src/gql/ + +# ------------------------------------------------------------ +# DO NOT EDIT THE PATHS BELOW THIS LINE +# ------------------------------------------------------------ + +# Created by https://www.toptal.com/developers/gitignore/api/macos,windows,linux,visualstudiocode,node,dotenv,test +# Edit at https://www.toptal.com/developers/gitignore?templates=macos,windows,linux,visualstudiocode,node,dotenv,test + +### dotenv ### +.env + +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### macOS Patch ### +# iCloud generated files +*.icloud +### Node ### # Logs -npm-debug.log* +logs *.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history # Output of 'npm pack' *.tgz -# npm cache -.npm +# Yarn Integrity file +.yarn-integrity -# IDE and editor files -.claude/ -.vscode/ -.idea/ -*.swp -*.swo +# dotenv environment variable files +.env.development.local +.env.test.local +.env.production.local +.env.local -# OS generated files -.DS_Store -._* +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +### Node Patch ### +# Serverless Webpack directories +.webpack/ + +# Optional stylelint cache + +# SvelteKit build / generate output +.svelte-kit + +### Test ### +### Ignore all files that could be used to test your code and +### you wouldn't want to push + +# Reference https://en.wikipedia.org/wiki/Metasyntactic_variable + +# Most common +*foo +*bar +*fubar +*foobar +*baz + +# Less common +*qux +*quux +*bongo +*bazola +*ztesch + +# UK, Australia +*wibble +*wobble +*wubble +*flob +*blep +*blah +*boop +*beep + +# Japanese +*hoge +*piyo +*fuga +*hogera +*hogehoge + +# Portugal, Spain +*fulano +*sicrano +*beltrano +*mengano +*perengano +*zutano + +# France, Italy, the Netherlands +*toto +*titi +*tata +*tutu +*pipppo +*pluto +*paperino +*aap +*noot +*mies + +# Other names that would make sense +*tests +*testsdir +*testsfile +*testsfiles +*test +*testdir +*testfile +*testfiles +*testing +*testingdir +*testingfile +*testingfiles +*temp +*tempdir +*tempfile +*tempfiles +*tmp +*tmpdir +*tmpfile +*tmpfiles +*lol + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history +.ionide + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump -# Development artifacts -thoughts/ -coverage/ +# Folder config file +[Dd]esktop.ini -# Build output (published to npm but not tracked in git) -dist/ +# Recycle Bin used on file shares +$RECYCLE.BIN/ -# Test scripts (keep locally) -test-*.sh -*.test.sh +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp -# Temp files etc. -tmp/ +# Windows shortcuts +*.lnk -# Beans -.beans/ -.beans.yml +# End of https://www.toptal.com/developers/gitignore/api/macos,windows,linux,visualstudiocode,node,dotenv,test \ No newline at end of file From 895e7e923facaae5698299d190bee4ff3d7e9dad Mon Sep 17 00:00:00 2001 From: Fabian Jocks <24557998+iamfj@users.noreply.github.com> Date: Mon, 2 Feb 2026 21:06:31 +0100 Subject: [PATCH 02/31] chore(deps): add graphql codegen cli package and scripts --- package-lock.json | 6751 +++++++++++++++++++++++++++++++++++++++------ package.json | 11 + 2 files changed, 5924 insertions(+), 838 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8ea92ee..0e65d95 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "linearis", - "version": "2025.11.3", + "version": "2025.12.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "linearis", - "version": "2025.11.3", + "version": "2025.12.3", "license": "MIT", "dependencies": { "@linear/sdk": "^58.1.0", @@ -16,6 +16,10 @@ "linearis": "dist/main.js" }, "devDependencies": { + "@graphql-codegen/cli": "^6.1.1", + "@graphql-codegen/client-preset": "^5.2.2", + "@graphql-codegen/introspection": "5.0.0", + "@graphql-codegen/schema-ast": "^5.0.0", "@types/node": "^22.0.0", "@vitest/coverage-v8": "^2.1.8", "@vitest/ui": "^2.1.8", @@ -41,6 +45,203 @@ "node": ">=6.0.0" } }, + "node_modules/@ardatan/relay-compiler": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/@ardatan/relay-compiler/-/relay-compiler-12.0.3.tgz", + "integrity": "sha512-mBDFOGvAoVlWaWqs3hm1AciGHSQE1rqFc/liZTyYz/Oek9yZdT5H26pH2zAFuEiTiBVPPyMuqf5VjOFPI2DGsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/generator": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/runtime": "^7.26.10", + "chalk": "^4.0.0", + "fb-watchman": "^2.0.0", + "immutable": "~3.7.6", + "invariant": "^2.2.4", + "nullthrows": "^1.1.1", + "relay-runtime": "12.0.0", + "signedsource": "^1.0.0" + }, + "bin": { + "relay-compiler": "bin/relay-compiler" + }, + "peerDependencies": { + "graphql": "*" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.0.tgz", + "integrity": "sha512-vSH118/wwM/pLR38g/Sgk05sNtro6TlTJKuiMXDaZqPUfjTFcudpCOt00IhOfj+1BFAX+UFAlzCU+6WXr3GLFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", @@ -61,14 +262,38 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.5" + "@babel/types": "^7.29.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -77,10 +302,70 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", + "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/types": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "dev": true, "license": "MIT", "dependencies": { @@ -98,6 +383,50 @@ "dev": true, "license": "MIT" }, + "node_modules/@envelop/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@envelop/core/-/core-5.5.0.tgz", + "integrity": "sha512-nsU1EyJQAStaKHR1ZkB/ug9XBm+WPTliYtdedbJ/L1ykrp7dbbn0srqBeDnZ2mbZVp4hH3d0Fy+Og9OgPWZx+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@envelop/instrumentation": "^1.0.0", + "@envelop/types": "^5.2.1", + "@whatwg-node/promise-helpers": "^1.2.4", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@envelop/instrumentation": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@envelop/instrumentation/-/instrumentation-1.0.0.tgz", + "integrity": "sha512-cxgkB66RQB95H3X27jlnxCRNTmPuSTgmBAq6/4n2Dtv4hsk4yz8FadA1ggmd0uZzvKqWD6CR+WFgTjhDqg7eyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@whatwg-node/promise-helpers": "^1.2.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@envelop/types": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@envelop/types/-/types-5.2.1.tgz", + "integrity": "sha512-CsFmA3u3c2QoLDTfEpGr4t25fjMU31nyvse7IzWTvb0ZycuPjMjb0fjlheh+PbhBYb9YLugnT2uY6Mwcg1o+Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@whatwg-node/promise-helpers": "^1.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.27.1", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.1.tgz", @@ -540,1217 +869,5296 @@ "node": ">=18" } }, - "node_modules/@graphql-typed-document-node/core": { + "node_modules/@fastify/busboy": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", - "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.2.0.tgz", + "integrity": "sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@graphql-codegen/add": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/add/-/add-6.0.0.tgz", + "integrity": "sha512-biFdaURX0KTwEJPQ1wkT6BRgNasqgQ5KbCI1a3zwtLtO7XTo7/vKITPylmiU27K5DSOWYnY/1jfSqUAEBuhZrQ==", + "dev": true, "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^6.0.0", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">=16" + }, "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 || ^17.0.0" + "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" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "node_modules/@graphql-codegen/cli": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-6.1.1.tgz", + "integrity": "sha512-Ni8UdZ6D/UTvLvDtPb6PzshI0lTqtLDnmv/2t1w2SYP92H0MMEdAzxB/ujDWwIXm2LzVPvvrGvzzCTMsyXa+mA==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + "@babel/generator": "^7.18.13", + "@babel/template": "^7.18.10", + "@babel/types": "^7.18.13", + "@graphql-codegen/client-preset": "^5.2.0", + "@graphql-codegen/core": "^5.0.0", + "@graphql-codegen/plugin-helpers": "^6.1.0", + "@graphql-tools/apollo-engine-loader": "^8.0.0", + "@graphql-tools/code-file-loader": "^8.0.0", + "@graphql-tools/git-loader": "^8.0.0", + "@graphql-tools/github-loader": "^9.0.0", + "@graphql-tools/graphql-file-loader": "^8.0.0", + "@graphql-tools/json-file-loader": "^8.0.0", + "@graphql-tools/load": "^8.1.0", + "@graphql-tools/url-loader": "^9.0.0", + "@graphql-tools/utils": "^10.0.0", + "@inquirer/prompts": "^7.8.2", + "@whatwg-node/fetch": "^0.10.0", + "chalk": "^4.1.0", + "cosmiconfig": "^9.0.0", + "debounce": "^2.0.0", + "detect-indent": "^6.0.0", + "graphql-config": "^5.1.1", + "is-glob": "^4.0.1", + "jiti": "^2.3.0", + "json-to-pretty-yaml": "^1.2.2", + "listr2": "^9.0.0", + "log-symbols": "^4.0.0", + "micromatch": "^4.0.5", + "shell-quote": "^1.7.3", + "string-env-interpolation": "^1.0.1", + "ts-log": "^2.2.3", + "tslib": "^2.4.0", + "yaml": "^2.3.1", + "yargs": "^17.0.0" + }, + "bin": { + "gql-gen": "cjs/bin.js", + "graphql-code-generator": "cjs/bin.js", + "graphql-codegen": "cjs/bin.js", + "graphql-codegen-esm": "esm/bin.js" }, "engines": { - "node": ">=12" + "node": ">=16" + }, + "peerDependencies": { + "@parcel/watcher": "^2.1.0", + "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" + }, + "peerDependenciesMeta": { + "@parcel/watcher": { + "optional": true + } } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "node_modules/@graphql-codegen/client-preset": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@graphql-codegen/client-preset/-/client-preset-5.2.2.tgz", + "integrity": "sha512-1xufIJZr04ylx0Dnw49m8Jrx1s1kujUNVm+Tp5cPRsQmgPN9VjB7wWY7CGD8ArStv6Vjb0a31Xnm5I+VzZM+Rw==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/template": "^7.20.7", + "@graphql-codegen/add": "^6.0.0", + "@graphql-codegen/gql-tag-operations": "5.1.2", + "@graphql-codegen/plugin-helpers": "^6.1.0", + "@graphql-codegen/typed-document-node": "^6.1.5", + "@graphql-codegen/typescript": "^5.0.7", + "@graphql-codegen/typescript-operations": "^5.0.7", + "@graphql-codegen/visitor-plugin-common": "^6.2.2", + "@graphql-tools/documents": "^1.0.0", + "@graphql-tools/utils": "^10.0.0", + "@graphql-typed-document-node/core": "3.2.0", + "tslib": "~2.6.0" + }, "engines": { - "node": ">=8" + "node": ">=16" + }, + "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-sock": "^1.0.0" + }, + "peerDependenciesMeta": { + "graphql-sock": { + "optional": true + } } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "node_modules/@graphql-codegen/core": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/core/-/core-5.0.0.tgz", + "integrity": "sha512-vLTEW0m8LbE4xgRwbFwCdYxVkJ1dBlVJbQyLb9Q7bHnVFgHAP982Xo8Uv7FuPBmON+2IbTjkCqhFLHVZbqpvjQ==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" + "@graphql-codegen/plugin-helpers": "^6.0.0", + "@graphql-tools/schema": "^10.0.0", + "@graphql-tools/utils": "^10.0.0", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">=16" + }, + "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" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "node_modules/@graphql-codegen/gql-tag-operations": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@graphql-codegen/gql-tag-operations/-/gql-tag-operations-5.1.2.tgz", + "integrity": "sha512-BIv66VJ2bKlpfXBeVakJxihBSKnBIdGFLMaFdnGPxqYlKIzaGffjsGbhViPwwBinmBChW4Se6PU4Py7eysYEiA==", "dev": true, "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^6.1.0", + "@graphql-codegen/visitor-plugin-common": "6.2.2", + "@graphql-tools/utils": "^10.0.0", + "auto-bind": "~4.0.0", + "tslib": "~2.6.0" + }, "engines": { - "node": ">=6.0.0" + "node": ">=16" + }, + "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" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "node_modules/@graphql-codegen/introspection": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/introspection/-/introspection-5.0.0.tgz", + "integrity": "sha512-7GaV4o8J3yllz7hdvQVAwB8L5oizeLCRKCU5vEq6XyFsoi4mSVMAPhvDPkNgt4wtXPyEh59NU7QwG84JChrqHQ==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@graphql-codegen/plugin-helpers": "^6.0.0", + "@graphql-codegen/visitor-plugin-common": "^6.0.0", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">=16" + }, + "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" } }, - "node_modules/@linear/sdk": { - "version": "58.1.0", - "resolved": "https://registry.npmjs.org/@linear/sdk/-/sdk-58.1.0.tgz", - "integrity": "sha512-sqzo1j+uZsxeJlMTV2mrBH3yukB/liev7IySmkZil0ka7ic6b4RE9Jk3x+ohw8YgYB52IRR3SPWzhWu96E6W9g==", + "node_modules/@graphql-codegen/plugin-helpers": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-6.1.0.tgz", + "integrity": "sha512-JJypehWTcty9kxKiqH7TQOetkGdOYjY78RHlI+23qB59cV2wxjFFVf8l7kmuXS4cpGVUNfIjFhVr7A1W7JMtdA==", + "dev": true, "license": "MIT", "dependencies": { - "@graphql-typed-document-node/core": "^3.1.0", - "graphql": "^15.4.0", - "isomorphic-unfetch": "^3.1.0" + "@graphql-tools/utils": "^10.0.0", + "change-case-all": "1.0.15", + "common-tags": "1.8.2", + "import-from": "4.0.0", + "lodash": "~4.17.0", + "tslib": "~2.6.0" }, "engines": { - "node": ">=12.x", - "yarn": "1.x" + "node": ">=16" + }, + "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" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/@graphql-codegen/schema-ast": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/schema-ast/-/schema-ast-5.0.0.tgz", + "integrity": "sha512-jn7Q3PKQc0FxXjbpo9trxzlz/GSFQWxL042l0iC8iSbM/Ar+M7uyBwMtXPsev/3Razk+osQyreghIz0d2+6F7Q==", "dev": true, "license": "MIT", - "optional": true, + "dependencies": { + "@graphql-codegen/plugin-helpers": "^6.0.0", + "@graphql-tools/utils": "^10.0.0", + "tslib": "~2.6.0" + }, "engines": { - "node": ">=14" + "node": ">=16" + }, + "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" } }, - "node_modules/@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz", - "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==", - "cpu": [ - "arm" - ], + "node_modules/@graphql-codegen/typed-document-node": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typed-document-node/-/typed-document-node-6.1.5.tgz", + "integrity": "sha512-6dgEPz+YRMzSPpATj7tsKh/L6Y8OZImiyXIUzvSq/dRAEgoinahrES5y/eZQyc7CVxfoFCyHF9KMQQ9jiLn7lw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ] + "dependencies": { + "@graphql-codegen/plugin-helpers": "^6.1.0", + "@graphql-codegen/visitor-plugin-common": "6.2.2", + "auto-bind": "~4.0.0", + "change-case-all": "1.0.15", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">=16" + }, + "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" + } }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz", - "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==", - "cpu": [ - "arm64" - ], + "node_modules/@graphql-codegen/typescript": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-5.0.7.tgz", + "integrity": "sha512-kZwcu9Iat5RWXxLGPnDbG6qVbGTigF25/aGqCG/DCQ1Al8RufSjVXhIOkJBp7QWAqXn3AupHXL1WTMXP7xs4dQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ] + "dependencies": { + "@graphql-codegen/plugin-helpers": "^6.1.0", + "@graphql-codegen/schema-ast": "^5.0.0", + "@graphql-codegen/visitor-plugin-common": "6.2.2", + "auto-bind": "~4.0.0", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz", - "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==", - "cpu": [ - "arm64" - ], + "node_modules/@graphql-codegen/typescript-operations": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-operations/-/typescript-operations-5.0.7.tgz", + "integrity": "sha512-5N3myNse1putRQlp8+l1k9ayvc98oq2mPJx0zN8MTOlTBxcb2grVPFRLy5wJJjuv9NffpyCkVJ9LvUaf8mqQgg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] + "dependencies": { + "@graphql-codegen/plugin-helpers": "^6.1.0", + "@graphql-codegen/typescript": "^5.0.7", + "@graphql-codegen/visitor-plugin-common": "6.2.2", + "auto-bind": "~4.0.0", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">=16" + }, + "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-sock": "^1.0.0" + }, + "peerDependenciesMeta": { + "graphql-sock": { + "optional": true + } + } }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz", - "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==", - "cpu": [ - "x64" - ], + "node_modules/@graphql-codegen/visitor-plugin-common": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-6.2.2.tgz", + "integrity": "sha512-wEJ4zJj58PKlXISItZfr0xIHyM1lAuRfoflPegsb1L17Mx5+YzNOy0WAlLele3yzyV89WvCiprFKMcVQ7KfDXg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] + "dependencies": { + "@graphql-codegen/plugin-helpers": "^6.1.0", + "@graphql-tools/optimize": "^2.0.0", + "@graphql-tools/relay-operation-optimizer": "^7.0.0", + "@graphql-tools/utils": "^10.0.0", + "auto-bind": "~4.0.0", + "change-case-all": "1.0.15", + "dependency-graph": "^1.0.0", + "graphql-tag": "^2.11.0", + "parse-filepath": "^1.0.2", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">=16" + }, + "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" + } }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz", - "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==", - "cpu": [ - "arm64" - ], + "node_modules/@graphql-hive/signal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@graphql-hive/signal/-/signal-2.0.0.tgz", + "integrity": "sha512-Pz8wB3K0iU6ae9S1fWfsmJX24CcGeTo6hE7T44ucmV/ALKRj+bxClmqrYcDT7v3f0d12Rh4FAXBb6gon+WkDpQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] + "engines": { + "node": ">=20.0.0" + } }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz", - "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==", - "cpu": [ - "x64" - ], + "node_modules/@graphql-tools/apollo-engine-loader": { + "version": "8.0.28", + "resolved": "https://registry.npmjs.org/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-8.0.28.tgz", + "integrity": "sha512-MzgDrUuoxp6dZeo54zLBL3cEJKJtM3N/2RqK0rbPxPq5X2z6TUA7EGg8vIFTUkt5xelAsUrm8/4ai41ZDdxOng==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] + "dependencies": { + "@graphql-tools/utils": "^11.0.0", + "@whatwg-node/fetch": "^0.10.13", + "sync-fetch": "0.6.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz", - "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==", - "cpu": [ - "arm" - ], + "node_modules/@graphql-tools/apollo-engine-loader/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz", - "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==", - "cpu": [ - "arm" - ], + "node_modules/@graphql-tools/batch-execute": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-10.0.5.tgz", + "integrity": "sha512-dL13tXkfGvAzLq2XfzTKAy9logIcltKYRuPketxdh3Ok3U6PN1HKMCHfrE9cmtAsxD96/8Hlghz5AtM+LRv/ig==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "@graphql-tools/utils": "^11.0.0", + "@whatwg-node/promise-helpers": "^1.3.2", + "dataloader": "^2.2.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz", - "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", - "cpu": [ - "arm64" - ], + "node_modules/@graphql-tools/batch-execute/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz", - "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==", - "cpu": [ - "arm64" - ], + "node_modules/@graphql-tools/batch-execute/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "license": "0BSD" }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz", - "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==", - "cpu": [ - "loong64" - ], + "node_modules/@graphql-tools/code-file-loader": { + "version": "8.1.28", + "resolved": "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-8.1.28.tgz", + "integrity": "sha512-BL3Ft/PFlXDE5nNuqA36hYci7Cx+8bDrPDc8X3VSpZy9iKFBY+oQ+IwqnEHCkt8OSp2n2V0gqTg4u3fcQP1Kwg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "@graphql-tools/graphql-tag-pluck": "8.3.27", + "@graphql-tools/utils": "^11.0.0", + "globby": "^11.0.3", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz", - "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==", - "cpu": [ - "ppc64" - ], + "node_modules/@graphql-tools/code-file-loader/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz", - "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==", - "cpu": [ - "riscv64" - ], + "node_modules/@graphql-tools/delegate": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-12.0.5.tgz", + "integrity": "sha512-VsaynCBuZTznRzYjT3VutwIjZ0j4Bi5p0SUDiY5Qi07fW7RBXtStfH7O+YdnTQvxJecJUXA4iiKVWi+3qKXvhA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "@graphql-tools/batch-execute": "^10.0.5", + "@graphql-tools/executor": "^1.4.13", + "@graphql-tools/schema": "^10.0.29", + "@graphql-tools/utils": "^11.0.0", + "@repeaterjs/repeater": "^3.0.6", + "@whatwg-node/promise-helpers": "^1.3.2", + "dataloader": "^2.2.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz", - "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==", - "cpu": [ - "riscv64" - ], + "node_modules/@graphql-tools/delegate/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/delegate/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@graphql-tools/documents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/documents/-/documents-1.0.1.tgz", + "integrity": "sha512-aweoMH15wNJ8g7b2r4C4WRuJxZ0ca8HtNO54rkye/3duxTkW4fGBEutCx03jCIr5+a1l+4vFJNP859QnAVBVCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor/-/executor-1.5.1.tgz", + "integrity": "sha512-n94Qcu875Mji9GQ52n5UbgOTxlgvFJicBPYD+FRks9HKIQpdNPjkkrKZUYNG51XKa+bf03rxNflm4+wXhoHHrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^11.0.0", + "@graphql-typed-document-node/core": "^3.2.0", + "@repeaterjs/repeater": "^3.0.4", + "@whatwg-node/disposablestack": "^0.0.6", + "@whatwg-node/promise-helpers": "^1.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-common": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-common/-/executor-common-1.0.6.tgz", + "integrity": "sha512-23/K5C+LSlHDI0mj2SwCJ33RcELCcyDUgABm1Z8St7u/4Z5+95i925H/NAjUyggRjiaY8vYtNiMOPE49aPX1sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@envelop/core": "^5.4.0", + "@graphql-tools/utils": "^11.0.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-common/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-graphql-ws": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-3.1.4.tgz", + "integrity": "sha512-wCQfWYLwg1JZmQ7rGaFy74AQyVFxpeqz19WWIGRgANiYlm+T0K3Hs6POgi0+nL3HvwxJIxhUlaRLFvkqm1zxSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/executor-common": "^1.0.6", + "@graphql-tools/utils": "^11.0.0", + "@whatwg-node/disposablestack": "^0.0.6", + "graphql-ws": "^6.0.6", + "isows": "^1.0.7", + "tslib": "^2.8.1", + "ws": "^8.18.3" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-graphql-ws/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-graphql-ws/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@graphql-tools/executor-http": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-3.1.0.tgz", + "integrity": "sha512-DTaNU1rT2sxffwQlt+Aw68cHQWfGkjsaRk1D8nvG+DcCR8RNQo0d9qYt7pXIcfXYcQLb/OkABcGSuCfkopvHJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-hive/signal": "^2.0.0", + "@graphql-tools/executor-common": "^1.0.6", + "@graphql-tools/utils": "^11.0.0", + "@repeaterjs/repeater": "^3.0.4", + "@whatwg-node/disposablestack": "^0.0.6", + "@whatwg-node/fetch": "^0.10.13", + "@whatwg-node/promise-helpers": "^1.3.2", + "meros": "^1.3.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-http/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-http/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@graphql-tools/executor-legacy-ws": { + "version": "1.1.25", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.1.25.tgz", + "integrity": "sha512-6uf4AEXO0QMxJ7AWKVPqEZXgYBJaiz5vf29X0boG8QtcqWy8mqkXKWLND2Swdx0SbEx0efoGFcjuKufUcB0ASQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^11.0.0", + "@types/ws": "^8.0.0", + "isomorphic-ws": "^5.0.0", + "tslib": "^2.4.0", + "ws": "^8.19.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-legacy-ws/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/git-loader": { + "version": "8.0.32", + "resolved": "https://registry.npmjs.org/@graphql-tools/git-loader/-/git-loader-8.0.32.tgz", + "integrity": "sha512-H5HTp2vevv0rRMEnCJBVmVF8md3LpJI1C1+d6OtzvmuONJ8mOX2mkf9rtoqwiztynVegaDUekvMFsc9k5iE2WA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/graphql-tag-pluck": "8.3.27", + "@graphql-tools/utils": "^11.0.0", + "is-glob": "4.0.3", + "micromatch": "^4.0.8", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/git-loader/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/github-loader": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/github-loader/-/github-loader-9.0.6.tgz", + "integrity": "sha512-hhlt2MMkRcvDva/qyzqFddXzaMmRnriJ0Ts+/LcNeYnB8hcEqRMpF9RCsHYjo1mFRaiu8i4PSIpXyyFu3To7Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/executor-http": "^3.0.6", + "@graphql-tools/graphql-tag-pluck": "^8.3.27", + "@graphql-tools/utils": "^11.0.0", + "@whatwg-node/fetch": "^0.10.13", + "@whatwg-node/promise-helpers": "^1.0.0", + "sync-fetch": "0.6.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/github-loader/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/graphql-file-loader": { + "version": "8.1.9", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-8.1.9.tgz", + "integrity": "sha512-rkLK46Q62Zxift8B6Kfw6h8SH3pCR3DPCfNeC/lpLwYReezZz+2ARuLDFZjQGjW+4lpMwiAw8CIxDyQAUgqU6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/import": "7.1.9", + "@graphql-tools/utils": "^11.0.0", + "globby": "^11.0.3", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/graphql-file-loader/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/graphql-tag-pluck": { + "version": "8.3.27", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-8.3.27.tgz", + "integrity": "sha512-CJ0WVXhGYsfFngpRrAAcjRHyxSDHx4dEz2W15bkwvt9he/AWhuyXm07wuGcoLrl0q0iQp1BiRjU7D8SxWZo3JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "@graphql-tools/utils": "^11.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/graphql-tag-pluck/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/import": { + "version": "7.1.9", + "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-7.1.9.tgz", + "integrity": "sha512-mHzOgyfzsAgstaZPIFEtKg4GVH4FbDHeHYrSs73mAPKS5F59/FlRuUJhAoRnxbVnc3qIZ6EsWBjOjNbnPK8viA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^11.0.0", + "@theguild/federation-composition": "^0.21.1", + "resolve-from": "5.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/import/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/json-file-loader": { + "version": "8.0.26", + "resolved": "https://registry.npmjs.org/@graphql-tools/json-file-loader/-/json-file-loader-8.0.26.tgz", + "integrity": "sha512-kwy9IFi5QtXXTLBgWkvA1RqsZeJDn0CxsTbhNlziCzmga9fNo7qtZ18k9FYIq3EIoQQlok+b7W7yeyJATA2xhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^11.0.0", + "globby": "^11.0.3", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/json-file-loader/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/load": { + "version": "8.1.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-8.1.8.tgz", + "integrity": "sha512-gxO662b64qZSToK3N6XUxWG5E6HOUjlg5jEnmGvD4bMtGJ0HwEe/BaVZbBQemCfLkxYjwRIBiVfOY9o0JyjZJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/schema": "^10.0.31", + "@graphql-tools/utils": "^11.0.0", + "p-limit": "3.1.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/load/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/merge": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.1.7.tgz", + "integrity": "sha512-Y5E1vTbTabvcXbkakdFUt4zUIzB1fyaEnVmIWN0l0GMed2gdD01TpZWLUm4RNAxpturvolrb24oGLQrBbPLSoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^11.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/merge/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/optimize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/optimize/-/optimize-2.0.0.tgz", + "integrity": "sha512-nhdT+CRGDZ+bk68ic+Jw1OZ99YCDIKYA5AlVAnBHJvMawSx9YQqQAIj4refNc1/LRieGiuWvhbG3jvPVYho0Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/relay-operation-optimizer": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-7.0.27.tgz", + "integrity": "sha512-rdkL1iDMFaGDiHWd7Bwv7hbhrhnljkJaD0MXeqdwQlZVgVdUDlMot2WuF7CEKVgijpH6eSC6AxXMDeqVgSBS2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ardatan/relay-compiler": "^12.0.3", + "@graphql-tools/utils": "^11.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/relay-operation-optimizer/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/schema": { + "version": "10.0.31", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.31.tgz", + "integrity": "sha512-ZewRgWhXef6weZ0WiP7/MV47HXiuFbFpiDUVLQl6mgXsWSsGELKFxQsyUCBos60Qqy1JEFAIu3Ns6GGYjGkqkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/merge": "^9.1.7", + "@graphql-tools/utils": "^11.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/schema/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/url-loader": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-9.0.6.tgz", + "integrity": "sha512-QdJI3f7ANDMYfYazRgJzzybznjOrQAOuDXweC9xmKgPZoTqNxEAsatiy69zcpTf6092taJLyrqRH6R7xUTzf4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/executor-graphql-ws": "^3.1.2", + "@graphql-tools/executor-http": "^3.0.6", + "@graphql-tools/executor-legacy-ws": "^1.1.25", + "@graphql-tools/utils": "^11.0.0", + "@graphql-tools/wrap": "^11.1.1", + "@types/ws": "^8.0.0", + "@whatwg-node/fetch": "^0.10.13", + "@whatwg-node/promise-helpers": "^1.0.0", + "isomorphic-ws": "^5.0.0", + "sync-fetch": "0.6.0", + "tslib": "^2.4.0", + "ws": "^8.19.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/url-loader/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/utils": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.11.0.tgz", + "integrity": "sha512-iBFR9GXIs0gCD+yc3hoNswViL1O5josI33dUqiNStFI/MHLCEPduasceAcazRH77YONKNiviHBV8f7OgcT4o2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/wrap": { + "version": "11.1.5", + "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-11.1.5.tgz", + "integrity": "sha512-eVE+YTMimFOxQAiayMGQhIMVA6F1pRstAmtrd82KX8qJqdZ5QXZrbIPitAhEFmxD0qC6afUEgsLlTOwOJGg1pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/delegate": "^12.0.5", + "@graphql-tools/schema": "^10.0.29", + "@graphql-tools/utils": "^11.0.0", + "@whatwg-node/promise-helpers": "^1.3.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/wrap/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/wrap/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@graphql-typed-document-node/core": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", + "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", + "license": "MIT", + "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 || ^17.0.0" + } + }, + "node_modules/@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", + "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", + "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@inquirer/core/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@inquirer/core/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/editor": { + "version": "4.2.23", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", + "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/external-editor": "^1.0.3", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", + "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", + "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/number": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", + "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/password": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", + "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/prompts": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", + "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^4.3.2", + "@inquirer/confirm": "^5.1.21", + "@inquirer/editor": "^4.2.23", + "@inquirer/expand": "^4.0.23", + "@inquirer/input": "^4.3.1", + "@inquirer/number": "^3.0.23", + "@inquirer/password": "^4.0.23", + "@inquirer/rawlist": "^4.1.11", + "@inquirer/search": "^3.2.2", + "@inquirer/select": "^4.4.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/rawlist": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", + "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/search": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", + "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/select": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", + "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@linear/sdk": { + "version": "58.1.0", + "resolved": "https://registry.npmjs.org/@linear/sdk/-/sdk-58.1.0.tgz", + "integrity": "sha512-sqzo1j+uZsxeJlMTV2mrBH3yukB/liev7IySmkZil0ka7ic6b4RE9Jk3x+ohw8YgYB52IRR3SPWzhWu96E6W9g==", + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.0", + "graphql": "^15.4.0", + "isomorphic-unfetch": "^3.1.0" + }, + "engines": { + "node": ">=12.x", + "yarn": "1.x" + } + }, + "node_modules/@linear/sdk/node_modules/graphql": { + "version": "15.10.1", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.10.1.tgz", + "integrity": "sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==", + "license": "MIT", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", + "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.6", + "@parcel/watcher-darwin-arm64": "2.5.6", + "@parcel/watcher-darwin-x64": "2.5.6", + "@parcel/watcher-freebsd-x64": "2.5.6", + "@parcel/watcher-linux-arm-glibc": "2.5.6", + "@parcel/watcher-linux-arm-musl": "2.5.6", + "@parcel/watcher-linux-arm64-glibc": "2.5.6", + "@parcel/watcher-linux-arm64-musl": "2.5.6", + "@parcel/watcher-linux-x64-glibc": "2.5.6", + "@parcel/watcher-linux-x64-musl": "2.5.6", + "@parcel/watcher-win32-arm64": "2.5.6", + "@parcel/watcher-win32-ia32": "2.5.6", + "@parcel/watcher-win32-x64": "2.5.6" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", + "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", + "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", + "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", + "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", + "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", + "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", + "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", + "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", + "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", + "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", + "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", + "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", + "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@repeaterjs/repeater": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@repeaterjs/repeater/-/repeater-3.0.6.tgz", + "integrity": "sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz", + "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz", + "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz", + "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz", + "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz", + "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz", + "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz", + "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz", + "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz", + "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz", + "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz", + "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz", + "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz", + "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz", + "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz", + "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz", + "integrity": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz", + "integrity": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ "linux" ] }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz", - "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==", - "cpu": [ - "s390x" - ], + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz", + "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz", + "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz", + "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz", + "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz", + "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@theguild/federation-composition": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/@theguild/federation-composition/-/federation-composition-0.21.3.tgz", + "integrity": "sha512-+LlHTa4UbRpZBog3ggAxjYIFvdfH3UMvvBUptur19TMWkqU4+n3GmN+mDjejU+dyBXIG27c25RsiQP1HyvM99g==", + "dev": true, + "license": "MIT", + "dependencies": { + "constant-case": "^3.0.4", + "debug": "4.4.3", + "json5": "^2.2.3", + "lodash.sortby": "^4.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "graphql": "^16.0.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.19.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.2.tgz", + "integrity": "sha512-LPM2G3Syo1GLzXLGJAKdqoU35XvrWzGJ21/7sgZTUpbkBaOasTj8tjwn6w+hCkqaa1TfJ/w67rJSwYItlJ2mYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@vitest/coverage-v8": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.1.9.tgz", + "integrity": "sha512-Z2cOr0ksM00MpEfyVE8KXIYPEcBFxdbLSs56L8PO0QQMxt/6bDj45uQfxoc96v05KW3clk7vvgP0qfDit9DmfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@bcoe/v8-coverage": "^0.2.3", + "debug": "^4.3.7", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.6", + "istanbul-reports": "^3.1.7", + "magic-string": "^0.30.12", + "magicast": "^0.3.5", + "std-env": "^3.8.0", + "test-exclude": "^7.0.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "2.1.9", + "vitest": "2.1.9" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } + } + }, + "node_modules/@vitest/expect": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.9.tgz", + "integrity": "sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.9", + "@vitest/utils": "2.1.9", + "chai": "^5.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.9.tgz", + "integrity": "sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.9", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.12" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz", + "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.9.tgz", + "integrity": "sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "2.1.9", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.9.tgz", + "integrity": "sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.9", + "magic-string": "^0.30.12", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.9.tgz", + "integrity": "sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/ui": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-2.1.9.tgz", + "integrity": "sha512-izzd2zmnk8Nl5ECYkW27328RbQ1nKvkm6Bb5DAaz1Gk59EbLkiCMa6OLT0NoaAYTjOFS6N+SMYW1nh4/9ljPiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "2.1.9", + "fflate": "^0.8.2", + "flatted": "^3.3.1", + "pathe": "^1.1.2", + "sirv": "^3.0.0", + "tinyglobby": "^0.2.10", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "2.1.9" + } + }, + "node_modules/@vitest/utils": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz", + "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.9", + "loupe": "^3.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@whatwg-node/disposablestack": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@whatwg-node/disposablestack/-/disposablestack-0.0.6.tgz", + "integrity": "sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@whatwg-node/promise-helpers": "^1.0.0", + "tslib": "^2.6.3" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@whatwg-node/fetch": { + "version": "0.10.13", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.10.13.tgz", + "integrity": "sha512-b4PhJ+zYj4357zwk4TTuF2nEe0vVtOrwdsrNo5hL+u1ojXNhh1FgJ6pg1jzDlwlT4oBdzfSwaBwMCtFCsIWg8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@whatwg-node/node-fetch": "^0.8.3", + "urlpattern-polyfill": "^10.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@whatwg-node/node-fetch": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.8.5.tgz", + "integrity": "sha512-4xzCl/zphPqlp9tASLVeUhB5+WJHbuWGYpfoC2q1qh5dw0AqZBW7L27V5roxYWijPxj4sspRAAoOH3d2ztaHUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^3.1.1", + "@whatwg-node/disposablestack": "^0.0.6", + "@whatwg-node/promise-helpers": "^1.3.2", + "tslib": "^2.6.3" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@whatwg-node/promise-helpers": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@whatwg-node/promise-helpers/-/promise-helpers-1.3.2.tgz", + "integrity": "sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.6.3" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/ansi-escapes": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.2.0.tgz", + "integrity": "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/auto-bind": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz", + "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001767", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001767.tgz", + "integrity": "sha512-34+zUAMhSH+r+9eKmYG+k2Rpt8XttfE4yXAjoZvkAPs15xcYQhyBYdalJ65BzivAvGRMViEjy6oKr/S91loekQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/capital-case": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", + "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, + "node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/change-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", + "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", + "dev": true, + "license": "MIT", + "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.0.3" + } + }, + "node_modules/change-case-all": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", + "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", + "dev": true, + "license": "MIT", + "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" + } + }, + "node_modules/chardet": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.1.1.tgz", + "integrity": "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^7.1.0", + "string-width": "^8.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.1.tgz", + "integrity": "sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", + "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/constant-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", + "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case": "^2.0.2" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-fetch": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", + "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "node-fetch": "^2.7.0" + } + }, + "node_modules/cross-inspect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cross-inspect/-/cross-inspect-1.0.1.tgz", + "integrity": "sha512-Pcw1JTvZLSJH83iiGWt6fRcT+BjZlCDRVwYLbUcHzv/CRpB7r0MlSrGbIyQvVSNyGnbt7G4AXuyCiDR3POvZ1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/dataloader": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.2.3.tgz", + "integrity": "sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==", + "dev": true, + "license": "MIT" + }, + "node_modules/debounce": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-2.2.0.tgz", + "integrity": "sha512-Xks6RUDLZFdz8LIdR6q0MTH44k7FikOmnh5xkSjMig6ch45afc8sjTjRQf3P6ax8dMgcQrYO/AR2RGWURrruqw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/dependency-graph": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", + "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dset": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", + "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.283", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.283.tgz", + "integrity": "sha512-3vifjt1HgrGW/h76UEeny+adYApveS9dH2h3p57JYzBSXJIKUJAvtmIytDKjcSCt9xHfrNCFJ7gts6vkhuq++w==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.1.tgz", + "integrity": "sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.1", + "@esbuild/android-arm": "0.27.1", + "@esbuild/android-arm64": "0.27.1", + "@esbuild/android-x64": "0.27.1", + "@esbuild/darwin-arm64": "0.27.1", + "@esbuild/darwin-x64": "0.27.1", + "@esbuild/freebsd-arm64": "0.27.1", + "@esbuild/freebsd-x64": "0.27.1", + "@esbuild/linux-arm": "0.27.1", + "@esbuild/linux-arm64": "0.27.1", + "@esbuild/linux-ia32": "0.27.1", + "@esbuild/linux-loong64": "0.27.1", + "@esbuild/linux-mips64el": "0.27.1", + "@esbuild/linux-ppc64": "0.27.1", + "@esbuild/linux-riscv64": "0.27.1", + "@esbuild/linux-s390x": "0.27.1", + "@esbuild/linux-x64": "0.27.1", + "@esbuild/netbsd-arm64": "0.27.1", + "@esbuild/netbsd-x64": "0.27.1", + "@esbuild/openbsd-arm64": "0.27.1", + "@esbuild/openbsd-x64": "0.27.1", + "@esbuild/openharmony-arm64": "0.27.1", + "@esbuild/sunos-x64": "0.27.1", + "@esbuild/win32-arm64": "0.27.1", + "@esbuild/win32-ia32": "0.27.1", + "@esbuild/win32-x64": "0.27.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fbjs": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", + "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-fetch": "^3.1.5", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^1.0.35" + } + }, + "node_modules/fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "dev": true, + "license": "MIT" + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphql": { + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.12.0.tgz", + "integrity": "sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, + "node_modules/graphql-config": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/graphql-config/-/graphql-config-5.1.5.tgz", + "integrity": "sha512-mG2LL1HccpU8qg5ajLROgdsBzx/o2M6kgI3uAmoaXiSH9PCUbtIyLomLqUtCFaAeG2YCFsl0M5cfQ9rKmDoMVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/graphql-file-loader": "^8.0.0", + "@graphql-tools/json-file-loader": "^8.0.0", + "@graphql-tools/load": "^8.1.0", + "@graphql-tools/merge": "^9.0.0", + "@graphql-tools/url-loader": "^8.0.0", + "@graphql-tools/utils": "^10.0.0", + "cosmiconfig": "^8.1.0", + "jiti": "^2.0.0", + "minimatch": "^9.0.5", + "string-env-interpolation": "^1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">= 16.0.0" + }, + "peerDependencies": { + "cosmiconfig-toml-loader": "^1.0.0", + "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + }, + "peerDependenciesMeta": { + "cosmiconfig-toml-loader": { + "optional": true + } + } + }, + "node_modules/graphql-config/node_modules/@graphql-hive/signal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@graphql-hive/signal/-/signal-1.0.0.tgz", + "integrity": "sha512-RiwLMc89lTjvyLEivZ/qxAC5nBHoS2CtsWFSOsN35sxG9zoo5Z+JsFHM8MlvmO9yt+MJNIyC5MLE1rsbOphlag==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/graphql-config/node_modules/@graphql-tools/batch-execute": { + "version": "9.0.19", + "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-9.0.19.tgz", + "integrity": "sha512-VGamgY4PLzSx48IHPoblRw0oTaBa7S26RpZXt0Y4NN90ytoE0LutlpB2484RbkfcTjv9wa64QD474+YP1kEgGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^10.9.1", + "@whatwg-node/promise-helpers": "^1.3.0", + "dataloader": "^2.2.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/graphql-config/node_modules/@graphql-tools/delegate": { + "version": "10.2.23", + "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-10.2.23.tgz", + "integrity": "sha512-xrPtl7f1LxS+B6o+W7ueuQh67CwRkfl+UKJncaslnqYdkxKmNBB4wnzVcW8ZsRdwbsla/v43PtwAvSlzxCzq2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/batch-execute": "^9.0.19", + "@graphql-tools/executor": "^1.4.9", + "@graphql-tools/schema": "^10.0.25", + "@graphql-tools/utils": "^10.9.1", + "@repeaterjs/repeater": "^3.0.6", + "@whatwg-node/promise-helpers": "^1.3.0", + "dataloader": "^2.2.3", + "dset": "^3.1.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/graphql-config/node_modules/@graphql-tools/executor-common": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-common/-/executor-common-0.0.6.tgz", + "integrity": "sha512-JAH/R1zf77CSkpYATIJw+eOJwsbWocdDjY+avY7G+P5HCXxwQjAjWVkJI1QJBQYjPQDVxwf1fmTZlIN3VOadow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@envelop/core": "^5.3.0", + "@graphql-tools/utils": "^10.9.1" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/graphql-config/node_modules/@graphql-tools/executor-graphql-ws": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-2.0.7.tgz", + "integrity": "sha512-J27za7sKF6RjhmvSOwOQFeNhNHyP4f4niqPnerJmq73OtLx9Y2PGOhkXOEB0PjhvPJceuttkD2O1yMgEkTGs3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/executor-common": "^0.0.6", + "@graphql-tools/utils": "^10.9.1", + "@whatwg-node/disposablestack": "^0.0.6", + "graphql-ws": "^6.0.6", + "isomorphic-ws": "^5.0.0", + "tslib": "^2.8.1", + "ws": "^8.18.3" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/graphql-config/node_modules/@graphql-tools/executor-http": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-1.3.3.tgz", + "integrity": "sha512-LIy+l08/Ivl8f8sMiHW2ebyck59JzyzO/yF9SFS4NH6MJZUezA1xThUXCDIKhHiD56h/gPojbkpcFvM2CbNE7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-hive/signal": "^1.0.0", + "@graphql-tools/executor-common": "^0.0.4", + "@graphql-tools/utils": "^10.8.1", + "@repeaterjs/repeater": "^3.0.4", + "@whatwg-node/disposablestack": "^0.0.6", + "@whatwg-node/fetch": "^0.10.4", + "@whatwg-node/promise-helpers": "^1.3.0", + "meros": "^1.2.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/graphql-config/node_modules/@graphql-tools/executor-http/node_modules/@graphql-tools/executor-common": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-common/-/executor-common-0.0.4.tgz", + "integrity": "sha512-SEH/OWR+sHbknqZyROCFHcRrbZeUAyjCsgpVWCRjqjqRbiJiXq6TxNIIOmpXgkrXWW/2Ev4Wms6YSGJXjdCs6Q==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "@envelop/core": "^5.2.3", + "@graphql-tools/utils": "^10.8.1" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz", - "integrity": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==", - "cpu": [ - "x64" - ], + "node_modules/graphql-config/node_modules/@graphql-tools/url-loader": { + "version": "8.0.33", + "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-8.0.33.tgz", + "integrity": "sha512-Fu626qcNHcqAj8uYd7QRarcJn5XZ863kmxsg1sm0fyjyfBJnsvC7ddFt6Hayz5kxVKfsnjxiDfPMXanvsQVBKw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "@graphql-tools/executor-graphql-ws": "^2.0.1", + "@graphql-tools/executor-http": "^1.1.9", + "@graphql-tools/executor-legacy-ws": "^1.1.19", + "@graphql-tools/utils": "^10.9.1", + "@graphql-tools/wrap": "^10.0.16", + "@types/ws": "^8.0.0", + "@whatwg-node/fetch": "^0.10.0", + "@whatwg-node/promise-helpers": "^1.0.0", + "isomorphic-ws": "^5.0.0", + "sync-fetch": "0.6.0-2", + "tslib": "^2.4.0", + "ws": "^8.17.1" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz", - "integrity": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==", - "cpu": [ - "x64" - ], + "node_modules/graphql-config/node_modules/@graphql-tools/wrap": { + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-10.1.4.tgz", + "integrity": "sha512-7pyNKqXProRjlSdqOtrbnFRMQAVamCmEREilOXtZujxY6kYit3tvWWSjUrcIOheltTffoRh7EQSjpy2JDCzasg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "@graphql-tools/delegate": "^10.2.23", + "@graphql-tools/schema": "^10.0.25", + "@graphql-tools/utils": "^10.9.1", + "@whatwg-node/promise-helpers": "^1.3.0", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz", - "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==", - "cpu": [ - "arm64" - ], + "node_modules/graphql-config/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz", - "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==", - "cpu": [ - "arm64" - ], + "node_modules/graphql-config/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz", - "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==", - "cpu": [ - "ia32" - ], + "node_modules/graphql-config/node_modules/sync-fetch": { + "version": "0.6.0-2", + "resolved": "https://registry.npmjs.org/sync-fetch/-/sync-fetch-0.6.0-2.tgz", + "integrity": "sha512-c7AfkZ9udatCuAy9RSfiGPpeOKKUAUK5e1cXadLOGUjasdxqYqAK0jTNkM/FSEyJ3a5Ra27j/tw/PS0qLmaF/A==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "node-fetch": "^3.3.2", + "timeout-signal": "^2.0.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz", - "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==", - "cpu": [ - "x64" - ], + "node_modules/graphql-config/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/graphql-tag": { + "version": "2.12.6", + "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", + "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "tslib": "^2.1.0" + }, + "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" + } + }, + "node_modules/graphql-ws": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-6.0.7.tgz", + "integrity": "sha512-yoLRW+KRlDmnnROdAu7sX77VNLC0bsFoZyGQJLy1cF+X/SkLg/fWkRGrEEYQK8o2cafJ2wmEaMqMEZB3U3DYDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@fastify/websocket": "^10 || ^11", + "crossws": "~0.3", + "graphql": "^15.10.1 || ^16", + "ws": "^8" + }, + "peerDependenciesMeta": { + "@fastify/websocket": { + "optional": true + }, + "crossws": { + "optional": true + }, + "ws": { + "optional": true + } + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/header-case": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", + "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "capital-case": "^1.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz", + "integrity": "sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz", + "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz", - "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==", - "cpu": [ - "x64" - ], + "node_modules/is-lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-2.0.2.tgz", + "integrity": "sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "tslib": "^2.0.3" + } }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } }, - "node_modules/@types/node": { - "version": "22.19.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.2.tgz", - "integrity": "sha512-LPM2G3Syo1GLzXLGJAKdqoU35XvrWzGJ21/7sgZTUpbkBaOasTj8tjwn6w+hCkqaa1TfJ/w67rJSwYItlJ2mYw==", + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "undici-types": "~6.21.0" + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@vitest/coverage-v8": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.1.9.tgz", - "integrity": "sha512-Z2cOr0ksM00MpEfyVE8KXIYPEcBFxdbLSs56L8PO0QQMxt/6bDj45uQfxoc96v05KW3clk7vvgP0qfDit9DmfQ==", + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", "dev": true, "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@bcoe/v8-coverage": "^0.2.3", - "debug": "^4.3.7", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^5.0.6", - "istanbul-reports": "^3.1.7", - "magic-string": "^0.30.12", - "magicast": "^0.3.5", - "std-env": "^3.8.0", - "test-exclude": "^7.0.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "unc-path-regex": "^0.1.2" }, - "peerDependencies": { - "@vitest/browser": "2.1.9", - "vitest": "2.1.9" - }, - "peerDependenciesMeta": { - "@vitest/browser": { - "optional": true - } + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@vitest/expect": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.9.tgz", - "integrity": "sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==", + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, "license": "MIT", - "dependencies": { - "@vitest/spy": "2.1.9", - "@vitest/utils": "2.1.9", - "chai": "^5.1.2", - "tinyrainbow": "^1.2.0" + "engines": { + "node": ">=10" }, "funding": { - "url": "https://opencollective.com/vitest" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@vitest/mocker": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.9.tgz", - "integrity": "sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==", + "node_modules/is-upper-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-2.0.2.tgz", + "integrity": "sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "2.1.9", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.12" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^5.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } + "tslib": "^2.0.3" } }, - "node_modules/@vitest/pretty-format": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz", - "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==", + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, + "license": "ISC" + }, + "node_modules/isomorphic-unfetch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz", + "integrity": "sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==", "license": "MIT", "dependencies": { - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "node-fetch": "^2.6.1", + "unfetch": "^4.2.0" } }, - "node_modules/@vitest/runner": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.9.tgz", - "integrity": "sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==", + "node_modules/isomorphic-ws": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", + "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/isows": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.7.tgz", + "integrity": "sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@vitest/utils": "2.1.9", - "pathe": "^1.1.2" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": ">=10" } }, - "node_modules/@vitest/snapshot": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.9.tgz", - "integrity": "sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==", + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "@vitest/pretty-format": "2.1.9", - "magic-string": "^0.30.12", - "pathe": "^1.1.2" + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": ">=10" } }, - "node_modules/@vitest/spy": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.9.tgz", - "integrity": "sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==", + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "tinyspy": "^3.0.2" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": ">=8" } }, - "node_modules/@vitest/ui": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-2.1.9.tgz", - "integrity": "sha512-izzd2zmnk8Nl5ECYkW27328RbQ1nKvkm6Bb5DAaz1Gk59EbLkiCMa6OLT0NoaAYTjOFS6N+SMYW1nh4/9ljPiw==", + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, - "license": "MIT", - "peer": true, + "license": "BlueOak-1.0.0", "dependencies": { - "@vitest/utils": "2.1.9", - "fflate": "^0.8.2", - "flatted": "^3.3.1", - "pathe": "^1.1.2", - "sirv": "^3.0.0", - "tinyglobby": "^0.2.10", - "tinyrainbow": "^1.2.0" + "@isaacs/cliui": "^8.0.2" }, "funding": { - "url": "https://opencollective.com/vitest" + "url": "https://github.com/sponsors/isaacs" }, - "peerDependencies": { - "vitest": "2.1.9" + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/@vitest/utils": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz", - "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==", + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", "dev": true, "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "2.1.9", - "loupe": "^3.1.2", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "bin": { + "jiti": "lib/jiti-cli.mjs" } }, - "node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "argparse": "^2.0.1" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, "engines": { - "node": ">=12" + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-to-pretty-yaml": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/json-to-pretty-yaml/-/json-to-pretty-yaml-1.2.2.tgz", + "integrity": "sha512-rvm6hunfCcqegwYaG5T4yKJWxc9FXFgBVrcTZ4XfSVRwa5HA/Xs+vB/Eo9treYYHCeNM0nrSUr82V/M31Urc7A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "remedial": "^1.0.7", + "remove-trailing-spaces": "^1.0.6" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": ">= 0.2.0" } }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true, "license": "MIT" }, - "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "node_modules/listr2": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", + "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "cli-truncate": "^5.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20.0.0" } }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "node_modules/listr2/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/chai": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", - "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, "license": "MIT", "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, "engines": { - "node": ">= 16" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", "dev": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "node_modules/log-update/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, "license": "MIT" }, - "node_modules/commander": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", - "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", + "node_modules/log-update/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, "engines": { - "node": ">=20" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">= 8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" + "js-tokens": "^3.0.0 || ^4.0.0" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "bin": { + "loose-envify": "cli.js" } }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "node_modules/loupe": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "tslib": "^2.0.3" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "node_modules/lower-case-first": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-2.0.2.tgz", + "integrity": "sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "license": "MIT" + "license": "ISC" }, - "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } }, - "node_modules/esbuild": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.1.tgz", - "integrity": "sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==", + "node_modules/magicast": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", "dev": true, - "hasInstallScript": true, "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" + "dependencies": { + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" }, "engines": { - "node": ">=18" + "node": ">=10" }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.1", - "@esbuild/android-arm": "0.27.1", - "@esbuild/android-arm64": "0.27.1", - "@esbuild/android-x64": "0.27.1", - "@esbuild/darwin-arm64": "0.27.1", - "@esbuild/darwin-x64": "0.27.1", - "@esbuild/freebsd-arm64": "0.27.1", - "@esbuild/freebsd-x64": "0.27.1", - "@esbuild/linux-arm": "0.27.1", - "@esbuild/linux-arm64": "0.27.1", - "@esbuild/linux-ia32": "0.27.1", - "@esbuild/linux-loong64": "0.27.1", - "@esbuild/linux-mips64el": "0.27.1", - "@esbuild/linux-ppc64": "0.27.1", - "@esbuild/linux-riscv64": "0.27.1", - "@esbuild/linux-s390x": "0.27.1", - "@esbuild/linux-x64": "0.27.1", - "@esbuild/netbsd-arm64": "0.27.1", - "@esbuild/netbsd-x64": "0.27.1", - "@esbuild/openbsd-arm64": "0.27.1", - "@esbuild/openbsd-x64": "0.27.1", - "@esbuild/openharmony-arm64": "0.27.1", - "@esbuild/sunos-x64": "0.27.1", - "@esbuild/win32-arm64": "0.27.1", - "@esbuild/win32-ia32": "0.27.1", - "@esbuild/win32-x64": "0.27.1" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", "dev": true, "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/expect-type": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", - "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "engines": { - "node": ">=12.0.0" + "node": ">= 8" } }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "node_modules/meros": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/meros/-/meros-1.3.2.tgz", + "integrity": "sha512-Q3mobPbvEx7XbwhnC1J1r60+5H6EZyNccdzSz0eGexJRwouUtTZxPVRGdqKtxlpD84ScK4+tIGldkqDtCKdI0A==", "dev": true, "license": "MIT", "engines": { - "node": ">=12.0.0" + "node": ">=13" }, "peerDependencies": { - "picomatch": "^3 || ^4" + "@types/node": ">=13" }, "peerDependenciesMeta": { - "picomatch": { + "@types/node": { "optional": true } } }, - "node_modules/fflate": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", - "dev": true, - "license": "MIT" - }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8.6" } }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "hasInstallScript": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/get-tsconfig": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", - "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true, "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" + "engines": { + "node": ">=18" }, "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "brace-expansion": "^2.0.1" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/graphql": { - "version": "15.10.1", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.10.1.tgz", - "integrity": "sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==", - "license": "MIT", - "peer": true, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", "engines": { - "node": ">= 10.x" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", "dev": true, - "license": "MIT", + "license": "ISC", "engines": { - "node": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, - "license": "ISC" - }, - "node_modules/isomorphic-unfetch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz", - "integrity": "sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", - "dependencies": { - "node-fetch": "^2.6.1", - "unfetch": "^4.2.0" - } - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, "engines": { - "node": ">=8" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" + "lower-case": "^2.0.2", + "tslib": "^2.0.3" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" - }, - "engines": { - "node": ">=10" - } + "license": "MIT", + "optional": true, + "peer": true }, - "node_modules/istanbul-reports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10.5.0" } }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", "dependencies": { - "@isaacs/cliui": "^8.0.2" + "whatwg-url": "^5.0.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": "4.x || >=6.0.0" }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node_modules/loupe": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", - "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true, "license": "MIT" }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "dev": true, - "license": "ISC" + "license": "MIT" }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/magicast": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", - "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "node_modules/nullthrows": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/parser": "^7.25.4", - "@babel/types": "^7.25.4", - "source-map-js": "^1.2.0" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, "license": "MIT", "dependencies": { - "semver": "^7.5.3" + "mimic-function": "^5.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } + "license": "BlueOak-1.0.0" }, - "node_modules/mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">=0.8" } }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, "license": "MIT", "dependencies": { - "whatwg-url": "^5.0.0" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" + "node": ">=8" }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", "dev": true, - "license": "BlueOak-1.0.0" + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", + "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } }, "node_modules/path-key": { "version": "3.1.1", @@ -1762,6 +6170,29 @@ "node": ">=8" } }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-scurry": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", @@ -1779,6 +6210,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/pathe": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", @@ -1809,7 +6250,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -1846,6 +6286,93 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/relay-runtime": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/relay-runtime/-/relay-runtime-12.0.0.tgz", + "integrity": "sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.0.0", + "fbjs": "^3.0.0", + "invariant": "^2.2.4" + } + }, + "node_modules/remedial": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/remedial/-/remedial-1.0.8.tgz", + "integrity": "sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg==", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "engines": { + "node": "*" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true, + "license": "ISC" + }, + "node_modules/remove-trailing-spaces": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/remove-trailing-spaces/-/remove-trailing-spaces-1.0.9.tgz", + "integrity": "sha512-xzG7w5IRijvIkHIjDk65URsJJ7k4J95wmcArY5PRcmjldIOl7oTvG8+X2Ag690R7SfwiOcHrWZKVc1Pp5WIOzA==", + "dev": true, + "license": "MIT" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", @@ -1856,6 +6383,41 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, "node_modules/rollup": { "version": "4.53.3", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz", @@ -1898,6 +6460,37 @@ "fsevents": "~2.3.2" } }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, "node_modules/semver": { "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", @@ -1911,6 +6504,25 @@ "node": ">=10" } }, + "node_modules/sentence-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", + "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true, + "license": "MIT" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -1934,6 +6546,19 @@ "node": ">=8" } }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/siginfo": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", @@ -1954,6 +6579,13 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/signedsource": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/signedsource/-/signedsource-1.0.0.tgz", + "integrity": "sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/sirv": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", @@ -1969,6 +6601,60 @@ "node": ">=18" } }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -1979,6 +6665,16 @@ "node": ">=0.10.0" } }, + "node_modules/sponge-case": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sponge-case/-/sponge-case-1.0.1.tgz", + "integrity": "sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -1993,6 +6689,13 @@ "dev": true, "license": "MIT" }, + "node_modules/string-env-interpolation": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string-env-interpolation/-/string-env-interpolation-1.0.1.tgz", + "integrity": "sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg==", + "dev": true, + "license": "MIT" + }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -2110,6 +6813,50 @@ "node": ">=8" } }, + "node_modules/swap-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-2.0.2.tgz", + "integrity": "sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/sync-fetch": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/sync-fetch/-/sync-fetch-0.6.0.tgz", + "integrity": "sha512-IELLEvzHuCfc1uTsshPK58ViSdNqXxlml1U+fmwJIKLYKOr/rAtBrorE2RYm5IHaMpDNlmC0fr1LAvdXvyheEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "node-fetch": "^3.3.2", + "timeout-signal": "^2.0.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/sync-fetch/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, "node_modules/test-exclude": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", @@ -2125,6 +6872,16 @@ "node": ">=18" } }, + "node_modules/timeout-signal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/timeout-signal/-/timeout-signal-2.0.0.tgz", + "integrity": "sha512-YBGpG4bWsHoPvofT6y/5iqulfXIiIErl5B0LdtHT1mGXDFTAhhRrbUpTvBgYbovr+3cKblya2WAOcpoy90XguA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", @@ -2186,6 +6943,29 @@ "node": ">=14.0.0" } }, + "node_modules/title-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-3.0.3.tgz", + "integrity": "sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/totalist": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", @@ -2202,6 +6982,20 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "license": "MIT" }, + "node_modules/ts-log": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/ts-log/-/ts-log-2.2.7.tgz", + "integrity": "sha512-320x5Ggei84AxzlXp91QkIGSw5wgaLT6GeAH0KsqDmRZdVWW2OiSeVvElVoatk3f7nicwXlElXsoFkARiGE2yg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true, + "license": "0BSD" + }, "node_modules/tsx": { "version": "4.21.0", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", @@ -2236,6 +7030,43 @@ "node": ">=14.17" } }, + "node_modules/ua-parser-js": { + "version": "1.0.41", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.41.tgz", + "integrity": "sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "license": "MIT", + "bin": { + "ua-parser-js": "script/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", @@ -2249,13 +7080,83 @@ "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==", "license": "MIT" }, + "node_modules/unixify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unixify/-/unixify-1.0.0.tgz", + "integrity": "sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "normalize-path": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/upper-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", + "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/upper-case-first": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", + "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/urlpattern-polyfill": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.1.0.tgz", + "integrity": "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==", + "dev": true, + "license": "MIT" + }, "node_modules/vite": { "version": "5.4.21", "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", @@ -2769,7 +7670,6 @@ "integrity": "sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/expect": "2.1.9", "@vitest/mocker": "2.1.9", @@ -2830,12 +7730,32 @@ } } }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "license": "BSD-2-Clause" }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -2976,6 +7896,161 @@ "engines": { "node": ">=8" } + }, + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "dev": true, + "license": "MIT", + "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 + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/package.json b/package.json index 33b8887..4801b45 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,9 @@ "test:ui": "vitest --ui", "test:coverage": "vitest run --coverage", "test:commands": "tsx tests/command-coverage.ts", + "generate": "graphql-codegen --config codegen.config.ts", + "prestart": "generate", + "predev": "generate", "prepublishOnly": "npm run build && npm run test && test -x dist/main.js" }, "engines": { @@ -48,11 +51,19 @@ "commander": "^14.0.0" }, "devDependencies": { + "@graphql-codegen/cli": "^6.1.1", + "@graphql-codegen/client-preset": "^5.2.2", + "@graphql-codegen/introspection": "5.0.0", + "@graphql-codegen/schema-ast": "^5.0.0", "@types/node": "^22.0.0", "@vitest/coverage-v8": "^2.1.8", "@vitest/ui": "^2.1.8", "tsx": "^4.20.5", "typescript": "^5.0.0", "vitest": "^2.1.8" + }, + "graphql": { + "schema": "https://api.linear.app/graphql", + "documents": "src/**/*.graphql" } } From ecebea2602c55c37ef15905e38286675c82bc645 Mon Sep 17 00:00:00 2001 From: Fabian Jocks <24557998+iamfj@users.noreply.github.com> Date: Mon, 2 Feb 2026 22:37:23 +0100 Subject: [PATCH 03/31] chore(vscode): add exts for GraphQL and EditorConfig --- .vscode/extensions.json | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .vscode/extensions.json diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..163d3ff --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "graphql.vscode-graphql", + "graphql.vscode-graphql-syntax", + "editorconfig.editorconfig" + ] +} From f9e0d7c7d473e710a62e29535cb5e30b03f9ac67 Mon Sep 17 00:00:00 2001 From: Fabian Jocks <24557998+iamfj@users.noreply.github.com> Date: Mon, 2 Feb 2026 22:37:31 +0100 Subject: [PATCH 04/31] chore: add .editorconfig for consistent coding style --- .editorconfig | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..79fe802 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,8 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +insert_final_newline = true From dc0f8efa9092b2cbc8f465bcea9c2ff08dbe4c73 Mon Sep 17 00:00:00 2001 From: Fabian Jocks <24557998+iamfj@users.noreply.github.com> Date: Mon, 2 Feb 2026 22:38:13 +0100 Subject: [PATCH 05/31] feat: add GraphQL codegen configuration file --- codegen.config.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 codegen.config.ts diff --git a/codegen.config.ts b/codegen.config.ts new file mode 100644 index 0000000..c7f9486 --- /dev/null +++ b/codegen.config.ts @@ -0,0 +1,16 @@ +import type { CodegenConfig } from "@graphql-codegen/cli"; + +const config: CodegenConfig = { + schema: "https://api.linear.app/graphql", // or download schema locally + documents: ["graphql/**/*.graphql"], + generates: { + "./src/gql/": { + preset: "client", + presetConfig: { + fragmentMasking: false, + }, + }, + }, +}; + +export default config; From e595266b6ba6b31b892abbe02190a9de99a32d73 Mon Sep 17 00:00:00 2001 From: Fabian Jocks <24557998+iamfj@users.noreply.github.com> Date: Mon, 2 Feb 2026 22:39:12 +0100 Subject: [PATCH 06/31] feat: migrate queries and mutations to `.graphql` files --- graphql/queries/attachments.graphql | 57 ++++ graphql/queries/common.graphql | 147 ++++++++ graphql/queries/cycles.graphql | 40 +++ graphql/queries/documents.graphql | 75 ++++ graphql/queries/issues.graphql | 329 ++++++++++++++++++ graphql/queries/project-milestones.graphql | 160 +++++++++ src/queries/attachments.ts | 71 ---- src/queries/common.ts | 170 ---------- src/queries/documents.ts | 94 ------ src/queries/index.ts | 23 -- src/queries/issues.ts | 376 --------------------- src/queries/project-milestones.ts | 149 -------- 12 files changed, 808 insertions(+), 883 deletions(-) create mode 100644 graphql/queries/attachments.graphql create mode 100644 graphql/queries/common.graphql create mode 100644 graphql/queries/cycles.graphql create mode 100644 graphql/queries/documents.graphql create mode 100644 graphql/queries/issues.graphql create mode 100644 graphql/queries/project-milestones.graphql delete mode 100644 src/queries/attachments.ts delete mode 100644 src/queries/common.ts delete mode 100644 src/queries/documents.ts delete mode 100644 src/queries/index.ts delete mode 100644 src/queries/issues.ts delete mode 100644 src/queries/project-milestones.ts diff --git a/graphql/queries/attachments.graphql b/graphql/queries/attachments.graphql new file mode 100644 index 0000000..ea3be27 --- /dev/null +++ b/graphql/queries/attachments.graphql @@ -0,0 +1,57 @@ +# ------------------------------------------------------------ +# GraphQL queries and mutations for Linear attachments +# +# Attachments allow linking any URL to an issue. This is the mechanism +# to associate documents (or any external resource) with issues, since +# documents cannot be directly linked to issues in Linear's data model. +# +# Key behavior: Attachments are idempotent - creating an attachment with +# the same url + issueId will update the existing attachment. +# ------------------------------------------------------------ + +# Attachment fields fragment +# +# Defines the basic fields for an attachment entity. +fragment AttachmentFields on Attachment { + id + title + subtitle + url + createdAt + updatedAt +} + +# Create an attachment on an issue +# +# If an attachment with the same url and issueId already exists, +# the existing record is updated instead of creating a duplicate. +mutation AttachmentCreate($input: AttachmentCreateInput!) { + attachmentCreate(input: $input) { + success + attachment { + ...AttachmentFields + } + } +} + +# Delete an attachment +# +# Deletes an attachment and returns success status. +mutation AttachmentDelete($id: String!) { + attachmentDelete(id: $id) { + success + } +} + +# List attachments on an issue +# +# Fetches a list of attachments for a given issue. +query ListAttachments($issueId: String!) { + issue(id: $issueId) { + attachments { + nodes { + ...AttachmentFields + } + } + } +} diff --git a/graphql/queries/common.graphql b/graphql/queries/common.graphql new file mode 100644 index 0000000..7042622 --- /dev/null +++ b/graphql/queries/common.graphql @@ -0,0 +1,147 @@ +# ------------------------------------------------------------ +# Common GraphQL fragments for reuse across queries +# +# These fragments define reusable field selections for Linear entities, +# ensuring consistent data structure and reducing duplication in query definitions. +# Each fragment focuses on specific entity relationships for optimal querying. +# ------------------------------------------------------------ + +# Complete issue fragment with all relationships +# +# Combines all issue fragments into a comprehensive field selection. +# This is used when full issue details are needed including all +# relationships (state, assignee, team, project, labels, comments). +fragment CompleteIssueFields on Issue { + id + identifier + title + description + branchName + priority + estimate + createdAt + updatedAt + state { + id + name + } + assignee { + id + name + } + team { + id + key + name + } + project { + id + name + } + labels { + nodes { + id + name + } + } + cycle { + id + name + number + } + projectMilestone { + id + name + targetDate + } + parent { + id + identifier + title + } + children { + nodes { + id + identifier + title + } + } +} + +# Complete issue fragment with all relationships and comments +# +# Combines all issue fragments into a comprehensive field selection. +# This is used when full issue details are needed including all +# relationships (state, assignee, team, project, labels, comments). +fragment CompleteIssueWithCommentsFields on Issue { + ...CompleteIssueFields + comments { + nodes { + id + body + } + } +} + + +# Complete issue search fragment with all relationships +# +# Combines all issue fragments into a comprehensive field selection. +# This is used when full issue details are needed including all +# relationships (state, assignee, team, project, labels, comments). +fragment CompleteIssueSearchFields on IssueSearchResult { + id + identifier + title + description + branchName + priority + estimate + createdAt + updatedAt + state { + id + name + } + assignee { + id + name + } + team { + id + key + name + } + project { + id + name + } + labels { + nodes { + id + name + } + } + cycle { + id + name + number + } + projectMilestone { + id + name + targetDate + } + parent { + id + identifier + title + } + children { + nodes { + id + identifier + title + } + } +} diff --git a/graphql/queries/cycles.graphql b/graphql/queries/cycles.graphql new file mode 100644 index 0000000..e46568c --- /dev/null +++ b/graphql/queries/cycles.graphql @@ -0,0 +1,40 @@ +query FindCycleScoped($name: String!, $teamId: ID!) { + cycles( + filter: { + and: [{ name: { eq: $name } }, { team: { id: { eq: $teamId } } }] + } + first: 10 + ) { + nodes { + id + name + number + startsAt + isActive + isNext + isPrevious + team { + id + key + } + } + } +} + +query FindCycleGlobal($name: String!) { + cycles(filter: { name: { eq: $name } }, first: 10) { + nodes { + id + name + number + startsAt + isActive + isNext + isPrevious + team { + id + key + } + } + } +} diff --git a/graphql/queries/documents.graphql b/graphql/queries/documents.graphql new file mode 100644 index 0000000..d8174ff --- /dev/null +++ b/graphql/queries/documents.graphql @@ -0,0 +1,75 @@ +# ------------------------------------------------------------ +# GraphQL queries and mutations for Linear documents +# +# Documents are standalone entities that can be associated with projects, +# initiatives, or teams. To link a document to an issue, use the +# attachments API (see attachments.ts). +# ------------------------------------------------------------ + +# Document fields fragment +# +# Defines the basic fields for a document entity. +fragment DocumentFields on Document { + id + title + content + slugId + url + icon + color + createdAt + updatedAt +} + +# Get a single document by ID +# +# Fetches a document by its unique identifier. +query GetDocument($id: String!) { + document(id: $id) { + ...DocumentFields + } +} + +# List documents with optional filtering +# +# Fetches a list of documents with optional filtering criteria. +query ListDocuments($first: Int!, $filter: DocumentFilter) { + documents(first: $first, filter: $filter) { + nodes { + ...DocumentFields + } + } +} + +# Create a new document mutation +# +# Creates a new document and returns the created document data. +mutation DocumentCreate($input: DocumentCreateInput!) { + documentCreate(input: $input) { + success + document { + ...DocumentFields + } + } +} + +# Update an existing document mutation +# +# Updates an existing document and returns the updated document data. +mutation DocumentUpdate($id: String!, $input: DocumentUpdateInput!) { + documentUpdate(id: $id, input: $input) { + success, + document { + ...DocumentFields + } + } +} + +# Delete a document mutation +# +# Deletes a document and returns success status. +mutation DocumentDelete($id: String!) { + documentDelete(id: $id) { + success + } +} diff --git a/graphql/queries/issues.graphql b/graphql/queries/issues.graphql new file mode 100644 index 0000000..e6a0f58 --- /dev/null +++ b/graphql/queries/issues.graphql @@ -0,0 +1,329 @@ +# ------------------------------------------------------------ +# Optimized GraphQL queries for issue operations +# +# This module contains highly optimized GraphQL queries that fetch +# all necessary issue data in single requests, eliminating N+1 query +# problem common with Linear SDK. Each query uses comprehensive +# fragments to ensure consistent data structures. +# ------------------------------------------------------------ + +# Get issues list with all relationships in single query +# +# Fetches paginated issues excluding completed ones, +# ordered by most recently updated. Includes all relationships +# for comprehensive issue data. +query GetIssues($first: Int!, $orderBy: PaginationOrderBy) { + issues( + first: $first + orderBy: $orderBy + filter: { state: { type: { neq: "completed" } } } + ) { + nodes { + ...CompleteIssueFields + } + } +} + +# Get single issue by UUID with comments and all relationships +# +# Fetches complete issue data including comments by direct UUID lookup. +# Uses the comprehensive fragment with comment data for detailed view. +query GetIssueById($id: String!) { + issue(id: $id) { + ...CompleteIssueFields + } +} + +# Get issue by identifier (team key + number) +# +# Fetches issue using TEAM-123 format. Resolves team key and +# issue number to find the exact issue, returning complete data with comments. +query GetIssueByIdentifier($teamKey: String!, $number: Float!) { + issues( + filter: { team: { key: { eq: $teamKey } }, number: { eq: $number } } + first: 1 + ) { + nodes { + ...CompleteIssueFields + } + } +} + +# Get issue team by issue ID +# +# Fetches the team associated with an issue by its ID. +query GetIssueTeam($issueId: String!) { + issue(id: $issueId) { + team { + id + } + } +} + +# Search issues with text search and all relationships in single query +# +# Provides full-text search across Linear issues with complete +# relationship data for each match. +query SearchIssues($term: String!, $first: Int!) { + searchIssues(term: $term, first: $first, includeArchived: false) { + nodes { + ...CompleteIssueSearchFields + } + } +} + +# Search issues with advanced filters and all relationships in single query +# +# Supports filtering by team, assignee, project, and states. +# Used by the advanced search functionality with multiple criteria. +query FilteredSearchIssues( + $first: Int! + $filter: IssueFilter + $orderBy: PaginationOrderBy +) { + issues( + first: $first + filter: $filter + orderBy: $orderBy + includeArchived: false + ) { + nodes { + ...CompleteIssueFields + } + } +} + +# Batch resolve query for search filters +# +# Resolves human-readable identifiers to UUIDs in a single batch query. +# Used to pre-resolve teams, projects, and assignees before executing +# main search query to avoid N+1 queries. +query BatchResolveForSearch( + $teamKey: String + $teamName: String + $projectName: String + $assigneeEmail: String +) { + teams( + filter: { or: [{ key: { eq: $teamKey } }, { name: { eq: $teamName } }] } + first: 1 + ) { + nodes { + id + key + name + } + } + projects(filter: { name: { eqIgnoreCase: $projectName } }, first: 1) { + nodes { + id + name + } + } + users(filter: { email: { eq: $assigneeEmail } }, first: 1) { + nodes { + id + name + email + } + } +} + +# Comprehensive batch resolve for update operations +# +# Resolves all necessary entity references in a single batch query +# before issue update. Includes labels, projects, teams, and parent issues. +# This prevents N+1 queries during update operations. +query BatchResolveForUpdate( + $labelNames: [String!] + $projectName: String + $teamKey: String + $issueNumber: Float + $milestoneName: String +) { + # Resolve labels if provided + labels: issueLabels(filter: { name: { in: $labelNames } }) { + nodes { + id + name + isGroup + parent { + id + name + } + children { + nodes { + id + name + } + } + } + } + + # Resolve project if provided (case-insensitive to be user-friendly) + projects(filter: { name: { eqIgnoreCase: $projectName } }, first: 1) { + nodes { + id + name + projectMilestones { + nodes { + id + name + } + } + } + } + + # Resolve milestone if provided (standalone query in case no project context) + milestones: projectMilestones( + filter: { name: { eq: $milestoneName } } + first: 1 + ) { + nodes { + id + name + } + } + + # Resolve issue identifier if provided + issues( + filter: { + and: [ + { team: { key: { eq: $teamKey } } } + { number: { eq: $issueNumber } } + ] + } + first: 1 + ) { + nodes { + id + identifier + labels { + nodes { + id + name + } + } + team { + id + key + name + } + project { + id + projectMilestones { + nodes { + id + name + } + } + } + } + } +} + +# Comprehensive batch resolve for create operations +# +# Resolves all entity references needed for issue creation in a single +# batch query. Prevents N+1 queries during issue creation by +# pre-resolving teams, projects, labels, and parent issues. +query BatchResolveForCreate( + $teamKey: String + $teamName: String + $projectName: String + $labelNames: [String!] + $parentTeamKey: String + $parentIssueNumber: Float +) { + # Resolve team if provided + teams( + filter: { or: [{ key: { eq: $teamKey } }, { name: { eq: $teamName } }] } + first: 1 + ) { + nodes { + id + key + name + } + } + + # Resolve project if provided (case-insensitive to be user-friendly) + projects(filter: { name: { eqIgnoreCase: $projectName } }, first: 1) { + nodes { + id + name + projectMilestones { + nodes { + id + name + } + } + # Projects don't own cycles directly, but include teams for context if needed + } + } + + # Resolve labels if provided + labels: issueLabels(filter: { name: { in: $labelNames } }) { + nodes { + id + name + isGroup + parent { + id + name + } + children { + nodes { + id + name + } + } + } + } + + # Resolve parent issue if provided + parentIssues: issues( + filter: { + and: [ + { team: { key: { eq: $parentTeamKey } } } + { number: { eq: $parentIssueNumber } } + ] + } + first: 1 + ) { + nodes { + id + identifier + } + } + + # Resolve cycles by name (team-scoped lookup is preferred but we also provide global fallback) +} + +# Create issue mutation with complete response +# +# Creates a new issue and returns complete issue data including +# all relationships. Uses the comprehensive fragment to ensure +# consistent data structure with read operations. +mutation CreateIssue($input: IssueCreateInput!) { + issueCreate(input: $input) { + success + issue { + ...CompleteIssueWithCommentsFields + } + } +} + +# Update issue mutation with complete response +# +# Updates an existing issue and returns complete issue data with +# all relationships. Ensures consistency between update and read +# operations by using the same fragment structure. +mutation UpdateIssue($id: String!, $input: IssueUpdateInput!) { + issueUpdate(id: $id, input: $input) { + success + issue { + ...CompleteIssueWithCommentsFields + } + } +} diff --git a/graphql/queries/project-milestones.graphql b/graphql/queries/project-milestones.graphql new file mode 100644 index 0000000..cc0ed25 --- /dev/null +++ b/graphql/queries/project-milestones.graphql @@ -0,0 +1,160 @@ +# ------------------------------------------------------------ +# ------------------------------------------------------------ +# Common GraphQL fragments for reuse across queries +# +# These fragments define reusable field selections for Linear entities, +# ensuring consistent data structure and reducing duplication. Place +# all shared fragments for project-milestone-related queries here. +# ------------------------------------------------------------ + +# List project milestones in a project with minimal fields (optimized) +# +# Fetches a list of project milestones for a given project. +query ListProjectMilestones($projectId: String!, $first: Int!) { + project(id: $projectId) { + id + name + projectMilestones(first: $first) { + nodes { + id + name + description + targetDate + sortOrder + createdAt + updatedAt + } + } + } +} + +# Get single project milestone by ID with full issue details +# +# Fetches a single project milestone by its unique identifier. +query GetProjectMilestoneById($id: String!, $issuesFirst: Int) { + projectMilestone(id: $id) { + id + name + description + targetDate + sortOrder + createdAt + updatedAt + project { + id + name + } + issues(first: $issuesFirst) { + nodes { + ...CompleteIssueFields + } + } + } +} + +# Find project milestone by name within project context (scoped lookup) +# +# Searches for a project milestone by name within a specific project. +query FindProjectMilestoneScoped($name: String!, $projectId: String!) { + project(id: $projectId) { + projectMilestones(filter: { name: { eq: $name } }, first: 10) { + nodes { + id + name + targetDate + sortOrder + project { + id + name + } + } + } + } +} + +# Find project milestone by name globally (fallback) +# +# Searches for a project milestone by name across all projects. +query FindProjectMilestoneGlobal($name: String!) { + projectMilestones(filter: { name: { eq: $name } }, first: 10) { + nodes { + id + name + targetDate + sortOrder + project { + id + name + } + } + } +} + +# Create a new project milestone +# +# Creates a new project milestone and returns the created project milestone data. +mutation CreateProjectMilestone( + $projectId: String! + $name: String! + $description: String + $targetDate: TimelessDate +) { + projectMilestoneCreate( + input: { + projectId: $projectId + name: $name + description: $description + targetDate: $targetDate + } + ) { + success + projectMilestone { + id + name + description + targetDate + sortOrder + createdAt + updatedAt + project { + id + name + } + } + } +} + +# Update an existing project milestone +# +# Updates an existing project milestone and returns the updated project milestone data. +mutation UpdateProjectMilestone( + $id: String! + $name: String + $description: String + $targetDate: TimelessDate + $sortOrder: Float +) { + projectMilestoneUpdate( + id: $id + input: { + name: $name + description: $description + targetDate: $targetDate + sortOrder: $sortOrder + } + ) { + success + projectMilestone { + id + name + description + targetDate + sortOrder + updatedAt + project { + id + name + } + } + } +} diff --git a/src/queries/attachments.ts b/src/queries/attachments.ts deleted file mode 100644 index 206a6c1..0000000 --- a/src/queries/attachments.ts +++ /dev/null @@ -1,71 +0,0 @@ -/** - * GraphQL queries and mutations for Linear attachments - * - * Attachments allow linking any URL to an issue. This is the mechanism - * to associate documents (or any external resource) with issues, since - * documents cannot be directly linked to issues in Linear's data model. - * - * Key behavior: Attachments are idempotent - creating an attachment with - * the same url + issueId will update the existing attachment. - */ - -export const ATTACHMENT_FRAGMENT = ` - id - title - subtitle - url - createdAt - updatedAt - issue { - id - identifier - title - } - creator { - id - name - } -`; - -/** - * Create an attachment on an issue - * - * If an attachment with the same url and issueId already exists, - * the existing record is updated instead of creating a duplicate. - */ -export const CREATE_ATTACHMENT_MUTATION = ` - mutation AttachmentCreate($input: AttachmentCreateInput!) { - attachmentCreate(input: $input) { - success - attachment { - ${ATTACHMENT_FRAGMENT} - } - } - } -`; - -/** - * Delete an attachment - */ -export const DELETE_ATTACHMENT_MUTATION = ` - mutation AttachmentDelete($id: String!) { - attachmentDelete(id: $id) { - success - } - } -`; - -/** - * List attachments on an issue - */ -export const LIST_ATTACHMENTS_QUERY = ` - query ListAttachments($issueId: String!) { - issue(id: $issueId) { - attachments { - nodes { - ${ATTACHMENT_FRAGMENT} - } - } - } - } -`; diff --git a/src/queries/common.ts b/src/queries/common.ts deleted file mode 100644 index 97ab002..0000000 --- a/src/queries/common.ts +++ /dev/null @@ -1,170 +0,0 @@ -/** - * Common GraphQL fragments for reuse across queries - * - * These fragments define reusable field selections for Linear entities, - * ensuring consistent data structure and reducing duplication in query definitions. - * Each fragment focuses on specific entity relationships for optimal querying. - */ - -/** - * Core issue fields that are always needed - * Includes basic metadata and timestamps - */ -export const ISSUE_CORE_FIELDS = ` - id - identifier - title - description - branchName - priority - estimate - createdAt - updatedAt -`; - -/** - * Issue workflow state relationship - * Provides current status information for the issue - */ -export const ISSUE_STATE_FRAGMENT = ` - state { - id - name - } -`; - -/** - * Issue assignee relationship - * Provides user information for the assigned person - */ -export const ISSUE_ASSIGNEE_FRAGMENT = ` - assignee { - id - name - } -`; - -/** - * Issue team relationship - * Provides team information including key and name - */ -export const ISSUE_TEAM_FRAGMENT = ` - team { - id - key - name - } -`; - -/** - * Issue project relationship - * Provides project information for issue association - */ -export const ISSUE_PROJECT_FRAGMENT = ` - project { - id - name - } -`; - -/** - * Issue labels relationship - * Provides all label nodes associated with the issue - */ -export const ISSUE_LABELS_FRAGMENT = ` - labels { - nodes { - id - name - } - } -`; - -export const ISSUE_CYCLE_FRAGMENT = ` - cycle { - id - name - number - } -`; - -export const ISSUE_PROJECT_MILESTONE_FRAGMENT = ` - projectMilestone { - id - name - targetDate - } -`; - -/** - * Issue comments relationship - * Provides comment content and user information - */ -export const ISSUE_COMMENTS_FRAGMENT = ` - comments { - nodes { - id - body - createdAt - updatedAt - user { - id - name - } - } - } -`; - -/** - * Issue parent relationship - * Provides basic information about the parent issue if this is a sub-issue - */ -export const ISSUE_PARENT_FRAGMENT = ` - parent { - id - identifier - title - } -`; - -/** - * Issue children relationship - * Provides basic information about immediate child issues - */ -export const ISSUE_CHILDREN_FRAGMENT = ` - children { - nodes { - id - identifier - title - } - } -`; - -/** - * Complete issue fragment with all relationships - * - * Combines all issue fragments into a comprehensive field selection. - * This is used when full issue details are needed including all - * relationships (state, assignee, team, project, labels, comments). - */ -export const COMPLETE_ISSUE_FRAGMENT = ` - ${ISSUE_CORE_FIELDS} - ${ISSUE_STATE_FRAGMENT} - ${ISSUE_ASSIGNEE_FRAGMENT} - ${ISSUE_TEAM_FRAGMENT} - ${ISSUE_PROJECT_FRAGMENT} - ${ISSUE_LABELS_FRAGMENT} - ${ISSUE_CYCLE_FRAGMENT} - ${ISSUE_PROJECT_MILESTONE_FRAGMENT} - ${ISSUE_PARENT_FRAGMENT} - ${ISSUE_CHILDREN_FRAGMENT} -`; - -/** - * Complete issue fragment including comments - */ -export const COMPLETE_ISSUE_WITH_COMMENTS_FRAGMENT = ` - ${COMPLETE_ISSUE_FRAGMENT} - ${ISSUE_COMMENTS_FRAGMENT} -`; diff --git a/src/queries/documents.ts b/src/queries/documents.ts deleted file mode 100644 index ae809dc..0000000 --- a/src/queries/documents.ts +++ /dev/null @@ -1,94 +0,0 @@ -/** - * GraphQL queries and mutations for Linear documents - * - * Documents are standalone entities that can be associated with projects, - * initiatives, or teams. To link a document to an issue, use the - * attachments API (see attachments.ts). - */ - -export const DOCUMENT_FRAGMENT = ` - id - title - content - slugId - url - icon - color - createdAt - updatedAt - creator { - id - name - } - project { - id - name - } - trashed -`; - -/** - * Create a new document - */ -export const CREATE_DOCUMENT_MUTATION = ` - mutation DocumentCreate($input: DocumentCreateInput!) { - documentCreate(input: $input) { - success - document { - ${DOCUMENT_FRAGMENT} - } - } - } -`; - -/** - * Update an existing document - */ -export const UPDATE_DOCUMENT_MUTATION = ` - mutation DocumentUpdate($id: String!, $input: DocumentUpdateInput!) { - documentUpdate(id: $id, input: $input) { - success - document { - ${DOCUMENT_FRAGMENT} - } - } - } -`; - -/** - * Get a single document by ID - */ -export const GET_DOCUMENT_QUERY = ` - query GetDocument($id: String!) { - document(id: $id) { - ${DOCUMENT_FRAGMENT} - } - } -`; - -/** - * List documents with optional filtering - */ -export const LIST_DOCUMENTS_QUERY = ` - query ListDocuments($first: Int!, $filter: DocumentFilter) { - documents(first: $first, filter: $filter) { - nodes { - ${DOCUMENT_FRAGMENT} - } - } - } -`; - -/** - * Delete (trash) a document - * - * Note: This is a soft delete - the document is moved to trash. - * Use documentUnarchive to restore. - */ -export const DELETE_DOCUMENT_MUTATION = ` - mutation DocumentDelete($id: String!) { - documentDelete(id: $id) { - success - } - } -`; diff --git a/src/queries/index.ts b/src/queries/index.ts deleted file mode 100644 index 8947595..0000000 --- a/src/queries/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Export all GraphQL queries and fragments - * - * This barrel export provides access to all GraphQL queries and - * fragments from a single entry point. Includes common fragments, - * issue queries, and optimized batch resolution queries. - * - * Structure: - * - common.js: Reusable fragments for consistent data structures - * - issues.js: Optimized queries for issue operations - */ - -// Common fragments for reusable field selections -export * from "./common.js"; - -// Optimized queries for issue CRUD operations and batch resolution -export * from "./issues.js"; - -// Document queries and mutations -export * from "./documents.js"; - -// Attachment queries and mutations -export * from "./attachments.js"; diff --git a/src/queries/issues.ts b/src/queries/issues.ts deleted file mode 100644 index 1bf5177..0000000 --- a/src/queries/issues.ts +++ /dev/null @@ -1,376 +0,0 @@ -/** - * Optimized GraphQL queries for issue operations - * - * This module contains highly optimized GraphQL queries that fetch - * all necessary issue data in single requests, eliminating N+1 query - * problem common with Linear SDK. Each query uses comprehensive - * fragments to ensure consistent data structures. - */ - -import { - COMPLETE_ISSUE_FRAGMENT, - COMPLETE_ISSUE_WITH_COMMENTS_FRAGMENT, -} from "./common.js"; - -/** - * Get issues list with all relationships in single query - * - * Fetches paginated issues excluding completed ones, - * ordered by most recently updated. Includes all relationships - * for comprehensive issue data. - */ -export const GET_ISSUES_QUERY = ` - query GetIssues($first: Int!, $orderBy: PaginationOrderBy) { - issues( - first: $first - orderBy: $orderBy - filter: { - state: { type: { neq: "completed" } } - } - ) { - nodes { - ${COMPLETE_ISSUE_FRAGMENT} - } - } - } -`; - -/** - * Search issues with text search and all relationships in single query - * - * Provides full-text search across Linear issues with complete - * relationship data for each match. - */ -export const SEARCH_ISSUES_QUERY = ` - query SearchIssues($term: String!, $first: Int!) { - searchIssues(term: $term, first: $first, includeArchived: false) { - nodes { - ${COMPLETE_ISSUE_FRAGMENT} - } - } - } -`; - -/** - * Search issues with advanced filters and all relationships in single query - * - * Supports filtering by team, assignee, project, and states. - * Used by the advanced search functionality with multiple criteria. - */ -export const FILTERED_SEARCH_ISSUES_QUERY = ` - query FilteredSearchIssues( - $first: Int! - $filter: IssueFilter - $orderBy: PaginationOrderBy - ) { - issues( - first: $first - filter: $filter - orderBy: $orderBy - includeArchived: false - ) { - nodes { - ${COMPLETE_ISSUE_FRAGMENT} - } - } - } -`; - -/** - * Batch resolve query for search filters - * - * Resolves human-readable identifiers to UUIDs in a single batch query. - * Used to pre-resolve teams, projects, and assignees before executing - * main search query to avoid N+1 queries. - */ -export const BATCH_RESOLVE_FOR_SEARCH_QUERY = ` - query BatchResolveForSearch( - $teamKey: String - $teamName: String - $projectName: String - $assigneeEmail: String - ) { - # Resolve team if provided - teams( - filter: { - or: [ - { key: { eq: $teamKey } } - { name: { eq: $teamName } } - ] - } - first: 1 - ) { - nodes { - id - key - name - } - } - - # Resolve project if provided (case-insensitive to be user-friendly) - projects(filter: { name: { eqIgnoreCase: $projectName } }, first: 1) { - nodes { - id - name - } - } - - # Resolve user by email if provided - users(filter: { email: { eq: $assigneeEmail } }, first: 1) { - nodes { - id - name - email - } - } - } -`; - -/** - * Get single issue by UUID with comments and all relationships - * - * Fetches complete issue data including comments by direct UUID lookup. - * Uses the comprehensive fragment with comment data for detailed view. - */ -export const GET_ISSUE_BY_ID_QUERY = ` - query GetIssue($id: String!) { - issue(id: $id) { - ${COMPLETE_ISSUE_WITH_COMMENTS_FRAGMENT} - } - } -`; - -/** - * Get issue by identifier (team key + number) - * - * Fetches issue using TEAM-123 format. Resolves team key and - * issue number to find the exact issue, returning complete data with comments. - */ -export const GET_ISSUE_BY_IDENTIFIER_QUERY = ` - query GetIssueByIdentifier($teamKey: String!, $number: Float!) { - issues( - filter: { - team: { key: { eq: $teamKey } } - number: { eq: $number } - } - first: 1 - ) { - nodes { - ${COMPLETE_ISSUE_WITH_COMMENTS_FRAGMENT} - } - } - } -`; - -/** - * Comprehensive batch resolve for update operations - * - * Resolves all necessary entity references in a single batch query - * before issue update. Includes labels, projects, teams, and parent issues. - * This prevents N+1 queries during update operations. - */ -export const BATCH_RESOLVE_FOR_UPDATE_QUERY = ` - query BatchResolveForUpdate( - $labelNames: [String!] - $projectName: String - $teamKey: String - $issueNumber: Float - $milestoneName: String - ) { - # Resolve labels if provided - labels: issueLabels(filter: { name: { in: $labelNames } }) { - nodes { - id - name - isGroup - parent { - id - name - } - children { - nodes { - id - name - } - } - } - } - - # Resolve project if provided (case-insensitive to be user-friendly) - projects(filter: { name: { eqIgnoreCase: $projectName } }, first: 1) { - nodes { - id - name - projectMilestones { - nodes { - id - name - } - } - } - } - - # Resolve milestone if provided (standalone query in case no project context) - milestones: projectMilestones( - filter: { name: { eq: $milestoneName } } - first: 1 - ) { - nodes { - id - name - } - } - - # Resolve issue identifier if provided - issues( - filter: { - and: [ - { team: { key: { eq: $teamKey } } } - { number: { eq: $issueNumber } } - ] - } - first: 1 - ) { - nodes { - id - identifier - labels { - nodes { - id - name - } - } - project { - id - projectMilestones { - nodes { - id - name - } - } - } - } - } - } -`; - -/** - * Create issue mutation with complete response - * - * Creates a new issue and returns complete issue data including - * all relationships. Uses the comprehensive fragment to ensure - * consistent data structure with read operations. - */ -export const CREATE_ISSUE_MUTATION = ` - mutation CreateIssue($input: IssueCreateInput!) { - issueCreate(input: $input) { - success - issue { - ${COMPLETE_ISSUE_WITH_COMMENTS_FRAGMENT} - } - } - } -`; - -/** - * Update issue mutation with complete response - * - * Updates an existing issue and returns complete issue data with - * all relationships. Ensures consistency between update and read - * operations by using the same fragment structure. - */ -export const UPDATE_ISSUE_MUTATION = ` - mutation UpdateIssue($id: String!, $input: IssueUpdateInput!) { - issueUpdate(id: $id, input: $input) { - success - issue { - ${COMPLETE_ISSUE_WITH_COMMENTS_FRAGMENT} - } - } - } -`; - -/** - * Comprehensive batch resolve for create operations - * - * Resolves all entity references needed for issue creation in a single - * batch query. Prevents N+1 queries during issue creation by - * pre-resolving teams, projects, labels, and parent issues. - */ -export const BATCH_RESOLVE_FOR_CREATE_QUERY = ` - query BatchResolveForCreate( - $teamKey: String - $teamName: String - $projectName: String - $labelNames: [String!] - $parentTeamKey: String - $parentIssueNumber: Float - ) { - # Resolve team if provided - teams( - filter: { - or: [ - { key: { eq: $teamKey } } - { name: { eq: $teamName } } - ] - } - first: 1 - ) { - nodes { - id - key - name - } - } - - # Resolve project if provided (case-insensitive to be user-friendly) - projects(filter: { name: { eqIgnoreCase: $projectName } }, first: 1) { - nodes { - id - name - projectMilestones { - nodes { id name } - } - # Projects don't own cycles directly, but include teams for context if needed - } - } - - # Resolve labels if provided - labels: issueLabels(filter: { name: { in: $labelNames } }) { - nodes { - id - name - isGroup - parent { - id - name - } - children { - nodes { - id - name - } - } - } - } - - # Resolve parent issue if provided - parentIssues: issues( - filter: { - and: [ - { team: { key: { eq: $parentTeamKey } } } - { number: { eq: $parentIssueNumber } } - ] - } - first: 1 - ) { - nodes { - id - identifier - } - } - - # Resolve cycles by name (team-scoped lookup is preferred but we also provide global fallback) - - } -`; diff --git a/src/queries/project-milestones.ts b/src/queries/project-milestones.ts deleted file mode 100644 index e613983..0000000 --- a/src/queries/project-milestones.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { COMPLETE_ISSUE_FRAGMENT } from "./common.js"; - -/** - * List milestones in a project with minimal fields (optimized) - */ -export const LIST_PROJECT_MILESTONES_QUERY = ` - query ListProjectMilestones($projectId: String!, $first: Int!) { - project(id: $projectId) { - id - name - projectMilestones(first: $first) { - nodes { - id - name - description - targetDate - sortOrder - createdAt - updatedAt - } - } - } - } -`; - -/** - * Get single milestone by ID with full issue details - */ -export const GET_PROJECT_MILESTONE_BY_ID_QUERY = ` - query GetProjectMilestone($id: String!, $issuesFirst: Int) { - projectMilestone(id: $id) { - id - name - description - targetDate - sortOrder - createdAt - updatedAt - project { - id - name - } - issues(first: $issuesFirst) { - nodes { - ${COMPLETE_ISSUE_FRAGMENT} - } - } - } - } -`; - -/** - * Find milestone by name within project context (scoped lookup) - */ -export const FIND_PROJECT_MILESTONE_BY_NAME_SCOPED = ` - query FindProjectMilestoneScoped($name: String!, $projectId: String!) { - project(id: $projectId) { - projectMilestones(filter: { name: { eq: $name } }, first: 10) { - nodes { - id - name - targetDate - sortOrder - project { - id - name - } - } - } - } - } -`; - -/** - * Find milestone by name globally (fallback) - */ -export const FIND_PROJECT_MILESTONE_BY_NAME_GLOBAL = ` - query FindProjectMilestoneGlobal($name: String!) { - projectMilestones(filter: { name: { eq: $name } }, first: 10) { - nodes { - id - name - targetDate - sortOrder - project { - id - name - } - } - } - } -`; - -/** - * Create a new project milestone - */ -export const CREATE_PROJECT_MILESTONE_MUTATION = ` - mutation CreateProjectMilestone($projectId: String!, $name: String!, $description: String, $targetDate: TimelessDate) { - projectMilestoneCreate(input: { - projectId: $projectId - name: $name - description: $description - targetDate: $targetDate - }) { - success - projectMilestone { - id - name - description - targetDate - sortOrder - createdAt - updatedAt - project { - id - name - } - } - } - } -`; - -/** - * Update an existing project milestone - */ -export const UPDATE_PROJECT_MILESTONE_MUTATION = ` - mutation UpdateProjectMilestone($id: String!, $name: String, $description: String, $targetDate: TimelessDate, $sortOrder: Float) { - projectMilestoneUpdate(id: $id, input: { - name: $name - description: $description - targetDate: $targetDate - sortOrder: $sortOrder - }) { - success - projectMilestone { - id - name - description - targetDate - sortOrder - updatedAt - project { - id - name - } - } - } - } -`; From 5bbcb3f36a75463e3c0caaa162af3e8c100522ed Mon Sep 17 00:00:00 2001 From: Fabian Jocks <24557998+iamfj@users.noreply.github.com> Date: Tue, 3 Feb 2026 00:16:37 +0100 Subject: [PATCH 07/31] refactor(issues): add type aliases for codegen types Add type aliases for GraphQL query/mutation return types to improve readability in method signatures. Co-Authored-By: Claude Sonnet 4.5 --- src/utils/graphql-issues-service.ts | 609 +++++++++++++++------------- 1 file changed, 332 insertions(+), 277 deletions(-) diff --git a/src/utils/graphql-issues-service.ts b/src/utils/graphql-issues-service.ts index 6a5e1fe..013335e 100644 --- a/src/utils/graphql-issues-service.ts +++ b/src/utils/graphql-issues-service.ts @@ -1,29 +1,21 @@ +import { print } from "graphql"; import { GraphQLService } from "./graphql-service.js"; import { LinearService } from "./linear-service.js"; -import { - BATCH_RESOLVE_FOR_CREATE_QUERY, - BATCH_RESOLVE_FOR_SEARCH_QUERY, - BATCH_RESOLVE_FOR_UPDATE_QUERY, - CREATE_ISSUE_MUTATION, - FILTERED_SEARCH_ISSUES_QUERY, - GET_ISSUE_BY_ID_QUERY, - GET_ISSUE_BY_IDENTIFIER_QUERY, - GET_ISSUES_QUERY, - SEARCH_ISSUES_QUERY, - UPDATE_ISSUE_MUTATION, -} from "../queries/issues.js"; -import type { - CreateIssueArgs, - LinearIssue, - SearchIssuesArgs, - UpdateIssueArgs, -} from "./linear-types.js"; import { extractEmbeds } from "./embed-parser.js"; import { isUuid } from "./uuid.js"; import { parseIssueIdentifier, tryParseIssueIdentifier, } from "./identifier-parser.js"; +import { BatchResolveForCreateDocument, BatchResolveForCreateQuery, BatchResolveForUpdateDocument, BatchResolveForUpdateQuery, CreateIssueDocument, CreateIssueMutation, FindCycleGlobalDocument, FindCycleGlobalQuery, FindCycleScopedDocument, FindCycleScopedQuery, GetIssueByIdDocument, GetIssueByIdentifierDocument, GetIssueByIdentifierQuery, GetIssueByIdQuery, GetIssuesDocument, GetIssuesQuery, GetIssueTeamDocument, GetIssueTeamQuery, IssueCreateInput, IssueUpdateInput, QuerySearchIssuesArgs, SearchIssuesQuery, SearchIssuesQueryVariables, UpdateIssueDocument, UpdateIssueMutation, UpdateIssueMutationVariables } from "../gql/graphql.js"; + +// Type aliases for cleaner method signatures +type IssueFromId = NonNullable; +type IssueFromIdentifier = GetIssueByIdentifierQuery["issues"]["nodes"][0]; +type IssueFromSearch = SearchIssuesQuery["searchIssues"]["nodes"][0]; +type IssueFromList = GetIssuesQuery["issues"]["nodes"][0]; +type IssueFromUpdate = NonNullable; +type IssueFromCreate = NonNullable; /** * GraphQL-optimized issues service for single API call operations @@ -31,18 +23,26 @@ import { export class GraphQLIssuesService { constructor( private graphQLService: GraphQLService, - private linearService: LinearService, + private linearService: LinearService ) {} /** * Get issues list with all relationships in single query * Reduces from 1 + (5 × N issues) API calls to 1 API call */ - async getIssues(limit: number = 25): Promise { - const result = await this.graphQLService.rawRequest(GET_ISSUES_QUERY, { - first: limit, - orderBy: "updatedAt" as any, - }); + async getIssues( + limit: number = 25 + ): Promise { + // * NOTE: We must enforce the return type here and ensure it matches the mutation document, + // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document + // * (GetIssuesDocument) with the appropriate return type parameter. + const result = await this.graphQLService.rawRequest( + print(GetIssuesDocument), + { + first: limit, + orderBy: "updatedAt" as any, + } + ); if (!result.issues?.nodes) { return []; @@ -58,7 +58,7 @@ export class GraphQLIssuesService { * Get issue by ID with all relationships and comments in single query * Reduces from 7 API calls to 1 API call * - * @param issueId - Either a UUID string or TEAM-123 format identifier + * @param id - Either a UUID string or TEAM-123 format identifier * @returns Complete issue data with all relationships resolved * @throws Error if issue is not found * @@ -71,36 +71,43 @@ export class GraphQLIssuesService { * const issue2 = await getIssueById("ABC-123"); * ``` */ - async getIssueById(issueId: string): Promise { + async getIssueById(id: string): Promise { let issueData; - if (isUuid(issueId)) { + if (isUuid(id)) { // Direct UUID lookup - const result = await this.graphQLService.rawRequest( - GET_ISSUE_BY_ID_QUERY, + // + // * NOTE: We must enforce the return type here and ensure it matches the mutation document, + // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document + // * (GetIssueByIdDocument) with the appropriate return type parameter. + const result = await this.graphQLService.rawRequest( + print(GetIssueByIdDocument), { - id: issueId, - }, + id: id, + } ); if (!result.issue) { - throw new Error(`Issue with ID "${issueId}" not found`); + throw new Error(`Issue with ID "${id}" not found`); } issueData = result.issue; } else { // Parse identifier (ABC-123 format) - const { teamKey, issueNumber } = parseIssueIdentifier(issueId); + const { teamKey, issueNumber } = parseIssueIdentifier(id); - const result = await this.graphQLService.rawRequest( - GET_ISSUE_BY_IDENTIFIER_QUERY, + // * NOTE: We must enforce the return type here and ensure it matches the mutation document, + // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document + // * (GetIssueByIdentifierDocument) with the appropriate return type parameter. + const result = await this.graphQLService.rawRequest( + print(GetIssueByIdentifierDocument), { teamKey, number: issueNumber, - }, + } ); if (!result.issues.nodes.length) { - throw new Error(`Issue with identifier "${issueId}" not found`); + throw new Error(`Issue with identifier "${id}" not found`); } issueData = result.issues.nodes[0]; } @@ -113,7 +120,7 @@ export class GraphQLIssuesService { * Update issue with all relationships in optimized GraphQL queries * Reduces from 5 API calls to 2 API calls (resolve + update) * - * @param args Update arguments (supports label names and handles adding vs overwriting modes) + * @param input Update arguments (supports label names and handles adding vs overwriting modes) * @param labelMode How to handle labels: 'adding' (merge with existing) or 'overwriting' (replace all) * @returns Updated issue with all relationships resolved * @@ -130,74 +137,80 @@ export class GraphQLIssuesService { * ``` */ async updateIssue( - args: UpdateIssueArgs, - labelMode: "adding" | "overwriting" = "overwriting", - ): Promise { - let resolvedIssueId = args.id; + id: string, + input: IssueUpdateInput, + labelMode: "adding" | "overwriting" = "overwriting" + ): Promise { + let resolvedIssueId = id; let currentIssueLabels: string[] = []; // Step 1: Batch resolve all IDs and get current issue data if needed const resolveVariables: any = {}; // Parse issue ID if it's an identifier - if (!isUuid(args.id)) { - const { teamKey, issueNumber } = parseIssueIdentifier(args.id); + if (!isUuid(resolvedIssueId)) { + const { teamKey, issueNumber } = parseIssueIdentifier(resolvedIssueId); resolveVariables.teamKey = teamKey; resolveVariables.issueNumber = issueNumber; } // Add label names for resolution if provided - if (args.labelIds && Array.isArray(args.labelIds)) { + if (input.labelIds && Array.isArray(input.labelIds)) { // Filter out UUIDs and collect label names for resolution - const labelNames = args.labelIds.filter((id) => !isUuid(id)); + const labelNames = input.labelIds.filter((id) => !isUuid(id)); if (labelNames.length > 0) { resolveVariables.labelNames = labelNames; } } // Add project name for resolution if provided and not a UUID - if (args.projectId && !isUuid(args.projectId)) { - resolveVariables.projectName = args.projectId; + if (input.projectId && !isUuid(input.projectId)) { + resolveVariables.projectName = input.projectId; } // Add milestone name for resolution if provided and not a UUID if ( - args.milestoneId && typeof args.milestoneId === "string" && - !isUuid(args.milestoneId) + input.projectMilestoneId && + typeof input.projectMilestoneId === "string" && + !isUuid(input.projectMilestoneId) ) { - resolveVariables.milestoneName = args.milestoneId; + resolveVariables.milestoneName = input.projectMilestoneId; } // Execute batch resolve query - const resolveResult = await this.graphQLService.rawRequest( - BATCH_RESOLVE_FOR_UPDATE_QUERY, - resolveVariables, + // + // * NOTE: We must enforce the return type here and ensure it matches the mutation document, + // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document + // * (BatchResolveForUpdateDocument) with the appropriate return type parameter. + const resolveResult = await this.graphQLService.rawRequest( + print(BatchResolveForUpdateDocument), + resolveVariables ); // Process resolution results - if (!isUuid(args.id)) { + if (!isUuid(id)) { if (!resolveResult.issues.nodes.length) { - throw new Error(`Issue with identifier "${args.id}" not found`); + throw new Error(`Issue with identifier "${id}" not found`); } resolvedIssueId = resolveResult.issues.nodes[0].id; - currentIssueLabels = resolveResult.issues.nodes[0].labels.nodes.map(( - l: any, - ) => l.id); + currentIssueLabels = resolveResult.issues.nodes[0].labels.nodes.map( + (l: any) => l.id + ); } // Resolve label IDs - let finalLabelIds = args.labelIds; - if (args.labelIds && Array.isArray(args.labelIds)) { + let finalLabelIds = input.labelIds; + if (input.labelIds && Array.isArray(input.labelIds)) { const resolvedLabels: string[] = []; // Process each label ID/name - for (const labelIdOrName of args.labelIds) { + for (const labelIdOrName of input.labelIds) { if (isUuid(labelIdOrName)) { resolvedLabels.push(labelIdOrName); } else { // Find resolved label - const label = resolveResult.labels.nodes.find((l: any) => - l.name === labelIdOrName + const label = resolveResult.labels.nodes.find( + (l: any) => l.name === labelIdOrName ); if (!label) { throw new Error(`Label "${labelIdOrName}" not found`); @@ -219,30 +232,32 @@ export class GraphQLIssuesService { } // Resolve project ID - let finalProjectId = args.projectId; - if (args.projectId && !isUuid(args.projectId)) { + let finalProjectId = input.projectId; + if (input.projectId && !isUuid(input.projectId)) { if (!resolveResult.projects.nodes.length) { - throw new Error(`Project "${args.projectId}" not found`); + throw new Error(`Project "${input.projectId}" not found`); } finalProjectId = resolveResult.projects.nodes[0].id; } // Resolve milestone ID if provided and not a UUID - let finalMilestoneId = args.milestoneId; + let finalMilestoneId = input.projectMilestoneId; if ( - args.milestoneId && typeof args.milestoneId === "string" && - !isUuid(args.milestoneId) + input.projectMilestoneId && + typeof input.projectMilestoneId === "string" && + !isUuid(input.projectMilestoneId) ) { // First try to find milestone in project being set (if --project is provided) // IMPORTANT: Only check resolveResult.projects if we actually asked for a project // (the batch query may return unrelated project data when projectName is undefined) if ( - args.projectId && + input.projectId && resolveResult.projects?.nodes[0]?.projectMilestones?.nodes ) { - const projectMilestone = resolveResult.projects.nodes[0] - .projectMilestones.nodes - .find((m: any) => m.name === args.milestoneId); + const projectMilestone = + resolveResult.projects.nodes[0].projectMilestones.nodes.find( + (m: any) => m.name === input.projectMilestoneId + ); if (projectMilestone) { finalMilestoneId = projectMilestone.id; } @@ -250,12 +265,14 @@ export class GraphQLIssuesService { // If not found in project being set, try the issue's current project if ( - finalMilestoneId && !isUuid(finalMilestoneId) && + finalMilestoneId && + !isUuid(finalMilestoneId) && resolveResult.issues?.nodes[0]?.project?.projectMilestones?.nodes ) { - const issueMilestone = resolveResult.issues.nodes[0].project - .projectMilestones.nodes - .find((m: any) => m.name === args.milestoneId); + const issueMilestone = + resolveResult.issues.nodes[0].project.projectMilestones.nodes.find( + (m: any) => m.name === input.projectMilestoneId + ); if (issueMilestone) { finalMilestoneId = issueMilestone.id; } @@ -263,122 +280,138 @@ export class GraphQLIssuesService { // If still not found, try global milestone lookup (may be ambiguous) if ( - finalMilestoneId && !isUuid(finalMilestoneId) && + finalMilestoneId && + !isUuid(finalMilestoneId) && resolveResult.milestones?.nodes?.length ) { finalMilestoneId = resolveResult.milestones.nodes[0].id; } if (!finalMilestoneId || !isUuid(finalMilestoneId)) { - throw new Error(`Milestone "${args.milestoneId}" not found`); + throw new Error(`Milestone "${input.projectMilestoneId}" not found`); } } // Resolve cycle ID if provided (supports name resolution scoped to the issue's team) - let finalCycleId = args.cycleId; - if (args.cycleId !== undefined && args.cycleId !== null) { - if (args.cycleId === null) { + let finalCycleId = input.cycleId; + if (input.cycleId !== undefined && input.cycleId !== null) { + if (input.cycleId === null) { finalCycleId = null; // explicit clear - } else if (typeof args.cycleId === "string" && !isUuid(args.cycleId)) { + } else if (typeof input.cycleId === "string" && !isUuid(input.cycleId)) { // Try to get team context from resolved issue (if available) - let teamIdForCycle: string | undefined = resolveResult.issues?.nodes - ?.[0]?.team?.id; + let teamIdForCycle: string | undefined = + resolveResult.issues?.nodes?.[0]?.team?.id; // If we don't have team from batch result but we have resolvedIssueId, fetch issue team if (!teamIdForCycle && resolvedIssueId && isUuid(resolvedIssueId)) { - const issueTeamRes = await this.graphQLService.rawRequest( - `query GetIssueTeam($issueId: String!) { issue(id: $issueId) { team { id } } }`, - { issueId: resolvedIssueId }, + // * NOTE: We must enforce the return type here and ensure it matches the query document, + // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document + // * (GetIssueTeamDocument) with the appropriate return type parameter. + const issueTeamRes = await this.graphQLService.rawRequest( + print(GetIssueTeamDocument), + { issueId: resolvedIssueId } ); teamIdForCycle = issueTeamRes.issue?.team?.id; } // Try scoped lookup by team first if (teamIdForCycle) { - const scopedRes = await this.graphQLService.rawRequest( - `query FindCycleScoped($name: String!, $teamId: ID!) { cycles(filter: { and: [ { name: { eq: $name } }, { team: { id: { eq: $teamId } } } ] }, first: 10) { nodes { id name number startsAt isActive isNext isPrevious team { id key } } } }`, - { name: args.cycleId, teamId: teamIdForCycle }, + // * NOTE: We must enforce the return type here and ensure it matches the query document, + // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document + // * (FindCycleScopedDocument) with the appropriate return type parameter. + const scopedRes = await this.graphQLService.rawRequest( + print(FindCycleScopedDocument), + { name: input.cycleId, teamId: teamIdForCycle } ); const scopedNodes = scopedRes.cycles?.nodes || []; if (scopedNodes.length === 1) { finalCycleId = scopedNodes[0].id; } else if (scopedNodes.length > 1) { // prefer active, next, previous - let chosen = scopedNodes.find((n: any) => n.isActive) || + let chosen = + scopedNodes.find((n: any) => n.isActive) || scopedNodes.find((n: any) => n.isNext) || scopedNodes.find((n: any) => n.isPrevious); if (chosen) finalCycleId = chosen.id; - else {throw new Error( - `Ambiguous cycle name "${args.cycleId}" for team ${teamIdForCycle}. Use ID or disambiguate.`, - );} + else { + throw new Error( + `Ambiguous cycle name "${input.cycleId}" for team ${teamIdForCycle}. Use ID or disambiguate.` + ); + } } } // Fallback to global lookup by name if (!finalCycleId) { - const globalRes = await this.graphQLService.rawRequest( - `query FindCycleGlobal($name: String!) { cycles(filter: { name: { eq: $name } }, first: 10) { nodes { id name number startsAt isActive isNext isPrevious team { id key } } } }`, - { name: args.cycleId }, + // * NOTE: We must enforce the return type here and ensure it matches the query document, + // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document + // * (FindCycleGlobalDocument) with the appropriate return type parameter. + const globalRes = await this.graphQLService.rawRequest( + print(FindCycleGlobalDocument), + { name: input.cycleId } ); const globalNodes = globalRes.cycles?.nodes || []; if (globalNodes.length === 1) { finalCycleId = globalNodes[0].id; } else if (globalNodes.length > 1) { - let chosen = globalNodes.find((n: any) => n.isActive) || + let chosen = + globalNodes.find((n: any) => n.isActive) || globalNodes.find((n: any) => n.isNext) || globalNodes.find((n: any) => n.isPrevious); if (chosen) finalCycleId = chosen.id; - else {throw new Error( - `Ambiguous cycle name "${args.cycleId}" — multiple matches found across teams. Use ID or scope with team.`, - );} + else { + throw new Error( + `Ambiguous cycle name "${input.cycleId}" — multiple matches found across teams. Use ID or scope with team.` + ); + } } } if (!finalCycleId) { - throw new Error(`Cycle "${args.cycleId}" not found`); + throw new Error(`Cycle "${input.cycleId}" not found`); } } } // Resolve status ID if provided and not a UUID - let resolvedStatusId = args.statusId; - if (args.statusId && !isUuid(args.statusId)) { + let resolvedStatusId = input.stateId; + if (input.stateId && !isUuid(input.stateId)) { // Get team ID from the issue for status context let teamId: string | undefined; if (resolvedIssueId && isUuid(resolvedIssueId)) { // We have the resolved issue ID, get the team context - const issueResult = await this.graphQLService.rawRequest( - `query GetIssueTeam($issueId: String!) { - issue(id: $issueId) { - team { id } - } - }`, - { issueId: resolvedIssueId }, + // + // * NOTE: We must enforce the return type here and ensure it matches the mutation document, + // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document + // * (GetIssueTeamDocument) with the appropriate return type parameter. + const issueResult = await this.graphQLService.rawRequest( + print(GetIssueTeamDocument), + { issueId: resolvedIssueId } ); teamId = issueResult.issue?.team?.id; } resolvedStatusId = await this.linearService.resolveStatusId( - args.statusId, - teamId, + input.stateId, + teamId ); } // Step 2: Execute update mutation with resolved IDs const updateInput: any = {}; - if (args.title !== undefined) updateInput.title = args.title; - if (args.description !== undefined) { - updateInput.description = args.description; + if (input.title !== undefined) updateInput.title = input.title; + if (input.description !== undefined) { + updateInput.description = input.description; } if (resolvedStatusId !== undefined) updateInput.stateId = resolvedStatusId; - if (args.priority !== undefined) updateInput.priority = args.priority; - if (args.assigneeId !== undefined) { - updateInput.assigneeId = args.assigneeId; + if (input.priority !== undefined) updateInput.priority = input.priority; + if (input.assigneeId !== undefined) { + updateInput.assigneeId = input.assigneeId; } if (finalProjectId !== undefined) updateInput.projectId = finalProjectId; if (finalCycleId !== undefined) updateInput.cycleId = finalCycleId; - if (args.estimate !== undefined) updateInput.estimate = args.estimate; - if (args.parentId !== undefined) updateInput.parentId = args.parentId; + if (input.estimate !== undefined) updateInput.estimate = input.estimate; + if (input.parentId !== undefined) updateInput.parentId = input.parentId; if (finalMilestoneId !== undefined) { updateInput.projectMilestoneId = finalMilestoneId; } @@ -386,12 +419,15 @@ export class GraphQLIssuesService { updateInput.labelIds = finalLabelIds; } - const updateResult = await this.graphQLService.rawRequest( - UPDATE_ISSUE_MUTATION, + // * NOTE: We must enforce the return type here and ensure it matches the mutation document, + // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document + // * (UpdateIssueDocument) with the appropriate return type parameter. + const updateResult = await this.graphQLService.rawRequest( + print(UpdateIssueDocument), { id: resolvedIssueId, input: updateInput, - }, + } ); if (!updateResult.issueUpdate.success) { @@ -409,42 +445,42 @@ export class GraphQLIssuesService { * Create issue with all relationships in optimized GraphQL queries * Reduces from 7+ API calls to 2 API calls (resolve + create) * - * @param args Create arguments (supports team names, project names, label names, parent identifiers) + * @param input Create arguments (supports team names, project names, label names, parent identifiers) */ - async createIssue(args: CreateIssueArgs): Promise { + async createIssue(input: IssueCreateInput): Promise { // Step 1: Batch resolve all IDs const resolveVariables: any = {}; // Parse team if not a UUID - if (args.teamId && !isUuid(args.teamId)) { + if (input.teamId && !isUuid(input.teamId)) { // Check if it looks like a team key (short, usually 2-5 chars, alphanumeric) - const isTeamKey = args.teamId.length <= 5 && - /^[A-Z0-9]+$/i.test(args.teamId); + const isTeamKey = + input.teamId.length <= 5 && /^[A-Z0-9]+$/i.test(input.teamId); // IMPORTANT: Must explicitly set both teamKey and teamName (one to value, one to null) // Linear's GraphQL `or` filter with undefined variables matches incorrectly if (isTeamKey) { - resolveVariables.teamKey = args.teamId; + resolveVariables.teamKey = input.teamId; resolveVariables.teamName = null; } else { resolveVariables.teamKey = null; - resolveVariables.teamName = args.teamId; + resolveVariables.teamName = input.teamId; } } // Add project name for resolution if provided and not a UUID - if (args.projectId && !isUuid(args.projectId)) { - resolveVariables.projectName = args.projectId; + if (input.projectId && !isUuid(input.projectId)) { + resolveVariables.projectName = input.projectId; } // Add milestone name for resolution if provided and not a UUID - if (args.milestoneId && !isUuid(args.milestoneId)) { - resolveVariables.milestoneName = args.milestoneId; + if (input.projectMilestoneId && !isUuid(input.projectMilestoneId)) { + resolveVariables.milestoneName = input.projectMilestoneId; } // Add label names for resolution if provided - if (args.labelIds && Array.isArray(args.labelIds)) { + if (input.labelIds && Array.isArray(input.labelIds)) { // Filter out UUIDs and collect label names for resolution - const labelNames = args.labelIds.filter((id) => !isUuid(id)); + const labelNames = input.labelIds.filter((id) => !isUuid(id)); if (labelNames.length > 0) { resolveVariables.labelNames = labelNames; } @@ -452,8 +488,8 @@ export class GraphQLIssuesService { // Parse parent issue identifier if provided // Uses tryParseIssueIdentifier to silently handle invalid formats (parent will be ignored) - if (args.parentId && !isUuid(args.parentId)) { - const parentParsed = tryParseIssueIdentifier(args.parentId); + if (input.parentId && !isUuid(input.parentId)) { + const parentParsed = tryParseIssueIdentifier(input.parentId); if (parentParsed) { resolveVariables.parentTeamKey = parentParsed.teamKey; resolveVariables.parentIssueNumber = parentParsed.issueNumber; @@ -461,26 +497,32 @@ export class GraphQLIssuesService { } // Execute batch resolve query if we have anything to resolve - let resolveResult: any = {}; + let resolveResult: BatchResolveForCreateQuery = { + teams: { nodes: [] }, + projects: { nodes: [] }, + labels: { nodes: [] }, + parentIssues: { nodes: [] }, + }; + if (Object.keys(resolveVariables).length > 0) { - resolveResult = await this.graphQLService.rawRequest( - BATCH_RESOLVE_FOR_CREATE_QUERY, - resolveVariables, + resolveResult = await this.graphQLService.rawRequest( + print(BatchResolveForCreateDocument), + resolveVariables ); } // Resolve team ID - let finalTeamId = args.teamId; - if (args.teamId && !isUuid(args.teamId)) { + let finalTeamId = input.teamId; + if (input.teamId && !isUuid(input.teamId)) { const resolvedTeam = resolveResult.teams?.nodes?.[0]; // Validate the returned team actually matches the requested identifier // (GraphQL `or` filter with undefined variables matches anything) if ( !resolvedTeam || - (resolvedTeam.key.toUpperCase() !== args.teamId.toUpperCase() && - resolvedTeam.name.toLowerCase() !== args.teamId.toLowerCase()) + (resolvedTeam.key.toUpperCase() !== input.teamId.toUpperCase() && + resolvedTeam.name.toLowerCase() !== input.teamId.toLowerCase()) ) { - throw new Error(`Team "${args.teamId}" not found`); + throw new Error(`Team "${input.teamId}" not found`); } finalTeamId = resolvedTeam.id; } else if (!finalTeamId) { @@ -489,26 +531,26 @@ export class GraphQLIssuesService { } // Resolve project ID - let finalProjectId = args.projectId; - if (args.projectId && !isUuid(args.projectId)) { + let finalProjectId = input.projectId; + if (input.projectId && !isUuid(input.projectId)) { if (!resolveResult.projects?.nodes?.length) { - throw new Error(`Project "${args.projectId}" not found`); + throw new Error(`Project "${input.projectId}" not found`); } finalProjectId = resolveResult.projects.nodes[0].id; } // Resolve label IDs - let finalLabelIds = args.labelIds; - if (args.labelIds && Array.isArray(args.labelIds)) { + let finalLabelIds = input.labelIds; + if (input.labelIds && Array.isArray(input.labelIds)) { const resolvedLabels: string[] = []; - for (const labelIdOrName of args.labelIds) { + for (const labelIdOrName of input.labelIds) { if (isUuid(labelIdOrName)) { resolvedLabels.push(labelIdOrName); } else { // Find resolved label - const label = resolveResult.labels?.nodes?.find((l: any) => - l.name === labelIdOrName + const label = resolveResult.labels?.nodes?.find( + (l: any) => l.name === labelIdOrName ); if (!label) { throw new Error(`Label "${labelIdOrName}" not found`); @@ -521,22 +563,23 @@ export class GraphQLIssuesService { } // Resolve parent ID - let finalParentId = args.parentId; - if (args.parentId && !isUuid(args.parentId)) { + let finalParentId = input.parentId; + if (input.parentId && !isUuid(input.parentId)) { if (!resolveResult.parentIssues?.nodes?.length) { - throw new Error(`Parent issue "${args.parentId}" not found`); + throw new Error(`Parent issue "${input.parentId}" not found`); } finalParentId = resolveResult.parentIssues.nodes[0].id; } // Resolve milestone ID if provided and not a UUID - let finalMilestoneId = args.milestoneId; - if (args.milestoneId && !isUuid(args.milestoneId)) { + let finalMilestoneId = input.projectMilestoneId; + if (input.projectMilestoneId && !isUuid(input.projectMilestoneId)) { // Try to find milestone in project context (milestones must be in same project as issue) if (resolveResult.projects?.nodes[0]?.projectMilestones?.nodes) { - const projectMilestone = resolveResult.projects.nodes[0] - .projectMilestones.nodes - .find((m: any) => m.name === args.milestoneId); + const projectMilestone = + resolveResult.projects.nodes[0].projectMilestones.nodes.find( + (m: any) => m.name === input.projectMilestoneId + ); if (projectMilestone) { finalMilestoneId = projectMilestone.id; } @@ -551,20 +594,22 @@ export class GraphQLIssuesService { const hint = finalProjectId ? ` in project` : ` (consider specifying --project)`; - throw new Error(`Milestone "${args.milestoneId}" not found${hint}`); + throw new Error(`Milestone "${input.milestoneId}" not found${hint}`); } } // Resolve cycle ID if provided (supports name resolution scoped to team) - let finalCycleId = args.cycleId; + let finalCycleId = input.cycleId; if ( - args.cycleId && typeof args.cycleId === "string" && !isUuid(args.cycleId) + input.cycleId && + typeof input.cycleId === "string" && + !isUuid(input.cycleId) ) { // Try scoped lookup within finalTeamId first if (finalTeamId) { const scopedRes = await this.graphQLService.rawRequest( `query FindCycleScoped($name: String!, $teamId: ID!) { cycles(filter: { and: [ { name: { eq: $name } }, { team: { id: { eq: $teamId } } } ] }, first: 1) { nodes { id name } } }`, - { name: args.cycleId, teamId: finalTeamId }, + { name: input.cycleId, teamId: finalTeamId } ); if (scopedRes.cycles?.nodes?.length) { finalCycleId = scopedRes.cycles.nodes[0].id; @@ -575,7 +620,7 @@ export class GraphQLIssuesService { if (!finalCycleId) { const globalRes = await this.graphQLService.rawRequest( `query FindCycleGlobal($name: String!) { cycles(filter: { name: { eq: $name } }, first: 1) { nodes { id name } } }`, - { name: args.cycleId }, + { name: input.cycleId } ); if (globalRes.cycles?.nodes?.length) { finalCycleId = globalRes.cycles.nodes[0].id; @@ -583,43 +628,46 @@ export class GraphQLIssuesService { } if (!finalCycleId) { - throw new Error(`Cycle "${args.cycleId}" not found`); + throw new Error(`Cycle "${input.cycleId}" not found`); } } // Resolve status ID if provided and not a UUID - let resolvedStatusId = args.statusId; - if (args.statusId && !isUuid(args.statusId)) { + let resolvedStatusId = input.stateId; + if (input.stateId && !isUuid(input.stateId)) { resolvedStatusId = await this.linearService.resolveStatusId( - args.statusId, - finalTeamId, + input.stateId, + finalTeamId ); } // Step 2: Execute create mutation with resolved IDs const createInput: any = { - title: args.title, + title: input.title, }; if (finalTeamId) createInput.teamId = finalTeamId; - if (args.description) createInput.description = args.description; - if (args.assigneeId) createInput.assigneeId = args.assigneeId; - if (args.priority !== undefined) createInput.priority = args.priority; + if (input.description) createInput.description = input.description; + if (input.assigneeId) createInput.assigneeId = input.assigneeId; + if (input.priority !== undefined) createInput.priority = input.priority; if (finalProjectId) createInput.projectId = finalProjectId; if (resolvedStatusId) createInput.stateId = resolvedStatusId; if (finalLabelIds && finalLabelIds.length > 0) { createInput.labelIds = finalLabelIds; } - if (args.estimate !== undefined) createInput.estimate = args.estimate; + if (input.estimate !== undefined) createInput.estimate = input.estimate; if (finalParentId) createInput.parentId = finalParentId; if (finalMilestoneId) createInput.projectMilestoneId = finalMilestoneId; if (finalCycleId) createInput.cycleId = finalCycleId; - const createResult = await this.graphQLService.rawRequest( - CREATE_ISSUE_MUTATION, + // * NOTE: We must enforce the return type here and ensure it matches the mutation document, + // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document + // * (CreateIssueDocument) with the appropriate return type parameter. + const createResult = await this.graphQLService.rawRequest( + print(CreateIssueDocument), { input: createInput, - }, + } ); if (!createResult.issueCreate.success) { @@ -637,40 +685,40 @@ export class GraphQLIssuesService { * Search issues with all relationships in optimized GraphQL queries * Reduces from 1 + (6 × N) API calls to 1-2 API calls total * - * @param args Search arguments with optional filters + * @param input Search arguments with optional filters */ - async searchIssues(args: SearchIssuesArgs): Promise { + async searchIssues(input: SearchIssuesQuery): Promise { // Step 1: Resolve filter IDs if needed const resolveVariables: any = {}; let needsResolve = false; // Parse team if not a UUID - if (args.teamId && !isUuid(args.teamId)) { + if (input.teamId && !isUuid(input.teamId)) { needsResolve = true; // Check if it looks like a team key (short, usually 2-5 chars, alphanumeric) // IMPORTANT: Must explicitly set both teamKey and teamName (one to value, one to null) // Linear's GraphQL `or` filter with undefined variables matches incorrectly - if (args.teamId.length <= 5 && /^[A-Z0-9]+$/i.test(args.teamId)) { - resolveVariables.teamKey = args.teamId; + if (input.teamId.length <= 5 && /^[A-Z0-9]+$/i.test(input.teamId)) { + resolveVariables.teamKey = input.teamId; resolveVariables.teamName = null; } else { resolveVariables.teamKey = null; - resolveVariables.teamName = args.teamId; + resolveVariables.teamName = input.teamId; } } // Add project name for resolution if provided and not a UUID - if (args.projectId && !isUuid(args.projectId)) { + if (input.projectId && !isUuid(input.projectId)) { needsResolve = true; - resolveVariables.projectName = args.projectId; + resolveVariables.projectName = input.projectId; } // Add assignee email for resolution if provided and not a UUID - if (args.assigneeId && !isUuid(args.assigneeId)) { + if (input.assigneeId && !isUuid(input.assigneeId)) { needsResolve = true; // Assume it's an email if it contains @ - if (args.assigneeId.includes("@")) { - resolveVariables.assigneeEmail = args.assigneeId; + if (input.assigneeId.includes("@")) { + resolveVariables.assigneeEmail = input.assigneeId; } } @@ -679,54 +727,55 @@ export class GraphQLIssuesService { if (needsResolve) { resolveResult = await this.graphQLService.rawRequest( BATCH_RESOLVE_FOR_SEARCH_QUERY, - resolveVariables, + resolveVariables ); } // Resolve filter IDs - let finalTeamId = args.teamId; - if (args.teamId && !isUuid(args.teamId)) { + let finalTeamId = input.teamId; + if (input.teamId && !isUuid(input.teamId)) { const resolvedTeam = resolveResult.teams?.nodes?.[0]; // Validate the returned team actually matches the requested identifier // (GraphQL `or` filter with undefined variables matches anything) if ( !resolvedTeam || - (resolvedTeam.key.toUpperCase() !== args.teamId.toUpperCase() && - resolvedTeam.name.toLowerCase() !== args.teamId.toLowerCase()) + (resolvedTeam.key.toUpperCase() !== input.teamId.toUpperCase() && + resolvedTeam.name.toLowerCase() !== input.teamId.toLowerCase()) ) { - throw new Error(`Team "${args.teamId}" not found`); + throw new Error(`Team "${input.teamId}" not found`); } finalTeamId = resolvedTeam.id; } - let finalProjectId = args.projectId; - if (args.projectId && !isUuid(args.projectId)) { + let finalProjectId = input.projectId; + if (input.projectId && !isUuid(input.projectId)) { if (!resolveResult.projects?.nodes?.length) { - throw new Error(`Project "${args.projectId}" not found`); + throw new Error(`Project "${input.projectId}" not found`); } finalProjectId = resolveResult.projects.nodes[0].id; } - let finalAssigneeId = args.assigneeId; + let finalAssigneeId = input.assigneeId; if ( - args.assigneeId && !isUuid(args.assigneeId) && - args.assigneeId.includes("@") + input.assigneeId && + !isUuid(input.assigneeId) && + input.assigneeId.includes("@") ) { if (!resolveResult.users?.nodes?.length) { - throw new Error(`User "${args.assigneeId}" not found`); + throw new Error(`User "${input.assigneeId}" not found`); } finalAssigneeId = resolveResult.users.nodes[0].id; } // Step 2: Execute search query - if (args.query) { + if (input.query) { // Use text search const searchResult = await this.graphQLService.rawRequest( SEARCH_ISSUES_QUERY, { - term: args.query, - first: args.limit || 10, - }, + term: input.query, + first: input.limit || 10, + } ); if (!searchResult.searchIssues?.nodes) { @@ -739,23 +788,23 @@ export class GraphQLIssuesService { // Apply additional filters if provided if (finalTeamId) { - results = results.filter((issue: LinearIssue) => - issue.team.id === finalTeamId + results = results.filter( + (issue: LinearIssue) => issue.team.id === finalTeamId ); } if (finalAssigneeId) { - results = results.filter((issue: LinearIssue) => - issue.assignee?.id === finalAssigneeId + results = results.filter( + (issue: LinearIssue) => issue.assignee?.id === finalAssigneeId ); } if (finalProjectId) { - results = results.filter((issue: LinearIssue) => - issue.project?.id === finalProjectId + results = results.filter( + (issue: LinearIssue) => issue.project?.id === finalProjectId ); } - if (args.status && args.status.length > 0) { + if (input.status && input.status.length > 0) { results = results.filter((issue: LinearIssue) => - args.status!.includes(issue.state.name) + input.status!.includes(issue.state.name) ); } @@ -767,17 +816,17 @@ export class GraphQLIssuesService { if (finalTeamId) filter.team = { id: { eq: finalTeamId } }; if (finalAssigneeId) filter.assignee = { id: { eq: finalAssigneeId } }; if (finalProjectId) filter.project = { id: { eq: finalProjectId } }; - if (args.status && args.status.length > 0) { - filter.state = { name: { in: args.status } }; + if (input.status && input.status.length > 0) { + filter.state = { name: { in: input.status } }; } const searchResult = await this.graphQLService.rawRequest( FILTERED_SEARCH_ISSUES_QUERY, { - first: args.limit || 10, + first: input.limit || 10, filter: Object.keys(filter).length > 0 ? filter : undefined, orderBy: "updatedAt" as any, - }, + } ); if (!searchResult.issues?.nodes) { @@ -793,7 +842,7 @@ export class GraphQLIssuesService { /** * Transform GraphQL issue response to LinearIssue format */ - private transformIssueData(issue: any): LinearIssue { + private transformIssueData(issue: GetIssueByIdQuery["issue"] | GetIssueByIdentifierQuery["issues"]["nodes"][0]): LinearIssue { try { return this.doTransformIssueData(issue); } catch (error: any) { @@ -807,7 +856,7 @@ export class GraphQLIssuesService { console.error( "\n[DEBUG] Issue transform failed. Raw API response:\n" + JSON.stringify(diagnostic, null, 2) + - "\n\nPlease report this output at: https://github.com/czottmann/linearis/issues\n", + "\n\nPlease report this output at: https://github.com/czottmann/linearis/issues\n" ); throw error; } @@ -816,7 +865,7 @@ export class GraphQLIssuesService { /** * Internal transform implementation */ - private doTransformIssueData(issue: any): LinearIssue { + private doTransformIssueData(issue: GetIssueByIdQuery['issue'] | GetIssueByIdentifierQuery["issues"]["nodes"][0]): LinearIssue { return { id: issue.id, identifier: issue.identifier, @@ -830,9 +879,9 @@ export class GraphQLIssuesService { }, assignee: issue.assignee ? { - id: issue.assignee.id, - name: issue.assignee.name, - } + id: issue.assignee.id, + name: issue.assignee.name, + } : undefined, team: { id: issue.team.id, @@ -841,23 +890,23 @@ export class GraphQLIssuesService { }, project: issue.project ? { - id: issue.project.id, - name: issue.project.name, - } + id: issue.project.id, + name: issue.project.name, + } : undefined, cycle: issue.cycle ? { - id: issue.cycle.id, - name: issue.cycle.name, - number: issue.cycle.number, - } + id: issue.cycle.id, + name: issue.cycle.name, + number: issue.cycle.number, + } : undefined, projectMilestone: issue.projectMilestone ? { - id: issue.projectMilestone.id, - name: issue.projectMilestone.name, - targetDate: issue.projectMilestone.targetDate || undefined, - } + id: issue.projectMilestone.id, + name: issue.projectMilestone.name, + targetDate: issue.projectMilestone.targetDate || undefined, + } : undefined, priority: issue.priority, estimate: issue.estimate || undefined, @@ -867,45 +916,51 @@ export class GraphQLIssuesService { })), parentIssue: issue.parent ? { - id: issue.parent.id, - identifier: issue.parent.identifier, - title: issue.parent.title, - } + id: issue.parent.id, + identifier: issue.parent.identifier, + title: issue.parent.title, + } : undefined, - subIssues: issue.children?.nodes.map((child: any) => ({ - id: child.id, - identifier: child.identifier, - title: child.title, - })) || undefined, - comments: issue.comments?.nodes.map((comment: any) => ({ - id: comment.id, - body: comment.body, - embeds: extractEmbeds(comment.body), - user: { - id: comment.user.id, - name: comment.user.name, - }, - createdAt: comment.createdAt instanceof Date - ? comment.createdAt.toISOString() - : (comment.createdAt - ? new Date(comment.createdAt).toISOString() - : new Date().toISOString()), - updatedAt: comment.updatedAt instanceof Date - ? comment.updatedAt.toISOString() - : (comment.updatedAt - ? new Date(comment.updatedAt).toISOString() - : new Date().toISOString()), - })) || [], - createdAt: issue.createdAt instanceof Date - ? issue.createdAt.toISOString() - : (issue.createdAt + subIssues: + issue.children?.nodes.map((child: any) => ({ + id: child.id, + identifier: child.identifier, + title: child.title, + })) || undefined, + comments: + issue.comments?.nodes.map((comment: any) => ({ + id: comment.id, + body: comment.body, + embeds: extractEmbeds(comment.body), + user: { + id: comment.user.id, + name: comment.user.name, + }, + createdAt: + comment.createdAt instanceof Date + ? comment.createdAt.toISOString() + : comment.createdAt + ? new Date(comment.createdAt).toISOString() + : new Date().toISOString(), + updatedAt: + comment.updatedAt instanceof Date + ? comment.updatedAt.toISOString() + : comment.updatedAt + ? new Date(comment.updatedAt).toISOString() + : new Date().toISOString(), + })) || [], + createdAt: + issue.createdAt instanceof Date + ? issue.createdAt.toISOString() + : issue.createdAt ? new Date(issue.createdAt).toISOString() - : new Date().toISOString()), - updatedAt: issue.updatedAt instanceof Date - ? issue.updatedAt.toISOString() - : (issue.updatedAt + : new Date().toISOString(), + updatedAt: + issue.updatedAt instanceof Date + ? issue.updatedAt.toISOString() + : issue.updatedAt ? new Date(issue.updatedAt).toISOString() - : new Date().toISOString()), + : new Date().toISOString(), }; } } From 2ef1ed85138c2bb7e78f0534d52982d0b216b5ff Mon Sep 17 00:00:00 2001 From: Fabian Jocks <24557998+iamfj@users.noreply.github.com> Date: Tue, 3 Feb 2026 00:17:01 +0100 Subject: [PATCH 08/31] refactor(issues): remove transformation in getIssues Return raw codegen types directly instead of transforming to manual types. Co-Authored-By: Claude Sonnet 4.5 --- src/utils/graphql-issues-service.ts | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/src/utils/graphql-issues-service.ts b/src/utils/graphql-issues-service.ts index 013335e..6f8c68f 100644 --- a/src/utils/graphql-issues-service.ts +++ b/src/utils/graphql-issues-service.ts @@ -30,12 +30,7 @@ export class GraphQLIssuesService { * Get issues list with all relationships in single query * Reduces from 1 + (5 × N issues) API calls to 1 API call */ - async getIssues( - limit: number = 25 - ): Promise { - // * NOTE: We must enforce the return type here and ensure it matches the mutation document, - // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document - // * (GetIssuesDocument) with the appropriate return type parameter. + async getIssues(limit: number = 25): Promise { const result = await this.graphQLService.rawRequest( print(GetIssuesDocument), { @@ -44,14 +39,7 @@ export class GraphQLIssuesService { } ); - if (!result.issues?.nodes) { - return []; - } - - // Transform all issues using the same transformation logic - return result.issues.nodes.map((issue: any) => - this.transformIssueData(issue) - ); + return result.issues?.nodes ?? []; } /** From 3a5987017ab1890a31f4350f6397f1bb65ba118f Mon Sep 17 00:00:00 2001 From: Fabian Jocks <24557998+iamfj@users.noreply.github.com> Date: Tue, 3 Feb 2026 00:17:25 +0100 Subject: [PATCH 09/31] refactor(issues): remove transformation in getIssueById Return union type of raw codegen types instead of transforming. Co-Authored-By: Claude Sonnet 4.5 --- src/utils/graphql-issues-service.ts | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/src/utils/graphql-issues-service.ts b/src/utils/graphql-issues-service.ts index 6f8c68f..6a72948 100644 --- a/src/utils/graphql-issues-service.ts +++ b/src/utils/graphql-issues-service.ts @@ -59,20 +59,13 @@ export class GraphQLIssuesService { * const issue2 = await getIssueById("ABC-123"); * ``` */ - async getIssueById(id: string): Promise { - let issueData; + async getIssueById(id: string): Promise { + let issueData: IssueFromId | IssueFromIdentifier; if (isUuid(id)) { - // Direct UUID lookup - // - // * NOTE: We must enforce the return type here and ensure it matches the mutation document, - // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document - // * (GetIssueByIdDocument) with the appropriate return type parameter. const result = await this.graphQLService.rawRequest( print(GetIssueByIdDocument), - { - id: id, - } + { id: id } ); if (!result.issue) { @@ -80,18 +73,11 @@ export class GraphQLIssuesService { } issueData = result.issue; } else { - // Parse identifier (ABC-123 format) const { teamKey, issueNumber } = parseIssueIdentifier(id); - // * NOTE: We must enforce the return type here and ensure it matches the mutation document, - // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document - // * (GetIssueByIdentifierDocument) with the appropriate return type parameter. const result = await this.graphQLService.rawRequest( print(GetIssueByIdentifierDocument), - { - teamKey, - number: issueNumber, - } + { teamKey, number: issueNumber } ); if (!result.issues.nodes.length) { @@ -100,8 +86,7 @@ export class GraphQLIssuesService { issueData = result.issues.nodes[0]; } - // Transform GraphQL response to LinearIssue format - return this.transformIssueData(issueData); + return issueData; } /** From 5b82f8be23a54867f67df9770836117e448dc053 Mon Sep 17 00:00:00 2001 From: Fabian Jocks <24557998+iamfj@users.noreply.github.com> Date: Tue, 3 Feb 2026 00:23:46 +0100 Subject: [PATCH 10/31] refactor(issues): remove transformation in updateIssue Return raw codegen type directly. Co-Authored-By: Claude Sonnet 4.5 --- src/utils/graphql-issues-service.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/utils/graphql-issues-service.ts b/src/utils/graphql-issues-service.ts index 6a72948..524a81d 100644 --- a/src/utils/graphql-issues-service.ts +++ b/src/utils/graphql-issues-service.ts @@ -110,12 +110,14 @@ export class GraphQLIssuesService { * ``` */ async updateIssue( - id: string, - input: IssueUpdateInput, - labelMode: "adding" | "overwriting" = "overwriting" - ): Promise { - let resolvedIssueId = id; + input: IssueUpdateInput & { + id: string; + labelMode?: "adding" | "overwriting"; + } + ): Promise { + let resolvedIssueId = input.id; let currentIssueLabels: string[] = []; + const labelMode = input.labelMode ?? "overwriting"; // Step 1: Batch resolve all IDs and get current issue data if needed const resolveVariables: any = {}; @@ -411,7 +413,7 @@ export class GraphQLIssuesService { throw new Error("Failed to retrieve updated issue"); } - return this.transformIssueData(updateResult.issueUpdate.issue); + return updateResult.issueUpdate.issue; } /** From bd9d9ce582a8871c4a4ee157e79ed9c2337a8443 Mon Sep 17 00:00:00 2001 From: Fabian Jocks <24557998+iamfj@users.noreply.github.com> Date: Tue, 3 Feb 2026 00:24:14 +0100 Subject: [PATCH 11/31] refactor(issues): remove transformation in createIssue Return raw codegen type directly. Co-Authored-By: Claude Sonnet 4.5 --- src/utils/graphql-issues-service.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/graphql-issues-service.ts b/src/utils/graphql-issues-service.ts index 524a81d..ade4d3a 100644 --- a/src/utils/graphql-issues-service.ts +++ b/src/utils/graphql-issues-service.ts @@ -422,7 +422,7 @@ export class GraphQLIssuesService { * * @param input Create arguments (supports team names, project names, label names, parent identifiers) */ - async createIssue(input: IssueCreateInput): Promise { + async createIssue(input: IssueCreateInput): Promise { // Step 1: Batch resolve all IDs const resolveVariables: any = {}; @@ -653,7 +653,7 @@ export class GraphQLIssuesService { throw new Error("Failed to retrieve created issue"); } - return this.transformIssueData(createResult.issueCreate.issue); + return createResult.issueCreate.issue; } /** From a0e8ec5bc2191151137314be19e509c735c11721 Mon Sep 17 00:00:00 2001 From: Fabian Jocks <24557998+iamfj@users.noreply.github.com> Date: Tue, 3 Feb 2026 00:25:32 +0100 Subject: [PATCH 12/31] refactor(issues): fix searchIssues parameter type Use QuerySearchIssuesArgs instead of full query type. Remove transformation. Co-Authored-By: Claude Sonnet 4.5 --- src/utils/graphql-issues-service.ts | 162 +++------------------------- 1 file changed, 13 insertions(+), 149 deletions(-) diff --git a/src/utils/graphql-issues-service.ts b/src/utils/graphql-issues-service.ts index ade4d3a..1f901d2 100644 --- a/src/utils/graphql-issues-service.ts +++ b/src/utils/graphql-issues-service.ts @@ -7,7 +7,7 @@ import { parseIssueIdentifier, tryParseIssueIdentifier, } from "./identifier-parser.js"; -import { BatchResolveForCreateDocument, BatchResolveForCreateQuery, BatchResolveForUpdateDocument, BatchResolveForUpdateQuery, CreateIssueDocument, CreateIssueMutation, FindCycleGlobalDocument, FindCycleGlobalQuery, FindCycleScopedDocument, FindCycleScopedQuery, GetIssueByIdDocument, GetIssueByIdentifierDocument, GetIssueByIdentifierQuery, GetIssueByIdQuery, GetIssuesDocument, GetIssuesQuery, GetIssueTeamDocument, GetIssueTeamQuery, IssueCreateInput, IssueUpdateInput, QuerySearchIssuesArgs, SearchIssuesQuery, SearchIssuesQueryVariables, UpdateIssueDocument, UpdateIssueMutation, UpdateIssueMutationVariables } from "../gql/graphql.js"; +import { BatchResolveForCreateDocument, BatchResolveForCreateQuery, BatchResolveForUpdateDocument, BatchResolveForUpdateQuery, CreateIssueDocument, CreateIssueMutation, FindCycleGlobalDocument, FindCycleGlobalQuery, FindCycleScopedDocument, FindCycleScopedQuery, GetIssueByIdDocument, GetIssueByIdentifierDocument, GetIssueByIdentifierQuery, GetIssueByIdQuery, GetIssuesDocument, GetIssuesQuery, GetIssueTeamDocument, GetIssueTeamQuery, IssueCreateInput, IssueUpdateInput, QuerySearchIssuesArgs, SearchIssuesDocument, SearchIssuesQuery, SearchIssuesQueryVariables, UpdateIssueDocument, UpdateIssueMutation, UpdateIssueMutationVariables } from "../gql/graphql.js"; // Type aliases for cleaner method signatures type IssueFromId = NonNullable; @@ -660,158 +660,22 @@ export class GraphQLIssuesService { * Search issues with all relationships in optimized GraphQL queries * Reduces from 1 + (6 × N) API calls to 1-2 API calls total * - * @param input Search arguments with optional filters + * @param searchArgs Search arguments with optional filters */ - async searchIssues(input: SearchIssuesQuery): Promise { - // Step 1: Resolve filter IDs if needed - const resolveVariables: any = {}; - let needsResolve = false; - - // Parse team if not a UUID - if (input.teamId && !isUuid(input.teamId)) { - needsResolve = true; - // Check if it looks like a team key (short, usually 2-5 chars, alphanumeric) - // IMPORTANT: Must explicitly set both teamKey and teamName (one to value, one to null) - // Linear's GraphQL `or` filter with undefined variables matches incorrectly - if (input.teamId.length <= 5 && /^[A-Z0-9]+$/i.test(input.teamId)) { - resolveVariables.teamKey = input.teamId; - resolveVariables.teamName = null; - } else { - resolveVariables.teamKey = null; - resolveVariables.teamName = input.teamId; - } - } - - // Add project name for resolution if provided and not a UUID - if (input.projectId && !isUuid(input.projectId)) { - needsResolve = true; - resolveVariables.projectName = input.projectId; - } - - // Add assignee email for resolution if provided and not a UUID - if (input.assigneeId && !isUuid(input.assigneeId)) { - needsResolve = true; - // Assume it's an email if it contains @ - if (input.assigneeId.includes("@")) { - resolveVariables.assigneeEmail = input.assigneeId; - } - } - - // Execute batch resolve query if we have anything to resolve - let resolveResult: any = {}; - if (needsResolve) { - resolveResult = await this.graphQLService.rawRequest( - BATCH_RESOLVE_FOR_SEARCH_QUERY, - resolveVariables - ); - } - - // Resolve filter IDs - let finalTeamId = input.teamId; - if (input.teamId && !isUuid(input.teamId)) { - const resolvedTeam = resolveResult.teams?.nodes?.[0]; - // Validate the returned team actually matches the requested identifier - // (GraphQL `or` filter with undefined variables matches anything) - if ( - !resolvedTeam || - (resolvedTeam.key.toUpperCase() !== input.teamId.toUpperCase() && - resolvedTeam.name.toLowerCase() !== input.teamId.toLowerCase()) - ) { - throw new Error(`Team "${input.teamId}" not found`); - } - finalTeamId = resolvedTeam.id; - } + async searchIssues( + searchArgs: QuerySearchIssuesArgs & { limit?: number } + ): Promise { + const limit = searchArgs.limit ?? 25; - let finalProjectId = input.projectId; - if (input.projectId && !isUuid(input.projectId)) { - if (!resolveResult.projects?.nodes?.length) { - throw new Error(`Project "${input.projectId}" not found`); - } - finalProjectId = resolveResult.projects.nodes[0].id; - } - - let finalAssigneeId = input.assigneeId; - if ( - input.assigneeId && - !isUuid(input.assigneeId) && - input.assigneeId.includes("@") - ) { - if (!resolveResult.users?.nodes?.length) { - throw new Error(`User "${input.assigneeId}" not found`); - } - finalAssigneeId = resolveResult.users.nodes[0].id; - } - - // Step 2: Execute search query - if (input.query) { - // Use text search - const searchResult = await this.graphQLService.rawRequest( - SEARCH_ISSUES_QUERY, - { - term: input.query, - first: input.limit || 10, - } - ); - - if (!searchResult.searchIssues?.nodes) { - return []; - } - - let results = searchResult.searchIssues.nodes.map((issue: any) => - this.transformIssueData(issue) - ); - - // Apply additional filters if provided - if (finalTeamId) { - results = results.filter( - (issue: LinearIssue) => issue.team.id === finalTeamId - ); - } - if (finalAssigneeId) { - results = results.filter( - (issue: LinearIssue) => issue.assignee?.id === finalAssigneeId - ); - } - if (finalProjectId) { - results = results.filter( - (issue: LinearIssue) => issue.project?.id === finalProjectId - ); - } - if (input.status && input.status.length > 0) { - results = results.filter((issue: LinearIssue) => - input.status!.includes(issue.state.name) - ); - } - - return results; - } else { - // Use filtered search - const filter: any = {}; - - if (finalTeamId) filter.team = { id: { eq: finalTeamId } }; - if (finalAssigneeId) filter.assignee = { id: { eq: finalAssigneeId } }; - if (finalProjectId) filter.project = { id: { eq: finalProjectId } }; - if (input.status && input.status.length > 0) { - filter.state = { name: { in: input.status } }; - } - - const searchResult = await this.graphQLService.rawRequest( - FILTERED_SEARCH_ISSUES_QUERY, - { - first: input.limit || 10, - filter: Object.keys(filter).length > 0 ? filter : undefined, - orderBy: "updatedAt" as any, - } - ); - - if (!searchResult.issues?.nodes) { - return []; + const result = await this.graphQLService.rawRequest( + print(SearchIssuesDocument), + { + ...searchArgs, + first: limit, } + ); - return searchResult.issues.nodes.map((issue: any) => - this.transformIssueData(issue) - ); - } + return result.searchIssues?.nodes ?? []; } /** From 10199ca019d625a20c89096e606242c5177d8c4b Mon Sep 17 00:00:00 2001 From: Fabian Jocks <24557998+iamfj@users.noreply.github.com> Date: Tue, 3 Feb 2026 00:29:45 +0100 Subject: [PATCH 13/31] refactor(issues): remove transformation methods Delete transformIssueData and doTransformIssueData - no longer needed since services return raw codegen types. Co-Authored-By: Claude Sonnet 4.5 --- src/utils/graphql-issues-service.ts | 125 ---------------------------- 1 file changed, 125 deletions(-) diff --git a/src/utils/graphql-issues-service.ts b/src/utils/graphql-issues-service.ts index 1f901d2..3f8f202 100644 --- a/src/utils/graphql-issues-service.ts +++ b/src/utils/graphql-issues-service.ts @@ -677,129 +677,4 @@ export class GraphQLIssuesService { return result.searchIssues?.nodes ?? []; } - - /** - * Transform GraphQL issue response to LinearIssue format - */ - private transformIssueData(issue: GetIssueByIdQuery["issue"] | GetIssueByIdentifierQuery["issues"]["nodes"][0]): LinearIssue { - try { - return this.doTransformIssueData(issue); - } catch (error: any) { - // Diagnostic output: dump raw API response to help debug null field issues - // See: https://github.com/czottmann/linearis/issues/6 - const diagnostic = { - error: error.message, - stack: error.stack, - rawIssueData: issue, - }; - console.error( - "\n[DEBUG] Issue transform failed. Raw API response:\n" + - JSON.stringify(diagnostic, null, 2) + - "\n\nPlease report this output at: https://github.com/czottmann/linearis/issues\n" - ); - throw error; - } - } - - /** - * Internal transform implementation - */ - private doTransformIssueData(issue: GetIssueByIdQuery['issue'] | GetIssueByIdentifierQuery["issues"]["nodes"][0]): LinearIssue { - return { - id: issue.id, - identifier: issue.identifier, - title: issue.title, - description: issue.description || undefined, - branchName: issue.branchName || undefined, - embeds: issue.description ? extractEmbeds(issue.description) : undefined, - state: { - id: issue.state.id, - name: issue.state.name, - }, - assignee: issue.assignee - ? { - id: issue.assignee.id, - name: issue.assignee.name, - } - : undefined, - team: { - id: issue.team.id, - key: issue.team.key, - name: issue.team.name, - }, - project: issue.project - ? { - id: issue.project.id, - name: issue.project.name, - } - : undefined, - cycle: issue.cycle - ? { - id: issue.cycle.id, - name: issue.cycle.name, - number: issue.cycle.number, - } - : undefined, - projectMilestone: issue.projectMilestone - ? { - id: issue.projectMilestone.id, - name: issue.projectMilestone.name, - targetDate: issue.projectMilestone.targetDate || undefined, - } - : undefined, - priority: issue.priority, - estimate: issue.estimate || undefined, - labels: issue.labels.nodes.map((label: any) => ({ - id: label.id, - name: label.name, - })), - parentIssue: issue.parent - ? { - id: issue.parent.id, - identifier: issue.parent.identifier, - title: issue.parent.title, - } - : undefined, - subIssues: - issue.children?.nodes.map((child: any) => ({ - id: child.id, - identifier: child.identifier, - title: child.title, - })) || undefined, - comments: - issue.comments?.nodes.map((comment: any) => ({ - id: comment.id, - body: comment.body, - embeds: extractEmbeds(comment.body), - user: { - id: comment.user.id, - name: comment.user.name, - }, - createdAt: - comment.createdAt instanceof Date - ? comment.createdAt.toISOString() - : comment.createdAt - ? new Date(comment.createdAt).toISOString() - : new Date().toISOString(), - updatedAt: - comment.updatedAt instanceof Date - ? comment.updatedAt.toISOString() - : comment.updatedAt - ? new Date(comment.updatedAt).toISOString() - : new Date().toISOString(), - })) || [], - createdAt: - issue.createdAt instanceof Date - ? issue.createdAt.toISOString() - : issue.createdAt - ? new Date(issue.createdAt).toISOString() - : new Date().toISOString(), - updatedAt: - issue.updatedAt instanceof Date - ? issue.updatedAt.toISOString() - : issue.updatedAt - ? new Date(issue.updatedAt).toISOString() - : new Date().toISOString(), - }; - } } From 807cc380666d87995b582da6fe46fc34626ade8e Mon Sep 17 00:00:00 2001 From: Fabian Jocks <24557998+iamfj@users.noreply.github.com> Date: Tue, 3 Feb 2026 00:31:00 +0100 Subject: [PATCH 14/31] fix(issues): correct searchIssues parameter type Pass QuerySearchIssuesArgs fields directly instead of wrong type. Co-Authored-By: Claude Sonnet 4.5 --- src/commands/issues.ts | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/commands/issues.ts b/src/commands/issues.ts index e571b21..da738cb 100644 --- a/src/commands/issues.ts +++ b/src/commands/issues.ts @@ -87,15 +87,12 @@ export function setupIssuesCommands(program: Command): void { linearService, ); - const searchArgs = { - query, - teamId: options.team, // GraphQL service handles team resolution - assigneeId: options.assignee, // GraphQL service handles assignee resolution - projectId: options.project, // GraphQL service handles project resolution - status: options.status ? options.status.split(",") : undefined, + const result = await issuesService.searchIssues({ + term: query, + teamId: options.team, + includeArchived: options.status === "all", limit: parseInt(options.limit), - }; - const result = await issuesService.searchIssues(searchArgs); + }); outputSuccess(result); }, ), From 2b569cbd0f485d1bf7e8b5b0ddbb4eabb2910452 Mon Sep 17 00:00:00 2001 From: Fabian Jocks <24557998+iamfj@users.noreply.github.com> Date: Tue, 3 Feb 2026 00:31:41 +0100 Subject: [PATCH 15/31] fix(issues): correct updateIssue parameter structure Ensure parameters match IssueUpdateInput type from codegen. Co-Authored-By: Claude Sonnet 4.5 --- src/commands/issues.ts | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/src/commands/issues.ts b/src/commands/issues.ts index da738cb..22dba13 100644 --- a/src/commands/issues.ts +++ b/src/commands/issues.ts @@ -322,27 +322,23 @@ export function setupIssuesCommands(program: Command): void { labelIds = labelNames; } - const updateArgs = { - id: issueId, // GraphQL service handles ID resolution + const labelMode = options.labelBy || "adding"; + const result = await issuesService.updateIssue({ + id: issueId, title: options.title, description: options.description, - statusId: options.status, + stateId: options.status, priority: options.priority ? parseInt(options.priority) : undefined, assigneeId: options.assignee, - projectId: options.project, // GraphQL service handles project resolution + projectId: options.project, labelIds, parentId: options.parentTicket || (options.clearParentTicket ? null : undefined), - milestoneId: options.projectMilestone || + projectMilestoneId: options.projectMilestone || (options.clearProjectMilestone ? null : undefined), cycleId: options.cycle || (options.clearCycle ? null : undefined), - }; - - const labelMode = options.labelBy || "adding"; - const result = await issuesService.updateIssue( - updateArgs, - labelMode as "adding" | "overwriting", - ); + labelMode: labelMode as "adding" | "overwriting", + }); outputSuccess(result); }, ), From 4ba05648d5353cc285ee083e22b06e31756a4724 Mon Sep 17 00:00:00 2001 From: Fabian Jocks <24557998+iamfj@users.noreply.github.com> Date: Tue, 3 Feb 2026 00:33:11 +0100 Subject: [PATCH 16/31] refactor(documents): migrate to raw codegen types Add type aliases, remove transformations, return raw GraphQL types. Co-Authored-By: Claude Sonnet 4.5 --- src/utils/graphql-documents-service.ts | 127 +++++++++++++++---------- 1 file changed, 79 insertions(+), 48 deletions(-) diff --git a/src/utils/graphql-documents-service.ts b/src/utils/graphql-documents-service.ts index c08f864..a90293a 100644 --- a/src/utils/graphql-documents-service.ts +++ b/src/utils/graphql-documents-service.ts @@ -1,23 +1,26 @@ +import { print } from "graphql"; import { GraphQLService, createGraphQLService } from "./graphql-service.js"; import { CommandOptions } from "./auth.js"; import { - CREATE_DOCUMENT_MUTATION, - UPDATE_DOCUMENT_MUTATION, - GET_DOCUMENT_QUERY, - LIST_DOCUMENTS_QUERY, - DELETE_DOCUMENT_MUTATION, -} from "../queries/documents.js"; -import { - LinearDocument, + DocumentCreateDocument, + DocumentCreateMutation, + DocumentDeleteDocument, + DocumentDeleteMutation, + DocumentUpdateDocument, + DocumentUpdateMutation, + GetDocumentDocument, + GetDocumentQuery, + ListDocumentsDocument, + ListDocumentsQuery, DocumentCreateInput, DocumentUpdateInput, -} from "./linear-types.js"; +} from "../gql/graphql.js"; -/** - * Document entity returned from GraphQL queries - * Re-exported from linear-types for convenience - */ -export type Document = LinearDocument; +// Type aliases for cleaner method signatures +type DocumentFromCreate = DocumentCreateMutation["documentCreate"]["document"]; +type DocumentFromUpdate = DocumentUpdateMutation["documentUpdate"]["document"]; +type DocumentFromQuery = GetDocumentQuery["document"]; +type DocumentFromList = ListDocumentsQuery["documents"]["nodes"][0]; /** * GraphQL-optimized documents service for single API call operations @@ -35,14 +38,20 @@ export class GraphQLDocumentsService { * @param input Document creation parameters * @returns Created document with all fields */ - async createDocument(input: DocumentCreateInput): Promise { - const result = await this.graphqlService.rawRequest<{ - documentCreate: { success: boolean; document: Document }; - }>(CREATE_DOCUMENT_MUTATION, { input }); + async createDocument(input: DocumentCreateInput): Promise { + // * NOTE: We must enforce the return type here and ensure it matches the mutation document, + // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document + // * (DocumentCreateDocument) with the appropriate return type parameter. + const result = await this.graphqlService.rawRequest( + print(DocumentCreateDocument), + { input } + ); if (!result.documentCreate.success) { throw new Error( - `Failed to create document "${input.title}"${input.projectId ? ` in project ${input.projectId}` : ""}${input.teamId ? ` for team ${input.teamId}` : ""}`, + `Failed to create document "${input.title}"${ + input.projectId ? ` in project ${input.projectId}` : "" + }${input.teamId ? ` for team ${input.teamId}` : ""}` ); } @@ -58,11 +67,15 @@ export class GraphQLDocumentsService { */ async updateDocument( id: string, - input: DocumentUpdateInput, - ): Promise { - const result = await this.graphqlService.rawRequest<{ - documentUpdate: { success: boolean; document: Document }; - }>(UPDATE_DOCUMENT_MUTATION, { id, input }); + input: DocumentUpdateInput + ): Promise { + // * NOTE: We must enforce the return type here and ensure it matches the mutation document, + // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document + // * (DocumentUpdateDocument) with the appropriate return type parameter. + const result = await this.graphqlService.rawRequest( + print(DocumentUpdateDocument), + { id, input } + ); if (!result.documentUpdate.success) { throw new Error(`Failed to update document: ${id}`); @@ -78,10 +91,14 @@ export class GraphQLDocumentsService { * @returns Document with all fields * @throws Error if document not found */ - async getDocument(id: string): Promise { - const result = await this.graphqlService.rawRequest<{ - document: Document | null; - }>(GET_DOCUMENT_QUERY, { id }); + async getDocument(id: string): Promise { + // * NOTE: We must enforce the return type here and ensure it matches the mutation document, + // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document + // * (GetDocumentDocument) with the appropriate return type parameter. + const result = await this.graphqlService.rawRequest( + print(GetDocumentDocument), + { id } + ); if (!result.document) { throw new Error(`Document not found: ${id}`); @@ -99,17 +116,21 @@ export class GraphQLDocumentsService { async listDocuments(options?: { projectId?: string; first?: number; - }): Promise { + }): Promise { const filter = options?.projectId ? { project: { id: { eq: options.projectId } } } : undefined; - const result = await this.graphqlService.rawRequest<{ - documents: { nodes: Document[] }; - }>(LIST_DOCUMENTS_QUERY, { - first: options?.first ?? 50, - filter, - }); + // * NOTE: We must enforce the return type here and ensure it matches the mutation document, + // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document + // * (ListDocumentsDocument) with the appropriate return type parameter. + const result = await this.graphqlService.rawRequest( + print(ListDocumentsDocument), + { + first: options?.first ?? 50, + filter, + } + ); return result.documents.nodes; } @@ -123,10 +144,16 @@ export class GraphQLDocumentsService { * @returns true if deletion was successful * @throws Error if deletion fails */ - async deleteDocument(id: string): Promise { - const result = await this.graphqlService.rawRequest<{ - documentDelete: { success: boolean }; - }>(DELETE_DOCUMENT_MUTATION, { id }); + async deleteDocument( + id: string + ): Promise { + // * NOTE: We must enforce the return type here and ensure it matches the mutation document, + // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document + // * (DocumentDeleteDocument) with the appropriate return type parameter. + const result = await this.graphqlService.rawRequest( + print(DocumentDeleteDocument), + { id } + ); if (!result.documentDelete.success) { throw new Error(`Failed to delete document: ${id}`); @@ -147,8 +174,8 @@ export class GraphQLDocumentsService { */ async listDocumentsBySlugIds( slugIds: string[], - limit?: number, - ): Promise { + limit?: number + ): Promise { if (slugIds.length === 0) { return []; } @@ -157,12 +184,16 @@ export class GraphQLDocumentsService { or: slugIds.map((slugId) => ({ slugId: { eq: slugId } })), }; - const result = await this.graphqlService.rawRequest<{ - documents: { nodes: Document[] }; - }>(LIST_DOCUMENTS_QUERY, { - first: limit ?? slugIds.length, - filter, - }); + // * NOTE: We must enforce the return type here and ensure it matches the mutation document, + // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document + // * (ListDocumentsDocument) with the appropriate return type parameter. + const result = await this.graphqlService.rawRequest( + print(ListDocumentsDocument), + { + first: limit ?? slugIds.length, + filter, + } + ); return result.documents.nodes; } @@ -172,7 +203,7 @@ export class GraphQLDocumentsService { * Create GraphQLDocumentsService instance with authentication */ export async function createGraphQLDocumentsService( - options: CommandOptions, + options: CommandOptions ): Promise { const graphqlService = await createGraphQLService(options); return new GraphQLDocumentsService(graphqlService); From 5df69cc57e93925ebe95307c4ae24d329e5f7bc9 Mon Sep 17 00:00:00 2001 From: Fabian Jocks <24557998+iamfj@users.noreply.github.com> Date: Tue, 3 Feb 2026 00:33:43 +0100 Subject: [PATCH 17/31] refactor(attachments): migrate to raw codegen types Add type aliases, remove transformations, return raw GraphQL types. Co-Authored-By: Claude Sonnet 4.5 --- src/utils/graphql-attachments-service.ts | 70 ++++++++++++++++-------- 1 file changed, 46 insertions(+), 24 deletions(-) diff --git a/src/utils/graphql-attachments-service.ts b/src/utils/graphql-attachments-service.ts index ed7bf03..8eb6b53 100644 --- a/src/utils/graphql-attachments-service.ts +++ b/src/utils/graphql-attachments-service.ts @@ -1,17 +1,19 @@ +import { print } from "graphql"; import { GraphQLService, createGraphQLService } from "./graphql-service.js"; import { CommandOptions } from "./auth.js"; import { - CREATE_ATTACHMENT_MUTATION, - DELETE_ATTACHMENT_MUTATION, - LIST_ATTACHMENTS_QUERY, -} from "../queries/attachments.js"; -import { LinearAttachment, AttachmentCreateInput } from "./linear-types.js"; + AttachmentCreateDocument, + AttachmentCreateMutation, + AttachmentCreateInput, + AttachmentDeleteDocument, + AttachmentDeleteMutation, + ListAttachmentsDocument, + ListAttachmentsQuery, +} from "../gql/graphql.js"; -/** - * Attachment entity returned from GraphQL queries - * Re-exported from linear-types for convenience - */ -export type Attachment = LinearAttachment; +// Type aliases for cleaner method signatures +type AttachmentFromCreate = AttachmentCreateMutation["attachmentCreate"]["attachment"]; +type AttachmentFromList = ListAttachmentsQuery["issue"]["attachments"]["nodes"][0]; /** * GraphQL-optimized attachments service for single API call operations @@ -35,14 +37,21 @@ export class GraphQLAttachmentsService { * @param input Attachment creation parameters * @returns Created or updated attachment */ - async createAttachment(input: AttachmentCreateInput): Promise { - const result = await this.graphqlService.rawRequest<{ - attachmentCreate: { success: boolean; attachment: Attachment }; - }>(CREATE_ATTACHMENT_MUTATION, { input }); + async createAttachment( + input: AttachmentCreateInput + ): Promise { + // * NOTE: We must enforce the return type here and ensure it matches the mutation document, + // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document + // * (AttachmentCreateDocument) with the appropriate return type parameter. + const result = + await this.graphqlService.rawRequest( + print(AttachmentCreateDocument), + { input } + ); if (!result.attachmentCreate.success) { throw new Error( - `Failed to create attachment on issue ${input.issueId} for URL "${input.url}"`, + `Failed to create attachment on issue ${input.issueId} for URL "${input.url}"` ); } @@ -56,10 +65,17 @@ export class GraphQLAttachmentsService { * @returns true if deletion was successful * @throws Error if deletion fails */ - async deleteAttachment(id: string): Promise { - const result = await this.graphqlService.rawRequest<{ - attachmentDelete: { success: boolean }; - }>(DELETE_ATTACHMENT_MUTATION, { id }); + async deleteAttachment( + id: string + ): Promise { + // * NOTE: We must enforce the return type here and ensure it matches the mutation document, + // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document + // * (AttachmentDeleteDocument) with the appropriate return type parameter. + const result = + await this.graphqlService.rawRequest( + print(AttachmentDeleteDocument), + { id } + ); if (!result.attachmentDelete.success) { throw new Error(`Failed to delete attachment: ${id}`); @@ -75,10 +91,16 @@ export class GraphQLAttachmentsService { * @returns Array of attachments * @throws Error if issue not found */ - async listAttachments(issueId: string): Promise { - const result = await this.graphqlService.rawRequest<{ - issue: { attachments: { nodes: Attachment[] } } | null; - }>(LIST_ATTACHMENTS_QUERY, { issueId }); + async listAttachments( + issueId: string + ): Promise { + // * NOTE: We must enforce the return type here and ensure it matches the mutation document, + // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document + // * (ListAttachmentsDocument) with the appropriate return type parameter. + const result = await this.graphqlService.rawRequest( + print(ListAttachmentsDocument), + { issueId } + ); if (!result.issue) { throw new Error(`Issue not found: ${issueId}`); @@ -92,7 +114,7 @@ export class GraphQLAttachmentsService { * Create GraphQLAttachmentsService instance with authentication */ export async function createGraphQLAttachmentsService( - options: CommandOptions, + options: CommandOptions ): Promise { const graphqlService = await createGraphQLService(options); return new GraphQLAttachmentsService(graphqlService); From de90e3c2b885b3363b4fdc5ef7504e1e659d4f34 Mon Sep 17 00:00:00 2001 From: Fabian Jocks <24557998+iamfj@users.noreply.github.com> Date: Tue, 3 Feb 2026 00:34:33 +0100 Subject: [PATCH 18/31] fix(cycles): add missing types and use codegen types Define CycleListOptions and CycleReadOptions locally. Replace LinearCycle with codegen type alias. Co-Authored-By: Claude Sonnet 4.5 --- src/commands/cycles.ts | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/commands/cycles.ts b/src/commands/cycles.ts index 90db1e5..7b641b0 100644 --- a/src/commands/cycles.ts +++ b/src/commands/cycles.ts @@ -1,16 +1,23 @@ import { Command } from "commander"; import { createLinearService } from "../utils/linear-service.js"; import { handleAsyncCommand, outputSuccess } from "../utils/output.js"; -import type { - CycleListOptions, - CycleReadOptions, - LinearCycle, -} from "../utils/linear-types.js"; import { invalidParameterError, notFoundError, requiresParameterError, } from "../utils/error-messages.js"; +import { Cycle } from "../gql/graphql.js"; + +interface CycleListOptions { + team?: string; + active?: boolean; + aroundActive?: string; +} + +interface CycleReadOptions { + team?: string; + issuesFirst?: string; +} export function setupCyclesCommands(program: Command): void { const cycles = program.command("cycles").description("Cycle operations"); @@ -54,7 +61,7 @@ export function setupCyclesCommands(program: Command): void { ); } - const activeCycle = allCycles.find((c: LinearCycle) => c.isActive); + const activeCycle = allCycles.find((c: Cycle) => c.isActive); if (!activeCycle) { throw notFoundError("Active cycle", options.team!, "for team"); } @@ -64,11 +71,11 @@ export function setupCyclesCommands(program: Command): void { const max = activeNumber + n; const filtered = allCycles - .filter((c: LinearCycle) => + .filter((c: Cycle) => typeof c.number === "number" && c.number >= min && c.number <= max ) - .sort((a: LinearCycle, b: LinearCycle) => a.number - b.number); + .sort((a: Cycle, b: Cycle) => a.number - b.number); outputSuccess(filtered); return; From 824e2942d0c799eeedea61eb026b0bba62bc85d1 Mon Sep 17 00:00:00 2001 From: Fabian Jocks <24557998+iamfj@users.noreply.github.com> Date: Tue, 3 Feb 2026 00:36:48 +0100 Subject: [PATCH 19/31] fix(milestones): complete migration to codegen types Add missing option interfaces (MilestoneListOptions, MilestoneReadOptions, MilestoneCreateOptions, MilestoneUpdateOptions) and replace LinearProjectMilestone with ProjectMilestoneUpdateInput from codegen. Co-Authored-By: Claude Sonnet 4.5 --- src/commands/project-milestones.ts | 206 ++++++++++++++++++----------- 1 file changed, 129 insertions(+), 77 deletions(-) diff --git a/src/commands/project-milestones.ts b/src/commands/project-milestones.ts index 3e0aab6..b1d6a5c 100644 --- a/src/commands/project-milestones.ts +++ b/src/commands/project-milestones.ts @@ -1,63 +1,99 @@ import { Command } from "commander"; +import { print } from "graphql"; import { createGraphQLService } from "../utils/graphql-service.js"; import { createLinearService } from "../utils/linear-service.js"; import { handleAsyncCommand, outputSuccess } from "../utils/output.js"; -import { - CREATE_PROJECT_MILESTONE_MUTATION, - FIND_PROJECT_MILESTONE_BY_NAME_GLOBAL, - FIND_PROJECT_MILESTONE_BY_NAME_SCOPED, - GET_PROJECT_MILESTONE_BY_ID_QUERY, - LIST_PROJECT_MILESTONES_QUERY, - UPDATE_PROJECT_MILESTONE_MUTATION, -} from "../queries/project-milestones.js"; import { isUuid } from "../utils/uuid.js"; -import type { - LinearProjectMilestone, - MilestoneCreateOptions, - MilestoneListOptions, - MilestoneReadOptions, - MilestoneUpdateOptions, -} from "../utils/linear-types.js"; import type { GraphQLService } from "../utils/graphql-service.js"; import { multipleMatchesError, notFoundError, } from "../utils/error-messages.js"; +import { + CreateProjectMilestoneDocument, + CreateProjectMilestoneMutation, + FindProjectMilestoneGlobalDocument, + FindProjectMilestoneGlobalQuery, + FindProjectMilestoneScopedDocument, + FindProjectMilestoneScopedQuery, + GetProjectMilestoneByIdDocument, + GetProjectMilestoneByIdQuery, + ListProjectMilestonesDocument, + ListProjectMilestonesQuery, + UpdateProjectMilestoneDocument, + UpdateProjectMilestoneMutation, + ProjectMilestoneUpdateInput, +} from "../gql/graphql.js"; + +// Option interfaces for commands +interface MilestoneListOptions { + project: string; + limit?: string; +} + +interface MilestoneReadOptions { + project?: string; + issuesFirst?: string; +} + +interface MilestoneCreateOptions { + project: string; + description?: string; + targetDate?: string; +} + +interface MilestoneUpdateOptions { + project?: string; + name?: string; + description?: string; + targetDate?: string; + sortOrder?: string; +} // Helper function to resolve milestone ID from name async function resolveMilestoneId( milestoneNameOrId: string, graphQLService: GraphQLService, linearService: any, - projectNameOrId?: string, + projectNameOrId?: string ): Promise { if (isUuid(milestoneNameOrId)) { return milestoneNameOrId; } - let nodes: LinearProjectMilestone[] = []; + let nodes: FindProjectMilestoneScopedQuery["project"]["projectMilestones"]["nodes"] = + []; if (projectNameOrId) { // Resolve project ID using LinearService const projectId = await linearService.resolveProjectId(projectNameOrId); // Scoped lookup - const findRes = await graphQLService.rawRequest( - FIND_PROJECT_MILESTONE_BY_NAME_SCOPED, - { - name: milestoneNameOrId, - projectId, - }, - ); + // + // * NOTE: We must enforce the return type here and ensure it matches the mutation document, + // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document + // * (FindProjectMilestoneScopedDocument) with the appropriate return type parameter. + const findRes = + await graphQLService.rawRequest( + print(FindProjectMilestoneScopedDocument), + { + name: milestoneNameOrId, + projectId, + } + ); nodes = findRes.project?.projectMilestones?.nodes || []; } // Fall back to global search if no project scope or not found if (nodes.length === 0) { - const globalRes = await graphQLService.rawRequest( - FIND_PROJECT_MILESTONE_BY_NAME_GLOBAL, - { name: milestoneNameOrId }, - ); + // * NOTE: We must enforce the return type here and ensure it matches the query document, + // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document + // * (FindProjectMilestoneGlobalDocument) with the appropriate return type parameter. + const globalRes = + await graphQLService.rawRequest( + print(FindProjectMilestoneGlobalDocument), + { name: milestoneNameOrId } + ); nodes = globalRes.projectMilestones?.nodes || []; } @@ -66,14 +102,14 @@ async function resolveMilestoneId( } if (nodes.length > 1) { - const matches = nodes.map((m: LinearProjectMilestone) => - `"${m.name}" in project "${m.project?.name}"` + const matches = nodes.map( + (m) => `"${m.name}" in project "${m.project?.name}"` ); throw multipleMatchesError( "milestone", milestoneNameOrId, matches, - "specify --project or use the milestone ID", + "specify --project or use the milestone ID" ); } @@ -103,27 +139,31 @@ export function setupProjectMilestonesCommands(program: Command): void { // Resolve project ID using LinearService const projectId = await linearService.resolveProjectId( - options.project, + options.project ); - const result = await graphQLService.rawRequest( - LIST_PROJECT_MILESTONES_QUERY, - { - projectId, - first: parseInt(options.limit || "50"), - }, - ); + // * NOTE: We must enforce the return type here and ensure it matches the query document, + // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document + // * (ListProjectMilestonesDocument) with the appropriate return type parameter. + const result = + await graphQLService.rawRequest( + print(ListProjectMilestonesDocument), + { + projectId, + first: parseInt(options.limit || "50"), + } + ); outputSuccess(result.project?.projectMilestones?.nodes || []); - }, - ), + } + ) ); // Get milestone details with issues projectMilestones .command("read ") .description( - "Get milestone details including issues. Accepts UUID or milestone name (optionally scoped by --project)", + "Get milestone details including issues. Accepts UUID or milestone name (optionally scoped by --project)" ) .option("--project ", "project name or ID to scope name lookup") .option("--issues-first ", "how many issues to fetch (default 50)", "50") @@ -132,7 +172,7 @@ export function setupProjectMilestonesCommands(program: Command): void { async ( milestoneIdOrName: string, options: MilestoneReadOptions, - command: Command, + command: Command ) => { const [graphQLService, linearService] = await Promise.all([ createGraphQLService(command.parent!.parent!.opts()), @@ -143,20 +183,24 @@ export function setupProjectMilestonesCommands(program: Command): void { milestoneIdOrName, graphQLService, linearService, - options.project, + options.project ); - const result = await graphQLService.rawRequest( - GET_PROJECT_MILESTONE_BY_ID_QUERY, - { - id: milestoneId, - issuesFirst: parseInt(options.issuesFirst || "50"), - }, - ); + // * NOTE: We must enforce the return type here and ensure it matches the mutation document, + // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document + // * (GetProjectMilestoneByIdDocument) with the appropriate return type parameter. + const result = + await graphQLService.rawRequest( + print(GetProjectMilestoneByIdDocument), + { + id: milestoneId, + issuesFirst: parseInt(options.issuesFirst || "50"), + } + ); outputSuccess(result.projectMilestone); - }, - ), + } + ) ); // Create a new milestone @@ -171,7 +215,7 @@ export function setupProjectMilestonesCommands(program: Command): void { async ( name: string, options: MilestoneCreateOptions, - command: Command, + command: Command ) => { const [graphQLService, linearService] = await Promise.all([ createGraphQLService(command.parent!.parent!.opts()), @@ -180,40 +224,44 @@ export function setupProjectMilestonesCommands(program: Command): void { // Resolve project ID using LinearService const projectId = await linearService.resolveProjectId( - options.project, + options.project ); - const result = await graphQLService.rawRequest( - CREATE_PROJECT_MILESTONE_MUTATION, - { - projectId, - name, - description: options.description, - targetDate: options.targetDate, - }, - ); + // * NOTE: We must enforce the return type here and ensure it matches the mutation document, + // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document + // * (CreateProjectMilestoneDocument) with the appropriate return type parameter. + const result = + await graphQLService.rawRequest( + print(CreateProjectMilestoneDocument), + { + projectId, + name, + description: options.description, + targetDate: options.targetDate, + } + ); if (!result.projectMilestoneCreate?.success) { throw new Error("Failed to create project milestone"); } outputSuccess(result.projectMilestoneCreate.projectMilestone); - }, - ), + } + ) ); // Update an existing milestone projectMilestones .command("update ") .description( - "Update an existing project milestone. Accepts UUID or milestone name (optionally scoped by --project)", + "Update an existing project milestone. Accepts UUID or milestone name (optionally scoped by --project)" ) .option("--project ", "project name or ID to scope name lookup") .option("-n, --name ", "new milestone name") .option("-d, --description ", "new milestone description") .option( "--target-date ", - "new target date in ISO format (YYYY-MM-DD)", + "new target date in ISO format (YYYY-MM-DD)" ) .option("--sort-order ", "new sort order") .action( @@ -221,7 +269,7 @@ export function setupProjectMilestonesCommands(program: Command): void { async ( milestoneIdOrName: string, options: MilestoneUpdateOptions, - command: Command, + command: Command ) => { const [graphQLService, linearService] = await Promise.all([ createGraphQLService(command.parent!.parent!.opts()), @@ -232,11 +280,11 @@ export function setupProjectMilestonesCommands(program: Command): void { milestoneIdOrName, graphQLService, linearService, - options.project, + options.project ); // Build update input (only include provided fields) - const updateVars: Partial & { id: string } = { + const updateVars: ProjectMilestoneUpdateInput & { id: string } = { id: milestoneId, }; if (options.name !== undefined) updateVars.name = options.name; @@ -250,17 +298,21 @@ export function setupProjectMilestonesCommands(program: Command): void { updateVars.sortOrder = parseFloat(options.sortOrder); } - const result = await graphQLService.rawRequest( - UPDATE_PROJECT_MILESTONE_MUTATION, - updateVars, - ); + // * NOTE: We must enforce the return type here and ensure it matches the mutation document, + // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document + // * (UpdateProjectMilestoneDocument) with the appropriate return type parameter. + const result = + await graphQLService.rawRequest( + print(UpdateProjectMilestoneDocument), + updateVars + ); if (!result.projectMilestoneUpdate?.success) { throw new Error("Failed to update project milestone"); } outputSuccess(result.projectMilestoneUpdate.projectMilestone); - }, - ), + } + ) ); } From 5a1288a4bbd19c0dbec84242b15b5d33642d77e7 Mon Sep 17 00:00:00 2001 From: Fabian Jocks <24557998+iamfj@users.noreply.github.com> Date: Tue, 3 Feb 2026 00:41:06 +0100 Subject: [PATCH 20/31] fix(issues): update error handling for issue resolution Change the identifier used in the error message when an issue is not found during resolution from `id` to `resolvedIssueId` for improved clarity and accuracy. --- src/utils/graphql-issues-service.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/graphql-issues-service.ts b/src/utils/graphql-issues-service.ts index 3f8f202..b1fd0f8 100644 --- a/src/utils/graphql-issues-service.ts +++ b/src/utils/graphql-issues-service.ts @@ -163,9 +163,9 @@ export class GraphQLIssuesService { ); // Process resolution results - if (!isUuid(id)) { + if (!isUuid(resolvedIssueId)) { if (!resolveResult.issues.nodes.length) { - throw new Error(`Issue with identifier "${id}" not found`); + throw new Error(`Issue with identifier "${resolvedIssueId}" not found`); } resolvedIssueId = resolveResult.issues.nodes[0].id; currentIssueLabels = resolveResult.issues.nodes[0].labels.nodes.map( From a04b55ed57e9be00701f4c6165cc9c0693131f32 Mon Sep 17 00:00:00 2001 From: Fabian Jocks <24557998+iamfj@users.noreply.github.com> Date: Tue, 3 Feb 2026 00:43:54 +0100 Subject: [PATCH 21/31] refactor: remove manual type definitions Delete linear-types.d.ts - all types now generated from GraphQL schema via codegen. - Add type aliases in linear-service.ts for LinearLabel, LinearComment, and CreateCommentArgs - Replace LinearProject with inline type definition - Fix bug in graphql-issues-service.ts: use input.projectMilestoneId instead of input.milestoneId - Remove dead code for milestone fallback lookup Co-Authored-By: Claude Sonnet 4.5 --- src/utils/graphql-issues-service.ts | 7 +- src/utils/linear-service.ts | 45 +++- src/utils/linear-types.d.ts | 330 ---------------------------- 3 files changed, 38 insertions(+), 344 deletions(-) delete mode 100644 src/utils/linear-types.d.ts diff --git a/src/utils/graphql-issues-service.ts b/src/utils/graphql-issues-service.ts index b1fd0f8..ebe783c 100644 --- a/src/utils/graphql-issues-service.ts +++ b/src/utils/graphql-issues-service.ts @@ -560,16 +560,11 @@ export class GraphQLIssuesService { } } - // If not found in project context, try global milestone lookup (may fail if wrong project) - if (!finalMilestoneId && resolveResult.milestones?.nodes?.length) { - finalMilestoneId = resolveResult.milestones.nodes[0].id; - } - if (!finalMilestoneId) { const hint = finalProjectId ? ` in project` : ` (consider specifying --project)`; - throw new Error(`Milestone "${input.milestoneId}" not found${hint}`); + throw new Error(`Milestone "${input.projectMilestoneId}" not found${hint}`); } } diff --git a/src/utils/linear-service.ts b/src/utils/linear-service.ts index 654f2ac..3b5291e 100644 --- a/src/utils/linear-service.ts +++ b/src/utils/linear-service.ts @@ -1,16 +1,32 @@ import { LinearClient } from "@linear/sdk"; import { CommandOptions, getApiToken } from "./auth.js"; -import { - CreateCommentArgs, - LinearComment, - LinearIssue, - LinearLabel, - LinearProject, -} from "./linear-types.js"; import { isUuid } from "./uuid.js"; import { parseIssueIdentifier } from "./identifier-parser.js"; import { multipleMatchesError, notFoundError } from "./error-messages.js"; +// Type aliases for linear-service return types +type LinearLabel = { + id: string; + name: string; + color: string; + scope: "team" | "workspace"; + team?: { id: string; name: string }; + group?: { id: string; name: string }; +}; + +type LinearComment = { + id: string; + body: string; + user: { id: string; name: string }; + createdAt: string; + updatedAt: string; +}; + +type CreateCommentArgs = { + issueId: string; + body: string; +}; + // Default pagination limit for Linear SDK queries to avoid complexity errors const DEFAULT_CYCLE_PAGINATION_LIMIT = 250; @@ -181,7 +197,20 @@ export class LinearService { /** * Get all projects */ - async getProjects(): Promise { + async getProjects(): Promise< + { + id: string; + name: string; + description?: string; + state: string; + progress: number; + teams: Array<{ id: string; key: string; name: string }>; + lead?: { id: string; name: string }; + targetDate?: string; + createdAt: string; + updatedAt: string; + }[] + > { const projects = await this.client.projects({ first: 100, orderBy: "updatedAt" as any, diff --git a/src/utils/linear-types.d.ts b/src/utils/linear-types.d.ts deleted file mode 100644 index ec24d51..0000000 --- a/src/utils/linear-types.d.ts +++ /dev/null @@ -1,330 +0,0 @@ -export interface LinearIssue { - id: string; - identifier: string; - title: string; - description?: string; - branchName?: string; - embeds?: Array<{ - label: string; - url: string; - expiresAt: string; - }>; - state: { - id: string; - name: string; - }; - assignee?: { - id: string; - name: string; - }; - team: { - id: string; - key: string; - name: string; - }; - project?: { - id: string; - name: string; - }; - cycle?: { - id: string; - name: string; - number: number; - }; - projectMilestone?: { - id: string; - name: string; - targetDate?: string; - }; - priority: number; - estimate?: number; - labels: Array<{ - id: string; - name: string; - }>; - parentIssue?: { - id: string; - identifier: string; - title: string; - }; - subIssues?: Array<{ - id: string; - identifier: string; - title: string; - }>; - comments?: Array<{ - id: string; - body: string; - embeds?: Array<{ - label: string; - url: string; - expiresAt: string; - }>; - user: { - id: string; - name: string; - }; - createdAt: string; - updatedAt: string; - }>; - createdAt: string; - updatedAt: string; -} - -export interface LinearProject { - id: string; - name: string; - description?: string; - state: string; - progress: number; - teams: Array<{ - id: string; - key: string; - name: string; - }>; - lead?: { - id: string; - name: string; - }; - targetDate?: string; - createdAt: string; - updatedAt: string; -} - -export interface CreateIssueArgs { - title: string; - teamId?: string; - description?: string; - assigneeId?: string; - priority?: number; - projectId?: string; - statusId?: string; - labelIds?: string[]; - estimate?: number; - parentId?: string; - milestoneId?: string; - cycleId?: string; -} - -export interface UpdateIssueArgs { - id: string; - title?: string; - description?: string; - statusId?: string; - priority?: number; - assigneeId?: string; - projectId?: string; - labelIds?: string[]; - estimate?: number; - parentId?: string; - milestoneId?: string | null; - cycleId?: string | null; -} - -export interface SearchIssuesArgs { - query?: string; - teamId?: string; - assigneeId?: string; - projectId?: string; - status?: string[]; - limit?: number; -} - -export interface LinearLabel { - id: string; - name: string; - color: string; - scope: "workspace" | "team"; - team?: { - id: string; - name: string; - }; - group?: { - id: string; - name: string; - }; -} - -export interface CreateCommentArgs { - issueId: string; - body: string; -} - -export interface LinearComment { - id: string; - body: string; - user: { - id: string; - name: string; - }; - createdAt: string; - updatedAt: string; -} - -export interface LinearProjectMilestone { - id: string; - name: string; - description?: string; - targetDate?: string; - sortOrder?: number; - createdAt: string; - updatedAt: string; - project?: { - id: string; - name: string; - }; - issues?: LinearIssue[]; -} - -export interface LinearProjectMilestoneWithIssues - extends LinearProjectMilestone { - issues: LinearIssue[]; -} - -export interface ListProjectMilestonesArgs { - projectId: string; // Project name or UUID (will be resolved) - limit?: number; -} - -export interface GetProjectMilestoneArgs { - milestoneId: string; // Milestone name or UUID (will be resolved) - projectId?: string; // Optional project context for name resolution - issuesFirst?: number; // How many issues to fetch -} - -export interface CreateProjectMilestoneArgs { - name: string; - projectId: string; // Project name or UUID (will be resolved) - description?: string; - targetDate?: string; // ISO date string -} - -export interface UpdateProjectMilestoneArgs { - id: string; // Milestone ID or name (will be resolved) - projectId?: string; // Optional project context for name resolution - name?: string; - description?: string; - targetDate?: string; // ISO date string - sortOrder?: number; -} - -export interface LinearCycle { - id: string; - name: string; - number: number; - startsAt?: string; - endsAt?: string; - isActive: boolean; - isPrevious?: boolean; - isNext?: boolean; - progress: number; - issueCountHistory: number[]; - team?: { - id: string; - key: string; - name: string; - }; - issues?: LinearIssue[]; -} - -export interface CycleListOptions { - team?: string; - active?: boolean; - aroundActive?: string; -} - -export interface CycleReadOptions { - team?: string; - issuesFirst?: string; -} - -export interface MilestoneListOptions { - project: string; - limit?: string; -} - -export interface MilestoneReadOptions { - project?: string; - issuesFirst?: string; -} - -export interface MilestoneCreateOptions { - project: string; - description?: string; - targetDate?: string; -} - -export interface MilestoneUpdateOptions { - project?: string; - name?: string; - description?: string; - targetDate?: string; - sortOrder?: string; -} - -// Document types -export interface LinearDocument { - id: string; - title: string; - content?: string; - slugId: string; - url: string; - icon?: string; - color?: string; - createdAt: string; - updatedAt: string; - creator?: { - id: string; - name: string; - }; - project?: { - id: string; - name: string; - }; - trashed?: boolean; -} - -export interface DocumentCreateInput { - title: string; - content?: string; - projectId?: string; - teamId?: string; - icon?: string; - color?: string; -} - -export interface DocumentUpdateInput { - title?: string; - content?: string; - projectId?: string; - icon?: string; - color?: string; -} - -// Attachment types (internal use for documents linking) -export interface LinearAttachment { - id: string; - title: string; - subtitle?: string; - url: string; - createdAt: string; - updatedAt: string; - issue: { - id: string; - identifier: string; - title: string; - }; - creator?: { - id: string; - name: string; - }; -} - -export interface AttachmentCreateInput { - issueId: string; - url: string; - title: string; - subtitle?: string; - commentBody?: string; - iconUrl?: string; -} From b35c53238ddbba928a0c5fcd798d39b352e9751a Mon Sep 17 00:00:00 2001 From: Fabian Jocks <24557998+iamfj@users.noreply.github.com> Date: Tue, 3 Feb 2026 10:34:04 +0100 Subject: [PATCH 22/31] fixup! refactor(attachments): migrate to raw codegen types --- src/utils/graphql-attachments-service.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/utils/graphql-attachments-service.ts b/src/utils/graphql-attachments-service.ts index 8eb6b53..aaeb5a2 100644 --- a/src/utils/graphql-attachments-service.ts +++ b/src/utils/graphql-attachments-service.ts @@ -13,7 +13,6 @@ import { // Type aliases for cleaner method signatures type AttachmentFromCreate = AttachmentCreateMutation["attachmentCreate"]["attachment"]; -type AttachmentFromList = ListAttachmentsQuery["issue"]["attachments"]["nodes"][0]; /** * GraphQL-optimized attachments service for single API call operations From 8fe3eb0339582130625fbb5ae47a05b40496d574 Mon Sep 17 00:00:00 2001 From: Fabian Jocks <24557998+iamfj@users.noreply.github.com> Date: Tue, 3 Feb 2026 10:34:43 +0100 Subject: [PATCH 23/31] fixup! refactor(documents): migrate to raw codegen types --- src/utils/graphql-documents-service.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/utils/graphql-documents-service.ts b/src/utils/graphql-documents-service.ts index a90293a..9241f97 100644 --- a/src/utils/graphql-documents-service.ts +++ b/src/utils/graphql-documents-service.ts @@ -20,7 +20,6 @@ import { type DocumentFromCreate = DocumentCreateMutation["documentCreate"]["document"]; type DocumentFromUpdate = DocumentUpdateMutation["documentUpdate"]["document"]; type DocumentFromQuery = GetDocumentQuery["document"]; -type DocumentFromList = ListDocumentsQuery["documents"]["nodes"][0]; /** * GraphQL-optimized documents service for single API call operations From 78151703e5a0c506a18bf4251e58bc3952cd20d2 Mon Sep 17 00:00:00 2001 From: Fabian Jocks <24557998+iamfj@users.noreply.github.com> Date: Tue, 3 Feb 2026 10:39:43 +0100 Subject: [PATCH 24/31] fix: remove unnecessary type assertion for orderBy --- src/utils/graphql-issues-service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/graphql-issues-service.ts b/src/utils/graphql-issues-service.ts index ebe783c..728b2d8 100644 --- a/src/utils/graphql-issues-service.ts +++ b/src/utils/graphql-issues-service.ts @@ -35,7 +35,7 @@ export class GraphQLIssuesService { print(GetIssuesDocument), { first: limit, - orderBy: "updatedAt" as any, + orderBy: "updatedAt", } ); From a6b81ce76d96a55502daacdcc4f460b531966778 Mon Sep 17 00:00:00 2001 From: Fabian Jocks <24557998+iamfj@users.noreply.github.com> Date: Tue, 3 Feb 2026 10:41:48 +0100 Subject: [PATCH 25/31] refactor(cycles): enforce return types for GraphQL queries Updated the GraphQL requests in the GraphQLIssuesService to enforce return types using codegen types. Added comments to clarify the importance of matching the return type with the appropriate GraphQL document. --- src/utils/graphql-issues-service.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/utils/graphql-issues-service.ts b/src/utils/graphql-issues-service.ts index 728b2d8..f035e06 100644 --- a/src/utils/graphql-issues-service.ts +++ b/src/utils/graphql-issues-service.ts @@ -577,8 +577,11 @@ export class GraphQLIssuesService { ) { // Try scoped lookup within finalTeamId first if (finalTeamId) { - const scopedRes = await this.graphQLService.rawRequest( - `query FindCycleScoped($name: String!, $teamId: ID!) { cycles(filter: { and: [ { name: { eq: $name } }, { team: { id: { eq: $teamId } } } ] }, first: 1) { nodes { id name } } }`, + // * NOTE: We must enforce the return type here and ensure it matches the query document, + // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document + // * (FindCycleScopedDocument) with the appropriate return type parameter. + const scopedRes = await this.graphQLService.rawRequest( + print(FindCycleScopedDocument), { name: input.cycleId, teamId: finalTeamId } ); if (scopedRes.cycles?.nodes?.length) { @@ -588,8 +591,11 @@ export class GraphQLIssuesService { // Fallback to global lookup by name if (!finalCycleId) { - const globalRes = await this.graphQLService.rawRequest( - `query FindCycleGlobal($name: String!) { cycles(filter: { name: { eq: $name } }, first: 1) { nodes { id name } } }`, + // * NOTE: We must enforce the return type here and ensure it matches the query document, + // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document + // * (FindCycleGlobalDocument) with the appropriate return type parameter. + const globalRes = await this.graphQLService.rawRequest( + print(FindCycleGlobalDocument), { name: input.cycleId } ); if (globalRes.cycles?.nodes?.length) { From 12a2d60f092afda77c6a281d8f5340b17af016e4 Mon Sep 17 00:00:00 2001 From: Fabian Jocks <24557998+iamfj@users.noreply.github.com> Date: Tue, 3 Feb 2026 10:42:24 +0100 Subject: [PATCH 26/31] style(service): improve code readability by formatting imports Reformatted import statements for better readability and consistency. Aligned async calls for GraphQL requests to enhance code clarity. This change does not affect functionality but improves maintainability. --- src/utils/graphql-issues-service.ts | 141 ++++++++++++++++++---------- 1 file changed, 90 insertions(+), 51 deletions(-) diff --git a/src/utils/graphql-issues-service.ts b/src/utils/graphql-issues-service.ts index f035e06..e712c57 100644 --- a/src/utils/graphql-issues-service.ts +++ b/src/utils/graphql-issues-service.ts @@ -7,7 +7,33 @@ import { parseIssueIdentifier, tryParseIssueIdentifier, } from "./identifier-parser.js"; -import { BatchResolveForCreateDocument, BatchResolveForCreateQuery, BatchResolveForUpdateDocument, BatchResolveForUpdateQuery, CreateIssueDocument, CreateIssueMutation, FindCycleGlobalDocument, FindCycleGlobalQuery, FindCycleScopedDocument, FindCycleScopedQuery, GetIssueByIdDocument, GetIssueByIdentifierDocument, GetIssueByIdentifierQuery, GetIssueByIdQuery, GetIssuesDocument, GetIssuesQuery, GetIssueTeamDocument, GetIssueTeamQuery, IssueCreateInput, IssueUpdateInput, QuerySearchIssuesArgs, SearchIssuesDocument, SearchIssuesQuery, SearchIssuesQueryVariables, UpdateIssueDocument, UpdateIssueMutation, UpdateIssueMutationVariables } from "../gql/graphql.js"; +import { + BatchResolveForCreateDocument, + BatchResolveForCreateQuery, + BatchResolveForUpdateDocument, + BatchResolveForUpdateQuery, + CreateIssueDocument, + CreateIssueMutation, + FindCycleGlobalDocument, + FindCycleGlobalQuery, + FindCycleScopedDocument, + FindCycleScopedQuery, + GetIssueByIdDocument, + GetIssueByIdentifierDocument, + GetIssueByIdentifierQuery, + GetIssueByIdQuery, + GetIssuesDocument, + GetIssuesQuery, + GetIssueTeamDocument, + GetIssueTeamQuery, + IssueCreateInput, + IssueUpdateInput, + QuerySearchIssuesArgs, + SearchIssuesDocument, + SearchIssuesQuery, + UpdateIssueDocument, + UpdateIssueMutation, +} from "../gql/graphql.js"; // Type aliases for cleaner method signatures type IssueFromId = NonNullable; @@ -75,10 +101,11 @@ export class GraphQLIssuesService { } else { const { teamKey, issueNumber } = parseIssueIdentifier(id); - const result = await this.graphQLService.rawRequest( - print(GetIssueByIdentifierDocument), - { teamKey, number: issueNumber } - ); + const result = + await this.graphQLService.rawRequest( + print(GetIssueByIdentifierDocument), + { teamKey, number: issueNumber } + ); if (!result.issues.nodes.length) { throw new Error(`Issue with identifier "${id}" not found`); @@ -157,10 +184,11 @@ export class GraphQLIssuesService { // * NOTE: We must enforce the return type here and ensure it matches the mutation document, // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document // * (BatchResolveForUpdateDocument) with the appropriate return type parameter. - const resolveResult = await this.graphQLService.rawRequest( - print(BatchResolveForUpdateDocument), - resolveVariables - ); + const resolveResult = + await this.graphQLService.rawRequest( + print(BatchResolveForUpdateDocument), + resolveVariables + ); // Process resolution results if (!isUuid(resolvedIssueId)) { @@ -282,10 +310,11 @@ export class GraphQLIssuesService { // * NOTE: We must enforce the return type here and ensure it matches the query document, // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document // * (GetIssueTeamDocument) with the appropriate return type parameter. - const issueTeamRes = await this.graphQLService.rawRequest( - print(GetIssueTeamDocument), - { issueId: resolvedIssueId } - ); + const issueTeamRes = + await this.graphQLService.rawRequest( + print(GetIssueTeamDocument), + { issueId: resolvedIssueId } + ); teamIdForCycle = issueTeamRes.issue?.team?.id; } @@ -294,10 +323,11 @@ export class GraphQLIssuesService { // * NOTE: We must enforce the return type here and ensure it matches the query document, // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document // * (FindCycleScopedDocument) with the appropriate return type parameter. - const scopedRes = await this.graphQLService.rawRequest( - print(FindCycleScopedDocument), - { name: input.cycleId, teamId: teamIdForCycle } - ); + const scopedRes = + await this.graphQLService.rawRequest( + print(FindCycleScopedDocument), + { name: input.cycleId, teamId: teamIdForCycle } + ); const scopedNodes = scopedRes.cycles?.nodes || []; if (scopedNodes.length === 1) { finalCycleId = scopedNodes[0].id; @@ -321,10 +351,11 @@ export class GraphQLIssuesService { // * NOTE: We must enforce the return type here and ensure it matches the query document, // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document // * (FindCycleGlobalDocument) with the appropriate return type parameter. - const globalRes = await this.graphQLService.rawRequest( - print(FindCycleGlobalDocument), - { name: input.cycleId } - ); + const globalRes = + await this.graphQLService.rawRequest( + print(FindCycleGlobalDocument), + { name: input.cycleId } + ); const globalNodes = globalRes.cycles?.nodes || []; if (globalNodes.length === 1) { finalCycleId = globalNodes[0].id; @@ -359,10 +390,11 @@ export class GraphQLIssuesService { // * NOTE: We must enforce the return type here and ensure it matches the mutation document, // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document // * (GetIssueTeamDocument) with the appropriate return type parameter. - const issueResult = await this.graphQLService.rawRequest( - print(GetIssueTeamDocument), - { issueId: resolvedIssueId } - ); + const issueResult = + await this.graphQLService.rawRequest( + print(GetIssueTeamDocument), + { issueId: resolvedIssueId } + ); teamId = issueResult.issue?.team?.id; } resolvedStatusId = await this.linearService.resolveStatusId( @@ -397,13 +429,14 @@ export class GraphQLIssuesService { // * NOTE: We must enforce the return type here and ensure it matches the mutation document, // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document // * (UpdateIssueDocument) with the appropriate return type parameter. - const updateResult = await this.graphQLService.rawRequest( - print(UpdateIssueDocument), - { - id: resolvedIssueId, - input: updateInput, - } - ); + const updateResult = + await this.graphQLService.rawRequest( + print(UpdateIssueDocument), + { + id: resolvedIssueId, + input: updateInput, + } + ); if (!updateResult.issueUpdate.success) { throw new Error("Failed to update issue"); @@ -480,10 +513,11 @@ export class GraphQLIssuesService { }; if (Object.keys(resolveVariables).length > 0) { - resolveResult = await this.graphQLService.rawRequest( - print(BatchResolveForCreateDocument), - resolveVariables - ); + resolveResult = + await this.graphQLService.rawRequest( + print(BatchResolveForCreateDocument), + resolveVariables + ); } // Resolve team ID @@ -564,7 +598,9 @@ export class GraphQLIssuesService { const hint = finalProjectId ? ` in project` : ` (consider specifying --project)`; - throw new Error(`Milestone "${input.projectMilestoneId}" not found${hint}`); + throw new Error( + `Milestone "${input.projectMilestoneId}" not found${hint}` + ); } } @@ -580,10 +616,11 @@ export class GraphQLIssuesService { // * NOTE: We must enforce the return type here and ensure it matches the query document, // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document // * (FindCycleScopedDocument) with the appropriate return type parameter. - const scopedRes = await this.graphQLService.rawRequest( - print(FindCycleScopedDocument), - { name: input.cycleId, teamId: finalTeamId } - ); + const scopedRes = + await this.graphQLService.rawRequest( + print(FindCycleScopedDocument), + { name: input.cycleId, teamId: finalTeamId } + ); if (scopedRes.cycles?.nodes?.length) { finalCycleId = scopedRes.cycles.nodes[0].id; } @@ -594,10 +631,11 @@ export class GraphQLIssuesService { // * NOTE: We must enforce the return type here and ensure it matches the query document, // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document // * (FindCycleGlobalDocument) with the appropriate return type parameter. - const globalRes = await this.graphQLService.rawRequest( - print(FindCycleGlobalDocument), - { name: input.cycleId } - ); + const globalRes = + await this.graphQLService.rawRequest( + print(FindCycleGlobalDocument), + { name: input.cycleId } + ); if (globalRes.cycles?.nodes?.length) { finalCycleId = globalRes.cycles.nodes[0].id; } @@ -639,12 +677,13 @@ export class GraphQLIssuesService { // * NOTE: We must enforce the return type here and ensure it matches the mutation document, // * as a string is expected in return type. Be extremely careful to use the correct GraphQL document // * (CreateIssueDocument) with the appropriate return type parameter. - const createResult = await this.graphQLService.rawRequest( - print(CreateIssueDocument), - { - input: createInput, - } - ); + const createResult = + await this.graphQLService.rawRequest( + print(CreateIssueDocument), + { + input: createInput, + } + ); if (!createResult.issueCreate.success) { throw new Error("Failed to create issue"); From 80789cd6c06a47d8ed18bf1580bee41891521447 Mon Sep 17 00:00:00 2001 From: Fabian Jocks <24557998+iamfj@users.noreply.github.com> Date: Tue, 3 Feb 2026 10:44:14 +0100 Subject: [PATCH 27/31] fixup! chore(deps): add graphql codegen cli package and scripts --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 4801b45..32898ac 100644 --- a/package.json +++ b/package.json @@ -22,8 +22,9 @@ "test:coverage": "vitest run --coverage", "test:commands": "tsx tests/command-coverage.ts", "generate": "graphql-codegen --config codegen.config.ts", - "prestart": "generate", - "predev": "generate", + "prestart": "npm run generate", + "predev": "npm run generate", + "postinstall": "npm run generate", "prepublishOnly": "npm run build && npm run test && test -x dist/main.js" }, "engines": { From 85997f9911a06ccad12adb5dd0d9490bb8249ae3 Mon Sep 17 00:00:00 2001 From: Fabian Jocks <24557998+iamfj@users.noreply.github.com> Date: Tue, 3 Feb 2026 10:45:41 +0100 Subject: [PATCH 28/31] fixup! feat: migrate queries and mutations to `.graphql` files --- graphql/queries/cycles.graphql | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/graphql/queries/cycles.graphql b/graphql/queries/cycles.graphql index e46568c..3f3b9e0 100644 --- a/graphql/queries/cycles.graphql +++ b/graphql/queries/cycles.graphql @@ -1,3 +1,14 @@ +# ------------------------------------------------------------ +# GraphQL queries and mutations for Linear cycles +# +# Cycles are sprint/event containers within teams. They can be +# queried by name (global or team-scoped), and are associated +# with issues and teams. +# ------------------------------------------------------------ + +# Find a cycle by name and team ID +# +# Fetches a cycle by its name and team ID. query FindCycleScoped($name: String!, $teamId: ID!) { cycles( filter: { @@ -21,6 +32,9 @@ query FindCycleScoped($name: String!, $teamId: ID!) { } } +# Find a cycle by name +# +# Fetches a cycle by its name. query FindCycleGlobal($name: String!) { cycles(filter: { name: { eq: $name } }, first: 10) { nodes { From 3db3c3efcbbe78ae73d9b3a4f4a80fc3d7e21756 Mon Sep 17 00:00:00 2001 From: Fabian Jocks <24557998+iamfj@users.noreply.github.com> Date: Tue, 3 Feb 2026 10:50:49 +0100 Subject: [PATCH 29/31] fixup! feat: migrate queries and mutations to `.graphql` files --- graphql/mutations/attachments.graphql | 32 ++++ graphql/mutations/documents.graphql | 40 +++++ graphql/mutations/issues.graphql | 34 +++++ graphql/mutations/project-milestones.graphql | 74 ++++++++++ graphql/queries/attachments.graphql | 24 +-- graphql/queries/common.graphql | 147 ------------------- graphql/queries/documents.graphql | 37 +---- graphql/queries/issues.graphql | 140 ++++++++++++++++++ graphql/queries/project-milestones.graphql | 77 +--------- 9 files changed, 326 insertions(+), 279 deletions(-) create mode 100644 graphql/mutations/attachments.graphql create mode 100644 graphql/mutations/documents.graphql create mode 100644 graphql/mutations/issues.graphql create mode 100644 graphql/mutations/project-milestones.graphql delete mode 100644 graphql/queries/common.graphql diff --git a/graphql/mutations/attachments.graphql b/graphql/mutations/attachments.graphql new file mode 100644 index 0000000..ad4a9f5 --- /dev/null +++ b/graphql/mutations/attachments.graphql @@ -0,0 +1,32 @@ +# ------------------------------------------------------------ +# GraphQL mutations for Linear attachments +# +# Attachments allow linking any URL to an issue. This is the mechanism +# to associate documents (or any external resource) with issues, since +# documents cannot be directly linked to issues in Linear's data model. +# +# Key behavior: Attachments are idempotent - creating an attachment with +# the same url + issueId will update the existing attachment. +# ------------------------------------------------------------ + +# Create an attachment on an issue +# +# If an attachment with the same url and issueId already exists, +# the existing record is updated instead of creating a duplicate. +mutation AttachmentCreate($input: AttachmentCreateInput!) { + attachmentCreate(input: $input) { + success + attachment { + ...AttachmentFields + } + } +} + +# Delete an attachment +# +# Deletes an attachment and returns success status. +mutation AttachmentDelete($id: String!) { + attachmentDelete(id: $id) { + success + } +} diff --git a/graphql/mutations/documents.graphql b/graphql/mutations/documents.graphql new file mode 100644 index 0000000..94a16d7 --- /dev/null +++ b/graphql/mutations/documents.graphql @@ -0,0 +1,40 @@ +# ------------------------------------------------------------ +# GraphQL mutations for Linear documents +# +# Documents are standalone entities that can be associated with projects, +# initiatives, or teams. To link a document to an issue, use the +# attachments API (see attachments.graphql). +# ------------------------------------------------------------ + +# Create a new document mutation +# +# Creates a new document and returns the created document data. +mutation DocumentCreate($input: DocumentCreateInput!) { + documentCreate(input: $input) { + success + document { + ...DocumentFields + } + } +} + +# Update an existing document mutation +# +# Updates an existing document and returns the updated document data. +mutation DocumentUpdate($id: String!, $input: DocumentUpdateInput!) { + documentUpdate(id: $id, input: $input) { + success, + document { + ...DocumentFields + } + } +} + +# Delete a document mutation +# +# Deletes a document and returns success status. +mutation DocumentDelete($id: String!) { + documentDelete(id: $id) { + success + } +} diff --git a/graphql/mutations/issues.graphql b/graphql/mutations/issues.graphql new file mode 100644 index 0000000..ce1dc8d --- /dev/null +++ b/graphql/mutations/issues.graphql @@ -0,0 +1,34 @@ +# ------------------------------------------------------------ +# Optimized GraphQL mutations for issue operations +# +# This module contains highly optimized GraphQL mutations that create +# and update issues with complete response data including all relationships. +# ------------------------------------------------------------ + +# Create issue mutation with complete response +# +# Creates a new issue and returns complete issue data including +# all relationships. Uses the comprehensive fragment to ensure +# consistent data structure with read operations. +mutation CreateIssue($input: IssueCreateInput!) { + issueCreate(input: $input) { + success + issue { + ...CompleteIssueWithCommentsFields + } + } +} + +# Update issue mutation with complete response +# +# Updates an existing issue and returns complete issue data with +# all relationships. Ensures consistency between update and read +# operations by using the same fragment structure. +mutation UpdateIssue($id: String!, $input: IssueUpdateInput!) { + issueUpdate(id: $id, input: $input) { + success + issue { + ...CompleteIssueWithCommentsFields + } + } +} diff --git a/graphql/mutations/project-milestones.graphql b/graphql/mutations/project-milestones.graphql new file mode 100644 index 0000000..7889675 --- /dev/null +++ b/graphql/mutations/project-milestones.graphql @@ -0,0 +1,74 @@ +# ------------------------------------------------------------ +# GraphQL mutations for Linear project milestones +# +# Creates and updates project milestones with complete response data including all relationships. +# ------------------------------------------------------------ + +# Create a new project milestone +# +# Creates a new project milestone and returns the created project milestone data. +mutation CreateProjectMilestone( + $projectId: String! + $name: String! + $description: String + $targetDate: TimelessDate +) { + projectMilestoneCreate( + input: { + projectId: $projectId + name: $name + description: $description + targetDate: $targetDate + } + ) { + success + projectMilestone { + id + name + description + targetDate + sortOrder + createdAt + updatedAt + project { + id + name + } + } + } +} + +# Update an existing project milestone +# +# Updates an existing project milestone and returns the updated project milestone data. +mutation UpdateProjectMilestone( + $id: String! + $name: String + $description: String + $targetDate: TimelessDate + $sortOrder: Float +) { + projectMilestoneUpdate( + id: $id + input: { + name: $name + description: $description + targetDate: $targetDate + sortOrder: $sortOrder + } + ) { + success + projectMilestone { + id + name + description + targetDate + sortOrder + updatedAt + project { + id + name + } + } + } +} diff --git a/graphql/queries/attachments.graphql b/graphql/queries/attachments.graphql index ea3be27..511a6ae 100644 --- a/graphql/queries/attachments.graphql +++ b/graphql/queries/attachments.graphql @@ -1,5 +1,5 @@ # ------------------------------------------------------------ -# GraphQL queries and mutations for Linear attachments +# GraphQL queries for Linear attachments # # Attachments allow linking any URL to an issue. This is the mechanism # to associate documents (or any external resource) with issues, since @@ -21,28 +21,6 @@ fragment AttachmentFields on Attachment { updatedAt } -# Create an attachment on an issue -# -# If an attachment with the same url and issueId already exists, -# the existing record is updated instead of creating a duplicate. -mutation AttachmentCreate($input: AttachmentCreateInput!) { - attachmentCreate(input: $input) { - success - attachment { - ...AttachmentFields - } - } -} - -# Delete an attachment -# -# Deletes an attachment and returns success status. -mutation AttachmentDelete($id: String!) { - attachmentDelete(id: $id) { - success - } -} - # List attachments on an issue # # Fetches a list of attachments for a given issue. diff --git a/graphql/queries/common.graphql b/graphql/queries/common.graphql deleted file mode 100644 index 7042622..0000000 --- a/graphql/queries/common.graphql +++ /dev/null @@ -1,147 +0,0 @@ -# ------------------------------------------------------------ -# Common GraphQL fragments for reuse across queries -# -# These fragments define reusable field selections for Linear entities, -# ensuring consistent data structure and reducing duplication in query definitions. -# Each fragment focuses on specific entity relationships for optimal querying. -# ------------------------------------------------------------ - -# Complete issue fragment with all relationships -# -# Combines all issue fragments into a comprehensive field selection. -# This is used when full issue details are needed including all -# relationships (state, assignee, team, project, labels, comments). -fragment CompleteIssueFields on Issue { - id - identifier - title - description - branchName - priority - estimate - createdAt - updatedAt - state { - id - name - } - assignee { - id - name - } - team { - id - key - name - } - project { - id - name - } - labels { - nodes { - id - name - } - } - cycle { - id - name - number - } - projectMilestone { - id - name - targetDate - } - parent { - id - identifier - title - } - children { - nodes { - id - identifier - title - } - } -} - -# Complete issue fragment with all relationships and comments -# -# Combines all issue fragments into a comprehensive field selection. -# This is used when full issue details are needed including all -# relationships (state, assignee, team, project, labels, comments). -fragment CompleteIssueWithCommentsFields on Issue { - ...CompleteIssueFields - comments { - nodes { - id - body - } - } -} - - -# Complete issue search fragment with all relationships -# -# Combines all issue fragments into a comprehensive field selection. -# This is used when full issue details are needed including all -# relationships (state, assignee, team, project, labels, comments). -fragment CompleteIssueSearchFields on IssueSearchResult { - id - identifier - title - description - branchName - priority - estimate - createdAt - updatedAt - state { - id - name - } - assignee { - id - name - } - team { - id - key - name - } - project { - id - name - } - labels { - nodes { - id - name - } - } - cycle { - id - name - number - } - projectMilestone { - id - name - targetDate - } - parent { - id - identifier - title - } - children { - nodes { - id - identifier - title - } - } -} diff --git a/graphql/queries/documents.graphql b/graphql/queries/documents.graphql index d8174ff..b4644fa 100644 --- a/graphql/queries/documents.graphql +++ b/graphql/queries/documents.graphql @@ -1,9 +1,9 @@ # ------------------------------------------------------------ -# GraphQL queries and mutations for Linear documents +# GraphQL queries for Linear documents # # Documents are standalone entities that can be associated with projects, # initiatives, or teams. To link a document to an issue, use the -# attachments API (see attachments.ts). +# attachments API (see attachments.graphql). # ------------------------------------------------------------ # Document fields fragment @@ -40,36 +40,3 @@ query ListDocuments($first: Int!, $filter: DocumentFilter) { } } } - -# Create a new document mutation -# -# Creates a new document and returns the created document data. -mutation DocumentCreate($input: DocumentCreateInput!) { - documentCreate(input: $input) { - success - document { - ...DocumentFields - } - } -} - -# Update an existing document mutation -# -# Updates an existing document and returns the updated document data. -mutation DocumentUpdate($id: String!, $input: DocumentUpdateInput!) { - documentUpdate(id: $id, input: $input) { - success, - document { - ...DocumentFields - } - } -} - -# Delete a document mutation -# -# Deletes a document and returns success status. -mutation DocumentDelete($id: String!) { - documentDelete(id: $id) { - success - } -} diff --git a/graphql/queries/issues.graphql b/graphql/queries/issues.graphql index e6a0f58..b5f2b0a 100644 --- a/graphql/queries/issues.graphql +++ b/graphql/queries/issues.graphql @@ -7,6 +7,146 @@ # fragments to ensure consistent data structures. # ------------------------------------------------------------ +# Complete issue fragment with all relationships +# +# Combines all issue fragments into a comprehensive field selection. +# This is used when full issue details are needed including all +# relationships (state, assignee, team, project, labels, comments). +fragment CompleteIssueFields on Issue { + id + identifier + title + description + branchName + priority + estimate + createdAt + updatedAt + state { + id + name + } + assignee { + id + name + } + team { + id + key + name + } + project { + id + name + } + labels { + nodes { + id + name + } + } + cycle { + id + name + number + } + projectMilestone { + id + name + targetDate + } + parent { + id + identifier + title + } + children { + nodes { + id + identifier + title + } + } +} + +# Complete issue fragment with all relationships and comments +# +# Combines all issue fragments into a comprehensive field selection. +# This is used when full issue details are needed including all +# relationships (state, assignee, team, project, labels, comments). +fragment CompleteIssueWithCommentsFields on Issue { + ...CompleteIssueFields + comments { + nodes { + id + body + } + } +} + + +# Complete issue search fragment with all relationships +# +# Combines all issue fragments into a comprehensive field selection. +# This is used when full issue details are needed including all +# relationships (state, assignee, team, project, labels, comments). +fragment CompleteIssueSearchFields on IssueSearchResult { + id + identifier + title + description + branchName + priority + estimate + createdAt + updatedAt + state { + id + name + } + assignee { + id + name + } + team { + id + key + name + } + project { + id + name + } + labels { + nodes { + id + name + } + } + cycle { + id + name + number + } + projectMilestone { + id + name + targetDate + } + parent { + id + identifier + title + } + children { + nodes { + id + identifier + title + } + } +} + # Get issues list with all relationships in single query # # Fetches paginated issues excluding completed ones, diff --git a/graphql/queries/project-milestones.graphql b/graphql/queries/project-milestones.graphql index cc0ed25..8d340a7 100644 --- a/graphql/queries/project-milestones.graphql +++ b/graphql/queries/project-milestones.graphql @@ -1,13 +1,11 @@ # ------------------------------------------------------------ -# ------------------------------------------------------------ -# Common GraphQL fragments for reuse across queries +# GraphQL queries for Linear project milestones # # These fragments define reusable field selections for Linear entities, -# ensuring consistent data structure and reducing duplication. Place -# all shared fragments for project-milestone-related queries here. +# ensuring consistent data structure and reducing duplication. # ------------------------------------------------------------ -# List project milestones in a project with minimal fields (optimized) +# List project milestones in a project # # Fetches a list of project milestones for a given project. query ListProjectMilestones($projectId: String!, $first: Int!) { @@ -89,72 +87,3 @@ query FindProjectMilestoneGlobal($name: String!) { } } } - -# Create a new project milestone -# -# Creates a new project milestone and returns the created project milestone data. -mutation CreateProjectMilestone( - $projectId: String! - $name: String! - $description: String - $targetDate: TimelessDate -) { - projectMilestoneCreate( - input: { - projectId: $projectId - name: $name - description: $description - targetDate: $targetDate - } - ) { - success - projectMilestone { - id - name - description - targetDate - sortOrder - createdAt - updatedAt - project { - id - name - } - } - } -} - -# Update an existing project milestone -# -# Updates an existing project milestone and returns the updated project milestone data. -mutation UpdateProjectMilestone( - $id: String! - $name: String - $description: String - $targetDate: TimelessDate - $sortOrder: Float -) { - projectMilestoneUpdate( - id: $id - input: { - name: $name - description: $description - targetDate: $targetDate - sortOrder: $sortOrder - } - ) { - success - projectMilestone { - id - name - description - targetDate - sortOrder - updatedAt - project { - id - name - } - } - } -} From b03fcfe3239135500d9fecb37785ee3145f60418 Mon Sep 17 00:00:00 2001 From: Fabian Jocks <24557998+iamfj@users.noreply.github.com> Date: Tue, 3 Feb 2026 10:52:42 +0100 Subject: [PATCH 30/31] fixup! feat: migrate queries and mutations to `.graphql` files --- graphql/mutations/files.graphql | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 graphql/mutations/files.graphql diff --git a/graphql/mutations/files.graphql b/graphql/mutations/files.graphql new file mode 100644 index 0000000..f3ea2a1 --- /dev/null +++ b/graphql/mutations/files.graphql @@ -0,0 +1,22 @@ +# ------------------------------------------------------------ +# GraphQL mutations for Linear files +# +# Uploads a file to Linear's cloud storage. +# ------------------------------------------------------------ + +# Upload a file to Linear's cloud storage. +# +# Returns the upload URL and asset URL for the uploaded file. +mutation FileUpload($contentType: String!, $filename: String!, $size: Int!) { + fileUpload(contentType: $contentType, filename: $filename, size: $size) { + success + uploadFile { + uploadUrl + assetUrl + headers { + key + value + } + } + } +} From d46f8c8a64c71ac377d142b7284946dbce38ab96 Mon Sep 17 00:00:00 2001 From: Fabian Jocks <24557998+iamfj@users.noreply.github.com> Date: Tue, 3 Feb 2026 10:54:05 +0100 Subject: [PATCH 31/31] refactor(file-service): migrate GraphQL mutation to use codegen document Updated the FileService class to utilize the generated FileUploadDocument for the GraphQL file upload mutation, enhancing type safety and maintainability. Removed the hardcoded mutation string in favor of the imported document. --- src/utils/file-service.ts | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/src/utils/file-service.ts b/src/utils/file-service.ts index e5aa886..61f72e1 100644 --- a/src/utils/file-service.ts +++ b/src/utils/file-service.ts @@ -10,9 +10,11 @@ * - Comprehensive error handling and status reporting */ +import { print } from "graphql"; import { access, mkdir, readFile, stat, writeFile } from "fs/promises"; import { basename, dirname, extname } from "path"; import { extractFilenameFromUrl, isLinearUploadUrl } from "./embed-parser.js"; +import { FileUploadDocument } from "../gql/graphql.js"; /** * Maximum file size for uploads (20MB) @@ -289,23 +291,6 @@ export class FileService { const contentType = getMimeType(filePath); - // Step 1: Request upload URL via GraphQL fileUpload mutation - const query = ` - mutation FileUpload($contentType: String!, $filename: String!, $size: Int!) { - fileUpload(contentType: $contentType, filename: $filename, size: $size) { - success - uploadFile { - uploadUrl - assetUrl - headers { - key - value - } - } - } - } - `; - try { // Make GraphQL request const graphqlResponse = await fetch("https://api.linear.app/graphql", { @@ -315,7 +300,7 @@ export class FileService { Authorization: this.apiToken, }, body: JSON.stringify({ - query, + query: print(FileUploadDocument), variables: { contentType, filename,