@nodecg/types
Version:
Dynamic broadcast graphics rendered in a browser
56 lines (50 loc) • 1.58 kB
text/typescript
import * as path from "node:path";
import { isLegacyProject } from "@nodecg/internal-util";
import * as IOE from "fp-ts/IOEither";
import semver from "semver";
import type { NodeCG } from "../../types/nodecg";
export const parseManifest =
(bundlePath: string) => (packageJson: NodeCG.PackageJSON) => {
if (!packageJson.name) {
return IOE.left(
new Error(`${bundlePath}'s package.json must specify "name".`),
);
}
if (isLegacyProject()) {
if (!packageJson.nodecg) {
return IOE.left(
new Error(
`${packageJson.name}'s package.json lacks a "nodecg" property, and therefore cannot be parsed.`,
),
);
}
if (!semver.validRange(packageJson.nodecg.compatibleRange)) {
return IOE.left(
new Error(
`${packageJson.name}'s package.json does not have a valid "nodecg.compatibleRange" property.`,
),
);
}
const bundleFolderName = path.basename(bundlePath);
if (bundleFolderName !== packageJson.name) {
return IOE.left(
new Error(
`${packageJson.name}'s folder is named "${bundleFolderName}". Please rename it to "${packageJson.name}".`,
),
);
}
}
return IOE.right({
...packageJson.nodecg,
name: packageJson.name,
version: packageJson.version,
license: packageJson.license,
description: packageJson.description,
homepage: packageJson.homepage,
author: packageJson.author,
contributors: packageJson.contributors,
transformBareModuleSpecifiers: Boolean(
packageJson.nodecg?.transformBareModuleSpecifiers,
),
} satisfies NodeCG.Manifest);
};