add-to-calendar-button 2.6.19 → 2.6.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/assets/css/atcb-3d.css +7 -2
- package/assets/css/atcb-3d.min.css +1 -1
- package/assets/css/atcb-date.css +7 -2
- package/assets/css/atcb-date.min.css +1 -1
- package/assets/css/atcb-flat.css +7 -2
- package/assets/css/atcb-flat.min.css +1 -1
- package/assets/css/atcb-neumorphism.css +7 -2
- package/assets/css/atcb-neumorphism.min.css +1 -1
- package/assets/css/atcb-round.css +7 -2
- package/assets/css/atcb-round.min.css +1 -1
- package/assets/css/atcb-text.css +7 -2
- package/assets/css/atcb-text.min.css +1 -1
- package/assets/css/atcb.css +7 -2
- package/assets/css/atcb.min.css +1 -1
- package/dist/atcb-no-pro-unstyle.js +61 -50
- package/dist/atcb-no-pro.js +62 -51
- package/dist/atcb-unstyle.js +62 -51
- package/dist/atcb.js +63 -52
- package/dist/commonjs/index.js +63 -53
- package/dist/commonjs/no-pro/index.js +62 -52
- package/dist/commonjs/no-pro-unstyle/index.js +61 -51
- package/dist/commonjs/unstyle/index.js +62 -52
- package/dist/module/index.js +63 -52
- package/dist/module/no-pro/index.js +62 -51
- package/dist/module/no-pro-unstyle/index.js +61 -50
- package/dist/module/unstyle/index.js +62 -51
- package/package.json +10 -11
- package/test/server-side-init.test.js +0 -3
- package/test/test-prep.js +0 -4
- package/test/wc-tests/wc-load.test.js +0 -3
- package/.eslintrc.json +0 -36
- package/dist/commonjs/.eslintrc.json +0 -1
|
@@ -6,14 +6,14 @@ import { tzlib_get_ical_block, tzlib_get_offset, tzlib_get_timezones } from 'tim
|
|
|
6
6
|
* Add to Calendar Button
|
|
7
7
|
* ++++++++++++++++++++++
|
|
8
8
|
*
|
|
9
|
-
* Version: 2.6.
|
|
9
|
+
* Version: 2.6.21
|
|
10
10
|
* Creator: Jens Kuerschner (https://jekuer.com)
|
|
11
11
|
* Project: https://github.com/add2cal/add-to-calendar-button
|
|
12
12
|
* License: Elastic License 2.0 (ELv2) (https://github.com/add2cal/add-to-calendar-button/blob/main/LICENSE.txt)
|
|
13
13
|
* Note: DO NOT REMOVE THE COPYRIGHT NOTICE ABOVE!
|
|
14
14
|
*
|
|
15
15
|
*/
|
|
16
|
-
const atcbVersion = '2.6.
|
|
16
|
+
const atcbVersion = '2.6.21';
|
|
17
17
|
const atcbCssTemplate = {};
|
|
18
18
|
const atcbIsBrowser = () => {
|
|
19
19
|
if (typeof window === 'undefined') {
|
|
@@ -57,7 +57,7 @@ const atcbIsAndroid = atcbIsBrowser()
|
|
|
57
57
|
};*/
|
|
58
58
|
const atcbIsSafari = atcbIsBrowser()
|
|
59
59
|
? () => {
|
|
60
|
-
if (/^((?!chrome|android|crios|fxios).)*safari/i.test(navigator.userAgent)) {
|
|
60
|
+
if (/^(?:(?!chrome|android|crios|fxios).)*safari/i.test(navigator.userAgent)) {
|
|
61
61
|
return true;
|
|
62
62
|
} else {
|
|
63
63
|
return false;
|
|
@@ -75,7 +75,7 @@ const atcbIsMobile = () => {
|
|
|
75
75
|
};
|
|
76
76
|
const atcbIsWebView = atcbIsBrowser()
|
|
77
77
|
? () => {
|
|
78
|
-
if (
|
|
78
|
+
if (/; ?wv|(?:iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(navigator.userAgent)) {
|
|
79
79
|
return true;
|
|
80
80
|
} else {
|
|
81
81
|
return false;
|
|
@@ -86,7 +86,7 @@ const atcbIsWebView = atcbIsBrowser()
|
|
|
86
86
|
};
|
|
87
87
|
const atcbIsProblematicWebView = atcbIsBrowser()
|
|
88
88
|
? () => {
|
|
89
|
-
if (/
|
|
89
|
+
if (/Instagram/i.test(navigator.userAgent)) {
|
|
90
90
|
return true;
|
|
91
91
|
} else {
|
|
92
92
|
return false;
|
|
@@ -305,7 +305,7 @@ function atcb_decorate_data_timezone(tz = null) {
|
|
|
305
305
|
function atcb_decorate_data_rrule(data) {
|
|
306
306
|
if (data.recurrence && data.recurrence !== '') {
|
|
307
307
|
data.recurrence = data.recurrence.replace(/\s+/g, '').toUpperCase();
|
|
308
|
-
if (!/^(RRULE:[\w
|
|
308
|
+
if (!/^(?:RRULE:[\w=;,:+\-/\\]+|daily|weekly|monthly|yearly)$/im.test(data.recurrence)) {
|
|
309
309
|
data.recurrence = '!wrong rrule format!';
|
|
310
310
|
} else {
|
|
311
311
|
if (/^RRULE:/i.test(data.recurrence)) {
|
|
@@ -548,8 +548,7 @@ function atcb_decorate_data_description(data, i) {
|
|
|
548
548
|
description = cleanDescription(description);
|
|
549
549
|
if (data.customVar) {
|
|
550
550
|
for (const key in data.customVar) {
|
|
551
|
-
const sanitizedKey = key.replace(/[
|
|
552
|
-
// eslint-disable-next-line security/detect-non-literal-regexp
|
|
551
|
+
const sanitizedKey = key.replace(/[^\w\-.]/g, '');
|
|
553
552
|
description = description.replace(new RegExp(`%%${sanitizedKey}%%`, 'g'), data.customVar[`${key}`]);
|
|
554
553
|
}
|
|
555
554
|
}
|
|
@@ -608,10 +607,8 @@ function atcb_decorate_data_extend(data) {
|
|
|
608
607
|
}
|
|
609
608
|
if (data.customVar) {
|
|
610
609
|
for (const key in data.customVar) {
|
|
611
|
-
const sanitizedKey = key.replace(/[
|
|
612
|
-
// eslint-disable-next-line security/detect-non-literal-regexp
|
|
610
|
+
const sanitizedKey = key.replace(/[^\w\-.]/g, '');
|
|
613
611
|
data.dates[`${i}`].name = data.dates[`${i}`].name.replace(new RegExp(`%%${sanitizedKey}%%`, 'g'), data.customVar[`${key}`]);
|
|
614
|
-
// eslint-disable-next-line security/detect-non-literal-regexp
|
|
615
612
|
data.dates[`${i}`].location = data.dates[`${i}`].location.replace(new RegExp(`%%${sanitizedKey}%%`, 'g'), data.customVar[`${key}`]);
|
|
616
613
|
}
|
|
617
614
|
}
|
|
@@ -630,7 +627,7 @@ function atcb_date_cleanup(dateTimeData) {
|
|
|
630
627
|
}
|
|
631
628
|
const endpoints = ['start', 'end'];
|
|
632
629
|
endpoints.forEach(function (point) {
|
|
633
|
-
if (!/^(
|
|
630
|
+
if (!/^(?:\d{4}-\d{2}-\d{2}T?(?:\d{2}:\d{2})?Z?|today(?:\+\d{1,4})?)$/i.test(dateTimeData[point + 'Date'])) {
|
|
634
631
|
dateTimeData[point + 'Date'] = 'badly-formed';
|
|
635
632
|
} else {
|
|
636
633
|
dateTimeData[point + 'Date'] = atcb_date_calculation(dateTimeData[point + 'Date']);
|
|
@@ -835,7 +832,7 @@ async function atcb_validate_buttonStyle(data, msgPrefix) {
|
|
|
835
832
|
if (!availableStyles.includes(data.buttonStyle)) {
|
|
836
833
|
throw new Error(msgPrefix + ' failed: provided buttonStyle invalid');
|
|
837
834
|
}
|
|
838
|
-
if (data.customCss && data.customCss !== '' && (!atcb_secure_url(data.customCss, false) || !/\.css(
|
|
835
|
+
if (data.customCss && data.customCss !== '' && (!atcb_secure_url(data.customCss, false) || !/\.css(?:$|\?)/.test(data.customCss))) {
|
|
839
836
|
throw new Error(msgPrefix + ' failed: customCss provided, but no valid url');
|
|
840
837
|
}
|
|
841
838
|
if ((!data.customCss || data.customCss === '') && data.buttonStyle === 'custom') {
|
|
@@ -914,7 +911,7 @@ async function atcb_validate_availability(data, msgPrefix, i, msgSuffix) {
|
|
|
914
911
|
async function atcb_validate_organizer(data, msgPrefix, i, msgSuffix) {
|
|
915
912
|
if (data.dates[`${i}`].organizer && data.dates[`${i}`].organizer !== '') {
|
|
916
913
|
const organizerParts = data.dates[`${i}`].organizer.split('|');
|
|
917
|
-
if (organizerParts.length !== 2 || organizerParts[0].length > 50 || organizerParts[1].length >
|
|
914
|
+
if (organizerParts.length !== 2 || organizerParts[0].length > 50 || organizerParts[1].length > 100 || !atcb_validEmail(organizerParts[1])) {
|
|
918
915
|
throw new Error(msgPrefix + ' failed: organizer needs to match the schema "NAME|EMAIL" with a valid email address' + msgSuffix);
|
|
919
916
|
}
|
|
920
917
|
}
|
|
@@ -929,14 +926,14 @@ async function atcb_validate_attendee(data, msgPrefix, i, msgSuffix) {
|
|
|
929
926
|
if (attendeeParts.length === 1 && atcb_validEmail(attendeeParts[0])) {
|
|
930
927
|
return true;
|
|
931
928
|
}
|
|
932
|
-
if (attendeeParts.length !== 2 || attendeeParts[0].length > 50 || attendeeParts[1].length >
|
|
929
|
+
if (attendeeParts.length !== 2 || attendeeParts[0].length > 50 || attendeeParts[1].length > 100 || !atcb_validEmail(attendeeParts[1])) {
|
|
933
930
|
throw new Error(msgPrefix + ' failed: attendee needs to be a valid email address or match the schema "NAME|EMAIL" with EMAIL being a valid email address' + msgSuffix);
|
|
934
931
|
}
|
|
935
932
|
}
|
|
936
933
|
return true;
|
|
937
934
|
}
|
|
938
935
|
async function atcb_validate_uid(data, msgPrefix, i, msgSuffix) {
|
|
939
|
-
if (!/^(
|
|
936
|
+
if (!/^(?:\w|-){1,254}$/.test(data.dates[`${i}`].uid)) {
|
|
940
937
|
if (data.debug) {
|
|
941
938
|
console.warn(msgPrefix + ': UID not valid. May only contain alpha, digits, and dashes; and be less than 255 characters. Falling back to an automated value!' + msgSuffix);
|
|
942
939
|
}
|
|
@@ -1005,7 +1002,7 @@ async function atcb_validate_rrule(data, msgPrefix) {
|
|
|
1005
1002
|
if (data.recurrence && data.recurrence !== '' && data.dates.length > 1) {
|
|
1006
1003
|
throw new Error(msgPrefix + ' failed: RRULE and multi-date set at the same time');
|
|
1007
1004
|
}
|
|
1008
|
-
if (data.recurrence && data.recurrence !== '' && !/^RRULE:[\w
|
|
1005
|
+
if (data.recurrence && data.recurrence !== '' && !/^RRULE:[\w=;,:+\-/\\]+$/i.test(data.recurrence)) {
|
|
1009
1006
|
throw new Error(msgPrefix + ' failed: RRULE data misspelled');
|
|
1010
1007
|
}
|
|
1011
1008
|
return true;
|
|
@@ -1014,22 +1011,22 @@ async function atcb_validate_rrule_simplyfied(data, msgPrefix) {
|
|
|
1014
1011
|
if (data.recurrence_interval && (data.recurrence_interval < 1 || data.recurrence_interval % 1 !== 0)) {
|
|
1015
1012
|
throw new Error(msgPrefix + ' failed: recurrence data (interval) misspelled');
|
|
1016
1013
|
}
|
|
1017
|
-
if (data.recurrence_until && data.recurrence_until !== '' && !/^
|
|
1014
|
+
if (data.recurrence_until && data.recurrence_until !== '' && !/^[\d\-:]+$/.test(data.recurrence_until)) {
|
|
1018
1015
|
throw new Error(msgPrefix + ' failed: recurrence data (until) misspelled');
|
|
1019
1016
|
}
|
|
1020
1017
|
if (data.recurrence_count && (data.recurrence_count < 1 || data.recurrence_count % 1 !== 0)) {
|
|
1021
1018
|
throw new Error(msgPrefix + ' failed: recurrence data (interval) misspelled');
|
|
1022
1019
|
}
|
|
1023
|
-
if (data.recurrence_byMonth && data.recurrence_byMonth !== '' && !/^
|
|
1020
|
+
if (data.recurrence_byMonth && data.recurrence_byMonth !== '' && !/^[\d,]+$/.test(data.recurrence_byMonth)) {
|
|
1024
1021
|
throw new Error(msgPrefix + ' failed: recurrence data (byMonth) misspelled');
|
|
1025
1022
|
}
|
|
1026
|
-
if (data.recurrence_byMonthDay && data.recurrence_byMonthDay !== '' && !/^
|
|
1023
|
+
if (data.recurrence_byMonthDay && data.recurrence_byMonthDay !== '' && !/^[\d,]+$/.test(data.recurrence_byMonthDay)) {
|
|
1027
1024
|
throw new Error(msgPrefix + ' failed: recurrence data (byMonthDay) misspelled');
|
|
1028
1025
|
}
|
|
1029
|
-
if (data.recurrence_byDay && data.recurrence_byDay !== '' && !/^(\d
|
|
1026
|
+
if (data.recurrence_byDay && data.recurrence_byDay !== '' && !/^(?:[\d,-]|MO|TU|WE|TH|FR|SA|SU)+$/im.test(data.recurrence_byDay)) {
|
|
1030
1027
|
throw new Error(msgPrefix + ' failed: recurrence data (byDay) misspelled');
|
|
1031
1028
|
}
|
|
1032
|
-
if (data.recurrence_weekstart && data.recurrence_weekstart !== '' && !/^(MO|TU|WE|TH|FR|SA|SU)$/im.test(data.recurrence_weekstart)) {
|
|
1029
|
+
if (data.recurrence_weekstart && data.recurrence_weekstart !== '' && !/^(?:MO|TU|WE|TH|FR|SA|SU)$/im.test(data.recurrence_weekstart)) {
|
|
1033
1030
|
throw new Error(msgPrefix + ' failed: recurrence data (weekstart) misspelled');
|
|
1034
1031
|
}
|
|
1035
1032
|
return true;
|
|
@@ -1470,7 +1467,7 @@ async function atcb_generate_rsvp_form(host, data, hostEl, keyboardTrigger = fal
|
|
|
1470
1467
|
} else {
|
|
1471
1468
|
rsvpData.fields = rsvpData.fields.map((field) => {
|
|
1472
1469
|
if (field.name === 'email') {
|
|
1473
|
-
return { ...field, required: true, type: 'email', default: attendee !== ''
|
|
1470
|
+
return { ...field, required: true, type: 'email', default: attendee !== '' ? attendee : field.default };
|
|
1474
1471
|
}
|
|
1475
1472
|
return field;
|
|
1476
1473
|
});
|
|
@@ -2236,24 +2233,36 @@ function atcb_generate_bg_overlay(host, trigger = '', modal = false, darken = tr
|
|
|
2236
2233
|
}
|
|
2237
2234
|
return bgOverlay;
|
|
2238
2235
|
}
|
|
2239
|
-
|
|
2236
|
+
/*!
|
|
2237
|
+
* @preserve
|
|
2238
|
+
* PER LICENSE AGREEMENT, YOU ARE NOT ALLOWED TO REMOVE OR CHANGE THIS FUNCTION!
|
|
2239
|
+
*/
|
|
2240
|
+
function atcb_create_atcbl(host, atList = true, returnEl = false, licenseNoteOnly = false) {
|
|
2240
2241
|
const atcbL = document.createElement('div');
|
|
2241
2242
|
atcbL.id = 'atcb-reference';
|
|
2242
|
-
|
|
2243
|
-
|
|
2244
|
-
|
|
2245
|
-
|
|
2246
|
-
|
|
2247
|
-
|
|
2248
|
-
|
|
2249
|
-
|
|
2250
|
-
|
|
2251
|
-
|
|
2252
|
-
|
|
2253
|
-
|
|
2254
|
-
|
|
2243
|
+
if (!licenseNoteOnly) {
|
|
2244
|
+
setTimeout(() => {
|
|
2245
|
+
const svg =
|
|
2246
|
+
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 52.916 2.8305"><path d="M51.446 1.2565c.0708-.2518.293-.4511.5555-.4783.2211-.042.4641.0128.622.18.2474.2472.3045.6146.2916.9503v.8594h-.8307l-.0027-1.0447c-.0079-.1547-.1075-.343-.2868-.3238-.2049.0128-.3115.2421-.295.4257v.9428h-.823l-.0027-1.0435c-.0076-.1569-.1131-.3412-.2918-.3252-.2069.008-.311.2351-.2939.4188v.9499h-.8307V.8237h.8307v.4019c.0906-.2264.2876-.4188.5368-.449.2878-.0533.6071.0705.7509.3331.0279.0465.0509.0959.0699.1468zm-3.9843.5228c-.0102.1874.107.3914.3024.424.1869.0419.3799-.0941.4215-.2776.0535-.1967-.0023-.4493-.2015-.5411-.1767-.0892-.4107.0032-.483.1865-.0297.0649-.0391.1374-.0392.2082zm-.7691 0c.0037-.2984.1395-.5957.3792-.7774.3035-.2327.7168-.2798 1.0829-.2005.3299.0729.6352.3018.7481.6275.1337.3797.0441.8526-.2795 1.1099-.3184.2561-.7624.3092-1.152.2184-.3379-.0788-.6426-.3312-.7369-.6717a1.092 1.092 0 0 1-.0417-.3063zm-.2351-.3308c-.1638-.0482-.3406-.0889-.5104-.0492s-.2742.2154-.2664.3837c-.0082.1705.0998.3468.2712.3876.1657.0389.3389.0016.4979-.0492l.0769.5499c-.2369.1272-.5165.1434-.7791.1149-.3236-.0401-.6353-.2311-.7805-.529-.1237-.2511-.139-.5539-.0485-.8181.108-.3075.3782-.5432.6902-.6287.2064-.058.4286-.0585.6371-.0119.1027.0253.198.0732.2884.1269l-.0769.523zm-2.6877.9806c-.003-.1221.066-.2371.1643-.3062.1303-.0934.3092-.1186.4572-.0533.132.054.2426.1752.2607.3197s-.0575.2836-.1746.3603c-.1633.1093-.3947.1063-.5517-.0135-.0951-.0715-.1577-.187-.1559-.307zm-3.046-1.0111c-.0091-.4276.1794-.8577.5181-1.1231.3714-.2958.8865-.3488 1.3384-.2477.4065.0946.7695.3811.9242.7731.2302.553.1173 1.2562-.3406 1.6606-.4021.3563-.9997.4264-1.5018.273-.4407-.1312-.7876-.5106-.8926-.9564a1.565 1.565 0 0 1-.0458-.3795zm1.4499.6961c.2631.014.4813-.2093.5326-.4557.0785-.3033.0224-.6834-.2491-.8753-.2182-.159-.5514-.1019-.704.1211-.1692.2437-.1902.5756-.088.8501.0775.2087.2816.3661.5085.3597zm-1.631.6458c-.1978.0602-.4078.0938-.6123.0464-.2697-.0443-.5044-.2371-.6009-.4927-.0701-.1852-.1026-.3819-.154-.5728h-.1846v1.0268h-.8614V.0601l1.3192.0034c.3398.0217.7177.1323.9118.434.152.2456.127.584-.0389.8163-.0979.1284-.2387.2162-.3846.2807.0316.1513.0475.3167.1461.4418.1193.1187.3064.1031.4596.0812v.6422zm-.871-1.8651c.0103-.138-.1243-.231-.25-.2384-.1427-.0193-.2871-.0088-.4307-.0115v.5422c.1905-.0038.3947.0138.5678-.0796a.234.234 0 0 0 .1128-.2126zM35.573.0603l1.1424.0047c.3439.0209.7218.1098.9446.3944.2252.2934.2163.7545-.0512 1.0195-.279.2859-.698.3701-1.0838.362-.0329.0105-.1126-.0258-.102.0281v.8987h-.8499V.0603zm1.0192 1.2345c.1672.0054.3805-.0562.4233-.2409.0425-.1434-.0225-.3102-.1619-.3724-.1328-.0705-.2859-.0537-.4306-.0559v.6615c.0561.0073.1128.0073.1692.0077zm-2.5176.2226h1.0576v.4653h-1.0576zM32.3311.8234h.8307v.4019q.0942-.2384.25-.348.1577-.1115.3615-.1115l.1154.6442q-.375 0-.5519.0808-.175.0788-.175.2538v1.023h-.8307zm-1.2257 1.5791c-.0937.2116-.2986.3716-.5319.3897-.3887.0533-.7844-.1743-.9578-.5217-.2044-.381-.1519-.892.1543-1.2049.2461-.2614.6627-.389.9973-.2285.1574.0799.2779.2236.3381.3886V.7662h.8268v2.0017h-.8268v-.3653zm0-.6345c-.0052-.2449-.2747-.4425-.5088-.3585-.217.0615-.3402.3271-.243.5316.0896.2161.3875.3078.5783.1678.1106-.0747.179-.2073.1735-.3408zM27.7118.7662c.2401-.008.4923.1021.6064.3222.0351.0816.045.0806.0397.0023V.1721l.8307-.1231v2.7189h-.8307v-.3653c-.0907.2158-.3003.3744-.5356.39-.3605.0507-.7279-.1432-.9123-.4525-.2569-.3983-.1992-.9693.1456-1.2985.173-.1702.412-.2772.6563-.2754zm.6461 1.0018c-.0048-.2526-.2909-.4519-.5276-.3518-.2324.0782-.3309.3933-.1843.5898.1239.1938.425.2285.5871.0636.0811-.0768.1287-.1897.1248-.3015zM24.139.8233h.7922v.4019c.1006-.2169.2949-.397.5347-.4408.2696-.0572.58.0085.76.2293.2045.2403.2438.5692.2358.8734v.8802h-.8268l-.0022-1.1213c-.004-.1252-.0677-.2748-.2066-.2939-.2045-.0306-.3739.1457-.4412.3226-.0292.0785-.0098.1646-.0154.2467v.8459h-.8306V.8233zm-1.0416 1.4236c.2011-.0002.3981-.0574.5807-.1384l.0961.5288c-.3198.1421-.6806.1894-1.027.145-.3369-.0473-.6587-.2545-.8007-.5699-.1588-.3469-.1132-.7886.1413-1.0788.2741-.3191.7406-.4335 1.1413-.3308.2768.0734.5008.3019.5751.5779.0429.146.0624.3015.043.453l-1.1806.1538c.0368.134.158.2311.2944.2482.0449.0082.0907.0114.1363.0114zm.1461-.7557c-.0268-.1234-.1257-.237-.2578-.244-.143-.0241-.2868.0725-.325.2111-.0103.0527-.0737.2029.0271.1552l.5558-.1223zm-1.4939 1.1721c-.2463.1208-.5356.1686-.805.1092-.227-.0527-.3993-.2481-.4518-.4712-.0545-.2125-.0296-.4333-.0353-.6502V.1714l.8307-.1231.0011 1.9292c.002.1378.1537.1938.2711.1813.0651.0169.1819-.1.162.0152l.0274.4893zm-2.5115-.2609c-.0937.2116-.2986.3716-.5319.3897-.3887.0533-.7844-.1743-.9578-.5217-.2044-.381-.1519-.892.1543-1.2049.2461-.2614.6627-.389.9973-.2285.1574.0799.2779.2236.3381.3886V.7661h.8268v2.0017h-.8268v-.3653zm0-.6345c-.0052-.2449-.2747-.4425-.5088-.3585-.217.0615-.3402.3271-.243.5316.0896.2161.3875.3078.5783.1678.1106-.0747.179-.2073.1735-.3408zm-2.3726.35c.1696.0054.3334-.0479.4884-.1115l.1077.6249c-.5137.3026-1.2229.2625-1.6732-.1399-.2959-.2444-.4693-.6191-.4819-1.0009-.0323-.4791.181-.9792.5853-1.2496.4565-.3128 1.0898-.3142 1.5659-.0438l-.1038.6115c-.2721-.1029-.5957-.168-.8667-.0274-.2291.1239-.3077.4039-.2984.6481-.0043.2465.1061.5161.3427.6212.1037.0495.2198.0676.3339.0676zm-2.923-.6005h1.0576v.4653h-1.0576zm-1.7829.2619c-.0102.1874.107.3914.3024.424.1869.0419.3799-.0941.4215-.2776.0535-.1967-.0023-.4493-.2015-.5411-.1767-.0892-.4107.0032-.4831.1865-.0297.0649-.0391.1374-.0392.2082zm-.7691 0c.0037-.2984.1395-.5957.3792-.7774.3035-.2327.7168-.2798 1.0829-.2005.33.0729.6352.3018.7481.6275.1337.3797.0441.8526-.2795 1.1099-.3184.2561-.7624.3092-1.152.2184-.3379-.0788-.6426-.3312-.7369-.6717a1.092 1.092 0 0 1-.0417-.3063zm-.1976.8841c-.2463.1208-.5356.1686-.805.1092-.227-.0527-.3993-.2481-.4518-.4712-.0557-.2169-.0286-.4422-.0334-.6635l.0019-.3551h-.25V.7943h.3115l.3653-.7461h.4v.7461h.4538v.4884h-.4538l.0011.6943c.0034.1365.1541.1943.2715.1818.0768.006.1848-.0959.1624.0301l.0265.4744zm-2.7861-1.146h1.0575v.4653H8.4068zM6.5412.7662c.2401-.008.4923.1021.6064.3223.0351.0816.045.0806.0397.0023V.172l.8307-.1231v2.7189h-.8307v-.3653c-.0907.2158-.3003.3744-.5356.39-.3605.0507-.7279-.1432-.9123-.4525-.2569-.3983-.1992-.9693.1456-1.2985.173-.1702.412-.2772.6563-.2754zm.6461 1.0018c-.0048-.2526-.2909-.4519-.5276-.3518-.2324.0782-.3308.3933-.1843.5898.1239.1938.425.2285.5871.0636.0811-.0768.1287-.1897.1248-.3015zM3.7956.7662c.2401-.008.4923.1021.6064.3222.0351.0816.045.0806.0397.0023V.172l.8307-.1231v2.7189h-.8307v-.3653c-.0907.2158-.3003.3744-.5356.39-.3605.0507-.7279-.1432-.9123-.4525-.2569-.3983-.1992-.9693.1456-1.2985.173-.1702.4119-.2772.6563-.2754zm.6461 1.0018c-.0048-.2526-.2909-.4519-.5276-.3518-.2324.0782-.3308.3933-.1843.5898.1239.1938.425.2285.5871.0636.0811-.0768.1287-.1897.1248-.3015zM.7498.0603h1.196l.7845 2.7074h-.9268l-.1038-.5192H.9997l-.1115.5192h-.8883zm.8576 1.7037L1.3497.5795 1.0843 1.764z"/></svg>';
|
|
2247
|
+
atcbL.innerHTML = '<a href="https://add-to-calendar-pro.com" target="_blank" rel="noopener">' + svg + '</a>';
|
|
2248
|
+
}, 500);
|
|
2249
|
+
if (atList) {
|
|
2250
|
+
host.querySelector('.atcb-initialized .atcb-list-wrapper').append(atcbL);
|
|
2251
|
+
} else if (returnEl) {
|
|
2252
|
+
return atcbL;
|
|
2253
|
+
} else {
|
|
2254
|
+
if (window.innerHeight > 1000 || window.innerWidth > 1000) {
|
|
2255
|
+
host.append(atcbL);
|
|
2256
|
+
atcbL.classList.add('fixed-ref');
|
|
2257
|
+
}
|
|
2255
2258
|
}
|
|
2259
|
+
} else {
|
|
2260
|
+
atcbL.innerHTML = 'Using the <a href="https://add-to-calendar-pro.com" target="_blank" rel="noopener referrer">Add to Calendar Button</a>, licensed under the Elastic License 2.0 (ELv2).';
|
|
2261
|
+
atcbL.setAttribute('style', 'display:none !important');
|
|
2262
|
+
atcbL.classList.add('atcb-attribution');
|
|
2263
|
+
host.append(atcbL);
|
|
2256
2264
|
}
|
|
2265
|
+
if (returnEl) return null;
|
|
2257
2266
|
}
|
|
2258
2267
|
async function atcb_create_modal(mainHost, data, icon = '', headline, content = '', buttons = [], subEvents = [], keyboardTrigger = false, goto = {}, closable = true) {
|
|
2259
2268
|
atcbStates['active'] = data.identifier;
|
|
@@ -2927,7 +2936,7 @@ function atcb_subscribe_ical(data, fileUrl) {
|
|
|
2927
2936
|
function atcb_subscribe_google(data, fileUrl) {
|
|
2928
2937
|
const baseUrl = 'https://calendar.google.com/calendar/r?cid=';
|
|
2929
2938
|
const baseUrlApp = 'calendar.google.com/calendar?cid=';
|
|
2930
|
-
const fileUrlRegex = /^(https?:\/\/|webcal:\/\/|\/\/)calendar\.google\.com\//;
|
|
2939
|
+
const fileUrlRegex = /^(?:https?:\/\/|webcal:\/\/|\/\/)calendar\.google\.com\//;
|
|
2931
2940
|
const newFileUrl = (function () {
|
|
2932
2941
|
if (fileUrlRegex.test(fileUrl)) {
|
|
2933
2942
|
return fileUrl.replace(/^(.)*\?cid=/, '');
|
|
@@ -2962,7 +2971,7 @@ function atcb_generate_google(data, date, subEvent = 'all') {
|
|
|
2962
2971
|
urlParts.push('https://calendar.google.com/calendar/render?action=TEMPLATE');
|
|
2963
2972
|
const formattedDate = atcb_generate_time(date, 'clean', 'google');
|
|
2964
2973
|
urlParts.push('dates=' + encodeURIComponent(formattedDate.start) + '%2F' + encodeURIComponent(formattedDate.end));
|
|
2965
|
-
if (date.timeZone && date.timeZone !== '' && !/
|
|
2974
|
+
if (date.timeZone && date.timeZone !== '' && !/GMT[+|-]\d{1,2}|Etc\/U|Etc\/Zulu|CET|CST6CDT|EET|EST|MET|MST|PST8PDT|WET/i.test(date.timeZone) && !formattedDate.allday) {
|
|
2966
2975
|
urlParts.push('ctz=' + date.timeZone);
|
|
2967
2976
|
}
|
|
2968
2977
|
if (date.name && date.name !== '') {
|
|
@@ -3113,7 +3122,6 @@ function atcb_open_cal_url(data, type, url, subscribe = false, subEvent = null,
|
|
|
3113
3122
|
return;
|
|
3114
3123
|
}
|
|
3115
3124
|
}
|
|
3116
|
-
// eslint-disable-next-line security/detect-non-literal-fs-filename
|
|
3117
3125
|
const newTab = window.open(url, target);
|
|
3118
3126
|
if (newTab) {
|
|
3119
3127
|
newTab.focus();
|
|
@@ -3335,7 +3343,7 @@ function atcb_generate_time(data, style = 'delimiters', targetCal = 'general', a
|
|
|
3335
3343
|
}
|
|
3336
3344
|
return durationHours + ':' + ('0' + durationMinutes).slice(-2);
|
|
3337
3345
|
})();
|
|
3338
|
-
if (targetCal == 'ical' || (targetCal == 'google' && !/
|
|
3346
|
+
if (targetCal == 'ical' || (targetCal == 'google' && !/GMT[+|-]\d{1,2}|Etc\/U|Etc\/Zulu|CET|CST6CDT|EET|EST|MET|MST|PST8PDT|WET/i.test(data.timeZone))) {
|
|
3339
3347
|
return {
|
|
3340
3348
|
start: atcb_format_datetime(newStartDate, 'clean', true, true),
|
|
3341
3349
|
end: atcb_format_datetime(newEndDate, 'clean', true, true),
|
|
@@ -3657,7 +3665,7 @@ function atcb_secure_url(url, throwError = true) {
|
|
|
3657
3665
|
}
|
|
3658
3666
|
}
|
|
3659
3667
|
function atcb_validEmail(email) {
|
|
3660
|
-
if (!/^.{0,70}@.{1,30}\.[a-
|
|
3668
|
+
if (!/^.{0,70}@.{1,30}\.[a-z]{2,9}$/i.test(email)) {
|
|
3661
3669
|
return false;
|
|
3662
3670
|
}
|
|
3663
3671
|
return true;
|
|
@@ -3675,9 +3683,9 @@ function atcb_rewrite_html_elements(content, clear = false, iCalBreaks = false)
|
|
|
3675
3683
|
content = content.replace(/\{url\}(.+?)\{\/url\}/gi, (match, p1) => {
|
|
3676
3684
|
return p1.split('|')[0];
|
|
3677
3685
|
});
|
|
3678
|
-
content = content.replace(/\[(
|
|
3679
|
-
content = content.replace(/\{(
|
|
3680
|
-
content = content.replace(/&[#a-
|
|
3686
|
+
content = content.replace(/\[\/?(hr|[pbui]|strong|em|li|ul|ol|h\d)\]/gi, '');
|
|
3687
|
+
content = content.replace(/\{\/?(hr|[pbui]|strong|em|li|ul|ol|h\d)\}/gi, '');
|
|
3688
|
+
content = content.replace(/&[#a-z0-9]{1,9};/gi, '');
|
|
3681
3689
|
} else {
|
|
3682
3690
|
content = content.replace(/\[url\]((?:(?!\[\/url\]).)*)\[\/url\]/gi, function (match, p1) {
|
|
3683
3691
|
return atcb_parse_url_code(p1);
|
|
@@ -3685,8 +3693,8 @@ function atcb_rewrite_html_elements(content, clear = false, iCalBreaks = false)
|
|
|
3685
3693
|
content = content.replace(/\{url\}((?:(?!\[\/url\]).)*)\{\/url\}/gi, function (match, p1) {
|
|
3686
3694
|
return atcb_parse_url_code(p1);
|
|
3687
3695
|
});
|
|
3688
|
-
content = content.replace(/\[(
|
|
3689
|
-
content = content.replace(/\{(
|
|
3696
|
+
content = content.replace(/\[(\/)?(br|hr|[pbui]|strong|em|li|ul|ol|h\d)(\s?\/?)\]/gi, '<$1$2$3>');
|
|
3697
|
+
content = content.replace(/\{(\/)?(br|hr|[pbui]|strong|em|li|ul|ol|h\d)(\s?\/?)\}/gi, '<$1$2$3>');
|
|
3690
3698
|
}
|
|
3691
3699
|
return content;
|
|
3692
3700
|
}
|
|
@@ -4896,7 +4904,7 @@ if (atcbIsBrowser()) {
|
|
|
4896
4904
|
this.data.identifier = this.identifier;
|
|
4897
4905
|
} else {
|
|
4898
4906
|
if (this.data.identifier && this.data.identifier !== '') {
|
|
4899
|
-
if (!/^[\w
|
|
4907
|
+
if (!/^[\w-]+$/.test(this.data.identifier)) {
|
|
4900
4908
|
this.data.identifier = '';
|
|
4901
4909
|
if (this.debug) {
|
|
4902
4910
|
let prefix = 'Add to Calendar Button';
|
|
@@ -4915,7 +4923,6 @@ if (atcbIsBrowser()) {
|
|
|
4915
4923
|
this.identifier = this.data.identifier;
|
|
4916
4924
|
}
|
|
4917
4925
|
this.setAttribute('atcb-button-id', this.data.identifier);
|
|
4918
|
-
this.classList.add('add-to-calendar');
|
|
4919
4926
|
try {
|
|
4920
4927
|
this.setAttribute('style', 'visibility:visible;opacity:1;position:relative;outline:none !important;');
|
|
4921
4928
|
await atcb_build_button(this.shadowRoot, this.data);
|
|
@@ -5010,6 +5017,7 @@ function atcb_read_attributes(el, params = atcbWcParams) {
|
|
|
5010
5017
|
}
|
|
5011
5018
|
async function atcb_build_button(host, data) {
|
|
5012
5019
|
try {
|
|
5020
|
+
host.host.classList.add('add-to-calendar');
|
|
5013
5021
|
data = await atcb_decorate_data(data);
|
|
5014
5022
|
await atcb_validate(data);
|
|
5015
5023
|
const rootObj = host.querySelector('.atcb-initialized');
|
|
@@ -5034,6 +5042,9 @@ async function atcb_build_button(host, data) {
|
|
|
5034
5042
|
}
|
|
5035
5043
|
}
|
|
5036
5044
|
atcb_log_event('initialization', data.identifier, data.identifier);
|
|
5045
|
+
if (!data.proKey && data.hideBranding && !document.getElementById('atcb-reference')) {
|
|
5046
|
+
atcb_create_atcbl(document.body, false, false, true);
|
|
5047
|
+
}
|
|
5037
5048
|
return true;
|
|
5038
5049
|
} catch (e) {
|
|
5039
5050
|
throw new Error(e.message);
|
|
@@ -5091,7 +5102,7 @@ async function atcb_load_css(host, rootObj = null, data) {
|
|
|
5091
5102
|
const cssGlobalContent = document.createElement('style');
|
|
5092
5103
|
cssGlobalContent.id = 'atcb-global-style';
|
|
5093
5104
|
const scrollBarWidth = window.innerWidth - document.documentElement.clientWidth;
|
|
5094
|
-
cssGlobalContent.innerText = '.atcb-modal-no-scroll{overflow-y:hidden !important;-webkit-overflow-scrolling:touch;} body.atcb-modal-no-scroll{padding-right:' + scrollBarWidth + 'px;}';
|
|
5105
|
+
cssGlobalContent.innerText = '.atcb-modal-no-scroll{overflow-y:hidden !important;-webkit-overflow-scrolling:touch;} body.atcb-modal-no-scroll{padding-right:' + scrollBarWidth + 'px;}.atcb-attribution{display:none;}';
|
|
5095
5106
|
if (nonceVal) {
|
|
5096
5107
|
cssGlobalContent.setAttribute('nonce', nonceVal);
|
|
5097
5108
|
}
|
|
@@ -5240,7 +5251,7 @@ async function atcb_action(inputData, triggerElement, keyboardTrigger = false) {
|
|
|
5240
5251
|
if (triggerElement.id && triggerElement.id !== '') {
|
|
5241
5252
|
data.identifier = triggerElement.id;
|
|
5242
5253
|
} else {
|
|
5243
|
-
if (data.identifier && data.identifier != '' && /^[\w
|
|
5254
|
+
if (data.identifier && data.identifier != '' && /^[\w-]+$/.test(data.identifier)) {
|
|
5244
5255
|
data.identifier = 'atcb-btn-' + data.identifier;
|
|
5245
5256
|
} else {
|
|
5246
5257
|
data.identifier = 'atcb-btn-custom';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "add-to-calendar-button",
|
|
3
|
-
"version": "2.6.
|
|
3
|
+
"version": "2.6.21",
|
|
4
4
|
"engines": {
|
|
5
5
|
"node": ">=18.17.0",
|
|
6
6
|
"npm": ">=9.6.7"
|
|
@@ -83,8 +83,8 @@
|
|
|
83
83
|
"release": "node set-release.js",
|
|
84
84
|
"stylelint": "npx stylelint assets/css/*.css",
|
|
85
85
|
"stylelint:fix": "npm run stylelint -- --fix",
|
|
86
|
-
"eslint": "
|
|
87
|
-
"eslint:fix": "
|
|
86
|
+
"eslint": "eslint .",
|
|
87
|
+
"eslint:fix": "eslint --fix .",
|
|
88
88
|
"prettier": "npx prettier . --check",
|
|
89
89
|
"prettier:fix": "npm run prettier -- --write",
|
|
90
90
|
"format": "npm run eslint:fix && npm run prettier:fix && npm run stylelint:fix && cd demo && npm run lint:fix && npm run prettier:fix",
|
|
@@ -99,16 +99,15 @@
|
|
|
99
99
|
"timezones-ical-library": "^1.8.3"
|
|
100
100
|
},
|
|
101
101
|
"devDependencies": {
|
|
102
|
+
"@eslint/js": "^9.11.1",
|
|
102
103
|
"@open-wc/testing": "^4.0.0",
|
|
103
|
-
"@
|
|
104
|
-
"
|
|
105
|
-
"@web/test-runner": "^0.18.3",
|
|
106
|
-
"eslint": "^8.57.0",
|
|
104
|
+
"@web/test-runner": "^0.19.0",
|
|
105
|
+
"eslint": "^9.11.1",
|
|
107
106
|
"eslint-config-prettier": "^9.1.0",
|
|
108
|
-
"eslint-plugin-commonjs": "^1.0.2",
|
|
109
107
|
"eslint-plugin-prettier": "^5.2.1",
|
|
108
|
+
"eslint-plugin-regexp": "^2.6.0",
|
|
110
109
|
"eslint-plugin-security": "^3.0.1",
|
|
111
|
-
"eslint-plugin-wc": "^2.1.
|
|
110
|
+
"eslint-plugin-wc": "^2.1.1",
|
|
112
111
|
"grunt": ">=1.6.1",
|
|
113
112
|
"grunt-contrib-clean": "^2.0.1",
|
|
114
113
|
"grunt-contrib-concat": "^2.1.0",
|
|
@@ -117,8 +116,8 @@
|
|
|
117
116
|
"grunt-file-creator": "^0.1.3",
|
|
118
117
|
"grunt-version": "^3.0.1",
|
|
119
118
|
"prettier": "3.3.3",
|
|
120
|
-
"prettier-plugin-tailwindcss": "^0.6.
|
|
121
|
-
"stylelint": "^16.
|
|
119
|
+
"prettier-plugin-tailwindcss": "^0.6.8",
|
|
120
|
+
"stylelint": "^16.9.0",
|
|
122
121
|
"stylelint-config-standard": "^36.0.1"
|
|
123
122
|
}
|
|
124
123
|
}
|
package/test/test-prep.js
CHANGED
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-require-imports */
|
|
2
|
-
/* eslint-disable no-undef */
|
|
3
|
-
/* eslint-disable @typescript-eslint/no-var-requires */
|
|
4
|
-
// eslint-disable-next-line security/detect-child-process
|
|
5
1
|
const execSync = require('child_process').execSync;
|
|
6
2
|
|
|
7
3
|
// preparing the files
|
package/.eslintrc.json
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"root": true,
|
|
3
|
-
|
|
4
|
-
"env": {
|
|
5
|
-
"browser": true,
|
|
6
|
-
"node": true,
|
|
7
|
-
"es6": true
|
|
8
|
-
},
|
|
9
|
-
|
|
10
|
-
"parserOptions": {
|
|
11
|
-
"sourceType": "module",
|
|
12
|
-
"parser": "@typescript-eslint/parser",
|
|
13
|
-
"xss/no-mixed-html": [
|
|
14
|
-
2,
|
|
15
|
-
{
|
|
16
|
-
"functions": {
|
|
17
|
-
".encodeURIComponent": {
|
|
18
|
-
"passthrough": { "obj": true, "args": true }
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
]
|
|
23
|
-
},
|
|
24
|
-
|
|
25
|
-
"extends": ["plugin:@typescript-eslint/recommended", "eslint:recommended", "plugin:security/recommended-legacy", "plugin:prettier/recommended", "plugin:wc/recommended"],
|
|
26
|
-
|
|
27
|
-
"plugins": ["@typescript-eslint", "prettier"],
|
|
28
|
-
|
|
29
|
-
"ignorePatterns": ["*.min.*", "dist/*", "demo/*", "Gruntfile.js", "set-release.js"],
|
|
30
|
-
|
|
31
|
-
"rules": {
|
|
32
|
-
// TO-DO: Enable rules to find and optimize code style
|
|
33
|
-
"eqeqeq": 0,
|
|
34
|
-
"curly": 0
|
|
35
|
-
}
|
|
36
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{ "extends": "../../.eslintrc.json", "env": { "node": true }, "plugins": ["commonjs"] }
|