nx 19.0.3 → 19.0.5

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 (42) hide show
  1. package/.eslintrc.json +2 -1
  2. package/package.json +13 -14
  3. package/src/adapter/ngcli-adapter.js +6 -3
  4. package/src/command-line/affected/affected.d.ts +4 -1
  5. package/src/command-line/affected/affected.js +5 -2
  6. package/src/command-line/graph/graph.js +1 -1
  7. package/src/command-line/migrate/migrate.js +16 -6
  8. package/src/command-line/release/publish.js +10 -7
  9. package/src/command-line/release/utils/github.js +1 -1
  10. package/src/command-line/release/utils/shared.js +5 -3
  11. package/src/command-line/reset/reset.js +7 -0
  12. package/src/command-line/run/executor-utils.js +5 -0
  13. package/src/command-line/run/run-one.js +4 -1
  14. package/src/command-line/run/run.js +10 -2
  15. package/src/command-line/run-many/run-many.js +4 -1
  16. package/src/config/misc-interfaces.d.ts +2 -1
  17. package/src/core/graph/main.js +1 -1
  18. package/src/daemon/client/client.js +5 -3
  19. package/src/daemon/server/server.js +3 -3
  20. package/src/daemon/server/watcher.js +4 -1
  21. package/src/daemon/socket-utils.d.ts +2 -2
  22. package/src/daemon/socket-utils.js +9 -8
  23. package/src/daemon/tmp-dir.d.ts +6 -2
  24. package/src/daemon/tmp-dir.js +6 -5
  25. package/src/devkit-internals.d.ts +2 -3
  26. package/src/devkit-internals.js +1 -5
  27. package/src/executors/run-commands/run-commands.impl.js +3 -1
  28. package/src/generators/utils/json.js +2 -1
  29. package/src/migrations/update-16-8-0/escape-dollar-sign-env-variables.js +8 -1
  30. package/src/native/index.js +6 -5
  31. package/src/native/native-file-cache-location.d.ts +1 -0
  32. package/src/native/native-file-cache-location.js +8 -0
  33. package/src/plugins/js/lock-file/npm-parser.js +10 -1
  34. package/src/plugins/js/lock-file/utils/pnpm-normalizer.js +3 -3
  35. package/src/project-graph/affected/locators/workspace-projects.js +1 -1
  36. package/src/project-graph/plugins/internal-api.d.ts +1 -1
  37. package/src/project-graph/plugins/internal-api.js +2 -4
  38. package/src/tasks-runner/life-cycles/dynamic-run-many-terminal-output-life-cycle.js +1 -1
  39. package/src/tasks-runner/pseudo-terminal.js +1 -1
  40. package/src/utils/json.js +1 -1
  41. package/src/utils/package-manager.js +14 -5
  42. package/src/utils/plugins/plugin-capabilities.js +24 -1
package/.eslintrc.json CHANGED
@@ -100,7 +100,8 @@
100
100
  "events", // This is coming from @storybook/builder-manager since it uses the browser polyfill
101
101
  "process", // This is coming from @storybook/builder-manager since it uses the browser polyfill
102
102
  "prettier", // This is coming from @storybook/builder-manager since it uses the browser polyfill
103
- "util" // This is coming from @storybook/builder-manager since it uses the browser polyfill
103
+ "util", // This is coming from @storybook/builder-manager since it uses the browser polyfill
104
+ "js-yaml" // The rule is failing with alias dependencies
104
105
  ]
105
106
  }
106
107
  ]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nx",
3
- "version": "19.0.3",
3
+ "version": "19.0.5",
4
4
  "private": false,
5
5
  "description": "The core Nx plugin contains the core functionality of Nx like the project graph, nx commands and task orchestration.",
6
6
  "repository": {
@@ -35,7 +35,6 @@
35
35
  "dependencies": {
36
36
  "@yarnpkg/lockfile": "^1.1.0",
37
37
  "@yarnpkg/parsers": "3.0.0-rc.46",
38
- "@zkochan/js-yaml": "0.0.6",
39
38
  "axios": "^1.6.0",
40
39
  "chalk": "^4.1.0",
41
40
  "cli-cursor": "3.1.0",
@@ -49,7 +48,7 @@
49
48
  "fs-extra": "^11.1.0",
50
49
  "ignore": "^5.0.4",
51
50
  "jest-diff": "^29.4.1",
52
- "js-yaml": "4.1.0",
51
+ "js-yaml": "npm:@zkochan/js-yaml@0.0.7",
53
52
  "jsonc-parser": "3.2.0",
54
53
  "lines-and-columns": "~2.0.3",
55
54
  "minimatch": "9.0.3",
@@ -66,7 +65,7 @@
66
65
  "yargs-parser": "21.1.1",
67
66
  "node-machine-id": "1.1.12",
68
67
  "ora": "5.3.0",
69
- "@nrwl/tao": "19.0.3"
68
+ "@nrwl/tao": "19.0.5"
70
69
  },
71
70
  "peerDependencies": {
72
71
  "@swc-node/register": "^1.8.0",
@@ -81,16 +80,16 @@
81
80
  }
82
81
  },
83
82
  "optionalDependencies": {
84
- "@nx/nx-darwin-x64": "19.0.3",
85
- "@nx/nx-darwin-arm64": "19.0.3",
86
- "@nx/nx-linux-x64-gnu": "19.0.3",
87
- "@nx/nx-linux-x64-musl": "19.0.3",
88
- "@nx/nx-win32-x64-msvc": "19.0.3",
89
- "@nx/nx-linux-arm64-gnu": "19.0.3",
90
- "@nx/nx-linux-arm64-musl": "19.0.3",
91
- "@nx/nx-linux-arm-gnueabihf": "19.0.3",
92
- "@nx/nx-win32-arm64-msvc": "19.0.3",
93
- "@nx/nx-freebsd-x64": "19.0.3"
83
+ "@nx/nx-darwin-x64": "19.0.5",
84
+ "@nx/nx-darwin-arm64": "19.0.5",
85
+ "@nx/nx-linux-x64-gnu": "19.0.5",
86
+ "@nx/nx-linux-x64-musl": "19.0.5",
87
+ "@nx/nx-win32-x64-msvc": "19.0.5",
88
+ "@nx/nx-linux-arm64-gnu": "19.0.5",
89
+ "@nx/nx-linux-arm64-musl": "19.0.5",
90
+ "@nx/nx-linux-arm-gnueabihf": "19.0.5",
91
+ "@nx/nx-win32-arm64-msvc": "19.0.5",
92
+ "@nx/nx-freebsd-x64": "19.0.5"
94
93
  },
95
94
  "nx-migrations": {
96
95
  "migrations": "./migrations.json",
@@ -791,12 +791,10 @@ async function getWrappedWorkspaceNodeModulesArchitectHost(workspace, root, proj
791
791
  const [packageName, builderName] = builderStr.split(':');
792
792
  const { executorsFilePath, executorConfig } = this.readExecutorsJson(packageName, builderName);
793
793
  const builderInfo = this.readExecutor(packageName, builderName);
794
- const { builders, executors } = (0, fileutils_1.readJsonFile)(executorsFilePath);
795
794
  return {
796
795
  name: builderStr,
797
796
  builderName,
798
- description: builders?.[builderName]?.description ??
799
- executors?.[builderName]?.description,
797
+ description: executorConfig.description,
800
798
  optionSchema: builderInfo.schema,
801
799
  import: (0, schema_utils_1.resolveImplementation)(executorConfig.implementation, (0, path_1.dirname)(executorsFilePath)),
802
800
  };
@@ -813,6 +811,11 @@ async function getWrappedWorkspaceNodeModulesArchitectHost(workspace, root, proj
813
811
  if (!executorConfig) {
814
812
  throw new Error(`Cannot find builder '${builder}' in ${executorsFilePath}.`);
815
813
  }
814
+ if (typeof executorConfig === 'string') {
815
+ // Angular CLI can have a builder pointing to another package:builder
816
+ const [packageName, executorName] = executorConfig.split(':');
817
+ return this.readExecutorsJson(packageName, executorName);
818
+ }
816
819
  return { executorsFilePath, executorConfig, isNgCompat: true };
817
820
  }
818
821
  readExecutor(nodeModule, executor) {
@@ -3,5 +3,8 @@ import { ProjectGraph, ProjectGraphProjectNode } from '../../config/project-grap
3
3
  import { TargetDependencyConfig } from '../../config/workspace-json-project-json';
4
4
  export declare function affected(command: 'graph' | 'print-affected' | 'affected', args: {
5
5
  [k: string]: any;
6
- }, extraTargetDependencies?: Record<string, (TargetDependencyConfig | string)[]>): Promise<void>;
6
+ }, extraTargetDependencies?: Record<string, (TargetDependencyConfig | string)[]>, extraOptions?: {
7
+ excludeTaskDependencies: boolean;
8
+ loadDotEnvFiles: boolean;
9
+ }): Promise<void>;
7
10
  export declare function getAffectedGraphNodes(nxArgs: NxArgs, projectGraph: ProjectGraph): Promise<ProjectGraphProjectNode[]>;
@@ -15,7 +15,10 @@ const workspace_configuration_check_1 = require("../../utils/workspace-configura
15
15
  const find_matching_projects_1 = require("../../utils/find-matching-projects");
16
16
  const graph_1 = require("../graph/graph");
17
17
  const all_file_data_1 = require("../../utils/all-file-data");
18
- async function affected(command, args, extraTargetDependencies = {}) {
18
+ async function affected(command, args, extraTargetDependencies = {}, extraOptions = {
19
+ excludeTaskDependencies: false,
20
+ loadDotEnvFiles: process.env.NX_LOAD_DOT_ENV_FILES !== 'false',
21
+ }) {
19
22
  perf_hooks_1.performance.mark('code-loading:end');
20
23
  perf_hooks_1.performance.measure('code-loading', 'init-local', 'code-loading:end');
21
24
  (0, workspace_configuration_check_1.workspaceConfigurationCheck)();
@@ -46,7 +49,7 @@ async function affected(command, args, extraTargetDependencies = {}) {
46
49
  }, projectNames);
47
50
  }
48
51
  else {
49
- const status = await (0, run_command_1.runCommand)(projectsWithTarget, projectGraph, { nxJson }, nxArgs, overrides, null, extraTargetDependencies, { excludeTaskDependencies: false, loadDotEnvFiles: true });
52
+ const status = await (0, run_command_1.runCommand)(projectsWithTarget, projectGraph, { nxJson }, nxArgs, overrides, null, extraTargetDependencies, extraOptions);
50
53
  process.exit(status);
51
54
  }
52
55
  break;
@@ -255,7 +255,7 @@ async function generateGraph(args, affectedProjects) {
255
255
  const environmentJs = buildEnvironmentJs(args.exclude || [], args.watch, !!args.file && args.file.endsWith('html') ? 'build' : 'serve', projectGraphClientResponse, taskGraphClientResponse, taskInputsReponse, sourceMaps);
256
256
  html = html.replace(/src="/g, 'src="static/');
257
257
  html = html.replace(/href="styles/g, 'href="static/styles');
258
- html = html.replace('<base href="/" />', '');
258
+ html = html.replace(/<base href="\/".*>/g, '');
259
259
  html = html.replace(/type="module"/g, '');
260
260
  (0, fs_1.writeFileSync)(fullFilePath, html);
261
261
  (0, fs_1.writeFileSync)((0, path_1.join)(assetsFolder, 'environment.js'), environmentJs);
@@ -377,9 +377,9 @@ const LEGACY_NRWL_PACKAGE_GROUP = [
377
377
  ];
378
378
  async function normalizeVersionWithTagCheck(pkg, version) {
379
379
  // This doesn't seem like a valid version, lets check if its a tag on the registry.
380
- if (version && !(0, semver_1.coerce)(version)) {
380
+ if (version && !(0, semver_1.parse)(version)) {
381
381
  try {
382
- return (0, package_manager_1.packageRegistryView)(pkg, version, 'version');
382
+ return (0, package_manager_1.resolvePackageVersionUsingRegistry)(pkg, version);
383
383
  }
384
384
  catch {
385
385
  // fall through to old logic
@@ -634,6 +634,9 @@ async function getPackageMigrationsUsingInstall(packageName, packageVersion) {
634
634
  }
635
635
  result = { ...migrations, packageGroup, version: packageJson.version };
636
636
  }
637
+ catch (e) {
638
+ logger_1.logger.warn(`Unable to fetch migrations for ${packageName}@${packageVersion}: ${e.message}`);
639
+ }
637
640
  finally {
638
641
  await cleanup();
639
642
  }
@@ -871,7 +874,14 @@ function runInstall() {
871
874
  (0, child_process_1.execSync)(pmCommands.install, { stdio: [0, 1, 2] });
872
875
  }
873
876
  async function executeMigrations(root, migrations, isVerbose, shouldCreateCommits, commitPrefix) {
874
- const depsBeforeMigrations = getStringifiedPackageJsonDeps(root);
877
+ let initialDeps = getStringifiedPackageJsonDeps(root);
878
+ const installDepsIfChanged = () => {
879
+ const currentDeps = getStringifiedPackageJsonDeps(root);
880
+ if (initialDeps !== currentDeps) {
881
+ runInstall();
882
+ }
883
+ initialDeps = currentDeps;
884
+ };
875
885
  const migrationsWithNoChanges = [];
876
886
  const sortedMigrations = migrations.sort((a, b) => {
877
887
  // special case for the split configuration migration to run first
@@ -912,6 +922,7 @@ async function executeMigrations(root, migrations, isVerbose, shouldCreateCommit
912
922
  loggingQueue.forEach((log) => logger_1.logger.info(' ' + log));
913
923
  }
914
924
  if (shouldCreateCommits) {
925
+ installDepsIfChanged();
915
926
  const commitMessage = `${commitPrefix}${m.name}`;
916
927
  try {
917
928
  const committedSha = commitChanges(commitMessage);
@@ -935,9 +946,8 @@ async function executeMigrations(root, migrations, isVerbose, shouldCreateCommit
935
946
  throw e;
936
947
  }
937
948
  }
938
- const depsAfterMigrations = getStringifiedPackageJsonDeps(root);
939
- if (depsBeforeMigrations !== depsAfterMigrations) {
940
- runInstall();
949
+ if (!shouldCreateCommits) {
950
+ installDepsIfChanged();
941
951
  }
942
952
  return migrationsWithNoChanges;
943
953
  }
@@ -54,7 +54,10 @@ async function releasePublish(args, isCLI = false) {
54
54
  * Run publishing for all remaining release groups and filtered projects within them
55
55
  */
56
56
  for (const releaseGroup of releaseGroups) {
57
- const status = await runPublishOnProjects(_args, projectGraph, nxJson, Array.from(releaseGroupToFilteredProjects.get(releaseGroup)), shouldExcludeTaskDependencies, isCLI);
57
+ const status = await runPublishOnProjects(_args, projectGraph, nxJson, Array.from(releaseGroupToFilteredProjects.get(releaseGroup)), isCLI, {
58
+ excludeTaskDependencies: shouldExcludeTaskDependencies,
59
+ loadDotEnvFiles: process.env.NX_LOAD_DOT_ENV_FILES !== 'false',
60
+ });
58
61
  if (status !== 0) {
59
62
  overallExitStatus = status || 1;
60
63
  }
@@ -65,7 +68,10 @@ async function releasePublish(args, isCLI = false) {
65
68
  * Run publishing for all remaining release groups
66
69
  */
67
70
  for (const releaseGroup of releaseGroups) {
68
- const status = await runPublishOnProjects(_args, projectGraph, nxJson, releaseGroup.projects, shouldExcludeTaskDependencies, isCLI);
71
+ const status = await runPublishOnProjects(_args, projectGraph, nxJson, releaseGroup.projects, isCLI, {
72
+ excludeTaskDependencies: shouldExcludeTaskDependencies,
73
+ loadDotEnvFiles: process.env.NX_LOAD_DOT_ENV_FILES !== 'false',
74
+ });
69
75
  if (status !== 0) {
70
76
  overallExitStatus = status || 1;
71
77
  }
@@ -73,7 +79,7 @@ async function releasePublish(args, isCLI = false) {
73
79
  return overallExitStatus;
74
80
  }
75
81
  exports.releasePublish = releasePublish;
76
- async function runPublishOnProjects(args, projectGraph, nxJson, projectNames, shouldExcludeTaskDependencies, isCLI) {
82
+ async function runPublishOnProjects(args, projectGraph, nxJson, projectNames, isCLI, extraOptions) {
77
83
  const projectsToRun = projectNames.map((projectName) => projectGraph.nodes[projectName]);
78
84
  const overrides = (0, command_line_utils_1.createOverrides)(args.__overrides_unparsed__);
79
85
  if (args.registry) {
@@ -131,10 +137,7 @@ async function runPublishOnProjects(args, projectGraph, nxJson, projectNames, sh
131
137
  targets: [requiredTargetName],
132
138
  outputStyle: 'static',
133
139
  ...args,
134
- }, overrides, null, {}, {
135
- excludeTaskDependencies: shouldExcludeTaskDependencies,
136
- loadDotEnvFiles: true,
137
- });
140
+ }, overrides, null, {}, extraOptions);
138
141
  if (status !== 0) {
139
142
  // In order to not add noise to the overall CLI output, do not throw an additional error
140
143
  if (isCLI) {
@@ -223,7 +223,7 @@ async function resolveGithubToken() {
223
223
  const ghCLIPath = (0, path_1.joinPathFragments)(process.env.XDG_CONFIG_HOME || (0, path_1.joinPathFragments)((0, node_os_1.homedir)(), '.config'), 'gh', 'hosts.yml');
224
224
  if ((0, node_fs_1.existsSync)(ghCLIPath)) {
225
225
  const yamlContents = await node_fs_1.promises.readFile(ghCLIPath, 'utf8');
226
- const { load } = require('@zkochan/js-yaml');
226
+ const { load } = require('js-yaml');
227
227
  const ghCLIConfig = load(yamlContents);
228
228
  if (ghCLIConfig['github.com']) {
229
229
  // Web based session (the token is already embedded in the config)
@@ -162,9 +162,11 @@ function createGitTagValues(releaseGroups, releaseGroupToFilteredProjects, versi
162
162
  }
163
163
  // For fixed groups we want one tag for the overall group
164
164
  const projectVersionData = versionData[releaseGroupProjectNames[0]]; // all at the same version, so we can just pick the first one
165
- tags.push((0, utils_1.interpolate)(releaseGroup.releaseTagPattern, {
166
- version: projectVersionData.newVersion,
167
- }));
165
+ if (projectVersionData.newVersion !== null) {
166
+ tags.push((0, utils_1.interpolate)(releaseGroup.releaseTagPattern, {
167
+ version: projectVersionData.newVersion,
168
+ }));
169
+ }
168
170
  }
169
171
  return tags;
170
172
  }
@@ -5,6 +5,7 @@ const fs_extra_1 = require("fs-extra");
5
5
  const client_1 = require("../../daemon/client/client");
6
6
  const cache_directory_1 = require("../../utils/cache-directory");
7
7
  const output_1 = require("../../utils/output");
8
+ const native_file_cache_location_1 = require("../../native/native-file-cache-location");
8
9
  async function resetHandler() {
9
10
  output_1.output.note({
10
11
  title: 'Resetting the Nx workspace cache and stopping the Nx Daemon.',
@@ -12,6 +13,12 @@ async function resetHandler() {
12
13
  });
13
14
  await client_1.daemonClient.stop();
14
15
  output_1.output.log({ title: 'Daemon Server - Stopped' });
16
+ try {
17
+ (0, fs_extra_1.rmSync)(native_file_cache_location_1.nativeFileCacheLocation, { recursive: true, force: true });
18
+ }
19
+ catch (e) {
20
+ // ignore, deleting the native file cache is not critical and can fail if another process is locking the file
21
+ }
15
22
  (0, fs_extra_1.rmSync)(cache_directory_1.cacheDir, { recursive: true, force: true });
16
23
  if (cache_directory_1.projectGraphCacheDirectory !== cache_directory_1.cacheDir) {
17
24
  (0, fs_extra_1.rmSync)(cache_directory_1.projectGraphCacheDirectory, { recursive: true, force: true });
@@ -68,6 +68,11 @@ function readExecutorJson(nodeModule, executor, root, projects) {
68
68
  if (!executorConfig) {
69
69
  throw new Error(`Cannot find executor '${executor}' in ${executorsFilePath}.`);
70
70
  }
71
+ if (typeof executorConfig === 'string') {
72
+ // Angular CLI can have a builder pointing to another package:builder
73
+ const [packageName, executorName] = executorConfig.split(':');
74
+ return readExecutorJson(packageName, executorName, root, projects);
75
+ }
71
76
  const isNgCompat = !executorsJson.executors?.[executor];
72
77
  return { executorsFilePath, executorConfig, isNgCompat };
73
78
  }
@@ -13,7 +13,10 @@ const configuration_1 = require("../../config/configuration");
13
13
  const calculate_default_project_name_1 = require("../../config/calculate-default-project-name");
14
14
  const workspace_configuration_check_1 = require("../../utils/workspace-configuration-check");
15
15
  const graph_1 = require("../graph/graph");
16
- async function runOne(cwd, args, extraTargetDependencies = {}, extraOptions = { excludeTaskDependencies: false, loadDotEnvFiles: true }) {
16
+ async function runOne(cwd, args, extraTargetDependencies = {}, extraOptions = {
17
+ excludeTaskDependencies: false,
18
+ loadDotEnvFiles: process.env.NX_LOAD_DOT_ENV_FILES !== 'false',
19
+ }) {
17
20
  perf_hooks_1.performance.mark('code-loading:end');
18
21
  perf_hooks_1.performance.measure('code-loading', 'init-local', 'code-loading:end');
19
22
  (0, workspace_configuration_check_1.workspaceConfigurationCheck)();
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.run = exports.printTargetRunHelp = exports.runExecutor = exports.validateProject = exports.printRunHelp = void 0;
4
+ const npm_run_path_1 = require("npm-run-path");
4
5
  const params_1 = require("../../utils/params");
5
6
  const print_help_1 = require("../../utils/print-help");
6
7
  const path_1 = require("path");
@@ -68,17 +69,24 @@ async function printTargetRunHelpInternal({ project, target }, root, projectsCon
68
69
  targetConfig.options.command) {
69
70
  const command = targetConfig.options.command.split(' ')[0];
70
71
  const helpCommand = `${command} --help`;
72
+ const localEnv = (0, npm_run_path_1.env)();
73
+ const env = {
74
+ ...process.env,
75
+ ...localEnv,
76
+ };
71
77
  if (pseudo_terminal_1.PseudoTerminal.isSupported()) {
72
78
  const terminal = (0, pseudo_terminal_1.getPseudoTerminal)();
73
79
  await new Promise(() => {
74
- const cp = terminal.runCommand(helpCommand);
80
+ const cp = terminal.runCommand(helpCommand, { jsEnv: env });
75
81
  cp.onExit((code) => {
76
82
  process.exit(code);
77
83
  });
78
84
  });
79
85
  }
80
86
  else {
81
- const cp = (0, child_process_1.exec)(helpCommand);
87
+ const cp = (0, child_process_1.exec)(helpCommand, {
88
+ env,
89
+ });
82
90
  cp.on('exit', (code) => {
83
91
  process.exit(code);
84
92
  });
@@ -13,7 +13,10 @@ const output_1 = require("../../utils/output");
13
13
  const find_matching_projects_1 = require("../../utils/find-matching-projects");
14
14
  const workspace_configuration_check_1 = require("../../utils/workspace-configuration-check");
15
15
  const graph_1 = require("../graph/graph");
16
- async function runMany(args, extraTargetDependencies = {}, extraOptions = { excludeTaskDependencies: false, loadDotEnvFiles: true }) {
16
+ async function runMany(args, extraTargetDependencies = {}, extraOptions = {
17
+ excludeTaskDependencies: false,
18
+ loadDotEnvFiles: process.env.NX_LOAD_DOT_ENV_FILES !== 'false',
19
+ }) {
17
20
  perf_hooks_1.performance.mark('code-loading:end');
18
21
  perf_hooks_1.performance.measure('code-loading', 'init-local', 'code-loading:end');
19
22
  (0, workspace_configuration_check_1.workspaceConfigurationCheck)();
@@ -25,13 +25,14 @@ export interface GeneratorsJsonEntry {
25
25
  'x-use-standalone-layout'?: boolean;
26
26
  }
27
27
  export type OutputCaptureMethod = 'direct-nodejs' | 'pipe';
28
- export interface ExecutorsJsonEntry {
28
+ export interface ExecutorJsonEntryConfig {
29
29
  schema: string;
30
30
  implementation: string;
31
31
  batchImplementation?: string;
32
32
  description?: string;
33
33
  hasher?: string;
34
34
  }
35
+ export type ExecutorsJsonEntry = string | ExecutorJsonEntryConfig;
35
36
  export type Dependencies = 'dependencies' | 'devDependencies';
36
37
  export interface PackageJsonUpdateForPackage {
37
38
  version: string;