@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.
- package/LICENSE.md +22 -22
- package/README.md +169 -169
- package/dist/cli/extract-command.d.ts +0 -0
- package/dist/cli/extract-command.d.ts.map +0 -0
- package/dist/cli/extract-command.js +0 -0
- package/dist/cli/extract-command.js.map +0 -0
- package/dist/cli/index.d.ts +0 -0
- package/dist/cli/index.d.ts.map +0 -0
- package/dist/cli/index.js +0 -0
- package/dist/cli/index.js.map +0 -0
- package/dist/cli/init-command.d.ts +0 -0
- package/dist/cli/init-command.d.ts.map +1 -1
- package/dist/cli/init-command.js +2 -1
- package/dist/cli/init-command.js.map +1 -1
- package/dist/cli/publish-command.d.ts +0 -0
- package/dist/cli/publish-command.d.ts.map +0 -0
- package/dist/cli/publish-command.js +0 -0
- package/dist/cli/publish-command.js.map +0 -0
- package/dist/clients/apim-client.d.ts +25 -1
- package/dist/clients/apim-client.d.ts.map +1 -1
- package/dist/clients/apim-client.js +173 -9
- package/dist/clients/apim-client.js.map +1 -1
- package/dist/clients/artifact-store.d.ts +0 -0
- package/dist/clients/artifact-store.d.ts.map +0 -0
- package/dist/clients/artifact-store.js +0 -0
- package/dist/clients/artifact-store.js.map +0 -0
- package/dist/clients/iapim-client.d.ts +6 -0
- package/dist/clients/iapim-client.d.ts.map +1 -1
- package/dist/clients/iapim-client.js +0 -0
- package/dist/clients/iapim-client.js.map +0 -0
- package/dist/clients/iartifact-store.d.ts +0 -0
- package/dist/clients/iartifact-store.d.ts.map +0 -0
- package/dist/clients/iartifact-store.js +0 -0
- package/dist/clients/iartifact-store.js.map +0 -0
- package/dist/lib/auto-generated.d.ts +0 -0
- package/dist/lib/auto-generated.d.ts.map +0 -0
- package/dist/lib/auto-generated.js +0 -0
- package/dist/lib/auto-generated.js.map +0 -0
- package/dist/lib/cloud-config.d.ts +0 -0
- package/dist/lib/cloud-config.d.ts.map +0 -0
- package/dist/lib/cloud-config.js +0 -0
- package/dist/lib/cloud-config.js.map +0 -0
- package/dist/lib/config-loader.d.ts +0 -4
- package/dist/lib/config-loader.d.ts.map +1 -1
- package/dist/lib/config-loader.js +290 -51
- package/dist/lib/config-loader.js.map +1 -1
- package/dist/lib/dependency-graph.d.ts +0 -0
- package/dist/lib/dependency-graph.d.ts.map +0 -0
- package/dist/lib/dependency-graph.js +0 -0
- package/dist/lib/dependency-graph.js.map +0 -0
- package/dist/lib/exit-codes.d.ts +0 -0
- package/dist/lib/exit-codes.d.ts.map +0 -0
- package/dist/lib/exit-codes.js +0 -0
- package/dist/lib/exit-codes.js.map +0 -0
- package/dist/lib/logger.d.ts +0 -0
- package/dist/lib/logger.d.ts.map +0 -0
- package/dist/lib/logger.js +0 -0
- package/dist/lib/logger.js.map +0 -0
- package/dist/lib/parallel-runner.d.ts +0 -0
- package/dist/lib/parallel-runner.d.ts.map +0 -0
- package/dist/lib/parallel-runner.js +0 -0
- package/dist/lib/parallel-runner.js.map +0 -0
- package/dist/lib/resource-path.d.ts +0 -0
- package/dist/lib/resource-path.d.ts.map +1 -1
- package/dist/lib/resource-path.js +20 -2
- package/dist/lib/resource-path.js.map +1 -1
- package/dist/lib/resource-uri.d.ts +0 -0
- package/dist/lib/resource-uri.d.ts.map +1 -1
- package/dist/lib/resource-uri.js +24 -4
- package/dist/lib/resource-uri.js.map +1 -1
- package/dist/lib/user-agent.d.ts +0 -0
- package/dist/lib/user-agent.d.ts.map +0 -0
- package/dist/lib/user-agent.js +0 -0
- package/dist/lib/user-agent.js.map +0 -0
- package/dist/lib/workspace-link.d.ts +46 -0
- package/dist/lib/workspace-link.d.ts.map +1 -0
- package/dist/lib/workspace-link.js +93 -0
- package/dist/lib/workspace-link.js.map +1 -0
- package/dist/models/config.d.ts +80 -44
- package/dist/models/config.d.ts.map +1 -1
- package/dist/models/config.js +0 -0
- package/dist/models/config.js.map +0 -0
- package/dist/models/resource-types.d.ts +14 -1
- package/dist/models/resource-types.d.ts.map +1 -1
- package/dist/models/resource-types.js +11 -3
- package/dist/models/resource-types.js.map +1 -1
- package/dist/models/types.d.ts +0 -0
- package/dist/models/types.d.ts.map +0 -0
- package/dist/models/types.js +0 -0
- package/dist/models/types.js.map +0 -0
- package/dist/services/api-extractor.d.ts +19 -0
- package/dist/services/api-extractor.d.ts.map +1 -1
- package/dist/services/api-extractor.js +87 -6
- package/dist/services/api-extractor.js.map +1 -1
- package/dist/services/api-publisher.d.ts +0 -0
- package/dist/services/api-publisher.d.ts.map +1 -1
- package/dist/services/api-publisher.js +242 -62
- package/dist/services/api-publisher.js.map +1 -1
- package/dist/services/delete-unmatched-service.d.ts +0 -0
- package/dist/services/delete-unmatched-service.d.ts.map +0 -0
- package/dist/services/delete-unmatched-service.js +0 -0
- package/dist/services/delete-unmatched-service.js.map +0 -0
- package/dist/services/dry-run-reporter.d.ts +0 -0
- package/dist/services/dry-run-reporter.d.ts.map +0 -0
- package/dist/services/dry-run-reporter.js +0 -0
- package/dist/services/dry-run-reporter.js.map +0 -0
- package/dist/services/extract-service.d.ts +0 -0
- package/dist/services/extract-service.d.ts.map +0 -0
- package/dist/services/extract-service.js +0 -0
- package/dist/services/extract-service.js.map +0 -0
- package/dist/services/filter-service.d.ts +1 -0
- package/dist/services/filter-service.d.ts.map +1 -1
- package/dist/services/filter-service.js +101 -40
- package/dist/services/filter-service.js.map +1 -1
- package/dist/services/git-diff-service.d.ts +0 -0
- package/dist/services/git-diff-service.d.ts.map +0 -0
- package/dist/services/git-diff-service.js +0 -0
- package/dist/services/git-diff-service.js.map +0 -0
- package/dist/services/identity-guide-service.d.ts +1 -1
- package/dist/services/identity-guide-service.d.ts.map +1 -1
- package/dist/services/identity-guide-service.js +37 -518
- package/dist/services/identity-guide-service.js.map +1 -1
- package/dist/services/init-service.d.ts +0 -0
- package/dist/services/init-service.d.ts.map +1 -1
- package/dist/services/init-service.js +51 -19
- package/dist/services/init-service.js.map +1 -1
- package/dist/services/keyvault-checker.d.ts +0 -0
- package/dist/services/keyvault-checker.d.ts.map +0 -0
- package/dist/services/keyvault-checker.js +0 -0
- package/dist/services/keyvault-checker.js.map +0 -0
- package/dist/services/override-merger.d.ts +3 -7
- package/dist/services/override-merger.d.ts.map +1 -1
- package/dist/services/override-merger.js +198 -47
- package/dist/services/override-merger.js.map +1 -1
- package/dist/services/product-extractor.d.ts +20 -0
- package/dist/services/product-extractor.d.ts.map +1 -1
- package/dist/services/product-extractor.js +101 -5
- package/dist/services/product-extractor.js.map +1 -1
- package/dist/services/product-publisher.d.ts +0 -0
- package/dist/services/product-publisher.d.ts.map +1 -1
- package/dist/services/product-publisher.js +23 -6
- package/dist/services/product-publisher.js.map +1 -1
- package/dist/services/prompt-service.d.ts +0 -0
- package/dist/services/prompt-service.d.ts.map +0 -0
- package/dist/services/prompt-service.js +0 -0
- package/dist/services/prompt-service.js.map +0 -0
- package/dist/services/publish-service.d.ts +0 -0
- package/dist/services/publish-service.d.ts.map +0 -0
- package/dist/services/publish-service.js +38 -2
- package/dist/services/publish-service.js.map +1 -1
- package/dist/services/resource-extractor.d.ts +0 -0
- package/dist/services/resource-extractor.d.ts.map +0 -0
- package/dist/services/resource-extractor.js +0 -0
- package/dist/services/resource-extractor.js.map +0 -0
- package/dist/services/resource-publisher.d.ts +0 -0
- package/dist/services/resource-publisher.d.ts.map +1 -1
- package/dist/services/resource-publisher.js +64 -2
- package/dist/services/resource-publisher.js.map +1 -1
- package/dist/services/secret-redactor.d.ts +0 -0
- package/dist/services/secret-redactor.d.ts.map +0 -0
- package/dist/services/secret-redactor.js +0 -0
- package/dist/services/secret-redactor.js.map +0 -0
- package/dist/services/transitive-resolver.d.ts +0 -0
- package/dist/services/transitive-resolver.d.ts.map +1 -1
- package/dist/services/transitive-resolver.js +4 -4
- package/dist/services/transitive-resolver.js.map +1 -1
- package/dist/services/workspace-extractor.d.ts +0 -0
- package/dist/services/workspace-extractor.d.ts.map +1 -1
- package/dist/services/workspace-extractor.js +50 -7
- package/dist/services/workspace-extractor.js.map +1 -1
- package/dist/templates/azure-devops/extract-pipeline.d.ts +2 -1
- package/dist/templates/azure-devops/extract-pipeline.d.ts.map +1 -1
- package/dist/templates/azure-devops/extract-pipeline.js +147 -88
- package/dist/templates/azure-devops/extract-pipeline.js.map +1 -1
- package/dist/templates/azure-devops/publish-pipeline.d.ts +0 -0
- package/dist/templates/azure-devops/publish-pipeline.d.ts.map +1 -1
- package/dist/templates/azure-devops/publish-pipeline.js +116 -89
- package/dist/templates/azure-devops/publish-pipeline.js.map +1 -1
- package/dist/templates/configs/filter-config.d.ts +1 -1
- package/dist/templates/configs/filter-config.d.ts.map +1 -1
- package/dist/templates/configs/filter-config.js +109 -44
- package/dist/templates/configs/filter-config.js.map +1 -1
- package/dist/templates/configs/override-config.d.ts +0 -0
- package/dist/templates/configs/override-config.d.ts.map +1 -1
- package/dist/templates/configs/override-config.js +88 -37
- package/dist/templates/configs/override-config.js.map +1 -1
- package/dist/templates/configs/package-json.d.ts +0 -0
- package/dist/templates/configs/package-json.d.ts.map +0 -0
- package/dist/templates/configs/package-json.js +0 -0
- package/dist/templates/configs/package-json.js.map +0 -0
- package/dist/templates/copilot/identity-setup-prompt.d.ts +4 -3
- package/dist/templates/copilot/identity-setup-prompt.d.ts.map +1 -1
- package/dist/templates/copilot/identity-setup-prompt.js +59 -269
- package/dist/templates/copilot/identity-setup-prompt.js.map +1 -1
- package/dist/templates/generated/embedded-markdown.d.ts +12 -0
- package/dist/templates/generated/embedded-markdown.d.ts.map +1 -0
- package/dist/templates/generated/embedded-markdown.js +14 -0
- package/dist/templates/generated/embedded-markdown.js.map +1 -0
- package/dist/templates/github-actions/extract-workflow.d.ts +0 -0
- package/dist/templates/github-actions/extract-workflow.d.ts.map +0 -0
- package/dist/templates/github-actions/extract-workflow.js +118 -118
- package/dist/templates/github-actions/extract-workflow.js.map +0 -0
- package/dist/templates/github-actions/publish-workflow.d.ts +0 -0
- package/dist/templates/github-actions/publish-workflow.d.ts.map +1 -1
- package/dist/templates/github-actions/publish-workflow.js +104 -90
- package/dist/templates/github-actions/publish-workflow.js.map +1 -1
- 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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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(
|
|
120
|
-
const environmentsArrayPowerShell = environments
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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;
|
|
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;
|
|
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"}
|