@nx/next 18.0.4 → 18.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.
- package/package.json +9 -9
- package/plugins/with-nx.js +18 -33
- package/src/generators/application/lib/add-e2e.js +16 -0
- package/src/generators/application/lib/create-application-files.helpers.js +1 -1
- package/src/generators/init/lib/add-plugin.js +1 -0
- package/src/plugins/plugin.d.ts +1 -0
- package/src/plugins/plugin.js +13 -0
- package/src/utils/add-gitignore-entry.js +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nx/next",
|
|
3
|
-
"version": "18.0.
|
|
3
|
+
"version": "18.0.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": {
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"next": ">=14.0.0"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@nx/devkit": "18.0.
|
|
37
|
+
"@nx/devkit": "18.0.5",
|
|
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.0.
|
|
49
|
-
"@nx/eslint": "18.0.
|
|
50
|
-
"@nx/react": "18.0.
|
|
51
|
-
"@nx/web": "18.0.
|
|
52
|
-
"@nx/webpack": "18.0.
|
|
53
|
-
"@nx/workspace": "18.0.
|
|
54
|
-
"@nrwl/next": "18.0.
|
|
48
|
+
"@nx/js": "18.0.5",
|
|
49
|
+
"@nx/eslint": "18.0.5",
|
|
50
|
+
"@nx/react": "18.0.5",
|
|
51
|
+
"@nx/web": "18.0.5",
|
|
52
|
+
"@nx/webpack": "18.0.5",
|
|
53
|
+
"@nx/workspace": "18.0.5",
|
|
54
|
+
"@nrwl/next": "18.0.5"
|
|
55
55
|
},
|
|
56
56
|
"publishConfig": {
|
|
57
57
|
"access": "public"
|
package/plugins/with-nx.js
CHANGED
|
@@ -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);
|
|
@@ -219,39 +224,19 @@ function getNextConfig(nextConfig = {}, context = getWithNxContext()) {
|
|
|
219
224
|
*/
|
|
220
225
|
// Default SVGR support to be on for projects.
|
|
221
226
|
if (nx?.svgr !== false) {
|
|
222
|
-
config.module.rules.push(
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
},
|
|
236
|
-
},
|
|
237
|
-
{
|
|
238
|
-
loader: require.resolve('url-loader'),
|
|
239
|
-
options: {
|
|
240
|
-
limit: 10000, // 10kB
|
|
241
|
-
name: '[name].[hash:7].[ext]',
|
|
242
|
-
},
|
|
243
|
-
},
|
|
244
|
-
],
|
|
245
|
-
},
|
|
246
|
-
// Fallback to plain URL loader if someone just imports the SVG and references it on the <img src> tag
|
|
247
|
-
{
|
|
248
|
-
loader: require.resolve('url-loader'),
|
|
249
|
-
options: {
|
|
250
|
-
limit: 10000, // 10kB
|
|
251
|
-
name: '[name].[hash:7].[ext]',
|
|
252
|
-
},
|
|
253
|
-
},
|
|
254
|
-
],
|
|
227
|
+
config.module.rules.push(
|
|
228
|
+
// Apply rule for svg imports ending in ?url
|
|
229
|
+
{
|
|
230
|
+
test: /\.svg$/i,
|
|
231
|
+
type: 'asset',
|
|
232
|
+
resourceQuery: /url/, // apply to *.svg?url
|
|
233
|
+
},
|
|
234
|
+
// Convert all other svg imports to React components
|
|
235
|
+
{
|
|
236
|
+
test: /\.svg$/i,
|
|
237
|
+
issuer: /\.[jt]sx?$/,
|
|
238
|
+
resourceQuery: { not: [/url/] },
|
|
239
|
+
use: ['@svgr/webpack'],
|
|
255
240
|
});
|
|
256
241
|
}
|
|
257
242
|
return userWebpack(config, options);
|
|
@@ -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
|
|
307
|
+
<pre>nx connect</pre>
|
|
308
308
|
<a
|
|
309
309
|
href="https://nx.app/?utm_source=nx-project"
|
|
310
310
|
target="_blank"
|
package/src/plugins/plugin.d.ts
CHANGED
|
@@ -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>;
|
package/src/plugins/plugin.js
CHANGED
|
@@ -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
|
}
|