업데이트 계산하는 게 머리 아플 수 있다.
이러한 계산을 semver 라이브러리로 매우! 손쉽게! 할 수 있다!
https://www.npmjs.com/package/semver
문서내에 Usage를 확인하면
const semver = require('semver')
semver.valid('1.2.3') // '1.2.3'
semver.valid('a.b.c') // null
semver.clean(' =v1.2.3 ') // '1.2.3'
semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true
semver.gt('1.2.3', '9.8.7') // false
semver.lt('1.2.3', '9.8.7') // true
semver.minVersion('>=1.0.0') // '1.0.0'
semver.valid(semver.coerce('v2')) // '2.0.0'
semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7'
대략적으로 감이온다..
$ npx create-zeroconfig-app semver-test
select repository는 react-zeroconfig/typescript-playground : Typescript Playground (jest, storybook)
으로 한다.
사실 typeScript를 적용하지 못해서 굳이 똑같이 따라할 필요는 없다.
$ npm install --save-dev semver
$ npm test
const semver = require('semver');
describe('npm-semver functions test', () => {
test('valid(release)는 parsing version을 반환해야하며, 유효하지 않다면 null을 반환해야 한다.', () => {
expect(semver.valid('1.2.3')).toEqual('1.2.3');
expect(semver.valid(semver.coerce('^1.2.3'))).toEqual('1.2.3');
expect(semver.valid('a.b.c')).toEqual(null);
});
test('inc(v, release)는 release type (major, premajor, minor, preminor, patch, prepatch, or prerelease)이 증가된 버전을 반환해야하며, 유효하지 않다면 null을 반환해야 한다.', () => {
expect(semver.inc('1.2.3-alpha.2', 'major')).toEqual('2.0.0');
expect(semver.inc('1.2.3-alpha.2', 'premajor')).toEqual('2.0.0-0');
expect(semver.inc('1.2.3', 'minor')).toEqual('1.3.0');
expect(semver.inc('3.27.2-alpha.2', 'prepatch')).toEqual('3.27.3-0');
expect(semver.inc('3.27.2-alpha.2', 'prerelease')).toEqual('3.27.2-alpha.3');
});
test('intersects(r1, r2, loose)는 범위에 허용되는 경우 true를 반환해야 한다.', () => {
expect(semver.intersects('^1.2.3', '2.0.0')).toEqual(false);
expect(semver.intersects('^1.0.0', '1.9.0')).toEqual(true);
expect(semver.intersects('^1.2.3-beta.2', '^1.2.3-beta.4')).toEqual(true);
expect(semver.intersects('~1.2.3', '~1.3.0')).toEqual(false);
expect(semver.intersects('~1', '2')).toEqual(false);
});
test('prerelease(v)는 prerelease의 구성요소를 배열로 반환해야하며 없는 경우 null을 반환해야 한다.', () => {
expect(semver.prerelease('1.2.3-alpha.2')).toEqual(['alpha', 2]);
expect(semver.prerelease('1.2.3')).toEqual(null);
});
test('parse(v)는 SemVer object또는 null을 반환해야 한다.', () => {
const semVerObj = {
build: [],
includePrerelease: false,
loose: false,
major: 1,
minor: 2,
options: { includePrerelease: false, loose: false },
patch: 3,
prerelease: ['alpha', 2],
raw: '1.2.3-alpha.2',
version: '1.2.3-alpha.2',
};
expect(semver.parse('1.2.3-alpha.2')).toEqual(semVerObj);
});
test('satisfies(version, range)는 버전이 range에 해당된다면 true를 반환해야 한다.', () => {
expect(semver.satisfies('1.2.3', '^1.2.2')).toEqual(true);
expect(semver.satisfies('2.0.0', '^1.2.2')).toEqual(false);
expect(semver.satisfies('1.2.3', '>=1.0.0 <2.0.0')).toEqual(true);
expect(semver.satisfies('~1.2.3', '~1.3.0')).toEqual(false);
});
});
다양한 function들이 있고
https://github.com/npm/node-semver#functions
이 내용을 참고 하였다.
전부다 작성하진 않았고
비교하기에 적절한 function과 기본이 될 수 있는 function들로 test를 작성하였다.
const semVerObj = {
build: [],
includePrerelease: false,
loose: false,
major: 1,
minor: 2,
options: { includePrerelease: false, loose: false },
patch: 3,
prerelease: ['alpha', 2],
raw: '1.2.3-alpha.2',
version: '1.2.3-alpha.2',
};
범위에 허용되는지를 확인한다면 intersects(r1, r2, loose)
와 satisfies(version, range)
를 추천한다.
https://github.com/yami03/semver-test/blob/master/src/__tests__/semver.ts