Skip to content

Commit fefd43b

Browse files
committed
feat(publishable): add the registry_uri query param when a custom registry is defined
1 parent 6025195 commit fefd43b

13 files changed

Lines changed: 58 additions & 38 deletions

File tree

src/project-type/cli/lifter.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {lift as liftPublishable} from '../publishable/index.js';
22

3-
export default function liftCli({projectRoot, packageDetails}) {
4-
return liftPublishable({projectRoot, packageDetails});
3+
export default function liftCli({projectRoot, packageDetails, registry}) {
4+
return liftPublishable({projectRoot, packageDetails, registry});
55
}
Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {afterEach, describe, expect, it, vi} from 'vitest';
1+
import {describe, expect, it, vi} from 'vitest';
22
import any from '@travi/any';
33
import {when} from 'vitest-when';
44

@@ -8,16 +8,13 @@ import lift from './lifter.js';
88
vi.mock('../publishable/lifter');
99

1010
describe('cli project-type lifter', () => {
11-
afterEach(() => {
12-
vi.clearAllMocks();
13-
});
14-
1511
it('should leverage the publishable lifter', async () => {
1612
const projectRoot = any.string();
1713
const packageDetails = any.simpleObject();
14+
const registry = any.url();
1815
const publishableResults = any.simpleObject();
19-
when(liftPublishable).calledWith({projectRoot, packageDetails}).thenResolve(publishableResults);
16+
when(liftPublishable).calledWith({projectRoot, packageDetails, registry}).thenResolve(publishableResults);
2017

21-
expect(await lift({projectRoot, packageDetails})).toEqual(publishableResults);
18+
expect(await lift({projectRoot, packageDetails, registry})).toEqual(publishableResults);
2219
});
2320
});

src/project-type/lifter.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@ function vcsRepositoryHostedOnGithub(vcs) {
77
return vcs && 'github' === vcs.host;
88
}
99

10-
export default async function liftProjectType({projectRoot, packageDetails, vcs}) {
11-
if (await isPackage({projectRoot, packageDetails})) return liftPackage({projectRoot, packageDetails});
12-
if (await isCli({projectRoot, packageDetails})) return liftCli({projectRoot, packageDetails});
10+
export default async function liftProjectType({projectRoot, packageDetails, vcs, configs}) {
11+
const registry = configs?.registries?.registry;
12+
13+
if (await isPackage({projectRoot, packageDetails})) return liftPackage({projectRoot, packageDetails, registry});
14+
if (await isCli({projectRoot, packageDetails})) return liftCli({projectRoot, packageDetails, registry});
1315

1416
let homepage;
1517

src/project-type/lifter.test.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,22 @@ describe('lift project-type', () => {
1919
});
2020

2121
it('should lift a package project-type', async () => {
22+
const registry = any.url();
2223
const liftPackageResults = any.simpleObject();
2324
when(packagePredicate).calledWith({projectRoot, packageDetails}).thenResolve(true);
24-
when(liftPackage).calledWith({projectRoot, packageDetails}).thenResolve(liftPackageResults);
25+
when(liftPackage).calledWith({projectRoot, packageDetails, registry}).thenResolve(liftPackageResults);
2526

26-
expect(await lift({projectRoot, packageDetails})).toEqual(liftPackageResults);
27+
expect(await lift({projectRoot, packageDetails, configs: {registries: {registry}}})).toEqual(liftPackageResults);
2728
});
2829

2930
it('should lift a cli project-type', async () => {
31+
const registry = any.url();
3032
const liftCliResults = any.simpleObject();
3133
when(cliPredicate).calledWith({projectRoot, packageDetails}).thenResolve(true);
3234
when(packagePredicate).calledWith({projectRoot, packageDetails}).thenResolve(false);
33-
when(liftCli).calledWith({projectRoot, packageDetails}).thenResolve(liftCliResults);
35+
when(liftCli).calledWith({projectRoot, packageDetails, registry}).thenResolve(liftCliResults);
3436

35-
expect(await lift({projectRoot, packageDetails})).toEqual(liftCliResults);
37+
expect(await lift({projectRoot, packageDetails, configs: {registries: {registry}}})).toEqual(liftCliResults);
3638
});
3739

3840
it('should define the repository as the homepage if the available project-type lifters do not apply', async () => {

src/project-type/package/lifter.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {lift as liftPublishable} from '../publishable/index.js';
22

3-
export default function liftPackage({projectRoot, packageDetails}) {
4-
return liftPublishable({projectRoot, packageDetails});
3+
export default function liftPackage({projectRoot, packageDetails, registry}) {
4+
return liftPublishable({projectRoot, packageDetails, registry});
55
}
Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {afterEach, describe, expect, it, vi} from 'vitest';
1+
import {describe, expect, it, vi} from 'vitest';
22
import any from '@travi/any';
33
import {when} from 'vitest-when';
44

@@ -8,16 +8,13 @@ import lift from './lifter.js';
88
vi.mock('../publishable/lifter');
99

1010
describe('package project-type lifter', () => {
11-
afterEach(() => {
12-
vi.clearAllMocks();
13-
});
14-
1511
it('should leverage the publishable lifter', async () => {
1612
const projectRoot = any.string();
1713
const packageDetails = any.simpleObject();
14+
const registry = any.url();
1815
const publishableResults = any.simpleObject();
19-
when(liftPublishable).calledWith({projectRoot, packageDetails}).thenResolve(publishableResults);
16+
when(liftPublishable).calledWith({projectRoot, packageDetails, registry}).thenResolve(publishableResults);
2017

21-
expect(await lift({projectRoot, packageDetails})).toEqual(publishableResults);
18+
expect(await lift({projectRoot, packageDetails, registry})).toEqual(publishableResults);
2219
});
2320
});

src/project-type/publishable/badges.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
1-
export default function scaffoldPublishableBadges(packageName, accessLevel) {
1+
function buildNpmBadgeImageUrl(packageName, registry) {
2+
const params = new URLSearchParams({logo: 'npm', ...registry && {registry_uri: registry}});
3+
4+
return `https://img.shields.io/npm/v/${packageName}?${params}`;
5+
}
6+
7+
export default function scaffoldPublishableBadges(packageName, accessLevel, registry) {
28
return {
39
consumer: {
410
...'public' === accessLevel && {
511
npm: {
6-
img: `https://img.shields.io/npm/v/${packageName}?logo=npm`,
12+
img: buildNpmBadgeImageUrl(packageName, registry),
713
text: 'npm',
814
link: `https://www.npmjs.com/package/${packageName}`
915
}

src/project-type/publishable/badges.test.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,12 @@ describe('badges for publishable project types', async () => {
1818
it('should return the npm badge for packages with a public access level', () => {
1919
expect(defineBadges(packageName, 'public').consumer).toEqual({npm: npmBadgeDetails});
2020
});
21+
22+
it('should include the registry_uri in the npm badge when a custom registry is provided', () => {
23+
const registry = any.url();
24+
25+
const {searchParams} = new URL(defineBadges(packageName, 'public', registry).consumer.npm.img);
26+
27+
expect(searchParams.get('registry_uri')).toEqual(registry);
28+
});
2129
});

src/project-type/publishable/lifter.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {mergeIntoExistingPackageJson} from '@form8ion/javascript-core';
44
import defineBadges from './badges.js';
55
import {lift as liftProvenance} from './provenance/index.js';
66

7-
export default async function liftPublishable({projectRoot, packageDetails}) {
7+
export default async function liftPublishable({projectRoot, packageDetails, registry}) {
88
const {name: packageName, publishConfig: {access: packageAccessLevel}} = packageDetails;
99
const homepage = `https://npm.im/${packageName}`;
1010

@@ -16,7 +16,7 @@ export default async function liftPublishable({projectRoot, packageDetails}) {
1616
homepage,
1717
dependencies: {javascript: {development: ['publint']}},
1818
scripts: {'lint:publish': 'publint --strict'},
19-
badges: defineBadges(packageName, packageAccessLevel)
19+
badges: defineBadges(packageName, packageAccessLevel, registry)
2020
}
2121
);
2222
}

src/project-type/publishable/lifter.test.js

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import deepmerge from 'deepmerge';
22
import {mergeIntoExistingPackageJson} from '@form8ion/javascript-core';
33

4-
import {afterEach, describe, expect, it, vi} from 'vitest';
4+
import {describe, expect, it, vi} from 'vitest';
55
import any from '@travi/any';
66
import {when} from 'vitest-when';
77

@@ -15,21 +15,18 @@ vi.mock('./provenance');
1515
vi.mock('./badges');
1616

1717
describe('publishable project-type lifter', () => {
18-
afterEach(() => {
19-
vi.clearAllMocks();
20-
});
21-
2218
it('should lift the details of the package project', async () => {
2319
const projectRoot = any.string();
2420
const packageName = any.word();
2521
const packageAccessLevel = any.word();
22+
const registry = any.url();
2623
const packageDetails = {...any.simpleObject(), name: packageName, publishConfig: {access: packageAccessLevel}};
2724
const provenanceResults = any.simpleObject();
2825
const mergedResults = any.simpleObject();
2926
const badgesResults = any.simpleObject();
3027
const homepage = `https://npm.im/${packageName}`;
3128
when(liftProvenance).calledWith({packageDetails, projectRoot}).thenResolve(provenanceResults);
32-
when(defineBadges).calledWith(packageName, packageAccessLevel).thenReturn(badgesResults);
29+
when(defineBadges).calledWith(packageName, packageAccessLevel, registry).thenReturn(badgesResults);
3330
when(deepmerge).calledWith(
3431
provenanceResults,
3532
{
@@ -40,7 +37,7 @@ describe('publishable project-type lifter', () => {
4037
}
4138
).thenReturn(mergedResults);
4239

43-
expect(await lift({projectRoot, packageDetails})).toEqual(mergedResults);
40+
expect(await lift({projectRoot, packageDetails, registry})).toEqual(mergedResults);
4441
expect(mergeIntoExistingPackageJson).toHaveBeenCalledWith({projectRoot, config: {homepage}});
4542
});
4643
});

0 commit comments

Comments
 (0)