@peterhauge/apiops-cli 0.1.7-alpha.0 → 0.2.0-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 (207) hide show
  1. package/LICENSE.md +22 -22
  2. package/README.md +169 -169
  3. package/dist/cli/extract-command.d.ts +0 -0
  4. package/dist/cli/extract-command.d.ts.map +0 -0
  5. package/dist/cli/extract-command.js +0 -0
  6. package/dist/cli/extract-command.js.map +0 -0
  7. package/dist/cli/index.d.ts +0 -0
  8. package/dist/cli/index.d.ts.map +0 -0
  9. package/dist/cli/index.js +0 -0
  10. package/dist/cli/index.js.map +0 -0
  11. package/dist/cli/init-command.d.ts +0 -0
  12. package/dist/cli/init-command.d.ts.map +1 -1
  13. package/dist/cli/init-command.js +2 -1
  14. package/dist/cli/init-command.js.map +1 -1
  15. package/dist/cli/publish-command.d.ts +0 -0
  16. package/dist/cli/publish-command.d.ts.map +0 -0
  17. package/dist/cli/publish-command.js +0 -0
  18. package/dist/cli/publish-command.js.map +0 -0
  19. package/dist/clients/apim-client.d.ts +25 -1
  20. package/dist/clients/apim-client.d.ts.map +1 -1
  21. package/dist/clients/apim-client.js +173 -9
  22. package/dist/clients/apim-client.js.map +1 -1
  23. package/dist/clients/artifact-store.d.ts +0 -0
  24. package/dist/clients/artifact-store.d.ts.map +0 -0
  25. package/dist/clients/artifact-store.js +0 -0
  26. package/dist/clients/artifact-store.js.map +0 -0
  27. package/dist/clients/iapim-client.d.ts +6 -0
  28. package/dist/clients/iapim-client.d.ts.map +1 -1
  29. package/dist/clients/iapim-client.js +0 -0
  30. package/dist/clients/iapim-client.js.map +0 -0
  31. package/dist/clients/iartifact-store.d.ts +0 -0
  32. package/dist/clients/iartifact-store.d.ts.map +0 -0
  33. package/dist/clients/iartifact-store.js +0 -0
  34. package/dist/clients/iartifact-store.js.map +0 -0
  35. package/dist/lib/auto-generated.d.ts +0 -0
  36. package/dist/lib/auto-generated.d.ts.map +0 -0
  37. package/dist/lib/auto-generated.js +0 -0
  38. package/dist/lib/auto-generated.js.map +0 -0
  39. package/dist/lib/cloud-config.d.ts +0 -0
  40. package/dist/lib/cloud-config.d.ts.map +0 -0
  41. package/dist/lib/cloud-config.js +0 -0
  42. package/dist/lib/cloud-config.js.map +0 -0
  43. package/dist/lib/config-loader.d.ts +0 -4
  44. package/dist/lib/config-loader.d.ts.map +1 -1
  45. package/dist/lib/config-loader.js +290 -51
  46. package/dist/lib/config-loader.js.map +1 -1
  47. package/dist/lib/dependency-graph.d.ts +0 -0
  48. package/dist/lib/dependency-graph.d.ts.map +0 -0
  49. package/dist/lib/dependency-graph.js +0 -0
  50. package/dist/lib/dependency-graph.js.map +0 -0
  51. package/dist/lib/exit-codes.d.ts +0 -0
  52. package/dist/lib/exit-codes.d.ts.map +0 -0
  53. package/dist/lib/exit-codes.js +0 -0
  54. package/dist/lib/exit-codes.js.map +0 -0
  55. package/dist/lib/logger.d.ts +0 -0
  56. package/dist/lib/logger.d.ts.map +0 -0
  57. package/dist/lib/logger.js +0 -0
  58. package/dist/lib/logger.js.map +0 -0
  59. package/dist/lib/parallel-runner.d.ts +0 -0
  60. package/dist/lib/parallel-runner.d.ts.map +0 -0
  61. package/dist/lib/parallel-runner.js +0 -0
  62. package/dist/lib/parallel-runner.js.map +0 -0
  63. package/dist/lib/resource-path.d.ts +0 -0
  64. package/dist/lib/resource-path.d.ts.map +1 -1
  65. package/dist/lib/resource-path.js +20 -2
  66. package/dist/lib/resource-path.js.map +1 -1
  67. package/dist/lib/resource-uri.d.ts +0 -0
  68. package/dist/lib/resource-uri.d.ts.map +1 -1
  69. package/dist/lib/resource-uri.js +24 -4
  70. package/dist/lib/resource-uri.js.map +1 -1
  71. package/dist/lib/user-agent.d.ts +0 -0
  72. package/dist/lib/user-agent.d.ts.map +0 -0
  73. package/dist/lib/user-agent.js +0 -0
  74. package/dist/lib/user-agent.js.map +0 -0
  75. package/dist/lib/workspace-link.d.ts +46 -0
  76. package/dist/lib/workspace-link.d.ts.map +1 -0
  77. package/dist/lib/workspace-link.js +93 -0
  78. package/dist/lib/workspace-link.js.map +1 -0
  79. package/dist/models/config.d.ts +80 -44
  80. package/dist/models/config.d.ts.map +1 -1
  81. package/dist/models/config.js +0 -0
  82. package/dist/models/config.js.map +0 -0
  83. package/dist/models/resource-types.d.ts +14 -1
  84. package/dist/models/resource-types.d.ts.map +1 -1
  85. package/dist/models/resource-types.js +11 -3
  86. package/dist/models/resource-types.js.map +1 -1
  87. package/dist/models/types.d.ts +0 -0
  88. package/dist/models/types.d.ts.map +0 -0
  89. package/dist/models/types.js +0 -0
  90. package/dist/models/types.js.map +0 -0
  91. package/dist/services/api-extractor.d.ts +19 -0
  92. package/dist/services/api-extractor.d.ts.map +1 -1
  93. package/dist/services/api-extractor.js +87 -6
  94. package/dist/services/api-extractor.js.map +1 -1
  95. package/dist/services/api-publisher.d.ts +0 -0
  96. package/dist/services/api-publisher.d.ts.map +1 -1
  97. package/dist/services/api-publisher.js +242 -62
  98. package/dist/services/api-publisher.js.map +1 -1
  99. package/dist/services/delete-unmatched-service.d.ts +0 -0
  100. package/dist/services/delete-unmatched-service.d.ts.map +0 -0
  101. package/dist/services/delete-unmatched-service.js +0 -0
  102. package/dist/services/delete-unmatched-service.js.map +0 -0
  103. package/dist/services/dry-run-reporter.d.ts +0 -0
  104. package/dist/services/dry-run-reporter.d.ts.map +0 -0
  105. package/dist/services/dry-run-reporter.js +0 -0
  106. package/dist/services/dry-run-reporter.js.map +0 -0
  107. package/dist/services/extract-service.d.ts +0 -0
  108. package/dist/services/extract-service.d.ts.map +0 -0
  109. package/dist/services/extract-service.js +0 -0
  110. package/dist/services/extract-service.js.map +0 -0
  111. package/dist/services/filter-service.d.ts +1 -0
  112. package/dist/services/filter-service.d.ts.map +1 -1
  113. package/dist/services/filter-service.js +101 -40
  114. package/dist/services/filter-service.js.map +1 -1
  115. package/dist/services/git-diff-service.d.ts +0 -0
  116. package/dist/services/git-diff-service.d.ts.map +0 -0
  117. package/dist/services/git-diff-service.js +0 -0
  118. package/dist/services/git-diff-service.js.map +0 -0
  119. package/dist/services/identity-guide-service.d.ts +1 -1
  120. package/dist/services/identity-guide-service.d.ts.map +1 -1
  121. package/dist/services/identity-guide-service.js +37 -518
  122. package/dist/services/identity-guide-service.js.map +1 -1
  123. package/dist/services/init-service.d.ts +0 -0
  124. package/dist/services/init-service.d.ts.map +1 -1
  125. package/dist/services/init-service.js +51 -19
  126. package/dist/services/init-service.js.map +1 -1
  127. package/dist/services/keyvault-checker.d.ts +0 -0
  128. package/dist/services/keyvault-checker.d.ts.map +0 -0
  129. package/dist/services/keyvault-checker.js +0 -0
  130. package/dist/services/keyvault-checker.js.map +0 -0
  131. package/dist/services/override-merger.d.ts +3 -7
  132. package/dist/services/override-merger.d.ts.map +1 -1
  133. package/dist/services/override-merger.js +198 -47
  134. package/dist/services/override-merger.js.map +1 -1
  135. package/dist/services/product-extractor.d.ts +20 -0
  136. package/dist/services/product-extractor.d.ts.map +1 -1
  137. package/dist/services/product-extractor.js +101 -5
  138. package/dist/services/product-extractor.js.map +1 -1
  139. package/dist/services/product-publisher.d.ts +0 -0
  140. package/dist/services/product-publisher.d.ts.map +1 -1
  141. package/dist/services/product-publisher.js +23 -6
  142. package/dist/services/product-publisher.js.map +1 -1
  143. package/dist/services/prompt-service.d.ts +0 -0
  144. package/dist/services/prompt-service.d.ts.map +0 -0
  145. package/dist/services/prompt-service.js +0 -0
  146. package/dist/services/prompt-service.js.map +0 -0
  147. package/dist/services/publish-service.d.ts +0 -0
  148. package/dist/services/publish-service.d.ts.map +0 -0
  149. package/dist/services/publish-service.js +38 -2
  150. package/dist/services/publish-service.js.map +1 -1
  151. package/dist/services/resource-extractor.d.ts +0 -0
  152. package/dist/services/resource-extractor.d.ts.map +0 -0
  153. package/dist/services/resource-extractor.js +0 -0
  154. package/dist/services/resource-extractor.js.map +0 -0
  155. package/dist/services/resource-publisher.d.ts +0 -0
  156. package/dist/services/resource-publisher.d.ts.map +1 -1
  157. package/dist/services/resource-publisher.js +64 -2
  158. package/dist/services/resource-publisher.js.map +1 -1
  159. package/dist/services/secret-redactor.d.ts +0 -0
  160. package/dist/services/secret-redactor.d.ts.map +0 -0
  161. package/dist/services/secret-redactor.js +0 -0
  162. package/dist/services/secret-redactor.js.map +0 -0
  163. package/dist/services/transitive-resolver.d.ts +0 -0
  164. package/dist/services/transitive-resolver.d.ts.map +1 -1
  165. package/dist/services/transitive-resolver.js +4 -4
  166. package/dist/services/transitive-resolver.js.map +1 -1
  167. package/dist/services/workspace-extractor.d.ts +0 -0
  168. package/dist/services/workspace-extractor.d.ts.map +1 -1
  169. package/dist/services/workspace-extractor.js +50 -7
  170. package/dist/services/workspace-extractor.js.map +1 -1
  171. package/dist/templates/azure-devops/extract-pipeline.d.ts +2 -1
  172. package/dist/templates/azure-devops/extract-pipeline.d.ts.map +1 -1
  173. package/dist/templates/azure-devops/extract-pipeline.js +147 -88
  174. package/dist/templates/azure-devops/extract-pipeline.js.map +1 -1
  175. package/dist/templates/azure-devops/publish-pipeline.d.ts +0 -0
  176. package/dist/templates/azure-devops/publish-pipeline.d.ts.map +1 -1
  177. package/dist/templates/azure-devops/publish-pipeline.js +116 -89
  178. package/dist/templates/azure-devops/publish-pipeline.js.map +1 -1
  179. package/dist/templates/configs/filter-config.d.ts +1 -1
  180. package/dist/templates/configs/filter-config.d.ts.map +1 -1
  181. package/dist/templates/configs/filter-config.js +109 -44
  182. package/dist/templates/configs/filter-config.js.map +1 -1
  183. package/dist/templates/configs/override-config.d.ts +0 -0
  184. package/dist/templates/configs/override-config.d.ts.map +1 -1
  185. package/dist/templates/configs/override-config.js +88 -37
  186. package/dist/templates/configs/override-config.js.map +1 -1
  187. package/dist/templates/configs/package-json.d.ts +0 -0
  188. package/dist/templates/configs/package-json.d.ts.map +0 -0
  189. package/dist/templates/configs/package-json.js +0 -0
  190. package/dist/templates/configs/package-json.js.map +0 -0
  191. package/dist/templates/copilot/identity-setup-prompt.d.ts +4 -3
  192. package/dist/templates/copilot/identity-setup-prompt.d.ts.map +1 -1
  193. package/dist/templates/copilot/identity-setup-prompt.js +59 -269
  194. package/dist/templates/copilot/identity-setup-prompt.js.map +1 -1
  195. package/dist/templates/generated/embedded-markdown.d.ts +12 -0
  196. package/dist/templates/generated/embedded-markdown.d.ts.map +1 -0
  197. package/dist/templates/generated/embedded-markdown.js +14 -0
  198. package/dist/templates/generated/embedded-markdown.js.map +1 -0
  199. package/dist/templates/github-actions/extract-workflow.d.ts +0 -0
  200. package/dist/templates/github-actions/extract-workflow.d.ts.map +0 -0
  201. package/dist/templates/github-actions/extract-workflow.js +118 -118
  202. package/dist/templates/github-actions/extract-workflow.js.map +0 -0
  203. package/dist/templates/github-actions/publish-workflow.d.ts +0 -0
  204. package/dist/templates/github-actions/publish-workflow.d.ts.map +1 -1
  205. package/dist/templates/github-actions/publish-workflow.js +104 -90
  206. package/dist/templates/github-actions/publish-workflow.js.map +1 -1
  207. package/package.json +69 -66
@@ -5,527 +5,46 @@
5
5
  * Step-by-step instructions for service principal, RBAC, federated credentials,
6
6
  * pipeline secrets/service connections. Optional az CLI automation per FR-021.
7
7
  */
8
+ import { azureDevOpsIdentitySetupCoreTemplate, azureDevOpsIdentityGuideTemplate, githubActionsIdentityGuideTemplate, } from '../templates/generated/embedded-markdown.js';
8
9
  class IdentityGuideServiceImpl {
10
+ renderTemplate(template, tokens) {
11
+ return Object.entries(tokens).reduce((rendered, [key, value]) => rendered.replaceAll(`{{${key}}}`, value), template);
12
+ }
9
13
  generateGitHubActionsGuide(subscriptionId, resourceGroup, environments) {
10
- return `# GitHub Actions Identity Setup Guide
11
-
12
- ## Prerequisites
13
- - Azure subscription: ${subscriptionId}
14
- - Resource group: ${resourceGroup}
15
- - GitHub repository with OIDC enabled
16
-
17
- ## Step 1: Create Service Principal
18
-
19
- Run the following Azure CLI commands to create a service principal with federated credentials:
20
-
21
- \`\`\`bash
22
- # Set variables
23
- SUBSCRIPTION_ID="${subscriptionId}"
24
- RESOURCE_GROUP="${resourceGroup}"
25
- APP_NAME="apiops-github-sp"
26
- GITHUB_ORG="<your-github-org>"
27
- GITHUB_REPO="<your-github-repo>"
28
-
29
- # Create Azure AD Application
30
- APP_ID=$(az ad app create \\
31
- --display-name "$APP_NAME" \\
32
- --query appId -o tsv)
33
-
34
- # Create Service Principal
35
- az ad sp create --id "$APP_ID"
36
-
37
- # Get Service Principal Object ID
38
- SP_OBJECT_ID=$(az ad sp show --id "$APP_ID" --query id -o tsv)
39
-
40
- echo "Application (client) ID: $APP_ID"
41
- echo "Service Principal Object ID: $SP_OBJECT_ID"
42
- \`\`\`
43
-
44
- ## Step 2: Assign RBAC Roles
45
-
46
- Grant the service principal "API Management Service Contributor" role on your APIM instance:
47
-
48
- \`\`\`bash
49
- # Get APIM resource ID
50
- APIM_RESOURCE_ID=$(az apim show \\
51
- --resource-group "$RESOURCE_GROUP" \\
52
- --name "<your-apim-service-name>" \\
53
- --query id -o tsv)
54
-
55
- # Assign role
56
- az role assignment create \\
57
- --assignee "$APP_ID" \\
58
- --role "API Management Service Contributor" \\
59
- --scope "$APIM_RESOURCE_ID"
60
- \`\`\`
61
-
62
- ## Step 3: Configure Federated Credentials
63
-
64
- Set up OIDC federation for GitHub Actions:
65
-
66
- \`\`\`bash
67
- # For main branch deployments
68
- az ad app federated-credential create \\
69
- --id "$APP_ID" \\
70
- --parameters '{
71
- "name": "github-main-branch",
72
- "issuer": "https://token.actions.githubusercontent.com",
73
- "subject": "repo:'"$GITHUB_ORG"'/'"$GITHUB_REPO"':ref:refs/heads/main",
74
- "audiences": ["api://AzureADTokenExchange"]
75
- }'
76
-
77
- # For environment deployments (repeat for each environment)
78
- ${environments.map((env) => `az ad app federated-credential create \\
79
- --id "$APP_ID" \\
80
- --parameters '{
81
- "name": "github-env-${env}",
82
- "issuer": "https://token.actions.githubusercontent.com",
83
- "subject": "repo:'"$GITHUB_ORG"'/'"$GITHUB_REPO"':environment:${env}",
84
- "audiences": ["api://AzureADTokenExchange"]
85
- }'`).join('\n\n')}
86
- \`\`\`
87
-
88
- ## Step 4: Configure GitHub Secrets
89
-
90
- Add the following secrets to your GitHub repository (Settings → Secrets and variables → Actions):
91
-
92
- ### Repository Secrets:
93
- - \`AZURE_CLIENT_ID\`: $APP_ID (from Step 1)
94
- - \`AZURE_TENANT_ID\`: Run \`az account show --query tenantId -o tsv\`
95
- - \`AZURE_SUBSCRIPTION_ID\`: ${subscriptionId}
96
-
97
- ### Environment-Specific Secrets:
98
- ${environments.map((env) => `
99
- **For ${env} environment:**
100
- - \`APIM_RESOURCE_GROUP_${env.toUpperCase()}\`: Resource group for ${env}
101
- - \`APIM_SERVICE_NAME_${env.toUpperCase()}\`: APIM service name for ${env}
102
- `).join('\n')}
103
-
104
- ### Extract Workflow Secrets:
105
- - \`APIM_RESOURCE_GROUP\`: Default resource group for extract
106
- - \`APIM_SERVICE_NAME\`: Default APIM service name for extract
107
-
108
- ## Step 5: Verify Setup
109
-
110
- Test the authentication by running a workflow manually or pushing to main branch.
111
-
112
- ## Security Notes
113
- - Use GitHub Environments for production deployments with required reviewers
114
- - Review federated credential subjects periodically (no secrets to rotate — OIDC authentication has no stored credentials)
115
- - Review RBAC role assignments regularly and remove any no longer needed
116
- - Use least-privilege RBAC assignments
117
- `;
14
+ const federatedCredentialsPerEnvironment = environments.map((env) => `az ad app federated-credential create \\
15
+ --id "$APP_ID" \\
16
+ --parameters '{
17
+ "name": "github-env-${env}",
18
+ "issuer": "https://token.actions.githubusercontent.com",
19
+ "subject": "repo:'"$GITHUB_ORG"'/'"$GITHUB_REPO"':environment:${env}",
20
+ "audiences": ["api://AzureADTokenExchange"]
21
+ }'`).join('\n\n');
22
+ const environmentSecrets = environments.map((env) => `
23
+ **For ${env} environment:**
24
+ - \`APIM_RESOURCE_GROUP_${env.toUpperCase()}\`: Resource group for ${env}
25
+ - \`APIM_SERVICE_NAME_${env.toUpperCase()}\`: APIM service name for ${env}
26
+ `).join('\n');
27
+ return this.renderTemplate(githubActionsIdentityGuideTemplate, {
28
+ SUBSCRIPTION_ID: subscriptionId,
29
+ RESOURCE_GROUP: resourceGroup,
30
+ FEDERATED_CREDENTIALS_PER_ENV: federatedCredentialsPerEnvironment,
31
+ ENVIRONMENT_SECRETS: environmentSecrets,
32
+ });
118
33
  }
119
- generateAzureDevOpsGuide(subscriptionId, resourceGroup, environments) {
120
- const environmentsArrayPowerShell = environments.map((e) => `"${e}"`).join(', ');
121
- const environmentsArrayBash = environments.map((e) => `"${e}"`).join(' ');
122
- return `# Azure DevOps Identity Setup Guide
123
-
124
- ## Prerequisites
125
- - Azure subscription: ${subscriptionId}
126
- - Resource group: ${resourceGroup}
127
- - Azure DevOps organization and project
128
- - Azure CLI installed and authenticated (\`az login\`)
129
-
130
- > **Note:** All commands use only built-in tools—no additional installations required. Commands are shown for both **PowerShell** and **Git Bash** where syntax differs.
131
-
132
- ---
133
-
134
- ## Step 1: Set Variables
135
-
136
- **PowerShell:**
137
- \`\`\`powershell
138
- $SUBSCRIPTION_ID = "${subscriptionId}"
139
- $RESOURCE_GROUP = "${resourceGroup}"
140
- $APP_NAME = "apiops-azdo-sp"
141
- $ENVIRONMENTS = @(${environmentsArrayPowerShell})
142
- \`\`\`
143
-
144
- **Git Bash:**
145
- \`\`\`bash
146
- SUBSCRIPTION_ID="${subscriptionId}"
147
- RESOURCE_GROUP="${resourceGroup}"
148
- APP_NAME="apiops-azdo-sp"
149
- ENVIRONMENTS=(${environmentsArrayBash})
150
- \`\`\`
151
-
152
- ---
153
-
154
- ## Step 2: Create Service Principal
155
-
156
- **PowerShell:**
157
- \`\`\`powershell
158
- $SP_OUTPUT = az ad sp create-for-rbac --name $APP_NAME --role "API Management Service Contributor" --scopes "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP"
159
- $spObj = $SP_OUTPUT | ConvertFrom-Json
160
- $APP_ID = $spObj.appId
161
- $PASSWORD = $spObj.password
162
- $TENANT_ID = $spObj.tenant
163
- \`\`\`
164
-
165
- **Git Bash:** (use \`MSYS_NO_PATHCONV=1\` to prevent path conversion on Windows)
166
- \`\`\`bash
167
- SP_OUTPUT=$(MSYS_NO_PATHCONV=1 az ad sp create-for-rbac --name "$APP_NAME" --role "API Management Service Contributor" --scopes "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP")
168
- APP_ID=$(echo "$SP_OUTPUT" | grep -o '"appId": *"[^"]*"' | cut -d'"' -f4)
169
- PASSWORD=$(echo "$SP_OUTPUT" | grep -o '"password": *"[^"]*"' | cut -d'"' -f4)
170
- TENANT_ID=$(echo "$SP_OUTPUT" | grep -o '"tenant": *"[^"]*"' | cut -d'"' -f4)
171
- \`\`\`
172
-
173
- **Important:** The password is only shown once during creation. Save it securely now!
174
-
175
- ---
176
-
177
- ## Step 3: Configure Azure DevOps CLI
178
-
179
- Install the extension (works in both shells):
180
- \`\`\`bash
181
- az extension add --name azure-devops
182
- \`\`\`
183
-
184
- Set organization defaults:
185
-
186
- **PowerShell:**
187
- \`\`\`powershell
188
- # For self-hosted Azure DevOps Server, use: https://<server>/<collection>
189
- $AZDO_ORG = "https://dev.azure.com/<your-org>"
190
- $ORG_NAME = "<your-org>" # Used for Build Service identity
191
- $AZDO_PROJECT = "<your-project>"
192
- az devops configure --defaults organization=$AZDO_ORG project=$AZDO_PROJECT
193
- $SUBSCRIPTION_NAME = az account show --subscription $SUBSCRIPTION_ID --query name -o tsv
194
- \`\`\`
195
-
196
- **Git Bash:**
197
- \`\`\`bash
198
- # For self-hosted Azure DevOps Server, use: https://<server>/<collection>
199
- AZDO_ORG="https://dev.azure.com/<your-org>"
200
- ORG_NAME="<your-org>" # Used for Build Service identity
201
- AZDO_PROJECT="<your-project>"
202
- az devops configure --defaults organization="$AZDO_ORG" project="$AZDO_PROJECT"
203
- SUBSCRIPTION_NAME=$(az account show --subscription "$SUBSCRIPTION_ID" --query name -o tsv)
204
- \`\`\`
205
-
206
- ---
207
-
208
- ## Step 4: Create Azure Service Connections
209
-
210
- Set the service principal key for non-interactive creation:
211
-
212
- **PowerShell:**
213
- \`\`\`powershell
214
- $env:AZURE_DEVOPS_EXT_AZURE_RM_SERVICE_PRINCIPAL_KEY = $PASSWORD
215
- \`\`\`
216
-
217
- **Git Bash:**
218
- \`\`\`bash
219
- export AZURE_DEVOPS_EXT_AZURE_RM_SERVICE_PRINCIPAL_KEY="$PASSWORD"
220
- \`\`\`
221
-
222
- Create the base service connection and one per environment:
223
-
224
- **PowerShell:**
225
- \`\`\`powershell
226
- az devops service-endpoint azurerm create --name "AZURE_SERVICE_CONNECTION" --azure-rm-service-principal-id $APP_ID --azure-rm-subscription-id $SUBSCRIPTION_ID --azure-rm-subscription-name $SUBSCRIPTION_NAME --azure-rm-tenant-id $TENANT_ID
227
-
228
- foreach ($env in $ENVIRONMENTS) {
229
- $envUpper = $env.ToUpper()
230
- az devops service-endpoint azurerm create --name "AZURE_SERVICE_CONNECTION_$envUpper" --azure-rm-service-principal-id $APP_ID --azure-rm-subscription-id $SUBSCRIPTION_ID --azure-rm-subscription-name $SUBSCRIPTION_NAME --azure-rm-tenant-id $TENANT_ID
231
- }
232
- \`\`\`
233
-
234
- **Git Bash:**
235
- \`\`\`bash
236
- az devops service-endpoint azurerm create --name "AZURE_SERVICE_CONNECTION" --azure-rm-service-principal-id "$APP_ID" --azure-rm-subscription-id "$SUBSCRIPTION_ID" --azure-rm-subscription-name "$SUBSCRIPTION_NAME" --azure-rm-tenant-id "$TENANT_ID"
237
-
238
- for env in "\${ENVIRONMENTS[@]}"; do
239
- env_upper=$(echo "$env" | tr '[:lower:]' '[:upper:]')
240
- az devops service-endpoint azurerm create --name "AZURE_SERVICE_CONNECTION_$env_upper" --azure-rm-service-principal-id "$APP_ID" --azure-rm-subscription-id "$SUBSCRIPTION_ID" --azure-rm-subscription-name "$SUBSCRIPTION_NAME" --azure-rm-tenant-id "$TENANT_ID"
241
- done
242
- \`\`\`
243
-
244
- Clean up the environment variable:
245
-
246
- **PowerShell:**
247
- \`\`\`powershell
248
- Remove-Item Env:AZURE_DEVOPS_EXT_AZURE_RM_SERVICE_PRINCIPAL_KEY
249
- \`\`\`
250
-
251
- **Git Bash:**
252
- \`\`\`bash
253
- unset AZURE_DEVOPS_EXT_AZURE_RM_SERVICE_PRINCIPAL_KEY
254
- \`\`\`
255
-
256
- Verify (works in both shells):
257
- \`\`\`bash
258
- az devops service-endpoint list --query "[].name" -o table
259
- \`\`\`
260
-
261
- ---
262
-
263
- ## Step 5: Create Variable Groups
264
-
265
- Set target environment variables:
266
-
267
- **PowerShell:**
268
- \`\`\`powershell
269
- $TARGET_SUBSCRIPTION_ID = "${subscriptionId}"
270
- $TARGET_APIM_BASE_NAME = "<your-apim-base-name>"
271
- $TARGET_RESOURCE_GROUP_BASE_NAME = "${resourceGroup}"
272
- \`\`\`
273
-
274
- **Git Bash:**
275
- \`\`\`bash
276
- TARGET_SUBSCRIPTION_ID="${subscriptionId}"
277
- TARGET_APIM_BASE_NAME="<your-apim-base-name>"
278
- TARGET_RESOURCE_GROUP_BASE_NAME="${resourceGroup}"
279
- \`\`\`
280
-
281
- Create the common variable group:
282
-
283
- **PowerShell:**
284
- \`\`\`powershell
285
- az pipelines variable-group create --name "apim-common" --variables AZURE_SUBSCRIPTION_ID=$TARGET_SUBSCRIPTION_ID APIM_RESOURCE_GROUP=$TARGET_RESOURCE_GROUP_BASE_NAME APIM_SERVICE_NAME=$TARGET_APIM_BASE_NAME AZURE_SERVICE_CONNECTION="AZURE_SERVICE_CONNECTION"
286
- \`\`\`
287
-
288
- **Git Bash:**
289
- \`\`\`bash
290
- az pipelines variable-group create --name "apim-common" --variables AZURE_SUBSCRIPTION_ID="$TARGET_SUBSCRIPTION_ID" APIM_RESOURCE_GROUP="$TARGET_RESOURCE_GROUP_BASE_NAME" APIM_SERVICE_NAME="$TARGET_APIM_BASE_NAME" AZURE_SERVICE_CONNECTION="AZURE_SERVICE_CONNECTION"
291
- \`\`\`
292
-
293
- Create environment-specific variable groups:
294
-
295
- **PowerShell:**
296
- \`\`\`powershell
297
- foreach ($env in $ENVIRONMENTS) {
298
- $envUpper = $env.ToUpper()
299
- az pipelines variable-group create --name "apim-$env" --variables "APIM_RESOURCE_GROUP_$envUpper=\${TARGET_RESOURCE_GROUP_BASE_NAME}-$env" "APIM_SERVICE_NAME_$envUpper=\${TARGET_APIM_BASE_NAME}-$env" "AZURE_SERVICE_CONNECTION_$envUpper=AZURE_SERVICE_CONNECTION_$envUpper"
300
- }
301
- \`\`\`
302
-
303
- **Git Bash:**
304
- \`\`\`bash
305
- for env in "\${ENVIRONMENTS[@]}"; do
306
- env_upper=$(echo "$env" | tr '[:lower:]' '[:upper:]')
307
- az pipelines variable-group create --name "apim-$env" --variables "APIM_RESOURCE_GROUP_$env_upper=\${TARGET_RESOURCE_GROUP_BASE_NAME}-$env" "APIM_SERVICE_NAME_$env_upper=\${TARGET_APIM_BASE_NAME}-$env" "AZURE_SERVICE_CONNECTION_$env_upper=AZURE_SERVICE_CONNECTION_$env_upper"
308
- done
309
- \`\`\`
310
-
311
- Verify variable groups were created:
312
- \`\`\`bash
313
- az pipelines variable-group list --query "[].name" -o table
314
- \`\`\`
315
-
316
- ---
317
-
318
- ## Step 6: Configure Pipeline Permissions
319
-
320
- Authorize all pipelines to use the variable groups:
321
-
322
- **PowerShell:**
323
- \`\`\`powershell
324
- $groupIds = az pipelines variable-group list --query "[].id" -o tsv
325
- foreach ($id in $groupIds) {
326
- az pipelines variable-group update --group-id $id --authorize true
327
- }
328
- \`\`\`
329
-
330
- **Git Bash:**
331
- \`\`\`bash
332
- for id in $(az pipelines variable-group list --query "[].id" -o tsv); do
333
- az pipelines variable-group update --group-id "$id" --authorize true
334
- done
335
- \`\`\`
336
-
337
- ---
338
-
339
- ## Step 7: Create Environments
340
-
341
- Create deployment environments:
342
-
343
- **PowerShell:**
344
- \`\`\`powershell
345
- foreach ($env in $ENVIRONMENTS) {
346
- $body = @{ name = $env } | ConvertTo-Json -Compress
347
- $body | Out-File -Encoding utf8 -FilePath env-body.json
348
- az devops invoke --area environments --resource environments --route-parameters project=$AZDO_PROJECT --http-method POST --api-version 7.1 --in-file env-body.json
349
- }
350
- Remove-Item env-body.json -ErrorAction SilentlyContinue
351
- \`\`\`
352
-
353
- **Git Bash:**
354
- \`\`\`bash
355
- for env in "\${ENVIRONMENTS[@]}"; do
356
- echo "{\\"name\\": \\"$env\\"}" > env-body.json
357
- az devops invoke --area environments --resource environments --route-parameters project="$AZDO_PROJECT" --http-method POST --api-version 7.1 --in-file env-body.json
358
- done
359
- rm -f env-body.json
360
- \`\`\`
361
-
362
- **Note:** Environment approvals and checks must be configured via the Azure DevOps UI (Project Settings > Environments).
363
-
364
- ---
365
-
366
- ## Step 8: Enable Pipeline Contributions
367
-
368
- Grant the Build Service permission to contribute to the repository. This allows pipelines to push commits (e.g., extracted API artifacts).
369
-
370
- First, get the project and repository IDs:
371
-
372
- **PowerShell:**
373
- \`\`\`powershell
374
- $PROJECT_ID = az devops project show --project $AZDO_PROJECT --query id -o tsv
375
- $REPO_NAME = $AZDO_PROJECT # Change if your repo name differs from project name
376
- $REPO_ID = az repos show --repository $REPO_NAME --query id -o tsv
377
- \`\`\`
378
-
379
- **Git Bash:**
380
- \`\`\`bash
381
- PROJECT_ID=$(az devops project show --project "$AZDO_PROJECT" --query id -o tsv)
382
- REPO_NAME="$AZDO_PROJECT" # Change if your repo name differs from project name
383
- REPO_ID=$(az repos show --repository "$REPO_NAME" --query id -o tsv)
384
- \`\`\`
385
-
386
- Next, find the Build Service identity descriptor:
387
-
388
- **PowerShell:**
389
- \`\`\`powershell
390
- $GRAPH_USERS = az devops invoke --area graph --resource users --query-parameters 'api-version=7.1-preview.1' --http-method GET -o json | ConvertFrom-Json
391
- $BUILD_SERVICE_NAME = "$AZDO_PROJECT Build Service ($ORG_NAME)"
392
- $BUILD_SERVICE_DESCRIPTOR = ($GRAPH_USERS.value | Where-Object { $_.displayName -eq $BUILD_SERVICE_NAME }).descriptor
393
- \`\`\`
394
-
395
- **Git Bash:**
396
- \`\`\`bash
397
- BUILD_SERVICE_NAME="$AZDO_PROJECT Build Service ($ORG_NAME)"
398
- BUILD_SERVICE_DESCRIPTOR=$(az devops invoke --area graph --resource users --query-parameters 'api-version=7.1-preview.1' --http-method GET -o json | grep -B5 "\\"displayName\\": \\"$BUILD_SERVICE_NAME\\"" | grep '"descriptor"' | head -1 | cut -d'"' -f4)
399
- \`\`\`
400
-
401
- Finally, grant the Contribute permission (bit 4) on the repository:
402
-
403
- **PowerShell:**
404
- \`\`\`powershell
405
- $GIT_REPOS_NAMESPACE = az devops security permission namespace list --query "[?name=='Git Repositories'].namespaceId" -o tsv
406
- $TOKEN = "repoV2/$PROJECT_ID/$REPO_ID"
407
- az devops security permission update --namespace-id $GIT_REPOS_NAMESPACE --subject $BUILD_SERVICE_DESCRIPTOR --token $TOKEN --allow-bit 4
408
- \`\`\`
409
-
410
- **Git Bash:**
411
- \`\`\`bash
412
- GIT_REPOS_NAMESPACE=$(az devops security permission namespace list --query "[?name=='Git Repositories'].namespaceId" -o tsv)
413
- TOKEN="repoV2/$PROJECT_ID/$REPO_ID"
414
- az devops security permission update --namespace-id "$GIT_REPOS_NAMESPACE" --subject "$BUILD_SERVICE_DESCRIPTOR" --token "$TOKEN" --allow-bit 4
415
- \`\`\`
416
-
417
- Verify the permission was set:
418
-
419
- **PowerShell:**
420
- \`\`\`powershell
421
- az devops security permission show --namespace-id $GIT_REPOS_NAMESPACE --subject $BUILD_SERVICE_DESCRIPTOR --token $TOKEN --query "[].acesDictionary.*.resolvedPermissions" -o json
422
- \`\`\`
423
-
424
- **Git Bash:**
425
- \`\`\`bash
426
- az devops security permission show --namespace-id "$GIT_REPOS_NAMESPACE" --subject "$BUILD_SERVICE_DESCRIPTOR" --token "$TOKEN" --query "[].acesDictionary.*.resolvedPermissions" -o json
427
- \`\`\`
428
-
429
- ---
430
-
431
- ## Step 9: Verify Setup
432
-
433
- Verify all resources were created correctly:
434
-
435
- **Service Connections:**
436
- \`\`\`bash
437
- az devops service-endpoint list --query "[].name" -o table
438
- \`\`\`
439
-
440
- **Variable Groups:**
441
- \`\`\`bash
442
- az pipelines variable-group list --query "[].name" -o table
443
- \`\`\`
444
-
445
- **Environments:**
446
-
447
- **PowerShell:**
448
- \`\`\`powershell
449
- (az devops invoke --area environments --resource environments --route-parameters project=$AZDO_PROJECT --http-method GET --api-version 7.1 -o json | ConvertFrom-Json).value | Select-Object name
450
- \`\`\`
451
-
452
- **Git Bash:**
453
- \`\`\`bash
454
- az devops invoke --area environments --resource environments --route-parameters project="$AZDO_PROJECT" --http-method GET --api-version 7.1 -o json | grep -o '"name": *"[^"]*"' | cut -d'"' -f4
455
- \`\`\`
456
-
457
- **Service Principal Role Assignment:**
458
-
459
- **PowerShell:**
460
- \`\`\`powershell
461
- az role assignment list --assignee $APP_ID --query "[].{Role:roleDefinitionName, Scope:scope}" -o table
462
- \`\`\`
463
-
464
- **Git Bash:**
465
- \`\`\`bash
466
- az role assignment list --assignee "$APP_ID" --query "[].{Role:roleDefinitionName, Scope:scope}" -o table
467
- \`\`\`
468
-
469
- **Final Test:** Run the extract pipeline manually to verify end-to-end authentication and permissions.
470
-
471
- ---
472
-
473
- ## Step 10: Create Pipelines
474
-
475
- Create Azure Pipelines from the YAML files in your repository.
476
-
477
- **Prerequisites:** Ensure your pipeline YAML files are committed to the repository (e.g., \`azure-pipelines-extract.yml\`, \`azure-pipelines-publish.yml\`).
478
-
479
- **Create Extract Pipeline:**
480
-
481
- **PowerShell:**
482
- \`\`\`powershell
483
- az pipelines create --name "apiops-extract" --repository $REPO_NAME --branch main --yml-path "azure-pipelines-extract.yml" --repository-type tfsgit --skip-first-run true
484
- \`\`\`
485
-
486
- **Git Bash:**
487
- \`\`\`bash
488
- az pipelines create --name "apiops-extract" --repository "$REPO_NAME" --branch main --yml-path "azure-pipelines-extract.yml" --repository-type tfsgit --skip-first-run true
489
- \`\`\`
490
-
491
- **Create Publish Pipeline:**
492
-
493
- **PowerShell:**
494
- \`\`\`powershell
495
- az pipelines create --name "apiops-publish" --repository $REPO_NAME --branch main --yml-path "azure-pipelines-publish.yml" --repository-type tfsgit --skip-first-run true
496
- \`\`\`
497
-
498
- **Git Bash:**
499
- \`\`\`bash
500
- az pipelines create --name "apiops-publish" --repository "$REPO_NAME" --branch main --yml-path "azure-pipelines-publish.yml" --repository-type tfsgit --skip-first-run true
501
- \`\`\`
502
-
503
- **Verify pipelines were created:**
504
- \`\`\`bash
505
- az pipelines list --query "[].name" -o table
506
- \`\`\`
507
-
508
- **Run the extract pipeline:**
509
-
510
- **PowerShell:**
511
- \`\`\`powershell
512
- az pipelines run --name "apiops-extract"
513
- \`\`\`
514
-
515
- **Git Bash:**
516
- \`\`\`bash
517
- az pipelines run --name "apiops-extract"
518
- \`\`\`
519
-
520
- ---
521
-
522
- ## Security Notes
523
- - Use separate service principals for production environments
524
- - Enable environment approvals for production deployments
525
- - Rotate service principal secrets periodically (recommended: 90 days)
526
- - Use managed identities when possible for Azure-hosted agents
527
- - Review RBAC assignments regularly
528
- `;
34
+ generateAzureDevOpsGuide(environments) {
35
+ const environmentsArrayPowerShell = environments
36
+ .map((environment) => `"${environment}"`)
37
+ .join(', ');
38
+ const environmentsArrayBash = environments
39
+ .map((environment) => `"${environment}"`)
40
+ .join(' ');
41
+ const coreSteps = this.renderTemplate(azureDevOpsIdentitySetupCoreTemplate, {
42
+ ENVIRONMENTS_ARRAY_POWERSHELL: environmentsArrayPowerShell,
43
+ ENVIRONMENTS_ARRAY_BASH: environmentsArrayBash,
44
+ });
45
+ return this.renderTemplate(azureDevOpsIdentityGuideTemplate, {
46
+ AZURE_DEVOPS_CORE_STEPS: coreSteps,
47
+ });
529
48
  }
530
49
  }
531
50
  export const identityGuideService = new IdentityGuideServiceImpl();
@@ -1 +1 @@
1
- {"version":3,"file":"identity-guide-service.js","sourceRoot":"","sources":["../../src/services/identity-guide-service.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAClC;;;;GAIG;AAgBH,MAAM,wBAAwB;IAC5B,0BAA0B,CACxB,cAAsB,EACtB,aAAqB,EACrB,YAAsB;QAEtB,OAAO;;;wBAGa,cAAc;oBAClB,aAAa;;;;;;;;;mBASd,cAAc;kBACf,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsD7B,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;;;0BAGF,GAAG;;oEAEuC,GAAG;;KAElE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;;;;;;;;;;+BAUY,cAAc;;;EAG3C,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;QACpB,GAAG;0BACe,GAAG,CAAC,WAAW,EAAE,0BAA0B,GAAG;wBAChD,GAAG,CAAC,WAAW,EAAE,6BAA6B,GAAG;CACxE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;CAeZ,CAAC;IACA,CAAC;IAED,wBAAwB,CACtB,cAAsB,EACtB,aAAqB,EACrB,YAAsB;QAEtB,MAAM,2BAA2B,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjF,MAAM,qBAAqB,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE1E,OAAO;;;wBAGa,cAAc;oBAClB,aAAa;;;;;;;;;;;;sBAYX,cAAc;qBACf,aAAa;;oBAEd,2BAA2B;;;;;mBAK5B,cAAc;kBACf,aAAa;;gBAEf,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BAwHR,cAAc;;sCAEL,aAAa;;;;;0BAKzB,cAAc;;mCAEL,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0P/C,CAAC;IACA,CAAC;CACF;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAyB,IAAI,wBAAwB,EAAE,CAAC"}
1
+ {"version":3,"file":"identity-guide-service.js","sourceRoot":"","sources":["../../src/services/identity-guide-service.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAClC;;;;GAIG;AAEH,OAAO,EACL,oCAAoC,EACpC,gCAAgC,EAChC,kCAAkC,GACnC,MAAM,6CAA6C,CAAC;AAcrD,MAAM,wBAAwB;IACpB,cAAc,CAAC,QAAgB,EAAE,MAA8B;QACrE,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAClC,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,CAAC,EACpE,QAAQ,CACT,CAAC;IACJ,CAAC;IAED,0BAA0B,CACxB,cAAsB,EACtB,aAAqB,EACrB,YAAsB;QAEtB,MAAM,kCAAkC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;;;0BAG/C,GAAG;;oEAEuC,GAAG;;KAElE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEhB,MAAM,kBAAkB,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;QACjD,GAAG;0BACe,GAAG,CAAC,WAAW,EAAE,0BAA0B,GAAG;wBAChD,GAAG,CAAC,WAAW,EAAE,6BAA6B,GAAG;CACxE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEV,OAAO,IAAI,CAAC,cAAc,CAAC,kCAAkC,EAAE;YAC7D,eAAe,EAAE,cAAc;YAC/B,cAAc,EAAE,aAAa;YAC7B,6BAA6B,EAAE,kCAAkC;YACjE,mBAAmB,EAAE,kBAAkB;SACxC,CAAC,CAAC;IACL,CAAC;IAED,wBAAwB,CACtB,YAAsB;QAEtB,MAAM,2BAA2B,GAAG,YAAY;aAC7C,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,WAAW,GAAG,CAAC;aACxC,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,qBAAqB,GAAG,YAAY;aACvC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,WAAW,GAAG,CAAC;aACxC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEb,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,oCAAoC,EAAE;YAC1E,6BAA6B,EAAE,2BAA2B;YAC1D,uBAAuB,EAAE,qBAAqB;SAC/C,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,cAAc,CAAC,gCAAgC,EAAE;YAC3D,uBAAuB,EAAE,SAAS;SACnC,CAAC,CAAC;IACL,CAAC;CACF;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAyB,IAAI,wBAAwB,EAAE,CAAC"}
File without changes
@@ -1 +1 @@
1
- {"version":3,"file":"init-service.d.ts","sourceRoot":"","sources":["../../src/services/init-service.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AAIH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AA6BjD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAClD;AA8XD,eAAO,MAAM,WAAW,EAAE,WAAmC,CAAC"}
1
+ {"version":3,"file":"init-service.d.ts","sourceRoot":"","sources":["../../src/services/init-service.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AAIH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AA6BjD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAClD;AAgbD,eAAO,MAAM,WAAW,EAAE,WAAmC,CAAC"}