@readme/data-urls
Advanced tools
| /** | ||
| * 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 { DataURL, parse, validate }; |
| {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";AAAA,IAAM,iBACJ;AASF,SAAS,SAAS,KAAa;AAC7B,SAAO,eAAe,MAAM,OAAO,IAAI,KAAK,CAAC;AAC/C;AAiBA,SAAS,MAAM,KAAa;AAC1B,MAAI,CAAC,SAAS,GAAG,GAAG;AAClB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,IAAI,KAAK,EAAE,MAAM,cAAc;AAC7C,QAAM,SAAS,CAAC;AAEhB,MAAI,MAAM,CAAC,GAAG;AACZ,WAAO,YAAY,MAAM,CAAC,EAAE,YAAY;AAExC,UAAM,iBAAiB,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,OAAK;AAGlD,UAAI,EAAE,WAAW,OAAO,GAAG;AACzB,eAAO;AAAA,MACT;AAEA,aAAO,EAAE,YAAY;AAAA,IACvB,CAAC;AAED,WAAO,cAAc,eAAe,CAAC;AAErC,mBAAe,MAAM,CAAC,EAAE,QAAQ,eAAa;AAC3C,YAAM,IAAI,UAAU,MAAM,GAAG;AAC7B,aAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAAA,IACpB,CAAC;AAAA,EACH;AAEA,SAAO,SAAS,CAAC,CAAC,MAAM,MAAM,SAAS,CAAC;AACxC,SAAO,OAAO,MAAM,MAAM,SAAS,CAAC,KAAK;AAEzC,SAAO,WAAW,MAAM;AACtB,UAAM,WAAW,OAAO,SAAS,WAAW;AAE5C,WAAO,OAAO,KAAK,OAAO,MAAM,QAAQ;AAAA,EAC1C;AAEA,SAAO;AACT","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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\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"]} |
| // 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=out.js.map | ||
| //# sourceMappingURL=index.mjs.map |
| {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";AAAA,IAAM,iBACJ;AASF,SAAS,SAAS,KAAa;AAC7B,SAAO,eAAe,MAAM,OAAO,IAAI,KAAK,CAAC;AAC/C;AAiBA,SAAS,MAAM,KAAa;AAC1B,MAAI,CAAC,SAAS,GAAG,GAAG;AAClB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,IAAI,KAAK,EAAE,MAAM,cAAc;AAC7C,QAAM,SAAS,CAAC;AAEhB,MAAI,MAAM,CAAC,GAAG;AACZ,WAAO,YAAY,MAAM,CAAC,EAAE,YAAY;AAExC,UAAM,iBAAiB,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,OAAK;AAGlD,UAAI,EAAE,WAAW,OAAO,GAAG;AACzB,eAAO;AAAA,MACT;AAEA,aAAO,EAAE,YAAY;AAAA,IACvB,CAAC;AAED,WAAO,cAAc,eAAe,CAAC;AAErC,mBAAe,MAAM,CAAC,EAAE,QAAQ,eAAa;AAC3C,YAAM,IAAI,UAAU,MAAM,GAAG;AAC7B,aAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAAA,IACpB,CAAC;AAAA,EACH;AAEA,SAAO,SAAS,CAAC,CAAC,MAAM,MAAM,SAAS,CAAC;AACxC,SAAO,OAAO,MAAM,MAAM,SAAS,CAAC,KAAK;AAEzC,SAAO,WAAW,MAAM;AACtB,UAAM,WAAW,OAAO,SAAS,WAAW;AAE5C,WAAO,OAAO,KAAK,OAAO,MAAM,QAAQ;AAAA,EAC1C;AAEA,SAAO;AACT","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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\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"]} |
| import type { Options } from 'tsup'; | ||
| // eslint-disable-next-line import/no-extraneous-dependencies | ||
| import { defineConfig } from 'tsup'; | ||
| export default defineConfig((options: Options) => ({ | ||
| ...options, | ||
| cjsInterop: true, | ||
| clean: true, | ||
| dts: true, | ||
| entry: ['src/index.ts'], | ||
| format: ['esm', 'cjs'], | ||
| minify: false, | ||
| shims: true, | ||
| silent: !options.watch, | ||
| sourcemap: true, | ||
| splitting: true, | ||
| treeshake: true, | ||
| })); |
+8
-8
@@ -1,2 +0,1 @@ | ||
| /// <reference types="node" /> | ||
| /** | ||
@@ -10,11 +9,11 @@ * Determine if a given data URL is valid or not. | ||
| declare function validate(str: string): boolean; | ||
| export declare type DataURL = { | ||
| interface DataURL { | ||
| [k: string]: any; | ||
| base64: boolean; | ||
| contentType?: string; | ||
| data: string; | ||
| mediaType?: string; | ||
| contentType?: string; | ||
| name?: string; | ||
| base64: boolean; | ||
| data: string; | ||
| toBuffer: () => Buffer; | ||
| [k: string]: any; | ||
| }; | ||
| } | ||
| /** | ||
@@ -25,2 +24,3 @@ * Parse a given data URL into its individual parts. | ||
| declare function parse(str: string): false | DataURL; | ||
| export { parse, validate }; | ||
| export { DataURL, parse, validate }; |
+35
-47
@@ -1,52 +0,40 @@ | ||
| "use strict"; | ||
| exports.__esModule = true; | ||
| exports.validate = exports.parse = void 0; | ||
| var DATA_URL_REGEX = | ||
| // eslint-disable-next-line unicorn/no-unsafe-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} | ||
| */ | ||
| 'use strict'; | ||
| // 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()); | ||
| return DATA_URL_REGEX.test((str || "").trim()); | ||
| } | ||
| exports.validate = validate; | ||
| /** | ||
| * Parse a given data URL into its individual parts. | ||
| * | ||
| */ | ||
| function parse(str) { | ||
| if (!validate(str)) { | ||
| return false; | ||
| } | ||
| var parts = str.trim().match(DATA_URL_REGEX); | ||
| var parsed = {}; | ||
| if (parts[1]) { | ||
| parsed.mediaType = parts[1].toLowerCase(); | ||
| var mediaTypeParts = parts[1].split(';').map(function (x) { | ||
| // `name` attributes are for filenames so we shouldn't lowercase them as some filesystems are | ||
| // case-sensitive. | ||
| if (x.startsWith('name=')) { | ||
| return x; | ||
| } | ||
| return x.toLowerCase(); | ||
| }); | ||
| parsed.contentType = mediaTypeParts[0]; | ||
| mediaTypeParts.slice(1).forEach(function (attribute) { | ||
| var p = attribute.split('='); | ||
| parsed[p[0]] = p[1]; | ||
| }); | ||
| } | ||
| parsed.base64 = !!parts[parts.length - 2]; | ||
| parsed.data = parts[parts.length - 1] || ''; | ||
| parsed.toBuffer = function () { | ||
| var 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; | ||
| } | ||
| exports.parse = parse; | ||
| exports.validate = validate; | ||
| //# sourceMappingURL=out.js.map | ||
| //# sourceMappingURL=index.js.map |
+31
-31
| { | ||
| "name": "@readme/data-urls", | ||
| "version": "1.0.1", | ||
| "version": "2.0.0", | ||
| "description": "A utility for parsing and validating data URLs.", | ||
| "license": "ISC", | ||
| "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", | ||
| "exports": { | ||
| ".": { | ||
| "types": "./dist/index.d.ts", | ||
| "require": "./dist/index.js", | ||
| "import": "./dist/index.mjs" | ||
| }, | ||
| "./package.json": "./package.json" | ||
| }, | ||
| "main": "dist/index.js", | ||
| "module": "dist/index.mjs", | ||
| "types": "dist/index.d.ts", | ||
| "sideEffects": false, | ||
| "engines": { | ||
@@ -11,3 +30,3 @@ "node": ">=14" | ||
| "scripts": { | ||
| "build": "tsc", | ||
| "build": "tsup", | ||
| "lint": "eslint . --ext .js,.ts", | ||
@@ -18,33 +37,14 @@ "prebuild": "rm -rf dist/", | ||
| "prettier": "prettier --list-different --write \"./**/**.{js,ts}\"", | ||
| "release": "npx conventional-changelog-cli -i CHANGELOG.md -s", | ||
| "test:browser": "karma start --single-run", | ||
| "test:browser:chrome": "karma start --browsers=Chrome --single-run=false", | ||
| "test:browser:debug": "karma start --single-run=false", | ||
| "test": "nyc mocha \"test/**/*.test.ts\"" | ||
| "test": "vitest --coverage", | ||
| "test:browser": "vitest --browser.name=chrome --browser.headless" | ||
| }, | ||
| "repository": { | ||
| "type": "git", | ||
| "url": "git@github.com:readmeio/data-urls.git" | ||
| }, | ||
| "license": "ISC", | ||
| "bugs": { | ||
| "url": "https://github.com/readmeio/data-urls/issues" | ||
| }, | ||
| "homepage": "https://github.com/readmeio/data-urls#readme", | ||
| "devDependencies": { | ||
| "@jsdevtools/host-environment": "^2.1.2", | ||
| "@jsdevtools/karma-config": "^3.1.7", | ||
| "@readme/eslint-config": "^9.0.0", | ||
| "@types/chai": "^4.3.1", | ||
| "@types/mocha": "^9.1.1", | ||
| "@types/node": "^18.0.0", | ||
| "chai": "^4.3.4", | ||
| "eslint": "^8.14.0", | ||
| "mocha": "^10.0.0", | ||
| "nyc": "^15.1.0", | ||
| "prettier": "^2.6.2", | ||
| "ts-loader": "^8.4.0", | ||
| "ts-node": "^10.7.0", | ||
| "typescript": "^4.6.3", | ||
| "webpack": "^4.46.0" | ||
| "@readme/eslint-config": "^12.2.0", | ||
| "@types/node": "^20.3.3", | ||
| "@vitest/browser": "^0.34.3", | ||
| "@vitest/coverage-v8": "^0.34.3", | ||
| "eslint": "^8.44.0", | ||
| "prettier": "^3.0.3", | ||
| "tsup": "^7.2.0", | ||
| "typescript": "^5.1.6" | ||
| }, | ||
@@ -51,0 +51,0 @@ "browserslist": [ |
+7
-7
| const DATA_URL_REGEX = | ||
| // eslint-disable-next-line unicorn/no-unsafe-regex | ||
| /^data:([a-z]+\/[a-z0-9-+.]+(;[a-z0-9-.!#$%*+.{}|~`]+=[a-z0-9-.!#$%*+.{}()_|~`]+)*)?(;base64)?,([a-z0-9!$&',()*+;=\-._~:@/?%\s<>]*?)$/i; | ||
@@ -16,11 +15,12 @@ | ||
| export type DataURL = { | ||
| export interface DataURL { | ||
| // eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
| [k: string]: any; | ||
| base64: boolean; | ||
| contentType?: string; | ||
| data: string; | ||
| mediaType?: string; | ||
| contentType?: string; | ||
| name?: string; | ||
| base64: boolean; | ||
| data: string; | ||
| toBuffer: () => Buffer; | ||
| [k: string]: any; | ||
| }; | ||
| } | ||
@@ -27,0 +27,0 @@ /** |
+4
-2
@@ -7,7 +7,9 @@ { | ||
| "esModuleInterop": true, | ||
| "lib": ["dom", "es2020"], | ||
| "lib": ["DOM", "ES2020"], | ||
| "moduleResolution": "node", | ||
| "noImplicitAny": true, | ||
| "outDir": "dist/" | ||
| "outDir": "dist/", | ||
| "target": "ES2020" | ||
| }, | ||
| "include": ["./src/**/*"] | ||
| } |
-14
| ## <small>1.0.1 (2022-07-27)</small> | ||
| * fix: don't lowercase `name` attributes - some filesystems are case-sensitive ([7b43a4d](https://github.com/readmeio/data-urls/commit/7b43a4d)) | ||
| * docs: adding a changelog ([5218189](https://github.com/readmeio/data-urls/commit/5218189)) | ||
| ## 1.0.0 (2022-07-27) | ||
| * docs: adding some demos to the readme ([dd6316f](https://github.com/readmeio/data-urls/commit/dd6316f)) | ||
| * feat: initial commit ([afa3344](https://github.com/readmeio/data-urls/commit/afa3344)) | ||
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
AI-detected possible typosquat
Supply chain riskAI has identified this package as a potential typosquat of a more popular package. This suggests that the package may be intentionally mimicking another package's name, description, or other metadata.
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
18637
52%8
-46.67%12
50%183
26.21%0
-100%