@loaders.gl/zip 4.1.0-alpha.1 → 4.1.0-alpha.3

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 (58) hide show
  1. package/dist/dist.dev.js +115 -16
  2. package/dist/filesystems/zip-filesystem.d.ts.map +1 -1
  3. package/dist/filesystems/zip-filesystem.js.map +1 -1
  4. package/dist/hash-file-utility.d.ts.map +1 -1
  5. package/dist/hash-file-utility.js.map +1 -1
  6. package/dist/index.cjs +126 -9
  7. package/dist/index.d.ts +1 -1
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +1 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/lib/tar/header.d.ts.map +1 -1
  12. package/dist/lib/tar/header.js.map +1 -1
  13. package/dist/lib/tar/tar.d.ts.map +1 -1
  14. package/dist/lib/tar/tar.js.map +1 -1
  15. package/dist/lib/tar/types.d.ts.map +1 -1
  16. package/dist/lib/tar/types.js.map +1 -1
  17. package/dist/lib/tar/utils.d.ts.map +1 -1
  18. package/dist/lib/tar/utils.js.map +1 -1
  19. package/dist/parse-zip/cd-file-header.d.ts.map +1 -1
  20. package/dist/parse-zip/cd-file-header.js +2 -2
  21. package/dist/parse-zip/cd-file-header.js.map +1 -1
  22. package/dist/parse-zip/end-of-central-directory.d.ts.map +1 -1
  23. package/dist/parse-zip/end-of-central-directory.js.map +1 -1
  24. package/dist/parse-zip/local-file-header.d.ts +16 -0
  25. package/dist/parse-zip/local-file-header.d.ts.map +1 -1
  26. package/dist/parse-zip/local-file-header.js +73 -1
  27. package/dist/parse-zip/local-file-header.js.map +1 -1
  28. package/dist/parse-zip/search-from-the-end.d.ts.map +1 -1
  29. package/dist/parse-zip/search-from-the-end.js.map +1 -1
  30. package/dist/parse-zip/zip64-info-generation.d.ts +5 -8
  31. package/dist/parse-zip/zip64-info-generation.d.ts.map +1 -1
  32. package/dist/parse-zip/zip64-info-generation.js +6 -3
  33. package/dist/parse-zip/zip64-info-generation.js.map +1 -1
  34. package/dist/tar-builder.d.ts.map +1 -1
  35. package/dist/tar-builder.js.map +1 -1
  36. package/dist/zip-loader.d.ts.map +1 -1
  37. package/dist/zip-loader.js +1 -1
  38. package/dist/zip-loader.js.map +1 -1
  39. package/dist/zip-writer.d.ts +2 -2
  40. package/dist/zip-writer.d.ts.map +1 -1
  41. package/dist/zip-writer.js +22 -7
  42. package/dist/zip-writer.js.map +1 -1
  43. package/package.json +5 -5
  44. package/src/filesystems/zip-filesystem.ts +2 -1
  45. package/src/hash-file-utility.ts +2 -1
  46. package/src/index.ts +4 -2
  47. package/src/lib/tar/header.ts +2 -1
  48. package/src/lib/tar/tar.ts +2 -1
  49. package/src/lib/tar/types.ts +2 -1
  50. package/src/lib/tar/utils.ts +2 -1
  51. package/src/parse-zip/cd-file-header.ts +5 -3
  52. package/src/parse-zip/end-of-central-directory.ts +2 -1
  53. package/src/parse-zip/local-file-header.ts +128 -2
  54. package/src/parse-zip/search-from-the-end.ts +2 -1
  55. package/src/parse-zip/zip64-info-generation.ts +20 -4
  56. package/src/tar-builder.ts +2 -1
  57. package/src/zip-loader.ts +2 -1
  58. package/src/zip-writer.ts +24 -10
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loaders.gl/zip",
3
- "version": "4.1.0-alpha.1",
3
+ "version": "4.1.0-alpha.3",
4
4
  "description": "Zip Archive Loader",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -38,11 +38,11 @@
38
38
  "build-bundle": "ocular-bundle ./src/index.ts"
39
39
  },
40
40
  "dependencies": {
41
- "@loaders.gl/compression": "4.1.0-alpha.1",
42
- "@loaders.gl/crypto": "4.1.0-alpha.1",
43
- "@loaders.gl/loader-utils": "4.1.0-alpha.1",
41
+ "@loaders.gl/compression": "4.1.0-alpha.3",
42
+ "@loaders.gl/crypto": "4.1.0-alpha.3",
43
+ "@loaders.gl/loader-utils": "4.1.0-alpha.3",
44
44
  "jszip": "^3.1.5",
45
45
  "md5": "^2.3.0"
46
46
  },
47
- "gitHead": "6a4d3da93d45115ad99861474a43c3f4a0b280a7"
47
+ "gitHead": "b78075a7cb8d4ecd4aac84805ce74b8ceb400cf7"
48
48
  }
@@ -1,4 +1,5 @@
1
- // loaders.gl, MIT license
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
2
3
  // Copyright (c) vis.gl contributors
3
4
 
4
5
  import {FileSystem, isBrowser} from '@loaders.gl/loader-utils';
@@ -1,4 +1,5 @@
1
- // loaders.gl, MIT license
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
2
3
  // Copyright (c) vis.gl contributors
3
4
 
4
5
  import {MD5Hash} from '@loaders.gl/crypto';
package/src/index.ts CHANGED
@@ -1,4 +1,5 @@
1
- // loaders.gl, MIT license
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
2
3
  // Copyright (c) vis.gl contributors
3
4
 
4
5
  export {ZipLoader} from './zip-loader';
@@ -13,7 +14,8 @@ export {
13
14
  } from './parse-zip/cd-file-header';
14
15
  export {
15
16
  parseZipLocalFileHeader,
16
- signature as localHeaderSignature
17
+ signature as localHeaderSignature,
18
+ generateLocalHeader
17
19
  } from './parse-zip/local-file-header';
18
20
  export {parseEoCDRecord} from './parse-zip/end-of-central-directory';
19
21
  export {searchFromTheEnd} from './parse-zip/search-from-the-end';
@@ -1,4 +1,5 @@
1
- // loaders.gl, MIT license
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
2
3
  // Copyright (c) vis.gl contributors
3
4
 
4
5
  // This file is derived from the tar-js code base under MIT license
@@ -1,4 +1,5 @@
1
- // loaders.gl, MIT license
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
2
3
  // Copyright (c) vis.gl contributors
3
4
 
4
5
  // This file is derived from the tar-js code base under MIT license
@@ -1,4 +1,5 @@
1
- // loaders.gl, MIT license
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
2
3
  // Copyright (c) vis.gl contributors
3
4
 
4
5
  /**
@@ -1,4 +1,5 @@
1
- // loaders.gl, MIT license
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
2
3
  // Copyright (c) vis.gl contributors
3
4
 
4
5
  // This file is derived from the tar-js code base under MIT license
@@ -1,10 +1,11 @@
1
- // loaders.gl, MIT license
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
2
3
  // Copyright (c) vis.gl contributors
3
4
 
4
5
  import {FileProvider, compareArrayBuffers, concatenateArrayBuffers} from '@loaders.gl/loader-utils';
5
6
  import {parseEoCDRecord} from './end-of-central-directory';
6
7
  import {ZipSignature} from './search-from-the-end';
7
- import {createZip64Info, NUMBER_SETTERS} from './zip64-info-generation';
8
+ import {createZip64Info, setFieldToNumber} from './zip64-info-generation';
8
9
 
9
10
  /**
10
11
  * zip central directory file header info
@@ -233,8 +234,9 @@ export function generateCDHeader(options: GenerateCDOptions): ArrayBuffer {
233
234
  const header = new DataView(new ArrayBuffer(46));
234
235
 
235
236
  for (const field of ZIP_HEADER_FIELDS) {
236
- NUMBER_SETTERS[field.size](
237
+ setFieldToNumber(
237
238
  header,
239
+ field.size,
238
240
  field.offset,
239
241
  optionsToUse[field.name ?? ''] ?? field.default ?? 0
240
242
  );
@@ -1,4 +1,5 @@
1
- // loaders.gl, MIT license
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
2
3
  // Copyright (c) vis.gl contributors
3
4
 
4
5
  import {FileProvider, compareArrayBuffers} from '@loaders.gl/loader-utils';
@@ -1,8 +1,10 @@
1
- // loaders.gl, MIT license
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
2
3
  // Copyright (c) vis.gl contributors
3
4
 
4
- import {FileProvider, compareArrayBuffers} from '@loaders.gl/loader-utils';
5
+ import {FileProvider, compareArrayBuffers, concatenateArrayBuffers} from '@loaders.gl/loader-utils';
5
6
  import {ZipSignature} from './search-from-the-end';
7
+ import {createZip64Info, setFieldToNumber} from './zip64-info-generation';
6
8
 
7
9
  /**
8
10
  * zip local file header info
@@ -94,3 +96,127 @@ export const parseZipLocalFileHeader = async (
94
96
  compressionMethod
95
97
  };
96
98
  };
99
+
100
+ /** info that can be placed into cd header */
101
+ type GenerateLocalOptions = {
102
+ /** CRC-32 of uncompressed data */
103
+ crc32: number;
104
+ /** File name */
105
+ fileName: string;
106
+ /** File size */
107
+ length: number;
108
+ };
109
+
110
+ /**
111
+ * generates local header for the file
112
+ * @param options info that can be placed into local header
113
+ * @returns buffer with header
114
+ */
115
+ export function generateLocalHeader(options: GenerateLocalOptions): ArrayBuffer {
116
+ const optionsToUse = {
117
+ ...options,
118
+ extraLength: 0,
119
+ fnlength: options.fileName.length
120
+ };
121
+
122
+ let zip64header: ArrayBuffer = new ArrayBuffer(0);
123
+
124
+ const optionsToZip64: any = {};
125
+ if (optionsToUse.length >= 0xffffffff) {
126
+ optionsToZip64.size = optionsToUse.length;
127
+ optionsToUse.length = 0xffffffff;
128
+ }
129
+
130
+ if (Object.keys(optionsToZip64).length) {
131
+ zip64header = createZip64Info(optionsToZip64);
132
+ optionsToUse.extraLength = zip64header.byteLength;
133
+ }
134
+
135
+ // base length without file name and extra info is static
136
+ const header = new DataView(new ArrayBuffer(Number(FILE_NAME_OFFSET)));
137
+
138
+ for (const field of ZIP_HEADER_FIELDS) {
139
+ setFieldToNumber(
140
+ header,
141
+ field.size,
142
+ field.offset,
143
+ optionsToUse[field.name ?? ''] ?? field.default ?? 0
144
+ );
145
+ }
146
+
147
+ const encodedName = new TextEncoder().encode(optionsToUse.fileName);
148
+
149
+ const resHeader = concatenateArrayBuffers(header.buffer, encodedName, zip64header);
150
+
151
+ return resHeader;
152
+ }
153
+
154
+ const ZIP_HEADER_FIELDS = [
155
+ // Local file header signature = 0x04034b50
156
+ {
157
+ offset: 0,
158
+ size: 4,
159
+ default: new DataView(signature.buffer).getUint32(0, true)
160
+ },
161
+ // Version needed to extract (minimum)
162
+ {
163
+ offset: 4,
164
+ size: 2,
165
+ default: 45
166
+ },
167
+ // General purpose bit flag
168
+ {
169
+ offset: 6,
170
+ size: 2,
171
+ default: 0
172
+ },
173
+ // Compression method
174
+ {
175
+ offset: 8,
176
+ size: 2,
177
+ default: 0
178
+ },
179
+ // File last modification time
180
+ {
181
+ offset: 10,
182
+ size: 2,
183
+ default: 0
184
+ },
185
+ // File last modification date
186
+ {
187
+ offset: 12,
188
+ size: 2,
189
+ default: 0
190
+ },
191
+ // CRC-32 of uncompressed data
192
+ {
193
+ offset: 14,
194
+ size: 4,
195
+ name: 'crc32'
196
+ },
197
+ // Compressed size (or 0xffffffff for ZIP64)
198
+ {
199
+ offset: 18,
200
+ size: 4,
201
+ name: 'length'
202
+ },
203
+ // Uncompressed size (or 0xffffffff for ZIP64)
204
+ {
205
+ offset: 22,
206
+ size: 4,
207
+ name: 'length'
208
+ },
209
+ // File name length (n)
210
+ {
211
+ offset: 26,
212
+ size: 2,
213
+ name: 'fnlength'
214
+ },
215
+ // Extra field length (m)
216
+ {
217
+ offset: 28,
218
+ size: 2,
219
+ default: 0,
220
+ name: 'extraLength'
221
+ }
222
+ ];
@@ -1,4 +1,5 @@
1
- // loaders.gl, MIT license
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
2
3
  // Copyright (c) vis.gl contributors
3
4
 
4
5
  import {FileProvider} from '@loaders.gl/loader-utils';
@@ -41,15 +41,31 @@ export function createZip64Info(options: Zip64Options): ArrayBuffer {
41
41
  * @param offset offset of the writing start
42
42
  * @param value value to be written
43
43
  */
44
- type NumberSetter = (header: DataView, offset: number, value: number) => void;
44
+ type NumberSetter = (header: DataView, offset: number, value: number | bigint) => void;
45
+
46
+ /**
47
+ * Writes values into buffer according to the bytes amount
48
+ * @param header header where to write the data
49
+ * @param fieldSize size of the field in bytes
50
+ * @param fieldOffset offset of the field
51
+ * @param value value to be written
52
+ */
53
+ export function setFieldToNumber(
54
+ header: DataView,
55
+ fieldSize: number,
56
+ fieldOffset: number,
57
+ value: number | bigint
58
+ ): void {
59
+ NUMBER_SETTERS[fieldSize](header, fieldOffset, value);
60
+ }
45
61
 
46
62
  /** functions to write values into buffer according to the bytes amount */
47
- export const NUMBER_SETTERS: {[key: number]: NumberSetter} = {
63
+ const NUMBER_SETTERS: {[key: number]: NumberSetter} = {
48
64
  2: (header, offset, value) => {
49
- header.setUint16(offset, value, true);
65
+ header.setUint16(offset, Number(value), true);
50
66
  },
51
67
  4: (header, offset, value) => {
52
- header.setUint32(offset, value, true);
68
+ header.setUint32(offset, Number(value), true);
53
69
  },
54
70
  8: (header, offset, value) => {
55
71
  header.setBigUint64(offset, BigInt(value), true);
@@ -1,4 +1,5 @@
1
- // loaders.gl, MIT license
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
2
3
  // Copyright (c) vis.gl contributors
3
4
 
4
5
  import Tar from './lib/tar/tar';
package/src/zip-loader.ts CHANGED
@@ -1,4 +1,5 @@
1
- // loaders.gl, MIT license
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
2
3
  // Copyright (c) vis.gl contributors
3
4
 
4
5
  import type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';
package/src/zip-writer.ts CHANGED
@@ -1,9 +1,13 @@
1
- // loaders.gl, MIT license
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
2
3
  // Copyright (c) vis.gl contributors
3
4
 
4
- import type {Writer, WriterOptions} from '@loaders.gl/loader-utils';
5
+ import type {WriterWithEncoder, WriterOptions} from '@loaders.gl/loader-utils';
5
6
  import JSZip, {JSZipGeneratorOptions} from 'jszip';
6
7
 
8
+ // @ts-ignore TS2304: Cannot find name '__VERSION__'.
9
+ const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';
10
+
7
11
  export type ZipWriterOptions = WriterOptions & {
8
12
  zip?: {
9
13
  onUpdate?: (metadata: {percent: number}) => void;
@@ -15,19 +19,27 @@ export type ZipWriterOptions = WriterOptions & {
15
19
  /**
16
20
  * Zip exporter
17
21
  */
18
- export const ZipWriter: Writer<FileReaderEventMap, never, ZipWriterOptions> = {
22
+ export const ZipWriter: WriterWithEncoder<Record<string, ArrayBuffer>, never, ZipWriterOptions> = {
19
23
  name: 'Zip Archive',
24
+ id: 'zip',
25
+ module: 'zip',
26
+ version: VERSION,
20
27
  extensions: ['zip'],
21
28
  category: 'archive',
22
29
  mimeTypes: ['application/zip'],
23
- // @ts-ignore
30
+ options: {
31
+ zip: {
32
+ onUpdate: () => {}
33
+ },
34
+ jszip: {}
35
+ },
24
36
  encode: encodeZipAsync
25
37
  };
26
38
 
27
39
  async function encodeZipAsync(
28
40
  fileMap: Record<string, ArrayBuffer>,
29
41
  options: ZipWriterOptions = {}
30
- ) {
42
+ ): Promise<ArrayBuffer> {
31
43
  const jsZip = new JSZip();
32
44
  // add files to the zip
33
45
  for (const subFileName in fileMap) {
@@ -38,14 +50,16 @@ async function encodeZipAsync(
38
50
  jsZip.file(subFileName, subFileData, options?.jszip || {});
39
51
  }
40
52
 
41
- // always generate the full zip as an arraybuffer
42
- const jszipOptions: JSZipGeneratorOptions = {...options?.jszip, type: 'arraybuffer'};
43
- const {onUpdate = () => {}} = options;
53
+ const zipOptions = {...ZipWriter.options.zip, ...options?.zip};
54
+ const jszipOptions: JSZipGeneratorOptions = {...ZipWriter.options?.jszip, ...options.jszip};
44
55
 
45
56
  try {
46
- return await jsZip.generateAsync(jszipOptions, onUpdate);
57
+ return await jsZip.generateAsync(
58
+ {...jszipOptions, type: 'arraybuffer'}, // generate an arraybuffer
59
+ zipOptions.onUpdate
60
+ );
47
61
  } catch (error) {
48
- options.log.error(`Unable to write zip archive: ${error}`);
62
+ options.log.error(`Unable to encode zip archive: ${error}`);
49
63
  throw error;
50
64
  }
51
65
  }