nx 19.6.0-canary.20240809-d3747e0 → 19.6.0-canary.20240814-6d83ae2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. package/bin/post-install.js +9 -0
  2. package/package.json +12 -12
  3. package/schemas/nx-schema.json +55 -4
  4. package/schemas/project-schema.json +7 -0
  5. package/src/adapter/compat.d.ts +1 -1
  6. package/src/adapter/compat.js +1 -0
  7. package/src/command-line/import/command-object.d.ts +2 -0
  8. package/src/command-line/import/command-object.js +38 -0
  9. package/src/command-line/import/import.d.ts +21 -0
  10. package/src/command-line/import/import.js +173 -0
  11. package/src/command-line/import/utils/merge-remote-source.d.ts +2 -0
  12. package/src/command-line/import/utils/merge-remote-source.js +14 -0
  13. package/src/command-line/import/utils/needs-install.d.ts +3 -0
  14. package/src/command-line/import/utils/needs-install.js +31 -0
  15. package/src/command-line/import/utils/prepare-source-repo.d.ts +2 -0
  16. package/src/command-line/import/utils/prepare-source-repo.js +104 -0
  17. package/src/command-line/init/init-v2.d.ts +7 -0
  18. package/src/command-line/init/init-v2.js +49 -16
  19. package/src/command-line/nx-commands.js +33 -28
  20. package/src/command-line/release/changelog.js +9 -9
  21. package/src/command-line/release/command-object.d.ts +12 -3
  22. package/src/command-line/release/command-object.js +16 -1
  23. package/src/command-line/release/config/config.js +4 -2
  24. package/src/command-line/release/config/filter-release-groups.d.ts +2 -2
  25. package/src/command-line/release/config/filter-release-groups.js +1 -1
  26. package/src/command-line/release/config/version-plans.d.ts +1 -1
  27. package/src/command-line/release/config/version-plans.js +12 -12
  28. package/src/command-line/release/plan-check.d.ts +4 -0
  29. package/src/command-line/release/plan-check.js +225 -0
  30. package/src/command-line/release/plan.js +1 -1
  31. package/src/command-line/release/release.js +3 -3
  32. package/src/command-line/release/version.js +1 -1
  33. package/src/command-line/sync/command-object.d.ts +6 -0
  34. package/src/command-line/sync/command-object.js +25 -0
  35. package/src/command-line/sync/sync.d.ts +6 -0
  36. package/src/command-line/sync/sync.js +30 -0
  37. package/src/command-line/yargs-utils/shared-options.d.ts +1 -1
  38. package/src/config/nx-json.d.ts +32 -2
  39. package/src/config/workspace-json-project-json.d.ts +5 -0
  40. package/src/core/graph/main.js +1 -1
  41. package/src/daemon/cache.d.ts +1 -0
  42. package/src/daemon/cache.js +25 -18
  43. package/src/daemon/client/client.d.ts +5 -0
  44. package/src/daemon/client/client.js +42 -1
  45. package/src/daemon/message-types/flush-sync-generator-changes-to-disk.d.ts +6 -0
  46. package/src/daemon/message-types/flush-sync-generator-changes-to-disk.js +11 -0
  47. package/src/daemon/message-types/force-shutdown.d.ts +5 -0
  48. package/src/daemon/message-types/force-shutdown.js +11 -0
  49. package/src/daemon/message-types/get-registered-sync-generators.d.ts +5 -0
  50. package/src/daemon/message-types/get-registered-sync-generators.js +11 -0
  51. package/src/daemon/message-types/get-sync-generator-changes.d.ts +6 -0
  52. package/src/daemon/message-types/get-sync-generator-changes.js +11 -0
  53. package/src/daemon/message-types/update-workspace-context.d.ts +8 -0
  54. package/src/daemon/message-types/update-workspace-context.js +11 -0
  55. package/src/daemon/server/handle-flush-sync-generator-changes-to-disk.d.ts +2 -0
  56. package/src/daemon/server/handle-flush-sync-generator-changes-to-disk.js +11 -0
  57. package/src/daemon/server/handle-force-shutdown.d.ts +5 -0
  58. package/src/daemon/server/handle-force-shutdown.js +18 -0
  59. package/src/daemon/server/handle-get-registered-sync-generators.d.ts +2 -0
  60. package/src/daemon/server/handle-get-registered-sync-generators.js +11 -0
  61. package/src/daemon/server/handle-get-sync-generator-changes.d.ts +2 -0
  62. package/src/daemon/server/handle-get-sync-generator-changes.js +17 -0
  63. package/src/daemon/server/handle-request-shutdown.js +2 -0
  64. package/src/daemon/server/handle-update-workspace-context.d.ts +2 -0
  65. package/src/daemon/server/handle-update-workspace-context.js +11 -0
  66. package/src/daemon/server/project-graph-incremental-recomputation.d.ts +1 -0
  67. package/src/daemon/server/project-graph-incremental-recomputation.js +20 -3
  68. package/src/daemon/server/server.d.ts +1 -0
  69. package/src/daemon/server/server.js +39 -0
  70. package/src/daemon/server/shutdown-utils.d.ts +2 -1
  71. package/src/daemon/server/shutdown-utils.js +11 -4
  72. package/src/daemon/server/sync-generators.d.ts +6 -0
  73. package/src/daemon/server/sync-generators.js +202 -0
  74. package/src/daemon/server/watcher.js +3 -0
  75. package/src/daemon/socket-utils.js +18 -5
  76. package/src/daemon/tmp-dir.js +2 -1
  77. package/src/native/nx.wasm32-wasi.wasm +0 -0
  78. package/src/nx-cloud/generators/connect-to-nx-cloud/connect-to-nx-cloud.js +1 -1
  79. package/src/nx-cloud/models/onboarding-status.d.ts +1 -0
  80. package/src/nx-cloud/models/onboarding-status.js +2 -0
  81. package/src/nx-cloud/utilities/is-workspace-claimed.d.ts +1 -0
  82. package/src/nx-cloud/utilities/is-workspace-claimed.js +24 -0
  83. package/src/nx-cloud/utilities/onboarding.d.ts +5 -0
  84. package/src/nx-cloud/utilities/onboarding.js +28 -0
  85. package/src/project-graph/plugins/internal-api.js +16 -5
  86. package/src/project-graph/plugins/isolation/messaging.d.ts +5 -1
  87. package/src/project-graph/plugins/isolation/messaging.js +1 -0
  88. package/src/project-graph/plugins/isolation/plugin-pool.js +4 -6
  89. package/src/project-graph/plugins/isolation/plugin-worker.js +15 -0
  90. package/src/project-graph/utils/project-configuration-utils.js +5 -2
  91. package/src/tasks-runner/run-command.d.ts +1 -1
  92. package/src/tasks-runner/run-command.js +117 -2
  93. package/src/utils/command-line-utils.d.ts +1 -0
  94. package/src/utils/command-line-utils.js +6 -3
  95. package/src/utils/git-utils.d.ts +35 -0
  96. package/src/utils/git-utils.js +111 -0
  97. package/src/utils/package-manager.js +1 -1
  98. package/src/utils/plugins/output.js +1 -1
  99. package/src/utils/squash.d.ts +1 -0
  100. package/src/utils/squash.js +12 -0
  101. package/src/utils/sync-generators.d.ts +22 -0
  102. package/src/utils/sync-generators.js +161 -0
  103. package/src/utils/workspace-context.d.ts +2 -1
  104. package/src/utils/workspace-context.js +18 -1
  105. package/src/daemon/message-types/update-context-files.d.ts +0 -7
  106. package/src/daemon/message-types/update-context-files.js +0 -11
@@ -5,5 +5,6 @@ export declare const serverProcessJsonPath: string;
5
5
  export declare function readDaemonProcessJsonCache(): Promise<DaemonProcessJson | null>;
6
6
  export declare function deleteDaemonJsonProcessCache(): void;
7
7
  export declare function writeDaemonJsonProcessCache(daemonJson: DaemonProcessJson): Promise<void>;
8
+ export declare function waitForDaemonToExitAndCleanupProcessJson(): Promise<void>;
8
9
  export declare function safelyCleanUpExistingProcess(): Promise<void>;
9
10
  export declare function getDaemonProcessIdSync(): number | null;
@@ -4,6 +4,7 @@ exports.serverProcessJsonPath = void 0;
4
4
  exports.readDaemonProcessJsonCache = readDaemonProcessJsonCache;
5
5
  exports.deleteDaemonJsonProcessCache = deleteDaemonJsonProcessCache;
6
6
  exports.writeDaemonJsonProcessCache = writeDaemonJsonProcessCache;
7
+ exports.waitForDaemonToExitAndCleanupProcessJson = waitForDaemonToExitAndCleanupProcessJson;
7
8
  exports.safelyCleanUpExistingProcess = safelyCleanUpExistingProcess;
8
9
  exports.getDaemonProcessIdSync = getDaemonProcessIdSync;
9
10
  const fs_extra_1 = require("fs-extra");
@@ -27,33 +28,39 @@ function deleteDaemonJsonProcessCache() {
27
28
  async function writeDaemonJsonProcessCache(daemonJson) {
28
29
  await (0, fs_extra_1.writeJson)(exports.serverProcessJsonPath, daemonJson);
29
30
  }
31
+ async function waitForDaemonToExitAndCleanupProcessJson() {
32
+ const daemonProcessJson = await readDaemonProcessJsonCache();
33
+ if (daemonProcessJson && daemonProcessJson.processId) {
34
+ await new Promise((resolve, reject) => {
35
+ let count = 0;
36
+ const interval = setInterval(() => {
37
+ try {
38
+ // sending a signal 0 to a process checks if the process is running instead of actually killing it
39
+ process.kill(daemonProcessJson.processId, 0);
40
+ }
41
+ catch (e) {
42
+ clearInterval(interval);
43
+ resolve();
44
+ }
45
+ if ((count += 1) > 200) {
46
+ clearInterval(interval);
47
+ reject(`Daemon process ${daemonProcessJson.processId} didn't exit after 2 seconds.`);
48
+ }
49
+ }, 10);
50
+ });
51
+ deleteDaemonJsonProcessCache();
52
+ }
53
+ }
30
54
  async function safelyCleanUpExistingProcess() {
31
55
  const daemonProcessJson = await readDaemonProcessJsonCache();
32
56
  if (daemonProcessJson && daemonProcessJson.processId) {
33
57
  try {
34
58
  process.kill(daemonProcessJson.processId);
35
59
  // we wait for the process to actually shut down before returning
36
- await new Promise((resolve, reject) => {
37
- let count = 0;
38
- const interval = setInterval(() => {
39
- try {
40
- // sending a signal 0 to a process checks if the process is running instead of actually killing it
41
- process.kill(daemonProcessJson.processId, 0);
42
- }
43
- catch (e) {
44
- clearInterval(interval);
45
- resolve();
46
- }
47
- if ((count += 1) > 200) {
48
- clearInterval(interval);
49
- reject(`Daemon process ${daemonProcessJson.processId} didn't exit after 2 seconds.`);
50
- }
51
- }, 10);
52
- });
60
+ await waitForDaemonToExitAndCleanupProcessJson();
53
61
  }
54
62
  catch { }
55
63
  }
56
- deleteDaemonJsonProcessCache();
57
64
  }
58
65
  // Must be sync for the help output use case
59
66
  function getDaemonProcessIdSync() {
@@ -5,6 +5,7 @@ import { Task, TaskGraph } from '../../config/task-graph';
5
5
  import { ConfigurationSourceMaps } from '../../project-graph/utils/project-configuration-utils';
6
6
  import { NxWorkspaceFiles } from '../../native';
7
7
  import { TaskRun } from '../../utils/task-history';
8
+ import type { SyncGeneratorChangesResult } from '../../utils/sync-generators';
8
9
  export type UnregisterCallback = () => void;
9
10
  export type ChangedFile = {
10
11
  path: string;
@@ -54,6 +55,10 @@ export declare class DaemonClient {
54
55
  [hash: string]: TaskRun[];
55
56
  }>;
56
57
  writeTaskRunsToHistory(taskRuns: TaskRun[]): Promise<void>;
58
+ getSyncGeneratorChanges(generators: string[]): Promise<SyncGeneratorChangesResult[]>;
59
+ flushSyncGeneratorChangesToDisk(generators: string[]): Promise<void>;
60
+ getRegisteredSyncGenerators(): Promise<string[]>;
61
+ updateWorkspaceContext(createdFiles: string[], updatedFiles: string[], deletedFiles: string[]): Promise<void>;
57
62
  isServerAvailable(): Promise<boolean>;
58
63
  private sendToDaemonViaQueue;
59
64
  private setUpConnection;
@@ -25,6 +25,11 @@ const get_nx_workspace_files_1 = require("../message-types/get-nx-workspace-file
25
25
  const get_context_file_data_1 = require("../message-types/get-context-file-data");
26
26
  const get_files_in_directory_1 = require("../message-types/get-files-in-directory");
27
27
  const hash_glob_1 = require("../message-types/hash-glob");
28
+ const force_shutdown_1 = require("../message-types/force-shutdown");
29
+ const get_sync_generator_changes_1 = require("../message-types/get-sync-generator-changes");
30
+ const get_registered_sync_generators_1 = require("../message-types/get-registered-sync-generators");
31
+ const update_workspace_context_1 = require("../message-types/update-workspace-context");
32
+ const flush_sync_generator_changes_to_disk_1 = require("../message-types/flush-sync-generator-changes-to-disk");
28
33
  const DAEMON_ENV_SETTINGS = {
29
34
  NX_PROJECT_GLOB_CACHE: 'false',
30
35
  NX_CACHE_PROJECTS_CONFIG: 'false',
@@ -244,6 +249,35 @@ class DaemonClient {
244
249
  };
245
250
  return this.sendMessageToDaemon(message);
246
251
  }
252
+ getSyncGeneratorChanges(generators) {
253
+ const message = {
254
+ type: get_sync_generator_changes_1.GET_SYNC_GENERATOR_CHANGES,
255
+ generators,
256
+ };
257
+ return this.sendToDaemonViaQueue(message);
258
+ }
259
+ flushSyncGeneratorChangesToDisk(generators) {
260
+ const message = {
261
+ type: flush_sync_generator_changes_to_disk_1.FLUSH_SYNC_GENERATOR_CHANGES_TO_DISK,
262
+ generators,
263
+ };
264
+ return this.sendToDaemonViaQueue(message);
265
+ }
266
+ getRegisteredSyncGenerators() {
267
+ const message = {
268
+ type: get_registered_sync_generators_1.GET_REGISTERED_SYNC_GENERATORS,
269
+ };
270
+ return this.sendToDaemonViaQueue(message);
271
+ }
272
+ updateWorkspaceContext(createdFiles, updatedFiles, deletedFiles) {
273
+ const message = {
274
+ type: update_workspace_context_1.UPDATE_WORKSPACE_CONTEXT,
275
+ createdFiles,
276
+ updatedFiles,
277
+ deletedFiles,
278
+ };
279
+ return this.sendToDaemonViaQueue(message);
280
+ }
247
281
  async isServerAvailable() {
248
282
  return new Promise((resolve) => {
249
283
  try {
@@ -322,12 +356,18 @@ class DaemonClient {
322
356
  else if (this._daemonStatus == DaemonStatus.CONNECTING) {
323
357
  await this._waitForDaemonReady;
324
358
  }
359
+ // An open promise isn't enough to keep the event loop
360
+ // alive, so we set a timeout here and clear it when we hear
361
+ // back
362
+ const keepAlive = setTimeout(() => { }, 10 * 60 * 1000);
325
363
  return new Promise((resolve, reject) => {
326
364
  perf_hooks_1.performance.mark('sendMessageToDaemon-start');
327
365
  this.currentMessage = message;
328
366
  this.currentResolve = resolve;
329
367
  this.currentReject = reject;
330
368
  this.socketMessenger.sendMessage(message);
369
+ }).finally(() => {
370
+ clearTimeout(keepAlive);
331
371
  });
332
372
  }
333
373
  handleMessage(serializedResult) {
@@ -398,7 +438,8 @@ class DaemonClient {
398
438
  }
399
439
  async stop() {
400
440
  try {
401
- await (0, cache_1.safelyCleanUpExistingProcess)();
441
+ await this.sendMessageToDaemon({ type: force_shutdown_1.FORCE_SHUTDOWN });
442
+ await (0, cache_1.waitForDaemonToExitAndCleanupProcessJson)();
402
443
  }
403
444
  catch (err) {
404
445
  output_1.output.error({
@@ -0,0 +1,6 @@
1
+ export declare const FLUSH_SYNC_GENERATOR_CHANGES_TO_DISK: "CLEAR_CACHED_SYNC_GENERATOR_CHANGES";
2
+ export type HandleFlushSyncGeneratorChangesToDiskMessage = {
3
+ type: typeof FLUSH_SYNC_GENERATOR_CHANGES_TO_DISK;
4
+ generators: string[];
5
+ };
6
+ export declare function isHandleFlushSyncGeneratorChangesToDiskMessage(message: unknown): message is HandleFlushSyncGeneratorChangesToDiskMessage;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FLUSH_SYNC_GENERATOR_CHANGES_TO_DISK = void 0;
4
+ exports.isHandleFlushSyncGeneratorChangesToDiskMessage = isHandleFlushSyncGeneratorChangesToDiskMessage;
5
+ exports.FLUSH_SYNC_GENERATOR_CHANGES_TO_DISK = 'CLEAR_CACHED_SYNC_GENERATOR_CHANGES';
6
+ function isHandleFlushSyncGeneratorChangesToDiskMessage(message) {
7
+ return (typeof message === 'object' &&
8
+ message !== null &&
9
+ 'type' in message &&
10
+ message['type'] === exports.FLUSH_SYNC_GENERATOR_CHANGES_TO_DISK);
11
+ }
@@ -0,0 +1,5 @@
1
+ export declare const FORCE_SHUTDOWN: "FORCE_SHUTDOWN";
2
+ export type HandleForceShutdownMessage = {
3
+ type: typeof FORCE_SHUTDOWN;
4
+ };
5
+ export declare function isHandleForceShutdownMessage(message: unknown): message is HandleForceShutdownMessage;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FORCE_SHUTDOWN = void 0;
4
+ exports.isHandleForceShutdownMessage = isHandleForceShutdownMessage;
5
+ exports.FORCE_SHUTDOWN = 'FORCE_SHUTDOWN';
6
+ function isHandleForceShutdownMessage(message) {
7
+ return (typeof message === 'object' &&
8
+ message !== null &&
9
+ 'type' in message &&
10
+ message['type'] === exports.FORCE_SHUTDOWN);
11
+ }
@@ -0,0 +1,5 @@
1
+ export declare const GET_REGISTERED_SYNC_GENERATORS: "GET_REGISTERED_SYNC_GENERATORS";
2
+ export type HandleGetRegisteredSyncGeneratorsMessage = {
3
+ type: typeof GET_REGISTERED_SYNC_GENERATORS;
4
+ };
5
+ export declare function isHandleGetRegisteredSyncGeneratorsMessage(message: unknown): message is HandleGetRegisteredSyncGeneratorsMessage;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET_REGISTERED_SYNC_GENERATORS = void 0;
4
+ exports.isHandleGetRegisteredSyncGeneratorsMessage = isHandleGetRegisteredSyncGeneratorsMessage;
5
+ exports.GET_REGISTERED_SYNC_GENERATORS = 'GET_REGISTERED_SYNC_GENERATORS';
6
+ function isHandleGetRegisteredSyncGeneratorsMessage(message) {
7
+ return (typeof message === 'object' &&
8
+ message !== null &&
9
+ 'type' in message &&
10
+ message['type'] === exports.GET_REGISTERED_SYNC_GENERATORS);
11
+ }
@@ -0,0 +1,6 @@
1
+ export declare const GET_SYNC_GENERATOR_CHANGES: "GET_SYNC_GENERATOR_CHANGES";
2
+ export type HandleGetSyncGeneratorChangesMessage = {
3
+ type: typeof GET_SYNC_GENERATOR_CHANGES;
4
+ generators: string[];
5
+ };
6
+ export declare function isHandleGetSyncGeneratorChangesMessage(message: unknown): message is HandleGetSyncGeneratorChangesMessage;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET_SYNC_GENERATOR_CHANGES = void 0;
4
+ exports.isHandleGetSyncGeneratorChangesMessage = isHandleGetSyncGeneratorChangesMessage;
5
+ exports.GET_SYNC_GENERATOR_CHANGES = 'GET_SYNC_GENERATOR_CHANGES';
6
+ function isHandleGetSyncGeneratorChangesMessage(message) {
7
+ return (typeof message === 'object' &&
8
+ message !== null &&
9
+ 'type' in message &&
10
+ message['type'] === exports.GET_SYNC_GENERATOR_CHANGES);
11
+ }
@@ -0,0 +1,8 @@
1
+ export declare const UPDATE_WORKSPACE_CONTEXT: "UPDATE_WORKSPACE_CONTEXT";
2
+ export type HandleUpdateWorkspaceContextMessage = {
3
+ type: typeof UPDATE_WORKSPACE_CONTEXT;
4
+ createdFiles: string[];
5
+ updatedFiles: string[];
6
+ deletedFiles: string[];
7
+ };
8
+ export declare function isHandleUpdateWorkspaceContextMessage(message: unknown): message is HandleUpdateWorkspaceContextMessage;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UPDATE_WORKSPACE_CONTEXT = void 0;
4
+ exports.isHandleUpdateWorkspaceContextMessage = isHandleUpdateWorkspaceContextMessage;
5
+ exports.UPDATE_WORKSPACE_CONTEXT = 'UPDATE_WORKSPACE_CONTEXT';
6
+ function isHandleUpdateWorkspaceContextMessage(message) {
7
+ return (typeof message === 'object' &&
8
+ message !== null &&
9
+ 'type' in message &&
10
+ message['type'] === exports.UPDATE_WORKSPACE_CONTEXT);
11
+ }
@@ -0,0 +1,2 @@
1
+ import type { HandlerResult } from './server';
2
+ export declare function handleFlushSyncGeneratorChangesToDisk(generators: string[]): Promise<HandlerResult>;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleFlushSyncGeneratorChangesToDisk = handleFlushSyncGeneratorChangesToDisk;
4
+ const sync_generators_1 = require("./sync-generators");
5
+ async function handleFlushSyncGeneratorChangesToDisk(generators) {
6
+ await (0, sync_generators_1.flushSyncGeneratorChangesToDisk)(generators);
7
+ return {
8
+ response: '{}',
9
+ description: 'handleFlushSyncGeneratorChangesToDisk',
10
+ };
11
+ }
@@ -0,0 +1,5 @@
1
+ import { Server } from 'net';
2
+ export declare function handleForceShutdown(server: Server): Promise<{
3
+ description: string;
4
+ response: string;
5
+ }>;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleForceShutdown = handleForceShutdown;
4
+ const shutdown_utils_1 = require("./shutdown-utils");
5
+ const server_1 = require("./server");
6
+ async function handleForceShutdown(server) {
7
+ setTimeout(async () => {
8
+ await (0, shutdown_utils_1.handleServerProcessTermination)({
9
+ server,
10
+ reason: 'Request to shutdown',
11
+ sockets: server_1.openSockets,
12
+ });
13
+ });
14
+ return {
15
+ description: 'Shutdown initiated',
16
+ response: '{}',
17
+ };
18
+ }
@@ -0,0 +1,2 @@
1
+ import type { HandlerResult } from './server';
2
+ export declare function handleGetRegisteredSyncGenerators(): Promise<HandlerResult>;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleGetRegisteredSyncGenerators = handleGetRegisteredSyncGenerators;
4
+ const sync_generators_1 = require("./sync-generators");
5
+ async function handleGetRegisteredSyncGenerators() {
6
+ const syncGenerators = await (0, sync_generators_1.getCachedRegisteredSyncGenerators)();
7
+ return {
8
+ response: JSON.stringify(syncGenerators),
9
+ description: 'handleGetSyncGeneratorChanges',
10
+ };
11
+ }
@@ -0,0 +1,2 @@
1
+ import type { HandlerResult } from './server';
2
+ export declare function handleGetSyncGeneratorChanges(generators: string[]): Promise<HandlerResult>;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleGetSyncGeneratorChanges = handleGetSyncGeneratorChanges;
4
+ const sync_generators_1 = require("./sync-generators");
5
+ async function handleGetSyncGeneratorChanges(generators) {
6
+ const changes = await (0, sync_generators_1.getCachedSyncGeneratorChanges)(generators);
7
+ // strip out the content of the changes and any potential callback
8
+ const result = changes.map((change) => ({
9
+ generatorName: change.generatorName,
10
+ changes: change.changes.map((c) => ({ ...c, content: null })),
11
+ outOfSyncMessage: change.outOfSyncMessage,
12
+ }));
13
+ return {
14
+ response: JSON.stringify(result),
15
+ description: 'handleGetSyncGeneratorChanges',
16
+ };
17
+ }
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.handleRequestShutdown = handleRequestShutdown;
4
4
  const shutdown_utils_1 = require("./shutdown-utils");
5
+ const server_1 = require("./server");
5
6
  async function handleRequestShutdown(server, numberOfConnections) {
6
7
  // 1 connection is the client asking to shut down
7
8
  if (numberOfConnections > 1) {
@@ -15,6 +16,7 @@ async function handleRequestShutdown(server, numberOfConnections) {
15
16
  await (0, shutdown_utils_1.handleServerProcessTermination)({
16
17
  server,
17
18
  reason: 'Request to shutdown',
19
+ sockets: server_1.openSockets,
18
20
  });
19
21
  }, 0);
20
22
  return {
@@ -0,0 +1,2 @@
1
+ import type { HandlerResult } from './server';
2
+ export declare function handleUpdateWorkspaceContext(createdFiles: string[], updatedFiles: string[], deletedFiles: string[]): Promise<HandlerResult>;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleUpdateWorkspaceContext = handleUpdateWorkspaceContext;
4
+ const project_graph_incremental_recomputation_1 = require("./project-graph-incremental-recomputation");
5
+ async function handleUpdateWorkspaceContext(createdFiles, updatedFiles, deletedFiles) {
6
+ (0, project_graph_incremental_recomputation_1.addUpdatedAndDeletedFiles)(createdFiles, updatedFiles, deletedFiles);
7
+ return {
8
+ response: '{}',
9
+ description: 'handleUpdateContextFiles',
10
+ };
11
+ }
@@ -20,4 +20,5 @@ export declare let currentProjectFileMapCache: FileMapCache | undefined;
20
20
  export declare let currentProjectGraph: ProjectGraph | undefined;
21
21
  export declare function getCachedSerializedProjectGraphPromise(): Promise<SerializedProjectGraph>;
22
22
  export declare function addUpdatedAndDeletedFiles(createdFiles: string[], updatedFiles: string[], deletedFiles: string[]): void;
23
+ export declare function registerProjectGraphRecomputationListener(listener: (projectGraph: ProjectGraph) => void): void;
23
24
  export {};
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.currentProjectGraph = exports.currentProjectFileMapCache = exports.fileMapWithFiles = void 0;
4
4
  exports.getCachedSerializedProjectGraphPromise = getCachedSerializedProjectGraphPromise;
5
5
  exports.addUpdatedAndDeletedFiles = addUpdatedAndDeletedFiles;
6
+ exports.registerProjectGraphRecomputationListener = registerProjectGraphRecomputationListener;
6
7
  const perf_hooks_1 = require("perf_hooks");
7
8
  const nx_json_1 = require("../../config/nx-json");
8
9
  const file_hasher_1 = require("../../hasher/file-hasher");
@@ -20,14 +21,17 @@ const error_types_1 = require("../../project-graph/error-types");
20
21
  let cachedSerializedProjectGraphPromise;
21
22
  const collectedUpdatedFiles = new Set();
22
23
  const collectedDeletedFiles = new Set();
24
+ const projectGraphRecomputationListeners = new Set();
23
25
  let storedWorkspaceConfigHash;
24
26
  let waitPeriod = 100;
25
27
  let scheduledTimeoutId;
26
28
  let knownExternalNodes = {};
27
29
  async function getCachedSerializedProjectGraphPromise() {
28
30
  try {
31
+ let wasScheduled = false;
29
32
  // recomputing it now on demand. we can ignore the scheduled timeout
30
33
  if (scheduledTimeoutId) {
34
+ wasScheduled = true;
31
35
  clearTimeout(scheduledTimeoutId);
32
36
  scheduledTimeoutId = undefined;
33
37
  }
@@ -45,7 +49,11 @@ async function getCachedSerializedProjectGraphPromise() {
45
49
  cachedSerializedProjectGraphPromise =
46
50
  processFilesAndCreateAndSerializeProjectGraph(plugins);
47
51
  }
48
- return await cachedSerializedProjectGraphPromise;
52
+ const result = await cachedSerializedProjectGraphPromise;
53
+ if (wasScheduled) {
54
+ notifyProjectGraphRecomputationListeners(result.projectGraph);
55
+ }
56
+ return result;
49
57
  }
50
58
  catch (e) {
51
59
  return {
@@ -83,13 +91,17 @@ function addUpdatedAndDeletedFiles(createdFiles, updatedFiles, deletedFiles) {
83
91
  }
84
92
  cachedSerializedProjectGraphPromise =
85
93
  processFilesAndCreateAndSerializeProjectGraph(await (0, plugins_1.getPlugins)());
86
- await cachedSerializedProjectGraphPromise;
94
+ const { projectGraph } = await cachedSerializedProjectGraphPromise;
87
95
  if (createdFiles.length > 0) {
88
96
  (0, file_watcher_sockets_1.notifyFileWatcherSockets)(createdFiles, null, null);
89
97
  }
98
+ notifyProjectGraphRecomputationListeners(projectGraph);
90
99
  }, waitPeriod);
91
100
  }
92
101
  }
102
+ function registerProjectGraphRecomputationListener(listener) {
103
+ projectGraphRecomputationListeners.add(listener);
104
+ }
93
105
  function computeWorkspaceConfigHash(projectsConfigurations) {
94
106
  const projectConfigurationStrings = Object.entries(projectsConfigurations)
95
107
  .sort(([projectNameA], [projectNameB]) => projectNameA.localeCompare(projectNameB))
@@ -134,7 +146,7 @@ async function processFilesAndCreateAndSerializeProjectGraph(plugins) {
134
146
  perf_hooks_1.performance.mark('hash-watched-changes-start');
135
147
  const updatedFiles = [...collectedUpdatedFiles.values()];
136
148
  const deletedFiles = [...collectedDeletedFiles.values()];
137
- let updatedFileHashes = (0, workspace_context_1.updateFilesInContext)(updatedFiles, deletedFiles);
149
+ let updatedFileHashes = (0, workspace_context_1.updateFilesInContext)(workspace_root_1.workspaceRoot, updatedFiles, deletedFiles);
138
150
  perf_hooks_1.performance.mark('hash-watched-changes-end');
139
151
  perf_hooks_1.performance.measure('hash changed files from watcher', 'hash-watched-changes-start', 'hash-watched-changes-end');
140
152
  logger_1.serverLogger.requestLog(`Updated workspace context based on watched changes, recomputing project graph...`);
@@ -281,3 +293,8 @@ async function resetInternalStateIfNxDepsMissing() {
281
293
  await resetInternalState();
282
294
  }
283
295
  }
296
+ function notifyProjectGraphRecomputationListeners(projectGraph) {
297
+ for (const listener of projectGraphRecomputationListeners) {
298
+ listener(projectGraph);
299
+ }
300
+ }
@@ -4,5 +4,6 @@ export type HandlerResult = {
4
4
  error?: any;
5
5
  response?: string;
6
6
  };
7
+ export declare const openSockets: Set<Socket>;
7
8
  export declare function handleResult(socket: Socket, type: string, hrFn: () => Promise<HandlerResult>): Promise<void>;
8
9
  export declare function startServer(): Promise<Server>;
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.openSockets = void 0;
3
4
  exports.handleResult = handleResult;
4
5
  exports.startServer = startServer;
5
6
  const fs_1 = require("fs");
@@ -39,13 +40,26 @@ const handle_hash_glob_1 = require("./handle-hash-glob");
39
40
  const task_history_1 = require("../message-types/task-history");
40
41
  const handle_get_task_history_1 = require("./handle-get-task-history");
41
42
  const handle_write_task_runs_to_history_1 = require("./handle-write-task-runs-to-history");
43
+ const force_shutdown_1 = require("../message-types/force-shutdown");
44
+ const handle_force_shutdown_1 = require("./handle-force-shutdown");
45
+ const get_sync_generator_changes_1 = require("../message-types/get-sync-generator-changes");
46
+ const handle_get_sync_generator_changes_1 = require("./handle-get-sync-generator-changes");
47
+ const sync_generators_1 = require("./sync-generators");
48
+ const get_registered_sync_generators_1 = require("../message-types/get-registered-sync-generators");
49
+ const handle_get_registered_sync_generators_1 = require("./handle-get-registered-sync-generators");
50
+ const update_workspace_context_1 = require("../message-types/update-workspace-context");
51
+ const handle_update_workspace_context_1 = require("./handle-update-workspace-context");
52
+ const flush_sync_generator_changes_to_disk_1 = require("../message-types/flush-sync-generator-changes-to-disk");
53
+ const handle_flush_sync_generator_changes_to_disk_1 = require("./handle-flush-sync-generator-changes-to-disk");
42
54
  let performanceObserver;
43
55
  let workspaceWatcherError;
44
56
  let outputsWatcherError;
45
57
  global.NX_DAEMON = true;
46
58
  let numberOfOpenConnections = 0;
59
+ exports.openSockets = new Set();
47
60
  const server = (0, net_1.createServer)(async (socket) => {
48
61
  numberOfOpenConnections += 1;
62
+ exports.openSockets.add(socket);
49
63
  logger_1.serverLogger.log(`Established a connection. Number of open connections: ${numberOfOpenConnections}`);
50
64
  (0, shutdown_utils_1.resetInactivityTimeout)(handleInactivityTimeout);
51
65
  if (!performanceObserver) {
@@ -64,6 +78,7 @@ const server = (0, net_1.createServer)(async (socket) => {
64
78
  });
65
79
  socket.on('close', () => {
66
80
  numberOfOpenConnections -= 1;
81
+ exports.openSockets.delete(socket);
67
82
  logger_1.serverLogger.log(`Closed a connection. Number of open connections: ${numberOfOpenConnections}`);
68
83
  (0, file_watcher_sockets_1.removeRegisteredFileWatcherSocket)(socket);
69
84
  });
@@ -131,6 +146,21 @@ async function handleMessage(socket, data) {
131
146
  else if ((0, task_history_1.isHandleWriteTaskRunsToHistoryMessage)(payload)) {
132
147
  await handleResult(socket, 'WRITE_TASK_RUNS_TO_HISTORY', () => (0, handle_write_task_runs_to_history_1.handleWriteTaskRunsToHistory)(payload.taskRuns));
133
148
  }
149
+ else if ((0, force_shutdown_1.isHandleForceShutdownMessage)(payload)) {
150
+ await handleResult(socket, 'FORCE_SHUTDOWN', () => (0, handle_force_shutdown_1.handleForceShutdown)(server));
151
+ }
152
+ else if ((0, get_sync_generator_changes_1.isHandleGetSyncGeneratorChangesMessage)(payload)) {
153
+ await handleResult(socket, get_sync_generator_changes_1.GET_SYNC_GENERATOR_CHANGES, () => (0, handle_get_sync_generator_changes_1.handleGetSyncGeneratorChanges)(payload.generators));
154
+ }
155
+ else if ((0, flush_sync_generator_changes_to_disk_1.isHandleFlushSyncGeneratorChangesToDiskMessage)(payload)) {
156
+ await handleResult(socket, flush_sync_generator_changes_to_disk_1.FLUSH_SYNC_GENERATOR_CHANGES_TO_DISK, () => (0, handle_flush_sync_generator_changes_to_disk_1.handleFlushSyncGeneratorChangesToDisk)(payload.generators));
157
+ }
158
+ else if ((0, get_registered_sync_generators_1.isHandleGetRegisteredSyncGeneratorsMessage)(payload)) {
159
+ await handleResult(socket, get_registered_sync_generators_1.GET_REGISTERED_SYNC_GENERATORS, () => (0, handle_get_registered_sync_generators_1.handleGetRegisteredSyncGenerators)());
160
+ }
161
+ else if ((0, update_workspace_context_1.isHandleUpdateWorkspaceContextMessage)(payload)) {
162
+ await handleResult(socket, update_workspace_context_1.UPDATE_WORKSPACE_CONTEXT, () => (0, handle_update_workspace_context_1.handleUpdateWorkspaceContext)(payload.createdFiles, payload.updatedFiles, payload.deletedFiles));
163
+ }
134
164
  else {
135
165
  await (0, shutdown_utils_1.respondWithErrorAndExit)(socket, `Invalid payload from the client`, new Error(`Unsupported payload sent to daemon server: ${unparsedPayload}`));
136
166
  }
@@ -157,6 +187,7 @@ function handleInactivityTimeout() {
157
187
  (0, shutdown_utils_1.handleServerProcessTermination)({
158
188
  server,
159
189
  reason: `${shutdown_utils_1.SERVER_INACTIVITY_TIMEOUT_MS}ms of inactivity`,
190
+ sockets: exports.openSockets,
160
191
  });
161
192
  }
162
193
  }
@@ -165,14 +196,17 @@ function registerProcessTerminationListeners() {
165
196
  .on('SIGINT', () => (0, shutdown_utils_1.handleServerProcessTermination)({
166
197
  server,
167
198
  reason: 'received process SIGINT',
199
+ sockets: exports.openSockets,
168
200
  }))
169
201
  .on('SIGTERM', () => (0, shutdown_utils_1.handleServerProcessTermination)({
170
202
  server,
171
203
  reason: 'received process SIGTERM',
204
+ sockets: exports.openSockets,
172
205
  }))
173
206
  .on('SIGHUP', () => (0, shutdown_utils_1.handleServerProcessTermination)({
174
207
  server,
175
208
  reason: 'received process SIGHUP',
209
+ sockets: exports.openSockets,
176
210
  }));
177
211
  }
178
212
  let existingLockHash;
@@ -235,6 +269,7 @@ const handleWorkspaceChanges = async (err, changeEvents) => {
235
269
  await (0, shutdown_utils_1.handleServerProcessTermination)({
236
270
  server,
237
271
  reason: outdatedReason,
272
+ sockets: exports.openSockets,
238
273
  });
239
274
  return;
240
275
  }
@@ -325,6 +360,10 @@ async function startServer() {
325
360
  if (!(0, shutdown_utils_1.getOutputWatcherInstance)()) {
326
361
  (0, shutdown_utils_1.storeOutputWatcherInstance)(await (0, watcher_1.watchOutputFiles)(handleOutputsChanges));
327
362
  }
363
+ // listen for project graph recomputation events to collect and schedule sync generators
364
+ (0, project_graph_incremental_recomputation_1.registerProjectGraphRecomputationListener)(sync_generators_1.collectAndScheduleSyncGenerators);
365
+ // trigger an initial project graph recomputation
366
+ (0, project_graph_incremental_recomputation_1.addUpdatedAndDeletedFiles)([], [], []);
328
367
  return resolve(server);
329
368
  }
330
369
  catch (err) {
@@ -8,8 +8,9 @@ export declare function getOutputWatcherInstance(): Watcher;
8
8
  interface HandleServerProcessTerminationParams {
9
9
  server: Server;
10
10
  reason: string;
11
+ sockets: Iterable<Socket>;
11
12
  }
12
- export declare function handleServerProcessTermination({ server, reason, }: HandleServerProcessTerminationParams): Promise<void>;
13
+ export declare function handleServerProcessTermination({ server, reason, sockets, }: HandleServerProcessTerminationParams): Promise<void>;
13
14
  export declare function resetInactivityTimeout(cb: () => void): void;
14
15
  export declare function respondToClient(socket: Socket, response: string, description: string): Promise<unknown>;
15
16
  export declare function respondWithErrorAndExit(socket: Socket, description: string, error: Error): Promise<void>;
@@ -30,11 +30,16 @@ function storeOutputWatcherInstance(instance) {
30
30
  function getOutputWatcherInstance() {
31
31
  return outputWatcherInstance;
32
32
  }
33
- async function handleServerProcessTermination({ server, reason, }) {
33
+ async function handleServerProcessTermination({ server, reason, sockets, }) {
34
34
  try {
35
- server.close();
36
- (0, cache_1.deleteDaemonJsonProcessCache)();
37
- (0, plugins_1.cleanupPlugins)();
35
+ await new Promise((res) => {
36
+ server.close(() => {
37
+ res(null);
38
+ });
39
+ for (const socket of sockets) {
40
+ socket.destroy();
41
+ }
42
+ });
38
43
  if (watcherInstance) {
39
44
  await watcherInstance.stop();
40
45
  logger_1.serverLogger.watcherLog(`Stopping the watcher for ${workspace_root_1.workspaceRoot} (sources)`);
@@ -43,6 +48,8 @@ async function handleServerProcessTermination({ server, reason, }) {
43
48
  await outputWatcherInstance.stop();
44
49
  logger_1.serverLogger.watcherLog(`Stopping the watcher for ${workspace_root_1.workspaceRoot} (outputs)`);
45
50
  }
51
+ (0, cache_1.deleteDaemonJsonProcessCache)();
52
+ (0, plugins_1.cleanupPlugins)();
46
53
  logger_1.serverLogger.log(`Server stopped because: "${reason}"`);
47
54
  }
48
55
  finally {
@@ -0,0 +1,6 @@
1
+ import type { ProjectGraph } from '../../config/project-graph';
2
+ import { type SyncGeneratorChangesResult } from '../../utils/sync-generators';
3
+ export declare function getCachedSyncGeneratorChanges(generators: string[]): Promise<SyncGeneratorChangesResult[]>;
4
+ export declare function flushSyncGeneratorChangesToDisk(generators: string[]): Promise<void>;
5
+ export declare function collectAndScheduleSyncGenerators(projectGraph: ProjectGraph): void;
6
+ export declare function getCachedRegisteredSyncGenerators(): Promise<string[]>;