Skip to content

Commit 1105b3d

Browse files
committed
blockHeadless variable
1 parent 771b32e commit 1105b3d

File tree

7 files changed

+44
-6
lines changed

7 files changed

+44
-6
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { it, expect } from '@jest/globals';
2+
3+
import { EmailJSResponseStatus } from '../../models/EmailJSResponseStatus';
4+
import { headlessError } from './headlessError';
5+
6+
it('should return EmailJSResponseStatus', () => {
7+
expect(headlessError()).toBeInstanceOf(EmailJSResponseStatus);
8+
});
9+
10+
it('should return status 451', () => {
11+
expect(headlessError()).toEqual({
12+
status: 451,
13+
text: 'Unavailable For Headless Browser',
14+
});
15+
});
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { EmailJSResponseStatus } from '../../models/EmailJSResponseStatus';
2+
3+
export const headlessError = () => {
4+
return new EmailJSResponseStatus(451, 'Unavailable For Headless Browser');
5+
};

src/methods/init/init.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export const init = (
1717
const opts = buildOptions(options);
1818

1919
store.publicKey = opts.publicKey;
20+
store.blockHeadless = opts.blockHeadless;
2021
store.limitRate = opts.limitRate || store.limitRate;
2122
store.blockList = opts.blockList || store.blockList;
2223
store.origin = opts.origin || origin;

src/methods/send/send.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1+
import type { EmailJSResponseStatus } from '../../models/EmailJSResponseStatus';
2+
import type { Options } from '../../types/Options';
3+
14
import { store } from '../../store/store';
25
import { sendPost } from '../../api/sendPost';
36
import { buildOptions } from '../../utils/buildOptions/buildOptions';
47
import { validateParams } from '../../utils/validateParams/validateParams';
58
import { validateTemplateParams } from '../../utils/validateTemplateParams/validateTemplateParams';
6-
7-
import type { EmailJSResponseStatus } from '../../models/EmailJSResponseStatus';
8-
import type { Options } from '../../types/Options';
9+
import { isHeadless } from '../../utils/isHeadless/isHeadless';
10+
import { headlessError } from '../../errors/headlessError/headlessError';
911

1012
/**
1113
* Send a template to the specific EmailJS service
@@ -23,6 +25,11 @@ export const send = (
2325
): Promise<EmailJSResponseStatus> => {
2426
const opts = buildOptions(options);
2527
const publicKey = opts.publicKey || store.publicKey;
28+
const blockHeadless = opts.blockHeadless || store.blockHeadless;
29+
30+
if (blockHeadless && isHeadless(navigator)) {
31+
return Promise.reject(headlessError());
32+
}
2633

2734
validateParams(publicKey, serviceID, templateID);
2835
validateTemplateParams(templateParams);

src/methods/sendForm/sendForm.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1+
import type { EmailJSResponseStatus } from '../../models/EmailJSResponseStatus';
2+
import type { Options } from '../../types/Options';
3+
14
import { store } from '../../store/store';
25
import { sendPost } from '../../api/sendPost';
36
import { buildOptions } from '../../utils/buildOptions/buildOptions';
47
import { validateForm } from '../../utils/validateForm/validateForm';
58
import { validateParams } from '../../utils/validateParams/validateParams';
6-
7-
import type { EmailJSResponseStatus } from '../../models/EmailJSResponseStatus';
8-
import type { Options } from '../../types/Options';
9+
import { isHeadless } from '../../utils/isHeadless/isHeadless';
10+
import { headlessError } from '../../errors/headlessError/headlessError';
911

1012
const findHTMLForm = (form: string | HTMLFormElement): HTMLFormElement | null => {
1113
return typeof form === 'string' ? document.querySelector<HTMLFormElement>(form) : form;
@@ -27,6 +29,12 @@ export const sendForm = (
2729
): Promise<EmailJSResponseStatus> => {
2830
const opts = buildOptions(options);
2931
const publicKey = opts.publicKey || store.publicKey;
32+
const blockHeadless = opts.blockHeadless || store.blockHeadless;
33+
34+
if (blockHeadless && isHeadless(navigator)) {
35+
return Promise.reject(headlessError());
36+
}
37+
3038
const currentForm = findHTMLForm(form);
3139

3240
validateParams(publicKey, serviceID, templateID);

src/store/store.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import type { Options } from '../types/Options';
22

33
export const store: Options = {
44
origin: 'https://api.emailjs.com',
5+
blockHeadless: false,
56
limitRate: 0,
67
blockList: [],
78
};

src/types/Options.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
export interface Options {
22
origin?: string;
33
publicKey?: string;
4+
blockHeadless?: boolean;
45
limitRate?: number;
56
blockList?: string[];
67
}

0 commit comments

Comments
 (0)