Skip to content
This repository was archived by the owner on May 17, 2025. It is now read-only.

Commit 7e75053

Browse files
authored
Support provider configuration, with JSPM cdnUrl configuration (#377)
1 parent 85b4f54 commit 7e75053

File tree

4 files changed

+64
-2
lines changed

4 files changed

+64
-2
lines changed

src/generator.ts

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import { Replacer } from "./common/str.js";
4040
import { analyzeHtml } from "./html/analyze.js";
4141
import { InstallTarget, type InstallMode } from "./install/installer.js";
4242
import { LockResolutions } from "./install/lock.js";
43-
import { getDefaultProviderStrings, type Provider } from "./providers/index.js";
43+
import { configureProviders, getDefaultProviderStrings, type Provider } from "./providers/index.js";
4444
import * as nodemodules from "./providers/nodemodules.js";
4545
import { Resolver } from "./trace/resolver.js";
4646
import { getMaybeWrapperUrl } from "./common/wrapper.js";
@@ -315,6 +315,24 @@ export interface GeneratorOptions {
315315
* Defaults to 3.
316316
*/
317317
fetchRetries?: number;
318+
319+
/**
320+
* Provider configuration options
321+
*
322+
* @example
323+
* ```js
324+
* const generator = new Generator({
325+
* mapUrl: import.meta.url,
326+
* defaultProvider: "jspm.io",
327+
* providerConfig: {
328+
* "jspm.io": {
329+
* cdnUrl: `https://jspm-mirror.com/`
330+
* }
331+
* }
332+
*/
333+
providerConfig?: {
334+
[providerName: string]: any;
335+
};
318336
}
319337

320338
export interface ModuleAnalysis {
@@ -408,6 +426,7 @@ export class Generator {
408426
typeScript = false,
409427
integrity = false,
410428
fetchRetries,
429+
providerConfig = {},
411430
}: GeneratorOptions = {}) {
412431
// Initialise the debug logger:
413432
const { log, logStream } = createLogger();
@@ -524,6 +543,8 @@ export class Generator {
524543
// Set the fetch retry count
525544
if (typeof fetchRetries === 'number')
526545
setRetryCount(fetchRetries);
546+
547+
configureProviders(providerConfig, resolver.providers);
527548
}
528549

529550
/**

src/providers/index.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ export interface Provider {
5050
): Promise<PackageConfig | null>;
5151

5252
supportedLayers?: string[];
53+
54+
configure?(config: any): void;
5355
}
5456

5557
export const defaultProviders: Record<string, Provider> = {
@@ -68,6 +70,15 @@ export function getProvider(name: string, providers: Record<string, Provider>) {
6870
throw new JspmError(`No provider named "${name}" has been defined.`);
6971
}
7072

73+
// Apply provider configurations
74+
export function configureProviders(providerConfig: Record<string, any>, providers: Record<string, Provider>) {
75+
for (const [providerName, provider] of Object.entries(providers)) {
76+
if (provider.configure) {
77+
provider.configure(providerConfig[providerName] || {});
78+
}
79+
}
80+
}
81+
7182
export function getDefaultProviderStrings() {
7283
let res = [];
7384
for (const [name, provider] of Object.entries(defaultProviders)) {

src/providers/jspm.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { SemverRange } from "sver";
99
// @ts-ignore
1010
import { fetch } from "#fetch";
1111

12-
const cdnUrl = "https://ga.jspm.io/";
12+
let cdnUrl = "https://ga.jspm.io/";
1313
const systemCdnUrl = "https://ga.system.jspm.io/";
1414
const apiUrl = "https://api.jspm.io/";
1515

@@ -25,6 +25,10 @@ export async function pkgToUrl(
2525
return `${layer === "system" ? systemCdnUrl : cdnUrl}${pkgToStr(pkg)}/`;
2626
}
2727

28+
export function configure(config: any) {
29+
cdnUrl = config.cdnUrl || "https://ga.jspm.io/";
30+
}
31+
2832
const exactPkgRegEx =
2933
/^(([a-z]+):)?((?:@[^/\\%@]+\/)?[^./\\%@][^/\\%@]*)@([^\/]+)(\/.*)?$/;
3034

test/providers/config.test.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { Generator } from "@jspm/generator";
2+
import assert from "assert";
3+
4+
// this private origin shouldn't really be shared publicly
5+
const name = [111, 97, 107, 116, 105, 113].map(x => String.fromCharCode(x)).reverse().join('');
6+
7+
// Test with custom CDN URL
8+
{
9+
const generator = new Generator({
10+
mapUrl: import.meta.url,
11+
defaultProvider: "jspm.io",
12+
providerConfig: {
13+
"jspm.io": {
14+
cdnUrl: `https://${name}.com/`
15+
}
16+
}
17+
});
18+
19+
await generator.install("react@17.0.1");
20+
const json = generator.getMap();
21+
22+
assert.strictEqual(
23+
json.imports.react,
24+
`https://${name}.com/npm:react@17.0.1/dev.index.js`
25+
);
26+
}

0 commit comments

Comments
 (0)