@devvit/shared-types 0.10.15-next-2024-02-14-b85ea9563.0 → 0.10.15-next-2024-02-15-f7c48ffbb.0
Sign up to get free protection for your applications and to get access to all the features.
- package/imageUtil.d.ts +17 -0
- package/imageUtil.d.ts.map +1 -0
- package/imageUtil.js +61 -0
- package/imageUtil.test.d.ts.map +1 -0
- package/package.json +4 -4
package/imageUtil.d.ts
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
export declare const REDD_IT = "redd.it";
|
2
|
+
export declare const REDDIT_STATIC = "redditstatic.com";
|
3
|
+
export declare const REDDIT_MEDIA = "redditmedia.com";
|
4
|
+
export declare const SNOO_DEV = "snoo.dev";
|
5
|
+
export declare const VerifiedPublicImageHosts: readonly string[];
|
6
|
+
export declare const VerifiedImageHosts: readonly string[];
|
7
|
+
export declare function isDataUrl(input: string): boolean;
|
8
|
+
export declare function parseDataUrl(dataUrl: string): {
|
9
|
+
mimeType: string | undefined;
|
10
|
+
charset: string | undefined;
|
11
|
+
isBase64: boolean;
|
12
|
+
data: string;
|
13
|
+
} | undefined;
|
14
|
+
export declare function isAcceptableDataUrlMimeType(mimeType: string): boolean;
|
15
|
+
export declare function isAcceptableDataUrl(maybeDataUrl: string): boolean;
|
16
|
+
export declare function isValidImageURL(imageUrl: string): boolean;
|
17
|
+
//# sourceMappingURL=imageUtil.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"imageUtil.d.ts","sourceRoot":"","sources":["../src/imageUtil.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,OAAO,YAAY,CAAC;AACjC,eAAO,MAAM,aAAa,qBAAqB,CAAC;AAChD,eAAO,MAAM,YAAY,oBAAoB,CAAC;AAC9C,eAAO,MAAM,QAAQ,aAAa,CAAC;AAEnC,eAAO,MAAM,wBAAwB,EAAE,SAAS,MAAM,EAA2C,CAAC;AAClG,eAAO,MAAM,kBAAkB,EAAE,SAAS,MAAM,EAK/C,CAAC;AAcF,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GACxC;IACE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd,GACD,SAAS,CAWZ;AAED,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAKrE;AAED,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAMjE;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAazD"}
|
package/imageUtil.js
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
// Only the following domains are approved: redd.it, redditstatic.com, redditmedia.com, or snoo.dev
|
2
|
+
export const REDD_IT = 'redd.it';
|
3
|
+
export const REDDIT_STATIC = 'redditstatic.com';
|
4
|
+
export const REDDIT_MEDIA = 'redditmedia.com';
|
5
|
+
export const SNOO_DEV = 'snoo.dev';
|
6
|
+
export const VerifiedPublicImageHosts = [REDD_IT, REDDIT_STATIC, REDDIT_MEDIA];
|
7
|
+
export const VerifiedImageHosts = [
|
8
|
+
SNOO_DEV,
|
9
|
+
REDD_IT,
|
10
|
+
REDDIT_STATIC,
|
11
|
+
REDDIT_MEDIA,
|
12
|
+
];
|
13
|
+
const DATA_URL_REGEX =
|
14
|
+
// eslint-disable-next-line security/detect-unsafe-regex
|
15
|
+
/^data:([a-zA-Z]+\/[a-zA-Z0-9.+_-]+)?(;charset=[a-zA-Z0-9._+-]+)?(;base64)?,(.*)/;
|
16
|
+
function preprocessDataUrl(input) {
|
17
|
+
/**
|
18
|
+
* This can be submitted to us as multi-line and that will break the parser
|
19
|
+
* so we remove all newlines here
|
20
|
+
*/
|
21
|
+
return input.trim().replace(/[\r\n]+/g, '');
|
22
|
+
}
|
23
|
+
export function isDataUrl(input) {
|
24
|
+
return !!preprocessDataUrl(input).match(DATA_URL_REGEX);
|
25
|
+
}
|
26
|
+
export function parseDataUrl(dataUrl) {
|
27
|
+
const matches = DATA_URL_REGEX.exec(preprocessDataUrl(dataUrl));
|
28
|
+
if (!matches)
|
29
|
+
return;
|
30
|
+
return {
|
31
|
+
mimeType: matches[1],
|
32
|
+
charset: matches[2]?.split('=')[1], // Extract charset without ';charset='
|
33
|
+
isBase64: !!matches[3],
|
34
|
+
data: matches[4].trim(),
|
35
|
+
};
|
36
|
+
}
|
37
|
+
export function isAcceptableDataUrlMimeType(mimeType) {
|
38
|
+
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types#image_types
|
39
|
+
const acceptableMimeTypes = ['image/svg+xml'];
|
40
|
+
return acceptableMimeTypes.includes(mimeType);
|
41
|
+
}
|
42
|
+
export function isAcceptableDataUrl(maybeDataUrl) {
|
43
|
+
const parsedDataUrl = parseDataUrl(maybeDataUrl);
|
44
|
+
if (!parsedDataUrl?.mimeType)
|
45
|
+
return false;
|
46
|
+
return isAcceptableDataUrlMimeType(parsedDataUrl.mimeType);
|
47
|
+
}
|
48
|
+
export function isValidImageURL(imageUrl) {
|
49
|
+
try {
|
50
|
+
if (isAcceptableDataUrl(imageUrl))
|
51
|
+
return true;
|
52
|
+
// The second "base" param helps to handle relative paths to local files
|
53
|
+
// https://developer.mozilla.org/en-US/docs/Web/API/URL/URL#parameters
|
54
|
+
const hostName = new URL(imageUrl, `https://i.${REDD_IT}`)?.hostname;
|
55
|
+
const tld = hostName.split('.').slice(-2).join('.');
|
56
|
+
return Boolean(tld) && VerifiedImageHosts.includes(tld);
|
57
|
+
}
|
58
|
+
catch (_) {
|
59
|
+
return false;
|
60
|
+
}
|
61
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"imageUtil.test.d.ts","sourceRoot":"","sources":["../src/imageUtil.test.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@devvit/shared-types",
|
3
|
-
"version": "0.10.15-next-2024-02-
|
3
|
+
"version": "0.10.15-next-2024-02-15-f7c48ffbb.0",
|
4
4
|
"license": "BSD-3-Clause",
|
5
5
|
"repository": {
|
6
6
|
"type": "git",
|
@@ -23,12 +23,12 @@
|
|
23
23
|
},
|
24
24
|
"types": "./index.d.ts",
|
25
25
|
"dependencies": {
|
26
|
-
"@devvit/protos": "0.10.15-next-2024-02-
|
26
|
+
"@devvit/protos": "0.10.15-next-2024-02-15-f7c48ffbb.0"
|
27
27
|
},
|
28
28
|
"devDependencies": {
|
29
29
|
"@devvit/eslint-config": "0.10.14",
|
30
30
|
"@devvit/repo-tools": "0.10.14",
|
31
|
-
"@devvit/tsconfig": "0.10.15-next-2024-02-
|
31
|
+
"@devvit/tsconfig": "0.10.15-next-2024-02-15-f7c48ffbb.0",
|
32
32
|
"eslint": "8.9.0",
|
33
33
|
"typescript": "5.3.2",
|
34
34
|
"vitest": "0.31.0"
|
@@ -37,5 +37,5 @@
|
|
37
37
|
"directory": "dist"
|
38
38
|
},
|
39
39
|
"source": "./src/index.ts",
|
40
|
-
"gitHead": "
|
40
|
+
"gitHead": "3f84c335d9c69b040e20a5b29c74a3533fe31164"
|
41
41
|
}
|