UNPKG

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
"use strict"; 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