nz-privacy-auditor 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/README.md +152 -0
  2. package/data/llm_cache/cache.json +1 -0
  3. package/dist/cli.d.ts +16 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +233 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/detectors/address.d.ts +48 -0
  8. package/dist/detectors/address.d.ts.map +1 -0
  9. package/dist/detectors/address.js +262 -0
  10. package/dist/detectors/address.js.map +1 -0
  11. package/dist/detectors/base.d.ts +43 -0
  12. package/dist/detectors/base.d.ts.map +1 -0
  13. package/dist/detectors/base.js +6 -0
  14. package/dist/detectors/base.js.map +1 -0
  15. package/dist/detectors/driver_licence.d.ts +38 -0
  16. package/dist/detectors/driver_licence.d.ts.map +1 -0
  17. package/dist/detectors/driver_licence.js +80 -0
  18. package/dist/detectors/driver_licence.js.map +1 -0
  19. package/dist/detectors/ird.d.ts +37 -0
  20. package/dist/detectors/ird.d.ts.map +1 -0
  21. package/dist/detectors/ird.js +103 -0
  22. package/dist/detectors/ird.js.map +1 -0
  23. package/dist/detectors/maori_name.d.ts +36 -0
  24. package/dist/detectors/maori_name.d.ts.map +1 -0
  25. package/dist/detectors/maori_name.js +251 -0
  26. package/dist/detectors/maori_name.js.map +1 -0
  27. package/dist/detectors/nhi.d.ts +44 -0
  28. package/dist/detectors/nhi.d.ts.map +1 -0
  29. package/dist/detectors/nhi.js +147 -0
  30. package/dist/detectors/nhi.js.map +1 -0
  31. package/dist/detectors/phone.d.ts +49 -0
  32. package/dist/detectors/phone.d.ts.map +1 -0
  33. package/dist/detectors/phone.js +126 -0
  34. package/dist/detectors/phone.js.map +1 -0
  35. package/dist/index.d.ts +25 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +52 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/report.d.ts +14 -0
  40. package/dist/report.d.ts.map +1 -0
  41. package/dist/report.js +90 -0
  42. package/dist/report.js.map +1 -0
  43. package/dist/scanner.d.ts +51 -0
  44. package/dist/scanner.d.ts.map +1 -0
  45. package/dist/scanner.js +114 -0
  46. package/dist/scanner.js.map +1 -0
  47. package/dist/verification.d.ts +25 -0
  48. package/dist/verification.d.ts.map +1 -0
  49. package/dist/verification.js +89 -0
  50. package/dist/verification.js.map +1 -0
  51. package/dist/verifiers/base.d.ts +27 -0
  52. package/dist/verifiers/base.d.ts.map +1 -0
  53. package/dist/verifiers/base.js +24 -0
  54. package/dist/verifiers/base.js.map +1 -0
  55. package/dist/verifiers/cache.d.ts +23 -0
  56. package/dist/verifiers/cache.d.ts.map +1 -0
  57. package/dist/verifiers/cache.js +103 -0
  58. package/dist/verifiers/cache.js.map +1 -0
  59. package/dist/verifiers/gemini.d.ts +38 -0
  60. package/dist/verifiers/gemini.d.ts.map +1 -0
  61. package/dist/verifiers/gemini.js +121 -0
  62. package/dist/verifiers/gemini.js.map +1 -0
  63. package/dist/verifiers/index.d.ts +8 -0
  64. package/dist/verifiers/index.d.ts.map +1 -0
  65. package/dist/verifiers/index.js +16 -0
  66. package/dist/verifiers/index.js.map +1 -0
  67. package/package.json +96 -0
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ /**
3
+ * JSON-file-backed cache for LLM verification results.
4
+ *
5
+ * Re-running the auditor on the same dataset must not re-burn quota. The
6
+ * cache key is a SHA-256 hash of (detector, value, context) so identical
7
+ * values in identical context windows return immediately without an API
8
+ * call.
9
+ *
10
+ * A JSON file is used instead of SQLite to keep the package zero-native-dep
11
+ * (no compilation required on install). For our single-process,
12
+ * single-user audit workflow, this is sufficient.
13
+ */
14
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ var desc = Object.getOwnPropertyDescriptor(m, k);
17
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
18
+ desc = { enumerable: true, get: function() { return m[k]; } };
19
+ }
20
+ Object.defineProperty(o, k2, desc);
21
+ }) : (function(o, m, k, k2) {
22
+ if (k2 === undefined) k2 = k;
23
+ o[k2] = m[k];
24
+ }));
25
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
26
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
27
+ }) : function(o, v) {
28
+ o["default"] = v;
29
+ });
30
+ var __importStar = (this && this.__importStar) || (function () {
31
+ var ownKeys = function(o) {
32
+ ownKeys = Object.getOwnPropertyNames || function (o) {
33
+ var ar = [];
34
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
35
+ return ar;
36
+ };
37
+ return ownKeys(o);
38
+ };
39
+ return function (mod) {
40
+ if (mod && mod.__esModule) return mod;
41
+ var result = {};
42
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
43
+ __setModuleDefault(result, mod);
44
+ return result;
45
+ };
46
+ })();
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.VerificationCache = void 0;
49
+ const crypto = __importStar(require("crypto"));
50
+ const fs = __importStar(require("fs"));
51
+ const path = __importStar(require("path"));
52
+ function makeKey(detector, value, context) {
53
+ const payload = JSON.stringify([detector, value, context]);
54
+ return crypto.createHash("sha256").update(payload).digest("hex");
55
+ }
56
+ class VerificationCache {
57
+ constructor(filePath) {
58
+ this.filePath = filePath;
59
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
60
+ if (fs.existsSync(filePath)) {
61
+ try {
62
+ this.data = JSON.parse(fs.readFileSync(filePath, "utf-8"));
63
+ }
64
+ catch {
65
+ // Corrupt cache — start fresh.
66
+ this.data = {};
67
+ }
68
+ }
69
+ else {
70
+ this.data = {};
71
+ }
72
+ }
73
+ get(detector, value, context) {
74
+ const key = makeKey(detector, value, context);
75
+ const entry = this.data[key];
76
+ if (!entry)
77
+ return null;
78
+ return {
79
+ verdict: entry.verdict,
80
+ confidence: entry.confidence,
81
+ reason: entry.reason,
82
+ cached: true,
83
+ };
84
+ }
85
+ put(detector, value, context, result) {
86
+ const key = makeKey(detector, value, context);
87
+ this.data[key] = {
88
+ verdict: result.verdict,
89
+ confidence: result.confidence,
90
+ reason: result.reason,
91
+ created_at: Date.now(),
92
+ };
93
+ this.flush();
94
+ }
95
+ flush() {
96
+ fs.writeFileSync(this.filePath, JSON.stringify(this.data));
97
+ }
98
+ close() {
99
+ this.flush();
100
+ }
101
+ }
102
+ exports.VerificationCache = VerificationCache;
103
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/verifiers/cache.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,+CAAiC;AACjC,uCAAyB;AACzB,2CAA6B;AAI7B,SAAS,OAAO,CAAC,QAAgB,EAAE,KAAa,EAAE,OAAe;IAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3D,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACnE,CAAC;AASD,MAAa,iBAAiB;IAI5B,YAAY,QAAgB;QAC1B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACH,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;YAC7D,CAAC;YAAC,MAAM,CAAC;gBACP,+BAA+B;gBAC/B,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;YACjB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAED,GAAG,CAAC,QAAgB,EAAE,KAAa,EAAE,OAAe;QAClD,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,MAAM,EAAE,IAAI;SACb,CAAC;IACJ,CAAC;IAED,GAAG,CACD,QAAgB,EAChB,KAAa,EACb,OAAe,EACf,MAA0B;QAE1B,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;YACf,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;SACvB,CAAC;QACF,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAEO,KAAK;QACX,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;CACF;AAtDD,8CAsDC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Gemini-backed LLMVerifier (model gemini-2.5-flash).
3
+ *
4
+ * Uses the Generative Language API REST endpoint directly via Node 18+
5
+ * built-in `fetch()` — no google-genai SDK dependency. Results are cached
6
+ * on disk via VerificationCache so re-running the auditor on the same
7
+ * dataset is free.
8
+ *
9
+ * Quota handling:
10
+ * - On HTTP 429, throws QuotaExceededError so the calling code can stop
11
+ * cleanly rather than retrying in a tight loop.
12
+ * - All other errors fall back to a Verdict.UNCERTAIN result so a single
13
+ * bad call cannot abort an audit.
14
+ */
15
+ import { type LLMVerifier, type VerificationResult } from "./base";
16
+ import { VerificationCache } from "./cache";
17
+ export declare const DEFAULT_MODEL = "gemini-2.5-flash";
18
+ export declare const DEFAULT_CACHE_PATH = "data/llm_cache/cache.json";
19
+ export interface GeminiVerifierOptions {
20
+ model?: string;
21
+ cachePath?: string;
22
+ apiKey?: string;
23
+ /** Optional fetch override, primarily for tests. */
24
+ fetchFn?: typeof fetch;
25
+ }
26
+ /**
27
+ * Gemini-backed LLM verifier with disk caching and clean 429 handling.
28
+ */
29
+ export declare class GeminiVerifier implements LLMVerifier {
30
+ readonly model: string;
31
+ readonly cache: VerificationCache;
32
+ private readonly apiKey;
33
+ private readonly fetchFn;
34
+ constructor(options?: GeminiVerifierOptions);
35
+ verify(detector: string, value: string, context: string): Promise<VerificationResult>;
36
+ close(): void;
37
+ }
38
+ //# sourceMappingURL=gemini.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/verifiers/gemini.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,kBAAkB,EAExB,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAE5C,eAAO,MAAM,aAAa,qBAAqB,CAAC;AAChD,eAAO,MAAM,kBAAkB,8BAA8B,CAAC;AAkD9D,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,cAAe,YAAW,WAAW;IAChD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;gBAE3B,OAAO,GAAE,qBAA0B;IAczC,MAAM,CACV,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,kBAAkB,CAAC;IAuD9B,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ /**
3
+ * Gemini-backed LLMVerifier (model gemini-2.5-flash).
4
+ *
5
+ * Uses the Generative Language API REST endpoint directly via Node 18+
6
+ * built-in `fetch()` — no google-genai SDK dependency. Results are cached
7
+ * on disk via VerificationCache so re-running the auditor on the same
8
+ * dataset is free.
9
+ *
10
+ * Quota handling:
11
+ * - On HTTP 429, throws QuotaExceededError so the calling code can stop
12
+ * cleanly rather than retrying in a tight loop.
13
+ * - All other errors fall back to a Verdict.UNCERTAIN result so a single
14
+ * bad call cannot abort an audit.
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.GeminiVerifier = exports.DEFAULT_CACHE_PATH = exports.DEFAULT_MODEL = void 0;
18
+ const base_1 = require("./base");
19
+ const cache_1 = require("./cache");
20
+ exports.DEFAULT_MODEL = "gemini-2.5-flash";
21
+ exports.DEFAULT_CACHE_PATH = "data/llm_cache/cache.json";
22
+ const API_BASE = "https://generativelanguage.googleapis.com/v1beta/models";
23
+ const PROMPT_TEMPLATE = (detector, description, value, context) => `You are a Privacy Act 2020 compliance assistant. A regex / heuristic detector
24
+ has flagged a candidate value as ${description}. Decide whether the value is
25
+ genuinely an instance of that PII type IN ITS CONTEXT, or whether it merely
26
+ matches the shape (e.g. an SKU that looks like a driver-licence number).
27
+
28
+ Detector: ${detector}
29
+ Value: "${value}"
30
+ Full cell: "${context.replace(/"/g, "'")}"
31
+
32
+ Respond with ONLY a single JSON object on one line, no markdown, no commentary:
33
+ {"verdict": "confirmed" | "rejected" | "uncertain", "confidence": <float 0..1>, "reason": "<one short sentence>"}
34
+
35
+ Verdict meanings:
36
+ - confirmed: the value really is ${description} in this context
37
+ - rejected: the value matches the detector's shape but is clearly NOT ${description}
38
+ - uncertain: cannot decide from the available context
39
+ `;
40
+ function parseResponse(text) {
41
+ let cleaned = text.trim();
42
+ // Strip ```json fences if the model added them despite the instruction.
43
+ if (cleaned.startsWith("```")) {
44
+ cleaned = cleaned
45
+ .split("\n")
46
+ .filter((line) => !line.trim().startsWith("```"))
47
+ .join("\n");
48
+ }
49
+ const obj = JSON.parse(cleaned);
50
+ const verdict = String(obj.verdict).toLowerCase();
51
+ if (!["confirmed", "rejected", "uncertain"].includes(verdict)) {
52
+ throw new Error(`invalid verdict: ${verdict}`);
53
+ }
54
+ const rawConf = typeof obj.confidence === "number" ? obj.confidence : 0.5;
55
+ const confidence = Math.max(0, Math.min(1, rawConf));
56
+ const reason = String(obj.reason ?? "").trim();
57
+ return { verdict, confidence, reason };
58
+ }
59
+ /**
60
+ * Gemini-backed LLM verifier with disk caching and clean 429 handling.
61
+ */
62
+ class GeminiVerifier {
63
+ constructor(options = {}) {
64
+ this.model = options.model ?? exports.DEFAULT_MODEL;
65
+ this.cache = new cache_1.VerificationCache(options.cachePath ?? exports.DEFAULT_CACHE_PATH);
66
+ const key = options.apiKey ?? process.env.GOOGLE_API_KEY;
67
+ if (!key) {
68
+ throw new Error("GOOGLE_API_KEY is not set. Export it in your shell or pass " +
69
+ "apiKey= explicitly.");
70
+ }
71
+ this.apiKey = key;
72
+ this.fetchFn = options.fetchFn ?? fetch;
73
+ }
74
+ async verify(detector, value, context) {
75
+ const cached = this.cache.get(detector, value, context);
76
+ if (cached !== null)
77
+ return cached;
78
+ const prompt = PROMPT_TEMPLATE(detector, base_1.DETECTOR_DESCRIPTIONS[detector] ?? "the claimed PII type", value, context);
79
+ let result;
80
+ try {
81
+ const response = await this.fetchFn(`${API_BASE}/${this.model}:generateContent?key=${this.apiKey}`, {
82
+ method: "POST",
83
+ headers: { "Content-Type": "application/json" },
84
+ body: JSON.stringify({
85
+ contents: [{ parts: [{ text: prompt }] }],
86
+ }),
87
+ });
88
+ if (response.status === 429) {
89
+ throw new base_1.QuotaExceededError(`Gemini API 429: ${await response.text()}`);
90
+ }
91
+ if (!response.ok) {
92
+ throw new Error(`Gemini API ${response.status}: ${await response.text()}`);
93
+ }
94
+ const body = (await response.json());
95
+ const text = body.candidates?.[0]?.content?.parts?.[0]?.text ?? "";
96
+ const parsed = parseResponse(text);
97
+ result = { ...parsed, cached: false };
98
+ }
99
+ catch (exc) {
100
+ if (exc instanceof base_1.QuotaExceededError)
101
+ throw exc;
102
+ const msg = String(exc);
103
+ if (msg.includes("429") || /quota/i.test(msg) || /rate/i.test(msg)) {
104
+ throw new base_1.QuotaExceededError(msg);
105
+ }
106
+ result = {
107
+ verdict: "uncertain",
108
+ confidence: 0.5,
109
+ reason: `LLM error: ${exc instanceof Error ? exc.name : "unknown"}`,
110
+ cached: false,
111
+ };
112
+ }
113
+ this.cache.put(detector, value, context, result);
114
+ return result;
115
+ }
116
+ close() {
117
+ this.cache.close();
118
+ }
119
+ }
120
+ exports.GeminiVerifier = GeminiVerifier;
121
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/verifiers/gemini.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * LLM verification layer for second-pass review of low-confidence findings.
3
+ */
4
+ export type { LLMVerifier, VerificationResult, Verdict } from "./base";
5
+ export { DETECTOR_DESCRIPTIONS, QuotaExceededError } from "./base";
6
+ export { VerificationCache } from "./cache";
7
+ export { DEFAULT_CACHE_PATH, DEFAULT_MODEL, GeminiVerifier, type GeminiVerifierOptions, } from "./gemini";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/verifiers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,KAAK,qBAAqB,GAC3B,MAAM,UAAU,CAAC"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ /**
3
+ * LLM verification layer for second-pass review of low-confidence findings.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.GeminiVerifier = exports.DEFAULT_MODEL = exports.DEFAULT_CACHE_PATH = exports.VerificationCache = exports.QuotaExceededError = exports.DETECTOR_DESCRIPTIONS = void 0;
7
+ var base_1 = require("./base");
8
+ Object.defineProperty(exports, "DETECTOR_DESCRIPTIONS", { enumerable: true, get: function () { return base_1.DETECTOR_DESCRIPTIONS; } });
9
+ Object.defineProperty(exports, "QuotaExceededError", { enumerable: true, get: function () { return base_1.QuotaExceededError; } });
10
+ var cache_1 = require("./cache");
11
+ Object.defineProperty(exports, "VerificationCache", { enumerable: true, get: function () { return cache_1.VerificationCache; } });
12
+ var gemini_1 = require("./gemini");
13
+ Object.defineProperty(exports, "DEFAULT_CACHE_PATH", { enumerable: true, get: function () { return gemini_1.DEFAULT_CACHE_PATH; } });
14
+ Object.defineProperty(exports, "DEFAULT_MODEL", { enumerable: true, get: function () { return gemini_1.DEFAULT_MODEL; } });
15
+ Object.defineProperty(exports, "GeminiVerifier", { enumerable: true, get: function () { return gemini_1.GeminiVerifier; } });
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/verifiers/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAGH,+BAAmE;AAA1D,6GAAA,qBAAqB,OAAA;AAAE,0GAAA,kBAAkB,OAAA;AAClD,iCAA4C;AAAnC,0GAAA,iBAAiB,OAAA;AAC1B,mCAKkB;AAJhB,4GAAA,kBAAkB,OAAA;AAClB,uGAAA,aAAa,OAAA;AACb,wGAAA,cAAc,OAAA"}
package/package.json ADDED
@@ -0,0 +1,96 @@
1
+ {
2
+ "name": "nz-privacy-auditor",
3
+ "version": "0.8.0",
4
+ "description": "Privacy Act 2020 compliance auditor for ML datasets — scans text and CSV data for NZ-specific PII (IRD, NHI, driver licence, phone, address, te reo Māori names). TypeScript port of the Python package. By QAPulse by SK.",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "nz-privacy-auditor": "dist/cli.js"
9
+ },
10
+ "exports": {
11
+ ".": {
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.js",
14
+ "types": "./dist/index.d.ts"
15
+ },
16
+ "./detectors/ird": {
17
+ "import": "./dist/detectors/ird.js",
18
+ "require": "./dist/detectors/ird.js",
19
+ "types": "./dist/detectors/ird.d.ts"
20
+ },
21
+ "./detectors/nhi": {
22
+ "import": "./dist/detectors/nhi.js",
23
+ "require": "./dist/detectors/nhi.js",
24
+ "types": "./dist/detectors/nhi.d.ts"
25
+ },
26
+ "./detectors/driver_licence": {
27
+ "import": "./dist/detectors/driver_licence.js",
28
+ "require": "./dist/detectors/driver_licence.js",
29
+ "types": "./dist/detectors/driver_licence.d.ts"
30
+ },
31
+ "./detectors/phone": {
32
+ "import": "./dist/detectors/phone.js",
33
+ "require": "./dist/detectors/phone.js",
34
+ "types": "./dist/detectors/phone.d.ts"
35
+ },
36
+ "./detectors/address": {
37
+ "import": "./dist/detectors/address.js",
38
+ "require": "./dist/detectors/address.js",
39
+ "types": "./dist/detectors/address.d.ts"
40
+ },
41
+ "./detectors/maori_name": {
42
+ "import": "./dist/detectors/maori_name.js",
43
+ "require": "./dist/detectors/maori_name.js",
44
+ "types": "./dist/detectors/maori_name.d.ts"
45
+ }
46
+ },
47
+ "scripts": {
48
+ "build": "tsc",
49
+ "build:watch": "tsc --watch",
50
+ "test": "jest",
51
+ "test:watch": "jest --watch",
52
+ "lint": "eslint src --ext .ts",
53
+ "prepublishOnly": "npm run build && npm test"
54
+ },
55
+ "keywords": [
56
+ "privacy-act-2020",
57
+ "new-zealand",
58
+ "aotearoa",
59
+ "pii-detection",
60
+ "compliance",
61
+ "data-governance",
62
+ "ird-number",
63
+ "nhi-number",
64
+ "te-reo-maori",
65
+ "ml-datasets",
66
+ "responsible-ai",
67
+ "qapulse"
68
+ ],
69
+ "author": "QAPulse by SK <contact@skakarh.com> (https://skakarh.com)",
70
+ "license": "MIT",
71
+ "repository": {
72
+ "type": "git",
73
+ "url": "https://github.com/ShahnawazKakarh/nz-privacy-auditor.git",
74
+ "directory": "js"
75
+ },
76
+ "homepage": "https://github.com/ShahnawazKakarh/nz-privacy-auditor#readme",
77
+ "bugs": {
78
+ "url": "https://github.com/ShahnawazKakarh/nz-privacy-auditor/issues"
79
+ },
80
+ "engines": {
81
+ "node": ">=18.0.0"
82
+ },
83
+ "dependencies": {
84
+ "commander": "^12.0.0"
85
+ },
86
+ "devDependencies": {
87
+ "@types/jest": "^29.0.0",
88
+ "@types/node": "^20.0.0",
89
+ "@typescript-eslint/eslint-plugin": "^6.0.0",
90
+ "@typescript-eslint/parser": "^6.0.0",
91
+ "eslint": "^8.0.0",
92
+ "jest": "^29.0.0",
93
+ "ts-jest": "^29.0.0",
94
+ "typescript": "^5.0.0"
95
+ }
96
+ }