Skip to content

Commit

Permalink
Merge pull request #53 from takker99/scope
Browse files Browse the repository at this point in the history
Support URLs such as https://domain/@scope/package
  • Loading branch information
hayd authored Jan 20, 2022
2 parents 23b6f4f + 9aeb4e9 commit 7d917a0
Show file tree
Hide file tree
Showing 2 changed files with 186 additions and 0 deletions.
150 changes: 150 additions & 0 deletions registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,66 @@ async function unpkgVersions(name: string): Promise<string[]> {
return m.map((x) => x[1]);
}

interface PackageInfo {
parts: string[];
scope: string;
packageName: string;
version: string;
}
function defaultInfo(that: RegistryUrl): PackageInfo {
const parts = that.url.split("/");
const [packageName, version] = parts[4].split("@");
if (parts[3] === undefined) {
throw new Error(`Package scope not found in ${that.url}`);
}
if (packageName === undefined) {
throw new Error(`Package name not found in ${that.url}`);
}
if (version === undefined) {
throw new Error(`Unable to find version in ${that.url}`);
}
return {
scope: parts[3],
packageName,
version,
parts,
};
}

function defaultScopeAt(that: RegistryUrl, version: string): string {
const { parts, packageName } = defaultInfo(that);
parts[4] = `${packageName}@${version}`;
return parts.join("/");
}

export class UnpkgScope implements RegistryUrl {
url: string;

parts(): PackageInfo {
return defaultInfo(this);
}

constructor(url: string) {
this.url = url;
}

async all(): Promise<string[]> {
const { scope, packageName } = this.parts();
return await unpkgVersions(`${scope}/${packageName}`);
}

at(version: string): RegistryUrl {
const url = defaultScopeAt(this, version);
return new UnpkgScope(url);
}

version(): string {
return this.parts().version;
}

regexp = /https?:\/\/unpkg\.com\/@[^\/\"\']*?\/[^\/\"\']*?\@[^\'\"]*/;
}

export class Unpkg implements RegistryUrl {
url: string;

Expand Down Expand Up @@ -239,6 +299,35 @@ export class Denopkg implements RegistryUrl {
regexp = /https?:\/\/denopkg.com\/[^\/\"\']*?\/[^\/\"\']*?\@[^\'\"]*/;
}

export class PikaScope implements RegistryUrl {
url: string;

parts(): PackageInfo {
return defaultInfo(this);
}

constructor(url: string) {
this.url = url;
}

async all(): Promise<string[]> {
const { scope, packageName } = this.parts();
return await unpkgVersions(`${scope}/${packageName}`);
}

at(version: string): RegistryUrl {
const url = defaultScopeAt(this, version);
return new PikaScope(url);
}

version(): string {
return this.parts().version;
}

regexp =
/https?:\/\/cdn\.pika\.dev(\/\_)?\/@[^\/\"\']*?\/[^\/\"\']*?\@[^\'\"]*/;
}

export class Pika implements RegistryUrl {
url: string;

Expand Down Expand Up @@ -266,6 +355,35 @@ export class Pika implements RegistryUrl {
regexp = /https?:\/\/cdn.pika.dev(\/\_)?\/[^\/\"\']*?\@[^\'\"]*/;
}

export class SkypackScope implements RegistryUrl {
url: string;

parts(): PackageInfo {
return defaultInfo(this);
}

constructor(url: string) {
this.url = url;
}

async all(): Promise<string[]> {
const { scope, packageName } = this.parts();
return await unpkgVersions(`${scope}/${packageName}`);
}

at(version: string): RegistryUrl {
const url = defaultScopeAt(this, version);
return new SkypackScope(url);
}

version(): string {
return this.parts().version;
}

regexp =
/https?:\/\/cdn\.skypack\.dev(\/\_)?\/@[^\/\"\']*?\/[^\/\"\']*?\@[^\'\"]*/;
}

export class Skypack implements RegistryUrl {
url: string;

Expand Down Expand Up @@ -293,6 +411,34 @@ export class Skypack implements RegistryUrl {
regexp = /https?:\/\/cdn.skypack.dev(\/\_)?\/[^\/\"\']*?\@[^\'\"]*/;
}

export class EsmShScope implements RegistryUrl {
url: string;

parts(): PackageInfo {
return defaultInfo(this);
}

constructor(url: string) {
this.url = url;
}

async all(): Promise<string[]> {
const { scope, packageName } = this.parts();
return await unpkgVersions(`${scope}/${packageName}`);
}

at(version: string): RegistryUrl {
const url = defaultScopeAt(this, version);
return new EsmShScope(url);
}

version(): string {
return this.parts().version;
}

regexp = /https?:\/\/esm\.sh\/@[^\/\"\']*?\/[^\/\"\']*?\@[^\'\"]*/;
}

export class EsmSh implements RegistryUrl {
url: string;

Expand Down Expand Up @@ -518,11 +664,15 @@ export class NestLand implements RegistryUrl {

export const REGISTRIES = [
DenoLand,
UnpkgScope,
Unpkg,
Denopkg,
Jspm,
PikaScope,
Pika,
SkypackScope,
Skypack,
EsmShScope,
EsmSh,
GithubRaw,
GitlabRaw,
Expand Down
36 changes: 36 additions & 0 deletions registry_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,15 @@ Deno.test("registryDenolandX", () => {
assertEquals(vAt.url, "https://deno.land/x/foo@0.2.0/foo.ts");
});

Deno.test("registryUnpkgScope", () => {
const url = "https://unpkg.com/@bar/foo@0.1.0/foo.ts";
const v = lookup(url, REGISTRIES);
assert(v !== undefined);

const vAt = v.at("0.2.0");
assertEquals(vAt.url, "https://unpkg.com/@bar/foo@0.2.0/foo.ts");
});

Deno.test("registryUnpkg", () => {
const url = "https://unpkg.com/foo@0.1.0/foo.ts";
const v = lookup(url, REGISTRIES);
Expand Down Expand Up @@ -60,6 +69,15 @@ Deno.test("registryJspm", () => {
assertEquals(vAt.url, "https://dev.jspm.io/npm:foo@0.2.0/");
});

Deno.test("registryPikaScope", () => {
const url = "https://cdn.pika.dev/@bar/foo@0.1.0/";
const v = lookup(url, REGISTRIES);
assert(v !== undefined);

const vAt = v.at("0.2.0");
assertEquals(vAt.url, "https://cdn.pika.dev/@bar/foo@0.2.0/");
});

Deno.test("registryPika", () => {
const url = "https://cdn.pika.dev/foo@0.1.0/";
const v = lookup(url, REGISTRIES);
Expand All @@ -69,6 +87,15 @@ Deno.test("registryPika", () => {
assertEquals(vAt.url, "https://cdn.pika.dev/foo@0.2.0/");
});

Deno.test("registrySkypackScope", () => {
const url = "https://cdn.skypack.dev/@bar/foo@0.1.0/";
const v = lookup(url, REGISTRIES);
assert(v !== undefined);

const vAt = v.at("0.2.0");
assertEquals(vAt.url, "https://cdn.skypack.dev/@bar/foo@0.2.0/");
});

Deno.test("registrySkypack", () => {
const url = "https://cdn.skypack.dev/foo@0.1.0/";
const v = lookup(url, REGISTRIES);
Expand All @@ -78,6 +105,15 @@ Deno.test("registrySkypack", () => {
assertEquals(vAt.url, "https://cdn.skypack.dev/foo@0.2.0/");
});

Deno.test("registryEsmShScope", () => {
const url = "https://esm.sh/@bar/foo@0.1.0/";
const v = lookup(url, REGISTRIES);
assert(v !== undefined);

const vAt = v.at("0.2.0");
assertEquals(vAt.url, "https://esm.sh/@bar/foo@0.2.0/");
});

Deno.test("registryEsmSh", () => {
const url = "https://esm.sh/foo@0.1.0/";
const v = lookup(url, REGISTRIES);
Expand Down

0 comments on commit 7d917a0

Please sign in to comment.