@loaders.gl/i3s 4.0.0-alpha.17 → 4.0.0-alpha.19
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.min.js +155 -98
- package/dist/es5/arcgis-webscene-loader.js +1 -1
- package/dist/es5/i3s-attribute-loader.js +1 -1
- package/dist/es5/i3s-building-scene-layer-loader.js +1 -1
- package/dist/es5/i3s-content-loader.js +1 -1
- package/dist/es5/i3s-loader.js +6 -6
- package/dist/es5/i3s-loader.js.map +1 -1
- package/dist/es5/i3s-node-page-loader.js +1 -1
- package/dist/es5/i3s-slpk-loader.js +1 -1
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/lib/helpers/i3s-nodepages-tiles.js +9 -5
- package/dist/es5/lib/helpers/i3s-nodepages-tiles.js.map +1 -1
- package/dist/es5/lib/parsers/parse-i3s.js +30 -19
- package/dist/es5/lib/parsers/parse-i3s.js.map +1 -1
- package/dist/es5/lib/utils/url-utils.js +3 -3
- package/dist/es5/lib/utils/url-utils.js.map +1 -1
- package/dist/es5/types.js.map +1 -1
- package/dist/esm/arcgis-webscene-loader.js +1 -1
- package/dist/esm/i3s-attribute-loader.js +1 -1
- package/dist/esm/i3s-building-scene-layer-loader.js +1 -1
- package/dist/esm/i3s-content-loader.js +1 -1
- package/dist/esm/i3s-loader.js +3 -4
- package/dist/esm/i3s-loader.js.map +1 -1
- package/dist/esm/i3s-node-page-loader.js +1 -1
- package/dist/esm/i3s-slpk-loader.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/helpers/i3s-nodepages-tiles.js +9 -5
- package/dist/esm/lib/helpers/i3s-nodepages-tiles.js.map +1 -1
- package/dist/esm/lib/parsers/parse-i3s.js +21 -10
- package/dist/esm/lib/parsers/parse-i3s.js.map +1 -1
- package/dist/esm/lib/utils/url-utils.js +2 -3
- package/dist/esm/lib/utils/url-utils.js.map +1 -1
- package/dist/esm/types.js.map +1 -1
- package/dist/i3s-content-worker-node.js +47 -47
- package/dist/i3s-content-worker-node.js.map +3 -3
- package/dist/i3s-content-worker.js +88 -44
- package/dist/i3s-loader.js +2 -4
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/lib/helpers/i3s-nodepages-tiles.d.ts +5 -3
- package/dist/lib/helpers/i3s-nodepages-tiles.d.ts.map +1 -1
- package/dist/lib/helpers/i3s-nodepages-tiles.js +7 -5
- package/dist/lib/parsers/parse-i3s.d.ts +2 -2
- package/dist/lib/parsers/parse-i3s.d.ts.map +1 -1
- package/dist/lib/parsers/parse-i3s.js +22 -12
- package/dist/lib/utils/url-utils.d.ts +5 -4
- package/dist/lib/utils/url-utils.d.ts.map +1 -1
- package/dist/lib/utils/url-utils.js +5 -4
- package/dist/types.d.ts +105 -34
- package/dist/types.d.ts.map +1 -1
- package/package.json +9 -9
- package/src/i3s-loader.ts +2 -4
- package/src/index.ts +4 -0
- package/src/lib/helpers/i3s-nodepages-tiles.ts +16 -9
- package/src/lib/parsers/parse-i3s.ts +26 -16
- package/src/lib/utils/url-utils.ts +6 -5
- package/src/types.ts +102 -35
|
@@ -32,6 +32,12 @@
|
|
|
32
32
|
}
|
|
33
33
|
});
|
|
34
34
|
|
|
35
|
+
// (disabled):../core/src/lib/fetch/fetch-file.node
|
|
36
|
+
var require_fetch_file = __commonJS({
|
|
37
|
+
"(disabled):../core/src/lib/fetch/fetch-file.node"() {
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
|
|
35
41
|
// ../loader-utils/src/lib/env-utils/assert.ts
|
|
36
42
|
function assert(condition, message) {
|
|
37
43
|
if (!condition) {
|
|
@@ -55,7 +61,7 @@
|
|
|
55
61
|
var nodeVersion = matches && parseFloat(matches[1]) || 0;
|
|
56
62
|
|
|
57
63
|
// ../worker-utils/src/lib/env-utils/version.ts
|
|
58
|
-
var VERSION = true ? "4.0.0-alpha.
|
|
64
|
+
var VERSION = true ? "4.0.0-alpha.19" : DEFAULT_VERSION;
|
|
59
65
|
if (false) {
|
|
60
66
|
console.error("loaders.gl: The __VERSION__ variable is not injected using babel plugin. Latest unstable workers would be fetched from the CDN.");
|
|
61
67
|
}
|
|
@@ -558,37 +564,37 @@
|
|
|
558
564
|
var LATEST = "beta";
|
|
559
565
|
var VERSION2 = typeof VERSION !== "undefined" ? VERSION : LATEST;
|
|
560
566
|
var loadLibraryPromises = {};
|
|
561
|
-
async function loadLibrary(libraryUrl, moduleName = null, options = {}) {
|
|
567
|
+
async function loadLibrary(libraryUrl, moduleName = null, options = {}, libraryName = null) {
|
|
562
568
|
if (moduleName) {
|
|
563
|
-
libraryUrl = getLibraryUrl(libraryUrl, moduleName, options);
|
|
569
|
+
libraryUrl = getLibraryUrl(libraryUrl, moduleName, options, libraryName);
|
|
564
570
|
}
|
|
565
571
|
loadLibraryPromises[libraryUrl] = loadLibraryPromises[libraryUrl] || loadLibraryFromFile(libraryUrl);
|
|
566
572
|
return await loadLibraryPromises[libraryUrl];
|
|
567
573
|
}
|
|
568
|
-
function getLibraryUrl(library, moduleName, options) {
|
|
569
|
-
if (library.startsWith("http")) {
|
|
574
|
+
function getLibraryUrl(library, moduleName, options = {}, libraryName = null) {
|
|
575
|
+
if (!options.useLocalLibraries && library.startsWith("http")) {
|
|
570
576
|
return library;
|
|
571
577
|
}
|
|
578
|
+
libraryName = libraryName || library;
|
|
572
579
|
const modules = options.modules || {};
|
|
573
|
-
if (modules[
|
|
574
|
-
return modules[
|
|
580
|
+
if (modules[libraryName]) {
|
|
581
|
+
return modules[libraryName];
|
|
575
582
|
}
|
|
576
583
|
if (!isBrowser2) {
|
|
577
|
-
return `modules/${moduleName}/dist/libs/${
|
|
584
|
+
return `modules/${moduleName}/dist/libs/${libraryName}`;
|
|
578
585
|
}
|
|
579
586
|
if (options.CDN) {
|
|
580
587
|
assert2(options.CDN.startsWith("http"));
|
|
581
|
-
return `${options.CDN}/${moduleName}@${VERSION2}/dist/libs/${
|
|
588
|
+
return `${options.CDN}/${moduleName}@${VERSION2}/dist/libs/${libraryName}`;
|
|
582
589
|
}
|
|
583
590
|
if (isWorker) {
|
|
584
|
-
return `../src/libs/${
|
|
591
|
+
return `../src/libs/${libraryName}`;
|
|
585
592
|
}
|
|
586
|
-
return `modules/${moduleName}/src/libs/${
|
|
593
|
+
return `modules/${moduleName}/src/libs/${libraryName}`;
|
|
587
594
|
}
|
|
588
595
|
async function loadLibraryFromFile(libraryUrl) {
|
|
589
596
|
if (libraryUrl.endsWith("wasm")) {
|
|
590
|
-
|
|
591
|
-
return await response2.arrayBuffer();
|
|
597
|
+
return await loadAsArrayBuffer(libraryUrl);
|
|
592
598
|
}
|
|
593
599
|
if (!isBrowser2) {
|
|
594
600
|
try {
|
|
@@ -600,8 +606,7 @@
|
|
|
600
606
|
if (isWorker) {
|
|
601
607
|
return importScripts(libraryUrl);
|
|
602
608
|
}
|
|
603
|
-
const
|
|
604
|
-
const scriptSource = await response.text();
|
|
609
|
+
const scriptSource = await loadAsText(libraryUrl);
|
|
605
610
|
return loadLibraryFromString(scriptSource, libraryUrl);
|
|
606
611
|
}
|
|
607
612
|
function loadLibraryFromString(scriptSource, id) {
|
|
@@ -622,6 +627,20 @@
|
|
|
622
627
|
document.body.appendChild(script);
|
|
623
628
|
return null;
|
|
624
629
|
}
|
|
630
|
+
async function loadAsArrayBuffer(url) {
|
|
631
|
+
if (!node.readFileAsArrayBuffer || url.startsWith("http")) {
|
|
632
|
+
const response = await fetch(url);
|
|
633
|
+
return await response.arrayBuffer();
|
|
634
|
+
}
|
|
635
|
+
return await node.readFileAsArrayBuffer(url);
|
|
636
|
+
}
|
|
637
|
+
async function loadAsText(url) {
|
|
638
|
+
if (!node.readFileAsText || url.startsWith("http")) {
|
|
639
|
+
const response = await fetch(url);
|
|
640
|
+
return await response.text();
|
|
641
|
+
}
|
|
642
|
+
return await node.readFileAsText(url);
|
|
643
|
+
}
|
|
625
644
|
|
|
626
645
|
// ../loader-utils/src/lib/worker-loader-utils/create-loader-worker.ts
|
|
627
646
|
var requestId = 0;
|
|
@@ -1191,9 +1210,22 @@
|
|
|
1191
1210
|
}
|
|
1192
1211
|
|
|
1193
1212
|
// ../core/src/lib/fetch/fetch-file.ts
|
|
1213
|
+
var node3 = __toModule(require_fetch_file());
|
|
1214
|
+
function isNodePath(url) {
|
|
1215
|
+
return !isRequestURL(url) && !isDataURL(url);
|
|
1216
|
+
}
|
|
1217
|
+
function isRequestURL(url) {
|
|
1218
|
+
return url.startsWith("http:") || url.startsWith("https:");
|
|
1219
|
+
}
|
|
1220
|
+
function isDataURL(url) {
|
|
1221
|
+
return url.startsWith("data:");
|
|
1222
|
+
}
|
|
1194
1223
|
async function fetchFile(urlOrData, fetchOptions) {
|
|
1195
1224
|
if (typeof urlOrData === "string") {
|
|
1196
1225
|
const url = resolvePath(urlOrData);
|
|
1226
|
+
if (isNodePath(url) && node3?.fetchFileNode) {
|
|
1227
|
+
return node3.fetchFileNode(url, fetchOptions);
|
|
1228
|
+
}
|
|
1197
1229
|
return await fetch(url, fetchOptions);
|
|
1198
1230
|
}
|
|
1199
1231
|
return await makeResponse(urlOrData);
|
|
@@ -1230,7 +1262,7 @@
|
|
|
1230
1262
|
var navigator_ = globalThis.navigator || {};
|
|
1231
1263
|
|
|
1232
1264
|
// ../../node_modules/@probe.gl/log/node_modules/@probe.gl/env/dist/utils/globals.js
|
|
1233
|
-
var VERSION3 = true ? "4.0.0-alpha.
|
|
1265
|
+
var VERSION3 = true ? "4.0.0-alpha.19" : "untranspiled source";
|
|
1234
1266
|
var isBrowser4 = isBrowser3();
|
|
1235
1267
|
|
|
1236
1268
|
// ../../node_modules/@probe.gl/log/dist/utils/local-storage.js
|
|
@@ -1771,6 +1803,7 @@
|
|
|
1771
1803
|
mimeType: void 0,
|
|
1772
1804
|
nothrow: false,
|
|
1773
1805
|
log: new ConsoleLog(),
|
|
1806
|
+
useLocalLibraries: false,
|
|
1774
1807
|
CDN: "https://unpkg.com/@loaders.gl",
|
|
1775
1808
|
worker: true,
|
|
1776
1809
|
maxConcurrency: 3,
|
|
@@ -4578,7 +4611,7 @@
|
|
|
4578
4611
|
_defineProperty(Ellipsoid, "WGS84", new Ellipsoid(WGS84_RADIUS_X, WGS84_RADIUS_Y, WGS84_RADIUS_Z));
|
|
4579
4612
|
|
|
4580
4613
|
// ../images/src/lib/utils/version.ts
|
|
4581
|
-
var VERSION4 = true ? "4.0.0-alpha.
|
|
4614
|
+
var VERSION4 = true ? "4.0.0-alpha.19" : "latest";
|
|
4582
4615
|
|
|
4583
4616
|
// ../images/src/lib/category-api/image-type.ts
|
|
4584
4617
|
var { _parseImageNode } = globalThis;
|
|
@@ -4975,7 +5008,7 @@
|
|
|
4975
5008
|
};
|
|
4976
5009
|
|
|
4977
5010
|
// ../draco/src/lib/utils/version.ts
|
|
4978
|
-
var VERSION5 = true ? "4.0.0-alpha.
|
|
5011
|
+
var VERSION5 = true ? "4.0.0-alpha.19" : "latest";
|
|
4979
5012
|
|
|
4980
5013
|
// ../draco/src/draco-loader.ts
|
|
4981
5014
|
var DEFAULT_DRACO_OPTIONS = {
|
|
@@ -5458,10 +5491,18 @@
|
|
|
5458
5491
|
var DRACO_DECODER_VERSION = "1.5.5";
|
|
5459
5492
|
var DRACO_ENCODER_VERSION = "1.4.1";
|
|
5460
5493
|
var STATIC_DECODER_URL = `https://www.gstatic.com/draco/versioned/decoders/${DRACO_DECODER_VERSION}`;
|
|
5461
|
-
var
|
|
5462
|
-
|
|
5463
|
-
|
|
5464
|
-
|
|
5494
|
+
var DRACO_EXTERNAL_LIBRARIES = {
|
|
5495
|
+
DECODER: "draco_wasm_wrapper.js",
|
|
5496
|
+
DECODER_WASM: "draco_decoder.wasm",
|
|
5497
|
+
FALLBACK_DECODER: "draco_decoder.js",
|
|
5498
|
+
ENCODER: "draco_encoder.js"
|
|
5499
|
+
};
|
|
5500
|
+
var DRACO_EXTERNAL_LIBRARY_URLS = {
|
|
5501
|
+
[DRACO_EXTERNAL_LIBRARIES.DECODER]: `${STATIC_DECODER_URL}/${DRACO_EXTERNAL_LIBRARIES.DECODER}`,
|
|
5502
|
+
[DRACO_EXTERNAL_LIBRARIES.DECODER_WASM]: `${STATIC_DECODER_URL}/${DRACO_EXTERNAL_LIBRARIES.DECODER_WASM}`,
|
|
5503
|
+
[DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER]: `${STATIC_DECODER_URL}/${DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER}`,
|
|
5504
|
+
[DRACO_EXTERNAL_LIBRARIES.ENCODER]: `https://raw.githubusercontent.com/google/draco/${DRACO_ENCODER_VERSION}/javascript/${DRACO_EXTERNAL_LIBRARIES.ENCODER}`
|
|
5505
|
+
};
|
|
5465
5506
|
var loadDecoderPromise;
|
|
5466
5507
|
async function loadDracoDecoderModule(options) {
|
|
5467
5508
|
const modules = options.modules || {};
|
|
@@ -5479,13 +5520,13 @@
|
|
|
5479
5520
|
let wasmBinary;
|
|
5480
5521
|
switch (options.draco && options.draco.decoderType) {
|
|
5481
5522
|
case "js":
|
|
5482
|
-
DracoDecoderModule = await loadLibrary(
|
|
5523
|
+
DracoDecoderModule = await loadLibrary(DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER], "draco", options, DRACO_EXTERNAL_LIBRARIES.FALLBACK_DECODER);
|
|
5483
5524
|
break;
|
|
5484
5525
|
case "wasm":
|
|
5485
5526
|
default:
|
|
5486
5527
|
[DracoDecoderModule, wasmBinary] = await Promise.all([
|
|
5487
|
-
await loadLibrary(
|
|
5488
|
-
await loadLibrary(
|
|
5528
|
+
await loadLibrary(DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER], "draco", options, DRACO_EXTERNAL_LIBRARIES.DECODER),
|
|
5529
|
+
await loadLibrary(DRACO_EXTERNAL_LIBRARY_URLS[DRACO_EXTERNAL_LIBRARIES.DECODER_WASM], "draco", options, DRACO_EXTERNAL_LIBRARIES.DECODER_WASM)
|
|
5489
5530
|
]);
|
|
5490
5531
|
}
|
|
5491
5532
|
DracoDecoderModule = DracoDecoderModule || globalThis.DracoDecoderModule;
|
|
@@ -5520,32 +5561,35 @@
|
|
|
5520
5561
|
}
|
|
5521
5562
|
|
|
5522
5563
|
// ../textures/src/lib/utils/version.ts
|
|
5523
|
-
var VERSION6 = true ? "4.0.0-alpha.
|
|
5564
|
+
var VERSION6 = true ? "4.0.0-alpha.19" : "beta";
|
|
5524
5565
|
|
|
5525
5566
|
// ../textures/src/lib/parsers/basis-module-loader.ts
|
|
5526
|
-
var
|
|
5527
|
-
|
|
5528
|
-
|
|
5567
|
+
var BASIS_EXTERNAL_LIBRARIES = {
|
|
5568
|
+
TRANSCODER: "basis_transcoder.js",
|
|
5569
|
+
TRANSCODER_WASM: "basis_transcoder.wasm",
|
|
5570
|
+
ENCODER: "basis_encoder.js",
|
|
5571
|
+
ENCODER_WASM: "basis_encoder.wasm"
|
|
5572
|
+
};
|
|
5529
5573
|
var loadBasisTranscoderPromise;
|
|
5530
|
-
async function
|
|
5574
|
+
async function loadBasisTranscoderModule(options) {
|
|
5531
5575
|
const modules = options.modules || {};
|
|
5532
5576
|
if (modules.basis) {
|
|
5533
5577
|
return modules.basis;
|
|
5534
5578
|
}
|
|
5535
|
-
loadBasisTranscoderPromise = loadBasisTranscoderPromise ||
|
|
5579
|
+
loadBasisTranscoderPromise = loadBasisTranscoderPromise || loadBasisTranscoder(options);
|
|
5536
5580
|
return await loadBasisTranscoderPromise;
|
|
5537
5581
|
}
|
|
5538
|
-
async function
|
|
5582
|
+
async function loadBasisTranscoder(options) {
|
|
5539
5583
|
let BASIS = null;
|
|
5540
5584
|
let wasmBinary = null;
|
|
5541
5585
|
[BASIS, wasmBinary] = await Promise.all([
|
|
5542
|
-
await loadLibrary(
|
|
5543
|
-
await loadLibrary(
|
|
5586
|
+
await loadLibrary(BASIS_EXTERNAL_LIBRARIES.TRANSCODER, "textures", options),
|
|
5587
|
+
await loadLibrary(BASIS_EXTERNAL_LIBRARIES.TRANSCODER_WASM, "textures", options)
|
|
5544
5588
|
]);
|
|
5545
5589
|
BASIS = BASIS || globalThis.BASIS;
|
|
5546
|
-
return await
|
|
5590
|
+
return await initializeBasisTranscoderModule(BASIS, wasmBinary);
|
|
5547
5591
|
}
|
|
5548
|
-
function
|
|
5592
|
+
function initializeBasisTranscoderModule(BasisModule, wasmBinary) {
|
|
5549
5593
|
const options = {};
|
|
5550
5594
|
if (wasmBinary) {
|
|
5551
5595
|
options.wasmBinary = wasmBinary;
|
|
@@ -5571,8 +5615,8 @@
|
|
|
5571
5615
|
let BASIS_ENCODER = null;
|
|
5572
5616
|
let wasmBinary = null;
|
|
5573
5617
|
[BASIS_ENCODER, wasmBinary] = await Promise.all([
|
|
5574
|
-
await loadLibrary(
|
|
5575
|
-
await loadLibrary(
|
|
5618
|
+
await loadLibrary(BASIS_EXTERNAL_LIBRARIES.ENCODER, "textures", options),
|
|
5619
|
+
await loadLibrary(BASIS_EXTERNAL_LIBRARIES.ENCODER_WASM, "textures", options)
|
|
5576
5620
|
]);
|
|
5577
5621
|
BASIS_ENCODER = BASIS_ENCODER || globalThis.BASIS;
|
|
5578
5622
|
return await initializeBasisEncoderModule(BASIS_ENCODER, wasmBinary);
|
|
@@ -5981,7 +6025,7 @@
|
|
|
5981
6025
|
const fileConstructors = await loadBasisEncoderModule(options);
|
|
5982
6026
|
return parseKTX2File(fileConstructors.KTX2File, data, options);
|
|
5983
6027
|
}
|
|
5984
|
-
const { BasisFile } = await
|
|
6028
|
+
const { BasisFile } = await loadBasisTranscoderModule(options);
|
|
5985
6029
|
return parseBasisFile(BasisFile, data, options);
|
|
5986
6030
|
}
|
|
5987
6031
|
switch (options.basis.module) {
|
|
@@ -5996,7 +6040,7 @@
|
|
|
5996
6040
|
}
|
|
5997
6041
|
case "transcoder":
|
|
5998
6042
|
default:
|
|
5999
|
-
const { BasisFile } = await
|
|
6043
|
+
const { BasisFile } = await loadBasisTranscoderModule(options);
|
|
6000
6044
|
return parseBasisFile(BasisFile, data, options);
|
|
6001
6045
|
}
|
|
6002
6046
|
}
|
|
@@ -7209,12 +7253,12 @@
|
|
|
7209
7253
|
}
|
|
7210
7254
|
|
|
7211
7255
|
// src/i3s-attribute-loader.ts
|
|
7212
|
-
var
|
|
7256
|
+
var VERSION7 = true ? "4.0.0-alpha.19" : "latest";
|
|
7213
7257
|
var I3SAttributeLoader = {
|
|
7214
7258
|
name: "I3S Attribute",
|
|
7215
7259
|
id: "i3s-attribute",
|
|
7216
7260
|
module: "i3s",
|
|
7217
|
-
version:
|
|
7261
|
+
version: VERSION7,
|
|
7218
7262
|
mimeTypes: ["application/binary"],
|
|
7219
7263
|
parse: async (arrayBuffer, options) => parseI3STileAttribute(arrayBuffer, options),
|
|
7220
7264
|
extensions: ["bin"],
|
|
@@ -7672,13 +7716,13 @@
|
|
|
7672
7716
|
}
|
|
7673
7717
|
|
|
7674
7718
|
// src/i3s-content-loader.ts
|
|
7675
|
-
var
|
|
7719
|
+
var VERSION8 = true ? "4.0.0-alpha.19" : "beta";
|
|
7676
7720
|
var I3SContentLoader = {
|
|
7677
7721
|
name: "I3S Content (Indexed Scene Layers)",
|
|
7678
7722
|
id: "i3s-content",
|
|
7679
7723
|
module: "i3s",
|
|
7680
7724
|
worker: true,
|
|
7681
|
-
version:
|
|
7725
|
+
version: VERSION8,
|
|
7682
7726
|
mimeTypes: ["application/octet-stream"],
|
|
7683
7727
|
parse: parse3,
|
|
7684
7728
|
extensions: ["bin"],
|
package/dist/i3s-loader.js
CHANGED
|
@@ -82,10 +82,8 @@ async function parseTileset(data, options, context) {
|
|
|
82
82
|
if (tilesetJson?.layerType === POINT_CLOUD) {
|
|
83
83
|
throw new Error('Point Cloud layers currently are not supported by I3SLoader');
|
|
84
84
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
await (0, parse_i3s_1.normalizeTilesetData)(tilesetJson, options, context);
|
|
88
|
-
return tilesetJson;
|
|
85
|
+
const tilesetPostprocessed = await (0, parse_i3s_1.normalizeTilesetData)(tilesetJson, options, context);
|
|
86
|
+
return tilesetPostprocessed;
|
|
89
87
|
}
|
|
90
88
|
async function parseTile(data, context) {
|
|
91
89
|
data = JSON.parse(new TextDecoder().decode(data));
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
export type { BoundingVolumes, Mbs, Obb, SceneLayer3D, AttributeStorageInfo, Field, ESRIField, PopupInfo, Node3DIndexDocument, LodSelection, NodeReference, Resource, MaxScreenThresholdSQ, NodeInPage, SharedResources, Attribute, Extent, FeatureAttribute, FieldInfo, I3SMaterialDefinition, TextureDefinitionInfo, MaterialDefinitionInfo, FullExtent, StatisticsInfo, StatsInfo, Histogram, ValueCount, BuildingSceneSublayer, OperationalLayer, TextureSetDefinitionFormats } from './types';
|
|
1
|
+
export type { BoundingVolumes, Mbs, Obb, I3STilesetHeader, I3STileContent, I3STileHeader, SceneLayer3D, AttributeStorageInfo, Field, ESRIField, PopupInfo, Node3DIndexDocument, LodSelection, NodeReference, Resource, MaxScreenThresholdSQ, NodeInPage, SharedResources, Attribute, Extent, FeatureAttribute, FieldInfo, I3SMaterialDefinition, TextureDefinitionInfo, MaterialDefinitionInfo, FullExtent, StatisticsInfo, StatsInfo, Histogram, ValueCount, BuildingSceneSublayer, OperationalLayer, TextureSetDefinitionFormats } from './types';
|
|
2
2
|
export type { FileProvider } from './lib/parsers/parse-zip/file-provider';
|
|
3
|
+
export type { I3SLoaderOptions } from './i3s-loader';
|
|
3
4
|
export { COORDINATE_SYSTEM } from './lib/parsers/constants';
|
|
4
5
|
export { I3SLoader } from './i3s-loader';
|
|
5
6
|
export { SLPKLoader } from './i3s-slpk-loader';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,YAAY,EACV,eAAe,EACf,GAAG,EACH,GAAG,EACH,YAAY,EACZ,oBAAoB,EACpB,KAAK,EACL,SAAS,EACT,SAAS,EACT,mBAAmB,EACnB,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,oBAAoB,EACpB,UAAU,EACV,eAAe,EACf,SAAS,EACT,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,UAAU,EACV,cAAc,EACd,SAAS,EACT,SAAS,EACT,UAAU,EACV,qBAAqB,EACrB,gBAAgB,EAChB,2BAA2B,EAC5B,MAAM,SAAS,CAAC;AACjB,YAAY,EAAC,YAAY,EAAC,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,YAAY,EACV,eAAe,EACf,GAAG,EACH,GAAG,EACH,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,YAAY,EACZ,oBAAoB,EACpB,KAAK,EACL,SAAS,EACT,SAAS,EACT,mBAAmB,EACnB,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,oBAAoB,EACpB,UAAU,EACV,eAAe,EACf,SAAS,EACT,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,UAAU,EACV,cAAc,EACd,SAAS,EACT,SAAS,EACT,UAAU,EACV,qBAAqB,EACrB,gBAAgB,EAChB,2BAA2B,EAC5B,MAAM,SAAS,CAAC;AACjB,YAAY,EAAC,YAAY,EAAC,MAAM,uCAAuC,CAAC;AACxE,YAAY,EAAC,gBAAgB,EAAC,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAC,iBAAiB,EAAC,MAAM,yBAAyB,CAAC;AAE1D,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AACvC,OAAO,EAAC,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAC,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAC,kBAAkB,EAAE,qBAAqB,EAAC,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAC,2BAA2B,EAAC,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAC,iBAAiB,EAAC,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAC,oBAAoB,EAAC,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAC,uBAAuB,EAAC,MAAM,2CAA2C,CAAC;AAClF,OAAO,EAAC,SAAS,EAAC,MAAM,qCAAqC,CAAC"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { LoaderOptions } from '@loaders.gl/loader-utils';
|
|
2
|
-
import {
|
|
2
|
+
import { NodePage, NodeInPage, I3STextureFormat, I3STileHeader, SceneLayer3D } from '../../types';
|
|
3
3
|
/**
|
|
4
4
|
* class I3SNodePagesTiles - loads nodePages and form i3s tiles from them
|
|
5
5
|
*/
|
|
6
6
|
export default class I3SNodePagesTiles {
|
|
7
|
-
tileset:
|
|
7
|
+
tileset: SceneLayer3D;
|
|
8
8
|
nodePages: NodePage[];
|
|
9
9
|
pendingNodePages: {
|
|
10
10
|
promise: Promise<NodePage>;
|
|
@@ -18,14 +18,16 @@ export default class I3SNodePagesTiles {
|
|
|
18
18
|
name: string;
|
|
19
19
|
} | null)[];
|
|
20
20
|
nodesInNodePages: number;
|
|
21
|
+
url: string;
|
|
21
22
|
private textureLoaderOptions;
|
|
22
23
|
/**
|
|
23
24
|
* @constructs
|
|
24
25
|
* Create a I3SNodePagesTiles instance.
|
|
25
26
|
* @param tileset - i3s tileset header ('layers/0')
|
|
27
|
+
* @param url - tileset url
|
|
26
28
|
* @param options - i3s loader options
|
|
27
29
|
*/
|
|
28
|
-
constructor(tileset:
|
|
30
|
+
constructor(tileset: SceneLayer3D, url: string | undefined, options: LoaderOptions);
|
|
29
31
|
/**
|
|
30
32
|
* Loads some nodePage and return a particular node from it
|
|
31
33
|
* @param id - id of node through all node pages
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i3s-nodepages-tiles.d.ts","sourceRoot":"","sources":["../../../src/lib/helpers/i3s-nodepages-tiles.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAC5D,OAAO,
|
|
1
|
+
{"version":3,"file":"i3s-nodepages-tiles.d.ts","sourceRoot":"","sources":["../../../src/lib/helpers/i3s-nodepages-tiles.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAEL,QAAQ,EACR,UAAU,EAIV,gBAAgB,EAEhB,aAAa,EACb,YAAY,EACb,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,iBAAiB;IACpC,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,QAAQ,EAAE,CAAM;IAC3B,gBAAgB,EAAE;QAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAAA;KAAC,EAAE,CAAM;IAClF,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,aAAa,CAAC;IACvB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,iCAAiC,EAAE,CAAC;QAAC,MAAM,EAAE,gBAAgB,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,GAAG,IAAI,CAAC,EAAE,CAAM;IAC5F,gBAAgB,EAAE,MAAM,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,oBAAoB,CAA4B;IAExD;;;;;;OAMG;gBACS,OAAO,EAAE,YAAY,EAAE,GAAG,oBAAa,EAAE,OAAO,EAAE,aAAa;IAW3E;;;OAGG;IACG,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAuBlD;;;OAGG;IAEG,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAgE/D;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IA8BrB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAiBvB;;;;;;;OAOG;IACH,OAAO,CAAC,0BAA0B;IAuBlC;;;;OAIG;IACH,OAAO,CAAC,wCAAwC;IA2BhD;;;OAGG;IACH,OAAO,CAAC,0BAA0B;CAwBnC"}
|
|
@@ -13,14 +13,16 @@ class I3SNodePagesTiles {
|
|
|
13
13
|
* @constructs
|
|
14
14
|
* Create a I3SNodePagesTiles instance.
|
|
15
15
|
* @param tileset - i3s tileset header ('layers/0')
|
|
16
|
+
* @param url - tileset url
|
|
16
17
|
* @param options - i3s loader options
|
|
17
18
|
*/
|
|
18
|
-
constructor(tileset, options) {
|
|
19
|
+
constructor(tileset, url = '', options) {
|
|
19
20
|
this.nodePages = [];
|
|
20
21
|
this.pendingNodePages = [];
|
|
21
22
|
this.textureDefinitionsSelectedFormats = [];
|
|
22
23
|
this.textureLoaderOptions = {};
|
|
23
24
|
this.tileset = { ...tileset }; // spread the tileset to avoid circular reference
|
|
25
|
+
this.url = url;
|
|
24
26
|
this.nodesPerPage = tileset.nodePages?.nodesPerPage || 64;
|
|
25
27
|
this.lodSelectionMetricType = tileset.nodePages?.lodSelectionMetricType;
|
|
26
28
|
this.options = options;
|
|
@@ -34,7 +36,7 @@ class I3SNodePagesTiles {
|
|
|
34
36
|
async getNodeById(id) {
|
|
35
37
|
const pageIndex = Math.floor(id / this.nodesPerPage);
|
|
36
38
|
if (!this.nodePages[pageIndex] && !this.pendingNodePages[pageIndex]) {
|
|
37
|
-
const nodePageUrl = (0, url_utils_1.getUrlWithToken)(`${this.
|
|
39
|
+
const nodePageUrl = (0, url_utils_1.getUrlWithToken)(`${this.url}/nodepages/${pageIndex}`,
|
|
38
40
|
// @ts-expect-error this.options is not properly typed
|
|
39
41
|
this.options.i3s?.token);
|
|
40
42
|
this.pendingNodePages[pageIndex] = {
|
|
@@ -86,10 +88,10 @@ class I3SNodePagesTiles {
|
|
|
86
88
|
materialDefinition = nodeMaterialDefinition;
|
|
87
89
|
textureFormat = textureData.format || textureFormat;
|
|
88
90
|
if (textureData.name) {
|
|
89
|
-
textureUrl = `${this.
|
|
91
|
+
textureUrl = `${this.url}/nodes/${node.mesh.material.resource}/textures/${textureData.name}`;
|
|
90
92
|
}
|
|
91
93
|
if (this.tileset.attributeStorageInfo) {
|
|
92
|
-
attributeUrls = (0, url_utils_1.generateTilesetAttributeUrls)(this.tileset, node.mesh.attribute.resource);
|
|
94
|
+
attributeUrls = (0, url_utils_1.generateTilesetAttributeUrls)(this.tileset, this.url, node.mesh.attribute.resource);
|
|
93
95
|
}
|
|
94
96
|
}
|
|
95
97
|
const lodSelection = this.getLodSelection(node);
|
|
@@ -131,7 +133,7 @@ class I3SNodePagesTiles {
|
|
|
131
133
|
if (geometryIndex !== -1) {
|
|
132
134
|
const isDracoGeometry = Boolean(geometryDefinition.geometryBuffers[geometryIndex].compressedAttributes);
|
|
133
135
|
result = {
|
|
134
|
-
url: `${this.
|
|
136
|
+
url: `${this.url}/nodes/${meshGeometryData.resource}/geometries/${geometryIndex}`,
|
|
135
137
|
isDracoGeometry
|
|
136
138
|
};
|
|
137
139
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { I3STilesetHeader, I3STileHeader, I3SMinimalNodeData, Node3DIndexDocument } from '../../types';
|
|
1
|
+
import { I3STilesetHeader, I3STileHeader, I3SMinimalNodeData, Node3DIndexDocument, SceneLayer3D } from '../../types';
|
|
2
2
|
import type { LoaderOptions, LoaderContext } from '@loaders.gl/loader-utils';
|
|
3
3
|
export declare function normalizeTileData(tile: Node3DIndexDocument, context: LoaderContext): I3STileHeader;
|
|
4
4
|
export declare function normalizeTileNonUrlData(tile: I3SMinimalNodeData): I3STileHeader;
|
|
5
|
-
export declare function normalizeTilesetData(tileset:
|
|
5
|
+
export declare function normalizeTilesetData(tileset: SceneLayer3D, options: LoaderOptions, context: LoaderContext): Promise<I3STilesetHeader>;
|
|
6
6
|
//# sourceMappingURL=parse-i3s.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-i3s.d.ts","sourceRoot":"","sources":["../../../src/lib/parsers/parse-i3s.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,gBAAgB,EAChB,aAAa,EAEb,kBAAkB,EAClB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"parse-i3s.d.ts","sourceRoot":"","sources":["../../../src/lib/parsers/parse-i3s.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,gBAAgB,EAChB,aAAa,EAEb,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACb,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAC,aAAa,EAAE,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAG3E,wBAAgB,iBAAiB,CAAC,IAAI,EAAG,mBAAmB,EAAE,OAAO,EAAE,aAAa,GAAG,aAAa,CA6BnG;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAG,kBAAkB,GAAG,aAAa,CAkChF;AAED,wBAAsB,oBAAoB,CAAC,OAAO,EAAG,YAAY,EAAE,OAAO,EAAG,aAAa,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+B7I"}
|
|
@@ -10,6 +10,7 @@ const core_1 = require("@loaders.gl/core");
|
|
|
10
10
|
const tiles_1 = require("@loaders.gl/tiles");
|
|
11
11
|
const i3s_nodepages_tiles_1 = __importDefault(require("../helpers/i3s-nodepages-tiles"));
|
|
12
12
|
const url_utils_1 = require("../utils/url-utils");
|
|
13
|
+
const i3s_loader_1 = require("../../i3s-loader");
|
|
13
14
|
function normalizeTileData(tile, context) {
|
|
14
15
|
const url = context.url || '';
|
|
15
16
|
let contentUrl;
|
|
@@ -24,11 +25,14 @@ function normalizeTileData(tile, context) {
|
|
|
24
25
|
if (tile.attributeData) {
|
|
25
26
|
attributeUrls = (0, url_utils_1.generateTileAttributeUrls)(url, tile);
|
|
26
27
|
}
|
|
28
|
+
const children = tile.children || [];
|
|
27
29
|
return normalizeTileNonUrlData({
|
|
28
30
|
...tile,
|
|
31
|
+
children,
|
|
29
32
|
url,
|
|
30
33
|
contentUrl,
|
|
31
34
|
textureUrl,
|
|
35
|
+
textureFormat: 'jpg',
|
|
32
36
|
attributeUrls,
|
|
33
37
|
isDracoGeometry: false
|
|
34
38
|
});
|
|
@@ -57,26 +61,27 @@ function normalizeTileNonUrlData(tile) {
|
|
|
57
61
|
}
|
|
58
62
|
const lodMetricType = tile.lodSelection?.[0].metricType;
|
|
59
63
|
const lodMetricValue = tile.lodSelection?.[0].maxError;
|
|
60
|
-
const transformMatrix = tile.transform;
|
|
61
64
|
const type = tiles_1.TILE_TYPE.MESH;
|
|
62
65
|
/**
|
|
63
66
|
* I3S specification supports only REPLACE
|
|
64
67
|
*/
|
|
65
68
|
const refine = tiles_1.TILE_REFINEMENT.REPLACE;
|
|
66
|
-
return { ...tile, mbs, boundingVolume, lodMetricType, lodMetricValue,
|
|
69
|
+
return { ...tile, mbs, boundingVolume, lodMetricType, lodMetricValue, type, refine };
|
|
67
70
|
}
|
|
68
71
|
exports.normalizeTileNonUrlData = normalizeTileNonUrlData;
|
|
69
72
|
async function normalizeTilesetData(tileset, options, context) {
|
|
70
|
-
|
|
73
|
+
const url = context.url;
|
|
74
|
+
let nodePagesTile;
|
|
75
|
+
let root;
|
|
71
76
|
if (tileset.nodePages) {
|
|
72
|
-
|
|
73
|
-
|
|
77
|
+
nodePagesTile = new i3s_nodepages_tiles_1.default(tileset, url, options);
|
|
78
|
+
root = await nodePagesTile.formTileFromNodePages(0);
|
|
74
79
|
}
|
|
75
80
|
else {
|
|
76
81
|
// @ts-expect-error options is not properly typed
|
|
77
82
|
const rootNodeUrl = (0, url_utils_1.getUrlWithToken)(`${tileset.url}/nodes/root`, options.i3s?.token);
|
|
78
83
|
// eslint-disable-next-line no-use-before-define
|
|
79
|
-
|
|
84
|
+
root = await (0, core_1.load)(rootNodeUrl, i3s_loader_1.I3SLoader, {
|
|
80
85
|
...options,
|
|
81
86
|
i3s: {
|
|
82
87
|
// @ts-expect-error options is not properly typed
|
|
@@ -85,11 +90,16 @@ async function normalizeTilesetData(tileset, options, context) {
|
|
|
85
90
|
}
|
|
86
91
|
});
|
|
87
92
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
93
|
+
return {
|
|
94
|
+
...tileset,
|
|
95
|
+
loader: i3s_loader_1.I3SLoader,
|
|
96
|
+
url,
|
|
97
|
+
basePath: url,
|
|
98
|
+
type: tiles_1.TILESET_TYPE.I3S,
|
|
99
|
+
nodePagesTile,
|
|
100
|
+
root,
|
|
101
|
+
lodMetricType: root.lodMetricType,
|
|
102
|
+
lodMetricValue: root.lodMetricValue
|
|
103
|
+
};
|
|
94
104
|
}
|
|
95
105
|
exports.normalizeTilesetData = normalizeTilesetData;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Node3DIndexDocument } from '../../types';
|
|
1
|
+
import { Node3DIndexDocument, SceneLayer3D } from '../../types';
|
|
2
2
|
/**
|
|
3
3
|
* Generates url with token if it is exists.
|
|
4
4
|
* @param url
|
|
@@ -14,9 +14,10 @@ export declare function getUrlWithToken(url: string, token?: string | null): str
|
|
|
14
14
|
export declare function generateTileAttributeUrls(url: string, tile: Node3DIndexDocument): string[];
|
|
15
15
|
/**
|
|
16
16
|
* Generates attribute urls for tileset based on tileset and resource
|
|
17
|
-
* @param
|
|
18
|
-
* @param
|
|
17
|
+
* @param tileset - tileset metadata
|
|
18
|
+
* @param url - tileset base url
|
|
19
|
+
* @param resource - resource id per I3S spec
|
|
19
20
|
* @returns {Array}
|
|
20
21
|
*/
|
|
21
|
-
export declare function generateTilesetAttributeUrls(tileset:
|
|
22
|
+
export declare function generateTilesetAttributeUrls(tileset: SceneLayer3D, url: string, resource: number): string[];
|
|
22
23
|
//# sourceMappingURL=url-utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url-utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/url-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,mBAAmB,EAAC,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"url-utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/url-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,mBAAmB,EAAE,YAAY,EAAC,MAAM,aAAa,CAAC;AAE9D;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,GAAG,IAAW,GAAG,MAAM,CAEhF;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,MAAM,EAAE,CAU1F;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,YAUhG"}
|
|
@@ -28,13 +28,14 @@ function generateTileAttributeUrls(url, tile) {
|
|
|
28
28
|
exports.generateTileAttributeUrls = generateTileAttributeUrls;
|
|
29
29
|
/**
|
|
30
30
|
* Generates attribute urls for tileset based on tileset and resource
|
|
31
|
-
* @param
|
|
32
|
-
* @param
|
|
31
|
+
* @param tileset - tileset metadata
|
|
32
|
+
* @param url - tileset base url
|
|
33
|
+
* @param resource - resource id per I3S spec
|
|
33
34
|
* @returns {Array}
|
|
34
35
|
*/
|
|
35
|
-
function generateTilesetAttributeUrls(tileset, resource) {
|
|
36
|
+
function generateTilesetAttributeUrls(tileset, url, resource) {
|
|
36
37
|
const attributeUrls = [];
|
|
37
|
-
const { attributeStorageInfo
|
|
38
|
+
const { attributeStorageInfo = [] } = tileset;
|
|
38
39
|
for (let index = 0; index < attributeStorageInfo.length; index++) {
|
|
39
40
|
const fileName = attributeStorageInfo[index].key;
|
|
40
41
|
attributeUrls.push(`${url}/nodes/${resource}/attributes/${fileName}/0`);
|