@readme/data-urls
Advanced tools
@@ -1,1 +0,1 @@ | ||
| {"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"} | ||
| {"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;CAC7B,OAAO,eAAe,MAAM,OAAO,IAAI,KAAK,CAAC;AAC/C;;;;;AAiBA,SAAS,MAAM,KAAa;CAC1B,IAAI,CAAC,SAAS,GAAG,GACf,OAAO;CAGT,MAAM,QAAQ,IAAI,KAAK,EAAE,MAAM,cAAc;CAC7C,MAAM,SAAS,CAAC;CAEhB,IAAI,MAAM,IAAI;EACZ,OAAO,YAAY,MAAM,GAAG,YAAY;EAExC,MAAM,iBAAiB,MAAM,GAAG,MAAM,GAAG,EAAE,KAAI,MAAK;GAGlD,IAAI,EAAE,WAAW,OAAO,GACtB,OAAO;GAGT,OAAO,EAAE,YAAY;EACvB,CAAC;EAED,OAAO,cAAc,eAAe;EAEpC,eAAe,MAAM,CAAC,EAAE,SAAQ,cAAa;GAC3C,MAAM,IAAI,UAAU,MAAM,GAAG;GAC7B,OAAO,EAAE,MAAM,EAAE;EACnB,CAAC;CACH;CAEA,OAAO,SAAS,CAAC,CAAC,MAAM,MAAM,SAAS;CACvC,OAAO,OAAO,MAAM,MAAM,SAAS,MAAM;CAEzC,OAAO,iBAAiB;EACtB,MAAM,WAAW,OAAO,SAAS,WAAW;EAE5C,OAAO,OAAO,KAAK,OAAO,MAAM,QAAQ;CAC1C;CAEA,OAAO;AACT"} |
@@ -1,1 +0,1 @@ | ||
| {"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"} | ||
| {"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;CAC7B,OAAO,eAAe,MAAM,OAAO,IAAI,KAAK,CAAC;AAC/C;;;;;AAiBA,SAAS,MAAM,KAAa;CAC1B,IAAI,CAAC,SAAS,GAAG,GACf,OAAO;CAGT,MAAM,QAAQ,IAAI,KAAK,EAAE,MAAM,cAAc;CAC7C,MAAM,SAAS,CAAC;CAEhB,IAAI,MAAM,IAAI;EACZ,OAAO,YAAY,MAAM,GAAG,YAAY;EAExC,MAAM,iBAAiB,MAAM,GAAG,MAAM,GAAG,EAAE,KAAI,MAAK;GAGlD,IAAI,EAAE,WAAW,OAAO,GACtB,OAAO;GAGT,OAAO,EAAE,YAAY;EACvB,CAAC;EAED,OAAO,cAAc,eAAe;EAEpC,eAAe,MAAM,CAAC,EAAE,SAAQ,cAAa;GAC3C,MAAM,IAAI,UAAU,MAAM,GAAG;GAC7B,OAAO,EAAE,MAAM,EAAE;EACnB,CAAC;CACH;CAEA,OAAO,SAAS,CAAC,CAAC,MAAM,MAAM,SAAS;CACvC,OAAO,OAAO,MAAM,MAAM,SAAS,MAAM;CAEzC,OAAO,iBAAiB;EACtB,MAAM,WAAW,OAAO,SAAS,WAAW;EAE5C,OAAO,OAAO,KAAK,OAAO,MAAM,QAAQ;CAC1C;CAEA,OAAO;AACT"} |
+25
-27
| { | ||
| "name": "@readme/data-urls", | ||
| "version": "4.0.2", | ||
| "version": "4.0.3", | ||
| "description": "A utility for parsing and validating data URLs.", | ||
| "homepage": "https://github.com/readmeio/data-urls#readme", | ||
| "bugs": { | ||
| "url": "https://github.com/readmeio/data-urls/issues" | ||
| }, | ||
| "license": "ISC", | ||
| "repository": { | ||
| "type": "git", | ||
| "url": "git@github.com:readmeio/data-urls.git" | ||
| }, | ||
| "files": [ | ||
| "dist" | ||
| ], | ||
| "type": "module", | ||
| "sideEffects": false, | ||
| "type": "module", | ||
| "main": "dist/index.cjs", | ||
| "module": "dist/index.mjs", | ||
| "types": "dist/index.d.cts", | ||
| "exports": { | ||
@@ -21,27 +35,9 @@ ".": { | ||
| }, | ||
| "main": "dist/index.cjs", | ||
| "module": "dist/index.mjs", | ||
| "types": "dist/index.d.cts", | ||
| "engines": { | ||
| "node": ">=22" | ||
| }, | ||
| "files": [ | ||
| "dist" | ||
| ], | ||
| "repository": { | ||
| "type": "git", | ||
| "url": "git@github.com:readmeio/data-urls.git" | ||
| }, | ||
| "bugs": { | ||
| "url": "https://github.com/readmeio/data-urls/issues" | ||
| }, | ||
| "homepage": "https://github.com/readmeio/data-urls#readme", | ||
| "scripts": { | ||
| "build": "tsdown", | ||
| "format": "npm run prettier && npx biome check --write", | ||
| "lint": "biome check", | ||
| "format": "npx oxlint --fix && npx oxfmt --write", | ||
| "lint": "npx oxlint && npx oxfmt --check", | ||
| "prebuild": "rm -rf dist/", | ||
| "prepack": "npm run build", | ||
| "pretest": "npm run lint", | ||
| "prettier": "prettier --list-different --write \"./**/**.{js,ts}\"", | ||
| "test": "vitest --coverage" | ||
@@ -51,8 +47,8 @@ }, | ||
| "@arethetypeswrong/core": "^0.18.2", | ||
| "@biomejs/biome": "^2.1.3", | ||
| "@readme/standards": "^2.4.1", | ||
| "@readme/oxlint-config": "^1.1.2", | ||
| "@types/node": "^25.5.2", | ||
| "@vitest/coverage-v8": "^4.1.2", | ||
| "prettier": "^3.0.3", | ||
| "tsdown": "^0.21.7", | ||
| "oxfmt": "^0.52.0", | ||
| "oxlint": "^1.62.0", | ||
| "tsdown": "^0.22.1", | ||
| "typescript": "^6.0.2", | ||
@@ -64,3 +60,5 @@ "vitest": "^4.1.2" | ||
| ], | ||
| "prettier": "@readme/standards/prettier" | ||
| "engines": { | ||
| "node": ">=22" | ||
| } | ||
| } |
+4
-1
| # @readme/data-urls | ||
| A utility for parsing and validating [data URLs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URLs). | ||
@@ -19,6 +20,8 @@ | ||
| ## Usage | ||
| ```js | ||
| import { parse, validate } from '@readme/data-urls'; | ||
| const url = 'data:image/png;name=owlbert-shrub.png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACNUlEQVR4AWJkIA2wCQHqJgcouZ0ADv+SmayR28PibPOP2jafzdp6Lh/v2bVt2+1zbdvtbtbMpGfmvmD8jStc9uB3v75gdNmqtJqsa6qCDEBPRVH7XpKk1P9yHLZv3mG6keV9BIsWGqNuvNaiy+YoARFIXFXwf6Frjz/X9oS4LNRkty4QH/0MSnnWDHORHV3pJsiozRk0zWW/9MEi0A9ffqOhf5RRDW6SGLT/ZXcT8C1hWvao8iF1c4ecKx5eejW1bii1y1asW14P5XsUNkogmvVQg2aPLOnrqss9qE81OYlAucRrN/LrqlBSWYufv34jq7gKseA7MCr0IOhffForGsTWDBJnqE2/B0H+hKRRG3DtxEGk6QBZQ9UFClMSnTJe/cCVI5uQJJpx+8AyOBUPPv+JIpJjgJqCZzKT0AGdAgT/1OLtSzsKI2/gspnxvGExZYFADcoSsqM10SADF4jC4TCCUDN8nih+eoIgPAdGeajBNxyMH20JwsPNMwSicUjBCAwmAZ6GkCmA7I+qCxTGRHSkVzZiCRmKAsRkuVmWiENrt6gL5Di7iw4oogFSINIkCTU09hNAP64CREPUBbzAx9ABrc2I3w2NeY5DMByHu8AGY3YyeoKIuSmBWCD6OuqLPJXe/Dpvkb3FuoDbdENKuBVJ4nxZJpKgWoUXCMcYUwBwDfR8FxZPN4wfWK2Zunq7tGLmZMOc7x7ZUn/RuDmrX0H/4FffQ2teylCecuWmDNsTnainfwFPuNZTR3MemwAAAABJRU5ErkJggg=='; | ||
| const url = | ||
| 'data:image/png;name=owlbert-shrub.png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACNUlEQVR4AWJkIA2wCQHqJgcouZ0ADv+SmayR28PibPOP2jafzdp6Lh/v2bVt2+1zbdvtbtbMpGfmvmD8jStc9uB3v75gdNmqtJqsa6qCDEBPRVH7XpKk1P9yHLZv3mG6keV9BIsWGqNuvNaiy+YoARFIXFXwf6Frjz/X9oS4LNRkty4QH/0MSnnWDHORHV3pJsiozRk0zWW/9MEi0A9ffqOhf5RRDW6SGLT/ZXcT8C1hWvao8iF1c4ecKx5eejW1bii1y1asW14P5XsUNkogmvVQg2aPLOnrqss9qE81OYlAucRrN/LrqlBSWYufv34jq7gKseA7MCr0IOhffForGsTWDBJnqE2/B0H+hKRRG3DtxEGk6QBZQ9UFClMSnTJe/cCVI5uQJJpx+8AyOBUPPv+JIpJjgJqCZzKT0AGdAgT/1OLtSzsKI2/gspnxvGExZYFADcoSsqM10SADF4jC4TCCUDN8nih+eoIgPAdGeajBNxyMH20JwsPNMwSicUjBCAwmAZ6GkCmA7I+qCxTGRHSkVzZiCRmKAsRkuVmWiENrt6gL5Di7iw4oogFSINIkCTU09hNAP64CREPUBbzAx9ABrc2I3w2NeY5DMByHu8AGY3YyeoKIuSmBWCD6OuqLPJXe/Dpvkb3FuoDbdENKuBVJ4nxZJpKgWoUXCMcYUwBwDfR8FxZPN4wfWK2Zunq7tGLmZMOc7x7ZUn/RuDmrX0H/4FffQ2teylCecuWmDNsTnainfwFPuNZTR3MemwAAAABJRU5ErkJggg=='; | ||
@@ -25,0 +28,0 @@ console.log(validate(url)); // true |
Unidentified License
LicenseSomething that seems like a license was found, but its contents could not be matched with a known license.
Found 1 instance in 1 package
Unidentified License
LicenseSomething that seems like a license was found, but its contents could not be matched with a known license.
Found 1 instance in 1 package
41
7.89%16713
-0.32%