@joycostudio/susano 0.1.1 → 0.2.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 CHANGED
@@ -1,63 +1,70 @@
1
1
  import { TinyEmitter } from 'tiny-emitter';
2
2
 
3
- type SusanoLoaderConfig<T> = {
4
- onLoaded?: (loader: SusanoLoader<T>) => void;
5
- onProgress?: (loader: SusanoLoader<T>) => void;
3
+ type SusanoLoaderConfig<T, R = T> = {
4
+ onLoaded?: (loader: SusanoLoader<T, R>) => void;
5
+ onProgress?: (loader: SusanoLoader<T, R>) => void;
6
+ postprocess?: (content: T, loader: SusanoLoader<T, R>) => R | Promise<R>;
6
7
  };
7
- declare class SusanoLoader<T> extends TinyEmitter implements ISusanoLoader<T> {
8
+ declare class SusanoLoader<T, R = T> extends TinyEmitter implements ISusanoLoader<T, R> {
8
9
  url: string;
9
10
  loaded: boolean;
10
11
  content: T;
11
- config: SusanoLoaderConfig<T>;
12
+ config: SusanoLoaderConfig<T, R>;
12
13
  weight: number;
13
14
  progress: number;
14
- constructor(url: string, _cnfg?: SusanoLoaderConfig<T>);
15
- load(): Promise<T>;
15
+ promise: Promise<R>;
16
+ private _resolve;
17
+ private _reject;
18
+ constructor(url: string, _cnfg?: SusanoLoaderConfig<T, R>);
19
+ load(): Promise<R>;
16
20
  _onLoaded(): void;
21
+ private _finalize;
22
+ _onError(error: unknown): void;
23
+ private _resetPromise;
17
24
  _onProgress(value: number): void;
18
25
  /**
19
26
  * This is ment to be used as a way to attach to master loader events
20
27
  */
21
- _appendConfig(cnfg: SusanoLoaderConfig<T>): void;
28
+ _appendConfig(cnfg: SusanoLoaderConfig<T, R>): void;
22
29
  }
23
- interface ISusanoLoader<T> {
24
- load: () => Promise<T>;
30
+ interface ISusanoLoader<T, R = T> {
31
+ load: () => Promise<R>;
25
32
  }
26
33
 
27
- type SusanoImageLoaderConfig = SusanoLoaderConfig<HTMLImageElement> & {
34
+ type SusanoImageLoaderConfig<R = HTMLImageElement> = SusanoLoaderConfig<HTMLImageElement, R> & {
28
35
  srcSet?: string;
29
36
  sizes?: string;
30
37
  };
31
- declare class ImageLoader extends SusanoLoader<HTMLImageElement> implements ISusanoLoader<HTMLImageElement> {
38
+ declare class ImageLoader<R = HTMLImageElement> extends SusanoLoader<HTMLImageElement, R> implements ISusanoLoader<HTMLImageElement, R> {
32
39
  static type: "image";
33
40
  srcSet?: string;
34
41
  sizes?: string;
35
- constructor(url: string, cnfg?: SusanoImageLoaderConfig);
36
- load(): Promise<HTMLImageElement>;
42
+ constructor(url: string, cnfg?: SusanoImageLoaderConfig<R>);
43
+ load(): Promise<R>;
37
44
  }
38
45
 
39
46
  type LoadEvent$1 = 'canplay' | 'canplaythrough';
40
- type SusanoVideoLoaderConfig = SusanoLoaderConfig<HTMLVideoElement> & {
47
+ type SusanoVideoLoaderConfig<R = HTMLVideoElement> = SusanoLoaderConfig<HTMLVideoElement, R> & {
41
48
  video?: HTMLVideoElement;
42
49
  loadEvent?: LoadEvent$1;
43
50
  };
44
- declare class VideoLoader extends SusanoLoader<HTMLVideoElement> implements ISusanoLoader<HTMLVideoElement> {
51
+ declare class VideoLoader<R = HTMLVideoElement> extends SusanoLoader<HTMLVideoElement, R> implements ISusanoLoader<HTMLVideoElement, R> {
45
52
  static type: "video";
46
53
  loadEvent: LoadEvent$1;
47
- constructor(url: string, cnfg?: SusanoVideoLoaderConfig);
48
- load(): Promise<HTMLVideoElement>;
54
+ constructor(url: string, cnfg?: SusanoVideoLoaderConfig<R>);
55
+ load(): Promise<R>;
49
56
  }
50
57
 
51
58
  type LoadEvent = 'canplay' | 'canplaythrough';
52
- type SusanoAudioLoaderConfig = SusanoLoaderConfig<HTMLAudioElement> & {
59
+ type SusanoAudioLoaderConfig<R = HTMLAudioElement> = SusanoLoaderConfig<HTMLAudioElement, R> & {
53
60
  audio?: HTMLAudioElement;
54
61
  loadEvent?: LoadEvent;
55
62
  };
56
- declare class AudioLoader extends SusanoLoader<HTMLAudioElement> implements ISusanoLoader<HTMLAudioElement> {
63
+ declare class AudioLoader<R = HTMLAudioElement> extends SusanoLoader<HTMLAudioElement, R> implements ISusanoLoader<HTMLAudioElement, R> {
57
64
  static type: "audio";
58
65
  loadEvent: LoadEvent;
59
- constructor(url: string, cnfg?: SusanoAudioLoaderConfig);
60
- load(): Promise<HTMLAudioElement>;
66
+ constructor(url: string, cnfg?: SusanoAudioLoaderConfig<R>);
67
+ load(): Promise<R>;
61
68
  }
62
69
 
63
70
  type GenericLoadFn = (config: {
@@ -66,14 +73,14 @@ type GenericLoadFn = (config: {
66
73
  error: (error: Error) => void;
67
74
  progress: (progress: number) => void;
68
75
  }) => void;
69
- type SusanoGenericLoaderConfig = SusanoLoaderConfig<any> & {
76
+ type SusanoGenericLoaderConfig<R = any> = SusanoLoaderConfig<any, R> & {
70
77
  loadFn: GenericLoadFn;
71
78
  };
72
- declare class GenericLoader extends SusanoLoader<any> {
79
+ declare class GenericLoader<R = any> extends SusanoLoader<any, R> {
73
80
  static type: "generic";
74
81
  loadFn: GenericLoadFn;
75
- constructor(url: string, cnfg: SusanoGenericLoaderConfig);
76
- load(): Promise<any>;
82
+ constructor(url: string, cnfg: SusanoGenericLoaderConfig<R>);
83
+ load(): Promise<R>;
77
84
  }
78
85
 
79
86
  type LoaderTypes = {
@@ -87,7 +94,7 @@ type LoaderMap<T extends LoaderTypes> = {
87
94
  };
88
95
  type ProgressEventArgs = {
89
96
  value: number;
90
- item: SusanoLoader<unknown>;
97
+ item: SusanoLoader<unknown, unknown>;
91
98
  susano: Susano<any>;
92
99
  };
93
100
  /**
@@ -112,12 +119,12 @@ declare class Susano<T extends LoaderTypes> extends TinyEmitter {
112
119
  loaderArgs?: ConstructorParameters<T[K]['loader']>[1];
113
120
  }): InstanceType<T[keyof T]["loader"]>;
114
121
  registerLoader<K extends keyof T>(type: K, loader: T[K]['loader']): void;
115
- _onProgress(item: SusanoLoader<unknown>): void;
122
+ _onProgress(item: SusanoLoader<unknown, unknown>): void;
116
123
  start({ onCompleted, onProgress, }?: {
117
124
  onCompleted?: (susano: Susano<T>) => void;
118
125
  onProgress?: (progress: {
119
126
  value: number;
120
- item: SusanoLoader<unknown>;
127
+ item: SusanoLoader<unknown, unknown>;
121
128
  susano: Susano<T>;
122
129
  }) => void;
123
130
  }): void;
package/dist/index.d.ts CHANGED
@@ -1,63 +1,70 @@
1
1
  import { TinyEmitter } from 'tiny-emitter';
2
2
 
3
- type SusanoLoaderConfig<T> = {
4
- onLoaded?: (loader: SusanoLoader<T>) => void;
5
- onProgress?: (loader: SusanoLoader<T>) => void;
3
+ type SusanoLoaderConfig<T, R = T> = {
4
+ onLoaded?: (loader: SusanoLoader<T, R>) => void;
5
+ onProgress?: (loader: SusanoLoader<T, R>) => void;
6
+ postprocess?: (content: T, loader: SusanoLoader<T, R>) => R | Promise<R>;
6
7
  };
7
- declare class SusanoLoader<T> extends TinyEmitter implements ISusanoLoader<T> {
8
+ declare class SusanoLoader<T, R = T> extends TinyEmitter implements ISusanoLoader<T, R> {
8
9
  url: string;
9
10
  loaded: boolean;
10
11
  content: T;
11
- config: SusanoLoaderConfig<T>;
12
+ config: SusanoLoaderConfig<T, R>;
12
13
  weight: number;
13
14
  progress: number;
14
- constructor(url: string, _cnfg?: SusanoLoaderConfig<T>);
15
- load(): Promise<T>;
15
+ promise: Promise<R>;
16
+ private _resolve;
17
+ private _reject;
18
+ constructor(url: string, _cnfg?: SusanoLoaderConfig<T, R>);
19
+ load(): Promise<R>;
16
20
  _onLoaded(): void;
21
+ private _finalize;
22
+ _onError(error: unknown): void;
23
+ private _resetPromise;
17
24
  _onProgress(value: number): void;
18
25
  /**
19
26
  * This is ment to be used as a way to attach to master loader events
20
27
  */
21
- _appendConfig(cnfg: SusanoLoaderConfig<T>): void;
28
+ _appendConfig(cnfg: SusanoLoaderConfig<T, R>): void;
22
29
  }
23
- interface ISusanoLoader<T> {
24
- load: () => Promise<T>;
30
+ interface ISusanoLoader<T, R = T> {
31
+ load: () => Promise<R>;
25
32
  }
26
33
 
27
- type SusanoImageLoaderConfig = SusanoLoaderConfig<HTMLImageElement> & {
34
+ type SusanoImageLoaderConfig<R = HTMLImageElement> = SusanoLoaderConfig<HTMLImageElement, R> & {
28
35
  srcSet?: string;
29
36
  sizes?: string;
30
37
  };
31
- declare class ImageLoader extends SusanoLoader<HTMLImageElement> implements ISusanoLoader<HTMLImageElement> {
38
+ declare class ImageLoader<R = HTMLImageElement> extends SusanoLoader<HTMLImageElement, R> implements ISusanoLoader<HTMLImageElement, R> {
32
39
  static type: "image";
33
40
  srcSet?: string;
34
41
  sizes?: string;
35
- constructor(url: string, cnfg?: SusanoImageLoaderConfig);
36
- load(): Promise<HTMLImageElement>;
42
+ constructor(url: string, cnfg?: SusanoImageLoaderConfig<R>);
43
+ load(): Promise<R>;
37
44
  }
38
45
 
39
46
  type LoadEvent$1 = 'canplay' | 'canplaythrough';
40
- type SusanoVideoLoaderConfig = SusanoLoaderConfig<HTMLVideoElement> & {
47
+ type SusanoVideoLoaderConfig<R = HTMLVideoElement> = SusanoLoaderConfig<HTMLVideoElement, R> & {
41
48
  video?: HTMLVideoElement;
42
49
  loadEvent?: LoadEvent$1;
43
50
  };
44
- declare class VideoLoader extends SusanoLoader<HTMLVideoElement> implements ISusanoLoader<HTMLVideoElement> {
51
+ declare class VideoLoader<R = HTMLVideoElement> extends SusanoLoader<HTMLVideoElement, R> implements ISusanoLoader<HTMLVideoElement, R> {
45
52
  static type: "video";
46
53
  loadEvent: LoadEvent$1;
47
- constructor(url: string, cnfg?: SusanoVideoLoaderConfig);
48
- load(): Promise<HTMLVideoElement>;
54
+ constructor(url: string, cnfg?: SusanoVideoLoaderConfig<R>);
55
+ load(): Promise<R>;
49
56
  }
50
57
 
51
58
  type LoadEvent = 'canplay' | 'canplaythrough';
52
- type SusanoAudioLoaderConfig = SusanoLoaderConfig<HTMLAudioElement> & {
59
+ type SusanoAudioLoaderConfig<R = HTMLAudioElement> = SusanoLoaderConfig<HTMLAudioElement, R> & {
53
60
  audio?: HTMLAudioElement;
54
61
  loadEvent?: LoadEvent;
55
62
  };
56
- declare class AudioLoader extends SusanoLoader<HTMLAudioElement> implements ISusanoLoader<HTMLAudioElement> {
63
+ declare class AudioLoader<R = HTMLAudioElement> extends SusanoLoader<HTMLAudioElement, R> implements ISusanoLoader<HTMLAudioElement, R> {
57
64
  static type: "audio";
58
65
  loadEvent: LoadEvent;
59
- constructor(url: string, cnfg?: SusanoAudioLoaderConfig);
60
- load(): Promise<HTMLAudioElement>;
66
+ constructor(url: string, cnfg?: SusanoAudioLoaderConfig<R>);
67
+ load(): Promise<R>;
61
68
  }
62
69
 
63
70
  type GenericLoadFn = (config: {
@@ -66,14 +73,14 @@ type GenericLoadFn = (config: {
66
73
  error: (error: Error) => void;
67
74
  progress: (progress: number) => void;
68
75
  }) => void;
69
- type SusanoGenericLoaderConfig = SusanoLoaderConfig<any> & {
76
+ type SusanoGenericLoaderConfig<R = any> = SusanoLoaderConfig<any, R> & {
70
77
  loadFn: GenericLoadFn;
71
78
  };
72
- declare class GenericLoader extends SusanoLoader<any> {
79
+ declare class GenericLoader<R = any> extends SusanoLoader<any, R> {
73
80
  static type: "generic";
74
81
  loadFn: GenericLoadFn;
75
- constructor(url: string, cnfg: SusanoGenericLoaderConfig);
76
- load(): Promise<any>;
82
+ constructor(url: string, cnfg: SusanoGenericLoaderConfig<R>);
83
+ load(): Promise<R>;
77
84
  }
78
85
 
79
86
  type LoaderTypes = {
@@ -87,7 +94,7 @@ type LoaderMap<T extends LoaderTypes> = {
87
94
  };
88
95
  type ProgressEventArgs = {
89
96
  value: number;
90
- item: SusanoLoader<unknown>;
97
+ item: SusanoLoader<unknown, unknown>;
91
98
  susano: Susano<any>;
92
99
  };
93
100
  /**
@@ -112,12 +119,12 @@ declare class Susano<T extends LoaderTypes> extends TinyEmitter {
112
119
  loaderArgs?: ConstructorParameters<T[K]['loader']>[1];
113
120
  }): InstanceType<T[keyof T]["loader"]>;
114
121
  registerLoader<K extends keyof T>(type: K, loader: T[K]['loader']): void;
115
- _onProgress(item: SusanoLoader<unknown>): void;
122
+ _onProgress(item: SusanoLoader<unknown, unknown>): void;
116
123
  start({ onCompleted, onProgress, }?: {
117
124
  onCompleted?: (susano: Susano<T>) => void;
118
125
  onProgress?: (progress: {
119
126
  value: number;
120
- item: SusanoLoader<unknown>;
127
+ item: SusanoLoader<unknown, unknown>;
121
128
  susano: Susano<T>;
122
129
  }) => void;
123
130
  }): void;
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@
3
3
  var tinyEmitter = require('tiny-emitter');
4
4
 
5
5
  // package.json
6
- var version = "0.1.1";
6
+ var version = "0.2.0";
7
7
  var SusanoLoader = class extends tinyEmitter.TinyEmitter {
8
8
  constructor(url, _cnfg = {}) {
9
9
  super();
@@ -13,16 +13,37 @@ var SusanoLoader = class extends tinyEmitter.TinyEmitter {
13
13
  this.config = _cnfg;
14
14
  this.weight = 1;
15
15
  this.progress = 0;
16
+ this._resetPromise();
16
17
  }
17
18
  load() {
18
19
  throw new Error("Method not implemented");
19
20
  }
20
21
  _onLoaded() {
22
+ if (this.config.postprocess) {
23
+ Promise.resolve(this.config.postprocess(this.content, this)).then((result) => this._finalize(result)).catch((error) => this._onError(error));
24
+ } else {
25
+ this._finalize(this.content);
26
+ }
27
+ }
28
+ _finalize(result) {
21
29
  this.loaded = true;
22
30
  this.progress = 1;
31
+ this._resolve(result);
23
32
  this.emit("loaded", this);
24
33
  this.config.onLoaded?.(this);
25
34
  }
35
+ _onError(error) {
36
+ this._reject(error);
37
+ this.progress = 0;
38
+ this._resetPromise();
39
+ this.emit("error", error);
40
+ }
41
+ _resetPromise() {
42
+ this.promise = new Promise((resolve, reject) => {
43
+ this._resolve = resolve;
44
+ this._reject = reject;
45
+ });
46
+ }
26
47
  _onProgress(value) {
27
48
  this.progress = value;
28
49
  this.emit("progress", this);
@@ -42,6 +63,13 @@ var SusanoLoader = class extends tinyEmitter.TinyEmitter {
42
63
  _onProgress?.(loader);
43
64
  cnfg.onProgress?.(loader);
44
65
  };
66
+ const _postprocess = this.config.postprocess;
67
+ if (cnfg.postprocess) {
68
+ this.config.postprocess = async (content, loader) => {
69
+ const result = _postprocess ? await _postprocess(content, loader) : content;
70
+ return cnfg.postprocess(result, loader);
71
+ };
72
+ }
45
73
  }
46
74
  };
47
75
 
@@ -54,21 +82,16 @@ var ImageLoader = class extends SusanoLoader {
54
82
  this.sizes = cnfg.sizes;
55
83
  }
56
84
  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
- });
85
+ if (this.loaded) {
86
+ this._onLoaded();
87
+ return this.promise;
88
+ }
89
+ if (this.srcSet) this.content.srcset = this.srcSet;
90
+ if (this.sizes) this.content.sizes = this.sizes;
91
+ this.content.src = this.url;
92
+ this.content.onload = () => this._onLoaded();
93
+ this.content.onerror = (e) => this._onError(e);
94
+ return this.promise;
72
95
  }
73
96
  };
74
97
  ImageLoader.type = "image";
@@ -81,20 +104,15 @@ var VideoLoader = class extends SusanoLoader {
81
104
  this.loadEvent = cnfg.loadEvent || "canplay";
82
105
  }
83
106
  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
- });
107
+ if (this.loaded) {
108
+ this._onLoaded();
109
+ return this.promise;
110
+ }
111
+ const el = this.content;
112
+ el.src = this.url;
113
+ el.addEventListener(this.loadEvent, () => this._onLoaded(), { once: true });
114
+ el.addEventListener("error", (e) => this._onError(e), { once: true });
115
+ return this.promise;
98
116
  }
99
117
  };
100
118
  VideoLoader.type = "video";
@@ -107,20 +125,15 @@ var AudioLoader = class extends SusanoLoader {
107
125
  this.loadEvent = cnfg.loadEvent || "canplay";
108
126
  }
109
127
  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
- });
128
+ if (this.loaded) {
129
+ this._onLoaded();
130
+ return this.promise;
131
+ }
132
+ const el = this.content;
133
+ el.src = this.url;
134
+ el.addEventListener(this.loadEvent, () => this._onLoaded(), { once: true });
135
+ el.addEventListener("error", (e) => this._onError(e), { once: true });
136
+ return this.promise;
124
137
  }
125
138
  };
126
139
  AudioLoader.type = "audio";
@@ -132,30 +145,25 @@ var GenericLoader = class extends SusanoLoader {
132
145
  this.loadFn = cnfg.loadFn;
133
146
  }
134
147
  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
- });
148
+ if (!this.loadFn) {
149
+ this._onError(new Error("No load function provided"));
150
+ return this.promise;
151
+ }
152
+ if (this.loaded) {
153
+ this._onLoaded();
154
+ return this.promise;
155
+ }
156
+ this.loadFn({
157
+ url: this.url,
158
+ done: (generic) => {
159
+ this.content = generic;
160
+ this._onLoaded();
161
+ },
162
+ error: (err) => this._onError(err),
163
+ /* 0 to 1 */
164
+ progress: (value) => this._onProgress(value)
158
165
  });
166
+ return this.promise;
159
167
  }
160
168
  };
161
169
  GenericLoader.type = "generic";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
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.1\",\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 } from './loaders/image'\nimport { VideoLoader } from './loaders/video'\nimport { AudioLoader } from './loaders/audio'\nimport { GenericLoader } 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 * from './loaders/loader'\nexport * from './loaders/image'\nexport * from './loaders/video'\nexport * from './loaders/audio'\nexport * from './loaders/generic'\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":";;;;;AAME,IAAA,OAAA,GAAW,OAAA;ACEN,IAAM,YAAA,GAAN,cAAqCA,uBAAA,CAA2C;AAAA,EAWrF,WAAA,CAAY,GAAA,EAAa,KAAA,GAAkC,EAAC,EAAG;AAC7D,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,IAAA,CAAK,MAAA,GAAS,CAAA;AACd,IAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAEhB,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA,EAEA,IAAA,GAAmB;AACjB,IAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA,EAC1C;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,IAAI,IAAA,CAAK,OAAO,WAAA,EAAa;AAC3B,MAAA,OAAA,CAAQ,OAAA,CAAQ,KAAK,MAAA,CAAO,WAAA,CAAY,KAAK,OAAA,EAAS,IAAI,CAAC,CAAA,CACxD,IAAA,CAAK,CAAC,WAAW,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA,CACvC,KAAA,CAAM,CAAC,KAAA,KAAU,IAAA,CAAK,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,IAC1C,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,SAAA,CAAU,KAAK,OAAuB,CAAA;AAAA,IAC7C;AAAA,EACF;AAAA,EAEQ,UAAU,MAAA,EAAW;AAC3B,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAChB,IAAA,IAAA,CAAK,SAAS,MAAM,CAAA;AACpB,IAAA,IAAA,CAAK,IAAA,CAAK,UAAU,IAAI,CAAA;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,WAAW,IAAI,CAAA;AAAA,EAC7B;AAAA,EAEA,SAAS,KAAA,EAAgB;AACvB,IAAA,IAAA,CAAK,QAAQ,KAAK,CAAA;AAClB,IAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAChB,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,EAC1B;AAAA,EAEQ,aAAA,GAAgB;AACtB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,OAAA,CAAW,CAAC,SAAS,MAAA,KAAW;AACjD,MAAA,IAAA,CAAK,QAAA,GAAW,OAAA;AAChB,MAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAAA,IACjB,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,YAAY,KAAA,EAAe;AACzB,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAChB,IAAA,IAAA,CAAK,IAAA,CAAK,YAAY,IAAI,CAAA;AAC1B,IAAA,IAAA,CAAK,MAAA,CAAO,aAAa,IAAI,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,IAAA,EAAgC;AAC5C,IAAA,MAAM,SAAA,GAAY,KAAK,MAAA,CAAO,QAAA;AAC9B,IAAA,IAAA,CAAK,MAAA,CAAO,QAAA,GAAW,CAAC,MAAA,KAAW;AACjC,MAAA,SAAA,GAAY,MAAM,CAAA;AAClB,MAAA,IAAA,CAAK,WAAW,MAAM,CAAA;AAAA,IACxB,CAAA;AAEA,IAAA,MAAM,WAAA,GAAc,KAAK,MAAA,CAAO,UAAA;AAEhC,IAAA,IAAA,CAAK,MAAA,CAAO,UAAA,GAAa,CAAC,MAAA,KAAW;AACnC,MAAA,WAAA,GAAc,MAAM,CAAA;AACpB,MAAA,IAAA,CAAK,aAAa,MAAM,CAAA;AAAA,IAC1B,CAAA;AAEA,IAAA,MAAM,YAAA,GAAe,KAAK,MAAA,CAAO,WAAA;AACjC,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAA,CAAK,MAAA,CAAO,WAAA,GAAc,OAAO,OAAA,EAAS,MAAA,KAAW;AACnD,QAAA,MAAM,SAAS,YAAA,GAAe,MAAM,YAAA,CAAa,OAAA,EAAS,MAAM,CAAA,GAAI,OAAA;AACpE,QAAA,OAAO,IAAA,CAAK,WAAA,CAAa,MAAA,EAAwB,MAAM,CAAA;AAAA,MACzD,CAAA;AAAA,IACF;AAAA,EACF;AACF;;;AC3FO,IAAM,WAAA,GAAN,cAAgD,YAAA,CAAgF;AAAA,EAKrI,WAAA,CAAY,GAAA,EAAa,IAAA,GAAmC,EAAC,EAAG;AAC9D,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,KAAA,EAAM;AACzB,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAAA,EACpB;AAAA,EAEA,IAAA,GAAmB;AACjB,IAAA,IAAI,KAAK,MAAA,EAAQ;AAAE,MAAA,IAAA,CAAK,SAAA,EAAU;AAAG,MAAA,OAAO,IAAA,CAAK,OAAA;AAAA,IAAQ;AAEzD,IAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,OAAA,CAAQ,SAAS,IAAA,CAAK,MAAA;AAC5C,IAAA,IAAI,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,OAAA,CAAQ,QAAQ,IAAA,CAAK,KAAA;AAC1C,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAM,IAAA,CAAK,GAAA;AAExB,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,EAAU;AAC3C,IAAA,IAAA,CAAK,QAAQ,OAAA,GAAU,CAAC,CAAA,KAAM,IAAA,CAAK,SAAS,CAAC,CAAA;AAE7C,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AACF;AAxBa,WAAA,CACG,IAAA,GAAO,OAAA;;;ACChB,IAAM,WAAA,GAAN,cAAgD,YAAA,CAAgF;AAAA,EAIrI,WAAA,CAAY,GAAA,EAAa,IAAA,GAAmC,EAAC,EAAG;AAC9D,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,KAAA,IAAS,QAAA,CAAS,cAAc,OAAO,CAAA;AAC3D,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,SAAA,IAAa,SAAA;AAAA,EACrC;AAAA,EAEA,IAAA,GAAmB;AACjB,IAAA,IAAI,KAAK,MAAA,EAAQ;AAAE,MAAA,IAAA,CAAK,SAAA,EAAU;AAAG,MAAA,OAAO,IAAA,CAAK,OAAA;AAAA,IAAQ;AAEzD,IAAA,MAAM,KAAK,IAAA,CAAK,OAAA;AAChB,IAAA,EAAA,CAAG,MAAM,IAAA,CAAK,GAAA;AACd,IAAA,EAAA,CAAG,gBAAA,CAAiB,IAAA,CAAK,SAAA,EAAW,MAAM,IAAA,CAAK,WAAU,EAAG,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA;AAC1E,IAAA,EAAA,CAAG,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA;AAEpE,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AACF;AApBa,WAAA,CACG,IAAA,GAAO,OAAA;;;ACDhB,IAAM,WAAA,GAAN,cAAgD,YAAA,CAAgF;AAAA,EAIrI,WAAA,CAAY,GAAA,EAAa,IAAA,GAAmC,EAAC,EAAG;AAC9D,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,KAAA,IAAS,QAAA,CAAS,cAAc,OAAO,CAAA;AAC3D,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,SAAA,IAAa,SAAA;AAAA,EACrC;AAAA,EAEA,IAAA,GAAmB;AACjB,IAAA,IAAI,KAAK,MAAA,EAAQ;AAAE,MAAA,IAAA,CAAK,SAAA,EAAU;AAAG,MAAA,OAAO,IAAA,CAAK,OAAA;AAAA,IAAQ;AAEzD,IAAA,MAAM,KAAK,IAAA,CAAK,OAAA;AAChB,IAAA,EAAA,CAAG,MAAM,IAAA,CAAK,GAAA;AACd,IAAA,EAAA,CAAG,gBAAA,CAAiB,IAAA,CAAK,SAAA,EAAW,MAAM,IAAA,CAAK,WAAU,EAAG,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA;AAC1E,IAAA,EAAA,CAAG,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA;AAEpE,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AACF;AApBa,WAAA,CACG,IAAA,GAAO,OAAA;;;ACGhB,IAAM,aAAA,GAAN,cAAqC,YAAA,CAAqB;AAAA,EAI/D,WAAA,CAAY,KAAa,IAAA,EAAoC;AAC3D,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AAAA,EACrB;AAAA,EAEA,IAAA,GAAmB;AACjB,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAAE,MAAA,IAAA,CAAK,QAAA,CAAS,IAAI,KAAA,CAAM,2BAA2B,CAAC,CAAA;AAAG,MAAA,OAAO,IAAA,CAAK,OAAA;AAAA,IAAQ;AAC/F,IAAA,IAAI,KAAK,MAAA,EAAQ;AAAE,MAAA,IAAA,CAAK,SAAA,EAAU;AAAG,MAAA,OAAO,IAAA,CAAK,OAAA;AAAA,IAAQ;AAEzD,IAAA,IAAA,CAAK,MAAA,CAAO;AAAA,MACV,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,IAAA,EAAM,CAAC,OAAA,KAAiB;AAAE,QAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAS,QAAA,IAAA,CAAK,SAAA,EAAU;AAAA,MAAE,CAAA;AAAA,MACnE,KAAA,EAAO,CAAC,GAAA,KAAQ,IAAA,CAAK,SAAS,GAAG,CAAA;AAAA;AAAA,MAEjC,QAAA,EAAU,CAAC,KAAA,KAAkB,IAAA,CAAK,YAAY,KAAK;AAAA,KACpD,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AACF;AAvBa,aAAA,CACG,IAAA,GAAO,SAAA;;;ACehB,IAAM,MAAA,GAAN,cAA4CA,uBAAAA,CAAY;AAAA,EAQ7D,WAAA,GAAc;AACZ,IAAA,KAAA,EAAM;AARR,IAAA,IAAA,CAAQ,UAAwB,EAAC;AACjC,IAAA,IAAA,CAAO,QAA8C,EAAC;AACtD,IAAA,IAAA,CAAO,SAA+C,EAAC;AACvD,IAAA,IAAA,CAAO,KAAA,uBAA6D,GAAA,EAAI;AACxE,IAAA,IAAA,CAAO,SAAA,GAAoB,CAAA;AAC3B,IAAA,IAAA,CAAO,UAAA,GAAqB,CAAA;AAAA,EAI5B;AAAA,EAEA,GAAA,CACE,KACA,IAAA,EAI8B;AAC9B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AAErC,IAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,KAAA,CAAM,mBAAmB,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,UAAA,CAAY,CAAA;AAE7E,IAAA,IAAI,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAE7B,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,IAAA,GAAO,IAAI,MAAA,CAAO,GAAA,EAAK,IAAA,CAAK,UAAU,CAAA;AACtC,MAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA;AAAA,IAC1B,CAAA,MAAA,IAAW,KAAK,UAAA,EAAY;AAC1B,MAAA,IAAA,CAAK,aAAA,CAAc,KAAK,UAAU,CAAA;AAAA,IACpC;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,CAAA;AAEpB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,IAAA,CACE,KACA,IAAA,EAIA;AACA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AACrC,IAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,KAAA,CAAM,mBAAmB,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,UAAA,CAAY,CAAA;AAE7E,IAAA,IAAI,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAE7B,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,IAAA,GAAO,IAAI,MAAA,CAAO,GAAA,EAAK,IAAA,CAAK,UAAU,CAAA;AACtC,MAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA;AAAA,IAC1B,CAAA,MAAA,IAAW,KAAK,UAAA,EAAY;AAC1B,MAAA,IAAA,CAAK,aAAA,CAAc,KAAK,UAAU,CAAA;AAAA,IACpC;AAEA,IAAA,IAAA,CAAK,IAAA,EAAK;AAEV,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,cAAA,CAAkC,MAAS,MAAA,EAAwB;AACjE,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,GAAI,MAAA;AAAA,EACvB;AAAA,EAEA,YAAY,IAAA,EAAsC;AAChD,IAAA,IAAA,CAAK,SAAA,EAAA;AAKL,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,UAAA;AAEvC,IAAA,IAAA,CAAK,KAAK,UAAA,EAAY;AAAA,MACpB,KAAA,EAAO,QAAA;AAAA,MACP,IAAA;AAAA,MACA,MAAA,EAAQ;AAAA,KACmB,CAAA;AAE7B,IAAA,IAAI,aAAa,CAAA,EAAG;AAClB,MAAA,IAAA,CAAK,IAAA,CAAK,aAAa,IAAI,CAAA;AAC3B,MAAA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,KAAA,CAAM;AAAA,IACJ,WAAA;AAAA,IACA;AAAA,GACF,GAGI,EAAC,EAAG;AACN,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,EAAG,IAAA,CAAK,MAAM,MAAM,CAAA;AACpD,IAAA,IAAA,CAAK,UAAA,GAAa,KAAK,MAAA,CAAO,MAAA;AAC9B,IAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AAEjB,IAAA,IAAA,CAAK,IAAA,CAAK,SAAS,IAAI,CAAA;AAEvB,IAAA,IAAI,UAAA,EAAY,IAAA,CAAK,EAAA,CAAG,UAAA,EAAY,UAAU,CAAA;AAE9C,IAAA,IAAA,CAAK,IAAA,CAAK,aAAa,MAAM;AAC3B,MAAA,WAAA,GAAc,IAAI,CAAA;AAClB,MAAA,IAAI,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,UAAU,CAAA;AAAA,IACjD,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAC,IAAA,KAAS;AACxB,MAAA,IAAA,CAAK,IAAA,CAAK,UAAU,MAAM;AACxB,QAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,MACvB,CAAC,CAAA;AAED,MAAA,IAAA,CAAK,IAAA,EAAK;AAAA,IACZ,CAAC,CAAA;AAAA,EACH;AACF;AAEO,IAAM,MAAA,GAAS,IAAI,MAAA;AAmB1B,MAAA,CAAO,cAAA,CAAe,WAAA,CAAY,IAAA,EAAM,WAAW,CAAA;AACnD,MAAA,CAAO,cAAA,CAAe,WAAA,CAAY,IAAA,EAAM,WAAW,CAAA;AACnD,MAAA,CAAO,cAAA,CAAe,WAAA,CAAY,IAAA,EAAM,WAAW,CAAA;AACnD,MAAA,CAAO,cAAA,CAAe,aAAA,CAAc,IAAA,EAAM,aAAa,CAAA;;;ACpKhD,IAAM,OAAA,GAAU","file":"index.js","sourcesContent":["{\n \"name\": \"@joycostudio/susano\",\n \"publishConfig\": {\n \"registry\": \"https://registry.npmjs.org\",\n \"access\": \"public\"\n },\n \"version\": \"0.2.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, R = T> = {\n onLoaded?: (loader: SusanoLoader<T, R>) => void\n onProgress?: (loader: SusanoLoader<T, R>) => void\n postprocess?: (content: T, loader: SusanoLoader<T, R>) => R | Promise<R>\n}\n\nexport class SusanoLoader<T, R = T> extends TinyEmitter implements ISusanoLoader<T, R> {\n public url: string\n public loaded: boolean\n public content: T\n public config: SusanoLoaderConfig<T, R>\n public weight: number\n public progress: number\n public promise!: Promise<R>\n private _resolve!: (value: R) => void\n private _reject!: (error: unknown) => void\n\n constructor(url: string, _cnfg: SusanoLoaderConfig<T, R> = {}) {\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 this._resetPromise()\n }\n\n load(): Promise<R> {\n throw new Error('Method not implemented')\n }\n\n _onLoaded() {\n if (this.config.postprocess) {\n Promise.resolve(this.config.postprocess(this.content, this))\n .then((result) => this._finalize(result))\n .catch((error) => this._onError(error))\n } else {\n this._finalize(this.content as unknown as R)\n }\n }\n\n private _finalize(result: R) {\n this.loaded = true\n this.progress = 1\n this._resolve(result)\n this.emit('loaded', this)\n this.config.onLoaded?.(this)\n }\n\n _onError(error: unknown) {\n this._reject(error)\n this.progress = 0\n this._resetPromise()\n this.emit('error', error)\n }\n\n private _resetPromise() {\n this.promise = new Promise<R>((resolve, reject) => {\n this._resolve = resolve\n this._reject = reject\n })\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, R>) {\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 const _postprocess = this.config.postprocess\n if (cnfg.postprocess) {\n this.config.postprocess = async (content, loader) => {\n const result = _postprocess ? await _postprocess(content, loader) : content\n return cnfg.postprocess!(result as unknown as T, loader)\n }\n }\n }\n}\n\nexport interface ISusanoLoader<T, R = T> {\n load: () => Promise<R>\n}\n","import { ISusanoLoader, SusanoLoaderConfig, SusanoLoader } from './loader'\n\nexport type SusanoImageLoaderConfig<R = HTMLImageElement> = SusanoLoaderConfig<HTMLImageElement, R> & {\n srcSet?: string\n sizes?: string\n}\n\nexport class ImageLoader<R = HTMLImageElement> extends SusanoLoader<HTMLImageElement, R> implements ISusanoLoader<HTMLImageElement, R> {\n public static type = 'image' as const\n public srcSet?: string\n public sizes?: string\n\n constructor(url: string, cnfg: SusanoImageLoaderConfig<R> = {}) {\n super(url, cnfg)\n this.content = new Image()\n this.srcSet = cnfg.srcSet\n this.sizes = cnfg.sizes\n }\n\n load(): Promise<R> {\n if (this.loaded) { this._onLoaded(); return this.promise }\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 = () => this._onLoaded()\n this.content.onerror = (e) => this._onError(e)\n\n return this.promise\n }\n}\n","import { ISusanoLoader, SusanoLoaderConfig, SusanoLoader } from './loader'\n\ntype LoadEvent = 'canplay' | 'canplaythrough'\n\nexport type SusanoVideoLoaderConfig<R = HTMLVideoElement> = SusanoLoaderConfig<HTMLVideoElement, R> & {\n video?: HTMLVideoElement\n loadEvent?: LoadEvent\n}\n\nexport class VideoLoader<R = HTMLVideoElement> extends SusanoLoader<HTMLVideoElement, R> implements ISusanoLoader<HTMLVideoElement, R> {\n public static type = 'video' as const\n public loadEvent: LoadEvent\n\n constructor(url: string, cnfg: SusanoVideoLoaderConfig<R> = {}) {\n super(url, cnfg)\n this.content = cnfg.video || document.createElement('video')\n this.loadEvent = cnfg.loadEvent || 'canplay'\n }\n\n load(): Promise<R> {\n if (this.loaded) { this._onLoaded(); return this.promise }\n\n const el = this.content\n el.src = this.url\n el.addEventListener(this.loadEvent, () => this._onLoaded(), { once: true })\n el.addEventListener('error', (e) => this._onError(e), { once: true })\n\n return this.promise\n }\n}\n","import { ISusanoLoader, SusanoLoaderConfig, SusanoLoader } from './loader'\n\ntype LoadEvent = 'canplay' | 'canplaythrough'\n\nexport type SusanoAudioLoaderConfig<R = HTMLAudioElement> = SusanoLoaderConfig<HTMLAudioElement, R> & {\n audio?: HTMLAudioElement\n loadEvent?: LoadEvent\n}\n\nexport class AudioLoader<R = HTMLAudioElement> extends SusanoLoader<HTMLAudioElement, R> implements ISusanoLoader<HTMLAudioElement, R> {\n public static type = 'audio' as const\n public loadEvent: LoadEvent\n\n constructor(url: string, cnfg: SusanoAudioLoaderConfig<R> = {}) {\n super(url, cnfg)\n this.content = cnfg.audio || document.createElement('audio')\n this.loadEvent = cnfg.loadEvent || 'canplay'\n }\n\n load(): Promise<R> {\n if (this.loaded) { this._onLoaded(); return this.promise }\n\n const el = this.content\n el.src = this.url\n el.addEventListener(this.loadEvent, () => this._onLoaded(), { once: true })\n el.addEventListener('error', (e) => this._onError(e), { once: true })\n\n return this.promise\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<R = any> = SusanoLoaderConfig<any, R> & {\n loadFn: GenericLoadFn\n}\n\nexport class GenericLoader<R = any> extends SusanoLoader<any, R> {\n public static type = 'generic' as const\n public loadFn: GenericLoadFn\n\n constructor(url: string, cnfg: SusanoGenericLoaderConfig<R>) {\n super(url, cnfg)\n this.loadFn = cnfg.loadFn\n }\n\n load(): Promise<R> {\n if (!this.loadFn) { this._onError(new Error('No load function provided')); return this.promise }\n if (this.loaded) { this._onLoaded(); return this.promise }\n\n this.loadFn({\n url: this.url,\n done: (generic: any) => { this.content = generic; this._onLoaded() },\n error: (err) => this._onError(err),\n /* 0 to 1 */\n progress: (value: number) => this._onProgress(value),\n })\n\n return this.promise\n }\n}\n","import { TinyEmitter } from 'tiny-emitter'\nimport { SusanoLoader } from './loaders/loader'\nimport { ImageLoader } from './loaders/image'\nimport { VideoLoader } from './loaders/video'\nimport { AudioLoader } from './loaders/audio'\nimport { GenericLoader } 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, 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, 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, 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 * from './loaders/loader'\nexport * from './loaders/image'\nexport * from './loaders/video'\nexport * from './loaders/audio'\nexport * from './loaders/generic'\n","import { version } from '../../package.json'\n\nexport const VERSION = version\nexport * from './core'\n"]}
package/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import { TinyEmitter } from 'tiny-emitter';
2
2
 
3
3
  // package.json
4
- var version = "0.1.1";
4
+ var version = "0.2.0";
5
5
  var SusanoLoader = class extends TinyEmitter {
6
6
  constructor(url, _cnfg = {}) {
7
7
  super();
@@ -11,16 +11,37 @@ var SusanoLoader = class extends TinyEmitter {
11
11
  this.config = _cnfg;
12
12
  this.weight = 1;
13
13
  this.progress = 0;
14
+ this._resetPromise();
14
15
  }
15
16
  load() {
16
17
  throw new Error("Method not implemented");
17
18
  }
18
19
  _onLoaded() {
20
+ if (this.config.postprocess) {
21
+ Promise.resolve(this.config.postprocess(this.content, this)).then((result) => this._finalize(result)).catch((error) => this._onError(error));
22
+ } else {
23
+ this._finalize(this.content);
24
+ }
25
+ }
26
+ _finalize(result) {
19
27
  this.loaded = true;
20
28
  this.progress = 1;
29
+ this._resolve(result);
21
30
  this.emit("loaded", this);
22
31
  this.config.onLoaded?.(this);
23
32
  }
33
+ _onError(error) {
34
+ this._reject(error);
35
+ this.progress = 0;
36
+ this._resetPromise();
37
+ this.emit("error", error);
38
+ }
39
+ _resetPromise() {
40
+ this.promise = new Promise((resolve, reject) => {
41
+ this._resolve = resolve;
42
+ this._reject = reject;
43
+ });
44
+ }
24
45
  _onProgress(value) {
25
46
  this.progress = value;
26
47
  this.emit("progress", this);
@@ -40,6 +61,13 @@ var SusanoLoader = class extends TinyEmitter {
40
61
  _onProgress?.(loader);
41
62
  cnfg.onProgress?.(loader);
42
63
  };
64
+ const _postprocess = this.config.postprocess;
65
+ if (cnfg.postprocess) {
66
+ this.config.postprocess = async (content, loader) => {
67
+ const result = _postprocess ? await _postprocess(content, loader) : content;
68
+ return cnfg.postprocess(result, loader);
69
+ };
70
+ }
43
71
  }
44
72
  };
45
73
 
@@ -52,21 +80,16 @@ var ImageLoader = class extends SusanoLoader {
52
80
  this.sizes = cnfg.sizes;
53
81
  }
54
82
  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
- });
83
+ if (this.loaded) {
84
+ this._onLoaded();
85
+ return this.promise;
86
+ }
87
+ if (this.srcSet) this.content.srcset = this.srcSet;
88
+ if (this.sizes) this.content.sizes = this.sizes;
89
+ this.content.src = this.url;
90
+ this.content.onload = () => this._onLoaded();
91
+ this.content.onerror = (e) => this._onError(e);
92
+ return this.promise;
70
93
  }
71
94
  };
72
95
  ImageLoader.type = "image";
@@ -79,20 +102,15 @@ var VideoLoader = class extends SusanoLoader {
79
102
  this.loadEvent = cnfg.loadEvent || "canplay";
80
103
  }
81
104
  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
- });
105
+ if (this.loaded) {
106
+ this._onLoaded();
107
+ return this.promise;
108
+ }
109
+ const el = this.content;
110
+ el.src = this.url;
111
+ el.addEventListener(this.loadEvent, () => this._onLoaded(), { once: true });
112
+ el.addEventListener("error", (e) => this._onError(e), { once: true });
113
+ return this.promise;
96
114
  }
97
115
  };
98
116
  VideoLoader.type = "video";
@@ -105,20 +123,15 @@ var AudioLoader = class extends SusanoLoader {
105
123
  this.loadEvent = cnfg.loadEvent || "canplay";
106
124
  }
107
125
  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
- });
126
+ if (this.loaded) {
127
+ this._onLoaded();
128
+ return this.promise;
129
+ }
130
+ const el = this.content;
131
+ el.src = this.url;
132
+ el.addEventListener(this.loadEvent, () => this._onLoaded(), { once: true });
133
+ el.addEventListener("error", (e) => this._onError(e), { once: true });
134
+ return this.promise;
122
135
  }
123
136
  };
124
137
  AudioLoader.type = "audio";
@@ -130,30 +143,25 @@ var GenericLoader = class extends SusanoLoader {
130
143
  this.loadFn = cnfg.loadFn;
131
144
  }
132
145
  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
- });
146
+ if (!this.loadFn) {
147
+ this._onError(new Error("No load function provided"));
148
+ return this.promise;
149
+ }
150
+ if (this.loaded) {
151
+ this._onLoaded();
152
+ return this.promise;
153
+ }
154
+ this.loadFn({
155
+ url: this.url,
156
+ done: (generic) => {
157
+ this.content = generic;
158
+ this._onLoaded();
159
+ },
160
+ error: (err) => this._onError(err),
161
+ /* 0 to 1 */
162
+ progress: (value) => this._onProgress(value)
156
163
  });
164
+ return this.promise;
157
165
  }
158
166
  };
159
167
  GenericLoader.type = "generic";
@@ -1 +1 @@
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.1\",\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 } from './loaders/image'\nimport { VideoLoader } from './loaders/video'\nimport { AudioLoader } from './loaders/audio'\nimport { GenericLoader } 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 * from './loaders/loader'\nexport * from './loaders/image'\nexport * from './loaders/video'\nexport * from './loaders/audio'\nexport * from './loaders/generic'\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.2.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, R = T> = {\n onLoaded?: (loader: SusanoLoader<T, R>) => void\n onProgress?: (loader: SusanoLoader<T, R>) => void\n postprocess?: (content: T, loader: SusanoLoader<T, R>) => R | Promise<R>\n}\n\nexport class SusanoLoader<T, R = T> extends TinyEmitter implements ISusanoLoader<T, R> {\n public url: string\n public loaded: boolean\n public content: T\n public config: SusanoLoaderConfig<T, R>\n public weight: number\n public progress: number\n public promise!: Promise<R>\n private _resolve!: (value: R) => void\n private _reject!: (error: unknown) => void\n\n constructor(url: string, _cnfg: SusanoLoaderConfig<T, R> = {}) {\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 this._resetPromise()\n }\n\n load(): Promise<R> {\n throw new Error('Method not implemented')\n }\n\n _onLoaded() {\n if (this.config.postprocess) {\n Promise.resolve(this.config.postprocess(this.content, this))\n .then((result) => this._finalize(result))\n .catch((error) => this._onError(error))\n } else {\n this._finalize(this.content as unknown as R)\n }\n }\n\n private _finalize(result: R) {\n this.loaded = true\n this.progress = 1\n this._resolve(result)\n this.emit('loaded', this)\n this.config.onLoaded?.(this)\n }\n\n _onError(error: unknown) {\n this._reject(error)\n this.progress = 0\n this._resetPromise()\n this.emit('error', error)\n }\n\n private _resetPromise() {\n this.promise = new Promise<R>((resolve, reject) => {\n this._resolve = resolve\n this._reject = reject\n })\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, R>) {\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 const _postprocess = this.config.postprocess\n if (cnfg.postprocess) {\n this.config.postprocess = async (content, loader) => {\n const result = _postprocess ? await _postprocess(content, loader) : content\n return cnfg.postprocess!(result as unknown as T, loader)\n }\n }\n }\n}\n\nexport interface ISusanoLoader<T, R = T> {\n load: () => Promise<R>\n}\n","import { ISusanoLoader, SusanoLoaderConfig, SusanoLoader } from './loader'\n\nexport type SusanoImageLoaderConfig<R = HTMLImageElement> = SusanoLoaderConfig<HTMLImageElement, R> & {\n srcSet?: string\n sizes?: string\n}\n\nexport class ImageLoader<R = HTMLImageElement> extends SusanoLoader<HTMLImageElement, R> implements ISusanoLoader<HTMLImageElement, R> {\n public static type = 'image' as const\n public srcSet?: string\n public sizes?: string\n\n constructor(url: string, cnfg: SusanoImageLoaderConfig<R> = {}) {\n super(url, cnfg)\n this.content = new Image()\n this.srcSet = cnfg.srcSet\n this.sizes = cnfg.sizes\n }\n\n load(): Promise<R> {\n if (this.loaded) { this._onLoaded(); return this.promise }\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 = () => this._onLoaded()\n this.content.onerror = (e) => this._onError(e)\n\n return this.promise\n }\n}\n","import { ISusanoLoader, SusanoLoaderConfig, SusanoLoader } from './loader'\n\ntype LoadEvent = 'canplay' | 'canplaythrough'\n\nexport type SusanoVideoLoaderConfig<R = HTMLVideoElement> = SusanoLoaderConfig<HTMLVideoElement, R> & {\n video?: HTMLVideoElement\n loadEvent?: LoadEvent\n}\n\nexport class VideoLoader<R = HTMLVideoElement> extends SusanoLoader<HTMLVideoElement, R> implements ISusanoLoader<HTMLVideoElement, R> {\n public static type = 'video' as const\n public loadEvent: LoadEvent\n\n constructor(url: string, cnfg: SusanoVideoLoaderConfig<R> = {}) {\n super(url, cnfg)\n this.content = cnfg.video || document.createElement('video')\n this.loadEvent = cnfg.loadEvent || 'canplay'\n }\n\n load(): Promise<R> {\n if (this.loaded) { this._onLoaded(); return this.promise }\n\n const el = this.content\n el.src = this.url\n el.addEventListener(this.loadEvent, () => this._onLoaded(), { once: true })\n el.addEventListener('error', (e) => this._onError(e), { once: true })\n\n return this.promise\n }\n}\n","import { ISusanoLoader, SusanoLoaderConfig, SusanoLoader } from './loader'\n\ntype LoadEvent = 'canplay' | 'canplaythrough'\n\nexport type SusanoAudioLoaderConfig<R = HTMLAudioElement> = SusanoLoaderConfig<HTMLAudioElement, R> & {\n audio?: HTMLAudioElement\n loadEvent?: LoadEvent\n}\n\nexport class AudioLoader<R = HTMLAudioElement> extends SusanoLoader<HTMLAudioElement, R> implements ISusanoLoader<HTMLAudioElement, R> {\n public static type = 'audio' as const\n public loadEvent: LoadEvent\n\n constructor(url: string, cnfg: SusanoAudioLoaderConfig<R> = {}) {\n super(url, cnfg)\n this.content = cnfg.audio || document.createElement('audio')\n this.loadEvent = cnfg.loadEvent || 'canplay'\n }\n\n load(): Promise<R> {\n if (this.loaded) { this._onLoaded(); return this.promise }\n\n const el = this.content\n el.src = this.url\n el.addEventListener(this.loadEvent, () => this._onLoaded(), { once: true })\n el.addEventListener('error', (e) => this._onError(e), { once: true })\n\n return this.promise\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<R = any> = SusanoLoaderConfig<any, R> & {\n loadFn: GenericLoadFn\n}\n\nexport class GenericLoader<R = any> extends SusanoLoader<any, R> {\n public static type = 'generic' as const\n public loadFn: GenericLoadFn\n\n constructor(url: string, cnfg: SusanoGenericLoaderConfig<R>) {\n super(url, cnfg)\n this.loadFn = cnfg.loadFn\n }\n\n load(): Promise<R> {\n if (!this.loadFn) { this._onError(new Error('No load function provided')); return this.promise }\n if (this.loaded) { this._onLoaded(); return this.promise }\n\n this.loadFn({\n url: this.url,\n done: (generic: any) => { this.content = generic; this._onLoaded() },\n error: (err) => this._onError(err),\n /* 0 to 1 */\n progress: (value: number) => this._onProgress(value),\n })\n\n return this.promise\n }\n}\n","import { TinyEmitter } from 'tiny-emitter'\nimport { SusanoLoader } from './loaders/loader'\nimport { ImageLoader } from './loaders/image'\nimport { VideoLoader } from './loaders/video'\nimport { AudioLoader } from './loaders/audio'\nimport { GenericLoader } 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, 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, 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, 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 * from './loaders/loader'\nexport * from './loaders/image'\nexport * from './loaders/video'\nexport * from './loaders/audio'\nexport * from './loaders/generic'\n","import { version } from '../../package.json'\n\nexport const VERSION = version\nexport * from './core'\n"]}
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "registry": "https://registry.npmjs.org",
5
5
  "access": "public"
6
6
  },
7
- "version": "0.1.1",
7
+ "version": "0.2.0",
8
8
  "description": "Asset load orchestration made easy",
9
9
  "main": "dist/index.js",
10
10
  "module": "dist/index.mjs",