@code-rag/core 0.1.0 → 0.1.1

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.
Files changed (205) hide show
  1. package/package.json +4 -4
  2. package/dist/auth/audit-log.js.map +0 -1
  3. package/dist/auth/audit-log.test.d.ts +0 -1
  4. package/dist/auth/audit-log.test.js +0 -261
  5. package/dist/auth/audit-log.test.js.map +0 -1
  6. package/dist/auth/index.js.map +0 -1
  7. package/dist/auth/oidc-provider.js.map +0 -1
  8. package/dist/auth/oidc-provider.test.d.ts +0 -1
  9. package/dist/auth/oidc-provider.test.js +0 -520
  10. package/dist/auth/oidc-provider.test.js.map +0 -1
  11. package/dist/auth/rbac.js.map +0 -1
  12. package/dist/auth/rbac.test.d.ts +0 -1
  13. package/dist/auth/rbac.test.js +0 -224
  14. package/dist/auth/rbac.test.js.map +0 -1
  15. package/dist/auth/saml-provider.js.map +0 -1
  16. package/dist/auth/saml-provider.test.d.ts +0 -1
  17. package/dist/auth/saml-provider.test.js +0 -422
  18. package/dist/auth/saml-provider.test.js.map +0 -1
  19. package/dist/auth/types.js.map +0 -1
  20. package/dist/auth/types.test.d.ts +0 -1
  21. package/dist/auth/types.test.js +0 -147
  22. package/dist/auth/types.test.js.map +0 -1
  23. package/dist/backlog/ab-reference-scanner.js.map +0 -1
  24. package/dist/backlog/ab-reference-scanner.test.d.ts +0 -1
  25. package/dist/backlog/ab-reference-scanner.test.js +0 -83
  26. package/dist/backlog/ab-reference-scanner.test.js.map +0 -1
  27. package/dist/backlog/azure-devops-provider.js.map +0 -1
  28. package/dist/backlog/backlog-provider.js.map +0 -1
  29. package/dist/backlog/backlog-provider.test.d.ts +0 -1
  30. package/dist/backlog/backlog-provider.test.js +0 -426
  31. package/dist/backlog/backlog-provider.test.js.map +0 -1
  32. package/dist/backlog/clickup-provider.js.map +0 -1
  33. package/dist/backlog/clickup-provider.test.d.ts +0 -1
  34. package/dist/backlog/clickup-provider.test.js +0 -426
  35. package/dist/backlog/clickup-provider.test.js.map +0 -1
  36. package/dist/backlog/clickup-reference-scanner.js.map +0 -1
  37. package/dist/backlog/clickup-reference-scanner.test.d.ts +0 -1
  38. package/dist/backlog/clickup-reference-scanner.test.js +0 -92
  39. package/dist/backlog/clickup-reference-scanner.test.js.map +0 -1
  40. package/dist/backlog/code-linker.js.map +0 -1
  41. package/dist/backlog/code-linker.test.d.ts +0 -1
  42. package/dist/backlog/code-linker.test.js +0 -325
  43. package/dist/backlog/code-linker.test.js.map +0 -1
  44. package/dist/backlog/index.js.map +0 -1
  45. package/dist/backlog/jira-provider.js.map +0 -1
  46. package/dist/backlog/jira-provider.test.d.ts +0 -1
  47. package/dist/backlog/jira-provider.test.js +0 -449
  48. package/dist/backlog/jira-provider.test.js.map +0 -1
  49. package/dist/backlog/jira-reference-scanner.js.map +0 -1
  50. package/dist/backlog/jira-reference-scanner.test.d.ts +0 -1
  51. package/dist/backlog/jira-reference-scanner.test.js +0 -127
  52. package/dist/backlog/jira-reference-scanner.test.js.map +0 -1
  53. package/dist/backlog/types.js.map +0 -1
  54. package/dist/chunker/ast-chunker.js.map +0 -1
  55. package/dist/chunker/ast-chunker.test.d.ts +0 -1
  56. package/dist/chunker/ast-chunker.test.js +0 -391
  57. package/dist/chunker/ast-chunker.test.js.map +0 -1
  58. package/dist/chunker/chunker.js.map +0 -1
  59. package/dist/chunker/index.js.map +0 -1
  60. package/dist/config/config-parser.js.map +0 -1
  61. package/dist/config/config-parser.test.d.ts +0 -1
  62. package/dist/config/config-parser.test.js +0 -699
  63. package/dist/config/config-parser.test.js.map +0 -1
  64. package/dist/docs/confluence-provider.js.map +0 -1
  65. package/dist/docs/confluence-provider.test.d.ts +0 -1
  66. package/dist/docs/confluence-provider.test.js +0 -765
  67. package/dist/docs/confluence-provider.test.js.map +0 -1
  68. package/dist/docs/index.js.map +0 -1
  69. package/dist/docs/sharepoint-provider.js.map +0 -1
  70. package/dist/docs/sharepoint-provider.test.d.ts +0 -1
  71. package/dist/docs/sharepoint-provider.test.js +0 -873
  72. package/dist/docs/sharepoint-provider.test.js.map +0 -1
  73. package/dist/embedding/bm25-index.js.map +0 -1
  74. package/dist/embedding/bm25-index.test.d.ts +0 -1
  75. package/dist/embedding/bm25-index.test.js +0 -289
  76. package/dist/embedding/bm25-index.test.js.map +0 -1
  77. package/dist/embedding/hybrid-search.js.map +0 -1
  78. package/dist/embedding/hybrid-search.test.d.ts +0 -1
  79. package/dist/embedding/hybrid-search.test.js +0 -266
  80. package/dist/embedding/hybrid-search.test.js.map +0 -1
  81. package/dist/embedding/index.js.map +0 -1
  82. package/dist/embedding/lancedb-store.js.map +0 -1
  83. package/dist/embedding/lancedb-store.test.d.ts +0 -1
  84. package/dist/embedding/lancedb-store.test.js +0 -268
  85. package/dist/embedding/lancedb-store.test.js.map +0 -1
  86. package/dist/embedding/model-lifecycle-manager.js.map +0 -1
  87. package/dist/embedding/model-lifecycle-manager.test.d.ts +0 -1
  88. package/dist/embedding/model-lifecycle-manager.test.js +0 -642
  89. package/dist/embedding/model-lifecycle-manager.test.js.map +0 -1
  90. package/dist/embedding/ollama-embedding-provider.js.map +0 -1
  91. package/dist/embedding/ollama-embedding-provider.test.d.ts +0 -1
  92. package/dist/embedding/ollama-embedding-provider.test.js +0 -198
  93. package/dist/embedding/ollama-embedding-provider.test.js.map +0 -1
  94. package/dist/embedding/openai-compatible-embedding-provider.js.map +0 -1
  95. package/dist/embedding/openai-compatible-embedding-provider.test.d.ts +0 -1
  96. package/dist/embedding/openai-compatible-embedding-provider.test.js +0 -456
  97. package/dist/embedding/openai-compatible-embedding-provider.test.js.map +0 -1
  98. package/dist/embedding/qdrant-store.js.map +0 -1
  99. package/dist/embedding/qdrant-store.test.d.ts +0 -1
  100. package/dist/embedding/qdrant-store.test.js +0 -359
  101. package/dist/embedding/qdrant-store.test.js.map +0 -1
  102. package/dist/enrichment/index.js.map +0 -1
  103. package/dist/enrichment/nl-enricher.js.map +0 -1
  104. package/dist/enrichment/nl-enricher.test.d.ts +0 -1
  105. package/dist/enrichment/nl-enricher.test.js +0 -154
  106. package/dist/enrichment/nl-enricher.test.js.map +0 -1
  107. package/dist/enrichment/ollama-client.js.map +0 -1
  108. package/dist/enrichment/ollama-client.test.d.ts +0 -1
  109. package/dist/enrichment/ollama-client.test.js +0 -129
  110. package/dist/enrichment/ollama-client.test.js.map +0 -1
  111. package/dist/git/git-client.js.map +0 -1
  112. package/dist/git/git-client.test.d.ts +0 -1
  113. package/dist/git/git-client.test.js +0 -200
  114. package/dist/git/git-client.test.js.map +0 -1
  115. package/dist/git/ignore-filter.js.map +0 -1
  116. package/dist/git/ignore-filter.test.d.ts +0 -1
  117. package/dist/git/ignore-filter.test.js +0 -87
  118. package/dist/git/ignore-filter.test.js.map +0 -1
  119. package/dist/git/index.js.map +0 -1
  120. package/dist/git/simple-git-client.js.map +0 -1
  121. package/dist/graph/cross-repo-resolver.js.map +0 -1
  122. package/dist/graph/cross-repo-resolver.test.d.ts +0 -1
  123. package/dist/graph/cross-repo-resolver.test.js +0 -548
  124. package/dist/graph/cross-repo-resolver.test.js.map +0 -1
  125. package/dist/graph/dependency-graph.js.map +0 -1
  126. package/dist/graph/dependency-graph.test.d.ts +0 -1
  127. package/dist/graph/dependency-graph.test.js +0 -276
  128. package/dist/graph/dependency-graph.test.js.map +0 -1
  129. package/dist/graph/graph-builder.js.map +0 -1
  130. package/dist/graph/graph-builder.test.d.ts +0 -1
  131. package/dist/graph/graph-builder.test.js +0 -178
  132. package/dist/graph/graph-builder.test.js.map +0 -1
  133. package/dist/graph/import-resolver.js.map +0 -1
  134. package/dist/graph/import-resolver.test.d.ts +0 -1
  135. package/dist/graph/import-resolver.test.js +0 -282
  136. package/dist/graph/import-resolver.test.js.map +0 -1
  137. package/dist/graph/index.js.map +0 -1
  138. package/dist/index.js.map +0 -1
  139. package/dist/indexer/file-scanner.js.map +0 -1
  140. package/dist/indexer/file-scanner.test.d.ts +0 -1
  141. package/dist/indexer/file-scanner.test.js +0 -110
  142. package/dist/indexer/file-scanner.test.js.map +0 -1
  143. package/dist/indexer/incremental-indexer.js.map +0 -1
  144. package/dist/indexer/incremental-indexer.test.d.ts +0 -1
  145. package/dist/indexer/incremental-indexer.test.js +0 -266
  146. package/dist/indexer/incremental-indexer.test.js.map +0 -1
  147. package/dist/indexer/index-check.js.map +0 -1
  148. package/dist/indexer/index-check.test.d.ts +0 -1
  149. package/dist/indexer/index-check.test.js +0 -100
  150. package/dist/indexer/index-check.test.js.map +0 -1
  151. package/dist/indexer/index-state.js.map +0 -1
  152. package/dist/indexer/index-state.test.d.ts +0 -1
  153. package/dist/indexer/index-state.test.js +0 -140
  154. package/dist/indexer/index-state.test.js.map +0 -1
  155. package/dist/indexer/index.js.map +0 -1
  156. package/dist/indexer/multi-repo-indexer.js.map +0 -1
  157. package/dist/indexer/multi-repo-indexer.test.d.ts +0 -1
  158. package/dist/indexer/multi-repo-indexer.test.js +0 -238
  159. package/dist/indexer/multi-repo-indexer.test.js.map +0 -1
  160. package/dist/parser/index.js.map +0 -1
  161. package/dist/parser/language-registry.js.map +0 -1
  162. package/dist/parser/language-registry.test.d.ts +0 -1
  163. package/dist/parser/language-registry.test.js +0 -225
  164. package/dist/parser/language-registry.test.js.map +0 -1
  165. package/dist/parser/markdown-parser.js.map +0 -1
  166. package/dist/parser/markdown-parser.test.d.ts +0 -1
  167. package/dist/parser/markdown-parser.test.js +0 -600
  168. package/dist/parser/markdown-parser.test.js.map +0 -1
  169. package/dist/parser/tree-sitter-parser.js.map +0 -1
  170. package/dist/retrieval/context-expander.js.map +0 -1
  171. package/dist/retrieval/context-expander.test.d.ts +0 -1
  172. package/dist/retrieval/context-expander.test.js +0 -339
  173. package/dist/retrieval/context-expander.test.js.map +0 -1
  174. package/dist/retrieval/cross-encoder-reranker.js.map +0 -1
  175. package/dist/retrieval/cross-encoder-reranker.test.d.ts +0 -1
  176. package/dist/retrieval/cross-encoder-reranker.test.js +0 -305
  177. package/dist/retrieval/cross-encoder-reranker.test.js.map +0 -1
  178. package/dist/retrieval/index.js.map +0 -1
  179. package/dist/retrieval/query-analyzer.js.map +0 -1
  180. package/dist/retrieval/query-analyzer.test.d.ts +0 -1
  181. package/dist/retrieval/query-analyzer.test.js +0 -236
  182. package/dist/retrieval/query-analyzer.test.js.map +0 -1
  183. package/dist/retrieval/token-budget.js.map +0 -1
  184. package/dist/retrieval/token-budget.test.d.ts +0 -1
  185. package/dist/retrieval/token-budget.test.js +0 -404
  186. package/dist/retrieval/token-budget.test.js.map +0 -1
  187. package/dist/storage/azure-blob-provider.js.map +0 -1
  188. package/dist/storage/azure-blob-provider.test.d.ts +0 -1
  189. package/dist/storage/azure-blob-provider.test.js +0 -250
  190. package/dist/storage/azure-blob-provider.test.js.map +0 -1
  191. package/dist/storage/gcs-provider.js.map +0 -1
  192. package/dist/storage/gcs-provider.test.d.ts +0 -1
  193. package/dist/storage/gcs-provider.test.js +0 -299
  194. package/dist/storage/gcs-provider.test.js.map +0 -1
  195. package/dist/storage/index.js.map +0 -1
  196. package/dist/storage/s3-provider.js.map +0 -1
  197. package/dist/storage/s3-provider.test.d.ts +0 -1
  198. package/dist/storage/s3-provider.test.js +0 -329
  199. package/dist/storage/s3-provider.test.js.map +0 -1
  200. package/dist/storage/types.js.map +0 -1
  201. package/dist/types/chunk.js.map +0 -1
  202. package/dist/types/config.js.map +0 -1
  203. package/dist/types/index.js.map +0 -1
  204. package/dist/types/provider.js.map +0 -1
  205. package/dist/types/search.js.map +0 -1
@@ -1,422 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from 'vitest';
2
- import { createSign, generateKeyPairSync } from 'node:crypto';
3
- import { SAMLProvider } from './saml-provider.js';
4
- import { AuthError } from './types.js';
5
- // ---------------------------------------------------------------------------
6
- // RSA key pair for SAML signature testing
7
- // ---------------------------------------------------------------------------
8
- const { publicKey, privateKey } = generateKeyPairSync('rsa', {
9
- modulusLength: 2048,
10
- });
11
- // For test purposes, extract the base64 public key as a stand-in certificate
12
- const publicKeyDer = publicKey.export({ type: 'spki', format: 'der' });
13
- const certBase64 = publicKeyDer.toString('base64');
14
- // ---------------------------------------------------------------------------
15
- // Helpers
16
- // ---------------------------------------------------------------------------
17
- function defaultConfig() {
18
- return {
19
- idpMetadataUrl: 'https://idp.example.com/metadata',
20
- spEntityId: 'https://coderag.example.com',
21
- spAcsUrl: 'https://coderag.example.com/sso/acs',
22
- certificatePem: `-----BEGIN CERTIFICATE-----\n${certBase64}\n-----END CERTIFICATE-----`,
23
- roleMapping: {
24
- 'coderag-admins': 'admin',
25
- 'coderag-devs': 'developer',
26
- 'coderag-readers': 'viewer',
27
- },
28
- };
29
- }
30
- function createIdpMetadataXml() {
31
- return `<?xml version="1.0" encoding="UTF-8"?>
32
- <md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
33
- entityID="https://idp.example.com">
34
- <md:IDPSSODescriptor>
35
- <md:KeyDescriptor use="signing">
36
- <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
37
- <ds:X509Data>
38
- <ds:X509Certificate>${certBase64}</ds:X509Certificate>
39
- </ds:X509Data>
40
- </ds:KeyInfo>
41
- </md:KeyDescriptor>
42
- <md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress</md:NameIDFormat>
43
- <md:SingleSignOnService
44
- Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
45
- Location="https://idp.example.com/sso" />
46
- </md:IDPSSODescriptor>
47
- </md:EntityDescriptor>`;
48
- }
49
- function createSamlResponse(options) {
50
- const nameId = options?.nameId ?? 'user@example.com';
51
- const email = options?.email ?? 'user@example.com';
52
- const role = options?.role ?? 'developer';
53
- const audience = options?.audience ?? 'https://coderag.example.com';
54
- const now = new Date();
55
- const notBefore = options?.notBefore ?? new Date(now.getTime() - 60000).toISOString();
56
- const notOnOrAfter = options?.notOnOrAfter ?? new Date(now.getTime() + 3600000).toISOString();
57
- // Create a simplified SAML assertion for testing
58
- const assertion = `<saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
59
- <saml:Issuer>https://idp.example.com</saml:Issuer>
60
- <saml:Subject>
61
- <saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">${nameId}</saml:NameID>
62
- </saml:Subject>
63
- <saml:Conditions NotBefore="${notBefore}" NotOnOrAfter="${notOnOrAfter}">
64
- <saml:AudienceRestriction>
65
- <saml:Audience>${audience}</saml:Audience>
66
- </saml:AudienceRestriction>
67
- </saml:Conditions>
68
- <saml:AttributeStatement>
69
- <saml:Attribute Name="email">
70
- <saml:AttributeValue>${email}</saml:AttributeValue>
71
- </saml:Attribute>
72
- <saml:Attribute Name="role">
73
- <saml:AttributeValue>${role}</saml:AttributeValue>
74
- </saml:Attribute>
75
- <saml:Attribute Name="displayName">
76
- <saml:AttributeValue>Test User</saml:AttributeValue>
77
- </saml:Attribute>
78
- </saml:AttributeStatement>
79
- </saml:Assertion>`;
80
- // Create SignedInfo and sign it.
81
- // The provider extracts text between <ds:SignedInfo>...</ds:SignedInfo>,
82
- // trims it, and wraps it: <SignedInfo xmlns="...">{trimmed}</SignedInfo>.
83
- // We must sign exactly that reconstructed string.
84
- const digestValue = Buffer.from('test-digest').toString('base64');
85
- const signedInfoInner = `<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/><ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/><ds:Reference URI=""><ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/><ds:DigestValue>${digestValue}</ds:DigestValue></ds:Reference>`;
86
- // This is what the provider will reconstruct and verify against
87
- const signedInfoXml = `<SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#">${signedInfoInner}</SignedInfo>`;
88
- const signer = createSign('RSA-SHA256');
89
- signer.update(signedInfoXml);
90
- const signatureValue = signer.sign(privateKey).toString('base64');
91
- return `<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
92
- ${assertion}
93
- <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
94
- <ds:SignedInfo>${signedInfoInner}</ds:SignedInfo>
95
- <ds:SignatureValue>${signatureValue}</ds:SignatureValue>
96
- </ds:Signature>
97
- </samlp:Response>`;
98
- }
99
- function createMockFetch(responses) {
100
- return vi.fn(async (input) => {
101
- const url = typeof input === 'string' ? input : input.toString();
102
- const response = responses[url];
103
- if (!response) {
104
- return {
105
- ok: false,
106
- status: 404,
107
- json: async () => ({}),
108
- text: async () => '',
109
- };
110
- }
111
- return {
112
- ok: response.ok,
113
- status: response.status,
114
- json: async () => JSON.parse(response.body),
115
- text: async () => response.body,
116
- };
117
- });
118
- }
119
- // ---------------------------------------------------------------------------
120
- // Tests
121
- // ---------------------------------------------------------------------------
122
- describe('SAMLProvider', () => {
123
- let config;
124
- beforeEach(() => {
125
- config = defaultConfig();
126
- });
127
- // -----------------------------------------------------------------------
128
- // Constructor
129
- // -----------------------------------------------------------------------
130
- describe('constructor', () => {
131
- it('should have name set to saml', () => {
132
- const provider = new SAMLProvider(config);
133
- expect(provider.name).toBe('saml');
134
- });
135
- });
136
- // -----------------------------------------------------------------------
137
- // initialize
138
- // -----------------------------------------------------------------------
139
- describe('initialize', () => {
140
- it('should fetch and parse IdP metadata', async () => {
141
- const mockFetch = createMockFetch({
142
- 'https://idp.example.com/metadata': {
143
- ok: true,
144
- status: 200,
145
- body: createIdpMetadataXml(),
146
- },
147
- });
148
- const provider = new SAMLProvider(config, mockFetch);
149
- const result = await provider.initialize();
150
- expect(result.isOk()).toBe(true);
151
- });
152
- it('should return error when metadata fetch fails', async () => {
153
- const mockFetch = createMockFetch({
154
- 'https://idp.example.com/metadata': {
155
- ok: false,
156
- status: 500,
157
- body: '',
158
- },
159
- });
160
- const provider = new SAMLProvider(config, mockFetch);
161
- const result = await provider.initialize();
162
- expect(result.isErr()).toBe(true);
163
- if (result.isErr()) {
164
- expect(result.error).toBeInstanceOf(AuthError);
165
- expect(result.error.message).toContain('metadata fetch failed');
166
- }
167
- });
168
- it('should return error when metadata is missing required fields', async () => {
169
- const mockFetch = createMockFetch({
170
- 'https://idp.example.com/metadata': {
171
- ok: true,
172
- status: 200,
173
- body: '<EntityDescriptor></EntityDescriptor>',
174
- },
175
- });
176
- const provider = new SAMLProvider(config, mockFetch);
177
- const result = await provider.initialize();
178
- expect(result.isErr()).toBe(true);
179
- if (result.isErr()) {
180
- expect(result.error.message).toContain('missing required fields');
181
- }
182
- });
183
- it('should return error on network failure', async () => {
184
- const mockFetch = vi.fn(async () => {
185
- throw new Error('DNS resolution failed');
186
- });
187
- const provider = new SAMLProvider(config, mockFetch);
188
- const result = await provider.initialize();
189
- expect(result.isErr()).toBe(true);
190
- if (result.isErr()) {
191
- expect(result.error.message).toContain('DNS resolution failed');
192
- }
193
- });
194
- });
195
- // -----------------------------------------------------------------------
196
- // generateAuthRequest
197
- // -----------------------------------------------------------------------
198
- describe('generateAuthRequest', () => {
199
- it('should generate a valid SAML AuthnRequest URL', async () => {
200
- const mockFetch = createMockFetch({
201
- 'https://idp.example.com/metadata': {
202
- ok: true,
203
- status: 200,
204
- body: createIdpMetadataXml(),
205
- },
206
- });
207
- const provider = new SAMLProvider(config, mockFetch);
208
- await provider.initialize();
209
- const result = provider.generateAuthRequest();
210
- expect(result.isOk()).toBe(true);
211
- if (result.isOk()) {
212
- expect(result.value.url).toContain('https://idp.example.com/sso');
213
- expect(result.value.url).toContain('SAMLRequest=');
214
- expect(result.value.id).toContain('_coderag_');
215
- }
216
- });
217
- it('should generate unique IDs for each request', async () => {
218
- const mockFetch = createMockFetch({
219
- 'https://idp.example.com/metadata': {
220
- ok: true,
221
- status: 200,
222
- body: createIdpMetadataXml(),
223
- },
224
- });
225
- const provider = new SAMLProvider(config, mockFetch);
226
- await provider.initialize();
227
- const result1 = provider.generateAuthRequest();
228
- const result2 = provider.generateAuthRequest();
229
- expect(result1.isOk() && result2.isOk()).toBe(true);
230
- if (result1.isOk() && result2.isOk()) {
231
- expect(result1.value.id).not.toBe(result2.value.id);
232
- }
233
- });
234
- it('should return error when not initialized', () => {
235
- const provider = new SAMLProvider(config);
236
- const result = provider.generateAuthRequest();
237
- expect(result.isErr()).toBe(true);
238
- if (result.isErr()) {
239
- expect(result.error.message).toContain('not initialized');
240
- }
241
- });
242
- });
243
- // -----------------------------------------------------------------------
244
- // validateResponse
245
- // -----------------------------------------------------------------------
246
- describe('validateResponse', () => {
247
- async function createInitializedProvider() {
248
- const mockFetch = createMockFetch({
249
- 'https://idp.example.com/metadata': {
250
- ok: true,
251
- status: 200,
252
- body: createIdpMetadataXml(),
253
- },
254
- });
255
- const provider = new SAMLProvider(config, mockFetch);
256
- await provider.initialize();
257
- return provider;
258
- }
259
- it('should validate a well-formed SAML response', async () => {
260
- const provider = await createInitializedProvider();
261
- const samlXml = createSamlResponse();
262
- const samlB64 = Buffer.from(samlXml).toString('base64');
263
- const result = await provider.validateResponse(samlB64);
264
- expect(result.isOk()).toBe(true);
265
- if (result.isOk()) {
266
- expect(result.value.email).toBe('user@example.com');
267
- expect(result.value.name).toBe('Test User');
268
- expect(result.value.roles).toContain('developer');
269
- }
270
- });
271
- it('should reject an expired SAML assertion', async () => {
272
- const provider = await createInitializedProvider();
273
- const pastDate = new Date(Date.now() - 7200000).toISOString();
274
- const samlXml = createSamlResponse({
275
- notBefore: new Date(Date.now() - 14400000).toISOString(),
276
- notOnOrAfter: pastDate,
277
- });
278
- const samlB64 = Buffer.from(samlXml).toString('base64');
279
- const result = await provider.validateResponse(samlB64);
280
- expect(result.isErr()).toBe(true);
281
- if (result.isErr()) {
282
- expect(result.error.message).toContain('expired');
283
- }
284
- });
285
- it('should reject a SAML assertion not yet valid', async () => {
286
- const provider = await createInitializedProvider();
287
- const futureDate = new Date(Date.now() + 7200000).toISOString();
288
- const farFuture = new Date(Date.now() + 14400000).toISOString();
289
- const samlXml = createSamlResponse({
290
- notBefore: futureDate,
291
- notOnOrAfter: farFuture,
292
- });
293
- const samlB64 = Buffer.from(samlXml).toString('base64');
294
- const result = await provider.validateResponse(samlB64);
295
- expect(result.isErr()).toBe(true);
296
- if (result.isErr()) {
297
- expect(result.error.message).toContain('not yet valid');
298
- }
299
- });
300
- it('should reject a SAML assertion with wrong audience', async () => {
301
- const provider = await createInitializedProvider();
302
- const samlXml = createSamlResponse({
303
- audience: 'https://wrong-audience.com',
304
- });
305
- const samlB64 = Buffer.from(samlXml).toString('base64');
306
- const result = await provider.validateResponse(samlB64);
307
- expect(result.isErr()).toBe(true);
308
- if (result.isErr()) {
309
- expect(result.error.message).toContain('audience mismatch');
310
- }
311
- });
312
- it('should reject invalid Base64 input', async () => {
313
- const provider = await createInitializedProvider();
314
- // Provide valid base64 that decodes to non-XML
315
- const result = await provider.validateResponse(Buffer.from('not-xml-at-all').toString('base64'));
316
- expect(result.isErr()).toBe(true);
317
- });
318
- });
319
- // -----------------------------------------------------------------------
320
- // authenticate
321
- // -----------------------------------------------------------------------
322
- describe('authenticate', () => {
323
- it('should return AuthToken for valid SAML response', async () => {
324
- const mockFetch = createMockFetch({
325
- 'https://idp.example.com/metadata': {
326
- ok: true,
327
- status: 200,
328
- body: createIdpMetadataXml(),
329
- },
330
- });
331
- const provider = new SAMLProvider(config, mockFetch);
332
- await provider.initialize();
333
- const samlXml = createSamlResponse();
334
- const samlB64 = Buffer.from(samlXml).toString('base64');
335
- const result = await provider.authenticate(samlB64);
336
- expect(result.isOk()).toBe(true);
337
- if (result.isOk()) {
338
- expect(result.value.email).toBe('user@example.com');
339
- expect(result.value.roles).toContain('developer');
340
- expect(result.value.exp).toBeGreaterThan(result.value.iat);
341
- }
342
- });
343
- });
344
- // -----------------------------------------------------------------------
345
- // mapAttributes
346
- // -----------------------------------------------------------------------
347
- describe('mapAttributes', () => {
348
- it('should map standard email attribute', () => {
349
- const provider = new SAMLProvider(config);
350
- const user = provider.mapAttributes({
351
- email: 'test@example.com',
352
- displayName: 'Test User',
353
- role: 'admin',
354
- });
355
- expect(user.email).toBe('test@example.com');
356
- expect(user.name).toBe('Test User');
357
- expect(user.roles).toContain('admin');
358
- });
359
- it('should map Microsoft claims-style attributes', () => {
360
- const provider = new SAMLProvider(config);
361
- const user = provider.mapAttributes({
362
- 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress': 'ms@example.com',
363
- 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name': 'MS User',
364
- 'http://schemas.microsoft.com/ws/2008/06/identity/claims/role': 'coderag-admins',
365
- });
366
- expect(user.email).toBe('ms@example.com');
367
- expect(user.name).toBe('MS User');
368
- expect(user.roles).toContain('admin');
369
- });
370
- it('should default to viewer when no role matches', () => {
371
- const provider = new SAMLProvider(config);
372
- const user = provider.mapAttributes({
373
- email: 'test@example.com',
374
- });
375
- expect(user.roles).toEqual(['viewer']);
376
- });
377
- it('should use email as fallback for name', () => {
378
- const provider = new SAMLProvider(config);
379
- const user = provider.mapAttributes({
380
- email: 'test@example.com',
381
- });
382
- expect(user.name).toBe('test@example.com');
383
- });
384
- it('should extract NameID from XML as user id', () => {
385
- const provider = new SAMLProvider(config);
386
- const xml = '<saml:NameID>unique-id-123</saml:NameID>';
387
- const user = provider.mapAttributes({ email: 'test@example.com' }, xml);
388
- expect(user.id).toBe('unique-id-123');
389
- });
390
- it('should use email as fallback for id when no NameID', () => {
391
- const provider = new SAMLProvider(config);
392
- const user = provider.mapAttributes({
393
- email: 'fallback@example.com',
394
- });
395
- expect(user.id).toBe('fallback@example.com');
396
- });
397
- });
398
- // -----------------------------------------------------------------------
399
- // getUserRoles / getUserRepos (cache)
400
- // -----------------------------------------------------------------------
401
- describe('getUserRoles', () => {
402
- it('should return viewer for unknown user', async () => {
403
- const provider = new SAMLProvider(config);
404
- const result = await provider.getUserRoles('unknown');
405
- expect(result.isOk()).toBe(true);
406
- if (result.isOk()) {
407
- expect(result.value).toEqual(['viewer']);
408
- }
409
- });
410
- });
411
- describe('getUserRepos', () => {
412
- it('should return empty array for unknown user', async () => {
413
- const provider = new SAMLProvider(config);
414
- const result = await provider.getUserRepos('unknown');
415
- expect(result.isOk()).toBe(true);
416
- if (result.isOk()) {
417
- expect(result.value).toEqual([]);
418
- }
419
- });
420
- });
421
- });
422
- //# sourceMappingURL=saml-provider.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"saml-provider.test.js","sourceRoot":"","sources":["../../src/auth/saml-provider.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AASA,8EAA8E;AAC9E,MAAM,CAAC,MAAM,cAAc,GAAoB,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAU,CAAC;AA6DzF,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAE9E,MAAM,OAAO,SAAU,SAAQ,KAAK;IAClC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,147 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.test.js","sourceRoot":"","sources":["../../src/auth/types.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
1
- export {};