npm package diff
Package: @forge/bundler
Versions: 4.20.1-next.6 - 4.20.1-next.7
File: package/out/wrapper-provider.js
Index: package/out/wrapper-provider.js
===================================================================
--- package/out/wrapper-provider.js
+++ package/out/wrapper-provider.js
@@ -0,0 +1,134 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.getWrapperProvider = exports.NetworkWrapperProvider = exports.LocalWrapperProvider = exports.ParseWrapperCDNIndexError = exports.WrapperNetworkError = exports.LocalWrapperNotFoundError = void 0;
+const tslib_1 = require("tslib");
+const path_1 = tslib_1.__importDefault(require("path"));
+const cheerio_1 = tslib_1.__importDefault(require("cheerio"));
+const node_fetch_1 = tslib_1.__importDefault(require("node-fetch"));
+const cli_shared_1 = require("@forge/cli-shared");
+var RuntimeCDN;
+(function (RuntimeCDN) {
+ RuntimeCDN["DEV"] = "https://forge-node-runtime.stg-east.frontend.public.atl-paas.net/";
+ RuntimeCDN["STG"] = "https://forge-node-runtime.stg-east.frontend.public.atl-paas.net/";
+ RuntimeCDN["PROD"] = "https://forge-node-runtime.prod-east.frontend.public.atl-paas.net/";
+ RuntimeCDN["FEDRAMP_MODERATE_STAGING"] = "https://forge-node-runtime.prod-east.frontend.public.atl-paas.net/";
+ RuntimeCDN["FEDRAMP_MODERATE_PROD"] = "https://forge-node-runtime.prod-east.frontend.public.atl-paas.net/";
+})(RuntimeCDN || (RuntimeCDN = {}));
+class LocalWrapperNotFoundError extends cli_shared_1.UserError {
+ constructor() {
+ super('Local node runtime wrapper not found.');
+ }
+}
+exports.LocalWrapperNotFoundError = LocalWrapperNotFoundError;
+class WrapperNetworkError extends cli_shared_1.BaseError {
+ constructor(message, requestId) {
+ super(undefined, message);
+ }
+}
+exports.WrapperNetworkError = WrapperNetworkError;
+class ParseWrapperCDNIndexError extends cli_shared_1.BaseError {
+ constructor(message, requestId) {
+ super(requestId, message);
+ }
+}
+exports.ParseWrapperCDNIndexError = ParseWrapperCDNIndexError;
+var ScriptType;
+(function (ScriptType) {
+ ScriptType["WRAPPER"] = "wrapper";
+ ScriptType["LOADER"] = "loader";
+})(ScriptType || (ScriptType = {}));
+class LocalWrapperProvider {
+ filesystemReader;
+ runtimePath;
+ constructor(filesystemReader, runtimePath) {
+ this.filesystemReader = filesystemReader;
+ this.runtimePath = runtimePath;
+ }
+ async getNodeRuntimeWrapper() {
+ const wrapper = await this.filesystemReader.readFileAsync(path_1.default.join(this.runtimePath, 'dist/wrapper.js'));
+ if (!wrapper) {
+ throw new LocalWrapperNotFoundError();
+ }
+ return {
+ script: wrapper,
+ version: 'local-wrapper'
+ };
+ }
+ async getNodeRuntimeLoader() {
+ const loader = await this.filesystemReader.readFileAsync(path_1.default.join(this.runtimePath, 'dist/loader.js'));
+ if (!loader) {
+ throw new LocalWrapperNotFoundError();
+ }
+ return {
+ script: loader,
+ version: 'local-loader'
+ };
+ }
+}
+exports.LocalWrapperProvider = LocalWrapperProvider;
+class NetworkWrapperProvider {
+ statsigService;
+ wrapper;
+ loader;
+ cdnUrl;
+ constructor(statsigService) {
+ this.statsigService = statsigService;
+ this.cdnUrl = (0, cli_shared_1.getEnvironmentConfig)(RuntimeCDN);
+ }
+ async getScriptPathFromIndex(htmlContent, requestId, scriptType) {
+ const html = cheerio_1.default.load(htmlContent);
+ const scriptPath = html('script')
+ ?.get()
+ ?.find((asset) => asset.attribs['src']?.includes(scriptType))?.attribs['src'];
+ if (typeof scriptPath !== 'string') {
+ throw new ParseWrapperCDNIndexError(`Unable to parse source of runtime ${scriptType}.`, requestId);
+ }
+ return new URL(scriptPath, this.cdnUrl).toString();
+ }
+ getFileFromCDN = async (scriptType) => {
+ try {
+ const indexResponse = await (0, node_fetch_1.default)(this.cdnUrl);
+ if (!indexResponse.ok) {
+ throw new WrapperNetworkError(`Failed to fetch runtime component: ${this.cdnUrl} ${indexResponse.status}.`, (0, cli_shared_1.getAtlassianTraceId)(indexResponse.headers));
+ }
+ const scriptUrl = await this.getScriptPathFromIndex(await indexResponse.text(), (0, cli_shared_1.getAtlassianTraceId)(indexResponse.headers), scriptType);
+ const response = await (0, node_fetch_1.default)(scriptUrl);
+ if (!response.ok) {
+ throw new WrapperNetworkError(`Failed to fetch runtime component: ${scriptUrl.toString()} ${response.status}.`, (0, cli_shared_1.getAtlassianTraceId)(response.headers));
+ }
+ const script = await response.text();
+ return {
+ script,
+ version: new URL(scriptUrl).pathname
+ };
+ }
+ catch (e) {
+ if (e instanceof ParseWrapperCDNIndexError) {
+ throw e;
+ }
+ throw new WrapperNetworkError(e instanceof Error ? e.message : 'Networking error when retrieving runtime component, retry the command.');
+ }
+ };
+ async getNodeRuntimeWrapper() {
+ if (!this.wrapper) {
+ this.wrapper = await this.getFileFromCDN(ScriptType.WRAPPER);
+ }
+ return this.wrapper;
+ }
+ async getNodeRuntimeLoader() {
+ if (!this.loader) {
+ if (await this.statsigService.testForgeCliBundleRuntimeLoaderGate()) {
+ this.loader = await this.getFileFromCDN(ScriptType.LOADER);
+ }
+ }
+ return this.loader;
+ }
+}
+exports.NetworkWrapperProvider = NetworkWrapperProvider;
+const getWrapperProvider = ({ fileSystemReader, statsigService }) => {
+ if (process.env.FORGE_RUNTIME_PATH) {
+ return new LocalWrapperProvider(fileSystemReader, process.env.FORGE_RUNTIME_PATH);
+ }
+ return new NetworkWrapperProvider(statsigService);
+};
+exports.getWrapperProvider = getWrapperProvider;