@per-diem-calculator/vanilla 1.0.1 → 1.0.2
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/dist/index.js +11034 -0
- package/dist/index.umd.cjs +1384 -0
- package/package.json +12 -2
- package/.prettierrc +0 -17
- package/eslint.config.js +0 -29
- package/index.html +0 -11
- package/src/css/_styles.css +0 -8
- package/src/css/colors.css +0 -45
- package/src/css/fonts.css +0 -9
- package/src/css/rows/_heights.css +0 -6
- package/src/css/rows/_index.css +0 -15
- package/src/css/rows/add.css +0 -18
- package/src/css/rows/animate-btns.css +0 -18
- package/src/css/rows/animate-row-close.css +0 -18
- package/src/css/rows/animate-row-open.css +0 -14
- package/src/css/rows/animate-row-other.css +0 -5
- package/src/css/rows/btn-add-row.css +0 -41
- package/src/css/rows/btn-delete.css +0 -22
- package/src/css/rows/btn-expenses-calculate.css +0 -22
- package/src/css/rows/btn-expenses-category.css +0 -22
- package/src/css/rows/delete.css +0 -10
- package/src/css/rows/details.css +0 -22
- package/src/css/rows/expense.css +0 -18
- package/src/css/rows/location.css +0 -34
- package/src/css/rows/summary.css +0 -22
- package/src/css/tom-select/defaults.css +0 -530
- package/src/css/tom-select/overrides.css +0 -55
- package/src/css/tw-shadow-props.css +0 -50
- package/src/index.ts +0 -1
- package/src/ts/components/Button/Button.ts +0 -50
- package/src/ts/components/Button/template.html +0 -34
- package/src/ts/components/ExpenseRow/ExpenseRow.ts +0 -397
- package/src/ts/components/ExpenseRow/template.html +0 -260
- package/src/ts/components/Label/Label.ts +0 -45
- package/src/ts/components/Label/template.html +0 -1
- package/src/ts/components/LocationCategory/LocationCategory.ts +0 -226
- package/src/ts/components/LocationCategory/template.html +0 -520
- package/src/ts/components/LocationDate/LocationDate.ts +0 -366
- package/src/ts/components/LocationDate/template.html +0 -27
- package/src/ts/components/LocationSelect/LocationSelect.ts +0 -299
- package/src/ts/components/LocationSelect/template.html +0 -45
- package/src/ts/components/index.ts +0 -6
- package/src/ts/controller.ts +0 -193
- package/src/ts/model.ts +0 -163
- package/src/ts/types/config.ts +0 -22
- package/src/ts/types/dates.ts +0 -82
- package/src/ts/types/expenses.ts +0 -73
- package/src/ts/types/locations.ts +0 -25
- package/src/ts/utils/config/configDefault.ts +0 -13
- package/src/ts/utils/config/index.ts +0 -12
- package/src/ts/utils/config/numbers.ts +0 -24
- package/src/ts/utils/config/sanitizeConfig.ts +0 -39
- package/src/ts/utils/dates/INPUT_DATE_MINMAX.ts +0 -5
- package/src/ts/utils/dates/YEAR_REGEX.ts +0 -4
- package/src/ts/utils/dates/getDateSlice.ts +0 -54
- package/src/ts/utils/dates/getValidAPIYear.ts +0 -17
- package/src/ts/utils/dates/index.ts +0 -19
- package/src/ts/utils/dates/isDateRaw.ts +0 -90
- package/src/ts/utils/dates/isShortMonth.ts +0 -24
- package/src/ts/utils/dates/isYYYY.ts +0 -10
- package/src/ts/utils/dates/offsetDateString.ts +0 -17
- package/src/ts/utils/expenses/INTL_MIE_RATES.ts +0 -2125
- package/src/ts/utils/expenses/createExpenseObjs.ts +0 -35
- package/src/ts/utils/expenses/getLodgingRateDomestic.ts +0 -73
- package/src/ts/utils/expenses/getLodgingRateIntl.ts +0 -119
- package/src/ts/utils/expenses/getMieRates.ts +0 -84
- package/src/ts/utils/expenses/index.ts +0 -5
- package/src/ts/utils/expenses/parseIntlLodgingRates.ts +0 -124
- package/src/ts/utils/expenses/returnValidStateExpense.ts +0 -46
- package/src/ts/utils/fetch/fetchJsonGSA.ts +0 -29
- package/src/ts/utils/fetch/fetchXmlDOD.ts +0 -38
- package/src/ts/utils/fetch/index.ts +0 -3
- package/src/ts/utils/fetch/memoize.ts +0 -46
- package/src/ts/utils/fetch/parseXml.ts +0 -19
- package/src/ts/utils/locations/getCitiesDomestic.ts +0 -48
- package/src/ts/utils/locations/getCitiesIntl.ts +0 -63
- package/src/ts/utils/locations/getCountriesDomestic.ts +0 -237
- package/src/ts/utils/locations/getCountriesIntl.ts +0 -34
- package/src/ts/utils/locations/index.ts +0 -6
- package/src/ts/utils/locations/keepUniqueLocations.ts +0 -12
- package/src/ts/utils/locations/locationKeys.ts +0 -10
- package/src/ts/utils/locations/returnValidStateLocation.ts +0 -13
- package/src/ts/utils/locations/sortLocations.ts +0 -19
- package/src/ts/utils/misc/USD.ts +0 -4
- package/src/ts/utils/misc/debounce.ts +0 -22
- package/src/ts/utils/misc/handlePointerDown.ts +0 -3
- package/src/ts/utils/misc/handlePointerUp.ts +0 -22
- package/src/ts/utils/misc/inPrimitiveType.ts +0 -4
- package/src/ts/utils/misc/index.ts +0 -6
- package/src/ts/utils/misc/wait.ts +0 -4
- package/src/ts/utils/styles/applyStyles.ts +0 -19
- package/src/ts/utils/styles/highlightInput.ts +0 -15
- package/src/ts/utils/styles/index.ts +0 -3
- package/src/ts/utils/styles/removeStyles.ts +0 -14
- package/src/ts/views/Expense/Expense.ts +0 -465
- package/src/ts/views/Expense/template.html +0 -176
- package/src/ts/views/Location/Location.ts +0 -763
- package/src/ts/views/Location/template-row.html +0 -146
- package/src/ts/views/Location/template.html +0 -130
- package/src/ts/views/index.ts +0 -2
- package/tsconfig.json +0 -27
- package/vite.config.ts +0 -12
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
// Types
|
|
2
|
-
import { Config } from '../../types/config';
|
|
3
|
-
|
|
4
|
-
// Utils
|
|
5
|
-
import { configDefault } from './configDefault';
|
|
6
|
-
import DOMPurify from 'dompurify';
|
|
7
|
-
|
|
8
|
-
export const sanitizeConfig = (configUser: Partial<Config> | null): Config => {
|
|
9
|
-
const sanitizedConfig = { ...configDefault }; // Start with defaults
|
|
10
|
-
if (!configUser) return sanitizedConfig;
|
|
11
|
-
|
|
12
|
-
// Sanitize 'styled'
|
|
13
|
-
if (configUser.styled !== undefined) {
|
|
14
|
-
sanitizedConfig.styled = !!configUser.styled; // Ensure it's a boolean
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
// Sanitize 'location'
|
|
18
|
-
if (configUser.location) {
|
|
19
|
-
const { heading, body } = configUser.location;
|
|
20
|
-
if (heading)
|
|
21
|
-
sanitizedConfig.location.heading = DOMPurify.sanitize(heading);
|
|
22
|
-
if (body) sanitizedConfig.location.body = DOMPurify.sanitize(body);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// Sanitize 'expense'
|
|
26
|
-
if (configUser.expense) {
|
|
27
|
-
const { heading, headingPrint, body, bodyPrint } = configUser.expense;
|
|
28
|
-
if (heading)
|
|
29
|
-
sanitizedConfig.expense.heading = DOMPurify.sanitize(heading);
|
|
30
|
-
if (headingPrint)
|
|
31
|
-
sanitizedConfig.expense.headingPrint =
|
|
32
|
-
DOMPurify.sanitize(headingPrint);
|
|
33
|
-
if (body) sanitizedConfig.expense.body = DOMPurify.sanitize(body);
|
|
34
|
-
if (bodyPrint)
|
|
35
|
-
sanitizedConfig.expense.bodyPrint = DOMPurify.sanitize(bodyPrint);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
return sanitizedConfig;
|
|
39
|
-
};
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
// Utils
|
|
2
|
-
const DATE_ISO_STRING = 'YYYY-MM-DD';
|
|
3
|
-
|
|
4
|
-
const YYYY_START_POSITION = DATE_ISO_STRING.indexOf('Y');
|
|
5
|
-
const YYYY_END_POSITION = YYYY_START_POSITION + 'YYYY'.length;
|
|
6
|
-
|
|
7
|
-
const YY_START_POSITION = DATE_ISO_STRING.lastIndexOf('YY');
|
|
8
|
-
const YY_END_POSITION = YY_START_POSITION + 'YY'.length;
|
|
9
|
-
|
|
10
|
-
const MM_START_POSITION = DATE_ISO_STRING.indexOf('M');
|
|
11
|
-
const MM_END_POSITION = MM_START_POSITION + 'MM'.length;
|
|
12
|
-
|
|
13
|
-
const DD_START_POSITION = DATE_ISO_STRING.indexOf('D');
|
|
14
|
-
const DD_END_POSITION = DD_START_POSITION + 'DD'.length;
|
|
15
|
-
|
|
16
|
-
const DATE_UTC_STRING = 'Wed, 14 Jun 2017 07:00:00 GMT';
|
|
17
|
-
const SHORT_MONTH_START_POSITION = DATE_UTC_STRING.indexOf('Jun');
|
|
18
|
-
const SHORT_MONTH_END_POSITION = SHORT_MONTH_START_POSITION + 'Jun'.length;
|
|
19
|
-
|
|
20
|
-
const checkIfDateISO = (date: string) => {
|
|
21
|
-
if (!(date.length >= DATE_ISO_STRING.length))
|
|
22
|
-
throw new Error('Invalid date string format.');
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
const checkIfDateUTCString = (date: string) => {
|
|
26
|
-
if (date.length !== DATE_UTC_STRING.length)
|
|
27
|
-
throw new Error('Invalid date string format.');
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
// 2024-01-30
|
|
31
|
-
export const getDateRaw = (date: string) => {
|
|
32
|
-
checkIfDateISO(date);
|
|
33
|
-
return date.slice(YYYY_START_POSITION, DATE_ISO_STRING.length);
|
|
34
|
-
};
|
|
35
|
-
export const getYYYY = (date: string) => {
|
|
36
|
-
checkIfDateISO(date);
|
|
37
|
-
return date.slice(YYYY_START_POSITION, YYYY_END_POSITION); // 2024
|
|
38
|
-
};
|
|
39
|
-
export const getYY = (date: string, category: 'ISO' | 'YYYY' = 'ISO') => {
|
|
40
|
-
if (category === 'ISO') checkIfDateISO(date);
|
|
41
|
-
return date.slice(YY_START_POSITION, YY_END_POSITION); // 24
|
|
42
|
-
};
|
|
43
|
-
export const getMM = (date: string) => {
|
|
44
|
-
checkIfDateISO(date);
|
|
45
|
-
return date.slice(MM_START_POSITION, MM_END_POSITION); // 01
|
|
46
|
-
};
|
|
47
|
-
export const getDD = (date: string) => {
|
|
48
|
-
checkIfDateISO(date);
|
|
49
|
-
return date.slice(DD_START_POSITION, DD_END_POSITION); // 30
|
|
50
|
-
};
|
|
51
|
-
export const getShortMonth = (date: string) => {
|
|
52
|
-
checkIfDateUTCString(date);
|
|
53
|
-
return date.slice(SHORT_MONTH_START_POSITION, SHORT_MONTH_END_POSITION);
|
|
54
|
-
};
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
// Types
|
|
2
|
-
import type { DateRaw, YYYY } from '../../types/dates';
|
|
3
|
-
|
|
4
|
-
// Utils
|
|
5
|
-
import { isYYYY } from './isYYYY';
|
|
6
|
-
import { getYYYY } from './getDateSlice';
|
|
7
|
-
|
|
8
|
-
export const getValidAPIYear = (dateRaw: DateRaw): YYYY => {
|
|
9
|
-
const dateYYYY = getYYYY(dateRaw);
|
|
10
|
-
const today = new Date();
|
|
11
|
-
const todayYYYY = getYYYY(today.toISOString());
|
|
12
|
-
|
|
13
|
-
if (!isYYYY(dateYYYY) || !isYYYY(todayYYYY))
|
|
14
|
-
throw new Error('Failed to create valid year for API call.');
|
|
15
|
-
|
|
16
|
-
return +dateYYYY > +todayYYYY ? todayYYYY : dateYYYY;
|
|
17
|
-
};
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
export { isDateRawType } from './isDateRaw';
|
|
2
|
-
export { offsetDateString } from './offsetDateString';
|
|
3
|
-
export { isYYYY } from './isYYYY';
|
|
4
|
-
export { INPUT_DATE_MIN, INPUT_DATE_MAX } from './INPUT_DATE_MINMAX';
|
|
5
|
-
export {
|
|
6
|
-
YEAR_MIN_REGEX,
|
|
7
|
-
YEAR_MAX_REGEX,
|
|
8
|
-
YEAR_INCOMPLETE_REGEX,
|
|
9
|
-
} from './YEAR_REGEX';
|
|
10
|
-
export { getValidAPIYear } from './getValidAPIYear';
|
|
11
|
-
export {
|
|
12
|
-
getYYYY,
|
|
13
|
-
getYY,
|
|
14
|
-
getMM,
|
|
15
|
-
getDD,
|
|
16
|
-
getShortMonth,
|
|
17
|
-
getDateRaw,
|
|
18
|
-
} from './getDateSlice';
|
|
19
|
-
export { isShortMonth } from './isShortMonth';
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
// Types
|
|
2
|
-
import type { DateRaw } from '../../types/dates';
|
|
3
|
-
|
|
4
|
-
// Utils
|
|
5
|
-
import { inPrimitiveType } from '../misc';
|
|
6
|
-
import { getYYYY, getMM, getDD } from './getDateSlice';
|
|
7
|
-
|
|
8
|
-
export const isDateRawType = (s: string): s is DateRaw => {
|
|
9
|
-
if (!s) return false;
|
|
10
|
-
const year = getYYYY(s);
|
|
11
|
-
const month = getMM(s);
|
|
12
|
-
const day = getDD(s);
|
|
13
|
-
return (
|
|
14
|
-
inPrimitiveType(years, year) &&
|
|
15
|
-
inPrimitiveType(months, month) &&
|
|
16
|
-
inPrimitiveType(days, day)
|
|
17
|
-
);
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
export const years = [
|
|
21
|
-
'2021',
|
|
22
|
-
'2022',
|
|
23
|
-
'2023',
|
|
24
|
-
'2024',
|
|
25
|
-
'2025',
|
|
26
|
-
'2026',
|
|
27
|
-
'2027',
|
|
28
|
-
'2028',
|
|
29
|
-
'2029',
|
|
30
|
-
'2030',
|
|
31
|
-
'2031',
|
|
32
|
-
'2032',
|
|
33
|
-
'2033',
|
|
34
|
-
'2034',
|
|
35
|
-
'2035',
|
|
36
|
-
'2036',
|
|
37
|
-
'2037',
|
|
38
|
-
'2038',
|
|
39
|
-
'2039',
|
|
40
|
-
'2040',
|
|
41
|
-
] as const;
|
|
42
|
-
|
|
43
|
-
const months: string[] = [
|
|
44
|
-
'01',
|
|
45
|
-
'02',
|
|
46
|
-
'03',
|
|
47
|
-
'04',
|
|
48
|
-
'05',
|
|
49
|
-
'06',
|
|
50
|
-
'07',
|
|
51
|
-
'08',
|
|
52
|
-
'09',
|
|
53
|
-
'10',
|
|
54
|
-
'11',
|
|
55
|
-
'12',
|
|
56
|
-
] as const;
|
|
57
|
-
|
|
58
|
-
const days: string[] = [
|
|
59
|
-
'01',
|
|
60
|
-
'02',
|
|
61
|
-
'03',
|
|
62
|
-
'04',
|
|
63
|
-
'05',
|
|
64
|
-
'06',
|
|
65
|
-
'07',
|
|
66
|
-
'08',
|
|
67
|
-
'09',
|
|
68
|
-
'10',
|
|
69
|
-
'11',
|
|
70
|
-
'12',
|
|
71
|
-
'13',
|
|
72
|
-
'14',
|
|
73
|
-
'15',
|
|
74
|
-
'16',
|
|
75
|
-
'17',
|
|
76
|
-
'18',
|
|
77
|
-
'19',
|
|
78
|
-
'20',
|
|
79
|
-
'21',
|
|
80
|
-
'22',
|
|
81
|
-
'23',
|
|
82
|
-
'24',
|
|
83
|
-
'25',
|
|
84
|
-
'26',
|
|
85
|
-
'27',
|
|
86
|
-
'28',
|
|
87
|
-
'29',
|
|
88
|
-
'30',
|
|
89
|
-
'31',
|
|
90
|
-
] as const;
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
// Types
|
|
2
|
-
import type { ShortMonth } from '../../types/dates';
|
|
3
|
-
|
|
4
|
-
// Utils
|
|
5
|
-
import { inPrimitiveType } from '../misc';
|
|
6
|
-
|
|
7
|
-
export const isShortMonth = (s: string): s is ShortMonth => {
|
|
8
|
-
return inPrimitiveType(shortMonths, s);
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
const shortMonths = [
|
|
12
|
-
'Jan',
|
|
13
|
-
'Feb',
|
|
14
|
-
'Mar',
|
|
15
|
-
'Apr',
|
|
16
|
-
'May',
|
|
17
|
-
'Jun',
|
|
18
|
-
'Jul',
|
|
19
|
-
'Aug',
|
|
20
|
-
'Sep',
|
|
21
|
-
'Oct',
|
|
22
|
-
'Nov',
|
|
23
|
-
'Dec',
|
|
24
|
-
] as const;
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
// Types
|
|
2
|
-
import { DateRaw } from '../../types/dates';
|
|
3
|
-
|
|
4
|
-
// Utils
|
|
5
|
-
import { isDateRawType } from './isDateRaw';
|
|
6
|
-
import { getDateRaw } from './getDateSlice';
|
|
7
|
-
|
|
8
|
-
export const offsetDateString = (
|
|
9
|
-
dateRaw: DateRaw,
|
|
10
|
-
offset: number | null = null,
|
|
11
|
-
): DateRaw => {
|
|
12
|
-
const date = new Date(dateRaw);
|
|
13
|
-
if (offset) date.setUTCDate(date.getUTCDate() + offset);
|
|
14
|
-
const result = getDateRaw(date.toISOString());
|
|
15
|
-
if (!isDateRawType(result)) throw new Error('Failed to create valid date');
|
|
16
|
-
return result;
|
|
17
|
-
};
|