adaptform 2.0.2 → 2.0.3

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/luxon.mjs ADDED
@@ -0,0 +1,120 @@
1
+ import { DateTime } from 'luxon';
2
+
3
+ // src/core/types/DateLuxonType.ts
4
+
5
+ // src/core/types/FieldType.ts
6
+ var FieldType = class {
7
+ constructor(options) {
8
+ this.options = {
9
+ isRequired: true,
10
+ messages: {},
11
+ ...options
12
+ };
13
+ }
14
+ };
15
+
16
+ // src/core/types/DateLuxonType.ts
17
+ var DateLuxonType = class extends FieldType {
18
+ cast(rawValue) {
19
+ if (rawValue === null || rawValue === void 0) return null;
20
+ if (rawValue instanceof DateTime) {
21
+ return rawValue.isValid ? this.normalize(rawValue) : null;
22
+ }
23
+ if (rawValue instanceof Date) {
24
+ if (isNaN(rawValue.getTime())) return null;
25
+ return DateTime.fromJSDate(rawValue);
26
+ }
27
+ if (typeof rawValue === "number") {
28
+ const dt = DateTime.fromMillis(rawValue);
29
+ return dt.isValid ? this.normalize(dt) : null;
30
+ }
31
+ if (typeof rawValue === "string") {
32
+ return this.parseString(rawValue);
33
+ }
34
+ return null;
35
+ }
36
+ parseString(dateString) {
37
+ if (!dateString || !dateString.trim()) return null;
38
+ const trimmed = dateString.trim();
39
+ if (this.options.inputFormat) {
40
+ const dt = DateTime.fromFormat(trimmed, this.options.inputFormat);
41
+ return dt.isValid ? this.normalize(dt) : null;
42
+ }
43
+ const isoDt = DateTime.fromISO(trimmed);
44
+ if (isoDt.isValid) return this.normalize(isoDt);
45
+ const httpDt = DateTime.fromHTTP(trimmed);
46
+ if (httpDt.isValid) return this.normalize(httpDt);
47
+ const rfcDt = DateTime.fromRFC2822(trimmed);
48
+ if (rfcDt.isValid) return this.normalize(rfcDt);
49
+ return null;
50
+ }
51
+ normalize(date) {
52
+ let normalize_dt = date;
53
+ if (!this.options.isDatetime) {
54
+ normalize_dt = DateTime.fromObject({
55
+ day: date.day,
56
+ month: date.month,
57
+ year: date.year,
58
+ hour: 0,
59
+ minute: 0,
60
+ second: 0,
61
+ millisecond: 0
62
+ });
63
+ }
64
+ return normalize_dt;
65
+ }
66
+ validate(value) {
67
+ const errors = [];
68
+ if (!value.isValid) {
69
+ errors.push(
70
+ this.options.messages?.invalid ?? `\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u0434\u0430\u0442\u0430: ${value.invalidExplanation}`
71
+ );
72
+ return errors;
73
+ }
74
+ if (this.options.minDate) {
75
+ const minDate = this.normalizeForComparison(this.options.minDate);
76
+ const compareValue = this.normalizeForComparison(value);
77
+ if (compareValue < minDate) {
78
+ errors.push(
79
+ this.options.messages?.minDate ?? `\u0414\u0430\u0442\u0430 \u0434\u043E\u043B\u0436\u043D\u0430 \u0431\u044B\u0442\u044C \u043D\u0435 \u0440\u0430\u043D\u0435\u0435 ${this.formatDateTime(this.options.minDate)}`
80
+ );
81
+ }
82
+ }
83
+ if (this.options.maxDate) {
84
+ const maxDate = this.normalizeForComparison(this.options.maxDate);
85
+ const compareValue = this.normalizeForComparison(value);
86
+ if (compareValue > maxDate) {
87
+ errors.push(
88
+ this.options.messages?.maxDate ?? `\u0414\u0430\u0442\u0430 \u0434\u043E\u043B\u0436\u043D\u0430 \u0431\u044B\u0442\u044C \u043D\u0435 \u043F\u043E\u0437\u0434\u043D\u0435\u0435 ${this.formatDateTime(this.options.maxDate)}`
89
+ );
90
+ }
91
+ }
92
+ const year = value.year;
93
+ if (year < 1900 || year > 2100) {
94
+ errors.push(this.options.messages?.invalid ?? "\u041D\u0435\u043A\u043E\u0440\u0440\u0435\u043A\u0442\u043D\u044B\u0439 \u0433\u043E\u0434");
95
+ }
96
+ return errors;
97
+ }
98
+ getTypeName() {
99
+ return this.options.isDatetime ? "\u0434\u0430\u0442\u0430 \u0438 \u0432\u0440\u0435\u043C\u044F" : "\u0434\u0430\u0442\u0430";
100
+ }
101
+ normalizeForComparison(dt) {
102
+ if (this.options.isDatetime) {
103
+ return dt;
104
+ }
105
+ return dt.startOf("day");
106
+ }
107
+ formatDateTime(dt) {
108
+ if (this.options.outputFormat) {
109
+ return dt.toFormat(this.options.outputFormat);
110
+ }
111
+ if (this.options.isDatetime) {
112
+ return dt.toFormat("dd.MM.yyyy HH:mm");
113
+ }
114
+ return dt.toFormat("dd.MM.yyyy");
115
+ }
116
+ };
117
+
118
+ export { DateLuxonType };
119
+ //# sourceMappingURL=luxon.mjs.map
120
+ //# sourceMappingURL=luxon.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/types/FieldType.ts","../src/core/types/DateLuxonType.ts"],"names":[],"mappings":"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","file":"luxon.mjs","sourcesContent":["import {FieldOptions} from \"@core/options\";\nimport {Form} from \"@core/Form\";\n\nexport abstract class FieldType<T, O extends FieldOptions = FieldOptions> {\n options: O\n\n constructor(options: O) {\n this.options = {\n isRequired: true,\n messages: {},\n ...options\n } as O\n }\n\n abstract cast(rawValue: any): T | null\n\n abstract validate(value: T, form?: Form): string[]\n\n abstract getTypeName(): string\n}","import {DateTime} from \"luxon\";\nimport {FieldType} from \"@core/types/FieldType\";\nimport {FieldOptions, messagesOptions} from \"@core/options\";\n\nexport interface messagesDateLuxonOptions extends messagesOptions {\n minDate?: string\n maxDate?: string\n}\n\nexport interface DateLuxonOptions extends FieldOptions {\n minDate?: DateTime\n maxDate?: DateTime\n inputFormat?: string\n outputFormat?: string\n isDatetime?: boolean\n messages?: messagesDateLuxonOptions\n}\n\nexport class DateLuxonType extends FieldType<DateTime, DateLuxonOptions> {\n cast(rawValue: any): DateTime | null {\n if (rawValue === null || rawValue === undefined) return null\n\n if (rawValue instanceof DateTime) {\n return rawValue.isValid ? this.normalize(rawValue) : null\n }\n\n if (rawValue instanceof Date) {\n if (isNaN(rawValue.getTime())) return null\n return DateTime.fromJSDate(rawValue)\n }\n\n if (typeof rawValue === 'number') {\n const dt = DateTime.fromMillis(rawValue)\n return dt.isValid ? this.normalize(dt) : null\n }\n\n if (typeof rawValue === 'string') {\n return this.parseString(rawValue)\n }\n\n return null\n }\n\n private parseString(dateString: string): DateTime | null {\n if (!dateString || !dateString.trim()) return null\n\n const trimmed = dateString.trim()\n\n if (this.options.inputFormat) {\n const dt = DateTime.fromFormat(trimmed, this.options.inputFormat)\n return dt.isValid ? this.normalize(dt) : null\n }\n\n const isoDt = DateTime.fromISO(trimmed)\n if (isoDt.isValid) return this.normalize(isoDt)\n\n const httpDt = DateTime.fromHTTP(trimmed)\n if (httpDt.isValid) return this.normalize(httpDt)\n\n const rfcDt = DateTime.fromRFC2822(trimmed)\n if (rfcDt.isValid) return this.normalize(rfcDt)\n\n return null\n }\n\n private normalize(date: DateTime): DateTime {\n let normalize_dt = date\n if (!this.options.isDatetime) {\n normalize_dt = DateTime.fromObject({\n day: date.day,\n month: date.month,\n year: date.year,\n hour: 0,\n minute: 0,\n second: 0,\n millisecond: 0\n })\n }\n\n return normalize_dt\n }\n\n validate(value: DateTime): string[] {\n const errors: string[] = []\n\n if (!value.isValid) {\n errors.push(\n this.options.messages?.invalid ??\n `Неверная дата: ${value.invalidExplanation}`\n )\n return errors\n }\n\n if (this.options.minDate) {\n const minDate = this.normalizeForComparison(this.options.minDate)\n const compareValue = this.normalizeForComparison(value)\n\n if (compareValue < minDate) {\n errors.push(\n this.options.messages?.minDate ??\n `Дата должна быть не ранее ${this.formatDateTime(this.options.minDate)}`\n )\n }\n }\n\n if (this.options.maxDate) {\n const maxDate = this.normalizeForComparison(this.options.maxDate)\n const compareValue = this.normalizeForComparison(value)\n\n if (compareValue > maxDate) {\n errors.push(\n this.options.messages?.maxDate ??\n `Дата должна быть не позднее ${this.formatDateTime(this.options.maxDate)}`\n )\n }\n }\n\n const year = value.year\n if (year < 1900 || year > 2100) {\n errors.push(this.options.messages?.invalid ?? 'Некорректный год')\n }\n\n return errors\n }\n\n getTypeName(): string {\n return this.options.isDatetime ? 'дата и время' : 'дата'\n }\n\n private normalizeForComparison(dt: DateTime): DateTime {\n if (this.options.isDatetime) {\n return dt\n }\n return dt.startOf('day')\n }\n\n private formatDateTime(dt: DateTime): string {\n if (this.options.outputFormat) {\n return dt.toFormat(this.options.outputFormat)\n }\n\n if (this.options.isDatetime) {\n return dt.toFormat('dd.MM.yyyy HH:mm')\n }\n\n return dt.toFormat('dd.MM.yyyy')\n }\n}"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "adaptform",
3
- "version": "2.0.2",
3
+ "version": "2.0.3",
4
4
  "description": "Library of adaptive forms of validation",
5
5
  "keywords": [
6
6
  "form",
@@ -22,11 +22,24 @@
22
22
  "exports": {
23
23
  ".": {
24
24
  "types": {
25
- "import": "./dist/index.d.ts",
26
- "require": "./dist/index.d.cts"
27
- },
28
- "import": "./dist/index.mjs",
29
- "require": "./dist/index.cjs"
25
+ "types": "./dist/index.d.ts",
26
+ "import": "./dist/index.mjs",
27
+ "require": "./dist/index.cjs"
28
+ }
29
+ },
30
+ "./luxon": {
31
+ "types": {
32
+ "types": "./dist/luxon.d.ts",
33
+ "import": "./dist/luxon.mjs",
34
+ "require": "./dist/luxon.cjs"
35
+ }
36
+ }
37
+ },
38
+ "typesVersions": {
39
+ "*": {
40
+ "luxon": [
41
+ "./dist/luxon.d.ts"
42
+ ]
30
43
  }
31
44
  },
32
45
  "files": [