๐Ÿš€ Big News:Socket Has Acquired Secure Annex.Learn More โ†’
Socket
Book a DemoSign in
Socket

@redactpii/node

Package Overview
Dependencies
Maintainers
1
Versions
7
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@redactpii/node - npm Package Compare versions

Comparing version
1.0.2
to
1.0.9
+5
-2
lib/index.mjs

@@ -14,3 +14,6 @@ /**

const { apiKey, apiUrl, failSilent = true, hookTimeout = 500, rules, customRules = [], globalReplaceWith, } = options;
this.apiUrl = apiUrl ?? 'https://api.redactpii.com/v1/events';
// Only set apiUrl if apiKey is provided (dashboard is being used)
// If apiKey is provided but apiUrl is not, use the default endpoint
const hasApiKey = apiKey !== null && apiKey !== undefined && apiKey !== '';
this.apiUrl = hasApiKey ? (apiUrl ?? 'https://api.redactpii.com/v1/events') : (apiUrl ?? '');
this.apiKey = apiKey ?? null;

@@ -156,3 +159,3 @@ this.failSilent = failSilent;

async _phoneHome(events) {
if (this.apiKey === null || this.apiKey === '') {
if (this.apiKey === null || this.apiKey === '' || this.apiUrl === '') {
return;

@@ -159,0 +162,0 @@ }

@@ -1,1 +0,1 @@

{"version":3,"file":"index.mjs","sources":["src/Redactor.js"],"sourcesContent":["/**\n * Main Redactor class that provides PII redaction with optional dashboard integration.\n * Zero dependencies, blazing fast regex-based redaction.\n */\nexport class Redactor {\n apiKey;\n apiUrl;\n failSilent;\n hookTimeout;\n activeRules = [];\n globalReplaceWith;\n constructor(options = {}) {\n const { apiKey, apiUrl, failSilent = true, hookTimeout = 500, rules, customRules = [], globalReplaceWith, } = options;\n this.apiUrl = apiUrl ?? 'https://api.redactpii.com/v1/events';\n this.apiKey = apiKey ?? null;\n this.failSilent = failSilent;\n this.hookTimeout = hookTimeout;\n this.globalReplaceWith = globalReplaceWith;\n // Build active rule set - all rules enabled by default\n const defaultRules = { CREDIT_CARD: true, EMAIL: true, NAME: true, PHONE: true, SSN: true };\n this.activeRules = this.buildRuleSet(rules ?? defaultRules, customRules);\n }\n /**\n * Build active rule set from simplified configuration\n */\n buildRuleSet(rules, customRules) {\n const rulePatterns = {\n CREDIT_CARD: {\n pattern: /\\d{4}[ -]?\\d{4}[ -]?\\d{4}[ -]?\\d{4}|\\d{4}[ -]?\\d{6}[ -]?\\d{4}\\d?/g,\n name: 'CREDIT_CARD',\n },\n EMAIL: {\n pattern: /([a-z0-9_\\-.+]+)@\\w+(\\.\\w+)*/gi,\n name: 'EMAIL',\n },\n NAME: {\n pattern: /(?:^|\\.\\s+)(?:dear|hi|hello|greetings|hey|hey there)\\s+([A-Z][a-z]+(?:\\s+[A-Z][a-z]+)+)/gi,\n name: 'PERSON_NAME',\n },\n PHONE: {\n pattern: /(\\(?\\+?[0-9]{1,2}\\)?[-. ]?)?(\\(?[0-9]{3}\\)?[-. ]?[0-9]{3,4}[-. ]?[0-9]{4}|[0-9]{3}[-. ]?[0-9]{4}|[0-9]{4}[-. ]?[0-9]{4}|\\b[A-Z0-9]{7}\\b)/g,\n name: 'PHONE_NUMBER',\n },\n SSN: {\n pattern: /\\b\\d{3}[ -.]\\d{2}[ -.]\\d{4}\\b/g,\n name: 'US_SOCIAL_SECURITY_NUMBER',\n },\n };\n const activeRules = [];\n // Add enabled built-in rules\n for (const [ruleName, enabled] of Object.entries(rules)) {\n if (enabled === true && rulePatterns[ruleName] !== undefined) {\n activeRules.push(rulePatterns[ruleName]);\n }\n }\n // Add custom rules (use DIGITS as default name)\n for (const customRule of customRules) {\n activeRules.push({ pattern: customRule, name: 'DIGITS' });\n }\n return activeRules;\n }\n /**\n * Checks if text contains any PII patterns without redacting.\n * Returns true if PII is detected, false otherwise.\n */\n hasPII(text) {\n for (const { pattern } of this.activeRules) {\n // Reset regex lastIndex to ensure consistent behavior\n pattern.lastIndex = 0;\n if (pattern.test(text)) {\n return true;\n }\n }\n return false;\n }\n /**\n * Redacts PII from JSON objects recursively\n */\n redactObject(obj) {\n // Deep clone using JSON serialization\n const redacted = JSON.parse(JSON.stringify(obj));\n const redactString = (str) => {\n return this.redact(str);\n };\n const processValue = (value) => {\n if (typeof value === 'string') {\n return redactString(value);\n }\n if (Array.isArray(value)) {\n return value.map(processValue);\n }\n if (value !== null && typeof value === 'object') {\n const result = {};\n for (const [key, val] of Object.entries(value)) {\n result[key] = processValue(val);\n }\n return result;\n }\n return value;\n };\n // Type assertion needed here because JSON.parse loses type information\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return processValue(redacted);\n }\n /**\n * Redacts PII from the input text using regex-based patterns.\n * If an apiKey is configured, asynchronously sends metadata to the dashboard.\n */\n redact(text) {\n const events = [];\n let redactedText = text;\n // Apply each rule and collect events during redaction\n for (const { pattern, name } of this.activeRules) {\n redactedText = redactedText.replace(pattern, () => {\n const piiType = name;\n events.push({ pii_type: piiType, action: 'REDACTED' });\n // Use globalReplaceWith if provided, otherwise use type-specific replacements\n if (this.globalReplaceWith !== undefined) {\n return this.globalReplaceWith;\n }\n // Return appropriate replacement based on PII type\n switch (piiType) {\n case 'CREDIT_CARD':\n return 'CREDIT_CARD_NUMBER';\n case 'EMAIL':\n return 'EMAIL_ADDRESS';\n case 'PERSON_NAME':\n return 'PERSON_NAME';\n case 'PHONE_NUMBER':\n return 'PHONE_NUMBER';\n case 'US_SOCIAL_SECURITY_NUMBER':\n return 'US_SOCIAL_SECURITY_NUMBER';\n default:\n return 'DIGITS';\n }\n });\n }\n // Send events to dashboard if configured\n const hasValidApiKey = this.apiKey !== null && this.apiKey !== '';\n if (hasValidApiKey && events.length > 0) {\n // Fire and forget - intentionally not awaiting\n this._phoneHome(events).catch(() => {\n if (this.failSilent === false) {\n throw new Error('Dashboard hook failed');\n }\n // Fail silently by default\n });\n }\n return redactedText;\n }\n /**\n * Spec-compliant dashboard hook - sends redaction events to dashboard\n */\n async _phoneHome(events) {\n if (this.apiKey === null || this.apiKey === '') {\n return;\n }\n try {\n // Create AbortController for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.hookTimeout);\n const response = await fetch(this.apiUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${String(this.apiKey)}`,\n },\n body: JSON.stringify({\n sdk_version: '1.0.0',\n sdk_language: 'node',\n events, // Array of redaction events\n }),\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n if (response.ok === false) {\n throw new Error(`Dashboard API returned ${response.status}`);\n }\n }\n catch (error) {\n if (this.failSilent === false) {\n throw error;\n }\n // Fail silently by default\n }\n }\n}\n//# sourceMappingURL=Redactor.js.map"],"names":[],"mappings":"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"}
{"version":3,"file":"index.mjs","sources":["src/Redactor.js"],"sourcesContent":["/**\n * Main Redactor class that provides PII redaction with optional dashboard integration.\n * Zero dependencies, blazing fast regex-based redaction.\n */\nexport class Redactor {\n apiKey;\n apiUrl;\n failSilent;\n hookTimeout;\n activeRules = [];\n globalReplaceWith;\n constructor(options = {}) {\n const { apiKey, apiUrl, failSilent = true, hookTimeout = 500, rules, customRules = [], globalReplaceWith, } = options;\n // Only set apiUrl if apiKey is provided (dashboard is being used)\n // If apiKey is provided but apiUrl is not, use the default endpoint\n const hasApiKey = apiKey !== null && apiKey !== undefined && apiKey !== '';\n this.apiUrl = hasApiKey ? (apiUrl ?? 'https://api.redactpii.com/v1/events') : (apiUrl ?? '');\n this.apiKey = apiKey ?? null;\n this.failSilent = failSilent;\n this.hookTimeout = hookTimeout;\n this.globalReplaceWith = globalReplaceWith;\n // Build active rule set - all rules enabled by default\n const defaultRules = { CREDIT_CARD: true, EMAIL: true, NAME: true, PHONE: true, SSN: true };\n this.activeRules = this.buildRuleSet(rules ?? defaultRules, customRules);\n }\n /**\n * Build active rule set from simplified configuration\n */\n buildRuleSet(rules, customRules) {\n const rulePatterns = {\n CREDIT_CARD: {\n pattern: /\\d{4}[ -]?\\d{4}[ -]?\\d{4}[ -]?\\d{4}|\\d{4}[ -]?\\d{6}[ -]?\\d{4}\\d?/g,\n name: 'CREDIT_CARD',\n },\n EMAIL: {\n pattern: /([a-z0-9_\\-.+]+)@\\w+(\\.\\w+)*/gi,\n name: 'EMAIL',\n },\n NAME: {\n pattern: /(?:^|\\.\\s+)(?:dear|hi|hello|greetings|hey|hey there)\\s+([A-Z][a-z]+(?:\\s+[A-Z][a-z]+)+)/gi,\n name: 'PERSON_NAME',\n },\n PHONE: {\n pattern: /(\\(?\\+?[0-9]{1,2}\\)?[-. ]?)?(\\(?[0-9]{3}\\)?[-. ]?[0-9]{3,4}[-. ]?[0-9]{4}|[0-9]{3}[-. ]?[0-9]{4}|[0-9]{4}[-. ]?[0-9]{4}|\\b[A-Z0-9]{7}\\b)/g,\n name: 'PHONE_NUMBER',\n },\n SSN: {\n pattern: /\\b\\d{3}[ -.]\\d{2}[ -.]\\d{4}\\b/g,\n name: 'US_SOCIAL_SECURITY_NUMBER',\n },\n };\n const activeRules = [];\n // Add enabled built-in rules\n for (const [ruleName, enabled] of Object.entries(rules)) {\n if (enabled === true && rulePatterns[ruleName] !== undefined) {\n activeRules.push(rulePatterns[ruleName]);\n }\n }\n // Add custom rules (use DIGITS as default name)\n for (const customRule of customRules) {\n activeRules.push({ pattern: customRule, name: 'DIGITS' });\n }\n return activeRules;\n }\n /**\n * Checks if text contains any PII patterns without redacting.\n * Returns true if PII is detected, false otherwise.\n */\n hasPII(text) {\n for (const { pattern } of this.activeRules) {\n // Reset regex lastIndex to ensure consistent behavior\n pattern.lastIndex = 0;\n if (pattern.test(text)) {\n return true;\n }\n }\n return false;\n }\n /**\n * Redacts PII from JSON objects recursively\n */\n redactObject(obj) {\n // Deep clone using JSON serialization\n const redacted = JSON.parse(JSON.stringify(obj));\n const redactString = (str) => {\n return this.redact(str);\n };\n const processValue = (value) => {\n if (typeof value === 'string') {\n return redactString(value);\n }\n if (Array.isArray(value)) {\n return value.map(processValue);\n }\n if (value !== null && typeof value === 'object') {\n const result = {};\n for (const [key, val] of Object.entries(value)) {\n result[key] = processValue(val);\n }\n return result;\n }\n return value;\n };\n // Type assertion needed here because JSON.parse loses type information\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return processValue(redacted);\n }\n /**\n * Redacts PII from the input text using regex-based patterns.\n * If an apiKey is configured, asynchronously sends metadata to the dashboard.\n */\n redact(text) {\n const events = [];\n let redactedText = text;\n // Apply each rule and collect events during redaction\n for (const { pattern, name } of this.activeRules) {\n redactedText = redactedText.replace(pattern, () => {\n const piiType = name;\n events.push({ pii_type: piiType, action: 'REDACTED' });\n // Use globalReplaceWith if provided, otherwise use type-specific replacements\n if (this.globalReplaceWith !== undefined) {\n return this.globalReplaceWith;\n }\n // Return appropriate replacement based on PII type\n switch (piiType) {\n case 'CREDIT_CARD':\n return 'CREDIT_CARD_NUMBER';\n case 'EMAIL':\n return 'EMAIL_ADDRESS';\n case 'PERSON_NAME':\n return 'PERSON_NAME';\n case 'PHONE_NUMBER':\n return 'PHONE_NUMBER';\n case 'US_SOCIAL_SECURITY_NUMBER':\n return 'US_SOCIAL_SECURITY_NUMBER';\n default:\n return 'DIGITS';\n }\n });\n }\n // Send events to dashboard if configured\n const hasValidApiKey = this.apiKey !== null && this.apiKey !== '';\n if (hasValidApiKey && events.length > 0) {\n // Fire and forget - intentionally not awaiting\n this._phoneHome(events).catch(() => {\n if (this.failSilent === false) {\n throw new Error('Dashboard hook failed');\n }\n // Fail silently by default\n });\n }\n return redactedText;\n }\n /**\n * Spec-compliant dashboard hook - sends redaction events to dashboard\n */\n async _phoneHome(events) {\n if (this.apiKey === null || this.apiKey === '' || this.apiUrl === '') {\n return;\n }\n try {\n // Create AbortController for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.hookTimeout);\n const response = await fetch(this.apiUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${String(this.apiKey)}`,\n },\n body: JSON.stringify({\n sdk_version: '1.0.0',\n sdk_language: 'node',\n events, // Array of redaction events\n }),\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n if (response.ok === false) {\n throw new Error(`Dashboard API returned ${response.status}`);\n }\n }\n catch (error) {\n if (this.failSilent === false) {\n throw error;\n }\n // Fail silently by default\n }\n }\n}\n//# sourceMappingURL=Redactor.js.map"],"names":[],"mappings":"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"}

@@ -1,1 +0,1 @@

{"version":3,"file":"Redactor.d.ts","sourceRoot":"","sources":["../../src/Redactor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAuB,MAAM,SAAS,CAAC;AAEpE;;;GAGG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAgD;IACnE,OAAO,CAAC,iBAAiB,CAAqB;gBAElC,OAAO,GAAE,eAAoB;IAsBzC;;OAEG;IACH,OAAO,CAAC,YAAY;IA6CpB;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAY7B;;OAEG;IACH,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC;IA8BzC;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAgD5B;;OAEG;YACW,UAAU;CAoCzB"}
{"version":3,"file":"Redactor.d.ts","sourceRoot":"","sources":["../../src/Redactor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAuB,MAAM,SAAS,CAAC;AAEpE;;;GAGG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAgD;IACnE,OAAO,CAAC,iBAAiB,CAAqB;gBAElC,OAAO,GAAE,eAAoB;IAyBzC;;OAEG;IACH,OAAO,CAAC,YAAY;IA6CpB;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAY7B;;OAEG;IACH,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC;IA8BzC;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAgD5B;;OAEG;YACW,UAAU;CAoCzB"}

@@ -14,3 +14,6 @@ /**

const { apiKey, apiUrl, failSilent = true, hookTimeout = 500, rules, customRules = [], globalReplaceWith, } = options;
this.apiUrl = apiUrl ?? 'https://api.redactpii.com/v1/events';
// Only set apiUrl if apiKey is provided (dashboard is being used)
// If apiKey is provided but apiUrl is not, use the default endpoint
const hasApiKey = apiKey !== null && apiKey !== undefined && apiKey !== '';
this.apiUrl = hasApiKey ? (apiUrl ?? 'https://api.redactpii.com/v1/events') : (apiUrl ?? '');
this.apiKey = apiKey ?? null;

@@ -156,3 +159,3 @@ this.failSilent = failSilent;

async _phoneHome(events) {
if (this.apiKey === null || this.apiKey === '') {
if (this.apiKey === null || this.apiKey === '' || this.apiUrl === '') {
return;

@@ -159,0 +162,0 @@ }

@@ -1,1 +0,1 @@

{"version":3,"file":"Redactor.js","sourceRoot":"","sources":["../../src/Redactor.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,OAAO,QAAQ;IACX,MAAM,CAAgB;IACtB,MAAM,CAAS;IACf,UAAU,CAAU;IACpB,WAAW,CAAS;IACpB,WAAW,GAA6C,EAAE,CAAC;IAC3D,iBAAiB,CAAqB;IAE9C,YAAY,UAA2B,EAAE;QACvC,MAAM,EACJ,MAAM,EACN,MAAM,EACN,UAAU,GAAG,IAAI,EACjB,WAAW,GAAG,GAAG,EACjB,KAAK,EACL,WAAW,GAAG,EAAE,EAChB,iBAAiB,GAClB,GAAG,OAAO,CAAC;QAEZ,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,qCAAqC,CAAC;QAC9D,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,IAAI,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAE3C,uDAAuD;QACvD,MAAM,YAAY,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;QAC5F,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,IAAI,YAAY,EAAE,WAAW,CAAC,CAAC;IAC3E,CAAC;IAED;;OAEG;IACK,YAAY,CAClB,KAA4C,EAC5C,WAAqB;QAErB,MAAM,YAAY,GAAsD;YACtE,WAAW,EAAE;gBACX,OAAO,EAAE,mEAAmE;gBAC5E,IAAI,EAAE,aAAa;aACpB;YACD,KAAK,EAAE;gBACL,OAAO,EAAE,gCAAgC;gBACzC,IAAI,EAAE,OAAO;aACd;YACD,IAAI,EAAE;gBACJ,OAAO,EAAE,2FAA2F;gBACpG,IAAI,EAAE,aAAa;aACpB;YACD,KAAK,EAAE;gBACL,OAAO,EACL,2IAA2I;gBAC7I,IAAI,EAAE,cAAc;aACrB;YACD,GAAG,EAAE;gBACH,OAAO,EAAE,gCAAgC;gBACzC,IAAI,EAAE,2BAA2B;aAClC;SACF,CAAC;QAEF,MAAM,WAAW,GAA6C,EAAE,CAAC;QAEjE,6BAA6B;QAC7B,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACxD,IAAI,OAAO,KAAK,IAAI,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC7D,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,gDAAgD;QAChD,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,WAAW,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,IAAY;QACjB,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC3C,sDAAsD;YACtD,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;YACtB,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvB,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,YAAY,CAAmB,GAAM;QACnC,sCAAsC;QACtC,MAAM,QAAQ,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAE1D,MAAM,YAAY,GAAG,CAAC,GAAW,EAAU,EAAE;YAC3C,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC,CAAC;QAEF,MAAM,YAAY,GAAG,CAAC,KAAc,EAAW,EAAE;YAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;YACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACjC,CAAC;YACD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAChD,MAAM,MAAM,GAA4B,EAAE,CAAC;gBAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC/C,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;gBAClC,CAAC;gBACD,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QAEF,uEAAuE;QACvE,yEAAyE;QACzE,OAAO,YAAY,CAAC,QAAQ,CAAM,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,IAAY;QACjB,MAAM,MAAM,GAAqB,EAAE,CAAC;QACpC,IAAI,YAAY,GAAG,IAAI,CAAC;QAExB,sDAAsD;QACtD,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACjD,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE;gBAChD,MAAM,OAAO,GAAG,IAAI,CAAC;gBACrB,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;gBAEvD,8EAA8E;gBAC9E,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;oBACzC,OAAO,IAAI,CAAC,iBAAiB,CAAC;gBAChC,CAAC;gBAED,mDAAmD;gBACnD,QAAQ,OAAO,EAAE,CAAC;oBAChB,KAAK,aAAa;wBAChB,OAAO,oBAAoB,CAAC;oBAC9B,KAAK,OAAO;wBACV,OAAO,eAAe,CAAC;oBACzB,KAAK,aAAa;wBAChB,OAAO,aAAa,CAAC;oBACvB,KAAK,cAAc;wBACjB,OAAO,cAAc,CAAC;oBACxB,KAAK,2BAA2B;wBAC9B,OAAO,2BAA2B,CAAC;oBACrC;wBACE,OAAO,QAAQ,CAAC;gBACpB,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,yCAAyC;QACzC,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,EAAE,CAAC;QAClE,IAAI,cAAc,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,+CAA+C;YAC/C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;gBACjC,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;oBAC9B,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;gBAC3C,CAAC;gBACD,2BAA2B;YAC7B,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,UAAU,CAAC,MAAwB;QAC/C,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;YAC/C,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,qCAAqC;YACrC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAEzE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE;gBACxC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,aAAa,EAAE,UAAU,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;iBAC/C;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,WAAW,EAAE,OAAO;oBACpB,YAAY,EAAE,MAAM;oBACpB,MAAM,EAAE,4BAA4B;iBACrC,CAAC;gBACF,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,YAAY,CAAC,SAAS,CAAC,CAAC;YAExB,IAAI,QAAQ,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;gBAC9B,MAAM,KAAK,CAAC;YACd,CAAC;YACD,2BAA2B;QAC7B,CAAC;IACH,CAAC;CACF"}
{"version":3,"file":"Redactor.js","sourceRoot":"","sources":["../../src/Redactor.ts"],"names":[],"mappings":"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"}
{
"name": "@redactpii/node",
"version": "1.0.2",
"version": "1.0.9",
"type": "module",

@@ -5,0 +5,0 @@ "description": "Zero dependencies, blazing fast regex-based PII redaction with optional compliance dashboard integration. The modern fork of the abandoned 786k-download library.",

+17
-73

@@ -5,12 +5,15 @@ # @redactpii/node

> **โšก Zero-dependency, blazing-fast regex-based PII redaction with optional compliance dashboard integration.**
> **โšก Simple, local, offline-only PII redaction. Zero dependencies. Works completely standalone.**
Built for the modern AI stack. Protect PII **before** it hits OpenAI, Anthropic, or LangChain with **optional dashboard integration** for SOC 2 & HIPAA audit trails.
A simple, local, offline PII redaction tool. Works perfectly without any API keys or external services.
## โšก Zero Dependencies. Blazing Fast. Enterprise Ready.
## ๐ŸŽฏ Simple & Local First
**This tool works 100% offline, locally, with zero external dependencies.** No API keys required. No internet connection needed. Everything runs on your machine.
## โšก Zero Dependencies. Blazing Fast. Works Offline.
- **<1ms per operation** - Optimized regex engine
- **Zero external dependencies** - Pure TypeScript, no bloat
- **Dashboard integration** - SOC 2/HIPAA audit trails (optional)
- **Zero-trust security** - Never sends PII, only metadata
- **100% local & offline** - Works without internet or API keys
- **TypeScript first** - Full type safety and IDE support

@@ -39,2 +42,3 @@

// Works completely offline - no API keys, no internet needed
const redactor = new Redactor();

@@ -46,31 +50,4 @@ const clean = redactor.redact('Hi David Johnson, call 555-555-5555');

### ๐Ÿ›ก๏ธ Enterprise Compliance (SOC 2/HIPAA Ready)
That's it! Everything runs locally on your machine.
Enable **optional dashboard integration** for audit trails:
```typescript
import { Redactor } from '@redactpii/node';
const redactor = new Redactor({
apiKey: process.env.REDACTPII_API_KEY, // Enables compliance dashboard
apiUrl: 'https://api.redactpii.com/v1/events', // Your audit endpoint (optional)
rules: {
CREDIT_CARD: true,
EMAIL: true,
NAME: true,
PHONE: true,
SSN: true,
},
});
const clean = redactor.redact('CEO john@acme.com called from 555-123-4567 with SSN 123-45-6789');
// Result: "CEO EMAIL_ADDRESS called from PHONE_NUMBER with SSN US_SOCIAL_SECURITY_NUMBER"
// ๐Ÿ”’ Zero-trust: Only metadata sent to dashboard
// ๐Ÿ“Š Audit log: { "sdk_version": "1.0.0", "pii_type": "EMAIL", "action": "REDACTED" }
```
> **๐Ÿ” Zero-Trust Guarantee**: Never sends actual PII data. Only anonymized metadata for compliance reporting. Non-blocking requests with 500ms timeout - never impacts your app performance.
### ๐ŸŽฏ PII Detection

@@ -123,3 +100,3 @@

Protect PII **before** it hits AI APIs. This is your compliance safety net.
Protect PII **before** it hits AI APIs.

@@ -134,3 +111,2 @@ <details>

const redactor = new Redactor({
apiKey: process.env.REDACTPII_API_KEY,
rules: { SSN: true, EMAIL: true },

@@ -150,5 +126,2 @@ });

});
// 3. Your audit log on redactpii.com now has proof
// of the redaction *before* it hit OpenAI.
```

@@ -165,10 +138,8 @@

// 1. Init the redactor with your dashboard API key
const redactor = new Redactor({ apiKey: process.env.REDACTPII_API_KEY });
const redactor = new Redactor({ rules: { EMAIL: true } });
const model = new ChatOpenAI();
// 2. Create a "runnable" middleware to redact input
// Create a "runnable" middleware to redact input
const redactingMiddleware = (input: { query: string }) => {
if (redactor.hasPII(input.query)) {
// Redact the input and log it to your dashboard
const safeQuery = redactor.redact(input.query);

@@ -180,10 +151,8 @@ return { ...input, query: safeQuery };

// 3. Build your chain
// Build your chain
const chain = redactingMiddleware.pipe(model);
// ... etc
// 4. Run the chain with PII
// Run the chain with PII
const result = await chain.invoke({ query: 'My email is john@acme.com' });
// Your prompt was safely redacted before hitting the LLM.
```

@@ -232,27 +201,2 @@

### ๐Ÿ›ก๏ธ Dashboard Hook Configuration
```typescript
const redactor = new Redactor({
apiKey: 'your-api-key',
apiUrl: 'https://api.redactpii.com/v1/events', // Optional, defaults to this
failSilent: true, // Default: true (fail silently if dashboard is down)
hookTimeout: 500, // Default: 500ms timeout for dashboard requests
rules: { EMAIL: true },
});
```
**Dashboard Payload:**
```json
{
"sdk_version": "1.0.0",
"sdk_language": "node",
"events": [
{ "pii_type": "EMAIL", "action": "REDACTED" },
{ "pii_type": "PHONE_NUMBER", "action": "REDACTED" }
]
}
```
## ๐Ÿงช Quality Assurance

@@ -292,6 +236,6 @@

We welcome contributions! This library powers compliance for thousands of applications.
We welcome contributions! This library powers PII redaction for thousands of applications.
---
**Built for the modern AI stack with optional SOC 2/HIPAA audit logs.**
**Simple, local, offline PII redaction. Works standalone.**