Skip to content

Commit

Permalink
feat(deps): fetch deps version before installing
Browse files Browse the repository at this point in the history
  • Loading branch information
marcjulian committed Jul 1, 2021
1 parent a0bb8e7 commit a92c7b2
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 17 deletions.
17 changes: 17 additions & 0 deletions schematics/nestjs-prisma/dependencies.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { NodeDependencyType } from '@schematics/angular/utility/dependencies';

export interface Dependency {
name: string;
type: NodeDependencyType;
}

export const dependencies: Dependency[] = [
{
name: 'prisma',
type: NodeDependencyType.Dev,
},
{
name: '@prisma/client',
type: NodeDependencyType.Default,
},
];
39 changes: 22 additions & 17 deletions schematics/nestjs-prisma/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,11 @@ import {
} from '@angular-devkit/schematics/tasks';
import {
addPackageJsonDependency,
NodeDependencyType,
NodeDependency,
} from '@schematics/angular/utility/dependencies';
import { strings } from '@angular-devkit/core';
import { getLatestDependencyVersion } from './utils/get-latest-dependency-version';
import { dependencies, Dependency } from './dependencies';

// You don't have to export the function as default. You can also have more than one rule factory
// per file.
Expand All @@ -29,7 +31,7 @@ export function nestjsPrismaAdd(_options: Schema): Rule {
}

return chain([
addDependencies(_options),
addDependencies(dependencies),
addNpmScripts(_options),
addPrismaService(_options),
addDocker(_options),
Expand All @@ -39,25 +41,28 @@ export function nestjsPrismaAdd(_options: Schema): Rule {
};
}

function addDependencies(_options: Schema): Rule {
return (tree: Tree) => {
addPackageJsonDependency(tree, {
type: NodeDependencyType.Dev,
name: 'prisma',
version: _options.prismaVersion,
});

addPackageJsonDependency(tree, {
type: NodeDependencyType.Default,
name: '@prisma/client',
version: _options.prismaVersion,
});
return tree;
function addDependencies(dependencies: Dependency[]): Rule {
return (tree, context) => {
return Promise.all(
dependencies.map((dependency) =>
getLatestDependencyVersion(dependency.name).then(
({ name, version }) => {
context.logger.info(`✅️ Added ${name}@${version}`);
const nodeDependency: NodeDependency = {
name,
version,
type: dependency.type,
};
addPackageJsonDependency(tree, nodeDependency);
},
),
),
).then(() => tree) as ReturnType<Rule>;
};
}

function addNpmScripts(_options: Schema): Rule {
return (tree: Tree) => {
return (tree: Tree, context) => {
const pkgPath = 'package.json';
const buffer = tree.read(pkgPath);

Expand Down
35 changes: 35 additions & 0 deletions schematics/nestjs-prisma/utils/get-latest-dependency-version.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { get } from 'http';

export interface NodePackage {
name: string;
version: string;
}

export function getLatestDependencyVersion(
packageName: string,
): Promise<NodePackage> {
const DEFAULT_VERSION = 'latest';

return new Promise((resolve) => {
return get(`http://registry.npmjs.org/${packageName}`, (res) => {
let rawData = '';
res.on('data', (chunk) => (rawData += chunk));
res.on('end', () => {
try {
const response = JSON.parse(rawData);
const version = (response && response['dist-tags']) || {};
resolve(buildPackage(packageName, version.latest));
} catch (e) {
resolve(buildPackage(packageName));
}
});
}).on('error', () => resolve(buildPackage(packageName)));
});

function buildPackage(
name: string,
version: string = DEFAULT_VERSION,
): NodePackage {
return { name, version };
}
}

0 comments on commit a92c7b2

Please sign in to comment.