@dependabit/monitor 0.1.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 (69) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/LICENSE +21 -0
  3. package/README.md +33 -0
  4. package/dist/checkers/github-repo.d.ts +17 -0
  5. package/dist/checkers/github-repo.d.ts.map +1 -0
  6. package/dist/checkers/github-repo.js +115 -0
  7. package/dist/checkers/github-repo.js.map +1 -0
  8. package/dist/checkers/index.d.ts +7 -0
  9. package/dist/checkers/index.d.ts.map +1 -0
  10. package/dist/checkers/index.js +7 -0
  11. package/dist/checkers/index.js.map +1 -0
  12. package/dist/checkers/openapi.d.ts +24 -0
  13. package/dist/checkers/openapi.d.ts.map +1 -0
  14. package/dist/checkers/openapi.js +221 -0
  15. package/dist/checkers/openapi.js.map +1 -0
  16. package/dist/checkers/url-content.d.ts +16 -0
  17. package/dist/checkers/url-content.d.ts.map +1 -0
  18. package/dist/checkers/url-content.js +66 -0
  19. package/dist/checkers/url-content.js.map +1 -0
  20. package/dist/comparator.d.ts +16 -0
  21. package/dist/comparator.d.ts.map +1 -0
  22. package/dist/comparator.js +53 -0
  23. package/dist/comparator.js.map +1 -0
  24. package/dist/index.d.ts +15 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +12 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/monitor.d.ts +43 -0
  29. package/dist/monitor.d.ts.map +1 -0
  30. package/dist/monitor.js +85 -0
  31. package/dist/monitor.js.map +1 -0
  32. package/dist/normalizer.d.ts +24 -0
  33. package/dist/normalizer.d.ts.map +1 -0
  34. package/dist/normalizer.js +97 -0
  35. package/dist/normalizer.js.map +1 -0
  36. package/dist/scheduler.d.ts +64 -0
  37. package/dist/scheduler.d.ts.map +1 -0
  38. package/dist/scheduler.js +132 -0
  39. package/dist/scheduler.js.map +1 -0
  40. package/dist/severity.d.ts +22 -0
  41. package/dist/severity.d.ts.map +1 -0
  42. package/dist/severity.js +87 -0
  43. package/dist/severity.js.map +1 -0
  44. package/dist/types.d.ts +36 -0
  45. package/dist/types.d.ts.map +1 -0
  46. package/dist/types.js +5 -0
  47. package/dist/types.js.map +1 -0
  48. package/package.json +39 -0
  49. package/src/checkers/github-repo.ts +150 -0
  50. package/src/checkers/index.ts +7 -0
  51. package/src/checkers/openapi.ts +310 -0
  52. package/src/checkers/url-content.ts +78 -0
  53. package/src/comparator.ts +68 -0
  54. package/src/index.ts +20 -0
  55. package/src/monitor.ts +120 -0
  56. package/src/normalizer.ts +122 -0
  57. package/src/scheduler.ts +175 -0
  58. package/src/severity.ts +112 -0
  59. package/src/types.ts +40 -0
  60. package/test/checkers/github-repo.test.ts +124 -0
  61. package/test/checkers/openapi.test.ts +352 -0
  62. package/test/checkers/url-content.test.ts +99 -0
  63. package/test/comparator.test.ts +108 -0
  64. package/test/monitor.test.ts +177 -0
  65. package/test/normalizer.test.ts +66 -0
  66. package/test/scheduler.test.ts +674 -0
  67. package/test/severity.test.ts +122 -0
  68. package/tsconfig.json +10 -0
  69. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,53 @@
1
+ /**
2
+ * State Comparator
3
+ * Generic comparison logic for dependency state snapshots
4
+ */
5
+ export class StateComparator {
6
+ /**
7
+ * Compares two dependency snapshots to detect changes
8
+ */
9
+ compare(oldState, newState) {
10
+ const changes = [];
11
+ // Check state hash
12
+ if (oldState.stateHash !== newState.stateHash) {
13
+ changes.push('stateHash');
14
+ }
15
+ // Check version
16
+ if (oldState.version !== newState.version) {
17
+ changes.push('version');
18
+ }
19
+ // Check metadata changes (shallow comparison)
20
+ if (this.hasMetadataChanges(oldState.metadata, newState.metadata)) {
21
+ changes.push('metadata');
22
+ }
23
+ return {
24
+ hasChanged: changes.length > 0,
25
+ changes,
26
+ oldVersion: oldState.version,
27
+ newVersion: newState.version
28
+ };
29
+ }
30
+ /**
31
+ * Checks if metadata has changed (shallow comparison)
32
+ */
33
+ hasMetadataChanges(oldMeta, newMeta) {
34
+ if (!oldMeta && !newMeta) {
35
+ return false;
36
+ }
37
+ if (!oldMeta || !newMeta) {
38
+ return true;
39
+ }
40
+ const oldKeys = Object.keys(oldMeta);
41
+ const newKeys = Object.keys(newMeta);
42
+ if (oldKeys.length !== newKeys.length) {
43
+ return true;
44
+ }
45
+ for (const key of oldKeys) {
46
+ if (oldMeta[key] !== newMeta[key]) {
47
+ return true;
48
+ }
49
+ }
50
+ return false;
51
+ }
52
+ }
53
+ //# sourceMappingURL=comparator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comparator.js","sourceRoot":"","sources":["../src/comparator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,OAAO,eAAe;IAC1B;;OAEG;IACH,OAAO,CAAC,QAA4B,EAAE,QAA4B,EAAmB;QACnF,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,mBAAmB;QACnB,IAAI,QAAQ,CAAC,SAAS,KAAK,QAAQ,CAAC,SAAS,EAAE,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5B,CAAC;QAED,gBAAgB;QAChB,IAAI,QAAQ,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO,EAAE,CAAC;YAC1C,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;QAED,8CAA8C;QAC9C,IAAI,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClE,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3B,CAAC;QAED,OAAO;YACL,UAAU,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC;YAC9B,OAAO;YACP,UAAU,EAAE,QAAQ,CAAC,OAAO;YAC5B,UAAU,EAAE,QAAQ,CAAC,OAAO;SAC7B,CAAC;IAAA,CACH;IAED;;OAEG;IACK,kBAAkB,CACxB,OAAiC,EACjC,OAAiC,EACxB;QACT,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAErC,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClC,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IAAA,CACd;CACF"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @dependabit/monitor - Dependency change detection and monitoring
3
+ */
4
+ export { Monitor } from './monitor.js';
5
+ export type { DependencyConfig, CheckResult } from './monitor.js';
6
+ export { GitHubRepoChecker } from './checkers/github-repo.js';
7
+ export { URLContentChecker } from './checkers/url-content.js';
8
+ export { OpenAPIChecker } from './checkers/openapi.js';
9
+ export { StateComparator } from './comparator.js';
10
+ export { SeverityClassifier } from './severity.js';
11
+ export type { Severity } from './severity.js';
12
+ export { normalizeHTML, normalizeURL } from './normalizer.js';
13
+ export { Scheduler } from './scheduler.js';
14
+ export type { Checker, DependencySnapshot, ChangeDetection, AccessConfig } from './types.js';
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAElE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE9D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,YAAY,EAAE,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @dependabit/monitor - Dependency change detection and monitoring
3
+ */
4
+ export { Monitor } from './monitor.js';
5
+ export { GitHubRepoChecker } from './checkers/github-repo.js';
6
+ export { URLContentChecker } from './checkers/url-content.js';
7
+ export { OpenAPIChecker } from './checkers/openapi.js';
8
+ export { StateComparator } from './comparator.js';
9
+ export { SeverityClassifier } from './severity.js';
10
+ export { normalizeHTML, normalizeURL } from './normalizer.js';
11
+ export { Scheduler } from './scheduler.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGnD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE9D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Monitor Orchestrator
3
+ * Coordinates dependency checking across multiple access methods
4
+ */
5
+ import type { Checker, AccessConfig, DependencySnapshot, ChangeDetection } from './types.js';
6
+ export interface DependencyConfig extends AccessConfig {
7
+ id: string;
8
+ name?: string;
9
+ type?: string;
10
+ currentStateHash: string;
11
+ currentVersion?: string;
12
+ lastChecked?: string;
13
+ monitoring?: {
14
+ enabled?: boolean;
15
+ ignoreChanges?: boolean;
16
+ };
17
+ }
18
+ export interface CheckResult {
19
+ dependency: DependencyConfig;
20
+ hasChanged: boolean;
21
+ changes?: ChangeDetection;
22
+ severity?: 'breaking' | 'major' | 'minor' | undefined;
23
+ newSnapshot?: DependencySnapshot;
24
+ error?: string;
25
+ }
26
+ export declare class Monitor {
27
+ private checkers;
28
+ private classifier;
29
+ constructor();
30
+ /**
31
+ * Checks a single dependency for changes
32
+ */
33
+ checkDependency(dependency: DependencyConfig): Promise<CheckResult>;
34
+ /**
35
+ * Checks multiple dependencies, respecting monitoring rules
36
+ */
37
+ checkAll(dependencies: DependencyConfig[]): Promise<CheckResult[]>;
38
+ /**
39
+ * Registers a custom checker for an access method
40
+ */
41
+ registerChecker(accessMethod: string, checker: Checker): void;
42
+ }
43
+ //# sourceMappingURL=monitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor.d.ts","sourceRoot":"","sources":["../src/monitor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7F,MAAM,WAAW,gBAAiB,SAAQ,YAAY;IACpD,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE;QACX,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,gBAAgB,CAAC;IAC7B,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,QAAQ,CAAC,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;IACtD,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,UAAU,CAAqB;IAEvC,cAOC;IAED;;OAEG;IACG,eAAe,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,CAyCxE;IAED;;OAEG;IACG,QAAQ,CAAC,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAgBvE;IAED;;OAEG;IACH,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAE5D;CACF"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Monitor Orchestrator
3
+ * Coordinates dependency checking across multiple access methods
4
+ */
5
+ import { GitHubRepoChecker } from './checkers/github-repo.js';
6
+ import { URLContentChecker } from './checkers/url-content.js';
7
+ import { OpenAPIChecker } from './checkers/openapi.js';
8
+ import { SeverityClassifier } from './severity.js';
9
+ export class Monitor {
10
+ checkers;
11
+ classifier;
12
+ constructor() {
13
+ this.checkers = new Map();
14
+ this.checkers.set('github-api', new GitHubRepoChecker());
15
+ this.checkers.set('http', new URLContentChecker());
16
+ this.checkers.set('openapi', new OpenAPIChecker());
17
+ this.classifier = new SeverityClassifier();
18
+ }
19
+ /**
20
+ * Checks a single dependency for changes
21
+ */
22
+ async checkDependency(dependency) {
23
+ try {
24
+ // Get appropriate checker for access method
25
+ const checker = this.checkers.get(dependency.accessMethod);
26
+ if (!checker) {
27
+ throw new Error(`Unsupported access method: ${dependency.accessMethod}`);
28
+ }
29
+ // Fetch current state
30
+ const newSnapshot = await checker.fetch(dependency);
31
+ // Create old snapshot from stored data
32
+ const oldSnapshot = {
33
+ stateHash: dependency.currentStateHash,
34
+ version: dependency.currentVersion,
35
+ fetchedAt: dependency.lastChecked ? new Date(dependency.lastChecked) : new Date()
36
+ };
37
+ // Compare states
38
+ const changes = await checker.compare(oldSnapshot, newSnapshot);
39
+ // Classify severity if changes detected
40
+ let severity;
41
+ if (changes.hasChanged) {
42
+ severity = this.classifier.classify(changes);
43
+ }
44
+ return {
45
+ dependency,
46
+ hasChanged: changes.hasChanged,
47
+ changes,
48
+ severity,
49
+ newSnapshot
50
+ };
51
+ }
52
+ catch (error) {
53
+ return {
54
+ dependency,
55
+ hasChanged: false,
56
+ error: error.message
57
+ };
58
+ }
59
+ }
60
+ /**
61
+ * Checks multiple dependencies, respecting monitoring rules
62
+ */
63
+ async checkAll(dependencies) {
64
+ // Filter out disabled dependencies
65
+ const enabledDeps = dependencies.filter((dep) => {
66
+ if (dep.monitoring?.enabled === false) {
67
+ return false;
68
+ }
69
+ if (dep.monitoring?.ignoreChanges === true) {
70
+ return false;
71
+ }
72
+ return true;
73
+ });
74
+ // Check all dependencies in parallel
75
+ const results = await Promise.all(enabledDeps.map((dep) => this.checkDependency(dep)));
76
+ return results;
77
+ }
78
+ /**
79
+ * Registers a custom checker for an access method
80
+ */
81
+ registerChecker(accessMethod, checker) {
82
+ this.checkers.set(accessMethod, checker);
83
+ }
84
+ }
85
+ //# sourceMappingURL=monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor.js","sourceRoot":"","sources":["../src/monitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * HTML Normalizer for content-based change detection
3
+ *
4
+ * Implements 6-step normalization to reduce false positives:
5
+ * 1. Remove <script> and <style> tags
6
+ * 2. Strip HTML comments
7
+ * 3. Normalize whitespace
8
+ * 4. Remove timestamp patterns
9
+ * 5. Remove analytics/tracking parameters
10
+ * 6. Preserve meaningful content
11
+ */
12
+ /**
13
+ * Normalizes HTML content for consistent comparison
14
+ * @param html Raw HTML content
15
+ * @returns Normalized HTML string
16
+ */
17
+ export declare function normalizeHTML(html: string): string;
18
+ /**
19
+ * Normalizes a URL by removing tracking parameters
20
+ * @param url URL string
21
+ * @returns Normalized URL
22
+ */
23
+ export declare function normalizeURL(url: string): string;
24
+ //# sourceMappingURL=normalizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizer.d.ts","sourceRoot":"","sources":["../src/normalizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAiElD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAgChD"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * HTML Normalizer for content-based change detection
3
+ *
4
+ * Implements 6-step normalization to reduce false positives:
5
+ * 1. Remove <script> and <style> tags
6
+ * 2. Strip HTML comments
7
+ * 3. Normalize whitespace
8
+ * 4. Remove timestamp patterns
9
+ * 5. Remove analytics/tracking parameters
10
+ * 6. Preserve meaningful content
11
+ */
12
+ /**
13
+ * Normalizes HTML content for consistent comparison
14
+ * @param html Raw HTML content
15
+ * @returns Normalized HTML string
16
+ */
17
+ export function normalizeHTML(html) {
18
+ if (!html || html.trim() === '') {
19
+ return '';
20
+ }
21
+ let normalized = html;
22
+ // Step 1: Remove script and style tags (with content)
23
+ // Use a simpler, more secure approach - remove everything between opening and closing tags
24
+ // This handles variations like </script >, </script\n>, etc.
25
+ let prevLength = 0;
26
+ while (normalized.length !== prevLength) {
27
+ prevLength = normalized.length;
28
+ // Match <script...> then any content, then </script with any whitespace/attributes before >
29
+ normalized = normalized.replace(/<script\b[^>]*>[\s\S]*?<\/script\s*[^>]*>/gi, '');
30
+ }
31
+ prevLength = 0;
32
+ while (normalized.length !== prevLength) {
33
+ prevLength = normalized.length;
34
+ normalized = normalized.replace(/<style\b[^>]*>[\s\S]*?<\/style\s*[^>]*>/gi, '');
35
+ }
36
+ // Step 2: Strip HTML comments - iterative to handle nested comments
37
+ prevLength = 0;
38
+ while (normalized.length !== prevLength) {
39
+ prevLength = normalized.length;
40
+ normalized = normalized.replace(/<!--[\s\S]*?-->/g, '');
41
+ }
42
+ // Step 3: Normalize whitespace (collapse multiple spaces/newlines)
43
+ normalized = normalized.replace(/\s+/g, ' ');
44
+ normalized = normalized.trim();
45
+ // Step 4: Remove common timestamp patterns
46
+ // Patterns like "Updated: 2024-01-01" or "Last modified: Jan 1, 2024"
47
+ normalized = normalized.replace(/\b(Updated|Last\s+modified|Modified|Created|Published):\s*[^<\n]+/gi, '');
48
+ // Remove ISO timestamps
49
+ normalized = normalized.replace(/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:\d{2})?/g, '');
50
+ // Remove common date formats
51
+ normalized = normalized.replace(/\b(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+\d{1,2},?\s+\d{4}\b/gi, '');
52
+ // Step 5: Remove analytics/tracking parameters from URLs
53
+ // UTM parameters, tracking IDs, session IDs, etc.
54
+ normalized = normalized.replace(/[?&](utm_[^&\s"']+|fbclid|gclid|msclkid|mc_[^&\s"']+|_ga|sessionid)[^&\s"']*/gi, '');
55
+ // Step 6: Final cleanup - preserve meaningful content structure
56
+ // Remove extra spaces that may have been introduced
57
+ normalized = normalized.replace(/\s+/g, ' ');
58
+ normalized = normalized.trim();
59
+ return normalized;
60
+ }
61
+ /**
62
+ * Normalizes a URL by removing tracking parameters
63
+ * @param url URL string
64
+ * @returns Normalized URL
65
+ */
66
+ export function normalizeURL(url) {
67
+ try {
68
+ const urlObj = new URL(url);
69
+ // Remove common tracking parameters
70
+ const trackingParams = [
71
+ 'utm_source',
72
+ 'utm_medium',
73
+ 'utm_campaign',
74
+ 'utm_term',
75
+ 'utm_content',
76
+ 'fbclid',
77
+ 'gclid',
78
+ 'msclkid',
79
+ 'mc_cid',
80
+ 'mc_eid',
81
+ '_ga',
82
+ '_gac',
83
+ 'sessionid',
84
+ 'sid',
85
+ 'SSID'
86
+ ];
87
+ trackingParams.forEach((param) => {
88
+ urlObj.searchParams.delete(param);
89
+ });
90
+ return urlObj.toString();
91
+ }
92
+ catch {
93
+ // If URL parsing fails, return original
94
+ return url;
95
+ }
96
+ }
97
+ //# sourceMappingURL=normalizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizer.js","sourceRoot":"","sources":["../src/normalizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAU;IAClD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAChC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,UAAU,GAAG,IAAI,CAAC;IAEtB,sDAAsD;IACtD,2FAA2F;IAC3F,6DAA6D;IAC7D,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,OAAO,UAAU,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QACxC,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC;QAC/B,4FAA4F;QAC5F,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,6CAA6C,EAAE,EAAE,CAAC,CAAC;IACrF,CAAC;IACD,UAAU,GAAG,CAAC,CAAC;IACf,OAAO,UAAU,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QACxC,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC;QAC/B,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,2CAA2C,EAAE,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,oEAAoE;IACpE,UAAU,GAAG,CAAC,CAAC;IACf,OAAO,UAAU,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QACxC,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC;QAC/B,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,mEAAmE;IACnE,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7C,UAAU,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;IAE/B,2CAA2C;IAC3C,sEAAsE;IACtE,UAAU,GAAG,UAAU,CAAC,OAAO,CAC7B,qEAAqE,EACrE,EAAE,CACH,CAAC;IAEF,wBAAwB;IACxB,UAAU,GAAG,UAAU,CAAC,OAAO,CAC7B,kEAAkE,EAClE,EAAE,CACH,CAAC;IAEF,6BAA6B;IAC7B,UAAU,GAAG,UAAU,CAAC,OAAO,CAC7B,6EAA6E,EAC7E,EAAE,CACH,CAAC;IAEF,yDAAyD;IACzD,kDAAkD;IAClD,UAAU,GAAG,UAAU,CAAC,OAAO,CAC7B,gFAAgF,EAChF,EAAE,CACH,CAAC;IAEF,gEAAgE;IAChE,oDAAoD;IACpD,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7C,UAAU,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;IAE/B,OAAO,UAAU,CAAC;AAAA,CACnB;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW,EAAU;IAChD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAE5B,oCAAoC;QACpC,MAAM,cAAc,GAAG;YACrB,YAAY;YACZ,YAAY;YACZ,cAAc;YACd,UAAU;YACV,aAAa;YACb,QAAQ;YACR,OAAO;YACP,SAAS;YACT,QAAQ;YACR,QAAQ;YACR,KAAK;YACL,MAAM;YACN,WAAW;YACX,KAAK;YACL,MAAM;SACP,CAAC;QAEF,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;YAChC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAAA,CACnC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC;IAAC,MAAO,CAAC;QACR,wCAAwC;QACxC,OAAO,GAAG,CAAC;IACb,CAAC;AAAA,CACF"}
@@ -0,0 +1,64 @@
1
+ import { type DependencyEntry, type DependabitConfig } from '@dependabit/manifest';
2
+ export interface SchedulerOptions {
3
+ currentTime?: Date;
4
+ }
5
+ /**
6
+ * Scheduler for per-dependency monitoring
7
+ *
8
+ * Determines which dependencies should be checked based on:
9
+ * - Check frequency (hourly, daily, weekly, monthly)
10
+ * - Last checked timestamp
11
+ * - Enabled/disabled status
12
+ * - IgnoreChanges flag
13
+ * - Config overrides
14
+ */
15
+ export declare class Scheduler {
16
+ /**
17
+ * Check if a dependency should be checked now
18
+ *
19
+ * @param dependency Dependency entry
20
+ * @param config Configuration
21
+ * @param currentTime Current time (defaults to now)
22
+ * @returns true if dependency should be checked
23
+ */
24
+ shouldCheckDependency(dependency: DependencyEntry, config: DependabitConfig, currentTime?: Date): boolean;
25
+ /**
26
+ * Filter dependencies that should be checked
27
+ *
28
+ * @param dependencies Array of dependencies
29
+ * @param config Configuration
30
+ * @param currentTime Current time (defaults to now)
31
+ * @returns Filtered array of dependencies to check
32
+ */
33
+ filterDependenciesToCheck(dependencies: DependencyEntry[], config: DependabitConfig, currentTime?: Date): DependencyEntry[];
34
+ /**
35
+ * Get interval in milliseconds for a check frequency
36
+ *
37
+ * @param frequency Check frequency
38
+ * @returns Interval in milliseconds
39
+ */
40
+ private getIntervalMs;
41
+ /**
42
+ * Get next check time for a dependency
43
+ *
44
+ * @param dependency Dependency entry
45
+ * @param config Configuration
46
+ * @returns Next check time
47
+ */
48
+ getNextCheckTime(dependency: DependencyEntry, config: DependabitConfig): Date;
49
+ /**
50
+ * Get schedule summary for all dependencies
51
+ *
52
+ * @param dependencies Array of dependencies
53
+ * @param config Configuration
54
+ * @returns Schedule summary grouped by frequency
55
+ */
56
+ getScheduleSummary(dependencies: DependencyEntry[], config: DependabitConfig): {
57
+ hourly: number;
58
+ daily: number;
59
+ weekly: number;
60
+ monthly: number;
61
+ disabled: number;
62
+ };
63
+ }
64
+ //# sourceMappingURL=scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,gBAAgB,EAEtB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,IAAI,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,qBAAa,SAAS;IACpB;;;;;;;OAOG;IACH,qBAAqB,CACnB,UAAU,EAAE,eAAe,EAC3B,MAAM,EAAE,gBAAgB,EACxB,WAAW,GAAE,IAAiB,GAC7B,OAAO,CAoCT;IAED;;;;;;;OAOG;IACH,yBAAyB,CACvB,YAAY,EAAE,eAAe,EAAE,EAC/B,MAAM,EAAE,gBAAgB,EACxB,WAAW,GAAE,IAAiB,GAC7B,eAAe,EAAE,CAEnB;IAED;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAerB;;;;;;OAMG;IACH,gBAAgB,CAAC,UAAU,EAAE,eAAe,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAS5E;IAED;;;;;;OAMG;IACH,kBAAkB,CAChB,YAAY,EAAE,eAAe,EAAE,EAC/B,MAAM,EAAE,gBAAgB,GACvB;QACD,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;KAClB,CA+BA;CACF"}
@@ -0,0 +1,132 @@
1
+ import { getEffectiveMonitoringRules } from '@dependabit/manifest';
2
+ /**
3
+ * Scheduler for per-dependency monitoring
4
+ *
5
+ * Determines which dependencies should be checked based on:
6
+ * - Check frequency (hourly, daily, weekly, monthly)
7
+ * - Last checked timestamp
8
+ * - Enabled/disabled status
9
+ * - IgnoreChanges flag
10
+ * - Config overrides
11
+ */
12
+ export class Scheduler {
13
+ /**
14
+ * Check if a dependency should be checked now
15
+ *
16
+ * @param dependency Dependency entry
17
+ * @param config Configuration
18
+ * @param currentTime Current time (defaults to now)
19
+ * @returns true if dependency should be checked
20
+ */
21
+ shouldCheckDependency(dependency, config, currentTime = new Date()) {
22
+ // Check dependency's own monitoring rules first
23
+ if (dependency.monitoring) {
24
+ if (!dependency.monitoring.enabled) {
25
+ return false;
26
+ }
27
+ if (dependency.monitoring.ignoreChanges) {
28
+ return false;
29
+ }
30
+ }
31
+ // Get effective monitoring rules (applies config overrides)
32
+ const rules = getEffectiveMonitoringRules(config, dependency.url);
33
+ // Check if monitoring is enabled at config level
34
+ if (!rules.enabled) {
35
+ return false;
36
+ }
37
+ // Check if changes should be ignored at config level
38
+ if (rules.ignoreChanges) {
39
+ return false;
40
+ }
41
+ // Get last checked time
42
+ const lastChecked = new Date(dependency.lastChecked);
43
+ const timeSinceCheck = currentTime.getTime() - lastChecked.getTime();
44
+ // Determine frequency to use (dependency's own monitoring rules take precedence)
45
+ const checkFrequency = dependency.monitoring?.checkFrequency || rules.checkFrequency;
46
+ // Determine if enough time has passed based on frequency
47
+ const intervalMs = this.getIntervalMs(checkFrequency);
48
+ return timeSinceCheck >= intervalMs;
49
+ }
50
+ /**
51
+ * Filter dependencies that should be checked
52
+ *
53
+ * @param dependencies Array of dependencies
54
+ * @param config Configuration
55
+ * @param currentTime Current time (defaults to now)
56
+ * @returns Filtered array of dependencies to check
57
+ */
58
+ filterDependenciesToCheck(dependencies, config, currentTime = new Date()) {
59
+ return dependencies.filter((dep) => this.shouldCheckDependency(dep, config, currentTime));
60
+ }
61
+ /**
62
+ * Get interval in milliseconds for a check frequency
63
+ *
64
+ * @param frequency Check frequency
65
+ * @returns Interval in milliseconds
66
+ */
67
+ getIntervalMs(frequency) {
68
+ switch (frequency) {
69
+ case 'hourly':
70
+ return 60 * 60 * 1000; // 1 hour
71
+ case 'daily':
72
+ return 24 * 60 * 60 * 1000; // 24 hours
73
+ case 'weekly':
74
+ return 7 * 24 * 60 * 60 * 1000; // 7 days
75
+ case 'monthly':
76
+ return 30 * 24 * 60 * 60 * 1000; // 30 days (approximate)
77
+ default:
78
+ return 24 * 60 * 60 * 1000; // Default to daily
79
+ }
80
+ }
81
+ /**
82
+ * Get next check time for a dependency
83
+ *
84
+ * @param dependency Dependency entry
85
+ * @param config Configuration
86
+ * @returns Next check time
87
+ */
88
+ getNextCheckTime(dependency, config) {
89
+ const rules = getEffectiveMonitoringRules(config, dependency.url);
90
+ const lastChecked = new Date(dependency.lastChecked);
91
+ // Determine frequency to use (dependency's own monitoring rules take precedence)
92
+ const checkFrequency = dependency.monitoring?.checkFrequency || rules.checkFrequency;
93
+ const intervalMs = this.getIntervalMs(checkFrequency);
94
+ return new Date(lastChecked.getTime() + intervalMs);
95
+ }
96
+ /**
97
+ * Get schedule summary for all dependencies
98
+ *
99
+ * @param dependencies Array of dependencies
100
+ * @param config Configuration
101
+ * @returns Schedule summary grouped by frequency
102
+ */
103
+ getScheduleSummary(dependencies, config) {
104
+ const summary = {
105
+ hourly: 0,
106
+ daily: 0,
107
+ weekly: 0,
108
+ monthly: 0,
109
+ disabled: 0
110
+ };
111
+ for (const dep of dependencies) {
112
+ // Check dependency's own monitoring rules first
113
+ if (dep.monitoring) {
114
+ if (!dep.monitoring.enabled || dep.monitoring.ignoreChanges) {
115
+ summary.disabled++;
116
+ continue;
117
+ }
118
+ }
119
+ const rules = getEffectiveMonitoringRules(config, dep.url);
120
+ if (!rules.enabled || rules.ignoreChanges) {
121
+ summary.disabled++;
122
+ }
123
+ else {
124
+ // Use dependency-level frequency if available, otherwise use rules
125
+ const checkFrequency = dep.monitoring?.checkFrequency ?? rules.checkFrequency;
126
+ summary[checkFrequency]++;
127
+ }
128
+ }
129
+ return summary;
130
+ }
131
+ }
132
+ //# sourceMappingURL=scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Severity Classifier
3
+ * Classifies dependency changes into breaking, major, or minor severity levels
4
+ */
5
+ import type { ChangeDetection } from './types.js';
6
+ export type Severity = 'breaking' | 'major' | 'minor';
7
+ export declare class SeverityClassifier {
8
+ /**
9
+ * Classifies the severity of a change based on version changes and change types
10
+ */
11
+ classify(changes: ChangeDetection): Severity;
12
+ /**
13
+ * Classifies severity based on semantic versioning
14
+ * @returns Severity level or undefined if version format not recognized
15
+ */
16
+ private classifyVersionChange;
17
+ /**
18
+ * Parses a version string into [major, minor, patch]
19
+ */
20
+ private parseVersion;
21
+ }
22
+ //# sourceMappingURL=severity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"severity.d.ts","sourceRoot":"","sources":["../src/severity.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;AAEtD,qBAAa,kBAAkB;IAC7B;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,QAAQ,CAsC3C;IAED;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IA+B7B;;OAEG;IACH,OAAO,CAAC,YAAY;CAoBrB"}