tldraw
Version:
A tiny little drawing editor.
8 lines (7 loc) • 4.04 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../../../src/lib/utils/embeds/embeds.ts"],
"sourcesContent": ["import { safeParseUrl } from '@tldraw/editor'\nimport { TLEmbedDefinition } from '../../defaultEmbedDefinitions'\n\n// https://github.com/sindresorhus/escape-string-regexp/blob/main/index.js\nfunction escapeStringRegexp(string: string) {\n\tif (typeof string !== 'string') {\n\t\tthrow new TypeError('Expected a string')\n\t}\n\n\t// Escape characters with special meaning either inside or outside character sets.\n\t// Use a simple backslash escape when it\u2019s always valid, and a `\\xnn` escape when the simpler form would be disallowed by Unicode patterns\u2019 stricter grammar.\n\treturn string.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&').replace(/-/g, '\\\\x2d')\n}\n\n/** @public */\nexport function matchEmbedUrl(definitions: readonly TLEmbedDefinition[], url: string) {\n\tconst parsed = safeParseUrl(url)\n\tif (!parsed) return\n\tconst host = parsed.host.replace('www.', '')\n\tfor (const localEmbedDef of definitions) {\n\t\tif (checkHostnames(localEmbedDef.hostnames, host)) {\n\t\t\tconst originalUrl = localEmbedDef.fromEmbedUrl(url)\n\t\t\tif (originalUrl) {\n\t\t\t\treturn {\n\t\t\t\t\tdefinition: localEmbedDef,\n\t\t\t\t\turl: originalUrl,\n\t\t\t\t\tembedUrl: url,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nconst globlikeRegExp = (input: string) => {\n\treturn input\n\t\t.split('*')\n\t\t.map((str) => escapeStringRegexp(str))\n\t\t.join('.+')\n}\n\nconst checkHostnames = (hostnames: readonly string[], targetHostname: string) => {\n\treturn !!hostnames.find((hostname) => {\n\t\tconst re = new RegExp(globlikeRegExp(hostname))\n\t\treturn targetHostname.match(re)\n\t})\n}\n\n/** @public */\nexport function matchUrl(definitions: readonly TLEmbedDefinition[], url: string) {\n\tconst parsed = safeParseUrl(url)\n\tif (!parsed) return\n\tconst host = parsed.host.replace('www.', '')\n\tfor (const localEmbedDef of definitions) {\n\t\tif (checkHostnames(localEmbedDef.hostnames, host)) {\n\t\t\tconst embedUrl = localEmbedDef.toEmbedUrl(url)\n\n\t\t\tif (embedUrl) {\n\t\t\t\treturn {\n\t\t\t\t\tdefinition: localEmbedDef,\n\t\t\t\t\tembedUrl,\n\t\t\t\t\turl,\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n/** @public */\nexport type TLEmbedResult =\n\t| {\n\t\t\tdefinition: TLEmbedDefinition\n\t\t\turl: string\n\t\t\tembedUrl: string\n\t }\n\t| undefined\n\n/**\n * Tests whether an URL supports embedding and returns the result. If we encounter an error, we\n * return undefined.\n *\n * @param inputUrl - The URL to match\n * @public\n */\nexport function getEmbedInfo(\n\tdefinitions: readonly TLEmbedDefinition[],\n\tinputUrl: string\n): TLEmbedResult {\n\ttry {\n\t\treturn matchUrl(definitions, inputUrl) ?? matchEmbedUrl(definitions, inputUrl)\n\t} catch {\n\t\treturn undefined\n\t}\n}\n"],
"mappings": "AAAA,SAAS,oBAAoB;AAI7B,SAAS,mBAAmB,QAAgB;AAC3C,MAAI,OAAO,WAAW,UAAU;AAC/B,UAAM,IAAI,UAAU,mBAAmB;AAAA,EACxC;AAIA,SAAO,OAAO,QAAQ,uBAAuB,MAAM,EAAE,QAAQ,MAAM,OAAO;AAC3E;AAGO,SAAS,cAAc,aAA2C,KAAa;AACrF,QAAM,SAAS,aAAa,GAAG;AAC/B,MAAI,CAAC,OAAQ;AACb,QAAM,OAAO,OAAO,KAAK,QAAQ,QAAQ,EAAE;AAC3C,aAAW,iBAAiB,aAAa;AACxC,QAAI,eAAe,cAAc,WAAW,IAAI,GAAG;AAClD,YAAM,cAAc,cAAc,aAAa,GAAG;AAClD,UAAI,aAAa;AAChB,eAAO;AAAA,UACN,YAAY;AAAA,UACZ,KAAK;AAAA,UACL,UAAU;AAAA,QACX;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACD;AAEA,MAAM,iBAAiB,CAAC,UAAkB;AACzC,SAAO,MACL,MAAM,GAAG,EACT,IAAI,CAAC,QAAQ,mBAAmB,GAAG,CAAC,EACpC,KAAK,IAAI;AACZ;AAEA,MAAM,iBAAiB,CAAC,WAA8B,mBAA2B;AAChF,SAAO,CAAC,CAAC,UAAU,KAAK,CAAC,aAAa;AACrC,UAAM,KAAK,IAAI,OAAO,eAAe,QAAQ,CAAC;AAC9C,WAAO,eAAe,MAAM,EAAE;AAAA,EAC/B,CAAC;AACF;AAGO,SAAS,SAAS,aAA2C,KAAa;AAChF,QAAM,SAAS,aAAa,GAAG;AAC/B,MAAI,CAAC,OAAQ;AACb,QAAM,OAAO,OAAO,KAAK,QAAQ,QAAQ,EAAE;AAC3C,aAAW,iBAAiB,aAAa;AACxC,QAAI,eAAe,cAAc,WAAW,IAAI,GAAG;AAClD,YAAM,WAAW,cAAc,WAAW,GAAG;AAE7C,UAAI,UAAU;AACb,eAAO;AAAA,UACN,YAAY;AAAA,UACZ;AAAA,UACA;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACD;AAkBO,SAAS,aACf,aACA,UACgB;AAChB,MAAI;AACH,WAAO,SAAS,aAAa,QAAQ,KAAK,cAAc,aAAa,QAAQ;AAAA,EAC9E,QAAQ;AACP,WAAO;AAAA,EACR;AACD;",
"names": []
}