diff --git a/e2e/workspace/src/create-nx-workspace.test.ts b/e2e/workspace/src/create-nx-workspace.test.ts index d5ce763efa..0befcbbf94 100644 --- a/e2e/workspace/src/create-nx-workspace.test.ts +++ b/e2e/workspace/src/create-nx-workspace.test.ts @@ -75,6 +75,18 @@ describe('create-nx-workspace', () => { expectNoAngularDevkit(); }); + it('should be able to create an gatsby workspace', () => { + const wsName = uniq('gatsby'); + const appName = uniq('app'); + runCreateWorkspace(wsName, { + preset: 'next', + style: 'css', + appName, + }); + + expectNoAngularDevkit(); + }); + it('should be able to create an web-components workspace', () => { const wsName = uniq('web-components'); const appName = uniq('app'); diff --git a/packages/create-nx-workspace/bin/create-nx-workspace.ts b/packages/create-nx-workspace/bin/create-nx-workspace.ts index ff3c7d7c4c..1456c9cec2 100644 --- a/packages/create-nx-workspace/bin/create-nx-workspace.ts +++ b/packages/create-nx-workspace/bin/create-nx-workspace.ts @@ -50,11 +50,10 @@ const presetOptions: { name: Preset; message: string }[] = [ message: 'next.js [a workspace with a single Next.js application]', }, - // TODO: Re-enable when gatsby preset is implemented - // { - // name: Preset.Gatsby, - // message: 'gatsby [a workspace with a single Gatsby application]', - // }, + { + name: Preset.Gatsby, + message: 'gatsby [a workspace with a single Gatsby application]', + }, { name: Preset.Nest, message: 'nest [a workspace with a single Nest application]', @@ -361,8 +360,7 @@ function determineStyle(preset: Preset, parsedArgs: any) { Preset.ReactWithExpress, Preset.React, Preset.NextJs, - // TODO: Re-enable when gatsby preset is implemented - // Preset.Gatsby, + Preset.Gatsby, ].includes(preset) ) { choices.push( @@ -375,13 +373,16 @@ function determineStyle(preset: Preset, parsedArgs: any) { name: '@emotion/styled', message: 'emotion [ https://emotion.sh ]', - }, - { + } + ); + // TODO: Remove below if condition when Gatsby supports styled-jsx + if (Preset.Gatsby !== preset) { + choices.push({ name: 'styled-jsx', message: 'styled-jsx [ https://www.npmjs.com/package/styled-jsx ]', - } - ); + }); + } } if (!parsedArgs.style) { @@ -600,8 +601,7 @@ function pointToTutorialAndCourse(preset: Preset) { case Preset.React: case Preset.ReactWithExpress: case Preset.NextJs: - // TODO: Re-enable when gatsby preset is implemented - // case Preset.Gatsby: + case Preset.Gatsby: output.addVerticalSeparator(); output.note({ title, diff --git a/packages/workspace/package.json b/packages/workspace/package.json index bff69d62fe..d05bfb92c7 100644 --- a/packages/workspace/package.json +++ b/packages/workspace/package.json @@ -38,6 +38,7 @@ "@nrwl/devkit", "@nrwl/eslint-plugin-nx", "@nrwl/express", + "@nrwl/gatsby", "@nrwl/jest", "@nrwl/linter", "@nrwl/nest", diff --git a/packages/workspace/src/generators/preset/preset.spec.ts b/packages/workspace/src/generators/preset/preset.spec.ts index 9734fccc84..bb2a55566c 100644 --- a/packages/workspace/src/generators/preset/preset.spec.ts +++ b/packages/workspace/src/generators/preset/preset.spec.ts @@ -140,4 +140,19 @@ describe('preset', () => { expect(tree.exists('apps/proj/src/main.ts')).toBe(true); expect(tree.exists('apps/proj/.eslintrc.json')).toBe(true); }); + + it('should create files (preset = gatsby)', async () => { + await presetGenerator(tree, { + name: 'proj', + preset: 'gatsby', + style: 'css', + linter: 'eslint', + cli: 'nx', + }); + + expect(tree.exists('/apps/proj/src/pages/index.tsx')).toBe(true); + expect(readJson(tree, '/workspace.json').cli.defaultCollection).toBe( + '@nrwl/gatsby' + ); + }); }); diff --git a/packages/workspace/src/generators/preset/preset.ts b/packages/workspace/src/generators/preset/preset.ts index dbc432c2d6..d1e83d6524 100644 --- a/packages/workspace/src/generators/preset/preset.ts +++ b/packages/workspace/src/generators/preset/preset.ts @@ -154,6 +154,16 @@ async function createPreset(tree: Tree, options: Schema) { linter: options.linter, }); setDefaultCollection(tree, '@nrwl/express'); + } else if (options.preset === 'gatsby') { + const { + applicationGenerator: gatsbyApplicationGenerator, + } = require('@nrwl' + '/gatsby'); + await gatsbyApplicationGenerator(tree, { + name: options.name, + linter: options.linter, + style: options.style, + }); + setDefaultCollection(tree, '@nrwl/gatsby'); } else { throw new Error(`Invalid preset ${options.preset}`); } diff --git a/packages/workspace/src/generators/preset/schema.d.ts b/packages/workspace/src/generators/preset/schema.d.ts index b1b43bc23b..692ac7e245 100644 --- a/packages/workspace/src/generators/preset/schema.d.ts +++ b/packages/workspace/src/generators/preset/schema.d.ts @@ -10,6 +10,7 @@ export interface Schema { | 'angular' | 'react' | 'next' + | 'gatsby' | 'web-components' | 'angular-nest' | 'react-express' diff --git a/tsconfig.base.json b/tsconfig.base.json index 646d513f29..94f1888d6d 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -27,6 +27,7 @@ "@nrwl/cypress": ["./packages/cypress"], "@nrwl/cypress/*": ["./packages/cypress/*"], "@nrwl/express": ["./packages/express"], + "@nrwl/gatsby": ["./packages/gatsby"], "@nrwl/nest": ["./packages/nest"], "@nrwl/next": ["./packages/next"], "@nrwl/node": ["./packages/node"],