@develia/commons 0.4.2 → 0.4.4
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/cjs/browser/index.js +129 -0
- package/dist/cjs/browser/index.js.map +1 -0
- package/dist/cjs/index.js +4 -3
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/type-code.js +18 -0
- package/dist/cjs/type-code.js.map +1 -0
- package/dist/cjs/type.js +212 -12
- package/dist/cjs/type.js.map +1 -1
- package/dist/cjs/utilities.js +34 -127
- package/dist/cjs/utilities.js.map +1 -1
- package/dist/esm/browser/index.js +122 -0
- package/dist/esm/browser/index.js.map +1 -0
- package/dist/esm/index.js +2 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/type-code.js +16 -0
- package/dist/esm/type-code.js.map +1 -0
- package/dist/esm/type.js +209 -12
- package/dist/esm/type.js.map +1 -1
- package/dist/esm/utilities.js +33 -122
- package/dist/esm/utilities.js.map +1 -1
- package/dist/types/browser/index.d.ts +7 -0
- package/dist/types/browser/index.d.ts.map +1 -0
- package/dist/types/index.d.ts +2 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/patch.d.ts +3 -3
- package/dist/types/patch.d.ts.map +1 -1
- package/dist/types/type-code.d.ts +15 -0
- package/dist/types/type-code.d.ts.map +1 -0
- package/dist/types/type.d.ts +45 -11
- package/dist/types/type.d.ts.map +1 -1
- package/dist/types/types.d.ts +1 -2
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/utilities.d.ts +2 -6
- package/dist/types/utilities.d.ts.map +1 -1
- package/dist/web/browser/index.js +123 -0
- package/dist/web/browser/index.js.map +1 -0
- package/dist/web/index.js +2 -1
- package/dist/web/index.js.map +1 -1
- package/dist/web/type-code.js +16 -0
- package/dist/web/type-code.js.map +1 -0
- package/dist/web/type.js +210 -12
- package/dist/web/type.js.map +1 -1
- package/dist/web/utilities.js +33 -122
- package/dist/web/utilities.js.map +1 -1
- package/package.json +1 -1
- package/src/browser/index.ts +172 -0
- package/src/index.ts +15 -13
- package/src/patch.ts +3 -3
- package/src/type-code.ts +16 -0
- package/src/type.ts +370 -17
- package/src/types.ts +1 -5
- package/src/utilities.ts +38 -169
- package/dist/cjs/remote-data.js +0 -115
- package/dist/cjs/remote-data.js.map +0 -1
- package/dist/esm/remote-data.js +0 -112
- package/dist/esm/remote-data.js.map +0 -1
- package/dist/types/remote-data.d.ts +0 -32
- package/dist/types/remote-data.d.ts.map +0 -1
- package/dist/web/remote-data.js +0 -112
- package/dist/web/remote-data.js.map +0 -1
- package/src/remote-data.ts +0 -149
package/dist/web/type.js
CHANGED
|
@@ -1,14 +1,212 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
1
|
+
import TypeCode from "./type-code.js";
|
|
2
|
+
import {} from "./types.js";
|
|
3
|
+
class Type {
|
|
4
|
+
constructor(name, constructorRef, typeCode) {
|
|
5
|
+
this.name = name;
|
|
6
|
+
this.constructorRef = constructorRef;
|
|
7
|
+
this.typeCode = typeCode;
|
|
8
|
+
}
|
|
9
|
+
static of(target) {
|
|
10
|
+
if (target === null)
|
|
11
|
+
return Type.Null;
|
|
12
|
+
if (target === undefined)
|
|
13
|
+
return Type.Undefined;
|
|
14
|
+
const jsType = typeof target;
|
|
15
|
+
if (jsType !== 'object' && jsType !== 'function') {
|
|
16
|
+
return this._getOrCreate(jsType, undefined, jsType);
|
|
17
|
+
}
|
|
18
|
+
if (jsType === 'function') {
|
|
19
|
+
return this._resolveFunction(target);
|
|
20
|
+
}
|
|
21
|
+
if (Array.isArray(target)) {
|
|
22
|
+
return Type.Array;
|
|
23
|
+
}
|
|
24
|
+
return this._resolveObject(target);
|
|
25
|
+
}
|
|
26
|
+
static _resolveFunction(fn) {
|
|
27
|
+
const isConstructor = this._isConstructorLike(fn);
|
|
28
|
+
if (isConstructor) {
|
|
29
|
+
return this._getOrCreate(fn, fn, TypeCode.Object, fn.name || 'AnonymousClass');
|
|
30
|
+
}
|
|
31
|
+
return Type.Function;
|
|
32
|
+
}
|
|
33
|
+
static _resolveObject(obj) {
|
|
34
|
+
const proto = Object.getPrototypeOf(obj);
|
|
35
|
+
const ctor = proto?.constructor;
|
|
36
|
+
const name = ctor?.name || 'Object';
|
|
37
|
+
if (!ctor || ctor === Object) {
|
|
38
|
+
return Type.Object;
|
|
39
|
+
}
|
|
40
|
+
return this._getOrCreate(ctor, ctor, TypeCode.Object, name);
|
|
41
|
+
}
|
|
42
|
+
static _isConstructorLike(fn) {
|
|
43
|
+
try {
|
|
44
|
+
if (fn.toString().startsWith('class '))
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
}
|
|
49
|
+
if (fn === Object || fn === Function || fn === Array)
|
|
50
|
+
return true;
|
|
51
|
+
const proto = fn.prototype;
|
|
52
|
+
if (!proto || typeof proto !== 'object')
|
|
53
|
+
return false;
|
|
54
|
+
const ownKeys = Object.getOwnPropertyNames(proto);
|
|
55
|
+
return ownKeys.length > 1 || (ownKeys.length === 1 && ownKeys[0] !== 'constructor');
|
|
56
|
+
}
|
|
57
|
+
get isPrimitive() {
|
|
58
|
+
return (this.typeCode === TypeCode.String ||
|
|
59
|
+
this.typeCode === TypeCode.Number ||
|
|
60
|
+
this.typeCode === TypeCode.Boolean ||
|
|
61
|
+
this.typeCode === TypeCode.Symbol ||
|
|
62
|
+
this.typeCode === TypeCode.BigInt);
|
|
63
|
+
}
|
|
64
|
+
get isNullish() {
|
|
65
|
+
return this.typeCode === TypeCode.Null || this.typeCode === TypeCode.Undefined;
|
|
66
|
+
}
|
|
67
|
+
get isReferenceType() {
|
|
68
|
+
return !this.isPrimitive && !this.isNullish;
|
|
69
|
+
}
|
|
70
|
+
get isArray() {
|
|
71
|
+
return this.typeCode === TypeCode.Array ||
|
|
72
|
+
this.constructorRef === Array;
|
|
73
|
+
}
|
|
74
|
+
get isFunction() {
|
|
75
|
+
return this.typeCode === TypeCode.Function;
|
|
76
|
+
}
|
|
77
|
+
get isValueType() {
|
|
78
|
+
return this.isPrimitive;
|
|
79
|
+
}
|
|
80
|
+
get isClass() {
|
|
81
|
+
if (!this.constructorRef)
|
|
82
|
+
return false;
|
|
83
|
+
try {
|
|
84
|
+
return this.constructorRef.toString().startsWith('class ');
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
get fullName() {
|
|
91
|
+
if (this.isPrimitive || this.isNullish) {
|
|
92
|
+
return `System.${this.name.charAt(0).toUpperCase()}${this.name.slice(1)}`;
|
|
93
|
+
}
|
|
94
|
+
return this.name;
|
|
95
|
+
}
|
|
96
|
+
get baseType() {
|
|
97
|
+
if (!this.constructorRef)
|
|
98
|
+
return undefined;
|
|
99
|
+
const parentProto = Object.getPrototypeOf(this.constructorRef.prototype);
|
|
100
|
+
if (!parentProto || parentProto === Object.prototype) {
|
|
101
|
+
return this === Type.Object ? undefined : Type.Object;
|
|
102
|
+
}
|
|
103
|
+
const parentCtor = parentProto.constructor;
|
|
104
|
+
return Type.of(parentCtor);
|
|
105
|
+
}
|
|
106
|
+
getInheritanceChain() {
|
|
107
|
+
const chain = [this];
|
|
108
|
+
let current = this.baseType;
|
|
109
|
+
while (current && !chain.includes(current)) {
|
|
110
|
+
chain.push(current);
|
|
111
|
+
current = current.baseType;
|
|
112
|
+
}
|
|
113
|
+
return Object.freeze(chain);
|
|
114
|
+
}
|
|
115
|
+
isAssignableTo(target) {
|
|
116
|
+
if (this === target)
|
|
117
|
+
return true;
|
|
118
|
+
if (!this.constructorRef || !target.constructorRef)
|
|
119
|
+
return false;
|
|
120
|
+
let proto = this.constructorRef.prototype;
|
|
121
|
+
while (proto) {
|
|
122
|
+
if (proto.constructor === target.constructorRef)
|
|
123
|
+
return true;
|
|
124
|
+
proto = Object.getPrototypeOf(proto);
|
|
125
|
+
}
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
isAssignableFrom(source) {
|
|
129
|
+
return source.isAssignableTo(this);
|
|
130
|
+
}
|
|
131
|
+
isSubclassOf(parent) {
|
|
132
|
+
if (this === parent)
|
|
133
|
+
return false;
|
|
134
|
+
return this.isAssignableTo(parent);
|
|
135
|
+
}
|
|
136
|
+
getMethodNames() {
|
|
137
|
+
if (!this.constructorRef?.prototype)
|
|
138
|
+
return Object.freeze([]);
|
|
139
|
+
return Object.freeze(Object.getOwnPropertyNames(this.constructorRef.prototype)
|
|
140
|
+
.filter(n => n !== 'constructor' &&
|
|
141
|
+
typeof Object.getOwnPropertyDescriptor(this.constructorRef.prototype, n)?.value === 'function'));
|
|
142
|
+
}
|
|
143
|
+
getPropertyNames() {
|
|
144
|
+
if (!this.constructorRef?.prototype)
|
|
145
|
+
return Object.freeze([]);
|
|
146
|
+
return Object.freeze(Object.getOwnPropertyNames(this.constructorRef.prototype)
|
|
147
|
+
.filter(n => n !== 'constructor' &&
|
|
148
|
+
typeof Object.getOwnPropertyDescriptor(this.constructorRef.prototype, n)?.value !== 'function'));
|
|
149
|
+
}
|
|
150
|
+
getMemberNames() {
|
|
151
|
+
if (!this.constructorRef?.prototype)
|
|
152
|
+
return Object.freeze([]);
|
|
153
|
+
return Object.freeze(Object.getOwnPropertyNames(this.constructorRef.prototype)
|
|
154
|
+
.filter(n => n !== 'constructor'));
|
|
155
|
+
}
|
|
156
|
+
hasMethod(name) {
|
|
157
|
+
if (!this.constructorRef?.prototype)
|
|
158
|
+
return false;
|
|
159
|
+
return typeof this.constructorRef.prototype[name] === 'function';
|
|
160
|
+
}
|
|
161
|
+
hasProperty(name) {
|
|
162
|
+
if (!this.constructorRef?.prototype)
|
|
163
|
+
return false;
|
|
164
|
+
return name in this.constructorRef.prototype && !this.hasMethod(name);
|
|
165
|
+
}
|
|
166
|
+
getStaticMemberNames() {
|
|
167
|
+
if (!this.constructorRef)
|
|
168
|
+
return Object.freeze([]);
|
|
169
|
+
const skip = new Set(['prototype', 'length', 'name', 'caller', 'arguments']);
|
|
170
|
+
return Object.freeze(Object.getOwnPropertyNames(this.constructorRef)
|
|
171
|
+
.filter(n => !skip.has(n)));
|
|
172
|
+
}
|
|
173
|
+
toString() {
|
|
174
|
+
return `Type [${this.name}]`;
|
|
175
|
+
}
|
|
176
|
+
[Symbol.toPrimitive](hint) {
|
|
177
|
+
let hash = 0;
|
|
178
|
+
for (let i = 0; i < this.name.length; i++) {
|
|
179
|
+
hash = ((hash << 5) - hash + this.name.charCodeAt(i)) | 0;
|
|
180
|
+
}
|
|
181
|
+
return hint === 'number' ? hash : this.toString();
|
|
182
|
+
}
|
|
183
|
+
get [Symbol.toStringTag]() {
|
|
184
|
+
return `Type<${this.name}>`;
|
|
185
|
+
}
|
|
186
|
+
static _getOrCreate(key, constructorRef, typeCode, customName) {
|
|
187
|
+
const cached = this._cache.get(key);
|
|
188
|
+
if (cached)
|
|
189
|
+
return cached;
|
|
190
|
+
const name = customName
|
|
191
|
+
?? (typeof key === 'string' ? key : 'unknown');
|
|
192
|
+
const ref = typeof constructorRef === 'function'
|
|
193
|
+
? constructorRef
|
|
194
|
+
: undefined;
|
|
195
|
+
const instance = new Type(name, ref, typeCode);
|
|
196
|
+
this._cache.set(key, instance);
|
|
197
|
+
return instance;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
Type._cache = new Map();
|
|
201
|
+
Type.String = Type._getOrCreate('string', undefined, TypeCode.String, 'string');
|
|
202
|
+
Type.Number = Type._getOrCreate('number', undefined, TypeCode.Number, 'number');
|
|
203
|
+
Type.Boolean = Type._getOrCreate('boolean', undefined, TypeCode.Boolean, 'boolean');
|
|
204
|
+
Type.Symbol = Type._getOrCreate('symbol', undefined, TypeCode.Symbol, 'symbol');
|
|
205
|
+
Type.BigInt = Type._getOrCreate('bigint', undefined, TypeCode.BigInt, 'bigint');
|
|
206
|
+
Type.Null = Type._getOrCreate('null', undefined, TypeCode.Null, 'null');
|
|
207
|
+
Type.Undefined = Type._getOrCreate('undefined', undefined, TypeCode.Undefined, 'undefined');
|
|
208
|
+
Type.Object = Type._getOrCreate(Object, Object, TypeCode.Object, 'Object');
|
|
209
|
+
Type.Function = Type._getOrCreate(Function, Function, TypeCode.Function, 'Function');
|
|
210
|
+
Type.Array = Type._getOrCreate(Array, Array, TypeCode.Array, 'Array');
|
|
13
211
|
export default Type;
|
|
14
212
|
//# sourceMappingURL=type.js.map
|
package/dist/web/type.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type.js","sourceRoot":"","sources":["../../src/type.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"type.js","sourceRoot":"","sources":["../../src/type.ts"],"names":[],"mappings":"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"}
|
package/dist/web/utilities.js
CHANGED
|
@@ -1,5 +1,37 @@
|
|
|
1
1
|
import KeyValuePair from "./key-value-pair.js";
|
|
2
2
|
import Type from "./type.js";
|
|
3
|
+
export function lazy(factory) {
|
|
4
|
+
let instance = null;
|
|
5
|
+
const getInstance = () => {
|
|
6
|
+
if (!instance) {
|
|
7
|
+
instance = factory();
|
|
8
|
+
}
|
|
9
|
+
return instance;
|
|
10
|
+
};
|
|
11
|
+
return new Proxy({}, {
|
|
12
|
+
get(_, prop, receiver) {
|
|
13
|
+
return Reflect.get(getInstance(), prop, receiver);
|
|
14
|
+
},
|
|
15
|
+
set(_, prop, value, receiver) {
|
|
16
|
+
return Reflect.set(getInstance(), prop, value, receiver);
|
|
17
|
+
},
|
|
18
|
+
has(_, prop) {
|
|
19
|
+
return Reflect.has(getInstance(), prop);
|
|
20
|
+
},
|
|
21
|
+
deleteProperty(_, prop) {
|
|
22
|
+
return Reflect.deleteProperty(getInstance(), prop);
|
|
23
|
+
},
|
|
24
|
+
ownKeys() {
|
|
25
|
+
return Reflect.ownKeys(getInstance());
|
|
26
|
+
},
|
|
27
|
+
getOwnPropertyDescriptor(_, prop) {
|
|
28
|
+
return Reflect.getOwnPropertyDescriptor(getInstance(), prop);
|
|
29
|
+
},
|
|
30
|
+
getPrototypeOf() {
|
|
31
|
+
return Reflect.getPrototypeOf(getInstance());
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
}
|
|
3
35
|
export function isIterable(obj) {
|
|
4
36
|
return obj[Symbol.iterator] === 'function';
|
|
5
37
|
}
|
|
@@ -54,43 +86,6 @@ export function deepEqual(a, b) {
|
|
|
54
86
|
}
|
|
55
87
|
return false;
|
|
56
88
|
}
|
|
57
|
-
export function submitForm(url, data, method = 'POST', target) {
|
|
58
|
-
const form = document.createElement('form');
|
|
59
|
-
form.method = method.toUpperCase();
|
|
60
|
-
form.action = url;
|
|
61
|
-
form.style.display = 'none';
|
|
62
|
-
if (target) {
|
|
63
|
-
form.target = target;
|
|
64
|
-
}
|
|
65
|
-
const appendInputs = (keyPrefix, value) => {
|
|
66
|
-
if (Array.isArray(value)) {
|
|
67
|
-
value.forEach(val => {
|
|
68
|
-
appendInputs(`${keyPrefix}[]`, val);
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
else if (typeof value === 'object' && value !== null) {
|
|
72
|
-
for (const subKey in value) {
|
|
73
|
-
if (value.hasOwnProperty(subKey)) {
|
|
74
|
-
appendInputs(`${keyPrefix}[${subKey}]`, value[subKey]);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
const input = document.createElement('input');
|
|
80
|
-
input.type = 'hidden';
|
|
81
|
-
input.name = keyPrefix;
|
|
82
|
-
input.value = String(value);
|
|
83
|
-
form.appendChild(input);
|
|
84
|
-
}
|
|
85
|
-
};
|
|
86
|
-
for (const key in data) {
|
|
87
|
-
if (data.hasOwnProperty(key)) {
|
|
88
|
-
appendInputs(key, data[key]);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
document.body.appendChild(form);
|
|
92
|
-
form.submit();
|
|
93
|
-
}
|
|
94
89
|
export function shallowEqual(a, b) {
|
|
95
90
|
if (a === b) {
|
|
96
91
|
return true;
|
|
@@ -145,18 +140,6 @@ export function isEmptyOrWhitespace(value) {
|
|
|
145
140
|
(typeof value === 'string' && value.trim() === '') ||
|
|
146
141
|
value === null || typeof value === 'undefined';
|
|
147
142
|
}
|
|
148
|
-
export async function ajaxSubmit(selectorOrElement) {
|
|
149
|
-
const form = typeof selectorOrElement === 'string'
|
|
150
|
-
? document.querySelector(selectorOrElement)
|
|
151
|
-
: selectorOrElement;
|
|
152
|
-
if (!(form instanceof HTMLFormElement)) {
|
|
153
|
-
throw new Error("Invalid element.");
|
|
154
|
-
}
|
|
155
|
-
return await fetch(form.action, {
|
|
156
|
-
method: form.method,
|
|
157
|
-
body: new FormData(form),
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
143
|
export function toPairs(obj) {
|
|
161
144
|
let output = [];
|
|
162
145
|
for (const key in obj) {
|
|
@@ -180,24 +163,6 @@ export function promisify(thing) {
|
|
|
180
163
|
}
|
|
181
164
|
return Promise.resolve(thing);
|
|
182
165
|
}
|
|
183
|
-
export function ajaxSubmission(selectorOrElement, onSuccess = undefined, onFailure = undefined) {
|
|
184
|
-
const form = typeof selectorOrElement === 'string'
|
|
185
|
-
? document.querySelector(selectorOrElement)
|
|
186
|
-
: selectorOrElement;
|
|
187
|
-
if (!(form instanceof HTMLFormElement)) {
|
|
188
|
-
return;
|
|
189
|
-
}
|
|
190
|
-
form.addEventListener('submit', async (event) => {
|
|
191
|
-
event.preventDefault();
|
|
192
|
-
let promise = ajaxSubmit(form);
|
|
193
|
-
if (promise) {
|
|
194
|
-
if (onSuccess)
|
|
195
|
-
promise = promise.then(onSuccess);
|
|
196
|
-
if (onFailure)
|
|
197
|
-
promise.catch(onFailure);
|
|
198
|
-
}
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
166
|
export function deepClone(obj) {
|
|
202
167
|
if (obj === null || typeof obj !== 'object') {
|
|
203
168
|
return obj;
|
|
@@ -218,60 +183,6 @@ export function deepClone(obj) {
|
|
|
218
183
|
return copy;
|
|
219
184
|
}
|
|
220
185
|
export function getType(value) {
|
|
221
|
-
return
|
|
222
|
-
}
|
|
223
|
-
export function formToObject(form) {
|
|
224
|
-
const fd = new FormData(form);
|
|
225
|
-
const out = {};
|
|
226
|
-
for (const [key, value] of fd.entries()) {
|
|
227
|
-
if (key in out) {
|
|
228
|
-
const current = out[key];
|
|
229
|
-
if (Array.isArray(current)) {
|
|
230
|
-
current.push(value);
|
|
231
|
-
}
|
|
232
|
-
else {
|
|
233
|
-
out[key] = [current, value];
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
else {
|
|
237
|
-
out[key] = value;
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
return out;
|
|
241
|
-
}
|
|
242
|
-
function _objectToFormData(data, formData, parentKey = '') {
|
|
243
|
-
for (const key in data) {
|
|
244
|
-
if (data.hasOwnProperty(key)) {
|
|
245
|
-
const value = data[key];
|
|
246
|
-
if (value instanceof Date) {
|
|
247
|
-
formData.append(parentKey ? `${parentKey}[${key}]` : key, value.toISOString());
|
|
248
|
-
}
|
|
249
|
-
else if (value instanceof File) {
|
|
250
|
-
formData.append(parentKey ? `${parentKey}[${key}]` : key, value);
|
|
251
|
-
}
|
|
252
|
-
else if (typeof value === 'object' && !Array.isArray(value)) {
|
|
253
|
-
_objectToFormData(value, formData, parentKey ? `${parentKey}[${key}]` : key);
|
|
254
|
-
}
|
|
255
|
-
else if (Array.isArray(value)) {
|
|
256
|
-
value.forEach((item, index) => {
|
|
257
|
-
const arrayKey = `${parentKey ? `${parentKey}[${key}]` : key}[${index}]`;
|
|
258
|
-
if (typeof item === 'object' && !Array.isArray(item)) {
|
|
259
|
-
_objectToFormData(item, formData, arrayKey);
|
|
260
|
-
}
|
|
261
|
-
else {
|
|
262
|
-
formData.append(arrayKey, item);
|
|
263
|
-
}
|
|
264
|
-
});
|
|
265
|
-
}
|
|
266
|
-
else {
|
|
267
|
-
formData.append(parentKey ? `${parentKey}[${key}]` : key, value);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
return formData;
|
|
272
|
-
}
|
|
273
|
-
export function objectToFormData(data) {
|
|
274
|
-
let formData = new FormData();
|
|
275
|
-
return _objectToFormData(data, formData);
|
|
186
|
+
return Type.of(value);
|
|
276
187
|
}
|
|
277
188
|
//# sourceMappingURL=utilities.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utilities.js","sourceRoot":"","sources":["../../src/utilities.ts"],"names":[],"mappings":"AAGA,OAAO,YAAY,MAAM,qBAAqB,CAAC;AAE/C,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"utilities.js","sourceRoot":"","sources":["../../src/utilities.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import {type Optional, type Supplier} from "../types.js";
|
|
2
|
+
|
|
3
|
+
export function submitForm(
|
|
4
|
+
url: string,
|
|
5
|
+
data: Record<string, any>,
|
|
6
|
+
method: 'POST' | 'GET' = 'POST',
|
|
7
|
+
target?: '_blank' | '_self' | '_parent' | '_top'
|
|
8
|
+
): void {
|
|
9
|
+
|
|
10
|
+
const form = document.createElement('form');
|
|
11
|
+
form.method = method.toUpperCase();
|
|
12
|
+
form.action = url;
|
|
13
|
+
form.style.display = 'none';
|
|
14
|
+
|
|
15
|
+
if (target) {
|
|
16
|
+
form.target = target;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Recursively appends inputs to the form, supporting nested keys and arrays.
|
|
21
|
+
* @param keyPrefix - Key path, e.g., 'user[name]' or 'tags[]'
|
|
22
|
+
* @param value - The value to append (can be nested)
|
|
23
|
+
*/
|
|
24
|
+
const appendInputs = (keyPrefix: string, value: any) => {
|
|
25
|
+
if (Array.isArray(value)) {
|
|
26
|
+
value.forEach(val => {
|
|
27
|
+
appendInputs(`${keyPrefix}[]`, val);
|
|
28
|
+
});
|
|
29
|
+
} else if (typeof value === 'object' && value !== null) {
|
|
30
|
+
for (const subKey in value) {
|
|
31
|
+
if (value.hasOwnProperty(subKey)) {
|
|
32
|
+
appendInputs(`${keyPrefix}[${subKey}]`, value[subKey]);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
} else {
|
|
36
|
+
const input = document.createElement('input');
|
|
37
|
+
input.type = 'hidden';
|
|
38
|
+
input.name = keyPrefix;
|
|
39
|
+
input.value = String(value);
|
|
40
|
+
form.appendChild(input);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
for (const key in data) {
|
|
45
|
+
if (data.hasOwnProperty(key)) {
|
|
46
|
+
appendInputs(key, data[key]);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
document.body.appendChild(form);
|
|
51
|
+
form.submit();
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function formToObject(form: HTMLFormElement): Record<string, FormDataEntryValue | FormDataEntryValue[]> {
|
|
55
|
+
const fd = new FormData(form);
|
|
56
|
+
const out: Record<string, FormDataEntryValue | FormDataEntryValue[]> = {};
|
|
57
|
+
|
|
58
|
+
for (const [key, value] of fd.entries()) {
|
|
59
|
+
if (key in out) {
|
|
60
|
+
const current = out[key];
|
|
61
|
+
if (Array.isArray(current)) {
|
|
62
|
+
current.push(value);
|
|
63
|
+
} else {
|
|
64
|
+
out[key] = [current, value];
|
|
65
|
+
}
|
|
66
|
+
} else {
|
|
67
|
+
out[key] = value;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return out;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Converts an object to `FormData` format recursively.
|
|
76
|
+
*
|
|
77
|
+
* @param {Record<string, any>} data - The object data to convert.
|
|
78
|
+
* @param {FormData} formData - The `FormData` instance to append data to.
|
|
79
|
+
* @param {string} parentKey - The parent key to append to child keys in the `FormData`.
|
|
80
|
+
* @returns {FormData} - The `FormData` instance with the converted data.
|
|
81
|
+
*/
|
|
82
|
+
function _objectToFormData(data: Record<string, any>, formData: FormData, parentKey: string = ''): FormData {
|
|
83
|
+
|
|
84
|
+
for (const key in data) {
|
|
85
|
+
if (data.hasOwnProperty(key)) {
|
|
86
|
+
const value = data[key];
|
|
87
|
+
|
|
88
|
+
if (value instanceof Date) {
|
|
89
|
+
formData.append(parentKey ? `${parentKey}[${key}]` : key, value.toISOString());
|
|
90
|
+
} else if (value instanceof File) {
|
|
91
|
+
formData.append(parentKey ? `${parentKey}[${key}]` : key, value);
|
|
92
|
+
} else if (typeof value === 'object' && !Array.isArray(value)) {
|
|
93
|
+
_objectToFormData(value, formData, parentKey ? `${parentKey}[${key}]` : key);
|
|
94
|
+
} else if (Array.isArray(value)) {
|
|
95
|
+
value.forEach((item, index) => {
|
|
96
|
+
const arrayKey = `${parentKey ? `${parentKey}[${key}]` : key}[${index}]`;
|
|
97
|
+
if (typeof item === 'object' && !Array.isArray(item)) {
|
|
98
|
+
_objectToFormData(item, formData, arrayKey);
|
|
99
|
+
} else {
|
|
100
|
+
formData.append(arrayKey, item);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
} else {
|
|
104
|
+
formData.append(parentKey ? `${parentKey}[${key}]` : key, value);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return formData;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Converts an object into FormData.
|
|
114
|
+
*
|
|
115
|
+
* @param {Record<string, any>} data - The object to be converted into FormData.
|
|
116
|
+
* @return {FormData} - The FormData object representing the converted data.
|
|
117
|
+
*/
|
|
118
|
+
export function objectToFormData(data: Record<string, any>): FormData {
|
|
119
|
+
let formData = new FormData();
|
|
120
|
+
return _objectToFormData(data, formData);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export function ajaxSubmission(selectorOrElement: HTMLFormElement | string,
|
|
124
|
+
onSuccess: Optional<Supplier<any>> = undefined,
|
|
125
|
+
onFailure: Optional<Supplier<any>> = undefined): void {
|
|
126
|
+
|
|
127
|
+
const form = typeof selectorOrElement === 'string'
|
|
128
|
+
? document.querySelector(selectorOrElement)
|
|
129
|
+
: selectorOrElement;
|
|
130
|
+
|
|
131
|
+
if (!(form instanceof HTMLFormElement)) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
form.addEventListener('submit', async (event) => {
|
|
136
|
+
event.preventDefault();
|
|
137
|
+
let promise = ajaxSubmit(form);
|
|
138
|
+
if (promise) {
|
|
139
|
+
if (onSuccess)
|
|
140
|
+
promise = promise.then(onSuccess);
|
|
141
|
+
if (onFailure)
|
|
142
|
+
promise.catch(onFailure);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Submits a form via AJAX and returns a Promise that resolves to the Response object.
|
|
152
|
+
*
|
|
153
|
+
* @param {HTMLFormElement | string} selectorOrElement - The form element or selector.
|
|
154
|
+
* @return {Promise<Response>} A Promise that resolves to the Response object.
|
|
155
|
+
* @throws {Error} If the element is invalid.
|
|
156
|
+
*/
|
|
157
|
+
export async function ajaxSubmit(selectorOrElement: HTMLFormElement | string): Promise<Response> {
|
|
158
|
+
|
|
159
|
+
const form = typeof selectorOrElement === 'string'
|
|
160
|
+
? document.querySelector(selectorOrElement)
|
|
161
|
+
: selectorOrElement;
|
|
162
|
+
|
|
163
|
+
if (!(form instanceof HTMLFormElement)) {
|
|
164
|
+
throw new Error("Invalid element.");
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Crear un objeto FormData a partir del formulario
|
|
168
|
+
return await fetch(form.action, {
|
|
169
|
+
method: form.method,
|
|
170
|
+
body: new FormData(form),
|
|
171
|
+
});
|
|
172
|
+
}
|