cdk-preflight 0.0.32 → 0.0.34
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/.claude/skills/find-preflight-rules/SKILL.md +1 -1
- package/.jsii +3 -3
- package/AGENTS.md +9 -1
- package/docs/rules.md +26 -1
- package/lib/index.js +6 -3
- package/lib/private/enforce.d.ts +1 -1
- package/lib/private/enforce.js +6 -2
- package/lib/rules.generated.d.ts +6 -0
- package/lib/rules.generated.js +289 -4
- package/package.json +1 -1
|
@@ -76,7 +76,7 @@ EOL ランタイム、廃止インスタンスタイプ、リージョン非対
|
|
|
76
76
|
|
|
77
77
|
## 手順
|
|
78
78
|
|
|
79
|
-
1. **制約の棚卸し**。そのサービスについて、次の順で拾う。ユーザーガイドの Limits / Quotas ページ、API リファレンスのパラメータ制約、CloudFormation
|
|
79
|
+
1. **制約の棚卸し**。そのサービスについて、次の順で拾う。ユーザーガイドの Limits / Quotas ページ、API リファレンスのパラメータ制約、CloudFormation リソースタイプのドキュメント(スキーマではなく散文の方)、実際のデプロイ失敗エラーメッセージ。数値・順序・組み合わせ・排他・命名・リージョン依存に印を付ける。サービスが作成時バリデータを無料 API で公開している場合(Step Functions の `validate-state-machine-definition` は CreateStateMachine と同じバリデータで `--type` も取る)、定義レベルの仮説はまずそれに掛けて一次選別する(2026-09-05、100 件を数分で判定)。ここで拾ったドキュメントの 1 文は**仮説であって証拠ではない**。CloudFront の棚卸し(2026-09-02)では明文化された制約 9 件のうち 3 件が実機でそのままデプロイできた(BROKEN-EXPECTATION)。候補リストは「実機ゲートに掛ける仮説の列」として書き、ドキュメントの断言を根拠に採用を確定させない
|
|
80
80
|
2. **6 レンズで狩り場を回る**。レンズ 3 と 4 から始めると当たりが早い。**レンズに当てはまらない制約もここでは捨てない** — 足切りは次の重複ガードと、実装側の実機ゲートだけ
|
|
81
81
|
3. **重複ガード**。残った候補ごとに最小の違反テンプレートを書き、素のエンジンにかける
|
|
82
82
|
```bash
|
package/.jsii
CHANGED
|
@@ -9480,7 +9480,7 @@
|
|
|
9480
9480
|
},
|
|
9481
9481
|
"locationInModule": {
|
|
9482
9482
|
"filename": "src/index.ts",
|
|
9483
|
-
"line":
|
|
9483
|
+
"line": 97
|
|
9484
9484
|
},
|
|
9485
9485
|
"name": "ruleIds",
|
|
9486
9486
|
"returns": {
|
|
@@ -9598,6 +9598,6 @@
|
|
|
9598
9598
|
"symbolId": "src/index:PreflightOptions"
|
|
9599
9599
|
}
|
|
9600
9600
|
},
|
|
9601
|
-
"version": "0.0.
|
|
9602
|
-
"fingerprint": "
|
|
9601
|
+
"version": "0.0.34",
|
|
9602
|
+
"fingerprint": "T0jnMaXQ/skxsnPgG4prlhzBEfokgSxAPIJTTjx6B1o="
|
|
9603
9603
|
}
|
package/AGENTS.md
CHANGED
|
@@ -87,6 +87,8 @@ rules/<service>/<rule-id>/
|
|
|
87
87
|
meta.yaml # id, service, resourceTypes, severity, title, constraintSource, upstream, repro
|
|
88
88
|
templates/fail.template.json
|
|
89
89
|
templates/pass.template.json
|
|
90
|
+
rules/_lib/<name>.rego # shared helpers (never emit violations); loaded before every rule, in every mode,
|
|
91
|
+
# regardless of `exclude` — so a rule may depend on a lib but never on another rule
|
|
90
92
|
src/index.ts # Preflight.apply / PreflightOptions (jsii surface — keep minimal)
|
|
91
93
|
src/private/enforce.ts # enforce-mode plugin (calls the engine directly)
|
|
92
94
|
src/rules.generated.ts # GENERATED from rules/ — never edit; run `npx projen bundle-rules`
|
|
@@ -110,6 +112,8 @@ bench/ # real-deploy verification (needs an AWS account; no
|
|
|
110
112
|
- **Dynamic reference strings are markerized too** (measured 2026-09-03): a literal `{{resolve:ssm:/path}}` property value surfaces as `{"__dynamic": "dynamic reference: {{resolve:ssm:/path}}", "__param_type": "String"}` and `resolve()` is undefined for it. A rule that judges the reference text itself (e.g. the SSM parameter path) must read the raw property with `object.get` and extract the `__dynamic` string. Reference implementation: `pf-ec2-instance-ami-arch`.
|
|
111
113
|
- **Deploy-region rules**: the enforce plugin injects a generated module defining `deploy_region` whenever the app-level region is concrete (`deployEnvironmentModule` in `src/private/enforce.ts`; the test harness injects `us-east-1` for fixtures). Rules must read it as `data.cdk_preflight.deploy_region` — the data reference is undefined when not injected, so the rule skips; a bare `deploy_region` variable would be a compile error. Consequences: region-dependent rules are silent in warn mode (`enforce: false` hands rules to the CDK built-in plugin, which we cannot inject into) and in region-agnostic apps; say so in `meta.yaml#repro.evidence`. Reference implementations: `pf-dynamodb-global-table-replica-region`, `pf-dynamodb-kinesis-stream-region`.
|
|
112
114
|
- Helper rules must use a unique `_pf_<rule>_...` prefix (all rules share one package).
|
|
115
|
+
- A helper several rules of one service need (parsing an opaque DSL, enumerating nested scopes) goes in `rules/_lib/<service>.rego` with a `_pf_<service>lib_` prefix (`rules/_lib/sfn.rego` is the reference: ASL from `DefinitionString` *or* the L1 `Definition` object, nested Parallel/Map scopes to depth 3, effective QueryLanguage). Rules never reference another rule's helpers — `exclude` can unload any rule, a lib is always loaded.
|
|
116
|
+
- **Cheap screen for definition-level constraints**: some services expose their create-time validator as a free API (`aws stepfunctions validate-state-machine-definition --type STANDARD|EXPRESS` is the same validator CreateStateMachine runs). Use it to triage doc hypotheses before spending a CloudFormation deploy on each — 100 Step Functions hypotheses took minutes (2026-09-05). The real-deploy gate stays.
|
|
113
117
|
3. `npx projen bundle-rules` then `npx jest test/rules.test.ts test/structure.test.ts` — the duplication guard and fixture checks run here.
|
|
114
118
|
4. **Real-deploy gate**: `bash bench/verify-rule.sh <rule-id>` deploys the fail template (expects CREATE to fail; records the service error message) and, where cheap, the pass template (expects success, then deletes). Paste the observed error into `meta.yaml#repro.evidence` with the date. Only `doc-only` rules may skip this, with justification.
|
|
115
119
|
5. Update nothing else by hand — `docs/rules.md` and `src/rules.generated.ts` are generated.
|
|
@@ -139,8 +143,12 @@ bench/ # real-deploy verification (needs an AWS account; no
|
|
|
139
143
|
- *Character classes are Unicode-aware.* `\w`, `\d` and `\s` match non-ASCII — `regex.match("[\\w]+", "テスト用")` is **true**. AWS API patterns like Cognito's `[\w\s+=,.@-]+` are ASCII-semantics, so copying one verbatim yields a rule that never fires. Write explicit ranges (`^[A-Za-z0-9_ \t+=,.@-]+$`).
|
|
140
144
|
- *No lookahead/lookbehind.* ELBv2 publishes `(?!^-)(?!.*-$)^[A-Za-z0-9-]+$` for `targetGroupName`; that pattern does not compile here, and `regex.match` then returns false for **every** input — the rule fires on all values, which is worse than not firing. Rewrite without lookaround: `^[A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])?$`.
|
|
141
145
|
- **The absence sentinel must not be a string.** The `object.get(props, "<Key>", "__pf_absent")` idiom is only safe when the next step is `== "__pf_absent"`. If the next step is `is_string(v)` followed by a format check, an *absent* key yields the sentinel string and the rule fires on every resource that omits the property. Use `null` as the default in that case — `is_string(null)` is false, so the rule skips. (This produced three false-positive rules in the 2026-09-04 batch, visible only because other rules' pass fixtures went red.)
|
|
146
|
+
- **Iterating a scalar with `some .. in` is a hard evaluation error, not undefined** ("`some .. in collection` expects array/set/object. Got `true`", measured 2026-09-05) — and it takes the *whole* custom package down, every rule. Any `some k, v in x` over a value read out of user JSON needs an `is_object(x)` / `is_array(x)` guard first.
|
|
147
|
+
- **A bare `%` in a `sprintf` format string silently kills the rule** (measured 2026-09-05): `% ` is an invalid verb, `sprintf` is undefined, the body fails, nothing fires and nothing errors. Write `%%` in messages that mention percent signs.
|
|
148
|
+
- **Missing builtins (measured 2026-09-05)**: `walk`, `graph.reachable`, `time.parse_rfc3339_ns`, `glob.match`, and `every` inside a comprehension all fail to evaluate. Reachability has to be approximated (no-incoming-edge, `pf-sfn-asl-unreachable-state`), nesting expanded to a fixed depth (`rules/_lib/sfn.rego`), timestamps matched with a regex. Present and working: `object.keys`, `object.get` with a path array, `regex.find_n`, `numbers.range`, `array.slice`, `json.marshal`, `object.union`, `strings.count`, `indexof`, `substring`.
|
|
149
|
+
- **`resolve()` of a `Fn::Join` / `Fn::Sub` that references another resource is undefined** (measured 2026-09-05); only pseudo-parameter pieces flatten. A CDK `DefinitionBody.fromChainable` definition (Join over GetAtt tokens) is therefore invisible to string-parsing rules — they see `fromString` / `fromFile` / substitutions and the L1 `Definition` object, which is where the unchecked input is anyway.
|
|
150
|
+
- **Tuple destructuring in `some [a, b] in <array literal>` does not schedule** ("statements not scheduled in query", measured 2026-09-04). Iterating a table of pairs inline is not available — a **set literal** of tuples fails the same way (measured 2026-09-05); build a set with one helper rule per case and destructure that set (`some [name, path, v] in _pf_x_bad`), which does work.
|
|
142
151
|
- **`resolve()` of `Fn::GetAtt <Resource>.<Attr>` also returns the target's logical ID** (measured 2026-09-05), exactly like a `Ref`. So `resolve(sub, "Properties.Endpoint")` on `Fn::GetAtt Queue.Arn` yields `"Queue"`, which can be fed to `resources_of_type(...)` membership and a second `resolve` on the target. When the *kind* of reference matters (a URL-taking property handed an ARN), read the raw document: `Ref` is `{"__kind": "resource", "__ref": "Q"}`, `Fn::GetAtt` is `{"__kind": "getatt:<Attr>", "__ref": "Q"}`; `flatten_list` drops `__kind`. Reference implementations: `pf-sqs-queue-policy-queues`, `pf-sns-topic-policy-topics`.
|
|
143
152
|
- **Cross-resource checks the engine already does on `Ref`/`GetAtt` wiring can be blind to literal ARNs.** `E3502` compares a source queue's type with its dead-letter queue only when `deadLetterTargetArn` is `Fn::GetAtt` of a queue in the template; a literal `.fifo` ARN (an imported queue) passes (measured 2026-09-05). Probe both wirings before deciding a candidate is covered — `pf-sqs-dlq-same-type` exists only for the literal path.
|
|
144
|
-
- **Tuple destructuring in `some [a, b] in <array literal>` does not schedule** ("statements not scheduled in query", measured 2026-09-04). Iterating a table of pairs inline is not available; build a set with one helper rule per case and destructure that set (`some [name, path, v] in _pf_x_bad`), which does work.
|
|
145
153
|
- **Schema pattern/length coverage is per property, not per resource or per service.** `AWS::EC2::SecurityGroup.GroupDescription` carries a pattern (`F3031`) while the rule-level `SecurityGroupIngress[].Description` on the same resource carries none; DynamoDB's GSI `IndexName` has one while the table's own `TableName` does not. Never generalise "the engine handles names/lengths" from a sample — probe the exact property (measured 2026-09-04 across 57 templates).
|
|
146
154
|
- **Probing the raw engine with custom rules**: the rule set must be named `violation` (`data.<pkg>.violation` is looked up; a `diagnostics` set fails with "not a valid rule path"), and hand-built diagnostic objects need lowercase severities (`error`, not `ERROR`/`CUSTOM` — those are display labels added by the wrapper). Pack rules never see this because `make_diag_full` handles the shape.
|
package/docs/rules.md
CHANGED
|
@@ -249,6 +249,31 @@
|
|
|
249
249
|
| `pf-sqs-redrive-arn-region` | AWS::SQS::Queue | The dead-letter target and every RedriveAllowPolicy source queue must sit in the deploy region | none |
|
|
250
250
|
| `pf-sqs-redrive-policy` | AWS::SQS::Queue | RedrivePolicy needs deadLetterTargetArn (an SQS queue ARN) and maxReceiveCount in 1..1000 | none |
|
|
251
251
|
| `pf-sqs-sse-exclusive` | AWS::SQS::Queue | SqsManagedSseEnabled: true and KmsMasterKeyId are mutually exclusive (one SSE type per queue) | none |
|
|
252
|
-
| `pf-sfn-asl-
|
|
252
|
+
| `pf-sfn-asl-branch-shape` | AWS::StepFunctions::StateMachine | Parallel Branches is a non-empty array and every branch / Map ItemProcessor / Iterator carries both StartAt and States | none |
|
|
253
|
+
| `pf-sfn-asl-choice-rules` | AWS::StepFunctions::StateMachine | Choice rules: Choices is non-empty, each top-level rule has Next and exactly one selector (Variable / And / Or / Not / Condition), a Variable rule has exactly one comparator, and Next never sits inside And/Or/Not | none |
|
|
254
|
+
| `pf-sfn-asl-credentials` | AWS::StepFunctions::StateMachine | A Task Credentials object needs RoleArn, and Credentials is not accepted on an Activity resource | none |
|
|
255
|
+
| `pf-sfn-asl-duplicate-state-name` | AWS::StepFunctions::StateMachine | ASL state names must be unique across the whole state machine, including Parallel branches and Map item processors | none |
|
|
256
|
+
| `pf-sfn-asl-integration-parameters` | AWS::StepFunctions::StateMachine | An arn:<partition>:states::: integration Task needs Parameters (JSONPath) or Arguments (JSONata), and the common integrations need their required fields (lambda:invoke FunctionName, sqs:sendMessage QueueUrl+MessageBody, sns:publish Message, dynamodb:putItem TableName+Item, dynamodb:getItem TableName+Key, states:startExecution StateMachineArn, events:putEvents Entries, ecs:runTask TaskDefinition, glue:startJobRun JobName) | none |
|
|
257
|
+
| `pf-sfn-asl-jsonpath-syntax` | AWS::StepFunctions::StateMachine | JSONPath fields start with $ (InputPath, OutputPath, *Path, Choice Variable), ResultPath/ItemsPath are Reference Paths (no *, .., ?, @), values of ".$" keys are a path or a States.* intrinsic, and Assign variable names are alphanumeric and not the reserved "states" | none |
|
|
258
|
+
| `pf-sfn-asl-map-distributed` | AWS::StepFunctions::StateMachine | Map ProcessorConfig and ItemReader shape: DISTRIBUTED requires ExecutionType (STANDARD|EXPRESS) and INLINE forbids it; ItemReader.Resource is s3:getObject or s3:listObjectsV2; CSV input needs CSVHeaderLocation (GIVEN needs CSVHeaders) and JSON input forbids it | none |
|
|
259
|
+
| `pf-sfn-asl-missing-state` | AWS::StepFunctions::StateMachine | ASL Next/Default/Choices[].Next/Catch[].Next must reference a state defined in the same States block, at every nesting level (a dangling StartAt is covered by engine rule E3601) | none |
|
|
260
|
+
| `pf-sfn-asl-name-limits` | AWS::StepFunctions::StateMachine | ASL state names are at most 80 characters; a Distributed Map Label is at most 40 characters and unique within the state machine | none |
|
|
261
|
+
| `pf-sfn-asl-next-end` | AWS::StepFunctions::StateMachine | A Task/Pass/Wait/Parallel/Map state carries exactly one of Next or End: true | none |
|
|
262
|
+
| `pf-sfn-asl-numeric-ranges` | AWS::StepFunctions::StateMachine | ASL numeric fields have service-side ranges the schema does not carry: TimeoutSeconds/HeartbeatSeconds 1..99999999, Wait Seconds 0..99999999, MaxConcurrency >= 0, ToleratedFailurePercentage <= 100, Retry MaxAttempts 0..99999999, BackoffRate >= 1.0, MaxDelaySeconds 1..31622400, and integers must be numbers | none |
|
|
263
|
+
| `pf-sfn-asl-path-exclusive` | AWS::StepFunctions::StateMachine | A static ASL field and its Path variant are mutually exclusive (TimeoutSeconds/TimeoutSecondsPath, HeartbeatSeconds/HeartbeatSecondsPath, MaxConcurrency/MaxConcurrencyPath, ToleratedFailurePercentage/-Path, Error/ErrorPath, Cause/CausePath), and a Map state has exactly one of ItemProcessor / Iterator | none |
|
|
264
|
+
| `pf-sfn-asl-query-language` | AWS::StepFunctions::StateMachine | JSONPath-only fields (InputPath, OutputPath, ResultPath, Parameters, ResultSelector, Result, *Path, Variable rules) and JSONata-only fields (Arguments, Output, Items, Condition) must match the effective QueryLanguage; a JSONata state machine cannot contain JSONPath states; {% must close with %} | none |
|
|
265
|
+
| `pf-sfn-asl-resource-arn` | AWS::StepFunctions::StateMachine | Task Resource is an ARN, and an integration pattern the service does not offer fails creation: .sync on Lambda/SNS/SQS/DynamoDB/EventBridge/API Gateway/aws-sdk, .waitForTaskToken on Athena/Batch/CodeBuild/EMR/Glue/DataBrew/MediaConvert/SageMaker/DynamoDB, and .sync:2 anywhere but states:startExecution | none |
|
|
266
|
+
| `pf-sfn-asl-retry-catch` | AWS::StepFunctions::StateMachine | Retry/Catch entries: ErrorEquals is present and non-empty, States.ALL appears alone and only in the last entry, every Catch has Next, and JitterStrategy is NONE or FULL | none |
|
|
267
|
+
| `pf-sfn-asl-state-fields` | AWS::StepFunctions::StateMachine | ASL fields are per state type: a known field placed on a type that does not accept it (Retry on Pass, End on Choice, Next on Fail, ...) fails creation | none |
|
|
268
|
+
| `pf-sfn-asl-terminal-state` | AWS::StepFunctions::StateMachine | An ASL state machine needs at least one terminal state (End: true, Succeed or Fail) at the top level | none |
|
|
269
|
+
| `pf-sfn-asl-unreachable-state` | AWS::StepFunctions::StateMachine | Every ASL state must be reachable: a state that is not StartAt and that no other state transitions to fails creation | none |
|
|
270
|
+
| `pf-sfn-asl-wait-timing` | AWS::StepFunctions::StateMachine | A Wait state carries exactly one of Seconds / Timestamp / SecondsPath / TimestampPath, and a literal Timestamp is RFC3339 with T and Z (all four absent is covered by engine rule E3601) | none |
|
|
271
|
+
| `pf-sfn-definition-exactly-one` | AWS::StepFunctions::StateMachine | A state machine carries exactly one of Definition, DefinitionString or DefinitionS3Location | none |
|
|
272
|
+
| `pf-sfn-encryption-config` | AWS::StepFunctions::StateMachine<br>AWS::StepFunctions::Activity | EncryptionConfiguration: CUSTOMER_MANAGED_KMS_KEY requires KmsKeyId, and AWS_OWNED_KEY rejects KmsKeyId and KmsDataKeyReusePeriodSeconds (state machines and activities) | none |
|
|
273
|
+
| `pf-sfn-express-unsupported` | AWS::StepFunctions::StateMachine | An EXPRESS state machine cannot use .sync / .waitForTaskToken integrations, Activity resources, or Distributed Map (at any nesting level) | none |
|
|
274
|
+
| `pf-sfn-kms-key-region` | AWS::StepFunctions::StateMachine<br>AWS::StepFunctions::Activity | EncryptionConfiguration.KmsKeyId must be a key in the deploy region (state machines and activities) | none |
|
|
275
|
+
| `pf-sfn-logging-destination` | AWS::StepFunctions::StateMachine | LoggingConfiguration with Level other than OFF needs exactly one Destinations entry carrying CloudWatchLogsLogGroup.LogGroupArn, and a literal ARN must be a CloudWatch Logs log-group ARN ending in :* | none |
|
|
276
|
+
| `pf-sfn-logging-name-ascii` | AWS::StepFunctions::StateMachine | With CloudWatch Logs logging enabled (Level other than OFF) the StateMachineName may only contain 0-9, A-Z, a-z, . - and _ (non-ASCII names are accepted only without logging) | none |
|
|
277
|
+
| `pf-sfn-name-charset` | AWS::StepFunctions::StateMachine<br>AWS::StepFunctions::Activity | StateMachineName and Activity Name may not contain whitespace, brackets (< > { } [ ]), wildcards (? *), the special characters " # % \ ^ | ~ ` $ & , ; : / or control characters (non-ASCII letters are accepted) | none |
|
|
253
278
|
| `pf-tags-aws-prefix` | * | Tag keys may not use the reserved aws: prefix | none |
|
|
254
279
|
| `pf-tags-count-max` | * | A resource may carry at most 50 tags | none |
|
package/lib/index.js
CHANGED
|
@@ -17,7 +17,7 @@ const rules_generated_1 = require("./rules.generated");
|
|
|
17
17
|
* Preflight.apply(app);
|
|
18
18
|
*/
|
|
19
19
|
class Preflight {
|
|
20
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-preflight.Preflight", version: "0.0.
|
|
20
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-preflight.Preflight", version: "0.0.34" };
|
|
21
21
|
/**
|
|
22
22
|
* Register the cdk-preflight rules on an App or Stage.
|
|
23
23
|
*/
|
|
@@ -38,7 +38,10 @@ class Preflight {
|
|
|
38
38
|
}
|
|
39
39
|
else {
|
|
40
40
|
aws_cdk_lib_1.Validations.of(scope).addPlugins(new aws_cdk_lib_1.CloudFormationValidatePlugin({
|
|
41
|
-
regoRules:
|
|
41
|
+
regoRules: [
|
|
42
|
+
...rules_generated_1.BUNDLED_LIBS.map((l) => ({ name: l.name, content: l.rego })),
|
|
43
|
+
...selected.map((r) => ({ name: r.id, content: r.rego })),
|
|
44
|
+
],
|
|
42
45
|
}));
|
|
43
46
|
}
|
|
44
47
|
}
|
|
@@ -51,4 +54,4 @@ class Preflight {
|
|
|
51
54
|
constructor() { }
|
|
52
55
|
}
|
|
53
56
|
exports.Preflight = Preflight;
|
|
54
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLDZDQUErRTtBQUUvRSwrQ0FBMkQ7QUFDM0QsdURBQWdFO0FBa0RoRTs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBYSxTQUFTOztJQUNwQjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBaUIsRUFBRSxVQUE0QixFQUFFO1FBQ25FLElBQUksQ0FBQyxtQkFBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0VBQXNFLENBQUMsQ0FBQztRQUMxRixDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDdEMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQywrQkFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hGLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6RixDQUFDO1FBQ0QsTUFBTSxRQUFRLEdBQUcsK0JBQWE7YUFDM0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLGdCQUFnQixDQUFDO2FBQzFGLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTFDLElBQUksT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM1Qix5QkFBVyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxnQ0FBc0IsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ2xHLENBQUM7YUFBTSxDQUFDO1lBQ04seUJBQVcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksMENBQTRCLENBQUM7Z0JBQ2hFLFNBQVMsRUFBRTtvQkFDVCxHQUFHLDhCQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUMvRCxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7aUJBQzFEO2FBQ0YsQ0FBQyxDQUFDLENBQUM7UUFDTixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLE9BQU87UUFDbkIsT0FBTywrQkFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxnQkFBdUIsQ0FBQzs7QUFwQzFCLDhCQXFDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENsb3VkRm9ybWF0aW9uVmFsaWRhdGVQbHVnaW4sIFN0YWdlLCBWYWxpZGF0aW9ucyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IElDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IFByZWZsaWdodEVuZm9yY2VQbHVnaW4gfSBmcm9tICcuL3ByaXZhdGUvZW5mb3JjZSc7XG5pbXBvcnQgeyBCVU5ETEVEX0xJQlMsIEJVTkRMRURfUlVMRVMgfSBmcm9tICcuL3J1bGVzLmdlbmVyYXRlZCc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIFByZWZsaWdodC5hcHBseX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJlZmxpZ2h0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBSdWxlIGlkcyB0byBkaXNhYmxlIChzZWUgYFByZWZsaWdodC5ydWxlSWRzKClgIG9yIGRvY3MvcnVsZXMubWQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGFsbCBidW5kbGVkIHJ1bGVzIGFyZSBlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBleGNsdWRlPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEZhaWwgc3ludGhlc2lzIHdoZW4gYSBidW5kbGVkIHJ1bGUgaXMgdmlvbGF0ZWQuXG4gICAqXG4gICAqIEluIHRoZSBkZWZhdWx0IChlbmZvcmNlKSBtb2RlLCBjZGstcHJlZmxpZ2h0IGV2YWx1YXRlcyBpdHMgcnVsZXMgd2l0aCBpdHNcbiAgICogb3duIHZhbGlkYXRpb24gcGx1Z2luIGFuZCBhIHZpb2xhdGlvbiBtYWtlcyBgY2RrIHN5bnRoYCBmYWlsIOKAlCB0aGUgd2hvbGVcbiAgICogcG9pbnQgb2YgcHJlZmxpZ2h0IGNoZWNrcyBpcyB0aGF0IGEgdGVtcGxhdGUga25vd24gdG8gZmFpbCBhdCBkZXBsb3kgdGltZVxuICAgKiBuZXZlciBsZWF2ZXMgeW91ciBtYWNoaW5lLiBTZXQgYGVuZm9yY2U6IGZhbHNlYCB0byBvYnNlcnZlIGZpcnN0OiBmaW5kaW5nc1xuICAgKiBhcmUgdGhlbiByZXBvcnRlZCB0aHJvdWdoIHRoZSBDREsgYnVpbHQtaW4gQ2xvdWRGb3JtYXRpb24gdmFsaWRhdG9yIGFuZFxuICAgKiBzdXJmYWNlIGFzIHN5bnRoIHdhcm5pbmdzIHdpdGggY29uc3RydWN0IHRyYWNlcywgd2hpY2ggY2FuIGJlIG11dGVkIHBlclxuICAgKiBmaW5kaW5nIHZpYSBgQWNrbm93bGVkZ2Ugd2l0aCAnQ2xvdWRGb3JtYXRpb24tVmFsaWRhdGU6OjxydWxlLWlkPidgLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBlbmZvcmNlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW4gZW5mb3JjZSBtb2RlLCBhZGRpdGlvbmFsbHkgZmFpbCBzeW50aGVzaXMgb24gZXJyb3ItY2xhc3MgZmluZGluZ3NcbiAgICogKHNldmVyaXR5IEVSUk9SL0ZBVEFMKSBvZiB0aGUgYnVpbHQtaW4gdmFsaWRhdGlvbiBlbmdpbmUgaXRzZWxmLCBlLmcuXG4gICAqIHNjaGVtYSB2aW9sYXRpb25zIGxpa2UgYEYzMDM0YC4gVGhpcyBpcyB0aGUgd29ya2Fyb3VuZCBmb3IgdGhlIENES1xuICAgKiBiZWhhdmlvciB3aGVyZSBhbGwgYnVpbHQtaW4gZmluZGluZ3MgYXJlIGRvd25ncmFkZWQgdG8gd2FybmluZ3MuXG4gICAqXG4gICAqIE9ubHkgZWZmZWN0aXZlIGluIGVuZm9yY2UgbW9kZSAodGhlIGRlZmF1bHQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgc3RyaWN0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5jbHVkZSBydWxlcyB0aGF0IGFyZSBtYXJrZWQgYHBlbmRpbmctZW5naW5lYCAoY2FuZGlkYXRlcyB0aGF0IGhhdmUgYmVlblxuICAgKiBwcm9wb3NlZCB0byB0aGUgdXBzdHJlYW0gY2xvdWRmb3JtYXRpb24tdmFsaWRhdGUgZW5naW5lIGJ1dCBhcmUgbm90IG1lcmdlZFxuICAgKiB5ZXQpLiBEaXNhYmxlIHRoaXMgaWYgeW91IHJ1biBhIG5ld2VyIGVuZ2luZSB0aGF0IGFscmVhZHkgY292ZXJzIHRoZW0uXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGluY2x1ZGVVcHN0cmVhbVBlbmRpbmc/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIGNkay1wcmVmbGlnaHQ6IGNhdGNoIGRlcGxveS10aW1lIENsb3VkRm9ybWF0aW9uIGZhaWx1cmVzIGF0IHN5bnRoIHRpbWUuXG4gKlxuICogSW5qZWN0cyBhIGN1cmF0ZWQgUmVnbyBydWxlIHBhY2sgKGNvbnN0cmFpbnRzIHRoYXQgcmVzb3VyY2UgcHJvdmlkZXIgc2NoZW1hc1xuICogZG8gbm90IGV4cHJlc3M6IGRvYy1vbmx5IHZhbHVlIGxpbWl0cywgY3Jvc3MtcHJvcGVydHkgYW5kIGNyb3NzLXJlc291cmNlXG4gKiBydWxlcykgaW50byB0aGUgQVdTIENESyBidWlsdC1pbiBDbG91ZEZvcm1hdGlvbiB2YWxpZGF0b3IuXG4gKlxuICogQGV4YW1wbGVcbiAqIGRlY2xhcmUgY29uc3QgYXBwOiBBcHA7XG4gKiBQcmVmbGlnaHQuYXBwbHkoYXBwKTtcbiAqL1xuZXhwb3J0IGNsYXNzIFByZWZsaWdodCB7XG4gIC8qKlxuICAgKiBSZWdpc3RlciB0aGUgY2RrLXByZWZsaWdodCBydWxlcyBvbiBhbiBBcHAgb3IgU3RhZ2UuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFwcGx5KHNjb3BlOiBJQ29uc3RydWN0LCBvcHRpb25zOiBQcmVmbGlnaHRPcHRpb25zID0ge30pOiB2b2lkIHtcbiAgICBpZiAoIVN0YWdlLmlzU3RhZ2Uoc2NvcGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nkay1wcmVmbGlnaHQ6IFByZWZsaWdodC5hcHBseSgpIG11c3QgYmUgY2FsbGVkIG9uIGFuIEFwcCBvciBhIFN0YWdlJyk7XG4gICAgfVxuICAgIGNvbnN0IGV4Y2x1ZGUgPSBvcHRpb25zLmV4Y2x1ZGUgPz8gW107XG4gICAgY29uc3QgdW5rbm93biA9IGV4Y2x1ZGUuZmlsdGVyKChpZCkgPT4gIUJVTkRMRURfUlVMRVMuc29tZSgocikgPT4gci5pZCA9PT0gaWQpKTtcbiAgICBpZiAodW5rbm93bi5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGNkay1wcmVmbGlnaHQ6IHVua25vd24gcnVsZSBpZChzKSBpbiBleGNsdWRlOiAke3Vua25vd24uam9pbignLCAnKX1gKTtcbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBCVU5ETEVEX1JVTEVTXG4gICAgICAuZmlsdGVyKChyKSA9PiAob3B0aW9ucy5pbmNsdWRlVXBzdHJlYW1QZW5kaW5nID8/IHRydWUpIHx8IHIudXBzdHJlYW0gIT09ICdwZW5kaW5nLWVuZ2luZScpXG4gICAgICAuZmlsdGVyKChyKSA9PiAhZXhjbHVkZS5pbmNsdWRlcyhyLmlkKSk7XG5cbiAgICBpZiAob3B0aW9ucy5lbmZvcmNlID8/IHRydWUpIHtcbiAgICAgIFZhbGlkYXRpb25zLm9mKHNjb3BlKS5hZGRQbHVnaW5zKG5ldyBQcmVmbGlnaHRFbmZvcmNlUGx1Z2luKHNlbGVjdGVkLCBvcHRpb25zLnN0cmljdCA/PyBmYWxzZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBWYWxpZGF0aW9ucy5vZihzY29wZSkuYWRkUGx1Z2lucyhuZXcgQ2xvdWRGb3JtYXRpb25WYWxpZGF0ZVBsdWdpbih7XG4gICAgICAgIHJlZ29SdWxlczogW1xuICAgICAgICAgIC4uLkJVTkRMRURfTElCUy5tYXAoKGwpID0+ICh7IG5hbWU6IGwubmFtZSwgY29udGVudDogbC5yZWdvIH0pKSxcbiAgICAgICAgICAuLi5zZWxlY3RlZC5tYXAoKHIpID0+ICh7IG5hbWU6IHIuaWQsIGNvbnRlbnQ6IHIucmVnbyB9KSksXG4gICAgICAgIF0sXG4gICAgICB9KSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBpZHMgb2YgYWxsIGJ1bmRsZWQgcnVsZXMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJ1bGVJZHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBCVU5ETEVEX1JVTEVTLm1hcCgocikgPT4gci5pZCk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cbn1cbiJdfQ==
|
package/lib/private/enforce.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { IPolicyValidationContext, IPolicyValidationPlugin, PolicyValidationPluginReport } from 'aws-cdk-lib';
|
|
2
|
-
import type
|
|
2
|
+
import { type BundledRuleData } from '../rules.generated';
|
|
3
3
|
/**
|
|
4
4
|
* The name of the generated Rego module that carries the deployment
|
|
5
5
|
* environment into rule evaluation.
|
package/lib/private/enforce.js
CHANGED
|
@@ -38,6 +38,7 @@ exports.deployEnvironmentModule = deployEnvironmentModule;
|
|
|
38
38
|
exports.isConcreteRegion = isConcreteRegion;
|
|
39
39
|
exports.loadEngine = loadEngine;
|
|
40
40
|
const path = __importStar(require("path"));
|
|
41
|
+
const rules_generated_1 = require("../rules.generated");
|
|
41
42
|
/* eslint-disable @typescript-eslint/no-require-imports */
|
|
42
43
|
/* eslint-disable import/no-extraneous-dependencies -- @aws/cloudformation-validate は
|
|
43
44
|
aws-cdk-lib 同梱コピーを動的解決する設計(依存には載せない)。README/AGENTS.md 参照 */
|
|
@@ -141,7 +142,10 @@ const regoEngineCache = new Map();
|
|
|
141
142
|
function regoEngineCached(engineModule, rules, region) {
|
|
142
143
|
const key = `${region ?? ''}|${rules.map((r) => r.id).join(',')}`;
|
|
143
144
|
if (!regoEngineCache.has(key)) {
|
|
144
|
-
const customRules =
|
|
145
|
+
const customRules = [
|
|
146
|
+
...rules_generated_1.BUNDLED_LIBS.map((l) => ({ name: l.name, content: l.rego })),
|
|
147
|
+
...rules.map((r) => ({ name: r.id, content: r.rego })),
|
|
148
|
+
];
|
|
145
149
|
if (region !== undefined) {
|
|
146
150
|
customRules.push(deployEnvironmentModule(region));
|
|
147
151
|
}
|
|
@@ -172,4 +176,4 @@ function loadEngine() {
|
|
|
172
176
|
return undefined;
|
|
173
177
|
}
|
|
174
178
|
}
|
|
175
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5mb3JjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcml2YXRlL2VuZm9yY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkJBLDBEQUtDO0FBTUQsNENBRUM7QUF1R0QsZ0NBZUM7QUFoS0QsMkNBQTZCO0FBUzdCLDBEQUEwRDtBQUMxRDs4REFDOEQ7QUFFOUQ7OztHQUdHO0FBQ1UsUUFBQSxzQkFBc0IsR0FBRyx3QkFBd0IsQ0FBQztBQUUvRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFnQix1QkFBdUIsQ0FBQyxNQUFjO0lBQ3BELE9BQU87UUFDTCxJQUFJLEVBQUUsOEJBQXNCO1FBQzVCLE9BQU8sRUFBRSwrREFBK0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSTtLQUNuRyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLGdCQUFnQixDQUFDLE1BQTBCO0lBQ3pELE9BQU8sT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLDBCQUEwQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMvRSxDQUFDO0FBWUQ7Ozs7Ozs7R0FPRztBQUNILE1BQWEsc0JBQXNCO0lBSWQ7SUFDQTtJQUpILElBQUksR0FBRyxlQUFlLENBQUM7SUFFdkMsWUFDbUIsS0FBd0IsRUFDeEIsTUFBZTtRQURmLFVBQUssR0FBTCxLQUFLLENBQW1CO1FBQ3hCLFdBQU0sR0FBTixNQUFNLENBQVM7SUFDL0IsQ0FBQztJQUVHLFFBQVEsQ0FBQyxPQUFpQztRQUMvQyxNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLHNDQUFzQztZQUN0QyxPQUFPLENBQUMsS0FBSyxDQUNYLGlFQUFpRTtnQkFDakUsZ0VBQWdFO2dCQUNoRSwrREFBK0QsQ0FDaEUsQ0FBQztZQUNGLE9BQU8s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UUFDM0QsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQywyQ0FBMkMsRUFBRTtZQUMxRSxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzlCLENBQUMsQ0FBQztRQUNILE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHR5cGUge1xuICBJUG9saWN5VmFsaWRhdGlvbkNvbnRleHQsXG4gIElQb2xpY3lWYWxpZGF0aW9uUGx1Z2luLFxuICBQb2xpY3lWYWxpZGF0aW9uUGx1Z2luUmVwb3J0LFxuICBQb2xpY3lWaW9sYXRpb24sXG59IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB0eXBlIHsgQnVuZGxlZFJ1bGVEYXRhIH0gZnJvbSAnLi4vcnVsZXMuZ2VuZXJhdGVkJztcblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0cyAqL1xuLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzIC0tIEBhd3MvY2xvdWRmb3JtYXRpb24tdmFsaWRhdGUg44GvXG4gICBhd3MtY2RrLWxpYiDlkIzmorHjgrPjg5Tjg7zjgpLli5XnmoTop6PmsbrjgZnjgovoqK3oqIjvvIjkvp3lrZjjgavjga/ovInjgZvjgarjgYTvvInjgIJSRUFETUUvQUdFTlRTLm1kIOWPgueFpyAqL1xuXG4vKipcbiAqIFRoZSBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgUmVnbyBtb2R1bGUgdGhhdCBjYXJyaWVzIHRoZSBkZXBsb3ltZW50XG4gKiBlbnZpcm9ubWVudCBpbnRvIHJ1bGUgZXZhbHVhdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IERFUExPWV9FTlZfTU9EVUxFX05BTUUgPSAnX3BmX2RlcGxveV9lbnZpcm9ubWVudCc7XG5cbi8qKlxuICogQnVpbGQgdGhlIGdlbmVyYXRlZCBtb2R1bGUgZGVmaW5pbmcgYGRlcGxveV9yZWdpb25gIGZvciB0aGUgcnVsZSBwYWNrYWdlLlxuICpcbiAqIFJ1bGVzIG11c3QgcmVhZCBpdCBhcyBgZGF0YS5jZGtfcHJlZmxpZ2h0LmRlcGxveV9yZWdpb25gIChuZXZlciBhcyBhIGJhcmVcbiAqIHZhcmlhYmxlKTogdGhlIGRhdGEgcmVmZXJlbmNlIGlzIHNpbXBseSB1bmRlZmluZWQgd2hlbiB0aGUgbW9kdWxlIGlzIG5vdFxuICogaW5qZWN0ZWQg4oCUIHRoZSBydWxlIGJvZHkgZmFpbHMgYW5kIHRoZSBydWxlIHNraXBzIOKAlCB3aGlsZSBhIGJhcmUgdmFyaWFibGVcbiAqIHdvdWxkIGJlIGEgY29tcGlsZSBlcnJvci4gSW5qZWN0ZWQgYnkgdGhlIGVuZm9yY2UgcGx1Z2luIHdoZW4gdGhlIGFwcC1sZXZlbFxuICogcmVnaW9uIGlzIGNvbmNyZXRlOyB0aGUgd2FybiBtb2RlIChDREsgYnVpbHQtaW4gcGx1Z2luKSBuZXZlciBpbmplY3RzIGl0LFxuICogc28gcmVnaW9uLWRlcGVuZGVudCBydWxlcyBvbmx5IGZpcmUgaW4gZW5mb3JjZSBtb2RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVwbG95RW52aXJvbm1lbnRNb2R1bGUocmVnaW9uOiBzdHJpbmcpOiB7IG5hbWU6IHN0cmluZzsgY29udGVudDogc3RyaW5nIH0ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IERFUExPWV9FTlZfTU9EVUxFX05BTUUsXG4gICAgY29udGVudDogYHBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuZGVwbG95X3JlZ2lvbiA6PSAke0pTT04uc3RyaW5naWZ5KHJlZ2lvbil9XFxuYCxcbiAgfTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSByZWdpb24gZnJvbSB0aGUgdmFsaWRhdGlvbiBjb250ZXh0IGlzIGEgY29uY3JldGUgcmVnaW9uIG5hbWVcbiAqIChhcyBvcHBvc2VkIHRvIHVuZGVmaW5lZCwgYW4gdW5yZXNvbHZlZCB0b2tlbiwgb3IgYSBwbGFjZWhvbGRlcikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbmNyZXRlUmVnaW9uKHJlZ2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkKTogcmVnaW9uIGlzIHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgcmVnaW9uID09PSAnc3RyaW5nJyAmJiAvXlthLXpdezJ9KC1bYS16XSspKy1cXGQrJC8udGVzdChyZWdpb24pO1xufVxuXG5pbnRlcmZhY2UgRW5naW5lRGlhZ25vc3RpYyB7XG4gIHJlYWRvbmx5IHJ1bGVJZDogc3RyaW5nO1xuICByZWFkb25seSBzZXZlcml0eTogc3RyaW5nO1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNvdXJjZT86IHN0cmluZztcbiAgcmVhZG9ubHkgZW50aXR5PzogeyByZWFkb25seSBsb2dpY2FsSWQ/OiBzdHJpbmcgfTtcbiAgcmVhZG9ubHkgcHJvcGVydHlQYXRoPzogc3RyaW5nO1xuICByZWFkb25seSBkb2N1bWVudGF0aW9uVXJsPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIGVuZm9yY2Ug44Oi44O844OJ55So44Gu5YaF6YOo44OX44Op44Kw44Kk44Oz44CCXG4gKlxuICogQ0RLIOe1hOOBv+i+vOOBv+OBriBDbG91ZEZvcm1hdGlvblZhbGlkYXRlUGx1Z2luIOOBr+WFqCBmaW5kaW5nIOOCkiB3YXJuaW5nIOOBq+S4uOOCgeOCi+OBn+OCgVxuICog77yIYXdzLWNkay1saWIgMi4yNjcuMCDlrp/muKzjgIHmmIfmoLzjg5Xjg6njgrDjgoLnhKHlirnvvInjgIHlkIzjgZjjgqjjg7Pjgrjjg7PjgpLnm7TmjqXlkbzjgbPjgIFcbiAqIGNkay1wcmVmbGlnaHQg44Gu44Or44O844Or6YGV5Y+N77yI44GK44KI44GzIHN0cmljdCDmmYLjga/jgqjjg7Pjgrjjg7Pjga7jgqjjg6njg7zjgq/jg6njgrnvvInjgpJcbiAqIHBvbGljeSB2YWxpZGF0aW9uIOOBruWkseaVl+OBqOOBl+OBpuWgseWRiuOBl+OBpiBzeW50aCDjgpLmraLjgoHjgovjgIJcbiAqL1xuZXhwb3J0IGNsYXNzIFByZWZsaWdodEVuZm9yY2VQbHVnaW4gaW1wbGVtZW50cyBJUG9saWN5VmFsaWRhdGlvblBsdWdpbiB7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lID0gJ2Nkay1wcmVmbGlnaHQnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcnVsZXM6IEJ1bmRsZWRSdWxlRGF0YVtdLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaWN0OiBib29sZWFuLFxuICApIHt9XG5cbiAgcHVibGljIHZhbGlkYXRlKGNvbnRleHQ6IElQb2xpY3lWYWxpZGF0aW9uQ29udGV4dCk6IFBvbGljeVZhbGlkYXRpb25QbHVnaW5SZXBvcnQge1xuICAgIGNvbnN0IGVuZ2luZSA9IGxvYWRFbmdpbmVDYWNoZWQoKTtcbiAgICBpZiAoIWVuZ2luZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICdjZGstcHJlZmxpZ2h0OiBjb3VsZCBub3QgcmVzb2x2ZSBAYXdzL2Nsb3VkZm9ybWF0aW9uLXZhbGlkYXRlOyAnICtcbiAgICAgICAgJ2VuZm9yY2UgbW9kZSBpcyB1bmF2YWlsYWJsZSBhbmQgbm8gcHJlZmxpZ2h0IGNoZWNrcyB3ZXJlIHJ1bi4gJyArXG4gICAgICAgICdJbnN0YWxsIGl0IGFzIGEgZGV2RGVwZW5kZW5jeSBvciB1c2UgdGhlIGRlZmF1bHQgKHdhcm4pIG1vZGUuJyxcbiAgICAgICk7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCB2aW9sYXRpb25zOiBbXSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlZ2lvbiA9IGlzQ29uY3JldGVSZWdpb24oY29udGV4dC5yZWdpb24pID8gY29udGV4dC5yZWdpb24gOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZW5nID0gcmVnb0VuZ2luZUNhY2hlZChlbmdpbmUsIHRoaXMucnVsZXMsIHJlZ2lvbik7XG4gICAgY29uc3Qgb3VycyA9IG5ldyBTZXQodGhpcy5ydWxlcy5tYXAoKHIpID0+IHIuaWQpKTtcbiAgICBjb25zdCB2aW9sYXRpb25zOiBQb2xpY3lWaW9sYXRpb25bXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBzdCBvZiBjb250ZXh0LnN0YWNrVGVtcGxhdGVzKSB7XG4gICAgICBjb25zdCByZXBvcnQgPSBlbmcudmFsaWRhdGVEZXRhaWxlZChuZXcgZW5naW5lLlRlbXBsYXRlRmlsZShzdC50ZW1wbGF0ZVBhdGgpLCB7XG4gICAgICAgIHBzZXVkb1BhcmFtZXRlck92ZXJyaWRlczoge1xuICAgICAgICAgIGFjY291bnRJZDogY29udGV4dC5hY2NvdW50SWQsXG4gICAgICAgICAgcmVnaW9uOiBjb250ZXh0LnJlZ2lvbixcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCBkIG9mIChyZXBvcnQuZGlhZ25vc3RpY3MgPz8gW10pIGFzIEVuZ2luZURpYWdub3N0aWNbXSkge1xuICAgICAgICBjb25zdCBpc091cnMgPSBkLnNvdXJjZSA9PT0gJ0NVU1RPTScgJiYgb3Vycy5oYXMoZC5ydWxlSWQpO1xuICAgICAgICBjb25zdCBpc1N0cmljdEhpdCA9IHRoaXMuc3RyaWN0XG4gICAgICAgICAgJiYgZC5zb3VyY2UgIT09ICdDVVNUT00nXG4gICAgICAgICAgJiYgKGQuc2V2ZXJpdHkgPT09ICdFUlJPUicgfHwgZC5zZXZlcml0eSA9PT0gJ0ZBVEFMJyk7XG4gICAgICAgIGlmICghaXNPdXJzICYmICFpc1N0cmljdEhpdCkgY29udGludWU7XG4gICAgICAgIHZpb2xhdGlvbnMucHVzaCh7XG4gICAgICAgICAgcnVsZU5hbWU6IGQucnVsZUlkLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBkLm1lc3NhZ2UsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgdmlvbGF0aW5nUmVzb3VyY2VzOiBbe1xuICAgICAgICAgICAgcmVzb3VyY2VMb2dpY2FsSWQ6IGQuZW50aXR5Py5sb2dpY2FsSWQgPz8gJyh1bmtub3duKScsXG4gICAgICAgICAgICB0ZW1wbGF0ZVBhdGg6IHN0LnRlbXBsYXRlUGF0aCxcbiAgICAgICAgICAgIGxvY2F0aW9uczogW2QucHJvcGVydHlQYXRoID8/ICcodGVtcGxhdGUpJ10sXG4gICAgICAgICAgfV0sXG4gICAgICAgICAgLi4uKGQuZG9jdW1lbnRhdGlvblVybCA/IHsgcnVsZU1ldGFkYXRhOiB7IERvY3VtZW50YXRpb25Vcmw6IGQuZG9jdW1lbnRhdGlvblVybCB9IH0gOiB7fSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHZpb2xhdGlvbnMubGVuZ3RoID09PSAwLCB2aW9sYXRpb25zIH07XG4gIH1cbn1cblxuLy8g44Ko44Oz44K444Oz77yIV0FTTe+8ieOBruWIneacn+WMluOBr+mHjeOBhOOBn+OCgeOAgeODouOCuOODpeODvOODq+ODrOODmeODq+OBp+OCreODo+ODg+OCt+ODpeOBmeOCi1xubGV0IGNhY2hlZEVuZ2luZU1vZHVsZTogYW55IHwgZmFsc2UgfCB1bmRlZmluZWQ7XG5mdW5jdGlvbiBsb2FkRW5naW5lQ2FjaGVkKCk6IGFueSB8IHVuZGVmaW5lZCB7XG4gIGlmIChjYWNoZWRFbmdpbmVNb2R1bGUgPT09IHVuZGVmaW5lZCkge1xuICAgIGNhY2hlZEVuZ2luZU1vZHVsZSA9IGxvYWRFbmdpbmUoKSA/PyBmYWxzZTtcbiAgfVxuICByZXR1cm4gY2FjaGVkRW5naW5lTW9kdWxlID09PSBmYWxzZSA/IHVuZGVmaW5lZCA6IGNhY2hlZEVuZ2luZU1vZHVsZTtcbn1cblxuY29uc3QgcmVnb0VuZ2luZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbmZ1bmN0aW9uIHJlZ29FbmdpbmVDYWNoZWQoZW5naW5lTW9kdWxlOiBhbnksIHJ1bGVzOiBCdW5kbGVkUnVsZURhdGFbXSwgcmVnaW9uPzogc3RyaW5nKTogYW55IHtcbiAgY29uc3Qga2V5ID0gYCR7cmVnaW9uID8/ICcnfXwke3J1bGVzLm1hcCgocikgPT4gci5pZCkuam9pbignLCcpfWA7XG4gIGlmICghcmVnb0VuZ2luZUNhY2hlLmhhcyhrZXkpKSB7XG4gICAgY29uc3QgY3VzdG9tUnVsZXMgPSBydWxlcy5tYXAoKHIpID0+ICh7IG5hbWU6IHIuaWQsIGNvbnRlbnQ6IHIucmVnbyB9KSk7XG4gICAgaWYgKHJlZ2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjdXN0b21SdWxlcy5wdXNoKGRlcGxveUVudmlyb25tZW50TW9kdWxlKHJlZ2lvbikpO1xuICAgIH1cbiAgICByZWdvRW5naW5lQ2FjaGUuc2V0KGtleSwgbmV3IGVuZ2luZU1vZHVsZS5SZWdvRW5naW5lKHsgY3VzdG9tUnVsZXMgfSkpO1xuICB9XG4gIHJldHVybiByZWdvRW5naW5lQ2FjaGUuZ2V0KGtleSk7XG59XG5cbi8qKlxuICogQGF3cy9jbG91ZGZvcm1hdGlvbi12YWxpZGF0ZSDjgpLop6PmsbrjgZnjgovjgIJcbiAqIOmAmuW4uOOBryBhd3MtY2RrLWxpYiDjgYwgYnVuZGxlZERlcGVuZGVuY2llcyDjgajjgZfjgablkIzmorHjgZfjgabjgYTjgovjgrPjg5Tjg7zjgavkuZfjgovjgIJcbiAqIO+8iOODhuOCueODiOOBi+OCieOCguWIqeeUqOOBmeOCi+OBn+OCgSBleHBvcnQg44GX44Gm44GE44KL77yJXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkRW5naW5lKCk6IGFueSB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHJlcXVpcmUoJ0Bhd3MvY2xvdWRmb3JtYXRpb24tdmFsaWRhdGUnKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZmFsbCB0aHJvdWdoXG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBsaWJQa2cgPSByZXF1aXJlLnJlc29sdmUoJ2F3cy1jZGstbGliL3BhY2thZ2UuanNvbicpO1xuICAgIGNvbnN0IGVuZ1BrZyA9IHJlcXVpcmUucmVzb2x2ZSgnQGF3cy9jbG91ZGZvcm1hdGlvbi12YWxpZGF0ZS9wYWNrYWdlLmpzb24nLCB7XG4gICAgICBwYXRoczogW3BhdGguZGlybmFtZShsaWJQa2cpXSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVxdWlyZShwYXRoLmRpcm5hbWUoZW5nUGtnKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==
|
|
179
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5mb3JjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcml2YXRlL2VuZm9yY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkJBLDBEQUtDO0FBTUQsNENBRUM7QUEwR0QsZ0NBZUM7QUFuS0QsMkNBQTZCO0FBTzdCLHdEQUF3RTtBQUV4RSwwREFBMEQ7QUFDMUQ7OERBQzhEO0FBRTlEOzs7R0FHRztBQUNVLFFBQUEsc0JBQXNCLEdBQUcsd0JBQXdCLENBQUM7QUFFL0Q7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBZ0IsdUJBQXVCLENBQUMsTUFBYztJQUNwRCxPQUFPO1FBQ0wsSUFBSSxFQUFFLDhCQUFzQjtRQUM1QixPQUFPLEVBQUUsK0RBQStELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUk7S0FDbkcsQ0FBQztBQUNKLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixnQkFBZ0IsQ0FBQyxNQUEwQjtJQUN6RCxPQUFPLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSwwQkFBMEIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDL0UsQ0FBQztBQVlEOzs7Ozs7O0dBT0c7QUFDSCxNQUFhLHNCQUFzQjtJQUlkO0lBQ0E7SUFKSCxJQUFJLEdBQUcsZUFBZSxDQUFDO0lBRXZDLFlBQ21CLEtBQXdCLEVBQ3hCLE1BQWU7UUFEZixVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUN4QixXQUFNLEdBQU4sTUFBTSxDQUFTO0lBQy9CLENBQUM7SUFFRyxRQUFRLENBQUMsT0FBaUM7UUFDL0MsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixzQ0FBc0M7WUFDdEMsT0FBTyxDQUFDLEtBQUssQ0FDWCxpRUFBaUU7Z0JBQ2pFLGdFQUFnRTtnQkFDaEUsK0RBQStELENBQ2hFLENB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SUFBSSxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsZUFBZTtJQUNqQixDQUFDO0lBQ0QsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQzNELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsMkNBQTJDLEVBQUU7WUFDMUUsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUM5QixDQUFDLENBQUM7UUFDSCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB0eXBlIHtcbiAgSVBvbGljeVZhbGlkYXRpb25Db250ZXh0LFxuICBJUG9saWN5VmFsaWRhdGlvblBsdWdpbixcbiAgUG9saWN5VmFsaWRhdGlvblBsdWdpblJlcG9ydCxcbiAgUG9saWN5VmlvbGF0aW9uLFxufSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBCVU5ETEVEX0xJQlMsIHR5cGUgQnVuZGxlZFJ1bGVEYXRhIH0gZnJvbSAnLi4vcnVsZXMuZ2VuZXJhdGVkJztcblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0cyAqL1xuLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzIC0tIEBhd3MvY2xvdWRmb3JtYXRpb24tdmFsaWRhdGUg44GvXG4gICBhd3MtY2RrLWxpYiDlkIzmorHjgrPjg5Tjg7zjgpLli5XnmoTop6PmsbrjgZnjgovoqK3oqIjvvIjkvp3lrZjjgavjga/ovInjgZvjgarjgYTvvInjgIJSRUFETUUvQUdFTlRTLm1kIOWPgueFpyAqL1xuXG4vKipcbiAqIFRoZSBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgUmVnbyBtb2R1bGUgdGhhdCBjYXJyaWVzIHRoZSBkZXBsb3ltZW50XG4gKiBlbnZpcm9ubWVudCBpbnRvIHJ1bGUgZXZhbHVhdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IERFUExPWV9FTlZfTU9EVUxFX05BTUUgPSAnX3BmX2RlcGxveV9lbnZpcm9ubWVudCc7XG5cbi8qKlxuICogQnVpbGQgdGhlIGdlbmVyYXRlZCBtb2R1bGUgZGVmaW5pbmcgYGRlcGxveV9yZWdpb25gIGZvciB0aGUgcnVsZSBwYWNrYWdlLlxuICpcbiAqIFJ1bGVzIG11c3QgcmVhZCBpdCBhcyBgZGF0YS5jZGtfcHJlZmxpZ2h0LmRlcGxveV9yZWdpb25gIChuZXZlciBhcyBhIGJhcmVcbiAqIHZhcmlhYmxlKTogdGhlIGRhdGEgcmVmZXJlbmNlIGlzIHNpbXBseSB1bmRlZmluZWQgd2hlbiB0aGUgbW9kdWxlIGlzIG5vdFxuICogaW5qZWN0ZWQg4oCUIHRoZSBydWxlIGJvZHkgZmFpbHMgYW5kIHRoZSBydWxlIHNraXBzIOKAlCB3aGlsZSBhIGJhcmUgdmFyaWFibGVcbiAqIHdvdWxkIGJlIGEgY29tcGlsZSBlcnJvci4gSW5qZWN0ZWQgYnkgdGhlIGVuZm9yY2UgcGx1Z2luIHdoZW4gdGhlIGFwcC1sZXZlbFxuICogcmVnaW9uIGlzIGNvbmNyZXRlOyB0aGUgd2FybiBtb2RlIChDREsgYnVpbHQtaW4gcGx1Z2luKSBuZXZlciBpbmplY3RzIGl0LFxuICogc28gcmVnaW9uLWRlcGVuZGVudCBydWxlcyBvbmx5IGZpcmUgaW4gZW5mb3JjZSBtb2RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVwbG95RW52aXJvbm1lbnRNb2R1bGUocmVnaW9uOiBzdHJpbmcpOiB7IG5hbWU6IHN0cmluZzsgY29udGVudDogc3RyaW5nIH0ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IERFUExPWV9FTlZfTU9EVUxFX05BTUUsXG4gICAgY29udGVudDogYHBhY2thZ2UgY2RrX3ByZWZsaWdodFxcblxcbmltcG9ydCByZWdvLnYxXFxuXFxuZGVwbG95X3JlZ2lvbiA6PSAke0pTT04uc3RyaW5naWZ5KHJlZ2lvbil9XFxuYCxcbiAgfTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSByZWdpb24gZnJvbSB0aGUgdmFsaWRhdGlvbiBjb250ZXh0IGlzIGEgY29uY3JldGUgcmVnaW9uIG5hbWVcbiAqIChhcyBvcHBvc2VkIHRvIHVuZGVmaW5lZCwgYW4gdW5yZXNvbHZlZCB0b2tlbiwgb3IgYSBwbGFjZWhvbGRlcikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbmNyZXRlUmVnaW9uKHJlZ2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkKTogcmVnaW9uIGlzIHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgcmVnaW9uID09PSAnc3RyaW5nJyAmJiAvXlthLXpdezJ9KC1bYS16XSspKy1cXGQrJC8udGVzdChyZWdpb24pO1xufVxuXG5pbnRlcmZhY2UgRW5naW5lRGlhZ25vc3RpYyB7XG4gIHJlYWRvbmx5IHJ1bGVJZDogc3RyaW5nO1xuICByZWFkb25seSBzZXZlcml0eTogc3RyaW5nO1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNvdXJjZT86IHN0cmluZztcbiAgcmVhZG9ubHkgZW50aXR5PzogeyByZWFkb25seSBsb2dpY2FsSWQ/OiBzdHJpbmcgfTtcbiAgcmVhZG9ubHkgcHJvcGVydHlQYXRoPzogc3RyaW5nO1xuICByZWFkb25seSBkb2N1bWVudGF0aW9uVXJsPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIGVuZm9yY2Ug44Oi44O844OJ55So44Gu5YaF6YOo44OX44Op44Kw44Kk44Oz44CCXG4gKlxuICogQ0RLIOe1hOOBv+i+vOOBv+OBriBDbG91ZEZvcm1hdGlvblZhbGlkYXRlUGx1Z2luIOOBr+WFqCBmaW5kaW5nIOOCkiB3YXJuaW5nIOOBq+S4uOOCgeOCi+OBn+OCgVxuICog77yIYXdzLWNkay1saWIgMi4yNjcuMCDlrp/muKzjgIHmmIfmoLzjg5Xjg6njgrDjgoLnhKHlirnvvInjgIHlkIzjgZjjgqjjg7Pjgrjjg7PjgpLnm7TmjqXlkbzjgbPjgIFcbiAqIGNkay1wcmVmbGlnaHQg44Gu44Or44O844Or6YGV5Y+N77yI44GK44KI44GzIHN0cmljdCDmmYLjga/jgqjjg7Pjgrjjg7Pjga7jgqjjg6njg7zjgq/jg6njgrnvvInjgpJcbiAqIHBvbGljeSB2YWxpZGF0aW9uIOOBruWkseaVl+OBqOOBl+OBpuWgseWRiuOBl+OBpiBzeW50aCDjgpLmraLjgoHjgovjgIJcbiAqL1xuZXhwb3J0IGNsYXNzIFByZWZsaWdodEVuZm9yY2VQbHVnaW4gaW1wbGVtZW50cyBJUG9saWN5VmFsaWRhdGlvblBsdWdpbiB7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lID0gJ2Nkay1wcmVmbGlnaHQnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcnVsZXM6IEJ1bmRsZWRSdWxlRGF0YVtdLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaWN0OiBib29sZWFuLFxuICApIHt9XG5cbiAgcHVibGljIHZhbGlkYXRlKGNvbnRleHQ6IElQb2xpY3lWYWxpZGF0aW9uQ29udGV4dCk6IFBvbGljeVZhbGlkYXRpb25QbHVnaW5SZXBvcnQge1xuICAgIGNvbnN0IGVuZ2luZSA9IGxvYWRFbmdpbmVDYWNoZWQoKTtcbiAgICBpZiAoIWVuZ2luZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICdjZGstcHJlZmxpZ2h0OiBjb3VsZCBub3QgcmVzb2x2ZSBAYXdzL2Nsb3VkZm9ybWF0aW9uLXZhbGlkYXRlOyAnICtcbiAgICAgICAgJ2VuZm9yY2UgbW9kZSBpcyB1bmF2YWlsYWJsZSBhbmQgbm8gcHJlZmxpZ2h0IGNoZWNrcyB3ZXJlIHJ1bi4gJyArXG4gICAgICAgICdJbnN0YWxsIGl0IGFzIGEgZGV2RGVwZW5kZW5jeSBvciB1c2UgdGhlIGRlZmF1bHQgKHdhcm4pIG1vZGUuJyxcbiAgICAgICk7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCB2aW9sYXRpb25zOiBbXSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlZ2lvbiA9IGlzQ29uY3JldGVSZWdpb24oY29udGV4dC5yZWdpb24pID8gY29udGV4dC5yZWdpb24gOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZW5nID0gcmVnb0VuZ2luZUNhY2hlZChlbmdpbmUsIHRoaXMucnVsZXMsIHJlZ2lvbik7XG4gICAgY29uc3Qgb3VycyA9IG5ldyBTZXQodGhpcy5ydWxlcy5tYXAoKHIpID0+IHIuaWQpKTtcbiAgICBjb25zdCB2aW9sYXRpb25zOiBQb2xpY3lWaW9sYXRpb25bXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBzdCBvZiBjb250ZXh0LnN0YWNrVGVtcGxhdGVzKSB7XG4gICAgICBjb25zdCByZXBvcnQgPSBlbmcudmFsaWRhdGVEZXRhaWxlZChuZXcgZW5naW5lLlRlbXBsYXRlRmlsZShzdC50ZW1wbGF0ZVBhdGgpLCB7XG4gICAgICAgIHBzZXVkb1BhcmFtZXRlck92ZXJyaWRlczoge1xuICAgICAgICAgIGFjY291bnRJZDogY29udGV4dC5hY2NvdW50SWQsXG4gICAgICAgICAgcmVnaW9uOiBjb250ZXh0LnJlZ2lvbixcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCBkIG9mIChyZXBvcnQuZGlhZ25vc3RpY3MgPz8gW10pIGFzIEVuZ2luZURpYWdub3N0aWNbXSkge1xuICAgICAgICBjb25zdCBpc091cnMgPSBkLnNvdXJjZSA9PT0gJ0NVU1RPTScgJiYgb3Vycy5oYXMoZC5ydWxlSWQpO1xuICAgICAgICBjb25zdCBpc1N0cmljdEhpdCA9IHRoaXMuc3RyaWN0XG4gICAgICAgICAgJiYgZC5zb3VyY2UgIT09ICdDVVNUT00nXG4gICAgICAgICAgJiYgKGQuc2V2ZXJpdHkgPT09ICdFUlJPUicgfHwgZC5zZXZlcml0eSA9PT0gJ0ZBVEFMJyk7XG4gICAgICAgIGlmICghaXNPdXJzICYmICFpc1N0cmljdEhpdCkgY29udGludWU7XG4gICAgICAgIHZpb2xhdGlvbnMucHVzaCh7XG4gICAgICAgICAgcnVsZU5hbWU6IGQucnVsZUlkLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBkLm1lc3NhZ2UsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgdmlvbGF0aW5nUmVzb3VyY2VzOiBbe1xuICAgICAgICAgICAgcmVzb3VyY2VMb2dpY2FsSWQ6IGQuZW50aXR5Py5sb2dpY2FsSWQgPz8gJyh1bmtub3duKScsXG4gICAgICAgICAgICB0ZW1wbGF0ZVBhdGg6IHN0LnRlbXBsYXRlUGF0aCxcbiAgICAgICAgICAgIGxvY2F0aW9uczogW2QucHJvcGVydHlQYXRoID8/ICcodGVtcGxhdGUpJ10sXG4gICAgICAgICAgfV0sXG4gICAgICAgICAgLi4uKGQuZG9jdW1lbnRhdGlvblVybCA/IHsgcnVsZU1ldGFkYXRhOiB7IERvY3VtZW50YXRpb25Vcmw6IGQuZG9jdW1lbnRhdGlvblVybCB9IH0gOiB7fSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHZpb2xhdGlvbnMubGVuZ3RoID09PSAwLCB2aW9sYXRpb25zIH07XG4gIH1cbn1cblxuLy8g44Ko44Oz44K444Oz77yIV0FTTe+8ieOBruWIneacn+WMluOBr+mHjeOBhOOBn+OCgeOAgeODouOCuOODpeODvOODq+ODrOODmeODq+OBp+OCreODo+ODg+OCt+ODpeOBmeOCi1xubGV0IGNhY2hlZEVuZ2luZU1vZHVsZTogYW55IHwgZmFsc2UgfCB1bmRlZmluZWQ7XG5mdW5jdGlvbiBsb2FkRW5naW5lQ2FjaGVkKCk6IGFueSB8IHVuZGVmaW5lZCB7XG4gIGlmIChjYWNoZWRFbmdpbmVNb2R1bGUgPT09IHVuZGVmaW5lZCkge1xuICAgIGNhY2hlZEVuZ2luZU1vZHVsZSA9IGxvYWRFbmdpbmUoKSA/PyBmYWxzZTtcbiAgfVxuICByZXR1cm4gY2FjaGVkRW5naW5lTW9kdWxlID09PSBmYWxzZSA/IHVuZGVmaW5lZCA6IGNhY2hlZEVuZ2luZU1vZHVsZTtcbn1cblxuY29uc3QgcmVnb0VuZ2luZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbmZ1bmN0aW9uIHJlZ29FbmdpbmVDYWNoZWQoZW5naW5lTW9kdWxlOiBhbnksIHJ1bGVzOiBCdW5kbGVkUnVsZURhdGFbXSwgcmVnaW9uPzogc3RyaW5nKTogYW55IHtcbiAgY29uc3Qga2V5ID0gYCR7cmVnaW9uID8/ICcnfXwke3J1bGVzLm1hcCgocikgPT4gci5pZCkuam9pbignLCcpfWA7XG4gIGlmICghcmVnb0VuZ2luZUNhY2hlLmhhcyhrZXkpKSB7XG4gICAgY29uc3QgY3VzdG9tUnVsZXMgPSBbXG4gICAgICAuLi5CVU5ETEVEX0xJQlMubWFwKChsKSA9PiAoeyBuYW1lOiBsLm5hbWUsIGNvbnRlbnQ6IGwucmVnbyB9KSksXG4gICAgICAuLi5ydWxlcy5tYXAoKHIpID0+ICh7IG5hbWU6IHIuaWQsIGNvbnRlbnQ6IHIucmVnbyB9KSksXG4gICAgXTtcbiAgICBpZiAocmVnaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGN1c3RvbVJ1bGVzLnB1c2goZGVwbG95RW52aXJvbm1lbnRNb2R1bGUocmVnaW9uKSk7XG4gICAgfVxuICAgIHJlZ29FbmdpbmVDYWNoZS5zZXQoa2V5LCBuZXcgZW5naW5lTW9kdWxlLlJlZ29FbmdpbmUoeyBjdXN0b21SdWxlcyB9KSk7XG4gIH1cbiAgcmV0dXJuIHJlZ29FbmdpbmVDYWNoZS5nZXQoa2V5KTtcbn1cblxuLyoqXG4gKiBAYXdzL2Nsb3VkZm9ybWF0aW9uLXZhbGlkYXRlIOOCkuino+axuuOBmeOCi+OAglxuICog6YCa5bi444GvIGF3cy1jZGstbGliIOOBjCBidW5kbGVkRGVwZW5kZW5jaWVzIOOBqOOBl+OBpuWQjOaiseOBl+OBpuOBhOOCi+OCs+ODlOODvOOBq+S5l+OCi+OAglxuICog77yI44OG44K544OI44GL44KJ44KC5Yip55So44GZ44KL44Gf44KBIGV4cG9ydCDjgZfjgabjgYTjgovvvIlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRFbmdpbmUoKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcmVxdWlyZSgnQGF3cy9jbG91ZGZvcm1hdGlvbi12YWxpZGF0ZScpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBmYWxsIHRocm91Z2hcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGxpYlBrZyA9IHJlcXVpcmUucmVzb2x2ZSgnYXdzLWNkay1saWIvcGFja2FnZS5qc29uJyk7XG4gICAgY29uc3QgZW5nUGtnID0gcmVxdWlyZS5yZXNvbHZlKCdAYXdzL2Nsb3VkZm9ybWF0aW9uLXZhbGlkYXRlL3BhY2thZ2UuanNvbicsIHtcbiAgICAgIHBhdGhzOiBbcGF0aC5kaXJuYW1lKGxpYlBrZyldLFxuICAgIH0pO1xuICAgIHJldHVybiByZXF1aXJlKHBhdGguZGlybmFtZShlbmdQa2cpKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
|
package/lib/rules.generated.d.ts
CHANGED
|
@@ -8,3 +8,9 @@ export interface BundledRuleData {
|
|
|
8
8
|
readonly rego: string;
|
|
9
9
|
}
|
|
10
10
|
export declare const BUNDLED_RULES: BundledRuleData[];
|
|
11
|
+
export interface BundledLibData {
|
|
12
|
+
readonly name: string;
|
|
13
|
+
readonly rego: string;
|
|
14
|
+
}
|
|
15
|
+
/** Shared helper modules (rules/_lib). Always loaded before the rules. */
|
|
16
|
+
export declare const BUNDLED_LIBS: BundledLibData[];
|