@yolkai/nx-tao
Version:
468 lines (467 loc) • 20.3 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const migrate_1 = require("./migrate");
describe('Migration', () => {
describe('packageJson patch', () => {
it('should throw an error when the target package is not available', () => __awaiter(this, void 0, void 0, function* () {
const migrator = new migrate_1.Migrator({
versions: () => '1.0',
fetch: (p, v) => {
throw new Error('cannot fetch');
},
from: {},
to: {}
});
try {
yield migrator.updatePackageJson('mypackage', 'myversion');
throw new Error('fail');
}
catch (e) {
expect(e.message).toEqual(`cannot fetch`);
}
}));
it('should return a patch to the new version', () => __awaiter(this, void 0, void 0, function* () {
const migrator = new migrate_1.Migrator({
versions: () => '1.0.0',
fetch: (p, v) => Promise.resolve({ version: '2.0.0' }),
from: {},
to: {}
});
expect(yield migrator.updatePackageJson('mypackage', '2.0.0')).toEqual({
migrations: [],
packageJson: {
mypackage: { version: '2.0.0', alwaysAddToPackageJson: false }
}
});
}));
it('should collect the information recursively from upserts', () => __awaiter(this, void 0, void 0, function* () {
const migrator = new migrate_1.Migrator({
versions: () => '1.0.0',
fetch: (p, v) => {
if (p === 'parent') {
return Promise.resolve({
version: '2.0.0',
packageJsonUpdates: {
version2: {
version: '2.0.0',
packages: {
child: { version: '2.0.0' },
newChild: { version: '3.0.0', alwaysAddToPackageJson: true }
}
}
},
schematics: {}
});
}
else if (p === 'child') {
return Promise.resolve({ version: '2.0.0' });
}
else if (p === 'newChild') {
return Promise.resolve({ version: '2.0.0' });
}
else {
return Promise.resolve(null);
}
},
from: {},
to: {}
});
expect(yield migrator.updatePackageJson('parent', '2.0.0')).toEqual({
migrations: [],
packageJson: {
parent: { version: '2.0.0', alwaysAddToPackageJson: false },
child: { version: '2.0.0', alwaysAddToPackageJson: false },
newChild: { version: '2.0.0', alwaysAddToPackageJson: true }
}
});
}));
it('should stop recursive calls when exact version', () => __awaiter(this, void 0, void 0, function* () {
const migrator = new migrate_1.Migrator({
versions: () => '1.0.0',
fetch: (p, v) => {
if (p === 'parent') {
return Promise.resolve({
version: '2.0.0',
packageJsonUpdates: {
version2: {
version: '2.0.0',
packages: {
child: { version: '2.0.0' }
}
}
},
schematics: {}
});
}
else if (p === 'child') {
return Promise.resolve({
version: '2.0.0',
packageJsonUpdates: {
version2: {
version: '2.0.0',
packages: {
parent: { version: '2.0.0' }
}
}
},
schematics: {}
});
}
else {
return Promise.resolve(null);
}
},
from: {},
to: {}
});
expect(yield migrator.updatePackageJson('parent', '2.0.0')).toEqual({
migrations: [],
packageJson: {
parent: { version: '2.0.0', alwaysAddToPackageJson: false },
child: { version: '2.0.0', alwaysAddToPackageJson: false }
}
});
}));
it('should set the version of a dependency to the newest', () => __awaiter(this, void 0, void 0, function* () {
const migrator = new migrate_1.Migrator({
versions: () => '1.0.0',
fetch: (p, v) => {
if (p === 'parent') {
return Promise.resolve({
version: '2.0.0',
packageJsonUpdates: {
version2: {
version: '2.0.0',
packages: {
child1: { version: '2.0.0' },
child2: { version: '2.0.0' }
}
}
},
schematics: {}
});
}
else if (p === 'child1') {
return Promise.resolve({
version: '2.0.0',
packageJsonUpdates: {
version2: {
version: '2.0.0',
packages: {
grandchild: { version: '3.0.0' }
}
}
},
schematics: {}
});
}
else if (p === 'child2') {
return Promise.resolve({
version: '2.0.0',
packageJsonUpdates: {
version2: {
version: '2.0.0',
packages: {
grandchild: { version: '4.0.0' }
}
}
},
schematics: {}
});
}
else {
return Promise.resolve({ version: '4.0.0' });
}
},
from: {},
to: {}
});
expect(yield migrator.updatePackageJson('parent', '2.0.0')).toEqual({
migrations: [],
packageJson: {
parent: { version: '2.0.0', alwaysAddToPackageJson: false },
child1: { version: '2.0.0', alwaysAddToPackageJson: false },
child2: { version: '2.0.0', alwaysAddToPackageJson: false },
grandchild: { version: '4.0.0', alwaysAddToPackageJson: false }
}
});
}));
it('should skip the versions <= currently installed', () => __awaiter(this, void 0, void 0, function* () {
const migrator = new migrate_1.Migrator({
versions: () => '1.0.0',
fetch: (p, v) => {
if (p === 'parent') {
return Promise.resolve({
version: '2.0.0',
packageJsonUpdates: {
version2: {
version: '2.0.0',
packages: {
child: { version: '2.0.0' }
}
}
},
schematics: {}
});
}
else if (p === 'child') {
return Promise.resolve({
version: '2.0.0',
packageJsonUpdates: {
version2: {
version: '1.0.0',
packages: {
grandchild: { version: '2.0.0' }
}
}
},
schematics: {}
});
}
else {
return Promise.resolve({ version: '2.0.0' });
}
},
from: {},
to: {}
});
expect(yield migrator.updatePackageJson('parent', '2.0.0')).toEqual({
migrations: [],
packageJson: {
parent: { version: '2.0.0', alwaysAddToPackageJson: false },
child: { version: '2.0.0', alwaysAddToPackageJson: false }
}
});
}));
it('should conditionally process packages if they are installed', () => __awaiter(this, void 0, void 0, function* () {
const migrator = new migrate_1.Migrator({
versions: p => (p !== 'not-installed' ? '1.0.0' : null),
fetch: (p, v) => {
if (p === 'parent') {
return Promise.resolve({
version: '2.0.0',
packageJsonUpdates: {
version2: {
version: '2.0.0',
packages: {
child1: { version: '2.0.0', ifPackageInstalled: 'other' },
child2: {
version: '2.0.0',
ifPackageInstalled: 'not-installed'
}
}
}
},
schematics: {}
});
}
else if (p === 'child1') {
return Promise.resolve({ version: '2.0.0' });
}
else if (p === 'child2') {
throw new Error('should not be processed');
}
else {
return Promise.resolve(null);
}
},
from: {},
to: {}
});
expect(yield migrator.updatePackageJson('parent', '2.0.0')).toEqual({
migrations: [],
packageJson: {
parent: { version: '2.0.0', alwaysAddToPackageJson: false },
child1: { version: '2.0.0', alwaysAddToPackageJson: false }
}
});
}));
// this is temporary. if tao gets used by other projects,
// we will extract the special casing
it('should special case @yolkai/nx-workspace', () => __awaiter(this, void 0, void 0, function* () {
const migrator = new migrate_1.Migrator({
versions: () => '1.0.0',
fetch: (p, v) => Promise.resolve({ version: '2.0.0' }),
from: {},
to: {}
});
expect(yield migrator.updatePackageJson('@yolkai/nx-workspace', '2.0.0')).toEqual({
migrations: [],
packageJson: {
'@yolkai/nx-workspace': {
version: '2.0.0',
alwaysAddToPackageJson: false
},
'@yolkai/nx-angular': {
version: '2.0.0',
alwaysAddToPackageJson: false
},
'@yolkai/nx-cypress': {
version: '2.0.0',
alwaysAddToPackageJson: false
},
'@yolkai/eslint-plugin-nx': {
version: '2.0.0',
alwaysAddToPackageJson: false
},
'@yolkai/nx-express': {
version: '2.0.0',
alwaysAddToPackageJson: false
},
'@yolkai/nx-jest': {
version: '2.0.0',
alwaysAddToPackageJson: false
},
'@yolkai/nx-linter': {
version: '2.0.0',
alwaysAddToPackageJson: false
},
'@yolkai/nx-nest': {
version: '2.0.0',
alwaysAddToPackageJson: false
},
'@yolkai/nx-next': {
version: '2.0.0',
alwaysAddToPackageJson: false
},
'@yolkai/nx-node': {
version: '2.0.0',
alwaysAddToPackageJson: false
},
'@yolkai/nx-react': {
version: '2.0.0',
alwaysAddToPackageJson: false
},
'@yolkai/nx-storybook': {
version: '2.0.0',
alwaysAddToPackageJson: false
},
'@yolkai/nx-tao': { version: '2.0.0', alwaysAddToPackageJson: false },
'@yolkai/nx-web': { version: '2.0.0', alwaysAddToPackageJson: false }
}
});
}));
it('should not throw when packages are missing', () => __awaiter(this, void 0, void 0, function* () {
const migrator = new migrate_1.Migrator({
versions: p => (p === '@yolkai/nx-nest' ? null : '1.0.0'),
fetch: (p, v) => Promise.resolve({
version: '2.0.0',
packageJsonUpdates: { one: { version: '2.0.0', packages: {} } }
}),
from: {},
to: {}
});
yield migrator.updatePackageJson('@yolkai/nx-workspace', '2.0.0');
}));
it('should only fetch packages that are installed', () => __awaiter(this, void 0, void 0, function* () {
const migrator = new migrate_1.Migrator({
versions: p => (p === '@yolkai/nx-nest' ? null : '1.0.0'),
fetch: (p, v) => {
if (p === '@yolkai/nx-nest') {
throw new Error('Boom');
}
return Promise.resolve({
version: '2.0.0',
packageJsonUpdates: { one: { version: '2.0.0', packages: {} } }
});
},
from: {},
to: {}
});
yield migrator.updatePackageJson('@yolkai/nx-workspace', '2.0.0');
}));
});
describe('migrations', () => {
it('should create a list of migrations to run', () => __awaiter(this, void 0, void 0, function* () {
const migrator = new migrate_1.Migrator({
versions: p => {
if (p === 'parent')
return '1.0.0';
if (p === 'child')
return '1.0.0';
return null;
},
fetch: (p, v) => {
if (p === 'parent') {
return Promise.resolve({
version: '2.0.0',
packageJsonUpdates: {
version2: {
version: '2.0.0',
packages: {
child: { version: '2.0.0' },
newChild: {
version: '3.0.0'
}
}
}
},
schematics: {
version2: {
version: '2.0.0',
factory: 'parent-factory'
}
}
});
}
else if (p === 'child') {
return Promise.resolve({
version: '2.0.0',
schematics: {
version2: {
version: '2.0.0',
factory: 'child-factory'
}
}
});
}
else if (p === 'newChild') {
return Promise.resolve({
version: '3.0.0',
schematics: {
version2: {
version: '2.0.0',
factory: 'new-child-factory'
}
}
});
}
else {
return Promise.resolve(null);
}
},
from: {},
to: {}
});
expect(yield migrator.updatePackageJson('parent', '2.0.0')).toEqual({
migrations: [
{
package: 'parent',
version: '2.0.0',
name: 'version2',
factory: 'parent-factory'
},
{
package: 'child',
version: '2.0.0',
name: 'version2',
factory: 'child-factory'
}
],
packageJson: {
parent: { version: '2.0.0', alwaysAddToPackageJson: false },
child: { version: '2.0.0', alwaysAddToPackageJson: false },
newChild: { version: '3.0.0', alwaysAddToPackageJson: false }
}
});
}));
});
});