field-redactor 1.5.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.
- package/CHANGELOG.md +23 -0
- package/CONTRIBUTING.md +64 -0
- package/README.md +3 -0
- package/dist/api/fieldRedactor.d.ts +53 -0
- package/dist/api/fieldRedactor.d.ts.map +1 -0
- package/dist/api/fieldRedactor.js +169 -0
- package/dist/api/fieldRedactor.js.map +1 -0
- package/dist/api/fieldRedactorConfigBuilder.d.ts +57 -0
- package/dist/api/fieldRedactorConfigBuilder.d.ts.map +1 -0
- package/dist/api/fieldRedactorConfigBuilder.js +115 -0
- package/dist/api/fieldRedactorConfigBuilder.js.map +1 -0
- package/dist/api/fieldRedactorDeps.d.ts +19 -0
- package/dist/api/fieldRedactorDeps.d.ts.map +1 -0
- package/dist/api/fieldRedactorDeps.js +45 -0
- package/dist/api/fieldRedactorDeps.js.map +1 -0
- package/dist/arrayRedaction.d.ts +12 -0
- package/dist/arrayRedaction.d.ts.map +1 -0
- package/dist/arrayRedaction.js +70 -0
- package/dist/arrayRedaction.js.map +1 -0
- package/dist/config/configValidator.d.ts +9 -0
- package/dist/config/configValidator.d.ts.map +1 -0
- package/dist/config/configValidator.js +77 -0
- package/dist/config/configValidator.js.map +1 -0
- package/dist/config/customObjectSchemas.d.ts +7 -0
- package/dist/config/customObjectSchemas.d.ts.map +1 -0
- package/dist/config/customObjectSchemas.js +35 -0
- package/dist/config/customObjectSchemas.js.map +1 -0
- package/dist/config/presets.d.ts +22 -0
- package/dist/config/presets.d.ts.map +1 -0
- package/dist/config/presets.js +50 -0
- package/dist/config/presets.js.map +1 -0
- package/dist/config/redactionRules.d.ts +25 -0
- package/dist/config/redactionRules.d.ts.map +1 -0
- package/dist/config/redactionRules.js +108 -0
- package/dist/config/redactionRules.js.map +1 -0
- package/dist/configValidator.d.ts +3 -4
- package/dist/configValidator.d.ts.map +1 -1
- package/dist/configValidator.js +9 -26
- package/dist/configValidator.js.map +1 -1
- package/dist/customObjectFieldHandler.d.ts +21 -0
- package/dist/customObjectFieldHandler.d.ts.map +1 -0
- package/dist/customObjectFieldHandler.js +159 -0
- package/dist/customObjectFieldHandler.js.map +1 -0
- package/dist/customObjectManager.d.ts +1 -1
- package/dist/customObjectManager.js +3 -3
- package/dist/customObjectManager.js.map +1 -1
- package/dist/customObjectSchemas.d.ts +7 -0
- package/dist/customObjectSchemas.d.ts.map +1 -0
- package/dist/customObjectSchemas.js +35 -0
- package/dist/customObjectSchemas.js.map +1 -0
- package/dist/dryRun.d.ts +2 -1
- package/dist/dryRun.d.ts.map +1 -1
- package/dist/dryRun.js +2 -2
- package/dist/dryRun.js.map +1 -1
- package/dist/dryRunAttribution.d.ts +5 -3
- package/dist/dryRunAttribution.d.ts.map +1 -1
- package/dist/dryRunAttribution.js +9 -101
- package/dist/dryRunAttribution.js.map +1 -1
- package/dist/dryrun/dryRun.d.ts +9 -0
- package/dist/dryrun/dryRun.d.ts.map +1 -0
- package/dist/dryrun/dryRun.js +75 -0
- package/dist/dryrun/dryRun.js.map +1 -0
- package/dist/dryrun/dryRunAttribution.d.ts +10 -0
- package/dist/dryrun/dryRunAttribution.d.ts.map +1 -0
- package/dist/dryrun/dryRunAttribution.js +14 -0
- package/dist/dryrun/dryRunAttribution.js.map +1 -0
- package/dist/engine/arrayRedaction.d.ts +12 -0
- package/dist/engine/arrayRedaction.d.ts.map +1 -0
- package/dist/engine/arrayRedaction.js +70 -0
- package/dist/engine/arrayRedaction.js.map +1 -0
- package/dist/engine/customObjectFieldHandler.d.ts +35 -0
- package/dist/engine/customObjectFieldHandler.d.ts.map +1 -0
- package/dist/engine/customObjectFieldHandler.js +167 -0
- package/dist/engine/customObjectFieldHandler.js.map +1 -0
- package/dist/engine/objectRedactor.d.ts +18 -0
- package/dist/engine/objectRedactor.d.ts.map +1 -0
- package/dist/engine/objectRedactor.js +38 -0
- package/dist/engine/objectRedactor.js.map +1 -0
- package/dist/engine/objectRedactorCustomObject.d.ts +27 -0
- package/dist/engine/objectRedactorCustomObject.d.ts.map +1 -0
- package/dist/engine/objectRedactorCustomObject.js +54 -0
- package/dist/engine/objectRedactorCustomObject.js.map +1 -0
- package/dist/engine/objectRedactorHelpers.d.ts +9 -0
- package/dist/engine/objectRedactorHelpers.d.ts.map +1 -0
- package/dist/engine/objectRedactorHelpers.js +61 -0
- package/dist/engine/objectRedactorHelpers.js.map +1 -0
- package/dist/engine/objectRedactorMutation.d.ts +10 -0
- package/dist/engine/objectRedactorMutation.d.ts.map +1 -0
- package/dist/engine/objectRedactorMutation.js +89 -0
- package/dist/engine/objectRedactorMutation.js.map +1 -0
- package/dist/engine/objectRedactorSync.d.ts +2 -0
- package/dist/engine/objectRedactorSync.d.ts.map +1 -0
- package/dist/engine/objectRedactorSync.js +7 -0
- package/dist/engine/objectRedactorSync.js.map +1 -0
- package/dist/engine/objectRedactorTraversal.d.ts +41 -0
- package/dist/engine/objectRedactorTraversal.d.ts.map +1 -0
- package/dist/engine/objectRedactorTraversal.js +201 -0
- package/dist/engine/objectRedactorTraversal.js.map +1 -0
- package/dist/engine/primitiveRedactor.d.ts +33 -0
- package/dist/engine/primitiveRedactor.d.ts.map +1 -0
- package/dist/engine/primitiveRedactor.js +75 -0
- package/dist/engine/primitiveRedactor.js.map +1 -0
- package/dist/engine/traversalServices.d.ts +21 -0
- package/dist/engine/traversalServices.d.ts.map +1 -0
- package/dist/engine/traversalServices.js +3 -0
- package/dist/engine/traversalServices.js.map +1 -0
- package/dist/fieldDisposition.d.ts +3 -0
- package/dist/fieldDisposition.d.ts.map +1 -0
- package/dist/fieldDisposition.js +6 -0
- package/dist/fieldDisposition.js.map +1 -0
- package/dist/fieldRedactor.d.ts +6 -21
- package/dist/fieldRedactor.d.ts.map +1 -1
- package/dist/fieldRedactor.js +37 -56
- package/dist/fieldRedactor.js.map +1 -1
- package/dist/fieldRedactorConfigBuilder.d.ts +7 -1
- package/dist/fieldRedactorConfigBuilder.d.ts.map +1 -1
- package/dist/fieldRedactorConfigBuilder.js +14 -1
- package/dist/fieldRedactorConfigBuilder.js.map +1 -1
- package/dist/fieldRedactorDeps.d.ts +2 -0
- package/dist/fieldRedactorDeps.d.ts.map +1 -1
- package/dist/fieldRedactorDeps.js +11 -9
- package/dist/fieldRedactorDeps.js.map +1 -1
- package/dist/index.d.ts +7 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/jsonWalk.d.ts +1 -1
- package/dist/jsonWalk.d.ts.map +1 -1
- package/dist/jsonWalk.js +2 -33
- package/dist/jsonWalk.js.map +1 -1
- package/dist/maybeAsync.d.ts +7 -0
- package/dist/maybeAsync.d.ts.map +1 -0
- package/dist/maybeAsync.js +56 -0
- package/dist/maybeAsync.js.map +1 -0
- package/dist/objectRedactor.d.ts +2 -1
- package/dist/objectRedactor.d.ts.map +1 -1
- package/dist/objectRedactor.js +2 -2
- package/dist/objectRedactor.js.map +1 -1
- package/dist/objectRedactorCustomObject.d.ts +19 -40
- package/dist/objectRedactorCustomObject.d.ts.map +1 -1
- package/dist/objectRedactorCustomObject.js +20 -101
- package/dist/objectRedactorCustomObject.js.map +1 -1
- package/dist/objectRedactorHelpers.d.ts.map +1 -1
- package/dist/objectRedactorHelpers.js +3 -0
- package/dist/objectRedactorHelpers.js.map +1 -1
- package/dist/objectRedactorTraversal.d.ts +20 -36
- package/dist/objectRedactorTraversal.d.ts.map +1 -1
- package/dist/objectRedactorTraversal.js +141 -516
- package/dist/objectRedactorTraversal.js.map +1 -1
- package/dist/pathParsing.d.ts +11 -0
- package/dist/pathParsing.d.ts.map +1 -0
- package/dist/pathParsing.js +53 -0
- package/dist/pathParsing.js.map +1 -0
- package/dist/pathRuleMatcher.d.ts +19 -0
- package/dist/pathRuleMatcher.d.ts.map +1 -0
- package/dist/pathRuleMatcher.js +42 -0
- package/dist/pathRuleMatcher.js.map +1 -0
- package/dist/redactionRules.d.ts +3 -4
- package/dist/redactionRules.d.ts.map +1 -1
- package/dist/redactionRules.js +7 -9
- package/dist/redactionRules.js.map +1 -1
- package/dist/ruleResolver.d.ts +65 -0
- package/dist/ruleResolver.d.ts.map +1 -0
- package/dist/ruleResolver.js +193 -0
- package/dist/ruleResolver.js.map +1 -0
- package/dist/rules/customObjectManager.d.ts +28 -0
- package/dist/rules/customObjectManager.d.ts.map +1 -0
- package/dist/rules/customObjectManager.js +60 -0
- package/dist/rules/customObjectManager.js.map +1 -0
- package/dist/rules/fieldDisposition.d.ts +3 -0
- package/dist/rules/fieldDisposition.d.ts.map +1 -0
- package/dist/rules/fieldDisposition.js +6 -0
- package/dist/rules/fieldDisposition.js.map +1 -0
- package/dist/rules/pathRuleMatcher.d.ts +19 -0
- package/dist/rules/pathRuleMatcher.d.ts.map +1 -0
- package/dist/rules/pathRuleMatcher.js +40 -0
- package/dist/rules/pathRuleMatcher.js.map +1 -0
- package/dist/rules/ruleResolver.d.ts +65 -0
- package/dist/rules/ruleResolver.d.ts.map +1 -0
- package/dist/rules/ruleResolver.js +194 -0
- package/dist/rules/ruleResolver.js.map +1 -0
- package/dist/rules/secretManager.d.ts +32 -0
- package/dist/rules/secretManager.d.ts.map +1 -0
- package/dist/rules/secretManager.js +85 -0
- package/dist/rules/secretManager.js.map +1 -0
- package/dist/rules/valuePatternMatcher.d.ts +15 -0
- package/dist/rules/valuePatternMatcher.d.ts.map +1 -0
- package/dist/rules/valuePatternMatcher.js +30 -0
- package/dist/rules/valuePatternMatcher.js.map +1 -0
- package/dist/secretManager.d.ts +6 -19
- package/dist/secretManager.d.ts.map +1 -1
- package/dist/secretManager.js +19 -30
- package/dist/secretManager.js.map +1 -1
- package/dist/traversalServices.d.ts +21 -0
- package/dist/traversalServices.d.ts.map +1 -0
- package/dist/traversalServices.js +3 -0
- package/dist/traversalServices.js.map +1 -0
- package/dist/types.d.ts +41 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +8 -1
- package/dist/types.js.map +1 -1
- package/dist/util/jsonWalk.d.ts +10 -0
- package/dist/util/jsonWalk.d.ts.map +1 -0
- package/dist/util/jsonWalk.js +53 -0
- package/dist/util/jsonWalk.js.map +1 -0
- package/dist/util/maybeAsync.d.ts +7 -0
- package/dist/util/maybeAsync.d.ts.map +1 -0
- package/dist/util/maybeAsync.js +56 -0
- package/dist/util/maybeAsync.js.map +1 -0
- package/dist/util/pathParsing.d.ts +11 -0
- package/dist/util/pathParsing.d.ts.map +1 -0
- package/dist/util/pathParsing.js +53 -0
- package/dist/util/pathParsing.js.map +1 -0
- package/dist/util/regexUtils.d.ts +3 -0
- package/dist/util/regexUtils.d.ts.map +1 -0
- package/dist/util/regexUtils.js +8 -0
- package/dist/util/regexUtils.js.map +1 -0
- package/docs/guides/migration-1.5-to-1.6.md +56 -0
- package/docs/guides/path-rules.md +47 -0
- package/docs/reference/config.md +5 -1
- package/docs/release-notes/README.md +3 -1
- package/docs/release-notes/v1.6.0.md +59 -0
- package/jest.config.js +3 -1
- package/package.json +8 -2
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,28 @@ All notable changes to this project are documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
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
|
+
|
|
8
30
|
## [1.5.0] - 2026-06-24
|
|
9
31
|
|
|
10
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**.
|
|
@@ -144,6 +166,7 @@ Development tags `2.0.0`–`2.3.1` track incremental work toward `1.3.0`. See [d
|
|
|
144
166
|
|
|
145
167
|
- Initial public release: regex key rules, custom object schemas with sibling-key indirection, async `redact()` / `redactInPlace()`, and configurable redactor functions.
|
|
146
168
|
|
|
169
|
+
[1.6.0]: https://github.com/mologna/field-redactor/compare/v1.5.0...v1.6.0
|
|
147
170
|
[1.5.0]: https://github.com/mologna/field-redactor/releases/tag/v1.5.0
|
|
148
171
|
[2.5.1]: https://github.com/mologna/field-redactor/compare/2.5.0...2.5.1
|
|
149
172
|
[2.5.0]: https://github.com/mologna/field-redactor/compare/2.4.0...2.5.0
|
package/CONTRIBUTING.md
ADDED
|
@@ -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).
|
package/README.md
CHANGED
|
@@ -69,9 +69,12 @@ Use `FieldRedactor.createSafe({ ... })` or `FieldRedactorConfigBuilder` so you n
|
|
|
69
69
|
| [Metadata redaction](docs/guides/metadata-redaction.md) | `{ name, value }` schemas and sibling-key rules |
|
|
70
70
|
| [Anti-patterns](docs/guides/anti-patterns.md) | Common config mistakes and fixes |
|
|
71
71
|
| [Value-pattern redaction](docs/guides/value-pattern-redaction.md) | Detect PII in free-text field values |
|
|
72
|
+
| [Path rules & allowlists](docs/guides/path-rules.md) | Target stable JSON paths; exempt keys under deep redaction |
|
|
72
73
|
| [Configuration reference](docs/reference/config.md) | Full option table, API, presets, validation |
|
|
74
|
+
| [Migration 1.5 → 1.6](docs/guides/migration-1.5-to-1.6.md) | Upgrade from 1.5.x (path rules, naming, exports) |
|
|
73
75
|
| [Migration 1.2 → 1.5](docs/guides/migration-1.2-to-1.5.md) | Upgrade from the previous npm line |
|
|
74
76
|
| [Release notes](docs/release-notes/README.md) | Per-version notes for every published tag |
|
|
77
|
+
| [Contributing](CONTRIBUTING.md) | Layout, precedence, naming, and local workflow |
|
|
75
78
|
|
|
76
79
|
## API surface
|
|
77
80
|
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { DryRunResult, FieldRedactorConfig, RedactableInput } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* FieldRedactor is a highly customizable JSON object field redactor. It conditionally redacts fields based on
|
|
4
|
+
* the secrets, deepSecrets, fullSecrets, and custom objects provided in the configuration. Refer to the README.md
|
|
5
|
+
* for more details.
|
|
6
|
+
*
|
|
7
|
+
* Defaults: `ignoreNullOrUndefined` is `true`, `ignoreBooleans` is `false`, `cloneInput` is `true`.
|
|
8
|
+
*/
|
|
9
|
+
export declare class FieldRedactor {
|
|
10
|
+
private readonly deepCopy;
|
|
11
|
+
private readonly deps;
|
|
12
|
+
/** Non-fatal configuration warnings from the last construction (empty when `strict` threw). */
|
|
13
|
+
readonly configWarnings: readonly string[];
|
|
14
|
+
constructor(config?: FieldRedactorConfig);
|
|
15
|
+
/**
|
|
16
|
+
* Creates a FieldRedactor that requires at least one explicit redaction rule: Shallow (`secretKeys`),
|
|
17
|
+
* Deep (`deepSecretKeys`), Opaque (`fullSecretKeys`), Remove (`deleteSecretKeys`), Schema (`customObjects`),
|
|
18
|
+
* or Value-pattern (`valuePatterns`).
|
|
19
|
+
* Unlike `new FieldRedactor()`, omitting all rules does not default to redacting every value.
|
|
20
|
+
*/
|
|
21
|
+
static createSafe(config: FieldRedactorConfig): FieldRedactor;
|
|
22
|
+
/** Convenience alias for `new FieldRedactor(config)`. */
|
|
23
|
+
static fromConfig(config?: FieldRedactorConfig): FieldRedactor;
|
|
24
|
+
/** Redacts a copy of the input and returns an audit report of affected paths without mutating the original. */
|
|
25
|
+
dryRun<T extends RedactableInput>(value: T): Promise<DryRunResult<T>>;
|
|
26
|
+
/** Synchronous {@link FieldRedactor.dryRun} without per-field Promise overhead. */
|
|
27
|
+
dryRunSync<T extends RedactableInput>(value: T): DryRunResult<T>;
|
|
28
|
+
private runDryRun;
|
|
29
|
+
private emptyDryRunResult;
|
|
30
|
+
private toDryRunResult;
|
|
31
|
+
/**
|
|
32
|
+
* Conditionally redacts fields in the JSON object based on the configuration provided in the constructor and returns the
|
|
33
|
+
* redacted result.
|
|
34
|
+
* If the value is a primitive, undefined, or date, returns the value as-is.
|
|
35
|
+
*/
|
|
36
|
+
redact<T extends RedactableInput>(value: T): Promise<T>;
|
|
37
|
+
/**
|
|
38
|
+
* Synchronously redacts fields and returns a copy without per-field Promise overhead.
|
|
39
|
+
* Uses copy-on-write structural sharing by default so only mutated branches are cloned.
|
|
40
|
+
*/
|
|
41
|
+
redactSync<T extends RedactableInput>(value: T): T;
|
|
42
|
+
/** Conditionally redacts fields in the JSON object in place based on the configuration provided in the constructor. */
|
|
43
|
+
redactInPlace<T extends RedactableInput>(value: T): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Synchronously redacts fields in the JSON object in place without per-field Promise overhead.
|
|
46
|
+
* Requires a `syncRedactor` or the default redactor; throws when only an async `redactor` is configured.
|
|
47
|
+
*/
|
|
48
|
+
redactInPlaceSync<T extends RedactableInput>(value: T): void;
|
|
49
|
+
private runTraversableRedaction;
|
|
50
|
+
private toFieldRedactorError;
|
|
51
|
+
private isPrimitiveOrUndefined;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=fieldRedactor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fieldRedactor.d.ts","sourceRoot":"","sources":["../../src/api/fieldRedactor.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,YAAY,EACZ,mBAAmB,EAInB,eAAe,EAEhB,MAAM,UAAU,CAAC;AAKlB;;;;;;GAMG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwC;IACjE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoB;IAEzC,+FAA+F;IAC/F,SAAgB,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;gBAEtC,MAAM,CAAC,EAAE,mBAAmB;IASxC;;;;;OAKG;WACW,UAAU,CAAC,MAAM,EAAE,mBAAmB,GAAG,aAAa;IAUpE,yDAAyD;WAC3C,UAAU,CAAC,MAAM,CAAC,EAAE,mBAAmB,GAAG,aAAa;IAIrE,+GAA+G;IAClG,MAAM,CAAC,CAAC,SAAS,eAAe,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAIlF,mFAAmF;IAC5E,UAAU,CAAC,CAAC,SAAS,eAAe,EAAE,KAAK,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;IASvE,OAAO,CAAC,SAAS;IAiBjB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,cAAc;IActB;;;;OAIG;IACU,MAAM,CAAC,CAAC,SAAS,eAAe,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAmBpE;;;OAGG;IACI,UAAU,CAAC,CAAC,SAAS,eAAe,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC;IAazD,uHAAuH;IAC1G,aAAa,CAAC,CAAC,SAAS,eAAe,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAS9E;;;OAGG;IACI,iBAAiB,CAAC,CAAC,SAAS,eAAe,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAQnE,OAAO,CAAC,uBAAuB;IAoB/B,OAAO,CAAC,oBAAoB;IAK5B,OAAO,CAAC,sBAAsB;CAG/B"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.FieldRedactor = void 0;
|
|
16
|
+
const errors_1 = require("../errors");
|
|
17
|
+
const fieldRedactorDeps_1 = require("./fieldRedactorDeps");
|
|
18
|
+
const dryRun_1 = require("../dryrun/dryRun");
|
|
19
|
+
const rfdc_1 = __importDefault(require("rfdc"));
|
|
20
|
+
const configValidator_1 = require("../config/configValidator");
|
|
21
|
+
/**
|
|
22
|
+
* FieldRedactor is a highly customizable JSON object field redactor. It conditionally redacts fields based on
|
|
23
|
+
* the secrets, deepSecrets, fullSecrets, and custom objects provided in the configuration. Refer to the README.md
|
|
24
|
+
* for more details.
|
|
25
|
+
*
|
|
26
|
+
* Defaults: `ignoreNullOrUndefined` is `true`, `ignoreBooleans` is `false`, `cloneInput` is `true`.
|
|
27
|
+
*/
|
|
28
|
+
class FieldRedactor {
|
|
29
|
+
constructor(config) {
|
|
30
|
+
var _a;
|
|
31
|
+
this.deepCopy = (0, rfdc_1.default)({ proto: true, circles: true });
|
|
32
|
+
this.configWarnings = (0, configValidator_1.validateFieldRedactorConfig)(config);
|
|
33
|
+
for (const warning of this.configWarnings) {
|
|
34
|
+
(_a = config === null || config === void 0 ? void 0 : config.onConfigWarning) === null || _a === void 0 ? void 0 : _a.call(config, warning);
|
|
35
|
+
}
|
|
36
|
+
this.deps = (0, fieldRedactorDeps_1.buildFieldRedactorDeps)(config);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Creates a FieldRedactor that requires at least one explicit redaction rule: Shallow (`secretKeys`),
|
|
40
|
+
* Deep (`deepSecretKeys`), Opaque (`fullSecretKeys`), Remove (`deleteSecretKeys`), Schema (`customObjects`),
|
|
41
|
+
* or Value-pattern (`valuePatterns`).
|
|
42
|
+
* Unlike `new FieldRedactor()`, omitting all rules does not default to redacting every value.
|
|
43
|
+
*/
|
|
44
|
+
static createSafe(config) {
|
|
45
|
+
if (!(0, configValidator_1.hasExplicitRedactionRules)(config)) {
|
|
46
|
+
throw new errors_1.FieldRedactorConfigurationError('FieldRedactor.createSafe() requires at least one non-empty secretKeys, deepSecretKeys, fullSecretKeys, deleteSecretKeys, customObjects, valuePatterns, or pathRules entry. Without explicit rules, new FieldRedactor() redacts all values by default.');
|
|
47
|
+
}
|
|
48
|
+
return new FieldRedactor(config);
|
|
49
|
+
}
|
|
50
|
+
/** Convenience alias for `new FieldRedactor(config)`. */
|
|
51
|
+
static fromConfig(config) {
|
|
52
|
+
return new FieldRedactor(config);
|
|
53
|
+
}
|
|
54
|
+
/** Redacts a copy of the input and returns an audit report of affected paths without mutating the original. */
|
|
55
|
+
dryRun(value) {
|
|
56
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
57
|
+
return this.runDryRun(value, (input) => this.redact(input));
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
/** Synchronous {@link FieldRedactor.dryRun} without per-field Promise overhead. */
|
|
61
|
+
dryRunSync(value) {
|
|
62
|
+
if (this.isPrimitiveOrUndefined(value)) {
|
|
63
|
+
return this.emptyDryRunResult(value);
|
|
64
|
+
}
|
|
65
|
+
const snapshot = this.deepCopy(value);
|
|
66
|
+
return this.toDryRunResult(snapshot, this.redactSync(value));
|
|
67
|
+
}
|
|
68
|
+
runDryRun(value, redact) {
|
|
69
|
+
if (this.isPrimitiveOrUndefined(value)) {
|
|
70
|
+
return this.emptyDryRunResult(value);
|
|
71
|
+
}
|
|
72
|
+
const snapshot = this.deepCopy(value);
|
|
73
|
+
const result = redact(value);
|
|
74
|
+
if (result instanceof Promise) {
|
|
75
|
+
return result.then((redacted) => this.toDryRunResult(snapshot, redacted));
|
|
76
|
+
}
|
|
77
|
+
return this.toDryRunResult(snapshot, result);
|
|
78
|
+
}
|
|
79
|
+
emptyDryRunResult(value) {
|
|
80
|
+
return { result: value, report: dryRun_1.EMPTY_DRY_RUN_REPORT };
|
|
81
|
+
}
|
|
82
|
+
toDryRunResult(snapshot, result) {
|
|
83
|
+
return {
|
|
84
|
+
result,
|
|
85
|
+
report: (0, dryRun_1.buildDryRunReport)(snapshot, result, this.deps.customObjectManager, this.deps.secretManager, this.deps.valuePatternMatcher, this.deps.pathRuleMatcher)
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Conditionally redacts fields in the JSON object based on the configuration provided in the constructor and returns the
|
|
90
|
+
* redacted result.
|
|
91
|
+
* If the value is a primitive, undefined, or date, returns the value as-is.
|
|
92
|
+
*/
|
|
93
|
+
redact(value) {
|
|
94
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
95
|
+
if (this.isPrimitiveOrUndefined(value)) {
|
|
96
|
+
return value;
|
|
97
|
+
}
|
|
98
|
+
if (!this.deps.cloneInput) {
|
|
99
|
+
yield this.redactInPlace(value);
|
|
100
|
+
return value;
|
|
101
|
+
}
|
|
102
|
+
if (!this.deps.usesAsyncRedactor) {
|
|
103
|
+
return Promise.resolve(this.redactSync(value));
|
|
104
|
+
}
|
|
105
|
+
const copy = this.deepCopy(value);
|
|
106
|
+
yield this.redactInPlace(copy);
|
|
107
|
+
return copy;
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Synchronously redacts fields and returns a copy without per-field Promise overhead.
|
|
112
|
+
* Uses copy-on-write structural sharing by default so only mutated branches are cloned.
|
|
113
|
+
*/
|
|
114
|
+
redactSync(value) {
|
|
115
|
+
if (this.isPrimitiveOrUndefined(value)) {
|
|
116
|
+
return value;
|
|
117
|
+
}
|
|
118
|
+
if (!this.deps.cloneInput) {
|
|
119
|
+
this.redactInPlaceSync(value);
|
|
120
|
+
return value;
|
|
121
|
+
}
|
|
122
|
+
return this.deps.objectRedactor.redactCopyOnWrite(value);
|
|
123
|
+
}
|
|
124
|
+
/** Conditionally redacts fields in the JSON object in place based on the configuration provided in the constructor. */
|
|
125
|
+
redactInPlace(value) {
|
|
126
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
127
|
+
if (!this.deps.usesAsyncRedactor) {
|
|
128
|
+
this.redactInPlaceSync(value);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
yield this.runTraversableRedaction(value, () => this.deps.objectRedactor.redactInPlace(value));
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Synchronously redacts fields in the JSON object in place without per-field Promise overhead.
|
|
136
|
+
* Requires a `syncRedactor` or the default redactor; throws when only an async `redactor` is configured.
|
|
137
|
+
*/
|
|
138
|
+
redactInPlaceSync(value) {
|
|
139
|
+
if (this.deps.usesAsyncRedactor) {
|
|
140
|
+
throw new errors_1.FieldRedactorError('redactInPlaceSync requires syncRedactor configuration or the default redactor');
|
|
141
|
+
}
|
|
142
|
+
this.runTraversableRedaction(value, () => this.deps.objectRedactor.redactInPlaceSync(value));
|
|
143
|
+
}
|
|
144
|
+
runTraversableRedaction(value, redact) {
|
|
145
|
+
if (this.isPrimitiveOrUndefined(value)) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
try {
|
|
149
|
+
const result = redact();
|
|
150
|
+
if (result instanceof Promise) {
|
|
151
|
+
return result.catch((error) => {
|
|
152
|
+
throw this.toFieldRedactorError(error);
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
throw this.toFieldRedactorError(error);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
toFieldRedactorError(error) {
|
|
161
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
162
|
+
return new errors_1.FieldRedactorError(message);
|
|
163
|
+
}
|
|
164
|
+
isPrimitiveOrUndefined(value) {
|
|
165
|
+
return !value || typeof value !== 'object' || value instanceof Date;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
exports.FieldRedactor = FieldRedactor;
|
|
169
|
+
//# sourceMappingURL=fieldRedactor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fieldRedactor.js","sourceRoot":"","sources":["../../src/api/fieldRedactor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { FieldRedactor } from './fieldRedactor';
|
|
2
|
+
import { CustomObject, FieldRedactorConfig, PathRuleMode, Redactor, SyncRedactor } from '../types';
|
|
3
|
+
export type SchemaOptions = {
|
|
4
|
+
/** Optional label surfaced in {@link FieldRedactor.dryRun} `matchedSchemas` reports. */
|
|
5
|
+
name?: string;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Fluent builder for {@link FieldRedactorConfig} using doc labels (Shallow, Deep, Opaque, Remove, Schema).
|
|
9
|
+
*/
|
|
10
|
+
export declare class FieldRedactorConfigBuilder {
|
|
11
|
+
private config;
|
|
12
|
+
private schemas;
|
|
13
|
+
static create(): FieldRedactorConfigBuilder;
|
|
14
|
+
/** Shallow — redact matching keys' scalar values (`secretKeys`). */
|
|
15
|
+
shallow(...patterns: RegExp[]): this;
|
|
16
|
+
/** Deep — redact matching keys and descendants (`deepSecretKeys`). */
|
|
17
|
+
deep(...patterns: RegExp[]): this;
|
|
18
|
+
/** Opaque — stringify entire values at matching keys (`fullSecretKeys`). */
|
|
19
|
+
opaque(...patterns: RegExp[]): this;
|
|
20
|
+
/** Remove — delete matching keys from output (`deleteSecretKeys`). */
|
|
21
|
+
remove(...patterns: RegExp[]): this;
|
|
22
|
+
/** Alias for {@link FieldRedactorConfigBuilder.remove}. */
|
|
23
|
+
delete(...patterns: RegExp[]): this;
|
|
24
|
+
/** Register an object schema (`customObjects`). */
|
|
25
|
+
schema(customObject: CustomObject, options?: SchemaOptions): this;
|
|
26
|
+
/**
|
|
27
|
+
* Value-pattern — redact scalar fields whose string form matches a pattern, regardless of key name (`valuePatterns`).
|
|
28
|
+
* Lowest precedence; opt-in defense in depth beyond key-name rules.
|
|
29
|
+
*/
|
|
30
|
+
valuePattern(...patterns: RegExp[]): this;
|
|
31
|
+
/**
|
|
32
|
+
* Path rule — apply a redaction mode at a JSON path (`metadata.*.value`, `accountInfo.id`).
|
|
33
|
+
*/
|
|
34
|
+
pathRule(path: string, mode: PathRuleMode): this;
|
|
35
|
+
/** Allowlist — matching key names are never redacted under deep parents (`passKeys`). */
|
|
36
|
+
passKey(...patterns: RegExp[]): this;
|
|
37
|
+
/**
|
|
38
|
+
* Merge a {@link presets} return value (or any partial config) into the builder.
|
|
39
|
+
* Regex arrays and schemas accumulate; scalar options apply only when not already set.
|
|
40
|
+
*/
|
|
41
|
+
usePreset(preset: Partial<FieldRedactorConfig>): this;
|
|
42
|
+
redactor(fn: Redactor): this;
|
|
43
|
+
syncRedactor(fn: SyncRedactor): this;
|
|
44
|
+
ignoreBooleans(value: boolean): this;
|
|
45
|
+
ignoreNullOrUndefined(value: boolean): this;
|
|
46
|
+
cloneInput(value: boolean): this;
|
|
47
|
+
strict(value?: boolean): this;
|
|
48
|
+
onConfigWarning(handler: (message: string) => void): this;
|
|
49
|
+
build(): FieldRedactorConfig;
|
|
50
|
+
/** Constructs a {@link FieldRedactor} from the built config. */
|
|
51
|
+
buildRedactor(): FieldRedactor;
|
|
52
|
+
/** Like {@link FieldRedactor.createSafe} using the built config. */
|
|
53
|
+
buildSafeRedactor(): FieldRedactor;
|
|
54
|
+
private appendRegex;
|
|
55
|
+
private set;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=fieldRedactorConfigBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fieldRedactorConfigBuilder.d.ts","sourceRoot":"","sources":["../../src/api/fieldRedactorConfigBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAQrD,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAEnG,MAAM,MAAM,aAAa,GAAG;IAC1B,wFAAwF;IACxF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF;;GAEG;AACH,qBAAa,0BAA0B;IACrC,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,OAAO,CAA0B;IAEzC,MAAM,CAAC,MAAM,IAAI,0BAA0B;IAI3C,oEAAoE;IACpE,OAAO,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAIpC,sEAAsE;IACtE,IAAI,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAIjC,4EAA4E;IAC5E,MAAM,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAInC,sEAAsE;IACtE,MAAM,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAInC,2DAA2D;IAC3D,MAAM,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAInC,mDAAmD;IACnD,MAAM,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI;IAKjE;;;OAGG;IACH,YAAY,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAKzC;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI;IAKhD,yFAAyF;IACzF,OAAO,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAKpC;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,IAAI;IAKrD,QAAQ,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI;IAI5B,YAAY,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI;IAIpC,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAIpC,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAI3C,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAIhC,MAAM,CAAC,KAAK,UAAO,GAAG,IAAI;IAI1B,eAAe,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAIzD,KAAK,IAAI,mBAAmB;IAI5B,gEAAgE;IAChE,aAAa,IAAI,aAAa;IAM9B,oEAAoE;IACpE,iBAAiB,IAAI,aAAa;IAKlC,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,GAAG;CAIZ"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FieldRedactorConfigBuilder = void 0;
|
|
4
|
+
const redactionRules_1 = require("../config/redactionRules");
|
|
5
|
+
/**
|
|
6
|
+
* Fluent builder for {@link FieldRedactorConfig} using doc labels (Shallow, Deep, Opaque, Remove, Schema).
|
|
7
|
+
*/
|
|
8
|
+
class FieldRedactorConfigBuilder {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.config = {};
|
|
11
|
+
this.schemas = [];
|
|
12
|
+
}
|
|
13
|
+
static create() {
|
|
14
|
+
return new FieldRedactorConfigBuilder();
|
|
15
|
+
}
|
|
16
|
+
/** Shallow — redact matching keys' scalar values (`secretKeys`). */
|
|
17
|
+
shallow(...patterns) {
|
|
18
|
+
return this.appendRegex('secretKeys', patterns);
|
|
19
|
+
}
|
|
20
|
+
/** Deep — redact matching keys and descendants (`deepSecretKeys`). */
|
|
21
|
+
deep(...patterns) {
|
|
22
|
+
return this.appendRegex('deepSecretKeys', patterns);
|
|
23
|
+
}
|
|
24
|
+
/** Opaque — stringify entire values at matching keys (`fullSecretKeys`). */
|
|
25
|
+
opaque(...patterns) {
|
|
26
|
+
return this.appendRegex('fullSecretKeys', patterns);
|
|
27
|
+
}
|
|
28
|
+
/** Remove — delete matching keys from output (`deleteSecretKeys`). */
|
|
29
|
+
remove(...patterns) {
|
|
30
|
+
return this.appendRegex('deleteSecretKeys', patterns);
|
|
31
|
+
}
|
|
32
|
+
/** Alias for {@link FieldRedactorConfigBuilder.remove}. */
|
|
33
|
+
delete(...patterns) {
|
|
34
|
+
return this.remove(...patterns);
|
|
35
|
+
}
|
|
36
|
+
/** Register an object schema (`customObjects`). */
|
|
37
|
+
schema(customObject, options) {
|
|
38
|
+
this.schemas.push({ object: customObject, name: options === null || options === void 0 ? void 0 : options.name });
|
|
39
|
+
return this;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Value-pattern — redact scalar fields whose string form matches a pattern, regardless of key name (`valuePatterns`).
|
|
43
|
+
* Lowest precedence; opt-in defense in depth beyond key-name rules.
|
|
44
|
+
*/
|
|
45
|
+
valuePattern(...patterns) {
|
|
46
|
+
(0, redactionRules_1.appendRegExpArray)(this.config, 'valuePatterns', patterns);
|
|
47
|
+
return this;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Path rule — apply a redaction mode at a JSON path (`metadata.*.value`, `accountInfo.id`).
|
|
51
|
+
*/
|
|
52
|
+
pathRule(path, mode) {
|
|
53
|
+
var _a;
|
|
54
|
+
this.config.pathRules = [...((_a = this.config.pathRules) !== null && _a !== void 0 ? _a : []), { path, mode }];
|
|
55
|
+
return this;
|
|
56
|
+
}
|
|
57
|
+
/** Allowlist — matching key names are never redacted under deep parents (`passKeys`). */
|
|
58
|
+
passKey(...patterns) {
|
|
59
|
+
(0, redactionRules_1.appendRegExpArray)(this.config, 'passKeys', patterns);
|
|
60
|
+
return this;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Merge a {@link presets} return value (or any partial config) into the builder.
|
|
64
|
+
* Regex arrays and schemas accumulate; scalar options apply only when not already set.
|
|
65
|
+
*/
|
|
66
|
+
usePreset(preset) {
|
|
67
|
+
(0, redactionRules_1.mergePartialConfig)(this.config, this.schemas, preset);
|
|
68
|
+
return this;
|
|
69
|
+
}
|
|
70
|
+
redactor(fn) {
|
|
71
|
+
return this.set('redactor', fn);
|
|
72
|
+
}
|
|
73
|
+
syncRedactor(fn) {
|
|
74
|
+
return this.set('syncRedactor', fn);
|
|
75
|
+
}
|
|
76
|
+
ignoreBooleans(value) {
|
|
77
|
+
return this.set('ignoreBooleans', value);
|
|
78
|
+
}
|
|
79
|
+
ignoreNullOrUndefined(value) {
|
|
80
|
+
return this.set('ignoreNullOrUndefined', value);
|
|
81
|
+
}
|
|
82
|
+
cloneInput(value) {
|
|
83
|
+
return this.set('cloneInput', value);
|
|
84
|
+
}
|
|
85
|
+
strict(value = true) {
|
|
86
|
+
return this.set('strict', value);
|
|
87
|
+
}
|
|
88
|
+
onConfigWarning(handler) {
|
|
89
|
+
return this.set('onConfigWarning', handler);
|
|
90
|
+
}
|
|
91
|
+
build() {
|
|
92
|
+
return Object.assign(Object.assign({}, this.config), (0, redactionRules_1.finalizeRegisteredSchemas)(this.schemas));
|
|
93
|
+
}
|
|
94
|
+
/** Constructs a {@link FieldRedactor} from the built config. */
|
|
95
|
+
buildRedactor() {
|
|
96
|
+
// Lazy require avoids a module cycle: builder → FieldRedactor → deps → …
|
|
97
|
+
const { FieldRedactor: Redactor } = require('./fieldRedactor');
|
|
98
|
+
return new Redactor(this.build());
|
|
99
|
+
}
|
|
100
|
+
/** Like {@link FieldRedactor.createSafe} using the built config. */
|
|
101
|
+
buildSafeRedactor() {
|
|
102
|
+
const { FieldRedactor: Redactor } = require('./fieldRedactor');
|
|
103
|
+
return Redactor.createSafe(this.build());
|
|
104
|
+
}
|
|
105
|
+
appendRegex(field, patterns) {
|
|
106
|
+
(0, redactionRules_1.appendRegExpArray)(this.config, field, patterns);
|
|
107
|
+
return this;
|
|
108
|
+
}
|
|
109
|
+
set(key, value) {
|
|
110
|
+
this.config[key] = value;
|
|
111
|
+
return this;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
exports.FieldRedactorConfigBuilder = FieldRedactorConfigBuilder;
|
|
115
|
+
//# sourceMappingURL=fieldRedactorConfigBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fieldRedactorConfigBuilder.js","sourceRoot":"","sources":["../../src/api/fieldRedactorConfigBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { CustomObjectManager } from '../rules/customObjectManager';
|
|
2
|
+
import { ObjectRedactor } from '../engine/objectRedactor';
|
|
3
|
+
import { PrimitiveRedactor } from '../engine/primitiveRedactor';
|
|
4
|
+
import { SecretManager } from '../rules/secretManager';
|
|
5
|
+
import { FieldRedactorConfig } from '../types';
|
|
6
|
+
import { PathRuleMatcher } from '../rules/pathRuleMatcher';
|
|
7
|
+
import { ValuePatternMatcher } from '../rules/valuePatternMatcher';
|
|
8
|
+
export type FieldRedactorDeps = {
|
|
9
|
+
primitiveRedactor: PrimitiveRedactor;
|
|
10
|
+
secretManager: SecretManager;
|
|
11
|
+
valuePatternMatcher: ValuePatternMatcher;
|
|
12
|
+
pathRuleMatcher: PathRuleMatcher;
|
|
13
|
+
customObjectManager: CustomObjectManager;
|
|
14
|
+
objectRedactor: ObjectRedactor;
|
|
15
|
+
usesAsyncRedactor: boolean;
|
|
16
|
+
cloneInput: boolean;
|
|
17
|
+
};
|
|
18
|
+
export declare const buildFieldRedactorDeps: (config?: FieldRedactorConfig) => FieldRedactorDeps;
|
|
19
|
+
//# sourceMappingURL=fieldRedactorDeps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fieldRedactorDeps.d.ts","sourceRoot":"","sources":["../../src/api/fieldRedactorDeps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEhE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAA2B,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACpF,OAAO,EAA+B,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEhG,MAAM,MAAM,iBAAiB,GAAG;IAC9B,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,aAAa,EAAE,aAAa,CAAC;IAC7B,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,eAAe,EAAE,eAAe,CAAC;IACjC,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,cAAc,EAAE,cAAc,CAAC;IAC/B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC;AAKF,eAAO,MAAM,sBAAsB,YAAa,mBAAmB,KAAG,iBAiDrE,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildFieldRedactorDeps = void 0;
|
|
4
|
+
const customObjectManager_1 = require("../rules/customObjectManager");
|
|
5
|
+
const objectRedactor_1 = require("../engine/objectRedactor");
|
|
6
|
+
const primitiveRedactor_1 = require("../engine/primitiveRedactor");
|
|
7
|
+
const redactionRules_1 = require("../config/redactionRules");
|
|
8
|
+
const secretManager_1 = require("../rules/secretManager");
|
|
9
|
+
const pathRuleMatcher_1 = require("../rules/pathRuleMatcher");
|
|
10
|
+
const valuePatternMatcher_1 = require("../rules/valuePatternMatcher");
|
|
11
|
+
const resolveBoolean = (value, defaultValue) => typeof value === 'boolean' ? value : defaultValue;
|
|
12
|
+
const buildFieldRedactorDeps = (config) => {
|
|
13
|
+
var _a;
|
|
14
|
+
const normalized = (_a = (0, redactionRules_1.normalizeFieldRedactorConfig)(config)) !== null && _a !== void 0 ? _a : {};
|
|
15
|
+
const { redactor, syncRedactor, deepSecretKeys, fullSecretKeys, deleteSecretKeys, customObjects, valuePatterns, pathRules, passKeys } = normalized;
|
|
16
|
+
const primitiveRedactor = new primitiveRedactor_1.PrimitiveRedactor({
|
|
17
|
+
ignoreBooleans: resolveBoolean(normalized.ignoreBooleans, false),
|
|
18
|
+
ignoreNullOrUndefined: resolveBoolean(normalized.ignoreNullOrUndefined, true),
|
|
19
|
+
redactor,
|
|
20
|
+
syncRedactor
|
|
21
|
+
});
|
|
22
|
+
const secretManager = new secretManager_1.SecretManager({
|
|
23
|
+
secretKeys: (0, redactionRules_1.resolveSecretKeys)(normalized),
|
|
24
|
+
deepSecretKeys,
|
|
25
|
+
fullSecretKeys,
|
|
26
|
+
deleteSecretKeys,
|
|
27
|
+
passKeys
|
|
28
|
+
});
|
|
29
|
+
const valuePatternMatcher = (valuePatterns === null || valuePatterns === void 0 ? void 0 : valuePatterns.length) ? new valuePatternMatcher_1.ValuePatternMatcher(valuePatterns) : valuePatternMatcher_1.EMPTY_VALUE_PATTERN_MATCHER;
|
|
30
|
+
const pathRuleMatcher = (pathRules === null || pathRules === void 0 ? void 0 : pathRules.length) ? new pathRuleMatcher_1.PathRuleMatcher(pathRules) : pathRuleMatcher_1.EMPTY_PATH_RULE_MATCHER;
|
|
31
|
+
const customObjectManager = new customObjectManager_1.CustomObjectManager(customObjects, normalized.schemaNames);
|
|
32
|
+
const objectRedactor = new objectRedactor_1.ObjectRedactor(primitiveRedactor, secretManager, customObjectManager, valuePatternMatcher, pathRuleMatcher);
|
|
33
|
+
return {
|
|
34
|
+
primitiveRedactor,
|
|
35
|
+
secretManager,
|
|
36
|
+
valuePatternMatcher,
|
|
37
|
+
pathRuleMatcher,
|
|
38
|
+
customObjectManager,
|
|
39
|
+
objectRedactor,
|
|
40
|
+
usesAsyncRedactor: primitiveRedactor.usesAsyncRedactor(),
|
|
41
|
+
cloneInput: normalized.cloneInput !== false
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
exports.buildFieldRedactorDeps = buildFieldRedactorDeps;
|
|
45
|
+
//# sourceMappingURL=fieldRedactorDeps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fieldRedactorDeps.js","sourceRoot":"","sources":["../../src/api/fieldRedactorDeps.ts"],"names":[],"mappings":";;;AAAA,sEAAmE;AACnE,6DAA0D;AAC1D,mEAAgE;AAChE,6DAA2F;AAC3F,0DAAuD;AAEvD,8DAAoF;AACpF,sEAAgG;AAahG,MAAM,cAAc,GAAG,CAAC,KAA0B,EAAE,YAAqB,EAAW,EAAE,CACpF,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC;AAE7C,MAAM,sBAAsB,GAAG,CAAC,MAA4B,EAAqB,EAAE;;IACxF,MAAM,UAAU,GAAG,MAAA,IAAA,6CAA4B,EAAC,MAAM,CAAC,mCAAI,EAAE,CAAC;IAC9D,MAAM,EACJ,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,SAAS,EACT,QAAQ,EACT,GAAG,UAAU,CAAC;IAEf,MAAM,iBAAiB,GAAG,IAAI,qCAAiB,CAAC;QAC9C,cAAc,EAAE,cAAc,CAAC,UAAU,CAAC,cAAc,EAAE,KAAK,CAAC;QAChE,qBAAqB,EAAE,cAAc,CAAC,UAAU,CAAC,qBAAqB,EAAE,IAAI,CAAC;QAC7E,QAAQ;QACR,YAAY;KACb,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,IAAI,6BAAa,CAAC;QACtC,UAAU,EAAE,IAAA,kCAAiB,EAAC,UAAU,CAAC;QACzC,cAAc;QACd,cAAc;QACd,gBAAgB;QAChB,QAAQ;KACT,CAAC,CAAC;IACH,MAAM,mBAAmB,GAAG,CAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,MAAM,EAAC,CAAC,CAAC,IAAI,yCAAmB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,iDAA2B,CAAC;IACzH,MAAM,eAAe,GAAG,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,MAAM,EAAC,CAAC,CAAC,IAAI,iCAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,yCAAuB,CAAC;IACrG,MAAM,mBAAmB,GAAG,IAAI,yCAAmB,CAAC,aAAa,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;IAC3F,MAAM,cAAc,GAAG,IAAI,+BAAc,CACvC,iBAAiB,EACjB,aAAa,EACb,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,CAChB,CAAC;IAEF,OAAO;QACL,iBAAiB;QACjB,aAAa;QACb,mBAAmB;QACnB,eAAe;QACf,mBAAmB;QACnB,cAAc;QACd,iBAAiB,EAAE,iBAAiB,CAAC,iBAAiB,EAAE;QACxD,UAAU,EAAE,UAAU,CAAC,UAAU,KAAK,KAAK;KAC5C,CAAC;AACJ,CAAC,CAAC;AAjDW,QAAA,sBAAsB,0BAiDjC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { JsonArray, JsonObject } from './types';
|
|
2
|
+
import { ContainerMutation } from './objectRedactorMutation';
|
|
3
|
+
import { MaybeAsync } from './maybeAsync';
|
|
4
|
+
import { TraversalServices } from './traversalServices';
|
|
5
|
+
export declare class ArrayRedactor {
|
|
6
|
+
private readonly services;
|
|
7
|
+
constructor(services: TraversalServices);
|
|
8
|
+
redactArrayInObject(array: JsonArray, key: string, forceDeepRedaction: boolean, parent: ContainerMutation<JsonObject | JsonArray>, pathSegments: Array<string | number>): MaybeAsync<void>;
|
|
9
|
+
redactObjectsInArray(array: JsonArray, copyOnWrite: boolean, pathSegments: Array<string | number>): MaybeAsync<JsonArray>;
|
|
10
|
+
redactAllArrayValues(array: JsonArray, forceDeepRedaction: boolean, copyOnWrite: boolean, pathSegments: Array<string | number>): MaybeAsync<JsonArray>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=arrayRedaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arrayRedaction.d.ts","sourceRoot":"","sources":["../src/arrayRedaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAA2B,MAAM,0BAA0B,CAAC;AACtF,OAAO,EAAsB,UAAU,EAAiB,MAAM,cAAc,CAAC;AAE7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,iBAAiB;IAExD,mBAAmB,CACjB,KAAK,EAAE,SAAS,EAChB,GAAG,EAAE,MAAM,EACX,kBAAkB,EAAE,OAAO,EAC3B,MAAM,EAAE,iBAAiB,CAAC,UAAU,GAAG,SAAS,CAAC,EACjD,YAAY,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,GACnC,UAAU,CAAC,IAAI,CAAC;IAmBnB,oBAAoB,CAClB,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,OAAO,EACpB,YAAY,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,GACnC,UAAU,CAAC,SAAS,CAAC;IA6BxB,oBAAoB,CAClB,KAAK,EAAE,SAAS,EAChB,kBAAkB,EAAE,OAAO,EAC3B,WAAW,EAAE,OAAO,EACpB,YAAY,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,GACnC,UAAU,CAAC,SAAS,CAAC;CA0CzB"}
|