@alimaandev/ripple 0.4.0 → 0.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.
@@ -3,6 +3,7 @@ import { z } from 'zod';
3
3
 
4
4
  // src/config/defaults.ts
5
5
  var DEFAULT_CONFIG = {
6
+ $schema: void 0,
6
7
  include: ["**/*.{ts,tsx,js,jsx}"],
7
8
  ignore: ["node_modules", "dist", "build", "coverage", ".next", "out", ".git"],
8
9
  aliases: {},
@@ -25,7 +26,8 @@ var DEFAULT_CONFIG = {
25
26
  },
26
27
  diff: {
27
28
  base: void 0,
28
- gate: "high"
29
+ gate: "high",
30
+ allow: []
29
31
  }
30
32
  };
31
33
 
@@ -52,9 +54,11 @@ var riskConfigSchema = z.object({
52
54
  }).strict();
53
55
  var diffConfigSchema = z.object({
54
56
  base: z.string().min(1).optional(),
55
- gate: z.enum(["medium", "high", "critical"]).default(DEFAULT_CONFIG.diff.gate)
57
+ gate: z.enum(["medium", "high", "critical"]).default(DEFAULT_CONFIG.diff.gate),
58
+ allow: z.array(z.string()).default(DEFAULT_CONFIG.diff.allow)
56
59
  }).strict();
57
60
  var rippleConfigSchema = z.object({
61
+ $schema: z.string().min(1).optional(),
58
62
  include: z.array(z.string().min(1)).min(1).default(DEFAULT_CONFIG.include),
59
63
  ignore: z.array(z.string()).default(DEFAULT_CONFIG.ignore),
60
64
  aliases: z.record(z.string(), z.string()).default(DEFAULT_CONFIG.aliases),
@@ -71,5 +75,5 @@ function formatSchemaIssues(error) {
71
75
  }
72
76
 
73
77
  export { DEFAULT_CONFIG, formatSchemaIssues, rippleConfigSchema };
74
- //# sourceMappingURL=chunk-LDCFNORX.js.map
75
- //# sourceMappingURL=chunk-LDCFNORX.js.map
78
+ //# sourceMappingURL=chunk-CFH4UW2E.js.map
79
+ //# sourceMappingURL=chunk-CFH4UW2E.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/defaults.ts","../src/config/schema.ts"],"names":[],"mappings":"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","file":"chunk-CFH4UW2E.js","sourcesContent":["import type { RippleConfig } from \"../types/config.js\";\n\n/**\n * Built-in defaults. A user config only overrides fields it sets; anything\n * else keeps these values.\n */\nexport const DEFAULT_CONFIG: RippleConfig = {\n $schema: undefined,\n include: [\"**/*.{ts,tsx,js,jsx}\"],\n ignore: [\"node_modules\", \"dist\", \"build\", \"coverage\", \".next\", \"out\", \".git\"],\n aliases: {},\n tsconfigPath: \"tsconfig.json\",\n risk: {\n weights: {\n affectedFiles: 0.3,\n entryPoint: 0.15,\n sharedUtility: 0.15,\n publicExports: 0.1,\n tests: 0.1,\n routes: 0.1,\n cycleMembership: 0.1,\n },\n thresholds: {\n medium: 30,\n high: 55,\n critical: 80,\n },\n },\n diff: {\n base: undefined,\n gate: \"high\",\n allow: [],\n },\n};\n","import { z } from \"zod\";\nimport type { RippleConfig } from \"../types/config.js\";\nimport { DEFAULT_CONFIG } from \"./defaults.js\";\n\n/**\n * Zod schema for `ripple.config.ts`. Every field has a default, so parsing a\n * partial user config yields a complete validated `RippleConfig`.\n *\n * Note: outer objects default to their *full* default object. `.default({})`\n * would skip inner field defaults, since zod uses the default value as-is\n * without re-parsing it.\n */\n\nconst fraction = z.number().min(0).max(1);\nconst score = z.number().min(0).max(100);\n\nconst riskWeightsSchema = z\n .object({\n affectedFiles: fraction.default(DEFAULT_CONFIG.risk.weights.affectedFiles),\n entryPoint: fraction.default(DEFAULT_CONFIG.risk.weights.entryPoint),\n sharedUtility: fraction.default(DEFAULT_CONFIG.risk.weights.sharedUtility),\n publicExports: fraction.default(DEFAULT_CONFIG.risk.weights.publicExports),\n tests: fraction.default(DEFAULT_CONFIG.risk.weights.tests),\n routes: fraction.default(DEFAULT_CONFIG.risk.weights.routes),\n cycleMembership: fraction.default(DEFAULT_CONFIG.risk.weights.cycleMembership),\n })\n .strict();\n\nconst riskThresholdsSchema = z\n .object({\n medium: score.default(DEFAULT_CONFIG.risk.thresholds.medium),\n high: score.default(DEFAULT_CONFIG.risk.thresholds.high),\n critical: score.default(DEFAULT_CONFIG.risk.thresholds.critical),\n })\n .strict();\n\nconst riskConfigSchema = z\n .object({\n weights: riskWeightsSchema.default(DEFAULT_CONFIG.risk.weights),\n thresholds: riskThresholdsSchema.default(DEFAULT_CONFIG.risk.thresholds),\n })\n .strict();\n\nconst diffConfigSchema = z\n .object({\n base: z.string().min(1).optional(),\n gate: z.enum([\"medium\", \"high\", \"critical\"]).default(DEFAULT_CONFIG.diff.gate),\n allow: z.array(z.string()).default(DEFAULT_CONFIG.diff.allow),\n })\n .strict();\n\nexport const rippleConfigSchema: z.ZodType<RippleConfig> = z\n .object({\n $schema: z.string().min(1).optional(),\n include: z.array(z.string().min(1)).min(1).default(DEFAULT_CONFIG.include),\n ignore: z.array(z.string()).default(DEFAULT_CONFIG.ignore),\n aliases: z.record(z.string(), z.string()).default(DEFAULT_CONFIG.aliases),\n tsconfigPath: z.string().min(1).default(DEFAULT_CONFIG.tsconfigPath),\n risk: riskConfigSchema.default(DEFAULT_CONFIG.risk),\n diff: diffConfigSchema.default(DEFAULT_CONFIG.diff),\n })\n .strict();\n\n/** Human-readable list of validation problems, for friendly error output. */\nexport function formatSchemaIssues(error: z.ZodError): string[] {\n return error.issues.map((issue) => {\n const path = issue.path.join(\".\");\n const location = path === \"\" ? \"config\" : `config.${path}`;\n return `${location}: ${issue.message}`;\n });\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -74,11 +74,23 @@ interface DiffConfig {
74
74
  base?: string;
75
75
  /** Minimum risk level that fails the diff gate. Defaults to `"high"`. */
76
76
  gate: GateLevel;
77
+ /**
78
+ * Glob patterns (relative to the project root) of files that are analyzed
79
+ * and reported but never block the gate. Useful for adopting the gate on
80
+ * legacy code without fixing every pre-existing risk on day one.
81
+ */
82
+ allow: string[];
77
83
  }
78
84
  /**
79
85
  * The validated `ripple.config.ts` shape.
80
86
  */
81
87
  interface RippleConfig {
88
+ /**
89
+ * JSON Schema reference used by editors for autocomplete and validation
90
+ * (e.g. `"./node_modules/@alimaandev/ripple/ripple.schema.json"`). Ignored
91
+ * by the CLI; written by `ripple init`.
92
+ */
93
+ $schema?: string;
82
94
  /** Glob patterns (relative to the project root) of source files to analyze. */
83
95
  include: string[];
84
96
  /** Glob patterns / directory names to exclude from analysis. */
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env node
2
- export { formatSchemaIssues, rippleConfigSchema } from './chunk-LDCFNORX.js';
2
+ export { formatSchemaIssues, rippleConfigSchema } from './chunk-CFH4UW2E.js';
3
3
  //# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,14 +1,18 @@
1
1
  {
2
2
  "name": "@alimaandev/ripple",
3
- "version": "0.4.0",
4
- "description": "Dependency impact analysis for TypeScript projects. Answers the question: what will break if I change this file?",
3
+ "version": "0.6.0",
4
+ "description": "Dependency impact analysis for TypeScript and JavaScript. Know the blast radius of any change — before you commit.",
5
5
  "keywords": [
6
6
  "cli",
7
7
  "typescript",
8
- "dependencies",
8
+ "javascript",
9
+ "dependency-graph",
9
10
  "impact-analysis",
11
+ "static-analysis",
10
12
  "refactoring",
11
- "risk"
13
+ "risk",
14
+ "cycle-detection",
15
+ "ci"
12
16
  ],
13
17
  "license": "MIT",
14
18
  "author": "Ali Sher <alishermaan0319@gmail.com>",
@@ -37,7 +41,8 @@
37
41
  "ripple": "dist/bin.js"
38
42
  },
39
43
  "files": [
40
- "dist"
44
+ "dist",
45
+ "ripple.schema.json"
41
46
  ],
42
47
  "engines": {
43
48
  "node": ">=22"
@@ -59,13 +64,13 @@
59
64
  "prepublishOnly": "pnpm run typecheck && pnpm run lint && pnpm run test && pnpm run build"
60
65
  },
61
66
  "dependencies": {
62
- "boxen": "^8.0.1",
63
67
  "chalk": "^6.0.0",
64
68
  "commander": "^15.0.0",
65
69
  "fast-glob": "^3.3.3",
66
70
  "figures": "^6.1.0",
67
71
  "jiti": "^2.7.0",
68
72
  "ora": "^9.4.1",
73
+ "picomatch": "^4.0.5",
69
74
  "treeify": "^1.1.0",
70
75
  "ts-morph": "^28.0.0",
71
76
  "zod": "^4.4.3"
@@ -73,8 +78,10 @@
73
78
  "devDependencies": {
74
79
  "@eslint/js": "^10.0.1",
75
80
  "@types/node": "^26.1.2",
81
+ "@types/picomatch": "^4.0.3",
76
82
  "@types/treeify": "^1.0.3",
77
83
  "@vitest/coverage-v8": "^4.1.10",
84
+ "ajv": "^8.20.0",
78
85
  "esbuild": "^0.28.1",
79
86
  "eslint": "^10.8.0",
80
87
  "eslint-config-prettier": "^10.1.8",
@@ -0,0 +1,123 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://raw.githubusercontent.com/alimaandev/ripple/main/ripple.schema.json",
4
+ "title": "Ripple configuration",
5
+ "description": "Configuration for @alimaandev/ripple, dependency impact analysis for TypeScript and JavaScript.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "properties": {
9
+ "$schema": {
10
+ "type": "string",
11
+ "minLength": 1,
12
+ "description": "JSON Schema reference for editor autocomplete and validation. Written by `ripple init`."
13
+ },
14
+ "include": {
15
+ "type": "array",
16
+ "items": { "type": "string", "minLength": 1 },
17
+ "minItems": 1,
18
+ "description": "Glob patterns (relative to the project root) of source files to analyze."
19
+ },
20
+ "ignore": {
21
+ "type": "array",
22
+ "items": { "type": "string" },
23
+ "description": "Glob patterns or directory names to exclude from analysis."
24
+ },
25
+ "aliases": {
26
+ "type": "object",
27
+ "additionalProperties": { "type": "string" },
28
+ "description": "Path aliases, e.g. `{ \"@\": \"./src\" }`. Merged with tsconfig `paths`."
29
+ },
30
+ "tsconfigPath": {
31
+ "type": "string",
32
+ "minLength": 1,
33
+ "description": "Path to tsconfig.json, relative to the project root. Default: tsconfig.json."
34
+ },
35
+ "risk": {
36
+ "type": "object",
37
+ "additionalProperties": false,
38
+ "description": "Risk engine tuning.",
39
+ "properties": {
40
+ "weights": {
41
+ "type": "object",
42
+ "additionalProperties": false,
43
+ "description": "Factor weights; defaults sum to 1.0.",
44
+ "properties": {
45
+ "affectedFiles": {
46
+ "type": "number",
47
+ "minimum": 0,
48
+ "maximum": 1,
49
+ "description": "Weight of the (log-scaled) number of affected files."
50
+ },
51
+ "entryPoint": {
52
+ "type": "number",
53
+ "minimum": 0,
54
+ "maximum": 1,
55
+ "description": "Weight of whether an entry point is affected."
56
+ },
57
+ "sharedUtility": {
58
+ "type": "number",
59
+ "minimum": 0,
60
+ "maximum": 1,
61
+ "description": "Weight of how many shared utilities are affected."
62
+ },
63
+ "publicExports": {
64
+ "type": "number",
65
+ "minimum": 0,
66
+ "maximum": 1,
67
+ "description": "Weight of the target file's public export surface."
68
+ },
69
+ "tests": {
70
+ "type": "number",
71
+ "minimum": 0,
72
+ "maximum": 1,
73
+ "description": "Weight of affected test files."
74
+ },
75
+ "routes": {
76
+ "type": "number",
77
+ "minimum": 0,
78
+ "maximum": 1,
79
+ "description": "Weight of affected API routes."
80
+ },
81
+ "cycleMembership": {
82
+ "type": "number",
83
+ "minimum": 0,
84
+ "maximum": 1,
85
+ "description": "Weight of the target being part of a circular dependency."
86
+ }
87
+ }
88
+ },
89
+ "thresholds": {
90
+ "type": "object",
91
+ "additionalProperties": false,
92
+ "description": "Score thresholds that map a 0-100 risk score to a level.",
93
+ "properties": {
94
+ "medium": { "type": "number", "minimum": 0, "maximum": 100 },
95
+ "high": { "type": "number", "minimum": 0, "maximum": 100 },
96
+ "critical": { "type": "number", "minimum": 0, "maximum": 100 }
97
+ }
98
+ }
99
+ }
100
+ },
101
+ "diff": {
102
+ "type": "object",
103
+ "additionalProperties": false,
104
+ "description": "Diff command tuning. CLI flags always take precedence.",
105
+ "properties": {
106
+ "base": {
107
+ "type": "string",
108
+ "minLength": 1,
109
+ "description": "Git ref used as the change-set base when no `--base` is given."
110
+ },
111
+ "gate": {
112
+ "enum": ["medium", "high", "critical"],
113
+ "description": "Minimum risk level that fails the diff gate. Defaults to `\"high\"`."
114
+ },
115
+ "allow": {
116
+ "type": "array",
117
+ "items": { "type": "string" },
118
+ "description": "Glob patterns of changed files that are analyzed and reported but never block the gate."
119
+ }
120
+ }
121
+ }
122
+ }
123
+ }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/config/defaults.ts","../src/config/schema.ts"],"names":[],"mappings":"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","file":"chunk-LDCFNORX.js","sourcesContent":["import type { RippleConfig } from \"../types/config.js\";\n\n/**\n * Built-in defaults. A user config only overrides fields it sets; anything\n * else keeps these values.\n */\nexport const DEFAULT_CONFIG: RippleConfig = {\n include: [\"**/*.{ts,tsx,js,jsx}\"],\n ignore: [\"node_modules\", \"dist\", \"build\", \"coverage\", \".next\", \"out\", \".git\"],\n aliases: {},\n tsconfigPath: \"tsconfig.json\",\n risk: {\n weights: {\n affectedFiles: 0.3,\n entryPoint: 0.15,\n sharedUtility: 0.15,\n publicExports: 0.1,\n tests: 0.1,\n routes: 0.1,\n cycleMembership: 0.1,\n },\n thresholds: {\n medium: 30,\n high: 55,\n critical: 80,\n },\n },\n diff: {\n base: undefined,\n gate: \"high\",\n },\n};\n","import { z } from \"zod\";\nimport type { RippleConfig } from \"../types/config.js\";\nimport { DEFAULT_CONFIG } from \"./defaults.js\";\n\n/**\n * Zod schema for `ripple.config.ts`. Every field has a default, so parsing a\n * partial user config yields a complete validated `RippleConfig`.\n *\n * Note: outer objects default to their *full* default object. `.default({})`\n * would skip inner field defaults, since zod uses the default value as-is\n * without re-parsing it.\n */\n\nconst fraction = z.number().min(0).max(1);\nconst score = z.number().min(0).max(100);\n\nconst riskWeightsSchema = z\n .object({\n affectedFiles: fraction.default(DEFAULT_CONFIG.risk.weights.affectedFiles),\n entryPoint: fraction.default(DEFAULT_CONFIG.risk.weights.entryPoint),\n sharedUtility: fraction.default(DEFAULT_CONFIG.risk.weights.sharedUtility),\n publicExports: fraction.default(DEFAULT_CONFIG.risk.weights.publicExports),\n tests: fraction.default(DEFAULT_CONFIG.risk.weights.tests),\n routes: fraction.default(DEFAULT_CONFIG.risk.weights.routes),\n cycleMembership: fraction.default(DEFAULT_CONFIG.risk.weights.cycleMembership),\n })\n .strict();\n\nconst riskThresholdsSchema = z\n .object({\n medium: score.default(DEFAULT_CONFIG.risk.thresholds.medium),\n high: score.default(DEFAULT_CONFIG.risk.thresholds.high),\n critical: score.default(DEFAULT_CONFIG.risk.thresholds.critical),\n })\n .strict();\n\nconst riskConfigSchema = z\n .object({\n weights: riskWeightsSchema.default(DEFAULT_CONFIG.risk.weights),\n thresholds: riskThresholdsSchema.default(DEFAULT_CONFIG.risk.thresholds),\n })\n .strict();\n\nconst diffConfigSchema = z\n .object({\n base: z.string().min(1).optional(),\n gate: z.enum([\"medium\", \"high\", \"critical\"]).default(DEFAULT_CONFIG.diff.gate),\n })\n .strict();\n\nexport const rippleConfigSchema: z.ZodType<RippleConfig> = z\n .object({\n include: z.array(z.string().min(1)).min(1).default(DEFAULT_CONFIG.include),\n ignore: z.array(z.string()).default(DEFAULT_CONFIG.ignore),\n aliases: z.record(z.string(), z.string()).default(DEFAULT_CONFIG.aliases),\n tsconfigPath: z.string().min(1).default(DEFAULT_CONFIG.tsconfigPath),\n risk: riskConfigSchema.default(DEFAULT_CONFIG.risk),\n diff: diffConfigSchema.default(DEFAULT_CONFIG.diff),\n })\n .strict();\n\n/** Human-readable list of validation problems, for friendly error output. */\nexport function formatSchemaIssues(error: z.ZodError): string[] {\n return error.issues.map((issue) => {\n const path = issue.path.join(\".\");\n const location = path === \"\" ? \"config\" : `config.${path}`;\n return `${location}: ${issue.message}`;\n });\n}\n"]}