Skip to content

Commit

Permalink
feat(nx-plugin): fix angular 15.x and 16.x install support
Browse files Browse the repository at this point in the history
  • Loading branch information
jeremyhofer committed Jun 30, 2023
1 parent 15efeab commit e907d09
Show file tree
Hide file tree
Showing 17 changed files with 368 additions and 490 deletions.
207 changes: 95 additions & 112 deletions packages/nx-plugin/src/generators/app/generator.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ describe('nx-plugin generator', () => {
) => {
const tree = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
addDependenciesToPackageJson(tree, {}, { nx: nxVersion });
const { dependencies, devDependencies } = readJson(tree, 'package.json');
await generator(tree, options);
const config = readProjectConfiguration(tree, options.analogAppName);
return {
Expand All @@ -26,93 +27,83 @@ describe('nx-plugin generator', () => {
};
};

//TODO: fix version here and in source files
const verifyCoreDependenciesV15_2_0 = (
const verifyCoreDependenciesNxV15_X_AngularV15_X = (
dependencies: Record<string, string>,
devDependencies: Record<string, string>
) => {
expect(dependencies['@analogjs/content']).toBe('^0.2.0-beta.16');
expect(dependencies['@analogjs/router']).toBe('^0.2.0-beta.16');
expect(dependencies['@angular/platform-server']).toBe(
dependencies['@angular/core']
expect(dependencies['@analogjs/content']).toBe('0.1.9');
expect(dependencies['@analogjs/router']).toBe('0.1.0-alpha.10');
expect(dependencies['@analogjs/vite-plugin-angular']).toBe(
'0.2.0-alpha.29'
);
expect(dependencies['front-matter']).toBe('^4.0.2');
expect(dependencies['marked']).toBe('^5.0.2');
expect(dependencies['prismjs']).toBe('^1.29.0');

expect(devDependencies['@analogjs/platform']).toBe('0.1.0-beta.23');
expect(devDependencies['@nx/vite']).toBe('^15.7.0');
expect(devDependencies['jsdom']).toBe('^20.0.0');
expect(devDependencies['typescript']).toBe('~4.8.4');
expect(devDependencies['vite']).toBe('^4.0.3');
expect(devDependencies['vite-tsconfig-paths']).toBe('^4.0.2');
expect(devDependencies['vitest']).toBe('^0.31.0');
};

const verifyCoreDependenciesV15_8_0 = (
dependencies: Record<string, string>,
devDependencies: Record<string, string>
) => {
expect(dependencies['@analogjs/content']).toBe('^0.2.0-beta.16');
expect(dependencies['@analogjs/router']).toBe('^0.2.0-beta.16');
expect(dependencies['@angular/platform-server']).toBe(
dependencies['@angular/core']
);
expect(dependencies['front-matter']).toBe('^4.0.2');
expect(dependencies['marked']).toBe('^5.0.2');
expect(dependencies['marked']).toBe('^4.2.4');
expect(dependencies['prismjs']).toBe('^1.29.0');

expect(devDependencies['@analogjs/platform']).toBe('^0.2.0-beta.16');
expect(devDependencies['@nx/vite']).toBe('^16.0.0');
expect(devDependencies['@nrwl/devkit']).toBe('~15.9.0');
expect(devDependencies['@nrwl/angular']).toBe('~15.9.0');
expect(devDependencies['@analogjs/platform']).toBe('0.1.0-beta.22');
expect(devDependencies['@nrwl/vite']).toBe('~15.9.0');
expect(devDependencies['jsdom']).toBe('^20.0.0');
expect(devDependencies['typescript']).toBe('~5.0.2');
expect(devDependencies['vite']).toBe('^4.0.3');
expect(devDependencies['vite-tsconfig-paths']).toBe('^4.0.2');
expect(devDependencies['vitest']).toBe('^0.31.0');
};

const verifyCoreDependenciesV16_1_0 = (
const verifyCoreDependenciesNxV16_0_0_AngularV15_X = (
dependencies: Record<string, string>,
devDependencies: Record<string, string>
) => {
expect(dependencies['@analogjs/content']).toBe('^0.2.0-beta.16');
expect(dependencies['@analogjs/router']).toBe('^0.2.0-beta.16');
expect(dependencies['@analogjs/content']).toBe('0.1.9');
expect(dependencies['@analogjs/router']).toBe('0.1.0-alpha.10');
expect(dependencies['@analogjs/vite-plugin-angular']).toBe(
'0.2.0-alpha.29'
);
expect(dependencies['@angular/platform-server']).toBe(
dependencies['@angular/core']
);
expect(dependencies['front-matter']).toBe('^4.0.2');
expect(dependencies['marked']).toBe('^5.0.2');
expect(dependencies['marked']).toBe('^4.2.4');
expect(dependencies['prismjs']).toBe('^1.29.0');

expect(devDependencies['@analogjs/platform']).toBe('^0.2.0-beta.16');
expect(devDependencies['@nx/vite']).toBe('^16.0.0');
expect(devDependencies['@nx/devkit']).toBe('~16.0.0');
expect(devDependencies['@nx/angular']).toBe('~16.0.0');
expect(devDependencies['@analogjs/platform']).toBe('0.1.0-beta.22');
expect(devDependencies['@nx/vite']).toBe('~16.0.0');
expect(devDependencies['jsdom']).toBe('^20.0.0');
expect(devDependencies['typescript']).toBe('~5.0.2');
expect(devDependencies['vite']).toBe('^4.0.3');
expect(devDependencies['vite-tsconfig-paths']).toBe('^4.0.2');
expect(devDependencies['vitest']).toBe('^0.31.0');
};

const verifyCoreDependenciesV_LATEST = (
const verifyCoreDependenciesAngularV16_X = (
dependencies: Record<string, string>,
devDependencies: Record<string, string>
) => {
expect(dependencies['@analogjs/content']).toBe('^0.2.0-beta.16');
expect(dependencies['@analogjs/router']).toBe('^0.2.0-beta.16');
expect(dependencies['@analogjs/content']).toBe('^0.2.0-beta.19');
expect(dependencies['@analogjs/router']).toBe('^0.2.0-beta.19');
expect(dependencies['@analogjs/vite-plugin-angular']).toBe(
'^0.2.0-beta.19'
);
expect(dependencies['@angular/platform-server']).toBe(
dependencies['@angular/core']
);
expect(dependencies['front-matter']).toBe('^4.0.2');
expect(dependencies['marked']).toBe('^5.0.2');
expect(dependencies['prismjs']).toBe('^1.29.0');

expect(devDependencies['@analogjs/platform']).toBe('^0.2.0-beta.16');
expect(devDependencies['@nx/vite']).toBe('^16.0.0');
expect(devDependencies['jsdom']).toBe('^20.0.0');
expect(devDependencies['typescript']).toBe('~5.0.2');
expect(devDependencies['vite']).toBe('^4.0.3');
expect(devDependencies['vite-tsconfig-paths']).toBe('^4.0.2');
expect(devDependencies['vitest']).toBe('^0.31.0');
expect(devDependencies['@nx/devkit']).toBe('^16.4.0');
expect(devDependencies['@nx/angular']).toBe('^16.4.0');
expect(devDependencies['@analogjs/platform']).toBe('^0.2.0-beta.19');
expect(devDependencies['@analogjs/platform']).toBe('^0.2.0-beta.19');
expect(devDependencies['@nx/vite']).toBe('^16.4.0');
expect(devDependencies['jsdom']).toBe('^22.0.0');
expect(devDependencies['vite']).toBe('^4.3.9');
expect(devDependencies['vite-tsconfig-paths']).toBe('^4.2.0');
expect(devDependencies['vitest']).toBe('^0.32.2');
};

const verifyConfig = (config: ProjectConfiguration, name: string) => {
Expand Down Expand Up @@ -170,13 +161,37 @@ describe('nx-plugin generator', () => {
expect(injectsTrpcClient).toBeTruthy();
};

describe('Nx latest', () => {
const verifyTrpcIsNotSetUp = (
tree: Tree,
dependencies: Record<string, string>
) => {
expect(dependencies['@analogjs/trpc']).not.toBeDefined();
const hasTrpcClientFile = tree.exists('apps/trpc-app/src/trpc-client.ts');
const hasNoteFile = tree.exists('apps/trpc-app/src/note.ts');
const hasTrpcServerRoute = tree.exists(
'apps/trpc-app/src/server/routes/trpc/[trpc].ts'
);
expect(hasTrpcClientFile).toBeFalsy();
expect(hasNoteFile).toBeFalsy();
expect(hasTrpcServerRoute).toBeFalsy();

const providesTrpcClient = tree
.read('apps/trpc-app/src/app/app.config.ts')
.includes('provideTrpcClient');
const injectsTrpcClient = tree
.read('apps/trpc-app/src/app/pages/analog-welcome.component.ts')
.includes('injectTrpcClient');
expect(providesTrpcClient).toBeFalsy();
expect(injectsTrpcClient).toBeFalsy();
};

describe('Nx latest, Angular 16.x', () => {
it('creates a default analogjs app in the source directory', async () => {
const analogAppName = 'analog';
const { config, tree } = await setup({ analogAppName });
const { dependencies, devDependencies } = readJson(tree, 'package.json');

verifyCoreDependenciesV_LATEST(dependencies, devDependencies);
verifyCoreDependenciesAngularV16_X(dependencies, devDependencies);

verifyConfig(config, analogAppName);

Expand All @@ -191,7 +206,7 @@ describe('nx-plugin generator', () => {
});
const { dependencies, devDependencies } = readJson(tree, 'package.json');

verifyCoreDependenciesV_LATEST(dependencies, devDependencies);
verifyCoreDependenciesAngularV16_X(dependencies, devDependencies);

verifyConfig(config, analogAppName);

Expand All @@ -205,7 +220,7 @@ describe('nx-plugin generator', () => {
const { config, tree } = await setup({ analogAppName, addTRPC: true });
const { dependencies, devDependencies } = readJson(tree, 'package.json');

verifyCoreDependenciesV_LATEST(dependencies, devDependencies);
verifyCoreDependenciesAngularV16_X(dependencies, devDependencies);

verifyConfig(config, analogAppName);

Expand All @@ -214,13 +229,16 @@ describe('nx-plugin generator', () => {
});
});

describe('Nx 16.1.0', () => {
describe('Nx 16.0.0, Angular ~15.2.0', () => {
it('creates a default analogjs app in the source directory', async () => {
const analogAppName = 'analog';
const { config, tree } = await setup({ analogAppName }, '16.1.0');
const { config, tree } = await setup({ analogAppName }, '16.0.0');
const { dependencies, devDependencies } = readJson(tree, 'package.json');

verifyCoreDependenciesV16_1_0(dependencies, devDependencies);
verifyCoreDependenciesNxV16_0_0_AngularV15_X(
dependencies,
devDependencies
);

verifyConfig(config, analogAppName);

Expand All @@ -234,11 +252,14 @@ describe('nx-plugin generator', () => {
analogAppName,
addTailwind: true,
},
'16.1.0'
'16.0.0'
);
const { dependencies, devDependencies } = readJson(tree, 'package.json');

verifyCoreDependenciesV16_1_0(dependencies, devDependencies);
verifyCoreDependenciesNxV16_0_0_AngularV15_X(
dependencies,
devDependencies
);

verifyConfig(config, analogAppName);

Expand All @@ -247,37 +268,40 @@ describe('nx-plugin generator', () => {
verifyTailwindIsSetUp(tree, devDependencies);
});

it('creates an analogjs app in the source directory with trpc set up', async () => {
it('creates an analogjs app in the source directory without trpc due to unsupported Nx version', async () => {
const analogAppName = 'trpc-app';
const { config, tree } = await setup(
{ analogAppName, addTRPC: true },
'16.1.0'
'16.0.0'
);
const { dependencies, devDependencies } = readJson(tree, 'package.json');

verifyCoreDependenciesV16_1_0(dependencies, devDependencies);
verifyCoreDependenciesNxV16_0_0_AngularV15_X(
dependencies,
devDependencies
);

verifyConfig(config, analogAppName);

verifyHomePageExists(tree, analogAppName);
verifyTrpcIsSetUp(tree, dependencies);
verifyTrpcIsNotSetUp(tree, dependencies);
});
});

describe('Nx 15.8.0', () => {
test.skip('creates a default analogjs app in the source directory', async () => {
describe('Nx 15.8.0, Angular ~15.2.0', () => {
test('creates a default analogjs app in the source directory', async () => {
const analogAppName = 'analog';
const { config, tree } = await setup({ analogAppName }, '15.8.0');
const { dependencies, devDependencies } = readJson(tree, 'package.json');

verifyCoreDependenciesV15_8_0(dependencies, devDependencies);
verifyCoreDependenciesNxV15_X_AngularV15_X(dependencies, devDependencies);

verifyConfig(config, analogAppName);

verifyHomePageExists(tree, analogAppName);
});

test.skip('creates an analogjs app in the source directory with tailwind set up', async () => {
test('creates an analogjs app in the source directory with tailwind set up', async () => {
const analogAppName = 'tailwind-app';
const { config, tree } = await setup(
{
Expand All @@ -288,7 +312,7 @@ describe('nx-plugin generator', () => {
);
const { dependencies, devDependencies } = readJson(tree, 'package.json');

verifyCoreDependenciesV15_8_0(dependencies, devDependencies);
verifyCoreDependenciesNxV15_X_AngularV15_X(dependencies, devDependencies);

verifyConfig(config, analogAppName);

Expand All @@ -297,70 +321,29 @@ describe('nx-plugin generator', () => {
verifyTailwindIsSetUp(tree, devDependencies);
});

test.skip('creates an analogjs app in the source directory with trpc set up', async () => {
test('creates an analogjs app in the source directory without trpc due to unsupported Nx version', async () => {
const analogAppName = 'trpc-app';
const { config, tree } = await setup(
{ analogAppName, addTRPC: true },
'15.8.0'
);
const { dependencies, devDependencies } = readJson(tree, 'package.json');

verifyCoreDependenciesV15_8_0(dependencies, devDependencies);
verifyCoreDependenciesNxV15_X_AngularV15_X(dependencies, devDependencies);

verifyConfig(config, analogAppName);

verifyHomePageExists(tree, analogAppName);
verifyTrpcIsSetUp(tree, dependencies);
verifyTrpcIsNotSetUp(tree, dependencies);
});
});

describe('Nx 15.2.0', () => {
test.skip('creates a default analogjs app in the source directory', async () => {
describe('Nx 15.1.0', () => {
test('should error out due to unsupported Nx version', async () => {
const analogAppName = 'analog';
const { config, tree } = await setup({ analogAppName }, '15.2.0');
const { dependencies, devDependencies } = readJson(tree, 'package.json');

verifyCoreDependenciesV15_2_0(dependencies, devDependencies);

verifyConfig(config, analogAppName);

verifyHomePageExists(tree, analogAppName);
});

test.skip('creates an analogjs app in the source directory with tailwind set up', async () => {
const analogAppName = 'tailwind-app';
const { config, tree } = await setup(
{
analogAppName,
addTailwind: true,
},
'15.2.0'
);
const { dependencies, devDependencies } = readJson(tree, 'package.json');

verifyCoreDependenciesV15_2_0(dependencies, devDependencies);

verifyConfig(config, analogAppName);

verifyHomePageExists(tree, analogAppName);

verifyTailwindIsSetUp(tree, devDependencies);
});

test.skip('creates an analogjs app in the source directory with trpc set up', async () => {
const analogAppName = 'trpc-app';
const { config, tree } = await setup(
{ analogAppName, addTRPC: true },
'15.2.0'
await expect(setup({ analogAppName }, '15.1.0')).rejects.toThrow(
'Nx v15.2.0 or newer is required to install Analog'
);
const { dependencies, devDependencies } = readJson(tree, 'package.json');

verifyCoreDependenciesV15_2_0(dependencies, devDependencies);

verifyConfig(config, analogAppName);

verifyHomePageExists(tree, analogAppName);
verifyTrpcIsSetUp(tree, dependencies);
});
});
});
17 changes: 17 additions & 0 deletions packages/nx-plugin/src/generators/app/generator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ import { addFiles } from './lib/add-files';
import { addTailwindConfig } from './lib/add-tailwind-config';
import { addTrpc } from './lib/add-trpc';
import { addHomePage } from './lib/add-home-page';
import {
belowMinimumSupportedNxVersion,
belowMinimumSupportedNxtRPCVersion,
} from './versions/minimum-supported-versions';

export interface NormalizedOptions
extends AnalogNxApplicationGeneratorOptions,
Expand Down Expand Up @@ -73,6 +77,19 @@ export async function appGenerator(
throw new Error(stripIndents`Nx must be installed to execute this plugin`);
}

if (belowMinimumSupportedNxVersion(nxVersion)) {
throw new Error(
stripIndents`Nx v15.2.0 or newer is required to install Analog`
);
}

if (belowMinimumSupportedNxtRPCVersion(nxVersion) && options.addTRPC) {
console.warn(
'Nx v16.1.0 or newer is required to use tRPC with Analog. Skipping installation.'
);
options.addTRPC = false;
}

const normalizedOptions = normalizeOptions(tree, options, nxVersion);
const angularVersion = await initializeAngularWorkspace(
tree,
Expand Down
Loading

0 comments on commit e907d09

Please sign in to comment.