Big News: Socket raises $60M Series C at a $1B valuation to secure software supply chains for AI-driven development.Announcement
Sign In

@readme/data-urls

Package Overview
Dependencies
Maintainers
7
Versions
9
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@readme/data-urls - npm Package Compare versions

Comparing version
3.0.1
to
4.0.0
+26
dist/index.d.mts
//#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"}

@@ -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
{
"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"]}