@hardlydifficult/repo-processor 1.0.141 → 1.0.142

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.
@@ -2,146 +2,117 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RepoWatcher = void 0;
4
4
  const state_tracker_1 = require("@hardlydifficult/state-tracker");
5
- /**
6
- * Watches for SHA changes on GitHub repos and triggers processing.
7
- *
8
- * Handles state persistence (last-processed SHA per repo), concurrent run
9
- * prevention, pending SHA re-triggers, and manual triggers. Consumers
10
- * provide the `run` callback containing domain-specific logic.
11
- */
5
+ function getDefaultStateKey(repo) {
6
+ return `repo-processor-${repo.replace(/[^A-Za-z0-9_-]/gu, "-")}`;
7
+ }
8
+ /** Watches for repository updates and schedules processor runs with retries. */
12
9
  class RepoWatcher {
13
- stateTracker;
14
- running = new Set();
15
- pendingSha = new Map();
16
- config;
17
- maxAttempts;
18
- constructor(config) {
19
- this.config = config;
20
- this.maxAttempts = config.maxAttempts ?? 1;
21
- this.stateTracker = new state_tracker_1.StateTracker({
22
- key: config.stateKey,
23
- default: { lastProcessedSha: {} },
24
- stateDirectory: config.stateDirectory,
25
- storageAdapter: config.storageAdapter,
26
- autoSaveMs: config.autoSaveMs ?? 5000,
27
- onEvent: config.onEvent,
10
+ static async open(processor, options = {}) {
11
+ const stateTracker = await state_tracker_1.StateTracker.open({
12
+ key: options.stateKey ?? getDefaultStateKey(processor.repo),
13
+ default: {},
14
+ stateDirectory: options.stateDirectory,
15
+ autoSaveMs: options.autoSaveMs ?? 5000,
16
+ onEvent: options.onEvent,
28
17
  });
18
+ return new RepoWatcher(processor, stateTracker, options);
29
19
  }
30
- /** Load persisted state from disk. */
31
- async init() {
32
- await this.stateTracker.loadAsync();
20
+ processor;
21
+ stateTracker;
22
+ onComplete;
23
+ onError;
24
+ onEvent;
25
+ maxAttempts;
26
+ running = false;
27
+ pendingSha;
28
+ constructor(processor, stateTracker, options) {
29
+ this.processor = processor;
30
+ this.stateTracker = stateTracker;
31
+ this.onComplete = options.onComplete;
32
+ this.onError = options.onError;
33
+ this.onEvent = options.onEvent;
34
+ this.maxAttempts = options.maxAttempts ?? 1;
33
35
  }
34
- /**
35
- * Handle a push event. Compares the SHA against tracked state,
36
- * queues processing if changed, stores as pending if already running.
37
- */
38
- handlePush(owner, name, sha) {
39
- const key = `${owner}/${name}`;
40
- const lastSha = this.stateTracker.state.lastProcessedSha[key];
41
- if (lastSha === sha) {
36
+ handlePush(sha) {
37
+ if (this.getLastSha() === sha) {
42
38
  return;
43
39
  }
44
- if (this.running.has(key)) {
45
- this.pendingSha.set(key, sha);
40
+ if (this.running) {
41
+ this.pendingSha = sha;
46
42
  return;
47
43
  }
48
- this.queueRun(owner, name, sha);
49
- }
50
- /**
51
- * Queue a run unconditionally (no SHA comparison).
52
- * Skips if already running. Returns false if skipped.
53
- */
54
- trigger(owner, name) {
55
- const key = `${owner}/${name}`;
56
- if (this.running.has(key)) {
57
- return false;
58
- }
59
- this.queueRun(owner, name, "");
60
- return true;
44
+ this.queueRun();
61
45
  }
62
- /**
63
- * Run processing synchronously (blocks until complete).
64
- * Returns an error if already running.
65
- */
66
- async triggerManual(owner, name) {
67
- const key = `${owner}/${name}`;
68
- if (this.running.has(key)) {
69
- return {
70
- success: false,
71
- reason: `Already running for ${key}`,
72
- };
46
+ async runNow() {
47
+ if (this.running) {
48
+ throw new Error(`Already running for ${this.processor.repo}`);
73
49
  }
74
- this.running.add(key);
50
+ this.running = true;
75
51
  try {
76
- const result = await this.executeWithRetry(owner, name);
77
- return { success: true, result };
52
+ const result = await this.executeWithRetry();
53
+ this.completeRun(result);
54
+ return result;
78
55
  }
79
56
  catch (error) {
80
- this.config.onError?.(owner, name, error);
81
- const message = error instanceof Error ? error.message : String(error);
82
- return { success: false, reason: message };
57
+ this.onError?.(error);
58
+ throw error;
83
59
  }
84
60
  finally {
85
- this.running.delete(key);
61
+ this.running = false;
62
+ this.flushPendingRun();
86
63
  }
87
64
  }
88
- /** Check if a repo is currently being processed. */
89
- isRunning(owner, name) {
90
- return this.running.has(`${owner}/${name}`);
65
+ isRunning() {
66
+ return this.running;
91
67
  }
92
- /** Get the last processed SHA for a repo key. */
93
- getLastSha(key) {
94
- return this.stateTracker.state.lastProcessedSha[key];
68
+ getLastSha() {
69
+ return this.stateTracker.state.lastProcessedSha;
95
70
  }
96
- /** Persist a processed SHA for a repo key. */
97
- setLastSha(key, sha) {
98
- this.stateTracker.set({
99
- ...this.stateTracker.state,
100
- lastProcessedSha: {
101
- ...this.stateTracker.state.lastProcessedSha,
102
- [key]: sha,
103
- },
104
- });
71
+ setLastSha(sha) {
72
+ this.stateTracker.set({ lastProcessedSha: sha });
105
73
  }
106
- // ---------------------------------------------------------------------------
107
- // Private
108
- // ---------------------------------------------------------------------------
109
- queueRun(owner, name, sha) {
110
- const key = `${owner}/${name}`;
111
- this.running.add(key);
112
- this.executeWithRetry(owner, name)
74
+ queueRun() {
75
+ this.running = true;
76
+ this.executeWithRetry()
113
77
  .then((result) => {
114
- if (sha) {
115
- this.setLastSha(key, sha);
116
- }
117
- this.config.onComplete?.(owner, name, result, sha);
78
+ this.completeRun(result);
118
79
  })
119
80
  .catch((error) => {
120
- this.config.onError?.(owner, name, error);
81
+ this.onError?.(error);
121
82
  })
122
83
  .finally(() => {
123
- this.running.delete(key);
124
- const pending = this.pendingSha.get(key);
125
- if (pending !== undefined) {
126
- this.pendingSha.delete(key);
127
- this.handlePush(owner, name, pending);
128
- }
84
+ this.running = false;
85
+ this.flushPendingRun();
129
86
  });
130
87
  }
131
- async executeWithRetry(owner, name) {
88
+ completeRun(result) {
89
+ this.setLastSha(result.sourceSha);
90
+ this.onComplete?.(result, result.sourceSha);
91
+ }
92
+ flushPendingRun() {
93
+ const { pendingSha } = this;
94
+ this.pendingSha = undefined;
95
+ if (pendingSha === undefined ||
96
+ pendingSha === this.getLastSha() ||
97
+ this.running) {
98
+ return;
99
+ }
100
+ this.queueRun();
101
+ }
102
+ async executeWithRetry() {
132
103
  let lastError;
133
104
  for (let attempt = 1; attempt <= this.maxAttempts; attempt++) {
134
105
  try {
135
- return await this.config.run(owner, name);
106
+ return await this.processor.run();
136
107
  }
137
108
  catch (error) {
138
109
  lastError = error;
139
110
  if (attempt < this.maxAttempts) {
140
- this.config.onEvent?.({
111
+ this.onEvent?.({
141
112
  level: "warn",
142
113
  message: `Run failed (attempt ${String(attempt)}/${String(this.maxAttempts)}), retrying`,
143
114
  context: {
144
- repo: `${owner}/${name}`,
115
+ repo: this.processor.repo,
145
116
  error: error instanceof Error ? error.message : String(error),
146
117
  },
147
118
  });
@@ -1 +1 @@
1
- {"version":3,"file":"RepoWatcher.js","sourceRoot":"","sources":["../src/RepoWatcher.ts"],"names":[],"mappings":";;;AAAA,kEAIwC;AAgCxC;;;;;;GAMG;AACH,MAAa,WAAW;IACL,YAAY,CAA6B;IACzC,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAC5B,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,MAAM,CAA6B;IACnC,WAAW,CAAS;IAErC,YAAY,MAAkC;QAC5C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC;QAE3C,IAAI,CAAC,YAAY,GAAG,IAAI,4BAAY,CAAe;YACjD,GAAG,EAAE,MAAM,CAAC,QAAQ;YACpB,OAAO,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE;YACjC,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI;YACrC,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC,CAAC;IACL,CAAC;IAED,sCAAsC;IACtC,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;IACtC,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,KAAa,EAAE,IAAY,EAAE,GAAW;QACjD,MAAM,GAAG,GAAG,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC9D,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAC9B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IAClC,CAAC;IAED;;;OAGG;IACH,OAAO,CAAC,KAAa,EAAE,IAAY;QACjC,MAAM,GAAG,GAAG,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,aAAa,CACjB,KAAa,EACb,IAAY;QAIZ,MAAM,GAAG,GAAG,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,uBAAuB,GAAG,EAAE;aACrC,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACxD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACnC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAC1C,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QAC7C,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,oDAAoD;IACpD,SAAS,CAAC,KAAa,EAAE,IAAY;QACnC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,iDAAiD;IACjD,UAAU,CAAC,GAAW;QACpB,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACvD,CAAC;IAED,8CAA8C;IAC9C,UAAU,CAAC,GAAW,EAAE,GAAW;QACjC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;YACpB,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK;YAC1B,gBAAgB,EAAE;gBAChB,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,gBAAgB;gBAC3C,CAAC,GAAG,CAAC,EAAE,GAAG;aACX;SACF,CAAC,CAAC;IACL,CAAC;IAED,8EAA8E;IAC9E,UAAU;IACV,8EAA8E;IAEtE,QAAQ,CAAC,KAAa,EAAE,IAAY,EAAE,GAAW;QACvD,MAAM,GAAG,GAAG,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEtB,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC;aAC/B,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACf,IAAI,GAAG,EAAE,CAAC;gBACR,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAC5B,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QACrD,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACxB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAEzB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACzC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC5B,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;YACxC,CAAC;QACH,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAC5B,KAAa,EACb,IAAY;QAEZ,IAAI,SAAkB,CAAC;QAEvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;YAC7D,IAAI,CAAC;gBACH,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC5C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,SAAS,GAAG,KAAK,CAAC;gBAClB,IAAI,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;oBAC/B,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;wBACpB,KAAK,EAAE,MAAM;wBACb,OAAO,EAAE,uBAAuB,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa;wBACxF,OAAO,EAAE;4BACP,IAAI,EAAE,GAAG,KAAK,IAAI,IAAI,EAAE;4BACxB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;yBAC9D;qBACF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,SAAS,CAAC;IAClB,CAAC;CACF;AArKD,kCAqKC"}
1
+ {"version":3,"file":"RepoWatcher.js","sourceRoot":"","sources":["../src/RepoWatcher.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,9 +1,4 @@
1
1
  export { RepoProcessor } from "./RepoProcessor.js";
2
- export type { RepoProcessorConfig } from "./RepoProcessor.js";
3
2
  export { RepoWatcher } from "./RepoWatcher.js";
4
- export type { RepoWatcherConfig } from "./RepoWatcher.js";
5
- export { resolveStaleDirectories } from "./resolveDirectories.js";
6
- export { GitYamlStore } from "./GitYamlStore.js";
7
- export type { GitYamlStoreConfig } from "./GitYamlStore.js";
8
- export type { ProcessorStore, ProcessorCallbacks, FileContext, DirectoryContext, DirectoryChild, ProcessingProgress, ProgressCallback, ProcessingResult, } from "./types.js";
3
+ export type { GitIdentity, RepoFileFilterInput, RepoFileInput, RepoDirectoryChild, RepoDirectoryInput, RepoProcessorResultsConfig, RepoProcessorOptions, RepoProcessorProgressCounts, RepoProcessorProgress, RepoProcessorProgressCallback, RepoProcessorRunOptions, RepoProcessorRunResult, RepoWatcherOptions, } from "./types.js";
9
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,YAAY,EACV,cAAc,EACd,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EACV,WAAW,EACX,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,0BAA0B,EAC1B,oBAAoB,EACpB,2BAA2B,EAC3B,qBAAqB,EACrB,6BAA6B,EAC7B,uBAAuB,EACvB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,12 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.GitYamlStore = exports.resolveStaleDirectories = exports.RepoWatcher = exports.RepoProcessor = void 0;
3
+ exports.RepoWatcher = exports.RepoProcessor = void 0;
4
4
  var RepoProcessor_js_1 = require("./RepoProcessor.js");
5
5
  Object.defineProperty(exports, "RepoProcessor", { enumerable: true, get: function () { return RepoProcessor_js_1.RepoProcessor; } });
6
6
  var RepoWatcher_js_1 = require("./RepoWatcher.js");
7
7
  Object.defineProperty(exports, "RepoWatcher", { enumerable: true, get: function () { return RepoWatcher_js_1.RepoWatcher; } });
8
- var resolveDirectories_js_1 = require("./resolveDirectories.js");
9
- Object.defineProperty(exports, "resolveStaleDirectories", { enumerable: true, get: function () { return resolveDirectories_js_1.resolveStaleDirectories; } });
10
- var GitYamlStore_js_1 = require("./GitYamlStore.js");
11
- Object.defineProperty(exports, "GitYamlStore", { enumerable: true, get: function () { return GitYamlStore_js_1.GitYamlStore; } });
12
8
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,uDAAmD;AAA1C,iHAAA,aAAa,OAAA;AAEtB,mDAA+C;AAAtC,6GAAA,WAAW,OAAA;AAEpB,iEAAkE;AAAzD,gIAAA,uBAAuB,OAAA;AAChC,qDAAiD;AAAxC,+GAAA,YAAY,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,uDAAmD;AAA1C,iHAAA,aAAa,OAAA;AACtB,mDAA+C;AAAtC,6GAAA,WAAW,OAAA"}
@@ -0,0 +1,42 @@
1
+ import type { FileTreeResult, TreeEntry } from "@hardlydifficult/github";
2
+ import type { z } from "zod";
3
+ import type { RepoDirectoryInput, RepoFileFilterInput, RepoFileInput } from "./types.js";
4
+ export interface BoundRepoRef {
5
+ owner: string;
6
+ name: string;
7
+ fullName: string;
8
+ }
9
+ export type FileManifest = Record<string, string>;
10
+ export interface ResultsStore {
11
+ ensureReady(): Promise<void>;
12
+ getFileManifest(): Promise<FileManifest>;
13
+ getDirSha(dirPath: string): Promise<string | null>;
14
+ writeFileResult(filePath: string, sha: string, result: unknown): Promise<void>;
15
+ writeDirResult(dirPath: string, sha: string, result: unknown): Promise<void>;
16
+ deleteFileResult(filePath: string): Promise<void>;
17
+ commitBatch(sourceRepo: string, count: number): Promise<void>;
18
+ readFileResult<T>(filePath: string, schema: z.ZodType<T>): Promise<T | null>;
19
+ readDirectoryResult<T>(dirPath: string, schema: z.ZodType<T>): Promise<T | null>;
20
+ }
21
+ export interface RepoClientLike {
22
+ getFileTree(ref?: string): Promise<FileTreeResult>;
23
+ getFileContent(filePath: string, ref?: string): Promise<string>;
24
+ }
25
+ export interface RepoProcessorInternals<TFileResult, TDirResult = never> {
26
+ repo: BoundRepoRef;
27
+ repoClient: RepoClientLike;
28
+ store: ResultsStore;
29
+ ref?: string;
30
+ concurrency: number;
31
+ include: (file: RepoFileFilterInput) => boolean;
32
+ processFile(file: RepoFileInput): Promise<TFileResult>;
33
+ processDirectory?: (directory: RepoDirectoryInput) => Promise<TDirResult>;
34
+ }
35
+ export interface ProcessingFailure {
36
+ path: string;
37
+ reason: unknown;
38
+ }
39
+ export type DirectoryTreeEntry = TreeEntry & {
40
+ type: "tree";
41
+ };
42
+ //# sourceMappingURL=internalTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internalTypes.d.ts","sourceRoot":"","sources":["../src/internalTypes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAElD,MAAM,WAAW,YAAY;IAC3B,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,eAAe,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC;IACzC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACnD,eAAe,CACb,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7E,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC7E,mBAAmB,CAAC,CAAC,EACnB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACnD,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACjE;AAED,MAAM,WAAW,sBAAsB,CAAC,WAAW,EAAE,UAAU,GAAG,KAAK;IACrE,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,cAAc,CAAC;IAC3B,KAAK,EAAE,YAAY,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,CAAC,IAAI,EAAE,mBAAmB,KAAK,OAAO,CAAC;IAChD,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACvD,gBAAgB,CAAC,EAAE,CAAC,SAAS,EAAE,kBAAkB,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;CAC3E;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=internalTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internalTypes.js","sourceRoot":"","sources":["../src/internalTypes.ts"],"names":[],"mappings":""}
@@ -1,14 +1,5 @@
1
1
  import type { TreeEntry } from "@hardlydifficult/github";
2
- import type { ProcessorStore } from "./types.js";
3
- /**
4
- * Find all directories that need (re-)processing.
5
- *
6
- * Combines two sources:
7
- * 1. Stale dirs from diffTree (directories with changed/removed children)
8
- * 2. Any directory whose stored SHA is missing or differs from the current tree SHA
9
- *
10
- * The second source handles recovery after partial failures and catches
11
- * directories whose tree SHA changed without any processable file changes.
12
- */
13
- export declare function resolveStaleDirectories(owner: string, repo: string, staleDirsFromDiff: readonly string[], allFilePaths: readonly string[], tree: readonly TreeEntry[], store: ProcessorStore): Promise<string[]>;
2
+ import type { ResultsStore } from "./internalTypes.js";
3
+ /** Returns directories that are missing results or whose stored SHA is stale. */
4
+ export declare function resolveStaleDirectories(staleDirsFromDiff: readonly string[], allFilePaths: readonly string[], tree: readonly TreeEntry[], store: ResultsStore): Promise<string[]>;
14
5
  //# sourceMappingURL=resolveDirectories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolveDirectories.d.ts","sourceRoot":"","sources":["../src/resolveDirectories.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;;;;;GASG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,iBAAiB,EAAE,SAAS,MAAM,EAAE,EACpC,YAAY,EAAE,SAAS,MAAM,EAAE,EAC/B,IAAI,EAAE,SAAS,SAAS,EAAE,EAC1B,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC,MAAM,EAAE,CAAC,CAyCnB"}
1
+ {"version":3,"file":"resolveDirectories.d.ts","sourceRoot":"","sources":["../src/resolveDirectories.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,iFAAiF;AACjF,wBAAsB,uBAAuB,CAC3C,iBAAiB,EAAE,SAAS,MAAM,EAAE,EACpC,YAAY,EAAE,SAAS,MAAM,EAAE,EAC/B,IAAI,EAAE,SAAS,SAAS,EAAE,EAC1B,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,MAAM,EAAE,CAAC,CAoCnB"}
@@ -1,50 +1,35 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.resolveStaleDirectories = resolveStaleDirectories;
4
- /**
5
- * Find all directories that need (re-)processing.
6
- *
7
- * Combines two sources:
8
- * 1. Stale dirs from diffTree (directories with changed/removed children)
9
- * 2. Any directory whose stored SHA is missing or differs from the current tree SHA
10
- *
11
- * The second source handles recovery after partial failures and catches
12
- * directories whose tree SHA changed without any processable file changes.
13
- */
14
- async function resolveStaleDirectories(owner, repo, staleDirsFromDiff, allFilePaths, tree, store) {
15
- // Build map of directory path → current tree SHA
4
+ /** Returns directories that are missing results or whose stored SHA is stale. */
5
+ async function resolveStaleDirectories(staleDirsFromDiff, allFilePaths, tree, store) {
16
6
  const treeShaByDir = new Map();
17
7
  for (const entry of tree) {
18
8
  if (entry.type === "tree") {
19
9
  treeShaByDir.set(entry.path, entry.sha);
20
10
  }
21
11
  }
22
- // Collect all directories that should be processed (derived from file paths + root)
23
12
  const allExpectedDirs = new Set();
24
13
  for (const filePath of allFilePaths) {
25
14
  const parts = filePath.split("/");
26
- for (let i = 1; i < parts.length; i++) {
27
- allExpectedDirs.add(parts.slice(0, i).join("/"));
15
+ for (let index = 1; index < parts.length; index++) {
16
+ allExpectedDirs.add(parts.slice(0, index).join("/"));
28
17
  }
29
18
  }
30
- // Always include root
31
19
  allExpectedDirs.add("");
32
- // Start with stale dirs from diff
33
20
  const needed = new Set(staleDirsFromDiff);
34
- // Check every expected directory for a missing or stale stored SHA
35
21
  for (const dirPath of allExpectedDirs) {
36
22
  if (needed.has(dirPath)) {
37
23
  continue;
38
24
  }
39
- const storedSha = await store.getDirSha(owner, repo, dirPath);
25
+ const storedSha = await store.getDirSha(dirPath);
40
26
  if (storedSha === null) {
41
27
  needed.add(dirPath);
28
+ continue;
42
29
  }
43
- else {
44
- const currentSha = treeShaByDir.get(dirPath) ?? "";
45
- if (storedSha !== currentSha) {
46
- needed.add(dirPath);
47
- }
30
+ const currentSha = treeShaByDir.get(dirPath) ?? "";
31
+ if (storedSha !== currentSha) {
32
+ needed.add(dirPath);
48
33
  }
49
34
  }
50
35
  return [...needed];
@@ -1 +1 @@
1
- {"version":3,"file":"resolveDirectories.js","sourceRoot":"","sources":["../src/resolveDirectories.ts"],"names":[],"mappings":";;AAcA,0DAgDC;AA1DD;;;;;;;;;GASG;AACI,KAAK,UAAU,uBAAuB,CAC3C,KAAa,EACb,IAAY,EACZ,iBAAoC,EACpC,YAA+B,EAC/B,IAA0B,EAC1B,KAAqB;IAErB,iDAAiD;IACjD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC/C,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QACzB,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1B,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,oFAAoF;IACpF,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAC1C,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IACD,sBAAsB;IACtB,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAExB,kCAAkC;IAClC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAE1C,mEAAmE;IACnE,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;QACtC,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC9D,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACnD,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;gBAC7B,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"resolveDirectories.js","sourceRoot":"","sources":["../src/resolveDirectories.ts"],"names":[],"mappings":";;AAKA,0DAyCC;AA1CD,iFAAiF;AAC1E,KAAK,UAAU,uBAAuB,CAC3C,iBAAoC,EACpC,YAA+B,EAC/B,IAA0B,EAC1B,KAAmB;IAEnB,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC/C,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QACzB,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1B,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAC1C,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;YAClD,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IACD,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAExB,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC1C,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;QACtC,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACpB,SAAS;QACX,CAAC;QAED,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACnD,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAC7B,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;AACrB,CAAC"}
package/dist/types.d.ts CHANGED
@@ -1,66 +1,76 @@
1
- import type { FileManifest, TreeEntry } from "@hardlydifficult/github";
2
- export type { TreeEntry, FileManifest };
3
- /** Manifest of previously processed file SHAs (path → blob SHA). */
4
- export type { FileManifest as ProcessorFileManifest };
5
- /** Consumer-implemented persistence layer. */
6
- export interface ProcessorStore {
7
- /** One-time init (e.g. ensure local clone). Optional. */
8
- ensureReady?(owner: string, repo: string): Promise<void>;
9
- /** Return manifest of previously processed file SHAs (path → blob SHA). */
10
- getFileManifest(owner: string, repo: string): Promise<FileManifest>;
11
- /** Return stored SHA for a directory. Null if not stored. */
12
- getDirSha(owner: string, repo: string, dirPath: string): Promise<string | null>;
13
- /** Persist result for a processed file. */
14
- writeFileResult(owner: string, repo: string, path: string, sha: string, result: unknown): Promise<void>;
15
- /** Persist result for a processed directory. */
16
- writeDirResult(owner: string, repo: string, path: string, sha: string, result: unknown): Promise<void>;
17
- /** Delete stored result for a removed file. */
18
- deleteFileResult(owner: string, repo: string, path: string): Promise<void>;
19
- /** Commit current batch of changes. */
20
- commitBatch(owner: string, repo: string, count: number): Promise<void>;
1
+ import type { StateTrackerEvent } from "@hardlydifficult/state-tracker";
2
+ export interface GitIdentity {
3
+ name: string;
4
+ email: string;
21
5
  }
22
- /** Context passed to processFile callback. */
23
- export interface FileContext {
24
- readonly entry: TreeEntry;
25
- readonly content: string;
6
+ export interface RepoFileFilterInput {
7
+ path: string;
8
+ sha: string;
9
+ size?: number;
26
10
  }
27
- /** An immediate child of a directory being processed. */
28
- export interface DirectoryChild {
29
- readonly name: string;
30
- readonly isDir: boolean;
31
- readonly fullPath: string;
11
+ export interface RepoFileInput {
12
+ repo: string;
13
+ path: string;
14
+ sha: string;
15
+ content: string;
32
16
  }
33
- /** Context passed to processDirectory callback. */
34
- export interface DirectoryContext {
35
- readonly path: string;
36
- readonly sha: string;
37
- readonly subtreeFilePaths: readonly string[];
38
- readonly children: readonly DirectoryChild[];
39
- readonly tree: readonly TreeEntry[];
17
+ export interface RepoDirectoryChild {
18
+ name: string;
19
+ path: string;
20
+ type: "file" | "directory";
40
21
  }
41
- /** Consumer-provided domain logic. */
42
- export interface ProcessorCallbacks {
43
- /** Filter: which tree entries should be processed? */
44
- shouldProcess(entry: TreeEntry): boolean;
45
- /** Process a single changed file. Return value passed to store.writeFileResult. */
46
- processFile(ctx: FileContext): Promise<unknown>;
47
- /** Process a directory after all children. Return value passed to store.writeDirResult. */
48
- processDirectory(ctx: DirectoryContext): Promise<unknown>;
22
+ export interface RepoDirectoryInput {
23
+ repo: string;
24
+ path: string;
25
+ sha: string;
26
+ files: readonly string[];
27
+ children: readonly RepoDirectoryChild[];
49
28
  }
50
- /** Progress reported during a run. */
51
- export interface ProcessingProgress {
29
+ export interface RepoProcessorResultsConfig {
30
+ repo: string;
31
+ directory: string;
32
+ root?: string;
33
+ branch?: string;
34
+ gitUser?: GitIdentity;
35
+ }
36
+ export interface RepoProcessorOptions<TFileResult, TDirResult = never> {
37
+ repo: string;
38
+ githubToken?: string;
39
+ ref?: string;
40
+ concurrency?: number;
41
+ results: RepoProcessorResultsConfig;
42
+ include?: (file: RepoFileFilterInput) => boolean;
43
+ processFile(file: RepoFileInput): Promise<TFileResult>;
44
+ processDirectory?: (directory: RepoDirectoryInput) => Promise<TDirResult>;
45
+ }
46
+ export interface RepoProcessorProgressCounts {
47
+ total: number;
48
+ completed: number;
49
+ }
50
+ export interface RepoProcessorProgress {
52
51
  phase: "loading" | "files" | "directories" | "committing";
53
52
  message: string;
54
- filesTotal: number;
55
- filesCompleted: number;
56
- dirsTotal: number;
57
- dirsCompleted: number;
53
+ files: RepoProcessorProgressCounts;
54
+ directories: RepoProcessorProgressCounts;
55
+ }
56
+ export type RepoProcessorProgressCallback = (progress: RepoProcessorProgress) => void;
57
+ export interface RepoProcessorRunOptions {
58
+ onProgress?: RepoProcessorProgressCallback;
59
+ }
60
+ export interface RepoProcessorRunResult {
61
+ repo: string;
62
+ sourceSha: string;
63
+ processedFiles: number;
64
+ removedFiles: number;
65
+ processedDirectories: number;
58
66
  }
59
- export type ProgressCallback = (progress: ProcessingProgress) => void;
60
- /** Result returned by RepoProcessor.run(). */
61
- export interface ProcessingResult {
62
- filesProcessed: number;
63
- filesRemoved: number;
64
- dirsProcessed: number;
67
+ export interface RepoWatcherOptions {
68
+ stateDirectory?: string;
69
+ stateKey?: string;
70
+ autoSaveMs?: number;
71
+ maxAttempts?: number;
72
+ onComplete?: (result: RepoProcessorRunResult, sha: string) => void;
73
+ onError?: (error: unknown) => void;
74
+ onEvent?: (event: StateTrackerEvent) => void;
65
75
  }
66
76
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}