@loaders.gl/tiles 4.4.5 → 5.0.0-alpha.2

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 (227) hide show
  1. package/LICENSE +14 -3
  2. package/README.md +110 -1
  3. package/dist/dist.dev.js +6588 -2057
  4. package/dist/dist.min.js +1 -1
  5. package/dist/image-set.d.ts +94 -0
  6. package/dist/image-set.d.ts.map +1 -0
  7. package/dist/image-set.js +243 -0
  8. package/dist/image-set.js.map +1 -0
  9. package/dist/index.cjs +6872 -2160
  10. package/dist/index.cjs.map +3 -4
  11. package/dist/index.d.ts +33 -9
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +18 -8
  14. package/dist/index.js.map +1 -1
  15. package/dist/point-cloud/point-cloud-tile.d.ts +47 -0
  16. package/dist/point-cloud/point-cloud-tile.d.ts.map +1 -0
  17. package/dist/point-cloud/point-cloud-tile.js +70 -0
  18. package/dist/point-cloud/point-cloud-tile.js.map +1 -0
  19. package/dist/point-cloud/point-cloud-tileset.d.ts +131 -0
  20. package/dist/point-cloud/point-cloud-tileset.d.ts.map +1 -0
  21. package/dist/point-cloud/point-cloud-tileset.js +510 -0
  22. package/dist/point-cloud/point-cloud-tileset.js.map +1 -0
  23. package/dist/point-cloud/types.d.ts +64 -0
  24. package/dist/point-cloud/types.d.ts.map +1 -0
  25. package/dist/point-cloud/types.js +5 -0
  26. package/dist/point-cloud/types.js.map +1 -0
  27. package/dist/raster-set.d.ts +113 -0
  28. package/dist/raster-set.d.ts.map +1 -0
  29. package/dist/raster-set.js +274 -0
  30. package/dist/raster-set.js.map +1 -0
  31. package/dist/tileset-2d/adapter.d.ts +38 -0
  32. package/dist/tileset-2d/adapter.d.ts.map +1 -0
  33. package/dist/tileset-2d/adapter.js +5 -0
  34. package/dist/tileset-2d/adapter.js.map +1 -0
  35. package/dist/tileset-2d/index.d.ts +7 -0
  36. package/dist/tileset-2d/index.d.ts.map +1 -0
  37. package/dist/tileset-2d/index.js +6 -0
  38. package/dist/tileset-2d/index.js.map +1 -0
  39. package/dist/tileset-2d/tile-2d-header.d.ts +68 -0
  40. package/dist/tileset-2d/tile-2d-header.d.ts.map +1 -0
  41. package/dist/tileset-2d/tile-2d-header.js +181 -0
  42. package/dist/tileset-2d/tile-2d-header.js.map +1 -0
  43. package/dist/tileset-2d/tileset-2d.d.ts +201 -0
  44. package/dist/tileset-2d/tileset-2d.d.ts.map +1 -0
  45. package/dist/tileset-2d/tileset-2d.js +532 -0
  46. package/dist/tileset-2d/tileset-2d.js.map +1 -0
  47. package/dist/tileset-2d/types.d.ts +44 -0
  48. package/dist/tileset-2d/types.d.ts.map +1 -0
  49. package/dist/tileset-2d/types.js +5 -0
  50. package/dist/tileset-2d/types.js.map +1 -0
  51. package/dist/tileset-2d.d.ts +2 -0
  52. package/dist/tileset-2d.d.ts.map +1 -0
  53. package/dist/tileset-2d.js +5 -0
  54. package/dist/tileset-2d.js.map +1 -0
  55. package/dist/tileset-3d/common/indexed-archive-tileset-source.d.ts +60 -0
  56. package/dist/tileset-3d/common/indexed-archive-tileset-source.d.ts.map +1 -0
  57. package/dist/tileset-3d/common/indexed-archive-tileset-source.js +125 -0
  58. package/dist/tileset-3d/common/indexed-archive-tileset-source.js.map +1 -0
  59. package/dist/{tileset → tileset-3d/common}/tile-3d.d.ts +133 -29
  60. package/dist/tileset-3d/common/tile-3d.d.ts.map +1 -0
  61. package/dist/{tileset → tileset-3d/common}/tile-3d.js +282 -77
  62. package/dist/tileset-3d/common/tile-3d.js.map +1 -0
  63. package/dist/tileset-3d/common/tileset-3d.d.ts +317 -0
  64. package/dist/tileset-3d/common/tileset-3d.d.ts.map +1 -0
  65. package/dist/tileset-3d/common/tileset-3d.js +807 -0
  66. package/dist/tileset-3d/common/tileset-3d.js.map +1 -0
  67. package/dist/tileset-3d/common/tileset-cache.d.ts +29 -0
  68. package/dist/tileset-3d/common/tileset-cache.d.ts.map +1 -0
  69. package/dist/{tileset → tileset-3d/common}/tileset-cache.js +12 -4
  70. package/dist/tileset-3d/common/tileset-cache.js.map +1 -0
  71. package/dist/tileset-3d/common/tileset-source.d.ts +204 -0
  72. package/dist/tileset-3d/common/tileset-source.d.ts.map +1 -0
  73. package/dist/tileset-3d/common/tileset-source.js +17 -0
  74. package/dist/tileset-3d/common/tileset-source.js.map +1 -0
  75. package/dist/{tileset → tileset-3d/common}/tileset-traverser.d.ts +15 -2
  76. package/dist/tileset-3d/common/tileset-traverser.d.ts.map +1 -0
  77. package/dist/{tileset → tileset-3d/common}/tileset-traverser.js +30 -3
  78. package/dist/tileset-3d/common/tileset-traverser.js.map +1 -0
  79. package/dist/tileset-3d/format-3d-tiles/implicit-tiling.d.ts +111 -0
  80. package/dist/tileset-3d/format-3d-tiles/implicit-tiling.d.ts.map +1 -0
  81. package/dist/tileset-3d/format-3d-tiles/implicit-tiling.js +340 -0
  82. package/dist/tileset-3d/format-3d-tiles/implicit-tiling.js.map +1 -0
  83. package/dist/tileset-3d/format-3d-tiles/tiles-3d-source.d.ts +189 -0
  84. package/dist/tileset-3d/format-3d-tiles/tiles-3d-source.d.ts.map +1 -0
  85. package/dist/tileset-3d/format-3d-tiles/tiles-3d-source.js +510 -0
  86. package/dist/tileset-3d/format-3d-tiles/tiles-3d-source.js.map +1 -0
  87. package/dist/tileset-3d/format-3d-tiles/tileset-3d-traverser.d.ts +43 -0
  88. package/dist/tileset-3d/format-3d-tiles/tileset-3d-traverser.d.ts.map +1 -0
  89. package/dist/tileset-3d/format-3d-tiles/tileset-3d-traverser.js +119 -0
  90. package/dist/tileset-3d/format-3d-tiles/tileset-3d-traverser.js.map +1 -0
  91. package/dist/tileset-3d/format-i3s/i3s-pending-tiles-register.d.ts.map +1 -0
  92. package/dist/{tileset → tileset-3d}/format-i3s/i3s-pending-tiles-register.js +3 -0
  93. package/dist/tileset-3d/format-i3s/i3s-pending-tiles-register.js.map +1 -0
  94. package/dist/tileset-3d/format-i3s/i3s-source.d.ts +99 -0
  95. package/dist/tileset-3d/format-i3s/i3s-source.d.ts.map +1 -0
  96. package/dist/tileset-3d/format-i3s/i3s-source.js +299 -0
  97. package/dist/tileset-3d/format-i3s/i3s-source.js.map +1 -0
  98. package/dist/tileset-3d/format-i3s/i3s-tile-manager.d.ts.map +1 -0
  99. package/dist/{tileset → tileset-3d}/format-i3s/i3s-tile-manager.js +5 -2
  100. package/dist/tileset-3d/format-i3s/i3s-tile-manager.js.map +1 -0
  101. package/dist/{tileset → tileset-3d}/format-i3s/i3s-tileset-traverser.d.ts +2 -2
  102. package/dist/tileset-3d/format-i3s/i3s-tileset-traverser.d.ts.map +1 -0
  103. package/dist/{tileset → tileset-3d}/format-i3s/i3s-tileset-traverser.js +17 -23
  104. package/dist/tileset-3d/format-i3s/i3s-tileset-traverser.js.map +1 -0
  105. package/dist/{tileset → tileset-3d}/helpers/3d-tiles-options.d.ts +1 -1
  106. package/dist/tileset-3d/helpers/3d-tiles-options.d.ts.map +1 -0
  107. package/dist/{tileset → tileset-3d}/helpers/3d-tiles-options.js +3 -0
  108. package/dist/tileset-3d/helpers/3d-tiles-options.js.map +1 -0
  109. package/dist/tileset-3d/helpers/bounding-volume.d.ts.map +1 -0
  110. package/dist/{tileset → tileset-3d}/helpers/bounding-volume.js +1 -0
  111. package/dist/tileset-3d/helpers/bounding-volume.js.map +1 -0
  112. package/dist/tileset-3d/helpers/frame-state.d.ts +86 -0
  113. package/dist/tileset-3d/helpers/frame-state.d.ts.map +1 -0
  114. package/dist/{tileset → tileset-3d}/helpers/frame-state.js +84 -9
  115. package/dist/tileset-3d/helpers/frame-state.js.map +1 -0
  116. package/dist/{tileset → tileset-3d}/helpers/i3s-lod.d.ts +1 -1
  117. package/dist/tileset-3d/helpers/i3s-lod.d.ts.map +1 -0
  118. package/dist/{tileset → tileset-3d}/helpers/i3s-lod.js +1 -1
  119. package/dist/tileset-3d/helpers/i3s-lod.js.map +1 -0
  120. package/dist/tileset-3d/helpers/tiles-3d-lod.d.ts +72 -0
  121. package/dist/tileset-3d/helpers/tiles-3d-lod.d.ts.map +1 -0
  122. package/dist/tileset-3d/helpers/tiles-3d-lod.js +257 -0
  123. package/dist/tileset-3d/helpers/tiles-3d-lod.js.map +1 -0
  124. package/dist/tileset-3d/helpers/tiles-3d-request-priority.d.ts +134 -0
  125. package/dist/tileset-3d/helpers/tiles-3d-request-priority.d.ts.map +1 -0
  126. package/dist/tileset-3d/helpers/tiles-3d-request-priority.js +179 -0
  127. package/dist/tileset-3d/helpers/tiles-3d-request-priority.js.map +1 -0
  128. package/dist/{tileset → tileset-3d}/helpers/transform-utils.d.ts +1 -1
  129. package/dist/tileset-3d/helpers/transform-utils.d.ts.map +1 -0
  130. package/dist/tileset-3d/helpers/transform-utils.js.map +1 -0
  131. package/dist/tileset-3d/helpers/zoom.d.ts.map +1 -0
  132. package/dist/tileset-3d/helpers/zoom.js.map +1 -0
  133. package/dist/types.d.ts +9 -0
  134. package/dist/types.d.ts.map +1 -1
  135. package/dist/types.js +3 -0
  136. package/dist/types.js.map +1 -1
  137. package/dist/utils/doubly-linked-list.d.ts.map +1 -1
  138. package/dist/utils/doubly-linked-list.js +1 -0
  139. package/dist/utils/doubly-linked-list.js.map +1 -1
  140. package/dist/utils/managed-array.d.ts.map +1 -1
  141. package/dist/utils/managed-array.js +1 -0
  142. package/dist/utils/managed-array.js.map +1 -1
  143. package/package.json +7 -6
  144. package/src/image-set.ts +328 -0
  145. package/src/index.ts +99 -9
  146. package/src/point-cloud/point-cloud-tile.ts +80 -0
  147. package/src/point-cloud/point-cloud-tileset.ts +713 -0
  148. package/src/point-cloud/types.ts +82 -0
  149. package/src/raster-set.ts +412 -0
  150. package/src/tileset-2d/adapter.ts +47 -0
  151. package/src/tileset-2d/index.ts +33 -0
  152. package/src/tileset-2d/tile-2d-header.ts +224 -0
  153. package/src/tileset-2d/tileset-2d.ts +716 -0
  154. package/src/tileset-2d/types.ts +39 -0
  155. package/src/tileset-2d.ts +5 -0
  156. package/src/tileset-3d/common/indexed-archive-tileset-source.ts +205 -0
  157. package/src/{tileset → tileset-3d/common}/tile-3d.ts +348 -93
  158. package/src/tileset-3d/common/tileset-3d.ts +1087 -0
  159. package/src/{tileset → tileset-3d/common}/tileset-cache.ts +16 -8
  160. package/src/tileset-3d/common/tileset-source.ts +255 -0
  161. package/src/{tileset → tileset-3d/common}/tileset-traverser.ts +32 -4
  162. package/src/tileset-3d/format-3d-tiles/implicit-tiling.ts +534 -0
  163. package/src/tileset-3d/format-3d-tiles/tiles-3d-source.ts +632 -0
  164. package/src/tileset-3d/format-3d-tiles/tileset-3d-traverser.ts +140 -0
  165. package/src/{tileset → tileset-3d}/format-i3s/i3s-pending-tiles-register.ts +4 -0
  166. package/src/tileset-3d/format-i3s/i3s-source.ts +366 -0
  167. package/src/{tileset → tileset-3d}/format-i3s/i3s-tile-manager.ts +6 -2
  168. package/src/{tileset → tileset-3d}/format-i3s/i3s-tileset-traverser.ts +19 -24
  169. package/src/{tileset → tileset-3d}/helpers/3d-tiles-options.ts +5 -1
  170. package/src/{tileset → tileset-3d}/helpers/bounding-volume.ts +2 -0
  171. package/src/tileset-3d/helpers/frame-state.ts +311 -0
  172. package/src/{tileset → tileset-3d}/helpers/i3s-lod.ts +2 -2
  173. package/src/tileset-3d/helpers/tiles-3d-lod.ts +370 -0
  174. package/src/tileset-3d/helpers/tiles-3d-request-priority.ts +301 -0
  175. package/src/{tileset → tileset-3d}/helpers/transform-utils.ts +1 -1
  176. package/src/types.ts +13 -0
  177. package/src/utils/doubly-linked-list.ts +2 -0
  178. package/src/utils/managed-array.ts +2 -0
  179. package/dist/tileset/format-3d-tiles/tileset-3d-traverser.d.ts +0 -7
  180. package/dist/tileset/format-3d-tiles/tileset-3d-traverser.d.ts.map +0 -1
  181. package/dist/tileset/format-3d-tiles/tileset-3d-traverser.js +0 -53
  182. package/dist/tileset/format-3d-tiles/tileset-3d-traverser.js.map +0 -1
  183. package/dist/tileset/format-i3s/i3s-pending-tiles-register.d.ts.map +0 -1
  184. package/dist/tileset/format-i3s/i3s-pending-tiles-register.js.map +0 -1
  185. package/dist/tileset/format-i3s/i3s-tile-manager.d.ts.map +0 -1
  186. package/dist/tileset/format-i3s/i3s-tile-manager.js.map +0 -1
  187. package/dist/tileset/format-i3s/i3s-tileset-traverser.d.ts.map +0 -1
  188. package/dist/tileset/format-i3s/i3s-tileset-traverser.js.map +0 -1
  189. package/dist/tileset/helpers/3d-tiles-options.d.ts.map +0 -1
  190. package/dist/tileset/helpers/3d-tiles-options.js.map +0 -1
  191. package/dist/tileset/helpers/bounding-volume.d.ts.map +0 -1
  192. package/dist/tileset/helpers/bounding-volume.js.map +0 -1
  193. package/dist/tileset/helpers/frame-state.d.ts +0 -28
  194. package/dist/tileset/helpers/frame-state.d.ts.map +0 -1
  195. package/dist/tileset/helpers/frame-state.js.map +0 -1
  196. package/dist/tileset/helpers/i3s-lod.d.ts.map +0 -1
  197. package/dist/tileset/helpers/i3s-lod.js.map +0 -1
  198. package/dist/tileset/helpers/tiles-3d-lod.d.ts +0 -8
  199. package/dist/tileset/helpers/tiles-3d-lod.d.ts.map +0 -1
  200. package/dist/tileset/helpers/tiles-3d-lod.js +0 -113
  201. package/dist/tileset/helpers/tiles-3d-lod.js.map +0 -1
  202. package/dist/tileset/helpers/transform-utils.d.ts.map +0 -1
  203. package/dist/tileset/helpers/transform-utils.js.map +0 -1
  204. package/dist/tileset/helpers/zoom.d.ts.map +0 -1
  205. package/dist/tileset/helpers/zoom.js.map +0 -1
  206. package/dist/tileset/tile-3d.d.ts.map +0 -1
  207. package/dist/tileset/tile-3d.js.map +0 -1
  208. package/dist/tileset/tileset-3d.d.ts +0 -284
  209. package/dist/tileset/tileset-3d.d.ts.map +0 -1
  210. package/dist/tileset/tileset-3d.js +0 -814
  211. package/dist/tileset/tileset-3d.js.map +0 -1
  212. package/dist/tileset/tileset-cache.d.ts +0 -19
  213. package/dist/tileset/tileset-cache.d.ts.map +0 -1
  214. package/dist/tileset/tileset-cache.js.map +0 -1
  215. package/dist/tileset/tileset-traverser.d.ts.map +0 -1
  216. package/dist/tileset/tileset-traverser.js.map +0 -1
  217. package/src/tileset/format-3d-tiles/tileset-3d-traverser.ts +0 -63
  218. package/src/tileset/helpers/frame-state.ts +0 -183
  219. package/src/tileset/helpers/tiles-3d-lod.ts +0 -149
  220. package/src/tileset/tileset-3d.ts +0 -1037
  221. /package/dist/{tileset → tileset-3d}/format-i3s/i3s-pending-tiles-register.d.ts +0 -0
  222. /package/dist/{tileset → tileset-3d}/format-i3s/i3s-tile-manager.d.ts +0 -0
  223. /package/dist/{tileset → tileset-3d}/helpers/bounding-volume.d.ts +0 -0
  224. /package/dist/{tileset → tileset-3d}/helpers/transform-utils.js +0 -0
  225. /package/dist/{tileset → tileset-3d}/helpers/zoom.d.ts +0 -0
  226. /package/dist/{tileset → tileset-3d}/helpers/zoom.js +0 -0
  227. /package/src/{tileset → tileset-3d}/helpers/zoom.ts +0 -0
@@ -0,0 +1,39 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ /** Inclusive minimum and maximum elevation bounds used during tile selection. */
6
+ export type ZRange = [minZ: number, maxZ: number];
7
+
8
+ /** Axis-aligned bounding box represented as `[minX, minY, maxX, maxY]`. */
9
+ export type Bounds = [minX: number, minY: number, maxX: number, maxY: number];
10
+
11
+ /** Geographic tile bounds in longitude/latitude coordinates. */
12
+ export type GeoBoundingBox = {west: number; north: number; east: number; south: number};
13
+
14
+ /** Cartesian tile bounds in layer/world coordinates. */
15
+ export type NonGeoBoundingBox = {left: number; top: number; right: number; bottom: number};
16
+
17
+ /** Tile bounds for either geospatial or cartesian views. */
18
+ export type TileBoundingBox = NonGeoBoundingBox | GeoBoundingBox;
19
+
20
+ /** Tile coordinate in an x/y/z pyramid. */
21
+ export type TileIndex = {x: number; y: number; z: number};
22
+
23
+ /** Information passed to a tile loader for fetching tile content. */
24
+ export type TileLoadProps = {
25
+ /** x/y/z tile coordinate. */
26
+ index: TileIndex;
27
+ /** Stable cache identifier for the tile. */
28
+ id: string;
29
+ /** Bounds covered by the tile in the active coordinate system. */
30
+ bbox: TileBoundingBox;
31
+ /** URL derived from a URL template, if applicable. */
32
+ url?: string | null;
33
+ /** Abort signal for cancelling an in-flight tile request. */
34
+ signal?: AbortSignal;
35
+ /** Optional application metadata associated with the tile. */
36
+ userData?: Record<string, any>;
37
+ /** Resolved zoom level used to request this tile. */
38
+ zoom?: number;
39
+ };
@@ -0,0 +1,5 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ export * from './tileset-2d/index';
@@ -0,0 +1,205 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import {BlobFile, HttpFile, path} from '@loaders.gl/loader-utils';
6
+ import type {
7
+ CoreAPI,
8
+ LoaderOptions,
9
+ LoaderWithParser,
10
+ ReadableFile
11
+ } from '@loaders.gl/loader-utils';
12
+ import type {TilesetSourceResolver} from './tileset-source';
13
+
14
+ /** Options for {@link IndexedArchiveTilesetSource}. */
15
+ export type IndexedArchiveTilesetSourceOptions<ArchiveT> = {
16
+ /** Archive URL or Blob. */
17
+ data: string | Blob;
18
+ /** Filename to expose for Blob inputs that do not provide a name. */
19
+ fallbackFilename: string;
20
+ /** Archive file extension used as the URL path marker. */
21
+ archiveExtension: string;
22
+ /** Path to the root metadata resource inside the archive. */
23
+ rootPath: string;
24
+ /** Optional mode passed when loading the root metadata resource. */
25
+ rootMode?: string;
26
+ /** Parses an opened readable file into an indexed archive object. */
27
+ parseArchive: (file: ReadableFile) => Promise<ArchiveT>;
28
+ /** Loads one resource from the parsed archive. */
29
+ getFile: (archive: ArchiveT, pathInArchive: string, mode?: string) => Promise<ArrayBuffer>;
30
+ /** Returns the core API used for local file loading and nested resource parsing. */
31
+ getCoreApi: () => CoreAPI | undefined;
32
+ /** Error message to throw when the core API is required but unavailable. */
33
+ missingCoreApiMessage: string;
34
+ };
35
+
36
+ /**
37
+ * Tileset source resolver backed by an indexed archive such as 3TZ or SLPK.
38
+ *
39
+ * The source owns archive opening, archive caching, path resolution, and archive-backed `fetch`
40
+ * injection. Format-specific parsing and file lookup stay in the owning format module.
41
+ */
42
+ export class IndexedArchiveTilesetSource<ArchiveT> implements TilesetSourceResolver {
43
+ /** URL exposed to the tileset source that owns this archive source. */
44
+ readonly sourceUrl: string;
45
+
46
+ private readonly options: IndexedArchiveTilesetSourceOptions<ArchiveT>;
47
+ private archivePromise?: Promise<ArchiveT>;
48
+
49
+ /**
50
+ * Creates an indexed archive tileset source.
51
+ * @param options Archive source options
52
+ */
53
+ constructor(options: IndexedArchiveTilesetSourceOptions<ArchiveT>) {
54
+ this.options = options;
55
+ this.sourceUrl = getArchiveSourceUrl(options.data, options.fallbackFilename);
56
+ }
57
+
58
+ /**
59
+ * Loads and parses the archive root metadata resource.
60
+ * @param url Root URL, ignored because the archive root path is configured explicitly
61
+ * @param loader Loader used to parse the root metadata
62
+ * @param loadOptions Loader options forwarded to parsing
63
+ */
64
+ async loadRoot<DataT>(
65
+ url: string,
66
+ loader: LoaderWithParser<DataT>,
67
+ loadOptions: LoaderOptions
68
+ ): Promise<DataT> {
69
+ return await this.parseArchiveResource(
70
+ url,
71
+ this.options.rootPath,
72
+ loader,
73
+ loadOptions,
74
+ this.options.rootMode
75
+ );
76
+ }
77
+
78
+ /**
79
+ * Loads and parses an archive resource relative to a requesting resource URL.
80
+ * @param url Resource URL
81
+ * @param loader Loader used to parse the resource
82
+ * @param loadOptions Loader options forwarded to parsing
83
+ */
84
+ async loadResource<DataT>(
85
+ url: string,
86
+ loader: LoaderWithParser<DataT>,
87
+ loadOptions: LoaderOptions
88
+ ): Promise<DataT> {
89
+ const pathInArchive = this.resolveArchivePath(url, url);
90
+ return await this.parseArchiveResource(url, pathInArchive, loader, loadOptions);
91
+ }
92
+
93
+ private async parseArchiveResource<DataT>(
94
+ resourceUrl: string,
95
+ pathInArchive: string,
96
+ loader: LoaderWithParser<DataT>,
97
+ loadOptions: LoaderOptions,
98
+ mode?: string
99
+ ): Promise<DataT> {
100
+ const coreApi = this.options.getCoreApi();
101
+ if (!coreApi) {
102
+ throw new Error(this.options.missingCoreApiMessage);
103
+ }
104
+
105
+ const data = await this.loadFile(pathInArchive, mode);
106
+ const archiveFetch = this.createArchiveFetch(resourceUrl);
107
+ return (await coreApi.parse(
108
+ data,
109
+ loader,
110
+ {
111
+ ...loadOptions,
112
+ fetch: archiveFetch
113
+ },
114
+ {
115
+ url: resourceUrl,
116
+ fetch: archiveFetch,
117
+ _parse: coreApi.parse,
118
+ loaders: [loader],
119
+ coreApi
120
+ } as any
121
+ )) as DataT;
122
+ }
123
+
124
+ private createArchiveFetch(contextUrl: string): typeof fetch {
125
+ return async (input: RequestInfo | URL): Promise<Response> => {
126
+ const requestUrl =
127
+ typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url;
128
+ const pathInArchive = this.resolveArchivePath(requestUrl, contextUrl);
129
+ const data = await this.loadFile(pathInArchive);
130
+ return new Response(data, {status: 200});
131
+ };
132
+ }
133
+
134
+ private async loadFile(pathInArchive: string, mode?: string): Promise<ArrayBuffer> {
135
+ this.archivePromise ||= this.openArchiveReadableFile().then(file =>
136
+ this.options.parseArchive(file)
137
+ );
138
+ const archive = await this.archivePromise;
139
+ return await this.options.getFile(archive, pathInArchive, mode);
140
+ }
141
+
142
+ private async openArchiveReadableFile(): Promise<ReadableFile> {
143
+ const {data} = this.options;
144
+ if (typeof data !== 'string') {
145
+ return new BlobFile(data);
146
+ }
147
+
148
+ if (/^https?:\/\//i.test(data)) {
149
+ return new HttpFile(data);
150
+ }
151
+
152
+ const coreApi = this.options.getCoreApi();
153
+ if (!coreApi) {
154
+ throw new Error(this.options.missingCoreApiMessage);
155
+ }
156
+ const response = await coreApi.fetchFile(data);
157
+ return new BlobFile(await response.arrayBuffer());
158
+ }
159
+
160
+ private resolveArchivePath(request: string, baseUrl: string): string {
161
+ const requestWithoutQuery = stripQueryString(request);
162
+ const archiveRoot = stripQueryString(this.sourceUrl);
163
+ const baseWithoutQuery = stripQueryString(baseUrl);
164
+ const basePath =
165
+ baseWithoutQuery === archiveRoot ? archiveRoot : path.dirname(baseWithoutQuery);
166
+ const markerExpression = new RegExp(`\\.${this.options.archiveExtension}/(.*)$`, 'i');
167
+ const markerMatch = requestWithoutQuery.match(markerExpression);
168
+ if (markerMatch?.[1]) {
169
+ return markerMatch[1];
170
+ }
171
+
172
+ const isAbsoluteRequest =
173
+ /^[a-z][a-z0-9+.-]*:/i.test(requestWithoutQuery) || requestWithoutQuery.startsWith('/');
174
+ const absoluteRequest = requestWithoutQuery.startsWith(archiveRoot)
175
+ ? requestWithoutQuery
176
+ : baseWithoutQuery === archiveRoot && !isAbsoluteRequest
177
+ ? `${archiveRoot}/${requestWithoutQuery}`
178
+ : path.resolve(basePath, requestWithoutQuery);
179
+
180
+ if (absoluteRequest === archiveRoot) {
181
+ return '';
182
+ }
183
+
184
+ if (absoluteRequest.startsWith(`${archiveRoot}/`)) {
185
+ return absoluteRequest.slice(archiveRoot.length + 1);
186
+ }
187
+
188
+ return absoluteRequest.replace(/^\/+/, '');
189
+ }
190
+ }
191
+
192
+ function getArchiveSourceUrl(data: string | Blob, fallbackFilename: string): string {
193
+ if (typeof data === 'string') {
194
+ return data;
195
+ }
196
+
197
+ const fileName =
198
+ 'name' in data && typeof data.name === 'string' && data.name ? data.name : fallbackFilename;
199
+ return `memory://${fileName}`;
200
+ }
201
+
202
+ function stripQueryString(url: string): string {
203
+ const queryIndex = url.indexOf('?');
204
+ return queryIndex >= 0 ? url.slice(0, queryIndex) : url;
205
+ }