@nx/next 18.1.0-beta.0 → 18.1.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nx/next",
3
- "version": "18.1.0-beta.0",
3
+ "version": "18.1.0-beta.2",
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": {
@@ -34,7 +34,7 @@
34
34
  "next": ">=14.0.0"
35
35
  },
36
36
  "dependencies": {
37
- "@nx/devkit": "18.1.0-beta.0",
37
+ "@nx/devkit": "18.1.0-beta.2",
38
38
  "@babel/plugin-proposal-decorators": "^7.22.7",
39
39
  "@svgr/webpack": "^8.0.1",
40
40
  "chalk": "^4.1.0",
@@ -45,13 +45,13 @@
45
45
  "url-loader": "^4.1.1",
46
46
  "tslib": "^2.3.0",
47
47
  "webpack-merge": "^5.8.0",
48
- "@nx/js": "18.1.0-beta.0",
49
- "@nx/eslint": "18.1.0-beta.0",
50
- "@nx/react": "18.1.0-beta.0",
51
- "@nx/web": "18.1.0-beta.0",
52
- "@nx/webpack": "18.1.0-beta.0",
53
- "@nx/workspace": "18.1.0-beta.0",
54
- "@nrwl/next": "18.1.0-beta.0"
48
+ "@nx/js": "18.1.0-beta.2",
49
+ "@nx/eslint": "18.1.0-beta.2",
50
+ "@nx/react": "18.1.0-beta.2",
51
+ "@nx/web": "18.1.0-beta.2",
52
+ "@nx/webpack": "18.1.0-beta.2",
53
+ "@nx/workspace": "18.1.0-beta.2",
54
+ "@nrwl/next": "18.1.0-beta.2"
55
55
  },
56
56
  "publishConfig": {
57
57
  "access": "public"
@@ -119,6 +119,11 @@ function withNx(_nextConfig = {}, context = getWithNxContext()) {
119
119
  ? joinPathFragments(outputDir, nextConfig.distDir)
120
120
  : joinPathFragments(outputDir, '.next');
121
121
  }
122
+ // If we are running a static serve of the Next.js app, we need to change the output to 'export' and the distDir to 'out'.
123
+ if (process.env.NX_SERVE_STATIC_BUILD_RUNNING === 'true') {
124
+ nextConfig.output = 'export';
125
+ nextConfig.distDir = 'out';
126
+ }
122
127
  const userWebpackConfig = nextConfig.webpack;
123
128
  const { createWebpackConfig } = require('@nx/next/src/utils/config');
124
129
  nextConfig.webpack = (a, b) => createWebpackConfig(workspaceRoot, projectDirectory, options.fileReplacements, options.assets)(userWebpackConfig ? userWebpackConfig(a, b) : a, b);
@@ -4,6 +4,7 @@ exports.addE2e = void 0;
4
4
  const devkit_1 = require("@nx/devkit");
5
5
  const eslint_1 = require("@nx/eslint");
6
6
  const versions_1 = require("../../../utils/versions");
7
+ const web_1 = require("@nx/web");
7
8
  async function addE2e(host, options) {
8
9
  const nxJson = (0, devkit_1.readNxJson)(host);
9
10
  const hasPlugin = nxJson.plugins?.some((p) => typeof p === 'string'
@@ -11,6 +12,13 @@ async function addE2e(host, options) {
11
12
  : p.plugin === '@nx/next/plugin');
12
13
  if (options.e2eTestRunner === 'cypress') {
13
14
  const { configurationGenerator } = (0, devkit_1.ensurePackage)('@nx/cypress', versions_1.nxVersion);
15
+ if (!hasPlugin) {
16
+ (0, web_1.webStaticServeGenerator)(host, {
17
+ buildTarget: `${options.projectName}:build`,
18
+ outputPath: `${options.outputPath}/out`,
19
+ targetName: 'serve-static',
20
+ });
21
+ }
14
22
  (0, devkit_1.addProjectConfiguration)(host, options.e2eProjectName, {
15
23
  root: options.e2eProjectRoot,
16
24
  sourceRoot: (0, devkit_1.joinPathFragments)(options.e2eProjectRoot, 'src'),
@@ -27,6 +35,14 @@ async function addE2e(host, options) {
27
35
  devServerTarget: `${options.projectName}:${hasPlugin ? 'start' : 'serve'}`,
28
36
  baseUrl: `http://localhost:${hasPlugin ? '3000' : '4200'}`,
29
37
  jsx: true,
38
+ webServerCommands: hasPlugin
39
+ ? {
40
+ default: `nx run ${options.projectName}:start`,
41
+ }
42
+ : undefined,
43
+ ciWebServerCommand: hasPlugin
44
+ ? `nx run ${options.projectName}:serve-static`
45
+ : undefined,
30
46
  });
31
47
  }
32
48
  else if (options.e2eTestRunner === 'playwright') {
@@ -304,7 +304,7 @@ function createAppJsx(name) {
304
304
  You can activate distributed tasks executions and caching by
305
305
  running:
306
306
  </p>
307
- <pre>nx connect-to-nx-cloud</pre>
307
+ <pre>nx connect</pre>
308
308
  <a
309
309
  href="https://nx.app/?utm_source=nx-project"
310
310
  target="_blank"
@@ -18,6 +18,7 @@ function addPlugin(tree) {
18
18
  buildTargetName: 'build',
19
19
  devTargetName: 'dev',
20
20
  startTargetName: 'start',
21
+ serveStaticTargetName: 'serve-static',
21
22
  },
22
23
  });
23
24
  (0, devkit_1.updateNxJson)(tree, nxJson);
@@ -4,6 +4,7 @@ export interface NextPluginOptions {
4
4
  buildTargetName?: string;
5
5
  devTargetName?: string;
6
6
  startTargetName?: string;
7
+ serveStaticTargetName?: string;
7
8
  }
8
9
  export declare const createDependencies: CreateDependencies;
9
10
  export declare const createNodes: CreateNodes<NextPluginOptions>;
@@ -56,6 +56,7 @@ async function buildNextTargets(nextConfigPath, projectRoot, options, context) {
56
56
  targets[options.buildTargetName] = await getBuildTargetConfig(namedInputs, projectRoot, nextConfig);
57
57
  targets[options.devTargetName] = getDevTargetConfig(projectRoot);
58
58
  targets[options.startTargetName] = getStartTargetConfig(options, projectRoot);
59
+ targets[options.serveStaticTargetName] = getStaticServeTargetConfig(options);
59
60
  return targets;
60
61
  }
61
62
  async function getBuildTargetConfig(namedInputs, projectRoot, nextConfig) {
@@ -92,6 +93,17 @@ function getStartTargetConfig(options, projectRoot) {
92
93
  };
93
94
  return targetConfig;
94
95
  }
96
+ function getStaticServeTargetConfig(options) {
97
+ const targetConfig = {
98
+ executor: '@nx/web:file-server',
99
+ options: {
100
+ buildTarget: options.buildTargetName,
101
+ staticFilePath: '{projectRoot}/out',
102
+ port: 3000,
103
+ },
104
+ };
105
+ return targetConfig;
106
+ }
95
107
  async function getOutputs(projectRoot, nextConfig) {
96
108
  let dir = '.next';
97
109
  const { PHASE_PRODUCTION_BUILD } = require('next/constants');
@@ -129,6 +141,7 @@ function normalizeOptions(options) {
129
141
  options.buildTargetName ??= 'build';
130
142
  options.devTargetName ??= 'dev';
131
143
  options.startTargetName ??= 'start';
144
+ options.serveStaticTargetName ??= 'serve-static';
132
145
  return options;
133
146
  }
134
147
  function getInputs(namedInputs) {
@@ -10,7 +10,7 @@ function addGitIgnoreEntry(host) {
10
10
  const ig = (0, ignore_1.default)();
11
11
  ig.add(host.read('.gitignore', 'utf-8'));
12
12
  if (!ig.ignores('apps/example/.next')) {
13
- content = `${content}\n\n# Next.js\n.next\n`;
13
+ content = `${content}\n\n# Next.js\n.next\nout\n`;
14
14
  }
15
15
  host.write('.gitignore', content);
16
16
  }