diff --git a/packages/build/src/get-version.js b/packages/build/src/get-version.js index 37e645c..a616926 100644 --- a/packages/build/src/get-version.js +++ b/packages/build/src/get-version.js @@ -12,6 +12,15 @@ export default (exp, options) => { // latest, use latest at build-time version = ''; } + if (version === '^' || version === '~') { + // bare prefix (from workspace:^ or workspace:~), use latest at build-time with prefix + const prefix = version; + const latest = exp.versions[0]; + if (!latest) return; + const p = parseVersionArray(latest.version.toArray()); + if (p.release) return p.release; + return prefix === '~' ? p.tilde : p.caret; + } } const match = version ? exp.versions.find(e => e.version.satisfies(version)) diff --git a/packages/build/src/parse-options.js b/packages/build/src/parse-options.js index 5b7614e..be006b8 100644 --- a/packages/build/src/parse-options.js +++ b/packages/build/src/parse-options.js @@ -31,10 +31,16 @@ export default options => { return config; }); parsed.partials = toArray(partials); - parsed.dependencies = { + const rawDeps = { ...pkg.devDependencies, ...pkg.dependencies, ...pkg.peerDependencies }; + parsed.dependencies = Object.fromEntries( + Object.entries(rawDeps).map(([name, ver]) => [ + name, + ver.startsWith('workspace:') ? ver.slice('workspace:'.length) : ver + ]) + ); return parsed; }; diff --git a/packages/build/test/unit/get-export.test.js b/packages/build/test/unit/get-export.test.js index a8eeff9..1563eb3 100644 --- a/packages/build/test/unit/get-export.test.js +++ b/packages/build/test/unit/get-export.test.js @@ -63,3 +63,13 @@ test('returns non-versioned dependency', t => { test('returns already versioned dependency', t => { t.is(t.context.getExport('lodash@5'), 'lodash@5'); }); + +test('handles bare ^ prefix (workspace:^)', t => { + t.context.options.dependencies.lodash = '^'; + t.is(t.context.getExport('lodash'), 'lodash@^4'); +}); + +test('handles bare ~ prefix (workspace:~)', t => { + t.context.options.dependencies.lodash = '~'; + t.is(t.context.getExport('lodash'), 'lodash@~4'); +}); diff --git a/packages/build/test/unit/parse-options.test.js b/packages/build/test/unit/parse-options.test.js new file mode 100644 index 0000000..13a53da --- /dev/null +++ b/packages/build/test/unit/parse-options.test.js @@ -0,0 +1,68 @@ +import proxyquire from 'proxyquire'; +import setup from '../../../../configs/test/unit'; + +const test = setup(); + +const createSut = (pkg = {}) => { + const mockPkg = { + name: 'test-pkg', + version: '1.0.0', + dependencies: {}, + devDependencies: {}, + peerDependencies: {}, + ...pkg + }; + const mock = () => mockPkg; + mock.default = mock; + return proxyquire('../../src/parse-options', { + './get-package': mock + }).default; +}; + +test('strips workspace: protocol from dependencies', t => { + const sut = createSut({ + dependencies: { + '@wsb/guac-widget-core': 'workspace:*', + '@wsb/guac-dials': 'workspace:^1.7.1', + '@wsb/guac-widget-shared': 'workspace:~1.7.11', + 'lodash': '^4.17.21' + } + }); + const result = sut({}); + t.is(result.dependencies['@wsb/guac-widget-core'], '*'); + t.is(result.dependencies['@wsb/guac-dials'], '^1.7.1'); + t.is(result.dependencies['@wsb/guac-widget-shared'], '~1.7.11'); + t.is(result.dependencies['lodash'], '^4.17.21'); +}); + +test('handles workspace:^ shorthand', t => { + const sut = createSut({ + devDependencies: { + 'react': 'workspace:^' + } + }); + const result = sut({}); + t.is(result.dependencies['react'], '^'); +}); + +test('handles workspace:~ shorthand', t => { + const sut = createSut({ + peerDependencies: { + 'react': 'workspace:~' + } + }); + const result = sut({}); + t.is(result.dependencies['react'], '~'); +}); + +test('merges all dependency types with workspace stripping', t => { + const sut = createSut({ + dependencies: { a: '1.0.0' }, + devDependencies: { b: 'workspace:^2.0.0' }, + peerDependencies: { c: '3.0.0' } + }); + const result = sut({}); + t.is(result.dependencies.a, '1.0.0'); + t.is(result.dependencies.b, '^2.0.0'); + t.is(result.dependencies.c, '3.0.0'); +});