feat(remix): add init generator (#21146)
This commit is contained in:
parent
0f691d5ff0
commit
dcef077032
@ -9099,6 +9099,14 @@
|
|||||||
"isExternal": false,
|
"isExternal": false,
|
||||||
"disableCollapsible": false
|
"disableCollapsible": false
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "init",
|
||||||
|
"path": "/nx-api/remix/generators/init",
|
||||||
|
"name": "init",
|
||||||
|
"children": [],
|
||||||
|
"isExternal": false,
|
||||||
|
"disableCollapsible": false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "route",
|
"id": "route",
|
||||||
"path": "/nx-api/remix/generators/route",
|
"path": "/nx-api/remix/generators/route",
|
||||||
|
|||||||
@ -2509,6 +2509,15 @@
|
|||||||
"path": "/nx-api/remix/generators/library",
|
"path": "/nx-api/remix/generators/library",
|
||||||
"type": "generator"
|
"type": "generator"
|
||||||
},
|
},
|
||||||
|
"/nx-api/remix/generators/init": {
|
||||||
|
"description": "Initialize the `@nx/remix` plugin.",
|
||||||
|
"file": "generated/packages/remix/generators/init.json",
|
||||||
|
"hidden": true,
|
||||||
|
"name": "init",
|
||||||
|
"originalFilePath": "/packages/remix/src/generators/init/schema.json",
|
||||||
|
"path": "/nx-api/remix/generators/init",
|
||||||
|
"type": "generator"
|
||||||
|
},
|
||||||
"/nx-api/remix/generators/route": {
|
"/nx-api/remix/generators/route": {
|
||||||
"description": "Generate a new route",
|
"description": "Generate a new route",
|
||||||
"file": "generated/packages/remix/generators/route.json",
|
"file": "generated/packages/remix/generators/route.json",
|
||||||
|
|||||||
@ -2482,6 +2482,15 @@
|
|||||||
"path": "remix/generators/library",
|
"path": "remix/generators/library",
|
||||||
"type": "generator"
|
"type": "generator"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"description": "Initialize the `@nx/remix` plugin.",
|
||||||
|
"file": "generated/packages/remix/generators/init.json",
|
||||||
|
"hidden": true,
|
||||||
|
"name": "init",
|
||||||
|
"originalFilePath": "/packages/remix/src/generators/init/schema.json",
|
||||||
|
"path": "remix/generators/init",
|
||||||
|
"type": "generator"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"description": "Generate a new route",
|
"description": "Generate a new route",
|
||||||
"file": "generated/packages/remix/generators/route.json",
|
"file": "generated/packages/remix/generators/route.json",
|
||||||
|
|||||||
31
docs/generated/packages/remix/generators/init.json
Normal file
31
docs/generated/packages/remix/generators/init.json
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
"name": "init",
|
||||||
|
"implementation": "/packages/remix/src/generators/init/init.ts",
|
||||||
|
"schema": {
|
||||||
|
"$schema": "http://json-schema.org/schema",
|
||||||
|
"$id": "NxRemixInit",
|
||||||
|
"title": "Init Remix Plugin",
|
||||||
|
"description": "Initialize the Remix Plugin.",
|
||||||
|
"cli": "nx",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"skipFormat": {
|
||||||
|
"description": "Skip formatting files.",
|
||||||
|
"type": "boolean",
|
||||||
|
"default": false
|
||||||
|
},
|
||||||
|
"skipPackageJson": {
|
||||||
|
"description": "Do not add dependencies to `package.json`.",
|
||||||
|
"type": "boolean",
|
||||||
|
"default": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [],
|
||||||
|
"presets": []
|
||||||
|
},
|
||||||
|
"description": "Initialize the `@nx/remix` plugin.",
|
||||||
|
"hidden": true,
|
||||||
|
"aliases": [],
|
||||||
|
"path": "/packages/remix/src/generators/init/schema.json",
|
||||||
|
"type": "generator"
|
||||||
|
}
|
||||||
@ -628,6 +628,7 @@
|
|||||||
- [application](/nx-api/remix/generators/application)
|
- [application](/nx-api/remix/generators/application)
|
||||||
- [cypress-component-configuration](/nx-api/remix/generators/cypress-component-configuration)
|
- [cypress-component-configuration](/nx-api/remix/generators/cypress-component-configuration)
|
||||||
- [library](/nx-api/remix/generators/library)
|
- [library](/nx-api/remix/generators/library)
|
||||||
|
- [init](/nx-api/remix/generators/init)
|
||||||
- [route](/nx-api/remix/generators/route)
|
- [route](/nx-api/remix/generators/route)
|
||||||
- [resource-route](/nx-api/remix/generators/resource-route)
|
- [resource-route](/nx-api/remix/generators/resource-route)
|
||||||
- [action](/nx-api/remix/generators/action)
|
- [action](/nx-api/remix/generators/action)
|
||||||
|
|||||||
@ -35,6 +35,12 @@
|
|||||||
"aliases": ["lib"],
|
"aliases": ["lib"],
|
||||||
"x-type": "library"
|
"x-type": "library"
|
||||||
},
|
},
|
||||||
|
"init": {
|
||||||
|
"implementation": "./src/generators/init/init",
|
||||||
|
"schema": "./src/generators/init/schema.json",
|
||||||
|
"description": "Initialize the `@nx/remix` plugin.",
|
||||||
|
"hidden": true
|
||||||
|
},
|
||||||
"route": {
|
"route": {
|
||||||
"implementation": "./src/generators/route/route.impl",
|
"implementation": "./src/generators/route/route.impl",
|
||||||
"schema": "./src/generators/route/schema.json",
|
"schema": "./src/generators/route/schema.json",
|
||||||
|
|||||||
@ -12,3 +12,4 @@ export * from './src/generators/route/route.impl';
|
|||||||
export * from './src/generators/setup-tailwind/setup-tailwind.impl';
|
export * from './src/generators/setup-tailwind/setup-tailwind.impl';
|
||||||
export * from './src/generators/storybook-configuration/storybook-configuration.impl';
|
export * from './src/generators/storybook-configuration/storybook-configuration.impl';
|
||||||
export * from './src/generators/style/style.impl';
|
export * from './src/generators/style/style.impl';
|
||||||
|
export * from './src/generators/init/init';
|
||||||
|
|||||||
@ -34,10 +34,16 @@ import {
|
|||||||
updateUnitTestConfig,
|
updateUnitTestConfig,
|
||||||
} from './lib';
|
} from './lib';
|
||||||
import { NxRemixGeneratorSchema } from './schema';
|
import { NxRemixGeneratorSchema } from './schema';
|
||||||
|
import { updateDependencies } from '../utils/update-dependencies';
|
||||||
|
import initGenerator from '../init/init';
|
||||||
|
import { initGenerator as jsInitGenerator } from '@nx/js';
|
||||||
|
|
||||||
export default async function (tree: Tree, _options: NxRemixGeneratorSchema) {
|
export default async function (tree: Tree, _options: NxRemixGeneratorSchema) {
|
||||||
const options = await normalizeOptions(tree, _options);
|
const options = await normalizeOptions(tree, _options);
|
||||||
const tasks: GeneratorCallback[] = [];
|
const tasks: GeneratorCallback[] = [
|
||||||
|
await initGenerator(tree, { skipFormat: true }),
|
||||||
|
await jsInitGenerator(tree, { skipFormat: true }),
|
||||||
|
];
|
||||||
|
|
||||||
addProjectConfiguration(tree, options.projectName, {
|
addProjectConfiguration(tree, options.projectName, {
|
||||||
root: options.projectRoot,
|
root: options.projectRoot,
|
||||||
@ -78,25 +84,7 @@ export default async function (tree: Tree, _options: NxRemixGeneratorSchema) {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const installTask = addDependenciesToPackageJson(
|
const installTask = updateDependencies(tree);
|
||||||
tree,
|
|
||||||
{
|
|
||||||
'@remix-run/node': remixVersion,
|
|
||||||
'@remix-run/react': remixVersion,
|
|
||||||
'@remix-run/serve': remixVersion,
|
|
||||||
isbot: isbotVersion,
|
|
||||||
react: reactVersion,
|
|
||||||
'react-dom': reactDomVersion,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'@remix-run/dev': remixVersion,
|
|
||||||
'@remix-run/eslint-config': remixVersion,
|
|
||||||
'@types/react': typesReactVersion,
|
|
||||||
'@types/react-dom': typesReactDomVersion,
|
|
||||||
eslint: eslintVersion,
|
|
||||||
typescript: typescriptVersion,
|
|
||||||
}
|
|
||||||
);
|
|
||||||
tasks.push(installTask);
|
tasks.push(installTask);
|
||||||
|
|
||||||
const vars = {
|
const vars = {
|
||||||
|
|||||||
66
packages/remix/src/generators/init/init.spec.ts
Normal file
66
packages/remix/src/generators/init/init.spec.ts
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing';
|
||||||
|
import { readJson } from '@nx/devkit';
|
||||||
|
import initGenerator from './init';
|
||||||
|
|
||||||
|
describe('Remix Init Generator', () => {
|
||||||
|
describe('NX_PCV3=false', () => {
|
||||||
|
it('should setup the workspace and add dependencies', async () => {
|
||||||
|
// ARRANGE
|
||||||
|
const tree = createTreeWithEmptyWorkspace();
|
||||||
|
|
||||||
|
// ACT
|
||||||
|
await initGenerator(tree, {});
|
||||||
|
|
||||||
|
// ASSERT
|
||||||
|
const pkgJson = readJson(tree, 'package.json');
|
||||||
|
expect(pkgJson.dependencies).toMatchInlineSnapshot(`
|
||||||
|
{
|
||||||
|
"@remix-run/serve": "^2.3.0",
|
||||||
|
}
|
||||||
|
`);
|
||||||
|
expect(pkgJson.devDependencies).toMatchInlineSnapshot(`
|
||||||
|
{
|
||||||
|
"@remix-run/dev": "^2.3.0",
|
||||||
|
}
|
||||||
|
`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('NX_PCV3=true', () => {
|
||||||
|
it('should setup the workspace and add dependencies', async () => {
|
||||||
|
// ARRANGE
|
||||||
|
const tree = createTreeWithEmptyWorkspace();
|
||||||
|
process.env.NX_PCV3 = 'true';
|
||||||
|
// ACT
|
||||||
|
await initGenerator(tree, {});
|
||||||
|
|
||||||
|
// ASSERT
|
||||||
|
const pkgJson = readJson(tree, 'package.json');
|
||||||
|
expect(pkgJson.dependencies).toMatchInlineSnapshot(`
|
||||||
|
{
|
||||||
|
"@remix-run/serve": "^2.3.0",
|
||||||
|
}
|
||||||
|
`);
|
||||||
|
expect(pkgJson.devDependencies).toMatchInlineSnapshot(`
|
||||||
|
{
|
||||||
|
"@remix-run/dev": "^2.3.0",
|
||||||
|
}
|
||||||
|
`);
|
||||||
|
|
||||||
|
const nxJson = readJson(tree, 'nx.json');
|
||||||
|
expect(nxJson.plugins).toMatchInlineSnapshot(`
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"options": {
|
||||||
|
"buildTargetName": "build",
|
||||||
|
"serveTargetName": "serve",
|
||||||
|
"startTargetName": "start",
|
||||||
|
"typecheckTargetName": "typecheck",
|
||||||
|
},
|
||||||
|
"plugin": "@nx/remix/plugin",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
67
packages/remix/src/generators/init/init.ts
Normal file
67
packages/remix/src/generators/init/init.ts
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
import {
|
||||||
|
type Tree,
|
||||||
|
formatFiles,
|
||||||
|
GeneratorCallback,
|
||||||
|
readNxJson,
|
||||||
|
updateNxJson,
|
||||||
|
addDependenciesToPackageJson,
|
||||||
|
runTasksInSerial,
|
||||||
|
} from '@nx/devkit';
|
||||||
|
import { type Schema } from './schema';
|
||||||
|
import { remixVersion } from '../../utils/versions';
|
||||||
|
|
||||||
|
function addPlugin(tree) {
|
||||||
|
const nxJson = readNxJson(tree);
|
||||||
|
nxJson.plugins ??= [];
|
||||||
|
|
||||||
|
for (const plugin of nxJson.plugins) {
|
||||||
|
if (
|
||||||
|
typeof plugin === 'string'
|
||||||
|
? plugin === '@nx/remix/plugin'
|
||||||
|
: plugin.plugin === '@nx/remix/plugin'
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nxJson.plugins.push({
|
||||||
|
plugin: '@nx/remix/plugin',
|
||||||
|
options: {
|
||||||
|
buildTargetName: 'build',
|
||||||
|
serveTargetName: 'serve',
|
||||||
|
startTargetName: 'start',
|
||||||
|
typecheckTargetName: 'typecheck',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
updateNxJson(tree, nxJson);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function remixInitGenerator(tree: Tree, options: Schema) {
|
||||||
|
const tasks: GeneratorCallback[] = [];
|
||||||
|
|
||||||
|
if (!options.skipPackageJson) {
|
||||||
|
const installTask = addDependenciesToPackageJson(
|
||||||
|
tree,
|
||||||
|
{
|
||||||
|
'@remix-run/serve': remixVersion,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'@remix-run/dev': remixVersion,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
tasks.push(installTask);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (process.env.NX_PCV3 === 'true') {
|
||||||
|
addPlugin(tree);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!options.skipFormat) {
|
||||||
|
await formatFiles(tree);
|
||||||
|
}
|
||||||
|
|
||||||
|
return runTasksInSerial(...tasks);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default remixInitGenerator;
|
||||||
4
packages/remix/src/generators/init/schema.d.ts
vendored
Normal file
4
packages/remix/src/generators/init/schema.d.ts
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
export interface Schema {
|
||||||
|
skipFormat?: boolean;
|
||||||
|
skipPackageJson?: boolean;
|
||||||
|
}
|
||||||
21
packages/remix/src/generators/init/schema.json
Normal file
21
packages/remix/src/generators/init/schema.json
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/schema",
|
||||||
|
"$id": "NxRemixInit",
|
||||||
|
"title": "Init Remix Plugin",
|
||||||
|
"description": "Initialize the Remix Plugin.",
|
||||||
|
"cli": "nx",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"skipFormat": {
|
||||||
|
"description": "Skip formatting files.",
|
||||||
|
"type": "boolean",
|
||||||
|
"default": false
|
||||||
|
},
|
||||||
|
"skipPackageJson": {
|
||||||
|
"description": "Do not add dependencies to `package.json`.",
|
||||||
|
"type": "boolean",
|
||||||
|
"default": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": []
|
||||||
|
}
|
||||||
31
packages/remix/src/generators/utils/update-dependencies.ts
Normal file
31
packages/remix/src/generators/utils/update-dependencies.ts
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
import { type Tree, addDependenciesToPackageJson } from '@nx/devkit';
|
||||||
|
import {
|
||||||
|
eslintVersion,
|
||||||
|
isbotVersion,
|
||||||
|
reactDomVersion,
|
||||||
|
reactVersion,
|
||||||
|
remixVersion,
|
||||||
|
typescriptVersion,
|
||||||
|
typesReactDomVersion,
|
||||||
|
typesReactVersion,
|
||||||
|
} from '../../utils/versions';
|
||||||
|
|
||||||
|
export function updateDependencies(tree: Tree) {
|
||||||
|
return addDependenciesToPackageJson(
|
||||||
|
tree,
|
||||||
|
{
|
||||||
|
'@remix-run/node': remixVersion,
|
||||||
|
'@remix-run/react': remixVersion,
|
||||||
|
isbot: isbotVersion,
|
||||||
|
react: reactVersion,
|
||||||
|
'react-dom': reactDomVersion,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'@remix-run/eslint-config': remixVersion,
|
||||||
|
'@types/react': typesReactVersion,
|
||||||
|
'@types/react-dom': typesReactDomVersion,
|
||||||
|
eslint: eslintVersion,
|
||||||
|
typescript: typescriptVersion,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user