@lage-run/scheduler 1.5.13 → 1.5.15

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.
package/CHANGELOG.json CHANGED
@@ -1,6 +1,21 @@
1
1
  {
2
2
  "name": "@lage-run/scheduler",
3
3
  "entries": [
4
+ {
5
+ "date": "Thu, 15 Jan 2026 23:23:27 GMT",
6
+ "version": "1.5.15",
7
+ "tag": "@lage-run/scheduler_v1.5.15",
8
+ "comments": {
9
+ "patch": [
10
+ {
11
+ "author": "nemanjatesic@microsoft.com",
12
+ "package": "@lage-run/scheduler",
13
+ "commit": "3d7ac61faadf82097fb2996431b537b2a9baa0e3",
14
+ "comment": "Add lint rule for no-floating-promises and fix several places"
15
+ }
16
+ ]
17
+ }
18
+ },
4
19
  {
5
20
  "date": "Sat, 29 Mar 2025 02:16:38 GMT",
6
21
  "version": "1.5.3",
package/CHANGELOG.md CHANGED
@@ -1,9 +1,17 @@
1
1
  # Change Log - @lage-run/scheduler
2
2
 
3
- <!-- This log was last generated on Tue, 04 Feb 2025 18:31:49 GMT and should not be manually modified. -->
3
+ <!-- This log was last generated on Thu, 15 Jan 2026 23:23:27 GMT and should not be manually modified. -->
4
4
 
5
5
  <!-- Start content -->
6
6
 
7
+ ## 1.5.15
8
+
9
+ Thu, 15 Jan 2026 23:23:27 GMT
10
+
11
+ ### Patches
12
+
13
+ - Add lint rule for no-floating-promises and fix several places (nemanjatesic@microsoft.com)
14
+
7
15
  ## 1.5.1
8
16
 
9
17
  Tue, 04 Feb 2025 18:31:49 GMT
@@ -229,7 +229,7 @@ class WrappedTarget {
229
229
  threadId: worker.threadId
230
230
  });
231
231
  } else if (data.type === "hash") {
232
- this.options.hasher.hash(target).then((hash)=>{
232
+ void this.options.hasher.hash(target).then((hash)=>{
233
233
  worker.postMessage({
234
234
  type: "hash",
235
235
  hash
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/WrappedTarget.ts"],"sourcesContent":["import { bufferTransform } from \"./bufferTransform.js\";\nimport { getLageOutputCacheLocation } from \"./getLageOutputCacheLocation.js\";\nimport { type LogEntry, LogLevel } from \"@lage-run/logger\";\n\nimport fs from \"fs\";\nimport path from \"path\";\nimport { mkdir, writeFile } from \"fs/promises\";\n\nimport type { Pool } from \"@lage-run/worker-threads-pool\";\nimport type { TargetRun, TargetStatus } from \"@lage-run/scheduler-types\";\nimport { getStartTargetId, type Target } from \"@lage-run/target-graph\";\nimport type { Logger } from \"@lage-run/logger\";\nimport type { TargetHasher } from \"@lage-run/hasher\";\nimport type { MessagePort } from \"worker_threads\";\n\nexport interface WrappedTargetOptions {\n root: string;\n target: Target;\n logger: Logger;\n shouldCache: boolean;\n continueOnError: boolean;\n abortController: AbortController;\n pool: Pool;\n hasher: TargetHasher;\n onMessage?: (message: any, postMessage: MessagePort[\"postMessage\"]) => void;\n}\n\nexport interface WorkerResult {\n stdoutBuffer: string;\n stderrBuffer: string;\n skipped: boolean;\n hash: string;\n value: unknown;\n id: string;\n}\n\n/**\n * Wraps a target with additional functionality:\n * 1. Caching\n * 2. Logging\n * 3. Abort signal\n * 4. Continue on error\n */\nexport class WrappedTarget implements TargetRun<WorkerResult> {\n #status: TargetStatus = \"pending\";\n #result: WorkerResult | undefined;\n queueTime: [number, number] = [0, 0];\n startTime: [number, number] = [0, 0];\n duration: [number, number] = [0, 0];\n target: Target;\n threadId = 0;\n\n get result() {\n return this.#result;\n }\n\n get status() {\n return this.#status;\n }\n\n get abortController() {\n return this.options.abortController;\n }\n\n set abortController(abortController: AbortController) {\n this.options.abortController = abortController;\n }\n\n get successful() {\n return this.#status === \"skipped\" || this.#status === \"success\";\n }\n\n get waiting() {\n return this.#status === \"pending\" || this.#status === \"queued\";\n }\n\n constructor(public options: WrappedTargetOptions) {\n this.target = options.target;\n\n if (this.target.id === getStartTargetId()) {\n this.#status = \"success\";\n }\n\n this.options.logger.info(\"\", { target: this.target, status: this.status });\n }\n\n onQueued() {\n this.#status = \"queued\";\n this.queueTime = process.hrtime();\n this.options.logger.info(\"\", { target: this.target, status: \"queued\" });\n }\n\n onAbort() {\n this.#status = \"aborted\";\n this.options.logger.info(\"\", { target: this.target, status: \"aborted\", threadId: this.threadId });\n }\n\n onStart(threadId: number) {\n if (this.status !== \"running\") {\n this.threadId = threadId;\n this.#status = \"running\";\n this.startTime = process.hrtime();\n this.options.logger.info(\"\", { target: this.target, status: \"running\", threadId });\n }\n }\n\n onComplete() {\n this.#status = \"success\";\n this.options.logger.info(\"\", {\n target: this.target,\n status: \"success\",\n duration: this.duration,\n threadId: this.threadId,\n });\n }\n\n onFail() {\n this.#status = \"failed\";\n this.options.logger.info(\"\", {\n target: this.target,\n status: \"failed\",\n duration: this.duration,\n threadId: this.threadId,\n });\n\n if (!this.options.continueOnError && this.options.abortController) {\n this.options.abortController.abort();\n }\n }\n\n onSkipped(hash?: string | undefined) {\n this.#status = \"skipped\";\n\n if (hash) {\n this.options.logger.info(\"\", {\n target: this.target,\n status: \"skipped\",\n duration: this.duration,\n hash,\n threadId: this.threadId,\n });\n }\n }\n\n async run() {\n const { target, logger, shouldCache, abortController, root } = this.options;\n\n const abortSignal = abortController.signal;\n\n if (abortSignal.aborted) {\n this.onStart(0);\n this.onAbort();\n return;\n }\n\n try {\n this.#result = await this.runInPool();\n\n const cacheEnabled = target.cache && shouldCache && this.#result.hash;\n // Save output if cache is enabled & cache is hit\n if (!this.#result.skipped && cacheEnabled) {\n const outputLocation = getLageOutputCacheLocation(root, this.#result.hash);\n const outputPath = path.dirname(outputLocation);\n await mkdir(outputPath, { recursive: true });\n\n const output = `${this.#result.stdoutBuffer}\\n${this.#result.stderrBuffer}`;\n\n await writeFile(outputLocation, output);\n\n logger.verbose(`>> Saved cache - ${this.#result.hash}`, { target });\n }\n\n if (this.#result.skipped) {\n const { hash } = this.#result;\n\n const cachedOutputFile = getLageOutputCacheLocation(root, hash ?? \"\");\n\n const shouldShowCachedOutput = fs.existsSync(cachedOutputFile);\n if (shouldShowCachedOutput) {\n const cachedOutput = fs.readFileSync(cachedOutputFile, \"utf8\");\n logger.verbose(\">> Replaying cached output\", { target });\n logger.verbose(cachedOutput.trim(), { target });\n }\n\n this.onSkipped(hash);\n } else {\n this.onComplete();\n }\n\n return this.#result;\n } catch (e) {\n if (e instanceof Error) {\n logger.error(String(e), { target });\n }\n\n if (abortSignal.aborted) {\n this.onAbort();\n } else {\n this.onFail();\n }\n\n throw e;\n }\n }\n\n private async runInPool(): Promise<WorkerResult> {\n const { target, logger, abortController, pool } = this.options;\n const abortSignal = abortController.signal;\n\n let releaseStdout: any;\n let releaseStderr: any;\n\n const bufferStdout = bufferTransform();\n const bufferStderr = bufferTransform();\n\n let msgHandler: (data: LogEntry<any> & { type: string }) => void;\n\n const result = await (pool.exec(\n { target },\n target.weight ?? 1,\n (worker, stdout, stderr) => {\n const postMessage = worker.postMessage.bind(worker);\n\n msgHandler = (data) => {\n if (data.type === \"log\") {\n logger.log(data.level, data.msg, { target, threadId: worker.threadId });\n } else if (data.type === \"hash\") {\n this.options.hasher.hash(target).then((hash) => {\n worker.postMessage({ type: \"hash\", hash });\n });\n } else if (this.options.onMessage) {\n this.options.onMessage(data, postMessage);\n }\n };\n\n worker.on(\"message\", msgHandler);\n\n const threadId = worker.threadId;\n\n this.onStart(threadId);\n\n stdout.pipe(bufferStdout.transform);\n stderr.pipe(bufferStderr.transform);\n\n const releaseStdoutStream = logger.stream(LogLevel.verbose, stdout, { target, threadId });\n\n releaseStdout = () => {\n releaseStdoutStream();\n stdout.unpipe(bufferStdout.transform);\n };\n\n const releaseStderrStream = logger.stream(LogLevel.verbose, stderr, { target, threadId });\n\n releaseStderr = () => {\n releaseStderrStream();\n stderr.unpipe(bufferStderr.transform);\n };\n },\n (worker) => {\n worker.off(\"message\", msgHandler);\n this.duration = process.hrtime(this.startTime);\n releaseStdout();\n releaseStderr();\n },\n abortSignal,\n target.priority\n ) as Promise<{ value?: unknown; skipped: boolean; hash: string; id: string }>);\n\n return {\n stdoutBuffer: bufferStdout.buffer,\n stderrBuffer: bufferStderr.buffer,\n skipped: result?.skipped,\n hash: result?.hash,\n value: result?.value,\n id: result?.id,\n };\n }\n\n /**\n * A JSON representation of this wrapped target, suitable for serialization in tests.\n *\n * Skips the unpredictable properties of the wrapped target like the startTime and duration.\n *\n * @returns\n */\n toJSON() {\n return {\n target: this.target.id,\n status: this.status,\n };\n }\n\n /**\n * Reset the state of this wrapped target.\n */\n reset() {\n this.#result = undefined;\n this.#status = \"pending\";\n }\n}\n"],"names":["WrappedTarget","result","status","abortController","options","successful","waiting","onQueued","queueTime","process","hrtime","logger","info","target","onAbort","threadId","onStart","startTime","onComplete","duration","onFail","continueOnError","abort","onSkipped","hash","run","shouldCache","root","abortSignal","signal","aborted","runInPool","cacheEnabled","cache","skipped","outputLocation","getLageOutputCacheLocation","outputPath","path","dirname","mkdir","recursive","output","stdoutBuffer","stderrBuffer","writeFile","verbose","cachedOutputFile","shouldShowCachedOutput","fs","existsSync","cachedOutput","readFileSync","trim","e","Error","error","String","pool","releaseStdout","releaseStderr","bufferStdout","bufferTransform","bufferStderr","msgHandler","exec","weight","worker","stdout","stderr","postMessage","bind","data","type","log","level","msg","hasher","then","onMessage","on","pipe","transform","releaseStdoutStream","stream","LogLevel","unpipe","releaseStderrStream","off","priority","buffer","value","id","toJSON","reset","undefined","getStartTargetId"],"mappings":";;;;+BA2CaA;;;eAAAA;;;iCA3CmB;4CACW;wBACH;2DAEzB;6DACE;0BACgB;6BAIa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAkC5C,uCACA;AAFK,MAAMA;IASX,IAAIC,SAAS;QACX,gCAAO,IAAI,EAAC;IACd;IAEA,IAAIC,SAAS;QACX,gCAAO,IAAI,EAAC;IACd;IAEA,IAAIC,kBAAkB;QACpB,OAAO,IAAI,CAACC,OAAO,CAACD,eAAe;IACrC;IAEA,IAAIA,gBAAgBA,eAAgC,EAAE;QACpD,IAAI,CAACC,OAAO,CAACD,eAAe,GAAGA;IACjC;IAEA,IAAIE,aAAa;QACf,OAAO,yBAAA,IAAI,EAAC,aAAY,aAAa,yBAAA,IAAI,EAAC,aAAY;IACxD;IAEA,IAAIC,UAAU;QACZ,OAAO,yBAAA,IAAI,EAAC,aAAY,aAAa,yBAAA,IAAI,EAAC,aAAY;IACxD;IAYAC,WAAW;uCACJ,SAAU;QACf,IAAI,CAACC,SAAS,GAAGC,QAAQC,MAAM;QAC/B,IAAI,CAACN,OAAO,CAACO,MAAM,CAACC,IAAI,CAAC,IAAI;YAAEC,QAAQ,IAAI,CAACA,MAAM;YAAEX,QAAQ;QAAS;IACvE;IAEAY,UAAU;uCACH,SAAU;QACf,IAAI,CAACV,OAAO,CAACO,MAAM,CAACC,IAAI,CAAC,IAAI;YAAEC,QAAQ,IAAI,CAACA,MAAM;YAAEX,QAAQ;YAAWa,UAAU,IAAI,CAACA,QAAQ;QAAC;IACjG;IAEAC,QAAQD,QAAgB,EAAE;QACxB,IAAI,IAAI,CAACb,MAAM,KAAK,WAAW;YAC7B,IAAI,CAACa,QAAQ,GAAGA;2CACX,SAAU;YACf,IAAI,CAACE,SAAS,GAAGR,QAAQC,MAAM;YAC/B,IAAI,CAACN,OAAO,CAACO,MAAM,CAACC,IAAI,CAAC,IAAI;gBAAEC,QAAQ,IAAI,CAACA,MAAM;gBAAEX,QAAQ;gBAAWa;YAAS;QAClF;IACF;IAEAG,aAAa;uCACN,SAAU;QACf,IAAI,CAACd,OAAO,CAACO,MAAM,CAACC,IAAI,CAAC,IAAI;YAC3BC,QAAQ,IAAI,CAACA,MAAM;YACnBX,QAAQ;YACRiB,UAAU,IAAI,CAACA,QAAQ;YACvBJ,UAAU,IAAI,CAACA,QAAQ;QACzB;IACF;IAEAK,SAAS;uCACF,SAAU;QACf,IAAI,CAAChB,OAAO,CAACO,MAAM,CAACC,IAAI,CAAC,IAAI;YAC3BC,QAAQ,IAAI,CAACA,MAAM;YACnBX,QAAQ;YACRiB,UAAU,IAAI,CAACA,QAAQ;YACvBJ,UAAU,IAAI,CAACA,QAAQ;QACzB;QAEA,IAAI,CAAC,IAAI,CAACX,OAAO,CAACiB,eAAe,IAAI,IAAI,CAACjB,OAAO,CAACD,eAAe,EAAE;YACjE,IAAI,CAACC,OAAO,CAACD,eAAe,CAACmB,KAAK;QACpC;IACF;IAEAC,UAAUC,IAAyB,EAAE;uCAC9B,SAAU;QAEf,IAAIA,MAAM;YACR,IAAI,CAACpB,OAAO,CAACO,MAAM,CAACC,IAAI,CAAC,IAAI;gBAC3BC,QAAQ,IAAI,CAACA,MAAM;gBACnBX,QAAQ;gBACRiB,UAAU,IAAI,CAACA,QAAQ;gBACvBK;gBACAT,UAAU,IAAI,CAACA,QAAQ;YACzB;QACF;IACF;IAEA,MAAMU,MAAM;QACV,MAAM,EAAEZ,MAAM,EAAEF,MAAM,EAAEe,WAAW,EAAEvB,eAAe,EAAEwB,IAAI,EAAE,GAAG,IAAI,CAACvB,OAAO;QAE3E,MAAMwB,cAAczB,gBAAgB0B,MAAM;QAE1C,IAAID,YAAYE,OAAO,EAAE;YACvB,IAAI,CAACd,OAAO,CAAC;YACb,IAAI,CAACF,OAAO;YACZ;QACF;QAEA,IAAI;2CACG,SAAU,MAAM,IAAI,CAACiB,SAAS;YAEnC,MAAMC,eAAenB,OAAOoB,KAAK,IAAIP,eAAe,yBAAA,IAAI,EAAC,SAAQF,IAAI;YACrE,iDAAiD;YACjD,IAAI,CAAC,yBAAA,IAAI,EAAC,SAAQU,OAAO,IAAIF,cAAc;gBACzC,MAAMG,iBAAiBC,IAAAA,sDAA0B,EAACT,MAAM,yBAAA,IAAI,EAAC,SAAQH,IAAI;gBACzE,MAAMa,aAAaC,aAAI,CAACC,OAAO,CAACJ;gBAChC,MAAMK,IAAAA,eAAK,EAACH,YAAY;oBAAEI,WAAW;gBAAK;gBAE1C,MAAMC,SAAS,GAAG,yBAAA,IAAI,EAAC,SAAQC,YAAY,CAAC,EAAE,EAAE,yBAAA,IAAI,EAAC,SAAQC,YAAY,EAAE;gBAE3E,MAAMC,IAAAA,mBAAS,EAACV,gBAAgBO;gBAEhC/B,OAAOmC,OAAO,CAAC,CAAC,iBAAiB,EAAE,yBAAA,IAAI,EAAC,SAAQtB,IAAI,EAAE,EAAE;oBAAEX;gBAAO;YACnE;YAEA,IAAI,yBAAA,IAAI,EAAC,SAAQqB,OAAO,EAAE;gBACxB,MAAM,EAAEV,IAAI,EAAE,4BAAG,IAAI,EAAC;gBAEtB,MAAMuB,mBAAmBX,IAAAA,sDAA0B,EAACT,MAAMH,QAAQ;gBAElE,MAAMwB,yBAAyBC,WAAE,CAACC,UAAU,CAACH;gBAC7C,IAAIC,wBAAwB;oBAC1B,MAAMG,eAAeF,WAAE,CAACG,YAAY,CAACL,kBAAkB;oBACvDpC,OAAOmC,OAAO,CAAC,8BAA8B;wBAAEjC;oBAAO;oBACtDF,OAAOmC,OAAO,CAACK,aAAaE,IAAI,IAAI;wBAAExC;oBAAO;gBAC/C;gBAEA,IAAI,CAACU,SAAS,CAACC;YACjB,OAAO;gBACL,IAAI,CAACN,UAAU;YACjB;YAEA,gCAAO,IAAI,EAAC;QACd,EAAE,OAAOoC,GAAG;YACV,IAAIA,aAAaC,OAAO;gBACtB5C,OAAO6C,KAAK,CAACC,OAAOH,IAAI;oBAAEzC;gBAAO;YACnC;YAEA,IAAIe,YAAYE,OAAO,EAAE;gBACvB,IAAI,CAAChB,OAAO;YACd,OAAO;gBACL,IAAI,CAACM,MAAM;YACb;YAEA,MAAMkC;QACR;IACF;IAEA,MAAcvB,YAAmC;QAC/C,MAAM,EAAElB,MAAM,EAAEF,MAAM,EAAER,eAAe,EAAEuD,IAAI,EAAE,GAAG,IAAI,CAACtD,OAAO;QAC9D,MAAMwB,cAAczB,gBAAgB0B,MAAM;QAE1C,IAAI8B;QACJ,IAAIC;QAEJ,MAAMC,eAAeC,IAAAA,gCAAe;QACpC,MAAMC,eAAeD,IAAAA,gCAAe;QAEpC,IAAIE;QAEJ,MAAM/D,SAAS,MAAOyD,KAAKO,IAAI,CAC7B;YAAEpD;QAAO,GACTA,OAAOqD,MAAM,IAAI,GACjB,CAACC,QAAQC,QAAQC;YACf,MAAMC,cAAcH,OAAOG,WAAW,CAACC,IAAI,CAACJ;YAE5CH,aAAa,CAACQ;gBACZ,IAAIA,KAAKC,IAAI,KAAK,OAAO;oBACvB9D,OAAO+D,GAAG,CAACF,KAAKG,KAAK,EAAEH,KAAKI,GAAG,EAAE;wBAAE/D;wBAAQE,UAAUoD,OAAOpD,QAAQ;oBAAC;gBACvE,OAAO,IAAIyD,KAAKC,IAAI,KAAK,QAAQ;oBAC/B,IAAI,CAACrE,OAAO,CAACyE,MAAM,CAACrD,IAAI,CAACX,QAAQiE,IAAI,CAAC,CAACtD;wBACrC2C,OAAOG,WAAW,CAAC;4BAAEG,MAAM;4BAAQjD;wBAAK;oBAC1C;gBACF,OAAO,IAAI,IAAI,CAACpB,OAAO,CAAC2E,SAAS,EAAE;oBACjC,IAAI,CAAC3E,OAAO,CAAC2E,SAAS,CAACP,MAAMF;gBAC/B;YACF;YAEAH,OAAOa,EAAE,CAAC,WAAWhB;YAErB,MAAMjD,WAAWoD,OAAOpD,QAAQ;YAEhC,IAAI,CAACC,OAAO,CAACD;YAEbqD,OAAOa,IAAI,CAACpB,aAAaqB,SAAS;YAClCb,OAAOY,IAAI,CAAClB,aAAamB,SAAS;YAElC,MAAMC,sBAAsBxE,OAAOyE,MAAM,CAACC,gBAAQ,CAACvC,OAAO,EAAEsB,QAAQ;gBAAEvD;gBAAQE;YAAS;YAEvF4C,gBAAgB;gBACdwB;gBACAf,OAAOkB,MAAM,CAACzB,aAAaqB,SAAS;YACtC;YAEA,MAAMK,sBAAsB5E,OAAOyE,MAAM,CAACC,gBAAQ,CAACvC,OAAO,EAAEuB,QAAQ;gBAAExD;gBAAQE;YAAS;YAEvF6C,gBAAgB;gBACd2B;gBACAlB,OAAOiB,MAAM,CAACvB,aAAamB,SAAS;YACtC;QACF,GACA,CAACf;YACCA,OAAOqB,GAAG,CAAC,WAAWxB;YACtB,IAAI,CAAC7C,QAAQ,GAAGV,QAAQC,MAAM,CAAC,IAAI,CAACO,SAAS;YAC7C0C;YACAC;QACF,GACAhC,aACAf,OAAO4E,QAAQ;QAGjB,OAAO;YACL9C,cAAckB,aAAa6B,MAAM;YACjC9C,cAAcmB,aAAa2B,MAAM;YACjCxD,SAASjC,QAAQiC;YACjBV,MAAMvB,QAAQuB;YACdmE,OAAO1F,QAAQ0F;YACfC,IAAI3F,QAAQ2F;QACd;IACF;IAEA;;;;;;GAMC,GACDC,SAAS;QACP,OAAO;YACLhF,QAAQ,IAAI,CAACA,MAAM,CAAC+E,EAAE;YACtB1F,QAAQ,IAAI,CAACA,MAAM;QACrB;IACF;IAEA;;GAEC,GACD4F,QAAQ;uCACD,SAAUC;uCACV,SAAU;IACjB;IA9NA,YAAY,AAAO3F,OAA6B,CAAE;;QAhClD,gCAAA;;mBAAA,KAAA;;QACA,gCAAA;;mBAAA,KAAA;;QACAI,uBAAAA,aAAAA,KAAAA;QACAS,uBAAAA,aAAAA,KAAAA;QACAE,uBAAAA,YAAAA,KAAAA;QACAN,uBAAAA,UAAAA,KAAAA;QACAE,uBAAAA,YAAAA,KAAAA;aA0BmBX,UAAAA;uCAhCnB,SAAwB;aAExBI,YAA8B;YAAC;YAAG;SAAE;aACpCS,YAA8B;YAAC;YAAG;SAAE;aACpCE,WAA6B;YAAC;YAAG;SAAE;aAEnCJ,WAAW;QA2BT,IAAI,CAACF,MAAM,GAAGT,QAAQS,MAAM;QAE5B,IAAI,IAAI,CAACA,MAAM,CAAC+E,EAAE,KAAKI,IAAAA,6BAAgB,KAAI;2CACpC,SAAU;QACjB;QAEA,IAAI,CAAC5F,OAAO,CAACO,MAAM,CAACC,IAAI,CAAC,IAAI;YAAEC,QAAQ,IAAI,CAACA,MAAM;YAAEX,QAAQ,IAAI,CAACA,MAAM;QAAC;IAC1E;AAuNF"}
1
+ {"version":3,"sources":["../src/WrappedTarget.ts"],"sourcesContent":["import { bufferTransform } from \"./bufferTransform.js\";\nimport { getLageOutputCacheLocation } from \"./getLageOutputCacheLocation.js\";\nimport { type LogEntry, LogLevel } from \"@lage-run/logger\";\n\nimport fs from \"fs\";\nimport path from \"path\";\nimport { mkdir, writeFile } from \"fs/promises\";\n\nimport type { Pool } from \"@lage-run/worker-threads-pool\";\nimport type { TargetRun, TargetStatus } from \"@lage-run/scheduler-types\";\nimport { getStartTargetId, type Target } from \"@lage-run/target-graph\";\nimport type { Logger } from \"@lage-run/logger\";\nimport type { TargetHasher } from \"@lage-run/hasher\";\nimport type { MessagePort } from \"worker_threads\";\n\nexport interface WrappedTargetOptions {\n root: string;\n target: Target;\n logger: Logger;\n shouldCache: boolean;\n continueOnError: boolean;\n abortController: AbortController;\n pool: Pool;\n hasher: TargetHasher;\n onMessage?: (message: any, postMessage: MessagePort[\"postMessage\"]) => void;\n}\n\nexport interface WorkerResult {\n stdoutBuffer: string;\n stderrBuffer: string;\n skipped: boolean;\n hash: string;\n value: unknown;\n id: string;\n}\n\n/**\n * Wraps a target with additional functionality:\n * 1. Caching\n * 2. Logging\n * 3. Abort signal\n * 4. Continue on error\n */\nexport class WrappedTarget implements TargetRun<WorkerResult> {\n #status: TargetStatus = \"pending\";\n #result: WorkerResult | undefined;\n queueTime: [number, number] = [0, 0];\n startTime: [number, number] = [0, 0];\n duration: [number, number] = [0, 0];\n target: Target;\n threadId = 0;\n\n get result() {\n return this.#result;\n }\n\n get status() {\n return this.#status;\n }\n\n get abortController() {\n return this.options.abortController;\n }\n\n set abortController(abortController: AbortController) {\n this.options.abortController = abortController;\n }\n\n get successful() {\n return this.#status === \"skipped\" || this.#status === \"success\";\n }\n\n get waiting() {\n return this.#status === \"pending\" || this.#status === \"queued\";\n }\n\n constructor(public options: WrappedTargetOptions) {\n this.target = options.target;\n\n if (this.target.id === getStartTargetId()) {\n this.#status = \"success\";\n }\n\n this.options.logger.info(\"\", { target: this.target, status: this.status });\n }\n\n onQueued() {\n this.#status = \"queued\";\n this.queueTime = process.hrtime();\n this.options.logger.info(\"\", { target: this.target, status: \"queued\" });\n }\n\n onAbort() {\n this.#status = \"aborted\";\n this.options.logger.info(\"\", { target: this.target, status: \"aborted\", threadId: this.threadId });\n }\n\n onStart(threadId: number) {\n if (this.status !== \"running\") {\n this.threadId = threadId;\n this.#status = \"running\";\n this.startTime = process.hrtime();\n this.options.logger.info(\"\", { target: this.target, status: \"running\", threadId });\n }\n }\n\n onComplete() {\n this.#status = \"success\";\n this.options.logger.info(\"\", {\n target: this.target,\n status: \"success\",\n duration: this.duration,\n threadId: this.threadId,\n });\n }\n\n onFail() {\n this.#status = \"failed\";\n this.options.logger.info(\"\", {\n target: this.target,\n status: \"failed\",\n duration: this.duration,\n threadId: this.threadId,\n });\n\n if (!this.options.continueOnError && this.options.abortController) {\n this.options.abortController.abort();\n }\n }\n\n onSkipped(hash?: string | undefined) {\n this.#status = \"skipped\";\n\n if (hash) {\n this.options.logger.info(\"\", {\n target: this.target,\n status: \"skipped\",\n duration: this.duration,\n hash,\n threadId: this.threadId,\n });\n }\n }\n\n async run() {\n const { target, logger, shouldCache, abortController, root } = this.options;\n\n const abortSignal = abortController.signal;\n\n if (abortSignal.aborted) {\n this.onStart(0);\n this.onAbort();\n return;\n }\n\n try {\n this.#result = await this.runInPool();\n\n const cacheEnabled = target.cache && shouldCache && this.#result.hash;\n // Save output if cache is enabled & cache is hit\n if (!this.#result.skipped && cacheEnabled) {\n const outputLocation = getLageOutputCacheLocation(root, this.#result.hash);\n const outputPath = path.dirname(outputLocation);\n await mkdir(outputPath, { recursive: true });\n\n const output = `${this.#result.stdoutBuffer}\\n${this.#result.stderrBuffer}`;\n\n await writeFile(outputLocation, output);\n\n logger.verbose(`>> Saved cache - ${this.#result.hash}`, { target });\n }\n\n if (this.#result.skipped) {\n const { hash } = this.#result;\n\n const cachedOutputFile = getLageOutputCacheLocation(root, hash ?? \"\");\n\n const shouldShowCachedOutput = fs.existsSync(cachedOutputFile);\n if (shouldShowCachedOutput) {\n const cachedOutput = fs.readFileSync(cachedOutputFile, \"utf8\");\n logger.verbose(\">> Replaying cached output\", { target });\n logger.verbose(cachedOutput.trim(), { target });\n }\n\n this.onSkipped(hash);\n } else {\n this.onComplete();\n }\n\n return this.#result;\n } catch (e) {\n if (e instanceof Error) {\n logger.error(String(e), { target });\n }\n\n if (abortSignal.aborted) {\n this.onAbort();\n } else {\n this.onFail();\n }\n\n throw e;\n }\n }\n\n private async runInPool(): Promise<WorkerResult> {\n const { target, logger, abortController, pool } = this.options;\n const abortSignal = abortController.signal;\n\n let releaseStdout: any;\n let releaseStderr: any;\n\n const bufferStdout = bufferTransform();\n const bufferStderr = bufferTransform();\n\n let msgHandler: (data: LogEntry<any> & { type: string }) => void;\n\n const result = await (pool.exec(\n { target },\n target.weight ?? 1,\n (worker, stdout, stderr) => {\n const postMessage = worker.postMessage.bind(worker);\n\n msgHandler = (data) => {\n if (data.type === \"log\") {\n logger.log(data.level, data.msg, { target, threadId: worker.threadId });\n } else if (data.type === \"hash\") {\n void this.options.hasher.hash(target).then((hash) => {\n worker.postMessage({ type: \"hash\", hash });\n });\n } else if (this.options.onMessage) {\n this.options.onMessage(data, postMessage);\n }\n };\n\n worker.on(\"message\", msgHandler);\n\n const threadId = worker.threadId;\n\n this.onStart(threadId);\n\n stdout.pipe(bufferStdout.transform);\n stderr.pipe(bufferStderr.transform);\n\n const releaseStdoutStream = logger.stream(LogLevel.verbose, stdout, { target, threadId });\n\n releaseStdout = () => {\n releaseStdoutStream();\n stdout.unpipe(bufferStdout.transform);\n };\n\n const releaseStderrStream = logger.stream(LogLevel.verbose, stderr, { target, threadId });\n\n releaseStderr = () => {\n releaseStderrStream();\n stderr.unpipe(bufferStderr.transform);\n };\n },\n (worker) => {\n worker.off(\"message\", msgHandler);\n this.duration = process.hrtime(this.startTime);\n releaseStdout();\n releaseStderr();\n },\n abortSignal,\n target.priority\n ) as Promise<{ value?: unknown; skipped: boolean; hash: string; id: string }>);\n\n return {\n stdoutBuffer: bufferStdout.buffer,\n stderrBuffer: bufferStderr.buffer,\n skipped: result?.skipped,\n hash: result?.hash,\n value: result?.value,\n id: result?.id,\n };\n }\n\n /**\n * A JSON representation of this wrapped target, suitable for serialization in tests.\n *\n * Skips the unpredictable properties of the wrapped target like the startTime and duration.\n *\n * @returns\n */\n toJSON() {\n return {\n target: this.target.id,\n status: this.status,\n };\n }\n\n /**\n * Reset the state of this wrapped target.\n */\n reset() {\n this.#result = undefined;\n this.#status = \"pending\";\n }\n}\n"],"names":["WrappedTarget","result","status","abortController","options","successful","waiting","onQueued","queueTime","process","hrtime","logger","info","target","onAbort","threadId","onStart","startTime","onComplete","duration","onFail","continueOnError","abort","onSkipped","hash","run","shouldCache","root","abortSignal","signal","aborted","runInPool","cacheEnabled","cache","skipped","outputLocation","getLageOutputCacheLocation","outputPath","path","dirname","mkdir","recursive","output","stdoutBuffer","stderrBuffer","writeFile","verbose","cachedOutputFile","shouldShowCachedOutput","fs","existsSync","cachedOutput","readFileSync","trim","e","Error","error","String","pool","releaseStdout","releaseStderr","bufferStdout","bufferTransform","bufferStderr","msgHandler","exec","weight","worker","stdout","stderr","postMessage","bind","data","type","log","level","msg","hasher","then","onMessage","on","pipe","transform","releaseStdoutStream","stream","LogLevel","unpipe","releaseStderrStream","off","priority","buffer","value","id","toJSON","reset","undefined","getStartTargetId"],"mappings":"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"}
@@ -38,7 +38,7 @@ async function setup(options) {
38
38
  cacheProvider
39
39
  };
40
40
  }
41
- (async ()=>{
41
+ void (async ()=>{
42
42
  const { cacheProvider, runnerPicker, options } = await setup(_worker_threads.workerData);
43
43
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
44
44
  let hashPromiseResolve = (_hash)=>{};
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/workers/targetWorker.ts"],"sourcesContent":["import { createCache } from \"../cache/createCacheProvider.js\";\nimport { registerWorker } from \"@lage-run/worker-threads-pool\";\nimport { TargetRunnerPicker } from \"@lage-run/runners\";\nimport { parentPort, workerData } from \"worker_threads\";\nimport createLogger from \"@lage-run/logger\";\n\nimport type { CacheOptions } from \"@lage-run/config\";\nimport type { Target } from \"@lage-run/target-graph\";\nimport type { TargetRunnerPickerOptions } from \"@lage-run/runners\";\n\ninterface TargetWorkerDataOptions {\n runners: TargetRunnerPickerOptions;\n skipLocalCache: boolean;\n shouldCache: boolean;\n shouldResetCache: boolean;\n taskArgs: string[];\n root: string;\n cacheOptions?: CacheOptions;\n}\n\nasync function setup(options: TargetWorkerDataOptions) {\n const { runners, root, cacheOptions } = options;\n\n const logger = createLogger();\n logger.addReporter({\n log(entry) {\n parentPort!.postMessage({ type: \"log\", ...entry });\n },\n summarize() {},\n });\n\n const { cacheProvider } = await createCache({\n root,\n logger,\n cacheOptions,\n cliArgs: options.taskArgs,\n skipLocalCache: options.skipLocalCache,\n });\n\n const runnerPicker = new TargetRunnerPicker(runners);\n\n return {\n options,\n runnerPicker,\n cacheProvider,\n };\n}\n\n(async () => {\n const { cacheProvider, runnerPicker, options } = await setup(workerData);\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n let hashPromiseResolve = (_hash: string) => {};\n\n // main thread sends hash to worker because it keeps a global memory cache of the hashes\n parentPort!.on(\"message\", (data: any) => {\n if (data.type === \"hash\") {\n hashPromiseResolve(data.hash);\n }\n });\n\n async function getCache(target: Target) {\n const { shouldCache, shouldResetCache } = options;\n let hash: string | undefined = undefined;\n let cacheHit = false;\n\n if (!shouldCache || !target.cache || !cacheProvider) {\n return { hash, cacheHit };\n }\n\n // using a special pattern in communicating with the main thread to get the hash for the target\n hash = await new Promise((resolve) => {\n hashPromiseResolve = resolve;\n parentPort!.postMessage({ type: \"hash\" });\n });\n\n if (hash && !shouldResetCache) {\n cacheHit = await cacheProvider.fetch(hash, target);\n }\n\n return { hash, cacheHit };\n }\n\n async function saveCache(target: Target, hash: string | undefined) {\n if (!hash || !cacheProvider) {\n return;\n }\n await cacheProvider.put(hash, target);\n }\n\n async function run(data: any, abortSignal?: AbortSignal) {\n const { hash, cacheHit } = await getCache(data.target);\n\n const cacheEnabled = data.target.cache && options.shouldCache && hash;\n\n let value: unknown = undefined;\n if (!cacheHit || !cacheEnabled) {\n const runner = await runnerPicker.pick(data.target);\n value = await runner.run({\n ...data,\n abortSignal,\n });\n\n await saveCache(data.target, hash);\n }\n\n return {\n skipped: cacheHit,\n id: data.target.id,\n hash,\n value,\n };\n }\n\n registerWorker(run);\n})();\n"],"names":["setup","options","runners","root","cacheOptions","logger","createLogger","addReporter","log","entry","parentPort","postMessage","type","summarize","cacheProvider","createCache","cliArgs","taskArgs","skipLocalCache","runnerPicker","TargetRunnerPicker","workerData","hashPromiseResolve","_hash","on","data","hash","getCache","target","shouldCache","shouldResetCache","undefined","cacheHit","cache","Promise","resolve","fetch","saveCache","put","run","abortSignal","cacheEnabled","value","runner","pick","skipped","id","registerWorker"],"mappings":";;;;qCAA4B;mCACG;yBACI;gCACI;+DACd;;;;;;AAgBzB,eAAeA,MAAMC,OAAgC;IACnD,MAAM,EAAEC,OAAO,EAAEC,IAAI,EAAEC,YAAY,EAAE,GAAGH;IAExC,MAAMI,SAASC,IAAAA,eAAY;IAC3BD,OAAOE,WAAW,CAAC;QACjBC,KAAIC,KAAK;YACPC,0BAAU,CAAEC,WAAW,CAAC;gBAAEC,MAAM;gBAAO,GAAGH,KAAK;YAAC;QAClD;QACAI,cAAa;IACf;IAEA,MAAM,EAAEC,aAAa,EAAE,GAAG,MAAMC,IAAAA,gCAAW,EAAC;QAC1CZ;QACAE;QACAD;QACAY,SAASf,QAAQgB,QAAQ;QACzBC,gBAAgBjB,QAAQiB,cAAc;IACxC;IAEA,MAAMC,eAAe,IAAIC,2BAAkB,CAAClB;IAE5C,OAAO;QACLD;QACAkB;QACAL;IACF;AACF;AAEC,CAAA;IACC,MAAM,EAAEA,aAAa,EAAEK,YAAY,EAAElB,OAAO,EAAE,GAAG,MAAMD,MAAMqB,0BAAU;IAEvE,6DAA6D;IAC7D,IAAIC,qBAAqB,CAACC,SAAmB;IAE7C,wFAAwF;IACxFb,0BAAU,CAAEc,EAAE,CAAC,WAAW,CAACC;QACzB,IAAIA,KAAKb,IAAI,KAAK,QAAQ;YACxBU,mBAAmBG,KAAKC,IAAI;QAC9B;IACF;IAEA,eAAeC,SAASC,MAAc;QACpC,MAAM,EAAEC,WAAW,EAAEC,gBAAgB,EAAE,GAAG7B;QAC1C,IAAIyB,OAA2BK;QAC/B,IAAIC,WAAW;QAEf,IAAI,CAACH,eAAe,CAACD,OAAOK,KAAK,IAAI,CAACnB,eAAe;YACnD,OAAO;gBAAEY;gBAAMM;YAAS;QAC1B;QAEA,+FAA+F;QAC/FN,OAAO,MAAM,IAAIQ,QAAQ,CAACC;YACxBb,qBAAqBa;YACrBzB,0BAAU,CAAEC,WAAW,CAAC;gBAAEC,MAAM;YAAO;QACzC;QAEA,IAAIc,QAAQ,CAACI,kBAAkB;YAC7BE,WAAW,MAAMlB,cAAcsB,KAAK,CAACV,MAAME;QAC7C;QAEA,OAAO;YAAEF;YAAMM;QAAS;IAC1B;IAEA,eAAeK,UAAUT,MAAc,EAAEF,IAAwB;QAC/D,IAAI,CAACA,QAAQ,CAACZ,eAAe;YAC3B;QACF;QACA,MAAMA,cAAcwB,GAAG,CAACZ,MAAME;IAChC;IAEA,eAAeW,IAAId,IAAS,EAAEe,WAAyB;QACrD,MAAM,EAAEd,IAAI,EAAEM,QAAQ,EAAE,GAAG,MAAML,SAASF,KAAKG,MAAM;QAErD,MAAMa,eAAehB,KAAKG,MAAM,CAACK,KAAK,IAAIhC,QAAQ4B,WAAW,IAAIH;QAEjE,IAAIgB,QAAiBX;QACrB,IAAI,CAACC,YAAY,CAACS,cAAc;YAC9B,MAAME,SAAS,MAAMxB,aAAayB,IAAI,CAACnB,KAAKG,MAAM;YAClDc,QAAQ,MAAMC,OAAOJ,GAAG,CAAC;gBACvB,GAAGd,IAAI;gBACPe;YACF;YAEA,MAAMH,UAAUZ,KAAKG,MAAM,EAAEF;QAC/B;QAEA,OAAO;YACLmB,SAASb;YACTc,IAAIrB,KAAKG,MAAM,CAACkB,EAAE;YAClBpB;YACAgB;QACF;IACF;IAEAK,IAAAA,iCAAc,EAACR;AACjB,CAAA"}
1
+ {"version":3,"sources":["../../src/workers/targetWorker.ts"],"sourcesContent":["import { createCache } from \"../cache/createCacheProvider.js\";\nimport { registerWorker } from \"@lage-run/worker-threads-pool\";\nimport { TargetRunnerPicker } from \"@lage-run/runners\";\nimport { parentPort, workerData } from \"worker_threads\";\nimport createLogger from \"@lage-run/logger\";\n\nimport type { CacheOptions } from \"@lage-run/config\";\nimport type { Target } from \"@lage-run/target-graph\";\nimport type { TargetRunnerPickerOptions } from \"@lage-run/runners\";\n\ninterface TargetWorkerDataOptions {\n runners: TargetRunnerPickerOptions;\n skipLocalCache: boolean;\n shouldCache: boolean;\n shouldResetCache: boolean;\n taskArgs: string[];\n root: string;\n cacheOptions?: CacheOptions;\n}\n\nasync function setup(options: TargetWorkerDataOptions) {\n const { runners, root, cacheOptions } = options;\n\n const logger = createLogger();\n logger.addReporter({\n log(entry) {\n parentPort!.postMessage({ type: \"log\", ...entry });\n },\n summarize() {},\n });\n\n const { cacheProvider } = await createCache({\n root,\n logger,\n cacheOptions,\n cliArgs: options.taskArgs,\n skipLocalCache: options.skipLocalCache,\n });\n\n const runnerPicker = new TargetRunnerPicker(runners);\n\n return {\n options,\n runnerPicker,\n cacheProvider,\n };\n}\n\nvoid (async () => {\n const { cacheProvider, runnerPicker, options } = await setup(workerData);\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n let hashPromiseResolve = (_hash: string) => {};\n\n // main thread sends hash to worker because it keeps a global memory cache of the hashes\n parentPort!.on(\"message\", (data: any) => {\n if (data.type === \"hash\") {\n hashPromiseResolve(data.hash);\n }\n });\n\n async function getCache(target: Target) {\n const { shouldCache, shouldResetCache } = options;\n let hash: string | undefined = undefined;\n let cacheHit = false;\n\n if (!shouldCache || !target.cache || !cacheProvider) {\n return { hash, cacheHit };\n }\n\n // using a special pattern in communicating with the main thread to get the hash for the target\n hash = await new Promise((resolve) => {\n hashPromiseResolve = resolve;\n parentPort!.postMessage({ type: \"hash\" });\n });\n\n if (hash && !shouldResetCache) {\n cacheHit = await cacheProvider.fetch(hash, target);\n }\n\n return { hash, cacheHit };\n }\n\n async function saveCache(target: Target, hash: string | undefined) {\n if (!hash || !cacheProvider) {\n return;\n }\n await cacheProvider.put(hash, target);\n }\n\n async function run(data: any, abortSignal?: AbortSignal) {\n const { hash, cacheHit } = await getCache(data.target);\n\n const cacheEnabled = data.target.cache && options.shouldCache && hash;\n\n let value: unknown = undefined;\n if (!cacheHit || !cacheEnabled) {\n const runner = await runnerPicker.pick(data.target);\n value = await runner.run({\n ...data,\n abortSignal,\n });\n\n await saveCache(data.target, hash);\n }\n\n return {\n skipped: cacheHit,\n id: data.target.id,\n hash,\n value,\n };\n }\n\n registerWorker(run);\n})();\n"],"names":["setup","options","runners","root","cacheOptions","logger","createLogger","addReporter","log","entry","parentPort","postMessage","type","summarize","cacheProvider","createCache","cliArgs","taskArgs","skipLocalCache","runnerPicker","TargetRunnerPicker","workerData","hashPromiseResolve","_hash","on","data","hash","getCache","target","shouldCache","shouldResetCache","undefined","cacheHit","cache","Promise","resolve","fetch","saveCache","put","run","abortSignal","cacheEnabled","value","runner","pick","skipped","id","registerWorker"],"mappings":";;;;qCAA4B;mCACG;yBACI;gCACI;+DACd;;;;;;AAgBzB,eAAeA,MAAMC,OAAgC;IACnD,MAAM,EAAEC,OAAO,EAAEC,IAAI,EAAEC,YAAY,EAAE,GAAGH;IAExC,MAAMI,SAASC,IAAAA,eAAY;IAC3BD,OAAOE,WAAW,CAAC;QACjBC,KAAIC,KAAK;YACPC,0BAAU,CAAEC,WAAW,CAAC;gBAAEC,MAAM;gBAAO,GAAGH,KAAK;YAAC;QAClD;QACAI,cAAa;IACf;IAEA,MAAM,EAAEC,aAAa,EAAE,GAAG,MAAMC,IAAAA,gCAAW,EAAC;QAC1CZ;QACAE;QACAD;QACAY,SAASf,QAAQgB,QAAQ;QACzBC,gBAAgBjB,QAAQiB,cAAc;IACxC;IAEA,MAAMC,eAAe,IAAIC,2BAAkB,CAAClB;IAE5C,OAAO;QACLD;QACAkB;QACAL;IACF;AACF;AAEA,KAAK,AAAC,CAAA;IACJ,MAAM,EAAEA,aAAa,EAAEK,YAAY,EAAElB,OAAO,EAAE,GAAG,MAAMD,MAAMqB,0BAAU;IAEvE,6DAA6D;IAC7D,IAAIC,qBAAqB,CAACC,SAAmB;IAE7C,wFAAwF;IACxFb,0BAAU,CAAEc,EAAE,CAAC,WAAW,CAACC;QACzB,IAAIA,KAAKb,IAAI,KAAK,QAAQ;YACxBU,mBAAmBG,KAAKC,IAAI;QAC9B;IACF;IAEA,eAAeC,SAASC,MAAc;QACpC,MAAM,EAAEC,WAAW,EAAEC,gBAAgB,EAAE,GAAG7B;QAC1C,IAAIyB,OAA2BK;QAC/B,IAAIC,WAAW;QAEf,IAAI,CAACH,eAAe,CAACD,OAAOK,KAAK,IAAI,CAACnB,eAAe;YACnD,OAAO;gBAAEY;gBAAMM;YAAS;QAC1B;QAEA,+FAA+F;QAC/FN,OAAO,MAAM,IAAIQ,QAAQ,CAACC;YACxBb,qBAAqBa;YACrBzB,0BAAU,CAAEC,WAAW,CAAC;gBAAEC,MAAM;YAAO;QACzC;QAEA,IAAIc,QAAQ,CAACI,kBAAkB;YAC7BE,WAAW,MAAMlB,cAAcsB,KAAK,CAACV,MAAME;QAC7C;QAEA,OAAO;YAAEF;YAAMM;QAAS;IAC1B;IAEA,eAAeK,UAAUT,MAAc,EAAEF,IAAwB;QAC/D,IAAI,CAACA,QAAQ,CAACZ,eAAe;YAC3B;QACF;QACA,MAAMA,cAAcwB,GAAG,CAACZ,MAAME;IAChC;IAEA,eAAeW,IAAId,IAAS,EAAEe,WAAyB;QACrD,MAAM,EAAEd,IAAI,EAAEM,QAAQ,EAAE,GAAG,MAAML,SAASF,KAAKG,MAAM;QAErD,MAAMa,eAAehB,KAAKG,MAAM,CAACK,KAAK,IAAIhC,QAAQ4B,WAAW,IAAIH;QAEjE,IAAIgB,QAAiBX;QACrB,IAAI,CAACC,YAAY,CAACS,cAAc;YAC9B,MAAME,SAAS,MAAMxB,aAAayB,IAAI,CAACnB,KAAKG,MAAM;YAClDc,QAAQ,MAAMC,OAAOJ,GAAG,CAAC;gBACvB,GAAGd,IAAI;gBACPe;YACF;YAEA,MAAMH,UAAUZ,KAAKG,MAAM,EAAEF;QAC/B;QAEA,OAAO;YACLmB,SAASb;YACTc,IAAIrB,KAAKG,MAAM,CAACkB,EAAE;YAClBpB;YACAgB;QACF;IACF;IAEAK,IAAAA,iCAAc,EAACR;AACjB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lage-run/scheduler",
3
- "version": "1.5.13",
3
+ "version": "1.5.15",
4
4
  "description": "Scheduler for Lage",
5
5
  "repository": {
6
6
  "type": "git",
@@ -17,17 +17,17 @@
17
17
  "lint": "monorepo-scripts lint"
18
18
  },
19
19
  "dependencies": {
20
- "@lage-run/cache": "^1.4.1",
21
- "@lage-run/config": "^0.6.0",
22
- "@lage-run/hasher": "^1.9.0",
20
+ "@lage-run/cache": "^1.4.3",
21
+ "@lage-run/config": "^0.7.1",
22
+ "@lage-run/hasher": "^1.9.1",
23
23
  "@lage-run/logger": "^1.3.1",
24
- "@lage-run/runners": "^1.2.4",
25
- "@lage-run/target-graph": "^0.12.0",
26
- "@lage-run/worker-threads-pool": "^0.9.0"
24
+ "@lage-run/runners": "^1.2.5",
25
+ "@lage-run/target-graph": "^0.12.1",
26
+ "@lage-run/worker-threads-pool": "^0.9.1"
27
27
  },
28
28
  "devDependencies": {
29
29
  "@lage-run/monorepo-scripts": "^1.0.0",
30
- "@lage-run/scheduler-types": "^0.3.26"
30
+ "@lage-run/scheduler-types": "^0.3.27"
31
31
  },
32
32
  "publishConfig": {
33
33
  "access": "public"