@loaders.gl/core 4.0.0-alpha.16 → 4.0.0-alpha.18

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 (36) hide show
  1. package/dist/dist.min.js +28 -8
  2. package/dist/es5/lib/fetch/fetch-file.js +26 -8
  3. package/dist/es5/lib/fetch/fetch-file.js.map +1 -1
  4. package/dist/es5/lib/fetch/fetch-file.node.js +86 -0
  5. package/dist/es5/lib/fetch/fetch-file.node.js.map +1 -0
  6. package/dist/es5/lib/init.js +1 -1
  7. package/dist/es5/lib/loader-utils/check-errors.js +1 -1
  8. package/dist/es5/lib/loader-utils/check-errors.js.map +1 -1
  9. package/dist/es5/null-loader.js +1 -1
  10. package/dist/esm/lib/fetch/fetch-file.js +16 -7
  11. package/dist/esm/lib/fetch/fetch-file.js.map +1 -1
  12. package/dist/esm/lib/fetch/fetch-file.node.js +54 -0
  13. package/dist/esm/lib/fetch/fetch-file.node.js.map +1 -0
  14. package/dist/esm/lib/init.js +1 -1
  15. package/dist/esm/lib/loader-utils/check-errors.js +1 -1
  16. package/dist/esm/lib/loader-utils/check-errors.js.map +1 -1
  17. package/dist/esm/null-loader.js +1 -1
  18. package/dist/lib/fetch/fetch-file.d.ts +7 -10
  19. package/dist/lib/fetch/fetch-file.d.ts.map +1 -1
  20. package/dist/lib/fetch/fetch-file.js +50 -16
  21. package/dist/lib/fetch/fetch-file.node.d.ts +8 -0
  22. package/dist/lib/fetch/fetch-file.node.d.ts.map +1 -0
  23. package/dist/lib/fetch/fetch-file.node.js +57 -0
  24. package/dist/lib/fetch/read-file.d.ts +1 -1
  25. package/dist/lib/fetch/read-file.d.ts.map +1 -1
  26. package/dist/lib/loader-utils/check-errors.d.ts +11 -2
  27. package/dist/lib/loader-utils/check-errors.d.ts.map +1 -1
  28. package/dist/lib/loader-utils/check-errors.js +17 -1
  29. package/dist/lib/loader-utils/get-fetch-function.d.ts +1 -2
  30. package/dist/lib/loader-utils/get-fetch-function.d.ts.map +1 -1
  31. package/dist/null-worker-node.js +1 -1
  32. package/dist/null-worker.js +1 -1
  33. package/package.json +8 -4
  34. package/src/lib/fetch/fetch-file.node.ts +61 -0
  35. package/src/lib/fetch/fetch-file.ts +28 -16
  36. package/src/lib/loader-utils/check-errors.ts +21 -4
package/dist/dist.min.js CHANGED
@@ -1475,6 +1475,7 @@
1475
1475
  __export(fs_exports, {
1476
1476
  _readToArrayBuffer: () => _readToArrayBuffer,
1477
1477
  close: () => close,
1478
+ createReadStream: () => createReadStream,
1478
1479
  createWriteStream: () => createWriteStream,
1479
1480
  fstat: () => fstat,
1480
1481
  isSupported: () => isSupported,
@@ -1484,6 +1485,7 @@
1484
1485
  readFileSync: () => readFileSync,
1485
1486
  readdir: () => readdir,
1486
1487
  stat: () => stat,
1488
+ statSync: () => statSync,
1487
1489
  writeFile: () => writeFile,
1488
1490
  writeFileSync: () => writeFileSync
1489
1491
  });
@@ -1495,7 +1497,7 @@
1495
1497
  }
1496
1498
  return toArrayBuffer(buffer);
1497
1499
  }
1498
- var import_fs, readdir, stat, readFile, readFileSync, writeFile, writeFileSync, open, close, read, fstat, createWriteStream, isSupported;
1500
+ var import_fs, readdir, stat, statSync, readFile, readFileSync, writeFile, writeFileSync, open, close, read, fstat, createReadStream, createWriteStream, isSupported;
1499
1501
  var init_fs = __esm({
1500
1502
  "../loader-utils/src/lib/node/fs.ts"() {
1501
1503
  import_fs = __toModule(require_fs());
@@ -1505,6 +1507,7 @@
1505
1507
  try {
1506
1508
  readdir = promisify2(import_fs.default.readdir);
1507
1509
  stat = promisify2(import_fs.default.stat);
1510
+ statSync = import_fs.default.statSync;
1508
1511
  readFile = import_fs.default.readFile;
1509
1512
  readFileSync = import_fs.default.readFileSync;
1510
1513
  writeFile = promisify3(import_fs.default.writeFile);
@@ -1513,6 +1516,7 @@
1513
1516
  close = (fd) => new Promise((resolve2, reject) => import_fs.default.close(fd, (err) => err ? reject(err) : resolve2()));
1514
1517
  read = import_fs.default.read;
1515
1518
  fstat = import_fs.default.fstat;
1519
+ createReadStream = import_fs.default.createReadStream;
1516
1520
  createWriteStream = import_fs.default.createWriteStream;
1517
1521
  isSupported = Boolean(import_fs.default);
1518
1522
  } catch {
@@ -1741,22 +1745,38 @@
1741
1745
  }
1742
1746
  });
1743
1747
 
1748
+ // (disabled):src/lib/fetch/fetch-file.node
1749
+ var require_fetch_file = __commonJS({
1750
+ "(disabled):src/lib/fetch/fetch-file.node"() {
1751
+ }
1752
+ });
1753
+
1744
1754
  // src/lib/fetch/fetch-file.ts
1745
- async function fetchFile(url, options) {
1746
- if (typeof url === "string") {
1747
- url = resolvePath(url);
1748
- let fetchOptions = options;
1749
- if (options?.fetch && typeof options?.fetch !== "function") {
1750
- fetchOptions = options.fetch;
1755
+ function isNodePath(url) {
1756
+ return !isRequestURL(url) && !isDataURL(url);
1757
+ }
1758
+ function isRequestURL(url) {
1759
+ return url.startsWith("http:") || url.startsWith("https:");
1760
+ }
1761
+ function isDataURL(url) {
1762
+ return url.startsWith("data:");
1763
+ }
1764
+ async function fetchFile(urlOrData, fetchOptions) {
1765
+ if (typeof urlOrData === "string") {
1766
+ const url = resolvePath(urlOrData);
1767
+ if (isNodePath(url) && node2?.fetchFileNode) {
1768
+ return node2.fetchFileNode(url, fetchOptions);
1751
1769
  }
1752
1770
  return await fetch(url, fetchOptions);
1753
1771
  }
1754
- return await makeResponse(url);
1772
+ return await makeResponse(urlOrData);
1755
1773
  }
1774
+ var node2;
1756
1775
  var init_fetch_file = __esm({
1757
1776
  "src/lib/fetch/fetch-file.ts"() {
1758
1777
  init_src2();
1759
1778
  init_response_utils();
1779
+ node2 = __toModule(require_fetch_file());
1760
1780
  }
1761
1781
  });
1762
1782
 
@@ -1,39 +1,57 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
4
5
  Object.defineProperty(exports, "__esModule", {
5
6
  value: true
6
7
  });
7
8
  exports.fetchFile = fetchFile;
9
+ exports.isDataURL = isDataURL;
10
+ exports.isNodePath = isNodePath;
11
+ exports.isRequestURL = isRequestURL;
8
12
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
13
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
10
14
  var _loaderUtils = require("@loaders.gl/loader-utils");
11
15
  var _responseUtils = require("../utils/response-utils");
16
+ var node = _interopRequireWildcard(require("./fetch-file.node"));
17
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
18
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
19
+ function isNodePath(url) {
20
+ return !isRequestURL(url) && !isDataURL(url);
21
+ }
22
+ function isRequestURL(url) {
23
+ return url.startsWith('http:') || url.startsWith('https:');
24
+ }
25
+ function isDataURL(url) {
26
+ return url.startsWith('data:');
27
+ }
12
28
  function fetchFile(_x, _x2) {
13
29
  return _fetchFile.apply(this, arguments);
14
30
  }
15
31
  function _fetchFile() {
16
- _fetchFile = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee(url, options) {
17
- var fetchOptions;
32
+ _fetchFile = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee(urlOrData, fetchOptions) {
33
+ var url;
18
34
  return _regenerator.default.wrap(function _callee$(_context) {
19
35
  while (1) switch (_context.prev = _context.next) {
20
36
  case 0:
21
- if (!(typeof url === 'string')) {
37
+ if (!(typeof urlOrData === 'string')) {
22
38
  _context.next = 7;
23
39
  break;
24
40
  }
25
- url = (0, _loaderUtils.resolvePath)(url);
26
- fetchOptions = options;
27
- if (options !== null && options !== void 0 && options.fetch && typeof (options === null || options === void 0 ? void 0 : options.fetch) !== 'function') {
28
- fetchOptions = options.fetch;
41
+ url = (0, _loaderUtils.resolvePath)(urlOrData);
42
+ if (!(isNodePath(url) && node !== null && node !== void 0 && node.fetchFileNode)) {
43
+ _context.next = 4;
44
+ break;
29
45
  }
46
+ return _context.abrupt("return", node.fetchFileNode(url, fetchOptions));
47
+ case 4:
30
48
  _context.next = 6;
31
49
  return fetch(url, fetchOptions);
32
50
  case 6:
33
51
  return _context.abrupt("return", _context.sent);
34
52
  case 7:
35
53
  _context.next = 9;
36
- return (0, _responseUtils.makeResponse)(url);
54
+ return (0, _responseUtils.makeResponse)(urlOrData);
37
55
  case 9:
38
56
  return _context.abrupt("return", _context.sent);
39
57
  case 10:
@@ -1 +1 @@
1
- {"version":3,"file":"fetch-file.js","names":["_loaderUtils","require","_responseUtils","fetchFile","_x","_x2","_fetchFile","apply","arguments","_asyncToGenerator2","default","_regenerator","mark","_callee","url","options","fetchOptions","wrap","_callee$","_context","prev","next","resolvePath","fetch","abrupt","sent","makeResponse","stop"],"sources":["../../../../src/lib/fetch/fetch-file.ts"],"sourcesContent":["import {resolvePath} from '@loaders.gl/loader-utils';\nimport {makeResponse} from '../utils/response-utils';\n// import {getErrorMessageFromResponse} from './fetch-error-message';\n\n/**\n * fetch compatible function\n * Reads file data from:\n * - http/http urls\n * - data urls\n * - File/Blob objects\n * Leverages `@loaders.gl/polyfills` for Node.js support\n * Respects pathPrefix and file aliases\n */\nexport async function fetchFile(\n url: string | Blob,\n options?: RequestInit & {fetch?: RequestInit | Function}\n): Promise<Response> {\n if (typeof url === 'string') {\n url = resolvePath(url);\n\n let fetchOptions: RequestInit = options as RequestInit;\n if (options?.fetch && typeof options?.fetch !== 'function') {\n fetchOptions = options.fetch;\n }\n\n return await fetch(url, fetchOptions);\n }\n\n return await makeResponse(url);\n}\n"],"mappings":";;;;;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AACA,IAAAC,cAAA,GAAAD,OAAA;AAAqD,SAY/BE,SAASA,CAAAC,EAAA,EAAAC,GAAA;EAAA,OAAAC,UAAA,CAAAC,KAAA,OAAAC,SAAA;AAAA;AAAA,SAAAF,WAAA;EAAAA,UAAA,OAAAG,kBAAA,CAAAC,OAAA,EAAAC,YAAA,CAAAD,OAAA,CAAAE,IAAA,CAAxB,SAAAC,QACLC,GAAkB,EAClBC,OAAwD;IAAA,IAAAC,YAAA;IAAA,OAAAL,YAAA,CAAAD,OAAA,CAAAO,IAAA,UAAAC,SAAAC,QAAA;MAAA,kBAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAE,IAAA;QAAA;UAAA,MAEpD,OAAOP,GAAG,KAAK,QAAQ;YAAAK,QAAA,CAAAE,IAAA;YAAA;UAAA;UACzBP,GAAG,GAAG,IAAAQ,wBAAW,EAACR,GAAG,CAAC;UAElBE,YAAyB,GAAGD,OAAO;UACvC,IAAIA,OAAO,aAAPA,OAAO,eAAPA,OAAO,CAAEQ,KAAK,IAAI,QAAOR,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEQ,KAAK,MAAK,UAAU,EAAE;YAC1DP,YAAY,GAAGD,OAAO,CAACQ,KAAK;UAC9B;UAACJ,QAAA,CAAAE,IAAA;UAAA,OAEYE,KAAK,CAACT,GAAG,EAAEE,YAAY,CAAC;QAAA;UAAA,OAAAG,QAAA,CAAAK,MAAA,WAAAL,QAAA,CAAAM,IAAA;QAAA;UAAAN,QAAA,CAAAE,IAAA;UAAA,OAG1B,IAAAK,2BAAY,EAACZ,GAAG,CAAC;QAAA;UAAA,OAAAK,QAAA,CAAAK,MAAA,WAAAL,QAAA,CAAAM,IAAA;QAAA;QAAA;UAAA,OAAAN,QAAA,CAAAQ,IAAA;MAAA;IAAA,GAAAd,OAAA;EAAA,CAC/B;EAAA,OAAAP,UAAA,CAAAC,KAAA,OAAAC,SAAA;AAAA"}
1
+ {"version":3,"file":"fetch-file.js","names":["_loaderUtils","require","_responseUtils","node","_interopRequireWildcard","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","_typeof","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","isNodePath","url","isRequestURL","isDataURL","startsWith","fetchFile","_x","_x2","_fetchFile","apply","arguments","_asyncToGenerator2","_regenerator","mark","_callee","urlOrData","fetchOptions","wrap","_callee$","_context","prev","next","resolvePath","fetchFileNode","abrupt","fetch","sent","makeResponse","stop"],"sources":["../../../../src/lib/fetch/fetch-file.ts"],"sourcesContent":["// loaders.gl, MIT license\n\nimport {resolvePath} from '@loaders.gl/loader-utils';\nimport {makeResponse} from '../utils/response-utils';\nimport * as node from './fetch-file.node';\n\nexport function isNodePath(url: string): boolean {\n return !isRequestURL(url) && !isDataURL(url);\n}\n\nexport function isRequestURL(url: string): boolean {\n return url.startsWith('http:') || url.startsWith('https:');\n}\n\nexport function isDataURL(url: string): boolean {\n return url.startsWith('data:');\n}\n\n/**\n * fetch API compatible function\n * - Supports fetching from Node.js local file system paths\n * - Respects pathPrefix and file aliases\n */\nexport async function fetchFile(\n urlOrData: string | Blob,\n fetchOptions?: RequestInit\n): Promise<Response> {\n if (typeof urlOrData === 'string') {\n const url = resolvePath(urlOrData);\n\n // Support fetching from local file system\n if (isNodePath(url) && node?.fetchFileNode) {\n return node.fetchFileNode(url, fetchOptions);\n }\n\n // Call global fetch\n return await fetch(url, fetchOptions);\n }\n\n // TODO - should we still call fetch on non-URL inputs?\n return await makeResponse(urlOrData);\n}\n"],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.fetchFileNode = fetchFileNode;
8
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
10
+ var _loaderUtils = require("@loaders.gl/loader-utils");
11
+ function fetchFileNode(_x, _x2) {
12
+ return _fetchFileNode.apply(this, arguments);
13
+ }
14
+ function _fetchFileNode() {
15
+ _fetchFileNode = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee(url, options) {
16
+ var FILE_PROTOCOL_REGEX, noqueryUrl, body, status, statusText, headers, response, errorMessage, _status, _statusText, _headers, _response;
17
+ return _regenerator.default.wrap(function _callee$(_context) {
18
+ while (1) switch (_context.prev = _context.next) {
19
+ case 0:
20
+ FILE_PROTOCOL_REGEX = /^file:\/\//;
21
+ url.replace(FILE_PROTOCOL_REGEX, '/');
22
+ noqueryUrl = url.split('?')[0];
23
+ _context.prev = 3;
24
+ _context.next = 6;
25
+ return new Promise(function (resolve, reject) {
26
+ var stream = _loaderUtils.fs.createReadStream(noqueryUrl, {
27
+ encoding: null
28
+ });
29
+ stream.once('readable', function () {
30
+ return resolve(stream);
31
+ });
32
+ stream.on('error', function (error) {
33
+ return reject(error);
34
+ });
35
+ });
36
+ case 6:
37
+ body = _context.sent;
38
+ status = 200;
39
+ statusText = 'OK';
40
+ headers = getHeadersForFile(noqueryUrl);
41
+ response = new Response(body, {
42
+ headers: headers,
43
+ status: status,
44
+ statusText: statusText
45
+ });
46
+ Object.defineProperty(response, 'url', {
47
+ value: url
48
+ });
49
+ return _context.abrupt("return", response);
50
+ case 15:
51
+ _context.prev = 15;
52
+ _context.t0 = _context["catch"](3);
53
+ errorMessage = _context.t0.message;
54
+ _status = 400;
55
+ _statusText = errorMessage;
56
+ _headers = {};
57
+ _response = new Response(errorMessage, {
58
+ headers: _headers,
59
+ status: _status,
60
+ statusText: _statusText
61
+ });
62
+ Object.defineProperty(_response, 'url', {
63
+ value: url
64
+ });
65
+ return _context.abrupt("return", _response);
66
+ case 24:
67
+ case "end":
68
+ return _context.stop();
69
+ }
70
+ }, _callee, null, [[3, 15]]);
71
+ }));
72
+ return _fetchFileNode.apply(this, arguments);
73
+ }
74
+ function getHeadersForFile(noqueryUrl) {
75
+ var headers = {};
76
+ if (!headers['content-length']) {
77
+ var stats = _loaderUtils.fs.statSync(noqueryUrl);
78
+ headers['content-length'] = stats.size;
79
+ }
80
+ if (noqueryUrl.endsWith('.gz')) {
81
+ noqueryUrl = noqueryUrl.slice(0, -3);
82
+ headers['content-encoding'] = 'gzip';
83
+ }
84
+ return new Headers(headers);
85
+ }
86
+ //# sourceMappingURL=fetch-file.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-file.node.js","names":["_loaderUtils","require","fetchFileNode","_x","_x2","_fetchFileNode","apply","arguments","_asyncToGenerator2","default","_regenerator","mark","_callee","url","options","FILE_PROTOCOL_REGEX","noqueryUrl","body","status","statusText","headers","response","errorMessage","_status","_statusText","_headers","_response","wrap","_callee$","_context","prev","next","replace","split","Promise","resolve","reject","stream","fs","createReadStream","encoding","once","on","error","sent","getHeadersForFile","Response","Object","defineProperty","value","abrupt","t0","message","stop","stats","statSync","size","endsWith","slice","Headers"],"sources":["../../../../src/lib/fetch/fetch-file.node.ts"],"sourcesContent":["// loaders.gl, MIT license\n\nimport {fs} from '@loaders.gl/loader-utils';\n\n/**\n * Enables\n * @param url\n * @param options\n * @returns\n */\nexport async function fetchFileNode(url: string, options): Promise<Response> {\n // Support `file://` protocol\n const FILE_PROTOCOL_REGEX = /^file:\\/\\//;\n url.replace(FILE_PROTOCOL_REGEX, '/');\n\n const noqueryUrl = url.split('?')[0];\n\n try {\n // Now open the stream\n const body = await new Promise<fs.ReadStream>((resolve, reject) => {\n // @ts-ignore\n const stream = fs.createReadStream(noqueryUrl, {encoding: null});\n stream.once('readable', () => resolve(stream));\n stream.on('error', (error) => reject(error));\n });\n\n const status = 200;\n const statusText = 'OK';\n const headers = getHeadersForFile(noqueryUrl);\n // @ts-expect-error\n const response = new Response(body, {headers, status, statusText});\n Object.defineProperty(response, 'url', {value: url});\n return response;\n } catch (error) {\n const errorMessage = (error as Error).message;\n const status = 400;\n const statusText = errorMessage;\n const headers = {};\n const response = new Response(errorMessage, {headers, status, statusText});\n Object.defineProperty(response, 'url', {value: url});\n return response;\n }\n}\n\nfunction getHeadersForFile(noqueryUrl: string): Headers {\n const headers = {};\n\n // Fix up content length if we can for best progress experience\n if (!headers['content-length']) {\n const stats = fs.statSync(noqueryUrl);\n headers['content-length'] = stats.size;\n }\n\n // Automatically decompress gzipped files with .gz extension\n if (noqueryUrl.endsWith('.gz')) {\n noqueryUrl = noqueryUrl.slice(0, -3);\n headers['content-encoding'] = 'gzip';\n }\n\n return new Headers(headers);\n}\n"],"mappings":"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"}
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
  var _log = require("./utils/log");
8
- var version = typeof "4.0.0-alpha.16" !== 'undefined' ? "4.0.0-alpha.16" : '';
8
+ var version = typeof "4.0.0-alpha.18" !== 'undefined' ? "4.0.0-alpha.18" : '';
9
9
  if (!globalThis.loaders) {
10
10
  _log.log.log(1, "loaders.gl ".concat(version))();
11
11
  globalThis.loaders = Object.assign(globalThis.loaders || {}, {
@@ -51,7 +51,7 @@ function checkFetchResponseStatusSync(response) {
51
51
  }
52
52
  }
53
53
  function getErrorText(text) {
54
- var matches = text.match('<pre>(.*)</pre>');
54
+ var matches = /<pre>(.*)<\/pre>/.exec(text);
55
55
  return matches ? matches[1] : " ".concat(text.slice(0, 10), "...");
56
56
  }
57
57
  //# sourceMappingURL=check-errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"check-errors.js","names":["checkFetchResponseStatus","_x","_checkFetchResponseStatus","apply","arguments","_asyncToGenerator2","default","_regenerator","mark","_callee","response","errorMessage","text","wrap","_callee$","_context","prev","next","ok","concat","status","statusText","sent","getErrorText","t0","Error","stop","checkFetchResponseStatusSync","matches","match","slice"],"sources":["../../../../src/lib/loader-utils/check-errors.ts"],"sourcesContent":["export async function checkFetchResponseStatus(response) {\n if (!response.ok) {\n let errorMessage = `fetch failed ${response.status} ${response.statusText}`;\n try {\n const text = await response.text();\n if (text) {\n errorMessage += `: ${getErrorText(text)}`;\n }\n } catch (error) {\n // ignore error\n }\n throw new Error(errorMessage);\n }\n}\n\nexport function checkFetchResponseStatusSync(response) {\n if (!response.ok) {\n throw new Error(`fetch failed ${response.status}`);\n }\n}\n\nfunction getErrorText(text) {\n // Look for HTML error texts\n const matches = text.match('<pre>(.*)</pre>');\n return matches ? matches[1] : ` ${text.slice(0, 10)}...`;\n}\n"],"mappings":";;;;;;;;;;SAAsBA,wBAAwBA,CAAAC,EAAA;EAAA,OAAAC,yBAAA,CAAAC,KAAA,OAAAC,SAAA;AAAA;AAAA,SAAAF,0BAAA;EAAAA,yBAAA,OAAAG,kBAAA,CAAAC,OAAA,EAAAC,YAAA,CAAAD,OAAA,CAAAE,IAAA,CAAvC,SAAAC,QAAwCC,QAAQ;IAAA,IAAAC,YAAA,EAAAC,IAAA;IAAA,OAAAL,YAAA,CAAAD,OAAA,CAAAO,IAAA,UAAAC,SAAAC,QAAA;MAAA,kBAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAE,IAAA;QAAA;UAAA,IAChDP,QAAQ,CAACQ,EAAE;YAAAH,QAAA,CAAAE,IAAA;YAAA;UAAA;UACVN,YAAY,mBAAAQ,MAAA,CAAmBT,QAAQ,CAACU,MAAM,OAAAD,MAAA,CAAIT,QAAQ,CAACW,UAAU;UAAAN,QAAA,CAAAC,IAAA;UAAAD,QAAA,CAAAE,IAAA;UAAA,OAEpDP,QAAQ,CAACE,IAAI,CAAC,CAAC;QAAA;UAA5BA,IAAI,GAAAG,QAAA,CAAAO,IAAA;UACV,IAAIV,IAAI,EAAE;YACRD,YAAY,SAAAQ,MAAA,CAASI,YAAY,CAACX,IAAI,CAAC,CAAE;UAC3C;UAACG,QAAA,CAAAE,IAAA;UAAA;QAAA;UAAAF,QAAA,CAAAC,IAAA;UAAAD,QAAA,CAAAS,EAAA,GAAAT,QAAA;QAAA;UAAA,MAIG,IAAIU,KAAK,CAACd,YAAY,CAAC;QAAA;QAAA;UAAA,OAAAI,QAAA,CAAAW,IAAA;MAAA;IAAA,GAAAjB,OAAA;EAAA,CAEhC;EAAA,OAAAP,yBAAA,CAAAC,KAAA,OAAAC,SAAA;AAAA;AAEM,SAASuB,4BAA4BA,CAACjB,QAAQ,EAAE;EACrD,IAAI,CAACA,QAAQ,CAACQ,EAAE,EAAE;IAChB,MAAM,IAAIO,KAAK,iBAAAN,MAAA,CAAiBT,QAAQ,CAACU,MAAM,CAAE,CAAC;EACpD;AACF;AAEA,SAASG,YAAYA,CAACX,IAAI,EAAE;EAE1B,IAAMgB,OAAO,GAAGhB,IAAI,CAACiB,KAAK,CAAC,iBAAiB,CAAC;EAC7C,OAAOD,OAAO,GAAGA,OAAO,CAAC,CAAC,CAAC,OAAAT,MAAA,CAAOP,IAAI,CAACkB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,QAAK;AAC1D"}
1
+ {"version":3,"file":"check-errors.js","names":["checkFetchResponseStatus","_x","_checkFetchResponseStatus","apply","arguments","_asyncToGenerator2","default","_regenerator","mark","_callee","response","errorMessage","text","wrap","_callee$","_context","prev","next","ok","concat","status","statusText","sent","getErrorText","t0","Error","stop","checkFetchResponseStatusSync","matches","exec","slice"],"sources":["../../../../src/lib/loader-utils/check-errors.ts"],"sourcesContent":["// loaders.gl, MIT license\n\n/**\n * Check reponse status, if not OK extract error message and throw error\n * @param response\n */\nexport async function checkFetchResponseStatus(response: Response): Promise<void> {\n if (!response.ok) {\n let errorMessage = `fetch failed ${response.status} ${response.statusText}`;\n try {\n const text = await response.text();\n if (text) {\n errorMessage += `: ${getErrorText(text)}`;\n }\n } catch (error) {\n // ignore error\n }\n throw new Error(errorMessage);\n }\n}\n\n/**\n * Check response status synchronously, if not OK extract error message and throw error\n * Not able to extract as good an error message as the async version\n * @param response\n */\nexport function checkFetchResponseStatusSync(response: Response): void {\n if (!response.ok) {\n throw new Error(`fetch failed ${response.status}`);\n }\n}\n\n/**\n * Ad-hoc error message extractor\n * @todo Handle XML, JSON, etc\n * @param text\n * @returns\n */\nfunction getErrorText(text: string): string {\n // Look for HTML error texts\n const matches = /<pre>(.*)<\\/pre>/.exec(text);\n return matches ? matches[1] : ` ${text.slice(0, 10)}...`;\n}\n"],"mappings":";;;;;;;;;;SAMsBA,wBAAwBA,CAAAC,EAAA;EAAA,OAAAC,yBAAA,CAAAC,KAAA,OAAAC,SAAA;AAAA;AAAA,SAAAF,0BAAA;EAAAA,yBAAA,OAAAG,kBAAA,CAAAC,OAAA,EAAAC,YAAA,CAAAD,OAAA,CAAAE,IAAA,CAAvC,SAAAC,QAAwCC,QAAkB;IAAA,IAAAC,YAAA,EAAAC,IAAA;IAAA,OAAAL,YAAA,CAAAD,OAAA,CAAAO,IAAA,UAAAC,SAAAC,QAAA;MAAA,kBAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAE,IAAA;QAAA;UAAA,IAC1DP,QAAQ,CAACQ,EAAE;YAAAH,QAAA,CAAAE,IAAA;YAAA;UAAA;UACVN,YAAY,mBAAAQ,MAAA,CAAmBT,QAAQ,CAACU,MAAM,OAAAD,MAAA,CAAIT,QAAQ,CAACW,UAAU;UAAAN,QAAA,CAAAC,IAAA;UAAAD,QAAA,CAAAE,IAAA;UAAA,OAEpDP,QAAQ,CAACE,IAAI,CAAC,CAAC;QAAA;UAA5BA,IAAI,GAAAG,QAAA,CAAAO,IAAA;UACV,IAAIV,IAAI,EAAE;YACRD,YAAY,SAAAQ,MAAA,CAASI,YAAY,CAACX,IAAI,CAAC,CAAE;UAC3C;UAACG,QAAA,CAAAE,IAAA;UAAA;QAAA;UAAAF,QAAA,CAAAC,IAAA;UAAAD,QAAA,CAAAS,EAAA,GAAAT,QAAA;QAAA;UAAA,MAIG,IAAIU,KAAK,CAACd,YAAY,CAAC;QAAA;QAAA;UAAA,OAAAI,QAAA,CAAAW,IAAA;MAAA;IAAA,GAAAjB,OAAA;EAAA,CAEhC;EAAA,OAAAP,yBAAA,CAAAC,KAAA,OAAAC,SAAA;AAAA;AAOM,SAASuB,4BAA4BA,CAACjB,QAAkB,EAAQ;EACrE,IAAI,CAACA,QAAQ,CAACQ,EAAE,EAAE;IAChB,MAAM,IAAIO,KAAK,iBAAAN,MAAA,CAAiBT,QAAQ,CAACU,MAAM,CAAE,CAAC;EACpD;AACF;AAQA,SAASG,YAAYA,CAACX,IAAY,EAAU;EAE1C,IAAMgB,OAAO,GAAG,kBAAkB,CAACC,IAAI,CAACjB,IAAI,CAAC;EAC7C,OAAOgB,OAAO,GAAGA,OAAO,CAAC,CAAC,CAAC,OAAAT,MAAA,CAAOP,IAAI,CAACkB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,QAAK;AAC1D"}
@@ -11,7 +11,7 @@ var _awaitAsyncGenerator2 = _interopRequireDefault(require("@babel/runtime/helpe
11
11
  var _wrapAsyncGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/wrapAsyncGenerator"));
12
12
  function _asyncIterator(iterable) { var method, async, sync, retry = 2; for ("undefined" != typeof Symbol && (async = Symbol.asyncIterator, sync = Symbol.iterator); retry--;) { if (async && null != (method = iterable[async])) return method.call(iterable); if (sync && null != (method = iterable[sync])) return new AsyncFromSyncIterator(method.call(iterable)); async = "@@asyncIterator", sync = "@@iterator"; } throw new TypeError("Object is not async iterable"); }
13
13
  function AsyncFromSyncIterator(s) { function AsyncFromSyncIteratorContinuation(r) { if (Object(r) !== r) return Promise.reject(new TypeError(r + " is not an object.")); var done = r.done; return Promise.resolve(r.value).then(function (value) { return { value: value, done: done }; }); } return AsyncFromSyncIterator = function AsyncFromSyncIterator(s) { this.s = s, this.n = s.next; }, AsyncFromSyncIterator.prototype = { s: null, n: null, next: function next() { return AsyncFromSyncIteratorContinuation(this.n.apply(this.s, arguments)); }, return: function _return(value) { var ret = this.s.return; return void 0 === ret ? Promise.resolve({ value: value, done: !0 }) : AsyncFromSyncIteratorContinuation(ret.apply(this.s, arguments)); }, throw: function _throw(value) { var thr = this.s.return; return void 0 === thr ? Promise.reject(value) : AsyncFromSyncIteratorContinuation(thr.apply(this.s, arguments)); } }, new AsyncFromSyncIterator(s); }
14
- var VERSION = typeof "4.0.0-alpha.16" !== 'undefined' ? "4.0.0-alpha.16" : 'latest';
14
+ var VERSION = typeof "4.0.0-alpha.18" !== 'undefined' ? "4.0.0-alpha.18" : 'latest';
15
15
  var NullWorkerLoader = {
16
16
  name: 'Null loader',
17
17
  id: 'null',
@@ -1,14 +1,23 @@
1
1
  import { resolvePath } from '@loaders.gl/loader-utils';
2
2
  import { makeResponse } from '../utils/response-utils';
3
- export async function fetchFile(url, options) {
4
- if (typeof url === 'string') {
5
- url = resolvePath(url);
6
- let fetchOptions = options;
7
- if (options !== null && options !== void 0 && options.fetch && typeof (options === null || options === void 0 ? void 0 : options.fetch) !== 'function') {
8
- fetchOptions = options.fetch;
3
+ import * as node from './fetch-file.node';
4
+ export function isNodePath(url) {
5
+ return !isRequestURL(url) && !isDataURL(url);
6
+ }
7
+ export function isRequestURL(url) {
8
+ return url.startsWith('http:') || url.startsWith('https:');
9
+ }
10
+ export function isDataURL(url) {
11
+ return url.startsWith('data:');
12
+ }
13
+ export async function fetchFile(urlOrData, fetchOptions) {
14
+ if (typeof urlOrData === 'string') {
15
+ const url = resolvePath(urlOrData);
16
+ if (isNodePath(url) && node !== null && node !== void 0 && node.fetchFileNode) {
17
+ return node.fetchFileNode(url, fetchOptions);
9
18
  }
10
19
  return await fetch(url, fetchOptions);
11
20
  }
12
- return await makeResponse(url);
21
+ return await makeResponse(urlOrData);
13
22
  }
14
23
  //# sourceMappingURL=fetch-file.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fetch-file.js","names":["resolvePath","makeResponse","fetchFile","url","options","fetchOptions","fetch"],"sources":["../../../../src/lib/fetch/fetch-file.ts"],"sourcesContent":["import {resolvePath} from '@loaders.gl/loader-utils';\nimport {makeResponse} from '../utils/response-utils';\n// import {getErrorMessageFromResponse} from './fetch-error-message';\n\n/**\n * fetch compatible function\n * Reads file data from:\n * - http/http urls\n * - data urls\n * - File/Blob objects\n * Leverages `@loaders.gl/polyfills` for Node.js support\n * Respects pathPrefix and file aliases\n */\nexport async function fetchFile(\n url: string | Blob,\n options?: RequestInit & {fetch?: RequestInit | Function}\n): Promise<Response> {\n if (typeof url === 'string') {\n url = resolvePath(url);\n\n let fetchOptions: RequestInit = options as RequestInit;\n if (options?.fetch && typeof options?.fetch !== 'function') {\n fetchOptions = options.fetch;\n }\n\n return await fetch(url, fetchOptions);\n }\n\n return await makeResponse(url);\n}\n"],"mappings":"AAAA,SAAQA,WAAW,QAAO,0BAA0B;AACpD,SAAQC,YAAY,QAAO,yBAAyB;AAYpD,OAAO,eAAeC,SAASA,CAC7BC,GAAkB,EAClBC,OAAwD,EACrC;EACnB,IAAI,OAAOD,GAAG,KAAK,QAAQ,EAAE;IAC3BA,GAAG,GAAGH,WAAW,CAACG,GAAG,CAAC;IAEtB,IAAIE,YAAyB,GAAGD,OAAsB;IACtD,IAAIA,OAAO,aAAPA,OAAO,eAAPA,OAAO,CAAEE,KAAK,IAAI,QAAOF,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEE,KAAK,MAAK,UAAU,EAAE;MAC1DD,YAAY,GAAGD,OAAO,CAACE,KAAK;IAC9B;IAEA,OAAO,MAAMA,KAAK,CAACH,GAAG,EAAEE,YAAY,CAAC;EACvC;EAEA,OAAO,MAAMJ,YAAY,CAACE,GAAG,CAAC;AAChC"}
1
+ {"version":3,"file":"fetch-file.js","names":["resolvePath","makeResponse","node","isNodePath","url","isRequestURL","isDataURL","startsWith","fetchFile","urlOrData","fetchOptions","fetchFileNode","fetch"],"sources":["../../../../src/lib/fetch/fetch-file.ts"],"sourcesContent":["// loaders.gl, MIT license\n\nimport {resolvePath} from '@loaders.gl/loader-utils';\nimport {makeResponse} from '../utils/response-utils';\nimport * as node from './fetch-file.node';\n\nexport function isNodePath(url: string): boolean {\n return !isRequestURL(url) && !isDataURL(url);\n}\n\nexport function isRequestURL(url: string): boolean {\n return url.startsWith('http:') || url.startsWith('https:');\n}\n\nexport function isDataURL(url: string): boolean {\n return url.startsWith('data:');\n}\n\n/**\n * fetch API compatible function\n * - Supports fetching from Node.js local file system paths\n * - Respects pathPrefix and file aliases\n */\nexport async function fetchFile(\n urlOrData: string | Blob,\n fetchOptions?: RequestInit\n): Promise<Response> {\n if (typeof urlOrData === 'string') {\n const url = resolvePath(urlOrData);\n\n // Support fetching from local file system\n if (isNodePath(url) && node?.fetchFileNode) {\n return node.fetchFileNode(url, fetchOptions);\n }\n\n // Call global fetch\n return await fetch(url, fetchOptions);\n }\n\n // TODO - should we still call fetch on non-URL inputs?\n return await makeResponse(urlOrData);\n}\n"],"mappings":"AAEA,SAAQA,WAAW,QAAO,0BAA0B;AACpD,SAAQC,YAAY,QAAO,yBAAyB;AACpD,OAAO,KAAKC,IAAI,MAAM,mBAAmB;AAEzC,OAAO,SAASC,UAAUA,CAACC,GAAW,EAAW;EAC/C,OAAO,CAACC,YAAY,CAACD,GAAG,CAAC,IAAI,CAACE,SAAS,CAACF,GAAG,CAAC;AAC9C;AAEA,OAAO,SAASC,YAAYA,CAACD,GAAW,EAAW;EACjD,OAAOA,GAAG,CAACG,UAAU,CAAC,OAAO,CAAC,IAAIH,GAAG,CAACG,UAAU,CAAC,QAAQ,CAAC;AAC5D;AAEA,OAAO,SAASD,SAASA,CAACF,GAAW,EAAW;EAC9C,OAAOA,GAAG,CAACG,UAAU,CAAC,OAAO,CAAC;AAChC;AAOA,OAAO,eAAeC,SAASA,CAC7BC,SAAwB,EACxBC,YAA0B,EACP;EACnB,IAAI,OAAOD,SAAS,KAAK,QAAQ,EAAE;IACjC,MAAML,GAAG,GAAGJ,WAAW,CAACS,SAAS,CAAC;IAGlC,IAAIN,UAAU,CAACC,GAAG,CAAC,IAAIF,IAAI,aAAJA,IAAI,eAAJA,IAAI,CAAES,aAAa,EAAE;MAC1C,OAAOT,IAAI,CAACS,aAAa,CAACP,GAAG,EAAEM,YAAY,CAAC;IAC9C;IAGA,OAAO,MAAME,KAAK,CAACR,GAAG,EAAEM,YAAY,CAAC;EACvC;EAGA,OAAO,MAAMT,YAAY,CAACQ,SAAS,CAAC;AACtC"}
@@ -0,0 +1,54 @@
1
+ import { fs } from '@loaders.gl/loader-utils';
2
+ export async function fetchFileNode(url, options) {
3
+ const FILE_PROTOCOL_REGEX = /^file:\/\//;
4
+ url.replace(FILE_PROTOCOL_REGEX, '/');
5
+ const noqueryUrl = url.split('?')[0];
6
+ try {
7
+ const body = await new Promise((resolve, reject) => {
8
+ const stream = fs.createReadStream(noqueryUrl, {
9
+ encoding: null
10
+ });
11
+ stream.once('readable', () => resolve(stream));
12
+ stream.on('error', error => reject(error));
13
+ });
14
+ const status = 200;
15
+ const statusText = 'OK';
16
+ const headers = getHeadersForFile(noqueryUrl);
17
+ const response = new Response(body, {
18
+ headers,
19
+ status,
20
+ statusText
21
+ });
22
+ Object.defineProperty(response, 'url', {
23
+ value: url
24
+ });
25
+ return response;
26
+ } catch (error) {
27
+ const errorMessage = error.message;
28
+ const status = 400;
29
+ const statusText = errorMessage;
30
+ const headers = {};
31
+ const response = new Response(errorMessage, {
32
+ headers,
33
+ status,
34
+ statusText
35
+ });
36
+ Object.defineProperty(response, 'url', {
37
+ value: url
38
+ });
39
+ return response;
40
+ }
41
+ }
42
+ function getHeadersForFile(noqueryUrl) {
43
+ const headers = {};
44
+ if (!headers['content-length']) {
45
+ const stats = fs.statSync(noqueryUrl);
46
+ headers['content-length'] = stats.size;
47
+ }
48
+ if (noqueryUrl.endsWith('.gz')) {
49
+ noqueryUrl = noqueryUrl.slice(0, -3);
50
+ headers['content-encoding'] = 'gzip';
51
+ }
52
+ return new Headers(headers);
53
+ }
54
+ //# sourceMappingURL=fetch-file.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-file.node.js","names":["fs","fetchFileNode","url","options","FILE_PROTOCOL_REGEX","replace","noqueryUrl","split","body","Promise","resolve","reject","stream","createReadStream","encoding","once","on","error","status","statusText","headers","getHeadersForFile","response","Response","Object","defineProperty","value","errorMessage","message","stats","statSync","size","endsWith","slice","Headers"],"sources":["../../../../src/lib/fetch/fetch-file.node.ts"],"sourcesContent":["// loaders.gl, MIT license\n\nimport {fs} from '@loaders.gl/loader-utils';\n\n/**\n * Enables\n * @param url\n * @param options\n * @returns\n */\nexport async function fetchFileNode(url: string, options): Promise<Response> {\n // Support `file://` protocol\n const FILE_PROTOCOL_REGEX = /^file:\\/\\//;\n url.replace(FILE_PROTOCOL_REGEX, '/');\n\n const noqueryUrl = url.split('?')[0];\n\n try {\n // Now open the stream\n const body = await new Promise<fs.ReadStream>((resolve, reject) => {\n // @ts-ignore\n const stream = fs.createReadStream(noqueryUrl, {encoding: null});\n stream.once('readable', () => resolve(stream));\n stream.on('error', (error) => reject(error));\n });\n\n const status = 200;\n const statusText = 'OK';\n const headers = getHeadersForFile(noqueryUrl);\n // @ts-expect-error\n const response = new Response(body, {headers, status, statusText});\n Object.defineProperty(response, 'url', {value: url});\n return response;\n } catch (error) {\n const errorMessage = (error as Error).message;\n const status = 400;\n const statusText = errorMessage;\n const headers = {};\n const response = new Response(errorMessage, {headers, status, statusText});\n Object.defineProperty(response, 'url', {value: url});\n return response;\n }\n}\n\nfunction getHeadersForFile(noqueryUrl: string): Headers {\n const headers = {};\n\n // Fix up content length if we can for best progress experience\n if (!headers['content-length']) {\n const stats = fs.statSync(noqueryUrl);\n headers['content-length'] = stats.size;\n }\n\n // Automatically decompress gzipped files with .gz extension\n if (noqueryUrl.endsWith('.gz')) {\n noqueryUrl = noqueryUrl.slice(0, -3);\n headers['content-encoding'] = 'gzip';\n }\n\n return new Headers(headers);\n}\n"],"mappings":"AAEA,SAAQA,EAAE,QAAO,0BAA0B;AAQ3C,OAAO,eAAeC,aAAaA,CAACC,GAAW,EAAEC,OAAO,EAAqB;EAE3E,MAAMC,mBAAmB,GAAG,YAAY;EACxCF,GAAG,CAACG,OAAO,CAACD,mBAAmB,EAAE,GAAG,CAAC;EAErC,MAAME,UAAU,GAAGJ,GAAG,CAACK,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;EAEpC,IAAI;IAEF,MAAMC,IAAI,GAAG,MAAM,IAAIC,OAAO,CAAgB,CAACC,OAAO,EAAEC,MAAM,KAAK;MAEjE,MAAMC,MAAM,GAAGZ,EAAE,CAACa,gBAAgB,CAACP,UAAU,EAAE;QAACQ,QAAQ,EAAE;MAAI,CAAC,CAAC;MAChEF,MAAM,CAACG,IAAI,CAAC,UAAU,EAAE,MAAML,OAAO,CAACE,MAAM,CAAC,CAAC;MAC9CA,MAAM,CAACI,EAAE,CAAC,OAAO,EAAGC,KAAK,IAAKN,MAAM,CAACM,KAAK,CAAC,CAAC;IAC9C,CAAC,CAAC;IAEF,MAAMC,MAAM,GAAG,GAAG;IAClB,MAAMC,UAAU,GAAG,IAAI;IACvB,MAAMC,OAAO,GAAGC,iBAAiB,CAACf,UAAU,CAAC;IAE7C,MAAMgB,QAAQ,GAAG,IAAIC,QAAQ,CAACf,IAAI,EAAE;MAACY,OAAO;MAAEF,MAAM;MAAEC;IAAU,CAAC,CAAC;IAClEK,MAAM,CAACC,cAAc,CAACH,QAAQ,EAAE,KAAK,EAAE;MAACI,KAAK,EAAExB;IAAG,CAAC,CAAC;IACpD,OAAOoB,QAAQ;EACjB,CAAC,CAAC,OAAOL,KAAK,EAAE;IACd,MAAMU,YAAY,GAAIV,KAAK,CAAWW,OAAO;IAC7C,MAAMV,MAAM,GAAG,GAAG;IAClB,MAAMC,UAAU,GAAGQ,YAAY;IAC/B,MAAMP,OAAO,GAAG,CAAC,CAAC;IAClB,MAAME,QAAQ,GAAG,IAAIC,QAAQ,CAACI,YAAY,EAAE;MAACP,OAAO;MAAEF,MAAM;MAAEC;IAAU,CAAC,CAAC;IAC1EK,MAAM,CAACC,cAAc,CAACH,QAAQ,EAAE,KAAK,EAAE;MAACI,KAAK,EAAExB;IAAG,CAAC,CAAC;IACpD,OAAOoB,QAAQ;EACjB;AACF;AAEA,SAASD,iBAAiBA,CAACf,UAAkB,EAAW;EACtD,MAAMc,OAAO,GAAG,CAAC,CAAC;EAGlB,IAAI,CAACA,OAAO,CAAC,gBAAgB,CAAC,EAAE;IAC9B,MAAMS,KAAK,GAAG7B,EAAE,CAAC8B,QAAQ,CAACxB,UAAU,CAAC;IACrCc,OAAO,CAAC,gBAAgB,CAAC,GAAGS,KAAK,CAACE,IAAI;EACxC;EAGA,IAAIzB,UAAU,CAAC0B,QAAQ,CAAC,KAAK,CAAC,EAAE;IAC9B1B,UAAU,GAAGA,UAAU,CAAC2B,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpCb,OAAO,CAAC,kBAAkB,CAAC,GAAG,MAAM;EACtC;EAEA,OAAO,IAAIc,OAAO,CAACd,OAAO,CAAC;AAC7B"}
@@ -1,5 +1,5 @@
1
1
  import { log } from './utils/log';
2
- const version = typeof "4.0.0-alpha.16" !== 'undefined' ? "4.0.0-alpha.16" : '';
2
+ const version = typeof "4.0.0-alpha.18" !== 'undefined' ? "4.0.0-alpha.18" : '';
3
3
  if (!globalThis.loaders) {
4
4
  log.log(1, "loaders.gl ".concat(version))();
5
5
  globalThis.loaders = Object.assign(globalThis.loaders || {}, {
@@ -16,7 +16,7 @@ export function checkFetchResponseStatusSync(response) {
16
16
  }
17
17
  }
18
18
  function getErrorText(text) {
19
- const matches = text.match('<pre>(.*)</pre>');
19
+ const matches = /<pre>(.*)<\/pre>/.exec(text);
20
20
  return matches ? matches[1] : " ".concat(text.slice(0, 10), "...");
21
21
  }
22
22
  //# sourceMappingURL=check-errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"check-errors.js","names":["checkFetchResponseStatus","response","ok","errorMessage","concat","status","statusText","text","getErrorText","error","Error","checkFetchResponseStatusSync","matches","match","slice"],"sources":["../../../../src/lib/loader-utils/check-errors.ts"],"sourcesContent":["export async function checkFetchResponseStatus(response) {\n if (!response.ok) {\n let errorMessage = `fetch failed ${response.status} ${response.statusText}`;\n try {\n const text = await response.text();\n if (text) {\n errorMessage += `: ${getErrorText(text)}`;\n }\n } catch (error) {\n // ignore error\n }\n throw new Error(errorMessage);\n }\n}\n\nexport function checkFetchResponseStatusSync(response) {\n if (!response.ok) {\n throw new Error(`fetch failed ${response.status}`);\n }\n}\n\nfunction getErrorText(text) {\n // Look for HTML error texts\n const matches = text.match('<pre>(.*)</pre>');\n return matches ? matches[1] : ` ${text.slice(0, 10)}...`;\n}\n"],"mappings":"AAAA,OAAO,eAAeA,wBAAwBA,CAACC,QAAQ,EAAE;EACvD,IAAI,CAACA,QAAQ,CAACC,EAAE,EAAE;IAChB,IAAIC,YAAY,mBAAAC,MAAA,CAAmBH,QAAQ,CAACI,MAAM,OAAAD,MAAA,CAAIH,QAAQ,CAACK,UAAU,CAAE;IAC3E,IAAI;MACF,MAAMC,IAAI,GAAG,MAAMN,QAAQ,CAACM,IAAI,CAAC,CAAC;MAClC,IAAIA,IAAI,EAAE;QACRJ,YAAY,SAAAC,MAAA,CAASI,YAAY,CAACD,IAAI,CAAC,CAAE;MAC3C;IACF,CAAC,CAAC,OAAOE,KAAK,EAAE,CAEhB;IACA,MAAM,IAAIC,KAAK,CAACP,YAAY,CAAC;EAC/B;AACF;AAEA,OAAO,SAASQ,4BAA4BA,CAACV,QAAQ,EAAE;EACrD,IAAI,CAACA,QAAQ,CAACC,EAAE,EAAE;IAChB,MAAM,IAAIQ,KAAK,iBAAAN,MAAA,CAAiBH,QAAQ,CAACI,MAAM,CAAE,CAAC;EACpD;AACF;AAEA,SAASG,YAAYA,CAACD,IAAI,EAAE;EAE1B,MAAMK,OAAO,GAAGL,IAAI,CAACM,KAAK,CAAC,iBAAiB,CAAC;EAC7C,OAAOD,OAAO,GAAGA,OAAO,CAAC,CAAC,CAAC,OAAAR,MAAA,CAAOG,IAAI,CAACO,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,QAAK;AAC1D"}
1
+ {"version":3,"file":"check-errors.js","names":["checkFetchResponseStatus","response","ok","errorMessage","concat","status","statusText","text","getErrorText","error","Error","checkFetchResponseStatusSync","matches","exec","slice"],"sources":["../../../../src/lib/loader-utils/check-errors.ts"],"sourcesContent":["// loaders.gl, MIT license\n\n/**\n * Check reponse status, if not OK extract error message and throw error\n * @param response\n */\nexport async function checkFetchResponseStatus(response: Response): Promise<void> {\n if (!response.ok) {\n let errorMessage = `fetch failed ${response.status} ${response.statusText}`;\n try {\n const text = await response.text();\n if (text) {\n errorMessage += `: ${getErrorText(text)}`;\n }\n } catch (error) {\n // ignore error\n }\n throw new Error(errorMessage);\n }\n}\n\n/**\n * Check response status synchronously, if not OK extract error message and throw error\n * Not able to extract as good an error message as the async version\n * @param response\n */\nexport function checkFetchResponseStatusSync(response: Response): void {\n if (!response.ok) {\n throw new Error(`fetch failed ${response.status}`);\n }\n}\n\n/**\n * Ad-hoc error message extractor\n * @todo Handle XML, JSON, etc\n * @param text\n * @returns\n */\nfunction getErrorText(text: string): string {\n // Look for HTML error texts\n const matches = /<pre>(.*)<\\/pre>/.exec(text);\n return matches ? matches[1] : ` ${text.slice(0, 10)}...`;\n}\n"],"mappings":"AAMA,OAAO,eAAeA,wBAAwBA,CAACC,QAAkB,EAAiB;EAChF,IAAI,CAACA,QAAQ,CAACC,EAAE,EAAE;IAChB,IAAIC,YAAY,mBAAAC,MAAA,CAAmBH,QAAQ,CAACI,MAAM,OAAAD,MAAA,CAAIH,QAAQ,CAACK,UAAU,CAAE;IAC3E,IAAI;MACF,MAAMC,IAAI,GAAG,MAAMN,QAAQ,CAACM,IAAI,CAAC,CAAC;MAClC,IAAIA,IAAI,EAAE;QACRJ,YAAY,SAAAC,MAAA,CAASI,YAAY,CAACD,IAAI,CAAC,CAAE;MAC3C;IACF,CAAC,CAAC,OAAOE,KAAK,EAAE,CAEhB;IACA,MAAM,IAAIC,KAAK,CAACP,YAAY,CAAC;EAC/B;AACF;AAOA,OAAO,SAASQ,4BAA4BA,CAACV,QAAkB,EAAQ;EACrE,IAAI,CAACA,QAAQ,CAACC,EAAE,EAAE;IAChB,MAAM,IAAIQ,KAAK,iBAAAN,MAAA,CAAiBH,QAAQ,CAACI,MAAM,CAAE,CAAC;EACpD;AACF;AAQA,SAASG,YAAYA,CAACD,IAAY,EAAU;EAE1C,MAAMK,OAAO,GAAG,kBAAkB,CAACC,IAAI,CAACN,IAAI,CAAC;EAC7C,OAAOK,OAAO,GAAGA,OAAO,CAAC,CAAC,CAAC,OAAAR,MAAA,CAAOG,IAAI,CAACO,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,QAAK;AAC1D"}
@@ -1,4 +1,4 @@
1
- const VERSION = typeof "4.0.0-alpha.16" !== 'undefined' ? "4.0.0-alpha.16" : 'latest';
1
+ const VERSION = typeof "4.0.0-alpha.18" !== 'undefined' ? "4.0.0-alpha.18" : 'latest';
2
2
  export const NullWorkerLoader = {
3
3
  name: 'Null loader',
4
4
  id: 'null',
@@ -1,13 +1,10 @@
1
+ export declare function isNodePath(url: string): boolean;
2
+ export declare function isRequestURL(url: string): boolean;
3
+ export declare function isDataURL(url: string): boolean;
1
4
  /**
2
- * fetch compatible function
3
- * Reads file data from:
4
- * - http/http urls
5
- * - data urls
6
- * - File/Blob objects
7
- * Leverages `@loaders.gl/polyfills` for Node.js support
8
- * Respects pathPrefix and file aliases
5
+ * fetch API compatible function
6
+ * - Supports fetching from Node.js local file system paths
7
+ * - Respects pathPrefix and file aliases
9
8
  */
10
- export declare function fetchFile(url: string | Blob, options?: RequestInit & {
11
- fetch?: RequestInit | Function;
12
- }): Promise<Response>;
9
+ export declare function fetchFile(urlOrData: string | Blob, fetchOptions?: RequestInit): Promise<Response>;
13
10
  //# sourceMappingURL=fetch-file.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fetch-file.d.ts","sourceRoot":"","sources":["../../../src/lib/fetch/fetch-file.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,GAAG,IAAI,EAClB,OAAO,CAAC,EAAE,WAAW,GAAG;IAAC,KAAK,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAA;CAAC,GACvD,OAAO,CAAC,QAAQ,CAAC,CAanB"}
1
+ {"version":3,"file":"fetch-file.d.ts","sourceRoot":"","sources":["../../../src/lib/fetch/fetch-file.ts"],"names":[],"mappings":"AAMA,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE/C;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE9C;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,YAAY,CAAC,EAAE,WAAW,GACzB,OAAO,CAAC,QAAQ,CAAC,CAenB"}
@@ -1,27 +1,61 @@
1
1
  "use strict";
2
+ // loaders.gl, MIT license
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || function (mod) {
20
+ if (mod && mod.__esModule) return mod;
21
+ var result = {};
22
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
23
+ __setModuleDefault(result, mod);
24
+ return result;
25
+ };
2
26
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.fetchFile = void 0;
27
+ exports.fetchFile = exports.isDataURL = exports.isRequestURL = exports.isNodePath = void 0;
4
28
  const loader_utils_1 = require("@loaders.gl/loader-utils");
5
29
  const response_utils_1 = require("../utils/response-utils");
6
- // import {getErrorMessageFromResponse} from './fetch-error-message';
30
+ const node = __importStar(require("./fetch-file.node"));
31
+ function isNodePath(url) {
32
+ return !isRequestURL(url) && !isDataURL(url);
33
+ }
34
+ exports.isNodePath = isNodePath;
35
+ function isRequestURL(url) {
36
+ return url.startsWith('http:') || url.startsWith('https:');
37
+ }
38
+ exports.isRequestURL = isRequestURL;
39
+ function isDataURL(url) {
40
+ return url.startsWith('data:');
41
+ }
42
+ exports.isDataURL = isDataURL;
7
43
  /**
8
- * fetch compatible function
9
- * Reads file data from:
10
- * - http/http urls
11
- * - data urls
12
- * - File/Blob objects
13
- * Leverages `@loaders.gl/polyfills` for Node.js support
14
- * Respects pathPrefix and file aliases
44
+ * fetch API compatible function
45
+ * - Supports fetching from Node.js local file system paths
46
+ * - Respects pathPrefix and file aliases
15
47
  */
16
- async function fetchFile(url, options) {
17
- if (typeof url === 'string') {
18
- url = (0, loader_utils_1.resolvePath)(url);
19
- let fetchOptions = options;
20
- if (options?.fetch && typeof options?.fetch !== 'function') {
21
- fetchOptions = options.fetch;
48
+ async function fetchFile(urlOrData, fetchOptions) {
49
+ if (typeof urlOrData === 'string') {
50
+ const url = (0, loader_utils_1.resolvePath)(urlOrData);
51
+ // Support fetching from local file system
52
+ if (isNodePath(url) && node?.fetchFileNode) {
53
+ return node.fetchFileNode(url, fetchOptions);
22
54
  }
55
+ // Call global fetch
23
56
  return await fetch(url, fetchOptions);
24
57
  }
25
- return await (0, response_utils_1.makeResponse)(url);
58
+ // TODO - should we still call fetch on non-URL inputs?
59
+ return await (0, response_utils_1.makeResponse)(urlOrData);
26
60
  }
27
61
  exports.fetchFile = fetchFile;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Enables
3
+ * @param url
4
+ * @param options
5
+ * @returns
6
+ */
7
+ export declare function fetchFileNode(url: string, options: any): Promise<Response>;
8
+ //# sourceMappingURL=fetch-file.node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-file.node.d.ts","sourceRoot":"","sources":["../../../src/lib/fetch/fetch-file.node.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,KAAA,GAAG,OAAO,CAAC,QAAQ,CAAC,CAgC3E"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ // loaders.gl, MIT license
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.fetchFileNode = void 0;
5
+ const loader_utils_1 = require("@loaders.gl/loader-utils");
6
+ /**
7
+ * Enables
8
+ * @param url
9
+ * @param options
10
+ * @returns
11
+ */
12
+ async function fetchFileNode(url, options) {
13
+ // Support `file://` protocol
14
+ const FILE_PROTOCOL_REGEX = /^file:\/\//;
15
+ url.replace(FILE_PROTOCOL_REGEX, '/');
16
+ const noqueryUrl = url.split('?')[0];
17
+ try {
18
+ // Now open the stream
19
+ const body = await new Promise((resolve, reject) => {
20
+ // @ts-ignore
21
+ const stream = loader_utils_1.fs.createReadStream(noqueryUrl, { encoding: null });
22
+ stream.once('readable', () => resolve(stream));
23
+ stream.on('error', (error) => reject(error));
24
+ });
25
+ const status = 200;
26
+ const statusText = 'OK';
27
+ const headers = getHeadersForFile(noqueryUrl);
28
+ // @ts-expect-error
29
+ const response = new Response(body, { headers, status, statusText });
30
+ Object.defineProperty(response, 'url', { value: url });
31
+ return response;
32
+ }
33
+ catch (error) {
34
+ const errorMessage = error.message;
35
+ const status = 400;
36
+ const statusText = errorMessage;
37
+ const headers = {};
38
+ const response = new Response(errorMessage, { headers, status, statusText });
39
+ Object.defineProperty(response, 'url', { value: url });
40
+ return response;
41
+ }
42
+ }
43
+ exports.fetchFileNode = fetchFileNode;
44
+ function getHeadersForFile(noqueryUrl) {
45
+ const headers = {};
46
+ // Fix up content length if we can for best progress experience
47
+ if (!headers['content-length']) {
48
+ const stats = loader_utils_1.fs.statSync(noqueryUrl);
49
+ headers['content-length'] = stats.size;
50
+ }
51
+ // Automatically decompress gzipped files with .gz extension
52
+ if (noqueryUrl.endsWith('.gz')) {
53
+ noqueryUrl = noqueryUrl.slice(0, -3);
54
+ headers['content-encoding'] = 'gzip';
55
+ }
56
+ return new Headers(headers);
57
+ }
@@ -1,5 +1,5 @@
1
1
  /**
2
2
  * In a few cases (data URIs, node.js) "files" can be read synchronously
3
3
  */
4
- export declare function readFileSync(url: string, options?: object): string | ArrayBuffer | null;
4
+ export declare function readFileSync(url: string, options?: object): ArrayBuffer | null;
5
5
  //# sourceMappingURL=read-file.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"read-file.d.ts","sourceRoot":"","sources":["../../../src/lib/fetch/read-file.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,MAAW,+BAoB7D"}
1
+ {"version":3,"file":"read-file.d.ts","sourceRoot":"","sources":["../../../src/lib/fetch/read-file.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,MAAW,sBAoB7D"}
@@ -1,3 +1,12 @@
1
- export declare function checkFetchResponseStatus(response: any): Promise<void>;
2
- export declare function checkFetchResponseStatusSync(response: any): void;
1
+ /**
2
+ * Check reponse status, if not OK extract error message and throw error
3
+ * @param response
4
+ */
5
+ export declare function checkFetchResponseStatus(response: Response): Promise<void>;
6
+ /**
7
+ * Check response status synchronously, if not OK extract error message and throw error
8
+ * Not able to extract as good an error message as the async version
9
+ * @param response
10
+ */
11
+ export declare function checkFetchResponseStatusSync(response: Response): void;
3
12
  //# sourceMappingURL=check-errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"check-errors.d.ts","sourceRoot":"","sources":["../../../src/lib/loader-utils/check-errors.ts"],"names":[],"mappings":"AAAA,wBAAsB,wBAAwB,CAAC,QAAQ,KAAA,iBAatD;AAED,wBAAgB,4BAA4B,CAAC,QAAQ,KAAA,QAIpD"}
1
+ {"version":3,"file":"check-errors.d.ts","sourceRoot":"","sources":["../../../src/lib/loader-utils/check-errors.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAsB,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAahF;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAIrE"}
@@ -1,6 +1,11 @@
1
1
  "use strict";
2
+ // loaders.gl, MIT license
2
3
  Object.defineProperty(exports, "__esModule", { value: true });
3
4
  exports.checkFetchResponseStatusSync = exports.checkFetchResponseStatus = void 0;
5
+ /**
6
+ * Check reponse status, if not OK extract error message and throw error
7
+ * @param response
8
+ */
4
9
  async function checkFetchResponseStatus(response) {
5
10
  if (!response.ok) {
6
11
  let errorMessage = `fetch failed ${response.status} ${response.statusText}`;
@@ -17,14 +22,25 @@ async function checkFetchResponseStatus(response) {
17
22
  }
18
23
  }
19
24
  exports.checkFetchResponseStatus = checkFetchResponseStatus;
25
+ /**
26
+ * Check response status synchronously, if not OK extract error message and throw error
27
+ * Not able to extract as good an error message as the async version
28
+ * @param response
29
+ */
20
30
  function checkFetchResponseStatusSync(response) {
21
31
  if (!response.ok) {
22
32
  throw new Error(`fetch failed ${response.status}`);
23
33
  }
24
34
  }
25
35
  exports.checkFetchResponseStatusSync = checkFetchResponseStatusSync;
36
+ /**
37
+ * Ad-hoc error message extractor
38
+ * @todo Handle XML, JSON, etc
39
+ * @param text
40
+ * @returns
41
+ */
26
42
  function getErrorText(text) {
27
43
  // Look for HTML error texts
28
- const matches = text.match('<pre>(.*)</pre>');
44
+ const matches = /<pre>(.*)<\/pre>/.exec(text);
29
45
  return matches ? matches[1] : ` ${text.slice(0, 10)}...`;
30
46
  }
@@ -1,9 +1,8 @@
1
1
  import type { LoaderContext, LoaderOptions } from '@loaders.gl/loader-utils';
2
- import { fetchFile } from '../fetch/fetch-file';
3
2
  /**
4
3
  * Gets the current fetch function from options and context
5
4
  * @param options
6
5
  * @param context
7
6
  */
8
- export declare function getFetchFunction(options?: LoaderOptions, context?: Omit<LoaderContext, 'fetch'> & Partial<Pick<LoaderContext, 'fetch'>>): ((url: string, options?: RequestInit | undefined) => Promise<Response>) | typeof fetchFile;
7
+ export declare function getFetchFunction(options?: LoaderOptions, context?: Omit<LoaderContext, 'fetch'> & Partial<Pick<LoaderContext, 'fetch'>>): (url: string, options?: RequestInit | undefined) => Promise<Response>;
9
8
  //# sourceMappingURL=get-fetch-function.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-fetch-function.d.ts","sourceRoot":"","sources":["../../../src/lib/loader-utils/get-fetch-function.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,aAAa,EAAE,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAE3E,OAAO,EAAC,SAAS,EAAC,MAAM,qBAAqB,CAAC;AAG9C;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,CAAC,EAAE,aAAa,EACvB,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,8FAuB/E"}
1
+ {"version":3,"file":"get-fetch-function.d.ts","sourceRoot":"","sources":["../../../src/lib/loader-utils/get-fetch-function.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,aAAa,EAAE,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAK3E;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,CAAC,EAAE,aAAa,EACvB,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,yEAuB/E"}
@@ -201,7 +201,7 @@ async function parseData({ loader, arrayBuffer, options, context }) {
201
201
  }
202
202
 
203
203
  // src/null-loader.ts
204
- var VERSION = true ? "4.0.0-alpha.16" : "latest";
204
+ var VERSION = true ? "4.0.0-alpha.18" : "latest";
205
205
  function parseSync(arrayBuffer, options, context) {
206
206
  if (!options.null.echoParameters)
207
207
  return null;
@@ -184,7 +184,7 @@
184
184
  }
185
185
 
186
186
  // src/null-loader.ts
187
- var VERSION = true ? "4.0.0-alpha.16" : "latest";
187
+ var VERSION = true ? "4.0.0-alpha.18" : "latest";
188
188
  function parseSync(arrayBuffer, options, context) {
189
189
  if (!options.null.echoParameters)
190
190
  return null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loaders.gl/core",
3
- "version": "4.0.0-alpha.16",
3
+ "version": "4.0.0-alpha.18",
4
4
  "description": "The core API for working with loaders.gl loaders and writers",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -24,6 +24,10 @@
24
24
  "browser": {
25
25
  "fs": false,
26
26
  "stream": false,
27
+ "./src/lib/fetch/fetch-file.node.ts": false,
28
+ "./dist/lib/fetch/fetch-file.node.js": false,
29
+ "./dist/es5/lib/fetch/fetch-file.node.js": false,
30
+ "./dist/esm/lib/fetch/fetch-file.node.js": false,
27
31
  "./src/iterators/make-stream/make-node-stream.ts": "./src/iterators/make-stream/make-dom-stream.ts",
28
32
  "./src/iterators/make-stream/make-node-stream.js": "./src/iterators/make-stream/make-dom-stream.js",
29
33
  "./dist/iterators/make-stream/make-node-stream.js": "./dist/iterators/make-stream/make-dom-stream.js",
@@ -43,9 +47,9 @@
43
47
  },
44
48
  "dependencies": {
45
49
  "@babel/runtime": "^7.3.1",
46
- "@loaders.gl/loader-utils": "4.0.0-alpha.16",
47
- "@loaders.gl/worker-utils": "4.0.0-alpha.16",
50
+ "@loaders.gl/loader-utils": "4.0.0-alpha.18",
51
+ "@loaders.gl/worker-utils": "4.0.0-alpha.18",
48
52
  "@probe.gl/log": "^4.0.2"
49
53
  },
50
- "gitHead": "87e9714165c3ce143a04ac45bbd9d922006f1b63"
54
+ "gitHead": "7bc633f46560f661bdd46cf1015ea27b3694ebce"
51
55
  }
@@ -0,0 +1,61 @@
1
+ // loaders.gl, MIT license
2
+
3
+ import {fs} from '@loaders.gl/loader-utils';
4
+
5
+ /**
6
+ * Enables
7
+ * @param url
8
+ * @param options
9
+ * @returns
10
+ */
11
+ export async function fetchFileNode(url: string, options): Promise<Response> {
12
+ // Support `file://` protocol
13
+ const FILE_PROTOCOL_REGEX = /^file:\/\//;
14
+ url.replace(FILE_PROTOCOL_REGEX, '/');
15
+
16
+ const noqueryUrl = url.split('?')[0];
17
+
18
+ try {
19
+ // Now open the stream
20
+ const body = await new Promise<fs.ReadStream>((resolve, reject) => {
21
+ // @ts-ignore
22
+ const stream = fs.createReadStream(noqueryUrl, {encoding: null});
23
+ stream.once('readable', () => resolve(stream));
24
+ stream.on('error', (error) => reject(error));
25
+ });
26
+
27
+ const status = 200;
28
+ const statusText = 'OK';
29
+ const headers = getHeadersForFile(noqueryUrl);
30
+ // @ts-expect-error
31
+ const response = new Response(body, {headers, status, statusText});
32
+ Object.defineProperty(response, 'url', {value: url});
33
+ return response;
34
+ } catch (error) {
35
+ const errorMessage = (error as Error).message;
36
+ const status = 400;
37
+ const statusText = errorMessage;
38
+ const headers = {};
39
+ const response = new Response(errorMessage, {headers, status, statusText});
40
+ Object.defineProperty(response, 'url', {value: url});
41
+ return response;
42
+ }
43
+ }
44
+
45
+ function getHeadersForFile(noqueryUrl: string): Headers {
46
+ const headers = {};
47
+
48
+ // Fix up content length if we can for best progress experience
49
+ if (!headers['content-length']) {
50
+ const stats = fs.statSync(noqueryUrl);
51
+ headers['content-length'] = stats.size;
52
+ }
53
+
54
+ // Automatically decompress gzipped files with .gz extension
55
+ if (noqueryUrl.endsWith('.gz')) {
56
+ noqueryUrl = noqueryUrl.slice(0, -3);
57
+ headers['content-encoding'] = 'gzip';
58
+ }
59
+
60
+ return new Headers(headers);
61
+ }
@@ -1,30 +1,42 @@
1
+ // loaders.gl, MIT license
2
+
1
3
  import {resolvePath} from '@loaders.gl/loader-utils';
2
4
  import {makeResponse} from '../utils/response-utils';
3
- // import {getErrorMessageFromResponse} from './fetch-error-message';
5
+ import * as node from './fetch-file.node';
6
+
7
+ export function isNodePath(url: string): boolean {
8
+ return !isRequestURL(url) && !isDataURL(url);
9
+ }
10
+
11
+ export function isRequestURL(url: string): boolean {
12
+ return url.startsWith('http:') || url.startsWith('https:');
13
+ }
14
+
15
+ export function isDataURL(url: string): boolean {
16
+ return url.startsWith('data:');
17
+ }
4
18
 
5
19
  /**
6
- * fetch compatible function
7
- * Reads file data from:
8
- * - http/http urls
9
- * - data urls
10
- * - File/Blob objects
11
- * Leverages `@loaders.gl/polyfills` for Node.js support
12
- * Respects pathPrefix and file aliases
20
+ * fetch API compatible function
21
+ * - Supports fetching from Node.js local file system paths
22
+ * - Respects pathPrefix and file aliases
13
23
  */
14
24
  export async function fetchFile(
15
- url: string | Blob,
16
- options?: RequestInit & {fetch?: RequestInit | Function}
25
+ urlOrData: string | Blob,
26
+ fetchOptions?: RequestInit
17
27
  ): Promise<Response> {
18
- if (typeof url === 'string') {
19
- url = resolvePath(url);
28
+ if (typeof urlOrData === 'string') {
29
+ const url = resolvePath(urlOrData);
20
30
 
21
- let fetchOptions: RequestInit = options as RequestInit;
22
- if (options?.fetch && typeof options?.fetch !== 'function') {
23
- fetchOptions = options.fetch;
31
+ // Support fetching from local file system
32
+ if (isNodePath(url) && node?.fetchFileNode) {
33
+ return node.fetchFileNode(url, fetchOptions);
24
34
  }
25
35
 
36
+ // Call global fetch
26
37
  return await fetch(url, fetchOptions);
27
38
  }
28
39
 
29
- return await makeResponse(url);
40
+ // TODO - should we still call fetch on non-URL inputs?
41
+ return await makeResponse(urlOrData);
30
42
  }
@@ -1,4 +1,10 @@
1
- export async function checkFetchResponseStatus(response) {
1
+ // loaders.gl, MIT license
2
+
3
+ /**
4
+ * Check reponse status, if not OK extract error message and throw error
5
+ * @param response
6
+ */
7
+ export async function checkFetchResponseStatus(response: Response): Promise<void> {
2
8
  if (!response.ok) {
3
9
  let errorMessage = `fetch failed ${response.status} ${response.statusText}`;
4
10
  try {
@@ -13,14 +19,25 @@ export async function checkFetchResponseStatus(response) {
13
19
  }
14
20
  }
15
21
 
16
- export function checkFetchResponseStatusSync(response) {
22
+ /**
23
+ * Check response status synchronously, if not OK extract error message and throw error
24
+ * Not able to extract as good an error message as the async version
25
+ * @param response
26
+ */
27
+ export function checkFetchResponseStatusSync(response: Response): void {
17
28
  if (!response.ok) {
18
29
  throw new Error(`fetch failed ${response.status}`);
19
30
  }
20
31
  }
21
32
 
22
- function getErrorText(text) {
33
+ /**
34
+ * Ad-hoc error message extractor
35
+ * @todo Handle XML, JSON, etc
36
+ * @param text
37
+ * @returns
38
+ */
39
+ function getErrorText(text: string): string {
23
40
  // Look for HTML error texts
24
- const matches = text.match('<pre>(.*)</pre>');
41
+ const matches = /<pre>(.*)<\/pre>/.exec(text);
25
42
  return matches ? matches[1] : ` ${text.slice(0, 10)}...`;
26
43
  }