@jjrawlins/cdk-diff-pr-github-action 0.0.6-beta → 0.0.8-beta
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/.jsii +77 -54
- package/.yalc/@jjrawlins/cdk-diff-pr-github-action/.yalc/@jjrawlins/cdk-diff-pr-github-action/.yalc/@jjrawlins/cdk-diff-pr-github-action/.yalc/@jjrawlins/cdk-diff-pr-github-action/.yalc/@jjrawlins/cdk-diff-pr-github-action/.yalc/@jjrawlins/cdk-diff-pr-github-action/lib/CdkDriftDetectionWorkflow.js +6 -6
- package/.yalc/@jjrawlins/cdk-diff-pr-github-action/.yalc/@jjrawlins/cdk-diff-pr-github-action/.yalc/@jjrawlins/cdk-diff-pr-github-action/.yalc/@jjrawlins/cdk-diff-pr-github-action/.yalc/@jjrawlins/cdk-diff-pr-github-action/lib/CdkDriftDetectionWorkflow.js +6 -6
- package/.yalc/@jjrawlins/cdk-diff-pr-github-action/.yalc/@jjrawlins/cdk-diff-pr-github-action/.yalc/@jjrawlins/cdk-diff-pr-github-action/.yalc/@jjrawlins/cdk-diff-pr-github-action/lib/CdkDriftDetectionWorkflow.js +6 -6
- package/.yalc/@jjrawlins/cdk-diff-pr-github-action/.yalc/@jjrawlins/cdk-diff-pr-github-action/.yalc/@jjrawlins/cdk-diff-pr-github-action/lib/CdkDriftDetectionWorkflow.js +6 -6
- package/.yalc/@jjrawlins/cdk-diff-pr-github-action/.yalc/@jjrawlins/cdk-diff-pr-github-action/lib/CdkDriftDetectionWorkflow.js +6 -6
- package/.yalc/@jjrawlins/cdk-diff-pr-github-action/lib/CdkDriftDetectionWorkflow.js +6 -6
- package/README.md +203 -38
- package/lib/CdkDriftDetectionWorkflow.d.ts +10 -0
- package/lib/CdkDriftDetectionWorkflow.js +93 -24
- package/package.json +2 -2
package/.jsii
CHANGED
|
@@ -3525,7 +3525,7 @@
|
|
|
3525
3525
|
},
|
|
3526
3526
|
"description": "A GitHub Action that creates a CDK diff for a pull request.",
|
|
3527
3527
|
"docs": {
|
|
3528
|
-
"stability": "
|
|
3528
|
+
"stability": "experimental"
|
|
3529
3529
|
},
|
|
3530
3530
|
"homepage": "https://jjrawlins@github.com/JaysonRawlins/cdk-diff-pr-github-action.git",
|
|
3531
3531
|
"jsiiVersion": "5.8.22 (build 160a3ef)",
|
|
@@ -3548,7 +3548,7 @@
|
|
|
3548
3548
|
},
|
|
3549
3549
|
"name": "@jjrawlins/cdk-diff-pr-github-action",
|
|
3550
3550
|
"readme": {
|
|
3551
|
-
"markdown": "# cdk-diff-pr-github-action\n\nA small Projen-based helper library that wires a GitHub workflow to create a CloudFormation Change Set for a CDK stack on every pull request, then comments the formatted diff back on the PR. It also provides a ready‑to‑deploy IAM template you can use to grant the minimal permissions required for the workflow to create and inspect change sets.\n\nThis package exposes two constructs:\n\n- `CdkDiffStackWorkflow` — Generates one GitHub Actions workflow per stack that:\n - Assumes your GitHub OIDC role\n - Optionally chains into a separate CDK deploy role\n - Runs `cdk deploy --no-execute` to create a change set\n - Runs a generated script to render the change set as an HTML table and posts it to the PR and to the GitHub Step Summary\n - Cleans up the change set\n\n- `CdkDiffIamTemplate` — Emits a CloudFormation template file (`cdk-diff-workflow-iam-template.yaml`) containing an example IAM role policy with the minimal permissions to create, describe, and delete CloudFormation change sets and read common CDK bootstrap resources. You can launch this in your account and then reference the created role.\n\n## Quick start\n\n1) Add the constructs to your Projen project (in `.projenrc.ts`).\n2) Synthesize with `npx projen`.\n3) Commit the generated files.\n4) Open a pull request — the workflow will create a change set and comment the diff.\n\n## Usage: CdkDiffStackWorkflow\n\n`CdkDiffStackWorkflow` renders a workflow per stack named `diff-<StackName>.yml` under `.github/workflows/`. It also generates a helper script at `.github/workflows/scripts/describe-cfn-changeset.ts` that formats the change set output and takes care of posting the PR comment and Step Summary.\n\nExample `.projenrc.ts`:\n\n```ts\nimport { awscdk } from 'projen';\nimport { CdkDiffStackWorkflow } from '@jjrawlins/cdk-diff-pr-github-action';\n\nconst project = new awscdk.AwsCdkConstructLibrary({\n // ... your usual settings ...\n workflowName: 'my-lib',\n defaultReleaseBranch: 'main',\n cdkVersion: '2.85.0',\n github: true,\n});\n\nnew CdkDiffStackWorkflow({\n project,\n // Stacks to diff on PRs\n stacks: [\n {\n stackName: 'MyAppStack',\n changesetRoleToAssumeArn: 'arn:aws:iam::123456789012:role/cdk-diff-role',\n changesetRoleToAssumeRegion: 'us-east-1',\n // Optional per‑stack OIDC override (if not using the defaults below)\n // oidcRoleArn: 'arn:aws:iam::123456789012:role/github-oidc-role',\n // oidcRegion: 'us-east-1',\n },\n ],\n // Default OIDC role/region used by all stacks unless overridden per‑stack\n oidcRoleArn: 'arn:aws:iam::123456789012:role/github-oidc-role',\n oidcRegion: 'us-east-1',\n // Optional: Node version used in the workflow (default: '24.x')\n // nodeVersion: '20.x',\n // Optional: Yarn command to run CDK (default: 'cdk')\n // cdkYarnCommand: 'cdk',\n // Optional: Where to place the helper script\n // scriptOutputPath: '.github/workflows/scripts/describe-cfn-changeset.ts',\n});\n\nproject.synth();\n```\n\n### Required properties\n- `project` (AwsCdkTypeScriptApp) — Your Projen project instance.\n- `stacks` (array) — One entry per CDK stack you want a diff for.\n- OIDC configuration: either\n - Provide `oidcRoleArn` and `oidcRegion` at the top level, or\n - Provide `oidcRoleArn` and `oidcRegion` on every stack item.\n\nIf neither the defaults nor all per‑stack values are supplied, the construct throws with a helpful error.\n\n### Stack item fields\n- `stackName` — The CDK stack workflowName to create the change set for.\n- `changesetRoleToAssumeArn` — The ARN of the role used to create the change set (role chaining after OIDC).\n- `changesetRoleToAssumeRegion` — The region for that role.\n- `oidcRoleArn` (optional) — Per‑stack override for the OIDC role.\n- `oidcRegion` (optional) — Per‑stack override for the OIDC region.\n\n### What gets generated\n- `.github/workflows/diff-<StackName>.yml` — One workflow per stack, triggered on PR open/sync/reopen.\n- `.github/workflows/scripts/describe-cfn-changeset.ts` — A helper script that:\n - Polls `DescribeChangeSet` until terminal\n - Filters out ignorable logical IDs or resource types using environment variables `IGNORE_LOGICAL_IDS` and `IGNORE_RESOURCE_TYPES`\n - Renders an HTML table with actions, logical IDs, types, replacements, and changed properties\n - Prints the HTML, appends to the GitHub Step Summary, and (if `GITHUB_TOKEN` and `GITHUB_COMMENT_URL` are present) posts a PR comment\n\n### Environment variables used by the script\n- `STACK_NAME` (required) — Stack workflowName to describe.\n- `CHANGE_SET_NAME` (default: same as `STACK_NAME`).\n- `AWS_REGION` — Region for CloudFormation API calls. The workflow sets this via the credentials action.\n- `GITHUB_TOKEN` (optional) — If set with `GITHUB_COMMENT_URL`, posts a PR comment.\n- `GITHUB_COMMENT_URL` (optional) — PR comments URL.\n- `GITHUB_STEP_SUMMARY` (optional) — When present, appends the HTML to the step summary file.\n- `IGNORE_LOGICAL_IDS` (optional) — Comma‑separated logical IDs to ignore (default includes `CDKMetadata`).\n- `IGNORE_RESOURCE_TYPES` (optional) — Comma‑separated resource types to ignore (e.g., `AWS::CDK::Metadata`).\n\n## Usage: CdkDiffIamTemplate\n\nAdd `CdkDiffIamTemplate` to your Projen project to emit an example IAM template you can deploy in your account:\n\n```ts\nimport { awscdk } from 'projen';\nimport { CdkDiffIamTemplate } from '@jjrawlins/cdk-diff-pr-github-action';\n\nconst project = new awscdk.AwsCdkConstructLibrary({\n // ...\n});\n\nnew CdkDiffIamTemplate({ project });\n\nproject.synth();\n```\n\nThis will write `cdk-diff-workflow-iam-template.yaml` at the project root. The template defines:\n- A parameter `GitHubOIDCRoleArn` — pass the ARN of your existing GitHub OIDC role that will assume the change set role.\n- An IAM role `CdkChangesetRole` with minimal permissions for:\n - CloudFormation Change Set operations\n - Access to common CDK bootstrap S3 buckets and SSM parameters\n - `iam:PassRole` to `cloudformation.amazonaws.com`\n- Outputs exporting the role workflowName and ARN.\n\nYou can deploy the file via CloudFormation/StackSets and then use the created role ARN as the `changesetRoleToAssumeArn` in your workflow configuration.\n\n## Testing\n\nThis repository includes Jest tests that snapshot the synthesized outputs from Projen and assert that:\n- Workflows are created per stack and contain all expected steps.\n- Only one script file is generated.\n- Per‑stack OIDC overrides are respected.\n- Helpful validation errors are thrown for missing OIDC settings.\n- The IAM template file contains the expected resources and outputs.\n\nRun tests with:\n\n```bash\nyarn test\n```\n\n## Notes\n- This package assumes your repository is configured with GitHub Actions and that you have a GitHub OIDC role configured in AWS.\n- The generated script uses the AWS SDK v3 for CloudFormation and posts comments using the GitHub REST API.\n"
|
|
3551
|
+
"markdown": "# cdk-diff-pr-github-action\n\nA small Projen-based helper library that wires GitHub workflows for:\n- Creating CloudFormation Change Sets for your CDK stacks on pull requests and commenting a formatted diff back on the PR.\n- Detecting CloudFormation drift on a schedule or manual trigger and producing a consolidated summary (optionally creating an issue).\n\nIt also provides ready‑to‑deploy IAM templates with the minimal permissions required for each workflow.\n\nThis package exposes four constructs:\n\n- `CdkDiffStackWorkflow` — Generates one GitHub Actions workflow per stack to create a change set and render the diff back to the PR and Step Summary.\n- `CdkDiffIamTemplate` — Emits a CloudFormation template file with minimal permissions for the Change Set workflow.\n- `CdkDriftDetectionWorkflow` — Generates a GitHub Actions workflow to detect CloudFormation drift per stack, upload machine‑readable results, and aggregate a summary.\n- `CdkDriftIamTemplate` — Emits a CloudFormation template file with minimal permissions for the Drift Detection workflow.\n\n## Quick start\n\n1) Add the constructs to your Projen project (in `.projenrc.ts`).\n2) Synthesize with `npx projen`.\n3) Commit the generated files.\n4) Open a pull request or run the drift detection workflow.\n\n## Usage: CdkDiffStackWorkflow\n\n`CdkDiffStackWorkflow` renders a workflow per stack named `diff-<StackName>.yml` under `.github/workflows/`. It also generates a helper script at `.github/workflows/scripts/describe-cfn-changeset.ts` that formats the change set output and takes care of posting the PR comment and Step Summary.\n\nExample `.projenrc.ts`:\n\n```ts\nimport { awscdk } from 'projen';\nimport { CdkDiffStackWorkflow } from '@jjrawlins/cdk-diff-pr-github-action';\n\nconst project = new awscdk.AwsCdkConstructLibrary({\n // ... your usual settings ...\n workflowName: 'my-lib',\n defaultReleaseBranch: 'main',\n cdkVersion: '2.85.0',\n github: true,\n});\n\nnew CdkDiffStackWorkflow({\n project,\n stacks: [\n {\n stackName: 'MyAppStack',\n changesetRoleToAssumeArn: 'arn:aws:iam::123456789012:role/cdk-diff-role',\n changesetRoleToAssumeRegion: 'us-east-1',\n // Optional per‑stack OIDC override (if not using the defaults below)\n // oidcRoleArn: 'arn:aws:iam::123456789012:role/github-oidc-role',\n // oidcRegion: 'us-east-1',\n },\n ],\n // Default OIDC role/region used by all stacks unless overridden per‑stack\n oidcRoleArn: 'arn:aws:iam::123456789012:role/github-oidc-role',\n oidcRegion: 'us-east-1',\n // Optional: Node version used in the workflow (default: '24.x')\n // nodeVersion: '24.x',\n // Optional: Yarn command to run CDK (default: 'cdk')\n // cdkYarnCommand: 'cdk',\n // Optional: Where to place the helper script (default: '.github/workflows/scripts/describe-cfn-changeset.ts')\n // scriptOutputPath: '.github/workflows/scripts/describe-cfn-changeset.ts',\n});\n\nproject.synth();\n```\n\n### CdkDiffStackWorkflow props\n- `project` (required) — Your Projen project instance.\n- `stacks` (required) — Array of stack entries.\n- `oidcRoleArn` (required unless provided per‑stack) — Default OIDC role ARN.\n- `oidcRegion` (required unless provided per‑stack) — Default OIDC region.\n- `nodeVersion` (optional, default `'24.x'`) — Node.js version for the workflow runner.\n- `cdkYarnCommand` (optional, default `'cdk'`) — Yarn script/command to invoke CDK.\n- `scriptOutputPath` (optional, default `'.github/workflows/scripts/describe-cfn-changeset.ts'`) — Where to write the helper script.\n\nIf neither top‑level OIDC defaults nor all per‑stack values are supplied, the construct throws a helpful error.\n\n### Stack item fields\n- `stackName` (required) — The CDK stack name to create the change set for.\n- `changesetRoleToAssumeArn` (required) — The ARN of the role used to create the change set (role chaining after OIDC).\n- `changesetRoleToAssumeRegion` (required) — The region for that role.\n- `oidcRoleArn` (optional) — Per‑stack override for the OIDC role.\n- `oidcRegion` (optional) — Per‑stack override for the OIDC region.\n\n### What gets generated\n- `.github/workflows/diff-<StackName>.yml` — One workflow per stack, triggered on PR open/sync/reopen.\n- `.github/workflows/scripts/describe-cfn-changeset.ts` — A helper script that:\n - Polls `DescribeChangeSet` until terminal\n - Filters out ignorable logical IDs or resource types using environment variables `IGNORE_LOGICAL_IDS` and `IGNORE_RESOURCE_TYPES`\n - Renders an HTML table with actions, logical IDs, types, replacements, and changed properties\n - Prints the HTML, appends to the GitHub Step Summary, and (if `GITHUB_TOKEN` and `GITHUB_COMMENT_URL` are present) posts a PR comment\n\n### Environment variables used by the change set script\n- `STACK_NAME` (required) — Stack name to describe.\n- `CHANGE_SET_NAME` (default: same as `STACK_NAME`).\n- `AWS_REGION` — Region for CloudFormation API calls. The workflow sets this via the credentials action(s).\n- `GITHUB_TOKEN` (optional) — If set with `GITHUB_COMMENT_URL`, posts a PR comment.\n- `GITHUB_COMMENT_URL` (optional) — PR comments URL.\n- `GITHUB_STEP_SUMMARY` (optional) — When present, appends the HTML to the step summary file.\n- `IGNORE_LOGICAL_IDS` (optional) — Comma‑separated logical IDs to ignore (default includes `CDKMetadata`).\n- `IGNORE_RESOURCE_TYPES` (optional) — Comma‑separated resource types to ignore (e.g., `AWS::CDK::Metadata`).\n\n## Usage: CdkDiffIamTemplate\n\nEmit an example IAM template you can deploy in your account for the Change Set workflow:\n\n```ts\nimport { awscdk } from 'projen';\nimport { CdkDiffIamTemplate } from '@jjrawlins/cdk-diff-pr-github-action';\n\nconst project = new awscdk.AwsCdkConstructLibrary({\n // ...\n});\n\nnew CdkDiffIamTemplate({\n project,\n roleName: 'cdk-diff-role',\n oidcRoleArn: 'arn:aws:iam::123456789012:role/github-oidc-role',\n oidcRegion: 'us-east-1',\n // Optional: custom output path (default: 'cdk-diff-workflow-iam-template.yaml')\n // outputPath: 'infra/cdk-diff-iam.yaml',\n});\n\nproject.synth();\n```\n\nThis writes `cdk-diff-workflow-iam-template.yaml` at the project root (or your chosen `outputPath`). The template defines:\n- Parameter `GitHubOIDCRoleArn` with a default from `oidcRoleArn` — the ARN of your existing GitHub OIDC role allowed to assume the change set role.\n- IAM role `CdkChangesetRole` with minimal permissions for:\n - CloudFormation Change Set operations\n - Access to common CDK bootstrap S3 buckets and SSM parameters\n - `iam:PassRole` to `cloudformation.amazonaws.com`\n- Outputs exporting the role name and ARN.\n\nA Projen task is also added:\n\n```bash\nnpx projen deploy-cdkdiff-iam-template -- --parameter-overrides GitHubOIDCRoleArn=... # plus any extra AWS CLI args\n```\n\nUse the created role ARN as `changesetRoleToAssumeArn` in `CdkDiffStackWorkflow`.\n\n---\n\n## Usage: CdkDriftDetectionWorkflow\n\n`CdkDriftDetectionWorkflow` creates a single workflow file (default `drift-detection.yml`) that can run on a schedule and via manual dispatch. It generates a helper script at `.github/workflows/scripts/detect-drift.ts` (by default) that uses AWS SDK v3 to run drift detection, write optional machine‑readable JSON, and print an HTML report for the Step Summary.\n\nExample `.projenrc.ts`:\n\n```ts\nimport { awscdk } from 'projen';\nimport { CdkDriftDetectionWorkflow } from '@jjrawlins/cdk-diff-pr-github-action';\n\nconst project = new awscdk.AwsCdkConstructLibrary({ github: true, /* ... */ });\n\nnew CdkDriftDetectionWorkflow({\n project,\n workflowName: 'Drift Detection', // optional; file name derived as 'drift-detection.yml'\n schedule: '0 1 * * *', // optional cron\n createIssues: true, // default true; create/update issue when drift detected on schedule\n oidcRoleArn: 'arn:aws:iam::123456789012:role/github-oidc-role',\n oidcRegion: 'us-east-1',\n // Optional: Node version (default '24.x')\n // nodeVersion: '24.x',\n // Optional: Where to place the helper script (default '.github/workflows/scripts/detect-drift.ts')\n // scriptOutputPath: '.github/workflows/scripts/detect-drift.ts',\n stacks: [\n {\n stackName: 'MyAppStack-Prod',\n driftDetectionRoleToAssumeArn: 'arn:aws:iam::123456789012:role/cdk-drift-role',\n driftDetectionRoleToAssumeRegion: 'us-east-1',\n // failOnDrift: true, // optional (default true)\n },\n ],\n});\n\nproject.synth();\n```\n\n### CdkDriftDetectionWorkflow props\n- `project` (required) — Your Projen project instance.\n- `stacks` (required) — Array of stacks to check.\n- `oidcRoleArn` (required) — Default OIDC role ARN used before chaining into per‑stack drift roles.\n- `oidcRegion` (required) — Default OIDC region.\n- `workflowName` (optional, default `'drift-detection'`) — Human‑friendly workflow name; the file name is derived in kebab‑case.\n- `schedule` (optional) — Cron expression for automatic runs.\n- `createIssues` (optional, default `true`) — When true, scheduled runs will create/update a GitHub issue if drift is detected.\n- `nodeVersion` (optional, default `'24.x'`) — Node.js version for the runner.\n- `scriptOutputPath` (optional, default `'.github/workflows/scripts/detect-drift.ts'`) — Where to write the helper script.\n\n### Per‑stack fields\n- `stackName` (required) — The full CloudFormation stack name.\n- `driftDetectionRoleToAssumeArn` (required) — Role to assume (after OIDC) for making drift API calls.\n- `driftDetectionRoleToAssumeRegion` (required) — Region for that role and API calls.\n- `failOnDrift` (optional, default `true`) — Intended to fail the detection step on drift. The provided script exits with non‑zero when drift is found; the job continues to allow artifact upload and issue creation.\n\n### What gets generated\n- `.github/workflows/<kebab(workflowName)>.yml` — A workflow with one job per stack plus a final summary job.\n- `.github/workflows/scripts/detect-drift.ts` — Helper script that:\n - Starts drift detection and polls until completion\n - Lists non‑`IN_SYNC` resources and builds an HTML report\n - Writes optional JSON to `DRIFT_DETECTION_OUTPUT` when set\n - Prints to stdout and appends to the GitHub Step Summary when available\n\n### Artifacts and summary\n- Each stack job uploads `drift-results-<stack>.json` (if produced).\n- A final `Drift Detection Summary` job downloads all artifacts and prints a consolidated summary.\n\nNote: The default workflow does not post PR comments for drift. It can create/update an Issue on scheduled runs when `createIssues` is `true`.\n\n### Post-notification steps (e.g., Slack)\n\nYou can add your own GitHub Action steps to run after the drift detection step for each stack using `postGitHubSteps`.\nThese steps receive a prepared Slack-compatible JSON payload via `${{ steps.notify.outputs.result }}` from an earlier step.\n\nExample: Send Slack notification (only when drift occurs) using slackapi/slack-github-action@v1\n\n```ts\nnew CdkDriftDetectionWorkflow({\n project,\n oidcRoleArn: 'arn:aws:iam::123456789012:role/github-oidc-role',\n oidcRegion: 'us-east-1',\n stacks: [/* ... */],\n postGitHubSteps: ({ stack }) => {\n // Build a descriptive name per stack\n const name = `Notify Slack (${stack} post-drift)`;\n const step = {\n name,\n uses: 'slackapi/slack-github-action@v1',\n // by default, post steps run only when drift is detected; you can override `if`\n if: \"always() && steps.drift.outcome == 'failure'\",\n with: {\n payload: '${{ steps.notify.outputs.result }}',\n },\n env: {\n SLACK_WEBHOOK_URL: '${{ secrets.CDK_NOTIFICATIONS_SLACK_WEBHOOK }}',\n SLACK_WEBHOOK_TYPE: 'INCOMING_WEBHOOK',\n },\n };\n return [step];\n },\n});\n```\n\nDetails:\n- `postGitHubSteps` can be:\n - an array of step objects, or\n - a factory function `({ stack, stack, resultsFile }) => step | step[]`.\n- Each step you provide is inserted after the results are uploaded and after a `Prepare notification payload` step.\n- The prepared payload is a Slack Block Kit JSON string summarizing results for that stack/stack.\n- Default condition: if you do not set `if` on your step, it will default to `always() && steps.drift.outcome == 'failure'`.\n- Available context/env you can use:\n - `${{ env.STAGE_NAME }}`, `${{ env.STACK_NAME }}`, `${{ env.DRIFT_DETECTION_OUTPUT }}`\n - `${{ steps.notify.outputs.result }}` — Slack payload JSON\n```\n\n## Usage: CdkDriftIamTemplate\n\nEmit an example IAM template you can deploy in your account for the Drift Detection workflow:\n\n```ts\nimport { awscdk } from 'projen';\nimport { CdkDriftIamTemplate } from '@jjrawlins/cdk-diff-pr-github-action';\n\nconst project = new awscdk.AwsCdkConstructLibrary({\n // ...\n});\n\nnew CdkDriftIamTemplate({\n project,\n roleName: 'cdk-drift-role',\n oidcRoleArn: 'arn:aws:iam::123456789012:role/github-oidc-role',\n oidcRegion: 'us-east-1',\n // Optional: custom output path (default: 'cdk-drift-workflow-iam-template.yaml')\n // outputPath: 'infra/cdk-drift-iam.yaml',\n});\n\nproject.synth();\n```\n\nThis writes `cdk-drift-workflow-iam-template.yaml` at the project root (or your chosen `outputPath`). The template defines:\n- Parameter `GitHubOIDCRoleArn` with a default from `oidcRoleArn` — the ARN of your existing GitHub OIDC role allowed to assume this drift role.\n- IAM role `CdkDriftRole` with minimal permissions for CloudFormation drift detection operations.\n- Outputs exporting the role name and ARN.\n\nA Projen task is also added:\n\n```bash\nnpx projen deploy-cdkdrift-iam-template -- --parameter-overrides GitHubOIDCRoleArn=... # plus any extra AWS CLI args\n```\n\n## Testing\n\nThis repository includes Jest tests that snapshot the synthesized outputs from Projen and assert that:\n- Diff workflows are created per stack and contain all expected steps.\n- Drift detection workflow produces one job per stack and a summary job.\n- Only one helper script file is generated per workflow type.\n- Per‑stack OIDC overrides (where supported) are respected.\n- Helpful validation errors are thrown for missing OIDC settings.\n- The IAM template files contain the expected resources and outputs.\n\nRun tests with:\n\n```bash\nyarn test\n```\n\n## Notes\n- This package assumes your repository is configured with GitHub Actions and that you have a GitHub OIDC role configured in AWS.\n- The generated scripts use the AWS SDK v3 for CloudFormation and, where applicable, the GitHub REST API.\n"
|
|
3552
3552
|
},
|
|
3553
3553
|
"repository": {
|
|
3554
3554
|
"type": "git",
|
|
@@ -3564,12 +3564,12 @@
|
|
|
3564
3564
|
"@jjrawlins/cdk-diff-pr-github-action.CdkDiffIamTemplate": {
|
|
3565
3565
|
"assembly": "@jjrawlins/cdk-diff-pr-github-action",
|
|
3566
3566
|
"docs": {
|
|
3567
|
-
"stability": "
|
|
3567
|
+
"stability": "experimental"
|
|
3568
3568
|
},
|
|
3569
3569
|
"fqn": "@jjrawlins/cdk-diff-pr-github-action.CdkDiffIamTemplate",
|
|
3570
3570
|
"initializer": {
|
|
3571
3571
|
"docs": {
|
|
3572
|
-
"stability": "
|
|
3572
|
+
"stability": "experimental"
|
|
3573
3573
|
},
|
|
3574
3574
|
"locationInModule": {
|
|
3575
3575
|
"filename": "src/CdkDiffIamTemplate.ts",
|
|
@@ -3596,7 +3596,7 @@
|
|
|
3596
3596
|
"assembly": "@jjrawlins/cdk-diff-pr-github-action",
|
|
3597
3597
|
"datatype": true,
|
|
3598
3598
|
"docs": {
|
|
3599
|
-
"stability": "
|
|
3599
|
+
"stability": "experimental"
|
|
3600
3600
|
},
|
|
3601
3601
|
"fqn": "@jjrawlins/cdk-diff-pr-github-action.CdkDiffIamTemplateProps",
|
|
3602
3602
|
"kind": "interface",
|
|
@@ -3609,7 +3609,7 @@
|
|
|
3609
3609
|
{
|
|
3610
3610
|
"abstract": true,
|
|
3611
3611
|
"docs": {
|
|
3612
|
-
"stability": "
|
|
3612
|
+
"stability": "experimental"
|
|
3613
3613
|
},
|
|
3614
3614
|
"immutable": true,
|
|
3615
3615
|
"locationInModule": {
|
|
@@ -3624,7 +3624,7 @@
|
|
|
3624
3624
|
{
|
|
3625
3625
|
"abstract": true,
|
|
3626
3626
|
"docs": {
|
|
3627
|
-
"stability": "
|
|
3627
|
+
"stability": "experimental"
|
|
3628
3628
|
},
|
|
3629
3629
|
"immutable": true,
|
|
3630
3630
|
"locationInModule": {
|
|
@@ -3639,7 +3639,7 @@
|
|
|
3639
3639
|
{
|
|
3640
3640
|
"abstract": true,
|
|
3641
3641
|
"docs": {
|
|
3642
|
-
"stability": "
|
|
3642
|
+
"stability": "experimental"
|
|
3643
3643
|
},
|
|
3644
3644
|
"immutable": true,
|
|
3645
3645
|
"locationInModule": {
|
|
@@ -3654,7 +3654,7 @@
|
|
|
3654
3654
|
{
|
|
3655
3655
|
"abstract": true,
|
|
3656
3656
|
"docs": {
|
|
3657
|
-
"stability": "
|
|
3657
|
+
"stability": "experimental"
|
|
3658
3658
|
},
|
|
3659
3659
|
"immutable": true,
|
|
3660
3660
|
"locationInModule": {
|
|
@@ -3669,7 +3669,7 @@
|
|
|
3669
3669
|
{
|
|
3670
3670
|
"abstract": true,
|
|
3671
3671
|
"docs": {
|
|
3672
|
-
"stability": "
|
|
3672
|
+
"stability": "experimental"
|
|
3673
3673
|
},
|
|
3674
3674
|
"immutable": true,
|
|
3675
3675
|
"locationInModule": {
|
|
@@ -3689,7 +3689,7 @@
|
|
|
3689
3689
|
"assembly": "@jjrawlins/cdk-diff-pr-github-action",
|
|
3690
3690
|
"datatype": true,
|
|
3691
3691
|
"docs": {
|
|
3692
|
-
"stability": "
|
|
3692
|
+
"stability": "experimental"
|
|
3693
3693
|
},
|
|
3694
3694
|
"fqn": "@jjrawlins/cdk-diff-pr-github-action.CdkDiffStack",
|
|
3695
3695
|
"kind": "interface",
|
|
@@ -3702,7 +3702,7 @@
|
|
|
3702
3702
|
{
|
|
3703
3703
|
"abstract": true,
|
|
3704
3704
|
"docs": {
|
|
3705
|
-
"stability": "
|
|
3705
|
+
"stability": "experimental"
|
|
3706
3706
|
},
|
|
3707
3707
|
"immutable": true,
|
|
3708
3708
|
"locationInModule": {
|
|
@@ -3717,7 +3717,7 @@
|
|
|
3717
3717
|
{
|
|
3718
3718
|
"abstract": true,
|
|
3719
3719
|
"docs": {
|
|
3720
|
-
"stability": "
|
|
3720
|
+
"stability": "experimental"
|
|
3721
3721
|
},
|
|
3722
3722
|
"immutable": true,
|
|
3723
3723
|
"locationInModule": {
|
|
@@ -3732,7 +3732,7 @@
|
|
|
3732
3732
|
{
|
|
3733
3733
|
"abstract": true,
|
|
3734
3734
|
"docs": {
|
|
3735
|
-
"stability": "
|
|
3735
|
+
"stability": "experimental"
|
|
3736
3736
|
},
|
|
3737
3737
|
"immutable": true,
|
|
3738
3738
|
"locationInModule": {
|
|
@@ -3747,7 +3747,7 @@
|
|
|
3747
3747
|
{
|
|
3748
3748
|
"abstract": true,
|
|
3749
3749
|
"docs": {
|
|
3750
|
-
"stability": "
|
|
3750
|
+
"stability": "experimental"
|
|
3751
3751
|
},
|
|
3752
3752
|
"immutable": true,
|
|
3753
3753
|
"locationInModule": {
|
|
@@ -3763,7 +3763,7 @@
|
|
|
3763
3763
|
{
|
|
3764
3764
|
"abstract": true,
|
|
3765
3765
|
"docs": {
|
|
3766
|
-
"stability": "
|
|
3766
|
+
"stability": "experimental"
|
|
3767
3767
|
},
|
|
3768
3768
|
"immutable": true,
|
|
3769
3769
|
"locationInModule": {
|
|
@@ -3782,12 +3782,12 @@
|
|
|
3782
3782
|
"@jjrawlins/cdk-diff-pr-github-action.CdkDiffStackWorkflow": {
|
|
3783
3783
|
"assembly": "@jjrawlins/cdk-diff-pr-github-action",
|
|
3784
3784
|
"docs": {
|
|
3785
|
-
"stability": "
|
|
3785
|
+
"stability": "experimental"
|
|
3786
3786
|
},
|
|
3787
3787
|
"fqn": "@jjrawlins/cdk-diff-pr-github-action.CdkDiffStackWorkflow",
|
|
3788
3788
|
"initializer": {
|
|
3789
3789
|
"docs": {
|
|
3790
|
-
"stability": "
|
|
3790
|
+
"stability": "experimental"
|
|
3791
3791
|
},
|
|
3792
3792
|
"locationInModule": {
|
|
3793
3793
|
"filename": "src/CdkDiffStackWorkflow.ts",
|
|
@@ -3814,7 +3814,7 @@
|
|
|
3814
3814
|
"assembly": "@jjrawlins/cdk-diff-pr-github-action",
|
|
3815
3815
|
"datatype": true,
|
|
3816
3816
|
"docs": {
|
|
3817
|
-
"stability": "
|
|
3817
|
+
"stability": "experimental"
|
|
3818
3818
|
},
|
|
3819
3819
|
"fqn": "@jjrawlins/cdk-diff-pr-github-action.CdkDiffStackWorkflowProps",
|
|
3820
3820
|
"kind": "interface",
|
|
@@ -3827,7 +3827,7 @@
|
|
|
3827
3827
|
{
|
|
3828
3828
|
"abstract": true,
|
|
3829
3829
|
"docs": {
|
|
3830
|
-
"stability": "
|
|
3830
|
+
"stability": "experimental"
|
|
3831
3831
|
},
|
|
3832
3832
|
"immutable": true,
|
|
3833
3833
|
"locationInModule": {
|
|
@@ -3842,7 +3842,7 @@
|
|
|
3842
3842
|
{
|
|
3843
3843
|
"abstract": true,
|
|
3844
3844
|
"docs": {
|
|
3845
|
-
"stability": "
|
|
3845
|
+
"stability": "experimental"
|
|
3846
3846
|
},
|
|
3847
3847
|
"immutable": true,
|
|
3848
3848
|
"locationInModule": {
|
|
@@ -3857,7 +3857,7 @@
|
|
|
3857
3857
|
{
|
|
3858
3858
|
"abstract": true,
|
|
3859
3859
|
"docs": {
|
|
3860
|
-
"stability": "
|
|
3860
|
+
"stability": "experimental"
|
|
3861
3861
|
},
|
|
3862
3862
|
"immutable": true,
|
|
3863
3863
|
"locationInModule": {
|
|
@@ -3872,7 +3872,7 @@
|
|
|
3872
3872
|
{
|
|
3873
3873
|
"abstract": true,
|
|
3874
3874
|
"docs": {
|
|
3875
|
-
"stability": "
|
|
3875
|
+
"stability": "experimental"
|
|
3876
3876
|
},
|
|
3877
3877
|
"immutable": true,
|
|
3878
3878
|
"locationInModule": {
|
|
@@ -3892,7 +3892,7 @@
|
|
|
3892
3892
|
{
|
|
3893
3893
|
"abstract": true,
|
|
3894
3894
|
"docs": {
|
|
3895
|
-
"stability": "
|
|
3895
|
+
"stability": "experimental"
|
|
3896
3896
|
},
|
|
3897
3897
|
"immutable": true,
|
|
3898
3898
|
"locationInModule": {
|
|
@@ -3908,7 +3908,7 @@
|
|
|
3908
3908
|
{
|
|
3909
3909
|
"abstract": true,
|
|
3910
3910
|
"docs": {
|
|
3911
|
-
"stability": "
|
|
3911
|
+
"stability": "experimental"
|
|
3912
3912
|
},
|
|
3913
3913
|
"immutable": true,
|
|
3914
3914
|
"locationInModule": {
|
|
@@ -3924,7 +3924,7 @@
|
|
|
3924
3924
|
{
|
|
3925
3925
|
"abstract": true,
|
|
3926
3926
|
"docs": {
|
|
3927
|
-
"stability": "
|
|
3927
|
+
"stability": "experimental"
|
|
3928
3928
|
},
|
|
3929
3929
|
"immutable": true,
|
|
3930
3930
|
"locationInModule": {
|
|
@@ -3943,16 +3943,16 @@
|
|
|
3943
3943
|
"@jjrawlins/cdk-diff-pr-github-action.CdkDriftDetectionWorkflow": {
|
|
3944
3944
|
"assembly": "@jjrawlins/cdk-diff-pr-github-action",
|
|
3945
3945
|
"docs": {
|
|
3946
|
-
"stability": "
|
|
3946
|
+
"stability": "experimental"
|
|
3947
3947
|
},
|
|
3948
3948
|
"fqn": "@jjrawlins/cdk-diff-pr-github-action.CdkDriftDetectionWorkflow",
|
|
3949
3949
|
"initializer": {
|
|
3950
3950
|
"docs": {
|
|
3951
|
-
"stability": "
|
|
3951
|
+
"stability": "experimental"
|
|
3952
3952
|
},
|
|
3953
3953
|
"locationInModule": {
|
|
3954
3954
|
"filename": "src/CdkDriftDetectionWorkflow.ts",
|
|
3955
|
-
"line":
|
|
3955
|
+
"line": 44
|
|
3956
3956
|
},
|
|
3957
3957
|
"parameters": [
|
|
3958
3958
|
{
|
|
@@ -3966,7 +3966,7 @@
|
|
|
3966
3966
|
"kind": "class",
|
|
3967
3967
|
"locationInModule": {
|
|
3968
3968
|
"filename": "src/CdkDriftDetectionWorkflow.ts",
|
|
3969
|
-
"line":
|
|
3969
|
+
"line": 41
|
|
3970
3970
|
},
|
|
3971
3971
|
"name": "CdkDriftDetectionWorkflow",
|
|
3972
3972
|
"symbolId": "src/CdkDriftDetectionWorkflow:CdkDriftDetectionWorkflow"
|
|
@@ -3975,7 +3975,7 @@
|
|
|
3975
3975
|
"assembly": "@jjrawlins/cdk-diff-pr-github-action",
|
|
3976
3976
|
"datatype": true,
|
|
3977
3977
|
"docs": {
|
|
3978
|
-
"stability": "
|
|
3978
|
+
"stability": "experimental"
|
|
3979
3979
|
},
|
|
3980
3980
|
"fqn": "@jjrawlins/cdk-diff-pr-github-action.CdkDriftDetectionWorkflowProps",
|
|
3981
3981
|
"kind": "interface",
|
|
@@ -3988,7 +3988,7 @@
|
|
|
3988
3988
|
{
|
|
3989
3989
|
"abstract": true,
|
|
3990
3990
|
"docs": {
|
|
3991
|
-
"stability": "
|
|
3991
|
+
"stability": "experimental"
|
|
3992
3992
|
},
|
|
3993
3993
|
"immutable": true,
|
|
3994
3994
|
"locationInModule": {
|
|
@@ -4003,7 +4003,7 @@
|
|
|
4003
4003
|
{
|
|
4004
4004
|
"abstract": true,
|
|
4005
4005
|
"docs": {
|
|
4006
|
-
"stability": "
|
|
4006
|
+
"stability": "experimental"
|
|
4007
4007
|
},
|
|
4008
4008
|
"immutable": true,
|
|
4009
4009
|
"locationInModule": {
|
|
@@ -4018,7 +4018,7 @@
|
|
|
4018
4018
|
{
|
|
4019
4019
|
"abstract": true,
|
|
4020
4020
|
"docs": {
|
|
4021
|
-
"stability": "
|
|
4021
|
+
"stability": "experimental"
|
|
4022
4022
|
},
|
|
4023
4023
|
"immutable": true,
|
|
4024
4024
|
"locationInModule": {
|
|
@@ -4033,7 +4033,7 @@
|
|
|
4033
4033
|
{
|
|
4034
4034
|
"abstract": true,
|
|
4035
4035
|
"docs": {
|
|
4036
|
-
"stability": "
|
|
4036
|
+
"stability": "experimental"
|
|
4037
4037
|
},
|
|
4038
4038
|
"immutable": true,
|
|
4039
4039
|
"locationInModule": {
|
|
@@ -4053,7 +4053,7 @@
|
|
|
4053
4053
|
{
|
|
4054
4054
|
"abstract": true,
|
|
4055
4055
|
"docs": {
|
|
4056
|
-
"stability": "
|
|
4056
|
+
"stability": "experimental"
|
|
4057
4057
|
},
|
|
4058
4058
|
"immutable": true,
|
|
4059
4059
|
"locationInModule": {
|
|
@@ -4069,7 +4069,7 @@
|
|
|
4069
4069
|
{
|
|
4070
4070
|
"abstract": true,
|
|
4071
4071
|
"docs": {
|
|
4072
|
-
"stability": "
|
|
4072
|
+
"stability": "experimental"
|
|
4073
4073
|
},
|
|
4074
4074
|
"immutable": true,
|
|
4075
4075
|
"locationInModule": {
|
|
@@ -4085,7 +4085,30 @@
|
|
|
4085
4085
|
{
|
|
4086
4086
|
"abstract": true,
|
|
4087
4087
|
"docs": {
|
|
4088
|
-
"
|
|
4088
|
+
"remarks": "These steps are inserted after a 'Prepare notification payload' step which exposes\na Slack-compatible JSON payload at `${{ steps.notify.outputs.result }}`.",
|
|
4089
|
+
"stability": "experimental",
|
|
4090
|
+
"summary": "Optional additional GitHub Action steps to run after drift detection for each stack."
|
|
4091
|
+
},
|
|
4092
|
+
"immutable": true,
|
|
4093
|
+
"locationInModule": {
|
|
4094
|
+
"filename": "src/CdkDriftDetectionWorkflow.ts",
|
|
4095
|
+
"line": 38
|
|
4096
|
+
},
|
|
4097
|
+
"name": "postGitHubSteps",
|
|
4098
|
+
"optional": true,
|
|
4099
|
+
"type": {
|
|
4100
|
+
"collection": {
|
|
4101
|
+
"elementtype": {
|
|
4102
|
+
"primitive": "any"
|
|
4103
|
+
},
|
|
4104
|
+
"kind": "array"
|
|
4105
|
+
}
|
|
4106
|
+
}
|
|
4107
|
+
},
|
|
4108
|
+
{
|
|
4109
|
+
"abstract": true,
|
|
4110
|
+
"docs": {
|
|
4111
|
+
"stability": "experimental"
|
|
4089
4112
|
},
|
|
4090
4113
|
"immutable": true,
|
|
4091
4114
|
"locationInModule": {
|
|
@@ -4101,7 +4124,7 @@
|
|
|
4101
4124
|
{
|
|
4102
4125
|
"abstract": true,
|
|
4103
4126
|
"docs": {
|
|
4104
|
-
"stability": "
|
|
4127
|
+
"stability": "experimental"
|
|
4105
4128
|
},
|
|
4106
4129
|
"immutable": true,
|
|
4107
4130
|
"locationInModule": {
|
|
@@ -4117,7 +4140,7 @@
|
|
|
4117
4140
|
{
|
|
4118
4141
|
"abstract": true,
|
|
4119
4142
|
"docs": {
|
|
4120
|
-
"stability": "
|
|
4143
|
+
"stability": "experimental"
|
|
4121
4144
|
},
|
|
4122
4145
|
"immutable": true,
|
|
4123
4146
|
"locationInModule": {
|
|
@@ -4136,12 +4159,12 @@
|
|
|
4136
4159
|
"@jjrawlins/cdk-diff-pr-github-action.CdkDriftIamTemplate": {
|
|
4137
4160
|
"assembly": "@jjrawlins/cdk-diff-pr-github-action",
|
|
4138
4161
|
"docs": {
|
|
4139
|
-
"stability": "
|
|
4162
|
+
"stability": "experimental"
|
|
4140
4163
|
},
|
|
4141
4164
|
"fqn": "@jjrawlins/cdk-diff-pr-github-action.CdkDriftIamTemplate",
|
|
4142
4165
|
"initializer": {
|
|
4143
4166
|
"docs": {
|
|
4144
|
-
"stability": "
|
|
4167
|
+
"stability": "experimental"
|
|
4145
4168
|
},
|
|
4146
4169
|
"locationInModule": {
|
|
4147
4170
|
"filename": "src/CdkDriftIamTemplate.ts",
|
|
@@ -4168,7 +4191,7 @@
|
|
|
4168
4191
|
"assembly": "@jjrawlins/cdk-diff-pr-github-action",
|
|
4169
4192
|
"datatype": true,
|
|
4170
4193
|
"docs": {
|
|
4171
|
-
"stability": "
|
|
4194
|
+
"stability": "experimental"
|
|
4172
4195
|
},
|
|
4173
4196
|
"fqn": "@jjrawlins/cdk-diff-pr-github-action.CdkDriftIamTemplateProps",
|
|
4174
4197
|
"kind": "interface",
|
|
@@ -4181,7 +4204,7 @@
|
|
|
4181
4204
|
{
|
|
4182
4205
|
"abstract": true,
|
|
4183
4206
|
"docs": {
|
|
4184
|
-
"stability": "
|
|
4207
|
+
"stability": "experimental"
|
|
4185
4208
|
},
|
|
4186
4209
|
"immutable": true,
|
|
4187
4210
|
"locationInModule": {
|
|
@@ -4196,7 +4219,7 @@
|
|
|
4196
4219
|
{
|
|
4197
4220
|
"abstract": true,
|
|
4198
4221
|
"docs": {
|
|
4199
|
-
"stability": "
|
|
4222
|
+
"stability": "experimental"
|
|
4200
4223
|
},
|
|
4201
4224
|
"immutable": true,
|
|
4202
4225
|
"locationInModule": {
|
|
@@ -4211,7 +4234,7 @@
|
|
|
4211
4234
|
{
|
|
4212
4235
|
"abstract": true,
|
|
4213
4236
|
"docs": {
|
|
4214
|
-
"stability": "
|
|
4237
|
+
"stability": "experimental"
|
|
4215
4238
|
},
|
|
4216
4239
|
"immutable": true,
|
|
4217
4240
|
"locationInModule": {
|
|
@@ -4226,7 +4249,7 @@
|
|
|
4226
4249
|
{
|
|
4227
4250
|
"abstract": true,
|
|
4228
4251
|
"docs": {
|
|
4229
|
-
"stability": "
|
|
4252
|
+
"stability": "experimental"
|
|
4230
4253
|
},
|
|
4231
4254
|
"immutable": true,
|
|
4232
4255
|
"locationInModule": {
|
|
@@ -4241,7 +4264,7 @@
|
|
|
4241
4264
|
{
|
|
4242
4265
|
"abstract": true,
|
|
4243
4266
|
"docs": {
|
|
4244
|
-
"stability": "
|
|
4267
|
+
"stability": "experimental"
|
|
4245
4268
|
},
|
|
4246
4269
|
"immutable": true,
|
|
4247
4270
|
"locationInModule": {
|
|
@@ -4261,7 +4284,7 @@
|
|
|
4261
4284
|
"assembly": "@jjrawlins/cdk-diff-pr-github-action",
|
|
4262
4285
|
"datatype": true,
|
|
4263
4286
|
"docs": {
|
|
4264
|
-
"stability": "
|
|
4287
|
+
"stability": "experimental"
|
|
4265
4288
|
},
|
|
4266
4289
|
"fqn": "@jjrawlins/cdk-diff-pr-github-action.Stack",
|
|
4267
4290
|
"kind": "interface",
|
|
@@ -4274,7 +4297,7 @@
|
|
|
4274
4297
|
{
|
|
4275
4298
|
"abstract": true,
|
|
4276
4299
|
"docs": {
|
|
4277
|
-
"stability": "
|
|
4300
|
+
"stability": "experimental"
|
|
4278
4301
|
},
|
|
4279
4302
|
"immutable": true,
|
|
4280
4303
|
"locationInModule": {
|
|
@@ -4289,7 +4312,7 @@
|
|
|
4289
4312
|
{
|
|
4290
4313
|
"abstract": true,
|
|
4291
4314
|
"docs": {
|
|
4292
|
-
"stability": "
|
|
4315
|
+
"stability": "experimental"
|
|
4293
4316
|
},
|
|
4294
4317
|
"immutable": true,
|
|
4295
4318
|
"locationInModule": {
|
|
@@ -4304,7 +4327,7 @@
|
|
|
4304
4327
|
{
|
|
4305
4328
|
"abstract": true,
|
|
4306
4329
|
"docs": {
|
|
4307
|
-
"stability": "
|
|
4330
|
+
"stability": "experimental"
|
|
4308
4331
|
},
|
|
4309
4332
|
"immutable": true,
|
|
4310
4333
|
"locationInModule": {
|
|
@@ -4319,7 +4342,7 @@
|
|
|
4319
4342
|
{
|
|
4320
4343
|
"abstract": true,
|
|
4321
4344
|
"docs": {
|
|
4322
|
-
"stability": "
|
|
4345
|
+
"stability": "experimental"
|
|
4323
4346
|
},
|
|
4324
4347
|
"immutable": true,
|
|
4325
4348
|
"locationInModule": {
|
|
@@ -4337,5 +4360,5 @@
|
|
|
4337
4360
|
}
|
|
4338
4361
|
},
|
|
4339
4362
|
"version": "0.0.0",
|
|
4340
|
-
"fingerprint": "
|
|
4363
|
+
"fingerprint": "O1JamAGjDiMSYl5R2l5OKNlMGKotA0pfVrDd6Ji6Xd0="
|
|
4341
4364
|
}
|