@ohos-ports/nx 23.3.0-beta.2 → 24.0.2-beta.0

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 (294) hide show
  1. package/README.md +3 -6
  2. package/dist/bin/nx.js +2 -2
  3. package/dist/bin/post-install.js +5 -3
  4. package/dist/nx-cloud-internals.d.ts +1 -0
  5. package/dist/nx-cloud-internals.js +7 -1
  6. package/dist/src/adapter/ngcli-adapter.js +2 -2
  7. package/dist/src/ai/clone-ai-config-repo.js +49 -12
  8. package/dist/src/command-line/add/add.d.ts +2 -0
  9. package/dist/src/command-line/add/add.js +23 -5
  10. package/dist/src/command-line/affected/affected.js +2 -2
  11. package/dist/src/command-line/configure-ai-agents/configure-ai-agents.js +0 -12
  12. package/dist/src/command-line/graph/graph.js +38 -10
  13. package/dist/src/command-line/init/command-object.js +0 -12
  14. package/dist/src/command-line/init/implementation/add-nx-to-nest.js +21 -62
  15. package/dist/src/command-line/init/init-v2.js +0 -2
  16. package/dist/src/command-line/migrate/agentic/close-agent-session.d.ts +1 -1
  17. package/dist/src/command-line/migrate/agentic/close-agent-session.js +4 -3
  18. package/dist/src/command-line/migrate/agentic/definitions.d.ts +1 -3
  19. package/dist/src/command-line/migrate/agentic/definitions.js +5 -97
  20. package/dist/src/command-line/migrate/agentic/handoff-gitignore.d.ts +7 -45
  21. package/dist/src/command-line/migrate/agentic/handoff-gitignore.js +9 -51
  22. package/dist/src/command-line/migrate/agentic/handoff.d.ts +1 -43
  23. package/dist/src/command-line/migrate/agentic/handoff.js +3 -119
  24. package/dist/src/command-line/migrate/agentic/instruction-files.d.ts +0 -21
  25. package/dist/src/command-line/migrate/agentic/instruction-files.js +6 -27
  26. package/dist/src/command-line/migrate/agentic/master/run-master-session.d.ts +19 -1
  27. package/dist/src/command-line/migrate/agentic/master/run-master-session.js +88 -49
  28. package/dist/src/command-line/migrate/agentic/master/spawn-master.d.ts +1 -0
  29. package/dist/src/command-line/migrate/agentic/master/spawn-master.js +86 -24
  30. package/dist/src/command-line/migrate/agentic/print-dropped-agent-context.d.ts +2 -2
  31. package/dist/src/command-line/migrate/agentic/print-dropped-agent-context.js +2 -2
  32. package/dist/src/command-line/migrate/agentic/prompts/fragments.d.ts +1 -12
  33. package/dist/src/command-line/migrate/agentic/prompts/fragments.js +8 -17
  34. package/dist/src/command-line/migrate/agentic/prompts/shared-rendering.d.ts +0 -15
  35. package/dist/src/command-line/migrate/agentic/prompts/shared-rendering.js +3 -100
  36. package/dist/src/command-line/migrate/agentic/select.d.ts +12 -6
  37. package/dist/src/command-line/migrate/agentic/select.js +38 -8
  38. package/dist/src/command-line/migrate/agentic/types.d.ts +9 -68
  39. package/dist/src/command-line/migrate/agentic/types.js +6 -8
  40. package/dist/src/command-line/migrate/command-object.js +6 -10
  41. package/dist/src/command-line/migrate/execute-migration.d.ts +6 -6
  42. package/dist/src/command-line/migrate/execute-migration.js +25 -15
  43. package/dist/src/command-line/migrate/migrate-analytics.d.ts +18 -1
  44. package/dist/src/command-line/migrate/migrate-analytics.js +38 -0
  45. package/dist/src/command-line/migrate/migrate-commits.d.ts +29 -17
  46. package/dist/src/command-line/migrate/migrate-commits.js +86 -32
  47. package/dist/src/command-line/migrate/migrate-config.d.ts +6 -6
  48. package/dist/src/command-line/migrate/migrate-config.js +12 -6
  49. package/dist/src/command-line/migrate/migrate-output.d.ts +1 -6
  50. package/dist/src/command-line/migrate/migrate-output.js +1 -10
  51. package/dist/src/command-line/migrate/migrate.d.ts +6 -30
  52. package/dist/src/command-line/migrate/migrate.js +257 -255
  53. package/dist/src/command-line/migrate/resolve-package-version.d.ts +2 -4
  54. package/dist/src/command-line/migrate/resolve-package-version.js +2 -35
  55. package/dist/src/command-line/migrate/run/agent-output.d.ts +2 -0
  56. package/dist/src/command-line/migrate/run/agent-output.js +9 -0
  57. package/dist/src/command-line/migrate/run/broker.d.ts +14 -5
  58. package/dist/src/command-line/migrate/run/broker.js +69 -21
  59. package/dist/src/command-line/migrate/run/clean-retry.js +4 -2
  60. package/dist/src/command-line/migrate/run/existing-run-report.d.ts +1 -1
  61. package/dist/src/command-line/migrate/run/existing-run-report.js +7 -5
  62. package/dist/src/command-line/migrate/run/give-up.d.ts +4 -3
  63. package/dist/src/command-line/migrate/run/give-up.js +8 -5
  64. package/dist/src/command-line/migrate/run/index.d.ts +7 -5
  65. package/dist/src/command-line/migrate/run/index.js +16 -1
  66. package/dist/src/command-line/migrate/run/issues.js +7 -2
  67. package/dist/src/command-line/migrate/run/orchestrator.d.ts +61 -4
  68. package/dist/src/command-line/migrate/run/orchestrator.js +397 -133
  69. package/dist/src/command-line/migrate/run/run-state.d.ts +17 -1
  70. package/dist/src/command-line/migrate/run/run-state.js +41 -2
  71. package/dist/src/command-line/migrate/run/runbook.d.ts +1 -0
  72. package/dist/src/command-line/migrate/run/runbook.js +115 -18
  73. package/dist/src/command-line/migrate/run/state-lock.d.ts +29 -4
  74. package/dist/src/command-line/migrate/run/state-lock.js +102 -10
  75. package/dist/src/command-line/migrate/run/state-machine.js +4 -1
  76. package/dist/src/command-line/migrate/run/util.d.ts +7 -2
  77. package/dist/src/command-line/migrate/run/util.js +30 -3
  78. package/dist/src/command-line/migrate/run/worker.d.ts +1 -1
  79. package/dist/src/command-line/migrate/run/worker.js +252 -250
  80. package/dist/src/command-line/migrate/sort-migrations.d.ts +1 -7
  81. package/dist/src/command-line/migrate/sort-migrations.js +1 -12
  82. package/dist/src/command-line/nx-cloud/connect/connect-to-nx-cloud.js +17 -12
  83. package/dist/src/command-line/release/changelog.js +9 -6
  84. package/dist/src/command-line/release/config/config.d.ts +1 -0
  85. package/dist/src/command-line/release/config/config.js +48 -9
  86. package/dist/src/command-line/release/release.js +2 -2
  87. package/dist/src/command-line/release/utils/git.js +8 -7
  88. package/dist/src/command-line/release/utils/interpolate-release-config.d.ts +6 -0
  89. package/dist/src/command-line/release/utils/interpolate-release-config.js +39 -0
  90. package/dist/src/command-line/release/utils/release-graph.d.ts +5 -0
  91. package/dist/src/command-line/release/utils/release-graph.js +1 -0
  92. package/dist/src/command-line/release/utils/remote-release-clients/github.js +5 -6
  93. package/dist/src/command-line/release/utils/remote-release-clients/gitlab.js +5 -6
  94. package/dist/src/command-line/release/utils/resolve-changelog-renderer.js +2 -2
  95. package/dist/src/command-line/release/utils/shared.js +10 -10
  96. package/dist/src/command-line/release/utils/version-plan-utils.d.ts +3 -12
  97. package/dist/src/command-line/release/utils/version-plan-utils.js +33 -55
  98. package/dist/src/command-line/release/version/version-actions.js +2 -1
  99. package/dist/src/command-line/release/version.js +5 -2
  100. package/dist/src/command-line/reset/reset.js +58 -62
  101. package/dist/src/command-line/run/executor-utils.js +1 -0
  102. package/dist/src/command-line/run/run-one.d.ts +20 -1
  103. package/dist/src/command-line/run/run-one.js +153 -5
  104. package/dist/src/command-line/run/run.js +2 -1
  105. package/dist/src/command-line/show/projects.js +5 -3
  106. package/dist/src/command-line/show/show-target/info.d.ts +10 -1
  107. package/dist/src/command-line/show/show-target/info.js +100 -15
  108. package/dist/src/command-line/show/show-target/inputs.js +10 -2
  109. package/dist/src/command-line/show/show-target/utils.js +1 -0
  110. package/dist/src/command-line/watch/command-object.js +3 -22
  111. package/dist/src/command-line/watch/watch.d.ts +0 -7
  112. package/dist/src/command-line/watch/watch.js +1 -1
  113. package/dist/src/command-line/yargs-utils/shared-options.js +1 -1
  114. package/dist/src/config/misc-interfaces.d.ts +18 -0
  115. package/dist/src/config/nx-json.d.ts +22 -11
  116. package/dist/src/config/task-graph.d.ts +1 -1
  117. package/dist/src/config/workspace-json-project-json.d.ts +88 -0
  118. package/dist/src/core/graph/main.js +1 -1
  119. package/dist/src/core/graph/runtime.js +1 -1
  120. package/dist/src/core/graph/styles.css +1 -1
  121. package/dist/src/core/graph/styles.js +1 -1
  122. package/dist/src/daemon/client/client.d.ts +15 -0
  123. package/dist/src/daemon/client/client.js +181 -71
  124. package/dist/src/daemon/client/daemon-socket-messenger.d.ts +1 -1
  125. package/dist/src/daemon/client/daemon-socket-messenger.js +2 -2
  126. package/dist/src/daemon/server/client-socket-context.js +1 -1
  127. package/dist/src/daemon/server/handle-process-in-background.js +21 -9
  128. package/dist/src/daemon/server/handle-select-affected-tasks.d.ts +2 -1
  129. package/dist/src/daemon/server/handle-select-affected-tasks.js +21 -13
  130. package/dist/src/daemon/server/native-js-loader.d.ts +1 -0
  131. package/dist/src/daemon/server/native-js-loader.js +21 -0
  132. package/dist/src/daemon/server/project-graph-incremental-recomputation.js +4 -8
  133. package/dist/src/daemon/server/server.d.ts +2 -1
  134. package/dist/src/daemon/server/server.js +17 -4
  135. package/dist/src/daemon/server/shutdown-utils.js +0 -3
  136. package/dist/src/daemon/server/start.d.ts +1 -0
  137. package/dist/src/daemon/server/start.js +2 -0
  138. package/dist/src/daemon/socket-utils.d.ts +11 -9
  139. package/dist/src/daemon/socket-utils.js +31 -61
  140. package/dist/src/daemon/tmp-dir.d.ts +19 -14
  141. package/dist/src/daemon/tmp-dir.js +142 -354
  142. package/dist/src/devkit-exports.d.ts +9 -1
  143. package/dist/src/devkit-exports.js +12 -1
  144. package/dist/src/devkit-internals.d.ts +6 -5
  145. package/dist/src/devkit-internals.js +13 -4
  146. package/dist/src/executors/run-commands/run-commands.impl.d.ts +4 -2
  147. package/dist/src/executors/run-commands/run-commands.impl.js +53 -27
  148. package/dist/src/executors/run-commands/running-tasks.d.ts +13 -4
  149. package/dist/src/executors/run-commands/running-tasks.js +148 -95
  150. package/dist/src/executors/run-commands/schema.json +1 -1
  151. package/dist/src/hasher/check-task-files.js +5 -8
  152. package/dist/src/hasher/file-hasher.js +9 -7
  153. package/dist/src/hasher/hash-task.js +4 -0
  154. package/dist/src/hasher/native-task-hasher-impl.js +3 -1
  155. package/dist/src/hasher/task-hasher.d.ts +2 -0
  156. package/dist/src/hasher/task-hasher.js +4 -1
  157. package/dist/src/migrations/update-23-2-0/set-cache-on-executor-target-defaults.d.ts +1 -2
  158. package/dist/src/migrations/update-23-2-0/set-cache-on-executor-target-defaults.js +6 -11
  159. package/dist/src/migrations/update-23-2-0/set-cache-on-executor-target-defaults.md +2 -2
  160. package/dist/src/migrations/update-24-0-0/enable-legacy-affected.d.ts +4 -0
  161. package/dist/src/migrations/update-24-0-0/enable-legacy-affected.js +15 -0
  162. package/dist/src/migrations/update-24-0-0/enable-legacy-affected.md +30 -0
  163. package/dist/src/migrations/update-24-0-0/find-custom-hashers.d.ts +3 -0
  164. package/dist/src/migrations/update-24-0-0/find-custom-hashers.js +100 -0
  165. package/dist/src/migrations/update-24-0-0/find-custom-hashers.md +63 -0
  166. package/dist/src/migrations/update-24-0-0/move-custom-hashers-to-inputs.md +146 -0
  167. package/dist/src/migrations/update-24-0-0/rename-ultracache-ignore-options.d.ts +3 -0
  168. package/dist/src/migrations/update-24-0-0/rename-ultracache-ignore-options.js +130 -0
  169. package/dist/src/migrations/update-24-0-0/rename-ultracache-ignore-options.md +62 -0
  170. package/dist/src/native/assert-supported-platform.js +1 -1
  171. package/dist/src/native/index.d.ts +238 -18
  172. package/dist/src/native/index.js +6 -1
  173. package/dist/src/native/native-bindings.js +15 -6
  174. package/dist/src/native/nx.openharmony-arm64.node +0 -0
  175. package/dist/src/native/nx.wasi-browser.js +1 -0
  176. package/dist/src/native/nx.wasi.cjs +1 -0
  177. package/dist/src/native/nx.wasm32-wasi.debug.wasm +0 -0
  178. package/dist/src/native/nx.wasm32-wasi.wasm +0 -0
  179. package/dist/src/nx-cloud/update-manager.d.ts +14 -0
  180. package/dist/src/nx-cloud/update-manager.js +237 -50
  181. package/dist/src/plugins/js/lock-file/pnpm-parser.js +3 -4
  182. package/dist/src/plugins/js/lock-file/pruned-output.d.ts +2 -2
  183. package/dist/src/plugins/js/lock-file/pruned-output.js +4 -4
  184. package/dist/src/plugins/js/utils/register.js +9 -4
  185. package/dist/src/project-graph/affected/affected-tasks.d.ts +9 -6
  186. package/dist/src/project-graph/affected/affected-tasks.js +31 -7
  187. package/dist/src/project-graph/plugins/isolation/isolated-plugin.js +7 -0
  188. package/dist/src/project-graph/plugins/loaded-nx-plugin.js +49 -6
  189. package/dist/src/project-graph/utils/project-configuration/target-merging.js +1 -1
  190. package/dist/src/project-graph/utils/project-configuration/target-normalization.js +12 -133
  191. package/dist/src/project-graph/utils/project-configuration-utils.js +2 -2
  192. package/dist/src/project-graph/utils/retrieve-workspace-files.js +27 -6
  193. package/dist/src/tasks-runner/create-task-graph.d.ts +8 -7
  194. package/dist/src/tasks-runner/create-task-graph.js +50 -27
  195. package/dist/src/tasks-runner/default-tasks-runner.js +1 -1
  196. package/dist/src/tasks-runner/init-tasks-runner.js +116 -59
  197. package/dist/src/tasks-runner/life-cycle.d.ts +4 -1
  198. package/dist/src/tasks-runner/life-cycle.js +7 -0
  199. package/dist/src/tasks-runner/life-cycles/performance-analysis.d.ts +5 -2
  200. package/dist/src/tasks-runner/life-cycles/performance-analysis.js +13 -7
  201. package/dist/src/tasks-runner/life-cycles/performance-life-cycle.d.ts +4 -3
  202. package/dist/src/tasks-runner/life-cycles/performance-life-cycle.js +9 -2
  203. package/dist/src/tasks-runner/life-cycles/static-run-many-terminal-output-life-cycle.js +5 -2
  204. package/dist/src/tasks-runner/life-cycles/static-run-one-terminal-output-life-cycle.js +4 -1
  205. package/dist/src/tasks-runner/life-cycles/summary-terminal-output-life-cycle.js +5 -1
  206. package/dist/src/tasks-runner/pseudo-ipc.d.ts +1 -0
  207. package/dist/src/tasks-runner/pseudo-ipc.js +4 -0
  208. package/dist/src/tasks-runner/pseudo-terminal.d.ts +1 -1
  209. package/dist/src/tasks-runner/pseudo-terminal.js +2 -2
  210. package/dist/src/tasks-runner/readiness/executor-ready-signal.d.ts +7 -0
  211. package/dist/src/tasks-runner/readiness/executor-ready-signal.js +43 -0
  212. package/dist/src/tasks-runner/readiness/probes.d.ts +14 -0
  213. package/dist/src/tasks-runner/readiness/probes.js +101 -0
  214. package/dist/src/tasks-runner/readiness/ready-signal-server.d.ts +18 -0
  215. package/dist/src/tasks-runner/readiness/ready-signal-server.js +72 -0
  216. package/dist/src/tasks-runner/readiness/ready-signal.d.ts +33 -0
  217. package/dist/src/tasks-runner/readiness/ready-signal.js +92 -0
  218. package/dist/src/tasks-runner/readiness/ready-when.d.ts +84 -0
  219. package/dist/src/tasks-runner/readiness/ready-when.js +371 -0
  220. package/dist/src/tasks-runner/readiness/startup-host.d.ts +1 -0
  221. package/dist/src/tasks-runner/readiness/startup-host.js +32 -0
  222. package/dist/src/tasks-runner/run-command.d.ts +6 -2
  223. package/dist/src/tasks-runner/run-command.js +21 -31
  224. package/dist/src/tasks-runner/run-outcome.d.ts +16 -0
  225. package/dist/src/tasks-runner/run-outcome.js +39 -0
  226. package/dist/src/tasks-runner/running-tasks/batch-process.js +6 -0
  227. package/dist/src/tasks-runner/running-tasks/node-child-process.js +5 -4
  228. package/dist/src/tasks-runner/running-tasks/running-task.d.ts +1 -1
  229. package/dist/src/tasks-runner/task-env.d.ts +10 -0
  230. package/dist/src/tasks-runner/task-env.js +37 -5
  231. package/dist/src/tasks-runner/task-graph-utils.d.ts +9 -6
  232. package/dist/src/tasks-runner/task-graph-utils.js +17 -12
  233. package/dist/src/tasks-runner/task-orchestrator.d.ts +62 -18
  234. package/dist/src/tasks-runner/task-orchestrator.js +750 -150
  235. package/dist/src/tasks-runner/tasks-runner.d.ts +1 -1
  236. package/dist/src/tasks-runner/tasks-schedule.d.ts +18 -1
  237. package/dist/src/tasks-runner/tasks-schedule.js +63 -6
  238. package/dist/src/tasks-runner/tokens.d.ts +54 -0
  239. package/dist/src/tasks-runner/tokens.js +161 -0
  240. package/dist/src/tasks-runner/utils.d.ts +35 -6
  241. package/dist/src/tasks-runner/utils.js +149 -68
  242. package/dist/src/ultracache/ci-status.d.ts +24 -0
  243. package/dist/src/ultracache/ci-status.js +87 -0
  244. package/dist/src/ultracache/config.d.ts +3 -3
  245. package/dist/src/ultracache/config.js +4 -4
  246. package/dist/src/ultracache/fetch.d.ts +2 -0
  247. package/dist/src/ultracache/fetch.js +1 -0
  248. package/dist/src/ultracache/overrides.js +4 -0
  249. package/dist/src/utils/acknowledge-build-scripts.d.ts +34 -1
  250. package/dist/src/utils/acknowledge-build-scripts.js +171 -32
  251. package/dist/src/utils/child-process.js +2 -1
  252. package/dist/src/utils/find-matching-projects.js +9 -6
  253. package/dist/src/utils/git-utils.d.ts +12 -5
  254. package/dist/src/utils/git-utils.js +69 -11
  255. package/dist/src/utils/long-running-target.d.ts +1 -3
  256. package/dist/src/utils/long-running-target.js +1 -3
  257. package/dist/src/utils/output.d.ts +4 -3
  258. package/dist/src/utils/output.js +4 -3
  259. package/dist/src/utils/owned-private-dir.d.ts +1 -17
  260. package/dist/src/utils/owned-private-dir.js +10 -62
  261. package/dist/src/utils/package-manager.d.ts +8 -0
  262. package/dist/src/utils/package-manager.js +65 -8
  263. package/dist/src/utils/perf-hooks.d.ts +1 -0
  264. package/dist/src/utils/plugins/core-plugins.js +5 -1
  265. package/dist/src/utils/progress-topics.d.ts +1 -0
  266. package/dist/src/utils/progress-topics.js +1 -0
  267. package/dist/src/utils/safe-spawn.js +1 -5
  268. package/dist/src/utils/shell-quoting.d.ts +8 -1
  269. package/dist/src/utils/shell-quoting.js +12 -1
  270. package/dist/src/utils/spawn-without-terminal.d.ts +27 -0
  271. package/dist/src/utils/spawn-without-terminal.js +110 -0
  272. package/dist/src/utils/string-similarity.d.ts +38 -0
  273. package/dist/src/utils/string-similarity.js +108 -0
  274. package/migrations.json +20 -6
  275. package/package.json +15 -24
  276. package/schemas/migrations-schema.json +11 -0
  277. package/schemas/nx-schema.json +133 -11
  278. package/schemas/project-schema.json +114 -4
  279. package/dist/src/command-line/migrate/agentic/prompts/generic-validation.d.ts +0 -56
  280. package/dist/src/command-line/migrate/agentic/prompts/generic-validation.js +0 -67
  281. package/dist/src/command-line/migrate/agentic/prompts/hybrid-prompt-migration.d.ts +0 -49
  282. package/dist/src/command-line/migrate/agentic/prompts/hybrid-prompt-migration.js +0 -53
  283. package/dist/src/command-line/migrate/agentic/prompts/prompt-migration.d.ts +0 -26
  284. package/dist/src/command-line/migrate/agentic/prompts/prompt-migration.js +0 -27
  285. package/dist/src/command-line/migrate/agentic/prompts/system-prompt.d.ts +0 -70
  286. package/dist/src/command-line/migrate/agentic/prompts/system-prompt.js +0 -113
  287. package/dist/src/command-line/migrate/agentic/run-step.d.ts +0 -68
  288. package/dist/src/command-line/migrate/agentic/run-step.js +0 -148
  289. package/dist/src/command-line/migrate/agentic/runner.d.ts +0 -21
  290. package/dist/src/command-line/migrate/agentic/runner.js +0 -262
  291. package/dist/src/migrations/update-23-0-0/consolidate-release-tag-config.d.ts +0 -9
  292. package/dist/src/migrations/update-23-0-0/consolidate-release-tag-config.js +0 -18
  293. package/dist/src/tasks-runner/legacy-depends-on-warning.d.ts +0 -18
  294. package/dist/src/tasks-runner/legacy-depends-on-warning.js +0 -109
@@ -20,7 +20,7 @@ export type TasksRunner<T = unknown> = (tasks: Task[], options: T, context?: {
20
20
  hasher?: TaskHasher;
21
21
  daemon?: DaemonClient;
22
22
  /** Tasks hashed only once the tasks they read outputs from have run. */
23
- deferredTaskIds?: ReadonlySet<string>;
23
+ hashingDeferredTaskIds?: ReadonlySet<string>;
24
24
  }) => any | Promise<{
25
25
  [id: string]: TaskStatus;
26
26
  }>;
@@ -2,16 +2,23 @@ import { DefaultTasksRunnerOptions } from './default-tasks-runner';
2
2
  import { Task, TaskGraph } from '../config/task-graph';
3
3
  import { ProjectGraph } from '../config/project-graph';
4
4
  import { ProjectConfiguration } from '../config/workspace-json-project-json';
5
+ import { TaskReadiness } from '../native';
5
6
  export interface Batch {
6
7
  id: string;
7
8
  executorName: string;
8
9
  taskGraph: TaskGraph;
9
10
  }
11
+ export interface TasksScheduleHooks {
12
+ readinessElsewhere?: (producerId: string) => TaskReadiness | null;
13
+ onReadinessHold?: (producerId: string) => void;
14
+ }
10
15
  export declare class TasksSchedule {
11
16
  private readonly projectGraph;
12
17
  private readonly projects;
13
18
  private readonly taskGraph;
14
19
  private readonly options;
20
+ private readonly fullTaskGraph;
21
+ private readonly hooks;
15
22
  private notScheduledTaskGraph;
16
23
  private reverseTaskDeps;
17
24
  private reverseProjectGraph;
@@ -19,14 +26,21 @@ export declare class TasksSchedule {
19
26
  private scheduledBatches;
20
27
  private scheduledTasks;
21
28
  private runningTasks;
29
+ private pendingStart;
22
30
  private completedTasks;
31
+ private readiness;
32
+ private probedProducers;
23
33
  private scheduleRequestsExecutionChain;
24
34
  private estimatedTaskTimings;
25
35
  private projectDependencies;
26
36
  private batchCounters;
27
- constructor(projectGraph: ProjectGraph, projects: Record<string, ProjectConfiguration>, taskGraph: TaskGraph, options: DefaultTasksRunnerOptions);
37
+ constructor(projectGraph: ProjectGraph, projects: Record<string, ProjectConfiguration>, taskGraph: TaskGraph, options: DefaultTasksRunnerOptions, fullTaskGraph?: TaskGraph, hooks?: TasksScheduleHooks);
28
38
  init(): Promise<void>;
29
39
  scheduleNextTasks(): Promise<void>;
40
+ markContinuousTaskStarted(taskId: string): void;
41
+ markReady(taskId: string): void;
42
+ markReadinessFailed(taskId: string): void;
43
+ markReadinessPending(taskId: string): void;
30
44
  hasTasks(): boolean;
31
45
  complete(taskIds: string[]): void;
32
46
  getAllScheduledTasks(): {
@@ -42,7 +56,10 @@ export declare class TasksSchedule {
42
56
  private scheduleBatches;
43
57
  private scheduleBatch;
44
58
  private processTaskForBatches;
59
+ private probedProducersOf;
60
+ private isProducerReady;
45
61
  private canBatchTaskBeScheduled;
62
+ private areContinuousDependenciesReady;
46
63
  private canBeScheduled;
47
64
  getEstimatedTaskTimings(): Record<string, number>;
48
65
  }
@@ -5,12 +5,15 @@ const utils_1 = require("./utils");
5
5
  const project_graph_utils_1 = require("../utils/project-graph-utils");
6
6
  const operators_1 = require("../project-graph/operators");
7
7
  const task_history_1 = require("../utils/task-history");
8
+ const ready_when_1 = require("./readiness/ready-when");
8
9
  class TasksSchedule {
9
- constructor(projectGraph, projects, taskGraph, options) {
10
+ constructor(projectGraph, projects, taskGraph, options, fullTaskGraph = taskGraph, hooks = {}) {
10
11
  this.projectGraph = projectGraph;
11
12
  this.projects = projects;
12
13
  this.taskGraph = taskGraph;
13
14
  this.options = options;
15
+ this.fullTaskGraph = fullTaskGraph;
16
+ this.hooks = hooks;
14
17
  this.notScheduledTaskGraph = this.taskGraph;
15
18
  this.reverseTaskDeps = (0, utils_1.calculateReverseDeps)(this.taskGraph);
16
19
  this.reverseProjectGraph = (0, operators_1.reverse)(this.projectGraph);
@@ -18,7 +21,13 @@ class TasksSchedule {
18
21
  this.scheduledBatches = [];
19
22
  this.scheduledTasks = [];
20
23
  this.runningTasks = new Set();
24
+ // Continuous tasks with ready edges, queued but not spawned; their
25
+ // dependents stay unreleased
26
+ this.pendingStart = new Set();
21
27
  this.completedTasks = new Set();
28
+ this.readiness = new Map();
29
+ // Read from the full graph: an agent worker's own graph has no edges
30
+ this.probedProducers = (0, ready_when_1.getReadyDependencies)(this.fullTaskGraph, this.projectGraph);
22
31
  this.scheduleRequestsExecutionChain = Promise.resolve();
23
32
  this.estimatedTaskTimings = {};
24
33
  this.projectDependencies = {};
@@ -38,6 +47,18 @@ class TasksSchedule {
38
47
  this.scheduleRequestsExecutionChain.then(() => this.scheduleTasks());
39
48
  await this.scheduleRequestsExecutionChain;
40
49
  }
50
+ markContinuousTaskStarted(taskId) {
51
+ this.pendingStart.delete(taskId);
52
+ }
53
+ markReady(taskId) {
54
+ this.readiness.set(taskId, 'ready');
55
+ }
56
+ markReadinessFailed(taskId) {
57
+ this.readiness.set(taskId, 'failed');
58
+ }
59
+ markReadinessPending(taskId) {
60
+ this.readiness.delete(taskId);
61
+ }
41
62
  hasTasks() {
42
63
  return (this.scheduledBatches.length +
43
64
  this.scheduledTasks.length +
@@ -116,6 +137,10 @@ class TasksSchedule {
116
137
  for (const taskId of taskIds) {
117
138
  this.scheduledTasks.push(taskId);
118
139
  this.runningTasks.add(taskId);
140
+ const task = this.taskGraph.tasks[taskId];
141
+ if (task.continuous && this.probedProducersOf(task).length > 0) {
142
+ this.pendingStart.add(taskId);
143
+ }
119
144
  }
120
145
  this.sortScheduledTasks();
121
146
  }
@@ -182,6 +207,15 @@ class TasksSchedule {
182
207
  if (!this.canBatchTaskBeScheduled(task, batches[rootExecutorName])) {
183
208
  return;
184
209
  }
210
+ // A batch never waits, so a task joins one once its probed producers are
211
+ // ready. A continuous task that something waits on, or that declares a
212
+ // probe, runs alone: only that path records its start and readiness
213
+ if ((task.continuous &&
214
+ (this.reverseTaskDeps[task.id].length > 0 ||
215
+ (0, ready_when_1.getReadyWhenConfig)(task, this.projectGraph) != null)) ||
216
+ this.probedProducersOf(task).some((id) => !this.isProducerReady(id))) {
217
+ return;
218
+ }
185
219
  const { batchImplementationFactory, preferBatch } = (0, utils_1.getExecutorForTask)(task, this.projects);
186
220
  const executorName = (0, utils_1.getExecutorNameForTask)(task, this.projectGraph);
187
221
  if (rootExecutorName !== executorName) {
@@ -222,17 +256,40 @@ class TasksSchedule {
222
256
  await this.processTaskForBatches(batches, depTask, rootExecutorName, false, visitedInBatch);
223
257
  }
224
258
  }
259
+ probedProducersOf(task) {
260
+ return this.probedProducers[task.id] ?? [];
261
+ }
262
+ isProducerReady(producerId) {
263
+ if (this.taskGraph.tasks[producerId]) {
264
+ return this.readiness.get(producerId) === 'ready';
265
+ }
266
+ return this.hooks.readinessElsewhere?.(producerId) === 1 /* TaskReadiness.Ready */;
267
+ }
225
268
  canBatchTaskBeScheduled(task, batchTaskGraph) {
226
269
  // task self needs to support parallelism (undefined defaults to parallel)
227
- // all deps have either completed or belong to the same batch
270
+ // all deps have either completed or belong to the same batch, and every
271
+ // continuous dep has started, and is ready where the edge asks for it
228
272
  return (task.parallelism !== false &&
229
- this.taskGraph.dependencies[task.id].every((id) => this.completedTasks.has(id) || !!batchTaskGraph?.tasks[id]));
273
+ this.taskGraph.dependencies[task.id].every(({ id }) => this.completedTasks.has(id) || !!batchTaskGraph?.tasks[id]) &&
274
+ this.areContinuousDependenciesReady(task.id));
275
+ }
276
+ // A producer outside this task graph is polled by the task itself
277
+ areContinuousDependenciesReady(taskId) {
278
+ const started = this.taskGraph.continuousDependencies[taskId].every(({ id }) => this.runningTasks.has(id) && !this.pendingStart.has(id));
279
+ if (!started) {
280
+ return false;
281
+ }
282
+ const pendingProducers = this.probedProducersOf(this.taskGraph.tasks[taskId]).filter((id) => this.taskGraph.tasks[id] && !this.readiness.has(id));
283
+ for (const producerId of pendingProducers) {
284
+ this.hooks.onReadinessHold?.(producerId);
285
+ }
286
+ return pendingProducers.length === 0;
230
287
  }
231
288
  canBeScheduled(taskId) {
232
- const hasDependenciesCompleted = this.taskGraph.dependencies[taskId].every((id) => this.completedTasks.has(id));
233
- const hasContinuousDependenciesStarted = this.taskGraph.continuousDependencies[taskId].every((id) => this.runningTasks.has(id));
289
+ const hasDependenciesCompleted = this.taskGraph.dependencies[taskId].every(({ id }) => this.completedTasks.has(id));
290
+ const continuousDependenciesReady = this.areContinuousDependenciesReady(taskId);
234
291
  // if dependencies have not completed, cannot schedule
235
- if (!hasDependenciesCompleted || !hasContinuousDependenciesStarted) {
292
+ if (!hasDependenciesCompleted || !continuousDependenciesReady) {
236
293
  return false;
237
294
  }
238
295
  // if there are no running tasks, can schedule anything
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Nx tokens are `{name}` or `{name.path}`, optionally followed by `??`
3
+ * fallbacks that resolve left to right: `{options.port ?? env.PORT ?? 4200}`.
4
+ * Only the last part can be a literal, and the literal can contain tokens.
5
+ * Braces that don't start with a token are text, so `${VAR}` or
6
+ * `{{.State.Health.Status}}` stay as written.
7
+ */
8
+ export type TokenNode = {
9
+ kind: 'text';
10
+ text: string;
11
+ } | Token;
12
+ export interface Token {
13
+ kind: 'token';
14
+ raw: string;
15
+ parts: TokenPart[];
16
+ }
17
+ export type TokenPart = Reference | {
18
+ kind: 'literal';
19
+ nodes: TokenNode[];
20
+ };
21
+ interface Reference {
22
+ kind: 'reference';
23
+ name: string;
24
+ path: string | undefined;
25
+ }
26
+ export interface TokenScope {
27
+ /** Whether `{name}` or `{name.path}` is a token. An `env.` fallback skips this check */
28
+ isToken(name: string, path: string | undefined): boolean;
29
+ /** The value of `{name}` or `{name.path}` */
30
+ read(name: string, path: string | undefined): unknown;
31
+ /**
32
+ * Where `env.` references read from. When absent, `env.` is not a token, so
33
+ * `{env.X}` stays text and a fallback `env.X` is a literal.
34
+ */
35
+ env?: {
36
+ read: () => NodeJS.ProcessEnv;
37
+ } | {
38
+ reject: () => Error;
39
+ };
40
+ /** The text of a token with no value and no literal fallback */
41
+ noValue(token: string): string;
42
+ /** Whether a value counts as unset, as `undefined`, `null` and `''` always do */
43
+ isUnset?(value: unknown): boolean;
44
+ /** The text of a value; defaults to `String(value)` */
45
+ toText?(value: unknown, token: string): string;
46
+ }
47
+ export declare function parseTokens(template: string, scope: TokenScope): TokenNode[];
48
+ export declare function resolveTokens(template: string, scope: TokenScope): string;
49
+ export declare function renderTokens(nodes: TokenNode[], scope: TokenScope): string;
50
+ export declare function resolveToken(token: Token, scope: TokenScope, renderLiteral: (nodes: TokenNode[]) => string): string;
51
+ /** Walks a dotted path; a missing step yields `undefined` */
52
+ export declare function readPath(value: unknown, path: string | undefined): unknown;
53
+ export declare function readEnv(env: NodeJS.ProcessEnv, name: string): string | undefined;
54
+ export {};
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseTokens = parseTokens;
4
+ exports.resolveTokens = resolveTokens;
5
+ exports.renderTokens = renderTokens;
6
+ exports.resolveToken = resolveToken;
7
+ exports.readPath = readPath;
8
+ exports.readEnv = readEnv;
9
+ function parseTokens(template, scope) {
10
+ const nodes = [];
11
+ let text = '';
12
+ let index = 0;
13
+ let open;
14
+ while ((open = template.indexOf('{', index)) !== -1) {
15
+ const close = findClosingBrace(template, open);
16
+ const node = close === -1 ? null : parseToken(template.slice(open, close + 1), scope);
17
+ if (!node) {
18
+ // Not a token, but a token can still sit inside it: `{a,{projectRoot}}`
19
+ text += template.slice(index, open + 1);
20
+ index = open + 1;
21
+ continue;
22
+ }
23
+ text += template.slice(index, open);
24
+ if (text) {
25
+ nodes.push({ kind: 'text', text });
26
+ }
27
+ text = '';
28
+ nodes.push(node);
29
+ index = close + 1;
30
+ }
31
+ text += template.slice(index);
32
+ if (text) {
33
+ nodes.push({ kind: 'text', text });
34
+ }
35
+ return nodes;
36
+ }
37
+ function resolveTokens(template, scope) {
38
+ return renderTokens(parseTokens(template, scope), scope);
39
+ }
40
+ function renderTokens(nodes, scope) {
41
+ return nodes
42
+ .map((node) => node.kind === 'text'
43
+ ? node.text
44
+ : resolveToken(node, scope, (literal) => renderTokens(literal, scope)))
45
+ .join('');
46
+ }
47
+ function resolveToken(token, scope, renderLiteral) {
48
+ for (const part of token.parts) {
49
+ if (part.kind === 'literal') {
50
+ return renderLiteral(part.nodes);
51
+ }
52
+ const value = part.name === 'env' && scope.env && 'read' in scope.env
53
+ ? readEnv(scope.env.read(), part.path)
54
+ : scope.read(part.name, part.path);
55
+ if (value !== undefined &&
56
+ value !== null &&
57
+ value !== '' &&
58
+ !scope.isUnset?.(value)) {
59
+ return scope.toText ? scope.toText(value, token.raw) : String(value);
60
+ }
61
+ }
62
+ return scope.noValue(token.raw);
63
+ }
64
+ /** Walks a dotted path; a missing step yields `undefined` */
65
+ function readPath(value, path) {
66
+ if (path === undefined) {
67
+ return value;
68
+ }
69
+ for (const key of path.split('.')) {
70
+ if (value === undefined ||
71
+ value === null ||
72
+ !Object.hasOwn(value, key)) {
73
+ return undefined;
74
+ }
75
+ value = value[key];
76
+ }
77
+ return value;
78
+ }
79
+ function parseToken(raw, scope) {
80
+ const sources = splitFallbacks(raw.slice(1, -1));
81
+ if (!parseReference(sources[0], scope, true)) {
82
+ return null;
83
+ }
84
+ const parts = sources.map((source, i) => {
85
+ const reference = parseReference(source, scope, i === 0);
86
+ if (reference) {
87
+ return reference;
88
+ }
89
+ if (i < sources.length - 1) {
90
+ throw new Error(`"${raw}" has a fallback after the literal "${source}" that can never be used`);
91
+ }
92
+ return { kind: 'literal', nodes: parseTokens(source, scope) };
93
+ });
94
+ if (scope.env && 'reject' in scope.env && readsEnv(parts)) {
95
+ throw scope.env.reject();
96
+ }
97
+ return { kind: 'token', raw, parts };
98
+ }
99
+ function readsEnv(parts) {
100
+ return parts.some((p) => p.kind === 'reference' && p.name === 'env');
101
+ }
102
+ // The names an env file can define, plus parentheses for Windows names such as
103
+ // `ProgramFiles(x86)`. A glob such as `{env.ts,env.d.ts}` stays text
104
+ const ENV_NAME = /^[\w.()-]+$/;
105
+ function parseReference(source, scope, first) {
106
+ const dot = source.indexOf('.');
107
+ const name = dot === -1 ? source : source.slice(0, dot);
108
+ const path = dot === -1 ? undefined : source.slice(dot + 1);
109
+ const isReference = name === 'env'
110
+ ? scope.env !== undefined &&
111
+ path !== undefined &&
112
+ ENV_NAME.test(path) &&
113
+ (!first || scope.isToken(name, path))
114
+ : scope.isToken(name, path);
115
+ return isReference ? { kind: 'reference', name, path } : null;
116
+ }
117
+ function findClosingBrace(template, open) {
118
+ let depth = 0;
119
+ for (let i = open; i < template.length; i++) {
120
+ if (template[i] === '{') {
121
+ depth++;
122
+ }
123
+ else if (template[i] === '}' && --depth === 0) {
124
+ return i;
125
+ }
126
+ }
127
+ return -1;
128
+ }
129
+ function splitFallbacks(expression) {
130
+ const parts = [];
131
+ let depth = 0;
132
+ let start = 0;
133
+ for (let i = 0; i < expression.length; i++) {
134
+ if (expression[i] === '{') {
135
+ depth++;
136
+ }
137
+ else if (expression[i] === '}') {
138
+ depth--;
139
+ }
140
+ else if (depth === 0 && expression.startsWith('??', i)) {
141
+ parts.push(expression.slice(start, i));
142
+ start = i + 2;
143
+ i++;
144
+ }
145
+ }
146
+ parts.push(expression.slice(start));
147
+ return parts.map((part) => part.trim());
148
+ }
149
+ // Windows env names are case-insensitive, but a copied env object keeps the
150
+ // spelling Windows reported (`Path`, not `PATH`)
151
+ function readEnv(env, name) {
152
+ if (Object.hasOwn(env, name)) {
153
+ return env[name];
154
+ }
155
+ if (process.platform !== 'win32') {
156
+ return undefined;
157
+ }
158
+ const upperName = name.toUpperCase();
159
+ const key = Object.keys(env).find((k) => k.toUpperCase() === upperName);
160
+ return key === undefined ? undefined : env[key];
161
+ }
@@ -2,7 +2,6 @@ import { CustomHasher, ExecutorConfig } from '../config/misc-interfaces';
2
2
  import { ProjectGraph, ProjectGraphProjectNode } from '../config/project-graph';
3
3
  import { Task, TaskGraph } from '../config/task-graph';
4
4
  import { ProjectConfiguration, TargetConfiguration, TargetDependencyConfig } from '../config/workspace-json-project-json';
5
- import { LegacyDependsOnLocation } from './legacy-depends-on-warning';
6
5
  export type NormalizedTargetDependencyConfig = TargetDependencyConfig & {
7
6
  projects: string[];
8
7
  };
@@ -10,9 +9,8 @@ export declare function getDependencyConfigs({ project, target }: {
10
9
  project: string;
11
10
  target: string;
12
11
  }, extraTargetDependencies: Record<string, (TargetDependencyConfig | string)[]>, projectGraph: ProjectGraph, allTargetNames: string[]): NormalizedTargetDependencyConfig[] | undefined;
13
- export type DependsOnEntryLocation = LegacyDependsOnLocation;
14
- export declare function normalizeDependencyConfigDefinition(definition: string | TargetDependencyConfig, currentProject: string, graph: ProjectGraph, allTargetNames: string[], location?: DependsOnEntryLocation): NormalizedTargetDependencyConfig[];
15
- export declare function normalizeDependencyConfigProjects(dependencyConfig: TargetDependencyConfig, currentProject: string, graph: ProjectGraph, location?: DependsOnEntryLocation): NormalizedTargetDependencyConfig;
12
+ export declare function normalizeDependencyConfigDefinition(definition: string | TargetDependencyConfig, currentProject: string, graph: ProjectGraph, allTargetNames: string[]): NormalizedTargetDependencyConfig[];
13
+ export declare function normalizeDependencyConfigProjects(dependencyConfig: TargetDependencyConfig, currentProject: string, graph: ProjectGraph): NormalizedTargetDependencyConfig;
16
14
  export declare function expandDependencyConfigSyntaxSugar(dependencyConfigString: string | TargetDependencyConfig, graph: ProjectGraph, currentProject?: string): TargetDependencyConfig;
17
15
  export declare function expandWildcardTargetConfiguration(dependencyConfig: NormalizedTargetDependencyConfig, allTargetNames: string[]): NormalizedTargetDependencyConfig[];
18
16
  export declare function readProjectAndTargetFromTargetString(targetString: string, projects: Record<string, ProjectGraphProjectNode>, currentProject?: string): {
@@ -20,7 +18,7 @@ export declare function readProjectAndTargetFromTargetString(targetString: strin
20
18
  target: string;
21
19
  };
22
20
  export declare function getOutputs(p: Record<string, ProjectGraphProjectNode>, target: Task['target'], overrides: Task['overrides']): string[];
23
- export declare function normalizeTargetDependencyWithStringProjects(dependencyConfig: TargetDependencyConfig, currentProject?: string, location?: DependsOnEntryLocation): Omit<TargetDependencyConfig, 'projects'> & {
21
+ export declare function normalizeTargetDependencyWithStringProjects(dependencyConfig: TargetDependencyConfig): Omit<TargetDependencyConfig, 'projects'> & {
24
22
  projects?: string[];
25
23
  };
26
24
  export declare function validateOutputs(outputs: string[]): void;
@@ -30,7 +28,21 @@ export declare function transformLegacyOutputs(projectRoot: string, outputs: str
30
28
  */
31
29
  export declare function getOutputsForTargetAndConfiguration(task: Task, node: ProjectGraphProjectNode): string[];
32
30
  export declare function getOutputsForTargetAndConfiguration(target: Task['target'] | Task, overrides: Task['overrides'] | ProjectGraphProjectNode, node: ProjectGraphProjectNode): string[];
33
- export declare function interpolate(template: string, data: any): string;
31
+ /**
32
+ * Resolves the tokens in a configured output, without its leading `!`. A token
33
+ * with no value stays as written.
34
+ */
35
+ export declare function interpolateOutput(output: string, node: ProjectGraphProjectNode, options: Record<string, unknown>): string;
36
+ /**
37
+ * Resolves Nx tokens in a path, where each token names a key of `data`
38
+ * (`{projectRoot}/dist`, `{options.outputPath ?? dist/{projectRoot}}`).
39
+ * Paths starting with `/` are returned as written. A token with no value
40
+ * stays as written. `env.` is text, unless `envNotAllowed` is given: then it
41
+ * throws with that message.
42
+ */
43
+ export declare function interpolate(template: string, data: any, options?: {
44
+ envNotAllowed?: (template: string) => string;
45
+ }): string;
34
46
  export declare function getTargetConfigurationForTask(task: Task, projectGraph: ProjectGraph): TargetConfiguration | undefined;
35
47
  export declare function getExecutorNameForTask(task: Task, projectGraph: ProjectGraph): string;
36
48
  /**
@@ -49,6 +61,8 @@ export declare function getExecutorForTask(task: Task, projects: Record<string,
49
61
  isNxExecutor: boolean;
50
62
  };
51
63
  export declare function getCustomHasher(task: Task, projects: Record<string, ProjectConfiguration>): CustomHasher | null;
64
+ /** Test-only: forget which executors have been warned about. */
65
+ export declare function resetCustomHasherDeprecationWarnings(): void;
52
66
  /**
53
67
  * `taskGraph` pruned to `required`, which must already hold its dependencies.
54
68
  * Unknown ids are ignored: a sync generator can remove a task after selection.
@@ -64,3 +78,18 @@ export declare function shouldStreamOutput(task: Task, initiatingProject: string
64
78
  export declare function isCacheableTask(task: Task): boolean;
65
79
  export declare function unparse(options: Object): string[];
66
80
  export declare function createTaskId(project: string, target: string, configuration: string | undefined): string;
81
+ /**
82
+ * Distinguishes two invocations of the same task for the recursive invocation
83
+ * detector. The task id alone would report `nx run app:build --flag` invoked
84
+ * from within `app:build` as a loop, so the detector pairs the id with this
85
+ * hash and only treats an exact repeat as an immediate loop.
86
+ *
87
+ * The hash cannot decide recursion on its own. Arguments that accumulate
88
+ * through forwarding (`app:build` -> `app:build hello` -> `app:build hello
89
+ * hello`) hash differently on every hop, so the tracker also bounds how many
90
+ * ancestors may be running one task id.
91
+ *
92
+ * `__overrides_unparsed__` is dropped, matching how the task hasher treats it:
93
+ * it restates the other keys as raw argv, down to flag order and spelling.
94
+ */
95
+ export declare function hashTaskOverrides(task: Task): string;