@synapsestudios/lintofu 0.0.0-stage → 0.9.1
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 +661 -0
- package/README.md +151 -2
- package/dist/configs/category-recommended.d.ts +3 -0
- package/dist/configs/category-recommended.d.ts.map +1 -0
- package/dist/configs/category-recommended.js +12 -0
- package/dist/configs/category-recommended.js.map +1 -0
- package/dist/configs/recommended.d.ts +3 -0
- package/dist/configs/recommended.d.ts.map +1 -0
- package/dist/configs/recommended.js +12 -0
- package/dist/configs/recommended.js.map +1 -0
- package/dist/index.d.ts +198 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +65 -0
- package/dist/index.js.map +1 -0
- package/dist/language.d.ts +34 -0
- package/dist/language.d.ts.map +1 -0
- package/dist/language.js +72 -0
- package/dist/language.js.map +1 -0
- package/dist/parser/index.d.ts +10 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +43 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/lintofu-parser.wasm +0 -0
- package/dist/parser/types.d.ts +261 -0
- package/dist/parser/types.d.ts.map +1 -0
- package/dist/parser/types.js +3 -0
- package/dist/parser/types.js.map +1 -0
- package/dist/parser/wasm-exec.cjs +575 -0
- package/dist/project-index.d.ts +40 -0
- package/dist/project-index.d.ts.map +1 -0
- package/dist/project-index.js +89 -0
- package/dist/project-index.js.map +1 -0
- package/dist/rules/aws/acm-certificate-create-before-destroy-required.d.ts +6 -0
- package/dist/rules/aws/acm-certificate-create-before-destroy-required.d.ts.map +1 -0
- package/dist/rules/aws/acm-certificate-create-before-destroy-required.js +47 -0
- package/dist/rules/aws/acm-certificate-create-before-destroy-required.js.map +1 -0
- package/dist/rules/aws/no-api-gateway-deployment-stage-args.d.ts +6 -0
- package/dist/rules/aws/no-api-gateway-deployment-stage-args.d.ts.map +1 -0
- package/dist/rules/aws/no-api-gateway-deployment-stage-args.js +56 -0
- package/dist/rules/aws/no-api-gateway-deployment-stage-args.js.map +1 -0
- package/dist/rules/aws/no-aurora-pinned-minor-with-auto-upgrade.d.ts +6 -0
- package/dist/rules/aws/no-aurora-pinned-minor-with-auto-upgrade.d.ts.map +1 -0
- package/dist/rules/aws/no-aurora-pinned-minor-with-auto-upgrade.js +88 -0
- package/dist/rules/aws/no-aurora-pinned-minor-with-auto-upgrade.js.map +1 -0
- package/dist/rules/aws/no-db-instance-name-attribute.d.ts +6 -0
- package/dist/rules/aws/no-db-instance-name-attribute.d.ts.map +1 -0
- package/dist/rules/aws/no-db-instance-name-attribute.js +45 -0
- package/dist/rules/aws/no-db-instance-name-attribute.js.map +1 -0
- package/dist/rules/aws/no-deprecated-lambda-runtime.d.ts +6 -0
- package/dist/rules/aws/no-deprecated-lambda-runtime.d.ts.map +1 -0
- package/dist/rules/aws/no-deprecated-lambda-runtime.js +91 -0
- package/dist/rules/aws/no-deprecated-lambda-runtime.js.map +1 -0
- package/dist/rules/aws/no-eip-vpc-attribute.d.ts +6 -0
- package/dist/rules/aws/no-eip-vpc-attribute.d.ts.map +1 -0
- package/dist/rules/aws/no-eip-vpc-attribute.js +66 -0
- package/dist/rules/aws/no-eip-vpc-attribute.js.map +1 -0
- package/dist/rules/aws/no-eks-addon-resolve-conflicts.d.ts +6 -0
- package/dist/rules/aws/no-eks-addon-resolve-conflicts.d.ts.map +1 -0
- package/dist/rules/aws/no-eks-addon-resolve-conflicts.js +36 -0
- package/dist/rules/aws/no-eks-addon-resolve-conflicts.js.map +1 -0
- package/dist/rules/aws/no-hardcoded-provider-credentials.d.ts +6 -0
- package/dist/rules/aws/no-hardcoded-provider-credentials.d.ts.map +1 -0
- package/dist/rules/aws/no-hardcoded-provider-credentials.js +42 -0
- package/dist/rules/aws/no-hardcoded-provider-credentials.js.map +1 -0
- package/dist/rules/aws/no-iam-policy-attachment.d.ts +6 -0
- package/dist/rules/aws/no-iam-policy-attachment.d.ts.map +1 -0
- package/dist/rules/aws/no-iam-policy-attachment.js +28 -0
- package/dist/rules/aws/no-iam-policy-attachment.js.map +1 -0
- package/dist/rules/aws/no-iam-role-inline-policies.d.ts +6 -0
- package/dist/rules/aws/no-iam-role-inline-policies.d.ts.map +1 -0
- package/dist/rules/aws/no-iam-role-inline-policies.js +43 -0
- package/dist/rules/aws/no-iam-role-inline-policies.js.map +1 -0
- package/dist/rules/aws/no-instance-cpu-count-attributes.d.ts +6 -0
- package/dist/rules/aws/no-instance-cpu-count-attributes.d.ts.map +1 -0
- package/dist/rules/aws/no-instance-cpu-count-attributes.js +94 -0
- package/dist/rules/aws/no-instance-cpu-count-attributes.js.map +1 -0
- package/dist/rules/aws/no-legacy-security-group-rules.d.ts +6 -0
- package/dist/rules/aws/no-legacy-security-group-rules.d.ts.map +1 -0
- package/dist/rules/aws/no-legacy-security-group-rules.js +39 -0
- package/dist/rules/aws/no-legacy-security-group-rules.js.map +1 -0
- package/dist/rules/aws/no-mixed-security-group-rule-forms.d.ts +6 -0
- package/dist/rules/aws/no-mixed-security-group-rule-forms.d.ts.map +1 -0
- package/dist/rules/aws/no-mixed-security-group-rule-forms.js +63 -0
- package/dist/rules/aws/no-mixed-security-group-rule-forms.js.map +1 -0
- package/dist/rules/aws/no-pinned-minor-with-auto-upgrade.d.ts +6 -0
- package/dist/rules/aws/no-pinned-minor-with-auto-upgrade.d.ts.map +1 -0
- package/dist/rules/aws/no-pinned-minor-with-auto-upgrade.js +100 -0
- package/dist/rules/aws/no-pinned-minor-with-auto-upgrade.js.map +1 -0
- package/dist/rules/aws/no-s3-bucket-inline-config.d.ts +6 -0
- package/dist/rules/aws/no-s3-bucket-inline-config.d.ts.map +1 -0
- package/dist/rules/aws/no-s3-bucket-inline-config.js +67 -0
- package/dist/rules/aws/no-s3-bucket-inline-config.js.map +1 -0
- package/dist/rules/aws/no-s3-bucket-object.d.ts +6 -0
- package/dist/rules/aws/no-s3-bucket-object.d.ts.map +1 -0
- package/dist/rules/aws/no-s3-bucket-object.js +41 -0
- package/dist/rules/aws/no-s3-bucket-object.js.map +1 -0
- package/dist/rules/aws/utils.d.ts +4 -0
- package/dist/rules/aws/utils.d.ts.map +1 -0
- package/dist/rules/aws/utils.js +17 -0
- package/dist/rules/aws/utils.js.map +1 -0
- package/dist/rules/cloudflare/access-rule-country-block-requires-enterprise.d.ts +6 -0
- package/dist/rules/cloudflare/access-rule-country-block-requires-enterprise.d.ts.map +1 -0
- package/dist/rules/cloudflare/access-rule-country-block-requires-enterprise.js +66 -0
- package/dist/rules/cloudflare/access-rule-country-block-requires-enterprise.js.map +1 -0
- package/dist/rules/cloudflare/dns-record-requires-managed-by-annotation.d.ts +10 -0
- package/dist/rules/cloudflare/dns-record-requires-managed-by-annotation.d.ts.map +1 -0
- package/dist/rules/cloudflare/dns-record-requires-managed-by-annotation.js +104 -0
- package/dist/rules/cloudflare/dns-record-requires-managed-by-annotation.js.map +1 -0
- package/dist/rules/cloudflare/ruleset-requires-managed-by-description.d.ts +9 -0
- package/dist/rules/cloudflare/ruleset-requires-managed-by-description.d.ts.map +1 -0
- package/dist/rules/cloudflare/ruleset-requires-managed-by-description.js +52 -0
- package/dist/rules/cloudflare/ruleset-requires-managed-by-description.js.map +1 -0
- package/dist/rules/cloudflare/utils.d.ts +17 -0
- package/dist/rules/cloudflare/utils.d.ts.map +1 -0
- package/dist/rules/cloudflare/utils.js +37 -0
- package/dist/rules/cloudflare/utils.js.map +1 -0
- package/dist/rules/core/documented-outputs.d.ts +6 -0
- package/dist/rules/core/documented-outputs.d.ts.map +1 -0
- package/dist/rules/core/documented-outputs.js +41 -0
- package/dist/rules/core/documented-outputs.js.map +1 -0
- package/dist/rules/core/documented-variables.d.ts +6 -0
- package/dist/rules/core/documented-variables.d.ts.map +1 -0
- package/dist/rules/core/documented-variables.js +41 -0
- package/dist/rules/core/documented-variables.js.map +1 -0
- package/dist/rules/core/module-source-pinned.d.ts +6 -0
- package/dist/rules/core/module-source-pinned.d.ts.map +1 -0
- package/dist/rules/core/module-source-pinned.js +47 -0
- package/dist/rules/core/module-source-pinned.js.map +1 -0
- package/dist/rules/core/no-bool-as-count.d.ts +6 -0
- package/dist/rules/core/no-bool-as-count.d.ts.map +1 -0
- package/dist/rules/core/no-bool-as-count.js +69 -0
- package/dist/rules/core/no-bool-as-count.js.map +1 -0
- package/dist/rules/core/no-duplicate-map-keys.d.ts +6 -0
- package/dist/rules/core/no-duplicate-map-keys.d.ts.map +1 -0
- package/dist/rules/core/no-duplicate-map-keys.js +42 -0
- package/dist/rules/core/no-duplicate-map-keys.js.map +1 -0
- package/dist/rules/core/no-empty-list-equality.d.ts +6 -0
- package/dist/rules/core/no-empty-list-equality.d.ts.map +1 -0
- package/dist/rules/core/no-empty-list-equality.js +48 -0
- package/dist/rules/core/no-empty-list-equality.js.map +1 -0
- package/dist/rules/core/no-external-refs-in-destroy-provisioner.d.ts +6 -0
- package/dist/rules/core/no-external-refs-in-destroy-provisioner.d.ts.map +1 -0
- package/dist/rules/core/no-external-refs-in-destroy-provisioner.js +74 -0
- package/dist/rules/core/no-external-refs-in-destroy-provisioner.js.map +1 -0
- package/dist/rules/core/no-legacy-count-attribute.d.ts +6 -0
- package/dist/rules/core/no-legacy-count-attribute.d.ts.map +1 -0
- package/dist/rules/core/no-legacy-count-attribute.js +64 -0
- package/dist/rules/core/no-legacy-count-attribute.js.map +1 -0
- package/dist/rules/core/no-legacy-dot-index.d.ts +6 -0
- package/dist/rules/core/no-legacy-dot-index.d.ts.map +1 -0
- package/dist/rules/core/no-legacy-dot-index.js +79 -0
- package/dist/rules/core/no-legacy-dot-index.js.map +1 -0
- package/dist/rules/core/no-legacy-ignore-changes-wildcard.d.ts +6 -0
- package/dist/rules/core/no-legacy-ignore-changes-wildcard.d.ts.map +1 -0
- package/dist/rules/core/no-legacy-ignore-changes-wildcard.js +40 -0
- package/dist/rules/core/no-legacy-ignore-changes-wildcard.js.map +1 -0
- package/dist/rules/core/no-legacy-list-function.d.ts +6 -0
- package/dist/rules/core/no-legacy-list-function.d.ts.map +1 -0
- package/dist/rules/core/no-legacy-list-function.js +67 -0
- package/dist/rules/core/no-legacy-list-function.js.map +1 -0
- package/dist/rules/core/no-legacy-lookup.d.ts +6 -0
- package/dist/rules/core/no-legacy-lookup.d.ts.map +1 -0
- package/dist/rules/core/no-legacy-lookup.js +53 -0
- package/dist/rules/core/no-legacy-lookup.js.map +1 -0
- package/dist/rules/core/no-legacy-map-function.d.ts +6 -0
- package/dist/rules/core/no-legacy-map-function.d.ts.map +1 -0
- package/dist/rules/core/no-legacy-map-function.js +90 -0
- package/dist/rules/core/no-legacy-map-function.js.map +1 -0
- package/dist/rules/core/no-legacy-provider-proxy.d.ts +6 -0
- package/dist/rules/core/no-legacy-provider-proxy.d.ts.map +1 -0
- package/dist/rules/core/no-legacy-provider-proxy.js +43 -0
- package/dist/rules/core/no-legacy-provider-proxy.js.map +1 -0
- package/dist/rules/core/no-provider-version-constraint.d.ts +6 -0
- package/dist/rules/core/no-provider-version-constraint.d.ts.map +1 -0
- package/dist/rules/core/no-provider-version-constraint.js +33 -0
- package/dist/rules/core/no-provider-version-constraint.js.map +1 -0
- package/dist/rules/core/no-quoted-depends-on.d.ts +6 -0
- package/dist/rules/core/no-quoted-depends-on.d.ts.map +1 -0
- package/dist/rules/core/no-quoted-depends-on.js +55 -0
- package/dist/rules/core/no-quoted-depends-on.js.map +1 -0
- package/dist/rules/core/no-quoted-ignore-changes.d.ts +6 -0
- package/dist/rules/core/no-quoted-ignore-changes.d.ts.map +1 -0
- package/dist/rules/core/no-quoted-ignore-changes.js +63 -0
- package/dist/rules/core/no-quoted-ignore-changes.js.map +1 -0
- package/dist/rules/core/no-quoted-provider-reference.d.ts +6 -0
- package/dist/rules/core/no-quoted-provider-reference.d.ts.map +1 -0
- package/dist/rules/core/no-quoted-provider-reference.js +69 -0
- package/dist/rules/core/no-quoted-provider-reference.js.map +1 -0
- package/dist/rules/core/no-quoted-type-constraints.d.ts +6 -0
- package/dist/rules/core/no-quoted-type-constraints.d.ts.map +1 -0
- package/dist/rules/core/no-quoted-type-constraints.js +55 -0
- package/dist/rules/core/no-quoted-type-constraints.js.map +1 -0
- package/dist/rules/core/no-reserved-variable-names.d.ts +6 -0
- package/dist/rules/core/no-reserved-variable-names.d.ts.map +1 -0
- package/dist/rules/core/no-reserved-variable-names.js +41 -0
- package/dist/rules/core/no-reserved-variable-names.js.map +1 -0
- package/dist/rules/core/no-splat-bracket-index.d.ts +6 -0
- package/dist/rules/core/no-splat-bracket-index.d.ts.map +1 -0
- package/dist/rules/core/no-splat-bracket-index.js +30 -0
- package/dist/rules/core/no-splat-bracket-index.js.map +1 -0
- package/dist/rules/core/no-template-provider.d.ts +6 -0
- package/dist/rules/core/no-template-provider.d.ts.map +1 -0
- package/dist/rules/core/no-template-provider.js +63 -0
- package/dist/rules/core/no-template-provider.js.map +1 -0
- package/dist/rules/core/no-terraform-env-reference.d.ts +6 -0
- package/dist/rules/core/no-terraform-env-reference.d.ts.map +1 -0
- package/dist/rules/core/no-terraform-env-reference.js +35 -0
- package/dist/rules/core/no-terraform-env-reference.js.map +1 -0
- package/dist/rules/core/no-winrm-connection.d.ts +6 -0
- package/dist/rules/core/no-winrm-connection.d.ts.map +1 -0
- package/dist/rules/core/no-winrm-connection.js +31 -0
- package/dist/rules/core/no-winrm-connection.js.map +1 -0
- package/dist/rules/core/prefer-bare-expression.d.ts +6 -0
- package/dist/rules/core/prefer-bare-expression.d.ts.map +1 -0
- package/dist/rules/core/prefer-bare-expression.js +23 -0
- package/dist/rules/core/prefer-bare-expression.js.map +1 -0
- package/dist/rules/core/provider-source-required.d.ts +6 -0
- package/dist/rules/core/provider-source-required.d.ts.map +1 -0
- package/dist/rules/core/provider-source-required.js +45 -0
- package/dist/rules/core/provider-source-required.js.map +1 -0
- package/dist/rules/core/remote-state-outputs-prefix.d.ts +6 -0
- package/dist/rules/core/remote-state-outputs-prefix.d.ts.map +1 -0
- package/dist/rules/core/remote-state-outputs-prefix.js +54 -0
- package/dist/rules/core/remote-state-outputs-prefix.js.map +1 -0
- package/dist/rules/core/required-providers-pinned.d.ts +6 -0
- package/dist/rules/core/required-providers-pinned.d.ts.map +1 -0
- package/dist/rules/core/required-providers-pinned.js +37 -0
- package/dist/rules/core/required-providers-pinned.js.map +1 -0
- package/dist/rules/core/required-version-declared.d.ts +6 -0
- package/dist/rules/core/required-version-declared.d.ts.map +1 -0
- package/dist/rules/core/required-version-declared.js +38 -0
- package/dist/rules/core/required-version-declared.js.map +1 -0
- package/dist/rules/core/typed-variables.d.ts +6 -0
- package/dist/rules/core/typed-variables.d.ts.map +1 -0
- package/dist/rules/core/typed-variables.js +32 -0
- package/dist/rules/core/typed-variables.js.map +1 -0
- package/dist/rules/core/utils.d.ts +31 -0
- package/dist/rules/core/utils.d.ts.map +1 -0
- package/dist/rules/core/utils.js +185 -0
- package/dist/rules/core/utils.js.map +1 -0
- package/dist/rules/index.d.ts +157 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +101 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/types.d.ts +57 -0
- package/dist/rules/types.d.ts.map +1 -0
- package/dist/rules/types.js +15 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/source-code.d.ts +84 -0
- package/dist/source-code.d.ts.map +1 -0
- package/dist/source-code.js +170 -0
- package/dist/source-code.js.map +1 -0
- package/dist/types.d.ts +67 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/visitor-keys.d.ts +3 -0
- package/dist/visitor-keys.d.ts.map +1 -0
- package/dist/visitor-keys.js +30 -0
- package/dist/visitor-keys.js.map +1 -0
- package/package.json +88 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-template-provider.d.ts","sourceRoot":"","sources":["../../../src/rules/core/no-template-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAY7D,QAAA,MAAM,IAAI,EAAE,sBAAsB,CAAC;IACjC,UAAU,EACR,iBAAiB,GAAG,sBAAsB,GAAG,0BAA0B,CAAC;CAC3E,CAwDA,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { literalStringValue, objectItemKeyName } from './utils.js';
|
|
2
|
+
function isHashicorpTemplateSource(source) {
|
|
3
|
+
const segments = source.split('/');
|
|
4
|
+
if (segments.length < 2)
|
|
5
|
+
return false;
|
|
6
|
+
return (segments[segments.length - 2] === 'hashicorp' &&
|
|
7
|
+
segments[segments.length - 1] === 'template');
|
|
8
|
+
}
|
|
9
|
+
const rule = {
|
|
10
|
+
meta: {
|
|
11
|
+
type: 'problem',
|
|
12
|
+
docs: {
|
|
13
|
+
description: 'Flag use of the archived `hashicorp/template` provider; prefer the built-in `templatefile()` function or the `cloudinit` provider.',
|
|
14
|
+
recommended: true,
|
|
15
|
+
severity: 'error',
|
|
16
|
+
},
|
|
17
|
+
messages: {
|
|
18
|
+
useTemplatefile: 'The `hashicorp/template` provider is archived. Replace `data.template_*` with the built-in `templatefile()` function.',
|
|
19
|
+
useCloudinitProvider: 'The `hashicorp/template` provider is archived. Replace `data.template_cloudinit_config` with `cloudinit_config` from the `hashicorp/cloudinit` provider.',
|
|
20
|
+
archivedTemplateProvider: 'The `hashicorp/template` provider is archived; remove this `required_providers` entry.',
|
|
21
|
+
},
|
|
22
|
+
schema: [],
|
|
23
|
+
},
|
|
24
|
+
create(context) {
|
|
25
|
+
return {
|
|
26
|
+
Block(node) {
|
|
27
|
+
if (node.kind === 'data') {
|
|
28
|
+
if (node.labels[0] === 'template_file' ||
|
|
29
|
+
node.labels[0] === 'template_dir') {
|
|
30
|
+
context.report({ node, messageId: 'useTemplatefile' });
|
|
31
|
+
}
|
|
32
|
+
else if (node.labels[0] === 'template_cloudinit_config') {
|
|
33
|
+
context.report({ node, messageId: 'useCloudinitProvider' });
|
|
34
|
+
}
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (node.kind !== 'terraform')
|
|
38
|
+
return;
|
|
39
|
+
const requiredProviders = node.body.blocks.find((b) => b.kind === 'required_providers');
|
|
40
|
+
if (!requiredProviders)
|
|
41
|
+
return;
|
|
42
|
+
for (const attr of requiredProviders.body.attributes) {
|
|
43
|
+
if (attr.expression.type !== 'ObjectConsExpr')
|
|
44
|
+
continue;
|
|
45
|
+
const sourceItem = attr.expression.items.find((item) => objectItemKeyName(item) === 'source');
|
|
46
|
+
if (!sourceItem)
|
|
47
|
+
continue;
|
|
48
|
+
const source = literalStringValue(sourceItem.valueExpr);
|
|
49
|
+
if (source === undefined)
|
|
50
|
+
continue;
|
|
51
|
+
if (isHashicorpTemplateSource(source)) {
|
|
52
|
+
context.report({
|
|
53
|
+
node: attr,
|
|
54
|
+
messageId: 'archivedTemplateProvider',
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
export default rule;
|
|
63
|
+
//# sourceMappingURL=no-template-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-template-provider.js","sourceRoot":"","sources":["../../../src/rules/core/no-template-provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEnE,SAAS,yBAAyB,CAAC,MAAc;IAC/C,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACtC,OAAO,CACL,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,WAAW;QAC7C,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,UAAU,CAC7C,CAAC;AACJ,CAAC;AAED,MAAM,IAAI,GAGL;IACH,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EACT,oIAAoI;YACtI,WAAW,EAAE,IAAI;YACjB,QAAQ,EAAE,OAAO;SAClB;QACD,QAAQ,EAAE;YACR,eAAe,EACb,uHAAuH;YACzH,oBAAoB,EAClB,0JAA0J;YAC5J,wBAAwB,EACtB,wFAAwF;SAC3F;QACD,MAAM,EAAE,EAAE;KACX;IACD,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,KAAK,CAAC,IAAI;gBACR,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBACzB,IACE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,eAAe;wBAClC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,cAAc,EACjC,CAAC;wBACD,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,CAAC;oBACzD,CAAC;yBAAM,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,2BAA2B,EAAE,CAAC;wBAC1D,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,sBAAsB,EAAE,CAAC,CAAC;oBAC9D,CAAC;oBACD,OAAO;gBACT,CAAC;gBACD,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;oBAAE,OAAO;gBACtC,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAC7C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,oBAAoB,CACvC,CAAC;gBACF,IAAI,CAAC,iBAAiB;oBAAE,OAAO;gBAC/B,KAAK,MAAM,IAAI,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;oBACrD,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,gBAAgB;wBAAE,SAAS;oBACxD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAC3C,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,QAAQ,CAC/C,CAAC;oBACF,IAAI,CAAC,UAAU;wBAAE,SAAS;oBAC1B,MAAM,MAAM,GAAG,kBAAkB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;oBACxD,IAAI,MAAM,KAAK,SAAS;wBAAE,SAAS;oBACnC,IAAI,yBAAyB,CAAC,MAAM,CAAC,EAAE,CAAC;wBACtC,OAAO,CAAC,MAAM,CAAC;4BACb,IAAI,EAAE,IAAI;4BACV,SAAS,EAAE,0BAA0B;yBACtC,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-terraform-env-reference.d.ts","sourceRoot":"","sources":["../../../src/rules/core/no-terraform-env-reference.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAG7D,QAAA,MAAM,IAAI,EAAE,sBAAsB,CAAC;IAAE,UAAU,EAAE,uBAAuB,CAAA;CAAE,CA+BzE,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { traversalHead } from './utils.js';
|
|
2
|
+
const rule = {
|
|
3
|
+
meta: {
|
|
4
|
+
type: 'problem',
|
|
5
|
+
fixable: 'code',
|
|
6
|
+
docs: {
|
|
7
|
+
description: 'Flag references to `terraform.env`, replaced by `terraform.workspace` since Terraform 0.10.',
|
|
8
|
+
recommended: true,
|
|
9
|
+
severity: 'error',
|
|
10
|
+
},
|
|
11
|
+
messages: {
|
|
12
|
+
terraformEnvReference: '`terraform.env` was replaced by `terraform.workspace` in Terraform 0.10. Use `terraform.workspace` instead.',
|
|
13
|
+
},
|
|
14
|
+
schema: [],
|
|
15
|
+
},
|
|
16
|
+
create(context) {
|
|
17
|
+
return {
|
|
18
|
+
ScopeTraversalExpr(node) {
|
|
19
|
+
const head = traversalHead(node);
|
|
20
|
+
if (!head)
|
|
21
|
+
return;
|
|
22
|
+
const [root, attr] = head;
|
|
23
|
+
if (root !== 'terraform' || attr !== 'env')
|
|
24
|
+
return;
|
|
25
|
+
context.report({
|
|
26
|
+
node,
|
|
27
|
+
messageId: 'terraformEnvReference',
|
|
28
|
+
fix: (fixer) => fixer.replaceText(node, 'terraform.workspace'),
|
|
29
|
+
});
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
export default rule;
|
|
35
|
+
//# sourceMappingURL=no-terraform-env-reference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-terraform-env-reference.js","sourceRoot":"","sources":["../../../src/rules/core/no-terraform-env-reference.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,IAAI,GAAoE;IAC5E,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,MAAM;QACf,IAAI,EAAE;YACJ,WAAW,EACT,6FAA6F;YAC/F,WAAW,EAAE,IAAI;YACjB,QAAQ,EAAE,OAAO;SAClB;QACD,QAAQ,EAAE;YACR,qBAAqB,EACnB,6GAA6G;SAChH;QACD,MAAM,EAAE,EAAE;KACX;IACD,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,kBAAkB,CAAC,IAAI;gBACrB,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;gBACjC,IAAI,CAAC,IAAI;oBAAE,OAAO;gBAClB,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC;gBAC1B,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,KAAK;oBAAE,OAAO;gBACnD,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,SAAS,EAAE,uBAAuB;oBAClC,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,qBAAqB,CAAC;iBAC/D,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-winrm-connection.d.ts","sourceRoot":"","sources":["../../../src/rules/core/no-winrm-connection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAG7D,QAAA,MAAM,IAAI,EAAE,sBAAsB,CAAC;IAAE,UAAU,EAAE,iBAAiB,CAAA;CAAE,CA0BnE,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { findAttribute, literalStringValue } from './utils.js';
|
|
2
|
+
const rule = {
|
|
3
|
+
meta: {
|
|
4
|
+
type: 'problem',
|
|
5
|
+
docs: {
|
|
6
|
+
description: 'Flag `connection` blocks with `type = "winrm"`; winrm is deprecated in OpenTofu 1.12 and slated for removal in 1.13. Use `type = "ssh"`.',
|
|
7
|
+
recommended: true,
|
|
8
|
+
severity: 'warn',
|
|
9
|
+
},
|
|
10
|
+
messages: {
|
|
11
|
+
winrmConnection: 'The `winrm` connection type is deprecated in OpenTofu 1.12 and will be removed in 1.13. Use `type = "ssh"` instead.',
|
|
12
|
+
},
|
|
13
|
+
schema: [],
|
|
14
|
+
},
|
|
15
|
+
create(context) {
|
|
16
|
+
return {
|
|
17
|
+
Block(node) {
|
|
18
|
+
if (node.kind !== 'connection')
|
|
19
|
+
return;
|
|
20
|
+
const typeAttr = findAttribute(node.body.attributes, 'type');
|
|
21
|
+
if (!typeAttr)
|
|
22
|
+
return;
|
|
23
|
+
if (literalStringValue(typeAttr.expression) !== 'winrm')
|
|
24
|
+
return;
|
|
25
|
+
context.report({ node: typeAttr, messageId: 'winrmConnection' });
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
export default rule;
|
|
31
|
+
//# sourceMappingURL=no-winrm-connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-winrm-connection.js","sourceRoot":"","sources":["../../../src/rules/core/no-winrm-connection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE/D,MAAM,IAAI,GAA8D;IACtE,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EACT,0IAA0I;YAC5I,WAAW,EAAE,IAAI;YACjB,QAAQ,EAAE,MAAM;SACjB;QACD,QAAQ,EAAE;YACR,eAAe,EACb,qHAAqH;SACxH;QACD,MAAM,EAAE,EAAE;KACX;IACD,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,KAAK,CAAC,IAAI;gBACR,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY;oBAAE,OAAO;gBACvC,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;gBAC7D,IAAI,CAAC,QAAQ;oBAAE,OAAO;gBACtB,IAAI,kBAAkB,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,OAAO;oBAAE,OAAO;gBAChE,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,CAAC;YACnE,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefer-bare-expression.d.ts","sourceRoot":"","sources":["../../../src/rules/core/prefer-bare-expression.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAE7D,QAAA,MAAM,IAAI,EAAE,sBAAsB,CAAC;IAAE,UAAU,EAAE,sBAAsB,CAAA;CAAE,CAsBxE,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const rule = {
|
|
2
|
+
meta: {
|
|
3
|
+
type: 'suggestion',
|
|
4
|
+
docs: {
|
|
5
|
+
description: 'Prefer the bare expression form over the redundant "${expr}" wrapping.',
|
|
6
|
+
recommended: true,
|
|
7
|
+
severity: 'warn',
|
|
8
|
+
},
|
|
9
|
+
messages: {
|
|
10
|
+
preferBareExpression: 'Unwrap this "${...}" expression and write it bare; the wrapper adds nothing.',
|
|
11
|
+
},
|
|
12
|
+
schema: [],
|
|
13
|
+
},
|
|
14
|
+
create(context) {
|
|
15
|
+
return {
|
|
16
|
+
TemplateWrapExpr(node) {
|
|
17
|
+
context.report({ node, messageId: 'preferBareExpression' });
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
export default rule;
|
|
23
|
+
//# sourceMappingURL=prefer-bare-expression.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefer-bare-expression.js","sourceRoot":"","sources":["../../../src/rules/core/prefer-bare-expression.ts"],"names":[],"mappings":"AAEA,MAAM,IAAI,GAAmE;IAC3E,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EACT,wEAAwE;YAC1E,WAAW,EAAE,IAAI;YACjB,QAAQ,EAAE,MAAM;SACjB;QACD,QAAQ,EAAE;YACR,oBAAoB,EAClB,8EAA8E;SACjF;QACD,MAAM,EAAE,EAAE;KACX;IACD,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,gBAAgB,CAAC,IAAI;gBACnB,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,sBAAsB,EAAE,CAAC,CAAC;YAC9D,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-source-required.d.ts","sourceRoot":"","sources":["../../../src/rules/core/provider-source-required.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAG7D,QAAA,MAAM,IAAI,EAAE,sBAAsB,CAAC;IACjC,UAAU,EAAE,eAAe,GAAG,kBAAkB,CAAC;CAClD,CA4CA,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { objectItemKeyName, requiredProviderEntries } from './utils.js';
|
|
2
|
+
const rule = {
|
|
3
|
+
meta: {
|
|
4
|
+
type: 'problem',
|
|
5
|
+
docs: {
|
|
6
|
+
description: 'Require every provider in `terraform.required_providers` to declare an explicit `source`.',
|
|
7
|
+
recommended: true,
|
|
8
|
+
severity: 'error',
|
|
9
|
+
},
|
|
10
|
+
messages: {
|
|
11
|
+
missingSource: 'Provider `{{name}}` has no `source`; add `source = "namespace/name"` so the provider resolves explicitly.',
|
|
12
|
+
legacyStringForm: 'Provider `{{name}}` uses the legacy version-string form; rewrite it as `{ source = "namespace/name", version = "..." }`.',
|
|
13
|
+
},
|
|
14
|
+
schema: [],
|
|
15
|
+
},
|
|
16
|
+
create(context) {
|
|
17
|
+
return {
|
|
18
|
+
Block(node) {
|
|
19
|
+
if (node.kind !== 'terraform')
|
|
20
|
+
return;
|
|
21
|
+
for (const { name, value } of requiredProviderEntries(node)) {
|
|
22
|
+
if (value.type === 'ObjectConsExpr') {
|
|
23
|
+
const hasSource = value.items.some((item) => objectItemKeyName(item) === 'source');
|
|
24
|
+
if (!hasSource) {
|
|
25
|
+
context.report({
|
|
26
|
+
node: value,
|
|
27
|
+
messageId: 'missingSource',
|
|
28
|
+
data: { name },
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
else if (value.type === 'TemplateExpr') {
|
|
33
|
+
context.report({
|
|
34
|
+
node: value,
|
|
35
|
+
messageId: 'legacyStringForm',
|
|
36
|
+
data: { name },
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
export default rule;
|
|
45
|
+
//# sourceMappingURL=provider-source-required.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-source-required.js","sourceRoot":"","sources":["../../../src/rules/core/provider-source-required.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAExE,MAAM,IAAI,GAEL;IACH,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EACT,2FAA2F;YAC7F,WAAW,EAAE,IAAI;YACjB,QAAQ,EAAE,OAAO;SAClB;QACD,QAAQ,EAAE;YACR,aAAa,EACX,2GAA2G;YAC7G,gBAAgB,EACd,0HAA0H;SAC7H;QACD,MAAM,EAAE,EAAE;KACX;IACD,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,KAAK,CAAC,IAAI;gBACR,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;oBAAE,OAAO;gBACtC,KAAK,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC5D,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;wBACpC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAChC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,QAAQ,CAC/C,CAAC;wBACF,IAAI,CAAC,SAAS,EAAE,CAAC;4BACf,OAAO,CAAC,MAAM,CAAC;gCACb,IAAI,EAAE,KAAK;gCACX,SAAS,EAAE,eAAe;gCAC1B,IAAI,EAAE,EAAE,IAAI,EAAE;6BACf,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;yBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;wBACzC,OAAO,CAAC,MAAM,CAAC;4BACb,IAAI,EAAE,KAAK;4BACX,SAAS,EAAE,kBAAkB;4BAC7B,IAAI,EAAE,EAAE,IAAI,EAAE;yBACf,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-state-outputs-prefix.d.ts","sourceRoot":"","sources":["../../../src/rules/core/remote-state-outputs-prefix.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAG7D,QAAA,MAAM,IAAI,EAAE,sBAAsB,CAAC;IAAE,UAAU,EAAE,sBAAsB,CAAA;CAAE,CAmDxE,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { traversalText } from './utils.js';
|
|
2
|
+
const rule = {
|
|
3
|
+
meta: {
|
|
4
|
+
type: 'problem',
|
|
5
|
+
fixable: 'code',
|
|
6
|
+
docs: {
|
|
7
|
+
description: 'Flag a `data.terraform_remote_state` reference that omits the required `.outputs.` prefix, required since Terraform 0.12.',
|
|
8
|
+
recommended: true,
|
|
9
|
+
severity: 'error',
|
|
10
|
+
},
|
|
11
|
+
messages: {
|
|
12
|
+
missingOutputsPrefix: 'Reference a remote state attribute through `.outputs.`. Since Terraform 0.12, `data.terraform_remote_state.<name>` exposes outputs under `.outputs`.',
|
|
13
|
+
},
|
|
14
|
+
schema: [],
|
|
15
|
+
},
|
|
16
|
+
create(context) {
|
|
17
|
+
return {
|
|
18
|
+
ScopeTraversalExpr(node) {
|
|
19
|
+
const [root, dataSource, name, attr] = node.traversal;
|
|
20
|
+
if (root?.type !== 'TraverseRoot' || root.name !== 'data')
|
|
21
|
+
return;
|
|
22
|
+
if (dataSource?.type !== 'TraverseAttr' ||
|
|
23
|
+
dataSource.name !== 'terraform_remote_state')
|
|
24
|
+
return;
|
|
25
|
+
if (name?.type !== 'TraverseAttr')
|
|
26
|
+
return;
|
|
27
|
+
if (attr?.type !== 'TraverseAttr' || attr.name === 'outputs')
|
|
28
|
+
return;
|
|
29
|
+
const outputsStep = {
|
|
30
|
+
type: 'TraverseAttr',
|
|
31
|
+
name: 'outputs',
|
|
32
|
+
range: node.range,
|
|
33
|
+
};
|
|
34
|
+
const spliced = {
|
|
35
|
+
...node,
|
|
36
|
+
traversal: [
|
|
37
|
+
root,
|
|
38
|
+
dataSource,
|
|
39
|
+
name,
|
|
40
|
+
outputsStep,
|
|
41
|
+
...node.traversal.slice(3),
|
|
42
|
+
],
|
|
43
|
+
};
|
|
44
|
+
context.report({
|
|
45
|
+
node,
|
|
46
|
+
messageId: 'missingOutputsPrefix',
|
|
47
|
+
fix: (fixer) => fixer.replaceText(node, traversalText(spliced)),
|
|
48
|
+
});
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
export default rule;
|
|
54
|
+
//# sourceMappingURL=remote-state-outputs-prefix.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-state-outputs-prefix.js","sourceRoot":"","sources":["../../../src/rules/core/remote-state-outputs-prefix.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,IAAI,GAAmE;IAC3E,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,MAAM;QACf,IAAI,EAAE;YACJ,WAAW,EACT,2HAA2H;YAC7H,WAAW,EAAE,IAAI;YACjB,QAAQ,EAAE,OAAO;SAClB;QACD,QAAQ,EAAE;YACR,oBAAoB,EAClB,sJAAsJ;SACzJ;QACD,MAAM,EAAE,EAAE;KACX;IACD,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,kBAAkB,CAAC,IAAI;gBACrB,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;gBACtD,IAAI,IAAI,EAAE,IAAI,KAAK,cAAc,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;oBAAE,OAAO;gBAClE,IACE,UAAU,EAAE,IAAI,KAAK,cAAc;oBACnC,UAAU,CAAC,IAAI,KAAK,wBAAwB;oBAE5C,OAAO;gBACT,IAAI,IAAI,EAAE,IAAI,KAAK,cAAc;oBAAE,OAAO;gBAC1C,IAAI,IAAI,EAAE,IAAI,KAAK,cAAc,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;oBAAE,OAAO;gBACrE,MAAM,WAAW,GAAc;oBAC7B,IAAI,EAAE,cAAc;oBACpB,IAAI,EAAE,SAAS;oBACf,KAAK,EAAE,IAAI,CAAC,KAAK;iBAClB,CAAC;gBACF,MAAM,OAAO,GAAG;oBACd,GAAG,IAAI;oBACP,SAAS,EAAE;wBACT,IAAI;wBACJ,UAAU;wBACV,IAAI;wBACJ,WAAW;wBACX,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;qBAC3B;iBACF,CAAC;gBACF,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,SAAS,EAAE,sBAAsB;oBACjC,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;iBAChE,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"required-providers-pinned.d.ts","sourceRoot":"","sources":["../../../src/rules/core/required-providers-pinned.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAG7D,QAAA,MAAM,IAAI,EAAE,sBAAsB,CAAC;IAAE,UAAU,EAAE,kBAAkB,CAAA;CAAE,CAmCpE,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { objectItemKeyName, requiredProviderEntries } from './utils.js';
|
|
2
|
+
const rule = {
|
|
3
|
+
meta: {
|
|
4
|
+
type: 'problem',
|
|
5
|
+
docs: {
|
|
6
|
+
description: 'Require every provider in `terraform.required_providers` to declare a `version` constraint.',
|
|
7
|
+
recommended: true,
|
|
8
|
+
severity: 'error',
|
|
9
|
+
},
|
|
10
|
+
messages: {
|
|
11
|
+
unpinnedProvider: 'Provider `{{name}}` has no `version` constraint; pin it to avoid breaking changes on upgrade.',
|
|
12
|
+
},
|
|
13
|
+
schema: [],
|
|
14
|
+
},
|
|
15
|
+
create(context) {
|
|
16
|
+
return {
|
|
17
|
+
Block(node) {
|
|
18
|
+
if (node.kind !== 'terraform')
|
|
19
|
+
return;
|
|
20
|
+
for (const { name, value } of requiredProviderEntries(node)) {
|
|
21
|
+
if (value.type !== 'ObjectConsExpr')
|
|
22
|
+
continue;
|
|
23
|
+
const hasVersion = value.items.some((item) => objectItemKeyName(item) === 'version');
|
|
24
|
+
if (!hasVersion) {
|
|
25
|
+
context.report({
|
|
26
|
+
node: value,
|
|
27
|
+
messageId: 'unpinnedProvider',
|
|
28
|
+
data: { name },
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
export default rule;
|
|
37
|
+
//# sourceMappingURL=required-providers-pinned.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"required-providers-pinned.js","sourceRoot":"","sources":["../../../src/rules/core/required-providers-pinned.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAExE,MAAM,IAAI,GAA+D;IACvE,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EACT,6FAA6F;YAC/F,WAAW,EAAE,IAAI;YACjB,QAAQ,EAAE,OAAO;SAClB;QACD,QAAQ,EAAE;YACR,gBAAgB,EACd,+FAA+F;SAClG;QACD,MAAM,EAAE,EAAE;KACX;IACD,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,KAAK,CAAC,IAAI;gBACR,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;oBAAE,OAAO;gBACtC,KAAK,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC5D,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB;wBAAE,SAAS;oBAC9C,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CACjC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,SAAS,CAChD,CAAC;oBACF,IAAI,CAAC,UAAU,EAAE,CAAC;wBAChB,OAAO,CAAC,MAAM,CAAC;4BACb,IAAI,EAAE,KAAK;4BACX,SAAS,EAAE,kBAAkB;4BAC7B,IAAI,EAAE,EAAE,IAAI,EAAE;yBACf,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"required-version-declared.d.ts","sourceRoot":"","sources":["../../../src/rules/core/required-version-declared.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAG7D,QAAA,MAAM,IAAI,EAAE,sBAAsB,CAAC;IAAE,UAAU,EAAE,wBAAwB,CAAA;CAAE,CA4B1E,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { findAttribute } from './utils.js';
|
|
2
|
+
const rule = {
|
|
3
|
+
meta: {
|
|
4
|
+
type: 'suggestion',
|
|
5
|
+
docs: {
|
|
6
|
+
description: 'Require a `terraform` block that declares `required_providers` to also declare `required_version` somewhere in the same file.',
|
|
7
|
+
recommended: true,
|
|
8
|
+
severity: 'warn',
|
|
9
|
+
},
|
|
10
|
+
messages: {
|
|
11
|
+
missingRequiredVersion: 'This `terraform` block declares `required_providers` but no `terraform` block in this file sets `required_version`; add `required_version` to constrain the CLI version.',
|
|
12
|
+
},
|
|
13
|
+
schema: [],
|
|
14
|
+
},
|
|
15
|
+
create(context) {
|
|
16
|
+
return {
|
|
17
|
+
Block(node) {
|
|
18
|
+
if (node.kind !== 'terraform')
|
|
19
|
+
return;
|
|
20
|
+
if (!declaresRequiredProviders(node))
|
|
21
|
+
return;
|
|
22
|
+
const fileDeclaresRequiredVersion = context.sourceCode.ast.blocks.some((b) => b.kind === 'terraform' && declaresRequiredVersion(b));
|
|
23
|
+
if (fileDeclaresRequiredVersion)
|
|
24
|
+
return;
|
|
25
|
+
context.report({ node, messageId: 'missingRequiredVersion' });
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
export default rule;
|
|
31
|
+
function declaresRequiredProviders(block) {
|
|
32
|
+
return (block.body.blocks.some((b) => b.kind === 'required_providers') ||
|
|
33
|
+
findAttribute(block.body.attributes, 'required_providers') !== undefined);
|
|
34
|
+
}
|
|
35
|
+
function declaresRequiredVersion(block) {
|
|
36
|
+
return findAttribute(block.body.attributes, 'required_version') !== undefined;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=required-version-declared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"required-version-declared.js","sourceRoot":"","sources":["../../../src/rules/core/required-version-declared.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,IAAI,GAAqE;IAC7E,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EACT,+HAA+H;YACjI,WAAW,EAAE,IAAI;YACjB,QAAQ,EAAE,MAAM;SACjB;QACD,QAAQ,EAAE;YACR,sBAAsB,EACpB,0KAA0K;SAC7K;QACD,MAAM,EAAE,EAAE;KACX;IACD,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,KAAK,CAAC,IAAI;gBACR,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;oBAAE,OAAO;gBACtC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC;oBAAE,OAAO;gBAC7C,MAAM,2BAA2B,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CACpE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,uBAAuB,CAAC,CAAC,CAAC,CAC5D,CAAC;gBACF,IAAI,2BAA2B;oBAAE,OAAO;gBACxC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,wBAAwB,EAAE,CAAC,CAAC;YAChE,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,eAAe,IAAI,CAAC;AAEpB,SAAS,yBAAyB,CAAC,KAAY;IAC7C,OAAO,CACL,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,oBAAoB,CAAC;QAC9D,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,oBAAoB,CAAC,KAAK,SAAS,CACzE,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAY;IAC3C,OAAO,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,KAAK,SAAS,CAAC;AAChF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typed-variables.d.ts","sourceRoot":"","sources":["../../../src/rules/core/typed-variables.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAG7D,QAAA,MAAM,IAAI,EAAE,sBAAsB,CAAC;IAAE,UAAU,EAAE,aAAa,CAAA;CAAE,CA0B/D,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { blockLabel, findAttribute } from './utils.js';
|
|
2
|
+
const rule = {
|
|
3
|
+
meta: {
|
|
4
|
+
type: 'problem',
|
|
5
|
+
docs: {
|
|
6
|
+
description: 'Require every `variable` block to declare a `type`.',
|
|
7
|
+
recommended: true,
|
|
8
|
+
severity: 'error',
|
|
9
|
+
},
|
|
10
|
+
messages: {
|
|
11
|
+
missingType: 'Variable `{{name}}` is missing a `type` attribute.',
|
|
12
|
+
},
|
|
13
|
+
schema: [],
|
|
14
|
+
},
|
|
15
|
+
create(context) {
|
|
16
|
+
return {
|
|
17
|
+
Block(node) {
|
|
18
|
+
if (node.kind !== 'variable')
|
|
19
|
+
return;
|
|
20
|
+
if (findAttribute(node.body.attributes, 'type'))
|
|
21
|
+
return;
|
|
22
|
+
context.report({
|
|
23
|
+
node,
|
|
24
|
+
messageId: 'missingType',
|
|
25
|
+
data: { name: blockLabel(node) },
|
|
26
|
+
});
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
export default rule;
|
|
32
|
+
//# sourceMappingURL=typed-variables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typed-variables.js","sourceRoot":"","sources":["../../../src/rules/core/typed-variables.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,IAAI,GAA0D;IAClE,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,qDAAqD;YAClE,WAAW,EAAE,IAAI;YACjB,QAAQ,EAAE,OAAO;SAClB;QACD,QAAQ,EAAE;YACR,WAAW,EAAE,oDAAoD;SAClE;QACD,MAAM,EAAE,EAAE;KACX;IACD,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,KAAK,CAAC,IAAI;gBACR,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;oBAAE,OAAO;gBACrC,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC;oBAAE,OAAO;gBACxD,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,SAAS,EAAE,aAAa;oBACxB,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE;iBACjC,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { SettingsConfig } from '@eslint/core';
|
|
2
|
+
import type { Attribute, Block, Expression, ObjectConsItem, ScopeTraversalExpr } from '../../parser/types.js';
|
|
3
|
+
export declare function collectTraversals(expr: Expression): ScopeTraversalExpr[];
|
|
4
|
+
export declare function traversalText(expr: ScopeTraversalExpr): string;
|
|
5
|
+
export declare function literalStringValue(expr: Expression): string | undefined;
|
|
6
|
+
export declare function findAttribute(attrs: readonly Attribute[], name: string): Attribute | undefined;
|
|
7
|
+
export declare function literalAttributeValue(block: Block, name: string): string | undefined;
|
|
8
|
+
export declare function findLiteralMismatch(block: Block, name: string, expected: string): Block | Attribute | undefined;
|
|
9
|
+
export declare function trimNumericVersion(version: string, depth: number): string | undefined;
|
|
10
|
+
export declare function traversalHead(expr: ScopeTraversalExpr): readonly [string, string] | undefined;
|
|
11
|
+
export declare function blockLabel(block: Block): string;
|
|
12
|
+
export type DescriptionCheck = {
|
|
13
|
+
status: 'missing';
|
|
14
|
+
} | {
|
|
15
|
+
status: 'empty';
|
|
16
|
+
attr: Attribute;
|
|
17
|
+
} | {
|
|
18
|
+
status: 'ok';
|
|
19
|
+
} | {
|
|
20
|
+
status: 'dynamic';
|
|
21
|
+
};
|
|
22
|
+
export declare function checkDescription(block: Block): DescriptionCheck;
|
|
23
|
+
export declare function objectItemKeyName(item: ObjectConsItem): string | undefined;
|
|
24
|
+
export interface RequiredProviderEntry {
|
|
25
|
+
name: string;
|
|
26
|
+
value: Expression;
|
|
27
|
+
}
|
|
28
|
+
export declare function requiredProviderEntries(terraform: Block): RequiredProviderEntry[];
|
|
29
|
+
export declare function objectSetting(value: unknown): Record<string, unknown>;
|
|
30
|
+
export declare function lintofuSettings(settings: SettingsConfig): Record<string, unknown>;
|
|
31
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/rules/core/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EACV,SAAS,EACT,KAAK,EACL,UAAU,EACV,cAAc,EACd,kBAAkB,EACnB,MAAM,uBAAuB,CAAC;AAM/B,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,kBAAkB,EAAE,CAIxE;AAwDD,wBAAgB,aAAa,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CAU9D;AAKD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CASvE;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,SAAS,EAAE,EAC3B,IAAI,EAAE,MAAM,GACX,SAAS,GAAG,SAAS,CAEvB;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,SAAS,CAGpB;AAKD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,KAAK,GAAG,SAAS,GAAG,SAAS,CAK/B;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,MAAM,GAAG,SAAS,CAKpB;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,kBAAkB,GACvB,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAKvC;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAE/C;AAED,MAAM,MAAM,gBAAgB,GACxB;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GACpC;IAAE,MAAM,EAAE,IAAI,CAAA;CAAE,GAChB;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,CAAC;AAE1B,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,gBAAgB,CAO/D;AAKD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,CAa1E;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,UAAU,CAAC;CACnB;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,KAAK,GACf,qBAAqB,EAAE,CAsBzB;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAIrE;AAED,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,cAAc,GACvB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzB"}
|