@peterhauge/apiops-cli 0.1.3-alpha.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.
Files changed (199) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +135 -0
  3. package/dist/cli/extract-command.d.ts +12 -0
  4. package/dist/cli/extract-command.d.ts.map +1 -0
  5. package/dist/cli/extract-command.js +157 -0
  6. package/dist/cli/extract-command.js.map +1 -0
  7. package/dist/cli/index.d.ts +7 -0
  8. package/dist/cli/index.d.ts.map +1 -0
  9. package/dist/cli/index.js +74 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/cli/init-command.d.ts +11 -0
  12. package/dist/cli/init-command.d.ts.map +1 -0
  13. package/dist/cli/init-command.js +87 -0
  14. package/dist/cli/init-command.js.map +1 -0
  15. package/dist/cli/publish-command.d.ts +12 -0
  16. package/dist/cli/publish-command.d.ts.map +1 -0
  17. package/dist/cli/publish-command.js +159 -0
  18. package/dist/cli/publish-command.js.map +1 -0
  19. package/dist/clients/apim-client.d.ts +110 -0
  20. package/dist/clients/apim-client.d.ts.map +1 -0
  21. package/dist/clients/apim-client.js +586 -0
  22. package/dist/clients/apim-client.js.map +1 -0
  23. package/dist/clients/artifact-store.d.ts +23 -0
  24. package/dist/clients/artifact-store.d.ts.map +1 -0
  25. package/dist/clients/artifact-store.js +188 -0
  26. package/dist/clients/artifact-store.js.map +1 -0
  27. package/dist/clients/iapim-client.d.ts +52 -0
  28. package/dist/clients/iapim-client.d.ts.map +1 -0
  29. package/dist/clients/iapim-client.js +6 -0
  30. package/dist/clients/iapim-client.js.map +1 -0
  31. package/dist/clients/iartifact-store.d.ts +50 -0
  32. package/dist/clients/iartifact-store.d.ts.map +1 -0
  33. package/dist/clients/iartifact-store.js +6 -0
  34. package/dist/clients/iartifact-store.js.map +1 -0
  35. package/dist/lib/auto-generated.d.ts +27 -0
  36. package/dist/lib/auto-generated.d.ts.map +1 -0
  37. package/dist/lib/auto-generated.js +34 -0
  38. package/dist/lib/auto-generated.js.map +1 -0
  39. package/dist/lib/cloud-config.d.ts +29 -0
  40. package/dist/lib/cloud-config.d.ts.map +1 -0
  41. package/dist/lib/cloud-config.js +60 -0
  42. package/dist/lib/cloud-config.js.map +1 -0
  43. package/dist/lib/config-loader.d.ts +21 -0
  44. package/dist/lib/config-loader.d.ts.map +1 -0
  45. package/dist/lib/config-loader.js +131 -0
  46. package/dist/lib/config-loader.js.map +1 -0
  47. package/dist/lib/dependency-graph.d.ts +43 -0
  48. package/dist/lib/dependency-graph.d.ts.map +1 -0
  49. package/dist/lib/dependency-graph.js +163 -0
  50. package/dist/lib/dependency-graph.js.map +1 -0
  51. package/dist/lib/exit-codes.d.ts +27 -0
  52. package/dist/lib/exit-codes.d.ts.map +1 -0
  53. package/dist/lib/exit-codes.js +33 -0
  54. package/dist/lib/exit-codes.js.map +1 -0
  55. package/dist/lib/logger.d.ts +39 -0
  56. package/dist/lib/logger.d.ts.map +1 -0
  57. package/dist/lib/logger.js +128 -0
  58. package/dist/lib/logger.js.map +1 -0
  59. package/dist/lib/parallel-runner.d.ts +38 -0
  60. package/dist/lib/parallel-runner.d.ts.map +1 -0
  61. package/dist/lib/parallel-runner.js +70 -0
  62. package/dist/lib/parallel-runner.js.map +1 -0
  63. package/dist/lib/resource-path.d.ts +205 -0
  64. package/dist/lib/resource-path.d.ts.map +1 -0
  65. package/dist/lib/resource-path.js +401 -0
  66. package/dist/lib/resource-path.js.map +1 -0
  67. package/dist/lib/resource-uri.d.ts +40 -0
  68. package/dist/lib/resource-uri.d.ts.map +1 -0
  69. package/dist/lib/resource-uri.js +86 -0
  70. package/dist/lib/resource-uri.js.map +1 -0
  71. package/dist/lib/user-agent.d.ts +2 -0
  72. package/dist/lib/user-agent.d.ts.map +1 -0
  73. package/dist/lib/user-agent.js +5 -0
  74. package/dist/lib/user-agent.js.map +1 -0
  75. package/dist/models/config.d.ts +83 -0
  76. package/dist/models/config.d.ts.map +1 -0
  77. package/dist/models/config.js +6 -0
  78. package/dist/models/config.js.map +1 -0
  79. package/dist/models/resource-types.d.ts +66 -0
  80. package/dist/models/resource-types.d.ts.map +1 -0
  81. package/dist/models/resource-types.js +243 -0
  82. package/dist/models/resource-types.js.map +1 -0
  83. package/dist/models/types.d.ts +47 -0
  84. package/dist/models/types.d.ts.map +1 -0
  85. package/dist/models/types.js +6 -0
  86. package/dist/models/types.js.map +1 -0
  87. package/dist/services/api-extractor.d.ts +36 -0
  88. package/dist/services/api-extractor.d.ts.map +1 -0
  89. package/dist/services/api-extractor.js +319 -0
  90. package/dist/services/api-extractor.js.map +1 -0
  91. package/dist/services/api-publisher.d.ts +18 -0
  92. package/dist/services/api-publisher.d.ts.map +1 -0
  93. package/dist/services/api-publisher.js +290 -0
  94. package/dist/services/api-publisher.js.map +1 -0
  95. package/dist/services/delete-unmatched-service.d.ts +17 -0
  96. package/dist/services/delete-unmatched-service.d.ts.map +1 -0
  97. package/dist/services/delete-unmatched-service.js +143 -0
  98. package/dist/services/delete-unmatched-service.js.map +1 -0
  99. package/dist/services/dry-run-reporter.d.ts +30 -0
  100. package/dist/services/dry-run-reporter.d.ts.map +1 -0
  101. package/dist/services/dry-run-reporter.js +111 -0
  102. package/dist/services/dry-run-reporter.js.map +1 -0
  103. package/dist/services/extract-service.d.ts +47 -0
  104. package/dist/services/extract-service.d.ts.map +1 -0
  105. package/dist/services/extract-service.js +374 -0
  106. package/dist/services/extract-service.js.map +1 -0
  107. package/dist/services/filter-service.d.ts +29 -0
  108. package/dist/services/filter-service.d.ts.map +1 -0
  109. package/dist/services/filter-service.js +143 -0
  110. package/dist/services/filter-service.js.map +1 -0
  111. package/dist/services/git-diff-service.d.ts +23 -0
  112. package/dist/services/git-diff-service.d.ts.map +1 -0
  113. package/dist/services/git-diff-service.js +135 -0
  114. package/dist/services/git-diff-service.js.map +1 -0
  115. package/dist/services/identity-guide-service.d.ts +11 -0
  116. package/dist/services/identity-guide-service.d.ts.map +1 -0
  117. package/dist/services/identity-guide-service.js +227 -0
  118. package/dist/services/identity-guide-service.js.map +1 -0
  119. package/dist/services/init-service.d.ts +16 -0
  120. package/dist/services/init-service.d.ts.map +1 -0
  121. package/dist/services/init-service.js +304 -0
  122. package/dist/services/init-service.js.map +1 -0
  123. package/dist/services/keyvault-checker.d.ts +58 -0
  124. package/dist/services/keyvault-checker.d.ts.map +1 -0
  125. package/dist/services/keyvault-checker.js +390 -0
  126. package/dist/services/keyvault-checker.js.map +1 -0
  127. package/dist/services/override-merger.d.ts +20 -0
  128. package/dist/services/override-merger.d.ts.map +1 -0
  129. package/dist/services/override-merger.js +102 -0
  130. package/dist/services/override-merger.js.map +1 -0
  131. package/dist/services/product-extractor.d.ts +26 -0
  132. package/dist/services/product-extractor.d.ts.map +1 -0
  133. package/dist/services/product-extractor.js +141 -0
  134. package/dist/services/product-extractor.js.map +1 -0
  135. package/dist/services/product-publisher.d.ts +15 -0
  136. package/dist/services/product-publisher.d.ts.map +1 -0
  137. package/dist/services/product-publisher.js +113 -0
  138. package/dist/services/product-publisher.js.map +1 -0
  139. package/dist/services/prompt-service.d.ts +13 -0
  140. package/dist/services/prompt-service.d.ts.map +1 -0
  141. package/dist/services/prompt-service.js +69 -0
  142. package/dist/services/prompt-service.js.map +1 -0
  143. package/dist/services/publish-service.d.ts +31 -0
  144. package/dist/services/publish-service.d.ts.map +1 -0
  145. package/dist/services/publish-service.js +445 -0
  146. package/dist/services/publish-service.js.map +1 -0
  147. package/dist/services/resource-extractor.d.ts +52 -0
  148. package/dist/services/resource-extractor.d.ts.map +1 -0
  149. package/dist/services/resource-extractor.js +168 -0
  150. package/dist/services/resource-extractor.js.map +1 -0
  151. package/dist/services/resource-publisher.d.ts +23 -0
  152. package/dist/services/resource-publisher.d.ts.map +1 -0
  153. package/dist/services/resource-publisher.js +349 -0
  154. package/dist/services/resource-publisher.js.map +1 -0
  155. package/dist/services/secret-redactor.d.ts +20 -0
  156. package/dist/services/secret-redactor.d.ts.map +1 -0
  157. package/dist/services/secret-redactor.js +45 -0
  158. package/dist/services/secret-redactor.js.map +1 -0
  159. package/dist/services/transitive-resolver.d.ts +45 -0
  160. package/dist/services/transitive-resolver.d.ts.map +1 -0
  161. package/dist/services/transitive-resolver.js +177 -0
  162. package/dist/services/transitive-resolver.js.map +1 -0
  163. package/dist/services/workspace-extractor.d.ts +34 -0
  164. package/dist/services/workspace-extractor.d.ts.map +1 -0
  165. package/dist/services/workspace-extractor.js +120 -0
  166. package/dist/services/workspace-extractor.js.map +1 -0
  167. package/dist/templates/azure-devops/extract-pipeline.d.ts +9 -0
  168. package/dist/templates/azure-devops/extract-pipeline.d.ts.map +1 -0
  169. package/dist/templates/azure-devops/extract-pipeline.js +95 -0
  170. package/dist/templates/azure-devops/extract-pipeline.js.map +1 -0
  171. package/dist/templates/azure-devops/publish-pipeline.d.ts +10 -0
  172. package/dist/templates/azure-devops/publish-pipeline.d.ts.map +1 -0
  173. package/dist/templates/azure-devops/publish-pipeline.js +100 -0
  174. package/dist/templates/azure-devops/publish-pipeline.js.map +1 -0
  175. package/dist/templates/configs/filter-config.d.ts +6 -0
  176. package/dist/templates/configs/filter-config.d.ts.map +1 -0
  177. package/dist/templates/configs/filter-config.js +51 -0
  178. package/dist/templates/configs/filter-config.js.map +1 -0
  179. package/dist/templates/configs/override-config.d.ts +6 -0
  180. package/dist/templates/configs/override-config.d.ts.map +1 -0
  181. package/dist/templates/configs/override-config.js +45 -0
  182. package/dist/templates/configs/override-config.js.map +1 -0
  183. package/dist/templates/configs/package-json.d.ts +10 -0
  184. package/dist/templates/configs/package-json.d.ts.map +1 -0
  185. package/dist/templates/configs/package-json.js +19 -0
  186. package/dist/templates/configs/package-json.js.map +1 -0
  187. package/dist/templates/copilot/identity-setup-prompt.d.ts +13 -0
  188. package/dist/templates/copilot/identity-setup-prompt.d.ts.map +1 -0
  189. package/dist/templates/copilot/identity-setup-prompt.js +279 -0
  190. package/dist/templates/copilot/identity-setup-prompt.js.map +1 -0
  191. package/dist/templates/github-actions/extract-workflow.d.ts +9 -0
  192. package/dist/templates/github-actions/extract-workflow.d.ts.map +1 -0
  193. package/dist/templates/github-actions/extract-workflow.js +126 -0
  194. package/dist/templates/github-actions/extract-workflow.js.map +1 -0
  195. package/dist/templates/github-actions/publish-workflow.d.ts +10 -0
  196. package/dist/templates/github-actions/publish-workflow.d.ts.map +1 -0
  197. package/dist/templates/github-actions/publish-workflow.js +105 -0
  198. package/dist/templates/github-actions/publish-workflow.js.map +1 -0
  199. package/package.json +65 -0
@@ -0,0 +1,188 @@
1
+ /**
2
+ * T017: Filesystem artifact store implementing IArtifactStore
3
+ * Read/write resource JSON files, policy XML, API specs, associations, wiki markdown
4
+ */
5
+ import * as fs from 'node:fs/promises';
6
+ import * as path from 'node:path';
7
+ import he from 'he';
8
+ import { buildArtifactDirectory, buildArtifactFilePath, buildPolicyFilePath, buildSpecificationFilePath, buildAssociationFilePath, parseArtifactPath, } from '../lib/resource-path.js';
9
+ import { logger } from '../lib/logger.js';
10
+ export class ArtifactStore {
11
+ async writeResource(baseDir, descriptor, json) {
12
+ const filePath = buildArtifactFilePath(baseDir, descriptor);
13
+ if (!filePath) {
14
+ logger.debug(`No info file for resource type ${descriptor.type}`);
15
+ return;
16
+ }
17
+ await this.ensureDirectory(path.dirname(filePath));
18
+ const content = JSON.stringify(json, null, 2);
19
+ await fs.writeFile(filePath, content, 'utf-8');
20
+ logger.debug(`Wrote resource to ${filePath}`);
21
+ }
22
+ async writeContent(baseDir, descriptor, content, contentType, format) {
23
+ let filePath;
24
+ // Decode HTML entities in policy XML that APIM returns in JSON format
25
+ let fileContent = content;
26
+ if (contentType === 'policy') {
27
+ filePath = buildPolicyFilePath(baseDir, descriptor);
28
+ fileContent = he.decode(content);
29
+ }
30
+ else if (contentType === 'specification') {
31
+ const specFormat = (format ?? 'yaml');
32
+ filePath = buildSpecificationFilePath(baseDir, descriptor, specFormat);
33
+ }
34
+ else {
35
+ const exhaustive = contentType;
36
+ throw new Error(`Unknown content type: ${String(exhaustive)}`);
37
+ }
38
+ await this.ensureDirectory(path.dirname(filePath));
39
+ await fs.writeFile(filePath, fileContent, 'utf-8');
40
+ logger.debug(`Wrote ${contentType} to ${filePath}`);
41
+ }
42
+ async writeAssociation(baseDir, descriptor, associationType, names) {
43
+ const filePath = buildAssociationFilePath(baseDir, descriptor, associationType);
44
+ await this.ensureDirectory(path.dirname(filePath));
45
+ const content = JSON.stringify(names.map(name => ({ name })), null, 2);
46
+ await fs.writeFile(filePath, content, 'utf-8');
47
+ logger.debug(`Wrote ${associationType} association to ${filePath}`);
48
+ }
49
+ async readResource(baseDir, descriptor) {
50
+ const filePath = buildArtifactFilePath(baseDir, descriptor);
51
+ if (!filePath) {
52
+ return undefined;
53
+ }
54
+ try {
55
+ const content = await fs.readFile(filePath, 'utf-8');
56
+ const json = JSON.parse(content);
57
+ logger.debug(`Read resource from ${filePath}`);
58
+ return json;
59
+ }
60
+ catch (error) {
61
+ if (error.code === 'ENOENT') {
62
+ return undefined;
63
+ }
64
+ throw new Error(`Failed to read resource from ${filePath}: ${error.message}`, { cause: error });
65
+ }
66
+ }
67
+ async readContent(baseDir, descriptor, contentType) {
68
+ if (contentType === 'policy') {
69
+ const filePath = buildPolicyFilePath(baseDir, descriptor);
70
+ try {
71
+ const content = await fs.readFile(filePath, 'utf-8');
72
+ logger.debug(`Read policy from ${filePath}`);
73
+ return { content };
74
+ }
75
+ catch (error) {
76
+ if (error.code === 'ENOENT') {
77
+ return undefined;
78
+ }
79
+ throw error;
80
+ }
81
+ }
82
+ else if (contentType === 'specification') {
83
+ // Try different specification formats
84
+ const formats = [
85
+ 'yaml',
86
+ 'json',
87
+ 'graphql',
88
+ 'wsdl',
89
+ 'wadl',
90
+ ];
91
+ for (const format of formats) {
92
+ try {
93
+ const filePath = buildSpecificationFilePath(baseDir, descriptor, format);
94
+ const content = await fs.readFile(filePath, 'utf-8');
95
+ logger.debug(`Read specification from ${filePath}`);
96
+ return { content, format };
97
+ }
98
+ catch (error) {
99
+ if (error.code === 'ENOENT') {
100
+ continue;
101
+ }
102
+ throw error;
103
+ }
104
+ }
105
+ return undefined;
106
+ }
107
+ const exhaustive = contentType;
108
+ throw new Error(`Unknown content type: ${String(exhaustive)}`);
109
+ }
110
+ async readAssociation(baseDir, descriptor, associationType) {
111
+ const filePath = buildAssociationFilePath(baseDir, descriptor, associationType);
112
+ try {
113
+ const content = await fs.readFile(filePath, 'utf-8');
114
+ const json = JSON.parse(content);
115
+ logger.debug(`Read ${associationType} association from ${filePath}`);
116
+ return json.map(item => item.name);
117
+ }
118
+ catch (error) {
119
+ if (error.code === 'ENOENT') {
120
+ return [];
121
+ }
122
+ throw new Error(`Failed to read association from ${filePath}: ${error.message}`, { cause: error });
123
+ }
124
+ }
125
+ async listResources(baseDir) {
126
+ const descriptors = [];
127
+ try {
128
+ await this.walkDirectory(baseDir, baseDir, descriptors);
129
+ }
130
+ catch (error) {
131
+ if (error.code === 'ENOENT') {
132
+ logger.debug(`Base directory does not exist: ${baseDir}`);
133
+ return [];
134
+ }
135
+ throw error;
136
+ }
137
+ logger.debug(`Listed ${descriptors.length} resources from ${baseDir}`);
138
+ return descriptors;
139
+ }
140
+ async deleteResource(baseDir, descriptor) {
141
+ const directory = buildArtifactDirectory(baseDir, descriptor);
142
+ try {
143
+ await fs.rm(directory, { recursive: true, force: true });
144
+ logger.debug(`Deleted resource directory ${directory}`);
145
+ }
146
+ catch (error) {
147
+ if (error.code === 'ENOENT') {
148
+ // Already deleted, no-op
149
+ return;
150
+ }
151
+ throw new Error(`Failed to delete resource: ${error.message}`, { cause: error });
152
+ }
153
+ }
154
+ async ensureDirectory(dirPath) {
155
+ try {
156
+ await fs.mkdir(dirPath, { recursive: true });
157
+ }
158
+ catch (error) {
159
+ throw new Error(`Failed to create directory ${dirPath}: ${error.message}`, { cause: error });
160
+ }
161
+ }
162
+ async walkDirectory(currentPath, baseDir, descriptors) {
163
+ const entries = await fs.readdir(currentPath, { withFileTypes: true });
164
+ for (const entry of entries) {
165
+ const fullPath = path.join(currentPath, entry.name);
166
+ if (entry.isDirectory()) {
167
+ await this.walkDirectory(fullPath, baseDir, descriptors);
168
+ }
169
+ else if (entry.isFile()) {
170
+ // Try to parse file path into descriptor
171
+ const descriptor = parseArtifactPath(baseDir, fullPath);
172
+ if (descriptor) {
173
+ // Avoid duplicates (some types share directories)
174
+ if (!descriptors.some(d => this.descriptorEquals(d, descriptor))) {
175
+ descriptors.push(descriptor);
176
+ }
177
+ }
178
+ }
179
+ }
180
+ }
181
+ descriptorEquals(a, b) {
182
+ return (a.type === b.type &&
183
+ a.nameParts.length === b.nameParts.length &&
184
+ a.nameParts.every((p, i) => p === b.nameParts[i]) &&
185
+ a.workspace === b.workspace);
186
+ }
187
+ }
188
+ //# sourceMappingURL=artifact-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact-store.js","sourceRoot":"","sources":["../../src/clients/artifact-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * T009: IApimClient interface
3
+ * Abstraction over Azure APIM REST API calls
4
+ */
5
+ import { ApimServiceContext, ResourceDescriptor } from '../models/types.js';
6
+ import { ResourceType } from '../models/resource-types.js';
7
+ export interface IApimClient {
8
+ /**
9
+ * List all resources of a given type. Handles ARM pagination (nextLink).
10
+ * Returns an async iterable of raw JSON objects from the `value` array.
11
+ */
12
+ listResources(context: ApimServiceContext, type: ResourceType, parent?: ResourceDescriptor): AsyncIterable<Record<string, unknown>>;
13
+ /**
14
+ * Get a single resource by descriptor.
15
+ * Returns the raw JSON response body, or undefined if 404.
16
+ */
17
+ getResource(context: ApimServiceContext, descriptor: ResourceDescriptor): Promise<Record<string, unknown> | undefined>;
18
+ /**
19
+ * Create or update a resource (PUT).
20
+ * Returns the response JSON body.
21
+ * Polls provisioningState for long-running operations.
22
+ */
23
+ putResource(context: ApimServiceContext, descriptor: ResourceDescriptor, payload: Record<string, unknown>): Promise<Record<string, unknown>>;
24
+ /**
25
+ * Delete a resource (DELETE).
26
+ * Returns true if deleted, false if already absent (404).
27
+ * Polls provisioningState for long-running operations.
28
+ */
29
+ deleteResource(context: ApimServiceContext, descriptor: ResourceDescriptor): Promise<boolean>;
30
+ /**
31
+ * List API revisions for a given API.
32
+ * Returns an async iterable of revision metadata objects.
33
+ */
34
+ listApiRevisions(context: ApimServiceContext, apiName: string): AsyncIterable<Record<string, unknown>>;
35
+ /**
36
+ * Get the API specification (OpenAPI/GraphQL/WSDL/WADL) content.
37
+ * Returns the raw content string and detected format.
38
+ * @param apiType - Optional API type from properties.type (e.g. 'graphql', 'soap', 'http').
39
+ * Used to select the correct APIM export format. Defaults to OpenAPI link export.
40
+ */
41
+ getApiSpecification(context: ApimServiceContext, apiName: string, apiType?: string): Promise<{
42
+ content: string;
43
+ format: 'yaml' | 'json' | 'graphql' | 'wsdl' | 'wadl';
44
+ } | undefined>;
45
+ /**
46
+ * Validate that the target resource group and APIM service instance exist.
47
+ * Throws an error with a clear message if either is not found (404).
48
+ * Must be called before any publish operations to surface missing infrastructure early.
49
+ */
50
+ validatePreFlight(context: ApimServiceContext): Promise<void>;
51
+ }
52
+ //# sourceMappingURL=iapim-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iapim-client.d.ts","sourceRoot":"","sources":["../../src/clients/iapim-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,aAAa,CACX,OAAO,EAAE,kBAAkB,EAC3B,IAAI,EAAE,YAAY,EAClB,MAAM,CAAC,EAAE,kBAAkB,GAC1B,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAE1C;;;OAGG;IACH,WAAW,CACT,OAAO,EAAE,kBAAkB,EAC3B,UAAU,EAAE,kBAAkB,GAC7B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC;IAEhD;;;;OAIG;IACH,WAAW,CACT,OAAO,EAAE,kBAAkB,EAC3B,UAAU,EAAE,kBAAkB,EAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAEpC;;;;OAIG;IACH,cAAc,CACZ,OAAO,EAAE,kBAAkB,EAC3B,UAAU,EAAE,kBAAkB,GAC7B,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB;;;OAGG;IACH,gBAAgB,CACd,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,MAAM,GACd,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAE1C;;;;;OAKG;IACH,mBAAmB,CACjB,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CACN;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAA;KAAE,GAC1E,SAAS,CACZ,CAAC;IAEF;;;;OAIG;IACH,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/D"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * T009: IApimClient interface
3
+ * Abstraction over Azure APIM REST API calls
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=iapim-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iapim-client.js","sourceRoot":"","sources":["../../src/clients/iapim-client.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * T010: IArtifactStore interface
3
+ * Abstraction over local filesystem for reading/writing APIM artifact files
4
+ */
5
+ import { ResourceDescriptor } from '../models/types.js';
6
+ export interface IArtifactStore {
7
+ /**
8
+ * Write a resource's JSON payload to the artifact directory.
9
+ * Creates parent directories as needed.
10
+ * File path is derived from the descriptor using standard naming conventions.
11
+ */
12
+ writeResource(baseDir: string, descriptor: ResourceDescriptor, json: Record<string, unknown>): Promise<void>;
13
+ /**
14
+ * Write raw content (policy XML, API specification) to a file.
15
+ * Path is derived from descriptor + content type.
16
+ */
17
+ writeContent(baseDir: string, descriptor: ResourceDescriptor, content: string, contentType: 'policy' | 'specification', format?: string): Promise<void>;
18
+ /**
19
+ * Write an association file (e.g., product → apis.json, product → groups.json, product → tags.json).
20
+ */
21
+ writeAssociation(baseDir: string, descriptor: ResourceDescriptor, associationType: 'apis' | 'groups' | 'tags', names: string[]): Promise<void>;
22
+ /**
23
+ * Read a resource's JSON payload from the artifact directory.
24
+ * Returns undefined if the file doesn't exist.
25
+ */
26
+ readResource(baseDir: string, descriptor: ResourceDescriptor): Promise<Record<string, unknown> | undefined>;
27
+ /**
28
+ * Read raw content (policy XML, API specification) from a file.
29
+ * Returns undefined if the file doesn't exist.
30
+ */
31
+ readContent(baseDir: string, descriptor: ResourceDescriptor, contentType: 'policy' | 'specification'): Promise<{
32
+ content: string;
33
+ format?: string;
34
+ } | undefined>;
35
+ /**
36
+ * Read an association file.
37
+ * Returns empty array if file doesn't exist.
38
+ */
39
+ readAssociation(baseDir: string, descriptor: ResourceDescriptor, associationType: 'apis' | 'groups' | 'tags'): Promise<string[]>;
40
+ /**
41
+ * List all resource descriptors found in the artifact directory.
42
+ * Walks the directory tree and parses paths back into descriptors.
43
+ */
44
+ listResources(baseDir: string): Promise<ResourceDescriptor[]>;
45
+ /**
46
+ * Delete a resource's artifacts (info file + associated content files).
47
+ */
48
+ deleteResource(baseDir: string, descriptor: ResourceDescriptor): Promise<void>;
49
+ }
50
+ //# sourceMappingURL=iartifact-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iartifact-store.d.ts","sourceRoot":"","sources":["../../src/clients/iartifact-store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,aAAa,CACX,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,kBAAkB,EAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;;OAGG;IACH,YAAY,CACV,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,kBAAkB,EAC9B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,QAAQ,GAAG,eAAe,EACvC,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;OAEG;IACH,gBAAgB,CACd,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,kBAAkB,EAC9B,eAAe,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,EAC3C,KAAK,EAAE,MAAM,EAAE,GACd,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;;OAGG;IACH,YAAY,CACV,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,kBAAkB,GAC7B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC;IAEhD;;;OAGG;IACH,WAAW,CACT,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,kBAAkB,EAC9B,WAAW,EAAE,QAAQ,GAAG,eAAe,GACtC,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC,CAAC;IAE7D;;;OAGG;IACH,eAAe,CACb,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,kBAAkB,EAC9B,eAAe,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,GAC1C,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAErB;;;OAGG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAE9D;;OAEG;IACH,cAAc,CACZ,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,kBAAkB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * T010: IArtifactStore interface
3
+ * Abstraction over local filesystem for reading/writing APIM artifact files
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=iartifact-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iartifact-store.js","sourceRoot":"","sources":["../../src/clients/iartifact-store.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Utilities for detecting auto-generated APIM resource IDs.
3
+ *
4
+ * APIM auto-generates 24-character lowercase hex IDs for certain resources:
5
+ * - ApiSchema: when importing OpenAPI/WSDL specs, schemas get auto-generated IDs
6
+ * - NamedValue: logger credentials (e.g., EventHub connection strings)
7
+ *
8
+ * These auto-generated resources should typically be skipped during publish
9
+ * because APIM recreates them when the parent resource is published.
10
+ */
11
+ /**
12
+ * Checks if a resource name/ID is an auto-generated 24-character hex ID.
13
+ *
14
+ * APIM auto-generates these IDs for:
15
+ * - ApiSchema resources when importing OpenAPI/WSDL specifications
16
+ * - NamedValue resources for logger credentials (EventHub, etc.)
17
+ *
18
+ * @param name - The resource name or ID to check
19
+ * @returns true if the name matches the auto-generated pattern
20
+ *
21
+ * @example
22
+ * isAutoGeneratedId('69f15c3c10a45d29d855583a') // true
23
+ * isAutoGeneratedId('src-rest-schema-item') // false
24
+ * isAutoGeneratedId('my-named-value') // false
25
+ */
26
+ export declare function isAutoGeneratedId(name: string): boolean;
27
+ //# sourceMappingURL=auto-generated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-generated.d.ts","sourceRoot":"","sources":["../../src/lib/auto-generated.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Utilities for detecting auto-generated APIM resource IDs.
3
+ *
4
+ * APIM auto-generates 24-character lowercase hex IDs for certain resources:
5
+ * - ApiSchema: when importing OpenAPI/WSDL specs, schemas get auto-generated IDs
6
+ * - NamedValue: logger credentials (e.g., EventHub connection strings)
7
+ *
8
+ * These auto-generated resources should typically be skipped during publish
9
+ * because APIM recreates them when the parent resource is published.
10
+ */
11
+ /**
12
+ * Pattern matching auto-generated 24-character lowercase hex IDs that APIM creates.
13
+ * Examples: "69f15c3c10a45d29d855583a", "69f16ad1ee7da61d543198f7"
14
+ */
15
+ const AUTO_GENERATED_ID_PATTERN = /^[0-9a-f]{24}$/;
16
+ /**
17
+ * Checks if a resource name/ID is an auto-generated 24-character hex ID.
18
+ *
19
+ * APIM auto-generates these IDs for:
20
+ * - ApiSchema resources when importing OpenAPI/WSDL specifications
21
+ * - NamedValue resources for logger credentials (EventHub, etc.)
22
+ *
23
+ * @param name - The resource name or ID to check
24
+ * @returns true if the name matches the auto-generated pattern
25
+ *
26
+ * @example
27
+ * isAutoGeneratedId('69f15c3c10a45d29d855583a') // true
28
+ * isAutoGeneratedId('src-rest-schema-item') // false
29
+ * isAutoGeneratedId('my-named-value') // false
30
+ */
31
+ export function isAutoGeneratedId(name) {
32
+ return AUTO_GENERATED_ID_PATTERN.test(name);
33
+ }
34
+ //# sourceMappingURL=auto-generated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-generated.js","sourceRoot":"","sources":["../../src/lib/auto-generated.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;GAGG;AACH,MAAM,yBAAyB,GAAG,gBAAgB,CAAC;AAEnD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * T039: Sovereign cloud configuration
3
+ * Maps the --cloud CLI flag to ARM base URLs and auth scopes for
4
+ * Azure Public, China, US Government, and Germany clouds.
5
+ */
6
+ /**
7
+ * Cloud environment configuration containing ARM endpoint and auth scope.
8
+ */
9
+ export interface CloudConfig {
10
+ /** Azure Resource Manager base URL (e.g. https://management.azure.com) */
11
+ readonly armBaseUrl: string;
12
+ /** OAuth2 scope for ARM token requests */
13
+ readonly authScope: string;
14
+ }
15
+ /**
16
+ * Canonical short names accepted by the --cloud CLI flag.
17
+ */
18
+ export type CloudName = 'public' | 'china' | 'usgov' | 'germany';
19
+ /**
20
+ * Resolve a cloud name (short or official long form) to its configuration.
21
+ * Throws if the name is not recognized.
22
+ */
23
+ export declare function getCloudConfig(cloudName: string): CloudConfig;
24
+ /**
25
+ * Build the APIM ARM base URL for a given cloud, subscription, resource group,
26
+ * and service name. Replaces the hardcoded buildBaseUrl functions in command files.
27
+ */
28
+ export declare function buildArmBaseUrl(cloudName: string, subscriptionId: string, resourceGroup: string, serviceName: string): string;
29
+ //# sourceMappingURL=cloud-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-config.d.ts","sourceRoot":"","sources":["../../src/lib/cloud-config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,0EAA0E;IAC1E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,0CAA0C;IAC1C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;AAkCjE;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAkB7D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,GAClB,MAAM,CAGR"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * T039: Sovereign cloud configuration
3
+ * Maps the --cloud CLI flag to ARM base URLs and auth scopes for
4
+ * Azure Public, China, US Government, and Germany clouds.
5
+ */
6
+ const CLOUD_CONFIGS = {
7
+ public: {
8
+ armBaseUrl: 'https://management.azure.com',
9
+ authScope: 'https://management.azure.com/.default',
10
+ },
11
+ china: {
12
+ armBaseUrl: 'https://management.chinacloudapi.cn',
13
+ authScope: 'https://management.chinacloudapi.cn/.default',
14
+ },
15
+ usgov: {
16
+ armBaseUrl: 'https://management.usgovcloudapi.net',
17
+ authScope: 'https://management.usgovcloudapi.net/.default',
18
+ },
19
+ germany: {
20
+ armBaseUrl: 'https://management.microsoftazure.de',
21
+ authScope: 'https://management.microsoftazure.de/.default',
22
+ },
23
+ };
24
+ /** Map official long names to canonical short names */
25
+ const OFFICIAL_NAME_MAP = {
26
+ AzureCloud: 'public',
27
+ AzureChinaCloud: 'china',
28
+ AzureUSGovernment: 'usgov',
29
+ AzureGermanCloud: 'germany',
30
+ };
31
+ /**
32
+ * Resolve a cloud name (short or official long form) to its configuration.
33
+ * Throws if the name is not recognized.
34
+ */
35
+ export function getCloudConfig(cloudName) {
36
+ // Try short name first
37
+ const shortName = cloudName;
38
+ if (CLOUD_CONFIGS[shortName]) {
39
+ return CLOUD_CONFIGS[shortName];
40
+ }
41
+ // Try official long name
42
+ const mapped = OFFICIAL_NAME_MAP[cloudName];
43
+ if (mapped) {
44
+ return CLOUD_CONFIGS[mapped];
45
+ }
46
+ const validNames = [
47
+ ...Object.keys(CLOUD_CONFIGS),
48
+ ...Object.keys(OFFICIAL_NAME_MAP),
49
+ ].join(', ');
50
+ throw new Error(`Unknown cloud "${cloudName}". Valid values: ${validNames}`);
51
+ }
52
+ /**
53
+ * Build the APIM ARM base URL for a given cloud, subscription, resource group,
54
+ * and service name. Replaces the hardcoded buildBaseUrl functions in command files.
55
+ */
56
+ export function buildArmBaseUrl(cloudName, subscriptionId, resourceGroup, serviceName) {
57
+ const config = getCloudConfig(cloudName);
58
+ return `${config.armBaseUrl}/subscriptions/${encodeURIComponent(subscriptionId)}/resourceGroups/${encodeURIComponent(resourceGroup)}/providers/Microsoft.ApiManagement/service/${encodeURIComponent(serviceName)}`;
59
+ }
60
+ //# sourceMappingURL=cloud-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-config.js","sourceRoot":"","sources":["../../src/lib/cloud-config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAsBH,MAAM,aAAa,GAAmC;IACpD,MAAM,EAAE;QACN,UAAU,EAAE,8BAA8B;QAC1C,SAAS,EAAE,uCAAuC;KACnD;IACD,KAAK,EAAE;QACL,UAAU,EAAE,qCAAqC;QACjD,SAAS,EAAE,8CAA8C;KAC1D;IACD,KAAK,EAAE;QACL,UAAU,EAAE,sCAAsC;QAClD,SAAS,EAAE,+CAA+C;KAC3D;IACD,OAAO,EAAE;QACP,UAAU,EAAE,sCAAsC;QAClD,SAAS,EAAE,+CAA+C;KAC3D;CACF,CAAC;AAEF,uDAAuD;AACvD,MAAM,iBAAiB,GAAyC;IAC9D,UAAU,EAAE,QAAQ;IACpB,eAAe,EAAE,OAAO;IACxB,iBAAiB,EAAE,OAAO;IAC1B,gBAAgB,EAAE,SAAS;CAC5B,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,uBAAuB;IACvB,MAAM,SAAS,GAAG,SAAsB,CAAC;IACzC,IAAI,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,OAAO,aAAa,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;IAED,yBAAyB;IACzB,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAA8B,CAAC,CAAC;IACjE,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,UAAU,GAAG;QACjB,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;QAC7B,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC;KAClC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,MAAM,IAAI,KAAK,CAAC,kBAAkB,SAAS,oBAAoB,UAAU,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,SAAiB,EACjB,cAAsB,EACtB,aAAqB,EACrB,WAAmB;IAEnB,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IACzC,OAAO,GAAG,MAAM,CAAC,UAAU,kBAAkB,kBAAkB,CAAC,cAAc,CAAC,mBAAmB,kBAAkB,CAAC,aAAa,CAAC,8CAA8C,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC;AACrN,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * T015: YAML config loader with validation
3
+ * Parse filter YAML, override YAML, and OTel config files
4
+ */
5
+ import { FilterConfig, OverrideConfig } from '../models/config.js';
6
+ /**
7
+ * Load and parse a filter configuration YAML file.
8
+ * Returns undefined if file doesn't exist.
9
+ */
10
+ export declare function loadFilterConfig(filePath: string): Promise<FilterConfig | undefined>;
11
+ /**
12
+ * Load and parse an override configuration YAML file.
13
+ * Returns undefined if file doesn't exist.
14
+ */
15
+ export declare function loadOverrideConfig(filePath: string): Promise<OverrideConfig | undefined>;
16
+ /**
17
+ * Load and parse an OpenTelemetry configuration YAML file.
18
+ * Returns undefined if file doesn't exist.
19
+ */
20
+ export declare function loadOTelConfig(filePath: string): Promise<Record<string, unknown> | undefined>;
21
+ //# sourceMappingURL=config-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/lib/config-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAoBnE;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAkE1F;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAiB9F;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAcnG"}