@code-rag/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +19 -0
- package/dist/auth/audit-log.d.ts +35 -0
- package/dist/auth/audit-log.js +110 -0
- package/dist/auth/audit-log.js.map +1 -0
- package/dist/auth/audit-log.test.d.ts +1 -0
- package/dist/auth/audit-log.test.js +261 -0
- package/dist/auth/audit-log.test.js.map +1 -0
- package/dist/auth/index.d.ts +6 -0
- package/dist/auth/index.js +5 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/oidc-provider.d.ts +49 -0
- package/dist/auth/oidc-provider.js +358 -0
- package/dist/auth/oidc-provider.js.map +1 -0
- package/dist/auth/oidc-provider.test.d.ts +1 -0
- package/dist/auth/oidc-provider.test.js +520 -0
- package/dist/auth/oidc-provider.test.js.map +1 -0
- package/dist/auth/rbac.d.ts +29 -0
- package/dist/auth/rbac.js +75 -0
- package/dist/auth/rbac.js.map +1 -0
- package/dist/auth/rbac.test.d.ts +1 -0
- package/dist/auth/rbac.test.js +224 -0
- package/dist/auth/rbac.test.js.map +1 -0
- package/dist/auth/saml-provider.d.ts +51 -0
- package/dist/auth/saml-provider.js +355 -0
- package/dist/auth/saml-provider.js.map +1 -0
- package/dist/auth/saml-provider.test.d.ts +1 -0
- package/dist/auth/saml-provider.test.js +422 -0
- package/dist/auth/saml-provider.test.js.map +1 -0
- package/dist/auth/types.d.ts +81 -0
- package/dist/auth/types.js +11 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/auth/types.test.d.ts +1 -0
- package/dist/auth/types.test.js +147 -0
- package/dist/auth/types.test.js.map +1 -0
- package/dist/backlog/ab-reference-scanner.d.ts +10 -0
- package/dist/backlog/ab-reference-scanner.js +22 -0
- package/dist/backlog/ab-reference-scanner.js.map +1 -0
- package/dist/backlog/ab-reference-scanner.test.d.ts +1 -0
- package/dist/backlog/ab-reference-scanner.test.js +83 -0
- package/dist/backlog/ab-reference-scanner.test.js.map +1 -0
- package/dist/backlog/azure-devops-provider.d.ts +59 -0
- package/dist/backlog/azure-devops-provider.js +283 -0
- package/dist/backlog/azure-devops-provider.js.map +1 -0
- package/dist/backlog/backlog-provider.d.ts +13 -0
- package/dist/backlog/backlog-provider.js +6 -0
- package/dist/backlog/backlog-provider.js.map +1 -0
- package/dist/backlog/backlog-provider.test.d.ts +1 -0
- package/dist/backlog/backlog-provider.test.js +426 -0
- package/dist/backlog/backlog-provider.test.js.map +1 -0
- package/dist/backlog/clickup-provider.d.ts +55 -0
- package/dist/backlog/clickup-provider.js +301 -0
- package/dist/backlog/clickup-provider.js.map +1 -0
- package/dist/backlog/clickup-provider.test.d.ts +1 -0
- package/dist/backlog/clickup-provider.test.js +426 -0
- package/dist/backlog/clickup-provider.test.js.map +1 -0
- package/dist/backlog/clickup-reference-scanner.d.ts +10 -0
- package/dist/backlog/clickup-reference-scanner.js +32 -0
- package/dist/backlog/clickup-reference-scanner.js.map +1 -0
- package/dist/backlog/clickup-reference-scanner.test.d.ts +1 -0
- package/dist/backlog/clickup-reference-scanner.test.js +92 -0
- package/dist/backlog/clickup-reference-scanner.test.js.map +1 -0
- package/dist/backlog/code-linker.d.ts +63 -0
- package/dist/backlog/code-linker.js +90 -0
- package/dist/backlog/code-linker.js.map +1 -0
- package/dist/backlog/code-linker.test.d.ts +1 -0
- package/dist/backlog/code-linker.test.js +325 -0
- package/dist/backlog/code-linker.test.js.map +1 -0
- package/dist/backlog/index.d.ts +14 -0
- package/dist/backlog/index.js +8 -0
- package/dist/backlog/index.js.map +1 -0
- package/dist/backlog/jira-provider.d.ts +60 -0
- package/dist/backlog/jira-provider.js +272 -0
- package/dist/backlog/jira-provider.js.map +1 -0
- package/dist/backlog/jira-provider.test.d.ts +1 -0
- package/dist/backlog/jira-provider.test.js +449 -0
- package/dist/backlog/jira-provider.test.js.map +1 -0
- package/dist/backlog/jira-reference-scanner.d.ts +11 -0
- package/dist/backlog/jira-reference-scanner.js +26 -0
- package/dist/backlog/jira-reference-scanner.js.map +1 -0
- package/dist/backlog/jira-reference-scanner.test.d.ts +1 -0
- package/dist/backlog/jira-reference-scanner.test.js +127 -0
- package/dist/backlog/jira-reference-scanner.test.js.map +1 -0
- package/dist/backlog/types.d.ts +22 -0
- package/dist/backlog/types.js +1 -0
- package/dist/backlog/types.js.map +1 -0
- package/dist/chunker/ast-chunker.d.ts +45 -0
- package/dist/chunker/ast-chunker.js +292 -0
- package/dist/chunker/ast-chunker.js.map +1 -0
- package/dist/chunker/ast-chunker.test.d.ts +1 -0
- package/dist/chunker/ast-chunker.test.js +391 -0
- package/dist/chunker/ast-chunker.test.js.map +1 -0
- package/dist/chunker/chunker.d.ts +8 -0
- package/dist/chunker/chunker.js +1 -0
- package/dist/chunker/chunker.js.map +1 -0
- package/dist/chunker/index.d.ts +3 -0
- package/dist/chunker/index.js +2 -0
- package/dist/chunker/index.js.map +1 -0
- package/dist/config/config-parser.d.ts +15 -0
- package/dist/config/config-parser.js +283 -0
- package/dist/config/config-parser.js.map +1 -0
- package/dist/config/config-parser.test.d.ts +1 -0
- package/dist/config/config-parser.test.js +699 -0
- package/dist/config/config-parser.test.js.map +1 -0
- package/dist/docs/confluence-provider.d.ts +121 -0
- package/dist/docs/confluence-provider.js +459 -0
- package/dist/docs/confluence-provider.js.map +1 -0
- package/dist/docs/confluence-provider.test.d.ts +1 -0
- package/dist/docs/confluence-provider.test.js +765 -0
- package/dist/docs/confluence-provider.test.js.map +1 -0
- package/dist/docs/index.d.ts +4 -0
- package/dist/docs/index.js +2 -0
- package/dist/docs/index.js.map +1 -0
- package/dist/docs/sharepoint-provider.d.ts +150 -0
- package/dist/docs/sharepoint-provider.js +637 -0
- package/dist/docs/sharepoint-provider.js.map +1 -0
- package/dist/docs/sharepoint-provider.test.d.ts +1 -0
- package/dist/docs/sharepoint-provider.test.js +873 -0
- package/dist/docs/sharepoint-provider.test.js.map +1 -0
- package/dist/embedding/bm25-index.d.ts +12 -0
- package/dist/embedding/bm25-index.js +89 -0
- package/dist/embedding/bm25-index.js.map +1 -0
- package/dist/embedding/bm25-index.test.d.ts +1 -0
- package/dist/embedding/bm25-index.test.js +289 -0
- package/dist/embedding/bm25-index.test.js.map +1 -0
- package/dist/embedding/hybrid-search.d.ts +13 -0
- package/dist/embedding/hybrid-search.js +124 -0
- package/dist/embedding/hybrid-search.js.map +1 -0
- package/dist/embedding/hybrid-search.test.d.ts +1 -0
- package/dist/embedding/hybrid-search.test.js +266 -0
- package/dist/embedding/hybrid-search.test.js.map +1 -0
- package/dist/embedding/index.d.ts +11 -0
- package/dist/embedding/index.js +7 -0
- package/dist/embedding/index.js.map +1 -0
- package/dist/embedding/lancedb-store.d.ts +21 -0
- package/dist/embedding/lancedb-store.js +172 -0
- package/dist/embedding/lancedb-store.js.map +1 -0
- package/dist/embedding/lancedb-store.test.d.ts +1 -0
- package/dist/embedding/lancedb-store.test.js +268 -0
- package/dist/embedding/lancedb-store.test.js.map +1 -0
- package/dist/embedding/model-lifecycle-manager.d.ts +83 -0
- package/dist/embedding/model-lifecycle-manager.js +419 -0
- package/dist/embedding/model-lifecycle-manager.js.map +1 -0
- package/dist/embedding/model-lifecycle-manager.test.d.ts +1 -0
- package/dist/embedding/model-lifecycle-manager.test.js +642 -0
- package/dist/embedding/model-lifecycle-manager.test.js.map +1 -0
- package/dist/embedding/ollama-embedding-provider.d.ts +16 -0
- package/dist/embedding/ollama-embedding-provider.js +74 -0
- package/dist/embedding/ollama-embedding-provider.js.map +1 -0
- package/dist/embedding/ollama-embedding-provider.test.d.ts +1 -0
- package/dist/embedding/ollama-embedding-provider.test.js +198 -0
- package/dist/embedding/ollama-embedding-provider.test.js.map +1 -0
- package/dist/embedding/openai-compatible-embedding-provider.d.ts +19 -0
- package/dist/embedding/openai-compatible-embedding-provider.js +108 -0
- package/dist/embedding/openai-compatible-embedding-provider.js.map +1 -0
- package/dist/embedding/openai-compatible-embedding-provider.test.d.ts +1 -0
- package/dist/embedding/openai-compatible-embedding-provider.test.js +456 -0
- package/dist/embedding/openai-compatible-embedding-provider.test.js.map +1 -0
- package/dist/embedding/qdrant-store.d.ts +28 -0
- package/dist/embedding/qdrant-store.js +174 -0
- package/dist/embedding/qdrant-store.js.map +1 -0
- package/dist/embedding/qdrant-store.test.d.ts +1 -0
- package/dist/embedding/qdrant-store.test.js +359 -0
- package/dist/embedding/qdrant-store.test.js.map +1 -0
- package/dist/enrichment/index.d.ts +4 -0
- package/dist/enrichment/index.js +2 -0
- package/dist/enrichment/index.js.map +1 -0
- package/dist/enrichment/nl-enricher.d.ts +16 -0
- package/dist/enrichment/nl-enricher.js +47 -0
- package/dist/enrichment/nl-enricher.js.map +1 -0
- package/dist/enrichment/nl-enricher.test.d.ts +1 -0
- package/dist/enrichment/nl-enricher.test.js +154 -0
- package/dist/enrichment/nl-enricher.test.js.map +1 -0
- package/dist/enrichment/ollama-client.d.ts +18 -0
- package/dist/enrichment/ollama-client.js +55 -0
- package/dist/enrichment/ollama-client.js.map +1 -0
- package/dist/enrichment/ollama-client.test.d.ts +1 -0
- package/dist/enrichment/ollama-client.test.js +129 -0
- package/dist/enrichment/ollama-client.test.js.map +1 -0
- package/dist/git/git-client.d.ts +22 -0
- package/dist/git/git-client.js +6 -0
- package/dist/git/git-client.js.map +1 -0
- package/dist/git/git-client.test.d.ts +1 -0
- package/dist/git/git-client.test.js +200 -0
- package/dist/git/git-client.test.js.map +1 -0
- package/dist/git/ignore-filter.d.ts +2 -0
- package/dist/git/ignore-filter.js +31 -0
- package/dist/git/ignore-filter.js.map +1 -0
- package/dist/git/ignore-filter.test.d.ts +1 -0
- package/dist/git/ignore-filter.test.js +87 -0
- package/dist/git/ignore-filter.test.js.map +1 -0
- package/dist/git/index.d.ts +4 -0
- package/dist/git/index.js +3 -0
- package/dist/git/index.js.map +1 -0
- package/dist/git/simple-git-client.d.ts +12 -0
- package/dist/git/simple-git-client.js +138 -0
- package/dist/git/simple-git-client.js.map +1 -0
- package/dist/graph/cross-repo-resolver.d.ts +50 -0
- package/dist/graph/cross-repo-resolver.js +315 -0
- package/dist/graph/cross-repo-resolver.js.map +1 -0
- package/dist/graph/cross-repo-resolver.test.d.ts +1 -0
- package/dist/graph/cross-repo-resolver.test.js +548 -0
- package/dist/graph/cross-repo-resolver.test.js.map +1 -0
- package/dist/graph/dependency-graph.d.ts +44 -0
- package/dist/graph/dependency-graph.js +108 -0
- package/dist/graph/dependency-graph.js.map +1 -0
- package/dist/graph/dependency-graph.test.d.ts +1 -0
- package/dist/graph/dependency-graph.test.js +276 -0
- package/dist/graph/dependency-graph.test.js.map +1 -0
- package/dist/graph/graph-builder.d.ts +11 -0
- package/dist/graph/graph-builder.js +113 -0
- package/dist/graph/graph-builder.js.map +1 -0
- package/dist/graph/graph-builder.test.d.ts +1 -0
- package/dist/graph/graph-builder.test.js +178 -0
- package/dist/graph/graph-builder.test.js.map +1 -0
- package/dist/graph/import-resolver.d.ts +11 -0
- package/dist/graph/import-resolver.js +199 -0
- package/dist/graph/import-resolver.js.map +1 -0
- package/dist/graph/import-resolver.test.d.ts +1 -0
- package/dist/graph/import-resolver.test.js +282 -0
- package/dist/graph/import-resolver.test.js.map +1 -0
- package/dist/graph/index.d.ts +7 -0
- package/dist/graph/index.js +4 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer/file-scanner.d.ts +34 -0
- package/dist/indexer/file-scanner.js +69 -0
- package/dist/indexer/file-scanner.js.map +1 -0
- package/dist/indexer/file-scanner.test.d.ts +1 -0
- package/dist/indexer/file-scanner.test.js +110 -0
- package/dist/indexer/file-scanner.test.js.map +1 -0
- package/dist/indexer/file-watcher.d.ts +79 -0
- package/dist/indexer/file-watcher.js +148 -0
- package/dist/indexer/incremental-indexer.d.ts +67 -0
- package/dist/indexer/incremental-indexer.js +142 -0
- package/dist/indexer/incremental-indexer.js.map +1 -0
- package/dist/indexer/incremental-indexer.test.d.ts +1 -0
- package/dist/indexer/incremental-indexer.test.js +266 -0
- package/dist/indexer/incremental-indexer.test.js.map +1 -0
- package/dist/indexer/index-check.d.ts +22 -0
- package/dist/indexer/index-check.js +74 -0
- package/dist/indexer/index-check.js.map +1 -0
- package/dist/indexer/index-check.test.d.ts +1 -0
- package/dist/indexer/index-check.test.js +100 -0
- package/dist/indexer/index-check.test.js.map +1 -0
- package/dist/indexer/index-state.d.ts +61 -0
- package/dist/indexer/index-state.js +82 -0
- package/dist/indexer/index-state.js.map +1 -0
- package/dist/indexer/index-state.test.d.ts +1 -0
- package/dist/indexer/index-state.test.js +140 -0
- package/dist/indexer/index-state.test.js.map +1 -0
- package/dist/indexer/index.d.ts +12 -0
- package/dist/indexer/index.js +6 -0
- package/dist/indexer/index.js.map +1 -0
- package/dist/indexer/multi-repo-indexer.d.ts +63 -0
- package/dist/indexer/multi-repo-indexer.js +144 -0
- package/dist/indexer/multi-repo-indexer.js.map +1 -0
- package/dist/indexer/multi-repo-indexer.test.d.ts +1 -0
- package/dist/indexer/multi-repo-indexer.test.js +238 -0
- package/dist/indexer/multi-repo-indexer.test.js.map +1 -0
- package/dist/parser/index.d.ts +4 -0
- package/dist/parser/index.js +3 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/language-registry.d.ts +46 -0
- package/dist/parser/language-registry.js +219 -0
- package/dist/parser/language-registry.js.map +1 -0
- package/dist/parser/language-registry.test.d.ts +1 -0
- package/dist/parser/language-registry.test.js +225 -0
- package/dist/parser/language-registry.test.js.map +1 -0
- package/dist/parser/markdown-parser.d.ts +124 -0
- package/dist/parser/markdown-parser.js +487 -0
- package/dist/parser/markdown-parser.js.map +1 -0
- package/dist/parser/markdown-parser.test.d.ts +1 -0
- package/dist/parser/markdown-parser.test.js +600 -0
- package/dist/parser/markdown-parser.test.js.map +1 -0
- package/dist/parser/tree-sitter-parser.d.ts +32 -0
- package/dist/parser/tree-sitter-parser.js +146 -0
- package/dist/parser/tree-sitter-parser.js.map +1 -0
- package/dist/retrieval/context-expander.d.ts +51 -0
- package/dist/retrieval/context-expander.js +218 -0
- package/dist/retrieval/context-expander.js.map +1 -0
- package/dist/retrieval/context-expander.test.d.ts +1 -0
- package/dist/retrieval/context-expander.test.js +339 -0
- package/dist/retrieval/context-expander.test.js.map +1 -0
- package/dist/retrieval/cross-encoder-reranker.d.ts +16 -0
- package/dist/retrieval/cross-encoder-reranker.js +90 -0
- package/dist/retrieval/cross-encoder-reranker.js.map +1 -0
- package/dist/retrieval/cross-encoder-reranker.test.d.ts +1 -0
- package/dist/retrieval/cross-encoder-reranker.test.js +305 -0
- package/dist/retrieval/cross-encoder-reranker.test.js.map +1 -0
- package/dist/retrieval/index.d.ts +8 -0
- package/dist/retrieval/index.js +4 -0
- package/dist/retrieval/index.js.map +1 -0
- package/dist/retrieval/query-analyzer.d.ts +29 -0
- package/dist/retrieval/query-analyzer.js +238 -0
- package/dist/retrieval/query-analyzer.js.map +1 -0
- package/dist/retrieval/query-analyzer.test.d.ts +1 -0
- package/dist/retrieval/query-analyzer.test.js +236 -0
- package/dist/retrieval/query-analyzer.test.js.map +1 -0
- package/dist/retrieval/token-budget.d.ts +51 -0
- package/dist/retrieval/token-budget.js +141 -0
- package/dist/retrieval/token-budget.js.map +1 -0
- package/dist/retrieval/token-budget.test.d.ts +1 -0
- package/dist/retrieval/token-budget.test.js +404 -0
- package/dist/retrieval/token-budget.test.js.map +1 -0
- package/dist/storage/azure-blob-provider.d.ts +19 -0
- package/dist/storage/azure-blob-provider.js +199 -0
- package/dist/storage/azure-blob-provider.js.map +1 -0
- package/dist/storage/azure-blob-provider.test.d.ts +1 -0
- package/dist/storage/azure-blob-provider.test.js +250 -0
- package/dist/storage/azure-blob-provider.test.js.map +1 -0
- package/dist/storage/gcs-provider.d.ts +22 -0
- package/dist/storage/gcs-provider.js +241 -0
- package/dist/storage/gcs-provider.js.map +1 -0
- package/dist/storage/gcs-provider.test.d.ts +1 -0
- package/dist/storage/gcs-provider.test.js +299 -0
- package/dist/storage/gcs-provider.test.js.map +1 -0
- package/dist/storage/index.d.ts +5 -0
- package/dist/storage/index.js +4 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/s3-provider.d.ts +21 -0
- package/dist/storage/s3-provider.js +220 -0
- package/dist/storage/s3-provider.js.map +1 -0
- package/dist/storage/s3-provider.test.d.ts +1 -0
- package/dist/storage/s3-provider.test.js +329 -0
- package/dist/storage/s3-provider.test.js.map +1 -0
- package/dist/storage/types.d.ts +65 -0
- package/dist/storage/types.js +12 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/types/chunk.d.ts +32 -0
- package/dist/types/chunk.js +1 -0
- package/dist/types/chunk.js.map +1 -0
- package/dist/types/config.d.ts +71 -0
- package/dist/types/config.js +1 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/provider.d.ts +54 -0
- package/dist/types/provider.js +36 -0
- package/dist/types/provider.js.map +1 -0
- package/dist/types/search.d.ts +27 -0
- package/dist/types/search.js +1 -0
- package/dist/types/search.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { AuthError, ROLE_HIERARCHY } from './types.js';
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// AuthError
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
describe('AuthError', () => {
|
|
7
|
+
it('should have name set to AuthError', () => {
|
|
8
|
+
const error = new AuthError('something failed');
|
|
9
|
+
expect(error.name).toBe('AuthError');
|
|
10
|
+
});
|
|
11
|
+
it('should preserve the error message', () => {
|
|
12
|
+
const error = new AuthError('invalid token');
|
|
13
|
+
expect(error.message).toBe('invalid token');
|
|
14
|
+
});
|
|
15
|
+
it('should be an instance of Error', () => {
|
|
16
|
+
const error = new AuthError('test');
|
|
17
|
+
expect(error).toBeInstanceOf(Error);
|
|
18
|
+
});
|
|
19
|
+
it('should be an instance of AuthError', () => {
|
|
20
|
+
const error = new AuthError('test');
|
|
21
|
+
expect(error).toBeInstanceOf(AuthError);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
// ROLE_HIERARCHY
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
describe('ROLE_HIERARCHY', () => {
|
|
28
|
+
it('should contain all three roles', () => {
|
|
29
|
+
expect(ROLE_HIERARCHY).toHaveLength(3);
|
|
30
|
+
expect(ROLE_HIERARCHY).toContain('viewer');
|
|
31
|
+
expect(ROLE_HIERARCHY).toContain('developer');
|
|
32
|
+
expect(ROLE_HIERARCHY).toContain('admin');
|
|
33
|
+
});
|
|
34
|
+
it('should be ordered from lowest to highest privilege', () => {
|
|
35
|
+
expect(ROLE_HIERARCHY[0]).toBe('viewer');
|
|
36
|
+
expect(ROLE_HIERARCHY[1]).toBe('developer');
|
|
37
|
+
expect(ROLE_HIERARCHY[2]).toBe('admin');
|
|
38
|
+
});
|
|
39
|
+
it('should be readonly', () => {
|
|
40
|
+
// TypeScript enforces this, but verify at runtime
|
|
41
|
+
expect(Object.isFrozen(ROLE_HIERARCHY)).toBe(false); // `as const` doesn't freeze
|
|
42
|
+
expect(Array.isArray(ROLE_HIERARCHY)).toBe(true);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
// Type shape validation (compile-time + runtime)
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
describe('Type shapes', () => {
|
|
49
|
+
it('should accept valid Role values', () => {
|
|
50
|
+
const roles = ['admin', 'developer', 'viewer'];
|
|
51
|
+
expect(roles).toHaveLength(3);
|
|
52
|
+
});
|
|
53
|
+
it('should accept valid Action values', () => {
|
|
54
|
+
const actions = [
|
|
55
|
+
'search', 'context', 'status', 'explain', 'docs', 'index', 'configure',
|
|
56
|
+
];
|
|
57
|
+
expect(actions).toHaveLength(7);
|
|
58
|
+
});
|
|
59
|
+
it('should accept valid RepoAccessLevel values', () => {
|
|
60
|
+
const levels = ['read', 'write', 'admin'];
|
|
61
|
+
expect(levels).toHaveLength(3);
|
|
62
|
+
});
|
|
63
|
+
it('should create a valid RepoPermission', () => {
|
|
64
|
+
const perm = {
|
|
65
|
+
repoName: 'my-repo',
|
|
66
|
+
access: 'write',
|
|
67
|
+
};
|
|
68
|
+
expect(perm.repoName).toBe('my-repo');
|
|
69
|
+
expect(perm.access).toBe('write');
|
|
70
|
+
});
|
|
71
|
+
it('should create a valid User', () => {
|
|
72
|
+
const user = {
|
|
73
|
+
id: 'user-1',
|
|
74
|
+
email: 'user@example.com',
|
|
75
|
+
name: 'Test User',
|
|
76
|
+
roles: ['developer'],
|
|
77
|
+
allowedRepos: ['repo-a', 'repo-b'],
|
|
78
|
+
};
|
|
79
|
+
expect(user.id).toBe('user-1');
|
|
80
|
+
expect(user.roles).toContain('developer');
|
|
81
|
+
expect(user.allowedRepos).toHaveLength(2);
|
|
82
|
+
});
|
|
83
|
+
it('should create a valid AuthToken', () => {
|
|
84
|
+
const token = {
|
|
85
|
+
userId: 'user-1',
|
|
86
|
+
email: 'user@example.com',
|
|
87
|
+
roles: ['admin'],
|
|
88
|
+
exp: 1700000000,
|
|
89
|
+
iat: 1699996400,
|
|
90
|
+
};
|
|
91
|
+
expect(token.exp).toBeGreaterThan(token.iat);
|
|
92
|
+
});
|
|
93
|
+
it('should create a valid AuditEntry', () => {
|
|
94
|
+
const entry = {
|
|
95
|
+
timestamp: new Date(),
|
|
96
|
+
userId: 'user-1',
|
|
97
|
+
action: 'search',
|
|
98
|
+
resource: 'repo-a',
|
|
99
|
+
details: 'searched for foo',
|
|
100
|
+
ip: '192.168.1.1',
|
|
101
|
+
};
|
|
102
|
+
expect(entry.timestamp).toBeInstanceOf(Date);
|
|
103
|
+
expect(typeof entry.userId).toBe('string');
|
|
104
|
+
});
|
|
105
|
+
it('should create a valid AuditQuery with all optional fields', () => {
|
|
106
|
+
const query = {
|
|
107
|
+
userId: 'user-1',
|
|
108
|
+
action: 'search',
|
|
109
|
+
startDate: new Date('2026-01-01'),
|
|
110
|
+
endDate: new Date('2026-12-31'),
|
|
111
|
+
limit: 100,
|
|
112
|
+
};
|
|
113
|
+
expect(query.limit).toBe(100);
|
|
114
|
+
});
|
|
115
|
+
it('should create a valid AuditQuery with no fields', () => {
|
|
116
|
+
const query = {};
|
|
117
|
+
expect(query.userId).toBeUndefined();
|
|
118
|
+
expect(query.action).toBeUndefined();
|
|
119
|
+
});
|
|
120
|
+
it('should create a valid OIDCConfig', () => {
|
|
121
|
+
const config = {
|
|
122
|
+
issuerUrl: 'https://idp.example.com',
|
|
123
|
+
clientId: 'client-id',
|
|
124
|
+
clientSecret: 'secret',
|
|
125
|
+
audience: 'api',
|
|
126
|
+
roleMapping: {
|
|
127
|
+
'admin-group': 'admin',
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
expect(config.issuerUrl).toBe('https://idp.example.com');
|
|
131
|
+
expect(config.roleMapping?.['admin-group']).toBe('admin');
|
|
132
|
+
});
|
|
133
|
+
it('should create a valid SAMLConfig', () => {
|
|
134
|
+
const config = {
|
|
135
|
+
idpMetadataUrl: 'https://idp.example.com/metadata',
|
|
136
|
+
spEntityId: 'https://sp.example.com',
|
|
137
|
+
spAcsUrl: 'https://sp.example.com/acs',
|
|
138
|
+
certificatePem: '-----BEGIN CERTIFICATE-----\nMIIBxTCCA...\n-----END CERTIFICATE-----',
|
|
139
|
+
roleMapping: {
|
|
140
|
+
admins: 'admin',
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
expect(config.spEntityId).toBe('https://sp.example.com');
|
|
144
|
+
expect(config.roleMapping?.['admins']).toBe('admin');
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
//# sourceMappingURL=types.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.test.js","sourceRoot":"","sources":["../../src/auth/types.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scans source code content for Azure DevOps AB#XXXX work item references.
|
|
3
|
+
*
|
|
4
|
+
* Extracts all `AB#<number>` patterns found in the given content string
|
|
5
|
+
* and returns an array of the numeric ID parts as strings.
|
|
6
|
+
*
|
|
7
|
+
* @param content - The source code or text content to scan
|
|
8
|
+
* @returns An array of work item ID strings (e.g., ["123", "456"])
|
|
9
|
+
*/
|
|
10
|
+
export declare function scanForABReferences(content: string): string[];
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scans source code content for Azure DevOps AB#XXXX work item references.
|
|
3
|
+
*
|
|
4
|
+
* Extracts all `AB#<number>` patterns found in the given content string
|
|
5
|
+
* and returns an array of the numeric ID parts as strings.
|
|
6
|
+
*
|
|
7
|
+
* @param content - The source code or text content to scan
|
|
8
|
+
* @returns An array of work item ID strings (e.g., ["123", "456"])
|
|
9
|
+
*/
|
|
10
|
+
export function scanForABReferences(content) {
|
|
11
|
+
const pattern = /AB#(\d+)/g;
|
|
12
|
+
const ids = [];
|
|
13
|
+
let match;
|
|
14
|
+
while ((match = pattern.exec(content)) !== null) {
|
|
15
|
+
const id = match[1];
|
|
16
|
+
// Avoid duplicates while preserving first-occurrence order
|
|
17
|
+
if (!ids.includes(id)) {
|
|
18
|
+
ids.push(id);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return ids;
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ab-reference-scanner.js","sourceRoot":"","sources":["../../src/backlog/ab-reference-scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,MAAM,OAAO,GAAG,WAAW,CAAC;IAC5B,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,KAA6B,CAAC;IAElC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAChD,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACrB,2DAA2D;QAC3D,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YACtB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { scanForABReferences } from './ab-reference-scanner.js';
|
|
3
|
+
describe('scanForABReferences', () => {
|
|
4
|
+
it('should extract a single AB# reference', () => {
|
|
5
|
+
const result = scanForABReferences('Fixes AB#123');
|
|
6
|
+
expect(result).toEqual(['123']);
|
|
7
|
+
});
|
|
8
|
+
it('should extract multiple AB# references', () => {
|
|
9
|
+
const result = scanForABReferences('Related to AB#123 and AB#456');
|
|
10
|
+
expect(result).toEqual(['123', '456']);
|
|
11
|
+
});
|
|
12
|
+
it('should extract multiple references on the same line', () => {
|
|
13
|
+
const result = scanForABReferences('AB#10 AB#20 AB#30');
|
|
14
|
+
expect(result).toEqual(['10', '20', '30']);
|
|
15
|
+
});
|
|
16
|
+
it('should return empty array when no references found', () => {
|
|
17
|
+
const result = scanForABReferences('No work item references here');
|
|
18
|
+
expect(result).toEqual([]);
|
|
19
|
+
});
|
|
20
|
+
it('should handle references in code comments (single-line)', () => {
|
|
21
|
+
const code = `
|
|
22
|
+
// AB#100: Fix authentication bug
|
|
23
|
+
function login() { return true; }
|
|
24
|
+
`;
|
|
25
|
+
const result = scanForABReferences(code);
|
|
26
|
+
expect(result).toEqual(['100']);
|
|
27
|
+
});
|
|
28
|
+
it('should handle references in block comments', () => {
|
|
29
|
+
const code = `
|
|
30
|
+
/*
|
|
31
|
+
* Implements AB#200 and AB#201
|
|
32
|
+
*/
|
|
33
|
+
export class AuthService {}
|
|
34
|
+
`;
|
|
35
|
+
const result = scanForABReferences(code);
|
|
36
|
+
expect(result).toEqual(['200', '201']);
|
|
37
|
+
});
|
|
38
|
+
it('should handle references in string literals', () => {
|
|
39
|
+
const code = `const ref = "AB#999";`;
|
|
40
|
+
const result = scanForABReferences(code);
|
|
41
|
+
expect(result).toEqual(['999']);
|
|
42
|
+
});
|
|
43
|
+
it('should deduplicate repeated references', () => {
|
|
44
|
+
const content = 'AB#42 mentioned first, then AB#42 again';
|
|
45
|
+
const result = scanForABReferences(content);
|
|
46
|
+
expect(result).toEqual(['42']);
|
|
47
|
+
});
|
|
48
|
+
it('should not match AB# without a number', () => {
|
|
49
|
+
const result = scanForABReferences('AB# is not valid');
|
|
50
|
+
expect(result).toEqual([]);
|
|
51
|
+
});
|
|
52
|
+
it('should match AB#0 as a valid reference', () => {
|
|
53
|
+
const result = scanForABReferences('AB#0 is technically valid');
|
|
54
|
+
expect(result).toEqual(['0']);
|
|
55
|
+
});
|
|
56
|
+
it('should handle large IDs', () => {
|
|
57
|
+
const result = scanForABReferences('AB#1234567890');
|
|
58
|
+
expect(result).toEqual(['1234567890']);
|
|
59
|
+
});
|
|
60
|
+
it('should extract references across multiple lines', () => {
|
|
61
|
+
const content = `
|
|
62
|
+
Line 1: AB#1
|
|
63
|
+
Line 2: nothing here
|
|
64
|
+
Line 3: AB#2 and AB#3
|
|
65
|
+
Line 4: also AB#1 (duplicate)
|
|
66
|
+
`;
|
|
67
|
+
const result = scanForABReferences(content);
|
|
68
|
+
expect(result).toEqual(['1', '2', '3']);
|
|
69
|
+
});
|
|
70
|
+
it('should handle empty string', () => {
|
|
71
|
+
const result = scanForABReferences('');
|
|
72
|
+
expect(result).toEqual([]);
|
|
73
|
+
});
|
|
74
|
+
it('should not match lowercase ab#123', () => {
|
|
75
|
+
const result = scanForABReferences('ab#123 is not valid');
|
|
76
|
+
expect(result).toEqual([]);
|
|
77
|
+
});
|
|
78
|
+
it('should handle AB# adjacent to other text', () => {
|
|
79
|
+
const result = scanForABReferences('seeAB#55end');
|
|
80
|
+
expect(result).toEqual(['55']);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=ab-reference-scanner.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ab-reference-scanner.test.js","sourceRoot":"","sources":["../../src/backlog/ab-reference-scanner.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,MAAM,GAAG,mBAAmB,CAAC,8BAA8B,CAAC,CAAC;QACnE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,MAAM,GAAG,mBAAmB,CAAC,mBAAmB,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,MAAM,GAAG,mBAAmB,CAAC,8BAA8B,CAAC,CAAC;QACnE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,IAAI,GAAG;;;KAGZ,CAAC;QACF,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,IAAI,GAAG;;;;;KAKZ,CAAC;QACF,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,IAAI,GAAG,uBAAuB,CAAC;QACrC,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,OAAO,GAAG,yCAAyC,CAAC;QAC1D,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,MAAM,GAAG,mBAAmB,CAAC,2BAA2B,CAAC,CAAC;QAChE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,MAAM,GAAG,mBAAmB,CAAC,eAAe,CAAC,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,OAAO,GAAG;;;;;KAKf,CAAC;QACF,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,MAAM,GAAG,mBAAmB,CAAC,qBAAqB,CAAC,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,MAAM,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { type Result } from 'neverthrow';
|
|
2
|
+
import { BacklogError } from './backlog-provider.js';
|
|
3
|
+
import type { BacklogProvider } from './backlog-provider.js';
|
|
4
|
+
import type { BacklogItem, BacklogQuery } from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Configuration for the Azure DevOps backlog provider.
|
|
7
|
+
*/
|
|
8
|
+
export interface AzureDevOpsConfig {
|
|
9
|
+
organization: string;
|
|
10
|
+
project: string;
|
|
11
|
+
pat: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Azure DevOps backlog provider.
|
|
15
|
+
*
|
|
16
|
+
* Implements the BacklogProvider interface to index and query Azure DevOps
|
|
17
|
+
* work items (Epics, User Stories, Tasks, Bugs, Features) via the ADO REST API.
|
|
18
|
+
*/
|
|
19
|
+
export declare class AzureDevOpsProvider implements BacklogProvider {
|
|
20
|
+
readonly name = "azure-devops";
|
|
21
|
+
private config;
|
|
22
|
+
private baseUrl;
|
|
23
|
+
private authHeader;
|
|
24
|
+
/**
|
|
25
|
+
* Validates the config and tests the connection by fetching the project info.
|
|
26
|
+
*/
|
|
27
|
+
initialize(config: Record<string, unknown>): Promise<Result<void, BacklogError>>;
|
|
28
|
+
/**
|
|
29
|
+
* Lists work items matching the given query using WIQL.
|
|
30
|
+
*/
|
|
31
|
+
getItems(query: BacklogQuery): Promise<Result<BacklogItem[], BacklogError>>;
|
|
32
|
+
/**
|
|
33
|
+
* Fetches a single work item by its numeric ID.
|
|
34
|
+
*/
|
|
35
|
+
getItem(id: string): Promise<Result<BacklogItem, BacklogError>>;
|
|
36
|
+
/**
|
|
37
|
+
* Searches work items by title and description using WIQL.
|
|
38
|
+
*/
|
|
39
|
+
searchItems(text: string, limit?: number): Promise<Result<BacklogItem[], BacklogError>>;
|
|
40
|
+
/**
|
|
41
|
+
* Returns code file paths linked to the specified work item via relations
|
|
42
|
+
* (commits, pull requests, versioned items, etc.).
|
|
43
|
+
*/
|
|
44
|
+
getLinkedCode(itemId: string): Promise<Result<string[], BacklogError>>;
|
|
45
|
+
private ensureInitialized;
|
|
46
|
+
/**
|
|
47
|
+
* Executes a WIQL query and fetches the resulting work items in a batch.
|
|
48
|
+
*/
|
|
49
|
+
private executeWiqlAndFetchItems;
|
|
50
|
+
/**
|
|
51
|
+
* Maps a raw Azure DevOps work item to a BacklogItem.
|
|
52
|
+
*/
|
|
53
|
+
private mapWorkItem;
|
|
54
|
+
/**
|
|
55
|
+
* Extracts file paths from work item relations that point to code
|
|
56
|
+
* (commits, versioned items, pull requests).
|
|
57
|
+
*/
|
|
58
|
+
private extractCodePaths;
|
|
59
|
+
}
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
import { ok, err } from 'neverthrow';
|
|
2
|
+
import { BacklogError } from './backlog-provider.js';
|
|
3
|
+
/**
|
|
4
|
+
* Maps Azure DevOps work item type names to BacklogItemType values.
|
|
5
|
+
*/
|
|
6
|
+
const ADO_TYPE_MAP = {
|
|
7
|
+
Epic: 'epic',
|
|
8
|
+
'User Story': 'story',
|
|
9
|
+
Task: 'task',
|
|
10
|
+
Bug: 'bug',
|
|
11
|
+
Feature: 'feature',
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Maps BacklogItemType values back to Azure DevOps work item type names.
|
|
15
|
+
*/
|
|
16
|
+
const BACKLOG_TYPE_TO_ADO = {
|
|
17
|
+
epic: 'Epic',
|
|
18
|
+
story: 'User Story',
|
|
19
|
+
task: 'Task',
|
|
20
|
+
bug: 'Bug',
|
|
21
|
+
feature: 'Feature',
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Azure DevOps backlog provider.
|
|
25
|
+
*
|
|
26
|
+
* Implements the BacklogProvider interface to index and query Azure DevOps
|
|
27
|
+
* work items (Epics, User Stories, Tasks, Bugs, Features) via the ADO REST API.
|
|
28
|
+
*/
|
|
29
|
+
export class AzureDevOpsProvider {
|
|
30
|
+
name = 'azure-devops';
|
|
31
|
+
config = null;
|
|
32
|
+
baseUrl = '';
|
|
33
|
+
authHeader = '';
|
|
34
|
+
/**
|
|
35
|
+
* Validates the config and tests the connection by fetching the project info.
|
|
36
|
+
*/
|
|
37
|
+
async initialize(config) {
|
|
38
|
+
const { organization, project, pat } = config;
|
|
39
|
+
if (!organization || typeof organization !== 'string') {
|
|
40
|
+
return err(new BacklogError('Azure DevOps config missing required field: organization'));
|
|
41
|
+
}
|
|
42
|
+
if (!project || typeof project !== 'string') {
|
|
43
|
+
return err(new BacklogError('Azure DevOps config missing required field: project'));
|
|
44
|
+
}
|
|
45
|
+
if (!pat || typeof pat !== 'string') {
|
|
46
|
+
return err(new BacklogError('Azure DevOps config missing required field: pat'));
|
|
47
|
+
}
|
|
48
|
+
this.config = { organization, project, pat };
|
|
49
|
+
this.baseUrl = `https://dev.azure.com/${encodeURIComponent(organization)}/${encodeURIComponent(project)}`;
|
|
50
|
+
this.authHeader = `Basic ${btoa(`:${pat}`)}`;
|
|
51
|
+
// Test connection by fetching project info
|
|
52
|
+
try {
|
|
53
|
+
const response = await fetch(`https://dev.azure.com/${encodeURIComponent(organization)}/_apis/projects/${encodeURIComponent(project)}?api-version=7.1`, {
|
|
54
|
+
headers: {
|
|
55
|
+
Authorization: this.authHeader,
|
|
56
|
+
'Content-Type': 'application/json',
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
if (!response.ok) {
|
|
60
|
+
return err(new BacklogError(`Azure DevOps connection failed: ${response.status} ${response.statusText}`));
|
|
61
|
+
}
|
|
62
|
+
return ok(undefined);
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
66
|
+
return err(new BacklogError(`Azure DevOps connection failed: ${message}`));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Lists work items matching the given query using WIQL.
|
|
71
|
+
*/
|
|
72
|
+
async getItems(query) {
|
|
73
|
+
this.ensureInitialized();
|
|
74
|
+
const conditions = [];
|
|
75
|
+
if (query.types && query.types.length > 0) {
|
|
76
|
+
const adoTypes = query.types
|
|
77
|
+
.map((t) => BACKLOG_TYPE_TO_ADO[t])
|
|
78
|
+
.filter(Boolean)
|
|
79
|
+
.map((t) => `'${t}'`);
|
|
80
|
+
if (adoTypes.length > 0) {
|
|
81
|
+
conditions.push(`[System.WorkItemType] IN (${adoTypes.join(', ')})`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (query.states && query.states.length > 0) {
|
|
85
|
+
const stateValues = query.states.map((s) => `'${s}'`);
|
|
86
|
+
conditions.push(`[System.State] IN (${stateValues.join(', ')})`);
|
|
87
|
+
}
|
|
88
|
+
if (query.assignedTo) {
|
|
89
|
+
conditions.push(`[System.AssignedTo] = '${query.assignedTo}'`);
|
|
90
|
+
}
|
|
91
|
+
if (query.tags && query.tags.length > 0) {
|
|
92
|
+
for (const tag of query.tags) {
|
|
93
|
+
conditions.push(`[System.Tags] CONTAINS '${tag}'`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (query.text) {
|
|
97
|
+
conditions.push(`[System.Title] CONTAINS '${query.text}'`);
|
|
98
|
+
}
|
|
99
|
+
const whereClause = conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : '';
|
|
100
|
+
const wiql = `SELECT [System.Id] FROM WorkItems${whereClause} ORDER BY [System.ChangedDate] DESC`;
|
|
101
|
+
return this.executeWiqlAndFetchItems(wiql, query.limit);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Fetches a single work item by its numeric ID.
|
|
105
|
+
*/
|
|
106
|
+
async getItem(id) {
|
|
107
|
+
this.ensureInitialized();
|
|
108
|
+
try {
|
|
109
|
+
const response = await fetch(`${this.baseUrl}/_apis/wit/workitems/${encodeURIComponent(id)}?$expand=relations&api-version=7.1`, {
|
|
110
|
+
headers: {
|
|
111
|
+
Authorization: this.authHeader,
|
|
112
|
+
'Content-Type': 'application/json',
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
if (!response.ok) {
|
|
116
|
+
if (response.status === 404) {
|
|
117
|
+
return err(new BacklogError(`Work item not found: ${id}`));
|
|
118
|
+
}
|
|
119
|
+
return err(new BacklogError(`Failed to fetch work item ${id}: ${response.status} ${response.statusText}`));
|
|
120
|
+
}
|
|
121
|
+
const workItem = (await response.json());
|
|
122
|
+
return ok(this.mapWorkItem(workItem));
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
126
|
+
return err(new BacklogError(`Failed to fetch work item ${id}: ${message}`));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Searches work items by title and description using WIQL.
|
|
131
|
+
*/
|
|
132
|
+
async searchItems(text, limit) {
|
|
133
|
+
this.ensureInitialized();
|
|
134
|
+
const wiql = `SELECT [System.Id] FROM WorkItems WHERE [System.Title] CONTAINS '${text}' OR [System.Description] CONTAINS '${text}' ORDER BY [System.ChangedDate] DESC`;
|
|
135
|
+
return this.executeWiqlAndFetchItems(wiql, limit);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Returns code file paths linked to the specified work item via relations
|
|
139
|
+
* (commits, pull requests, versioned items, etc.).
|
|
140
|
+
*/
|
|
141
|
+
async getLinkedCode(itemId) {
|
|
142
|
+
this.ensureInitialized();
|
|
143
|
+
try {
|
|
144
|
+
const response = await fetch(`${this.baseUrl}/_apis/wit/workitems/${encodeURIComponent(itemId)}?$expand=relations&api-version=7.1`, {
|
|
145
|
+
headers: {
|
|
146
|
+
Authorization: this.authHeader,
|
|
147
|
+
'Content-Type': 'application/json',
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
if (!response.ok) {
|
|
151
|
+
if (response.status === 404) {
|
|
152
|
+
return err(new BacklogError(`Work item not found: ${itemId}`));
|
|
153
|
+
}
|
|
154
|
+
return err(new BacklogError(`Failed to fetch work item ${itemId}: ${response.status} ${response.statusText}`));
|
|
155
|
+
}
|
|
156
|
+
const workItem = (await response.json());
|
|
157
|
+
const codePaths = this.extractCodePaths(workItem);
|
|
158
|
+
return ok(codePaths);
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
162
|
+
return err(new BacklogError(`Failed to fetch linked code for ${itemId}: ${message}`));
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// ---------------------------------------------------------------------------
|
|
166
|
+
// Private helpers
|
|
167
|
+
// ---------------------------------------------------------------------------
|
|
168
|
+
ensureInitialized() {
|
|
169
|
+
if (!this.config) {
|
|
170
|
+
throw new BacklogError('AzureDevOpsProvider has not been initialized. Call initialize() first.');
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Executes a WIQL query and fetches the resulting work items in a batch.
|
|
175
|
+
*/
|
|
176
|
+
async executeWiqlAndFetchItems(wiql, limit) {
|
|
177
|
+
try {
|
|
178
|
+
// Step 1: Execute WIQL query to get work item IDs
|
|
179
|
+
const wiqlResponse = await fetch(`${this.baseUrl}/_apis/wit/wiql?api-version=7.1`, {
|
|
180
|
+
method: 'POST',
|
|
181
|
+
headers: {
|
|
182
|
+
Authorization: this.authHeader,
|
|
183
|
+
'Content-Type': 'application/json',
|
|
184
|
+
},
|
|
185
|
+
body: JSON.stringify({ query: wiql }),
|
|
186
|
+
});
|
|
187
|
+
if (!wiqlResponse.ok) {
|
|
188
|
+
return err(new BacklogError(`WIQL query failed: ${wiqlResponse.status} ${wiqlResponse.statusText}`));
|
|
189
|
+
}
|
|
190
|
+
const wiqlResult = (await wiqlResponse.json());
|
|
191
|
+
let ids = wiqlResult.workItems.map((wi) => wi.id);
|
|
192
|
+
// Apply limit
|
|
193
|
+
if (limit !== undefined && limit > 0) {
|
|
194
|
+
ids = ids.slice(0, limit);
|
|
195
|
+
}
|
|
196
|
+
if (ids.length === 0) {
|
|
197
|
+
return ok([]);
|
|
198
|
+
}
|
|
199
|
+
// Step 2: Batch-fetch the work items by IDs
|
|
200
|
+
const batchResponse = await fetch(`${this.baseUrl}/_apis/wit/workitems?ids=${ids.join(',')}&$expand=relations&api-version=7.1`, {
|
|
201
|
+
headers: {
|
|
202
|
+
Authorization: this.authHeader,
|
|
203
|
+
'Content-Type': 'application/json',
|
|
204
|
+
},
|
|
205
|
+
});
|
|
206
|
+
if (!batchResponse.ok) {
|
|
207
|
+
return err(new BacklogError(`Batch fetch failed: ${batchResponse.status} ${batchResponse.statusText}`));
|
|
208
|
+
}
|
|
209
|
+
const batchResult = (await batchResponse.json());
|
|
210
|
+
const items = batchResult.value.map((wi) => this.mapWorkItem(wi));
|
|
211
|
+
return ok(items);
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
215
|
+
return err(new BacklogError(`Azure DevOps query failed: ${message}`));
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Maps a raw Azure DevOps work item to a BacklogItem.
|
|
220
|
+
*/
|
|
221
|
+
mapWorkItem(workItem) {
|
|
222
|
+
const fields = workItem.fields;
|
|
223
|
+
const typeName = fields['System.WorkItemType'] ?? '';
|
|
224
|
+
const mappedType = ADO_TYPE_MAP[typeName] ?? 'task';
|
|
225
|
+
const tags = fields['System.Tags']
|
|
226
|
+
?.split(';')
|
|
227
|
+
.map((t) => t.trim())
|
|
228
|
+
.filter(Boolean) ?? [];
|
|
229
|
+
const assignedTo = fields['System.AssignedTo']
|
|
230
|
+
?.displayName ??
|
|
231
|
+
fields['System.AssignedTo'] ??
|
|
232
|
+
undefined;
|
|
233
|
+
const organization = this.config.organization;
|
|
234
|
+
const project = this.config.project;
|
|
235
|
+
return {
|
|
236
|
+
id: String(workItem.id),
|
|
237
|
+
externalId: `AB#${workItem.id}`,
|
|
238
|
+
title: fields['System.Title'] ?? '',
|
|
239
|
+
description: fields['System.Description'] ?? '',
|
|
240
|
+
type: mappedType,
|
|
241
|
+
state: fields['System.State'] ?? '',
|
|
242
|
+
assignedTo,
|
|
243
|
+
tags,
|
|
244
|
+
linkedCodePaths: this.extractCodePaths(workItem),
|
|
245
|
+
url: `https://dev.azure.com/${encodeURIComponent(organization)}/${encodeURIComponent(project)}/_workitems/edit/${workItem.id}`,
|
|
246
|
+
metadata: {
|
|
247
|
+
iterationPath: fields['System.IterationPath'],
|
|
248
|
+
areaPath: fields['System.AreaPath'],
|
|
249
|
+
priority: fields['Microsoft.VSTS.Common.Priority'],
|
|
250
|
+
workItemType: typeName,
|
|
251
|
+
},
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Extracts file paths from work item relations that point to code
|
|
256
|
+
* (commits, versioned items, pull requests).
|
|
257
|
+
*/
|
|
258
|
+
extractCodePaths(workItem) {
|
|
259
|
+
if (!workItem.relations || workItem.relations.length === 0) {
|
|
260
|
+
return [];
|
|
261
|
+
}
|
|
262
|
+
const codeRelTypes = new Set([
|
|
263
|
+
'ArtifactLink',
|
|
264
|
+
'Fixed in Commit',
|
|
265
|
+
'Fixed in Changeset',
|
|
266
|
+
]);
|
|
267
|
+
const paths = [];
|
|
268
|
+
for (const relation of workItem.relations) {
|
|
269
|
+
// Include versioned item links and artifact links that point to code
|
|
270
|
+
if (codeRelTypes.has(relation.rel) ||
|
|
271
|
+
relation.url.includes('/git/') ||
|
|
272
|
+
relation.url.includes('/commits/') ||
|
|
273
|
+
relation.url.includes('/pullRequests/')) {
|
|
274
|
+
// Extract meaningful path from the relation URL
|
|
275
|
+
const name = relation.attributes?.['name'] ??
|
|
276
|
+
relation.attributes?.['comment'] ??
|
|
277
|
+
relation.url;
|
|
278
|
+
paths.push(name);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return paths;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"azure-devops-provider.js","sourceRoot":"","sources":["../../src/backlog/azure-devops-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,GAAG,EAAe,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAarD;;GAEG;AACH,MAAM,YAAY,GAAoC;IACpD,IAAI,EAAE,MAAM;IACZ,YAAY,EAAE,OAAO;IACrB,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;IACV,OAAO,EAAE,SAAS;CACnB,CAAC;AAEF;;GAEG;AACH,MAAM,mBAAmB,GAAoC;IAC3D,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,YAAY;IACnB,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;IACV,OAAO,EAAE,SAAS;CACnB,CAAC;AAoBF;;;;;GAKG;AACH,MAAM,OAAO,mBAAmB;IACrB,IAAI,GAAG,cAAc,CAAC;IAEvB,MAAM,GAA6B,IAAI,CAAC;IACxC,OAAO,GAAG,EAAE,CAAC;IACb,UAAU,GAAG,EAAE,CAAC;IAExB;;OAEG;IACH,KAAK,CAAC,UAAU,CACd,MAA+B;QAE/B,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,MAAgC,CAAC;QAExE,IAAI,CAAC,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;YACtD,OAAO,GAAG,CACR,IAAI,YAAY,CAAC,0DAA0D,CAAC,CAC7E,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC5C,OAAO,GAAG,CACR,IAAI,YAAY,CAAC,qDAAqD,CAAC,CACxE,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACpC,OAAO,GAAG,CACR,IAAI,YAAY,CAAC,iDAAiD,CAAC,CACpE,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;QAC7C,IAAI,CAAC,OAAO,GAAG,yBAAyB,kBAAkB,CAAC,YAAY,CAAC,IAAI,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1G,IAAI,CAAC,UAAU,GAAG,SAAS,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC;QAE7C,2CAA2C;QAC3C,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,yBAAyB,kBAAkB,CAAC,YAAY,CAAC,mBAAmB,kBAAkB,CAAC,OAAO,CAAC,kBAAkB,EACzH;gBACE,OAAO,EAAE;oBACP,aAAa,EAAE,IAAI,CAAC,UAAU;oBAC9B,cAAc,EAAE,kBAAkB;iBACnC;aACF,CACF,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO,GAAG,CACR,IAAI,YAAY,CACd,mCAAmC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAC5E,CACF,CAAC;YACJ,CAAC;YAED,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YAC3D,OAAO,GAAG,CACR,IAAI,YAAY,CAAC,mCAAmC,OAAO,EAAE,CAAC,CAC/D,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CACZ,KAAmB;QAEnB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK;iBACzB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;iBAClC,MAAM,CAAC,OAAO,CAAC;iBACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACxB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,UAAU,CAAC,IAAI,CACb,6BAA6B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACpD,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtD,UAAU,CAAC,IAAI,CACb,sBAAsB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAChD,CAAC;QACJ,CAAC;QAED,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACrB,UAAU,CAAC,IAAI,CACb,0BAA0B,KAAK,CAAC,UAAU,GAAG,CAC9C,CAAC;QACJ,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC7B,UAAU,CAAC,IAAI,CAAC,2BAA2B,GAAG,GAAG,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,UAAU,CAAC,IAAI,CACb,4BAA4B,KAAK,CAAC,IAAI,GAAG,CAC1C,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GACf,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,MAAM,IAAI,GAAG,oCAAoC,WAAW,qCAAqC,CAAC;QAElG,OAAO,IAAI,CAAC,wBAAwB,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,GAAG,IAAI,CAAC,OAAO,wBAAwB,kBAAkB,CAAC,EAAE,CAAC,oCAAoC,EACjG;gBACE,OAAO,EAAE;oBACP,aAAa,EAAE,IAAI,CAAC,UAAU;oBAC9B,cAAc,EAAE,kBAAkB;iBACnC;aACF,CACF,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBAC5B,OAAO,GAAG,CAAC,IAAI,YAAY,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC,CAAC;gBAC7D,CAAC;gBACD,OAAO,GAAG,CACR,IAAI,YAAY,CACd,6BAA6B,EAAE,KAAK,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAC7E,CACF,CAAC;YACJ,CAAC;YAED,MAAM,QAAQ,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAgB,CAAC;YACxD,OAAO,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YAC3D,OAAO,GAAG,CACR,IAAI,YAAY,CAAC,6BAA6B,EAAE,KAAK,OAAO,EAAE,CAAC,CAChE,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,IAAY,EACZ,KAAc;QAEd,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,MAAM,IAAI,GAAG,oEAAoE,IAAI,uCAAuC,IAAI,sCAAsC,CAAC;QAEvK,OAAO,IAAI,CAAC,wBAAwB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACpD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,aAAa,CACjB,MAAc;QAEd,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,GAAG,IAAI,CAAC,OAAO,wBAAwB,kBAAkB,CAAC,MAAM,CAAC,oCAAoC,EACrG;gBACE,OAAO,EAAE;oBACP,aAAa,EAAE,IAAI,CAAC,UAAU;oBAC9B,cAAc,EAAE,kBAAkB;iBACnC;aACF,CACF,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBAC5B,OAAO,GAAG,CAAC,IAAI,YAAY,CAAC,wBAAwB,MAAM,EAAE,CAAC,CAAC,CAAC;gBACjE,CAAC;gBACD,OAAO,GAAG,CACR,IAAI,YAAY,CACd,6BAA6B,MAAM,KAAK,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CACjF,CACF,CAAC;YACJ,CAAC;YAED,MAAM,QAAQ,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAgB,CAAC;YACxD,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAElD,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YAC3D,OAAO,GAAG,CACR,IAAI,YAAY,CACd,mCAAmC,MAAM,KAAK,OAAO,EAAE,CACxD,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,kBAAkB;IAClB,8EAA8E;IAEtE,iBAAiB;QACvB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,YAAY,CACpB,wEAAwE,CACzE,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,wBAAwB,CACpC,IAAY,EACZ,KAAc;QAEd,IAAI,CAAC;YACH,kDAAkD;YAClD,MAAM,YAAY,GAAG,MAAM,KAAK,CAC9B,GAAG,IAAI,CAAC,OAAO,iCAAiC,EAChD;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,aAAa,EAAE,IAAI,CAAC,UAAU;oBAC9B,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;aACtC,CACF,CAAC;YAEF,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;gBACrB,OAAO,GAAG,CACR,IAAI,YAAY,CACd,sBAAsB,YAAY,CAAC,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,CACvE,CACF,CAAC;YACJ,CAAC;YAED,MAAM,UAAU,GAAG,CAAC,MAAM,YAAY,CAAC,IAAI,EAAE,CAAiB,CAAC;YAC/D,IAAI,GAAG,GAAG,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAElD,cAAc;YACd,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACrC,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAC5B,CAAC;YAED,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrB,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;YAChB,CAAC;YAED,4CAA4C;YAC5C,MAAM,aAAa,GAAG,MAAM,KAAK,CAC/B,GAAG,IAAI,CAAC,OAAO,4BAA4B,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,oCAAoC,EAC5F;gBACE,OAAO,EAAE;oBACP,aAAa,EAAE,IAAI,CAAC,UAAU;oBAC9B,cAAc,EAAE,kBAAkB;iBACnC;aACF,CACF,CAAC;YAEF,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;gBACtB,OAAO,GAAG,CACR,IAAI,YAAY,CACd,uBAAuB,aAAa,CAAC,MAAM,IAAI,aAAa,CAAC,UAAU,EAAE,CAC1E,CACF,CAAC;YACJ,CAAC;YAED,MAAM,WAAW,GAAG,CAAC,MAAM,aAAa,CAAC,IAAI,EAAE,CAE9C,CAAC;YACF,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;YAElE,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YAC3D,OAAO,GAAG,CAAC,IAAI,YAAY,CAAC,8BAA8B,OAAO,EAAE,CAAC,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,QAAqB;QACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC/B,MAAM,QAAQ,GAAI,MAAM,CAAC,qBAAqB,CAAY,IAAI,EAAE,CAAC;QACjE,MAAM,UAAU,GAAoB,YAAY,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC;QAErE,MAAM,IAAI,GAAI,MAAM,CAAC,aAAa,CAAwB;YACxD,EAAE,KAAK,CAAC,GAAG,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAEzB,MAAM,UAAU,GACb,MAAM,CAAC,mBAAmB,CAA+D;YACxF,EAAE,WAAW;YACd,MAAM,CAAC,mBAAmB,CAAwB;YACnD,SAAS,CAAC;QAEZ,MAAM,YAAY,GAAG,IAAI,CAAC,MAAO,CAAC,YAAY,CAAC;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAO,CAAC,OAAO,CAAC;QAErC,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvB,UAAU,EAAE,MAAM,QAAQ,CAAC,EAAE,EAAE;YAC/B,KAAK,EAAG,MAAM,CAAC,cAAc,CAAY,IAAI,EAAE;YAC/C,WAAW,EAAG,MAAM,CAAC,oBAAoB,CAAY,IAAI,EAAE;YAC3D,IAAI,EAAE,UAAU;YAChB,KAAK,EAAG,MAAM,CAAC,cAAc,CAAY,IAAI,EAAE;YAC/C,UAAU;YACV,IAAI;YACJ,eAAe,EAAE,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC;YAChD,GAAG,EAAE,yBAAyB,kBAAkB,CAAC,YAAY,CAAC,IAAI,kBAAkB,CAAC,OAAO,CAAC,oBAAoB,QAAQ,CAAC,EAAE,EAAE;YAC9H,QAAQ,EAAE;gBACR,aAAa,EAAE,MAAM,CAAC,sBAAsB,CAAC;gBAC7C,QAAQ,EAAE,MAAM,CAAC,iBAAiB,CAAC;gBACnC,QAAQ,EAAE,MAAM,CAAC,gCAAgC,CAAC;gBAClD,YAAY,EAAE,QAAQ;aACvB;SACF,CAAC;IACJ,CAAC;IAED;;;OAGG;IACK,gBAAgB,CAAC,QAAqB;QAC5C,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3D,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;YAC3B,cAAc;YACd,iBAAiB;YACjB,oBAAoB;SACrB,CAAC,CAAC;QAEH,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YAC1C,qEAAqE;YACrE,IACE,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAC9B,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAC9B,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC;gBAClC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EACvC,CAAC;gBACD,gDAAgD;gBAChD,MAAM,IAAI,GACP,QAAQ,CAAC,UAAU,EAAE,CAAC,MAAM,CAAY;oBACxC,QAAQ,CAAC,UAAU,EAAE,CAAC,SAAS,CAAY;oBAC5C,QAAQ,CAAC,GAAG,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
|