@joycostudio/susano 0.0.3 → 0.1.0
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.d.mts +44 -4
- package/dist/index.d.ts +44 -4
- package/dist/index.js +249 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +245 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -2,15 +2,19 @@ import { TinyEmitter } from 'tiny-emitter';
|
|
|
2
2
|
|
|
3
3
|
type SusanoLoaderConfig<T> = {
|
|
4
4
|
onLoaded?: (loader: SusanoLoader<T>) => void;
|
|
5
|
+
onProgress?: (loader: SusanoLoader<T>) => void;
|
|
5
6
|
};
|
|
6
7
|
declare class SusanoLoader<T> extends TinyEmitter implements ISusanoLoader<T> {
|
|
7
8
|
url: string;
|
|
8
9
|
loaded: boolean;
|
|
9
10
|
content: T;
|
|
10
11
|
config: SusanoLoaderConfig<T>;
|
|
12
|
+
weight: number;
|
|
13
|
+
progress: number;
|
|
11
14
|
constructor(url: string, _cnfg?: SusanoLoaderConfig<T>);
|
|
12
15
|
load(): Promise<T>;
|
|
13
16
|
_onLoaded(): void;
|
|
17
|
+
_onProgress(value: number): void;
|
|
14
18
|
/**
|
|
15
19
|
* This is ment to be used as a way to attach to master loader events
|
|
16
20
|
*/
|
|
@@ -32,18 +36,46 @@ declare class ImageLoader extends SusanoLoader<HTMLImageElement> implements ISus
|
|
|
32
36
|
load(): Promise<HTMLImageElement>;
|
|
33
37
|
}
|
|
34
38
|
|
|
35
|
-
type LoadEvent = 'canplay' | 'canplaythrough';
|
|
39
|
+
type LoadEvent$1 = 'canplay' | 'canplaythrough';
|
|
36
40
|
type SusanoVideoLoaderConfig = SusanoLoaderConfig<HTMLVideoElement> & {
|
|
37
41
|
video?: HTMLVideoElement;
|
|
38
|
-
loadEvent?: LoadEvent;
|
|
42
|
+
loadEvent?: LoadEvent$1;
|
|
39
43
|
};
|
|
40
44
|
declare class VideoLoader extends SusanoLoader<HTMLVideoElement> implements ISusanoLoader<HTMLVideoElement> {
|
|
41
45
|
static type: "video";
|
|
42
|
-
loadEvent: LoadEvent;
|
|
46
|
+
loadEvent: LoadEvent$1;
|
|
43
47
|
constructor(url: string, cnfg?: SusanoVideoLoaderConfig);
|
|
44
48
|
load(): Promise<HTMLVideoElement>;
|
|
45
49
|
}
|
|
46
50
|
|
|
51
|
+
type LoadEvent = 'canplay' | 'canplaythrough';
|
|
52
|
+
type SusanoAudioLoaderConfig = SusanoLoaderConfig<HTMLAudioElement> & {
|
|
53
|
+
audio?: HTMLAudioElement;
|
|
54
|
+
loadEvent?: LoadEvent;
|
|
55
|
+
};
|
|
56
|
+
declare class AudioLoader extends SusanoLoader<HTMLAudioElement> implements ISusanoLoader<HTMLAudioElement> {
|
|
57
|
+
static type: "audio";
|
|
58
|
+
loadEvent: LoadEvent;
|
|
59
|
+
constructor(url: string, cnfg?: SusanoAudioLoaderConfig);
|
|
60
|
+
load(): Promise<HTMLAudioElement>;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
type GenericLoadFn = (config: {
|
|
64
|
+
url: string;
|
|
65
|
+
done: (generic: any) => void;
|
|
66
|
+
error: (error: Error) => void;
|
|
67
|
+
progress: (progress: number) => void;
|
|
68
|
+
}) => void;
|
|
69
|
+
type SusanoGenericLoaderConfig = SusanoLoaderConfig<any> & {
|
|
70
|
+
loadFn: GenericLoadFn;
|
|
71
|
+
};
|
|
72
|
+
declare class GenericLoader extends SusanoLoader<any> {
|
|
73
|
+
static type: "generic";
|
|
74
|
+
loadFn: GenericLoadFn;
|
|
75
|
+
constructor(url: string, cnfg: SusanoGenericLoaderConfig);
|
|
76
|
+
load(): Promise<any>;
|
|
77
|
+
}
|
|
78
|
+
|
|
47
79
|
type LoaderTypes = {
|
|
48
80
|
[K: string]: {
|
|
49
81
|
type: typeof K;
|
|
@@ -99,8 +131,16 @@ declare const susano: Susano<{
|
|
|
99
131
|
type: "video";
|
|
100
132
|
loader: typeof VideoLoader;
|
|
101
133
|
};
|
|
134
|
+
audio: {
|
|
135
|
+
type: "audio";
|
|
136
|
+
loader: typeof AudioLoader;
|
|
137
|
+
};
|
|
138
|
+
generic: {
|
|
139
|
+
type: "generic";
|
|
140
|
+
loader: typeof GenericLoader;
|
|
141
|
+
};
|
|
102
142
|
}>;
|
|
103
143
|
|
|
104
144
|
declare const VERSION: string;
|
|
105
145
|
|
|
106
|
-
export { type LoaderMap, type LoaderTypes, type ProgressEventArgs, Susano, VERSION, susano };
|
|
146
|
+
export { AudioLoader, type GenericLoadFn, GenericLoader, ImageLoader, type LoaderMap, type LoaderTypes, type ProgressEventArgs, Susano, type SusanoAudioLoaderConfig, type SusanoGenericLoaderConfig, type SusanoImageLoaderConfig, type SusanoVideoLoaderConfig, VERSION, VideoLoader, susano };
|
package/dist/index.d.ts
CHANGED
|
@@ -2,15 +2,19 @@ import { TinyEmitter } from 'tiny-emitter';
|
|
|
2
2
|
|
|
3
3
|
type SusanoLoaderConfig<T> = {
|
|
4
4
|
onLoaded?: (loader: SusanoLoader<T>) => void;
|
|
5
|
+
onProgress?: (loader: SusanoLoader<T>) => void;
|
|
5
6
|
};
|
|
6
7
|
declare class SusanoLoader<T> extends TinyEmitter implements ISusanoLoader<T> {
|
|
7
8
|
url: string;
|
|
8
9
|
loaded: boolean;
|
|
9
10
|
content: T;
|
|
10
11
|
config: SusanoLoaderConfig<T>;
|
|
12
|
+
weight: number;
|
|
13
|
+
progress: number;
|
|
11
14
|
constructor(url: string, _cnfg?: SusanoLoaderConfig<T>);
|
|
12
15
|
load(): Promise<T>;
|
|
13
16
|
_onLoaded(): void;
|
|
17
|
+
_onProgress(value: number): void;
|
|
14
18
|
/**
|
|
15
19
|
* This is ment to be used as a way to attach to master loader events
|
|
16
20
|
*/
|
|
@@ -32,18 +36,46 @@ declare class ImageLoader extends SusanoLoader<HTMLImageElement> implements ISus
|
|
|
32
36
|
load(): Promise<HTMLImageElement>;
|
|
33
37
|
}
|
|
34
38
|
|
|
35
|
-
type LoadEvent = 'canplay' | 'canplaythrough';
|
|
39
|
+
type LoadEvent$1 = 'canplay' | 'canplaythrough';
|
|
36
40
|
type SusanoVideoLoaderConfig = SusanoLoaderConfig<HTMLVideoElement> & {
|
|
37
41
|
video?: HTMLVideoElement;
|
|
38
|
-
loadEvent?: LoadEvent;
|
|
42
|
+
loadEvent?: LoadEvent$1;
|
|
39
43
|
};
|
|
40
44
|
declare class VideoLoader extends SusanoLoader<HTMLVideoElement> implements ISusanoLoader<HTMLVideoElement> {
|
|
41
45
|
static type: "video";
|
|
42
|
-
loadEvent: LoadEvent;
|
|
46
|
+
loadEvent: LoadEvent$1;
|
|
43
47
|
constructor(url: string, cnfg?: SusanoVideoLoaderConfig);
|
|
44
48
|
load(): Promise<HTMLVideoElement>;
|
|
45
49
|
}
|
|
46
50
|
|
|
51
|
+
type LoadEvent = 'canplay' | 'canplaythrough';
|
|
52
|
+
type SusanoAudioLoaderConfig = SusanoLoaderConfig<HTMLAudioElement> & {
|
|
53
|
+
audio?: HTMLAudioElement;
|
|
54
|
+
loadEvent?: LoadEvent;
|
|
55
|
+
};
|
|
56
|
+
declare class AudioLoader extends SusanoLoader<HTMLAudioElement> implements ISusanoLoader<HTMLAudioElement> {
|
|
57
|
+
static type: "audio";
|
|
58
|
+
loadEvent: LoadEvent;
|
|
59
|
+
constructor(url: string, cnfg?: SusanoAudioLoaderConfig);
|
|
60
|
+
load(): Promise<HTMLAudioElement>;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
type GenericLoadFn = (config: {
|
|
64
|
+
url: string;
|
|
65
|
+
done: (generic: any) => void;
|
|
66
|
+
error: (error: Error) => void;
|
|
67
|
+
progress: (progress: number) => void;
|
|
68
|
+
}) => void;
|
|
69
|
+
type SusanoGenericLoaderConfig = SusanoLoaderConfig<any> & {
|
|
70
|
+
loadFn: GenericLoadFn;
|
|
71
|
+
};
|
|
72
|
+
declare class GenericLoader extends SusanoLoader<any> {
|
|
73
|
+
static type: "generic";
|
|
74
|
+
loadFn: GenericLoadFn;
|
|
75
|
+
constructor(url: string, cnfg: SusanoGenericLoaderConfig);
|
|
76
|
+
load(): Promise<any>;
|
|
77
|
+
}
|
|
78
|
+
|
|
47
79
|
type LoaderTypes = {
|
|
48
80
|
[K: string]: {
|
|
49
81
|
type: typeof K;
|
|
@@ -99,8 +131,16 @@ declare const susano: Susano<{
|
|
|
99
131
|
type: "video";
|
|
100
132
|
loader: typeof VideoLoader;
|
|
101
133
|
};
|
|
134
|
+
audio: {
|
|
135
|
+
type: "audio";
|
|
136
|
+
loader: typeof AudioLoader;
|
|
137
|
+
};
|
|
138
|
+
generic: {
|
|
139
|
+
type: "generic";
|
|
140
|
+
loader: typeof GenericLoader;
|
|
141
|
+
};
|
|
102
142
|
}>;
|
|
103
143
|
|
|
104
144
|
declare const VERSION: string;
|
|
105
145
|
|
|
106
|
-
export { type LoaderMap, type LoaderTypes, type ProgressEventArgs, Susano, VERSION, susano };
|
|
146
|
+
export { AudioLoader, type GenericLoadFn, GenericLoader, ImageLoader, type LoaderMap, type LoaderTypes, type ProgressEventArgs, Susano, type SusanoAudioLoaderConfig, type SusanoGenericLoaderConfig, type SusanoImageLoaderConfig, type SusanoVideoLoaderConfig, VERSION, VideoLoader, susano };
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,250 @@
|
|
|
1
|
-
'use strict';
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var tinyEmitter = require('tiny-emitter');
|
|
4
|
+
|
|
5
|
+
// package.json
|
|
6
|
+
var version = "0.1.0";
|
|
7
|
+
var SusanoLoader = class extends tinyEmitter.TinyEmitter {
|
|
8
|
+
constructor(url, _cnfg = {}) {
|
|
9
|
+
super();
|
|
10
|
+
this.url = url;
|
|
11
|
+
this.loaded = false;
|
|
12
|
+
this.content = null;
|
|
13
|
+
this.config = _cnfg;
|
|
14
|
+
this.weight = 1;
|
|
15
|
+
this.progress = 0;
|
|
16
|
+
}
|
|
17
|
+
load() {
|
|
18
|
+
throw new Error("Method not implemented");
|
|
19
|
+
}
|
|
20
|
+
_onLoaded() {
|
|
21
|
+
this.loaded = true;
|
|
22
|
+
this.progress = 1;
|
|
23
|
+
this.emit("loaded", this);
|
|
24
|
+
this.config.onLoaded?.(this);
|
|
25
|
+
}
|
|
26
|
+
_onProgress(value) {
|
|
27
|
+
this.progress = value;
|
|
28
|
+
this.emit("progress", this);
|
|
29
|
+
this.config.onProgress?.(this);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* This is ment to be used as a way to attach to master loader events
|
|
33
|
+
*/
|
|
34
|
+
_appendConfig(cnfg) {
|
|
35
|
+
const _onLoaded = this.config.onLoaded;
|
|
36
|
+
this.config.onLoaded = (loader) => {
|
|
37
|
+
_onLoaded?.(loader);
|
|
38
|
+
cnfg.onLoaded?.(loader);
|
|
39
|
+
};
|
|
40
|
+
const _onProgress = this.config.onProgress;
|
|
41
|
+
this.config.onProgress = (loader) => {
|
|
42
|
+
_onProgress?.(loader);
|
|
43
|
+
cnfg.onProgress?.(loader);
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// packages/core/loaders/image.ts
|
|
49
|
+
var ImageLoader = class extends SusanoLoader {
|
|
50
|
+
constructor(url, cnfg = {}) {
|
|
51
|
+
super(url, cnfg);
|
|
52
|
+
this.content = new Image();
|
|
53
|
+
this.srcSet = cnfg.srcSet;
|
|
54
|
+
this.sizes = cnfg.sizes;
|
|
55
|
+
}
|
|
56
|
+
load() {
|
|
57
|
+
return new Promise((resolve, reject) => {
|
|
58
|
+
if (this.loaded) {
|
|
59
|
+
this._onLoaded.call(this);
|
|
60
|
+
resolve(this.content);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (this.srcSet) this.content.srcset = this.srcSet;
|
|
64
|
+
if (this.sizes) this.content.sizes = this.sizes;
|
|
65
|
+
this.content.src = this.url;
|
|
66
|
+
this.content.onload = () => {
|
|
67
|
+
this._onLoaded.call(this);
|
|
68
|
+
resolve(this.content);
|
|
69
|
+
};
|
|
70
|
+
this.content.onerror = (e) => reject(e);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
ImageLoader.type = "image";
|
|
75
|
+
|
|
76
|
+
// packages/core/loaders/video.ts
|
|
77
|
+
var VideoLoader = class extends SusanoLoader {
|
|
78
|
+
constructor(url, cnfg = {}) {
|
|
79
|
+
super(url, cnfg);
|
|
80
|
+
this.content = cnfg.video || document.createElement("video");
|
|
81
|
+
this.loadEvent = cnfg.loadEvent || "canplay";
|
|
82
|
+
}
|
|
83
|
+
load() {
|
|
84
|
+
return new Promise((resolve, reject) => {
|
|
85
|
+
const video = this.content;
|
|
86
|
+
if (this.loaded) {
|
|
87
|
+
this._onLoaded.call(this);
|
|
88
|
+
resolve(this.content);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
video.src = this.url;
|
|
92
|
+
video.addEventListener(this.loadEvent, () => {
|
|
93
|
+
this._onLoaded.call(this);
|
|
94
|
+
resolve(this.content);
|
|
95
|
+
});
|
|
96
|
+
video.addEventListener("error", (e) => reject(e));
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
VideoLoader.type = "video";
|
|
101
|
+
|
|
102
|
+
// packages/core/loaders/audio.ts
|
|
103
|
+
var AudioLoader = class extends SusanoLoader {
|
|
104
|
+
constructor(url, cnfg = {}) {
|
|
105
|
+
super(url, cnfg);
|
|
106
|
+
this.content = cnfg.audio || document.createElement("audio");
|
|
107
|
+
this.loadEvent = cnfg.loadEvent || "canplay";
|
|
108
|
+
}
|
|
109
|
+
load() {
|
|
110
|
+
return new Promise((resolve, reject) => {
|
|
111
|
+
const audio = this.content;
|
|
112
|
+
if (this.loaded) {
|
|
113
|
+
this._onLoaded.call(this);
|
|
114
|
+
resolve(this.content);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
audio.src = this.url;
|
|
118
|
+
audio.addEventListener(this.loadEvent, () => {
|
|
119
|
+
this._onLoaded.call(this);
|
|
120
|
+
resolve(this.content);
|
|
121
|
+
});
|
|
122
|
+
audio.addEventListener("error", (e) => reject(e));
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
AudioLoader.type = "audio";
|
|
127
|
+
|
|
128
|
+
// packages/core/loaders/generic.ts
|
|
129
|
+
var GenericLoader = class extends SusanoLoader {
|
|
130
|
+
constructor(url, cnfg) {
|
|
131
|
+
super(url, cnfg);
|
|
132
|
+
this.loadFn = cnfg.loadFn;
|
|
133
|
+
}
|
|
134
|
+
load() {
|
|
135
|
+
return new Promise((resolve, reject) => {
|
|
136
|
+
if (!this.loadFn) {
|
|
137
|
+
reject(new Error("No load function provided"));
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
if (this.loaded) {
|
|
141
|
+
this._onLoaded.call(this);
|
|
142
|
+
resolve(this.content);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
this.loadFn({
|
|
146
|
+
url: this.url,
|
|
147
|
+
done: (generic) => {
|
|
148
|
+
this.content = generic;
|
|
149
|
+
this._onLoaded.call(this);
|
|
150
|
+
resolve(generic);
|
|
151
|
+
},
|
|
152
|
+
error: reject,
|
|
153
|
+
/* 0 to 1 */
|
|
154
|
+
progress: (value) => {
|
|
155
|
+
this._onProgress.call(this, value);
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
GenericLoader.type = "generic";
|
|
162
|
+
|
|
163
|
+
// packages/core/core.tsx
|
|
164
|
+
var Susano = class extends tinyEmitter.TinyEmitter {
|
|
165
|
+
constructor() {
|
|
166
|
+
super();
|
|
167
|
+
this.loaders = {};
|
|
168
|
+
this.queue = [];
|
|
169
|
+
this.active = [];
|
|
170
|
+
this.items = /* @__PURE__ */ new Map();
|
|
171
|
+
this.loadCount = 0;
|
|
172
|
+
this.loadLength = 0;
|
|
173
|
+
}
|
|
174
|
+
add(url, cnfg) {
|
|
175
|
+
const Loader = this.loaders[cnfg.type];
|
|
176
|
+
if (!Loader) throw new Error(`Loader for type ${String(cnfg.type)} not found`);
|
|
177
|
+
let item = this.items.get(url);
|
|
178
|
+
if (!item) {
|
|
179
|
+
item = new Loader(url, cnfg.loaderArgs);
|
|
180
|
+
this.items.set(url, item);
|
|
181
|
+
} else if (cnfg.loaderArgs) {
|
|
182
|
+
item._appendConfig(cnfg.loaderArgs);
|
|
183
|
+
}
|
|
184
|
+
this.queue.push(item);
|
|
185
|
+
return item;
|
|
186
|
+
}
|
|
187
|
+
load(url, cnfg) {
|
|
188
|
+
const Loader = this.loaders[cnfg.type];
|
|
189
|
+
if (!Loader) throw new Error(`Loader for type ${String(cnfg.type)} not found`);
|
|
190
|
+
let item = this.items.get(url);
|
|
191
|
+
if (!item) {
|
|
192
|
+
item = new Loader(url, cnfg.loaderArgs);
|
|
193
|
+
this.items.set(url, item);
|
|
194
|
+
} else if (cnfg.loaderArgs) {
|
|
195
|
+
item._appendConfig(cnfg.loaderArgs);
|
|
196
|
+
}
|
|
197
|
+
item.load();
|
|
198
|
+
return item;
|
|
199
|
+
}
|
|
200
|
+
registerLoader(type, loader) {
|
|
201
|
+
this.loaders[type] = loader;
|
|
202
|
+
}
|
|
203
|
+
_onProgress(item) {
|
|
204
|
+
this.loadCount++;
|
|
205
|
+
const progress = this.loadCount / this.loadLength;
|
|
206
|
+
this.emit("progress", {
|
|
207
|
+
value: progress,
|
|
208
|
+
item,
|
|
209
|
+
susano: this
|
|
210
|
+
});
|
|
211
|
+
if (progress === 1) {
|
|
212
|
+
this.emit("completed", this);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
start({
|
|
217
|
+
onCompleted,
|
|
218
|
+
onProgress
|
|
219
|
+
} = {}) {
|
|
220
|
+
this.active = this.queue.splice(0, this.queue.length);
|
|
221
|
+
this.loadLength = this.active.length;
|
|
222
|
+
this.loadCount = 0;
|
|
223
|
+
this.emit("start", this);
|
|
224
|
+
if (onProgress) this.on("progress", onProgress);
|
|
225
|
+
this.once("completed", () => {
|
|
226
|
+
onCompleted?.(this);
|
|
227
|
+
if (onProgress) this.off("progress", onProgress);
|
|
228
|
+
});
|
|
229
|
+
this.active.map((item) => {
|
|
230
|
+
item.once("loaded", () => {
|
|
231
|
+
this._onProgress(item);
|
|
232
|
+
});
|
|
233
|
+
item.load();
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
var susano = new Susano();
|
|
238
|
+
susano.registerLoader(ImageLoader.type, ImageLoader);
|
|
239
|
+
susano.registerLoader(VideoLoader.type, VideoLoader);
|
|
240
|
+
susano.registerLoader(AudioLoader.type, AudioLoader);
|
|
241
|
+
susano.registerLoader(GenericLoader.type, GenericLoader);
|
|
242
|
+
|
|
243
|
+
// packages/core/index.ts
|
|
244
|
+
var VERSION = version;
|
|
245
|
+
|
|
246
|
+
exports.Susano = Susano;
|
|
247
|
+
exports.VERSION = VERSION;
|
|
248
|
+
exports.susano = susano;
|
|
249
|
+
//# sourceMappingURL=index.js.map
|
|
2
250
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../package.json","../src/loaders/loader.ts","../src/loaders/image.ts","../src/loaders/video.ts","../src/core.tsx","../src/index.ts"],"names":["version","SusanoLoader","TinyEmitter","url","_cnfg","cnfg","_onLoaded","loader","ImageLoader","resolve","reject","VideoLoader","video","e","Susano","Loader","item","type","progress","onCompleted","onProgress","susano","VERSION"],"mappings":"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","file":"index.js","sourcesContent":["{\n \"name\": \"@joycostudio/susano\",\n \"publishConfig\": {\n \"registry\": \"https://registry.npmjs.org\",\n \"access\": \"public\"\n },\n \"version\": \"0.0.3\",\n \"description\": \"Asset load orchestration made easy\",\n \"main\": \"dist/index.js\",\n \"module\": \"dist/index.mjs\",\n \"types\": \"dist/index.d.ts\",\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"concurrently \\\"tsup --watch\\\" \\\"cd templates/basic && pnpm dev\\\"\",\n \"typecheck\": \"tsc --noEmit\",\n \"version:package\": \"pnpm changeset version\",\n \"release\": \"pnpm build && pnpm changeset publish\",\n \"lint\": \"eslint -c ./eslint.config.mjs . --fix --no-cache\"\n },\n \"author\": \"@joycostudio\",\n \"license\": \"ISC\",\n \"devDependencies\": {\n \"@changesets/cli\": \"^2.27.11\",\n \"@eslint/js\": \"^9.18.0\",\n \"@types/node\": \"^20.11.24\",\n \"@types/react\": \"^18.2.61\",\n \"@typescript-eslint/eslint-plugin\": \"^8.21.0\",\n \"@typescript-eslint/parser\": \"^8.21.0\",\n \"concurrently\": \"^9.1.2\",\n \"eslint\": \"^9.18.0\",\n \"eslint-config-prettier\": \"^10.0.1\",\n \"eslint-plugin-prettier\": \"^5.2.3\",\n \"eslint-plugin-react\": \"^7.37.4\",\n \"eslint-plugin-react-compiler\": \"19.0.0-beta-decd7b8-20250118\",\n \"globals\": \"^15.14.0\",\n \"prettier\": \"^3.4.2\",\n \"react\": \"^18.2.0\",\n \"tsup\": \"^8.0.2\",\n \"typescript\": \"^5.7.3\",\n \"typescript-eslint\": \"^8.21.0\"\n },\n \"peerDependencies\": {\n \"react\": \">=16.8.0\"\n },\n \"dependencies\": {\n \"tiny-emitter\": \"^2.1.0\"\n }\n}","import { TinyEmitter } from 'tiny-emitter'\n\nexport type SusanoLoaderConfig<T> = {\n onLoaded?: (loader: SusanoLoader<T>) => void\n}\n\nexport class SusanoLoader<T> extends TinyEmitter implements ISusanoLoader<T> {\n public url: string\n public loaded: boolean\n public content: T\n public config: SusanoLoaderConfig<T>\n\n constructor(url: string, _cnfg: SusanoLoaderConfig<T> = {}) {\n super()\n this.url = url\n this.loaded = false\n this.content = null as unknown as T\n this.config = _cnfg\n }\n\n load(): Promise<T> {\n throw new Error('Method not implemented')\n }\n\n _onLoaded() {\n this.loaded = true\n this.emit('loaded', this)\n this.config.onLoaded?.(this)\n }\n\n /**\n * This is ment to be used as a way to attach to master loader events\n */\n _appendConfig(cnfg: SusanoLoaderConfig<T>) {\n const _onLoaded = this.config.onLoaded\n this.config.onLoaded = (loader) => {\n _onLoaded?.(loader)\n cnfg.onLoaded?.(loader)\n }\n }\n}\n\nexport interface ISusanoLoader<T> {\n load: () => Promise<T>\n}\n","import { ISusanoLoader, SusanoLoaderConfig, SusanoLoader } from './loader'\n\nexport type SusanoImageLoaderConfig = SusanoLoaderConfig<HTMLImageElement> & {\n srcSet?: string\n sizes?: string\n}\n\nexport class ImageLoader extends SusanoLoader<HTMLImageElement> implements ISusanoLoader<HTMLImageElement> {\n public static type = 'image' as const\n public srcSet?: string\n public sizes?: string\n\n constructor(url: string, cnfg: SusanoImageLoaderConfig = {}) {\n super(url, cnfg)\n this.content = new Image()\n this.srcSet = cnfg.srcSet\n this.sizes = cnfg.sizes\n }\n\n load(): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n if (this.loaded) {\n this._onLoaded.call(this)\n resolve(this.content)\n return\n }\n\n if (this.srcSet) this.content.srcset = this.srcSet\n if (this.sizes) this.content.sizes = this.sizes\n this.content.src = this.url\n\n this.content.onload = () => {\n this._onLoaded.call(this)\n resolve(this.content)\n }\n\n this.content.onerror = (e) => reject(e)\n })\n }\n}\n","import { ISusanoLoader, SusanoLoaderConfig, SusanoLoader } from './loader'\n\ntype LoadEvent = 'canplay' | 'canplaythrough'\n\nexport type SusanoVideoLoaderConfig = SusanoLoaderConfig<HTMLVideoElement> & {\n video?: HTMLVideoElement\n loadEvent?: LoadEvent\n}\n\nexport class VideoLoader extends SusanoLoader<HTMLVideoElement> implements ISusanoLoader<HTMLVideoElement> {\n public static type = 'video' as const\n public loadEvent: LoadEvent\n\n constructor(url: string, cnfg: SusanoVideoLoaderConfig = {}) {\n super(url, cnfg)\n this.content = cnfg.video || document.createElement('video')\n this.loadEvent = cnfg.loadEvent || 'canplay'\n }\n\n load(): Promise<HTMLVideoElement> {\n return new Promise((resolve, reject) => {\n const video = this.content\n\n if (this.loaded) {\n this._onLoaded.call(this)\n resolve(this.content)\n return\n }\n\n video.src = this.url\n\n video.addEventListener(this.loadEvent, () => {\n this._onLoaded.call(this)\n resolve(this.content)\n })\n\n video.addEventListener('error', (e) => reject(e))\n })\n }\n}\n","import { TinyEmitter } from 'tiny-emitter'\nimport { ImageLoader } from './loaders/image'\nimport { SusanoLoader } from './loaders/loader'\nimport { VideoLoader } from './loaders/video'\n\nexport type LoaderTypes = {\n [K: string]: {\n type: typeof K\n loader: typeof SusanoLoader<any>\n }\n}\n\nexport type LoaderMap<T extends LoaderTypes> = {\n [K in keyof T]: T[K]['loader']\n}\n\nexport type ProgressEventArgs = {\n value: number\n item: SusanoLoader<unknown>\n susano: Susano<any>\n}\n\n/**\n * Main loader class that manages loading of different asset types\n * @template T Type definition for the loaders to be used, extending LoaderTypes\n * @extends TinyEmitter\n */\nexport class Susano<T extends LoaderTypes> extends TinyEmitter {\n private loaders: LoaderMap<T> = {} as LoaderMap<T>\n public queue: InstanceType<T[keyof T]['loader']>[] = []\n public active: InstanceType<T[keyof T]['loader']>[] = []\n public items: Map<string, InstanceType<T[keyof T]['loader']>> = new Map()\n public loadCount: number = 0\n public loadLength: number = 0\n\n constructor() {\n super()\n }\n\n add<K extends keyof T>(\n url: string,\n cnfg: {\n type: K\n loaderArgs?: ConstructorParameters<T[K]['loader']>[1]\n }\n ): InstanceType<T[K]['loader']> {\n const Loader = this.loaders[cnfg.type]\n\n if (!Loader) throw new Error(`Loader for type ${String(cnfg.type)} not found`)\n\n let item = this.items.get(url)\n\n if (!item) {\n item = new Loader(url, cnfg.loaderArgs) as InstanceType<T[K]['loader']>\n this.items.set(url, item)\n } else if (cnfg.loaderArgs) {\n item._appendConfig(cnfg.loaderArgs)\n }\n\n this.queue.push(item)\n\n return item\n }\n\n load<K extends keyof T>(\n url: string,\n cnfg: {\n type: K\n loaderArgs?: ConstructorParameters<T[K]['loader']>[1]\n }\n ) {\n const Loader = this.loaders[cnfg.type]\n if (!Loader) throw new Error(`Loader for type ${String(cnfg.type)} not found`)\n\n let item = this.items.get(url)\n\n if (!item) {\n item = new Loader(url, cnfg.loaderArgs) as InstanceType<T[K]['loader']>\n this.items.set(url, item)\n } else if (cnfg.loaderArgs) {\n item._appendConfig(cnfg.loaderArgs)\n }\n\n item.load()\n\n return item\n }\n\n registerLoader<K extends keyof T>(type: K, loader: T[K]['loader']) {\n this.loaders[type] = loader\n }\n\n _onProgress(item: SusanoLoader<unknown>) {\n this.loadCount++\n\n // const idx = this.active.indexOf(item);\n // this.active.splice(idx, 1);\n\n const progress = this.loadCount / this.loadLength\n\n this.emit('progress', {\n value: progress,\n item: item,\n susano: this,\n } satisfies ProgressEventArgs)\n\n if (progress === 1) {\n this.emit('completed', this)\n return\n }\n }\n\n start({\n onCompleted,\n onProgress,\n }: {\n onCompleted?: (susano: Susano<T>) => void\n onProgress?: (progress: { value: number; item: SusanoLoader<unknown>; susano: Susano<T> }) => void\n } = {}) {\n this.active = this.queue.splice(0, this.queue.length)\n this.loadLength = this.active.length\n this.loadCount = 0\n\n this.emit('start', this)\n\n if (onProgress) this.on('progress', onProgress)\n\n this.once('completed', () => {\n onCompleted?.(this)\n if (onProgress) this.off('progress', onProgress)\n })\n\n this.active.map((item) => {\n item.once('loaded', () => {\n this._onProgress(item)\n })\n\n item.load()\n })\n }\n}\n\nexport const susano = new Susano<{\n image: {\n type: 'image'\n loader: typeof ImageLoader\n }\n video: {\n type: 'video'\n loader: typeof VideoLoader\n }\n}>()\n\nsusano.registerLoader(ImageLoader.type, ImageLoader)\nsusano.registerLoader(VideoLoader.type, VideoLoader)\n","import { version } from '../package.json'\n\nexport const VERSION = version\nexport * from './core'\n"]}
|
|
1
|
+
{"version":3,"sources":["../package.json","../packages/core/loaders/loader.ts","../packages/core/loaders/image.ts","../packages/core/loaders/video.ts","../packages/core/loaders/audio.ts","../packages/core/loaders/generic.ts","../packages/core/core.tsx","../packages/core/index.ts"],"names":["TinyEmitter"],"mappings":"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","file":"index.js","sourcesContent":["{\n \"name\": \"@joycostudio/susano\",\n \"publishConfig\": {\n \"registry\": \"https://registry.npmjs.org\",\n \"access\": \"public\"\n },\n \"version\": \"0.1.0\",\n \"description\": \"Asset load orchestration made easy\",\n \"main\": \"dist/index.js\",\n \"module\": \"dist/index.mjs\",\n \"types\": \"dist/index.d.ts\",\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"concurrently \\\"tsup --watch\\\" \\\"cd templates/basic && pnpm dev\\\"\",\n \"typecheck\": \"tsc --noEmit\",\n \"version:package\": \"pnpm changeset version\",\n \"release\": \"pnpm build && pnpm changeset publish\",\n \"lint\": \"eslint -c ./eslint.config.mjs . --fix --no-cache\"\n },\n \"packageManager\": \"pnpm@10.29.2\",\n \"author\": \"@joycostudio\",\n \"license\": \"ISC\",\n \"devDependencies\": {\n \"@changesets/cli\": \"^2.27.11\",\n \"@eslint/js\": \"^9.18.0\",\n \"@types/node\": \"^20.11.24\",\n \"@types/react\": \"^18.2.61\",\n \"@typescript-eslint/eslint-plugin\": \"^8.21.0\",\n \"@typescript-eslint/parser\": \"^8.21.0\",\n \"concurrently\": \"^9.1.2\",\n \"eslint\": \"^9.18.0\",\n \"eslint-config-prettier\": \"^10.0.1\",\n \"eslint-plugin-prettier\": \"^5.2.3\",\n \"eslint-plugin-react\": \"^7.37.4\",\n \"eslint-plugin-react-compiler\": \"19.0.0-beta-decd7b8-20250118\",\n \"globals\": \"^15.14.0\",\n \"prettier\": \"^3.4.2\",\n \"react\": \"^18.2.0\",\n \"tsup\": \"^8.0.2\",\n \"typescript\": \"^5.7.3\",\n \"typescript-eslint\": \"^8.21.0\"\n },\n \"peerDependencies\": {\n \"react\": \">=16.8.0\"\n },\n \"dependencies\": {\n \"tiny-emitter\": \"^2.1.0\"\n }\n}","import { TinyEmitter } from 'tiny-emitter'\n\nexport type SusanoLoaderConfig<T> = {\n onLoaded?: (loader: SusanoLoader<T>) => void\n onProgress?: (loader: SusanoLoader<T>) => void\n}\n\nexport class SusanoLoader<T> extends TinyEmitter implements ISusanoLoader<T> {\n public url: string\n public loaded: boolean\n public content: T\n public config: SusanoLoaderConfig<T>\n public weight: number\n public progress: number\n\n constructor(url: string, _cnfg: SusanoLoaderConfig<T> = {}) {\n super()\n this.url = url\n this.loaded = false\n this.content = null as unknown as T\n this.config = _cnfg\n this.weight = 1\n this.progress = 0\n }\n\n load(): Promise<T> {\n throw new Error('Method not implemented')\n }\n\n _onLoaded() {\n this.loaded = true\n this.progress = 1\n this.emit('loaded', this)\n this.config.onLoaded?.(this)\n }\n\n _onProgress(value: number) {\n this.progress = value\n this.emit('progress', this)\n this.config.onProgress?.(this)\n }\n\n /**\n * This is ment to be used as a way to attach to master loader events\n */\n _appendConfig(cnfg: SusanoLoaderConfig<T>) {\n const _onLoaded = this.config.onLoaded\n this.config.onLoaded = (loader) => {\n _onLoaded?.(loader)\n cnfg.onLoaded?.(loader)\n }\n\n const _onProgress = this.config.onProgress\n\n this.config.onProgress = (loader) => {\n _onProgress?.(loader)\n cnfg.onProgress?.(loader)\n }\n }\n}\n\nexport interface ISusanoLoader<T> {\n load: () => Promise<T>\n}\n","import { ISusanoLoader, SusanoLoaderConfig, SusanoLoader } from './loader'\n\nexport type SusanoImageLoaderConfig = SusanoLoaderConfig<HTMLImageElement> & {\n srcSet?: string\n sizes?: string\n}\n\nexport class ImageLoader extends SusanoLoader<HTMLImageElement> implements ISusanoLoader<HTMLImageElement> {\n public static type = 'image' as const\n public srcSet?: string\n public sizes?: string\n\n constructor(url: string, cnfg: SusanoImageLoaderConfig = {}) {\n super(url, cnfg)\n this.content = new Image()\n this.srcSet = cnfg.srcSet\n this.sizes = cnfg.sizes\n }\n\n load(): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n if (this.loaded) {\n this._onLoaded.call(this)\n resolve(this.content)\n return\n }\n\n if (this.srcSet) this.content.srcset = this.srcSet\n if (this.sizes) this.content.sizes = this.sizes\n this.content.src = this.url\n\n this.content.onload = () => {\n this._onLoaded.call(this)\n resolve(this.content)\n }\n\n this.content.onerror = (e) => reject(e)\n })\n }\n}\n","import { ISusanoLoader, SusanoLoaderConfig, SusanoLoader } from './loader'\n\ntype LoadEvent = 'canplay' | 'canplaythrough'\n\nexport type SusanoVideoLoaderConfig = SusanoLoaderConfig<HTMLVideoElement> & {\n video?: HTMLVideoElement\n loadEvent?: LoadEvent\n}\n\nexport class VideoLoader extends SusanoLoader<HTMLVideoElement> implements ISusanoLoader<HTMLVideoElement> {\n public static type = 'video' as const\n public loadEvent: LoadEvent\n\n constructor(url: string, cnfg: SusanoVideoLoaderConfig = {}) {\n super(url, cnfg)\n this.content = cnfg.video || document.createElement('video')\n this.loadEvent = cnfg.loadEvent || 'canplay'\n }\n\n load(): Promise<HTMLVideoElement> {\n return new Promise((resolve, reject) => {\n const video = this.content\n\n if (this.loaded) {\n this._onLoaded.call(this)\n resolve(this.content)\n return\n }\n\n video.src = this.url\n\n video.addEventListener(this.loadEvent, () => {\n this._onLoaded.call(this)\n resolve(this.content)\n })\n\n video.addEventListener('error', (e) => reject(e))\n })\n }\n}\n","import { ISusanoLoader, SusanoLoaderConfig, SusanoLoader } from './loader'\n\ntype LoadEvent = 'canplay' | 'canplaythrough'\n\nexport type SusanoAudioLoaderConfig = SusanoLoaderConfig<HTMLAudioElement> & {\n audio?: HTMLAudioElement\n loadEvent?: LoadEvent\n}\n\nexport class AudioLoader extends SusanoLoader<HTMLAudioElement> implements ISusanoLoader<HTMLAudioElement> {\n public static type = 'audio' as const\n public loadEvent: LoadEvent\n\n constructor(url: string, cnfg: SusanoAudioLoaderConfig = {}) {\n super(url, cnfg)\n this.content = cnfg.audio || document.createElement('audio')\n this.loadEvent = cnfg.loadEvent || 'canplay'\n }\n\n load(): Promise<HTMLAudioElement> {\n return new Promise((resolve, reject) => {\n const audio = this.content\n\n if (this.loaded) {\n this._onLoaded.call(this)\n resolve(this.content)\n return\n }\n\n audio.src = this.url\n\n audio.addEventListener(this.loadEvent, () => {\n this._onLoaded.call(this)\n resolve(this.content)\n })\n\n audio.addEventListener('error', (e) => reject(e))\n })\n }\n}\n","import { SusanoLoader, SusanoLoaderConfig } from './loader'\n\nexport type GenericLoadFn = (config: {\n url: string\n done: (generic: any) => void\n error: (error: Error) => void\n progress: (progress: number) => void\n}) => void\n\nexport type SusanoGenericLoaderConfig = SusanoLoaderConfig<any> & {\n loadFn: GenericLoadFn\n}\n\nexport class GenericLoader extends SusanoLoader<any> {\n public static type = 'generic' as const\n public loadFn: GenericLoadFn\n\n constructor(url: string, cnfg: SusanoGenericLoaderConfig) {\n super(url, cnfg)\n this.loadFn = cnfg.loadFn\n }\n\n load(): Promise<any> {\n return new Promise((resolve, reject) => {\n if (!this.loadFn) {\n reject(new Error('No load function provided'))\n return\n }\n\n if (this.loaded) {\n this._onLoaded.call(this)\n resolve(this.content)\n return\n }\n\n this.loadFn({\n url: this.url,\n done: (generic: any) => {\n this.content = generic\n this._onLoaded.call(this)\n resolve(generic)\n },\n error: reject,\n /* 0 to 1 */\n progress: (value: number) => {\n this._onProgress.call(this, value)\n },\n })\n })\n }\n}\n","import { TinyEmitter } from 'tiny-emitter'\nimport { SusanoLoader } from './loaders/loader'\nimport { ImageLoader, type SusanoImageLoaderConfig } from './loaders/image'\nimport { VideoLoader, type SusanoVideoLoaderConfig } from './loaders/video'\nimport { AudioLoader, type SusanoAudioLoaderConfig } from './loaders/audio'\nimport { GenericLoader, type GenericLoadFn, type SusanoGenericLoaderConfig } from './loaders/generic'\n\nexport type LoaderTypes = {\n [K: string]: {\n type: typeof K\n loader: typeof SusanoLoader<any>\n }\n}\n\nexport type LoaderMap<T extends LoaderTypes> = {\n [K in keyof T]: T[K]['loader']\n}\n\nexport type ProgressEventArgs = {\n value: number\n item: SusanoLoader<unknown>\n susano: Susano<any>\n}\n\n/**\n * Main loader class that manages loading of different asset types\n * @template T Type definition for the loaders to be used, extending LoaderTypes\n * @extends TinyEmitter\n */\nexport class Susano<T extends LoaderTypes> extends TinyEmitter {\n private loaders: LoaderMap<T> = {} as LoaderMap<T>\n public queue: InstanceType<T[keyof T]['loader']>[] = []\n public active: InstanceType<T[keyof T]['loader']>[] = []\n public items: Map<string, InstanceType<T[keyof T]['loader']>> = new Map()\n public loadCount: number = 0\n public loadLength: number = 0\n\n constructor() {\n super()\n }\n\n add<K extends keyof T>(\n url: string,\n cnfg: {\n type: K\n loaderArgs?: ConstructorParameters<T[K]['loader']>[1]\n }\n ): InstanceType<T[K]['loader']> {\n const Loader = this.loaders[cnfg.type]\n\n if (!Loader) throw new Error(`Loader for type ${String(cnfg.type)} not found`)\n\n let item = this.items.get(url)\n\n if (!item) {\n item = new Loader(url, cnfg.loaderArgs) as InstanceType<T[K]['loader']>\n this.items.set(url, item)\n } else if (cnfg.loaderArgs) {\n item._appendConfig(cnfg.loaderArgs)\n }\n\n this.queue.push(item)\n\n return item\n }\n\n load<K extends keyof T>(\n url: string,\n cnfg: {\n type: K\n loaderArgs?: ConstructorParameters<T[K]['loader']>[1]\n }\n ) {\n const Loader = this.loaders[cnfg.type]\n if (!Loader) throw new Error(`Loader for type ${String(cnfg.type)} not found`)\n\n let item = this.items.get(url)\n\n if (!item) {\n item = new Loader(url, cnfg.loaderArgs) as InstanceType<T[K]['loader']>\n this.items.set(url, item)\n } else if (cnfg.loaderArgs) {\n item._appendConfig(cnfg.loaderArgs)\n }\n\n item.load()\n\n return item\n }\n\n registerLoader<K extends keyof T>(type: K, loader: T[K]['loader']) {\n this.loaders[type] = loader\n }\n\n _onProgress(item: SusanoLoader<unknown>) {\n this.loadCount++\n\n // const idx = this.active.indexOf(item);\n // this.active.splice(idx, 1);\n\n const progress = this.loadCount / this.loadLength\n\n this.emit('progress', {\n value: progress,\n item: item,\n susano: this,\n } satisfies ProgressEventArgs)\n\n if (progress === 1) {\n this.emit('completed', this)\n return\n }\n }\n\n start({\n onCompleted,\n onProgress,\n }: {\n onCompleted?: (susano: Susano<T>) => void\n onProgress?: (progress: { value: number; item: SusanoLoader<unknown>; susano: Susano<T> }) => void\n } = {}) {\n this.active = this.queue.splice(0, this.queue.length)\n this.loadLength = this.active.length\n this.loadCount = 0\n\n this.emit('start', this)\n\n if (onProgress) this.on('progress', onProgress)\n\n this.once('completed', () => {\n onCompleted?.(this)\n if (onProgress) this.off('progress', onProgress)\n })\n\n this.active.map((item) => {\n item.once('loaded', () => {\n this._onProgress(item)\n })\n\n item.load()\n })\n }\n}\n\nexport const susano = new Susano<{\n image: {\n type: 'image'\n loader: typeof ImageLoader\n }\n video: {\n type: 'video'\n loader: typeof VideoLoader\n }\n audio: {\n type: 'audio'\n loader: typeof AudioLoader\n }\n generic: {\n type: 'generic'\n loader: typeof GenericLoader\n }\n}>()\n\nsusano.registerLoader(ImageLoader.type, ImageLoader)\nsusano.registerLoader(VideoLoader.type, VideoLoader)\nsusano.registerLoader(AudioLoader.type, AudioLoader)\nsusano.registerLoader(GenericLoader.type, GenericLoader)\n\nexport type {\n GenericLoadFn,\n SusanoImageLoaderConfig,\n SusanoVideoLoaderConfig,\n SusanoAudioLoaderConfig,\n SusanoGenericLoaderConfig,\n GenericLoader,\n ImageLoader,\n VideoLoader,\n AudioLoader,\n}\n","import { version } from '../../package.json'\n\nexport const VERSION = version\nexport * from './core'\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,246 @@
|
|
|
1
|
-
import {TinyEmitter}from'tiny-emitter';
|
|
1
|
+
import { TinyEmitter } from 'tiny-emitter';
|
|
2
|
+
|
|
3
|
+
// package.json
|
|
4
|
+
var version = "0.1.0";
|
|
5
|
+
var SusanoLoader = class extends TinyEmitter {
|
|
6
|
+
constructor(url, _cnfg = {}) {
|
|
7
|
+
super();
|
|
8
|
+
this.url = url;
|
|
9
|
+
this.loaded = false;
|
|
10
|
+
this.content = null;
|
|
11
|
+
this.config = _cnfg;
|
|
12
|
+
this.weight = 1;
|
|
13
|
+
this.progress = 0;
|
|
14
|
+
}
|
|
15
|
+
load() {
|
|
16
|
+
throw new Error("Method not implemented");
|
|
17
|
+
}
|
|
18
|
+
_onLoaded() {
|
|
19
|
+
this.loaded = true;
|
|
20
|
+
this.progress = 1;
|
|
21
|
+
this.emit("loaded", this);
|
|
22
|
+
this.config.onLoaded?.(this);
|
|
23
|
+
}
|
|
24
|
+
_onProgress(value) {
|
|
25
|
+
this.progress = value;
|
|
26
|
+
this.emit("progress", this);
|
|
27
|
+
this.config.onProgress?.(this);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* This is ment to be used as a way to attach to master loader events
|
|
31
|
+
*/
|
|
32
|
+
_appendConfig(cnfg) {
|
|
33
|
+
const _onLoaded = this.config.onLoaded;
|
|
34
|
+
this.config.onLoaded = (loader) => {
|
|
35
|
+
_onLoaded?.(loader);
|
|
36
|
+
cnfg.onLoaded?.(loader);
|
|
37
|
+
};
|
|
38
|
+
const _onProgress = this.config.onProgress;
|
|
39
|
+
this.config.onProgress = (loader) => {
|
|
40
|
+
_onProgress?.(loader);
|
|
41
|
+
cnfg.onProgress?.(loader);
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
// packages/core/loaders/image.ts
|
|
47
|
+
var ImageLoader = class extends SusanoLoader {
|
|
48
|
+
constructor(url, cnfg = {}) {
|
|
49
|
+
super(url, cnfg);
|
|
50
|
+
this.content = new Image();
|
|
51
|
+
this.srcSet = cnfg.srcSet;
|
|
52
|
+
this.sizes = cnfg.sizes;
|
|
53
|
+
}
|
|
54
|
+
load() {
|
|
55
|
+
return new Promise((resolve, reject) => {
|
|
56
|
+
if (this.loaded) {
|
|
57
|
+
this._onLoaded.call(this);
|
|
58
|
+
resolve(this.content);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (this.srcSet) this.content.srcset = this.srcSet;
|
|
62
|
+
if (this.sizes) this.content.sizes = this.sizes;
|
|
63
|
+
this.content.src = this.url;
|
|
64
|
+
this.content.onload = () => {
|
|
65
|
+
this._onLoaded.call(this);
|
|
66
|
+
resolve(this.content);
|
|
67
|
+
};
|
|
68
|
+
this.content.onerror = (e) => reject(e);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
ImageLoader.type = "image";
|
|
73
|
+
|
|
74
|
+
// packages/core/loaders/video.ts
|
|
75
|
+
var VideoLoader = class extends SusanoLoader {
|
|
76
|
+
constructor(url, cnfg = {}) {
|
|
77
|
+
super(url, cnfg);
|
|
78
|
+
this.content = cnfg.video || document.createElement("video");
|
|
79
|
+
this.loadEvent = cnfg.loadEvent || "canplay";
|
|
80
|
+
}
|
|
81
|
+
load() {
|
|
82
|
+
return new Promise((resolve, reject) => {
|
|
83
|
+
const video = this.content;
|
|
84
|
+
if (this.loaded) {
|
|
85
|
+
this._onLoaded.call(this);
|
|
86
|
+
resolve(this.content);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
video.src = this.url;
|
|
90
|
+
video.addEventListener(this.loadEvent, () => {
|
|
91
|
+
this._onLoaded.call(this);
|
|
92
|
+
resolve(this.content);
|
|
93
|
+
});
|
|
94
|
+
video.addEventListener("error", (e) => reject(e));
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
VideoLoader.type = "video";
|
|
99
|
+
|
|
100
|
+
// packages/core/loaders/audio.ts
|
|
101
|
+
var AudioLoader = class extends SusanoLoader {
|
|
102
|
+
constructor(url, cnfg = {}) {
|
|
103
|
+
super(url, cnfg);
|
|
104
|
+
this.content = cnfg.audio || document.createElement("audio");
|
|
105
|
+
this.loadEvent = cnfg.loadEvent || "canplay";
|
|
106
|
+
}
|
|
107
|
+
load() {
|
|
108
|
+
return new Promise((resolve, reject) => {
|
|
109
|
+
const audio = this.content;
|
|
110
|
+
if (this.loaded) {
|
|
111
|
+
this._onLoaded.call(this);
|
|
112
|
+
resolve(this.content);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
audio.src = this.url;
|
|
116
|
+
audio.addEventListener(this.loadEvent, () => {
|
|
117
|
+
this._onLoaded.call(this);
|
|
118
|
+
resolve(this.content);
|
|
119
|
+
});
|
|
120
|
+
audio.addEventListener("error", (e) => reject(e));
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
AudioLoader.type = "audio";
|
|
125
|
+
|
|
126
|
+
// packages/core/loaders/generic.ts
|
|
127
|
+
var GenericLoader = class extends SusanoLoader {
|
|
128
|
+
constructor(url, cnfg) {
|
|
129
|
+
super(url, cnfg);
|
|
130
|
+
this.loadFn = cnfg.loadFn;
|
|
131
|
+
}
|
|
132
|
+
load() {
|
|
133
|
+
return new Promise((resolve, reject) => {
|
|
134
|
+
if (!this.loadFn) {
|
|
135
|
+
reject(new Error("No load function provided"));
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (this.loaded) {
|
|
139
|
+
this._onLoaded.call(this);
|
|
140
|
+
resolve(this.content);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
this.loadFn({
|
|
144
|
+
url: this.url,
|
|
145
|
+
done: (generic) => {
|
|
146
|
+
this.content = generic;
|
|
147
|
+
this._onLoaded.call(this);
|
|
148
|
+
resolve(generic);
|
|
149
|
+
},
|
|
150
|
+
error: reject,
|
|
151
|
+
/* 0 to 1 */
|
|
152
|
+
progress: (value) => {
|
|
153
|
+
this._onProgress.call(this, value);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
GenericLoader.type = "generic";
|
|
160
|
+
|
|
161
|
+
// packages/core/core.tsx
|
|
162
|
+
var Susano = class extends TinyEmitter {
|
|
163
|
+
constructor() {
|
|
164
|
+
super();
|
|
165
|
+
this.loaders = {};
|
|
166
|
+
this.queue = [];
|
|
167
|
+
this.active = [];
|
|
168
|
+
this.items = /* @__PURE__ */ new Map();
|
|
169
|
+
this.loadCount = 0;
|
|
170
|
+
this.loadLength = 0;
|
|
171
|
+
}
|
|
172
|
+
add(url, cnfg) {
|
|
173
|
+
const Loader = this.loaders[cnfg.type];
|
|
174
|
+
if (!Loader) throw new Error(`Loader for type ${String(cnfg.type)} not found`);
|
|
175
|
+
let item = this.items.get(url);
|
|
176
|
+
if (!item) {
|
|
177
|
+
item = new Loader(url, cnfg.loaderArgs);
|
|
178
|
+
this.items.set(url, item);
|
|
179
|
+
} else if (cnfg.loaderArgs) {
|
|
180
|
+
item._appendConfig(cnfg.loaderArgs);
|
|
181
|
+
}
|
|
182
|
+
this.queue.push(item);
|
|
183
|
+
return item;
|
|
184
|
+
}
|
|
185
|
+
load(url, cnfg) {
|
|
186
|
+
const Loader = this.loaders[cnfg.type];
|
|
187
|
+
if (!Loader) throw new Error(`Loader for type ${String(cnfg.type)} not found`);
|
|
188
|
+
let item = this.items.get(url);
|
|
189
|
+
if (!item) {
|
|
190
|
+
item = new Loader(url, cnfg.loaderArgs);
|
|
191
|
+
this.items.set(url, item);
|
|
192
|
+
} else if (cnfg.loaderArgs) {
|
|
193
|
+
item._appendConfig(cnfg.loaderArgs);
|
|
194
|
+
}
|
|
195
|
+
item.load();
|
|
196
|
+
return item;
|
|
197
|
+
}
|
|
198
|
+
registerLoader(type, loader) {
|
|
199
|
+
this.loaders[type] = loader;
|
|
200
|
+
}
|
|
201
|
+
_onProgress(item) {
|
|
202
|
+
this.loadCount++;
|
|
203
|
+
const progress = this.loadCount / this.loadLength;
|
|
204
|
+
this.emit("progress", {
|
|
205
|
+
value: progress,
|
|
206
|
+
item,
|
|
207
|
+
susano: this
|
|
208
|
+
});
|
|
209
|
+
if (progress === 1) {
|
|
210
|
+
this.emit("completed", this);
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
start({
|
|
215
|
+
onCompleted,
|
|
216
|
+
onProgress
|
|
217
|
+
} = {}) {
|
|
218
|
+
this.active = this.queue.splice(0, this.queue.length);
|
|
219
|
+
this.loadLength = this.active.length;
|
|
220
|
+
this.loadCount = 0;
|
|
221
|
+
this.emit("start", this);
|
|
222
|
+
if (onProgress) this.on("progress", onProgress);
|
|
223
|
+
this.once("completed", () => {
|
|
224
|
+
onCompleted?.(this);
|
|
225
|
+
if (onProgress) this.off("progress", onProgress);
|
|
226
|
+
});
|
|
227
|
+
this.active.map((item) => {
|
|
228
|
+
item.once("loaded", () => {
|
|
229
|
+
this._onProgress(item);
|
|
230
|
+
});
|
|
231
|
+
item.load();
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
var susano = new Susano();
|
|
236
|
+
susano.registerLoader(ImageLoader.type, ImageLoader);
|
|
237
|
+
susano.registerLoader(VideoLoader.type, VideoLoader);
|
|
238
|
+
susano.registerLoader(AudioLoader.type, AudioLoader);
|
|
239
|
+
susano.registerLoader(GenericLoader.type, GenericLoader);
|
|
240
|
+
|
|
241
|
+
// packages/core/index.ts
|
|
242
|
+
var VERSION = version;
|
|
243
|
+
|
|
244
|
+
export { Susano, VERSION, susano };
|
|
245
|
+
//# sourceMappingURL=index.mjs.map
|
|
2
246
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../package.json","../src/loaders/loader.ts","../src/loaders/image.ts","../src/loaders/video.ts","../src/core.tsx","../src/index.ts"],"names":["version","SusanoLoader","TinyEmitter","url","_cnfg","cnfg","_onLoaded","loader","ImageLoader","resolve","reject","VideoLoader","video","e","Susano","Loader","item","type","progress","onCompleted","onProgress","susano","VERSION"],"mappings":"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","file":"index.mjs","sourcesContent":["{\n \"name\": \"@joycostudio/susano\",\n \"publishConfig\": {\n \"registry\": \"https://registry.npmjs.org\",\n \"access\": \"public\"\n },\n \"version\": \"0.0.3\",\n \"description\": \"Asset load orchestration made easy\",\n \"main\": \"dist/index.js\",\n \"module\": \"dist/index.mjs\",\n \"types\": \"dist/index.d.ts\",\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"concurrently \\\"tsup --watch\\\" \\\"cd templates/basic && pnpm dev\\\"\",\n \"typecheck\": \"tsc --noEmit\",\n \"version:package\": \"pnpm changeset version\",\n \"release\": \"pnpm build && pnpm changeset publish\",\n \"lint\": \"eslint -c ./eslint.config.mjs . --fix --no-cache\"\n },\n \"author\": \"@joycostudio\",\n \"license\": \"ISC\",\n \"devDependencies\": {\n \"@changesets/cli\": \"^2.27.11\",\n \"@eslint/js\": \"^9.18.0\",\n \"@types/node\": \"^20.11.24\",\n \"@types/react\": \"^18.2.61\",\n \"@typescript-eslint/eslint-plugin\": \"^8.21.0\",\n \"@typescript-eslint/parser\": \"^8.21.0\",\n \"concurrently\": \"^9.1.2\",\n \"eslint\": \"^9.18.0\",\n \"eslint-config-prettier\": \"^10.0.1\",\n \"eslint-plugin-prettier\": \"^5.2.3\",\n \"eslint-plugin-react\": \"^7.37.4\",\n \"eslint-plugin-react-compiler\": \"19.0.0-beta-decd7b8-20250118\",\n \"globals\": \"^15.14.0\",\n \"prettier\": \"^3.4.2\",\n \"react\": \"^18.2.0\",\n \"tsup\": \"^8.0.2\",\n \"typescript\": \"^5.7.3\",\n \"typescript-eslint\": \"^8.21.0\"\n },\n \"peerDependencies\": {\n \"react\": \">=16.8.0\"\n },\n \"dependencies\": {\n \"tiny-emitter\": \"^2.1.0\"\n }\n}","import { TinyEmitter } from 'tiny-emitter'\n\nexport type SusanoLoaderConfig<T> = {\n onLoaded?: (loader: SusanoLoader<T>) => void\n}\n\nexport class SusanoLoader<T> extends TinyEmitter implements ISusanoLoader<T> {\n public url: string\n public loaded: boolean\n public content: T\n public config: SusanoLoaderConfig<T>\n\n constructor(url: string, _cnfg: SusanoLoaderConfig<T> = {}) {\n super()\n this.url = url\n this.loaded = false\n this.content = null as unknown as T\n this.config = _cnfg\n }\n\n load(): Promise<T> {\n throw new Error('Method not implemented')\n }\n\n _onLoaded() {\n this.loaded = true\n this.emit('loaded', this)\n this.config.onLoaded?.(this)\n }\n\n /**\n * This is ment to be used as a way to attach to master loader events\n */\n _appendConfig(cnfg: SusanoLoaderConfig<T>) {\n const _onLoaded = this.config.onLoaded\n this.config.onLoaded = (loader) => {\n _onLoaded?.(loader)\n cnfg.onLoaded?.(loader)\n }\n }\n}\n\nexport interface ISusanoLoader<T> {\n load: () => Promise<T>\n}\n","import { ISusanoLoader, SusanoLoaderConfig, SusanoLoader } from './loader'\n\nexport type SusanoImageLoaderConfig = SusanoLoaderConfig<HTMLImageElement> & {\n srcSet?: string\n sizes?: string\n}\n\nexport class ImageLoader extends SusanoLoader<HTMLImageElement> implements ISusanoLoader<HTMLImageElement> {\n public static type = 'image' as const\n public srcSet?: string\n public sizes?: string\n\n constructor(url: string, cnfg: SusanoImageLoaderConfig = {}) {\n super(url, cnfg)\n this.content = new Image()\n this.srcSet = cnfg.srcSet\n this.sizes = cnfg.sizes\n }\n\n load(): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n if (this.loaded) {\n this._onLoaded.call(this)\n resolve(this.content)\n return\n }\n\n if (this.srcSet) this.content.srcset = this.srcSet\n if (this.sizes) this.content.sizes = this.sizes\n this.content.src = this.url\n\n this.content.onload = () => {\n this._onLoaded.call(this)\n resolve(this.content)\n }\n\n this.content.onerror = (e) => reject(e)\n })\n }\n}\n","import { ISusanoLoader, SusanoLoaderConfig, SusanoLoader } from './loader'\n\ntype LoadEvent = 'canplay' | 'canplaythrough'\n\nexport type SusanoVideoLoaderConfig = SusanoLoaderConfig<HTMLVideoElement> & {\n video?: HTMLVideoElement\n loadEvent?: LoadEvent\n}\n\nexport class VideoLoader extends SusanoLoader<HTMLVideoElement> implements ISusanoLoader<HTMLVideoElement> {\n public static type = 'video' as const\n public loadEvent: LoadEvent\n\n constructor(url: string, cnfg: SusanoVideoLoaderConfig = {}) {\n super(url, cnfg)\n this.content = cnfg.video || document.createElement('video')\n this.loadEvent = cnfg.loadEvent || 'canplay'\n }\n\n load(): Promise<HTMLVideoElement> {\n return new Promise((resolve, reject) => {\n const video = this.content\n\n if (this.loaded) {\n this._onLoaded.call(this)\n resolve(this.content)\n return\n }\n\n video.src = this.url\n\n video.addEventListener(this.loadEvent, () => {\n this._onLoaded.call(this)\n resolve(this.content)\n })\n\n video.addEventListener('error', (e) => reject(e))\n })\n }\n}\n","import { TinyEmitter } from 'tiny-emitter'\nimport { ImageLoader } from './loaders/image'\nimport { SusanoLoader } from './loaders/loader'\nimport { VideoLoader } from './loaders/video'\n\nexport type LoaderTypes = {\n [K: string]: {\n type: typeof K\n loader: typeof SusanoLoader<any>\n }\n}\n\nexport type LoaderMap<T extends LoaderTypes> = {\n [K in keyof T]: T[K]['loader']\n}\n\nexport type ProgressEventArgs = {\n value: number\n item: SusanoLoader<unknown>\n susano: Susano<any>\n}\n\n/**\n * Main loader class that manages loading of different asset types\n * @template T Type definition for the loaders to be used, extending LoaderTypes\n * @extends TinyEmitter\n */\nexport class Susano<T extends LoaderTypes> extends TinyEmitter {\n private loaders: LoaderMap<T> = {} as LoaderMap<T>\n public queue: InstanceType<T[keyof T]['loader']>[] = []\n public active: InstanceType<T[keyof T]['loader']>[] = []\n public items: Map<string, InstanceType<T[keyof T]['loader']>> = new Map()\n public loadCount: number = 0\n public loadLength: number = 0\n\n constructor() {\n super()\n }\n\n add<K extends keyof T>(\n url: string,\n cnfg: {\n type: K\n loaderArgs?: ConstructorParameters<T[K]['loader']>[1]\n }\n ): InstanceType<T[K]['loader']> {\n const Loader = this.loaders[cnfg.type]\n\n if (!Loader) throw new Error(`Loader for type ${String(cnfg.type)} not found`)\n\n let item = this.items.get(url)\n\n if (!item) {\n item = new Loader(url, cnfg.loaderArgs) as InstanceType<T[K]['loader']>\n this.items.set(url, item)\n } else if (cnfg.loaderArgs) {\n item._appendConfig(cnfg.loaderArgs)\n }\n\n this.queue.push(item)\n\n return item\n }\n\n load<K extends keyof T>(\n url: string,\n cnfg: {\n type: K\n loaderArgs?: ConstructorParameters<T[K]['loader']>[1]\n }\n ) {\n const Loader = this.loaders[cnfg.type]\n if (!Loader) throw new Error(`Loader for type ${String(cnfg.type)} not found`)\n\n let item = this.items.get(url)\n\n if (!item) {\n item = new Loader(url, cnfg.loaderArgs) as InstanceType<T[K]['loader']>\n this.items.set(url, item)\n } else if (cnfg.loaderArgs) {\n item._appendConfig(cnfg.loaderArgs)\n }\n\n item.load()\n\n return item\n }\n\n registerLoader<K extends keyof T>(type: K, loader: T[K]['loader']) {\n this.loaders[type] = loader\n }\n\n _onProgress(item: SusanoLoader<unknown>) {\n this.loadCount++\n\n // const idx = this.active.indexOf(item);\n // this.active.splice(idx, 1);\n\n const progress = this.loadCount / this.loadLength\n\n this.emit('progress', {\n value: progress,\n item: item,\n susano: this,\n } satisfies ProgressEventArgs)\n\n if (progress === 1) {\n this.emit('completed', this)\n return\n }\n }\n\n start({\n onCompleted,\n onProgress,\n }: {\n onCompleted?: (susano: Susano<T>) => void\n onProgress?: (progress: { value: number; item: SusanoLoader<unknown>; susano: Susano<T> }) => void\n } = {}) {\n this.active = this.queue.splice(0, this.queue.length)\n this.loadLength = this.active.length\n this.loadCount = 0\n\n this.emit('start', this)\n\n if (onProgress) this.on('progress', onProgress)\n\n this.once('completed', () => {\n onCompleted?.(this)\n if (onProgress) this.off('progress', onProgress)\n })\n\n this.active.map((item) => {\n item.once('loaded', () => {\n this._onProgress(item)\n })\n\n item.load()\n })\n }\n}\n\nexport const susano = new Susano<{\n image: {\n type: 'image'\n loader: typeof ImageLoader\n }\n video: {\n type: 'video'\n loader: typeof VideoLoader\n }\n}>()\n\nsusano.registerLoader(ImageLoader.type, ImageLoader)\nsusano.registerLoader(VideoLoader.type, VideoLoader)\n","import { version } from '../package.json'\n\nexport const VERSION = version\nexport * from './core'\n"]}
|
|
1
|
+
{"version":3,"sources":["../package.json","../packages/core/loaders/loader.ts","../packages/core/loaders/image.ts","../packages/core/loaders/video.ts","../packages/core/loaders/audio.ts","../packages/core/loaders/generic.ts","../packages/core/core.tsx","../packages/core/index.ts"],"names":["TinyEmitter"],"mappings":"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","file":"index.mjs","sourcesContent":["{\n \"name\": \"@joycostudio/susano\",\n \"publishConfig\": {\n \"registry\": \"https://registry.npmjs.org\",\n \"access\": \"public\"\n },\n \"version\": \"0.1.0\",\n \"description\": \"Asset load orchestration made easy\",\n \"main\": \"dist/index.js\",\n \"module\": \"dist/index.mjs\",\n \"types\": \"dist/index.d.ts\",\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"concurrently \\\"tsup --watch\\\" \\\"cd templates/basic && pnpm dev\\\"\",\n \"typecheck\": \"tsc --noEmit\",\n \"version:package\": \"pnpm changeset version\",\n \"release\": \"pnpm build && pnpm changeset publish\",\n \"lint\": \"eslint -c ./eslint.config.mjs . --fix --no-cache\"\n },\n \"packageManager\": \"pnpm@10.29.2\",\n \"author\": \"@joycostudio\",\n \"license\": \"ISC\",\n \"devDependencies\": {\n \"@changesets/cli\": \"^2.27.11\",\n \"@eslint/js\": \"^9.18.0\",\n \"@types/node\": \"^20.11.24\",\n \"@types/react\": \"^18.2.61\",\n \"@typescript-eslint/eslint-plugin\": \"^8.21.0\",\n \"@typescript-eslint/parser\": \"^8.21.0\",\n \"concurrently\": \"^9.1.2\",\n \"eslint\": \"^9.18.0\",\n \"eslint-config-prettier\": \"^10.0.1\",\n \"eslint-plugin-prettier\": \"^5.2.3\",\n \"eslint-plugin-react\": \"^7.37.4\",\n \"eslint-plugin-react-compiler\": \"19.0.0-beta-decd7b8-20250118\",\n \"globals\": \"^15.14.0\",\n \"prettier\": \"^3.4.2\",\n \"react\": \"^18.2.0\",\n \"tsup\": \"^8.0.2\",\n \"typescript\": \"^5.7.3\",\n \"typescript-eslint\": \"^8.21.0\"\n },\n \"peerDependencies\": {\n \"react\": \">=16.8.0\"\n },\n \"dependencies\": {\n \"tiny-emitter\": \"^2.1.0\"\n }\n}","import { TinyEmitter } from 'tiny-emitter'\n\nexport type SusanoLoaderConfig<T> = {\n onLoaded?: (loader: SusanoLoader<T>) => void\n onProgress?: (loader: SusanoLoader<T>) => void\n}\n\nexport class SusanoLoader<T> extends TinyEmitter implements ISusanoLoader<T> {\n public url: string\n public loaded: boolean\n public content: T\n public config: SusanoLoaderConfig<T>\n public weight: number\n public progress: number\n\n constructor(url: string, _cnfg: SusanoLoaderConfig<T> = {}) {\n super()\n this.url = url\n this.loaded = false\n this.content = null as unknown as T\n this.config = _cnfg\n this.weight = 1\n this.progress = 0\n }\n\n load(): Promise<T> {\n throw new Error('Method not implemented')\n }\n\n _onLoaded() {\n this.loaded = true\n this.progress = 1\n this.emit('loaded', this)\n this.config.onLoaded?.(this)\n }\n\n _onProgress(value: number) {\n this.progress = value\n this.emit('progress', this)\n this.config.onProgress?.(this)\n }\n\n /**\n * This is ment to be used as a way to attach to master loader events\n */\n _appendConfig(cnfg: SusanoLoaderConfig<T>) {\n const _onLoaded = this.config.onLoaded\n this.config.onLoaded = (loader) => {\n _onLoaded?.(loader)\n cnfg.onLoaded?.(loader)\n }\n\n const _onProgress = this.config.onProgress\n\n this.config.onProgress = (loader) => {\n _onProgress?.(loader)\n cnfg.onProgress?.(loader)\n }\n }\n}\n\nexport interface ISusanoLoader<T> {\n load: () => Promise<T>\n}\n","import { ISusanoLoader, SusanoLoaderConfig, SusanoLoader } from './loader'\n\nexport type SusanoImageLoaderConfig = SusanoLoaderConfig<HTMLImageElement> & {\n srcSet?: string\n sizes?: string\n}\n\nexport class ImageLoader extends SusanoLoader<HTMLImageElement> implements ISusanoLoader<HTMLImageElement> {\n public static type = 'image' as const\n public srcSet?: string\n public sizes?: string\n\n constructor(url: string, cnfg: SusanoImageLoaderConfig = {}) {\n super(url, cnfg)\n this.content = new Image()\n this.srcSet = cnfg.srcSet\n this.sizes = cnfg.sizes\n }\n\n load(): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n if (this.loaded) {\n this._onLoaded.call(this)\n resolve(this.content)\n return\n }\n\n if (this.srcSet) this.content.srcset = this.srcSet\n if (this.sizes) this.content.sizes = this.sizes\n this.content.src = this.url\n\n this.content.onload = () => {\n this._onLoaded.call(this)\n resolve(this.content)\n }\n\n this.content.onerror = (e) => reject(e)\n })\n }\n}\n","import { ISusanoLoader, SusanoLoaderConfig, SusanoLoader } from './loader'\n\ntype LoadEvent = 'canplay' | 'canplaythrough'\n\nexport type SusanoVideoLoaderConfig = SusanoLoaderConfig<HTMLVideoElement> & {\n video?: HTMLVideoElement\n loadEvent?: LoadEvent\n}\n\nexport class VideoLoader extends SusanoLoader<HTMLVideoElement> implements ISusanoLoader<HTMLVideoElement> {\n public static type = 'video' as const\n public loadEvent: LoadEvent\n\n constructor(url: string, cnfg: SusanoVideoLoaderConfig = {}) {\n super(url, cnfg)\n this.content = cnfg.video || document.createElement('video')\n this.loadEvent = cnfg.loadEvent || 'canplay'\n }\n\n load(): Promise<HTMLVideoElement> {\n return new Promise((resolve, reject) => {\n const video = this.content\n\n if (this.loaded) {\n this._onLoaded.call(this)\n resolve(this.content)\n return\n }\n\n video.src = this.url\n\n video.addEventListener(this.loadEvent, () => {\n this._onLoaded.call(this)\n resolve(this.content)\n })\n\n video.addEventListener('error', (e) => reject(e))\n })\n }\n}\n","import { ISusanoLoader, SusanoLoaderConfig, SusanoLoader } from './loader'\n\ntype LoadEvent = 'canplay' | 'canplaythrough'\n\nexport type SusanoAudioLoaderConfig = SusanoLoaderConfig<HTMLAudioElement> & {\n audio?: HTMLAudioElement\n loadEvent?: LoadEvent\n}\n\nexport class AudioLoader extends SusanoLoader<HTMLAudioElement> implements ISusanoLoader<HTMLAudioElement> {\n public static type = 'audio' as const\n public loadEvent: LoadEvent\n\n constructor(url: string, cnfg: SusanoAudioLoaderConfig = {}) {\n super(url, cnfg)\n this.content = cnfg.audio || document.createElement('audio')\n this.loadEvent = cnfg.loadEvent || 'canplay'\n }\n\n load(): Promise<HTMLAudioElement> {\n return new Promise((resolve, reject) => {\n const audio = this.content\n\n if (this.loaded) {\n this._onLoaded.call(this)\n resolve(this.content)\n return\n }\n\n audio.src = this.url\n\n audio.addEventListener(this.loadEvent, () => {\n this._onLoaded.call(this)\n resolve(this.content)\n })\n\n audio.addEventListener('error', (e) => reject(e))\n })\n }\n}\n","import { SusanoLoader, SusanoLoaderConfig } from './loader'\n\nexport type GenericLoadFn = (config: {\n url: string\n done: (generic: any) => void\n error: (error: Error) => void\n progress: (progress: number) => void\n}) => void\n\nexport type SusanoGenericLoaderConfig = SusanoLoaderConfig<any> & {\n loadFn: GenericLoadFn\n}\n\nexport class GenericLoader extends SusanoLoader<any> {\n public static type = 'generic' as const\n public loadFn: GenericLoadFn\n\n constructor(url: string, cnfg: SusanoGenericLoaderConfig) {\n super(url, cnfg)\n this.loadFn = cnfg.loadFn\n }\n\n load(): Promise<any> {\n return new Promise((resolve, reject) => {\n if (!this.loadFn) {\n reject(new Error('No load function provided'))\n return\n }\n\n if (this.loaded) {\n this._onLoaded.call(this)\n resolve(this.content)\n return\n }\n\n this.loadFn({\n url: this.url,\n done: (generic: any) => {\n this.content = generic\n this._onLoaded.call(this)\n resolve(generic)\n },\n error: reject,\n /* 0 to 1 */\n progress: (value: number) => {\n this._onProgress.call(this, value)\n },\n })\n })\n }\n}\n","import { TinyEmitter } from 'tiny-emitter'\nimport { SusanoLoader } from './loaders/loader'\nimport { ImageLoader, type SusanoImageLoaderConfig } from './loaders/image'\nimport { VideoLoader, type SusanoVideoLoaderConfig } from './loaders/video'\nimport { AudioLoader, type SusanoAudioLoaderConfig } from './loaders/audio'\nimport { GenericLoader, type GenericLoadFn, type SusanoGenericLoaderConfig } from './loaders/generic'\n\nexport type LoaderTypes = {\n [K: string]: {\n type: typeof K\n loader: typeof SusanoLoader<any>\n }\n}\n\nexport type LoaderMap<T extends LoaderTypes> = {\n [K in keyof T]: T[K]['loader']\n}\n\nexport type ProgressEventArgs = {\n value: number\n item: SusanoLoader<unknown>\n susano: Susano<any>\n}\n\n/**\n * Main loader class that manages loading of different asset types\n * @template T Type definition for the loaders to be used, extending LoaderTypes\n * @extends TinyEmitter\n */\nexport class Susano<T extends LoaderTypes> extends TinyEmitter {\n private loaders: LoaderMap<T> = {} as LoaderMap<T>\n public queue: InstanceType<T[keyof T]['loader']>[] = []\n public active: InstanceType<T[keyof T]['loader']>[] = []\n public items: Map<string, InstanceType<T[keyof T]['loader']>> = new Map()\n public loadCount: number = 0\n public loadLength: number = 0\n\n constructor() {\n super()\n }\n\n add<K extends keyof T>(\n url: string,\n cnfg: {\n type: K\n loaderArgs?: ConstructorParameters<T[K]['loader']>[1]\n }\n ): InstanceType<T[K]['loader']> {\n const Loader = this.loaders[cnfg.type]\n\n if (!Loader) throw new Error(`Loader for type ${String(cnfg.type)} not found`)\n\n let item = this.items.get(url)\n\n if (!item) {\n item = new Loader(url, cnfg.loaderArgs) as InstanceType<T[K]['loader']>\n this.items.set(url, item)\n } else if (cnfg.loaderArgs) {\n item._appendConfig(cnfg.loaderArgs)\n }\n\n this.queue.push(item)\n\n return item\n }\n\n load<K extends keyof T>(\n url: string,\n cnfg: {\n type: K\n loaderArgs?: ConstructorParameters<T[K]['loader']>[1]\n }\n ) {\n const Loader = this.loaders[cnfg.type]\n if (!Loader) throw new Error(`Loader for type ${String(cnfg.type)} not found`)\n\n let item = this.items.get(url)\n\n if (!item) {\n item = new Loader(url, cnfg.loaderArgs) as InstanceType<T[K]['loader']>\n this.items.set(url, item)\n } else if (cnfg.loaderArgs) {\n item._appendConfig(cnfg.loaderArgs)\n }\n\n item.load()\n\n return item\n }\n\n registerLoader<K extends keyof T>(type: K, loader: T[K]['loader']) {\n this.loaders[type] = loader\n }\n\n _onProgress(item: SusanoLoader<unknown>) {\n this.loadCount++\n\n // const idx = this.active.indexOf(item);\n // this.active.splice(idx, 1);\n\n const progress = this.loadCount / this.loadLength\n\n this.emit('progress', {\n value: progress,\n item: item,\n susano: this,\n } satisfies ProgressEventArgs)\n\n if (progress === 1) {\n this.emit('completed', this)\n return\n }\n }\n\n start({\n onCompleted,\n onProgress,\n }: {\n onCompleted?: (susano: Susano<T>) => void\n onProgress?: (progress: { value: number; item: SusanoLoader<unknown>; susano: Susano<T> }) => void\n } = {}) {\n this.active = this.queue.splice(0, this.queue.length)\n this.loadLength = this.active.length\n this.loadCount = 0\n\n this.emit('start', this)\n\n if (onProgress) this.on('progress', onProgress)\n\n this.once('completed', () => {\n onCompleted?.(this)\n if (onProgress) this.off('progress', onProgress)\n })\n\n this.active.map((item) => {\n item.once('loaded', () => {\n this._onProgress(item)\n })\n\n item.load()\n })\n }\n}\n\nexport const susano = new Susano<{\n image: {\n type: 'image'\n loader: typeof ImageLoader\n }\n video: {\n type: 'video'\n loader: typeof VideoLoader\n }\n audio: {\n type: 'audio'\n loader: typeof AudioLoader\n }\n generic: {\n type: 'generic'\n loader: typeof GenericLoader\n }\n}>()\n\nsusano.registerLoader(ImageLoader.type, ImageLoader)\nsusano.registerLoader(VideoLoader.type, VideoLoader)\nsusano.registerLoader(AudioLoader.type, AudioLoader)\nsusano.registerLoader(GenericLoader.type, GenericLoader)\n\nexport type {\n GenericLoadFn,\n SusanoImageLoaderConfig,\n SusanoVideoLoaderConfig,\n SusanoAudioLoaderConfig,\n SusanoGenericLoaderConfig,\n GenericLoader,\n ImageLoader,\n VideoLoader,\n AudioLoader,\n}\n","import { version } from '../../package.json'\n\nexport const VERSION = version\nexport * from './core'\n"]}
|