nx 19.8.0-beta.0 → 19.8.0-beta.2

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.
@@ -35,6 +35,7 @@ export declare class NxCache {
35
35
  getTaskOutputsPath(hash: string): string
36
36
  copyFilesFromCache(cachedResult: CachedResult, outputs: Array<string>): void
37
37
  removeOldCacheRecords(): void
38
+ checkCacheFsInSync(): boolean
38
39
  }
39
40
 
40
41
  export declare class NxTaskHistory {
@@ -96,7 +97,7 @@ export interface CachedResult {
96
97
  outputsPath: string
97
98
  }
98
99
 
99
- export declare export function connectToNxDb(cacheDir: string, nxVersion: string): ExternalObject<Connection>
100
+ export declare export function connectToNxDb(cacheDir: string, nxVersion: string, dbName?: string | undefined | null): ExternalObject<Connection>
100
101
 
101
102
  export declare export function copy(src: string, dest: string): void
102
103
 
Binary file
@@ -16,10 +16,10 @@ export declare class DbCache {
16
16
  private cache;
17
17
  private remoteCache;
18
18
  private remoteCachePromise;
19
- setup(): Promise<void>;
20
19
  constructor(options: {
21
20
  nxCloudRemoteCache: RemoteCache;
22
21
  });
22
+ init(): Promise<void>;
23
23
  get(task: Task): Promise<CachedResult | null>;
24
24
  private applyRemoteCacheResults;
25
25
  put(task: Task, terminalOutput: string | null, outputs: string[], code: number): Promise<void>;
@@ -28,6 +28,10 @@ export declare class DbCache {
28
28
  temporaryOutputPath(task: Task): string;
29
29
  private getRemoteCache;
30
30
  private _getRemoteCache;
31
+ private getPowerpackS3Cache;
32
+ private getPowerpackSharedCache;
33
+ private resolvePackage;
34
+ private assertCacheIsValid;
31
35
  }
32
36
  /**
33
37
  * @deprecated Use the {@link DbCache} class instead. This will be removed in Nx 21.
@@ -16,6 +16,7 @@ const nx_cloud_utils_1 = require("../utils/nx-cloud-utils");
16
16
  const nx_json_1 = require("../config/nx-json");
17
17
  const update_manager_1 = require("../nx-cloud/update-manager");
18
18
  const get_cloud_options_1 = require("../nx-cloud/utilities/get-cloud-options");
19
+ const is_ci_1 = require("../utils/is-ci");
19
20
  function getCache(options) {
20
21
  return process.env.NX_DISABLE_DB !== 'true' &&
21
22
  process.env.NX_DB_CACHE === 'true'
@@ -28,13 +29,17 @@ function getCache(options) {
28
29
  : new Cache(options);
29
30
  }
30
31
  class DbCache {
31
- async setup() {
32
- this.remoteCache = await this.getRemoteCache();
33
- }
34
32
  constructor(options) {
35
33
  this.options = options;
36
34
  this.cache = new native_1.NxCache(workspace_root_1.workspaceRoot, cache_directory_1.cacheDir, (0, db_connection_1.getDbConnection)());
37
35
  }
36
+ async init() {
37
+ // This should be cheap because we've already loaded
38
+ this.remoteCache = await this.getRemoteCache();
39
+ if (!this.remoteCache) {
40
+ this.assertCacheIsValid();
41
+ }
42
+ }
38
43
  async get(task) {
39
44
  const res = this.cache.get(task.hash);
40
45
  if (res) {
@@ -43,7 +48,6 @@ class DbCache {
43
48
  remote: false,
44
49
  };
45
50
  }
46
- await this.setup();
47
51
  if (this.remoteCache) {
48
52
  // didn't find it locally but we have a remote cache
49
53
  // attempt remote cache
@@ -67,9 +71,9 @@ class DbCache {
67
71
  return this.cache.applyRemoteCacheResults(hash, res);
68
72
  }
69
73
  async put(task, terminalOutput, outputs, code) {
74
+ await this.assertCacheIsValid();
70
75
  return tryAndRetry(async () => {
71
76
  this.cache.put(task.hash, terminalOutput, outputs, code);
72
- await this.setup();
73
77
  if (this.remoteCache) {
74
78
  await this.remoteCache.store(task.hash, this.cache.cacheDirectory, terminalOutput, code);
75
79
  }
@@ -105,9 +109,51 @@ class DbCache {
105
109
  }
106
110
  }
107
111
  else {
112
+ return ((await this.getPowerpackS3Cache()) ??
113
+ (await this.getPowerpackSharedCache()) ??
114
+ null);
115
+ }
116
+ }
117
+ async getPowerpackS3Cache() {
118
+ try {
119
+ const { getRemoteCache } = await Promise.resolve(`${this.resolvePackage('@nx/powerpack-s3-cache')}`).then(s => require(s));
120
+ return getRemoteCache();
121
+ }
122
+ catch {
108
123
  return null;
109
124
  }
110
125
  }
126
+ async getPowerpackSharedCache() {
127
+ try {
128
+ const { getRemoteCache } = await Promise.resolve(`${this.resolvePackage('@nx/powerpack-shared-cache')}`).then(s => require(s));
129
+ return getRemoteCache();
130
+ }
131
+ catch {
132
+ return null;
133
+ }
134
+ }
135
+ resolvePackage(pkg) {
136
+ return require.resolve(pkg, {
137
+ paths: [process.cwd(), workspace_root_1.workspaceRoot, __dirname],
138
+ });
139
+ }
140
+ assertCacheIsValid() {
141
+ // User has customized the cache directory - this could be because they
142
+ // are using a shared cache in the custom directory. The db cache is not
143
+ // stored in the cache directory, and is keyed by machine ID so they would
144
+ // hit issues. If we detect this, we can create a fallback db cache in the
145
+ // custom directory, and check if the entries are there when the main db
146
+ // cache misses.
147
+ if ((0, is_ci_1.isCI)() && !this.cache.checkCacheFsInSync()) {
148
+ const warning = [
149
+ `Nx found unrecognized artifacts in the cache directory and will not be able to use them.`,
150
+ `Nx can only restore artifacts it has metadata about.`,
151
+ `Read about this warning and how to address it here: https://nx.dev/troubleshooting/unknown-local-cache`,
152
+ ``,
153
+ ].join('\n');
154
+ console.warn(warning);
155
+ }
156
+ }
111
157
  }
112
158
  exports.DbCache = DbCache;
113
159
  /**
@@ -36,6 +36,7 @@ const task_results_life_cycle_1 = require("./life-cycles/task-results-life-cycle
36
36
  const task_graph_utils_1 = require("./task-graph-utils");
37
37
  const utils_1 = require("./utils");
38
38
  const chalk = require("chalk");
39
+ const powerpack_1 = require("../utils/powerpack");
39
40
  async function getTerminalOutputLifeCycle(initiatingProject, projectNames, tasks, nxArgs, nxJson, overrides) {
40
41
  const { runnerOptions } = getRunner(nxArgs, nxJson);
41
42
  const isRunOne = initiatingProject != null;
@@ -124,6 +125,7 @@ async function runCommandForTasks(projectsToRun, currentProjectGraph, { nxJson }
124
125
  initiatingProject,
125
126
  });
126
127
  await renderIsDone;
128
+ await (0, powerpack_1.printPowerpackLicense)();
127
129
  return taskResults;
128
130
  }
129
131
  async function ensureWorkspaceIsInSyncAndGetGraphs(projectGraph, nxJson, projectNames, nxArgs, overrides, extraTargetDependencies, extraOptions) {
@@ -40,10 +40,11 @@ class TaskOrchestrator {
40
40
  this.bailed = false;
41
41
  }
42
42
  async run() {
43
- // Init the ForkedProcessTaskRunner
43
+ // Init the ForkedProcessTaskRunner, TasksSchedule, and Cache
44
44
  await Promise.all([
45
45
  this.forkedProcessTaskRunner.init(),
46
46
  this.tasksSchedule.init(),
47
+ 'init' in this.cache ? this.cache.init() : null,
47
48
  ]);
48
49
  // initial scheduling
49
50
  await this.tasksSchedule.scheduleNextTasks();
@@ -1,2 +1,5 @@
1
1
  import { ExternalObject } from '../native';
2
- export declare function getDbConnection(directory?: string): ExternalObject<any>;
2
+ export declare function getDbConnection(opts?: {
3
+ directory?: string;
4
+ dbName?: string;
5
+ }): ExternalObject<Connection>;
@@ -4,8 +4,19 @@ exports.getDbConnection = getDbConnection;
4
4
  const native_1 = require("../native");
5
5
  const cache_directory_1 = require("./cache-directory");
6
6
  const package_json_1 = require("../../package.json");
7
- let dbConnection;
8
- function getDbConnection(directory = cache_directory_1.workspaceDataDirectory) {
9
- dbConnection ??= (0, native_1.connectToNxDb)(directory, package_json_1.version);
10
- return dbConnection;
7
+ const dbConnectionMap = new Map();
8
+ function getDbConnection(opts = {}) {
9
+ opts.directory ??= cache_directory_1.workspaceDataDirectory;
10
+ const key = `${opts.directory}:${opts.dbName ?? 'default'}`;
11
+ const connection = getEntryOrSet(dbConnectionMap, key, () => (0, native_1.connectToNxDb)(opts.directory, package_json_1.version, opts.dbName));
12
+ return connection;
13
+ }
14
+ function getEntryOrSet(map, key, defaultValue) {
15
+ const existing = map.get(key);
16
+ if (existing) {
17
+ return existing;
18
+ }
19
+ const val = defaultValue();
20
+ map.set(key, val);
21
+ return val;
11
22
  }
@@ -2,4 +2,5 @@ import { ProjectConfiguration } from '../../config/workspace-json-project-json';
2
2
  import { PluginCapabilities } from './plugin-capabilities';
3
3
  export declare function listPlugins(plugins: Map<string, PluginCapabilities>, title: string): void;
4
4
  export declare function listAlsoAvailableCorePlugins(installedPlugins: Map<string, PluginCapabilities>): void;
5
+ export declare function listPowerpackPlugins(): void;
5
6
  export declare function listPluginCapabilities(pluginName: string, projects: Record<string, ProjectConfiguration>): Promise<void>;
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.listPlugins = listPlugins;
4
4
  exports.listAlsoAvailableCorePlugins = listAlsoAvailableCorePlugins;
5
+ exports.listPowerpackPlugins = listPowerpackPlugins;
5
6
  exports.listPluginCapabilities = listPluginCapabilities;
6
7
  const chalk = require("chalk");
7
8
  const output_1 = require("../output");
@@ -45,6 +46,12 @@ function listAlsoAvailableCorePlugins(installedPlugins) {
45
46
  });
46
47
  }
47
48
  }
49
+ function listPowerpackPlugins() {
50
+ const powerpackLink = 'https://nx.dev/plugin-registry';
51
+ output_1.output.log({
52
+ title: `Available Powerpack Plugins: ${powerpackLink}`,
53
+ });
54
+ }
48
55
  async function listPluginCapabilities(pluginName, projects) {
49
56
  const plugin = await (0, plugin_capabilities_1.getPluginCapabilities)(workspace_root_1.workspaceRoot, pluginName, projects);
50
57
  if (!plugin) {
@@ -0,0 +1,5 @@
1
+ export declare function printPowerpackLicense(): Promise<void>;
2
+ export declare function getPowerpackLicenseInformation(): Promise<any>;
3
+ export declare class NxPowerpackNotInstalledError extends Error {
4
+ constructor(e: Error);
5
+ }
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NxPowerpackNotInstalledError = void 0;
4
+ exports.printPowerpackLicense = printPowerpackLicense;
5
+ exports.getPowerpackLicenseInformation = getPowerpackLicenseInformation;
6
+ const logger_1 = require("./logger");
7
+ const package_manager_1 = require("./package-manager");
8
+ const workspace_root_1 = require("./workspace-root");
9
+ async function printPowerpackLicense() {
10
+ try {
11
+ const { organizationName, seatCount, workspaceCount } = await getPowerpackLicenseInformation();
12
+ logger_1.logger.log(`Nx Powerpack Licensed to ${organizationName} for ${seatCount} user${seatCount > 1 ? '' : 's'} in ${workspaceCount} workspace${workspaceCount > 1 ? '' : 's'}`);
13
+ }
14
+ catch { }
15
+ }
16
+ async function getPowerpackLicenseInformation() {
17
+ try {
18
+ const { getPowerpackLicenseInformation } = (await Promise.resolve().then(() => require(
19
+ // @ts-ignore
20
+ '@nx/powerpack-license'
21
+ // TODO(@FrozenPandaz): Provide the right type here.
22
+ )));
23
+ // )) as typeof import('@nx/powerpack-license');
24
+ return getPowerpackLicenseInformation(workspace_root_1.workspaceRoot);
25
+ }
26
+ catch (e) {
27
+ if ('code' in e && e.code === 'ERR_MODULE_NOT_FOUND') {
28
+ throw new NxPowerpackNotInstalledError(e);
29
+ }
30
+ throw e;
31
+ }
32
+ }
33
+ class NxPowerpackNotInstalledError extends Error {
34
+ constructor(e) {
35
+ super(`The "@nx/powerpack-license" package is needed to use Nx Powerpack enabled features. Please install the @nx/powerpack-license with ${(0, package_manager_1.getPackageManagerCommand)().addDev} @nx/powerpack-license`, { cause: e });
36
+ }
37
+ }
38
+ exports.NxPowerpackNotInstalledError = NxPowerpackNotInstalledError;