@readme/data-urls
Advanced tools
| //#region src/index.d.ts | ||
| /** | ||
| * Determine if a given data URL is valid or not. | ||
| * | ||
| * @see {@link https://developer.mozilla.org/en-US/docs/data_URIs} | ||
| * @see {@link http://tools.ietf.org/html/rfc2397} | ||
| * @see {@link http://tools.ietf.org/html/rfc2396#section2} | ||
| */ | ||
| declare function validate(str: string): boolean; | ||
| interface DataURL { | ||
| [k: string]: any; | ||
| base64: boolean; | ||
| contentType?: string; | ||
| data: string; | ||
| mediaType?: string; | ||
| name?: string; | ||
| toBuffer: () => Buffer; | ||
| } | ||
| /** | ||
| * Parse a given data URL into its individual parts. | ||
| * | ||
| */ | ||
| declare function parse(str: string): false | DataURL; | ||
| //#endregion | ||
| export { DataURL, parse, validate }; | ||
| //# sourceMappingURL=index.d.mts.map |
| //#region src/index.ts | ||
| const DATA_URL_REGEX = /^data:([a-z]+\/[a-z0-9-+.]+(;[a-z0-9-.!#$%*+.{}|~`]+=[a-z0-9-.!#$%*+.{}()_|~`]+)*)?(;base64)?,([a-z0-9!$&',()*+;=\-._~:@/?%\s<>]*?)$/i; | ||
| /** | ||
| * Determine if a given data URL is valid or not. | ||
| * | ||
| * @see {@link https://developer.mozilla.org/en-US/docs/data_URIs} | ||
| * @see {@link http://tools.ietf.org/html/rfc2397} | ||
| * @see {@link http://tools.ietf.org/html/rfc2396#section2} | ||
| */ | ||
| function validate(str) { | ||
| return DATA_URL_REGEX.test((str || "").trim()); | ||
| } | ||
| /** | ||
| * Parse a given data URL into its individual parts. | ||
| * | ||
| */ | ||
| function parse(str) { | ||
| if (!validate(str)) return false; | ||
| const parts = str.trim().match(DATA_URL_REGEX); | ||
| const parsed = {}; | ||
| if (parts[1]) { | ||
| parsed.mediaType = parts[1].toLowerCase(); | ||
| const mediaTypeParts = parts[1].split(";").map((x) => { | ||
| if (x.startsWith("name=")) return x; | ||
| return x.toLowerCase(); | ||
| }); | ||
| parsed.contentType = mediaTypeParts[0]; | ||
| mediaTypeParts.slice(1).forEach((attribute) => { | ||
| const p = attribute.split("="); | ||
| parsed[p[0]] = p[1]; | ||
| }); | ||
| } | ||
| parsed.base64 = !!parts[parts.length - 2]; | ||
| parsed.data = parts[parts.length - 1] || ""; | ||
| parsed.toBuffer = () => { | ||
| const encoding = parsed.base64 ? "base64" : "utf8"; | ||
| return Buffer.from(parsed.data, encoding); | ||
| }; | ||
| return parsed; | ||
| } | ||
| //#endregion | ||
| export { parse, validate }; | ||
| //# sourceMappingURL=index.mjs.map |
| {"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["const DATA_URL_REGEX =\n /^data:([a-z]+\\/[a-z0-9-+.]+(;[a-z0-9-.!#$%*+.{}|~`]+=[a-z0-9-.!#$%*+.{}()_|~`]+)*)?(;base64)?,([a-z0-9!$&',()*+;=\\-._~:@/?%\\s<>]*?)$/i;\n\n/**\n * Determine if a given data URL is valid or not.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/data_URIs}\n * @see {@link http://tools.ietf.org/html/rfc2397}\n * @see {@link http://tools.ietf.org/html/rfc2396#section2}\n */\nfunction validate(str: string) {\n return DATA_URL_REGEX.test((str || '').trim());\n}\n\nexport interface DataURL {\n // biome-ignore lint/suspicious/noExplicitAny: `additionalProperties: true`\n [k: string]: any;\n base64: boolean;\n contentType?: string;\n data: string;\n mediaType?: string;\n name?: string;\n toBuffer: () => Buffer;\n}\n\n/**\n * Parse a given data URL into its individual parts.\n *\n */\nfunction parse(str: string) {\n if (!validate(str)) {\n return false;\n }\n\n const parts = str.trim().match(DATA_URL_REGEX);\n const parsed = {} as DataURL;\n\n if (parts[1]) {\n parsed.mediaType = parts[1].toLowerCase();\n\n const mediaTypeParts = parts[1].split(';').map(x => {\n // `name` attributes are for filenames so we shouldn't lowercase them as some filesystems are\n // case-sensitive.\n if (x.startsWith('name=')) {\n return x;\n }\n\n return x.toLowerCase();\n });\n\n parsed.contentType = mediaTypeParts[0];\n\n mediaTypeParts.slice(1).forEach(attribute => {\n const p = attribute.split('=');\n parsed[p[0]] = p[1];\n });\n }\n\n parsed.base64 = !!parts[parts.length - 2];\n parsed.data = parts[parts.length - 1] || '';\n\n parsed.toBuffer = () => {\n const encoding = parsed.base64 ? 'base64' : 'utf8';\n\n return Buffer.from(parsed.data, encoding);\n };\n\n return parsed;\n}\n\nexport { parse, validate };\n"],"mappings":";AAAA,MAAM,iBACJ;;;;;;;;AASF,SAAS,SAAS,KAAa;AAC7B,QAAO,eAAe,MAAM,OAAO,IAAI,MAAM,CAAC;;;;;;AAkBhD,SAAS,MAAM,KAAa;AAC1B,KAAI,CAAC,SAAS,IAAI,CAChB,QAAO;CAGT,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,eAAe;CAC9C,MAAM,SAAS,EAAE;AAEjB,KAAI,MAAM,IAAI;AACZ,SAAO,YAAY,MAAM,GAAG,aAAa;EAEzC,MAAM,iBAAiB,MAAM,GAAG,MAAM,IAAI,CAAC,KAAI,MAAK;AAGlD,OAAI,EAAE,WAAW,QAAQ,CACvB,QAAO;AAGT,UAAO,EAAE,aAAa;IACtB;AAEF,SAAO,cAAc,eAAe;AAEpC,iBAAe,MAAM,EAAE,CAAC,SAAQ,cAAa;GAC3C,MAAM,IAAI,UAAU,MAAM,IAAI;AAC9B,UAAO,EAAE,MAAM,EAAE;IACjB;;AAGJ,QAAO,SAAS,CAAC,CAAC,MAAM,MAAM,SAAS;AACvC,QAAO,OAAO,MAAM,MAAM,SAAS,MAAM;AAEzC,QAAO,iBAAiB;EACtB,MAAM,WAAW,OAAO,SAAS,WAAW;AAE5C,SAAO,OAAO,KAAK,OAAO,MAAM,SAAS;;AAG3C,QAAO"} |
+38
-31
@@ -1,40 +0,47 @@ | ||
| 'use strict'; | ||
| Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); | ||
| // src/index.ts | ||
| var DATA_URL_REGEX = /^data:([a-z]+\/[a-z0-9-+.]+(;[a-z0-9-.!#$%*+.{}|~`]+=[a-z0-9-.!#$%*+.{}()_|~`]+)*)?(;base64)?,([a-z0-9!$&',()*+;=\-._~:@/?%\s<>]*?)$/i; | ||
| //#region src/index.ts | ||
| const DATA_URL_REGEX = /^data:([a-z]+\/[a-z0-9-+.]+(;[a-z0-9-.!#$%*+.{}|~`]+=[a-z0-9-.!#$%*+.{}()_|~`]+)*)?(;base64)?,([a-z0-9!$&',()*+;=\-._~:@/?%\s<>]*?)$/i; | ||
| /** | ||
| * Determine if a given data URL is valid or not. | ||
| * | ||
| * @see {@link https://developer.mozilla.org/en-US/docs/data_URIs} | ||
| * @see {@link http://tools.ietf.org/html/rfc2397} | ||
| * @see {@link http://tools.ietf.org/html/rfc2396#section2} | ||
| */ | ||
| function validate(str) { | ||
| return DATA_URL_REGEX.test((str || "").trim()); | ||
| return DATA_URL_REGEX.test((str || "").trim()); | ||
| } | ||
| /** | ||
| * Parse a given data URL into its individual parts. | ||
| * | ||
| */ | ||
| function parse(str) { | ||
| if (!validate(str)) { | ||
| return false; | ||
| } | ||
| const parts = str.trim().match(DATA_URL_REGEX); | ||
| const parsed = {}; | ||
| if (parts[1]) { | ||
| parsed.mediaType = parts[1].toLowerCase(); | ||
| const mediaTypeParts = parts[1].split(";").map((x) => { | ||
| if (x.startsWith("name=")) { | ||
| return x; | ||
| } | ||
| return x.toLowerCase(); | ||
| }); | ||
| parsed.contentType = mediaTypeParts[0]; | ||
| mediaTypeParts.slice(1).forEach((attribute) => { | ||
| const p = attribute.split("="); | ||
| parsed[p[0]] = p[1]; | ||
| }); | ||
| } | ||
| parsed.base64 = !!parts[parts.length - 2]; | ||
| parsed.data = parts[parts.length - 1] || ""; | ||
| parsed.toBuffer = () => { | ||
| const encoding = parsed.base64 ? "base64" : "utf8"; | ||
| return Buffer.from(parsed.data, encoding); | ||
| }; | ||
| return parsed; | ||
| if (!validate(str)) return false; | ||
| const parts = str.trim().match(DATA_URL_REGEX); | ||
| const parsed = {}; | ||
| if (parts[1]) { | ||
| parsed.mediaType = parts[1].toLowerCase(); | ||
| const mediaTypeParts = parts[1].split(";").map((x) => { | ||
| if (x.startsWith("name=")) return x; | ||
| return x.toLowerCase(); | ||
| }); | ||
| parsed.contentType = mediaTypeParts[0]; | ||
| mediaTypeParts.slice(1).forEach((attribute) => { | ||
| const p = attribute.split("="); | ||
| parsed[p[0]] = p[1]; | ||
| }); | ||
| } | ||
| parsed.base64 = !!parts[parts.length - 2]; | ||
| parsed.data = parts[parts.length - 1] || ""; | ||
| parsed.toBuffer = () => { | ||
| const encoding = parsed.base64 ? "base64" : "utf8"; | ||
| return Buffer.from(parsed.data, encoding); | ||
| }; | ||
| return parsed; | ||
| } | ||
| //#endregion | ||
| exports.parse = parse; | ||
| exports.validate = validate; | ||
| //# sourceMappingURL=index.cjs.map | ||
| //# sourceMappingURL=index.cjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,IAAM,cAAA,GACJ,uIAAA;AASF,SAAS,SAAS,GAAA,EAAa;AAC7B,EAAA,OAAO,cAAA,CAAe,IAAA,CAAA,CAAM,GAAA,IAAO,EAAA,EAAI,MAAM,CAAA;AAC/C;AAiBA,SAAS,MAAM,GAAA,EAAa;AAC1B,EAAA,IAAI,CAAC,QAAA,CAAS,GAAG,CAAA,EAAG;AAClB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,IAAA,EAAK,CAAE,MAAM,cAAc,CAAA;AAC7C,EAAA,MAAM,SAAS,EAAC;AAEhB,EAAA,IAAI,KAAA,CAAM,CAAC,CAAA,EAAG;AACZ,IAAA,MAAA,CAAO,SAAA,GAAY,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,EAAY;AAExC,IAAA,MAAM,cAAA,GAAiB,MAAM,CAAC,CAAA,CAAE,MAAM,GAAG,CAAA,CAAE,IAAI,CAAA,CAAA,KAAK;AAGlD,MAAA,IAAI,CAAA,CAAE,UAAA,CAAW,OAAO,CAAA,EAAG;AACzB,QAAA,OAAO,CAAA;AAAA,MACT;AAEA,MAAA,OAAO,EAAE,WAAA,EAAY;AAAA,IACvB,CAAC,CAAA;AAED,IAAA,MAAA,CAAO,WAAA,GAAc,eAAe,CAAC,CAAA;AAErC,IAAA,cAAA,CAAe,KAAA,CAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,CAAA,SAAA,KAAa;AAC3C,MAAA,MAAM,CAAA,GAAI,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA;AAC7B,MAAA,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA,GAAI,EAAE,CAAC,CAAA;AAAA,IACpB,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,MAAA,CAAO,SAAS,CAAC,CAAC,KAAA,CAAM,KAAA,CAAM,SAAS,CAAC,CAAA;AACxC,EAAA,MAAA,CAAO,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,IAAK,EAAA;AAEzC,EAAA,MAAA,CAAO,WAAW,MAAM;AACtB,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,MAAA,GAAS,QAAA,GAAW,MAAA;AAE5C,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,QAAQ,CAAA;AAAA,EAC1C,CAAA;AAEA,EAAA,OAAO,MAAA;AACT","file":"index.cjs","sourcesContent":["const DATA_URL_REGEX =\n /^data:([a-z]+\\/[a-z0-9-+.]+(;[a-z0-9-.!#$%*+.{}|~`]+=[a-z0-9-.!#$%*+.{}()_|~`]+)*)?(;base64)?,([a-z0-9!$&',()*+;=\\-._~:@/?%\\s<>]*?)$/i;\n\n/**\n * Determine if a given data URL is valid or not.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/data_URIs}\n * @see {@link http://tools.ietf.org/html/rfc2397}\n * @see {@link http://tools.ietf.org/html/rfc2396#section2}\n */\nfunction validate(str: string) {\n return DATA_URL_REGEX.test((str || '').trim());\n}\n\nexport interface DataURL {\n // biome-ignore lint/suspicious/noExplicitAny: `additionalProperties: true`\n [k: string]: any;\n base64: boolean;\n contentType?: string;\n data: string;\n mediaType?: string;\n name?: string;\n toBuffer: () => Buffer;\n}\n\n/**\n * Parse a given data URL into its individual parts.\n *\n */\nfunction parse(str: string) {\n if (!validate(str)) {\n return false;\n }\n\n const parts = str.trim().match(DATA_URL_REGEX);\n const parsed = {} as DataURL;\n\n if (parts[1]) {\n parsed.mediaType = parts[1].toLowerCase();\n\n const mediaTypeParts = parts[1].split(';').map(x => {\n // `name` attributes are for filenames so we shouldn't lowercase them as some filesystems are\n // case-sensitive.\n if (x.startsWith('name=')) {\n return x;\n }\n\n return x.toLowerCase();\n });\n\n parsed.contentType = mediaTypeParts[0];\n\n mediaTypeParts.slice(1).forEach(attribute => {\n const p = attribute.split('=');\n parsed[p[0]] = p[1];\n });\n }\n\n parsed.base64 = !!parts[parts.length - 2];\n parsed.data = parts[parts.length - 1] || '';\n\n parsed.toBuffer = () => {\n const encoding = parsed.base64 ? 'base64' : 'utf8';\n\n return Buffer.from(parsed.data, encoding);\n };\n\n return parsed;\n}\n\nexport { parse, validate };\n"]} | ||
| {"version":3,"file":"index.cjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["const DATA_URL_REGEX =\n /^data:([a-z]+\\/[a-z0-9-+.]+(;[a-z0-9-.!#$%*+.{}|~`]+=[a-z0-9-.!#$%*+.{}()_|~`]+)*)?(;base64)?,([a-z0-9!$&',()*+;=\\-._~:@/?%\\s<>]*?)$/i;\n\n/**\n * Determine if a given data URL is valid or not.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/data_URIs}\n * @see {@link http://tools.ietf.org/html/rfc2397}\n * @see {@link http://tools.ietf.org/html/rfc2396#section2}\n */\nfunction validate(str: string) {\n return DATA_URL_REGEX.test((str || '').trim());\n}\n\nexport interface DataURL {\n // biome-ignore lint/suspicious/noExplicitAny: `additionalProperties: true`\n [k: string]: any;\n base64: boolean;\n contentType?: string;\n data: string;\n mediaType?: string;\n name?: string;\n toBuffer: () => Buffer;\n}\n\n/**\n * Parse a given data URL into its individual parts.\n *\n */\nfunction parse(str: string) {\n if (!validate(str)) {\n return false;\n }\n\n const parts = str.trim().match(DATA_URL_REGEX);\n const parsed = {} as DataURL;\n\n if (parts[1]) {\n parsed.mediaType = parts[1].toLowerCase();\n\n const mediaTypeParts = parts[1].split(';').map(x => {\n // `name` attributes are for filenames so we shouldn't lowercase them as some filesystems are\n // case-sensitive.\n if (x.startsWith('name=')) {\n return x;\n }\n\n return x.toLowerCase();\n });\n\n parsed.contentType = mediaTypeParts[0];\n\n mediaTypeParts.slice(1).forEach(attribute => {\n const p = attribute.split('=');\n parsed[p[0]] = p[1];\n });\n }\n\n parsed.base64 = !!parts[parts.length - 2];\n parsed.data = parts[parts.length - 1] || '';\n\n parsed.toBuffer = () => {\n const encoding = parsed.base64 ? 'base64' : 'utf8';\n\n return Buffer.from(parsed.data, encoding);\n };\n\n return parsed;\n}\n\nexport { parse, validate };\n"],"mappings":";;;AAAA,MAAM,iBACJ;;;;;;;;AASF,SAAS,SAAS,KAAa;AAC7B,QAAO,eAAe,MAAM,OAAO,IAAI,MAAM,CAAC;;;;;;AAkBhD,SAAS,MAAM,KAAa;AAC1B,KAAI,CAAC,SAAS,IAAI,CAChB,QAAO;CAGT,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,eAAe;CAC9C,MAAM,SAAS,EAAE;AAEjB,KAAI,MAAM,IAAI;AACZ,SAAO,YAAY,MAAM,GAAG,aAAa;EAEzC,MAAM,iBAAiB,MAAM,GAAG,MAAM,IAAI,CAAC,KAAI,MAAK;AAGlD,OAAI,EAAE,WAAW,QAAQ,CACvB,QAAO;AAGT,UAAO,EAAE,aAAa;IACtB;AAEF,SAAO,cAAc,eAAe;AAEpC,iBAAe,MAAM,EAAE,CAAC,SAAQ,cAAa;GAC3C,MAAM,IAAI,UAAU,MAAM,IAAI;AAC9B,UAAO,EAAE,MAAM,EAAE;IACjB;;AAGJ,QAAO,SAAS,CAAC,CAAC,MAAM,MAAM,SAAS;AACvC,QAAO,OAAO,MAAM,MAAM,SAAS,MAAM;AAEzC,QAAO,iBAAiB;EACtB,MAAM,WAAW,OAAO,SAAS,WAAW;AAE5C,SAAO,OAAO,KAAK,OAAO,MAAM,SAAS;;AAG3C,QAAO"} |
+11
-9
@@ -0,1 +1,2 @@ | ||
| //#region src/index.d.ts | ||
| /** | ||
@@ -10,9 +11,9 @@ * Determine if a given data URL is valid or not. | ||
| interface DataURL { | ||
| [k: string]: any; | ||
| base64: boolean; | ||
| contentType?: string; | ||
| data: string; | ||
| mediaType?: string; | ||
| name?: string; | ||
| toBuffer: () => Buffer; | ||
| [k: string]: any; | ||
| base64: boolean; | ||
| contentType?: string; | ||
| data: string; | ||
| mediaType?: string; | ||
| name?: string; | ||
| toBuffer: () => Buffer; | ||
| } | ||
@@ -24,3 +25,4 @@ /** | ||
| declare function parse(str: string): false | DataURL; | ||
| export { type DataURL, parse, validate }; | ||
| //#endregion | ||
| export { DataURL, parse, validate }; | ||
| //# sourceMappingURL=index.d.cts.map |
+8
-8
| { | ||
| "name": "@readme/data-urls", | ||
| "version": "3.0.1", | ||
| "version": "4.0.0", | ||
| "description": "A utility for parsing and validating data URLs.", | ||
@@ -19,3 +19,3 @@ "license": "ISC", | ||
| "engines": { | ||
| "node": ">=18" | ||
| "node": ">=22" | ||
| }, | ||
@@ -34,3 +34,3 @@ "files": [ | ||
| "scripts": { | ||
| "build": "tsup", | ||
| "build": "tsdown", | ||
| "format": "npm run prettier && npx biome check --write", | ||
@@ -47,8 +47,8 @@ "lint": "biome check", | ||
| "@readme/standards": "^2.1.1", | ||
| "@types/node": "^24.0.8", | ||
| "@vitest/coverage-v8": "^4.0.2", | ||
| "@types/node": "^25.0.3", | ||
| "@vitest/coverage-v8": "^4.1.2", | ||
| "prettier": "^3.0.3", | ||
| "tsup": "^8.0.1", | ||
| "typescript": "^5.1.6", | ||
| "vitest": "^4.0.2" | ||
| "tsdown": "^0.21.7", | ||
| "typescript": "^6.0.2", | ||
| "vitest": "^4.1.2" | ||
| }, | ||
@@ -55,0 +55,0 @@ "browserslist": [ |
| /** | ||
| * Determine if a given data URL is valid or not. | ||
| * | ||
| * @see {@link https://developer.mozilla.org/en-US/docs/data_URIs} | ||
| * @see {@link http://tools.ietf.org/html/rfc2397} | ||
| * @see {@link http://tools.ietf.org/html/rfc2396#section2} | ||
| */ | ||
| declare function validate(str: string): boolean; | ||
| interface DataURL { | ||
| [k: string]: any; | ||
| base64: boolean; | ||
| contentType?: string; | ||
| data: string; | ||
| mediaType?: string; | ||
| name?: string; | ||
| toBuffer: () => Buffer; | ||
| } | ||
| /** | ||
| * Parse a given data URL into its individual parts. | ||
| * | ||
| */ | ||
| declare function parse(str: string): false | DataURL; | ||
| export { type DataURL, parse, validate }; |
| // src/index.ts | ||
| var DATA_URL_REGEX = /^data:([a-z]+\/[a-z0-9-+.]+(;[a-z0-9-.!#$%*+.{}|~`]+=[a-z0-9-.!#$%*+.{}()_|~`]+)*)?(;base64)?,([a-z0-9!$&',()*+;=\-._~:@/?%\s<>]*?)$/i; | ||
| function validate(str) { | ||
| return DATA_URL_REGEX.test((str || "").trim()); | ||
| } | ||
| function parse(str) { | ||
| if (!validate(str)) { | ||
| return false; | ||
| } | ||
| const parts = str.trim().match(DATA_URL_REGEX); | ||
| const parsed = {}; | ||
| if (parts[1]) { | ||
| parsed.mediaType = parts[1].toLowerCase(); | ||
| const mediaTypeParts = parts[1].split(";").map((x) => { | ||
| if (x.startsWith("name=")) { | ||
| return x; | ||
| } | ||
| return x.toLowerCase(); | ||
| }); | ||
| parsed.contentType = mediaTypeParts[0]; | ||
| mediaTypeParts.slice(1).forEach((attribute) => { | ||
| const p = attribute.split("="); | ||
| parsed[p[0]] = p[1]; | ||
| }); | ||
| } | ||
| parsed.base64 = !!parts[parts.length - 2]; | ||
| parsed.data = parts[parts.length - 1] || ""; | ||
| parsed.toBuffer = () => { | ||
| const encoding = parsed.base64 ? "base64" : "utf8"; | ||
| return Buffer.from(parsed.data, encoding); | ||
| }; | ||
| return parsed; | ||
| } | ||
| export { parse, validate }; | ||
| //# sourceMappingURL=index.js.map | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";AAAA,IAAM,cAAA,GACJ,uIAAA;AASF,SAAS,SAAS,GAAA,EAAa;AAC7B,EAAA,OAAO,cAAA,CAAe,IAAA,CAAA,CAAM,GAAA,IAAO,EAAA,EAAI,MAAM,CAAA;AAC/C;AAiBA,SAAS,MAAM,GAAA,EAAa;AAC1B,EAAA,IAAI,CAAC,QAAA,CAAS,GAAG,CAAA,EAAG;AAClB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,IAAA,EAAK,CAAE,MAAM,cAAc,CAAA;AAC7C,EAAA,MAAM,SAAS,EAAC;AAEhB,EAAA,IAAI,KAAA,CAAM,CAAC,CAAA,EAAG;AACZ,IAAA,MAAA,CAAO,SAAA,GAAY,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,EAAY;AAExC,IAAA,MAAM,cAAA,GAAiB,MAAM,CAAC,CAAA,CAAE,MAAM,GAAG,CAAA,CAAE,IAAI,CAAA,CAAA,KAAK;AAGlD,MAAA,IAAI,CAAA,CAAE,UAAA,CAAW,OAAO,CAAA,EAAG;AACzB,QAAA,OAAO,CAAA;AAAA,MACT;AAEA,MAAA,OAAO,EAAE,WAAA,EAAY;AAAA,IACvB,CAAC,CAAA;AAED,IAAA,MAAA,CAAO,WAAA,GAAc,eAAe,CAAC,CAAA;AAErC,IAAA,cAAA,CAAe,KAAA,CAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,CAAA,SAAA,KAAa;AAC3C,MAAA,MAAM,CAAA,GAAI,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA;AAC7B,MAAA,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA,GAAI,EAAE,CAAC,CAAA;AAAA,IACpB,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,MAAA,CAAO,SAAS,CAAC,CAAC,KAAA,CAAM,KAAA,CAAM,SAAS,CAAC,CAAA;AACxC,EAAA,MAAA,CAAO,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,IAAK,EAAA;AAEzC,EAAA,MAAA,CAAO,WAAW,MAAM;AACtB,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,MAAA,GAAS,QAAA,GAAW,MAAA;AAE5C,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,QAAQ,CAAA;AAAA,EAC1C,CAAA;AAEA,EAAA,OAAO,MAAA;AACT","file":"index.js","sourcesContent":["const DATA_URL_REGEX =\n /^data:([a-z]+\\/[a-z0-9-+.]+(;[a-z0-9-.!#$%*+.{}|~`]+=[a-z0-9-.!#$%*+.{}()_|~`]+)*)?(;base64)?,([a-z0-9!$&',()*+;=\\-._~:@/?%\\s<>]*?)$/i;\n\n/**\n * Determine if a given data URL is valid or not.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/data_URIs}\n * @see {@link http://tools.ietf.org/html/rfc2397}\n * @see {@link http://tools.ietf.org/html/rfc2396#section2}\n */\nfunction validate(str: string) {\n return DATA_URL_REGEX.test((str || '').trim());\n}\n\nexport interface DataURL {\n // biome-ignore lint/suspicious/noExplicitAny: `additionalProperties: true`\n [k: string]: any;\n base64: boolean;\n contentType?: string;\n data: string;\n mediaType?: string;\n name?: string;\n toBuffer: () => Buffer;\n}\n\n/**\n * Parse a given data URL into its individual parts.\n *\n */\nfunction parse(str: string) {\n if (!validate(str)) {\n return false;\n }\n\n const parts = str.trim().match(DATA_URL_REGEX);\n const parsed = {} as DataURL;\n\n if (parts[1]) {\n parsed.mediaType = parts[1].toLowerCase();\n\n const mediaTypeParts = parts[1].split(';').map(x => {\n // `name` attributes are for filenames so we shouldn't lowercase them as some filesystems are\n // case-sensitive.\n if (x.startsWith('name=')) {\n return x;\n }\n\n return x.toLowerCase();\n });\n\n parsed.contentType = mediaTypeParts[0];\n\n mediaTypeParts.slice(1).forEach(attribute => {\n const p = attribute.split('=');\n parsed[p[0]] = p[1];\n });\n }\n\n parsed.base64 = !!parts[parts.length - 2];\n parsed.data = parts[parts.length - 1] || '';\n\n parsed.toBuffer = () => {\n const encoding = parsed.base64 ? 'base64' : 'utf8';\n\n return Buffer.from(parsed.data, encoding);\n };\n\n return parsed;\n}\n\nexport { parse, validate };\n"]} |
16588
-3.44%86
-9.47%