@opensip-cli/checks-typescript 0.1.9 → 0.1.11

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 (244) hide show
  1. package/README.md +4 -2
  2. package/dist/__tests__/all-checks-execute.test.d.ts.map +1 -1
  3. package/dist/__tests__/all-checks-execute.test.js +0 -1
  4. package/dist/__tests__/all-checks-execute.test.js.map +1 -1
  5. package/dist/__tests__/behavior-fixtures-2.test.d.ts.map +1 -1
  6. package/dist/__tests__/behavior-fixtures-2.test.js +0 -1
  7. package/dist/__tests__/behavior-fixtures-2.test.js.map +1 -1
  8. package/dist/__tests__/behavior-fixtures-3.test.d.ts.map +1 -1
  9. package/dist/__tests__/behavior-fixtures-3.test.js +0 -1
  10. package/dist/__tests__/behavior-fixtures-3.test.js.map +1 -1
  11. package/dist/__tests__/behavior-fixtures-4.test.d.ts.map +1 -1
  12. package/dist/__tests__/behavior-fixtures-4.test.js +0 -1
  13. package/dist/__tests__/behavior-fixtures-4.test.js.map +1 -1
  14. package/dist/__tests__/behavior-fixtures-5.test.d.ts.map +1 -1
  15. package/dist/__tests__/behavior-fixtures-5.test.js +0 -1
  16. package/dist/__tests__/behavior-fixtures-5.test.js.map +1 -1
  17. package/dist/__tests__/behavior-fixtures-6.test.js +10 -0
  18. package/dist/__tests__/behavior-fixtures-6.test.js.map +1 -1
  19. package/dist/__tests__/behavior-fixtures.test.d.ts.map +1 -1
  20. package/dist/__tests__/behavior-fixtures.test.js +2 -4
  21. package/dist/__tests__/behavior-fixtures.test.js.map +1 -1
  22. package/dist/__tests__/branch-fixtures-2.test.d.ts.map +1 -1
  23. package/dist/__tests__/branch-fixtures-2.test.js +0 -1
  24. package/dist/__tests__/branch-fixtures-2.test.js.map +1 -1
  25. package/dist/__tests__/branch-fixtures-3.test.d.ts.map +1 -1
  26. package/dist/__tests__/branch-fixtures-3.test.js +0 -1
  27. package/dist/__tests__/branch-fixtures-3.test.js.map +1 -1
  28. package/dist/__tests__/branch-fixtures.test.d.ts.map +1 -1
  29. package/dist/__tests__/branch-fixtures.test.js +0 -1
  30. package/dist/__tests__/branch-fixtures.test.js.map +1 -1
  31. package/dist/checks/architecture/__tests__/live-view-through-cli-live.test.d.ts +2 -0
  32. package/dist/checks/architecture/__tests__/live-view-through-cli-live.test.d.ts.map +1 -0
  33. package/dist/checks/architecture/__tests__/live-view-through-cli-live.test.js +13 -0
  34. package/dist/checks/architecture/__tests__/live-view-through-cli-live.test.js.map +1 -0
  35. package/dist/checks/architecture/contracts-schema-consistency.d.ts.map +1 -1
  36. package/dist/checks/architecture/contracts-schema-consistency.js +0 -3
  37. package/dist/checks/architecture/contracts-schema-consistency.js.map +1 -1
  38. package/dist/checks/architecture/drizzle-orm-migration-guardrails.d.ts.map +1 -1
  39. package/dist/checks/architecture/drizzle-orm-migration-guardrails.js +1 -0
  40. package/dist/checks/architecture/drizzle-orm-migration-guardrails.js.map +1 -1
  41. package/dist/checks/architecture/index.d.ts +1 -0
  42. package/dist/checks/architecture/index.d.ts.map +1 -1
  43. package/dist/checks/architecture/index.js +1 -0
  44. package/dist/checks/architecture/index.js.map +1 -1
  45. package/dist/checks/architecture/live-view-through-cli-live.d.ts +8 -0
  46. package/dist/checks/architecture/live-view-through-cli-live.d.ts.map +1 -0
  47. package/dist/checks/architecture/live-view-through-cli-live.js +43 -0
  48. package/dist/checks/architecture/live-view-through-cli-live.js.map +1 -0
  49. package/dist/checks/architecture/missing-type-exports.d.ts.map +1 -1
  50. package/dist/checks/architecture/missing-type-exports.js +1 -1
  51. package/dist/checks/architecture/missing-type-exports.js.map +1 -1
  52. package/dist/checks/architecture/module-coupling-fan-out.d.ts.map +1 -1
  53. package/dist/checks/architecture/module-coupling-fan-out.js +6 -2
  54. package/dist/checks/architecture/module-coupling-fan-out.js.map +1 -1
  55. package/dist/checks/architecture/no-bootstrap-tool-import.d.ts.map +1 -1
  56. package/dist/checks/architecture/no-bootstrap-tool-import.js +1 -0
  57. package/dist/checks/architecture/no-bootstrap-tool-import.js.map +1 -1
  58. package/dist/checks/architecture/no-run-done-result.d.ts.map +1 -1
  59. package/dist/checks/architecture/no-run-done-result.js +1 -0
  60. package/dist/checks/architecture/no-run-done-result.js.map +1 -1
  61. package/dist/checks/architecture/package-json-exports-field.d.ts.map +1 -1
  62. package/dist/checks/architecture/package-json-exports-field.js +1 -1
  63. package/dist/checks/architecture/package-json-exports-field.js.map +1 -1
  64. package/dist/checks/architecture/phantom-dependency-detection.d.ts.map +1 -1
  65. package/dist/checks/architecture/phantom-dependency-detection.js +0 -3
  66. package/dist/checks/architecture/phantom-dependency-detection.js.map +1 -1
  67. package/dist/checks/architecture/tsconfig-extends-validation.d.ts.map +1 -1
  68. package/dist/checks/architecture/tsconfig-extends-validation.js +0 -2
  69. package/dist/checks/architecture/tsconfig-extends-validation.js.map +1 -1
  70. package/dist/checks/quality/code-structure/__tests__/duplicate-utility-lang-substrate.test.d.ts +5 -0
  71. package/dist/checks/quality/code-structure/__tests__/duplicate-utility-lang-substrate.test.d.ts.map +1 -0
  72. package/dist/checks/quality/code-structure/__tests__/duplicate-utility-lang-substrate.test.js +17 -0
  73. package/dist/checks/quality/code-structure/__tests__/duplicate-utility-lang-substrate.test.js.map +1 -0
  74. package/dist/checks/quality/code-structure/duplicate-utility-functions-config.d.ts +18 -0
  75. package/dist/checks/quality/code-structure/duplicate-utility-functions-config.d.ts.map +1 -0
  76. package/dist/checks/quality/code-structure/duplicate-utility-functions-config.js +36 -0
  77. package/dist/checks/quality/code-structure/duplicate-utility-functions-config.js.map +1 -0
  78. package/dist/checks/quality/code-structure/duplicate-utility-functions-helpers.d.ts +15 -0
  79. package/dist/checks/quality/code-structure/duplicate-utility-functions-helpers.d.ts.map +1 -0
  80. package/dist/checks/quality/code-structure/duplicate-utility-functions-helpers.js +288 -0
  81. package/dist/checks/quality/code-structure/duplicate-utility-functions-helpers.js.map +1 -0
  82. package/dist/checks/quality/code-structure/duplicate-utility-functions.d.ts +1 -26
  83. package/dist/checks/quality/code-structure/duplicate-utility-functions.d.ts.map +1 -1
  84. package/dist/checks/quality/code-structure/duplicate-utility-functions.js +3 -407
  85. package/dist/checks/quality/code-structure/duplicate-utility-functions.js.map +1 -1
  86. package/dist/checks/quality/data-integrity/__tests__/null-safety-fp.test.js +39 -2
  87. package/dist/checks/quality/data-integrity/__tests__/null-safety-fp.test.js.map +1 -1
  88. package/dist/checks/quality/data-integrity/array-validation-detectors.d.ts +17 -0
  89. package/dist/checks/quality/data-integrity/array-validation-detectors.d.ts.map +1 -0
  90. package/dist/checks/quality/data-integrity/array-validation-detectors.js +184 -0
  91. package/dist/checks/quality/data-integrity/array-validation-detectors.js.map +1 -0
  92. package/dist/checks/quality/data-integrity/array-validation.d.ts +0 -2
  93. package/dist/checks/quality/data-integrity/array-validation.d.ts.map +1 -1
  94. package/dist/checks/quality/data-integrity/array-validation.js +2 -360
  95. package/dist/checks/quality/data-integrity/array-validation.js.map +1 -1
  96. package/dist/checks/quality/data-integrity/database-schema-validation.d.ts.map +1 -1
  97. package/dist/checks/quality/data-integrity/database-schema-validation.js +0 -1
  98. package/dist/checks/quality/data-integrity/database-schema-validation.js.map +1 -1
  99. package/dist/checks/quality/data-integrity/null-safety-analyze.d.ts +33 -0
  100. package/dist/checks/quality/data-integrity/null-safety-analyze.d.ts.map +1 -0
  101. package/dist/checks/quality/data-integrity/null-safety-analyze.js +164 -0
  102. package/dist/checks/quality/data-integrity/null-safety-analyze.js.map +1 -0
  103. package/dist/checks/quality/data-integrity/null-safety-config.d.ts +50 -0
  104. package/dist/checks/quality/data-integrity/null-safety-config.d.ts.map +1 -0
  105. package/dist/checks/quality/data-integrity/null-safety-config.js +69 -0
  106. package/dist/checks/quality/data-integrity/null-safety-config.js.map +1 -0
  107. package/dist/checks/quality/data-integrity/null-safety-heuristics.d.ts +76 -0
  108. package/dist/checks/quality/data-integrity/null-safety-heuristics.d.ts.map +1 -0
  109. package/dist/checks/quality/data-integrity/null-safety-heuristics.js +276 -0
  110. package/dist/checks/quality/data-integrity/null-safety-heuristics.js.map +1 -0
  111. package/dist/checks/quality/data-integrity/null-safety-prefixes.d.ts +13 -0
  112. package/dist/checks/quality/data-integrity/null-safety-prefixes.d.ts.map +1 -0
  113. package/dist/checks/quality/data-integrity/null-safety-prefixes.js +333 -0
  114. package/dist/checks/quality/data-integrity/null-safety-prefixes.js.map +1 -0
  115. package/dist/checks/quality/data-integrity/null-safety.d.ts +2 -82
  116. package/dist/checks/quality/data-integrity/null-safety.d.ts.map +1 -1
  117. package/dist/checks/quality/data-integrity/null-safety.js +3 -796
  118. package/dist/checks/quality/data-integrity/null-safety.js.map +1 -1
  119. package/dist/checks/quality/frontend/test-only-frontend-modules.d.ts.map +1 -1
  120. package/dist/checks/quality/frontend/test-only-frontend-modules.js +0 -2
  121. package/dist/checks/quality/frontend/test-only-frontend-modules.js.map +1 -1
  122. package/dist/checks/quality/linting/typescript-frontend.d.ts.map +1 -1
  123. package/dist/checks/quality/linting/typescript-frontend.js +1 -0
  124. package/dist/checks/quality/linting/typescript-frontend.js.map +1 -1
  125. package/dist/checks/quality/observability/logger-event-name-format.d.ts.map +1 -1
  126. package/dist/checks/quality/observability/logger-event-name-format.js +0 -1
  127. package/dist/checks/quality/observability/logger-event-name-format.js.map +1 -1
  128. package/dist/checks/quality/observability/no-hardcoded-correlation-id.d.ts.map +1 -1
  129. package/dist/checks/quality/observability/no-hardcoded-correlation-id.js +2 -3
  130. package/dist/checks/quality/observability/no-hardcoded-correlation-id.js.map +1 -1
  131. package/dist/checks/quality/patterns/__tests__/async-waterfall-sequential.test.d.ts +8 -0
  132. package/dist/checks/quality/patterns/__tests__/async-waterfall-sequential.test.d.ts.map +1 -0
  133. package/dist/checks/quality/patterns/__tests__/async-waterfall-sequential.test.js +87 -0
  134. package/dist/checks/quality/patterns/__tests__/async-waterfall-sequential.test.js.map +1 -0
  135. package/dist/checks/quality/patterns/__tests__/error-handling-probes.test.d.ts +2 -0
  136. package/dist/checks/quality/patterns/__tests__/error-handling-probes.test.d.ts.map +1 -0
  137. package/dist/checks/quality/patterns/__tests__/error-handling-probes.test.js +51 -0
  138. package/dist/checks/quality/patterns/__tests__/error-handling-probes.test.js.map +1 -0
  139. package/dist/checks/quality/patterns/__tests__/result-pattern-registration-guards.test.d.ts +2 -0
  140. package/dist/checks/quality/patterns/__tests__/result-pattern-registration-guards.test.d.ts.map +1 -0
  141. package/dist/checks/quality/patterns/__tests__/result-pattern-registration-guards.test.js +89 -0
  142. package/dist/checks/quality/patterns/__tests__/result-pattern-registration-guards.test.js.map +1 -0
  143. package/dist/checks/quality/patterns/__tests__/throws-documentation-analyze.test.d.ts +5 -0
  144. package/dist/checks/quality/patterns/__tests__/throws-documentation-analyze.test.d.ts.map +1 -0
  145. package/dist/checks/quality/patterns/__tests__/throws-documentation-analyze.test.js +78 -0
  146. package/dist/checks/quality/patterns/__tests__/throws-documentation-analyze.test.js.map +1 -0
  147. package/dist/checks/quality/patterns/__tests__/toctou-fp.test.js +44 -0
  148. package/dist/checks/quality/patterns/__tests__/toctou-fp.test.js.map +1 -1
  149. package/dist/checks/quality/patterns/async-waterfall-analysis.d.ts +17 -0
  150. package/dist/checks/quality/patterns/async-waterfall-analysis.d.ts.map +1 -0
  151. package/dist/checks/quality/patterns/async-waterfall-analysis.js +215 -0
  152. package/dist/checks/quality/patterns/async-waterfall-analysis.js.map +1 -0
  153. package/dist/checks/quality/patterns/async-waterfall-branch-keys.d.ts +6 -0
  154. package/dist/checks/quality/patterns/async-waterfall-branch-keys.d.ts.map +1 -0
  155. package/dist/checks/quality/patterns/async-waterfall-branch-keys.js +54 -0
  156. package/dist/checks/quality/patterns/async-waterfall-branch-keys.js.map +1 -0
  157. package/dist/checks/quality/patterns/async-waterfall-detection.d.ts.map +1 -1
  158. package/dist/checks/quality/patterns/async-waterfall-detection.js +3 -352
  159. package/dist/checks/quality/patterns/async-waterfall-detection.js.map +1 -1
  160. package/dist/checks/quality/patterns/containing-function-name.d.ts +3 -0
  161. package/dist/checks/quality/patterns/containing-function-name.d.ts.map +1 -0
  162. package/dist/checks/quality/patterns/containing-function-name.js +21 -0
  163. package/dist/checks/quality/patterns/containing-function-name.js.map +1 -0
  164. package/dist/checks/quality/patterns/error-handling-quality.d.ts +3 -0
  165. package/dist/checks/quality/patterns/error-handling-quality.d.ts.map +1 -1
  166. package/dist/checks/quality/patterns/error-handling-quality.js +150 -30
  167. package/dist/checks/quality/patterns/error-handling-quality.js.map +1 -1
  168. package/dist/checks/quality/patterns/result-pattern-consistency.d.ts +3 -0
  169. package/dist/checks/quality/patterns/result-pattern-consistency.d.ts.map +1 -1
  170. package/dist/checks/quality/patterns/result-pattern-consistency.js +136 -69
  171. package/dist/checks/quality/patterns/result-pattern-consistency.js.map +1 -1
  172. package/dist/checks/quality/patterns/throws-documentation-analyze.d.ts +14 -0
  173. package/dist/checks/quality/patterns/throws-documentation-analyze.d.ts.map +1 -0
  174. package/dist/checks/quality/patterns/throws-documentation-analyze.js +352 -0
  175. package/dist/checks/quality/patterns/throws-documentation-analyze.js.map +1 -0
  176. package/dist/checks/quality/patterns/throws-documentation-constants.d.ts +15 -0
  177. package/dist/checks/quality/patterns/throws-documentation-constants.d.ts.map +1 -0
  178. package/dist/checks/quality/patterns/throws-documentation-constants.js +94 -0
  179. package/dist/checks/quality/patterns/throws-documentation-constants.js.map +1 -0
  180. package/dist/checks/quality/patterns/throws-documentation.d.ts +1 -11
  181. package/dist/checks/quality/patterns/throws-documentation.d.ts.map +1 -1
  182. package/dist/checks/quality/patterns/throws-documentation.js +4 -472
  183. package/dist/checks/quality/patterns/throws-documentation.js.map +1 -1
  184. package/dist/checks/quality/patterns/toctou-race-condition-classify.d.ts +23 -0
  185. package/dist/checks/quality/patterns/toctou-race-condition-classify.d.ts.map +1 -0
  186. package/dist/checks/quality/patterns/toctou-race-condition-classify.js +125 -0
  187. package/dist/checks/quality/patterns/toctou-race-condition-classify.js.map +1 -0
  188. package/dist/checks/quality/patterns/toctou-race-condition-collection.d.ts +24 -0
  189. package/dist/checks/quality/patterns/toctou-race-condition-collection.d.ts.map +1 -0
  190. package/dist/checks/quality/patterns/toctou-race-condition-collection.js +248 -0
  191. package/dist/checks/quality/patterns/toctou-race-condition-collection.js.map +1 -0
  192. package/dist/checks/quality/patterns/toctou-race-condition-constants.d.ts +32 -0
  193. package/dist/checks/quality/patterns/toctou-race-condition-constants.d.ts.map +1 -0
  194. package/dist/checks/quality/patterns/toctou-race-condition-constants.js +115 -0
  195. package/dist/checks/quality/patterns/toctou-race-condition-constants.js.map +1 -0
  196. package/dist/checks/quality/patterns/toctou-race-condition.d.ts +1 -29
  197. package/dist/checks/quality/patterns/toctou-race-condition.d.ts.map +1 -1
  198. package/dist/checks/quality/patterns/toctou-race-condition.js +11 -536
  199. package/dist/checks/quality/patterns/toctou-race-condition.js.map +1 -1
  200. package/dist/checks/quality/unused-config-options.d.ts.map +1 -1
  201. package/dist/checks/quality/unused-config-options.js +0 -4
  202. package/dist/checks/quality/unused-config-options.js.map +1 -1
  203. package/dist/checks/resilience/__tests__/detached-promises-sync-detection.test.d.ts +2 -0
  204. package/dist/checks/resilience/__tests__/detached-promises-sync-detection.test.d.ts.map +1 -0
  205. package/dist/checks/resilience/__tests__/detached-promises-sync-detection.test.js +98 -0
  206. package/dist/checks/resilience/__tests__/detached-promises-sync-detection.test.js.map +1 -0
  207. package/dist/checks/resilience/callback-invocation-safe.d.ts.map +1 -1
  208. package/dist/checks/resilience/callback-invocation-safe.js +0 -1
  209. package/dist/checks/resilience/callback-invocation-safe.js.map +1 -1
  210. package/dist/checks/resilience/context-leakage.d.ts.map +1 -1
  211. package/dist/checks/resilience/context-leakage.js +1 -0
  212. package/dist/checks/resilience/context-leakage.js.map +1 -1
  213. package/dist/checks/resilience/detached-promises-detection.d.ts +7 -0
  214. package/dist/checks/resilience/detached-promises-detection.d.ts.map +1 -0
  215. package/dist/checks/resilience/detached-promises-detection.js +228 -0
  216. package/dist/checks/resilience/detached-promises-detection.js.map +1 -0
  217. package/dist/checks/resilience/detached-promises-sync-constants.d.ts +36 -0
  218. package/dist/checks/resilience/detached-promises-sync-constants.d.ts.map +1 -0
  219. package/dist/checks/resilience/detached-promises-sync-constants.js +299 -0
  220. package/dist/checks/resilience/detached-promises-sync-constants.js.map +1 -0
  221. package/dist/checks/resilience/detached-promises-sync-detection.d.ts +14 -0
  222. package/dist/checks/resilience/detached-promises-sync-detection.d.ts.map +1 -0
  223. package/dist/checks/resilience/detached-promises-sync-detection.js +69 -0
  224. package/dist/checks/resilience/detached-promises-sync-detection.js.map +1 -0
  225. package/dist/checks/resilience/detached-promises.d.ts +1 -14
  226. package/dist/checks/resilience/detached-promises.d.ts.map +1 -1
  227. package/dist/checks/resilience/detached-promises.js +2 -598
  228. package/dist/checks/resilience/detached-promises.js.map +1 -1
  229. package/dist/checks/resilience/no-raw-fetch.d.ts.map +1 -1
  230. package/dist/checks/resilience/no-raw-fetch.js +1 -0
  231. package/dist/checks/resilience/no-raw-fetch.js.map +1 -1
  232. package/dist/checks/resilience/no-unbounded-concurrency.d.ts.map +1 -1
  233. package/dist/checks/resilience/no-unbounded-concurrency.js +1 -0
  234. package/dist/checks/resilience/no-unbounded-concurrency.js.map +1 -1
  235. package/dist/checks/security/sql-injection.d.ts.map +1 -1
  236. package/dist/checks/security/sql-injection.js +0 -1
  237. package/dist/checks/security/sql-injection.js.map +1 -1
  238. package/dist/display/architecture.d.ts.map +1 -1
  239. package/dist/display/architecture.js +1 -0
  240. package/dist/display/architecture.js.map +1 -1
  241. package/dist/display/types.d.ts.map +1 -1
  242. package/dist/display/types.js +0 -1
  243. package/dist/display/types.js.map +1 -1
  244. package/package.json +5 -5
@@ -0,0 +1,276 @@
1
+ /**
2
+ * @fileoverview Null-safety AST heuristics for convention-based detection.
3
+ */
4
+ import * as ts from 'typescript';
5
+ import { isSafeFluentMethod as isListedSafeFluentMethod, SAFE_METHOD_PREFIXES, } from './null-safety-config.js';
6
+ /**
7
+ * Check if a call expression is a known safe builder pattern.
8
+ *
9
+ * Two paths:
10
+ * 1. Explicit allowlist (`SAFE_BUILDER_PREFIXES`) — exact-prefix match on the
11
+ * full call text (e.g. `z.string(`, `pathToFileURL(`).
12
+ * 2. Convention heuristic — when the callee is a bare identifier whose name
13
+ * starts with a recognised safe verb (`get*`, `read*`, `resolve*`,
14
+ * `current*`, `create*`, `build*`, etc.). This is the same convention that
15
+ * already covers fluent-chain methods via `isSafeFluentMethod`; applying it
16
+ * to standalone calls closes the gap for helpers like `resolveProjectPaths`,
17
+ * `readScope`, `currentScenarioRegistry`, etc. whose names convey the same
18
+ * "returns a value or throws" contract.
19
+ */
20
+ export function isSafeBuilderPattern(expression, sourceFile, safeBuilders) {
21
+ const text = expression.getText(sourceFile);
22
+ if (safeBuilders.some((prefix) => text.startsWith(prefix)))
23
+ return true;
24
+ if (ts.isIdentifier(expression.expression)) {
25
+ const name = expression.expression.text;
26
+ if (isSafeFluentMethod(name))
27
+ return true;
28
+ // Local `repoFor()`-style factories return a fresh non-null handle.
29
+ if (name.endsWith('For'))
30
+ return true;
31
+ return false;
32
+ }
33
+ if (ts.isPropertyAccessExpression(expression.expression)) {
34
+ return isSafeFluentMethod(expression.expression.name.text);
35
+ }
36
+ return false;
37
+ }
38
+ /**
39
+ * Check if a method name is a known safe fluent API method.
40
+ * Matches either an exact entry in SAFE_FLUENT_METHOD_NAMES or a method whose name
41
+ * starts with a common safe prefix (get, set, is, has, to, etc.).
42
+ */
43
+ export function isSafeFluentMethod(methodName) {
44
+ if (isListedSafeFluentMethod(methodName))
45
+ return true;
46
+ return SAFE_METHOD_PREFIXES.some((prefix) => methodName.startsWith(prefix));
47
+ }
48
+ /**
49
+ * Walk ancestors to find an enclosing truthiness guard whose condition
50
+ * references the access's base expression — an `if (...)`, a `cond ? … : …`,
51
+ * or the left side of a `&&` chain (e.g. `if (candidates.length === 1 &&
52
+ * candidates[0]) { … candidates[0].bodyHash … }`).
53
+ *
54
+ * The line-local {@link SAFE_PATTERNS} scan only inspects the physical line
55
+ * of the access, so a guard placed on a *previous* line is missed. This
56
+ * closes that cross-line gap. Substring matching is intentionally lenient:
57
+ * the check errs toward treating a guarded access as safe (fewer false
58
+ * positives), consistent with the existing line-local guard handling.
59
+ */
60
+ export function isGuardedByEnclosingCondition(node, sourceFile) {
61
+ const baseText = node.expression.getText(sourceFile);
62
+ let current = node;
63
+ let parent = node.parent;
64
+ while (parent) {
65
+ if (ts.isIfStatement(parent) && parent.expression.getText(sourceFile).includes(baseText)) {
66
+ return true;
67
+ }
68
+ if (ts.isConditionalExpression(parent) &&
69
+ parent.condition.getText(sourceFile).includes(baseText)) {
70
+ return true;
71
+ }
72
+ if (ts.isBinaryExpression(parent) &&
73
+ parent.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken &&
74
+ parent.right === current &&
75
+ parent.left.getText(sourceFile).includes(baseText)) {
76
+ return true;
77
+ }
78
+ current = parent;
79
+ parent = parent.parent;
80
+ }
81
+ return false;
82
+ }
83
+ /**
84
+ * Check if a property access originates from `this`.
85
+ * Accessing properties on `this` is always safe — the object exists within its own methods.
86
+ */
87
+ export function isThisAccess(node) {
88
+ let current = node.expression;
89
+ while (ts.isCallExpression(current) || ts.isPropertyAccessExpression(current)) {
90
+ current = current.expression;
91
+ }
92
+ return current.kind === ts.SyntaxKind.ThisKeyword;
93
+ }
94
+ /**
95
+ * Count the depth of a method chain (number of chained property accesses / calls).
96
+ * e.g. `a.b().c().d` has depth 3.
97
+ */
98
+ export function getChainDepth(node) {
99
+ let depth = 0;
100
+ let current = node.expression;
101
+ while (ts.isCallExpression(current) || ts.isPropertyAccessExpression(current)) {
102
+ if (ts.isCallExpression(current)) {
103
+ depth++;
104
+ current = current.expression;
105
+ }
106
+ else {
107
+ current = current.expression;
108
+ }
109
+ }
110
+ return depth;
111
+ }
112
+ const SCHEMA_BUILDER_METHODS = new Set([
113
+ 'strict',
114
+ 'optional',
115
+ 'safeParse',
116
+ 'parse',
117
+ 'pipe',
118
+ 'superRefine',
119
+ 'catchall',
120
+ 'passthrough',
121
+ 'refine',
122
+ 'default',
123
+ 'transform',
124
+ ]);
125
+ function calleeRootEndsWithSchema(expr, sourceFile) {
126
+ let current = expr;
127
+ while (current) {
128
+ if (ts.isIdentifier(current)) {
129
+ return current.text.endsWith('Schema') || current.text === 'z';
130
+ }
131
+ if (ts.isPropertyAccessExpression(current)) {
132
+ if (current.expression.getText(sourceFile) === 'z')
133
+ return true;
134
+ current = current.expression;
135
+ continue;
136
+ }
137
+ if (ts.isCallExpression(current)) {
138
+ current = current.expression;
139
+ continue;
140
+ }
141
+ break;
142
+ }
143
+ return false;
144
+ }
145
+ function schemaBuilderCallMatches(call, sourceFile) {
146
+ const callee = call.expression;
147
+ if (ts.isPropertyAccessExpression(callee) &&
148
+ SCHEMA_BUILDER_METHODS.has(callee.name.text) &&
149
+ calleeRootEndsWithSchema(callee.expression, sourceFile)) {
150
+ return { matched: true, next: callee };
151
+ }
152
+ if (ts.isIdentifier(callee) &&
153
+ (callee.text.endsWith('Schema') || callee.text.endsWith('Namespace'))) {
154
+ return { matched: true, next: callee };
155
+ }
156
+ let next = callee;
157
+ if (ts.isPropertyAccessExpression(next))
158
+ next = next.expression;
159
+ return { matched: false, next };
160
+ }
161
+ /**
162
+ * Zod and project schema-builder chains (including `FooSchema.strict().safeParse`).
163
+ */
164
+ export function isSchemaBuilderChain(node, sourceFile) {
165
+ if (isZodBuilderChain(node, sourceFile))
166
+ return true;
167
+ let current = node.expression;
168
+ while (current) {
169
+ if (ts.isCallExpression(current)) {
170
+ const result = schemaBuilderCallMatches(current, sourceFile);
171
+ if (result.matched)
172
+ return true;
173
+ current = result.next;
174
+ continue;
175
+ }
176
+ if (ts.isIdentifier(current)) {
177
+ return current.text.endsWith('Schema');
178
+ }
179
+ break;
180
+ }
181
+ return false;
182
+ }
183
+ function isFunctionParameter(name, fn) {
184
+ return fn.parameters.some((p) => ts.isIdentifier(p.name) && p.name.text === name);
185
+ }
186
+ /**
187
+ * True when accessing `arr[i].prop` where `i` is a parameter of the enclosing
188
+ * callback (e.g. chunked POST `timeoutFor: (_chunk, i) => chunks[i].signals`).
189
+ */
190
+ export function isCallbackIndexGuarded(node, _sourceFile) {
191
+ const receiver = node.expression;
192
+ if (!ts.isElementAccessExpression(receiver))
193
+ return false;
194
+ const index = receiver.argumentExpression;
195
+ if (!index || !ts.isIdentifier(index))
196
+ return false;
197
+ const indexName = index.text;
198
+ let current = node.parent;
199
+ while (current) {
200
+ if ((ts.isArrowFunction(current) || ts.isFunctionExpression(current)) &&
201
+ isFunctionParameter(indexName, current))
202
+ return true;
203
+ if (ts.isFunctionDeclaration(current) && isFunctionParameter(indexName, current))
204
+ return true;
205
+ current = current.parent;
206
+ }
207
+ return false;
208
+ }
209
+ /**
210
+ * Check if a property access chain is on a Zod method call
211
+ * Handles chained calls like z.string().min(1).optional()
212
+ */
213
+ export function isZodBuilderChain(node, sourceFile) {
214
+ // Walk the full expression chain to find if it originates from z.xxx()
215
+ // Handles arbitrary depth: z.string().regex().optional().superRefine().pipe()
216
+ let current = node.expression;
217
+ while (current) {
218
+ if (ts.isCallExpression(current)) {
219
+ const result = checkZodCallExpression(current, sourceFile);
220
+ if (result.resolved)
221
+ return result.isZod;
222
+ current = result.next;
223
+ continue;
224
+ }
225
+ if (ts.isPropertyAccessExpression(current)) {
226
+ if (current.expression.getText(sourceFile) === 'z')
227
+ return true;
228
+ current = current.expression;
229
+ continue;
230
+ }
231
+ if (ts.isIdentifier(current)) {
232
+ return current.text === 'z';
233
+ }
234
+ break;
235
+ }
236
+ return false;
237
+ }
238
+ /** Check if a call expression callee originates from z.xxx() */
239
+ export function checkZodCallExpression(node, sourceFile) {
240
+ const callee = node.expression;
241
+ if (ts.isPropertyAccessExpression(callee)) {
242
+ if (callee.getText(sourceFile).startsWith('z.'))
243
+ return { resolved: true, isZod: true };
244
+ return { resolved: false, next: callee.expression };
245
+ }
246
+ if (ts.isIdentifier(callee)) {
247
+ return { resolved: true, isZod: callee.text === 'z' };
248
+ }
249
+ return { resolved: false, next: callee };
250
+ }
251
+ /**
252
+ * Check if a property access is part of a fluent API chain
253
+ * Handles patterns like promise.then().catch() or queryBuilder.where().orderBy()
254
+ */
255
+ export function isFluentChain(node) {
256
+ const expression = node.expression;
257
+ // Check if we're accessing a property on a call expression
258
+ if (!ts.isCallExpression(expression))
259
+ return false;
260
+ // Walk the chain — if ANY method in the chain is a known fluent method, the chain is safe
261
+ let current = expression;
262
+ while (ts.isCallExpression(current)) {
263
+ if (ts.isPropertyAccessExpression(current.expression)) {
264
+ const methodName = current.expression.name.text;
265
+ if (isSafeFluentMethod(methodName)) {
266
+ return true;
267
+ }
268
+ // Walk deeper into the chain
269
+ current = current.expression.expression;
270
+ continue;
271
+ }
272
+ break;
273
+ }
274
+ return false;
275
+ }
276
+ //# sourceMappingURL=null-safety-heuristics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"null-safety-heuristics.js","sourceRoot":"","sources":["../../../../src/checks/quality/data-integrity/null-safety-heuristics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Safe-by-construction call prefixes and fluent-method allowlists for null-safety.
3
+ */
4
+ /**
5
+ * Call prefixes whose results are non-null by construction, so a property
6
+ * access on them needs no guard. Scope is deliberately limited to facts that
7
+ * hold for ANY codebase.
8
+ */
9
+ export declare const SAFE_BUILDER_PREFIXES: string[];
10
+ /** Known safe method names in fluent APIs that always return `this` or non-null values. */
11
+ export declare const SAFE_FLUENT_METHOD_NAMES: readonly ["then", "catch", "finally", "map", "filter", "reduce", "flatMap", "forEach", "some", "every", "find", "findIndex", "findLast", "findLastIndex", "includes", "indexOf", "lastIndexOf", "at", "flat", "entries", "keys", "values", "slice", "concat", "sort", "reverse", "join", "push", "pop", "shift", "unshift", "fill", "trim", "trimStart", "trimEnd", "toLowerCase", "toUpperCase", "toLocaleLowerCase", "toLocaleUpperCase", "split", "replace", "replaceAll", "substring", "substr", "padStart", "padEnd", "charAt", "charCodeAt", "startsWith", "endsWith", "match", "search", "normalize", "repeat", "next", "toString", "json", "send", "status", "header", "type", "code", "where", "andWhere", "orWhere", "having", "orderBy", "addOrderBy", "groupBy", "addGroupBy", "select", "addSelect", "leftJoin", "leftJoinAndSelect", "innerJoin", "innerJoinAndSelect", "limit", "offset", "skip", "take", "getOne", "getMany", "getRawOne", "getRawMany", "execute", "mapErr", "andThen", "orElse", "unwrapOr", "match", "set", "with", "withId", "withCode", "withMessage", "withDetails", "withContext", "withCause", "build", "add", "remove", "update", "delete", "insert", "subscribe", "unsubscribe", "emit", "on", "off", "once", "child", "bindings", "level", "info", "warn", "error", "debug", "trace", "fatal", "notNull", "default", "references", "primaryKey", "unique", "$default", "$onUpdate", "from", "returning", "onConflictDoNothing", "onConflictDoUpdate", "rightJoin", "fullJoin", "run", "all", "get", "pluck", "iterate", "bind", "columns", "expand", "getLineAndCharacterOfPosition", "getText", "getStart", "getEnd", "getWidth", "getFullWidth", "getSourceFile", "getChildAt", "getChildren", "getFirstToken", "getLastToken", "forEachChild", "has", "clear", "size", "getInstance", "create", "of", "merge", "optsWithGlobals", "mergeWith", "toBe", "toEqual", "toStrictEqual", "toBeDefined", "toBeUndefined", "toBeNull", "toBeTruthy", "toBeFalsy", "toBeGreaterThan", "toBeGreaterThanOrEqual", "toBeLessThan", "toBeLessThanOrEqual", "toBeCloseTo", "toBeInstanceOf", "toBeNaN", "toContain", "toContainEqual", "toHaveLength", "toHaveProperty", "toHaveBeenCalled", "toHaveBeenCalledTimes", "toHaveBeenCalledWith", "toHaveBeenLastCalledWith", "toHaveBeenNthCalledWith", "toHaveReturned", "toHaveReturnedTimes", "toHaveReturnedWith", "toHaveLastReturnedWith", "toHaveNthReturnedWith", "toThrow", "toThrowError", "toMatch", "toMatchObject", "toMatchSnapshot", "toMatchInlineSnapshot", "resolves", "rejects", "not", "mockResolvedValue", "mockResolvedValueOnce", "mockRejectedValue", "mockRejectedValueOnce", "mockReturnValue", "mockReturnValueOnce", "mockImplementation", "mockImplementationOnce", "mockClear", "mockReset", "mockRestore", "mockReturnThis", "mockName", "update", "digest", "final", "unref", "ref", "kill", "format", "formatToParts", "resolvedOptions", "unwrapErr", "_unsafeUnwrap", "_unsafeUnwrapErr", "provideValue", "provideClass", "provideFactory", "provide", "$type", "command", "description", "option", "requiredOption", "action", "argument", "version", "name", "alias", "aliases", "addCommand", "addOption", "addArgument", "hook", "usage", "summary", "helpOption", "addHelpText", "showHelpAfterError", "showSuggestionAfterError", "exitOverride", "configureOutput", "configureHelp", "allowExcessArguments", "allowUnknownOption", "enablePositionalOptions", "passThroughOptions", "storeOptionsAsProperties", "copyInheritedSettings", "combineFlagAndOptionalValue"];
12
+ export declare function isSafeFluentMethod(methodName: string): boolean;
13
+ //# sourceMappingURL=null-safety-prefixes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"null-safety-prefixes.d.ts","sourceRoot":"","sources":["../../../../src/checks/quality/data-integrity/null-safety-prefixes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,UA0DjC,CAAC;AAEF,2FAA2F;AAC3F,eAAO,MAAM,wBAAwB,g4GAoQ3B,CAAC;AAEX,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE9D"}
@@ -0,0 +1,333 @@
1
+ /**
2
+ * Safe-by-construction call prefixes and fluent-method allowlists for null-safety.
3
+ */
4
+ /**
5
+ * Call prefixes whose results are non-null by construction, so a property
6
+ * access on them needs no guard. Scope is deliberately limited to facts that
7
+ * hold for ANY codebase.
8
+ */
9
+ export const SAFE_BUILDER_PREFIXES = [
10
+ // 1. Language / runtime guarantees
11
+ 'Object.entries',
12
+ 'Object.values',
13
+ 'Object.keys',
14
+ 'Object.assign',
15
+ 'Object.freeze',
16
+ 'Array.from',
17
+ 'Array.isArray',
18
+ 'String(',
19
+ 'Number(',
20
+ 'Boolean(',
21
+ 'Buffer.from',
22
+ 'JSON.stringify',
23
+ 'JSON.parse',
24
+ 'process.memoryUsage',
25
+ 'pathToFileURL(',
26
+ 'fileURLToPath(',
27
+ 'new URL(',
28
+ 'spawn(',
29
+ 'fork(',
30
+ 'createHash(',
31
+ 'createHmac(',
32
+ 'createCipheriv(',
33
+ 'createDecipheriv(',
34
+ 'new Intl.',
35
+ 'Intl.NumberFormat',
36
+ 'Intl.DateTimeFormat',
37
+ 'sourceFile.getLineAndCharacterOfPosition',
38
+ 'node.getText',
39
+ 'node.getStart',
40
+ 'node.getEnd',
41
+ 'node.getWidth',
42
+ 'node.getFullWidth',
43
+ 'window.matchMedia',
44
+ 'document.createElement',
45
+ 'document.createTextNode',
46
+ // 2. Common library builder / query APIs
47
+ 'z.',
48
+ 'createQueryBuilder',
49
+ 'getRepository',
50
+ 'EntityManager.',
51
+ 'queryBuilder.',
52
+ 'repository.',
53
+ 'Result.',
54
+ 'ResultAsync.',
55
+ 'prepare(',
56
+ 'drizzle(',
57
+ 'db.select',
58
+ 'db.insert',
59
+ 'db.update',
60
+ 'db.delete',
61
+ 'res.status',
62
+ 'response.status',
63
+ // 3. Generic builder-pattern conventions
64
+ 'builder.',
65
+ 'ResultBuilder.',
66
+ 'ScenarioResultBuilder.',
67
+ ];
68
+ /** Known safe method names in fluent APIs that always return `this` or non-null values. */
69
+ export const SAFE_FLUENT_METHOD_NAMES = [
70
+ 'then',
71
+ 'catch',
72
+ 'finally',
73
+ 'map',
74
+ 'filter',
75
+ 'reduce',
76
+ 'flatMap',
77
+ 'forEach',
78
+ 'some',
79
+ 'every',
80
+ 'find',
81
+ 'findIndex',
82
+ 'findLast',
83
+ 'findLastIndex',
84
+ 'includes',
85
+ 'indexOf',
86
+ 'lastIndexOf',
87
+ 'at',
88
+ 'flat',
89
+ 'entries',
90
+ 'keys',
91
+ 'values',
92
+ 'slice',
93
+ 'concat',
94
+ 'sort',
95
+ 'reverse',
96
+ 'join',
97
+ 'push',
98
+ 'pop',
99
+ 'shift',
100
+ 'unshift',
101
+ 'fill',
102
+ 'trim',
103
+ 'trimStart',
104
+ 'trimEnd',
105
+ 'toLowerCase',
106
+ 'toUpperCase',
107
+ 'toLocaleLowerCase',
108
+ 'toLocaleUpperCase',
109
+ 'split',
110
+ 'replace',
111
+ 'replaceAll',
112
+ 'substring',
113
+ 'substr',
114
+ 'padStart',
115
+ 'padEnd',
116
+ 'charAt',
117
+ 'charCodeAt',
118
+ 'startsWith',
119
+ 'endsWith',
120
+ 'match',
121
+ 'search',
122
+ 'normalize',
123
+ 'repeat',
124
+ 'next',
125
+ 'toString',
126
+ 'json',
127
+ 'send',
128
+ 'status',
129
+ 'header',
130
+ 'type',
131
+ 'code',
132
+ 'where',
133
+ 'andWhere',
134
+ 'orWhere',
135
+ 'having',
136
+ 'orderBy',
137
+ 'addOrderBy',
138
+ 'groupBy',
139
+ 'addGroupBy',
140
+ 'select',
141
+ 'addSelect',
142
+ 'leftJoin',
143
+ 'leftJoinAndSelect',
144
+ 'innerJoin',
145
+ 'innerJoinAndSelect',
146
+ 'limit',
147
+ 'offset',
148
+ 'skip',
149
+ 'take',
150
+ 'getOne',
151
+ 'getMany',
152
+ 'getRawOne',
153
+ 'getRawMany',
154
+ 'execute',
155
+ 'mapErr',
156
+ 'andThen',
157
+ 'orElse',
158
+ 'unwrapOr',
159
+ 'match',
160
+ 'set',
161
+ 'with',
162
+ 'withId',
163
+ 'withCode',
164
+ 'withMessage',
165
+ 'withDetails',
166
+ 'withContext',
167
+ 'withCause',
168
+ 'build',
169
+ 'add',
170
+ 'remove',
171
+ 'update',
172
+ 'delete',
173
+ 'insert',
174
+ 'subscribe',
175
+ 'unsubscribe',
176
+ 'emit',
177
+ 'on',
178
+ 'off',
179
+ 'once',
180
+ 'child',
181
+ 'bindings',
182
+ 'level',
183
+ 'info',
184
+ 'warn',
185
+ 'error',
186
+ 'debug',
187
+ 'trace',
188
+ 'fatal',
189
+ 'notNull',
190
+ 'default',
191
+ 'references',
192
+ 'primaryKey',
193
+ 'unique',
194
+ '$default',
195
+ '$onUpdate',
196
+ 'from',
197
+ 'returning',
198
+ 'onConflictDoNothing',
199
+ 'onConflictDoUpdate',
200
+ 'rightJoin',
201
+ 'fullJoin',
202
+ 'run',
203
+ 'all',
204
+ 'get',
205
+ 'pluck',
206
+ 'iterate',
207
+ 'bind',
208
+ 'columns',
209
+ 'expand',
210
+ 'getLineAndCharacterOfPosition',
211
+ 'getText',
212
+ 'getStart',
213
+ 'getEnd',
214
+ 'getWidth',
215
+ 'getFullWidth',
216
+ 'getSourceFile',
217
+ 'getChildAt',
218
+ 'getChildren',
219
+ 'getFirstToken',
220
+ 'getLastToken',
221
+ 'forEachChild',
222
+ 'has',
223
+ 'clear',
224
+ 'size',
225
+ 'getInstance',
226
+ 'create',
227
+ 'of',
228
+ 'merge',
229
+ 'optsWithGlobals',
230
+ 'mergeWith',
231
+ 'toBe',
232
+ 'toEqual',
233
+ 'toStrictEqual',
234
+ 'toBeDefined',
235
+ 'toBeUndefined',
236
+ 'toBeNull',
237
+ 'toBeTruthy',
238
+ 'toBeFalsy',
239
+ 'toBeGreaterThan',
240
+ 'toBeGreaterThanOrEqual',
241
+ 'toBeLessThan',
242
+ 'toBeLessThanOrEqual',
243
+ 'toBeCloseTo',
244
+ 'toBeInstanceOf',
245
+ 'toBeNaN',
246
+ 'toContain',
247
+ 'toContainEqual',
248
+ 'toHaveLength',
249
+ 'toHaveProperty',
250
+ 'toHaveBeenCalled',
251
+ 'toHaveBeenCalledTimes',
252
+ 'toHaveBeenCalledWith',
253
+ 'toHaveBeenLastCalledWith',
254
+ 'toHaveBeenNthCalledWith',
255
+ 'toHaveReturned',
256
+ 'toHaveReturnedTimes',
257
+ 'toHaveReturnedWith',
258
+ 'toHaveLastReturnedWith',
259
+ 'toHaveNthReturnedWith',
260
+ 'toThrow',
261
+ 'toThrowError',
262
+ 'toMatch',
263
+ 'toMatchObject',
264
+ 'toMatchSnapshot',
265
+ 'toMatchInlineSnapshot',
266
+ 'resolves',
267
+ 'rejects',
268
+ 'not',
269
+ 'mockResolvedValue',
270
+ 'mockResolvedValueOnce',
271
+ 'mockRejectedValue',
272
+ 'mockRejectedValueOnce',
273
+ 'mockReturnValue',
274
+ 'mockReturnValueOnce',
275
+ 'mockImplementation',
276
+ 'mockImplementationOnce',
277
+ 'mockClear',
278
+ 'mockReset',
279
+ 'mockRestore',
280
+ 'mockReturnThis',
281
+ 'mockName',
282
+ 'update',
283
+ 'digest',
284
+ 'final',
285
+ 'unref',
286
+ 'ref',
287
+ 'kill',
288
+ 'format',
289
+ 'formatToParts',
290
+ 'resolvedOptions',
291
+ 'unwrapErr',
292
+ '_unsafeUnwrap',
293
+ '_unsafeUnwrapErr',
294
+ 'provideValue',
295
+ 'provideClass',
296
+ 'provideFactory',
297
+ 'provide',
298
+ '$type',
299
+ 'command',
300
+ 'description',
301
+ 'option',
302
+ 'requiredOption',
303
+ 'action',
304
+ 'argument',
305
+ 'version',
306
+ 'name',
307
+ 'alias',
308
+ 'aliases',
309
+ 'addCommand',
310
+ 'addOption',
311
+ 'addArgument',
312
+ 'hook',
313
+ 'usage',
314
+ 'summary',
315
+ 'helpOption',
316
+ 'addHelpText',
317
+ 'showHelpAfterError',
318
+ 'showSuggestionAfterError',
319
+ 'exitOverride',
320
+ 'configureOutput',
321
+ 'configureHelp',
322
+ 'allowExcessArguments',
323
+ 'allowUnknownOption',
324
+ 'enablePositionalOptions',
325
+ 'passThroughOptions',
326
+ 'storeOptionsAsProperties',
327
+ 'copyInheritedSettings',
328
+ 'combineFlagAndOptionalValue',
329
+ ];
330
+ export function isSafeFluentMethod(methodName) {
331
+ return SAFE_FLUENT_METHOD_NAMES.includes(methodName);
332
+ }
333
+ //# sourceMappingURL=null-safety-prefixes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"null-safety-prefixes.js","sourceRoot":"","sources":["../../../../src/checks/quality/data-integrity/null-safety-prefixes.ts"],"names":[],"mappings":"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"}