{"_id":"@atlassian-tools/gql","_rev":"3-1842136f251514a5b64bfcf410064b18","name":"@atlassian-tools/gql","dist-tags":{"latest":"1.0.7"},"versions":{"1.0.4":{"name":"@atlassian-tools/gql","version":"1.0.4","keywords":["atlassian","jira","confluence","graphql","typescript","api-client"],"license":"MIT","_id":"@atlassian-tools/gql@1.0.4","maintainers":[{"name":"theplenkov-npm","email":"petr.plenkov@gmail.com"}],"homepage":"https://github.com/gqlb/gqlb#readme","bugs":{"url":"https://github.com/gqlb/gqlb/issues"},"dist":{"shasum":"8fbe5d9ebae4d240a95d7ae5ff453f6ceaf503e0","tarball":"https://registry.npmjs.org/@atlassian-tools/gql/-/gql-1.0.4.tgz","fileCount":6,"integrity":"sha512-ZKLjENyZeYAryB0t+ZghX3I446StIU4UnfDhDymmymLFeCaEo+dWU0SrXEWxGmSsBaYo64RyMts2ykSogH69Yg==","signatures":[{"sig":"MEQCIAJZzeiyHJHtVSUOEwJFuj/I3RdzYjZsqbNAzreXcp3+AiBcXtYW48jx8dUBAa/Pk0odpw2122Q19CWDwGuK58bYwg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@atlassian-tools%2fgql@1.0.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":5233576},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":"./dist/index.mjs","require":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"e09b1ac1552eeca2b1eadd4f913a3f015a3a2259","_npmUser":{"name":"theplenkov-npm","email":"petr.plenkov@gmail.com"},"repository":{"url":"git+https://github.com/gqlb/gqlb.git","type":"git","directory":"packages/atlassian-graphql"},"_npmVersion":"11.6.1","description":"Typed GraphQL client for Atlassian APIs (Jira, Confluence)","directories":{},"_nodeVersion":"24.11.0","dependencies":{"gqlb":"*"},"_hasShrinkwrap":false,"devDependencies":{},"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/gql_1.0.4_1761738559510_0.4653616767517228","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@atlassian-tools/gql","version":"1.0.5","keywords":["atlassian","jira","confluence","graphql","typescript","api-client"],"license":"MIT","_id":"@atlassian-tools/gql@1.0.5","maintainers":[{"name":"theplenkov-npm","email":"petr.plenkov@gmail.com"}],"homepage":"https://github.com/gqlb/gqlb#readme","bugs":{"url":"https://github.com/gqlb/gqlb/issues"},"dist":{"shasum":"b2c85b82272f3a6571d48d0b18918c5339f089d0","tarball":"https://registry.npmjs.org/@atlassian-tools/gql/-/gql-1.0.5.tgz","fileCount":17,"integrity":"sha512-jF14QZE3JtHe0DeUGpf8CKB7zyCHAcuaMyd3FWfLE7b5iDwI7QPwOkf7NrWagzKDCrWb30x3eoKX48wagIXL0Q==","signatures":[{"sig":"MEYCIQDnqe1+JB+4E1Y3Ky8N7IpvEXsnXNA34EdYVjt9yQresQIhAKRDB8kqdNSzVfwByH7LFwBde9OC+iokU1sAazFvFj1y","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@atlassian-tools%2fgql@1.0.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":7319688},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":"./dist/index.mjs","require":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"28093a5366cfbe350596f1cbcb9c3fa3b45d27c1","_npmUser":{"name":"theplenkov-npm","email":"petr.plenkov@gmail.com"},"repository":{"url":"git+https://github.com/gqlb/gqlb.git","type":"git","directory":"packages/atlassian-graphql"},"_npmVersion":"11.6.1","description":"Typed GraphQL client for Atlassian APIs (Jira, Confluence)","directories":{},"_nodeVersion":"24.11.0","dependencies":{"gqlb":"*"},"_hasShrinkwrap":false,"devDependencies":{},"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/gql_1.0.5_1761742917845_0.40970648810448473","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"@atlassian-tools/gql","version":"1.0.7","description":"Typed GraphQL client for Atlassian APIs (Jira, Confluence)","type":"module","main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","keywords":["atlassian","jira","confluence","graphql","typescript","api-client"],"repository":{"type":"git","url":"git+https://github.com/gqlb/gqlb.git","directory":"packages/atlassian-graphql"},"homepage":"https://github.com/gqlb/gqlb#readme","bugs":{"url":"https://github.com/gqlb/gqlb/issues"},"license":"MIT","dependencies":{"gqlb":"*","gqlb-codegen":"*"},"peerDependencies":{},"exports":{".":"./dist/index.js","./package.json":"./package.json"},"devDependencies":{},"gitHead":"247512c56a25c455e9b31ae5252b4785c459bec9","_id":"@atlassian-tools/gql@1.0.7","_nodeVersion":"24.11.0","_npmVersion":"11.6.1","dist":{"integrity":"sha512-JLUpiZZXoW/ofUF8JrMZsMBYo6vbUt71pNuT8NRUzH8PISun2pQfQ0lwY774pNE51Zau7bZZRJUGZU8OvehvSA==","shasum":"205a995464ae829f5018599bd64de983a06db628","tarball":"https://registry.npmjs.org/@atlassian-tools/gql/-/gql-1.0.7.tgz","fileCount":15,"unpackedSize":8937499,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQD+b2ljj5twyt2fWKGArdvv4XSvVWlhx8R4F56+ilQbnwIhALq5svjlnzCRHEw03vk3k3aspq0Cy+6kDmZcV6DCxA/2"}]},"_npmUser":{"name":"theplenkov-npm","email":"petr.plenkov@gmail.com"},"directories":{},"maintainers":[{"name":"theplenkov-npm","email":"petr.plenkov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/gql_1.0.7_1761909973287_0.7606471609033949"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-29T11:49:19.423Z","modified":"2025-10-31T11:26:13.780Z","1.0.4":"2025-10-29T11:49:19.738Z","1.0.5":"2025-10-29T13:01:58.063Z","1.0.7":"2025-10-31T11:26:13.546Z"},"bugs":{"url":"https://github.com/gqlb/gqlb/issues"},"license":"MIT","homepage":"https://github.com/gqlb/gqlb#readme","keywords":["atlassian","jira","confluence","graphql","typescript","api-client"],"repository":{"type":"git","url":"git+https://github.com/gqlb/gqlb.git","directory":"packages/atlassian-graphql"},"description":"Typed GraphQL client for Atlassian APIs (Jira, Confluence)","maintainers":[{"name":"theplenkov-npm","email":"petr.plenkov@gmail.com"}],"readme":"# @atlassian-tools/gql\n\n> 🎯 **Demo Application:** This package demonstrates how to use [`gqlb`](../gqlb) with a real-world, complex GraphQL schema (Atlassian API with 8000+ types). It serves as a reference implementation and will be moved to its own repository soon.\n\n**Pre-configured gqlb instance for Atlassian's GraphQL API**\n\nA fully typed TypeScript client for the Atlassian GraphQL API showcasing **dynamic field selection** powered by the [`gqlb`](../gqlb) runtime query builder.\n\n## ✨ Features\n\n- 🎯 **Dynamic Field Selection** - Select only the fields you need at runtime\n- 🔒 **Full Type Safety** - Complete TypeScript autocomplete for 8000+ Atlassian types\n- 🚀 **Proxy-Based API** - Intuitive, chainable query building via gqlb\n- 📦 **Zero Manual Queries** - No GraphQL string writing needed\n- 🔧 **Works with graphql-request** - Use your existing GraphQL client\n\n## 📚 About This Package\n\nThis is a **demonstration of gqlb's capabilities** with a complex, real-world schema. It shows how gqlb can handle:\n\n- 8000+ GraphQL types\n- Deep nesting (10+ levels)\n- Complex unions and interfaces\n- Large schemas where traditional codegen fails\n\n**Looking for the core library?** Check out [`gqlb`](../gqlb) which works with any GraphQL schema, not just Atlassian.\n\n## 🚀 Quick Start\n\n```typescript\nimport { createQueryBuilder, $$ } from '@atlassian-tools/gql';\nimport { GraphQLClient } from 'graphql-request';\n\n// Create a GraphQL client\nconst client = new GraphQLClient('https://your-company.atlassian.net/gateway/api/graphql', {\n  headers: {\n    authorization: `Bearer ${process.env.ATLASSIAN_TOKEN}`,\n  },\n});\n\n// Create query builder (pre-configured with Atlassian schema)\nconst builder = createQueryBuilder();\n\n// Build queries with dynamic field selection\nconst cloudId = $$<string>('cloudId');\nconst jql = $$<string>('jql');\n\nconst query = builder.query('SearchIssues', q => [\n  q.jira({ cloudId }, jira => [\n    jira.issueSearch({ \n      issueSearchInput: { jql },\n      first: 10 \n    }, search => [\n      search.edges(edge => [\n        edge.node(node => [\n          node.id,\n          node.key,\n          node.summaryField(s => [s.text]),\n          node.assigneeField(a => [\n            a.user(u => [\n              u.accountId,\n              u.name\n            ])\n          ])\n        ])\n      ]),\n      search.pageInfo(p => [\n        p.hasNextPage,\n        p.endCursor\n      ])\n    ])\n  ])\n]);\n\n// Execute with variables\nconst result = await client.request(query, {\n  cloudId: 'your-cloud-id',\n  jql: 'project = DEMO'\n});\n```\n\n## 🎯 How It Works\n\nThis package uses **gqlb** under the hood:\n\n1. **Schema is pre-processed**: Atlassian's schema is pruned and optimized\n2. **Types are generated**: Minimal type definitions for gqlb\n3. **Queries are built at runtime**: Using gqlb's proxy-based builder\n4. **Full type safety**: TypeScript knows all 8000+ types!\n\nSee the [`gqlb` documentation](../gqlb) for details on how the magic works.\n\n## 🏗️ Package Structure\n\n```\natlassian-graphql/\n├── src/\n│   ├── generated/          # Generated from Atlassian schema\n│   │   ├── schema.graphql  # Pruned schema\n│   │   ├── types.ts        # TypeScript types\n│   │   └── args-map.json   # Field arguments map\n│   └── index.ts            # Exports createQueryBuilder\n├── scripts/\n│   └── generate.ts         # Schema fetch + codegen\n└── codegen.yml             # GraphQL codegen config\n```\n\n## 📚 Usage Examples\n\n### Basic Issue Query\n\n```typescript\nimport { createQueryBuilder, $$ } from '@atlassian-tools/gql';\n\nconst builder = createQueryBuilder();\nconst issueId = $$<string>('issueId');\n\nconst query = builder.query('GetIssue', q => [\n  q.jira(jira => [\n    jira.issue({ id: issueId }, issue => [\n      issue.id,\n      issue.key,\n      issue.summaryField(s => [s.text]),\n      issue.descriptionField(d => [d.text])\n    ])\n  ])\n]);\n```\n\n### Nested Field Selection\n\n```typescript\nconst query = builder.query('DetailedSearch', q => [\n  q.jira({ cloudId }, jira => [\n    jira.issueSearch({ issueSearchInput: { jql } }, search => [\n      search.edges(edge => [\n        edge.node(node => [\n          node.key,\n          node.summaryField(s => [s.text]),\n          node.assigneeField(a => [\n            a.user(u => [\n              u.name,\n              u.emailAddress\n            ])\n          ]),\n          node.statusField(status => [\n            status.name,\n            status.statusCategory(cat => [\n              cat.key,\n              cat.name\n            ])\n          ])\n        ])\n      ])\n    ])\n  ])\n]);\n```\n\n### Confluence Queries\n\n```typescript\nconst spacesQuery = builder.query('GetSpaces', q => [\n  q.confluence({ cloudId }, c => [\n    c.spaces({ keys: spaceKeys, first: 10 }, spaces => [\n      spaces.edges(edge => [\n        edge.node(node => [\n          node.id,\n          node.key,\n          node.name,\n          node.description\n        ])\n      ])\n    ])\n  ])\n]);\n```\n\n### Dynamic Field Selection\n\n```typescript\n// Choose fields at runtime based on user input!\nfunction buildIssueQuery(fields: string[]) {\n  return builder.query('DynamicQuery', q => [\n    q.jira(jira => [\n      jira.issue({ id: issueId }, issue => \n        fields.map(field => {\n          switch(field) {\n            case 'id': return issue.id;\n            case 'key': return issue.key;\n            case 'summary': return issue.summaryField(s => [s.text]);\n            // ... etc\n          }\n        })\n      )\n    ])\n  ]);\n}\n```\n\n## 🚀 Scripts\n\n- **`npm run gen`** - Fetch Atlassian schema + run codegen\n- **`npm run build`** - Build the package\n\n## 🛠️ Technical Details\n\nThis package demonstrates gqlb's **5-stage pipeline**:\n\n1. **Schema Pruning** - Removes unused Atlassian types (90% reduction)\n2. **Custom Codegen Plugin** - Generates args-map for tree-shaking  \n3. **Type Generation** - Creates minimal TypeScript types\n4. **Type Transformation** - Template literals for type magic\n5. **Runtime Builder** - gqlb's proxy-based query builder\n\n**Result:**\n- 120KB bundle (vs 850KB with traditional codegen)\n- Instant autocomplete (vs 3-5s delay)\n- Full type safety for all 8000+ types\n- Dynamic field selection\n\nSee [docs/ARCHITECTURE.md](./docs/ARCHITECTURE.md) for details.\n\n## 📦 Dependencies\n\n- `gqlb` - The core runtime query builder\n- `graphql` - GraphQL implementation\n- `graphql-request` - Lightweight GraphQL client (peer dependency)\n- `@graphql-typed-document-node/core` - TypedDocumentNode types\n\n## 🔄 Regenerating Types\n\nTo update types after Atlassian schema changes:\n\n```bash\nnpm run gen\n```\n\nThis will:\n1. Fetch the latest Atlassian GraphQL schema\n2. Prune unused types\n3. Generate TypeScript types and args-map\n4. Update the gqlb builder configuration\n\n## 💡 Use This as a Template\n\nWant to use gqlb with your own GraphQL API? This package is a great starting point:\n\n1. Copy the structure\n2. Replace Atlassian schema with your schema\n3. Update the codegen config\n4. Run `npm run gen`\n5. Start building queries!\n\nSee the [gqlb documentation](../gqlb) for more details.\n\n## 🎯 Why This Demo?\n\nAtlassian's GraphQL schema is **massive** (8000+ types) and **complex** (deep nesting, unions, interfaces). It's a perfect stress test for gqlb:\n\n- Traditional codegen → 850KB+ bundles, slow IDE\n- typed-graphql-builder → 130,000 lines of code, IDE crashes\n- **gqlb → 120KB bundle, instant autocomplete, full type safety** ✨\n\nThis demonstrates that gqlb can handle **any** GraphQL schema, no matter how complex.\n\n## 🔗 Related\n\n- **[gqlb](../gqlb)** - The core library (works with any GraphQL API)\n- **[@atlassian-tools/cli](../atlassian-cli)** - CLI demo using this package\n- **[Innovation Deep Dive](../../docs/INNOVATION.md)** - How gqlb works\n- **[Architecture Details](./docs/ARCHITECTURE.md)** - This package's structure\n\n## 📄 License\n\nMIT\n\n---\n\n**This is a demo/reference implementation. For the core library, see [`gqlb`](../gqlb).**\n","readmeFilename":"README.md"}