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
10
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
1.0.1
to
2.0.0
+24
dist/index.d.mts
/**
* 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 };

@@ -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
{
"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": [

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 @@ /**

@@ -7,7 +7,9 @@ {

"esModuleInterop": true,
"lib": ["dom", "es2020"],
"lib": ["DOM", "ES2020"],
"moduleResolution": "node",
"noImplicitAny": true,
"outDir": "dist/"
"outDir": "dist/",
"target": "ES2020"
},
"include": ["./src/**/*"]
}
## <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))