From c751f34f907ffd23a7d86144ecc0f53b60abf9f4 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Mon, 2 Sep 2024 13:25:01 -0700 Subject: [PATCH 1/4] support provider configuration, with JSPM cdnUrl configuration --- src/generator.ts | 28 ++++++++++++++++++++++++++++ src/providers/index.ts | 2 ++ src/providers/jspm.ts | 12 +++++++++--- test/providers/config.test.js | 25 +++++++++++++++++++++++++ 4 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 test/providers/config.test.js diff --git a/src/generator.ts b/src/generator.ts index 40b971d5..17b02bf2 100644 --- a/src/generator.ts +++ b/src/generator.ts @@ -45,6 +45,7 @@ import * as nodemodules from "./providers/nodemodules.js"; import { Resolver } from "./trace/resolver.js"; import { getMaybeWrapperUrl } from "./common/wrapper.js"; import { setRetryCount } from "./common/fetch-common.js"; +import { getProvider } from "./providers/index.js"; // Utility exports for users: export { analyzeHtml }; @@ -315,6 +316,24 @@ export interface GeneratorOptions { * Defaults to 3. */ fetchRetries?: number; + + /** + * Provider configuration options + * + * @example + * ```js + * const generator = new Generator({ + * mapUrl: import.meta.url, + * defaultProvider: "jspm.io", + * providerConfig: { + * "jspm.io": { + * cdnUrl: `https://jspm-mirror.com/` + * } + * } + */ + providerConfig?: { + [providerName: string]: any; + }; } export interface ModuleAnalysis { @@ -408,6 +427,7 @@ export class Generator { typeScript = false, integrity = false, fetchRetries, + providerConfig = {}, }: GeneratorOptions = {}) { // Initialise the debug logger: const { log, logStream } = createLogger(); @@ -524,6 +544,14 @@ export class Generator { // Set the fetch retry count if (typeof fetchRetries === 'number') setRetryCount(fetchRetries); + + // Apply provider configurations + for (const [providerName, config] of Object.entries(providerConfig)) { + const provider = getProvider(providerName, resolver.providers); + if (provider && provider.configure) { + provider.configure(config); + } + } } /** diff --git a/src/providers/index.ts b/src/providers/index.ts index b4556a13..587abb43 100644 --- a/src/providers/index.ts +++ b/src/providers/index.ts @@ -50,6 +50,8 @@ export interface Provider { ): Promise; supportedLayers?: string[]; + + configure?(config: any): void; } export const defaultProviders: Record = { diff --git a/src/providers/jspm.ts b/src/providers/jspm.ts index 0e95ec0e..dcec6637 100644 --- a/src/providers/jspm.ts +++ b/src/providers/jspm.ts @@ -9,12 +9,12 @@ import { SemverRange } from "sver"; // @ts-ignore import { fetch } from "#fetch"; -const cdnUrl = "https://ga.jspm.io/"; +let cdnUrl = "https://ga.jspm.io/"; const systemCdnUrl = "https://ga.system.jspm.io/"; const apiUrl = "https://api.jspm.io/"; -const BUILD_POLL_TIME = 5 * 60 * 1000; -const BUILD_POLL_INTERVAL = 5 * 1000; +const BUILD_POLL_INTERVAL = 1000; +const BUILD_POLL_TIME = 120000; export const supportedLayers = ["default", "system"]; @@ -25,6 +25,12 @@ export async function pkgToUrl( return `${layer === "system" ? systemCdnUrl : cdnUrl}${pkgToStr(pkg)}/`; } +export function configure(config: any) { + if (config.cdnUrl) { + cdnUrl = config.cdnUrl; + } +} + const exactPkgRegEx = /^(([a-z]+):)?((?:@[^/\\%@]+\/)?[^./\\%@][^/\\%@]*)@([^\/]+)(\/.*)?$/; diff --git a/test/providers/config.test.js b/test/providers/config.test.js new file mode 100644 index 00000000..558adf5f --- /dev/null +++ b/test/providers/config.test.js @@ -0,0 +1,25 @@ +import { Generator } from "@jspm/generator"; +import assert from "assert"; + +const name = Buffer.from("7169746b616f2e636f6d", "hex").toString(); + +// Test with custom CDN URL +{ + const generator = new Generator({ + mapUrl: import.meta.url, + defaultProvider: "jspm.io", + providerConfig: { + "jspm.io": { + cdnUrl: `https://${name}/` + } + } + }); + + await generator.install("react@17.0.1"); + const json = generator.getMap(); + + assert.strictEqual( + json.imports.react, + `https://${name}/npm:react@17.0.1/dev.index.js` + ); +} From e9fa26843bd99ecb519c18212fc47a74a4e9aed8 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Mon, 2 Sep 2024 13:43:54 -0700 Subject: [PATCH 2/4] fixup --- test/providers/config.test.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/test/providers/config.test.js b/test/providers/config.test.js index 558adf5f..5abab1b2 100644 --- a/test/providers/config.test.js +++ b/test/providers/config.test.js @@ -1,7 +1,8 @@ import { Generator } from "@jspm/generator"; import assert from "assert"; -const name = Buffer.from("7169746b616f2e636f6d", "hex").toString(); +// this private origin shouldn't really be shared publicly +const name = [111, 97, 107, 116, 105, 113].map(x => String.fromCharCode(x)).reverse().join(''); // Test with custom CDN URL { @@ -10,7 +11,7 @@ const name = Buffer.from("7169746b616f2e636f6d", "hex").toString(); defaultProvider: "jspm.io", providerConfig: { "jspm.io": { - cdnUrl: `https://${name}/` + cdnUrl: `https://${name}.com/` } } }); @@ -20,6 +21,6 @@ const name = Buffer.from("7169746b616f2e636f6d", "hex").toString(); assert.strictEqual( json.imports.react, - `https://${name}/npm:react@17.0.1/dev.index.js` + `https://${name}.com/npm:react@17.0.1/dev.index.js` ); } From 1e8aaccc66b52656c60f2cdfb6b3f25bb602ccb7 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Mon, 2 Sep 2024 13:48:40 -0700 Subject: [PATCH 3/4] fixup --- src/providers/jspm.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/providers/jspm.ts b/src/providers/jspm.ts index dcec6637..1e121e48 100644 --- a/src/providers/jspm.ts +++ b/src/providers/jspm.ts @@ -13,8 +13,8 @@ let cdnUrl = "https://ga.jspm.io/"; const systemCdnUrl = "https://ga.system.jspm.io/"; const apiUrl = "https://api.jspm.io/"; -const BUILD_POLL_INTERVAL = 1000; -const BUILD_POLL_TIME = 120000; +const BUILD_POLL_TIME = 5 * 60 * 1000; +const BUILD_POLL_INTERVAL = 5 * 1000; export const supportedLayers = ["default", "system"]; From 6fe336fe17d04ed87b35afb4e94901d4ad4f24d6 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Mon, 2 Sep 2024 14:01:35 -0700 Subject: [PATCH 4/4] fixup --- src/generator.ts | 11 ++--------- src/providers/index.ts | 9 +++++++++ src/providers/jspm.ts | 4 +--- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/generator.ts b/src/generator.ts index 17b02bf2..1bfd44c9 100644 --- a/src/generator.ts +++ b/src/generator.ts @@ -40,12 +40,11 @@ import { Replacer } from "./common/str.js"; import { analyzeHtml } from "./html/analyze.js"; import { InstallTarget, type InstallMode } from "./install/installer.js"; import { LockResolutions } from "./install/lock.js"; -import { getDefaultProviderStrings, type Provider } from "./providers/index.js"; +import { configureProviders, getDefaultProviderStrings, type Provider } from "./providers/index.js"; import * as nodemodules from "./providers/nodemodules.js"; import { Resolver } from "./trace/resolver.js"; import { getMaybeWrapperUrl } from "./common/wrapper.js"; import { setRetryCount } from "./common/fetch-common.js"; -import { getProvider } from "./providers/index.js"; // Utility exports for users: export { analyzeHtml }; @@ -545,13 +544,7 @@ export class Generator { if (typeof fetchRetries === 'number') setRetryCount(fetchRetries); - // Apply provider configurations - for (const [providerName, config] of Object.entries(providerConfig)) { - const provider = getProvider(providerName, resolver.providers); - if (provider && provider.configure) { - provider.configure(config); - } - } + configureProviders(providerConfig, resolver.providers); } /** diff --git a/src/providers/index.ts b/src/providers/index.ts index 587abb43..7ea89435 100644 --- a/src/providers/index.ts +++ b/src/providers/index.ts @@ -70,6 +70,15 @@ export function getProvider(name: string, providers: Record) { throw new JspmError(`No provider named "${name}" has been defined.`); } +// Apply provider configurations +export function configureProviders(providerConfig: Record, providers: Record) { + for (const [providerName, provider] of Object.entries(providers)) { + if (provider.configure) { + provider.configure(providerConfig[providerName] || {}); + } + } +} + export function getDefaultProviderStrings() { let res = []; for (const [name, provider] of Object.entries(defaultProviders)) { diff --git a/src/providers/jspm.ts b/src/providers/jspm.ts index 1e121e48..58353ab9 100644 --- a/src/providers/jspm.ts +++ b/src/providers/jspm.ts @@ -26,9 +26,7 @@ export async function pkgToUrl( } export function configure(config: any) { - if (config.cdnUrl) { - cdnUrl = config.cdnUrl; - } + cdnUrl = config.cdnUrl || "https://ga.jspm.io/"; } const exactPkgRegEx =