pcf-scripts
Version:
This package contains a module for building PowerApps Component Framework (PCF) controls. See project homepage how to install.
109 lines (107 loc) • 5.38 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.PlatformLibrariesHandler = void 0;
exports.hasPlatformLibs = hasPlatformLibs;
const fs = require("node:fs");
const path = require("node:path");
const semver = require("semver");
const diagnosticMessages_generated_1 = require("./diagnosticMessages.generated");
const featureManager_1 = require("./featureManager");
const locale_1 = require("./generated/locale");
let _featureManager;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
function getFilterCallback(matchRegex, alias) {
return ({ _context, request }, callback) => {
if (matchRegex.test(request)) {
return callback(undefined, alias);
}
callback();
};
}
function versionComparer(a, b) {
return semver.rcompare(a.maxVersion, b.maxVersion);
}
function hasPlatformLibs(control) {
return control.getControlManifest().data.manifest.control.resources["platform-library"] !== undefined;
}
// convert control's platform-library nodes to record mapping library to highest version specified
function parsePlatformLibs(control) {
if (!hasPlatformLibs(control)) {
return {};
}
return control
.getControlManifest()
.data.manifest.control.resources["platform-library"].reduce((list, curr) => {
const name = curr.$.name?.toLowerCase();
const ver = curr.$.version;
if (!ver || !name || !semver.valid(ver)) {
return list;
}
if (!list[name] || semver.gt(ver, list[name])) {
list[name] = ver;
}
return list;
}, {});
}
class PlatformLibrariesHandler {
constructor(platformLibsVersionsFilePath) {
this._platformLibsVersions = JSON.parse(fs.readFileSync(platformLibsVersionsFilePath ?? path.resolve(__dirname, "PlatformLibraryVersions.json"), { encoding: "utf8" }));
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
getLatestVersions(control) {
const map = {};
const extObj = [map];
const specifiedLibraries = parsePlatformLibs(control);
if (specifiedLibraries.fluent) {
const supportedLib = this.getSupportedVersion("fluent", specifiedLibraries.fluent);
if (!supportedLib) {
throw new Error((0, locale_1.translateA)(diagnosticMessages_generated_1.strings.validation_property_platformlibrary_range_error.key, ["fluent", specifiedLibraries.fluent ?? "undefined"]));
}
if (semver.satisfies(supportedLib.platformVersion, "<9.0.0")) {
map["@fluentui/react"] = supportedLib.libAlias;
extObj.push(getFilterCallback(/^(?:@fluentui\/(?:react$|react\/))/, supportedLib.libAlias));
}
else {
map["@fluentui/react-components"] = supportedLib.libAlias;
extObj.push(getFilterCallback(/^(?:@fluentui\/react-(?:components$|components\/))/, supportedLib.libAlias));
}
}
if (specifiedLibraries.react) {
_featureManager ?? (_featureManager = new featureManager_1.FeatureManager());
const supportedReactVer = this.getSupportedVersion("react", specifiedLibraries.react);
map.react = supportedReactVer?.libAlias;
if (!map.react) {
throw new Error((0, locale_1.translateA)(diagnosticMessages_generated_1.strings.validation_property_platformlibrary_range_error.key, ["react", specifiedLibraries.react ?? "undefined"]));
}
if (!_featureManager.isFeatureEnabled("pcfReactPlatformLibraries") && semver.satisfies(specifiedLibraries.react, ">=17.0.0")) {
throw new Error((0, locale_1.translateA)(diagnosticMessages_generated_1.strings.validation_property_platformlibrary_range_error.key, ["react", specifiedLibraries.react ?? "undefined"]));
}
if (_featureManager.isFeatureEnabled("pcfReactPlatformLibraries")) {
// match react-dom version to react version
map["react-dom"] = this.getSupportedVersion("react_dom", specifiedLibraries.react)?.libAlias;
if (!map["react-dom"]) {
throw new Error((0, locale_1.translateA)(diagnosticMessages_generated_1.strings.validation_property_platformlibrary_range_error.key, ["react-dom", specifiedLibraries.react ?? "undefined"]));
}
}
// This is a fallback feature flag to support old react namespace. This will be removed in future once we verify there are no issues.
if (_featureManager.isFeatureEnabled("pcfOldReactNamespace")) {
map.react = "React";
if (_featureManager.isFeatureEnabled("pcfReactPlatformLibraries")) {
map["react-dom"] = "ReactDOM";
}
}
}
return extObj;
}
getSupportedVersion(library, version) {
if (!library || !version) {
return undefined;
}
const versions = this._platformLibsVersions[library.toLowerCase()]
?.filter((x) => semver.satisfies(version, `>=${x.minVersion} <=${x.maxVersion}`))
.sort(versionComparer);
return versions?.[0] ?? undefined;
}
}
exports.PlatformLibrariesHandler = PlatformLibrariesHandler;
//# sourceMappingURL=platformLibrariesHandler.js.map