Skip to content

Commit

Permalink
allow custom NPM repo only when licensed
Browse files Browse the repository at this point in the history
  • Loading branch information
netroy committed Aug 12, 2024
1 parent b6d6bea commit a80f96d
Show file tree
Hide file tree
Showing 5 changed files with 29 additions and 11 deletions.
4 changes: 4 additions & 0 deletions packages/cli/src/License.ts
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,10 @@ export class License {
return this.isFeatureEnabled(LICENSE_FEATURES.PROJECT_ROLE_VIEWER);
}

isCustomNpmRegistryEnabled() {
return this.isFeatureEnabled(LICENSE_FEATURES.COMMUNITY_NODES_CUSTOM_REGISTRY);
}

getCurrentEntitlements() {
return this.manager?.getCurrentEntitlements() ?? [];
}
Expand Down
1 change: 1 addition & 0 deletions packages/cli/src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ export const LICENSE_FEATURES = {
PROJECT_ROLE_ADMIN: 'feat:projectRole:admin',
PROJECT_ROLE_EDITOR: 'feat:projectRole:editor',
PROJECT_ROLE_VIEWER: 'feat:projectRole:viewer',
COMMUNITY_NODES_CUSTOM_REGISTRY: 'feat:communityNodes:customRegistry'

Check failure on line 93 in packages/cli/src/constants.ts

View workflow job for this annotation

GitHub Actions / Lint / Lint

Insert `,`
} as const;

export const LICENSE_QUOTAS = {
Expand Down
1 change: 1 addition & 0 deletions packages/cli/src/controllers/e2e.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ export class E2EController {
[LICENSE_FEATURES.PROJECT_ROLE_ADMIN]: false,
[LICENSE_FEATURES.PROJECT_ROLE_EDITOR]: false,
[LICENSE_FEATURES.PROJECT_ROLE_VIEWER]: false,
[LICENSE_FEATURES.COMMUNITY_NODES_CUSTOM_REGISTRY]: false,
};

private numericFeatures: Record<NumericLicenseFeature, number> = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import { InstalledNodesRepository } from '@db/repositories/installedNodes.reposi
import { InstalledPackagesRepository } from '@db/repositories/installedPackages.repository';
import { InstalledNodes } from '@db/entities/InstalledNodes';
import type { LoadNodesAndCredentials } from '@/LoadNodesAndCredentials';
import type { License } from '@/License';

import { mockInstance } from '@test/mocking';
import { COMMUNITY_NODE_VERSION, COMMUNITY_PACKAGE_VERSION } from '@test-integration/constants';
Expand All @@ -39,6 +40,7 @@ const execMock = ((...args) => {
}) as typeof exec;

describe('CommunityPackagesService', () => {
const license = mock<License>();
const globalConfig = mock<GlobalConfig>({
nodes: {
communityPackages: {
Expand Down Expand Up @@ -75,6 +77,7 @@ describe('CommunityPackagesService', () => {
mock(),
loadNodesAndCredentials,
mock(),
license,
globalConfig,
);

Expand Down Expand Up @@ -394,6 +397,7 @@ describe('CommunityPackagesService', () => {
installedPackage.packageName = mockPackageName();

mocked(exec).mockImplementation(execMock);
license.isCustomNpmRegistryEnabled.mockReturnValue(true);

//
// ACT
Expand Down
30 changes: 19 additions & 11 deletions packages/cli/src/services/communityPackages.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ import type { CommunityPackages } from '@/Interfaces';
import { LoadNodesAndCredentials } from '@/LoadNodesAndCredentials';
import { Logger } from '@/Logger';
import { OrchestrationService } from './orchestration.service';
import { License } from '@/License';

const DEFAULT_REGISTRY = 'https://registry.npmjs.org';

const {
PACKAGE_NAME_NOT_PROVIDED,
Expand Down Expand Up @@ -51,20 +54,15 @@ export class CommunityPackagesService {

missingPackages: string[] = [];

private readonly registry: string;

constructor(
private readonly instanceSettings: InstanceSettings,
private readonly logger: Logger,
private readonly installedPackageRepository: InstalledPackagesRepository,
private readonly loadNodesAndCredentials: LoadNodesAndCredentials,
private readonly orchestrationService: OrchestrationService,
globalConfig: GlobalConfig,
) {
const { reinstallMissing, registry } = globalConfig.nodes.communityPackages;
this.reinstallMissingPackages = reinstallMissing;
this.registry = registry;
}
private readonly license: License,
private readonly globalConfig: GlobalConfig,
) {}

get hasMissingPackages() {
return this.missingPackages.length > 0;
Expand Down Expand Up @@ -283,7 +281,8 @@ export class CommunityPackagesService {

if (missingPackages.size === 0) return;

if (this.reinstallMissingPackages) {
const { reinstallMissing } = this.globalConfig.nodes.communityPackages;
if (reinstallMissing) {
this.logger.info('Attempting to reinstall missing packages', { missingPackages });
try {
// Optimistic approach - stop if any installation fails
Expand Down Expand Up @@ -325,13 +324,22 @@ export class CommunityPackagesService {
await this.orchestrationService.publish('community-package-uninstall', { packageName });
}

private getNpmRegistry() {
let { registry } = this.globalConfig.nodes.communityPackages;
if (registry !== DEFAULT_REGISTRY && !this.license.isCustomNpmRegistryEnabled()) {
this.logger.warn('Not licensed to use custom NPM registry')

Check failure on line 330 in packages/cli/src/services/communityPackages.service.ts

View workflow job for this annotation

GitHub Actions / Lint / Lint

Insert `;`
registry = DEFAULT_REGISTRY;
}
return registry;
}

private async installOrUpdatePackage(
packageName: string,
options: { version?: string } | { installedPackage: InstalledPackages },
) {
const isUpdate = 'installedPackage' in options;
const packageVersion = isUpdate || !options.version ? 'latest' : options.version;
const command = `npm install ${packageName}@${packageVersion} --registry=${this.registry}`;
const command = `npm install ${packageName}@${packageVersion} --registry=${this.getNpmRegistry()}`;

try {
await this.executeNpmCommand(command);
Expand Down Expand Up @@ -384,7 +392,7 @@ export class CommunityPackagesService {

async installOrUpdateNpmPackage(packageName: string, packageVersion: string) {
await this.executeNpmCommand(
`npm install ${packageName}@${packageVersion} --registry=${this.registry}`,
`npm install ${packageName}@${packageVersion} --registry=${this.getNpmRegistry()}`,
);
await this.loadNodesAndCredentials.loadPackage(packageName);
await this.loadNodesAndCredentials.postProcessLoaders();
Expand Down

0 comments on commit a80f96d

Please sign in to comment.