From 665b8afcbf7eae4f19ae90beb5cdeb97fefecaff Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Wed, 5 Aug 2020 15:37:26 +0300 Subject: [PATCH] feat: add createTokenParser string util --- .../core/src/lib/tests/string-utils.spec.ts | 22 +++++++++++++++++++ .../packages/core/src/lib/utils/index.ts | 3 ++- .../core/src/lib/utils/string-utils.ts | 17 ++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 npm/ng-packs/packages/core/src/lib/tests/string-utils.spec.ts create mode 100644 npm/ng-packs/packages/core/src/lib/utils/string-utils.ts diff --git a/npm/ng-packs/packages/core/src/lib/tests/string-utils.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/string-utils.spec.ts new file mode 100644 index 0000000000..a0642e43ee --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/tests/string-utils.spec.ts @@ -0,0 +1,22 @@ +import { createTokenParser } from '../utils/string-utils'; + +describe('String Utils', () => { + describe('#createTokenParser', () => { + const parseTokens = createTokenParser('{subDomain}.{domain}.{gtld}|{domain}.{gtld}'); + + test.each` + url | subDomain | domain | gtld + ${'www.example.com'} | ${'www'} | ${'example'} | ${'com'} + ${'test.sub.example.com'} | ${'test.sub'} | ${'example'} | ${'com'} + ${'example.com'} | ${undefined} | ${'example'} | ${'com'} + `( + 'should return subDomain as $subDomain, domain as $domain, and gtld as $gtld when url is $url', + ({ url, subDomain, domain, gtld }) => { + const parsed = parseTokens(url); + expect(parsed.subDomain[0]).toBe(subDomain); + expect(parsed.domain[0]).toBe(domain); + expect(parsed.gtld[0]).toBe(gtld); + }, + ); + }); +}); diff --git a/npm/ng-packs/packages/core/src/lib/utils/index.ts b/npm/ng-packs/packages/core/src/lib/utils/index.ts index b31c0320f1..9949fa9f26 100644 --- a/npm/ng-packs/packages/core/src/lib/utils/index.ts +++ b/npm/ng-packs/packages/core/src/lib/utils/index.ts @@ -6,8 +6,9 @@ export * from './generator-utils'; export * from './initial-utils'; export * from './lazy-load-utils'; export * from './localization-utils'; +export * from './multi-tenancy-utils'; export * from './number-utils'; export * from './route-utils'; export * from './rxjs-utils'; -export * from './multi-tenancy-utils'; +export * from './string-utils'; export * from './tree-utils'; diff --git a/npm/ng-packs/packages/core/src/lib/utils/string-utils.ts b/npm/ng-packs/packages/core/src/lib/utils/string-utils.ts new file mode 100644 index 0000000000..00db697325 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/utils/string-utils.ts @@ -0,0 +1,17 @@ +export function createTokenParser(format: string) { + return (string: string) => { + const tokens: string[] = []; + const regex = format.replace(/\./g, '\\.').replace(/\{\s?([0-9a-zA-Z]+)\s?\}/g, (_, token) => { + tokens.push(token); + return '(.+)'; + }); + + const matches = (string.match(regex) || []).slice(1); + + return matches.reduce((acc, v, i) => { + const key = tokens[i]; + acc[key] = [...(acc[key] || []), v].filter(Boolean); + return acc; + }, {} as Record); + }; +}