@nx/next 16.8.0-beta.4 → 16.8.0-beta.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 (46) hide show
  1. package/package.json +9 -9
  2. package/plugins/component-testing.js +14 -8
  3. package/plugins/with-less.js +19 -14
  4. package/plugins/with-nx.js +27 -28
  5. package/plugins/with-stylus.js +18 -14
  6. package/src/executors/build/build.impl.js +60 -66
  7. package/src/executors/build/lib/create-next-config-file.js +2 -4
  8. package/src/executors/build/lib/update-package-json.js +2 -4
  9. package/src/executors/export/export.impl.js +29 -32
  10. package/src/executors/server/custom-server.impl.js +27 -45
  11. package/src/executors/server/server.impl.js +52 -56
  12. package/src/generators/application/application.js +38 -37
  13. package/src/generators/application/lib/add-e2e.js +35 -31
  14. package/src/generators/application/lib/add-jest.js +29 -26
  15. package/src/generators/application/lib/add-linting.js +50 -47
  16. package/src/generators/application/lib/add-project.js +3 -1
  17. package/src/generators/application/lib/create-application-files.js +26 -8
  18. package/src/generators/application/lib/normalize-options.js +40 -33
  19. package/src/generators/application/lib/set-defaults.js +5 -7
  20. package/src/generators/application/lib/update-cypress-tsconfig.js +4 -1
  21. package/src/generators/component/component.js +16 -13
  22. package/src/generators/custom-server/custom-server.js +68 -69
  23. package/src/generators/cypress-component-configuration/cypress-component-configuration.js +55 -57
  24. package/src/generators/init/init.js +36 -33
  25. package/src/generators/library/lib/normalize-options.js +14 -14
  26. package/src/generators/library/library.js +52 -47
  27. package/src/generators/page/page.js +21 -14
  28. package/src/migrations/update-12-10-0/fix-page-dir-for-eslint.js +23 -24
  29. package/src/migrations/update-12-8-0/remove-styled-jsx-babel-plugin.js +13 -16
  30. package/src/migrations/update-13-0-0/update-emotion-setup.js +24 -27
  31. package/src/migrations/update-13-0-0/update-to-webpack-5.js +20 -23
  32. package/src/migrations/update-13-0-3/fix-less.js +15 -18
  33. package/src/migrations/update-13-1-1/enable-swc.js +28 -32
  34. package/src/migrations/update-14-0-0/add-default-development-configurations.js +22 -27
  35. package/src/migrations/update-14-4-3/add-dev-output-path.js +11 -15
  36. package/src/migrations/update-14-5-3/add-gitignore-entry.js +3 -6
  37. package/src/migrations/update-14-5-3/update-dev-output-path.js +14 -19
  38. package/src/migrations/update-14-5-7/update-next-eslint.js +18 -22
  39. package/src/migrations/update-15-8-8/add-style-packages.js +14 -18
  40. package/src/migrations/update-16-0-0-add-nx-packages/update-16-0-0-add-nx-packages.js +3 -6
  41. package/src/migrations/update-16-3-0/remove-root-build-option.js +10 -13
  42. package/src/migrations/update-16-4-0/update-nx-next-dependency.js +12 -15
  43. package/src/utils/compose-plugins.js +12 -15
  44. package/src/utils/create-copy-plugin.js +6 -4
  45. package/src/utils/generate-globs.js +1 -1
  46. package/src/utils/styles.js +31 -11
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nx/next",
3
- "version": "16.8.0-beta.4",
3
+ "version": "16.8.0-beta.5",
4
4
  "private": false,
5
5
  "description": "The Next.js plugin for Nx contains executors and generators for managing Next.js applications and libraries within an Nx workspace. It provides:\n\n\n- Scaffolding for creating, building, serving, linting, and testing Next.js applications.\n\n- Integration with building, serving, and exporting a Next.js application.\n\n- Integration with React libraries within the workspace. \n\nWhen using Next.js in Nx, you get the out-of-the-box support for TypeScript, Cypress, and Jest. No need to configure anything: watch mode, source maps, and typings just work.",
6
6
  "repository": {
@@ -35,13 +35,13 @@
35
35
  },
36
36
  "dependencies": {
37
37
  "@babel/plugin-proposal-decorators": "^7.22.7",
38
- "@nrwl/next": "16.8.0-beta.4",
39
- "@nx/devkit": "16.8.0-beta.4",
40
- "@nx/js": "16.8.0-beta.4",
41
- "@nx/linter": "16.8.0-beta.4",
42
- "@nx/react": "16.8.0-beta.4",
43
- "@nx/web": "16.8.0-beta.4",
44
- "@nx/workspace": "16.8.0-beta.4",
38
+ "@nrwl/next": "16.8.0-beta.5",
39
+ "@nx/devkit": "16.8.0-beta.5",
40
+ "@nx/js": "16.8.0-beta.5",
41
+ "@nx/linter": "16.8.0-beta.5",
42
+ "@nx/react": "16.8.0-beta.5",
43
+ "@nx/web": "16.8.0-beta.5",
44
+ "@nx/workspace": "16.8.0-beta.5",
45
45
  "@svgr/webpack": "^8.0.1",
46
46
  "chalk": "^4.1.0",
47
47
  "copy-webpack-plugin": "^10.2.4",
@@ -56,5 +56,5 @@
56
56
  "access": "public"
57
57
  },
58
58
  "type": "commonjs",
59
- "gitHead": "c9aad2dc8c2b34531cf61549bff872e68c481e4e"
59
+ "gitHead": "ad2d1e8a55b2d1b358bb5e7483343d9757ff2c53"
60
60
  }
@@ -8,10 +8,9 @@ const react_1 = require("@nx/react");
8
8
  const webpack_1 = require("@nx/webpack");
9
9
  const path_1 = require("path");
10
10
  function nxComponentTestingPreset(pathToConfig, options) {
11
- var _a, _b;
12
11
  const graph = (0, devkit_1.readCachedProjectGraph)();
13
12
  const { targets: ctTargets, name: ctProjectName } = (0, ct_helpers_1.getProjectConfigByPath)(graph, pathToConfig);
14
- const ctTargetName = (options === null || options === void 0 ? void 0 : options.ctTargetName) || 'component-test';
13
+ const ctTargetName = options?.ctTargetName || 'component-test';
15
14
  const ctConfigurationName = process.env.NX_CYPRESS_TARGET_CONFIGURATION;
16
15
  const ctExecutorContext = (0, ct_helpers_1.createExecutorContext)(graph, ctTargets, ctProjectName, ctTargetName, ctConfigurationName);
17
16
  const ctExecutorOptions = (0, devkit_1.readTargetOptions)({
@@ -25,18 +24,18 @@ function nxComponentTestingPreset(pathToConfig, options) {
25
24
  let buildOuputPath = `dist/${ctProjectName}/.next`;
26
25
  if (buildTarget) {
27
26
  const parsedBuildTarget = (0, devkit_1.parseTargetString)(buildTarget, graph);
28
- const buildProjectConfig = (_a = graph.nodes[parsedBuildTarget.project]) === null || _a === void 0 ? void 0 : _a.data;
27
+ const buildProjectConfig = graph.nodes[parsedBuildTarget.project]?.data;
29
28
  const buildExecutorContext = (0, ct_helpers_1.createExecutorContext)(graph, buildProjectConfig.targets, parsedBuildTarget.project, parsedBuildTarget.target, parsedBuildTarget.configuration);
30
29
  const buildExecutorOptions = (0, devkit_1.readTargetOptions)({
31
30
  project: parsedBuildTarget.project,
32
31
  target: parsedBuildTarget.target,
33
32
  configuration: parsedBuildTarget.configuration,
34
33
  }, buildExecutorContext);
35
- buildAssets !== null && buildAssets !== void 0 ? buildAssets : (buildAssets = buildExecutorOptions.assets);
36
- buildFileReplacements !== null && buildFileReplacements !== void 0 ? buildFileReplacements : (buildFileReplacements = buildExecutorOptions.fileReplacements);
37
- buildOuputPath !== null && buildOuputPath !== void 0 ? buildOuputPath : (buildOuputPath = buildExecutorOptions.outputPath);
34
+ buildAssets ??= buildExecutorOptions.assets;
35
+ buildFileReplacements ??= buildExecutorOptions.fileReplacements;
36
+ buildOuputPath ??= buildExecutorOptions.outputPath;
38
37
  }
39
- const ctProjectConfig = (_b = graph.nodes[ctProjectName]) === null || _b === void 0 ? void 0 : _b.data;
38
+ const ctProjectConfig = graph.nodes[ctProjectName]?.data;
40
39
  if (!ctProjectConfig) {
41
40
  throw new Error((0, devkit_1.stripIndents) `Unable to load project configs from the project graph.
42
41
  Provided build target, ${buildTarget}.
@@ -63,6 +62,13 @@ Able to find CT project, ${!!ctProjectConfig}.`);
63
62
  options: webpackOptions,
64
63
  context: ctExecutorContext,
65
64
  });
66
- return Object.assign(Object.assign({}, (0, cypress_preset_1.nxBaseCypressPreset)(__filename)), { specPattern: '**/*.cy.{js,jsx,ts,tsx}', devServer: Object.assign(Object.assign({}, { framework: 'react', bundler: 'webpack' }), { webpackConfig }) });
65
+ return {
66
+ ...(0, cypress_preset_1.nxBaseCypressPreset)(__filename),
67
+ specPattern: '**/*.cy.{js,jsx,ts,tsx}',
68
+ devServer: {
69
+ ...{ framework: 'react', bundler: 'webpack' },
70
+ webpackConfig,
71
+ },
72
+ };
67
73
  }
68
74
  exports.nxComponentTestingPreset = nxComponentTestingPreset;
@@ -1,21 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.withLess = void 0;
4
- const tslib_1 = require("tslib");
5
4
  // Adapted from https://raw.githubusercontent.com/elado/next-with-less/main/src/index.js
6
5
  const webpack_merge_1 = require("webpack-merge");
7
6
  const addLessToRegExp = (rx) => new RegExp(rx.source.replace('|sass', '|sass|less'), rx.flags);
8
7
  function withLess(configOrFn) {
9
- return (phase) => tslib_1.__awaiter(this, void 0, void 0, function* () {
10
- const baseConfig = typeof configOrFn === 'function' ? yield configOrFn(phase) : configOrFn;
11
- const { lessLoaderOptions = {} } = baseConfig, nextConfig = tslib_1.__rest(baseConfig, ["lessLoaderOptions"]);
8
+ return async (phase) => {
9
+ const baseConfig = typeof configOrFn === 'function' ? await configOrFn(phase) : configOrFn;
10
+ const { lessLoaderOptions = {}, ...nextConfig } = baseConfig;
12
11
  return Object.assign({}, nextConfig, {
13
12
  webpack(config, opts) {
14
13
  // there are 2 relevant sass rules in next.js - css modules and global css
15
14
  let sassModuleRule;
16
15
  // global sass rule (does not exist in server builds)
17
16
  let sassGlobalRule;
18
- const cssRule = config.module.rules.find((rule) => { var _a; return (_a = rule.oneOf) === null || _a === void 0 ? void 0 : _a.find((r) => r === null || r === void 0 ? void 0 : r[Symbol.for('__next_css_remove')]); });
17
+ const cssRule = config.module.rules.find((rule) => rule.oneOf?.find((r) => r?.[Symbol.for('__next_css_remove')]));
19
18
  const addLessToRuleTest = (test) => {
20
19
  if (Array.isArray(test)) {
21
20
  return test.map((rx) => addLessToRegExp(rx));
@@ -25,28 +24,34 @@ function withLess(configOrFn) {
25
24
  }
26
25
  };
27
26
  cssRule.oneOf.forEach((rule) => {
28
- var _a, _b, _c, _d, _e, _f, _g, _h;
29
- if ((_a = rule.options) === null || _a === void 0 ? void 0 : _a.__next_css_remove)
27
+ if (rule.options?.__next_css_remove)
30
28
  return;
31
- if (((_b = rule.use) === null || _b === void 0 ? void 0 : _b.loader) === 'error-loader') {
29
+ if (rule.use?.loader === 'error-loader') {
32
30
  rule.test = addLessToRuleTest(rule.test);
33
31
  }
34
- else if ((_d = (_c = rule.use) === null || _c === void 0 ? void 0 : _c.loader) === null || _d === void 0 ? void 0 : _d.includes('file-loader')) {
32
+ else if (rule.use?.loader?.includes('file-loader')) {
35
33
  rule.issuer = addLessToRuleTest(rule.issuer);
36
34
  }
37
- else if ((_f = (_e = rule.use) === null || _e === void 0 ? void 0 : _e.includes) === null || _f === void 0 ? void 0 : _f.call(_e, 'ignore-loader')) {
35
+ else if (rule.use?.includes?.('ignore-loader')) {
38
36
  rule.test = addLessToRuleTest(rule.test);
39
37
  }
40
- else if (((_g = rule.test) === null || _g === void 0 ? void 0 : _g.source) === '\\.module\\.(scss|sass)$') {
38
+ else if (rule.test?.source === '\\.module\\.(scss|sass)$') {
41
39
  sassModuleRule = rule;
42
40
  }
43
- else if (((_h = rule.test) === null || _h === void 0 ? void 0 : _h.source) === '(?<!\\.module)\\.(scss|sass)$') {
41
+ else if (rule.test?.source === '(?<!\\.module)\\.(scss|sass)$') {
44
42
  sassGlobalRule = rule;
45
43
  }
46
44
  });
47
45
  const lessLoader = {
48
46
  loader: 'less-loader',
49
- options: Object.assign(Object.assign({}, lessLoaderOptions), { lessOptions: Object.assign({ javascriptEnabled: true }, lessLoaderOptions.lessOptions) }),
47
+ options: {
48
+ ...lessLoaderOptions,
49
+ lessOptions: {
50
+ javascriptEnabled: true,
51
+ // @ts-ignore
52
+ ...lessLoaderOptions.lessOptions,
53
+ },
54
+ },
50
55
  };
51
56
  let lessModuleRule = (0, webpack_merge_1.merge)(sassModuleRule);
52
57
  const configureLessRule = (rule) => {
@@ -67,7 +72,7 @@ function withLess(configOrFn) {
67
72
  return config;
68
73
  },
69
74
  });
70
- });
75
+ };
71
76
  }
72
77
  exports.withLess = withLess;
73
78
  module.exports = withLess;
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.withNx = exports.forNextVersion = exports.getAliasForProject = exports.getNextConfig = void 0;
4
- const tslib_1 = require("tslib");
5
4
  const baseNXEnvironmentVariables = [
6
5
  'NX_BASE',
7
6
  'NX_CACHE_DIRECTORY',
@@ -80,19 +79,22 @@ function getNxContext(graph, target) {
80
79
  * Try to read output dir from project, and default to '.next' if executing outside of Nx (e.g. dist is added to a docker image).
81
80
  */
82
81
  function withNx(_nextConfig = {}, context = getWithNxContext()) {
83
- return (phase) => tslib_1.__awaiter(this, void 0, void 0, function* () {
84
- const { PHASE_PRODUCTION_SERVER } = yield Promise.resolve().then(() => require('next/constants'));
82
+ return async (phase) => {
83
+ const { PHASE_PRODUCTION_SERVER } = await Promise.resolve().then(() => require('next/constants'));
85
84
  if (phase === PHASE_PRODUCTION_SERVER) {
86
85
  // If we are running an already built production server, just return the configuration.
87
86
  // NOTE: Avoid any `require(...)` or `import(...)` statements here. Development dependencies are not available at production runtime.
88
- const { nx } = _nextConfig, validNextConfig = tslib_1.__rest(_nextConfig, ["nx"]);
89
- return Object.assign({ distDir: '.next' }, validNextConfig);
87
+ const { nx, ...validNextConfig } = _nextConfig;
88
+ return {
89
+ distDir: '.next',
90
+ ...validNextConfig,
91
+ };
90
92
  }
91
93
  else {
92
94
  const { createProjectGraphAsync, joinPathFragments, offsetFromRoot, workspaceRoot, } = require('@nx/devkit');
93
95
  // Otherwise, add in webpack and eslint configuration for build or test.
94
96
  let dependencies = [];
95
- const graph = yield createProjectGraphAsync();
97
+ const graph = await createProjectGraphAsync();
96
98
  const originalTarget = {
97
99
  project: process.env.NX_TASK_TARGET_PROJECT,
98
100
  target: process.env.NX_TASK_TARGET_TARGET,
@@ -109,14 +111,13 @@ function withNx(_nextConfig = {}, context = getWithNxContext()) {
109
111
  const nextConfig = getNextConfig(_nextConfig, context);
110
112
  // For Next.js 13.1 and greater, make sure workspace libs are transpiled.
111
113
  forNextVersion('>=13.1.0', () => {
112
- var _a;
113
114
  if (!graph.dependencies[project])
114
115
  return;
115
116
  const { readTsConfigPaths } = require('@nx/js');
116
117
  const { findAllProjectNodeDependencies, } = require('nx/src/utils/project-graph-utils');
117
118
  const paths = readTsConfigPaths();
118
119
  const deps = findAllProjectNodeDependencies(project);
119
- (_a = nextConfig.transpilePackages) !== null && _a !== void 0 ? _a : (nextConfig.transpilePackages = []);
120
+ nextConfig.transpilePackages ??= [];
120
121
  for (const dep of deps) {
121
122
  const alias = getAliasForProject(graph.nodes[dep], paths);
122
123
  if (alias) {
@@ -141,23 +142,28 @@ function withNx(_nextConfig = {}, context = getWithNxContext()) {
141
142
  nextConfig.webpack = (a, b) => createWebpackConfig(workspaceRoot, projectDirectory, options.fileReplacements, options.assets)(userWebpackConfig ? userWebpackConfig(a, b) : a, b);
142
143
  return nextConfig;
143
144
  }
144
- });
145
+ };
145
146
  }
146
147
  exports.withNx = withNx;
147
148
  function getNextConfig(nextConfig = {}, context = getWithNxContext()) {
148
- var _a;
149
149
  // If `next-compose-plugins` is used, the context argument is invalid.
150
150
  if (!context.libsDir || !context.workspaceRoot) {
151
151
  context = getWithNxContext();
152
152
  }
153
153
  const userWebpack = nextConfig.webpack || ((x) => x);
154
- const { nx } = nextConfig, validNextConfig = tslib_1.__rest(nextConfig, ["nx"]);
155
- return Object.assign(Object.assign({ eslint: Object.assign({ ignoreDuringBuilds: true }, ((_a = validNextConfig.eslint) !== null && _a !== void 0 ? _a : {})) }, validNextConfig), { webpack: (config, options) => {
154
+ const { nx, ...validNextConfig } = nextConfig;
155
+ return {
156
+ eslint: {
157
+ ignoreDuringBuilds: true,
158
+ ...(validNextConfig.eslint ?? {}),
159
+ },
160
+ ...validNextConfig,
161
+ webpack: (config, options) => {
156
162
  /*
157
163
  * Update babel to support our monorepo setup.
158
164
  * The 'upward' mode allows the root babel.config.json and per-project .babelrc files to be picked up.
159
165
  */
160
- if (nx === null || nx === void 0 ? void 0 : nx.babelUpwardRootMode) {
166
+ if (nx?.babelUpwardRootMode) {
161
167
  options.defaultLoaders.babel.options.babelrc = true;
162
168
  options.defaultLoaders.babel.options.rootMode = 'upward';
163
169
  }
@@ -214,10 +220,7 @@ function getNextConfig(nextConfig = {}, context = getWithNxContext()) {
214
220
  /**
215
221
  * 4. Modify css loader to allow global css from node_modules to be imported from workspace libs
216
222
  */
217
- const nextGlobalCssLoader = nextCssLoaders.oneOf.find((rule) => {
218
- var _a, _b;
219
- return (_b = (_a = rule.include) === null || _a === void 0 ? void 0 : _a.and) === null || _b === void 0 ? void 0 : _b.find((include) => regexEqual(include, /node_modules/));
220
- });
223
+ const nextGlobalCssLoader = nextCssLoaders.oneOf.find((rule) => rule.include?.and?.find((include) => regexEqual(include, /node_modules/)));
221
224
  // Might not be found if Next.js webpack config changes in the future
222
225
  if (nextGlobalCssLoader && nextGlobalCssLoader.issuer) {
223
226
  nextGlobalCssLoader.issuer.or = nextGlobalCssLoader.issuer.and
@@ -233,7 +236,7 @@ function getNextConfig(nextConfig = {}, context = getWithNxContext()) {
233
236
  * 6. Add SVGR support if option is on.
234
237
  */
235
238
  // Default SVGR support to be on for projects.
236
- if ((nx === null || nx === void 0 ? void 0 : nx.svgr) !== false) {
239
+ if (nx?.svgr !== false) {
237
240
  config.module.rules.push({
238
241
  test: /\.svg$/,
239
242
  oneOf: [
@@ -270,7 +273,8 @@ function getNextConfig(nextConfig = {}, context = getWithNxContext()) {
270
273
  });
271
274
  }
272
275
  return userWebpack(config, options);
273
- } });
276
+ },
277
+ };
274
278
  }
275
279
  exports.getNextConfig = getNextConfig;
276
280
  function getNonBaseVariables(oldEnv) {
@@ -289,10 +293,8 @@ function getNxEnvironmentVariables() {
289
293
  * @deprecated Use Next.js 9.4+ built-in support for environment variables. Reference https://nextjs.org/docs/pages/api-reference/next-config-js/env
290
294
  */
291
295
  function addNxEnvVariables(config) {
292
- var _a;
293
- const maybeDefinePlugin = (_a = config.plugins) === null || _a === void 0 ? void 0 : _a.find((plugin) => {
294
- var _a;
295
- return (_a = plugin.definitions) === null || _a === void 0 ? void 0 : _a['process.env.NODE_ENV'];
296
+ const maybeDefinePlugin = config.plugins?.find((plugin) => {
297
+ return plugin.definitions?.['process.env.NODE_ENV'];
296
298
  });
297
299
  if (maybeDefinePlugin) {
298
300
  const env = getNxEnvironmentVariables();
@@ -309,11 +311,8 @@ function addNxEnvVariables(config) {
309
311
  function getAliasForProject(node, paths) {
310
312
  // Match workspace libs to their alias in tsconfig paths.
311
313
  for (const [alias, lookup] of Object.entries(paths)) {
312
- const lookupContainsDepNode = lookup.some((lookupPath) => {
313
- var _a, _b;
314
- return lookupPath.startsWith((_a = node === null || node === void 0 ? void 0 : node.data) === null || _a === void 0 ? void 0 : _a.root) ||
315
- lookupPath.startsWith('./' + ((_b = node === null || node === void 0 ? void 0 : node.data) === null || _b === void 0 ? void 0 : _b.root));
316
- });
314
+ const lookupContainsDepNode = lookup.some((lookupPath) => lookupPath.startsWith(node?.data?.root) ||
315
+ lookupPath.startsWith('./' + node?.data?.root));
317
316
  if (lookupContainsDepNode) {
318
317
  return alias;
319
318
  }
@@ -1,21 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.withStylus = void 0;
4
- const tslib_1 = require("tslib");
5
4
  // Adapted from https://raw.githubusercontent.com/elado/next-with-less/main/src/index.js
6
5
  const webpack_merge_1 = require("webpack-merge");
7
6
  const addStylusToRegExp = (rx) => new RegExp(rx.source.replace('|sass', '|sass|styl'), rx.flags);
8
7
  function withStylus(configOrFn) {
9
- return (phase) => tslib_1.__awaiter(this, void 0, void 0, function* () {
10
- const baseConfig = typeof configOrFn === 'function' ? yield configOrFn(phase) : configOrFn;
11
- const { stylusLoaderOptions = {} } = baseConfig, nextConfig = tslib_1.__rest(baseConfig, ["stylusLoaderOptions"]);
8
+ return async (phase) => {
9
+ const baseConfig = typeof configOrFn === 'function' ? await configOrFn(phase) : configOrFn;
10
+ const { stylusLoaderOptions = {}, ...nextConfig } = baseConfig;
12
11
  return Object.assign({}, nextConfig, {
13
12
  webpack(config, opts) {
14
13
  // there are 2 relevant sass rules in next.js - css modules and global css
15
14
  let sassModuleRule;
16
15
  // global sass rule (does not exist in server builds)
17
16
  let sassGlobalRule;
18
- const cssRule = config.module.rules.find((rule) => { var _a; return (_a = rule.oneOf) === null || _a === void 0 ? void 0 : _a.find((r) => r === null || r === void 0 ? void 0 : r[Symbol.for('__next_css_remove')]); });
17
+ const cssRule = config.module.rules.find((rule) => rule.oneOf?.find((r) => r?.[Symbol.for('__next_css_remove')]));
19
18
  const addStylusRuleToTest = (test) => {
20
19
  if (Array.isArray(test)) {
21
20
  return test.map((rx) => addStylusToRegExp(rx));
@@ -25,28 +24,33 @@ function withStylus(configOrFn) {
25
24
  }
26
25
  };
27
26
  cssRule.oneOf.forEach((rule) => {
28
- var _a, _b, _c, _d, _e, _f, _g, _h;
29
- if ((_a = rule.options) === null || _a === void 0 ? void 0 : _a.__next_css_remove)
27
+ if (rule.options?.__next_css_remove)
30
28
  return;
31
- if (((_b = rule.use) === null || _b === void 0 ? void 0 : _b.loader) === 'error-loader') {
29
+ if (rule.use?.loader === 'error-loader') {
32
30
  rule.test = addStylusRuleToTest(rule.test);
33
31
  }
34
- else if ((_d = (_c = rule.use) === null || _c === void 0 ? void 0 : _c.loader) === null || _d === void 0 ? void 0 : _d.includes('file-loader')) {
32
+ else if (rule.use?.loader?.includes('file-loader')) {
35
33
  rule.issuer = addStylusRuleToTest(rule.issuer);
36
34
  }
37
- else if ((_f = (_e = rule.use) === null || _e === void 0 ? void 0 : _e.includes) === null || _f === void 0 ? void 0 : _f.call(_e, 'ignore-loader')) {
35
+ else if (rule.use?.includes?.('ignore-loader')) {
38
36
  rule.test = addStylusRuleToTest(rule.test);
39
37
  }
40
- else if (((_g = rule.test) === null || _g === void 0 ? void 0 : _g.source) === '\\.module\\.(scss|sass)$') {
38
+ else if (rule.test?.source === '\\.module\\.(scss|sass)$') {
41
39
  sassModuleRule = rule;
42
40
  }
43
- else if (((_h = rule.test) === null || _h === void 0 ? void 0 : _h.source) === '(?<!\\.module)\\.(scss|sass)$') {
41
+ else if (rule.test?.source === '(?<!\\.module)\\.(scss|sass)$') {
44
42
  sassGlobalRule = rule;
45
43
  }
46
44
  });
47
45
  const stylusLoader = {
48
46
  loader: 'stylus-loader',
49
- options: Object.assign(Object.assign({}, stylusLoaderOptions), { stylusOptions: Object.assign({ javascriptEnabled: true }, stylusLoaderOptions.stylusOptions) }),
47
+ options: {
48
+ ...stylusLoaderOptions,
49
+ stylusOptions: {
50
+ javascriptEnabled: true,
51
+ ...stylusLoaderOptions.stylusOptions,
52
+ },
53
+ },
50
54
  };
51
55
  let stylusModuleRule = (0, webpack_merge_1.merge)({}, sassModuleRule);
52
56
  const configureStylusRule = (rule) => {
@@ -67,7 +71,7 @@ function withStylus(configOrFn) {
67
71
  return config;
68
72
  },
69
73
  });
70
- });
74
+ };
71
75
  }
72
76
  exports.withStylus = withStylus;
73
77
  module.exports = withStylus;
@@ -1,6 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const tslib_1 = require("tslib");
4
3
  const devkit_1 = require("@nx/devkit");
5
4
  const js_1 = require("@nx/js");
6
5
  const path_1 = require("path");
@@ -14,79 +13,74 @@ const check_project_1 = require("./lib/check-project");
14
13
  const child_process_1 = require("child_process");
15
14
  const create_cli_options_1 = require("../../utils/create-cli-options");
16
15
  let childProcess;
17
- function buildExecutor(options, context) {
18
- var _a, _b, _c;
19
- var _d, _e;
20
- return tslib_1.__awaiter(this, void 0, void 0, function* () {
21
- // Cast to any to overwrite NODE_ENV
22
- (_d = process.env).NODE_ENV || (_d.NODE_ENV = 'production');
23
- const projectRoot = context.projectGraph.nodes[context.projectName].data.root;
24
- (0, check_project_1.checkPublicDirectory)(projectRoot);
25
- // Set `__NEXT_REACT_ROOT` based on installed ReactDOM version
26
- const packageJsonPath = (0, path_1.join)(projectRoot, 'package.json');
27
- const packageJson = (0, fs_extra_1.existsSync)(packageJsonPath)
28
- ? (0, devkit_1.readJsonFile)(packageJsonPath)
29
- : undefined;
30
- const rootPackageJson = (0, devkit_1.readJsonFile)((0, path_1.join)(context.root, 'package.json'));
31
- const reactDomVersion = (_b = (_a = packageJson === null || packageJson === void 0 ? void 0 : packageJson.dependencies) === null || _a === void 0 ? void 0 : _a['react-dom']) !== null && _b !== void 0 ? _b : (_c = rootPackageJson.dependencies) === null || _c === void 0 ? void 0 : _c['react-dom'];
32
- const hasReact18 = reactDomVersion &&
33
- (0, semver_1.gte)((0, semver_2.checkAndCleanWithSemver)('react-dom', reactDomVersion), '18.0.0');
34
- if (hasReact18) {
35
- (_e = process.env)['__NEXT_REACT_ROOT'] || (_e['__NEXT_REACT_ROOT'] = 'true');
16
+ async function buildExecutor(options, context) {
17
+ // Cast to any to overwrite NODE_ENV
18
+ process.env.NODE_ENV ||= 'production';
19
+ const projectRoot = context.projectGraph.nodes[context.projectName].data.root;
20
+ (0, check_project_1.checkPublicDirectory)(projectRoot);
21
+ // Set `__NEXT_REACT_ROOT` based on installed ReactDOM version
22
+ const packageJsonPath = (0, path_1.join)(projectRoot, 'package.json');
23
+ const packageJson = (0, fs_extra_1.existsSync)(packageJsonPath)
24
+ ? (0, devkit_1.readJsonFile)(packageJsonPath)
25
+ : undefined;
26
+ const rootPackageJson = (0, devkit_1.readJsonFile)((0, path_1.join)(context.root, 'package.json'));
27
+ const reactDomVersion = packageJson?.dependencies?.['react-dom'] ??
28
+ rootPackageJson.dependencies?.['react-dom'];
29
+ const hasReact18 = reactDomVersion &&
30
+ (0, semver_1.gte)((0, semver_2.checkAndCleanWithSemver)('react-dom', reactDomVersion), '18.0.0');
31
+ if (hasReact18) {
32
+ process.env['__NEXT_REACT_ROOT'] ||= 'true';
33
+ }
34
+ try {
35
+ await runCliBuild(devkit_1.workspaceRoot, projectRoot, options);
36
+ }
37
+ catch (error) {
38
+ devkit_1.logger.error(`Error occurred while trying to run the build command`);
39
+ devkit_1.logger.error(error);
40
+ return { success: false };
41
+ }
42
+ finally {
43
+ if (childProcess) {
44
+ childProcess.kill();
36
45
  }
37
- try {
38
- yield runCliBuild(devkit_1.workspaceRoot, projectRoot, options);
39
- }
40
- catch (error) {
41
- devkit_1.logger.error(`Error occurred while trying to run the build command`);
42
- devkit_1.logger.error(error);
43
- return { success: false };
44
- }
45
- finally {
46
- if (childProcess) {
47
- childProcess.kill();
48
- }
49
- }
50
- if (!(0, fileutils_1.directoryExists)(options.outputPath)) {
51
- (0, fs_extra_1.mkdir)(options.outputPath);
52
- }
53
- const builtPackageJson = (0, js_1.createPackageJson)(context.projectName, context.projectGraph, {
54
- target: context.targetName,
55
- root: context.root,
56
- isProduction: !options.includeDevDependenciesInPackageJson, // By default we remove devDependencies since this is a production build.
57
- });
58
- // Update `package.json` to reflect how users should run the build artifacts
59
- builtPackageJson.scripts = {
60
- start: 'next start',
61
- };
62
- (0, update_package_json_1.updatePackageJson)(builtPackageJson, context);
63
- (0, devkit_1.writeJsonFile)(`${options.outputPath}/package.json`, builtPackageJson);
64
- if (options.generateLockfile) {
65
- const packageManager = (0, devkit_1.detectPackageManager)(context.root);
66
- const lockFile = (0, js_1.createLockFile)(builtPackageJson, context.projectGraph, packageManager);
67
- (0, fs_extra_1.writeFileSync)(`${options.outputPath}/${(0, js_1.getLockFileName)(packageManager)}`, lockFile, {
68
- encoding: 'utf-8',
69
- });
70
- }
71
- // If output path is different from source path, then copy over the config and public files.
72
- // This is the default behavior when running `nx build <app>`.
73
- if (options.outputPath.replace(/\/$/, '') !== projectRoot) {
74
- (0, create_next_config_file_1.createNextConfigFile)(options, context);
75
- (0, fs_extra_1.copySync)((0, path_1.join)(projectRoot, 'public'), (0, path_1.join)(options.outputPath, 'public'), {
76
- dereference: true,
77
- });
78
- }
79
- return { success: true };
46
+ }
47
+ if (!(0, fileutils_1.directoryExists)(options.outputPath)) {
48
+ (0, fs_extra_1.mkdir)(options.outputPath);
49
+ }
50
+ const builtPackageJson = (0, js_1.createPackageJson)(context.projectName, context.projectGraph, {
51
+ target: context.targetName,
52
+ root: context.root,
53
+ isProduction: !options.includeDevDependenciesInPackageJson, // By default we remove devDependencies since this is a production build.
80
54
  });
55
+ // Update `package.json` to reflect how users should run the build artifacts
56
+ builtPackageJson.scripts = {
57
+ start: 'next start',
58
+ };
59
+ (0, update_package_json_1.updatePackageJson)(builtPackageJson, context);
60
+ (0, devkit_1.writeJsonFile)(`${options.outputPath}/package.json`, builtPackageJson);
61
+ if (options.generateLockfile) {
62
+ const packageManager = (0, devkit_1.detectPackageManager)(context.root);
63
+ const lockFile = (0, js_1.createLockFile)(builtPackageJson, context.projectGraph, packageManager);
64
+ (0, fs_extra_1.writeFileSync)(`${options.outputPath}/${(0, js_1.getLockFileName)(packageManager)}`, lockFile, {
65
+ encoding: 'utf-8',
66
+ });
67
+ }
68
+ // If output path is different from source path, then copy over the config and public files.
69
+ // This is the default behavior when running `nx build <app>`.
70
+ if (options.outputPath.replace(/\/$/, '') !== projectRoot) {
71
+ (0, create_next_config_file_1.createNextConfigFile)(options, context);
72
+ (0, fs_extra_1.copySync)((0, path_1.join)(projectRoot, 'public'), (0, path_1.join)(options.outputPath, 'public'), {
73
+ dereference: true,
74
+ });
75
+ }
76
+ return { success: true };
81
77
  }
82
78
  exports.default = buildExecutor;
83
79
  function runCliBuild(workspaceRoot, projectRoot, options) {
84
- var _a;
85
- var _b;
86
80
  const { experimentalAppOnly, profile, debug, outputPath } = options;
87
81
  // Set output path here since it can also be set via CLI
88
82
  // We can retrieve it inside plugins/with-nx
89
- (_a = (_b = process.env).NX_NEXT_OUTPUT_PATH) !== null && _a !== void 0 ? _a : (_b.NX_NEXT_OUTPUT_PATH = outputPath);
83
+ process.env.NX_NEXT_OUTPUT_PATH ??= outputPath;
90
84
  const args = (0, create_cli_options_1.createCliOptions)({ experimentalAppOnly, profile, debug });
91
85
  return new Promise((resolve, reject) => {
92
86
  childProcess = (0, child_process_1.fork)(require.resolve('next/dist/bin/next'), ['build', ...args], {
@@ -53,9 +53,8 @@ function readSource(getFile) {
53
53
  }
54
54
  // Exported for testing
55
55
  function getWithNxContent({ file, content } = readSource(() => (0, path_1.join)(__dirname, '../../../../plugins/with-nx.js'))) {
56
- var _a;
57
56
  const withNxSource = ts.createSourceFile(file, content, ts.ScriptTarget.Latest, true);
58
- const getWithNxContextDeclaration = (_a = (0, typescript_1.findNodes)(withNxSource, ts.SyntaxKind.FunctionDeclaration)) === null || _a === void 0 ? void 0 : _a.find((node) => { var _a; return ((_a = node.name) === null || _a === void 0 ? void 0 : _a.text) === 'getWithNxContext'; });
57
+ const getWithNxContextDeclaration = (0, typescript_1.findNodes)(withNxSource, ts.SyntaxKind.FunctionDeclaration)?.find((node) => node.name?.text === 'getWithNxContext');
59
58
  if (getWithNxContextDeclaration) {
60
59
  content = (0, devkit_1.applyChangesToString)(content, [
61
60
  {
@@ -139,8 +138,7 @@ function getRelativeImports({ file, content, }) {
139
138
  }
140
139
  exports.getRelativeImports = getRelativeImports;
141
140
  function stripOuterQuotes(str) {
142
- var _a, _b;
143
- return (_b = (_a = str.match(/^["'](.*)["']/)) === null || _a === void 0 ? void 0 : _a[1]) !== null && _b !== void 0 ? _b : str;
141
+ return str.match(/^["'](.*)["']/)?.[1] ?? str;
144
142
  }
145
143
  // Exported for testing
146
144
  function ensureFileExtensions(files, absoluteDir) {
@@ -2,21 +2,19 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.updatePackageJson = void 0;
4
4
  function updatePackageJson(packageJson, context) {
5
- var _a, _b;
6
- var _c;
7
5
  if (!packageJson.scripts) {
8
6
  packageJson.scripts = {};
9
7
  }
10
8
  if (!packageJson.scripts.start) {
11
9
  packageJson.scripts.start = 'next start';
12
10
  }
13
- (_a = packageJson.dependencies) !== null && _a !== void 0 ? _a : (packageJson.dependencies = {});
11
+ packageJson.dependencies ??= {};
14
12
  // These are always required for a production Next.js app to run.
15
13
  const requiredPackages = ['react', 'react-dom', 'next', 'typescript'];
16
14
  for (const pkg of requiredPackages) {
17
15
  const externalNode = context.projectGraph.externalNodes[`npm:${pkg}`];
18
16
  if (externalNode) {
19
- (_b = (_c = packageJson.dependencies)[pkg]) !== null && _b !== void 0 ? _b : (_c[pkg] = externalNode.data.version);
17
+ packageJson.dependencies[pkg] ??= externalNode.data.version;
20
18
  }
21
19
  }
22
20
  }