{"_id":"@apiclient.xyz/gitlab","_rev":"9-26d51caccf62138b1c36690802d14ead","name":"@apiclient.xyz/gitlab","dist-tags":{"latest":"2.6.0"},"versions":{"2.0.1":{"name":"@apiclient.xyz/gitlab","version":"2.0.1","keywords":["gitlab","api client","TypeScript","CI/CD","pipelines","variables","devops"],"author":{"name":"Lossless GmbH"},"license":"MIT","_id":"@apiclient.xyz/gitlab@2.0.1","maintainers":[{"name":"lossless","email":"hello@lossless.com"}],"dist":{"shasum":"d3f3751dfebb4e2532055b798d9c6901ceaeed34","tarball":"https://registry.npmjs.org/@apiclient.xyz/gitlab/-/gitlab-2.0.1.tgz","fileCount":22,"integrity":"sha512-Z3SU7ujLRWBddlk2V+PSl1KbQvg4dcvOfA1TD16JbBrA24A7IOglbCJBDYYQdJQXD76J1PbF7nLqgMe1a/q8Cw==","signatures":[{"sig":"MEUCIEXxsQ2mbY4tQW969E0+aiCDiRo3y0GCGYdgLIjuo5cRAiEAz4VCS9thpVGd5l1mtj53pQdyavOkyjGGtiz3ZEjY+yw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39205},"main":"dist_ts/index.js","type":"module","gitHead":"65e55754942a802976cb607dd321f7b845fa6e4e","private":false,"scripts":{"test":"(tstest test/ --verbose --timeout 600)","build":"(tsbuild --web --allowimplicitany)"},"typings":"dist_ts/index.d.ts","_npmUser":{"name":"lossless","email":"hello@lossless.com"},"repository":{"url":"https://code.foss.global/apiclient.xyz/gitlab.git","type":"git"},"_npmVersion":"11.7.0","description":"A TypeScript client for the GitLab API, providing easy access to projects, groups, CI/CD variables, and pipelines.","directories":{},"_nodeVersion":"25.2.1","browserslist":["last 1 chrome versions"],"dependencies":{"@push.rocks/smartlog":"^3.1.10","@push.rocks/smartrequest":"^5.0.1"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^22.15.3","@git.zone/tsrun":"^2.0.0","@git.zone/tstest":"^2.8.2","@push.rocks/qenv":"^6.1.3","@git.zone/tsbuild":"^3.1.0","@push.rocks/tapbundle":"^5.6.0"},"_npmOperationalInternal":{"tmp":"tmp/gitlab_2.0.1_1771937701604_0.19312398963527544","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"@apiclient.xyz/gitlab","version":"2.0.2","keywords":["gitlab","api client","TypeScript","CI/CD","pipelines","variables","devops"],"author":{"name":"Lossless GmbH"},"license":"MIT","_id":"@apiclient.xyz/gitlab@2.0.2","maintainers":[{"name":"lossless","email":"hello@lossless.com"}],"dist":{"shasum":"4c61203333ad94d1ed33639caa9c73d3a936a1d4","tarball":"https://registry.npmjs.org/@apiclient.xyz/gitlab/-/gitlab-2.0.2.tgz","fileCount":22,"integrity":"sha512-RhXr8+IdvtEsgP6UnMmpbDU7ziliqxnfBJlghjIyuOCXCpf3FF90r4R4SvZa1V66oUSWOQZmMejL51MAN2KazA==","signatures":[{"sig":"MEYCIQD1kb6g/0VzNtTfkDcW03pgsyrB8VS+2K9k3Jtql2eeZQIhAOI0UYTZmgdEHfwNTSLp/uJkI90JYYvxavSu50KBOITD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39251},"main":"dist_ts/index.js","type":"module","gitHead":"e7cfd5dec15cdb34c22fa5410b0fa7fe2e898293","private":false,"scripts":{"test":"(tstest test/ --verbose --timeout 600)","build":"(tsbuild --web --allowimplicitany)"},"typings":"dist_ts/index.d.ts","_npmUser":{"name":"lossless","email":"hello@lossless.com"},"repository":{"url":"https://code.foss.global/apiclient.xyz/gitlab.git","type":"git"},"_npmVersion":"11.7.0","description":"A TypeScript client for the GitLab API, providing easy access to projects, groups, CI/CD variables, and pipelines.","directories":{},"_nodeVersion":"25.2.1","browserslist":["last 1 chrome versions"],"dependencies":{"@push.rocks/smartlog":"^3.1.10","@push.rocks/smartrequest":"^5.0.1"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^22.15.3","@git.zone/tsrun":"^2.0.0","@git.zone/tstest":"^2.8.2","@push.rocks/qenv":"^6.1.3","@git.zone/tsbuild":"^3.1.0","@push.rocks/tapbundle":"^5.6.0"},"_npmOperationalInternal":{"tmp":"tmp/gitlab_2.0.2_1771937754539_0.9273847717163097","host":"s3://npm-registry-packages-npm-production"}},"2.0.3":{"name":"@apiclient.xyz/gitlab","version":"2.0.3","keywords":["gitlab","api client","TypeScript","CI/CD","pipelines","variables","devops"],"author":{"name":"Lossless GmbH"},"license":"MIT","_id":"@apiclient.xyz/gitlab@2.0.3","maintainers":[{"name":"lossless","email":"hello@lossless.com"}],"dist":{"shasum":"affda59f3033a248bf9f31b474957dbed0e74085","tarball":"https://registry.npmjs.org/@apiclient.xyz/gitlab/-/gitlab-2.0.3.tgz","fileCount":22,"integrity":"sha512-kf9ek9pMy+PbzIdipTjnhjBv5Lv6Tx2YfkbUfLAPJKamenV3qIN2dgYOGwbpoO3VuhB8olnUNWGg6jB0o9udHw==","signatures":[{"sig":"MEUCIQDdzKocbTBAqot00ufMLAdNyBYEfG/3lyGYMQNUdXnzQAIgVkrmNHb5M1xSMH88k9JYPZXoLn5E/N8sQnFG3SwL5/s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":46643},"main":"dist_ts/index.js","type":"module","gitHead":"1cd7c6243173f8d6e3b23d825c3de4669889a091","private":false,"scripts":{"test":"(tstest test/ --verbose --timeout 600)","build":"(tsbuild --web --allowimplicitany)"},"typings":"dist_ts/index.d.ts","_npmUser":{"name":"lossless","email":"hello@lossless.com"},"repository":{"url":"https://code.foss.global/apiclient.xyz/gitlab.git","type":"git"},"_npmVersion":"11.7.0","description":"A TypeScript client for the GitLab API, providing easy access to projects, groups, CI/CD variables, and pipelines.","directories":{},"_nodeVersion":"25.2.1","browserslist":["last 1 chrome versions"],"dependencies":{"@push.rocks/smartlog":"^3.1.10","@push.rocks/smartrequest":"^5.0.1"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^22.15.3","@git.zone/tsrun":"^2.0.0","@git.zone/tstest":"^2.8.2","@push.rocks/qenv":"^6.1.3","@git.zone/tsbuild":"^3.1.0","@push.rocks/tapbundle":"^5.6.0"},"_npmOperationalInternal":{"tmp":"tmp/gitlab_2.0.3_1771937990872_0.35937957258871545","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@apiclient.xyz/gitlab","version":"2.1.0","keywords":["gitlab","api client","TypeScript","CI/CD","pipelines","variables","devops"],"author":{"name":"Lossless GmbH"},"license":"MIT","_id":"@apiclient.xyz/gitlab@2.1.0","maintainers":[{"name":"lossless","email":"hello@lossless.com"}],"dist":{"shasum":"ef312c441e024b65636327a2009a42b923e823f5","tarball":"https://registry.npmjs.org/@apiclient.xyz/gitlab/-/gitlab-2.1.0.tgz","fileCount":22,"integrity":"sha512-+qNMPr+InZ47dVjA4f1w/i3Oyq0WtDe85m9Wz1mSrkjhH4Jc9cyM2hrqFA+Gl+hxuCt/k31gzO3/JsNkWyWliA==","signatures":[{"sig":"MEYCIQDP7ygzbheNYxCeOrfBdJiRY5rhZnjM+vtU4GOi5q4FggIhALhRLCQmfGF7cyXaICc43CVBJOt8iJMSw8i939sZ+9BQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":54346},"main":"dist_ts/index.js","type":"module","gitHead":"ef688115d6687684b2abd070bf01a225b8e63695","private":false,"scripts":{"test":"(tstest test/ --verbose --timeout 600)","build":"(tsbuild --web --allowimplicitany)"},"typings":"dist_ts/index.d.ts","_npmUser":{"name":"lossless","email":"hello@lossless.com"},"repository":{"url":"https://code.foss.global/apiclient.xyz/gitlab.git","type":"git"},"_npmVersion":"11.7.0","description":"A TypeScript client for the GitLab API, providing easy access to projects, groups, CI/CD variables, and pipelines.","directories":{},"_nodeVersion":"25.2.1","browserslist":["last 1 chrome versions"],"dependencies":{"@push.rocks/smartlog":"^3.1.10","@push.rocks/smartrequest":"^5.0.1"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^22.15.3","@git.zone/tsrun":"^2.0.0","@git.zone/tstest":"^2.8.2","@push.rocks/qenv":"^6.1.3","@git.zone/tsbuild":"^3.1.0","@push.rocks/tapbundle":"^5.6.0"},"_npmOperationalInternal":{"tmp":"tmp/gitlab_2.1.0_1772274213897_0.4863632170381884","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@apiclient.xyz/gitlab","version":"2.2.0","keywords":["gitlab","api client","TypeScript","CI/CD","pipelines","variables","devops"],"author":{"name":"Lossless GmbH"},"license":"MIT","_id":"@apiclient.xyz/gitlab@2.2.0","maintainers":[{"name":"lossless","email":"hello@lossless.com"}],"dist":{"shasum":"6387d6b5fb9ac2cce7eb2563e9df4fa0d685274a","tarball":"https://registry.npmjs.org/@apiclient.xyz/gitlab/-/gitlab-2.2.0.tgz","fileCount":22,"integrity":"sha512-ITppapWvZkayOfaI4omOqO0azKirCHaRFrKE/E5nuraEPz4r4gNOqqKi+Al+vqdbMc/mpnkrd19xF05a3Qya1Q==","signatures":[{"sig":"MEYCIQCXNLDDkajocvC71VR89Ofl6RYJb1QR3s8xA2ZwbDb3KwIhAJ1G3EHVvKp5XXaxIYm1CDrNIJqtZs7IRbsbMVipLFBN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":55326},"main":"dist_ts/index.js","type":"module","gitHead":"016eaf1b915457dace82b86011861a9783bf6282","private":false,"scripts":{"test":"(tstest test/ --verbose --timeout 600)","build":"(tsbuild --web --allowimplicitany)"},"typings":"dist_ts/index.d.ts","_npmUser":{"name":"lossless","email":"hello@lossless.com"},"repository":{"url":"https://code.foss.global/apiclient.xyz/gitlab.git","type":"git"},"_npmVersion":"11.7.0","description":"A TypeScript client for the GitLab API, providing easy access to projects, groups, CI/CD variables, and pipelines.","directories":{},"_nodeVersion":"25.2.1","browserslist":["last 1 chrome versions"],"dependencies":{"@push.rocks/smartlog":"^3.1.10","@push.rocks/smartrequest":"^5.0.1"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^22.15.3","@git.zone/tsrun":"^2.0.0","@git.zone/tstest":"^2.8.2","@push.rocks/qenv":"^6.1.3","@git.zone/tsbuild":"^3.1.0","@push.rocks/tapbundle":"^5.6.0"},"_npmOperationalInternal":{"tmp":"tmp/gitlab_2.2.0_1772277246879_0.6305164166415016","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"@apiclient.xyz/gitlab","version":"2.3.0","keywords":["gitlab","api client","TypeScript","CI/CD","pipelines","variables","devops"],"author":{"name":"Lossless GmbH"},"license":"MIT","_id":"@apiclient.xyz/gitlab@2.3.0","maintainers":[{"name":"lossless","email":"hello@lossless.com"}],"dist":{"shasum":"06dcb5361849226bbc9677ed892d1f836418b485","tarball":"https://registry.npmjs.org/@apiclient.xyz/gitlab/-/gitlab-2.3.0.tgz","fileCount":22,"integrity":"sha512-pNAJ/9hacVpU826gpTSrrZJaZ9qMu5ePMjXcL8DyYac3vXnnLAMzrH1iIZ8b5VosRF+ft38d2/OtNC/xZhvKVw==","signatures":[{"sig":"MEYCIQCkkQLo3b1G3JiSBZucqCtmaG+Ps8/yz0GfOL828bndWAIhAPcDb81Abe/sNCW/lOVkNUeljy1ALjA5DVXXmfvj60ie","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":57517},"main":"dist_ts/index.js","type":"module","gitHead":"e94004742ffbfbc11c08bd02201738507a3231cf","private":false,"scripts":{"test":"(tstest test/ --verbose --timeout 600)","build":"(tsbuild --web --allowimplicitany)"},"typings":"dist_ts/index.d.ts","_npmUser":{"name":"lossless","email":"hello@lossless.com"},"repository":{"url":"https://code.foss.global/apiclient.xyz/gitlab.git","type":"git"},"_npmVersion":"11.7.0","description":"A TypeScript client for the GitLab API, providing easy access to projects, groups, CI/CD variables, and pipelines.","directories":{},"_nodeVersion":"25.2.1","browserslist":["last 1 chrome versions"],"dependencies":{"@push.rocks/smartlog":"^3.1.10","@push.rocks/smartrequest":"^5.0.1"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^22.15.3","@git.zone/tsrun":"^2.0.0","@git.zone/tstest":"^2.8.2","@push.rocks/qenv":"^6.1.3","@git.zone/tsbuild":"^3.1.0","@push.rocks/tapbundle":"^5.6.0"},"_npmOperationalInternal":{"tmp":"tmp/gitlab_2.3.0_1772297997134_0.7430613721966823","host":"s3://npm-registry-packages-npm-production"}},"2.4.0":{"name":"@apiclient.xyz/gitlab","version":"2.4.0","keywords":["gitlab","api client","TypeScript","CI/CD","pipelines","variables","devops"],"author":{"name":"Lossless GmbH"},"license":"MIT","_id":"@apiclient.xyz/gitlab@2.4.0","maintainers":[{"name":"lossless","email":"hello@lossless.com"}],"dist":{"shasum":"9989db3d6d6eae7cbbd03754554cb062db7bea30","tarball":"https://registry.npmjs.org/@apiclient.xyz/gitlab/-/gitlab-2.4.0.tgz","fileCount":22,"integrity":"sha512-8gnN70q8tROrLH7Vl25jh8rJeb7f2neif0LJ58i+UlF66DQ7pjkgLeLNshyFgcwiyVCHzq4yaxEQ8Lm7q7cD/Q==","signatures":[{"sig":"MEUCICR00VaxzNVHHjdzCin4IRtYUiqle9+tCOzwacer/zc2AiEA8ABrGD4ypwvwO9hPMRpaTHlrWssQEY37ylotiwwU1S4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":60575},"main":"dist_ts/index.js","type":"module","gitHead":"9feb49a3d45d643168f7a0bf5dda786867e73d8a","private":false,"scripts":{"test":"(tstest test/ --verbose --timeout 600)","build":"(tsbuild --web --allowimplicitany)"},"typings":"dist_ts/index.d.ts","_npmUser":{"name":"lossless","email":"hello@lossless.com"},"repository":{"url":"https://code.foss.global/apiclient.xyz/gitlab.git","type":"git"},"_npmVersion":"11.7.0","description":"A TypeScript client for the GitLab API, providing easy access to projects, groups, CI/CD variables, and pipelines.","directories":{},"_nodeVersion":"25.2.1","browserslist":["last 1 chrome versions"],"dependencies":{"@push.rocks/smartlog":"^3.1.10","@push.rocks/smartrequest":"^5.0.1"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^22.15.3","@git.zone/tsrun":"^2.0.0","@git.zone/tstest":"^2.8.2","@push.rocks/qenv":"^6.1.3","@git.zone/tsbuild":"^3.1.0","@push.rocks/tapbundle":"^5.6.0"},"_npmOperationalInternal":{"tmp":"tmp/gitlab_2.4.0_1772443980552_0.852626477962309","host":"s3://npm-registry-packages-npm-production"}},"2.5.0":{"name":"@apiclient.xyz/gitlab","version":"2.5.0","keywords":["gitlab","api client","TypeScript","CI/CD","pipelines","variables","devops"],"author":{"name":"Lossless GmbH"},"license":"MIT","_id":"@apiclient.xyz/gitlab@2.5.0","maintainers":[{"name":"lossless","email":"hello@lossless.com"}],"dist":{"shasum":"a383c265886bd1f77ccd1fd1390d5f91c2b944b5","tarball":"https://registry.npmjs.org/@apiclient.xyz/gitlab/-/gitlab-2.5.0.tgz","fileCount":22,"integrity":"sha512-azCrWvklh21PaiUsmlDP34M6BxjlHfkiWvVVRnOLYUgEttQH9L0n6WTcJPD2RmuDvIFIgH+MU/l2JNIMT7y5Cw==","signatures":[{"sig":"MEUCIDC/g0nFe7duGYgJhptxiqkpsM0NgwODcqNUhfWp1GAKAiEArQBYkX94lV8TS/Cwsivi29fo3zxGtGsw/fG3t/ZbRrk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":82804},"main":"dist_ts/index.js","type":"module","gitHead":"4d90bb01cf2fb5fc177add02d31b762172c499bb","private":false,"scripts":{"test":"(tstest test/ --verbose --timeout 600)","build":"(tsbuild --web --allowimplicitany)"},"typings":"dist_ts/index.d.ts","_npmUser":{"name":"lossless","email":"hello@lossless.com"},"repository":{"url":"https://code.foss.global/apiclient.xyz/gitlab.git","type":"git"},"_npmVersion":"11.7.0","description":"A TypeScript client for the GitLab API, providing easy access to projects, groups, CI/CD variables, and pipelines.","directories":{},"_nodeVersion":"25.2.1","browserslist":["last 1 chrome versions"],"dependencies":{"@push.rocks/smartlog":"^3.1.10","@push.rocks/smartrequest":"^5.0.1"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^22.15.3","@git.zone/tsrun":"^2.0.0","@git.zone/tstest":"^2.8.2","@push.rocks/qenv":"^6.1.3","@git.zone/tsbuild":"^3.1.0","@push.rocks/tapbundle":"^5.6.0"},"_npmOperationalInternal":{"tmp":"tmp/gitlab_2.5.0_1772452011664_0.04891112643491713","host":"s3://npm-registry-packages-npm-production"}},"2.6.0":{"name":"@apiclient.xyz/gitlab","version":"2.6.0","private":false,"description":"A TypeScript client for the GitLab API, providing easy access to projects, groups, CI/CD variables, and pipelines.","main":"dist_ts/index.js","typings":"dist_ts/index.d.ts","type":"module","scripts":{"test":"(tstest test/ --verbose --timeout 600)","build":"(tsbuild --web --allowimplicitany)"},"repository":{"type":"git","url":"https://code.foss.global/apiclient.xyz/gitlab.git"},"keywords":["gitlab","api client","TypeScript","CI/CD","pipelines","variables","devops"],"author":{"name":"Lossless GmbH"},"license":"MIT","dependencies":{"@push.rocks/smartlog":"^3.1.10","@push.rocks/smartrequest":"^5.0.1"},"devDependencies":{"@git.zone/tsbuild":"^3.1.0","@git.zone/tsrun":"^2.0.0","@git.zone/tstest":"^2.8.2","@push.rocks/qenv":"^6.1.3","@push.rocks/tapbundle":"^5.6.0","@types/node":"^22.15.3"},"browserslist":["last 1 chrome versions"],"gitHead":"3fd68362eeab8493d4189447ed2e009bc2199fcb","_id":"@apiclient.xyz/gitlab@2.6.0","_nodeVersion":"25.2.1","_npmVersion":"11.7.0","dist":{"integrity":"sha512-GiVG0+U3LTg63dRXGhkpIVfgIxFIOOmkaCgwlB8b6mFVYG852EIgly3HEaeeuCN3SmbkFak6WvB5s1nSZC/z7w==","shasum":"fa1b05538bb6a5763ceca94def2b4f6189bdae5c","tarball":"https://registry.npmjs.org/@apiclient.xyz/gitlab/-/gitlab-2.6.0.tgz","fileCount":52,"unpackedSize":192461,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCcnqzeVt5X1HPV5hjn49ABLycHQIzvK0fUA8P6JdKZZwIgd3nYopHALWjGAcdtimSNVt6a9h12WbHgMCI4SCQBLAM="}]},"_npmUser":{"name":"lossless","email":"hello@lossless.com"},"directories":{},"maintainers":[{"name":"lossless","email":"hello@lossless.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/gitlab_2.6.0_1772457080821_0.390990269949256"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-24T12:55:01.478Z","modified":"2026-03-02T13:11:21.075Z","2.0.1":"2026-02-24T12:55:01.758Z","2.0.2":"2026-02-24T12:55:54.712Z","2.0.3":"2026-02-24T12:59:51.053Z","2.1.0":"2026-02-28T10:23:34.050Z","2.2.0":"2026-02-28T11:14:07.023Z","2.3.0":"2026-02-28T16:59:57.301Z","2.4.0":"2026-03-02T09:33:00.722Z","2.5.0":"2026-03-02T11:46:51.812Z","2.6.0":"2026-03-02T13:11:20.953Z"},"author":{"name":"Lossless GmbH"},"license":"MIT","keywords":["gitlab","api client","TypeScript","CI/CD","pipelines","variables","devops"],"repository":{"type":"git","url":"https://code.foss.global/apiclient.xyz/gitlab.git"},"description":"A TypeScript client for the GitLab API, providing easy access to projects, groups, CI/CD variables, and pipelines.","maintainers":[{"name":"lossless","email":"hello@lossless.com"}],"readme":"# @apiclient.xyz/gitlab\n\nA powerful, fully-typed TypeScript client for the GitLab API 🚀\n\n[![npm version](https://img.shields.io/npm/v/@apiclient.xyz/gitlab.svg)](https://www.npmjs.com/package/@apiclient.xyz/gitlab)\n[![license](https://img.shields.io/npm/l/@apiclient.xyz/gitlab.svg)](./LICENSE)\n\n`@apiclient.xyz/gitlab` gives you a clean, object-oriented interface to the GitLab REST API. It wraps projects, groups, pipelines, jobs, CI/CD variables, branches, tags, protected branches, and test reports into rich domain classes with full auto-pagination support. Works with any GitLab instance -- cloud or self-hosted.\n\n## Issue Reporting and Security\n\nFor reporting bugs, issues, or security vulnerabilities, please visit [community.foss.global/](https://community.foss.global/). This is the central community hub for all issue reporting. Developers who sign and comply with our contribution agreement and go through identification can also get a [code.foss.global/](https://code.foss.global/) account to submit Pull Requests directly.\n\n## Install\n\n```bash\nnpm install @apiclient.xyz/gitlab\n# or\npnpm install @apiclient.xyz/gitlab\n```\n\n## Quick Start ⚡\n\n```typescript\nimport { GitLabClient } from '@apiclient.xyz/gitlab';\n\nconst client = new GitLabClient('https://gitlab.example.com', 'your-private-token');\n\n// Verify connectivity\nconst { ok, error } = await client.testConnection();\nconsole.log(ok ? '✅ Connected!' : `❌ ${error}`);\n\n// Grab all your projects\nconst projects = await client.getProjects();\nfor (const project of projects) {\n  console.log(`${project.name} — ${project.webUrl}`);\n}\n```\n\nThat's it. No boilerplate, no callback soup, just straightforward async/await.\n\n## Core Concepts 🧠\n\n### Rich Domain Objects\n\nEvery API response is wrapped in a **domain class** that exposes typed properties and chainable methods. You never deal with raw JSON unless you want to -- every class has a `.toJSON()` escape hatch.\n\n```\nGitLabClient\n  ├── GitLabGroup          → .getProjects(), .getVariables(), .update(), .delete(), ...\n  ├── GitLabProject        → .getPipelines(), .getBranches(), .getVariables(), .triggerPipeline(), ...\n  │     ├── GitLabBranch\n  │     ├── GitLabTag\n  │     ├── GitLabProtectedBranch\n  │     └── GitLabVariable\n  ├── GitLabPipeline       → .getJobs(), .getTestReport(), .retry(), .cancel(), .delete()\n  │     ├── GitLabJob      → .getLog(), .retry(), .cancel(), .play(), .erase()\n  │     ├── GitLabPipelineVariable\n  │     └── GitLabTestReport\n  │           └── GitLabTestSuite\n  │                 └── GitLabTestCase\n  └── GitLabVariable\n```\n\n### Auto-Pagination 🔄\n\nList endpoints automatically page through **all** results by default. Need just one page? Pass `{ page: N }` explicitly.\n\n```typescript\n// Fetches ALL groups (auto-paginates transparently)\nconst allGroups = await client.getGroups();\n\n// Fetches only page 2, 10 per page\nconst page2 = await client.getGroups({ page: 2, perPage: 10 });\n```\n\nThe `autoPaginate` helper is also exported if you want to use it in custom integrations.\n\n## Usage\n\n### Creating a Client\n\n```typescript\nimport { GitLabClient } from '@apiclient.xyz/gitlab';\n\nconst client = new GitLabClient('https://gitlab.example.com', 'your-private-token');\n```\n\nThe constructor takes the base URL of your GitLab instance and a personal access token (or project/group token) for `PRIVATE-TOKEN` header authentication.\n\n### Testing the Connection\n\n```typescript\nconst result = await client.testConnection();\n\nif (result.ok) {\n  console.log('Connected successfully.');\n} else {\n  console.error('Connection failed:', result.error);\n}\n```\n\n---\n\n### Groups 🏢\n\n#### List All Groups\n\n```typescript\nconst groups = await client.getGroups();\n\n// Search by name\nconst devGroups = await client.getGroups({ search: 'platform' });\n\nfor (const group of devGroups) {\n  console.log(`${group.id} — ${group.fullPath} (${group.visibility})`);\n}\n```\n\n#### Get a Single Group\n\n```typescript\nconst group = await client.getGroup('my-org/my-team');\nconsole.log(group.name, group.webUrl);\n```\n\n#### Create a Group\n\n```typescript\nconst newGroup = await client.createGroup('backend-team', 'backend-team');\n\n// Create a sub-group under an existing parent\nconst subGroup = await client.createGroup('api-squad', 'api-squad', parentGroup.id);\n```\n\n#### Group Operations\n\n```typescript\n// Update properties\nawait group.update({ description: 'The backend crew 🔧', visibility: 'internal' });\n\n// Upload / remove avatar\nawait group.setAvatar(imageBytes, 'logo.png');\nawait group.deleteAvatar();\n\n// Transfer to another parent group\nawait group.transfer(targetGroupId);\n\n// List descendant sub-groups\nconst children = await group.getDescendantGroups();\n\n// List projects inside the group\nconst projects = await group.getProjects({ search: 'api' });\n\n// Delete\nawait group.delete();\n```\n\n---\n\n### Projects 📦\n\n#### List All Projects\n\n```typescript\nconst projects = await client.getProjects();\n\n// Search with pagination\nconst matches = await client.getProjects({ search: 'my-service', perPage: 20 });\n\nfor (const p of matches) {\n  console.log(`${p.id} — ${p.fullPath} [${p.defaultBranch}]`);\n}\n```\n\n#### Get a Single Project\n\n```typescript\n// By numeric ID\nconst project = await client.getProject(42);\n\n// By full path\nconst project = await client.getProject('my-org/my-repo');\n```\n\n#### Create a Project\n\n```typescript\nconst project = await client.createProject('new-service', {\n  namespaceId: group.id,\n  visibility: 'internal',\n  description: 'Our shiny new microservice',\n});\n```\n\n#### Project Operations\n\n```typescript\n// Update properties\nawait project.update({\n  description: 'Updated description',\n  defaultBranch: 'develop',\n  topics: ['typescript', 'api'],\n});\n\n// Avatar management\nawait project.setAvatar(imageBytes, 'project-logo.png');\nawait project.deleteAvatar();\n\n// Transfer to a different namespace\nawait project.transfer(otherNamespaceId);\n\n// Delete\nawait project.delete();\n```\n\n---\n\n### Branches & Tags 🌿\n\n```typescript\n// List all branches (auto-paginated)\nconst branches = await project.getBranches();\nfor (const b of branches) {\n  console.log(`${b.name} @ ${b.commitSha}`);\n}\n\n// List all tags\nconst tags = await project.getTags();\nfor (const t of tags) {\n  console.log(`${t.name} @ ${t.commitSha}`);\n}\n```\n\n#### Protected Branches 🔒\n\n```typescript\nconst protectedBranches = await project.getProtectedBranches();\nfor (const pb of protectedBranches) {\n  console.log(`${pb.name} — force push: ${pb.allowForcePush}`);\n}\n\n// Remove branch protection\nawait project.unprotectBranch('develop');\n```\n\n---\n\n### CI/CD Variables 🔑\n\nVariables work identically on both projects and groups.\n\n#### Project Variables\n\n```typescript\n// List all\nconst vars = await project.getVariables();\n\n// Create\nconst dbVar = await project.createVariable('DATABASE_URL', 'postgres://localhost/db', {\n  protected: true,\n  masked: true,\n  environment_scope: 'production',\n});\n\n// Update\nawait project.updateVariable('DATABASE_URL', 'postgres://newhost/db', {\n  protected: true,\n});\n\n// Delete\nawait project.deleteVariable('DATABASE_URL');\n```\n\n#### Group Variables\n\n```typescript\nconst groupVars = await group.getVariables();\n\nawait group.createVariable('NPM_TOKEN', 'tok-xxx', {\n  protected: false,\n  masked: true,\n  environment_scope: '*',\n});\n\nawait group.updateVariable('NPM_TOKEN', 'tok-yyy');\nawait group.deleteVariable('NPM_TOKEN');\n```\n\nEach `GitLabVariable` instance exposes typed properties:\n\n```typescript\nconsole.log(dbVar.key);              // 'DATABASE_URL'\nconsole.log(dbVar.value);            // 'postgres://...'\nconsole.log(dbVar.variableType);     // 'env_var'\nconsole.log(dbVar.protected);        // true\nconsole.log(dbVar.masked);           // true\nconsole.log(dbVar.environmentScope); // 'production'\n```\n\n---\n\n### Pipelines 🚀\n\n#### List & Filter Pipelines\n\n```typescript\n// Recent pipelines (auto-paginated)\nconst pipelines = await project.getPipelines();\n\n// Advanced filtering\nconst failed = await project.getPipelines({\n  status: 'failed',\n  ref: 'main',\n  source: 'push',\n  orderBy: 'updated_at',\n  sort: 'desc',\n  updatedAfter: '2025-01-01T00:00:00Z',\n});\n\nfor (const p of failed) {\n  console.log(`Pipeline #${p.id} [${p.status}] on ${p.ref} — ${p.webUrl}`);\n}\n```\n\n#### Trigger a Pipeline\n\n```typescript\nconst pipeline = await project.triggerPipeline('main', [\n  { key: 'DEPLOY_ENV', value: 'staging' },\n]);\nconsole.log(`Triggered pipeline #${pipeline.id}`);\n```\n\n#### Pipeline Actions\n\n```typescript\n// Retry all failed jobs\nconst retried = await pipeline.retry();\n\n// Cancel a running pipeline\nconst cancelled = await pipeline.cancel();\n\n// Delete a pipeline\nawait pipeline.delete();\n```\n\n#### Pipeline Variables & Test Reports\n\n```typescript\n// Get variables used in a pipeline run\nconst pipelineVars = await pipeline.getVariables();\nfor (const v of pipelineVars) {\n  console.log(`${v.key} = ${v.value} (${v.variableType})`);\n}\n\n// Get the test report\nconst report = await pipeline.getTestReport();\nconsole.log(`Tests: ${report.totalCount} total, ${report.successCount} passed, ${report.failedCount} failed`);\n\nfor (const suite of report.testSuites) {\n  console.log(`  Suite \"${suite.name}\": ${suite.totalCount} tests (${suite.failedCount} failures)`);\n  for (const tc of suite.testCases) {\n    if (tc.status === 'failed') {\n      console.log(`    ❌ ${tc.name}: ${tc.systemOutput}`);\n    }\n  }\n}\n```\n\n---\n\n### Jobs ⚙️\n\n```typescript\n// Get all jobs for a pipeline\nconst jobs = await pipeline.getJobs();\n\n// Filter by scope\nconst failedJobs = await pipeline.getJobs({ scope: ['failed'] });\n\nfor (const job of jobs) {\n  console.log(`Job \"${job.name}\" (${job.stage}) — ${job.status} [${job.duration}s]`);\n}\n```\n\n#### Job Actions\n\n```typescript\n// Read the raw log output\nconst log = await job.getLog();\nconsole.log(log);\n\n// Retry a failed job\nconst retriedJob = await job.retry();\n\n// Cancel a running job\nconst cancelledJob = await job.cancel();\n\n// Trigger a manual job\nconst played = await job.play();\n\n// Erase job artifacts and trace\nawait job.erase();\n```\n\n#### Job Properties\n\nEach `GitLabJob` exposes rich metadata:\n\n```typescript\njob.id              // number\njob.name            // 'build'\njob.stage           // 'test'\njob.status          // 'success' | 'failed' | 'running' | ...\njob.ref             // 'main'\njob.tag             // false\njob.webUrl          // full URL to the job\njob.duration        // seconds\njob.queuedDuration  // seconds waiting in queue\njob.coverage        // code coverage percentage\njob.allowFailure    // whether failure is acceptable\njob.failureReason   // reason for failure, if any\n```\n\n---\n\n## API Reference 📚\n\n### `GitLabClient`\n\n| Method | Returns | Description |\n|---|---|---|\n| `new GitLabClient(baseUrl, token)` | `GitLabClient` | Create a client instance |\n| `.testConnection()` | `Promise<ITestConnectionResult>` | Verify token and connectivity |\n| `.getGroups(opts?)` | `Promise<GitLabGroup[]>` | List all accessible groups (auto-paginated) |\n| `.getGroup(fullPath)` | `Promise<GitLabGroup>` | Get a single group by full path |\n| `.createGroup(name, path, parentId?)` | `Promise<GitLabGroup>` | Create a new group |\n| `.getProjects(opts?)` | `Promise<GitLabProject[]>` | List your projects (auto-paginated) |\n| `.getProject(idOrPath)` | `Promise<GitLabProject>` | Get a single project by ID or path |\n| `.createProject(name, opts?)` | `Promise<GitLabProject>` | Create a new project |\n\n### `GitLabGroup`\n\n| Method | Returns | Description |\n|---|---|---|\n| `.getProjects(opts?)` | `Promise<GitLabProject[]>` | List projects in the group |\n| `.getDescendantGroups(opts?)` | `Promise<GitLabGroup[]>` | List descendant sub-groups |\n| `.getVariables()` | `Promise<GitLabVariable[]>` | List CI/CD variables |\n| `.createVariable(key, value, opts?)` | `Promise<GitLabVariable>` | Create a CI/CD variable |\n| `.updateVariable(key, value, opts?)` | `Promise<GitLabVariable>` | Update a CI/CD variable |\n| `.deleteVariable(key)` | `Promise<void>` | Delete a CI/CD variable |\n| `.update(data)` | `Promise<void>` | Update group properties |\n| `.setAvatar(imageData, filename)` | `Promise<void>` | Upload avatar image |\n| `.deleteAvatar()` | `Promise<void>` | Remove avatar |\n| `.transfer(parentGroupId)` | `Promise<void>` | Transfer to another parent group |\n| `.delete()` | `Promise<void>` | Delete the group |\n| `.toJSON()` | `IGitLabGroup` | Serialize to raw interface |\n\n### `GitLabProject`\n\n| Method | Returns | Description |\n|---|---|---|\n| `.getBranches(opts?)` | `Promise<GitLabBranch[]>` | List repository branches |\n| `.getTags(opts?)` | `Promise<GitLabTag[]>` | List repository tags |\n| `.getProtectedBranches()` | `Promise<GitLabProtectedBranch[]>` | List protected branches |\n| `.unprotectBranch(name)` | `Promise<void>` | Remove branch protection |\n| `.getVariables()` | `Promise<GitLabVariable[]>` | List CI/CD variables |\n| `.createVariable(key, value, opts?)` | `Promise<GitLabVariable>` | Create a CI/CD variable |\n| `.updateVariable(key, value, opts?)` | `Promise<GitLabVariable>` | Update a CI/CD variable |\n| `.deleteVariable(key)` | `Promise<void>` | Delete a CI/CD variable |\n| `.getPipelines(opts?)` | `Promise<GitLabPipeline[]>` | List pipelines (with rich filtering) |\n| `.triggerPipeline(ref, variables?)` | `Promise<GitLabPipeline>` | Trigger a new pipeline |\n| `.update(data)` | `Promise<void>` | Update project properties |\n| `.setAvatar(imageData, filename)` | `Promise<void>` | Upload avatar image |\n| `.deleteAvatar()` | `Promise<void>` | Remove avatar |\n| `.transfer(namespaceId)` | `Promise<void>` | Transfer to another namespace |\n| `.delete()` | `Promise<void>` | Delete the project |\n| `.toJSON()` | `IGitLabProject` | Serialize to raw interface |\n\n### `GitLabPipeline`\n\n| Method | Returns | Description |\n|---|---|---|\n| `.getJobs(opts?)` | `Promise<GitLabJob[]>` | List jobs (with scope filtering) |\n| `.getVariables()` | `Promise<GitLabPipelineVariable[]>` | Get pipeline variables |\n| `.getTestReport()` | `Promise<GitLabTestReport>` | Get the test report |\n| `.retry()` | `Promise<GitLabPipeline>` | Retry failed jobs |\n| `.cancel()` | `Promise<GitLabPipeline>` | Cancel the pipeline |\n| `.delete()` | `Promise<void>` | Delete the pipeline |\n| `.toJSON()` | `IGitLabPipeline` | Serialize to raw interface |\n\n### `GitLabJob`\n\n| Method | Returns | Description |\n|---|---|---|\n| `.getLog()` | `Promise<string>` | Get raw job trace/log |\n| `.retry()` | `Promise<GitLabJob>` | Retry the job |\n| `.cancel()` | `Promise<GitLabJob>` | Cancel the job |\n| `.play()` | `Promise<GitLabJob>` | Trigger a manual job |\n| `.erase()` | `Promise<void>` | Erase artifacts and trace |\n| `.toJSON()` | `IGitLabJob` | Serialize to raw interface |\n\n### Value Classes\n\n| Class | Key Properties |\n|---|---|\n| `GitLabBranch` | `name`, `commitSha` |\n| `GitLabTag` | `name`, `commitSha` |\n| `GitLabProtectedBranch` | `id`, `name`, `allowForcePush` |\n| `GitLabVariable` | `key`, `value`, `variableType`, `protected`, `masked`, `environmentScope` |\n| `GitLabPipelineVariable` | `key`, `value`, `variableType` |\n| `GitLabTestReport` | `totalTime`, `totalCount`, `successCount`, `failedCount`, `skippedCount`, `errorCount`, `testSuites` |\n| `GitLabTestSuite` | `name`, `totalTime`, `totalCount`, `successCount`, `failedCount`, `skippedCount`, `errorCount`, `testCases` |\n| `GitLabTestCase` | `status`, `name`, `classname`, `executionTime`, `systemOutput`, `stackTrace` |\n\n---\n\n## TypeScript Interfaces 🏗️\n\nAll raw GitLab API shapes are exported as TypeScript interfaces so you can use them in your own type definitions.\n\n### `IListOptions`\n\n```typescript\ninterface IListOptions {\n  search?: string;   // Filter results by keyword\n  page?: number;     // Page number (default: 1)\n  perPage?: number;  // Items per page (default: 50)\n}\n```\n\n### `IPipelineListOptions`\n\nExtends `IListOptions` with pipeline-specific filters:\n\n```typescript\ninterface IPipelineListOptions extends IListOptions {\n  status?: string;          // Filter by pipeline status\n  ref?: string;             // Filter by branch/tag ref\n  source?: string;          // Filter by trigger source (push, web, schedule, api, ...)\n  scope?: string;           // Filter by scope (running, pending, finished, branches, tags)\n  username?: string;        // Filter by the triggering user\n  updatedAfter?: string;    // ISO 8601 date — only pipelines updated after this\n  updatedBefore?: string;   // ISO 8601 date — only pipelines updated before this\n  orderBy?: string;         // Order by field (id, status, ref, updated_at, user_id)\n  sort?: string;            // Sort direction (asc, desc)\n}\n```\n\n### `IJobListOptions`\n\n```typescript\ninterface IJobListOptions extends IListOptions {\n  scope?: string[];  // Filter by job scope(s): created, pending, running, failed, success, ...\n}\n```\n\n### `IVariableOptions`\n\n```typescript\ninterface IVariableOptions {\n  protected?: boolean;         // Only expose to protected branches/tags\n  masked?: boolean;            // Mask the value in job logs\n  environment_scope?: string;  // Environment scope (default: '*')\n}\n```\n\n### `ITestConnectionResult`\n\n```typescript\ninterface ITestConnectionResult {\n  ok: boolean;\n  error?: string;  // Present when ok is false\n}\n```\n\nAll raw data interfaces (`IGitLabProject`, `IGitLabGroup`, `IGitLabPipeline`, `IGitLabJob`, `IGitLabVariable`, `IGitLabBranch`, `IGitLabTag`, `IGitLabProtectedBranch`, `IGitLabPipelineVariable`, `IGitLabTestReport`, `IGitLabTestSuite`, `IGitLabTestCase`, `IGitLabUser`) are also exported for advanced use cases.\n\n---\n\n## License and Legal Information\n\nThis repository contains open-source code licensed under the MIT License. A copy of the license can be found in the [LICENSE](./LICENSE) file.\n\n**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.\n\n### Trademarks\n\nThis project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH or third parties, and are not included within the scope of the MIT license granted herein.\n\nUse of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines or the guidelines of the respective third-party owners, and any usage must be approved in writing. Third-party trademarks used herein are the property of their respective owners and used only in a descriptive manner, e.g. for an implementation of an API or similar.\n\n### Company Information\n\nTask Venture Capital GmbH\nRegistered at District Court Bremen HRB 35230 HB, Germany\n\nFor any legal inquiries or further information, please contact us via email at hello@task.vc.\n\nBy using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.\n","readmeFilename":"readme.md"}