Skip to content

Commit 2ac8b94

Browse files
Merge pull request #1394 from opencomponents/checkminversion
add a min oc version checker for templates if defined
2 parents c40e436 + f73a6d0 commit 2ac8b94

File tree

6 files changed

+80
-0
lines changed

6 files changed

+80
-0
lines changed

src/registry/domain/validators/index.ts

+3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import ocCliVersionValidator from './oc-cli-version';
55
import packageJsonValidator from './package-json-validator';
66
import pluginsRequirementsValidator from './plugins-requirements';
77
import registryConfigurationValidator from './registry-configuration';
8+
import templateOcVersionValidator from './templace-oc-version';
89

910
import nodeVersionValidator from './node-version';
1011
import uploadedPackageValidator from './uploaded-package';
@@ -19,6 +20,8 @@ export const validatePackage = uploadedPackageValidator;
1920
export const validatePackageJson = packageJsonValidator;
2021
export const validatePluginsRequirements = pluginsRequirementsValidator;
2122
export const validateRegistryConfiguration = registryConfigurationValidator;
23+
export const validateTemplateOcVersion = templateOcVersionValidator;
24+
2225
export function validateVersion(version: string): boolean {
2326
return !!semver.valid(version);
2427
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import path from 'node:path';
2+
import fs from 'fs-extra';
3+
import semver from 'semver';
4+
5+
const packageInfo = fs.readJsonSync(
6+
path.join(__dirname, '..', '..', '..', '..', 'package.json')
7+
);
8+
9+
type OkResult = { isValid: true };
10+
type ErrorResult = {
11+
isValid: false;
12+
error: {
13+
registryVersion: string;
14+
minOcVersion: string;
15+
code: string;
16+
};
17+
};
18+
type Result = OkResult | ErrorResult;
19+
20+
export default function templateOcVersion(minOcVersion: string): Result {
21+
if (semver.lt(packageInfo.version, minOcVersion)) {
22+
return {
23+
isValid: false,
24+
error: {
25+
registryVersion: packageInfo.version,
26+
minOcVersion,
27+
code: 'old_version'
28+
}
29+
};
30+
}
31+
32+
return { isValid: true };
33+
}

src/registry/routes/helpers/get-component.ts

+19
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import RequireWrapper from '../../domain/require-wrapper';
1818
import * as sanitiser from '../../domain/sanitiser';
1919
import * as urlBuilder from '../../domain/url-builder';
2020
import * as validator from '../../domain/validators';
21+
import { validateTemplateOcVersion } from '../../domain/validators';
2122
import applyDefaultValues from './apply-default-values';
2223
import * as getComponentFallback from './get-component-fallback';
2324
import GetComponentRetrievingInfo from './get-component-retrieving-info';
@@ -203,6 +204,24 @@ export default function getComponent(conf: Config, repository: Repository) {
203204
});
204205
}
205206

207+
if (component.oc.files.template.minOcVersion) {
208+
const templateOcVersionResult = validateTemplateOcVersion(
209+
component.oc.files.template.minOcVersion
210+
);
211+
if (!templateOcVersionResult.isValid) {
212+
return callback({
213+
status: 400,
214+
response: {
215+
code: 'TEMPLATE_REQUIRES_HIGHER_OC_VERSION',
216+
error: strings.errors.cli.TEMPLATE_OC_VERSION_NOT_VALID(
217+
templateOcVersionResult.error.minOcVersion,
218+
templateOcVersionResult.error.registryVersion
219+
)
220+
}
221+
});
222+
}
223+
}
224+
206225
// Support legacy templates
207226
let templateType = component.oc.files.template.type;
208227
const isLegacyTemplate = isTemplateLegacy(templateType);

src/registry/routes/publish.ts

+19
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import strings from '../../resources/index';
33
import extractPackage from '../domain/extract-package';
44
import type { Repository } from '../domain/repository';
55
import * as validator from '../domain/validators';
6+
import { validateTemplateOcVersion } from '../domain/validators';
67

78
export default function publish(repository: Repository) {
89
return async (req: Request, res: Response): Promise<void> => {
@@ -56,6 +57,24 @@ export default function publish(repository: Repository) {
5657
try {
5758
const pkgDetails = await extractPackage(files, res.conf.tarExtractMode);
5859

60+
if (pkgDetails.packageJson.oc.files.template.minOcVersion) {
61+
const templateOcVersionResult = validateTemplateOcVersion(
62+
pkgDetails.packageJson.oc.files.template.minOcVersion
63+
);
64+
if (!templateOcVersionResult.isValid) {
65+
res.errorDetails = `Your template requires a version of OC higher than ${templateOcVersionResult.error.minOcVersion}`;
66+
res.status(409).json({
67+
code: 'template_oc_version_not_valid',
68+
error: strings.errors.cli.TEMPLATE_OC_VERSION_NOT_VALID(
69+
templateOcVersionResult.error.minOcVersion,
70+
templateOcVersionResult.error.registryVersion
71+
),
72+
details: templateOcVersionResult.error
73+
});
74+
return;
75+
}
76+
}
77+
5978
try {
6079
await repository.publishComponent({
6180
pkgDetails,

src/resources/index.ts

+5
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,11 @@ export default {
212212
`Error requiring oc-template: "${template}" not found`,
213213
TEMPLATE_TYPE_NOT_VALID: (template: string): string =>
214214
`Error requiring oc-template: "${template}" is not a valid oc-template`,
215+
TEMPLATE_OC_VERSION_NOT_VALID: (
216+
template: string,
217+
version: string
218+
): string =>
219+
`Your template requires a version of OC higher than ${template} but your OC version is ${version}`,
215220
TEMPLATE_DEP_MISSING: (template: string, path: string): string =>
216221
`Template dependency missing. To fix it run:\n\nnpm install --save-dev ${template}-compiler --prefix ${path}\n\n`
217222
},

src/types.ts

+1
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ interface OcConfiguration {
8585
src: string;
8686
type: string;
8787
version: string;
88+
minOcVersion?: string;
8889
size?: number;
8990
};
9091
env?: string;

0 commit comments

Comments
 (0)