lage 1.5.1 → 1.6.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 (107) hide show
  1. package/CHANGELOG.json +67 -1
  2. package/CHANGELOG.md +26 -2
  3. package/README.md +1 -1
  4. package/jest.config.js +0 -5
  5. package/lib/cache/backfill.js +5 -1
  6. package/lib/cache/backfill.js.map +1 -1
  7. package/lib/cache/salt.js +5 -1
  8. package/lib/cache/salt.js.map +1 -1
  9. package/lib/task/getPipelinePackages.js +5 -1
  10. package/lib/task/getPipelinePackages.js.map +1 -1
  11. package/package.json +6 -11
  12. package/src/args.ts +107 -0
  13. package/src/cache/RemoteFallbackCacheProvider.ts +100 -0
  14. package/src/cache/backfill.ts +93 -0
  15. package/src/cache/cacheConfig.ts +33 -0
  16. package/src/cache/cacheTasks.ts +9 -0
  17. package/src/cache/salt.ts +52 -0
  18. package/src/cli.ts +47 -0
  19. package/src/command/cache.ts +81 -0
  20. package/src/command/info.ts +108 -0
  21. package/src/command/init.ts +129 -0
  22. package/src/command/run.ts +70 -0
  23. package/src/command/version.ts +8 -0
  24. package/src/command/worker.ts +148 -0
  25. package/src/config/getConfig.ts +86 -0
  26. package/src/context.ts +43 -0
  27. package/src/displayReportAndExit.ts +17 -0
  28. package/src/index.ts +1 -0
  29. package/src/logger/LogEntry.ts +40 -0
  30. package/src/logger/LogLevel.ts +7 -0
  31. package/src/logger/Logger.ts +47 -0
  32. package/src/logger/TaskLogWritable.ts +35 -0
  33. package/src/logger/TaskLogger.ts +34 -0
  34. package/src/logger/index.ts +3 -0
  35. package/src/logger/initReporters.ts +35 -0
  36. package/src/logger/reporters/AdoReporter.ts +41 -0
  37. package/src/logger/reporters/DgmlReporter.ts +66 -0
  38. package/src/logger/reporters/JsonReporter.ts +39 -0
  39. package/src/logger/reporters/NpmLogReporter.ts +212 -0
  40. package/src/logger/reporters/Reporter.ts +7 -0
  41. package/src/logger/reporters/formatDuration.ts +16 -0
  42. package/src/paths.ts +37 -0
  43. package/src/showHelp.ts +15 -0
  44. package/src/task/DistributedTask.ts +68 -0
  45. package/src/task/NpmScriptTask.ts +80 -0
  46. package/src/task/Pipeline.ts +496 -0
  47. package/src/task/WorkerQueue.ts +148 -0
  48. package/src/task/WrappedTarget.ts +178 -0
  49. package/src/task/abortSignal.ts +6 -0
  50. package/src/task/filterPackages.ts +72 -0
  51. package/src/task/getDepsForTarget.ts +27 -0
  52. package/src/task/getNpmCommand.ts +9 -0
  53. package/src/task/getPipelinePackages.ts +65 -0
  54. package/src/task/taskId.ts +12 -0
  55. package/src/types/CacheOptions.ts +8 -0
  56. package/src/types/CliOptions.ts +200 -0
  57. package/src/types/Config.ts +9 -0
  58. package/src/types/ConfigOptions.ts +68 -0
  59. package/src/types/LoggerOptions.ts +15 -0
  60. package/src/types/PipelineDefinition.ts +88 -0
  61. package/src/types/Priority.ts +10 -0
  62. package/src/types/RunContext.ts +18 -0
  63. package/src/types/TargetStatus.ts +1 -0
  64. package/src/types/TaskId.ts +1 -0
  65. package/src/types/TopologicalGraph.ts +6 -0
  66. package/src/types/Workspace.ts +8 -0
  67. package/src/workspace/findNpmClient.ts +28 -0
  68. package/src/workspace/generateTopologicalGraph.ts +24 -0
  69. package/src/workspace/getPackagePipelines.ts +36 -0
  70. package/src/workspace/getWorkspace.ts +28 -0
  71. package/tests/e2e/__snapshots__/info.test.ts.snap +5 -0
  72. package/tests/e2e/basic.test.ts +60 -0
  73. package/tests/e2e/basicFailure.test.ts +132 -0
  74. package/tests/e2e/bigapp.test.ts +94 -0
  75. package/tests/e2e/info.test.ts +43 -0
  76. package/tests/e2e/parseNdJson.ts +11 -0
  77. package/tests/e2e/remoteFallback.test.ts +245 -0
  78. package/tests/e2e/transitiveTaskDeps.test.ts +224 -0
  79. package/tests/mock/monorepo.ts +180 -0
  80. package/tests/res.txt +3537 -0
  81. package/tests/tsconfig.json +4 -0
  82. package/tests/unit/filterPackages.test.ts +126 -0
  83. package/.vscode/launch.json +0 -22
  84. package/CODE_OF_CONDUCT.md +0 -9
  85. package/LICENSE +0 -21
  86. package/SECURITY.md +0 -41
  87. package/beachball.config.js +0 -17
  88. package/docs-new/README.md +0 -41
  89. package/docs-new/babel.config.js +0 -3
  90. package/docs-new/docusaurus.config.js +0 -80
  91. package/docs-new/package.json +0 -38
  92. package/docs-new/sidebars.js +0 -31
  93. package/docs-new/static/.nojekyll +0 -0
  94. package/docs-new/static/img/docusaurus.png +0 -0
  95. package/docs-new/static/img/favicon.ico +0 -0
  96. package/docs-new/static/img/icon-business-automation.svg +0 -6772
  97. package/docs-new/static/img/icon-business-chart.svg +0 -20
  98. package/docs-new/static/img/icon-clock-time.svg +0 -11
  99. package/docs-new/static/img/icon-hierarchy.svg +0 -16
  100. package/docs-new/static/img/icon-monitor-graph-growth.svg +0 -10
  101. package/docs-new/static/img/icon-publishing.svg +0 -58
  102. package/docs-new/static/img/icon-time.svg +0 -1
  103. package/docs-new/static/img/icon-up.svg +0 -1
  104. package/docs-new/static/img/logo.svg +0 -1
  105. package/docs-new/yarn.lock +0 -8189
  106. package/renovate.json +0 -8
  107. package/test.md +0 -58
package/CHANGELOG.json CHANGED
@@ -2,7 +2,73 @@
2
2
  "name": "lage",
3
3
  "entries": [
4
4
  {
5
- "date": "Thu, 03 Mar 2022 22:42:25 GMT",
5
+ "date": "Fri, 10 Jun 2022 19:39:25 GMT",
6
+ "tag": "lage_v1.6.1",
7
+ "version": "1.6.1",
8
+ "comments": {
9
+ "patch": [
10
+ {
11
+ "author": "kchau@microsoft.com",
12
+ "package": "lage",
13
+ "comment": "Fast path on hash calculations for Windows as well",
14
+ "commit": "f6de97771dcd98ade351c7204aa3f742957886d8"
15
+ }
16
+ ]
17
+ }
18
+ },
19
+ {
20
+ "date": "Fri, 10 Jun 2022 18:43:25 GMT",
21
+ "tag": "lage_v1.6.0",
22
+ "version": "1.6.0",
23
+ "comments": {
24
+ "minor": [
25
+ {
26
+ "author": "kchau@microsoft.com",
27
+ "package": "lage",
28
+ "comment": "Bumping backfill - minor lage bump because it is significant in its dep change behavior",
29
+ "commit": "6e4672a9a4e2f4aa6246792ef11ea99445ee1c62"
30
+ }
31
+ ]
32
+ }
33
+ },
34
+ {
35
+ "date": "Wed, 25 May 2022 20:06:36 GMT",
36
+ "tag": "lage_v1.5.2",
37
+ "version": "1.5.2",
38
+ "comments": {
39
+ "patch": [
40
+ {
41
+ "author": "ken@gizzar.com",
42
+ "package": "lage",
43
+ "comment": "Moving to a monorepo. This will be a test publish",
44
+ "commit": "c0d69c29e1ac1f315e1f91139ec1c4bde15561dd"
45
+ }
46
+ ]
47
+ }
48
+ },
49
+ {
50
+ "date": "Mon, 14 Mar 2022 22:04:24 GMT",
51
+ "tag": "lage_v1.5.1",
52
+ "version": "1.5.1",
53
+ "comments": {
54
+ "none": [
55
+ {
56
+ "author": "elcraig@microsoft.com",
57
+ "package": "lage",
58
+ "comment": "Dedupe yarn.lock and switch to stable node types version",
59
+ "commit": "6181444865fa052b6d196d56d65fa32a2771de38"
60
+ },
61
+ {
62
+ "author": "kchau@microsoft.com",
63
+ "package": "lage",
64
+ "comment": "adding changes in github action workflows to accommodate the rename",
65
+ "commit": "6181444865fa052b6d196d56d65fa32a2771de38"
66
+ }
67
+ ]
68
+ }
69
+ },
70
+ {
71
+ "date": "Thu, 03 Mar 2022 22:42:29 GMT",
6
72
  "tag": "lage_v1.5.1",
7
73
  "version": "1.5.1",
8
74
  "comments": {
package/CHANGELOG.md CHANGED
@@ -1,12 +1,36 @@
1
1
  # Change Log - lage
2
2
 
3
- This log was last generated on Thu, 03 Mar 2022 22:42:25 GMT and should not be manually modified.
3
+ This log was last generated on Fri, 10 Jun 2022 19:39:25 GMT and should not be manually modified.
4
4
 
5
5
  <!-- Start content -->
6
6
 
7
+ ## 1.6.1
8
+
9
+ Fri, 10 Jun 2022 19:39:25 GMT
10
+
11
+ ### Patches
12
+
13
+ - Fast path on hash calculations for Windows as well (kchau@microsoft.com)
14
+
15
+ ## 1.6.0
16
+
17
+ Fri, 10 Jun 2022 18:43:25 GMT
18
+
19
+ ### Minor changes
20
+
21
+ - Bumping backfill - minor lage bump because it is significant in its dep change behavior (kchau@microsoft.com)
22
+
23
+ ## 1.5.2
24
+
25
+ Wed, 25 May 2022 20:06:36 GMT
26
+
27
+ ### Patches
28
+
29
+ - Moving to a monorepo. This will be a test publish (ken@gizzar.com)
30
+
7
31
  ## 1.5.1
8
32
 
9
- Thu, 03 Mar 2022 22:42:25 GMT
33
+ Thu, 03 Mar 2022 22:42:29 GMT
10
34
 
11
35
  ### Patches
12
36
 
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # lage
2
2
 
3
- This is the UNSTABLE branch. All package published from this branch will be tagged as `lage@unstable`. When we have confirmed stability for v1.x branch, then we'll promote it to be stable.
3
+ This is the latest branch. All package published from this branch will be tagged as `lage@unstable`. When we have confirmed stability for v1.x branch, then we'll promote it to be stable.
4
4
 
5
5
  Documentation is here: https://microsoft.github.io/lage/
6
6
 
package/jest.config.js CHANGED
@@ -1,8 +1,3 @@
1
- /*
2
- * For a detailed explanation regarding each configuration property, visit:
3
- * https://jestjs.io/docs/configuration
4
- */
5
-
6
1
  module.exports = {
7
2
  clearMocks: true,
8
3
  collectCoverage: false,
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -1 +1 @@
1
- {"version":3,"file":"backfill.js","sourceRoot":"","sources":["../../src/cache/backfill.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,+CAA+C;AAC/C,sCAAmC;AACnC,iCAA8B;AAC9B,2DAA6C;AAGtC,KAAK,UAAU,SAAS,CAC7B,EAAU,EACV,GAAW,EACX,IAAY,EACZ,YAA0B,EAC1B,IAAS;IAET,MAAM,WAAW,GAAG,IAAA,4BAAc,EAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAEtD,MAAM,cAAc,GAAG,QAAQ,CAAC,UAAU,CACxC,OAAO,EACP,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,MAAM,CACf,CAAC;IAEF,MAAM,OAAO,GAAG,IAAA,WAAI,EAClB,YAAY,CAAC,eAAe,IAAI,CAAC,gBAAgB,CAAC,EAClD,GAAG,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAC/B,IAAI,EACJ,YAAY,CAAC,QAAQ,CACtB,CAAC;IAEF,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAE3B,IAAI;QACF,OAAO,MAAM,QAAQ,CAAC,WAAW,CAC/B,GAAG,EACH,cAAc,EACd,OAAO,EACP,WAAW,CACZ,CAAC;KACH;IAAC,WAAM;QACN,uIAAuI;QACvI,yDAAyD;KAC1D;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AArCD,8BAqCC;AAEM,KAAK,UAAU,UAAU,CAC9B,IAAmB,EACnB,EAAU,EACV,GAAW,EACX,YAA0B;IAE1B,IAAI,CAAC,IAAI,EAAE;QACT,OAAO,KAAK,CAAC;KACd;IAED,MAAM,WAAW,GAAG,IAAA,4BAAc,EAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACtD,MAAM,cAAc,GAAG,QAAQ,CAAC,UAAU,CACxC,OAAO,EACP,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,MAAM,CACf,CAAC;IAEF,IAAI;QACF,OAAO,MAAM,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;KACrE;IAAC,OAAO,CAAC,EAAE;QACV,eAAM,CAAC,KAAK,CAAC,GAAG,EAAE,kBAAkB,CAAC,IAAK,CAAS,CAAC,KAAK,IAAI,CAAC,IAAK,CAAS,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC;KAC9F;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAxBD,gCAwBC;AAEM,KAAK,UAAU,QAAQ,CAC5B,IAAmB,EACnB,GAAW,EACX,YAA0B;IAE1B,IAAI,CAAC,IAAI,EAAE;QACT,OAAO;KACR;IAED,MAAM,WAAW,GAAG,IAAA,4BAAc,EAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACtD,MAAM,cAAc,GAAG,QAAQ,CAAC,UAAU,CACxC,MAAM,EACN,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,MAAM,CACf,CAAC;IAEF,IAAI;QACF,MAAM,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;KAC5D;IAAC,OAAO,CAAC,EAAE;QACV,+DAA+D;KAChE;AACH,CAAC;AArBD,4BAqBC"}
1
+ {"version":3,"file":"backfill.js","sourceRoot":"","sources":["../../src/cache/backfill.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAA+C;AAC/C,sCAAmC;AACnC,iCAA8B;AAC9B,2DAA6C;AAGtC,KAAK,UAAU,SAAS,CAC7B,EAAU,EACV,GAAW,EACX,IAAY,EACZ,YAA0B,EAC1B,IAAS;IAET,MAAM,WAAW,GAAG,IAAA,4BAAc,EAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAEtD,MAAM,cAAc,GAAG,QAAQ,CAAC,UAAU,CACxC,OAAO,EACP,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,MAAM,CACf,CAAC;IAEF,MAAM,OAAO,GAAG,IAAA,WAAI,EAClB,YAAY,CAAC,eAAe,IAAI,CAAC,gBAAgB,CAAC,EAClD,GAAG,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAC/B,IAAI,EACJ,YAAY,CAAC,QAAQ,CACtB,CAAC;IAEF,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAE3B,IAAI;QACF,OAAO,MAAM,QAAQ,CAAC,WAAW,CAC/B,GAAG,EACH,cAAc,EACd,OAAO,EACP,WAAW,CACZ,CAAC;KACH;IAAC,WAAM;QACN,uIAAuI;QACvI,yDAAyD;KAC1D;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AArCD,8BAqCC;AAEM,KAAK,UAAU,UAAU,CAC9B,IAAmB,EACnB,EAAU,EACV,GAAW,EACX,YAA0B;IAE1B,IAAI,CAAC,IAAI,EAAE;QACT,OAAO,KAAK,CAAC;KACd;IAED,MAAM,WAAW,GAAG,IAAA,4BAAc,EAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACtD,MAAM,cAAc,GAAG,QAAQ,CAAC,UAAU,CACxC,OAAO,EACP,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,MAAM,CACf,CAAC;IAEF,IAAI;QACF,OAAO,MAAM,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;KACrE;IAAC,OAAO,CAAC,EAAE;QACV,eAAM,CAAC,KAAK,CAAC,GAAG,EAAE,kBAAkB,CAAC,IAAK,CAAS,CAAC,KAAK,IAAI,CAAC,IAAK,CAAS,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC;KAC9F;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAxBD,gCAwBC;AAEM,KAAK,UAAU,QAAQ,CAC5B,IAAmB,EACnB,GAAW,EACX,YAA0B;IAE1B,IAAI,CAAC,IAAI,EAAE;QACT,OAAO;KACR;IAED,MAAM,WAAW,GAAG,IAAA,4BAAc,EAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACtD,MAAM,cAAc,GAAG,QAAQ,CAAC,UAAU,CACxC,MAAM,EACN,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,MAAM,CACf,CAAC;IAEF,IAAI;QACF,MAAM,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;KAC5D;IAAC,OAAO,CAAC,EAAE;QACV,+DAA+D;KAChE;AACH,CAAC;AArBD,4BAqBC"}
package/lib/cache/salt.js CHANGED
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -1 +1 @@
1
- {"version":3,"file":"salt.js","sourceRoot":"","sources":["../../src/cache/salt.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA6B;AAC7B,+CAAiC;AACjC,8CAAgC;AAChC,uCAAyB;AAEzB,IAAI,OAAiB,CAAC;AAEtB,SAAgB,IAAI,CAClB,oBAA8B,EAC9B,OAAe,EACf,QAAgB,EAChB,YAAoB,EAAE;IAEtB,OAAO,WAAW,CAAC,CAAC,GAAG,UAAU,CAAC,oBAAoB,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;AAC1F,CAAC;AAPD,oBAOC;AAED,SAAS,UAAU,CAAC,oBAA8B,EAAE,QAAgB;IAClE,IAAI,CAAC,OAAO,EAAE;QACZ,MAAM,OAAO,GAAG,aAAa,CAAC;QAC9B,MAAM,EAAE,GAAG,IAAI,CAAC;QAChB,MAAM,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE;YAC1C,GAAG,EAAE,QAAQ;SACd,CAAC,CAAC;QAEH,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAChC,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAEpB,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;YAC9D,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACxD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAEpB,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,MAAM,CAAC;KAClB;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,WAAW,CAAC,OAA0B;IAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAClE,MAAM,QAAQ,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAEtD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC"}
1
+ {"version":3,"file":"salt.js","sourceRoot":"","sources":["../../src/cache/salt.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA6B;AAC7B,+CAAiC;AACjC,8CAAgC;AAChC,uCAAyB;AAEzB,IAAI,OAAiB,CAAC;AAEtB,SAAgB,IAAI,CAClB,oBAA8B,EAC9B,OAAe,EACf,QAAgB,EAChB,YAAoB,EAAE;IAEtB,OAAO,WAAW,CAAC,CAAC,GAAG,UAAU,CAAC,oBAAoB,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;AAC1F,CAAC;AAPD,oBAOC;AAED,SAAS,UAAU,CAAC,oBAA8B,EAAE,QAAgB;IAClE,IAAI,CAAC,OAAO,EAAE;QACZ,MAAM,OAAO,GAAG,aAAa,CAAC;QAC9B,MAAM,EAAE,GAAG,IAAI,CAAC;QAChB,MAAM,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE;YAC1C,GAAG,EAAE,QAAQ;SACd,CAAC,CAAC;QAEH,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAChC,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAEpB,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;YAC9D,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACxD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAEpB,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,MAAM,CAAC;KAClB;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,WAAW,CAAC,OAA0B;IAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAClE,MAAM,QAAQ,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAEtD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC"}
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -1 +1 @@
1
- {"version":3,"file":"getPipelinePackages.js","sourceRoot":"","sources":["../../src/task/getPipelinePackages.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AACA,qDAAkD;AAElD,qDAA0F;AAC1F,8CAAgC;AAChC,sCAAmC;AAEnC,SAAgB,mBAAmB,CAAC,SAAoB,EAAE,MAAc;IACtE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,GAAG,MAAM,CAAC;IAEtE,4CAA4C;IAC5C,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3D,IAAI,cAAc,GAAyB,SAAS,CAAC;IACrD,IAAI,SAAS,EAAE;QACb,cAAc,GAAG,IAAA,mCAAiB,EAAC,KAAM,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;KACnE;IAED,MAAM,QAAQ,GAAG,OAAO,KAAK,KAAK,WAAW,CAAC;IAC9C,IAAI,eAAe,GAAyB,SAAS,CAAC;IAEtD,8EAA8E;IAC9E,IAAI,QAAQ,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE;QACvE,IAAI;YACF,eAAe,GAAG,IAAA,oCAAkB,EAAC,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;SAC5E;QAAC,OAAM,CAAC,EAAE;YACT,eAAM,CAAC,IAAI,CAAC,mFAAmF,CAAC,EAAE,CAAC,CAAC;YACpG,mGAAmG;SACpG;KACF;IAED,OAAO,IAAA,+BAAc,EAAC;QACpB,WAAW,EAAE,SAAS,CAAC,WAAW;QAClC,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,cAAc;QACd,eAAe;QACf,mBAAmB;KACpB,CAAC,CAAC;AACL,CAAC;AA9BD,kDA8BC;AAED,SAAS,cAAc,CACrB,KAAa,EACb,IAAY,EACZ,eAAyB;IAEzB,IAAI;QACF,MAAM,YAAY,GAAG,IAAA,kCAAgB,EAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,IAAI,eAAe,GAAG,KAAK,CAAC;QAE5B,IAAI,YAAY,EAAE;YAChB,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE;gBACjC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;oBAC7B,eAAe,GAAG,IAAI,CAAC;oBACvB,MAAM;iBACP;aACF;SACF;QAED,OAAO,eAAe,CAAC;KACxB;IAAC,OAAM,CAAC,EAAE;QACT,+CAA+C;QAC/C,eAAM,CAAC,IAAI,CAAC,iFAAiF,CAAC,EAAE,CAAC,CAAC;QAClG,OAAO,IAAI,CAAC;KACb;AACH,CAAC"}
1
+ {"version":3,"file":"getPipelinePackages.js","sourceRoot":"","sources":["../../src/task/getPipelinePackages.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AACA,qDAAkD;AAElD,qDAA0F;AAC1F,8CAAgC;AAChC,sCAAmC;AAEnC,SAAgB,mBAAmB,CAAC,SAAoB,EAAE,MAAc;IACtE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,GAAG,MAAM,CAAC;IAEtE,4CAA4C;IAC5C,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3D,IAAI,cAAc,GAAyB,SAAS,CAAC;IACrD,IAAI,SAAS,EAAE;QACb,cAAc,GAAG,IAAA,mCAAiB,EAAC,KAAM,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;KACnE;IAED,MAAM,QAAQ,GAAG,OAAO,KAAK,KAAK,WAAW,CAAC;IAC9C,IAAI,eAAe,GAAyB,SAAS,CAAC;IAEtD,8EAA8E;IAC9E,IAAI,QAAQ,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE;QACvE,IAAI;YACF,eAAe,GAAG,IAAA,oCAAkB,EAAC,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;SAC5E;QAAC,OAAM,CAAC,EAAE;YACT,eAAM,CAAC,IAAI,CAAC,mFAAmF,CAAC,EAAE,CAAC,CAAC;YACpG,mGAAmG;SACpG;KACF;IAED,OAAO,IAAA,+BAAc,EAAC;QACpB,WAAW,EAAE,SAAS,CAAC,WAAW;QAClC,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,cAAc;QACd,eAAe;QACf,mBAAmB;KACpB,CAAC,CAAC;AACL,CAAC;AA9BD,kDA8BC;AAED,SAAS,cAAc,CACrB,KAAa,EACb,IAAY,EACZ,eAAyB;IAEzB,IAAI;QACF,MAAM,YAAY,GAAG,IAAA,kCAAgB,EAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,IAAI,eAAe,GAAG,KAAK,CAAC;QAE5B,IAAI,YAAY,EAAE;YAChB,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE;gBACjC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;oBAC7B,eAAe,GAAG,IAAI,CAAC;oBACvB,MAAM;iBACP;aACF;SACF;QAED,OAAO,eAAe,CAAC;KACxB;IAAC,OAAM,CAAC,EAAE;QACT,+CAA+C;QAC/C,eAAM,CAAC,IAAI,CAAC,iFAAiF,CAAC,EAAE,CAAC,CAAC;QAClG,OAAO,IAAI,CAAC;KACb;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lage",
3
- "version": "1.5.1",
3
+ "version": "1.6.1",
4
4
  "description": "A monorepo task runner",
5
5
  "repository": {
6
6
  "url": "https://github.com/microsoft/lage"
@@ -32,9 +32,9 @@
32
32
  "dependencies": {
33
33
  "@xmldom/xmldom": "^0.8.0",
34
34
  "abort-controller": "^3.0.0",
35
- "backfill": "^6.1.13",
36
- "backfill-cache": "^5.3.0",
37
- "backfill-config": "^6.2.0",
35
+ "backfill": "^6.1.20",
36
+ "backfill-cache": "^5.6.1",
37
+ "backfill-config": "^6.3.0",
38
38
  "backfill-logger": "^5.1.3",
39
39
  "bullmq": "^1.50.2",
40
40
  "chalk": "^4.0.0",
@@ -58,20 +58,15 @@
58
58
  "@types/git-url-parse": "^9.0.0",
59
59
  "@types/ioredis": "^4.27.7",
60
60
  "@types/jest": "^27.0.1",
61
- "@types/node": "^13.13.2",
61
+ "@types/node": "^12.0.0",
62
62
  "@types/npmlog": "^4.1.2",
63
63
  "@types/p-queue": "^3.2.1",
64
64
  "@types/yargs-parser": "^15.0.0",
65
65
  "beachball": "^2.16.0",
66
66
  "gh-pages": "^2.2.0",
67
67
  "jest": "^27.2.0",
68
- "renovate": "^23.42.2",
69
68
  "ts-jest": "^27.0.5",
70
69
  "ts-node": "^8.10.2",
71
- "typedoc": "^0.17.8",
72
- "typedoc-plugin-markdown": "^2.3.1",
73
- "typescript": "^4.4.4",
74
- "vuepress": "^1.5.3",
75
- "vuepress-plugin-mermaidjs": "^1.6.0"
70
+ "typescript": "^4.4.4"
76
71
  }
77
72
  }
package/src/args.ts ADDED
@@ -0,0 +1,107 @@
1
+ import yargsParser, { Arguments } from "yargs-parser";
2
+
3
+ export function arrifyArgs(args: { [key: string]: string | string[] }) {
4
+ const argsArray: string[] = [];
5
+ for (const [key, val] of Object.entries(args)) {
6
+ if (key === "--" && Array.isArray(val)) {
7
+ val.forEach((arg) => argsArray.push(arg));
8
+ } else if (Array.isArray(val)) {
9
+ for (const item of val) {
10
+ pushValue(key, item);
11
+ }
12
+ } else {
13
+ pushValue(key, val);
14
+ }
15
+ }
16
+
17
+ return argsArray;
18
+
19
+ function pushValue(key: string, value: string) {
20
+ let keyArg = "";
21
+
22
+ if (typeof value === "boolean") {
23
+ if (key.length === 1 && value) {
24
+ keyArg = `-${key}`;
25
+ } else if (value) {
26
+ keyArg = `--${key}`;
27
+ } else {
28
+ keyArg = `--no-${key}`;
29
+ }
30
+
31
+ argsArray.push(keyArg);
32
+ } else {
33
+ if (key.length === 1 && value) {
34
+ keyArg = `-${key}`;
35
+ } else if (value) {
36
+ keyArg = `--${key}`;
37
+ }
38
+
39
+ argsArray.push(keyArg, value);
40
+ }
41
+ }
42
+ }
43
+
44
+ export function getPassThroughArgs(
45
+ command: string[],
46
+ args: { [key: string]: string | string[] }
47
+ ) {
48
+ let result: string[] = [];
49
+
50
+ let lageArgs = [
51
+ "node",
52
+ "scope",
53
+ "since",
54
+ "cache",
55
+ "deps",
56
+ "resetCache",
57
+ "ignore",
58
+ "verbose",
59
+ "only",
60
+ "concurrency",
61
+ "profile",
62
+ "grouped",
63
+ "reporter",
64
+ "to",
65
+ "parallel",
66
+ "continue",
67
+ "safeExit",
68
+ "includeDependencies",
69
+ "logLevel",
70
+ "cacheKey",
71
+ "dist",
72
+ "experimentDist",
73
+ "skipLocalCache",
74
+ "_",
75
+ ];
76
+
77
+ if (command[0] === "cache") {
78
+ lageArgs = [...lageArgs, "clear", "prune"];
79
+ }
80
+
81
+ const filtered: { [key: string]: string | string[] } = {};
82
+
83
+ for (let [key, value] of Object.entries(args)) {
84
+ if (!lageArgs.includes(key)) {
85
+ filtered[key] = value;
86
+ }
87
+ }
88
+
89
+ result = result.concat(arrifyArgs(filtered));
90
+
91
+ return result;
92
+ }
93
+
94
+ export function parseArgs() {
95
+ return yargsParser(process.argv.slice(2), {
96
+ array: ["scope", "node", "ignore", "to"],
97
+ configuration: {
98
+ "populate--": true,
99
+ "strip-dashed": true,
100
+ },
101
+ string: ["cacheKey"],
102
+ });
103
+ }
104
+
105
+ export function validateInput(parsedArgs: Arguments) {
106
+ return parsedArgs._ && parsedArgs._.length > 0;
107
+ }
@@ -0,0 +1,100 @@
1
+ import { ICacheStorage } from "backfill-config";
2
+ import { getCacheStorageProvider, isCustomProvider } from "backfill-cache";
3
+ import { Logger } from "backfill-logger";
4
+ import { CacheOptions } from "../types/CacheOptions";
5
+ import { logger } from "../logger";
6
+
7
+ export type RemoteFallbackCacheProviderOptions = Pick<
8
+ CacheOptions,
9
+ "internalCacheFolder" | "cacheStorageConfig" | "writeRemoteCache" | "skipLocalCache"
10
+ >;
11
+
12
+ /**
13
+ * Remote Fallback Cache Provider
14
+ *
15
+ * This backfill cache provider will fallback to a remote cache provider if the local cache does not contain the item.
16
+ * It will also automatically populate the local cache with the remote cache.
17
+ */
18
+ export class RemoteFallbackCacheProvider implements ICacheStorage {
19
+ private localCacheStorageProvider: ICacheStorage;
20
+ private remoteCacheStorageProvider?: ICacheStorage;
21
+
22
+ private static localHits: { [hash: string]: boolean } = {};
23
+ private static remoteHits: { [hash: string]: boolean } = {};
24
+
25
+ constructor(private cacheOptions: RemoteFallbackCacheProviderOptions, logger: Logger, cwd: string) {
26
+ this.localCacheStorageProvider = getCacheStorageProvider(
27
+ {
28
+ provider: "local",
29
+ },
30
+ cacheOptions.internalCacheFolder,
31
+ logger,
32
+ cwd
33
+ );
34
+
35
+ // Remote providers should have a provider name of something other than "local" OR it is
36
+ // a custom provider (currently S3 would be a custom provider)
37
+ const isRemoteProvider =
38
+ isCustomProvider(cacheOptions.cacheStorageConfig) ||
39
+ (typeof cacheOptions.cacheStorageConfig.provider === "string" &&
40
+ !cacheOptions.cacheStorageConfig.provider.includes("local"));
41
+
42
+ if (isRemoteProvider) {
43
+ logger.silly("remote provider enabled");
44
+
45
+ this.remoteCacheStorageProvider = getCacheStorageProvider(
46
+ cacheOptions.cacheStorageConfig,
47
+ cacheOptions.internalCacheFolder,
48
+ logger,
49
+ cwd
50
+ );
51
+ }
52
+ }
53
+
54
+ async fetch(hash: string) {
55
+ if (!this.cacheOptions.skipLocalCache) {
56
+ RemoteFallbackCacheProvider.localHits[hash] = await this.localCacheStorageProvider.fetch(hash);
57
+ logger.silly(`local cache fetch: ${hash} ${RemoteFallbackCacheProvider.localHits[hash]}`);
58
+ }
59
+
60
+ if (!RemoteFallbackCacheProvider.localHits[hash] && this.remoteCacheStorageProvider) {
61
+ RemoteFallbackCacheProvider.remoteHits[hash] = await this.remoteCacheStorageProvider.fetch(hash);
62
+ logger.silly(`remote fallback fetch: ${hash} ${RemoteFallbackCacheProvider.remoteHits[hash]}`);
63
+ return RemoteFallbackCacheProvider.remoteHits[hash];
64
+ }
65
+
66
+ return RemoteFallbackCacheProvider.localHits[hash];
67
+ }
68
+
69
+ async put(hash: string, filesToCache: string[]) {
70
+ const putPromises: Promise<void>[] = [];
71
+
72
+ // Write local cache if it doesn't already exist, or if the the hash isn't in the localHits
73
+ const shouldWriteLocalCache = !this.isLocalHit(hash) && !this.cacheOptions.skipLocalCache;
74
+
75
+ if (shouldWriteLocalCache) {
76
+ logger.silly(`local cache put: ${hash}`);
77
+ putPromises.push(this.localCacheStorageProvider.put(hash, filesToCache));
78
+ }
79
+
80
+ // Write to remote if there is a no hit in the remote cache, and remote cache storage provider, and that the "writeRemoteCache" config flag is set to true
81
+ const shouldWriteRemoteCache =
82
+ !this.isRemoteHit(hash) && !!this.remoteCacheStorageProvider && this.cacheOptions.writeRemoteCache;
83
+
84
+ if (shouldWriteRemoteCache) {
85
+ logger.silly(`remote fallback put: ${hash}`);
86
+ const remotePut = this.remoteCacheStorageProvider!.put(hash, filesToCache);
87
+ putPromises.push(remotePut);
88
+ }
89
+
90
+ await Promise.all(putPromises);
91
+ }
92
+
93
+ private isRemoteHit(hash) {
94
+ return hash in RemoteFallbackCacheProvider.remoteHits && RemoteFallbackCacheProvider.remoteHits[hash];
95
+ }
96
+
97
+ private isLocalHit(hash) {
98
+ return hash in RemoteFallbackCacheProvider.localHits && RemoteFallbackCacheProvider.localHits[hash];
99
+ }
100
+ }
@@ -0,0 +1,93 @@
1
+ import { getCacheConfig } from "./cacheConfig";
2
+ import { logger } from "../logger";
3
+ import { salt } from "./salt";
4
+ import * as backfill from "backfill/lib/api";
5
+ import { CacheOptions } from "../types/CacheOptions";
6
+
7
+ export async function cacheHash(
8
+ id: string,
9
+ cwd: string,
10
+ root: string,
11
+ cacheOptions: CacheOptions,
12
+ args: any
13
+ ) {
14
+ const cacheConfig = getCacheConfig(cwd, cacheOptions);
15
+
16
+ const backfillLogger = backfill.makeLogger(
17
+ "error",
18
+ process.stdout,
19
+ process.stderr
20
+ );
21
+
22
+ const hashKey = salt(
23
+ cacheOptions.environmentGlob || ["lage.config.js"],
24
+ `${id}|${JSON.stringify(args)}`,
25
+ root,
26
+ cacheOptions.cacheKey
27
+ );
28
+
29
+ backfillLogger.setName(id);
30
+
31
+ try {
32
+ return await backfill.computeHash(
33
+ cwd,
34
+ backfillLogger,
35
+ hashKey,
36
+ cacheConfig
37
+ );
38
+ } catch {
39
+ // computeHash can throw exception when git is not installed or the repo hashes cannot be calculated with a staged file that is deleted
40
+ // lage will continue as if this package cannot be cached
41
+ }
42
+
43
+ return null;
44
+ }
45
+
46
+ export async function cacheFetch(
47
+ hash: string | null,
48
+ id: string,
49
+ cwd: string,
50
+ cacheOptions: CacheOptions
51
+ ) {
52
+ if (!hash) {
53
+ return false;
54
+ }
55
+
56
+ const cacheConfig = getCacheConfig(cwd, cacheOptions);
57
+ const backfillLogger = backfill.makeLogger(
58
+ "error",
59
+ process.stdout,
60
+ process.stderr
61
+ );
62
+
63
+ try {
64
+ return await backfill.fetch(cwd, hash, backfillLogger, cacheConfig);
65
+ } catch (e) {
66
+ logger.error(`${id} fetchBackfill ${e && (e as any).stack || e && (e as any).message || e}`);
67
+ }
68
+
69
+ return false;
70
+ }
71
+
72
+ export async function cachePut(
73
+ hash: string | null,
74
+ cwd: string,
75
+ cacheOptions: CacheOptions
76
+ ) {
77
+ if (!hash) {
78
+ return;
79
+ }
80
+
81
+ const cacheConfig = getCacheConfig(cwd, cacheOptions);
82
+ const backfillLogger = backfill.makeLogger(
83
+ "warn",
84
+ process.stdout,
85
+ process.stderr
86
+ );
87
+
88
+ try {
89
+ await backfill.put(cwd, hash, backfillLogger, cacheConfig);
90
+ } catch (e) {
91
+ // sometimes outputGlob don't match any files, so skipping this
92
+ }
93
+ }
@@ -0,0 +1,33 @@
1
+ import { getEnvConfig, createDefaultConfig } from "backfill-config";
2
+ import { Logger, makeLogger } from "backfill-logger";
3
+ import { CacheOptions } from "../types/CacheOptions";
4
+ import { RemoteFallbackCacheProvider } from "./RemoteFallbackCacheProvider";
5
+
6
+ export function getCacheConfig(cwd: string, cacheOptions: CacheOptions) {
7
+ const defaultCacheConfig = createDefaultConfig(cwd);
8
+
9
+ // in lage, default mode is to CACHE locally
10
+ defaultCacheConfig.cacheStorageConfig.provider = "local";
11
+
12
+
13
+ const logger = makeLogger("warn");
14
+ const envConfig = getEnvConfig(logger);
15
+
16
+ const configWithEnvOverrides: CacheOptions = {
17
+ ...defaultCacheConfig,
18
+ ...cacheOptions,
19
+ ...envConfig,
20
+ writeRemoteCache: cacheOptions.writeRemoteCache || !!process.env.LAGE_WRITE_REMOTE_CACHE
21
+ };
22
+
23
+ const configWithFallback: CacheOptions = {
24
+ ...configWithEnvOverrides,
25
+ cacheStorageConfig: {
26
+ ...configWithEnvOverrides.cacheStorageConfig,
27
+ provider: (logger: Logger, cwd: string) => new RemoteFallbackCacheProvider(configWithEnvOverrides, logger, cwd),
28
+ name: "remote-fallback-provider"
29
+ },
30
+ };
31
+
32
+ return configWithFallback;
33
+ }
@@ -0,0 +1,9 @@
1
+ export const CacheHashTask = "backfillHash";
2
+ export const CacheFetchTask = "backfillFetch";
3
+ export const CachePutTask = "backfillPut";
4
+
5
+ export function isCacheTask(task: string) {
6
+ return (
7
+ task === CacheHashTask || task === CacheFetchTask || task === CachePutTask
8
+ );
9
+ }
@@ -0,0 +1,52 @@
1
+ import * as path from "path";
2
+ import * as crypto from "crypto";
3
+ import * as fg from "fast-glob";
4
+ import * as fs from "fs";
5
+
6
+ let envHash: string[];
7
+
8
+ export function salt(
9
+ environmentGlobFiles: string[],
10
+ command: string,
11
+ repoRoot: string,
12
+ customKey: string = ""
13
+ ): string {
14
+ return hashStrings([...getEnvHash(environmentGlobFiles, repoRoot), command, customKey]);
15
+ }
16
+
17
+ function getEnvHash(environmentGlobFiles: string[], repoRoot: string) {
18
+ if (!envHash) {
19
+ const newline = /\r\n|\r|\n/g;
20
+ const LF = "\n";
21
+ const files = fg.sync(environmentGlobFiles, {
22
+ cwd: repoRoot,
23
+ });
24
+
25
+ files.sort((a, b) => a.localeCompare(b));
26
+
27
+ const hashes = files.map((file) => {
28
+ const hasher = crypto.createHash("sha1");
29
+ hasher.update(file);
30
+
31
+ const fileBuffer = fs.readFileSync(path.join(repoRoot, file));
32
+ const data = fileBuffer.toString().replace(newline, LF);
33
+ hasher.update(data);
34
+
35
+ return hasher.digest("hex");
36
+ });
37
+
38
+ envHash = hashes;
39
+ }
40
+
41
+ return envHash;
42
+ }
43
+
44
+ function hashStrings(strings: string | string[]): string {
45
+ const hasher = crypto.createHash("sha1");
46
+ const anArray = typeof strings === "string" ? [strings] : strings;
47
+ const elements = [...anArray];
48
+ elements.sort((a, b) => a.localeCompare(b));
49
+ elements.forEach((element) => hasher.update(element));
50
+
51
+ return hasher.digest("hex");
52
+ }