@alimaandev/ripple 0.6.0 → 0.7.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.
@@ -4,7 +4,7 @@ import { z } from 'zod';
4
4
  // src/config/defaults.ts
5
5
  var DEFAULT_CONFIG = {
6
6
  $schema: void 0,
7
- include: ["**/*.{ts,tsx,js,jsx}"],
7
+ include: ["**/*.{ts,tsx,js,jsx,mts,cts,mjs,cjs}"],
8
8
  ignore: ["node_modules", "dist", "build", "coverage", ".next", "out", ".git"],
9
9
  aliases: {},
10
10
  tsconfigPath: "tsconfig.json",
@@ -75,5 +75,5 @@ function formatSchemaIssues(error) {
75
75
  }
76
76
 
77
77
  export { DEFAULT_CONFIG, formatSchemaIssues, rippleConfigSchema };
78
- //# sourceMappingURL=chunk-CFH4UW2E.js.map
79
- //# sourceMappingURL=chunk-CFH4UW2E.js.map
78
+ //# sourceMappingURL=chunk-VSLCAPAH.js.map
79
+ //# sourceMappingURL=chunk-VSLCAPAH.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-VSLCAPAH.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,mts,cts,mjs,cjs}\"],\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
@@ -144,4 +144,5 @@ declare const rippleConfigSchema: z.ZodType<RippleConfig>;
144
144
  /** Human-readable list of validation problems, for friendly error output. */
145
145
  declare function formatSchemaIssues(error: z.ZodError): string[];
146
146
 
147
- export { type AliasMap, type DiffConfig, type ProjectContext, type RippleConfig, type RiskFactor, type RiskLevel, type RiskResult, type TsconfigInfo, formatSchemaIssues, rippleConfigSchema };
147
+ export { formatSchemaIssues, rippleConfigSchema };
148
+ export type { AliasMap, DiffConfig, ProjectContext, RippleConfig, RiskFactor, RiskLevel, RiskResult, TsconfigInfo };
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env node
2
- export { formatSchemaIssues, rippleConfigSchema } from './chunk-CFH4UW2E.js';
2
+ export { formatSchemaIssues, rippleConfigSchema } from './chunk-VSLCAPAH.js';
3
3
  //# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alimaandev/ripple",
3
- "version": "0.6.0",
3
+ "version": "0.7.1",
4
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",
@@ -61,6 +61,7 @@
61
61
  "lint:fix": "eslint . --fix",
62
62
  "format": "prettier --write .",
63
63
  "format:check": "prettier --check .",
64
+ "metrics": "node scripts/metrics.mjs",
64
65
  "prepublishOnly": "pnpm run typecheck && pnpm run lint && pnpm run test && pnpm run build"
65
66
  },
66
67
  "dependencies": {
@@ -86,7 +87,7 @@
86
87
  "eslint": "^10.8.0",
87
88
  "eslint-config-prettier": "^10.1.8",
88
89
  "prettier": "^3.9.6",
89
- "tsup": "^8.5.1",
90
+ "tsup": "^9.0.0",
90
91
  "typescript": "^5.9.3",
91
92
  "typescript-eslint": "^8.66.0",
92
93
  "vitest": "^4.1.10"
@@ -106,7 +106,7 @@
106
106
  "base": {
107
107
  "type": "string",
108
108
  "minLength": 1,
109
- "description": "Git ref used as the change-set base when no `--base` is given."
109
+ "description": "Git ref used as the change-set base when no `--base` is given. Defaults to the GitHub PR base, then `origin/HEAD`, `origin/main`, `origin/master`, `main`, or `master`."
110
110
  },
111
111
  "gate": {
112
112
  "enum": ["medium", "high", "critical"],
@@ -115,7 +115,7 @@
115
115
  "allow": {
116
116
  "type": "array",
117
117
  "items": { "type": "string" },
118
- "description": "Glob patterns of changed files that are analyzed and reported but never block the gate."
118
+ "description": "Glob patterns of changed files (relative to the project root) that are analyzed and reported but never block the gate."
119
119
  }
120
120
  }
121
121
  }
@@ -1 +0,0 @@
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"]}