From 6e2a4b5c2b7957cc7497115b975ac257822fa583 Mon Sep 17 00:00:00 2001 From: Joachim Van Herwegen Date: Fri, 12 Feb 2021 12:52:47 +0100 Subject: [PATCH] feat: Create SubdomainIdentifierGenerator To be used when creating pods. --- src/index.ts | 1 + src/pods/generate/IdentifierGenerator.ts | 4 ++-- .../generate/SubdomainIdentifierGenerator.ts | 21 +++++++++++++++++++ .../generate/SuffixIdentifierGenerator.ts | 8 +++---- .../SubdomainIdentifierGenerator.test.ts | 14 +++++++++++++ 5 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 src/pods/generate/SubdomainIdentifierGenerator.ts create mode 100644 test/unit/pods/generate/SubdomainIdentifierGenerator.test.ts diff --git a/src/index.ts b/src/index.ts index 6b6f5de45..a33c6f0ac 100644 --- a/src/index.ts +++ b/src/index.ts @@ -117,6 +117,7 @@ export * from './pods/agent/AgentParser'; export * from './pods/generate/HandlebarsTemplateEngine'; export * from './pods/generate/IdentifierGenerator'; export * from './pods/generate/ResourcesGenerator'; +export * from './pods/generate/SubdomainIdentifierGenerator'; export * from './pods/generate/SuffixIdentifierGenerator'; export * from './pods/generate/TemplateEngine'; export * from './pods/generate/TemplatedResourcesGenerator'; diff --git a/src/pods/generate/IdentifierGenerator.ts b/src/pods/generate/IdentifierGenerator.ts index ea0a860e6..6b8804dba 100644 --- a/src/pods/generate/IdentifierGenerator.ts +++ b/src/pods/generate/IdentifierGenerator.ts @@ -5,8 +5,8 @@ import type { ResourceIdentifier } from '../../ldp/representation/ResourceIdenti */ export interface IdentifierGenerator { /** - * Generates container identifiers based on an input slug. + * Generates container identifiers based on an input name. * This is simply string generation, no resource-related checks are run. */ - generate: (slug: string) => ResourceIdentifier; + generate: (name: string) => ResourceIdentifier; } diff --git a/src/pods/generate/SubdomainIdentifierGenerator.ts b/src/pods/generate/SubdomainIdentifierGenerator.ts new file mode 100644 index 000000000..545ade072 --- /dev/null +++ b/src/pods/generate/SubdomainIdentifierGenerator.ts @@ -0,0 +1,21 @@ +import type { ResourceIdentifier } from '../../ldp/representation/ResourceIdentifier'; +import { ensureTrailingSlash, extractScheme } from '../../util/PathUtil'; +import type { IdentifierGenerator } from './IdentifierGenerator'; + +/** + * Generates identifiers by using the name as a subdomain on the base URL. + * Non-alphanumeric characters will be replaced with `-`. + */ +export class SubdomainIdentifierGenerator implements IdentifierGenerator { + private readonly baseParts: { scheme: string; rest: string }; + + public constructor(baseUrl: string) { + this.baseParts = extractScheme(ensureTrailingSlash(baseUrl)); + } + + public generate(name: string): ResourceIdentifier { + // Using the punycode converter is a risk as it doesn't convert slashes for example + const cleanName = name.replace(/\W/gu, '-'); + return { path: `${this.baseParts.scheme}${cleanName}.${this.baseParts.rest}` }; + } +} diff --git a/src/pods/generate/SuffixIdentifierGenerator.ts b/src/pods/generate/SuffixIdentifierGenerator.ts index 0af56d978..7c0b63d79 100644 --- a/src/pods/generate/SuffixIdentifierGenerator.ts +++ b/src/pods/generate/SuffixIdentifierGenerator.ts @@ -3,7 +3,7 @@ import { ensureTrailingSlash } from '../../util/PathUtil'; import type { IdentifierGenerator } from './IdentifierGenerator'; /** - * Generates identifiers by appending the slug to a stored base identifier. + * Generates identifiers by appending the name to a stored base identifier. * Non-alphanumeric characters will be replaced with `-`. */ export class SuffixIdentifierGenerator implements IdentifierGenerator { @@ -13,8 +13,8 @@ export class SuffixIdentifierGenerator implements IdentifierGenerator { this.base = base; } - public generate(slug: string): ResourceIdentifier { - const cleanSlug = slug.replace(/\W/gu, '-'); - return { path: ensureTrailingSlash(new URL(cleanSlug, this.base).href) }; + public generate(name: string): ResourceIdentifier { + const cleanName = name.replace(/\W/gu, '-'); + return { path: ensureTrailingSlash(new URL(cleanName, this.base).href) }; } } diff --git a/test/unit/pods/generate/SubdomainIdentifierGenerator.test.ts b/test/unit/pods/generate/SubdomainIdentifierGenerator.test.ts new file mode 100644 index 000000000..fc16a309c --- /dev/null +++ b/test/unit/pods/generate/SubdomainIdentifierGenerator.test.ts @@ -0,0 +1,14 @@ +import { SubdomainIdentifierGenerator } from '../../../../src/pods/generate/SubdomainIdentifierGenerator'; + +describe('A SubdomainIdentifierGenerator', (): void => { + const base = 'http://test.com/'; + const generator = new SubdomainIdentifierGenerator(base); + + it('generates identifiers by using the slug as subdomain.', async(): Promise => { + expect(generator.generate('slug')).toEqual({ path: 'http://slug.test.com/' }); + }); + + it('converts slugs using punycode.', async(): Promise => { + expect(generator.generate('sàl/u㋡g')).toEqual({ path: 'http://s-l-u-g.test.com/' }); + }); +});