@windwalker-io/unicorn-next 0.1.19 → 0.1.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/dist/chunks/_arrayPush.js +325 -108
- package/dist/chunks/_arrayPush.js.map +1 -1
- package/dist/chunks/_baseRest.js +155 -60
- package/dist/chunks/_baseRest.js.map +1 -1
- package/dist/chunks/_baseUnary.js +463 -0
- package/dist/chunks/_baseUnary.js.map +1 -0
- package/dist/chunks/_getPrototype.js +292 -100
- package/dist/chunks/_getPrototype.js.map +1 -1
- package/dist/chunks/alert-adapter.js +29 -0
- package/dist/chunks/alert-adapter.js.map +1 -0
- package/dist/chunks/alert.js +21 -0
- package/dist/chunks/alert.js.map +1 -0
- package/dist/chunks/arr.js +24 -0
- package/dist/chunks/arr.js.map +1 -0
- package/dist/chunks/button-radio.js +127 -145
- package/dist/chunks/button-radio.js.map +1 -1
- package/dist/chunks/checkboxes-multi-select.js +44 -43
- package/dist/chunks/checkboxes-multi-select.js.map +1 -1
- package/dist/chunks/chunk.js +24 -0
- package/dist/chunks/cloneDeep.js +679 -212
- package/dist/chunks/cloneDeep.js.map +1 -1
- package/dist/chunks/cropper.min.js +6 -5
- package/dist/chunks/cropper.min.js.map +1 -1
- package/dist/chunks/crypto.js +26 -0
- package/dist/chunks/crypto.js.map +1 -0
- package/dist/chunks/data.js +49 -0
- package/dist/chunks/data.js.map +1 -0
- package/dist/chunks/dom.js +128 -0
- package/dist/chunks/dom.js.map +1 -0
- package/dist/chunks/events.js +270 -0
- package/dist/chunks/events.js.map +1 -0
- package/dist/chunks/field-cascade-select.js +207 -250
- package/dist/chunks/field-cascade-select.js.map +1 -1
- package/dist/chunks/field-file-drag.js +175 -209
- package/dist/chunks/field-file-drag.js.map +1 -1
- package/dist/chunks/field-flatpickr.js +94 -898
- package/dist/chunks/field-flatpickr.js.map +1 -1
- package/dist/chunks/field-modal-select.js +728 -467
- package/dist/chunks/field-modal-select.js.map +1 -1
- package/dist/chunks/field-modal-tree.js +771 -766
- package/dist/chunks/field-modal-tree.js.map +1 -1
- package/dist/chunks/field-multi-uploader.js +249 -256
- package/dist/chunks/field-multi-uploader.js.map +1 -1
- package/dist/chunks/field-repeatable.js +111 -127
- package/dist/chunks/field-repeatable.js.map +1 -1
- package/dist/chunks/field-single-image-drag.js +286 -338
- package/dist/chunks/field-single-image-drag.js.map +1 -1
- package/dist/chunks/form.js +146 -159
- package/dist/chunks/form.js.map +1 -1
- package/dist/chunks/grid.js +349 -418
- package/dist/chunks/grid.js.map +1 -1
- package/dist/chunks/helper.js +39 -0
- package/dist/chunks/helper.js.map +1 -0
- package/dist/chunks/http-client.js +221 -211
- package/dist/chunks/http-client.js.map +1 -1
- package/dist/chunks/iframe-modal.js +95 -115
- package/dist/chunks/iframe-modal.js.map +1 -1
- package/dist/chunks/keep-tab.js +92 -101
- package/dist/chunks/keep-tab.js.map +1 -1
- package/dist/chunks/lang.js +250 -0
- package/dist/chunks/lang.js.map +1 -0
- package/dist/chunks/legacy.js +197 -201
- package/dist/chunks/legacy.js.map +1 -1
- package/dist/chunks/list-dependent.js +195 -228
- package/dist/chunks/list-dependent.js.map +1 -1
- package/dist/chunks/loader.js +106 -0
- package/dist/chunks/loader.js.map +1 -0
- package/dist/chunks/monthSelect.js +251 -0
- package/dist/chunks/monthSelect.js.map +1 -0
- package/dist/chunks/router.js +111 -0
- package/dist/chunks/router.js.map +1 -0
- package/dist/chunks/s3-multipart-uploader.js +183 -210
- package/dist/chunks/s3-multipart-uploader.js.map +1 -1
- package/dist/chunks/s3-uploader.js +106 -128
- package/dist/chunks/s3-uploader.js.map +1 -1
- package/dist/chunks/show-on.js +358 -205
- package/dist/chunks/show-on.js.map +1 -1
- package/dist/chunks/timing.js +10 -0
- package/dist/chunks/timing.js.map +1 -0
- package/dist/chunks/tinymce.js +153 -203
- package/dist/chunks/tinymce.js.map +1 -1
- package/dist/chunks/ui-bootstrap5.js +58 -72
- package/dist/chunks/ui-bootstrap5.js.map +1 -1
- package/dist/chunks/ui.js +320 -0
- package/dist/chunks/ui.js.map +1 -0
- package/dist/chunks/unicorn.js.map +1 -1
- package/dist/chunks/useQueue.js +111 -0
- package/dist/chunks/useQueue.js.map +1 -0
- package/dist/chunks/useStack.js +76 -0
- package/dist/chunks/useStack.js.map +1 -0
- package/dist/chunks/validation.js +761 -853
- package/dist/chunks/validation.js.map +1 -1
- package/dist/editor.css +1 -1
- package/dist/index.d.ts +10 -8
- package/dist/multi-level-menu.css +1 -1
- package/dist/switcher.css +1 -1
- package/dist/unicorn.js +805 -130
- package/dist/unicorn.js.map +1 -1
- package/package.json +3 -3
- package/src/composable/useBsModalAlert.ts +29 -0
- package/src/composable/useHttp.ts +13 -1
- package/src/module/s3-uploader.ts +1 -1
- package/vite.config.ts +5 -1
- package/dist/chunks/_commonjsHelpers.js +0 -7
- package/dist/chunks/index.js +0 -314
- package/dist/chunks/isArguments.js +0 -146
- package/dist/chunks/unicorn.js +0 -2621
|
@@ -1,231 +1,198 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { t as mergeDeep } from "./arr.js";
|
|
2
|
+
import { d as selectOne, o as html, r as getBoundedInstance } from "./dom.js";
|
|
3
|
+
import { useHttpClient, useUniDirective } from "../unicorn.js";
|
|
4
|
+
//#region src/module/list-dependent.ts
|
|
5
|
+
var nope = () => {};
|
|
6
|
+
var defaultOptions = {
|
|
7
|
+
ajax: {
|
|
8
|
+
url: null,
|
|
9
|
+
value_field: "value",
|
|
10
|
+
data: {}
|
|
11
|
+
},
|
|
12
|
+
source: void 0,
|
|
13
|
+
text_field: "title",
|
|
14
|
+
value_field: "id",
|
|
15
|
+
first_option: void 0,
|
|
16
|
+
default_value: null,
|
|
17
|
+
initial_load: true,
|
|
18
|
+
empty_mark: "__EMPTY__",
|
|
19
|
+
hooks: {
|
|
20
|
+
before_request: nope,
|
|
21
|
+
after_request: nope
|
|
22
|
+
}
|
|
3
23
|
};
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
24
|
+
var ListDependent = class {
|
|
25
|
+
element;
|
|
26
|
+
dependent;
|
|
27
|
+
options;
|
|
28
|
+
abortController = null;
|
|
29
|
+
static handle(el, dependent, options = {}) {
|
|
30
|
+
return getBoundedInstance(el, "list-dependent", () => {
|
|
31
|
+
return new this(el, dependent, options);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
constructor(element, dependent, options = {}) {
|
|
35
|
+
this.options = this.mergeOptions(options);
|
|
36
|
+
this.element = selectOne(element);
|
|
37
|
+
if (!dependent) dependent = this.element.dataset.dependent || "";
|
|
38
|
+
this.dependent = selectOne(dependent);
|
|
39
|
+
this.bindEvents();
|
|
40
|
+
if (this.options.initial_load) this.changeList(this.dependent.value, true);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Bind events.
|
|
44
|
+
*/
|
|
45
|
+
bindEvents() {
|
|
46
|
+
this.dependent.addEventListener("change", (event) => {
|
|
47
|
+
this.changeList(event.currentTarget?.value);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Update the list elements.
|
|
52
|
+
*
|
|
53
|
+
* @param {*} value
|
|
54
|
+
* @param {bool} initial
|
|
55
|
+
*/
|
|
56
|
+
changeList(value, initial = false) {
|
|
57
|
+
value = value || this.dependent.value;
|
|
58
|
+
if (value === "") value = this.options.empty_mark;
|
|
59
|
+
if (this.options.ajax.url) this.ajaxUpdate(value);
|
|
60
|
+
else if (this.options.source) this.sourceUpdate(value, initial);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Update list by source.
|
|
64
|
+
*/
|
|
65
|
+
sourceUpdate(value, initial = false) {
|
|
66
|
+
const source = this.options.source;
|
|
67
|
+
if (!source) return;
|
|
68
|
+
this.beforeHook(value, this.element, this.dependent);
|
|
69
|
+
if (source[value]) this.updateListElements(source[value]);
|
|
70
|
+
else {
|
|
71
|
+
this.updateListElements([]);
|
|
72
|
+
if (!initial && value !== "" && parseInt(value) !== 0) console.log("List for value: " + value + " not found.");
|
|
73
|
+
}
|
|
74
|
+
this.afterHook(value, this.element, this.dependent);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Do ajax.
|
|
78
|
+
*
|
|
79
|
+
* @param {string} value
|
|
80
|
+
*/
|
|
81
|
+
async ajaxUpdate(value) {
|
|
82
|
+
let data = {};
|
|
83
|
+
data[this.options.ajax.value_field] = value;
|
|
84
|
+
if (typeof this.options.ajax.data === "object") data = {
|
|
85
|
+
...data,
|
|
86
|
+
...this.options.ajax.data
|
|
87
|
+
};
|
|
88
|
+
else if (typeof this.options.ajax.data === "function") data = this.options.ajax.data(data, this) || data;
|
|
89
|
+
this.beforeHook(value, this.element, this.dependent);
|
|
90
|
+
this.abort();
|
|
91
|
+
let url = this.options.ajax.url;
|
|
92
|
+
if (typeof url === "function") url = url(this);
|
|
93
|
+
if (!url) throw new Error("Ajax URL is not set.");
|
|
94
|
+
const http = await useHttpClient();
|
|
95
|
+
this.abortController = new AbortController();
|
|
96
|
+
try {
|
|
97
|
+
const { success, data: returnData } = (await http.get(url, {
|
|
98
|
+
params: data,
|
|
99
|
+
signal: this.abortController.signal
|
|
100
|
+
})).data;
|
|
101
|
+
if (success) this.updateListElements(returnData);
|
|
102
|
+
else console.error(returnData);
|
|
103
|
+
} catch (e) {
|
|
104
|
+
console.error(e);
|
|
105
|
+
} finally {
|
|
106
|
+
this.afterHook(value, this.element, this.dependent);
|
|
107
|
+
this.abortController = null;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
abort() {
|
|
111
|
+
if (this.abortController) {
|
|
112
|
+
this.abortController.abort();
|
|
113
|
+
this.abortController = null;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
updateListElements(items) {
|
|
117
|
+
const textField = this.options.text_field;
|
|
118
|
+
const valueField = this.options.value_field;
|
|
119
|
+
this.element.innerHTML = "";
|
|
120
|
+
if (this.options.first_option && Array.isArray(items)) {
|
|
121
|
+
items.unshift({});
|
|
122
|
+
items[0][textField] = this.options.first_option[textField];
|
|
123
|
+
items[0][valueField] = this.options.first_option[valueField];
|
|
124
|
+
}
|
|
125
|
+
for (const i in items) {
|
|
126
|
+
const item = items[i];
|
|
127
|
+
if (Array.isArray(item)) {
|
|
128
|
+
const group = html(`<optgroup label="${i}"></optgroup>`);
|
|
129
|
+
for (const k in item) {
|
|
130
|
+
const child = item[k];
|
|
131
|
+
this.appendOptionTo({
|
|
132
|
+
value: child[valueField],
|
|
133
|
+
text: child[textField],
|
|
134
|
+
attributes: child.attributes
|
|
135
|
+
}, group);
|
|
136
|
+
}
|
|
137
|
+
this.element.appendChild(group);
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
this.appendOptionTo({
|
|
141
|
+
value: item[valueField],
|
|
142
|
+
text: item[textField],
|
|
143
|
+
attributes: item.attributes
|
|
144
|
+
}, this.element);
|
|
145
|
+
}
|
|
146
|
+
this.element.dispatchEvent(new CustomEvent("change"));
|
|
147
|
+
this.element.dispatchEvent(new CustomEvent("list:updated"));
|
|
148
|
+
}
|
|
149
|
+
appendOptionTo(item, parent) {
|
|
150
|
+
const value = item.value;
|
|
151
|
+
const option = html("<option>" + item.text + "</option>");
|
|
152
|
+
option.setAttribute("value", value);
|
|
153
|
+
if (item.attributes) for (const index in item.attributes) {
|
|
154
|
+
const val = item.attributes[index];
|
|
155
|
+
option.setAttribute(index, val);
|
|
156
|
+
}
|
|
157
|
+
if (this.isSelected(value)) option.setAttribute("selected", "selected");
|
|
158
|
+
parent.appendChild(option);
|
|
159
|
+
}
|
|
160
|
+
isSelected(value) {
|
|
161
|
+
let defaultValues = [];
|
|
162
|
+
let defValue = this.element.dataset.selected ?? this.options.default_value;
|
|
163
|
+
if (typeof defValue === "function") defValue = defValue(value, this);
|
|
164
|
+
if (Array.isArray(defValue)) defaultValues = defValue;
|
|
165
|
+
else if (defValue && typeof defValue === "object") defaultValues = Object.keys(defValue);
|
|
166
|
+
else defaultValues = [defValue];
|
|
167
|
+
return defaultValues.indexOf(value) !== -1;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Before hook.
|
|
171
|
+
*/
|
|
172
|
+
beforeHook(value, element, dependent) {
|
|
173
|
+
return this.options.hooks.before_request.call(this, value, element, dependent);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* After hook.
|
|
177
|
+
*/
|
|
178
|
+
afterHook(value, element, dependent) {
|
|
179
|
+
return this.options.hooks.after_request.call(this, value, element, dependent);
|
|
180
|
+
}
|
|
181
|
+
mergeOptions(options) {
|
|
182
|
+
return mergeDeep({}, defaultOptions, options);
|
|
183
|
+
}
|
|
21
184
|
};
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
}
|
|
32
|
-
constructor(element, dependent, options = {}) {
|
|
33
|
-
this.options = this.mergeOptions(options);
|
|
34
|
-
this.element = selectOne(element);
|
|
35
|
-
if (!dependent) {
|
|
36
|
-
dependent = this.element.dataset.dependent || "";
|
|
37
|
-
}
|
|
38
|
-
this.dependent = selectOne(dependent);
|
|
39
|
-
this.bindEvents();
|
|
40
|
-
if (this.options.initial_load) {
|
|
41
|
-
this.changeList(this.dependent.value, true);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Bind events.
|
|
46
|
-
*/
|
|
47
|
-
bindEvents() {
|
|
48
|
-
this.dependent.addEventListener("change", (event) => {
|
|
49
|
-
this.changeList(event.currentTarget?.value);
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Update the list elements.
|
|
54
|
-
*
|
|
55
|
-
* @param {*} value
|
|
56
|
-
* @param {bool} initial
|
|
57
|
-
*/
|
|
58
|
-
changeList(value, initial = false) {
|
|
59
|
-
value = value || this.dependent.value;
|
|
60
|
-
if (value === "") {
|
|
61
|
-
value = this.options.empty_mark;
|
|
62
|
-
}
|
|
63
|
-
if (this.options.ajax.url) {
|
|
64
|
-
this.ajaxUpdate(value);
|
|
65
|
-
} else if (this.options.source) {
|
|
66
|
-
this.sourceUpdate(value, initial);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Update list by source.
|
|
71
|
-
*/
|
|
72
|
-
sourceUpdate(value, initial = false) {
|
|
73
|
-
const source = this.options.source;
|
|
74
|
-
if (!source) {
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
this.beforeHook(value, this.element, this.dependent);
|
|
78
|
-
if (source[value]) {
|
|
79
|
-
this.updateListElements(source[value]);
|
|
80
|
-
} else {
|
|
81
|
-
this.updateListElements([]);
|
|
82
|
-
if (!initial && value !== "" && parseInt(value) !== 0) {
|
|
83
|
-
console.log("List for value: " + value + " not found.");
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
this.afterHook(value, this.element, this.dependent);
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Do ajax.
|
|
90
|
-
*
|
|
91
|
-
* @param {string} value
|
|
92
|
-
*/
|
|
93
|
-
async ajaxUpdate(value) {
|
|
94
|
-
let data = {};
|
|
95
|
-
data[this.options.ajax.value_field] = value;
|
|
96
|
-
if (typeof this.options.ajax.data === "object") {
|
|
97
|
-
data = { ...data, ...this.options.ajax.data };
|
|
98
|
-
} else if (typeof this.options.ajax.data === "function") {
|
|
99
|
-
data = this.options.ajax.data(data, this) || data;
|
|
100
|
-
}
|
|
101
|
-
this.beforeHook(value, this.element, this.dependent);
|
|
102
|
-
this.abort();
|
|
103
|
-
let url = this.options.ajax.url;
|
|
104
|
-
if (typeof url === "function") {
|
|
105
|
-
url = url(this);
|
|
106
|
-
}
|
|
107
|
-
if (!url) {
|
|
108
|
-
throw new Error("Ajax URL is not set.");
|
|
109
|
-
}
|
|
110
|
-
const http = await useHttpClient();
|
|
111
|
-
this.abortController = new AbortController();
|
|
112
|
-
try {
|
|
113
|
-
const res = await http.get(url, {
|
|
114
|
-
params: data,
|
|
115
|
-
signal: this.abortController.signal
|
|
116
|
-
});
|
|
117
|
-
const { success, data: returnData } = res.data;
|
|
118
|
-
if (success) {
|
|
119
|
-
this.updateListElements(returnData);
|
|
120
|
-
} else {
|
|
121
|
-
console.error(returnData);
|
|
122
|
-
}
|
|
123
|
-
} catch (e) {
|
|
124
|
-
console.error(e);
|
|
125
|
-
} finally {
|
|
126
|
-
this.afterHook(value, this.element, this.dependent);
|
|
127
|
-
this.abortController = null;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
abort() {
|
|
131
|
-
if (this.abortController) {
|
|
132
|
-
this.abortController.abort();
|
|
133
|
-
this.abortController = null;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
updateListElements(items) {
|
|
137
|
-
const textField = this.options.text_field;
|
|
138
|
-
const valueField = this.options.value_field;
|
|
139
|
-
this.element.innerHTML = "";
|
|
140
|
-
if (this.options.first_option && Array.isArray(items)) {
|
|
141
|
-
items.unshift({});
|
|
142
|
-
items[0][textField] = this.options.first_option[textField];
|
|
143
|
-
items[0][valueField] = this.options.first_option[valueField];
|
|
144
|
-
}
|
|
145
|
-
for (const i in items) {
|
|
146
|
-
const item = items[i];
|
|
147
|
-
if (Array.isArray(item)) {
|
|
148
|
-
const group = html(`<optgroup label="${i}"></optgroup>`);
|
|
149
|
-
for (const k in item) {
|
|
150
|
-
const child = item[k];
|
|
151
|
-
this.appendOptionTo({
|
|
152
|
-
value: child[valueField],
|
|
153
|
-
text: child[textField],
|
|
154
|
-
attributes: child.attributes
|
|
155
|
-
}, group);
|
|
156
|
-
}
|
|
157
|
-
this.element.appendChild(group);
|
|
158
|
-
continue;
|
|
159
|
-
}
|
|
160
|
-
this.appendOptionTo({
|
|
161
|
-
value: item[valueField],
|
|
162
|
-
text: item[textField],
|
|
163
|
-
attributes: item.attributes
|
|
164
|
-
}, this.element);
|
|
165
|
-
}
|
|
166
|
-
this.element.dispatchEvent(new CustomEvent("change"));
|
|
167
|
-
this.element.dispatchEvent(new CustomEvent("list:updated"));
|
|
168
|
-
}
|
|
169
|
-
appendOptionTo(item, parent) {
|
|
170
|
-
const value = item.value;
|
|
171
|
-
const option = html("<option>" + item.text + "</option>");
|
|
172
|
-
option.setAttribute("value", value);
|
|
173
|
-
if (item.attributes) {
|
|
174
|
-
for (const index in item.attributes) {
|
|
175
|
-
const val = item.attributes[index];
|
|
176
|
-
option.setAttribute(index, val);
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
if (this.isSelected(value)) {
|
|
180
|
-
option.setAttribute("selected", "selected");
|
|
181
|
-
}
|
|
182
|
-
parent.appendChild(option);
|
|
183
|
-
}
|
|
184
|
-
isSelected(value) {
|
|
185
|
-
let defaultValues = [];
|
|
186
|
-
let defValue = this.element.dataset.selected ?? this.options.default_value;
|
|
187
|
-
if (typeof defValue === "function") {
|
|
188
|
-
defValue = defValue(value, this);
|
|
189
|
-
}
|
|
190
|
-
if (Array.isArray(defValue)) {
|
|
191
|
-
defaultValues = defValue;
|
|
192
|
-
} else if (defValue && typeof defValue === "object") {
|
|
193
|
-
defaultValues = Object.keys(defValue);
|
|
194
|
-
} else {
|
|
195
|
-
defaultValues = [defValue];
|
|
196
|
-
}
|
|
197
|
-
return defaultValues.indexOf(value) !== -1;
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* Before hook.
|
|
201
|
-
*/
|
|
202
|
-
beforeHook(value, element, dependent) {
|
|
203
|
-
const before = this.options.hooks.before_request;
|
|
204
|
-
return before.call(this, value, element, dependent);
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* After hook.
|
|
208
|
-
*/
|
|
209
|
-
afterHook(value, element, dependent) {
|
|
210
|
-
const after = this.options.hooks.after_request;
|
|
211
|
-
return after.call(this, value, element, dependent);
|
|
212
|
-
}
|
|
213
|
-
mergeOptions(options) {
|
|
214
|
-
return mergeDeep({}, defaultOptions, options);
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
const ready = /* @__PURE__ */ useUniDirective("list-dependent", {
|
|
218
|
-
mounted(el, binding) {
|
|
219
|
-
const options = JSON.parse(binding.value);
|
|
220
|
-
ListDependent.handle(el, options.dependent, options);
|
|
221
|
-
},
|
|
222
|
-
updated(el, binding) {
|
|
223
|
-
const options = JSON.parse(binding.value);
|
|
224
|
-
ListDependent.handle(el).mergeOptions(options);
|
|
225
|
-
}
|
|
185
|
+
var ready = /* @__PURE__ */ useUniDirective("list-dependent", {
|
|
186
|
+
mounted(el, binding) {
|
|
187
|
+
const options = JSON.parse(binding.value);
|
|
188
|
+
ListDependent.handle(el, options.dependent, options);
|
|
189
|
+
},
|
|
190
|
+
updated(el, binding) {
|
|
191
|
+
const options = JSON.parse(binding.value);
|
|
192
|
+
ListDependent.handle(el).mergeOptions(options);
|
|
193
|
+
}
|
|
226
194
|
});
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
//# sourceMappingURL=list-dependent.js.map
|
|
195
|
+
//#endregion
|
|
196
|
+
export { ListDependent, ready };
|
|
197
|
+
|
|
198
|
+
//# sourceMappingURL=list-dependent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-dependent.js","sources":["../../src/module/list-dependent.ts"],"sourcesContent":["\nimport type { CancelTokenSource } from 'axios';\nimport { useHttpClient, useUniDirective } from '../composable';\nimport { getBoundedInstance, html, selectOne } from '../service';\nimport { mergeDeep } from '../utilities';\n\nconst nope = () => {};\n\nexport interface ListDependentOptions {\n ajax: {\n url: string | null | ((self: ListDependent) => string);\n value_field: string;\n data: Record<string, any> | ((data: Record<string, any>, self: ListDependent) => Record<string, any>);\n };\n source?: Record<string, any>;\n text_field: string;\n value_field: string;\n first_option?: Record<string, any>;\n default_value: any;\n initial_load: boolean;\n empty_mark: string;\n hooks: {\n before_request: (value: any, element: HTMLSelectElement, dependent: HTMLSelectElement) => any;\n after_request: (value: any, element: HTMLSelectElement, dependent: HTMLSelectElement) => any;\n };\n}\n\nconst defaultOptions: ListDependentOptions = {\n ajax: {\n url: null,\n value_field: 'value',\n data: {},\n },\n source: undefined,\n text_field: 'title',\n value_field: 'id',\n first_option: undefined,\n default_value: null,\n initial_load: true,\n empty_mark: '__EMPTY__',\n hooks: {\n before_request: nope,\n after_request: nope\n }\n};\n\ntype ListItems = Record<string, any>[];\ntype MaybeGroupedListItems = Record<string, ListItems> | ListItems;\n\nexport class ListDependent {\n element: HTMLSelectElement;\n dependent: HTMLSelectElement;\n options: ListDependentOptions;\n abortController: AbortController | null = null;\n\n static handle(el: string | HTMLSelectElement, dependent?: string | HTMLSelectElement, options: Partial<ListDependentOptions> = {}): ListDependent {\n return getBoundedInstance(el, 'list-dependent', () => {\n return new this(el, dependent, options);\n });\n }\n\n constructor(element: string | HTMLSelectElement, dependent?: string | HTMLSelectElement, options: Partial<ListDependentOptions> = {}) {\n this.options = this.mergeOptions(options);\n\n this.element = selectOne<HTMLSelectElement>(element)!;\n\n if (!dependent) {\n dependent = this.element.dataset.dependent || '';\n }\n\n this.dependent = selectOne<HTMLSelectElement>(dependent)!;\n\n this.bindEvents();\n\n if (this.options.initial_load) {\n this.changeList(this.dependent.value, true);\n }\n }\n\n /**\n * Bind events.\n */\n bindEvents() {\n this.dependent.addEventListener('change', (event) => {\n this.changeList((event.currentTarget as HTMLSelectElement)?.value);\n });\n }\n\n /**\n * Update the list elements.\n *\n * @param {*} value\n * @param {bool} initial\n */\n changeList(value: string, initial = false) {\n value = value || this.dependent.value;\n\n // Empty mark\n if (value === '') {\n value = this.options.empty_mark;\n }\n\n if (this.options.ajax.url) {\n this.ajaxUpdate(value);\n } else if (this.options.source) {\n this.sourceUpdate(value, initial);\n }\n }\n\n /**\n * Update list by source.\n */\n sourceUpdate(value: string, initial = false) {\n const source = this.options.source;\n\n if (!source) {\n return;\n }\n\n this.beforeHook(value, this.element, this.dependent);\n\n if (source[value]) {\n this.updateListElements(source[value]);\n } else {\n this.updateListElements([]);\n\n if (!initial && value !== '' && parseInt(value) !== 0) {\n console.log('List for value: ' + value + ' not found.');\n }\n }\n\n this.afterHook(value, this.element, this.dependent);\n }\n\n /**\n * Do ajax.\n *\n * @param {string} value\n */\n async ajaxUpdate(value: string) {\n let data: Record<string, any> = {};\n\n data[this.options.ajax.value_field] = value;\n\n if (typeof this.options.ajax.data === 'object') {\n data = { ...data, ...this.options.ajax.data };\n } else if (typeof this.options.ajax.data === 'function') {\n data = this.options.ajax.data(data, this) || data;\n }\n\n this.beforeHook(value, this.element, this.dependent);\n\n this.abort();\n\n let url = this.options.ajax.url;\n\n if (typeof url === 'function') {\n url = url(this);\n }\n\n if (!url) {\n throw new Error('Ajax URL is not set.');\n }\n\n const http = await useHttpClient();\n\n this.abortController = new AbortController();\n\n try {\n const res = await http.get<{\n success: boolean;\n data: any;\n }>(url, {\n params: data,\n signal: this.abortController.signal\n });\n\n const { success, data: returnData } = res.data;\n\n if (success) {\n this.updateListElements(returnData);\n } else {\n console.error(returnData);\n }\n\n } catch (e) {\n console.error(e);\n } finally {\n this.afterHook(value, this.element, this.dependent);\n this.abortController = null;\n }\n }\n\n abort() {\n if (this.abortController) {\n this.abortController.abort();\n this.abortController = null;\n }\n }\n\n updateListElements(items: MaybeGroupedListItems) {\n const textField = this.options.text_field;\n const valueField = this.options.value_field;\n this.element.innerHTML = '';\n\n if (this.options.first_option && Array.isArray(items)) {\n items.unshift({});\n items[0][textField] = this.options.first_option[textField];\n items[0][valueField] = this.options.first_option[valueField];\n }\n\n for (const i in items) {\n const item = items[i as keyof typeof items] as Record<string, any> | ListItems;\n\n if (Array.isArray(item)) {\n const group = html(`<optgroup label=\"${i}\"></optgroup>`);\n\n for (const k in item) {\n const child = item[k];\n this.appendOptionTo({\n value: child[valueField],\n text: child[textField],\n attributes: child.attributes,\n }, group);\n }\n\n this.element.appendChild(group);\n continue;\n }\n\n this.appendOptionTo({\n value: item[valueField],\n text: item[textField],\n attributes: item.attributes,\n }, this.element);\n }\n\n this.element.dispatchEvent(new CustomEvent('change'));\n this.element.dispatchEvent(new CustomEvent('list:updated'));\n }\n\n appendOptionTo(item: any, parent: any) {\n const value = item.value;\n const option = html('<option>' + item.text + '</option>');\n option.setAttribute('value', value);\n\n if (item.attributes) {\n for (const index in item.attributes) {\n const val = item.attributes[index];\n option.setAttribute(index, val);\n }\n }\n\n if (this.isSelected(value)) {\n option.setAttribute('selected', 'selected');\n }\n\n parent.appendChild(option);\n }\n\n isSelected(value: string) {\n let defaultValues: any[] = [];\n\n // Convert all types to array\n let defValue = this.element.dataset.selected ?? this.options.default_value;\n\n if (typeof defValue === 'function') {\n defValue = defValue(value, this);\n }\n\n if (Array.isArray(defValue)) {\n defaultValues = defValue;\n } else if (defValue && typeof defValue === 'object') {\n defaultValues = Object.keys(defValue);\n } else {\n defaultValues = [defValue];\n }\n\n return defaultValues.indexOf(value) !== -1;\n }\n\n /**\n * Before hook.\n */\n beforeHook(value: string, element: HTMLSelectElement, dependent: HTMLSelectElement) {\n const before = this.options.hooks.before_request;\n\n return before.call(this, value, element, dependent);\n }\n\n /**\n * After hook.\n */\n afterHook(value: string, element: HTMLSelectElement, dependent: HTMLSelectElement) {\n const after = this.options.hooks.after_request;\n\n return after.call(this, value, element, dependent);\n }\n\n mergeOptions(options: Partial<ListDependentOptions>): ListDependentOptions {\n return mergeDeep<ListDependentOptions>({}, defaultOptions, options);\n }\n}\n\nexport const ready = useUniDirective<HTMLSelectElement>('list-dependent', {\n mounted(el, binding) {\n const options = JSON.parse(binding.value);\n\n ListDependent.handle(el, options.dependent, options);\n },\n updated(el, binding) {\n const options = JSON.parse(binding.value);\n\n ListDependent.handle(el).mergeOptions(options);\n }\n});\n\nexport type ListDependentModule = {\n ListDependent: typeof ListDependent;\n ready: typeof ready;\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"list-dependent.js","names":[],"sources":["../../src/module/list-dependent.ts"],"sourcesContent":["\nimport type { CancelTokenSource } from 'axios';\nimport { useHttpClient, useUniDirective } from '../composable';\nimport { getBoundedInstance, html, selectOne } from '../service';\nimport { mergeDeep } from '../utilities';\n\nconst nope = () => {};\n\nexport interface ListDependentOptions {\n ajax: {\n url: string | null | ((self: ListDependent) => string);\n value_field: string;\n data: Record<string, any> | ((data: Record<string, any>, self: ListDependent) => Record<string, any>);\n };\n source?: Record<string, any>;\n text_field: string;\n value_field: string;\n first_option?: Record<string, any>;\n default_value: any;\n initial_load: boolean;\n empty_mark: string;\n hooks: {\n before_request: (value: any, element: HTMLSelectElement, dependent: HTMLSelectElement) => any;\n after_request: (value: any, element: HTMLSelectElement, dependent: HTMLSelectElement) => any;\n };\n}\n\nconst defaultOptions: ListDependentOptions = {\n ajax: {\n url: null,\n value_field: 'value',\n data: {},\n },\n source: undefined,\n text_field: 'title',\n value_field: 'id',\n first_option: undefined,\n default_value: null,\n initial_load: true,\n empty_mark: '__EMPTY__',\n hooks: {\n before_request: nope,\n after_request: nope\n }\n};\n\ntype ListItems = Record<string, any>[];\ntype MaybeGroupedListItems = Record<string, ListItems> | ListItems;\n\nexport class ListDependent {\n element: HTMLSelectElement;\n dependent: HTMLSelectElement;\n options: ListDependentOptions;\n abortController: AbortController | null = null;\n\n static handle(el: string | HTMLSelectElement, dependent?: string | HTMLSelectElement, options: Partial<ListDependentOptions> = {}): ListDependent {\n return getBoundedInstance(el, 'list-dependent', () => {\n return new this(el, dependent, options);\n });\n }\n\n constructor(element: string | HTMLSelectElement, dependent?: string | HTMLSelectElement, options: Partial<ListDependentOptions> = {}) {\n this.options = this.mergeOptions(options);\n\n this.element = selectOne<HTMLSelectElement>(element)!;\n\n if (!dependent) {\n dependent = this.element.dataset.dependent || '';\n }\n\n this.dependent = selectOne<HTMLSelectElement>(dependent)!;\n\n this.bindEvents();\n\n if (this.options.initial_load) {\n this.changeList(this.dependent.value, true);\n }\n }\n\n /**\n * Bind events.\n */\n bindEvents() {\n this.dependent.addEventListener('change', (event) => {\n this.changeList((event.currentTarget as HTMLSelectElement)?.value);\n });\n }\n\n /**\n * Update the list elements.\n *\n * @param {*} value\n * @param {bool} initial\n */\n changeList(value: string, initial = false) {\n value = value || this.dependent.value;\n\n // Empty mark\n if (value === '') {\n value = this.options.empty_mark;\n }\n\n if (this.options.ajax.url) {\n this.ajaxUpdate(value);\n } else if (this.options.source) {\n this.sourceUpdate(value, initial);\n }\n }\n\n /**\n * Update list by source.\n */\n sourceUpdate(value: string, initial = false) {\n const source = this.options.source;\n\n if (!source) {\n return;\n }\n\n this.beforeHook(value, this.element, this.dependent);\n\n if (source[value]) {\n this.updateListElements(source[value]);\n } else {\n this.updateListElements([]);\n\n if (!initial && value !== '' && parseInt(value) !== 0) {\n console.log('List for value: ' + value + ' not found.');\n }\n }\n\n this.afterHook(value, this.element, this.dependent);\n }\n\n /**\n * Do ajax.\n *\n * @param {string} value\n */\n async ajaxUpdate(value: string) {\n let data: Record<string, any> = {};\n\n data[this.options.ajax.value_field] = value;\n\n if (typeof this.options.ajax.data === 'object') {\n data = { ...data, ...this.options.ajax.data };\n } else if (typeof this.options.ajax.data === 'function') {\n data = this.options.ajax.data(data, this) || data;\n }\n\n this.beforeHook(value, this.element, this.dependent);\n\n this.abort();\n\n let url = this.options.ajax.url;\n\n if (typeof url === 'function') {\n url = url(this);\n }\n\n if (!url) {\n throw new Error('Ajax URL is not set.');\n }\n\n const http = await useHttpClient();\n\n this.abortController = new AbortController();\n\n try {\n const res = await http.get<{\n success: boolean;\n data: any;\n }>(url, {\n params: data,\n signal: this.abortController.signal\n });\n\n const { success, data: returnData } = res.data;\n\n if (success) {\n this.updateListElements(returnData);\n } else {\n console.error(returnData);\n }\n\n } catch (e) {\n console.error(e);\n } finally {\n this.afterHook(value, this.element, this.dependent);\n this.abortController = null;\n }\n }\n\n abort() {\n if (this.abortController) {\n this.abortController.abort();\n this.abortController = null;\n }\n }\n\n updateListElements(items: MaybeGroupedListItems) {\n const textField = this.options.text_field;\n const valueField = this.options.value_field;\n this.element.innerHTML = '';\n\n if (this.options.first_option && Array.isArray(items)) {\n items.unshift({});\n items[0][textField] = this.options.first_option[textField];\n items[0][valueField] = this.options.first_option[valueField];\n }\n\n for (const i in items) {\n const item = items[i as keyof typeof items] as Record<string, any> | ListItems;\n\n if (Array.isArray(item)) {\n const group = html(`<optgroup label=\"${i}\"></optgroup>`);\n\n for (const k in item) {\n const child = item[k];\n this.appendOptionTo({\n value: child[valueField],\n text: child[textField],\n attributes: child.attributes,\n }, group);\n }\n\n this.element.appendChild(group);\n continue;\n }\n\n this.appendOptionTo({\n value: item[valueField],\n text: item[textField],\n attributes: item.attributes,\n }, this.element);\n }\n\n this.element.dispatchEvent(new CustomEvent('change'));\n this.element.dispatchEvent(new CustomEvent('list:updated'));\n }\n\n appendOptionTo(item: any, parent: any) {\n const value = item.value;\n const option = html('<option>' + item.text + '</option>');\n option.setAttribute('value', value);\n\n if (item.attributes) {\n for (const index in item.attributes) {\n const val = item.attributes[index];\n option.setAttribute(index, val);\n }\n }\n\n if (this.isSelected(value)) {\n option.setAttribute('selected', 'selected');\n }\n\n parent.appendChild(option);\n }\n\n isSelected(value: string) {\n let defaultValues: any[] = [];\n\n // Convert all types to array\n let defValue = this.element.dataset.selected ?? this.options.default_value;\n\n if (typeof defValue === 'function') {\n defValue = defValue(value, this);\n }\n\n if (Array.isArray(defValue)) {\n defaultValues = defValue;\n } else if (defValue && typeof defValue === 'object') {\n defaultValues = Object.keys(defValue);\n } else {\n defaultValues = [defValue];\n }\n\n return defaultValues.indexOf(value) !== -1;\n }\n\n /**\n * Before hook.\n */\n beforeHook(value: string, element: HTMLSelectElement, dependent: HTMLSelectElement) {\n const before = this.options.hooks.before_request;\n\n return before.call(this, value, element, dependent);\n }\n\n /**\n * After hook.\n */\n afterHook(value: string, element: HTMLSelectElement, dependent: HTMLSelectElement) {\n const after = this.options.hooks.after_request;\n\n return after.call(this, value, element, dependent);\n }\n\n mergeOptions(options: Partial<ListDependentOptions>): ListDependentOptions {\n return mergeDeep<ListDependentOptions>({}, defaultOptions, options);\n }\n}\n\nexport const ready = useUniDirective<HTMLSelectElement>('list-dependent', {\n mounted(el, binding) {\n const options = JSON.parse(binding.value);\n\n ListDependent.handle(el, options.dependent, options);\n },\n updated(el, binding) {\n const options = JSON.parse(binding.value);\n\n ListDependent.handle(el).mergeOptions(options);\n }\n});\n\nexport type ListDependentModule = {\n ListDependent: typeof ListDependent;\n ready: typeof ready;\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { s as injectCssToDocument } from "./dom.js";
|
|
2
|
+
//#region src/service/loader.ts
|
|
3
|
+
async function useScriptImport(src, attrs = {}) {
|
|
4
|
+
if (typeof src === "function") src = (await src()).default;
|
|
5
|
+
const script = document.createElement("script");
|
|
6
|
+
script.src = resolveUrl(src);
|
|
7
|
+
for (const key in attrs) script.setAttribute(key, attrs[key]);
|
|
8
|
+
return new Promise((resolve, reject) => {
|
|
9
|
+
script.onload = () => {
|
|
10
|
+
resolve();
|
|
11
|
+
document.body.removeChild(script);
|
|
12
|
+
};
|
|
13
|
+
script.onerror = (e) => {
|
|
14
|
+
reject(e);
|
|
15
|
+
document.body.removeChild(script);
|
|
16
|
+
};
|
|
17
|
+
document.body.appendChild(script);
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
function doImport(src) {
|
|
21
|
+
return import(
|
|
22
|
+
/* @vite-ignore */
|
|
23
|
+
src
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
async function useImport(...src) {
|
|
27
|
+
if (src.length === 1) return doImport(src[0]);
|
|
28
|
+
const promises = [];
|
|
29
|
+
src.forEach((link) => {
|
|
30
|
+
promises.push(link instanceof Promise ? link : doImport(link));
|
|
31
|
+
});
|
|
32
|
+
return Promise.all(promises);
|
|
33
|
+
}
|
|
34
|
+
async function useSeriesImport(...src) {
|
|
35
|
+
const modules = [];
|
|
36
|
+
for (const source of src) {
|
|
37
|
+
if (Array.isArray(source)) {
|
|
38
|
+
const m = await useImport(...source);
|
|
39
|
+
modules.push(m);
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
const m = await useImport(source);
|
|
43
|
+
modules.push(m);
|
|
44
|
+
}
|
|
45
|
+
return modules;
|
|
46
|
+
}
|
|
47
|
+
async function useCssIncludes(...hrefs) {
|
|
48
|
+
const promises = hrefs.map((href) => {
|
|
49
|
+
return new Promise((resolve, reject) => {
|
|
50
|
+
resolveSource(href).then((href) => {
|
|
51
|
+
href = resolveUrl(href);
|
|
52
|
+
const link = document.createElement("link");
|
|
53
|
+
link.rel = "stylesheet";
|
|
54
|
+
link.href = href;
|
|
55
|
+
link.onload = () => resolve();
|
|
56
|
+
link.onerror = (e) => reject(e);
|
|
57
|
+
document.head.appendChild(link);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
return Promise.all(promises);
|
|
62
|
+
}
|
|
63
|
+
var importedSheets = {};
|
|
64
|
+
async function useCssImport(...hrefs) {
|
|
65
|
+
return injectCssToDocument(...(await Promise.all(hrefs.map((href) => {
|
|
66
|
+
return new Promise((resolve) => {
|
|
67
|
+
resolveSource(href).then((href) => {
|
|
68
|
+
href = resolveUrl(href);
|
|
69
|
+
if (!importedSheets[href]) importedSheets[href] = simulateCssImport(href);
|
|
70
|
+
resolve(importedSheets[href]);
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
}))).map((module) => module.default));
|
|
74
|
+
}
|
|
75
|
+
async function simulateCssImport(href) {
|
|
76
|
+
const response = await fetch(href);
|
|
77
|
+
if (!response.ok) throw new Error(`Failed to load CSS: ${href}`);
|
|
78
|
+
const cssText = await response.text();
|
|
79
|
+
const sheet = new CSSStyleSheet();
|
|
80
|
+
await sheet.replace(cssText);
|
|
81
|
+
return { default: sheet };
|
|
82
|
+
}
|
|
83
|
+
var importMap;
|
|
84
|
+
function parseImportMap() {
|
|
85
|
+
const importMapScript = document.querySelector("script[type=\"importmap\"]");
|
|
86
|
+
if (importMapScript) try {
|
|
87
|
+
return JSON.parse(importMapScript.textContent || "{}").imports || {};
|
|
88
|
+
} catch (e) {
|
|
89
|
+
console.error("Failed to parse import map:", e);
|
|
90
|
+
}
|
|
91
|
+
return {};
|
|
92
|
+
}
|
|
93
|
+
function resolveUrl(specifier) {
|
|
94
|
+
importMap ??= parseImportMap();
|
|
95
|
+
for (const [prefix, target] of Object.entries(importMap)) if (specifier === prefix) return target;
|
|
96
|
+
for (const [prefix, target] of Object.entries(importMap)) if (specifier.startsWith(prefix)) return specifier.replace(prefix, target);
|
|
97
|
+
return specifier;
|
|
98
|
+
}
|
|
99
|
+
async function resolveSource(src) {
|
|
100
|
+
if (typeof src === "function") return (await src()).default;
|
|
101
|
+
return src;
|
|
102
|
+
}
|
|
103
|
+
//#endregion
|
|
104
|
+
export { useScriptImport as a, useImport as i, useCssImport as n, useSeriesImport as o, useCssIncludes as r, doImport as t };
|
|
105
|
+
|
|
106
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","names":[],"sources":["../../src/service/loader.ts"],"sourcesContent":["import { Dictionary } from '../types';\nimport { injectCssToDocument } from './';\n\ntype Source = string | (() => Promise<{ default: string }>);\n\nexport async function useScriptImport(src: Source, attrs: Record<string, string> = {}): Promise<void> {\n if (typeof src === 'function') {\n src = (await src()).default;\n }\n\n const script = document.createElement('script');\n script.src = resolveUrl(src);\n\n for (const key in attrs) {\n script.setAttribute(key, attrs[key]);\n }\n\n return new Promise((resolve, reject) => {\n script.onload = () => {\n resolve();\n document.body.removeChild(script);\n };\n script.onerror = (e) => {\n reject(e);\n document.body.removeChild(script);\n };\n\n document.body.appendChild(script);\n });\n}\n\nexport function doImport<T = any>(src: string): Promise<T> {\n return import(/* @vite-ignore */src);\n}\n\nexport async function useImport(...src: any[]): Promise<any>;\nexport async function useImport<T extends any[]>(...src: string[]): Promise<T>;\nexport async function useImport<T = any>(src: string): Promise<{ default: T }>;\nexport async function useImport<D = any, C = any>(src: string): Promise<{ default: D } & Dictionary<C>>;\nexport async function useImport(...src: any[]): Promise<any> {\n if (src.length === 1) {\n return doImport(src[0]);\n }\n\n const promises: Promise<any>[] = [];\n\n src.forEach((link) => {\n promises.push(\n link instanceof Promise ? link : doImport(link)\n );\n });\n\n return Promise.all(promises);\n}\n\nexport async function useSeriesImport(...src: any[]): Promise<any>;\nexport async function useSeriesImport<T extends any[]>(...src: string[]): Promise<T>;\nexport async function useSeriesImport<T = any>(src: string): Promise<{ default: T }>;\nexport async function useSeriesImport<D = any, C = any>(src: string): Promise<{ default: D } & Dictionary<C>>;\nexport async function useSeriesImport(...src: any[]): Promise<any> {\n const modules: any[] = [];\n\n for (const source of src) {\n if (Array.isArray(source)) {\n const m = await useImport(...source);\n modules.push(m);\n\n continue;\n }\n\n const m = await useImport(source);\n\n modules.push(m);\n }\n\n return modules;\n}\n\nexport async function useCssIncludes(...hrefs: Source[]): Promise<void[]> {\n const promises = hrefs.map((href) => {\n return new Promise<void>((resolve, reject) => {\n resolveSource(href).then((href) => {\n href = resolveUrl(href);\n\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = href;\n link.onload = () => resolve();\n link.onerror = (e) => reject(e);\n\n document.head.appendChild(link);\n });\n });\n });\n\n return Promise.all(promises);\n}\n\nconst importedSheets: Record<string, Promise<{ default: CSSStyleSheet }>> = {};\n\nexport async function useCssImport(...hrefs: Source[]): Promise<CSSStyleSheet[]> {\n // Todo: Use `{ assert: { type: \"css\" }` after all browsers support it.\n const modules = await Promise.all(\n hrefs.map((href) => {\n return new Promise<{ default: CSSStyleSheet }>((resolve) => {\n resolveSource(href).then((href) => {\n href = resolveUrl(href);\n\n if (!importedSheets[href]) {\n importedSheets[href] = simulateCssImport(href);\n }\n\n resolve(importedSheets[href]);\n });\n });\n })\n );\n const styles = modules.map(module => module.default);\n\n return injectCssToDocument(...styles);\n}\n\nasync function simulateCssImport(href: string) {\n const response = await fetch(href);\n if (!response.ok) {\n throw new Error(`Failed to load CSS: ${href}`);\n }\n const cssText = await response.text();\n\n const sheet = new CSSStyleSheet();\n await sheet.replace(cssText);\n return { default: sheet };\n}\n\nlet importMap: Record<string, string>;\n\nfunction parseImportMap() {\n const importMapScript = document.querySelector('script[type=\"importmap\"]');\n if (importMapScript) {\n try {\n return JSON.parse(importMapScript.textContent || '{}').imports || {};\n } catch (e) {\n console.error('Failed to parse import map:', e);\n }\n }\n return {};\n}\n\nfunction resolveUrl(specifier: string) {\n importMap ??= parseImportMap();\n\n for (const [prefix, target] of Object.entries(importMap)) {\n if (specifier === prefix) {\n return target;\n }\n }\n\n for (const [prefix, target] of Object.entries(importMap)) {\n if (specifier.startsWith(prefix)) {\n return specifier.replace(prefix, target);\n }\n }\n return specifier;\n}\n\nasync function resolveSource(src: Source): Promise<string> {\n if (typeof src === 'function') {\n return (await src()).default;\n }\n\n return src;\n}\n"],"mappings":"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"}
|