field-redactor 1.2.0 → 1.6.0

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 (279) hide show
  1. package/.github/workflows/ci.yml +38 -0
  2. package/CHANGELOG.md +179 -0
  3. package/CONTRIBUTING.md +64 -0
  4. package/README.md +67 -670
  5. package/dist/api/fieldRedactor.d.ts +53 -0
  6. package/dist/api/fieldRedactor.d.ts.map +1 -0
  7. package/dist/api/fieldRedactor.js +169 -0
  8. package/dist/api/fieldRedactor.js.map +1 -0
  9. package/dist/api/fieldRedactorConfigBuilder.d.ts +57 -0
  10. package/dist/api/fieldRedactorConfigBuilder.d.ts.map +1 -0
  11. package/dist/api/fieldRedactorConfigBuilder.js +115 -0
  12. package/dist/api/fieldRedactorConfigBuilder.js.map +1 -0
  13. package/dist/api/fieldRedactorDeps.d.ts +19 -0
  14. package/dist/api/fieldRedactorDeps.d.ts.map +1 -0
  15. package/dist/api/fieldRedactorDeps.js +45 -0
  16. package/dist/api/fieldRedactorDeps.js.map +1 -0
  17. package/dist/arrayRedaction.d.ts +12 -0
  18. package/dist/arrayRedaction.d.ts.map +1 -0
  19. package/dist/arrayRedaction.js +70 -0
  20. package/dist/arrayRedaction.js.map +1 -0
  21. package/dist/config/configValidator.d.ts +9 -0
  22. package/dist/config/configValidator.d.ts.map +1 -0
  23. package/dist/config/configValidator.js +77 -0
  24. package/dist/config/configValidator.js.map +1 -0
  25. package/dist/config/customObjectSchemas.d.ts +7 -0
  26. package/dist/config/customObjectSchemas.d.ts.map +1 -0
  27. package/dist/config/customObjectSchemas.js +35 -0
  28. package/dist/config/customObjectSchemas.js.map +1 -0
  29. package/dist/config/presets.d.ts +22 -0
  30. package/dist/config/presets.d.ts.map +1 -0
  31. package/dist/config/presets.js +50 -0
  32. package/dist/config/presets.js.map +1 -0
  33. package/dist/config/redactionRules.d.ts +25 -0
  34. package/dist/config/redactionRules.d.ts.map +1 -0
  35. package/dist/config/redactionRules.js +108 -0
  36. package/dist/config/redactionRules.js.map +1 -0
  37. package/dist/configValidator.d.ts +9 -0
  38. package/dist/configValidator.d.ts.map +1 -0
  39. package/dist/configValidator.js +77 -0
  40. package/dist/configValidator.js.map +1 -0
  41. package/dist/copyOnWriteHelpers.d.ts +20 -0
  42. package/dist/copyOnWriteHelpers.d.ts.map +1 -0
  43. package/dist/copyOnWriteHelpers.js +58 -0
  44. package/dist/copyOnWriteHelpers.js.map +1 -0
  45. package/dist/customObjectFieldHandler.d.ts +21 -0
  46. package/dist/customObjectFieldHandler.d.ts.map +1 -0
  47. package/dist/customObjectFieldHandler.js +159 -0
  48. package/dist/customObjectFieldHandler.js.map +1 -0
  49. package/dist/customObjectManager.d.ts +14 -8
  50. package/dist/customObjectManager.d.ts.map +1 -1
  51. package/dist/customObjectManager.js +31 -30
  52. package/dist/customObjectManager.js.map +1 -1
  53. package/dist/customObjectSchemas.d.ts +7 -0
  54. package/dist/customObjectSchemas.d.ts.map +1 -0
  55. package/dist/customObjectSchemas.js +35 -0
  56. package/dist/customObjectSchemas.js.map +1 -0
  57. package/dist/dryRun.d.ts +9 -0
  58. package/dist/dryRun.d.ts.map +1 -0
  59. package/dist/dryRun.js +75 -0
  60. package/dist/dryRun.js.map +1 -0
  61. package/dist/dryRunAttribution.d.ts +10 -0
  62. package/dist/dryRunAttribution.d.ts.map +1 -0
  63. package/dist/dryRunAttribution.js +14 -0
  64. package/dist/dryRunAttribution.js.map +1 -0
  65. package/dist/dryrun/dryRun.d.ts +9 -0
  66. package/dist/dryrun/dryRun.d.ts.map +1 -0
  67. package/dist/dryrun/dryRun.js +75 -0
  68. package/dist/dryrun/dryRun.js.map +1 -0
  69. package/dist/dryrun/dryRunAttribution.d.ts +10 -0
  70. package/dist/dryrun/dryRunAttribution.d.ts.map +1 -0
  71. package/dist/dryrun/dryRunAttribution.js +14 -0
  72. package/dist/dryrun/dryRunAttribution.js.map +1 -0
  73. package/dist/engine/arrayRedaction.d.ts +12 -0
  74. package/dist/engine/arrayRedaction.d.ts.map +1 -0
  75. package/dist/engine/arrayRedaction.js +70 -0
  76. package/dist/engine/arrayRedaction.js.map +1 -0
  77. package/dist/engine/customObjectFieldHandler.d.ts +35 -0
  78. package/dist/engine/customObjectFieldHandler.d.ts.map +1 -0
  79. package/dist/engine/customObjectFieldHandler.js +167 -0
  80. package/dist/engine/customObjectFieldHandler.js.map +1 -0
  81. package/dist/engine/objectRedactor.d.ts +18 -0
  82. package/dist/engine/objectRedactor.d.ts.map +1 -0
  83. package/dist/engine/objectRedactor.js +38 -0
  84. package/dist/engine/objectRedactor.js.map +1 -0
  85. package/dist/engine/objectRedactorCustomObject.d.ts +27 -0
  86. package/dist/engine/objectRedactorCustomObject.d.ts.map +1 -0
  87. package/dist/engine/objectRedactorCustomObject.js +54 -0
  88. package/dist/engine/objectRedactorCustomObject.js.map +1 -0
  89. package/dist/engine/objectRedactorHelpers.d.ts +9 -0
  90. package/dist/engine/objectRedactorHelpers.d.ts.map +1 -0
  91. package/dist/engine/objectRedactorHelpers.js +61 -0
  92. package/dist/engine/objectRedactorHelpers.js.map +1 -0
  93. package/dist/engine/objectRedactorMutation.d.ts +10 -0
  94. package/dist/engine/objectRedactorMutation.d.ts.map +1 -0
  95. package/dist/engine/objectRedactorMutation.js +89 -0
  96. package/dist/engine/objectRedactorMutation.js.map +1 -0
  97. package/dist/engine/objectRedactorSync.d.ts +2 -0
  98. package/dist/engine/objectRedactorSync.d.ts.map +1 -0
  99. package/dist/engine/objectRedactorSync.js +7 -0
  100. package/dist/engine/objectRedactorSync.js.map +1 -0
  101. package/dist/engine/objectRedactorTraversal.d.ts +41 -0
  102. package/dist/engine/objectRedactorTraversal.d.ts.map +1 -0
  103. package/dist/engine/objectRedactorTraversal.js +201 -0
  104. package/dist/engine/objectRedactorTraversal.js.map +1 -0
  105. package/dist/engine/primitiveRedactor.d.ts +33 -0
  106. package/dist/engine/primitiveRedactor.d.ts.map +1 -0
  107. package/dist/engine/primitiveRedactor.js +75 -0
  108. package/dist/engine/primitiveRedactor.js.map +1 -0
  109. package/dist/engine/traversalServices.d.ts +21 -0
  110. package/dist/engine/traversalServices.d.ts.map +1 -0
  111. package/dist/engine/traversalServices.js +3 -0
  112. package/dist/engine/traversalServices.js.map +1 -0
  113. package/dist/fieldDisposition.d.ts +3 -0
  114. package/dist/fieldDisposition.d.ts.map +1 -0
  115. package/dist/fieldDisposition.js +6 -0
  116. package/dist/fieldDisposition.js.map +1 -0
  117. package/dist/fieldRedactor.d.ts +34 -11
  118. package/dist/fieldRedactor.d.ts.map +1 -1
  119. package/dist/fieldRedactor.js +116 -35
  120. package/dist/fieldRedactor.js.map +1 -1
  121. package/dist/fieldRedactorConfigBuilder.d.ts +55 -0
  122. package/dist/fieldRedactorConfigBuilder.d.ts.map +1 -0
  123. package/dist/fieldRedactorConfigBuilder.js +111 -0
  124. package/dist/fieldRedactorConfigBuilder.js.map +1 -0
  125. package/dist/fieldRedactorDeps.d.ts +19 -0
  126. package/dist/fieldRedactorDeps.d.ts.map +1 -0
  127. package/dist/fieldRedactorDeps.js +43 -0
  128. package/dist/fieldRedactorDeps.js.map +1 -0
  129. package/dist/index.d.ts +8 -2
  130. package/dist/index.d.ts.map +1 -1
  131. package/dist/index.js +15 -2
  132. package/dist/index.js.map +1 -1
  133. package/dist/jsonWalk.d.ts +11 -0
  134. package/dist/jsonWalk.d.ts.map +1 -0
  135. package/dist/jsonWalk.js +55 -0
  136. package/dist/jsonWalk.js.map +1 -0
  137. package/dist/maybeAsync.d.ts +7 -0
  138. package/dist/maybeAsync.d.ts.map +1 -0
  139. package/dist/maybeAsync.js +56 -0
  140. package/dist/maybeAsync.js.map +1 -0
  141. package/dist/objectRedactor.d.ts +10 -34
  142. package/dist/objectRedactor.d.ts.map +1 -1
  143. package/dist/objectRedactor.js +11 -298
  144. package/dist/objectRedactor.js.map +1 -1
  145. package/dist/objectRedactorCow.d.ts +35 -0
  146. package/dist/objectRedactorCow.d.ts.map +1 -0
  147. package/dist/objectRedactorCow.js +300 -0
  148. package/dist/objectRedactorCow.js.map +1 -0
  149. package/dist/objectRedactorCustomObject.d.ts +28 -0
  150. package/dist/objectRedactorCustomObject.d.ts.map +1 -0
  151. package/dist/objectRedactorCustomObject.js +57 -0
  152. package/dist/objectRedactorCustomObject.js.map +1 -0
  153. package/dist/objectRedactorHelpers.d.ts +9 -0
  154. package/dist/objectRedactorHelpers.d.ts.map +1 -0
  155. package/dist/objectRedactorHelpers.js +61 -0
  156. package/dist/objectRedactorHelpers.js.map +1 -0
  157. package/dist/objectRedactorMutation.d.ts +10 -0
  158. package/dist/objectRedactorMutation.d.ts.map +1 -0
  159. package/dist/objectRedactorMutation.js +89 -0
  160. package/dist/objectRedactorMutation.js.map +1 -0
  161. package/dist/objectRedactorSync.d.ts +2 -0
  162. package/dist/objectRedactorSync.d.ts.map +1 -0
  163. package/dist/objectRedactorSync.js +7 -0
  164. package/dist/objectRedactorSync.js.map +1 -0
  165. package/dist/objectRedactorTraversal.d.ts +41 -0
  166. package/dist/objectRedactorTraversal.d.ts.map +1 -0
  167. package/dist/objectRedactorTraversal.js +201 -0
  168. package/dist/objectRedactorTraversal.js.map +1 -0
  169. package/dist/pathParsing.d.ts +11 -0
  170. package/dist/pathParsing.d.ts.map +1 -0
  171. package/dist/pathParsing.js +53 -0
  172. package/dist/pathParsing.js.map +1 -0
  173. package/dist/pathRuleMatcher.d.ts +19 -0
  174. package/dist/pathRuleMatcher.d.ts.map +1 -0
  175. package/dist/pathRuleMatcher.js +42 -0
  176. package/dist/pathRuleMatcher.js.map +1 -0
  177. package/dist/presets.d.ts +22 -0
  178. package/dist/presets.d.ts.map +1 -0
  179. package/dist/presets.js +50 -0
  180. package/dist/presets.js.map +1 -0
  181. package/dist/primitiveRedactor.d.ts +13 -8
  182. package/dist/primitiveRedactor.d.ts.map +1 -1
  183. package/dist/primitiveRedactor.js +32 -27
  184. package/dist/primitiveRedactor.js.map +1 -1
  185. package/dist/redactionRules.d.ts +22 -0
  186. package/dist/redactionRules.d.ts.map +1 -0
  187. package/dist/redactionRules.js +74 -0
  188. package/dist/redactionRules.js.map +1 -0
  189. package/dist/regexUtils.d.ts +3 -0
  190. package/dist/regexUtils.d.ts.map +1 -0
  191. package/dist/regexUtils.js +8 -0
  192. package/dist/regexUtils.js.map +1 -0
  193. package/dist/ruleResolver.d.ts +65 -0
  194. package/dist/ruleResolver.d.ts.map +1 -0
  195. package/dist/ruleResolver.js +193 -0
  196. package/dist/ruleResolver.js.map +1 -0
  197. package/dist/rules/customObjectManager.d.ts +28 -0
  198. package/dist/rules/customObjectManager.d.ts.map +1 -0
  199. package/dist/rules/customObjectManager.js +60 -0
  200. package/dist/rules/customObjectManager.js.map +1 -0
  201. package/dist/rules/fieldDisposition.d.ts +3 -0
  202. package/dist/rules/fieldDisposition.d.ts.map +1 -0
  203. package/dist/rules/fieldDisposition.js +6 -0
  204. package/dist/rules/fieldDisposition.js.map +1 -0
  205. package/dist/rules/pathRuleMatcher.d.ts +19 -0
  206. package/dist/rules/pathRuleMatcher.d.ts.map +1 -0
  207. package/dist/rules/pathRuleMatcher.js +40 -0
  208. package/dist/rules/pathRuleMatcher.js.map +1 -0
  209. package/dist/rules/ruleResolver.d.ts +65 -0
  210. package/dist/rules/ruleResolver.d.ts.map +1 -0
  211. package/dist/rules/ruleResolver.js +194 -0
  212. package/dist/rules/ruleResolver.js.map +1 -0
  213. package/dist/rules/secretManager.d.ts +32 -0
  214. package/dist/rules/secretManager.d.ts.map +1 -0
  215. package/dist/rules/secretManager.js +85 -0
  216. package/dist/rules/secretManager.js.map +1 -0
  217. package/dist/rules/valuePatternMatcher.d.ts +15 -0
  218. package/dist/rules/valuePatternMatcher.d.ts.map +1 -0
  219. package/dist/rules/valuePatternMatcher.js +30 -0
  220. package/dist/rules/valuePatternMatcher.js.map +1 -0
  221. package/dist/secretManager.d.ts +17 -24
  222. package/dist/secretManager.d.ts.map +1 -1
  223. package/dist/secretManager.js +47 -32
  224. package/dist/secretManager.js.map +1 -1
  225. package/dist/traversalServices.d.ts +21 -0
  226. package/dist/traversalServices.d.ts.map +1 -0
  227. package/dist/traversalServices.js +3 -0
  228. package/dist/traversalServices.js.map +1 -0
  229. package/dist/types.d.ts +139 -2
  230. package/dist/types.d.ts.map +1 -1
  231. package/dist/types.js +14 -1
  232. package/dist/types.js.map +1 -1
  233. package/dist/util/jsonWalk.d.ts +10 -0
  234. package/dist/util/jsonWalk.d.ts.map +1 -0
  235. package/dist/util/jsonWalk.js +53 -0
  236. package/dist/util/jsonWalk.js.map +1 -0
  237. package/dist/util/maybeAsync.d.ts +7 -0
  238. package/dist/util/maybeAsync.d.ts.map +1 -0
  239. package/dist/util/maybeAsync.js +56 -0
  240. package/dist/util/maybeAsync.js.map +1 -0
  241. package/dist/util/pathParsing.d.ts +11 -0
  242. package/dist/util/pathParsing.d.ts.map +1 -0
  243. package/dist/util/pathParsing.js +53 -0
  244. package/dist/util/pathParsing.js.map +1 -0
  245. package/dist/util/regexUtils.d.ts +3 -0
  246. package/dist/util/regexUtils.d.ts.map +1 -0
  247. package/dist/util/regexUtils.js +8 -0
  248. package/dist/util/regexUtils.js.map +1 -0
  249. package/dist/valuePatternMatcher.d.ts +15 -0
  250. package/dist/valuePatternMatcher.d.ts.map +1 -0
  251. package/dist/valuePatternMatcher.js +30 -0
  252. package/dist/valuePatternMatcher.js.map +1 -0
  253. package/docs/guides/anti-patterns.md +107 -0
  254. package/docs/guides/metadata-redaction.md +112 -0
  255. package/docs/guides/migration-1.2-to-1.5.md +106 -0
  256. package/docs/guides/migration-1.5-to-1.6.md +56 -0
  257. package/docs/guides/path-rules.md +47 -0
  258. package/docs/guides/secret-key-modes.md +108 -0
  259. package/docs/guides/value-pattern-redaction.md +58 -0
  260. package/docs/reference/config.md +139 -0
  261. package/docs/release-notes/2.0.0.md +19 -0
  262. package/docs/release-notes/2.1.0.md +17 -0
  263. package/docs/release-notes/2.2.0.md +16 -0
  264. package/docs/release-notes/2.3.0.md +17 -0
  265. package/docs/release-notes/2.3.1.md +17 -0
  266. package/docs/release-notes/2.4.0.md +30 -0
  267. package/docs/release-notes/2.5.0.md +33 -0
  268. package/docs/release-notes/2.5.1.md +17 -0
  269. package/docs/release-notes/README.md +32 -0
  270. package/docs/release-notes/v1.0.0.md +17 -0
  271. package/docs/release-notes/v1.1.0.md +18 -0
  272. package/docs/release-notes/v1.2.0.md +18 -0
  273. package/docs/release-notes/v1.2.1.md +16 -0
  274. package/docs/release-notes/v1.2.2.md +19 -0
  275. package/docs/release-notes/v1.3.0.md +112 -0
  276. package/docs/release-notes/v1.5.0.md +88 -0
  277. package/docs/release-notes/v1.6.0.md +59 -0
  278. package/jest.config.js +6 -1
  279. package/package.json +8 -2
@@ -0,0 +1,38 @@
1
+ # Build and test on push/PR. Intentionally minimal permissions and no secrets.
2
+ name: CI
3
+
4
+ on:
5
+ push:
6
+ branches: [master, main]
7
+ pull_request:
8
+
9
+ # Default GITHUB_TOKEN is read-only; no packages, deployments, or repo writes.
10
+ permissions:
11
+ contents: read
12
+
13
+ concurrency:
14
+ group: ci-${{ github.workflow }}-${{ github.ref }}
15
+ cancel-in-progress: true
16
+
17
+ jobs:
18
+ build-and-test:
19
+ runs-on: ubuntu-latest
20
+ timeout-minutes: 15
21
+ steps:
22
+ - name: Checkout
23
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
24
+
25
+ - name: Setup Node.js
26
+ uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
27
+ with:
28
+ node-version-file: .nvmrc
29
+ cache: yarn
30
+
31
+ - name: Install dependencies
32
+ run: yarn install --frozen-lockfile --non-interactive
33
+
34
+ - name: Build
35
+ run: yarn build
36
+
37
+ - name: Test
38
+ run: yarn test
package/CHANGELOG.md ADDED
@@ -0,0 +1,179 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project are documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [1.6.0] - 2026-07-21
9
+
10
+ Path rules, pass-key allowlists, Opaque/Remove naming aliases, and architecture cleanup. See [docs/release-notes/v1.6.0.md](docs/release-notes/v1.6.0.md) and [docs/guides/migration-1.5-to-1.6.md](docs/guides/migration-1.5-to-1.6.md).
11
+
12
+ ### Added
13
+
14
+ - **`pathRules` / `.pathRule()`** — path-based redaction modes (`shallow`, `deep`, `opaque`, `remove`, `pass`) with `*` wildcards.
15
+ - **`passKeys` / `.passKey()`** — allowlisted keys preserved under deep parents.
16
+ - **Naming aliases** — `opaqueSecretKeys`, `removeSecretKeys`, `CustomObjectMatchType.Opaque` / `Remove` (legacy `full`/`delete` names retained).
17
+ - **`RedactionMode`**, **`PathRule`**, **`PathRuleMode`** exports.
18
+ - **`RuleResolver`** — shared precedence for traversal and dry-run attribution.
19
+ - **Path rules guide** — [docs/guides/path-rules.md](docs/guides/path-rules.md).
20
+ - **Migration guide** — [docs/guides/migration-1.5-to-1.6.md](docs/guides/migration-1.5-to-1.6.md).
21
+ - **Contributing guide** — [CONTRIBUTING.md](CONTRIBUTING.md).
22
+
23
+ ### Changed
24
+
25
+ - Source layout under `api/`, `engine/`, `rules/`, `dryrun/`, `config/`, `util/`.
26
+ - Unified sync/async traversal behind `MaybeAsync` helpers.
27
+ - `package.json` `"exports"` limited to the package root (`.`).
28
+ - Internal sync-traversal alias removed (`ObjectRedactorSyncTraversal`).
29
+
30
+ ## [1.5.0] - 2026-06-24
31
+
32
+ Published npm release bundling **v1.2.1**–**v1.3.0** git work and former internal milestones **2.4.0**–**2.5.1**. See [docs/guides/migration-1.2-to-1.5.md](docs/guides/migration-1.2-to-1.5.md) when upgrading from npm **1.2.x**.
33
+
34
+ ### Added
35
+
36
+ - **`FieldRedactorConfigBuilder.usePreset()`** — merge preset or partial config into the builder; regex/schemas accumulate, scalars apply only when unset.
37
+ - **`dryRun` path rule attribution** — `report.pathRules` explains which rule (`schema`, `opaque`, `deep`, `remove`, `shallow`, `value`, `default`) caused each redacted or deleted path, with optional regex `pattern` and schema metadata.
38
+ - **Value-pattern redaction** — opt-in `valuePatterns` redacts scalars when their string form matches a regex, regardless of key name; lowest precedence after key and schema rules.
39
+ - **`FieldRedactorConfigBuilder.valuePattern()`** — fluent builder support for value patterns.
40
+ - **Anti-patterns guide** — [docs/guides/anti-patterns.md](docs/guides/anti-patterns.md).
41
+ - **Value-pattern guide** — [docs/guides/value-pattern-redaction.md](docs/guides/value-pattern-redaction.md).
42
+ - **Migration guide** — [docs/guides/migration-1.2-to-1.5.md](docs/guides/migration-1.2-to-1.5.md).
43
+ - **Exported types** — `DryRunPathRule`, `RedactionRuleLabel`, `MatchedSchemaReport`.
44
+ - **Release notes** — see [docs/release-notes/v1.5.0.md](docs/release-notes/v1.5.0.md).
45
+
46
+ ### Changed
47
+
48
+ - **Unified JSON traversal** — `ObjectRedactorTraversal` handles sync in-place, copy-on-write, and async in-place redaction via a shared `ContainerMutation` adapter.
49
+ - **Shared custom-object handlers** — match-type dispatch consolidated in `objectRedactorCustomObject.ts`.
50
+ - Config validator duplicate-regex warnings apply across key-rule fields only (not between `secretKeys` and `valuePatterns`).
51
+ - Internal refactor: `fieldRedactorDeps`, `regexUtils`, dry-run attribution resolvers, shared test helpers.
52
+ - Git tags `2.0.0`–`2.5.1` removed; development milestones are consolidated under this release.
53
+
54
+ ### Fixed
55
+
56
+ - Async in-place redaction uses the same traversal adapter as sync, aligning nested object and array behavior across modes.
57
+
58
+ ## [2.5.1] - 2026-06-24 (internal milestone — included in 1.5.0)
59
+
60
+ ### Changed
61
+
62
+ - **Unified JSON traversal** — `ObjectRedactorTraversal` handles sync in-place, copy-on-write, and async in-place redaction via a shared `ContainerMutation` adapter; `ObjectRedactor` is now a thin orchestrator.
63
+ - **Shared custom-object handlers** — match-type dispatch consolidated in `objectRedactorCustomObject.ts` for sync and async paths.
64
+ - **Release notes** — see [docs/release-notes/2.5.1.md](docs/release-notes/2.5.1.md).
65
+
66
+ ### Fixed
67
+
68
+ - Async in-place redaction uses the same traversal adapter as sync, aligning nested object and array behavior across modes.
69
+
70
+ ## [2.5.0] - 2026-06-24 (internal milestone — included in 1.5.0)
71
+
72
+ ### Added
73
+
74
+ - **Value-pattern redaction** — opt-in `valuePatterns` redacts scalars when their string form matches a regex, regardless of key name; lowest precedence after key and schema rules.
75
+ - **`FieldRedactorConfigBuilder.valuePattern()`** — fluent builder support for value patterns.
76
+ - **`dryRun` value attribution** — `report.pathRules` includes `rule: 'value'` with the matching pattern.
77
+ - **Value-pattern guide** — [docs/guides/value-pattern-redaction.md](docs/guides/value-pattern-redaction.md).
78
+ - **Release notes** — see [docs/release-notes/2.5.0.md](docs/release-notes/2.5.0.md).
79
+
80
+ ### Changed
81
+
82
+ - Config validator duplicate-regex warnings apply across key-rule fields only (not between `secretKeys` and `valuePatterns`, which match different targets).
83
+ - Internal refactor: `fieldRedactorDeps`, `regexUtils`, dry-run attribution resolvers, shared test helpers.
84
+
85
+ ### Internal milestones (`2.x` tags)
86
+
87
+ Superseded by **v1.5.0** npm release. See [docs/release-notes/v1.5.0.md](docs/release-notes/v1.5.0.md).
88
+
89
+ ## [2.4.0] - 2026-06-24 (internal milestone — included in 1.5.0)
90
+
91
+ ### Added
92
+
93
+ - **`FieldRedactorConfigBuilder.usePreset()`** — merge preset or partial config into the builder; regex/schemas accumulate, scalars apply only when unset.
94
+ - **`dryRun` path rule attribution** — `report.pathRules` explains which rule (`schema`, `opaque`, `deep`, `remove`, `shallow`, `default`) caused each redacted or deleted path, with optional regex `pattern` and schema metadata.
95
+ - **Anti-patterns guide** — [docs/guides/anti-patterns.md](docs/guides/anti-patterns.md) for common configuration mistakes.
96
+ - **Exported types** — `DryRunPathRule`, `RedactionRuleLabel`, `MatchedSchemaReport`.
97
+ - **Release notes** — see [docs/release-notes/2.4.0.md](docs/release-notes/2.4.0.md).
98
+
99
+ ### Internal milestones (`2.x` tags)
100
+
101
+ Superseded by **v1.5.0** npm release. See [docs/release-notes/v1.5.0.md](docs/release-notes/v1.5.0.md).
102
+
103
+ ## [1.3.0] - 2026-06-24
104
+
105
+ ### Added
106
+
107
+ - **Sync redaction API** — `redactSync()`, `redactInPlaceSync()`, and `syncRedactor` config option for redaction without per-field `Promise` overhead.
108
+ - **Copy-on-write redaction** — `redact()` and `redactSync()` use structural sharing by default (`cloneInput: true`); only mutated branches are cloned. Set `cloneInput: false` to mutate in place.
109
+ - **`FieldRedactor.createSafe()`** — factory that requires at least one explicit redaction rule and throws `FieldRedactorConfigurationError` otherwise.
110
+ - **`FieldRedactorConfigBuilder`** — fluent builder mapping doc labels (Shallow, Deep, Opaque, Remove, Schema) to config fields; `build()`, `buildRedactor()`, and `buildSafeRedactor()`.
111
+ - **`dryRun()` / `dryRunSync()`** — redact a snapshot and return `{ result, report }` with `redactedPaths`, `deletedPaths`, and `matchedSchemas` (optional `schemaName` when schemas are named via the builder).
112
+ - **Configuration validation** — `validateFieldRedactorConfig()`, `hasExplicitRedactionRules()`, `configWarnings` on instances, `strict` and `onConfigWarning` options.
113
+ - **Presets** — `presets.loggingMetadata()`, `presets.applicationLogging()`, and `presets.keyValueEntries()` derived from integration test fixtures.
114
+ - **Documentation** — split into `docs/guides/` (secret key modes, metadata redaction) and `docs/reference/config.md`; README quickstart and decision guide.
115
+ - **Release notes** — see [docs/release-notes/v1.3.0.md](docs/release-notes/v1.3.0.md).
116
+
117
+ ### Internal milestones (`2.x` tags)
118
+
119
+ Development tags `2.0.0`–`2.3.1` track incremental work toward `1.3.0`. See [docs/release-notes/README.md](docs/release-notes/README.md).
120
+
121
+ ### Changed
122
+
123
+ - Default `redact()` / `redactSync()` behavior now uses copy-on-write instead of a full deep clone of the input. The input is still not mutated unless `cloneInput: false`.
124
+ - Documentation and JSDoc adopt conceptual labels (Shallow, Deep, Opaque, Remove, Schema) alongside existing config field names.
125
+
126
+ ### Fixed
127
+
128
+ - Internal sync and copy-on-write traversal unified behind a shared `ContainerMutation` layer (correctness and maintainability).
129
+
130
+ ## [1.2.2] - 2026-06-24
131
+
132
+ ### Added
133
+
134
+ - Export `FieldRedactorError` and `FieldRedactorConfigurationError` from the public API.
135
+
136
+ ### Changed
137
+
138
+ - Replace heavy `any` usage with explicit JSON and redaction types (`JsonValue`, `RedactableInput`, generic `redact<T>()`, etc.).
139
+
140
+ ## [1.2.1] - 2026-06-24
141
+
142
+ ### Changed
143
+
144
+ - Relax custom object schema matching: objects match when they contain every schema key; extra keys on the input are allowed.
145
+
146
+ ### Fixed
147
+
148
+ - Sibling-key custom object redaction for falsy values (`""`, `0`, `false`) when the sibling key is present.
149
+ - `ignoreBooleans` default documented to match code (`false` — booleans are redacted by default).
150
+
151
+ ## [1.2.0] - 2025-02-10
152
+
153
+ ### Added
154
+
155
+ - **`deleteSecretKeys`** — Remove matching keys from output entirely.
156
+
157
+ ## [1.1.0] - 2025-01-30
158
+
159
+ ### Changed
160
+
161
+ - Primitives, `null`, `undefined`, `Date`, and functions at the root are returned unchanged instead of throwing.
162
+
163
+ ## [1.0.0] - 2025-01-24
164
+
165
+ ### Added
166
+
167
+ - Initial public release: regex key rules, custom object schemas with sibling-key indirection, async `redact()` / `redactInPlace()`, and configurable redactor functions.
168
+
169
+ [1.6.0]: https://github.com/mologna/field-redactor/compare/v1.5.0...v1.6.0
170
+ [1.5.0]: https://github.com/mologna/field-redactor/releases/tag/v1.5.0
171
+ [2.5.1]: https://github.com/mologna/field-redactor/compare/2.5.0...2.5.1
172
+ [2.5.0]: https://github.com/mologna/field-redactor/compare/2.4.0...2.5.0
173
+ [2.4.0]: https://github.com/mologna/field-redactor/compare/2.3.1...2.4.0
174
+ [1.3.0]: https://github.com/mologna/field-redactor/compare/v1.2.2...v1.3.0
175
+ [1.2.2]: https://github.com/mologna/field-redactor/compare/v1.2.1...v1.2.2
176
+ [1.2.1]: https://github.com/mologna/field-redactor/compare/v1.2.0...v1.2.1
177
+ [1.2.0]: https://github.com/mologna/field-redactor/compare/v1.1.0...v1.2.0
178
+ [1.1.0]: https://github.com/mologna/field-redactor/compare/v1.0.0...v1.1.0
179
+ [1.0.0]: https://github.com/mologna/field-redactor/releases/tag/v1.0.0
@@ -0,0 +1,64 @@
1
+ # Contributing to field-redactor
2
+
3
+ This repository publishes the npm package **`field-redactor`**. The local folder may be named `obfuscator`; that is only a workspace path—use the package name in docs, issues, and imports.
4
+
5
+ ## Versioning
6
+
7
+ | Channel | Meaning |
8
+ |---------|---------|
9
+ | npm `1.x` | Public releases (current line: `1.6.x`) |
10
+ | Internal `2.x` tags / release notes | Historical development tags; not the npm line of record |
11
+
12
+ Prefer npm version numbers in user-facing docs. Internal release notes under `docs/release-notes/` may still mention older `2.x` tags for chronology.
13
+
14
+ ## Layout
15
+
16
+ ```
17
+ src/
18
+ api/ Public facade: FieldRedactor, ConfigBuilder, DI wiring
19
+ engine/ Traversal, array/custom-object handlers, PrimitiveRedactor
20
+ rules/ SecretManager, matchers, RuleResolver, CustomObjectManager
21
+ dryrun/ Structural diff + rule attribution
22
+ config/ Validation, presets, redactionRules, schema helpers
23
+ util/ pathParsing, jsonWalk, maybeAsync, regexUtils
24
+ index.ts Public exports only
25
+ types.ts Shared types
26
+ errors.ts Public errors
27
+ ```
28
+
29
+ Public consumers should import from `field-redactor` (see `package.json` `exports`). Do not rely on deep `dist/...` paths.
30
+
31
+ ## Rule precedence
32
+
33
+ Single source of truth: **`RuleResolver`** (`src/rules/ruleResolver.ts`).
34
+
35
+ Order: **schema → path rule → enclosing opaque/deep key → leaf key rule → value pattern → default**.
36
+
37
+ Traversal and dry-run attribution both use this module. When adding a rule type, update `RuleResolver` and add a contract case in `tests/unit/ruleResolver.contract.spec.ts`.
38
+
39
+ ### Naming vocabulary
40
+
41
+ | Mode | Preferred config / enum | Legacy aliases |
42
+ |------|-------------------------|----------------|
43
+ | Shallow | `secretKeys`, `CustomObjectMatchType.Shallow` | — |
44
+ | Deep | `deepSecretKeys` | — |
45
+ | Opaque | `opaqueSecretKeys`, `CustomObjectMatchType.Opaque` | `fullSecretKeys`, `Full` |
46
+ | Remove | `removeSecretKeys`, `CustomObjectMatchType.Remove` | `deleteSecretKeys`, `Delete` |
47
+
48
+ ## Development
49
+
50
+ ```bash
51
+ yarn install
52
+ yarn build
53
+ yarn test
54
+ ```
55
+
56
+ - Unit tests: `tests/unit/`
57
+ - Integration / end-to-end: `tests/integration/` (keep these few and scenario-focused; prefer unit tests for rule edge cases)
58
+ - Shared test helpers: `tests/helpers/`
59
+
60
+ ## Pull requests
61
+
62
+ - Keep changes focused; avoid drive-by refactors outside the task.
63
+ - Do not commit unless asked.
64
+ - Match existing commit message style (short, imperative, why-focused).