@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 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-14-b85ea9563.0",
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-14-b85ea9563.0"
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-14-b85ea9563.0",
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": "ee788dad24864862de31f0f840635b5810a08692"
40
+ "gitHead": "3f84c335d9c69b040e20a5b29c74a3533fe31164"
41
41
  }