@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.
Files changed (261) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +151 -2
  3. package/dist/configs/category-recommended.d.ts +3 -0
  4. package/dist/configs/category-recommended.d.ts.map +1 -0
  5. package/dist/configs/category-recommended.js +12 -0
  6. package/dist/configs/category-recommended.js.map +1 -0
  7. package/dist/configs/recommended.d.ts +3 -0
  8. package/dist/configs/recommended.d.ts.map +1 -0
  9. package/dist/configs/recommended.js +12 -0
  10. package/dist/configs/recommended.js.map +1 -0
  11. package/dist/index.d.ts +198 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +65 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/language.d.ts +34 -0
  16. package/dist/language.d.ts.map +1 -0
  17. package/dist/language.js +72 -0
  18. package/dist/language.js.map +1 -0
  19. package/dist/parser/index.d.ts +10 -0
  20. package/dist/parser/index.d.ts.map +1 -0
  21. package/dist/parser/index.js +43 -0
  22. package/dist/parser/index.js.map +1 -0
  23. package/dist/parser/lintofu-parser.wasm +0 -0
  24. package/dist/parser/types.d.ts +261 -0
  25. package/dist/parser/types.d.ts.map +1 -0
  26. package/dist/parser/types.js +3 -0
  27. package/dist/parser/types.js.map +1 -0
  28. package/dist/parser/wasm-exec.cjs +575 -0
  29. package/dist/project-index.d.ts +40 -0
  30. package/dist/project-index.d.ts.map +1 -0
  31. package/dist/project-index.js +89 -0
  32. package/dist/project-index.js.map +1 -0
  33. package/dist/rules/aws/acm-certificate-create-before-destroy-required.d.ts +6 -0
  34. package/dist/rules/aws/acm-certificate-create-before-destroy-required.d.ts.map +1 -0
  35. package/dist/rules/aws/acm-certificate-create-before-destroy-required.js +47 -0
  36. package/dist/rules/aws/acm-certificate-create-before-destroy-required.js.map +1 -0
  37. package/dist/rules/aws/no-api-gateway-deployment-stage-args.d.ts +6 -0
  38. package/dist/rules/aws/no-api-gateway-deployment-stage-args.d.ts.map +1 -0
  39. package/dist/rules/aws/no-api-gateway-deployment-stage-args.js +56 -0
  40. package/dist/rules/aws/no-api-gateway-deployment-stage-args.js.map +1 -0
  41. package/dist/rules/aws/no-aurora-pinned-minor-with-auto-upgrade.d.ts +6 -0
  42. package/dist/rules/aws/no-aurora-pinned-minor-with-auto-upgrade.d.ts.map +1 -0
  43. package/dist/rules/aws/no-aurora-pinned-minor-with-auto-upgrade.js +88 -0
  44. package/dist/rules/aws/no-aurora-pinned-minor-with-auto-upgrade.js.map +1 -0
  45. package/dist/rules/aws/no-db-instance-name-attribute.d.ts +6 -0
  46. package/dist/rules/aws/no-db-instance-name-attribute.d.ts.map +1 -0
  47. package/dist/rules/aws/no-db-instance-name-attribute.js +45 -0
  48. package/dist/rules/aws/no-db-instance-name-attribute.js.map +1 -0
  49. package/dist/rules/aws/no-deprecated-lambda-runtime.d.ts +6 -0
  50. package/dist/rules/aws/no-deprecated-lambda-runtime.d.ts.map +1 -0
  51. package/dist/rules/aws/no-deprecated-lambda-runtime.js +91 -0
  52. package/dist/rules/aws/no-deprecated-lambda-runtime.js.map +1 -0
  53. package/dist/rules/aws/no-eip-vpc-attribute.d.ts +6 -0
  54. package/dist/rules/aws/no-eip-vpc-attribute.d.ts.map +1 -0
  55. package/dist/rules/aws/no-eip-vpc-attribute.js +66 -0
  56. package/dist/rules/aws/no-eip-vpc-attribute.js.map +1 -0
  57. package/dist/rules/aws/no-eks-addon-resolve-conflicts.d.ts +6 -0
  58. package/dist/rules/aws/no-eks-addon-resolve-conflicts.d.ts.map +1 -0
  59. package/dist/rules/aws/no-eks-addon-resolve-conflicts.js +36 -0
  60. package/dist/rules/aws/no-eks-addon-resolve-conflicts.js.map +1 -0
  61. package/dist/rules/aws/no-hardcoded-provider-credentials.d.ts +6 -0
  62. package/dist/rules/aws/no-hardcoded-provider-credentials.d.ts.map +1 -0
  63. package/dist/rules/aws/no-hardcoded-provider-credentials.js +42 -0
  64. package/dist/rules/aws/no-hardcoded-provider-credentials.js.map +1 -0
  65. package/dist/rules/aws/no-iam-policy-attachment.d.ts +6 -0
  66. package/dist/rules/aws/no-iam-policy-attachment.d.ts.map +1 -0
  67. package/dist/rules/aws/no-iam-policy-attachment.js +28 -0
  68. package/dist/rules/aws/no-iam-policy-attachment.js.map +1 -0
  69. package/dist/rules/aws/no-iam-role-inline-policies.d.ts +6 -0
  70. package/dist/rules/aws/no-iam-role-inline-policies.d.ts.map +1 -0
  71. package/dist/rules/aws/no-iam-role-inline-policies.js +43 -0
  72. package/dist/rules/aws/no-iam-role-inline-policies.js.map +1 -0
  73. package/dist/rules/aws/no-instance-cpu-count-attributes.d.ts +6 -0
  74. package/dist/rules/aws/no-instance-cpu-count-attributes.d.ts.map +1 -0
  75. package/dist/rules/aws/no-instance-cpu-count-attributes.js +94 -0
  76. package/dist/rules/aws/no-instance-cpu-count-attributes.js.map +1 -0
  77. package/dist/rules/aws/no-legacy-security-group-rules.d.ts +6 -0
  78. package/dist/rules/aws/no-legacy-security-group-rules.d.ts.map +1 -0
  79. package/dist/rules/aws/no-legacy-security-group-rules.js +39 -0
  80. package/dist/rules/aws/no-legacy-security-group-rules.js.map +1 -0
  81. package/dist/rules/aws/no-mixed-security-group-rule-forms.d.ts +6 -0
  82. package/dist/rules/aws/no-mixed-security-group-rule-forms.d.ts.map +1 -0
  83. package/dist/rules/aws/no-mixed-security-group-rule-forms.js +63 -0
  84. package/dist/rules/aws/no-mixed-security-group-rule-forms.js.map +1 -0
  85. package/dist/rules/aws/no-pinned-minor-with-auto-upgrade.d.ts +6 -0
  86. package/dist/rules/aws/no-pinned-minor-with-auto-upgrade.d.ts.map +1 -0
  87. package/dist/rules/aws/no-pinned-minor-with-auto-upgrade.js +100 -0
  88. package/dist/rules/aws/no-pinned-minor-with-auto-upgrade.js.map +1 -0
  89. package/dist/rules/aws/no-s3-bucket-inline-config.d.ts +6 -0
  90. package/dist/rules/aws/no-s3-bucket-inline-config.d.ts.map +1 -0
  91. package/dist/rules/aws/no-s3-bucket-inline-config.js +67 -0
  92. package/dist/rules/aws/no-s3-bucket-inline-config.js.map +1 -0
  93. package/dist/rules/aws/no-s3-bucket-object.d.ts +6 -0
  94. package/dist/rules/aws/no-s3-bucket-object.d.ts.map +1 -0
  95. package/dist/rules/aws/no-s3-bucket-object.js +41 -0
  96. package/dist/rules/aws/no-s3-bucket-object.js.map +1 -0
  97. package/dist/rules/aws/utils.d.ts +4 -0
  98. package/dist/rules/aws/utils.d.ts.map +1 -0
  99. package/dist/rules/aws/utils.js +17 -0
  100. package/dist/rules/aws/utils.js.map +1 -0
  101. package/dist/rules/cloudflare/access-rule-country-block-requires-enterprise.d.ts +6 -0
  102. package/dist/rules/cloudflare/access-rule-country-block-requires-enterprise.d.ts.map +1 -0
  103. package/dist/rules/cloudflare/access-rule-country-block-requires-enterprise.js +66 -0
  104. package/dist/rules/cloudflare/access-rule-country-block-requires-enterprise.js.map +1 -0
  105. package/dist/rules/cloudflare/dns-record-requires-managed-by-annotation.d.ts +10 -0
  106. package/dist/rules/cloudflare/dns-record-requires-managed-by-annotation.d.ts.map +1 -0
  107. package/dist/rules/cloudflare/dns-record-requires-managed-by-annotation.js +104 -0
  108. package/dist/rules/cloudflare/dns-record-requires-managed-by-annotation.js.map +1 -0
  109. package/dist/rules/cloudflare/ruleset-requires-managed-by-description.d.ts +9 -0
  110. package/dist/rules/cloudflare/ruleset-requires-managed-by-description.d.ts.map +1 -0
  111. package/dist/rules/cloudflare/ruleset-requires-managed-by-description.js +52 -0
  112. package/dist/rules/cloudflare/ruleset-requires-managed-by-description.js.map +1 -0
  113. package/dist/rules/cloudflare/utils.d.ts +17 -0
  114. package/dist/rules/cloudflare/utils.d.ts.map +1 -0
  115. package/dist/rules/cloudflare/utils.js +37 -0
  116. package/dist/rules/cloudflare/utils.js.map +1 -0
  117. package/dist/rules/core/documented-outputs.d.ts +6 -0
  118. package/dist/rules/core/documented-outputs.d.ts.map +1 -0
  119. package/dist/rules/core/documented-outputs.js +41 -0
  120. package/dist/rules/core/documented-outputs.js.map +1 -0
  121. package/dist/rules/core/documented-variables.d.ts +6 -0
  122. package/dist/rules/core/documented-variables.d.ts.map +1 -0
  123. package/dist/rules/core/documented-variables.js +41 -0
  124. package/dist/rules/core/documented-variables.js.map +1 -0
  125. package/dist/rules/core/module-source-pinned.d.ts +6 -0
  126. package/dist/rules/core/module-source-pinned.d.ts.map +1 -0
  127. package/dist/rules/core/module-source-pinned.js +47 -0
  128. package/dist/rules/core/module-source-pinned.js.map +1 -0
  129. package/dist/rules/core/no-bool-as-count.d.ts +6 -0
  130. package/dist/rules/core/no-bool-as-count.d.ts.map +1 -0
  131. package/dist/rules/core/no-bool-as-count.js +69 -0
  132. package/dist/rules/core/no-bool-as-count.js.map +1 -0
  133. package/dist/rules/core/no-duplicate-map-keys.d.ts +6 -0
  134. package/dist/rules/core/no-duplicate-map-keys.d.ts.map +1 -0
  135. package/dist/rules/core/no-duplicate-map-keys.js +42 -0
  136. package/dist/rules/core/no-duplicate-map-keys.js.map +1 -0
  137. package/dist/rules/core/no-empty-list-equality.d.ts +6 -0
  138. package/dist/rules/core/no-empty-list-equality.d.ts.map +1 -0
  139. package/dist/rules/core/no-empty-list-equality.js +48 -0
  140. package/dist/rules/core/no-empty-list-equality.js.map +1 -0
  141. package/dist/rules/core/no-external-refs-in-destroy-provisioner.d.ts +6 -0
  142. package/dist/rules/core/no-external-refs-in-destroy-provisioner.d.ts.map +1 -0
  143. package/dist/rules/core/no-external-refs-in-destroy-provisioner.js +74 -0
  144. package/dist/rules/core/no-external-refs-in-destroy-provisioner.js.map +1 -0
  145. package/dist/rules/core/no-legacy-count-attribute.d.ts +6 -0
  146. package/dist/rules/core/no-legacy-count-attribute.d.ts.map +1 -0
  147. package/dist/rules/core/no-legacy-count-attribute.js +64 -0
  148. package/dist/rules/core/no-legacy-count-attribute.js.map +1 -0
  149. package/dist/rules/core/no-legacy-dot-index.d.ts +6 -0
  150. package/dist/rules/core/no-legacy-dot-index.d.ts.map +1 -0
  151. package/dist/rules/core/no-legacy-dot-index.js +79 -0
  152. package/dist/rules/core/no-legacy-dot-index.js.map +1 -0
  153. package/dist/rules/core/no-legacy-ignore-changes-wildcard.d.ts +6 -0
  154. package/dist/rules/core/no-legacy-ignore-changes-wildcard.d.ts.map +1 -0
  155. package/dist/rules/core/no-legacy-ignore-changes-wildcard.js +40 -0
  156. package/dist/rules/core/no-legacy-ignore-changes-wildcard.js.map +1 -0
  157. package/dist/rules/core/no-legacy-list-function.d.ts +6 -0
  158. package/dist/rules/core/no-legacy-list-function.d.ts.map +1 -0
  159. package/dist/rules/core/no-legacy-list-function.js +67 -0
  160. package/dist/rules/core/no-legacy-list-function.js.map +1 -0
  161. package/dist/rules/core/no-legacy-lookup.d.ts +6 -0
  162. package/dist/rules/core/no-legacy-lookup.d.ts.map +1 -0
  163. package/dist/rules/core/no-legacy-lookup.js +53 -0
  164. package/dist/rules/core/no-legacy-lookup.js.map +1 -0
  165. package/dist/rules/core/no-legacy-map-function.d.ts +6 -0
  166. package/dist/rules/core/no-legacy-map-function.d.ts.map +1 -0
  167. package/dist/rules/core/no-legacy-map-function.js +90 -0
  168. package/dist/rules/core/no-legacy-map-function.js.map +1 -0
  169. package/dist/rules/core/no-legacy-provider-proxy.d.ts +6 -0
  170. package/dist/rules/core/no-legacy-provider-proxy.d.ts.map +1 -0
  171. package/dist/rules/core/no-legacy-provider-proxy.js +43 -0
  172. package/dist/rules/core/no-legacy-provider-proxy.js.map +1 -0
  173. package/dist/rules/core/no-provider-version-constraint.d.ts +6 -0
  174. package/dist/rules/core/no-provider-version-constraint.d.ts.map +1 -0
  175. package/dist/rules/core/no-provider-version-constraint.js +33 -0
  176. package/dist/rules/core/no-provider-version-constraint.js.map +1 -0
  177. package/dist/rules/core/no-quoted-depends-on.d.ts +6 -0
  178. package/dist/rules/core/no-quoted-depends-on.d.ts.map +1 -0
  179. package/dist/rules/core/no-quoted-depends-on.js +55 -0
  180. package/dist/rules/core/no-quoted-depends-on.js.map +1 -0
  181. package/dist/rules/core/no-quoted-ignore-changes.d.ts +6 -0
  182. package/dist/rules/core/no-quoted-ignore-changes.d.ts.map +1 -0
  183. package/dist/rules/core/no-quoted-ignore-changes.js +63 -0
  184. package/dist/rules/core/no-quoted-ignore-changes.js.map +1 -0
  185. package/dist/rules/core/no-quoted-provider-reference.d.ts +6 -0
  186. package/dist/rules/core/no-quoted-provider-reference.d.ts.map +1 -0
  187. package/dist/rules/core/no-quoted-provider-reference.js +69 -0
  188. package/dist/rules/core/no-quoted-provider-reference.js.map +1 -0
  189. package/dist/rules/core/no-quoted-type-constraints.d.ts +6 -0
  190. package/dist/rules/core/no-quoted-type-constraints.d.ts.map +1 -0
  191. package/dist/rules/core/no-quoted-type-constraints.js +55 -0
  192. package/dist/rules/core/no-quoted-type-constraints.js.map +1 -0
  193. package/dist/rules/core/no-reserved-variable-names.d.ts +6 -0
  194. package/dist/rules/core/no-reserved-variable-names.d.ts.map +1 -0
  195. package/dist/rules/core/no-reserved-variable-names.js +41 -0
  196. package/dist/rules/core/no-reserved-variable-names.js.map +1 -0
  197. package/dist/rules/core/no-splat-bracket-index.d.ts +6 -0
  198. package/dist/rules/core/no-splat-bracket-index.d.ts.map +1 -0
  199. package/dist/rules/core/no-splat-bracket-index.js +30 -0
  200. package/dist/rules/core/no-splat-bracket-index.js.map +1 -0
  201. package/dist/rules/core/no-template-provider.d.ts +6 -0
  202. package/dist/rules/core/no-template-provider.d.ts.map +1 -0
  203. package/dist/rules/core/no-template-provider.js +63 -0
  204. package/dist/rules/core/no-template-provider.js.map +1 -0
  205. package/dist/rules/core/no-terraform-env-reference.d.ts +6 -0
  206. package/dist/rules/core/no-terraform-env-reference.d.ts.map +1 -0
  207. package/dist/rules/core/no-terraform-env-reference.js +35 -0
  208. package/dist/rules/core/no-terraform-env-reference.js.map +1 -0
  209. package/dist/rules/core/no-winrm-connection.d.ts +6 -0
  210. package/dist/rules/core/no-winrm-connection.d.ts.map +1 -0
  211. package/dist/rules/core/no-winrm-connection.js +31 -0
  212. package/dist/rules/core/no-winrm-connection.js.map +1 -0
  213. package/dist/rules/core/prefer-bare-expression.d.ts +6 -0
  214. package/dist/rules/core/prefer-bare-expression.d.ts.map +1 -0
  215. package/dist/rules/core/prefer-bare-expression.js +23 -0
  216. package/dist/rules/core/prefer-bare-expression.js.map +1 -0
  217. package/dist/rules/core/provider-source-required.d.ts +6 -0
  218. package/dist/rules/core/provider-source-required.d.ts.map +1 -0
  219. package/dist/rules/core/provider-source-required.js +45 -0
  220. package/dist/rules/core/provider-source-required.js.map +1 -0
  221. package/dist/rules/core/remote-state-outputs-prefix.d.ts +6 -0
  222. package/dist/rules/core/remote-state-outputs-prefix.d.ts.map +1 -0
  223. package/dist/rules/core/remote-state-outputs-prefix.js +54 -0
  224. package/dist/rules/core/remote-state-outputs-prefix.js.map +1 -0
  225. package/dist/rules/core/required-providers-pinned.d.ts +6 -0
  226. package/dist/rules/core/required-providers-pinned.d.ts.map +1 -0
  227. package/dist/rules/core/required-providers-pinned.js +37 -0
  228. package/dist/rules/core/required-providers-pinned.js.map +1 -0
  229. package/dist/rules/core/required-version-declared.d.ts +6 -0
  230. package/dist/rules/core/required-version-declared.d.ts.map +1 -0
  231. package/dist/rules/core/required-version-declared.js +38 -0
  232. package/dist/rules/core/required-version-declared.js.map +1 -0
  233. package/dist/rules/core/typed-variables.d.ts +6 -0
  234. package/dist/rules/core/typed-variables.d.ts.map +1 -0
  235. package/dist/rules/core/typed-variables.js +32 -0
  236. package/dist/rules/core/typed-variables.js.map +1 -0
  237. package/dist/rules/core/utils.d.ts +31 -0
  238. package/dist/rules/core/utils.d.ts.map +1 -0
  239. package/dist/rules/core/utils.js +185 -0
  240. package/dist/rules/core/utils.js.map +1 -0
  241. package/dist/rules/index.d.ts +157 -0
  242. package/dist/rules/index.d.ts.map +1 -0
  243. package/dist/rules/index.js +101 -0
  244. package/dist/rules/index.js.map +1 -0
  245. package/dist/rules/types.d.ts +57 -0
  246. package/dist/rules/types.d.ts.map +1 -0
  247. package/dist/rules/types.js +15 -0
  248. package/dist/rules/types.js.map +1 -0
  249. package/dist/source-code.d.ts +84 -0
  250. package/dist/source-code.d.ts.map +1 -0
  251. package/dist/source-code.js +170 -0
  252. package/dist/source-code.js.map +1 -0
  253. package/dist/types.d.ts +67 -0
  254. package/dist/types.d.ts.map +1 -0
  255. package/dist/types.js +2 -0
  256. package/dist/types.js.map +1 -0
  257. package/dist/visitor-keys.d.ts +3 -0
  258. package/dist/visitor-keys.d.ts.map +1 -0
  259. package/dist/visitor-keys.js +30 -0
  260. package/dist/visitor-keys.js.map +1 -0
  261. package/package.json +88 -4
@@ -0,0 +1,43 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { createRequire } from 'node:module';
3
+ import { dirname, join } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ let bootPromise;
6
+ async function boot() {
7
+ if (bootPromise)
8
+ return bootPromise;
9
+ bootPromise = (async () => {
10
+ const require = createRequire(import.meta.url);
11
+ const here = dirname(fileURLToPath(import.meta.url));
12
+ // wasm-exec.cjs installs globalThis.Go as a side effect.
13
+ require(join(here, 'wasm-exec.cjs'));
14
+ const wasmBytes = await readFile(join(here, 'lintofu-parser.wasm'));
15
+ const host = globalThis;
16
+ const go = new host.Go();
17
+ const { instance } = await WebAssembly.instantiate(wasmBytes, go.importObject);
18
+ // Don't await: go.run resolves only when Go exits, but our main
19
+ // blocks on select{} so callbacks stay reachable.
20
+ void go.run(instance);
21
+ })();
22
+ return bootPromise;
23
+ }
24
+ // ESLint's Language.parse contract is sync, so consumers must call
25
+ // initialize() (typically as top-level await at plugin load) before any
26
+ // parseSync() can succeed.
27
+ export async function initialize() {
28
+ await boot();
29
+ }
30
+ export function parseSync(source, opts = {}) {
31
+ const host = globalThis;
32
+ if (!host.__lintofu_parse) {
33
+ throw new Error('lintofu parser: not initialized. Call initialize() before parseSync().');
34
+ }
35
+ const filename = opts.filename ?? '<anonymous>';
36
+ const raw = host.__lintofu_parse(source, filename);
37
+ return JSON.parse(raw);
38
+ }
39
+ export async function parse(source, opts = {}) {
40
+ await boot();
41
+ return parseSync(source, opts);
42
+ }
43
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAezC,IAAI,WAAsC,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,IAAI,WAAW;QAAE,OAAO,WAAW,CAAC;IACpC,WAAW,GAAG,CAAC,KAAK,IAAI,EAAE;QACxB,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAErD,yDAAyD;QACzD,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC;QAErC,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC,CAAC;QACpE,MAAM,IAAI,GAAG,UAA+B,CAAC;QAC7C,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;QACzB,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,WAAW,CAAC,WAAW,CAChD,SAAS,EACT,EAAE,CAAC,YAAY,CAChB,CAAC;QACF,gEAAgE;QAChE,kDAAkD;QAClD,KAAK,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxB,CAAC,CAAC,EAAE,CAAC;IACL,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,mEAAmE;AACnE,wEAAwE;AACxE,2BAA2B;AAC3B,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,IAAI,EAAE,CAAC;AACf,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,MAAc,EACd,OAA8B,EAAE;IAEhC,MAAM,IAAI,GAAG,UAA+B,CAAC;IAC7C,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,wEAAwE,CACzE,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,aAAa,CAAC;IAChD,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACnD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK,CACzB,MAAc,EACd,OAA8B,EAAE;IAEhC,MAAM,IAAI,EAAE,CAAC;IACb,OAAO,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACjC,CAAC"}
Binary file
@@ -0,0 +1,261 @@
1
+ /** A position in source. Byte-oriented, not character-oriented. */
2
+ export interface Pos {
3
+ /** 1-indexed. */
4
+ line: number;
5
+ /** 1-indexed byte offset within the line (NOT a character offset). */
6
+ column: number;
7
+ /** 0-indexed byte offset from BOF. */
8
+ offset: number;
9
+ }
10
+ /** Start and end positions of a node's source text. Every node carries one. */
11
+ export interface Range {
12
+ start: Pos;
13
+ end: Pos;
14
+ }
15
+ /**
16
+ * Contents of a file or a block body. `blocks` and `attributes` are in
17
+ * source order.
18
+ */
19
+ export interface Body {
20
+ type: 'Body';
21
+ blocks: Block[];
22
+ attributes: Attribute[];
23
+ range: Range;
24
+ }
25
+ /**
26
+ * An HCL block. `kind` is the block type as written (`resource`,
27
+ * `variable`, ...), `labels` the quoted or bare labels, `body` the nested
28
+ * body.
29
+ */
30
+ export interface Block {
31
+ type: 'Block';
32
+ kind: string;
33
+ labels: string[];
34
+ body: Body;
35
+ range: Range;
36
+ }
37
+ /** A `name = expression` assignment. */
38
+ export interface Attribute {
39
+ type: 'Attribute';
40
+ name: string;
41
+ expression: Expression;
42
+ range: Range;
43
+ }
44
+ /**
45
+ * Discriminated union of every expression node; narrow on `type`. Several
46
+ * variants (FunctionCallExpr, TupleConsExpr, ConditionalExpr, ForExpr,
47
+ * SplatExpr, IndexExpr, RelativeTraversalExpr, ParenthesesExpr, BinaryOpExpr,
48
+ * UnaryOpExpr) are not root exports and are reached only by narrowing this
49
+ * union; their interface docs are what hover shows after narrowing.
50
+ */
51
+ export type Expression = LiteralValueExpr | TemplateExpr | TemplateWrapExpr | FunctionCallExpr | ScopeTraversalExpr | ObjectConsExpr | ObjectConsKeyExpr | TupleConsExpr | ConditionalExpr | ForExpr | SplatExpr | IndexExpr | RelativeTraversalExpr | ParenthesesExpr | BinaryOpExpr | UnaryOpExpr | UnknownExpr;
52
+ /** A constant scalar. `value` is a string, number, boolean, or null. */
53
+ export interface LiteralValueExpr {
54
+ type: 'LiteralValueExpr';
55
+ value: string | number | boolean | null;
56
+ range: Range;
57
+ }
58
+ /**
59
+ * A string template. `parts` interleaves literal and interpolated
60
+ * expressions.
61
+ */
62
+ export interface TemplateExpr {
63
+ type: 'TemplateExpr';
64
+ parts: Expression[];
65
+ range: Range;
66
+ }
67
+ /** A function call like `concat(a, b)`. */
68
+ export interface FunctionCallExpr {
69
+ type: 'FunctionCallExpr';
70
+ name: string;
71
+ args: Expression[];
72
+ /** HCL's `...` spread of the final argument, e.g. `concat(a, b...)`. */
73
+ expandFinal: boolean;
74
+ range: Range;
75
+ }
76
+ /** `"${expr}"` exactly: a single non-literal part with no surrounding text. */
77
+ export interface TemplateWrapExpr {
78
+ type: 'TemplateWrapExpr';
79
+ wrapped: Expression;
80
+ range: Range;
81
+ }
82
+ /**
83
+ * A variable reference like `aws_instance.web.id`. `traversal` is the chain
84
+ * of steps, starting with a {@link TraverseRoot}.
85
+ */
86
+ export interface ScopeTraversalExpr {
87
+ type: 'ScopeTraversalExpr';
88
+ traversal: Traverser[];
89
+ range: Range;
90
+ }
91
+ /**
92
+ * Union of traversal steps; narrow on `type`. {@link TraverseIndex} is
93
+ * reachable only through this union.
94
+ */
95
+ export type Traverser = TraverseRoot | TraverseAttr | TraverseIndex;
96
+ /** First step of a traversal: the bare root symbol (`aws_instance`). */
97
+ export interface TraverseRoot {
98
+ type: 'TraverseRoot';
99
+ name: string;
100
+ range: Range;
101
+ }
102
+ /** A `.name` step. */
103
+ export interface TraverseAttr {
104
+ type: 'TraverseAttr';
105
+ name: string;
106
+ range: Range;
107
+ }
108
+ /** A constant `[key]` step folded into the traversal (see {@link IndexExpr}). */
109
+ export interface TraverseIndex {
110
+ type: 'TraverseIndex';
111
+ key: string | number | boolean | null;
112
+ range: Range;
113
+ }
114
+ /** An object constructor `{ k = v, ... }`. */
115
+ export interface ObjectConsExpr {
116
+ type: 'ObjectConsExpr';
117
+ items: ObjectConsItem[];
118
+ range: Range;
119
+ }
120
+ /**
121
+ * One key/value pair of an {@link ObjectConsExpr}. Has no `type`
122
+ * discriminator, so it is not a visitable node: OpenTofuSourceCode.traverse()
123
+ * descends into `keyExpr` and `valueExpr` directly (out-of-band), and there
124
+ * is no `ObjectConsItem` visitor key in OpenTofuRuleVisitor.
125
+ */
126
+ export interface ObjectConsItem {
127
+ keyExpr: Expression;
128
+ valueExpr: Expression;
129
+ }
130
+ /** Wrapper HCL puts around object keys; unwrap via `wrapped`. */
131
+ export interface ObjectConsKeyExpr {
132
+ type: 'ObjectConsKeyExpr';
133
+ wrapped: Expression;
134
+ range: Range;
135
+ }
136
+ /** A list constructor `[a, b, c]`. */
137
+ export interface TupleConsExpr {
138
+ type: 'TupleConsExpr';
139
+ exprs: Expression[];
140
+ range: Range;
141
+ }
142
+ /** `cond ? a : b`. */
143
+ export interface ConditionalExpr {
144
+ type: 'ConditionalExpr';
145
+ condition: Expression;
146
+ trueResult: Expression;
147
+ falseResult: Expression;
148
+ range: Range;
149
+ }
150
+ /**
151
+ * A for expression. `keyVar` and `valVar` are the loop variable names,
152
+ * `keyExpr` is present only for object results, `condExpr` is the optional
153
+ * `if` filter, and `group` is true for `...` grouping.
154
+ */
155
+ export interface ForExpr {
156
+ type: 'ForExpr';
157
+ keyVar: string;
158
+ valVar: string;
159
+ collExpr: Expression;
160
+ keyExpr?: Expression;
161
+ valExpr: Expression;
162
+ condExpr?: Expression;
163
+ group: boolean;
164
+ range: Range;
165
+ }
166
+ /** `list[*].attr` or `list.*.attr`: `source` plus the per-element `each`. */
167
+ export interface SplatExpr {
168
+ type: 'SplatExpr';
169
+ source: Expression;
170
+ each: Expression;
171
+ range: Range;
172
+ }
173
+ /**
174
+ * `x[k]` where `k` is non-constant. A constant index folds into the enclosing
175
+ * {@link ScopeTraversalExpr} as a {@link TraverseIndex} step instead.
176
+ */
177
+ export interface IndexExpr {
178
+ type: 'IndexExpr';
179
+ collection: Expression;
180
+ key: Expression;
181
+ range: Range;
182
+ }
183
+ /**
184
+ * A traversal chained onto a non-variable source: the `.id` in
185
+ * `aws_instance.x[*].id` or the `.address` in `(var.x).address`. A traversal
186
+ * rooted on a bare symbol folds into {@link ScopeTraversalExpr} instead.
187
+ */
188
+ export interface RelativeTraversalExpr {
189
+ type: 'RelativeTraversalExpr';
190
+ source: Expression;
191
+ traversal: Traverser[];
192
+ range: Range;
193
+ }
194
+ /**
195
+ * `(expr)`: explicit grouping parens, kept so a chained traversal or operator
196
+ * has something to attach to.
197
+ */
198
+ export interface ParenthesesExpr {
199
+ type: 'ParenthesesExpr';
200
+ expression: Expression;
201
+ range: Range;
202
+ }
203
+ /** Operator names for {@link BinaryOpExpr}. */
204
+ export type BinaryOp = 'equal' | 'notEqual' | 'greaterThan' | 'greaterThanOrEqual' | 'lessThan' | 'lessThanOrEqual' | 'add' | 'subtract' | 'multiply' | 'divide' | 'modulo' | 'logicalAnd' | 'logicalOr';
205
+ /** `a == b`, `a + b`, `a && b`. `op` is the operator's name, not its symbol. */
206
+ export interface BinaryOpExpr {
207
+ type: 'BinaryOpExpr';
208
+ op: BinaryOp;
209
+ lhs: Expression;
210
+ rhs: Expression;
211
+ range: Range;
212
+ }
213
+ /** Operator names for {@link UnaryOpExpr}. */
214
+ export type UnaryOp = 'logicalNot' | 'negate';
215
+ /** `!x`, `-x`. `op` is the operator's name, not its symbol. */
216
+ export interface UnaryOpExpr {
217
+ type: 'UnaryOpExpr';
218
+ op: UnaryOp;
219
+ operand: Expression;
220
+ range: Range;
221
+ }
222
+ /**
223
+ * Fallback for expression kinds the parser does not model yet. `unknownKind`
224
+ * names the HCL syntax type.
225
+ */
226
+ export interface UnknownExpr {
227
+ type: 'UnknownExpr';
228
+ unknownKind: string;
229
+ range: Range;
230
+ }
231
+ /** A parse diagnostic from HCL; severity is error or warning. */
232
+ export interface Diagnostic {
233
+ severity: 'error' | 'warning';
234
+ summary: string;
235
+ detail?: string;
236
+ range: Range;
237
+ }
238
+ /**
239
+ * Not an AST node: comments travel on their own channel
240
+ * (OpenTofuSourceCode.comments) and are never added to {@link NodeType},
241
+ * visitorKeys, or traverse(). `kind` is `'line'` (`#` or `//`) or `'block'`
242
+ * (`/*` style).
243
+ */
244
+ export interface Comment {
245
+ type: 'Comment';
246
+ kind: 'line' | 'block';
247
+ value: string;
248
+ range: Range;
249
+ }
250
+ /** What the parser returns: ast, comments, diagnostics. */
251
+ export interface ParseResult {
252
+ ast: Body;
253
+ comments: Comment[];
254
+ diagnostics: Diagnostic[];
255
+ }
256
+ /**
257
+ * Every visitable node type name. Drives compile-time exhaustiveness on
258
+ * visitorKeys.
259
+ */
260
+ export type NodeType = 'Body' | 'Block' | 'Attribute' | 'LiteralValueExpr' | 'TemplateExpr' | 'TemplateWrapExpr' | 'FunctionCallExpr' | 'ScopeTraversalExpr' | 'ObjectConsExpr' | 'ObjectConsKeyExpr' | 'TupleConsExpr' | 'ConditionalExpr' | 'ForExpr' | 'SplatExpr' | 'IndexExpr' | 'RelativeTraversalExpr' | 'ParenthesesExpr' | 'BinaryOpExpr' | 'UnaryOpExpr' | 'UnknownExpr' | 'TraverseRoot' | 'TraverseAttr' | 'TraverseIndex';
261
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/parser/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ // Mirrors parser-go/parser/parser.go. Changes must stay in sync.
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/parser/types.ts"],"names":[],"mappings":"AAAA,iEAAiE"}