@loaders.gl/zip 4.1.1 → 4.1.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.
package/dist/dist.dev.js CHANGED
@@ -6973,7 +6973,7 @@ var __exports__ = (() => {
6973
6973
 
6974
6974
  // src/zip-loader.ts
6975
6975
  var import_jszip = __toESM(require_jszip_min(), 1);
6976
- var VERSION = true ? "4.1.1" : "latest";
6976
+ var VERSION = true ? "4.1.3" : "latest";
6977
6977
  var ZipLoader = {
6978
6978
  id: "zip",
6979
6979
  module: "zip",
@@ -7018,7 +7018,7 @@ var __exports__ = (() => {
7018
7018
 
7019
7019
  // src/zip-writer.ts
7020
7020
  var import_jszip2 = __toESM(require_jszip_min(), 1);
7021
- var VERSION2 = true ? "4.1.1" : "latest";
7021
+ var VERSION2 = true ? "4.1.3" : "latest";
7022
7022
  var ZipWriter = {
7023
7023
  name: "Zip Archive",
7024
7024
  id: "zip",
@@ -9094,7 +9094,10 @@ var __exports__ = (() => {
9094
9094
  const textEncoder = new TextEncoder();
9095
9095
  const hashArray = [];
9096
9096
  for await (const cdHeader of zipCDIterator) {
9097
- const filename2 = cdHeader.fileName.split("\\").join("/").toLocaleLowerCase();
9097
+ let filename2 = cdHeader.fileName.split("\\").join("/");
9098
+ if (filename2 !== "3dSceneLayer.json.gz") {
9099
+ filename2 = filename2.toLocaleLowerCase();
9100
+ }
9098
9101
  const arrayBuffer = textEncoder.encode(filename2).buffer;
9099
9102
  const md5 = await md5Hash.hash(arrayBuffer, "hex");
9100
9103
  hashArray.push(concatenateArrayBuffers(hexStringToBuffer(md5), bigintToBuffer(cdHeader.localHeaderOffset)));
@@ -1 +1 @@
1
- {"version":3,"file":"hash-file-utility.d.ts","sourceRoot":"","sources":["../src/hash-file-utility.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,YAAY,EAGb,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAC,eAAe,EAA0B,MAAM,4BAA4B,CAAC;AAEpF;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAY/E;AASD;;;;GAIG;AACH,wBAAsB,2BAA2B,CAC/C,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAGjC;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,aAAa,EAAE,aAAa,CAAC,eAAe,CAAC,GAC5C,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAcjC;AAED,mCAAmC;AACnC,KAAK,YAAY,GAAG;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,aAAa,EAAE,aAAa,CAAC,YAAY,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,GAClE,OAAO,CAAC,WAAW,CAAC,CAkBtB"}
1
+ {"version":3,"file":"hash-file-utility.d.ts","sourceRoot":"","sources":["../src/hash-file-utility.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,YAAY,EAGb,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAC,eAAe,EAA0B,MAAM,4BAA4B,CAAC;AAEpF;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAY/E;AASD;;;;GAIG;AACH,wBAAsB,2BAA2B,CAC/C,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAGjC;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,aAAa,EAAE,aAAa,CAAC,eAAe,CAAC,GAC5C,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAcjC;AAED,mCAAmC;AACnC,KAAK,YAAY,GAAG;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,aAAa,EAAE,aAAa,CAAC,YAAY,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,GAClE,OAAO,CAAC,WAAW,CAAC,CAwBtB"}
@@ -35,7 +35,10 @@ export async function composeHashFile(zipCDIterator) {
35
35
  const textEncoder = new TextEncoder();
36
36
  const hashArray = [];
37
37
  for await (const cdHeader of zipCDIterator) {
38
- const filename = cdHeader.fileName.split('\\').join('/').toLocaleLowerCase();
38
+ let filename = cdHeader.fileName.split('\\').join('/');
39
+ if (filename !== '3dSceneLayer.json.gz') {
40
+ filename = filename.toLocaleLowerCase();
41
+ }
39
42
  const arrayBuffer = textEncoder.encode(filename).buffer;
40
43
  const md5 = await md5Hash.hash(arrayBuffer, 'hex');
41
44
  hashArray.push(concatenateArrayBuffers(hexStringToBuffer(md5), bigintToBuffer(cdHeader.localHeaderOffset)));
@@ -1 +1 @@
1
- {"version":3,"file":"hash-file-utility.js","names":["MD5Hash","concatenateArrayBuffers","concatenateArrayBuffersFromArray","makeZipCDHeaderIterator","parseHashTable","arrayBuffer","dataView","DataView","hashMap","i","byteLength","offset","getBigUint64","hash","bufferToHex","buffer","start","length","Uint8Array","map","x","toString","padStart","join","makeHashTableFromZipHeaders","fileProvider","zipCDIterator","getHashTable","md5Hash","textEncoder","TextEncoder","hashTable","cdHeader","filename","fileName","split","toLocaleLowerCase","encode","md5","localHeaderOffset","composeHashFile","hashArray","push","hexStringToBuffer","bigintToBuffer","bufferArray","sort","compareHashes","arrA","arrB","a","BigUint64Array","b","Number","str","_str$match","byteArray","match","h","parseInt","Array","n"],"sources":["../src/hash-file-utility.ts"],"sourcesContent":["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {MD5Hash} from '@loaders.gl/crypto';\nimport {\n FileProvider,\n concatenateArrayBuffers,\n concatenateArrayBuffersFromArray\n} from '@loaders.gl/loader-utils';\nimport {ZipCDFileHeader, makeZipCDHeaderIterator} from './parse-zip/cd-file-header';\n\n/**\n * Reads hash file from buffer and returns it in ready-to-use form\n * @param arrayBuffer - buffer containing hash file\n * @returns Map containing hash and offset\n */\nexport function parseHashTable(arrayBuffer: ArrayBuffer): Record<string, bigint> {\n const dataView = new DataView(arrayBuffer);\n\n const hashMap: Record<string, bigint> = {};\n\n for (let i = 0; i < arrayBuffer.byteLength; i = i + 24) {\n const offset = dataView.getBigUint64(i + 16, true);\n const hash = bufferToHex(arrayBuffer, i, 16);\n hashMap[hash] = offset;\n }\n\n return hashMap;\n}\n\nfunction bufferToHex(buffer: ArrayBuffer, start: number, length: number): string {\n // buffer is an ArrayBuffer\n return [...new Uint8Array(buffer, start, length)]\n .map((x) => x.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/**\n * generates hash info from zip files \"central directory\"\n * @param fileProvider - provider of the archive\n * @returns ready to use hash info\n */\nexport async function makeHashTableFromZipHeaders(\n fileProvider: FileProvider\n): Promise<Record<string, bigint>> {\n const zipCDIterator = makeZipCDHeaderIterator(fileProvider);\n return getHashTable(zipCDIterator);\n}\n\n/**\n * creates hash table from file offset iterator\n * @param zipCDIterator iterator to use\n * @returns hash table\n */\nexport async function getHashTable(\n zipCDIterator: AsyncIterable<ZipCDFileHeader>\n): Promise<Record<string, bigint>> {\n const md5Hash = new MD5Hash();\n const textEncoder = new TextEncoder();\n\n const hashTable: Record<string, bigint> = {};\n\n for await (const cdHeader of zipCDIterator) {\n const filename = cdHeader.fileName.split('\\\\').join('/').toLocaleLowerCase();\n const arrayBuffer = textEncoder.encode(filename).buffer;\n const md5 = await md5Hash.hash(arrayBuffer, 'hex');\n hashTable[md5] = cdHeader.localHeaderOffset;\n }\n\n return hashTable;\n}\n\n/** item of the file offset list */\ntype FileListItem = {\n fileName: string;\n localHeaderOffset: bigint;\n};\n\n/**\n * creates hash file that later can be added to the SLPK archive\n * @param zipCDIterator iterator to use\n * @returns ArrayBuffer containing hash file\n */\nexport async function composeHashFile(\n zipCDIterator: AsyncIterable<FileListItem> | Iterable<FileListItem>\n): Promise<ArrayBuffer> {\n const md5Hash = new MD5Hash();\n const textEncoder = new TextEncoder();\n\n const hashArray: ArrayBuffer[] = [];\n\n for await (const cdHeader of zipCDIterator) {\n const filename = cdHeader.fileName.split('\\\\').join('/').toLocaleLowerCase();\n const arrayBuffer = textEncoder.encode(filename).buffer;\n const md5 = await md5Hash.hash(arrayBuffer, 'hex');\n hashArray.push(\n concatenateArrayBuffers(hexStringToBuffer(md5), bigintToBuffer(cdHeader.localHeaderOffset))\n );\n }\n\n const bufferArray = hashArray.sort(compareHashes);\n\n return concatenateArrayBuffersFromArray(bufferArray);\n}\n\n/**\n * Function to compare md5 hashes according to https://github.com/Esri/i3s-spec/blob/master/docs/2.0/slpk_hashtable.pcsl.md\n * @param arrA first hash to compare\n * @param arrB second hash to compare\n * @returns 0 if equal, negative number if a<b, pozitive if a>b\n */\nfunction compareHashes(arrA: ArrayBuffer, arrB: ArrayBuffer): number {\n const a = new BigUint64Array(arrA);\n const b = new BigUint64Array(arrB);\n\n return Number(a[0] === b[0] ? a[1] - b[1] : a[0] - b[0]);\n}\n\n/**\n * converts hex string to buffer\n * @param str hex string to convert\n * @returns conversion result\n */\nfunction hexStringToBuffer(str: string): ArrayBuffer {\n const byteArray = str.match(/../g)?.map((h) => parseInt(h, 16));\n return new Uint8Array(byteArray ?? new Array(16)).buffer;\n}\n\n/**\n * converts bigint to buffer\n * @param n bigint to convert\n * @returns convertion result\n */\nfunction bigintToBuffer(n: bigint): ArrayBuffer {\n return new BigUint64Array([n]).buffer;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"hash-file-utility.js","names":["MD5Hash","concatenateArrayBuffers","concatenateArrayBuffersFromArray","makeZipCDHeaderIterator","parseHashTable","arrayBuffer","dataView","DataView","hashMap","i","byteLength","offset","getBigUint64","hash","bufferToHex","buffer","start","length","Uint8Array","map","x","toString","padStart","join","makeHashTableFromZipHeaders","fileProvider","zipCDIterator","getHashTable","md5Hash","textEncoder","TextEncoder","hashTable","cdHeader","filename","fileName","split","toLocaleLowerCase","encode","md5","localHeaderOffset","composeHashFile","hashArray","push","hexStringToBuffer","bigintToBuffer","bufferArray","sort","compareHashes","arrA","arrB","a","BigUint64Array","b","Number","str","_str$match","byteArray","match","h","parseInt","Array","n"],"sources":["../src/hash-file-utility.ts"],"sourcesContent":["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {MD5Hash} from '@loaders.gl/crypto';\nimport {\n FileProvider,\n concatenateArrayBuffers,\n concatenateArrayBuffersFromArray\n} from '@loaders.gl/loader-utils';\nimport {ZipCDFileHeader, makeZipCDHeaderIterator} from './parse-zip/cd-file-header';\n\n/**\n * Reads hash file from buffer and returns it in ready-to-use form\n * @param arrayBuffer - buffer containing hash file\n * @returns Map containing hash and offset\n */\nexport function parseHashTable(arrayBuffer: ArrayBuffer): Record<string, bigint> {\n const dataView = new DataView(arrayBuffer);\n\n const hashMap: Record<string, bigint> = {};\n\n for (let i = 0; i < arrayBuffer.byteLength; i = i + 24) {\n const offset = dataView.getBigUint64(i + 16, true);\n const hash = bufferToHex(arrayBuffer, i, 16);\n hashMap[hash] = offset;\n }\n\n return hashMap;\n}\n\nfunction bufferToHex(buffer: ArrayBuffer, start: number, length: number): string {\n // buffer is an ArrayBuffer\n return [...new Uint8Array(buffer, start, length)]\n .map((x) => x.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/**\n * generates hash info from zip files \"central directory\"\n * @param fileProvider - provider of the archive\n * @returns ready to use hash info\n */\nexport async function makeHashTableFromZipHeaders(\n fileProvider: FileProvider\n): Promise<Record<string, bigint>> {\n const zipCDIterator = makeZipCDHeaderIterator(fileProvider);\n return getHashTable(zipCDIterator);\n}\n\n/**\n * creates hash table from file offset iterator\n * @param zipCDIterator iterator to use\n * @returns hash table\n */\nexport async function getHashTable(\n zipCDIterator: AsyncIterable<ZipCDFileHeader>\n): Promise<Record<string, bigint>> {\n const md5Hash = new MD5Hash();\n const textEncoder = new TextEncoder();\n\n const hashTable: Record<string, bigint> = {};\n\n for await (const cdHeader of zipCDIterator) {\n const filename = cdHeader.fileName.split('\\\\').join('/').toLocaleLowerCase();\n const arrayBuffer = textEncoder.encode(filename).buffer;\n const md5 = await md5Hash.hash(arrayBuffer, 'hex');\n hashTable[md5] = cdHeader.localHeaderOffset;\n }\n\n return hashTable;\n}\n\n/** item of the file offset list */\ntype FileListItem = {\n fileName: string;\n localHeaderOffset: bigint;\n};\n\n/**\n * creates hash file that later can be added to the SLPK archive\n * @param zipCDIterator iterator to use\n * @returns ArrayBuffer containing hash file\n */\nexport async function composeHashFile(\n zipCDIterator: AsyncIterable<FileListItem> | Iterable<FileListItem>\n): Promise<ArrayBuffer> {\n const md5Hash = new MD5Hash();\n const textEncoder = new TextEncoder();\n\n const hashArray: ArrayBuffer[] = [];\n\n for await (const cdHeader of zipCDIterator) {\n let filename = cdHeader.fileName.split('\\\\').join('/');\n // I3S edge case. All files should be lower case by spec. However, ArcGIS\n // and official i3s_converter https://github.com/Esri/i3s-spec/blob/master/i3s_converter/i3s_converter_ReadMe.md\n // expect `3dSceneLayer.json.gz` in camel case\n if (filename !== '3dSceneLayer.json.gz') {\n filename = filename.toLocaleLowerCase();\n }\n const arrayBuffer = textEncoder.encode(filename).buffer;\n const md5 = await md5Hash.hash(arrayBuffer, 'hex');\n hashArray.push(\n concatenateArrayBuffers(hexStringToBuffer(md5), bigintToBuffer(cdHeader.localHeaderOffset))\n );\n }\n\n const bufferArray = hashArray.sort(compareHashes);\n\n return concatenateArrayBuffersFromArray(bufferArray);\n}\n\n/**\n * Function to compare md5 hashes according to https://github.com/Esri/i3s-spec/blob/master/docs/2.0/slpk_hashtable.pcsl.md\n * @param arrA first hash to compare\n * @param arrB second hash to compare\n * @returns 0 if equal, negative number if a<b, pozitive if a>b\n */\nfunction compareHashes(arrA: ArrayBuffer, arrB: ArrayBuffer): number {\n const a = new BigUint64Array(arrA);\n const b = new BigUint64Array(arrB);\n\n return Number(a[0] === b[0] ? a[1] - b[1] : a[0] - b[0]);\n}\n\n/**\n * converts hex string to buffer\n * @param str hex string to convert\n * @returns conversion result\n */\nfunction hexStringToBuffer(str: string): ArrayBuffer {\n const byteArray = str.match(/../g)?.map((h) => parseInt(h, 16));\n return new Uint8Array(byteArray ?? new Array(16)).buffer;\n}\n\n/**\n * converts bigint to buffer\n * @param n bigint to convert\n * @returns convertion result\n */\nfunction bigintToBuffer(n: bigint): ArrayBuffer {\n return new BigUint64Array([n]).buffer;\n}\n"],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -1225,7 +1225,10 @@ async function composeHashFile(zipCDIterator) {
1225
1225
  const textEncoder = new TextEncoder();
1226
1226
  const hashArray = [];
1227
1227
  for await (const cdHeader of zipCDIterator) {
1228
- const filename = cdHeader.fileName.split("\\").join("/").toLocaleLowerCase();
1228
+ let filename = cdHeader.fileName.split("\\").join("/");
1229
+ if (filename !== "3dSceneLayer.json.gz") {
1230
+ filename = filename.toLocaleLowerCase();
1231
+ }
1229
1232
  const arrayBuffer = textEncoder.encode(filename).buffer;
1230
1233
  const md5 = await md5Hash.hash(arrayBuffer, "hex");
1231
1234
  hashArray.push(
@@ -1,5 +1,5 @@
1
1
  import JSZip from 'jszip';
2
- const VERSION = typeof "4.1.1" !== 'undefined' ? "4.1.1" : 'latest';
2
+ const VERSION = typeof "4.1.3" !== 'undefined' ? "4.1.3" : 'latest';
3
3
  export const ZipLoader = {
4
4
  id: 'zip',
5
5
  module: 'zip',
@@ -1,5 +1,5 @@
1
1
  import JSZip from 'jszip';
2
- const VERSION = typeof "4.1.1" !== 'undefined' ? "4.1.1" : 'latest';
2
+ const VERSION = typeof "4.1.3" !== 'undefined' ? "4.1.3" : 'latest';
3
3
  export const ZipWriter = {
4
4
  name: 'Zip Archive',
5
5
  id: 'zip',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loaders.gl/zip",
3
- "version": "4.1.1",
3
+ "version": "4.1.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.1",
42
- "@loaders.gl/crypto": "4.1.1",
43
- "@loaders.gl/loader-utils": "4.1.1",
41
+ "@loaders.gl/compression": "4.1.3",
42
+ "@loaders.gl/crypto": "4.1.3",
43
+ "@loaders.gl/loader-utils": "4.1.3",
44
44
  "jszip": "^3.1.5",
45
45
  "md5": "^2.3.0"
46
46
  },
47
- "gitHead": "b4a8cb4e5c2b67ac0e1afaa21ae45b3a45a91db0"
47
+ "gitHead": "4313c1f68c25723ab3e906db5a6ac65c2e8ac7b6"
48
48
  }
@@ -91,7 +91,13 @@ export async function composeHashFile(
91
91
  const hashArray: ArrayBuffer[] = [];
92
92
 
93
93
  for await (const cdHeader of zipCDIterator) {
94
- const filename = cdHeader.fileName.split('\\').join('/').toLocaleLowerCase();
94
+ let filename = cdHeader.fileName.split('\\').join('/');
95
+ // I3S edge case. All files should be lower case by spec. However, ArcGIS
96
+ // and official i3s_converter https://github.com/Esri/i3s-spec/blob/master/i3s_converter/i3s_converter_ReadMe.md
97
+ // expect `3dSceneLayer.json.gz` in camel case
98
+ if (filename !== '3dSceneLayer.json.gz') {
99
+ filename = filename.toLocaleLowerCase();
100
+ }
95
101
  const arrayBuffer = textEncoder.encode(filename).buffer;
96
102
  const md5 = await md5Hash.hash(arrayBuffer, 'hex');
97
103
  hashArray.push(