prisma-schema-auditor 1.0.1

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/LICENSE +21 -0
  2. package/README.md +62 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +132 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/core/analysis/computeKeys.d.ts +13 -0
  8. package/dist/core/analysis/computeKeys.d.ts.map +1 -0
  9. package/dist/core/analysis/computeKeys.js +27 -0
  10. package/dist/core/analysis/computeKeys.js.map +1 -0
  11. package/dist/core/analysis/inferFds.d.ts +31 -0
  12. package/dist/core/analysis/inferFds.d.ts.map +1 -0
  13. package/dist/core/analysis/inferFds.js +87 -0
  14. package/dist/core/analysis/inferFds.js.map +1 -0
  15. package/dist/core/analysis/normalizeChecks/check1nf.d.ts +11 -0
  16. package/dist/core/analysis/normalizeChecks/check1nf.d.ts.map +1 -0
  17. package/dist/core/analysis/normalizeChecks/check1nf.js +91 -0
  18. package/dist/core/analysis/normalizeChecks/check1nf.js.map +1 -0
  19. package/dist/core/analysis/normalizeChecks/check2nf.d.ts +13 -0
  20. package/dist/core/analysis/normalizeChecks/check2nf.d.ts.map +1 -0
  21. package/dist/core/analysis/normalizeChecks/check2nf.js +80 -0
  22. package/dist/core/analysis/normalizeChecks/check2nf.js.map +1 -0
  23. package/dist/core/analysis/normalizeChecks/check3nf.d.ts +18 -0
  24. package/dist/core/analysis/normalizeChecks/check3nf.d.ts.map +1 -0
  25. package/dist/core/analysis/normalizeChecks/check3nf.js +71 -0
  26. package/dist/core/analysis/normalizeChecks/check3nf.js.map +1 -0
  27. package/dist/core/invariants/parse.d.ts +19 -0
  28. package/dist/core/invariants/parse.d.ts.map +1 -0
  29. package/dist/core/invariants/parse.js +73 -0
  30. package/dist/core/invariants/parse.js.map +1 -0
  31. package/dist/core/invariants/schema.d.ts +24 -0
  32. package/dist/core/invariants/schema.d.ts.map +1 -0
  33. package/dist/core/invariants/schema.js +20 -0
  34. package/dist/core/invariants/schema.js.map +1 -0
  35. package/dist/core/prismaSchema/contract.d.ts +8 -0
  36. package/dist/core/prismaSchema/contract.d.ts.map +1 -0
  37. package/dist/core/prismaSchema/contract.js +107 -0
  38. package/dist/core/prismaSchema/contract.js.map +1 -0
  39. package/dist/core/prismaSchema/parse.d.ts +8 -0
  40. package/dist/core/prismaSchema/parse.d.ts.map +1 -0
  41. package/dist/core/prismaSchema/parse.js +46 -0
  42. package/dist/core/prismaSchema/parse.js.map +1 -0
  43. package/dist/core/prismaSchema/types.d.ts +39 -0
  44. package/dist/core/prismaSchema/types.d.ts.map +1 -0
  45. package/dist/core/prismaSchema/types.js +2 -0
  46. package/dist/core/prismaSchema/types.js.map +1 -0
  47. package/dist/core/report/reportTypes.d.ts +72 -0
  48. package/dist/core/report/reportTypes.d.ts.map +1 -0
  49. package/dist/core/report/reportTypes.js +2 -0
  50. package/dist/core/report/reportTypes.js.map +1 -0
  51. package/dist/core/report/toJson.d.ts +7 -0
  52. package/dist/core/report/toJson.d.ts.map +1 -0
  53. package/dist/core/report/toJson.js +27 -0
  54. package/dist/core/report/toJson.js.map +1 -0
  55. package/dist/core/report/toText.d.ts +6 -0
  56. package/dist/core/report/toText.d.ts.map +1 -0
  57. package/dist/core/report/toText.js +46 -0
  58. package/dist/core/report/toText.js.map +1 -0
  59. package/dist/index.d.ts +18 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +46 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/util/index.d.ts +5 -0
  64. package/dist/util/index.d.ts.map +1 -0
  65. package/dist/util/index.js +15 -0
  66. package/dist/util/index.js.map +1 -0
  67. package/package.json +84 -0
@@ -0,0 +1,6 @@
1
+ import type { AuditResult } from './reportTypes.js';
2
+ /**
3
+ * Format an AuditResult as human-readable text.
4
+ */
5
+ export declare function toText(result: AuditResult): string;
6
+ //# sourceMappingURL=toText.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toText.d.ts","sourceRoot":"","sources":["../../../src/core/report/toText.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;GAEG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CA+ClD"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Format an AuditResult as human-readable text.
3
+ */
4
+ export function toText(result) {
5
+ const lines = [];
6
+ lines.push('=== Prisma Schema Audit ===');
7
+ lines.push('');
8
+ if (result.metadata.timestamp !== null) {
9
+ lines.push(`Timestamp: ${result.metadata.timestamp}`);
10
+ }
11
+ lines.push(`Schema: ${result.metadata.schemaPath}`);
12
+ lines.push(`Models: ${String(result.metadata.modelCount)}`);
13
+ lines.push(`Findings: ${String(result.metadata.findingCount)}`);
14
+ lines.push('');
15
+ // Contract summary
16
+ lines.push('--- Constraint Contract ---');
17
+ for (const model of result.contract.models) {
18
+ lines.push(` Model: ${model.name}`);
19
+ if (model.primaryKey !== null) {
20
+ lines.push(` PK: (${model.primaryKey.fields.join(', ')})`);
21
+ }
22
+ for (const uq of model.uniqueConstraints) {
23
+ const label = uq.name !== null ? ` [${uq.name}]` : '';
24
+ lines.push(` Unique${label}: (${uq.fields.join(', ')})`);
25
+ }
26
+ for (const fk of model.foreignKeys) {
27
+ lines.push(` FK: (${fk.fields.join(', ')}) -> ${fk.referencedModel}(${fk.referencedFields.join(', ')}) onDelete=${fk.onDelete} onUpdate=${fk.onUpdate}`);
28
+ }
29
+ }
30
+ lines.push('');
31
+ // Findings
32
+ if (result.findings.length > 0) {
33
+ lines.push('--- Findings ---');
34
+ for (const f of result.findings) {
35
+ const field = f.field !== null ? `.${f.field}` : '';
36
+ lines.push(` [${f.severity.toUpperCase()}] ${f.rule} @ ${f.model}${field}`);
37
+ lines.push(` ${f.message}`);
38
+ }
39
+ }
40
+ else {
41
+ lines.push('No normalization findings.');
42
+ }
43
+ lines.push('');
44
+ return lines.join('\n');
45
+ }
46
+ //# sourceMappingURL=toText.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toText.js","sourceRoot":"","sources":["../../../src/core/report/toText.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export type { AuditResult, AuditMetadata, ConstraintContract, ModelContract, FieldContract, PrimaryKeyConstraint, UniqueConstraint, ForeignKeyConstraint, Finding, RuleCode, Severity, NormalForm, OutputFormat, ReferentialAction, } from './core/report/reportTypes.js';
2
+ export type { AuditModel, AuditField, AuditPrimaryKey, AuditUniqueIndex, ParseResult, } from './core/prismaSchema/types.js';
3
+ export type { FunctionalDependency } from './core/analysis/inferFds.js';
4
+ export type { CandidateKey } from './core/analysis/computeKeys.js';
5
+ export type { InvariantsFile, InvariantFd } from './core/invariants/schema.js';
6
+ import type { AuditResult } from './core/report/reportTypes.js';
7
+ /** Options for the audit function. */
8
+ export interface AuditOptions {
9
+ readonly schemaPath: string;
10
+ readonly invariantsPath?: string | undefined;
11
+ readonly noTimestamp?: boolean | undefined;
12
+ }
13
+ /**
14
+ * Run a full audit on a Prisma schema file.
15
+ * Returns the constraint contract and normalization findings.
16
+ */
17
+ export declare function audit(schemaPathOrOptions: string | AuditOptions, noTimestamp?: boolean): Promise<AuditResult>;
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,WAAW,EACX,aAAa,EACb,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,iBAAiB,GAClB,MAAM,8BAA8B,CAAC;AAEtC,YAAY,EACV,UAAU,EACV,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,WAAW,GACZ,MAAM,8BAA8B,CAAC;AAEtC,YAAY,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxE,YAAY,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAS/E,OAAO,KAAK,EAAE,WAAW,EAAW,MAAM,8BAA8B,CAAC;AAEzE,sCAAsC;AACtC,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7C,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC5C;AAED;;;GAGG;AACH,wBAAsB,KAAK,CACzB,mBAAmB,EAAE,MAAM,GAAG,YAAY,EAC1C,WAAW,UAAQ,GAClB,OAAO,CAAC,WAAW,CAAC,CAuCtB"}
package/dist/index.js ADDED
@@ -0,0 +1,46 @@
1
+ import { parseSchema } from './core/prismaSchema/parse.js';
2
+ import { extractContract } from './core/prismaSchema/contract.js';
3
+ import { inferFunctionalDependencies } from './core/analysis/inferFds.js';
4
+ import { check1nf } from './core/analysis/normalizeChecks/check1nf.js';
5
+ import { check2nf } from './core/analysis/normalizeChecks/check2nf.js';
6
+ import { check3nf } from './core/analysis/normalizeChecks/check3nf.js';
7
+ import { parseInvariantsFile, invariantsToFds, validateInvariantsAgainstContract } from './core/invariants/parse.js';
8
+ /**
9
+ * Run a full audit on a Prisma schema file.
10
+ * Returns the constraint contract and normalization findings.
11
+ */
12
+ export async function audit(schemaPathOrOptions, noTimestamp = false) {
13
+ const options = typeof schemaPathOrOptions === 'string'
14
+ ? { schemaPath: schemaPathOrOptions, noTimestamp }
15
+ : schemaPathOrOptions;
16
+ const shouldOmitTimestamp = options.noTimestamp === true;
17
+ const parsed = await parseSchema(options.schemaPath);
18
+ const contract = extractContract(parsed);
19
+ const schemaFds = inferFunctionalDependencies(contract);
20
+ // Merge invariant-declared FDs if provided
21
+ let allFds = schemaFds;
22
+ let invariantFindings = [];
23
+ if (options.invariantsPath !== undefined) {
24
+ const invariants = parseInvariantsFile(options.invariantsPath);
25
+ const invariantFds = invariantsToFds(invariants);
26
+ allFds = [...schemaFds, ...invariantFds];
27
+ invariantFindings = validateInvariantsAgainstContract(invariants, contract);
28
+ }
29
+ const findings = [
30
+ ...check1nf(contract),
31
+ ...check2nf(contract, allFds),
32
+ ...check3nf(contract, allFds),
33
+ ...invariantFindings,
34
+ ];
35
+ return {
36
+ contract,
37
+ findings,
38
+ metadata: {
39
+ schemaPath: options.schemaPath,
40
+ timestamp: shouldOmitTimestamp ? null : new Date().toISOString(),
41
+ modelCount: contract.models.length,
42
+ findingCount: findings.length,
43
+ },
44
+ };
45
+ }
46
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,6CAA6C,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,6CAA6C,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,6CAA6C,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,iCAAiC,EAAE,MAAM,4BAA4B,CAAC;AAUrH;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CACzB,mBAA0C,EAC1C,WAAW,GAAG,KAAK;IAEnB,MAAM,OAAO,GACX,OAAO,mBAAmB,KAAK,QAAQ;QACrC,CAAC,CAAC,EAAE,UAAU,EAAE,mBAAmB,EAAE,WAAW,EAAE;QAClD,CAAC,CAAC,mBAAmB,CAAC;IAE1B,MAAM,mBAAmB,GAAG,OAAO,CAAC,WAAW,KAAK,IAAI,CAAC;IAEzD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,2BAA2B,CAAC,QAAQ,CAAC,CAAC;IAExD,2CAA2C;IAC3C,IAAI,MAAM,GAAG,SAAS,CAAC;IACvB,IAAI,iBAAiB,GAAuB,EAAE,CAAC;IAC/C,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACzC,MAAM,UAAU,GAAG,mBAAmB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAC/D,MAAM,YAAY,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;QACjD,MAAM,GAAG,CAAC,GAAG,SAAS,EAAE,GAAG,YAAY,CAAC,CAAC;QACzC,iBAAiB,GAAG,iCAAiC,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,QAAQ,GAAG;QACf,GAAG,QAAQ,CAAC,QAAQ,CAAC;QACrB,GAAG,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC7B,GAAG,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC7B,GAAG,iBAAiB;KACrB,CAAC;IAEF,OAAO;QACL,QAAQ;QACR,QAAQ;QACR,QAAQ,EAAE;YACR,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,SAAS,EAAE,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAChE,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM;YAClC,YAAY,EAAE,QAAQ,CAAC,MAAM;SAC9B;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Sort an array by a key function. Returns a new array.
3
+ */
4
+ export declare function sortBy<T>(arr: readonly T[], keyFn: (item: T) => string): T[];
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GAAG,CAAC,EAAE,CAQ5E"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Sort an array by a key function. Returns a new array.
3
+ */
4
+ export function sortBy(arr, keyFn) {
5
+ return [...arr].sort((a, b) => {
6
+ const ka = keyFn(a);
7
+ const kb = keyFn(b);
8
+ if (ka < kb)
9
+ return -1;
10
+ if (ka > kb)
11
+ return 1;
12
+ return 0;
13
+ });
14
+ }
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,MAAM,CAAI,GAAiB,EAAE,KAA0B;IACrE,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC5B,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,EAAE,GAAG,EAAE;YAAE,OAAO,CAAC,CAAC,CAAC;QACvB,IAAI,EAAE,GAAG,EAAE;YAAE,OAAO,CAAC,CAAC;QACtB,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC"}
package/package.json ADDED
@@ -0,0 +1,84 @@
1
+ {
2
+ "name": "prisma-schema-auditor",
3
+ "version": "1.0.1",
4
+ "description": "Static analysis for Prisma schemas: deterministic constraint contracts + normalization lint findings (1NF/2NF; 3NF+ via invariants)",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.js"
12
+ }
13
+ },
14
+ "bin": {
15
+ "prisma-schema-auditor": "./dist/cli.js"
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "LICENSE",
20
+ "README.md",
21
+ "CHANGELOG.md"
22
+ ],
23
+ "scripts": {
24
+ "build": "tsc",
25
+ "typecheck": "tsc -p tsconfig.test.json",
26
+ "lint": "eslint src tests",
27
+ "lint:fix": "eslint src tests --fix",
28
+ "knip": "knip",
29
+ "test": "vitest run",
30
+ "test:watch": "vitest",
31
+ "test:coverage": "vitest run --coverage",
32
+ "ci": "pnpm audit --prod && pnpm run typecheck && pnpm run lint && pnpm run knip && pnpm run test",
33
+ "prepublishOnly": "pnpm run build",
34
+ "version": "pnpm run build"
35
+ },
36
+ "keywords": [
37
+ "prisma",
38
+ "schema",
39
+ "audit",
40
+ "normalization",
41
+ "constraint",
42
+ "1nf",
43
+ "2nf",
44
+ "3nf",
45
+ "static-analysis",
46
+ "typescript"
47
+ ],
48
+ "author": "EddieRydell",
49
+ "license": "MIT",
50
+ "repository": {
51
+ "type": "git",
52
+ "url": "git+https://github.com/EddieRydell/prisma-schema-auditor.git"
53
+ },
54
+ "homepage": "https://github.com/EddieRydell/prisma-schema-auditor#readme",
55
+ "bugs": {
56
+ "url": "https://github.com/EddieRydell/prisma-schema-auditor/issues"
57
+ },
58
+ "peerDependencies": {
59
+ "@prisma/internals": ">=7.0.0",
60
+ "prisma": ">=7.0.0"
61
+ },
62
+ "devDependencies": {
63
+ "@eslint/js": "^9.0.0",
64
+ "@prisma/internals": "^7.0.0",
65
+ "@types/node": "^25.2.1",
66
+ "@vitest/coverage-v8": "^4.0.18",
67
+ "eslint": "^9.0.0",
68
+ "knip": "^5.0.0",
69
+ "prisma": "^7.0.0",
70
+ "semantic-release": "^25.0.3",
71
+ "typescript": "^5.7.0",
72
+ "typescript-eslint": "^8.0.0",
73
+ "vitest": "^4.0.18"
74
+ },
75
+ "publishConfig": {
76
+ "access": "public"
77
+ },
78
+ "engines": {
79
+ "node": ">=18"
80
+ },
81
+ "dependencies": {
82
+ "zod": "^4.3.6"
83
+ }
84
+ }