@kkarum/framework 2.3.17

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.
Files changed (171) hide show
  1. package/Framework.ts +337 -0
  2. package/Framework.ts.meta +10 -0
  3. package/FrameworkBase.ts +207 -0
  4. package/FrameworkBase.ts.meta +10 -0
  5. package/FrameworkInitialize.ts +79 -0
  6. package/FrameworkInitialize.ts.meta +10 -0
  7. package/README.md +93 -0
  8. package/README.md.meta +6 -0
  9. package/animation/FWAnimation.ts +13 -0
  10. package/animation/FWAnimation.ts.meta +10 -0
  11. package/animation/FWSkeleton.ts +174 -0
  12. package/animation/FWSkeleton.ts.meta +10 -0
  13. package/animation/FWTween.ts +60 -0
  14. package/animation/FWTween.ts.meta +10 -0
  15. package/animation.meta +13 -0
  16. package/component/FWVirtuaScrollViewComponent.ts +56 -0
  17. package/component/FWVirtuaScrollViewComponent.ts.meta +10 -0
  18. package/component/FWVirtualViewComponent.ts +2212 -0
  19. package/component/FWVirtualViewComponent.ts.meta +10 -0
  20. package/component.meta +13 -0
  21. package/config/FWAssetConfig.ts +7 -0
  22. package/config/FWAssetConfig.ts.meta +10 -0
  23. package/config/FWSystemConfig.ts +29 -0
  24. package/config/FWSystemConfig.ts.meta +10 -0
  25. package/config.meta +13 -0
  26. package/controller/FWLayerController.ts +178 -0
  27. package/controller/FWLayerController.ts.meta +10 -0
  28. package/controller.meta +13 -0
  29. package/data/FWData.ts +6 -0
  30. package/data/FWData.ts.meta +10 -0
  31. package/data.meta +13 -0
  32. package/define/FWEventDefine.ts +28 -0
  33. package/define/FWEventDefine.ts.meta +10 -0
  34. package/define/FWSystemDefine.ts +154 -0
  35. package/define/FWSystemDefine.ts.meta +10 -0
  36. package/define.meta +13 -0
  37. package/entry/FWEntry.ts +219 -0
  38. package/entry/FWEntry.ts.meta +10 -0
  39. package/entry.meta +13 -0
  40. package/expand/FWCocosExpand.ts +73 -0
  41. package/expand/FWCocosExpand.ts.meta +10 -0
  42. package/expand/FWDecorator.ts +366 -0
  43. package/expand/FWDecorator.ts.meta +10 -0
  44. package/expand/FWNodeExpand.ts +147 -0
  45. package/expand/FWNodeExpand.ts.meta +10 -0
  46. package/expand/FWRollingViewNesting.ts +195 -0
  47. package/expand/FWRollingViewNesting.ts.meta +10 -0
  48. package/expand/FWTweenExpand.ts +44 -0
  49. package/expand/FWTweenExpand.ts.meta +10 -0
  50. package/expand.meta +13 -0
  51. package/item/FWVirtualListItem.ts +141 -0
  52. package/item/FWVirtualListItem.ts.meta +10 -0
  53. package/item.meta +13 -0
  54. package/language/FWLanguage.ts +71 -0
  55. package/language/FWLanguage.ts.meta +10 -0
  56. package/language/FWLanguageLabelLocalize.ts +144 -0
  57. package/language/FWLanguageLabelLocalize.ts.meta +10 -0
  58. package/language/FWLanguageSkeletonLocalize.ts +106 -0
  59. package/language/FWLanguageSkeletonLocalize.ts.meta +10 -0
  60. package/language/FWLanguageSpriteLocalize.ts +81 -0
  61. package/language/FWLanguageSpriteLocalize.ts.meta +10 -0
  62. package/language.meta +13 -0
  63. package/layer/FWLayer.ts +14 -0
  64. package/layer/FWLayer.ts.meta +10 -0
  65. package/layer.meta +13 -0
  66. package/log/FWLog.ts +135 -0
  67. package/log/FWLog.ts.meta +10 -0
  68. package/log.meta +13 -0
  69. package/logic/FWLogic.ts +6 -0
  70. package/logic/FWLogic.ts.meta +10 -0
  71. package/logic.meta +13 -0
  72. package/machine/FWAnimationMachine.ts +28 -0
  73. package/machine/FWAnimationMachine.ts.meta +10 -0
  74. package/machine/FWStateMachine.ts +74 -0
  75. package/machine/FWStateMachine.ts.meta +10 -0
  76. package/machine.meta +13 -0
  77. package/manager/FWAnimationManager.ts +89 -0
  78. package/manager/FWAnimationManager.ts.meta +10 -0
  79. package/manager/FWAssetManager.ts +451 -0
  80. package/manager/FWAssetManager.ts.meta +10 -0
  81. package/manager/FWAudioManager.ts +339 -0
  82. package/manager/FWAudioManager.ts.meta +10 -0
  83. package/manager/FWBundleManager.ts +97 -0
  84. package/manager/FWBundleManager.ts.meta +10 -0
  85. package/manager/FWComponentManager.ts +24 -0
  86. package/manager/FWComponentManager.ts.meta +10 -0
  87. package/manager/FWEngineManager.ts +74 -0
  88. package/manager/FWEngineManager.ts.meta +10 -0
  89. package/manager/FWEventManager.ts +361 -0
  90. package/manager/FWEventManager.ts.meta +10 -0
  91. package/manager/FWHotUpdateManager.ts +344 -0
  92. package/manager/FWHotUpdateManager.ts.meta +10 -0
  93. package/manager/FWLanguageManager.ts +114 -0
  94. package/manager/FWLanguageManager.ts.meta +10 -0
  95. package/manager/FWLayerManager.ts +862 -0
  96. package/manager/FWLayerManager.ts.meta +10 -0
  97. package/manager/FWManager.ts +9 -0
  98. package/manager/FWManager.ts.meta +10 -0
  99. package/manager/FWObjectManager.ts +161 -0
  100. package/manager/FWObjectManager.ts.meta +10 -0
  101. package/manager/FWPerformanceManager.ts +198 -0
  102. package/manager/FWPerformanceManager.ts.meta +10 -0
  103. package/manager/FWPromiseManager.ts +504 -0
  104. package/manager/FWPromiseManager.ts.meta +10 -0
  105. package/manager/FWResManager.ts +299 -0
  106. package/manager/FWResManager.ts.meta +10 -0
  107. package/manager/FWSocketManager.ts +93 -0
  108. package/manager/FWSocketManager.ts.meta +10 -0
  109. package/manager/FWStateManager.ts +100 -0
  110. package/manager/FWStateManager.ts.meta +10 -0
  111. package/manager/FWTaskManager.ts +41 -0
  112. package/manager/FWTaskManager.ts.meta +10 -0
  113. package/manager/FWTimeManager.ts +442 -0
  114. package/manager/FWTimeManager.ts.meta +10 -0
  115. package/manager/FWUiManager.ts +217 -0
  116. package/manager/FWUiManager.ts.meta +10 -0
  117. package/manager.meta +13 -0
  118. package/package.json +11 -0
  119. package/package.json.meta +6 -0
  120. package/registry/FWRegistry.ts +62 -0
  121. package/registry/FWRegistry.ts.meta +10 -0
  122. package/registry.meta +13 -0
  123. package/render/FWRenderAssembler.ts +620 -0
  124. package/render/FWRenderAssembler.ts.meta +10 -0
  125. package/render.meta +13 -0
  126. package/scene/FWScene.ts +23 -0
  127. package/scene/FWScene.ts.meta +10 -0
  128. package/scene.meta +13 -0
  129. package/service/FWService.ts +11 -0
  130. package/service/FWService.ts.meta +10 -0
  131. package/service/http/FWHttp.ts +103 -0
  132. package/service/http/FWHttp.ts.meta +10 -0
  133. package/service/http.meta +13 -0
  134. package/service/socket/FWSocket.ts +367 -0
  135. package/service/socket/FWSocket.ts.meta +10 -0
  136. package/service/socket/FWSocketHandle.ts +16 -0
  137. package/service/socket/FWSocketHandle.ts.meta +10 -0
  138. package/service/socket/FWSocketSender.ts +14 -0
  139. package/service/socket/FWSocketSender.ts.meta +10 -0
  140. package/service/socket/mock/FWSocketMock.ts +202 -0
  141. package/service/socket/mock/FWSocketMock.ts.meta +10 -0
  142. package/service/socket/mock.meta +13 -0
  143. package/service/socket.meta +13 -0
  144. package/service.meta +13 -0
  145. package/state/FWState.ts +8 -0
  146. package/state/FWState.ts.meta +10 -0
  147. package/state.meta +13 -0
  148. package/types/Creator.d.ts +121 -0
  149. package/types/Creator.d.ts.meta +6 -0
  150. package/types/FW.d.ts +3016 -0
  151. package/types/FW.d.ts.meta +6 -0
  152. package/types/Global.d.ts +22 -0
  153. package/types/Global.d.ts.meta +10 -0
  154. package/types.meta +13 -0
  155. package/utils/FWLodash.ts +105 -0
  156. package/utils/FWLodash.ts.meta +10 -0
  157. package/utils/FWMask.ts +222 -0
  158. package/utils/FWMask.ts.meta +10 -0
  159. package/utils/FWObject.ts +27 -0
  160. package/utils/FWObject.ts.meta +10 -0
  161. package/utils/FWObjectPool.ts +177 -0
  162. package/utils/FWObjectPool.ts.meta +10 -0
  163. package/utils/FWQueue.ts +55 -0
  164. package/utils/FWQueue.ts.meta +10 -0
  165. package/utils/FWResLoader.ts +139 -0
  166. package/utils/FWResLoader.ts.meta +10 -0
  167. package/utils/FWTask.ts +227 -0
  168. package/utils/FWTask.ts.meta +10 -0
  169. package/utils/FWUtils.ts +15 -0
  170. package/utils/FWUtils.ts.meta +10 -0
  171. package/utils.meta +13 -0
@@ -0,0 +1,139 @@
1
+ export default class FWResLoader {
2
+ /**
3
+ * 通过任务系统按帧加载资源
4
+ */
5
+ public static threadLoad(options: {
6
+ assets: FW.AssetProperty[];
7
+ cb?: (progress: number) => void;
8
+ }): void {
9
+ const totalAssetsCount = options.assets.length;
10
+ let loadedAssetsCount = 0;
11
+
12
+ const task = FW.Entry.taskMgr.createTask({
13
+ frameBudget: 1 / 20,
14
+ tasksFrameCount: 5,
15
+ log: true,
16
+ });
17
+
18
+ const loadTask = async function* (): FW.TaskGenerator {
19
+ yield {
20
+ type: FW.EventDefine.TaskEvent.START,
21
+ progress: 0,
22
+ message: "资源加载开始",
23
+ };
24
+
25
+ for (const asset of options.assets) {
26
+ try {
27
+ await FW.Entry.resMgr.loadAsset({
28
+ bundle: asset.bundle,
29
+ path: asset.path,
30
+ type: asset.type,
31
+ });
32
+
33
+ loadedAssetsCount++;
34
+
35
+ const currentProgress = loadedAssetsCount / totalAssetsCount;
36
+
37
+ options.cb?.(currentProgress);
38
+
39
+ yield {
40
+ type: FW.EventDefine.TaskEvent.PROGRESS,
41
+ progress: currentProgress,
42
+ message: `资源加载中-> 资源路径:${asset.path} ,资源数:${loadedAssetsCount}/${totalAssetsCount},进度百分比:${currentProgress}`,
43
+ };
44
+ } catch (error) {
45
+ FW.Log.error(`加载资源失败: ${asset.path}`, error);
46
+ loadedAssetsCount++;
47
+ yield {
48
+ type: FW.EventDefine.TaskEvent.PROGRESS,
49
+ progress: loadedAssetsCount / totalAssetsCount,
50
+ message: `资源加载失败->: ${asset.path}`,
51
+ };
52
+ }
53
+ }
54
+
55
+ yield {
56
+ type: FW.EventDefine.TaskEvent.COMPLETE,
57
+ progress: 1,
58
+ message: "资源加载完成",
59
+ };
60
+ };
61
+
62
+ task.start(loadTask);
63
+ }
64
+
65
+ /**
66
+ * 加载bundle并收集预加载资源
67
+ */
68
+ public static async loadBundlesAndCollectAssets(
69
+ bundles: string[],
70
+ ): Promise<{
71
+ priorityAssets: FW.AssetProperty[];
72
+ backStageAssets: FW.AssetProperty[];
73
+ }> {
74
+ const priorityAssets: FW.AssetProperty[] = [];
75
+ const backStageAssets: FW.AssetProperty[] = [];
76
+
77
+ for (const bundleName of bundles) {
78
+ await FW.Entry.resMgr.loadBundle(bundleName);
79
+ const assetsConfig = FW.Entry.getComponent<FW.AssetConfig>(
80
+ `${bundleName}${FW.SystemDefine.FWBindTag.CONFIG}`,
81
+ );
82
+
83
+ if (!assetsConfig) continue;
84
+
85
+ const find = (o: any) => {
86
+ if (!o) return;
87
+ Object.keys(o).forEach((key) => {
88
+ const value: FW.AssetProperty | any = o[key];
89
+ const path: string = (value as any)?.path;
90
+ const priorityLoaded: boolean = (value as any)?.priorityLoaded;
91
+ if (path) {
92
+ (priorityLoaded ? priorityAssets : backStageAssets).push({
93
+ bundle: bundleName,
94
+ path,
95
+ });
96
+ } else if (typeof value === "object") {
97
+ find(value);
98
+ }
99
+ });
100
+ };
101
+
102
+ find((assetsConfig as any).preLoad);
103
+ }
104
+
105
+ return {
106
+ priorityAssets,
107
+ backStageAssets,
108
+ };
109
+ }
110
+
111
+ /**
112
+ * 通过线程任务加载资源并返回完成Promise
113
+ */
114
+ public static async loadAssetsWithThread(options: {
115
+ assets: FW.AssetProperty[];
116
+ cb?: (progress: number) => void;
117
+ }): Promise<void> {
118
+ const { assets, cb } = options;
119
+ if (!assets || assets.length === 0) {
120
+ cb?.(1);
121
+ return;
122
+ }
123
+
124
+ return new Promise<void>((resolve) => {
125
+ let loadedCount = 0;
126
+
127
+ FWResLoader.threadLoad({
128
+ assets,
129
+ cb: (progress: number) => {
130
+ cb?.(progress);
131
+ if (++loadedCount >= assets.length) {
132
+ resolve();
133
+ }
134
+ },
135
+ });
136
+ });
137
+ }
138
+ }
139
+
@@ -0,0 +1,10 @@
1
+ {
2
+ "ver": "1.1.0",
3
+ "uuid": "ca26ad6e-2aad-45c8-84b3-9a5052e47023",
4
+ "importer": "typescript",
5
+ "isPlugin": false,
6
+ "loadPluginInWeb": true,
7
+ "loadPluginInNative": true,
8
+ "loadPluginInEditor": false,
9
+ "subMetas": {}
10
+ }
@@ -0,0 +1,227 @@
1
+ export default class FWTask implements FW.Task {
2
+ private taskQueue: FW.TaskGenerator[] = [];
3
+ private status: FW.SystemDefine.FWTaskStatus = FW.SystemDefine.FWTaskStatus.IDLE;
4
+ private isPaused = false;
5
+ private frameBudget: number;
6
+ private tasksFrameCount: number;
7
+ private taskCounter: number;
8
+ private totalTaskDuration: number;
9
+ private taskStartTime: string;
10
+ private log: boolean;
11
+ private performanceData: {
12
+ frameTimes: number[];
13
+ detailedFrames: FW.FrameDetail[];
14
+ events: FW.TaskEvent[];
15
+ };
16
+
17
+ readonly id: number;
18
+
19
+ constructor(options: FW.TaskOptions) {
20
+ this.id = options.taskId || Date.now();
21
+ this.taskCounter = 0;
22
+ this.totalTaskDuration = 0;
23
+ this.log = options.log ?? true;
24
+ this.frameBudget = options.frameBudget ?? 16;
25
+ this.tasksFrameCount = options.tasksFrameCount ?? 3;
26
+ this.performanceData = {
27
+ frameTimes: [],
28
+ detailedFrames: [],
29
+ events: [],
30
+ };
31
+ }
32
+
33
+ start(generator: FW.TaskFunction): FW.Task {
34
+ this.reset();
35
+ const taskId = `TaskId:${this.id}->TaskCounter${this.taskCounter++}`;
36
+ const gen = generator();
37
+ (gen as any).taskId = taskId;
38
+ this.taskQueue = [gen];
39
+ this.status = FW.SystemDefine.FWTaskStatus.RUNNING;
40
+ this.recordEvent({
41
+ type: FW.EventDefine.TaskEvent.START,
42
+ message: '任务开始',
43
+ taskId,
44
+ });
45
+ this.taskStartTime = FW.Entry.timeMgr.getTime();
46
+ this.executeFrame();
47
+ return this;
48
+ }
49
+
50
+ add(generator: FW.TaskFunction): FW.Task {
51
+ const taskId = `TaskId:${this.id}->TaskCounter${this.taskCounter++}`;
52
+ const gen = generator();
53
+ (gen as any).taskId = taskId;
54
+ this.taskQueue.push(gen);
55
+ this.recordEvent({
56
+ type: FW.EventDefine.TaskEvent.PROGRESS,
57
+ message: '新任务加入队列',
58
+ taskId,
59
+ });
60
+ if (this.status !== FW.SystemDefine.FWTaskStatus.RUNNING && !this.isPaused) {
61
+ this.status = FW.SystemDefine.FWTaskStatus.RUNNING;
62
+ this.executeFrame();
63
+ }
64
+ return this;
65
+ }
66
+
67
+ stop(): void {
68
+ this.taskCounter = 0;
69
+ this.taskQueue = [];
70
+ this.taskStartTime = '';
71
+ this.tasksFrameCount = 0;
72
+ this.totalTaskDuration = 0;
73
+ }
74
+
75
+ pause(): void {
76
+ this.isPaused = true;
77
+ this.status = FW.SystemDefine.FWTaskStatus.PAUSED;
78
+ this.recordEvent({
79
+ type: FW.EventDefine.TaskEvent.PAUSE,
80
+ message: '任务已暂停',
81
+ });
82
+ }
83
+
84
+ resume(): void {
85
+ if (this.taskQueue.length === 0) return;
86
+
87
+ this.isPaused = false;
88
+ this.status = FW.SystemDefine.FWTaskStatus.RUNNING;
89
+ this.recordEvent({
90
+ type: FW.EventDefine.TaskEvent.PROGRESS,
91
+ message: '任务已恢复',
92
+ });
93
+ this.executeFrame();
94
+ }
95
+
96
+ reset(): void {
97
+ this.taskQueue = [];
98
+ this.status = FW.SystemDefine.FWTaskStatus.IDLE;
99
+ this.isPaused = false;
100
+ this.performanceData = {
101
+ frameTimes: [],
102
+ detailedFrames: [],
103
+ events: [],
104
+ };
105
+ }
106
+
107
+ getStatus(): FW.SystemDefine.FWTaskStatus {
108
+ return this.status;
109
+ }
110
+
111
+ private async executeFrame(): Promise<void> {
112
+ if (this.isPaused || this.taskQueue.length === 0) return;
113
+
114
+ const frameStart = performance.now();
115
+ let processed = 0;
116
+ let frameTasks: FW.TaskExecutionRecord[] = [];
117
+ const startTime = FW.Entry.timeMgr.getTime();
118
+
119
+ while (
120
+ this.taskQueue.length > 0 &&
121
+ processed < this.tasksFrameCount &&
122
+ performance.now() - frameStart < this.frameBudget
123
+ ) {
124
+ const task = this.taskQueue[0];
125
+
126
+ const taskId = (task as any).taskId || `id-${processed}`;
127
+
128
+ const result = await task.next();
129
+
130
+ if (result.done) {
131
+ this.taskQueue.shift();
132
+ this.recordEvent({
133
+ type: FW.EventDefine.TaskEvent.COMPLETE,
134
+ progress: 1,
135
+ message: '任务完成',
136
+ taskId,
137
+ });
138
+ } else if (result.value) {
139
+ this.recordEvent({
140
+ ...result.value,
141
+ taskId,
142
+ });
143
+ }
144
+
145
+ frameTasks.push({
146
+ taskId: taskId,
147
+ result: result.done ? FW.EventDefine.TaskEvent.COMPLETE : FW.EventDefine.TaskEvent.YIELDED,
148
+ message: (result?.value as any)?.message,
149
+ });
150
+
151
+ processed++;
152
+ }
153
+
154
+ const frameTime = performance.now() - frameStart;
155
+ this.totalTaskDuration += frameTime;
156
+ this.performanceData.frameTimes.push(frameTime);
157
+ this.performanceData.detailedFrames.push({
158
+ frameStart: startTime,
159
+ frameEnd: FW.Entry.timeMgr.getTime(),
160
+ frameTime: frameTime,
161
+ tasksProcessed: processed,
162
+ tasks: frameTasks,
163
+ frameBudget: this.frameBudget,
164
+ frameBudgetUsed: frameTime / this.frameBudget,
165
+ });
166
+
167
+ if (this.taskQueue.length === 0) {
168
+ this.status = FW.SystemDefine.FWTaskStatus.COMPLETED;
169
+ this.recordEvent({
170
+ type: FW.EventDefine.TaskEvent.ALL_COMPLETE,
171
+ progress: 1,
172
+ message: '所有任务完成',
173
+ });
174
+ FW.Log.system('任务性能报告->', this.getPerformanceReport());
175
+ return;
176
+ }
177
+
178
+ requestAnimationFrame(async () => await this.executeFrame());
179
+ }
180
+
181
+ getPerformanceReport(): FW.TaskPerformanceReport {
182
+ const frameTimes = this.performanceData.frameTimes;
183
+ const avgFrameTime = frameTimes.reduce((sum, t) => sum + t, 0) / frameTimes.length || 0;
184
+
185
+ const frameDurations = [];
186
+ for (let i = 1; i < frameTimes.length; i++) {
187
+ frameDurations.push(frameTimes[i] - frameTimes[i - 1]);
188
+ }
189
+ const avgFrameDuration =
190
+ frameDurations.reduce((sum, d) => sum + d, 0) / frameDurations.length || 0;
191
+ const frameJitter =
192
+ frameDurations.reduce((sum, d) => sum + Math.abs(d - avgFrameDuration), 0) /
193
+ frameDurations.length || 0;
194
+
195
+ const budgetUsage =
196
+ this.performanceData.detailedFrames
197
+ .map((f) => f.frameBudgetUsed)
198
+ .reduce((sum, u) => sum + u, 0) / this.performanceData.detailedFrames.length || 0;
199
+
200
+ return {
201
+ startTime: this.taskStartTime,
202
+ endTime: FW.Entry.timeMgr.getTime(),
203
+ totalTasks: this.performanceData.detailedFrames.length,
204
+ totalFrames: frameTimes.length,
205
+ totalDuration: Number((this.totalTaskDuration / 1000).toFixed(2)),
206
+ avgFrameTime: avgFrameTime,
207
+ longestFrame: Math.max(...frameTimes),
208
+ shortestFrame: Math.min(...frameTimes),
209
+ frameJitter: frameJitter,
210
+ budgetUsage: budgetUsage,
211
+ timeline: this.performanceData.events.map((e) => ({
212
+ taskId: e.taskId,
213
+ type: e.type,
214
+ progress: e.progress,
215
+ message: e.message,
216
+ })),
217
+ frameDetails: [...this.performanceData.detailedFrames],
218
+ };
219
+ }
220
+
221
+ private recordEvent(event: FW.TaskEvent): void {
222
+ this.performanceData.events.push(event);
223
+ if (this.log) {
224
+ FW.Log.debug(`[任务${this.id}]`, event.message || `${event.type} ${event.progress}%`);
225
+ }
226
+ }
227
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "ver": "1.1.0",
3
+ "uuid": "f84e273f-f5fb-4938-a45d-0d22c7cb05c1",
4
+ "importer": "typescript",
5
+ "isPlugin": false,
6
+ "loadPluginInWeb": true,
7
+ "loadPluginInNative": true,
8
+ "loadPluginInEditor": false,
9
+ "subMetas": {}
10
+ }
@@ -0,0 +1,15 @@
1
+ export default class FWUtils {
2
+ /**
3
+ * 从 URL 中获取完整文件名(含扩展名)
4
+ */
5
+ public getFileName(url: string): string {
6
+ try {
7
+ const urlObj = new URL(url);
8
+ const pathname = urlObj.pathname;
9
+ return pathname.substring(pathname.lastIndexOf('/') + 1);
10
+ } catch {
11
+ const cleanUrl = url.split('?')[0].split('#')[0];
12
+ return cleanUrl.substring(cleanUrl.lastIndexOf('/') + 1);
13
+ }
14
+ }
15
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "ver": "1.1.0",
3
+ "uuid": "b87b47df-cb7e-47d2-9999-0b18172676ca",
4
+ "importer": "typescript",
5
+ "isPlugin": false,
6
+ "loadPluginInWeb": true,
7
+ "loadPluginInNative": true,
8
+ "loadPluginInEditor": false,
9
+ "subMetas": {}
10
+ }
package/utils.meta ADDED
@@ -0,0 +1,13 @@
1
+ {
2
+ "ver": "1.1.3",
3
+ "uuid": "8f19d5ca-c389-4ba5-8a8c-6cd9e75a256f",
4
+ "importer": "folder",
5
+ "isBundle": false,
6
+ "bundleName": "",
7
+ "priority": 1,
8
+ "compressionType": {},
9
+ "optimizeHotUpdate": {},
10
+ "inlineSpriteFrames": {},
11
+ "isRemoteBundle": {},
12
+ "subMetas": {}
13
+ }