@shadowcoderr/context-graph 0.3.3 → 0.3.5

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 (60) hide show
  1. package/README.md +439 -88
  2. package/dist/analyzers/a11y-extractor.d.ts +19 -5
  3. package/dist/analyzers/a11y-extractor.d.ts.map +1 -1
  4. package/dist/analyzers/a11y-extractor.js +274 -104
  5. package/dist/analyzers/a11y-extractor.js.map +1 -1
  6. package/dist/analyzers/network-logger.d.ts +20 -2
  7. package/dist/analyzers/network-logger.d.ts.map +1 -1
  8. package/dist/analyzers/network-logger.js +122 -42
  9. package/dist/analyzers/network-logger.js.map +1 -1
  10. package/dist/analyzers/network-patterns.d.ts +73 -0
  11. package/dist/analyzers/network-patterns.d.ts.map +1 -0
  12. package/dist/analyzers/network-patterns.js +316 -0
  13. package/dist/analyzers/network-patterns.js.map +1 -0
  14. package/dist/analyzers/page-notifier.d.ts +40 -0
  15. package/dist/analyzers/page-notifier.d.ts.map +1 -0
  16. package/dist/analyzers/page-notifier.js +198 -0
  17. package/dist/analyzers/page-notifier.js.map +1 -0
  18. package/dist/analyzers/screenshot-capturer.d.ts +73 -0
  19. package/dist/analyzers/screenshot-capturer.d.ts.map +1 -0
  20. package/dist/analyzers/screenshot-capturer.js +190 -0
  21. package/dist/analyzers/screenshot-capturer.js.map +1 -0
  22. package/dist/cli/index.js +15 -6
  23. package/dist/cli/index.js.map +1 -1
  24. package/dist/config/defaults.d.ts.map +1 -1
  25. package/dist/config/defaults.js +3 -1
  26. package/dist/config/defaults.js.map +1 -1
  27. package/dist/config/schema.d.ts +8 -3
  28. package/dist/config/schema.d.ts.map +1 -1
  29. package/dist/config/schema.js +7 -2
  30. package/dist/config/schema.js.map +1 -1
  31. package/dist/core/browser-adapter.d.ts.map +1 -1
  32. package/dist/core/browser-adapter.js +0 -2
  33. package/dist/core/browser-adapter.js.map +1 -1
  34. package/dist/core/capture-engine.d.ts +30 -25
  35. package/dist/core/capture-engine.d.ts.map +1 -1
  36. package/dist/core/capture-engine.js +290 -276
  37. package/dist/core/capture-engine.js.map +1 -1
  38. package/dist/core/runtime.d.ts +1 -0
  39. package/dist/core/runtime.d.ts.map +1 -1
  40. package/dist/core/runtime.js +21 -0
  41. package/dist/core/runtime.js.map +1 -1
  42. package/dist/exporters/ai-context-bundler.d.ts +88 -0
  43. package/dist/exporters/ai-context-bundler.d.ts.map +1 -0
  44. package/dist/exporters/ai-context-bundler.js +380 -0
  45. package/dist/exporters/ai-context-bundler.js.map +1 -0
  46. package/dist/security/redactor.d.ts +16 -0
  47. package/dist/security/redactor.d.ts.map +1 -1
  48. package/dist/security/redactor.js +127 -57
  49. package/dist/security/redactor.js.map +1 -1
  50. package/dist/storage/engine.d.ts +24 -21
  51. package/dist/storage/engine.d.ts.map +1 -1
  52. package/dist/storage/engine.js +208 -175
  53. package/dist/storage/engine.js.map +1 -1
  54. package/dist/types/config.d.ts +4 -1
  55. package/dist/types/config.d.ts.map +1 -1
  56. package/dist/types/notifications.d.ts +37 -0
  57. package/dist/types/notifications.d.ts.map +1 -0
  58. package/dist/types/notifications.js +4 -0
  59. package/dist/types/notifications.js.map +1 -0
  60. package/package.json +71 -70
@@ -0,0 +1,380 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.AIContextBundler = void 0;
37
+ // Developer: Shadow Coderr, Architect
38
+ const fs = __importStar(require("fs-extra"));
39
+ const path = __importStar(require("path"));
40
+ const logger_1 = require("../utils/logger");
41
+ const version_1 = require("../utils/version");
42
+ const DEFAULT_OPTIONS = {
43
+ format: 'markdown',
44
+ maxElementsPerPage: 30,
45
+ maxA11yDepth: 5,
46
+ includeNetwork: true,
47
+ includeConsoleErrors: true,
48
+ outputFileName: 'ai_context_bundle',
49
+ };
50
+ /**
51
+ * AIContextBundler
52
+ *
53
+ * Packages one or all captured pages into a single Markdown (or JSON) file
54
+ * that can be pasted directly into an AI IDE agent (Copilot, Cursor, Claude)
55
+ * for immediate test generation or analysis.
56
+ *
57
+ * Usage (after a ContextGraph capture session):
58
+ *
59
+ * const bundler = new AIContextBundler(outputDir);
60
+ * await bundler.bundle();
61
+ * // → context-graph-output/bundles/ai_context_bundle.md
62
+ *
63
+ * The resulting file contains:
64
+ * - Session summary (domain, page count, captured timestamp)
65
+ * - Per-page: interactive element table, condensed a11y tree,
66
+ * API calls observed, console errors, and form field details
67
+ * - Ready-to-use prompt template at the end
68
+ */
69
+ class AIContextBundler {
70
+ outputDir;
71
+ options;
72
+ constructor(outputDir, options) {
73
+ this.outputDir = path.resolve(outputDir);
74
+ this.options = { ...DEFAULT_OPTIONS, ...options };
75
+ }
76
+ // ── Public API ────────────────────────────────────────────────────────────────
77
+ /**
78
+ * Bundle all captured pages in the output directory into a single file.
79
+ * Returns the path to the generated bundle.
80
+ */
81
+ async bundle() {
82
+ logger_1.logger.info('AIContextBundler: starting bundle generation');
83
+ const manifest = await this.loadManifest();
84
+ const domain = this.detectDomain();
85
+ if (!domain) {
86
+ throw new Error('No captured domain found in output directory');
87
+ }
88
+ const pagesDir = path.join(this.outputDir, domain, 'pages');
89
+ if (!(await fs.pathExists(pagesDir))) {
90
+ throw new Error(`Pages directory not found: ${pagesDir}`);
91
+ }
92
+ const pageDirs = (await fs.readdir(pagesDir, { withFileTypes: true }))
93
+ .filter(d => d.isDirectory())
94
+ .map(d => d.name)
95
+ .sort();
96
+ const bundledPages = [];
97
+ for (const pageName of pageDirs) {
98
+ try {
99
+ const bundledPage = await this.bundlePage(path.join(pagesDir, pageName), pageName);
100
+ if (bundledPage)
101
+ bundledPages.push(bundledPage);
102
+ }
103
+ catch (error) {
104
+ logger_1.logger.warn(`AIContextBundler: skipping page ${pageName}: ${error.message}`);
105
+ }
106
+ }
107
+ if (bundledPages.length === 0) {
108
+ throw new Error('No pages could be bundled — ensure at least one capture has been performed');
109
+ }
110
+ const outputPath = await this.write(bundledPages, domain, manifest);
111
+ logger_1.logger.info(`AIContextBundler: bundle saved to ${outputPath}`);
112
+ return outputPath;
113
+ }
114
+ /**
115
+ * Bundle a single specific page by page name.
116
+ */
117
+ async bundleSinglePage(pageName) {
118
+ const domain = this.detectDomain();
119
+ if (!domain)
120
+ throw new Error('No captured domain found');
121
+ const pageDir = path.join(this.outputDir, domain, 'pages', pageName);
122
+ if (!(await fs.pathExists(pageDir))) {
123
+ throw new Error(`Page directory not found: ${pageDir}`);
124
+ }
125
+ const bundledPage = await this.bundlePage(pageDir, pageName);
126
+ if (!bundledPage)
127
+ throw new Error(`Could not bundle page: ${pageName}`);
128
+ return this.write([bundledPage], domain, null);
129
+ }
130
+ // ── Private: loading and parsing ──────────────────────────────────────────────
131
+ async loadManifest() {
132
+ const manifestPath = path.join(this.outputDir, 'global_manifest.json');
133
+ if (!(await fs.pathExists(manifestPath)))
134
+ return null;
135
+ return fs.readJson(manifestPath).catch(() => null);
136
+ }
137
+ detectDomain() {
138
+ try {
139
+ const entries = fs.readdirSync(this.outputDir, { withFileTypes: true });
140
+ const domainDir = entries.find(e => e.isDirectory() && !['scripts', 'bundles', 'logs'].includes(e.name));
141
+ return domainDir?.name || null;
142
+ }
143
+ catch {
144
+ return null;
145
+ }
146
+ }
147
+ async bundlePage(pageDir, pageName) {
148
+ const metadataPath = path.join(pageDir, 'metadata.json');
149
+ const locatorsPath = path.join(pageDir, 'locators.json');
150
+ const a11yPath = path.join(pageDir, 'a11y_tree.json');
151
+ const consolePath = path.join(pageDir, 'console_errors.json');
152
+ if (!(await fs.pathExists(metadataPath)))
153
+ return null;
154
+ const metadata = await fs.readJson(metadataPath);
155
+ const locators = await fs.readJson(locatorsPath).catch(() => ({ elements: [] }));
156
+ const a11y = await fs.readJson(a11yPath).catch(() => null);
157
+ const consoleData = await fs.readJson(consolePath).catch(() => null);
158
+ // ── Interactive elements ──
159
+ const elements = this.extractElements(locators.elements || [], this.options.maxElementsPerPage);
160
+ // ── Form fields ──
161
+ const formFields = this.extractFormFields(locators.formFields || [], locators.elements || []);
162
+ // ── A11y summary ──
163
+ const a11ySummary = a11y ? this.summarizeA11y(a11y, 0, this.options.maxA11yDepth) : '(unavailable)';
164
+ // ── API calls from network summary ──
165
+ const apiCalls = this.extractApiCalls(metadata.networkSummary);
166
+ // ── Console errors ──
167
+ const consoleErrors = consoleData?.errors?.slice(0, 5) || [];
168
+ return {
169
+ url: metadata.url,
170
+ title: metadata.title,
171
+ pageName,
172
+ capturedAt: metadata.timestamp,
173
+ elements,
174
+ a11ySummary,
175
+ apiCalls,
176
+ consoleErrors,
177
+ formFields,
178
+ };
179
+ }
180
+ extractElements(rawElements, maxCount) {
181
+ if (!rawElements)
182
+ return [];
183
+ return rawElements
184
+ .filter(e => e.computedState?.isVisible)
185
+ .slice(0, maxCount)
186
+ .map(e => {
187
+ const best = e.locators?.find((l) => l.isUnique && l.strategy === 'testid') ||
188
+ e.locators?.find((l) => l.isUnique && l.strategy === 'role') ||
189
+ e.locators?.find((l) => l.isUnique) ||
190
+ e.locators?.[0];
191
+ const states = [];
192
+ if (!e.computedState?.isEnabled)
193
+ states.push('disabled');
194
+ if (e.computedState?.isChecked)
195
+ states.push('checked');
196
+ if (e.computedState?.isEditable)
197
+ states.push('editable');
198
+ return {
199
+ role: e.tagName,
200
+ name: e.text?.trim().substring(0, 50) || e.attributes?.['aria-label'] || undefined,
201
+ bestLocator: best?.value || `locator('[data-cc-element-id="${e.elementId}"]')`,
202
+ state: states.join(', ') || 'enabled',
203
+ position: e.position?.x != null && e.position?.y != null
204
+ ? `(${e.position.x}, ${e.position.y})`
205
+ : undefined,
206
+ };
207
+ });
208
+ }
209
+ extractFormFields(formFields, elements) {
210
+ const result = [];
211
+ for (const field of formFields) {
212
+ const el = elements.find(e => e.elementId === field.elementId);
213
+ const best = el?.locators?.find((l) => l.isUnique && l.strategy === 'label') ||
214
+ el?.locators?.find((l) => l.isUnique) ||
215
+ el?.locators?.[0];
216
+ result.push({
217
+ label: field.label,
218
+ type: field.fieldType || 'text',
219
+ required: field.required || false,
220
+ locator: best?.value || field.elementId,
221
+ });
222
+ }
223
+ return result;
224
+ }
225
+ summarizeA11y(node, depth, maxDepth) {
226
+ if (!node || depth > maxDepth)
227
+ return '';
228
+ const indent = ' '.repeat(depth);
229
+ const name = node.name ? ` "${node.name.substring(0, 60)}"` : '';
230
+ const states = [];
231
+ if (node.required)
232
+ states.push('required');
233
+ if (node.disabled)
234
+ states.push('disabled');
235
+ if (node.checked)
236
+ states.push('checked');
237
+ if (node.expanded !== undefined)
238
+ states.push(node.expanded ? 'expanded' : 'collapsed');
239
+ const stateStr = states.length ? ` [${states.join(', ')}]` : '';
240
+ let result = `${indent}${node.role}${name}${stateStr}\n`;
241
+ const children = node.children || [];
242
+ for (const child of children.slice(0, 10)) {
243
+ result += this.summarizeA11y(child, depth + 1, maxDepth);
244
+ }
245
+ return result;
246
+ }
247
+ extractApiCalls(networkSummary) {
248
+ if (!networkSummary?.apiEndpoints)
249
+ return [];
250
+ return networkSummary.apiEndpoints.slice(0, 15).map((ep) => ({
251
+ method: 'GET/POST',
252
+ path: ep,
253
+ }));
254
+ }
255
+ // ── Private: output generation ────────────────────────────────────────────────
256
+ async write(pages, domain, manifest) {
257
+ const bundlesDir = path.join(this.outputDir, 'bundles');
258
+ await fs.ensureDir(bundlesDir);
259
+ const ext = this.options.format === 'json' ? 'json' : 'md';
260
+ const outputPath = path.join(bundlesDir, `${this.options.outputFileName}.${ext}`);
261
+ const content = this.options.format === 'json'
262
+ ? this.renderJson(pages, domain, manifest)
263
+ : this.renderMarkdown(pages, domain, manifest);
264
+ await fs.writeFile(outputPath, content, 'utf8');
265
+ return outputPath;
266
+ }
267
+ renderJson(pages, domain, manifest) {
268
+ return JSON.stringify({
269
+ generatedAt: new Date().toISOString(),
270
+ contextGraphVersion: (0, version_1.getVersion)(),
271
+ domain,
272
+ pageCount: pages.length,
273
+ manifest: manifest?.statistics || null,
274
+ pages,
275
+ }, null, 2);
276
+ }
277
+ renderMarkdown(pages, domain, manifest) {
278
+ const stats = manifest?.statistics;
279
+ const lines = [];
280
+ // ── Header ──
281
+ lines.push(`# Application Context: ${domain}`);
282
+ lines.push('');
283
+ lines.push(`> **Generated by ContextGraph v${(0, version_1.getVersion)()}** — ${new Date().toLocaleString()}`);
284
+ lines.push(`> Pages captured: **${pages.length}** | Paste this file into your AI agent as context.`);
285
+ lines.push('');
286
+ if (stats) {
287
+ lines.push('## Session Summary');
288
+ lines.push('');
289
+ lines.push(`| Metric | Value |`);
290
+ lines.push(`|--------|-------|`);
291
+ lines.push(`| Total pages | ${stats.totalPages} |`);
292
+ lines.push(`| Network requests | ${stats.totalNetworkRequests ?? 'n/a'} |`);
293
+ lines.push(`| Screenshots | ${stats.totalScreenshots ?? 0} |`);
294
+ lines.push(`| Storage size | ${stats.storageSize} |`);
295
+ lines.push('');
296
+ }
297
+ // ── Per-page sections ──
298
+ for (let i = 0; i < pages.length; i++) {
299
+ const page = pages[i];
300
+ lines.push(`---`);
301
+ lines.push('');
302
+ lines.push(`## Page ${i + 1} of ${pages.length}: ${page.title || page.pageName}`);
303
+ lines.push('');
304
+ lines.push(`**URL:** \`${page.url}\``);
305
+ lines.push(`**Captured:** ${new Date(page.capturedAt).toLocaleString()}`);
306
+ lines.push('');
307
+ // Interactive elements
308
+ if (page.elements.length > 0) {
309
+ lines.push('### Interactive Elements');
310
+ lines.push('');
311
+ lines.push('| Element | Label/Text | Best Locator | State |');
312
+ lines.push('|---------|------------|-------------|-------|');
313
+ for (const el of page.elements) {
314
+ const name = el.name ? el.name.replace(/\|/g, '\\|') : '—';
315
+ const loc = el.bestLocator.replace(/\|/g, '\\|');
316
+ lines.push(`| \`${el.role}\` | ${name} | \`${loc}\` | ${el.state} |`);
317
+ }
318
+ lines.push('');
319
+ }
320
+ // Form fields
321
+ if (page.formFields.length > 0) {
322
+ lines.push('### Form Fields');
323
+ lines.push('');
324
+ lines.push('| Label | Type | Required | Locator |');
325
+ lines.push('|-------|------|----------|---------|');
326
+ for (const field of page.formFields) {
327
+ const label = (field.label || '—').replace(/\|/g, '\\|');
328
+ lines.push(`| ${label} | \`${field.type}\` | ${field.required ? '✓' : '—'} | \`${field.locator.replace(/\|/g, '\\|')}\` |`);
329
+ }
330
+ lines.push('');
331
+ }
332
+ // Page structure (a11y)
333
+ lines.push('### Page Structure (Accessibility Tree)');
334
+ lines.push('');
335
+ lines.push('```');
336
+ lines.push(page.a11ySummary.trimEnd());
337
+ lines.push('```');
338
+ lines.push('');
339
+ // API calls
340
+ if (this.options.includeNetwork && page.apiCalls.length > 0) {
341
+ lines.push('### API Calls Observed on This Page');
342
+ lines.push('');
343
+ for (const call of page.apiCalls) {
344
+ lines.push(`- \`${call.method}\` \`${call.path}\``);
345
+ }
346
+ lines.push('');
347
+ }
348
+ // Console errors
349
+ if (this.options.includeConsoleErrors && page.consoleErrors.length > 0) {
350
+ lines.push('### ⚠️ Console Errors');
351
+ lines.push('');
352
+ for (const err of page.consoleErrors) {
353
+ lines.push(`- \`${err.message.substring(0, 150)}\``);
354
+ }
355
+ lines.push('');
356
+ }
357
+ }
358
+ // ── Prompt template ──
359
+ lines.push('---');
360
+ lines.push('');
361
+ lines.push('## Ready-to-Use AI Prompt');
362
+ lines.push('');
363
+ lines.push('> Copy everything above (from "Application Context") and paste into your AI agent, then append:');
364
+ lines.push('');
365
+ lines.push('```');
366
+ lines.push(`I am testing the ${domain} web application.`);
367
+ lines.push('');
368
+ lines.push('Using the page context above, generate Playwright TypeScript tests that:');
369
+ lines.push('1. Navigate to each captured page');
370
+ lines.push('2. Use ONLY the locators listed in the "Interactive Elements" tables');
371
+ lines.push('3. Assert that key elements are visible and enabled');
372
+ lines.push('4. Include a happy-path test for every form field listed');
373
+ lines.push('5. Group tests by page using test.describe()');
374
+ lines.push('```');
375
+ lines.push('');
376
+ return lines.join('\n');
377
+ }
378
+ }
379
+ exports.AIContextBundler = AIContextBundler;
380
+ //# sourceMappingURL=ai-context-bundler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-context-bundler.js","sourceRoot":"","sources":["../../src/exporters/ai-context-bundler.ts"],"names":[],"mappings":"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"}
@@ -16,11 +16,27 @@ export declare class SecurityRedactor {
16
16
  private sensitiveKeys;
17
17
  private auditLog;
18
18
  constructor(customRules?: RedactionRule[]);
19
+ /**
20
+ * Sanitize a URL by replacing the values of sensitive query parameters with
21
+ * [REDACTED]. Returns the original URL string unchanged if parsing fails.
22
+ *
23
+ * Examples:
24
+ * https://api.example.com/users?api_key=sk_live_123 → …?api_key=[REDACTED]
25
+ * https://example.com/callback?code=abc&state=xyz → …?code=[REDACTED]&state=[REDACTED]
26
+ */
27
+ sanitizeUrl(url: string): string;
19
28
  redact(data: any, context: string, url?: string): Promise<RedactionResult>;
29
+ /**
30
+ * Redact a plain string in-place and return the sanitised version.
31
+ * Useful for response bodies before they are stored.
32
+ */
33
+ redactString(value: string, _context: string, _url?: string): Promise<string>;
20
34
  private redactSensitiveKeys;
21
35
  private redactHeaders;
22
36
  private applyRule;
23
37
  getAuditLog(): RedactionAuditEntry[];
24
38
  clearAuditLog(): void;
39
+ /** Returns the number of distinct redaction events across all contexts */
40
+ getTotalRedactionCount(): number;
25
41
  }
26
42
  //# sourceMappingURL=redactor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"redactor.d.ts","sourceRoot":"","sources":["../../src/security/redactor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAGvD,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,KAAK,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC,CAAC;IACH,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,eAAe,CAAW;IAClC,OAAO,CAAC,aAAa,CAA2G;IAChI,OAAO,CAAC,QAAQ,CAA6B;gBAEjC,WAAW,GAAE,aAAa,EAAO;IAKvC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAiDhF,OAAO,CAAC,mBAAmB;IA4B3B,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,SAAS;IA2BjB,WAAW,IAAI,mBAAmB,EAAE;IAIpC,aAAa,IAAI,IAAI;CAGtB"}
1
+ {"version":3,"file":"redactor.d.ts","sourceRoot":"","sources":["../../src/security/redactor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAGvD,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,KAAK,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC,CAAC;IACH,OAAO,EAAE,OAAO,CAAC;CAClB;AAqBD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,eAAe,CAAW;IAClC,OAAO,CAAC,aAAa,CAGnB;IACF,OAAO,CAAC,QAAQ,CAA6B;gBAEjC,WAAW,GAAE,aAAa,EAAO;IAO7C;;;;;;;OAOG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAgC1B,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAsChF;;;OAGG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAanF,OAAO,CAAC,mBAAmB;IA2B3B,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,SAAS;IAiCjB,WAAW,IAAI,mBAAmB,EAAE;IAIpC,aAAa,IAAI,IAAI;IAIrB,0EAA0E;IAC1E,sBAAsB,IAAI,MAAM;CAKjC"}