@putkoff/abstract-utilities 0.1.188 → 0.1.190

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/esm/index.js CHANGED
@@ -319,6 +319,240 @@ typeof SuppressedError === "function" ? SuppressedError : function (error, suppr
319
319
  return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
320
320
  };
321
321
 
322
+ // src/functions/read_utils/src/read_utils.ts
323
+ /**
324
+ * Reads a JSON file, either via Node’s fs (if available)
325
+ * or via window.fetch in the browser. Never throws — returns
326
+ * the parsed object or null on any error.
327
+ */
328
+ function readJsonFile(relativeOrAbsolutePath) {
329
+ return __awaiter(this, void 0, void 0, function* () {
330
+ // 1) Try Node.js fs
331
+ if (typeof process !== 'undefined' &&
332
+ process.versions != null &&
333
+ process.versions.node) {
334
+ try {
335
+ const fs = yield import('fs');
336
+ const path = yield import('path');
337
+ const filePath = path.isAbsolute(relativeOrAbsolutePath)
338
+ ? relativeOrAbsolutePath
339
+ : path.resolve(process.cwd(), relativeOrAbsolutePath);
340
+ const text = yield fs.promises.readFile(filePath, 'utf8');
341
+ return JSON.parse(text);
342
+ }
343
+ catch (_a) {
344
+ // swallow and fall back to browser
345
+ }
346
+ }
347
+ // 2) Try browser fetch
348
+ const fetchFn = safeGlobalProp('fetch');
349
+ if (typeof fetchFn !== 'function') {
350
+ return null;
351
+ }
352
+ // Resolve URL against document.baseURI if possible
353
+ let url = relativeOrAbsolutePath;
354
+ const baseURI = safeGlobalProp('document', 'baseURI');
355
+ if (baseURI) {
356
+ try {
357
+ url = new URL(relativeOrAbsolutePath, baseURI).href;
358
+ }
359
+ catch (_b) {
360
+ // keep url as-is
361
+ }
362
+ }
363
+ try {
364
+ const res = yield fetchFn(url);
365
+ if (!res.ok)
366
+ return null;
367
+ return (yield res.json());
368
+ }
369
+ catch (_c) {
370
+ return null;
371
+ }
372
+ });
373
+ }
374
+ function getConfigContent() {
375
+ return __awaiter(this, void 0, void 0, function* () {
376
+ try {
377
+ // `readJsonFile` should throw if the file isn’t there or isn’t valid JSON
378
+ const cfg = yield readJsonFile('./config.json');
379
+ return cfg;
380
+ }
381
+ catch (_a) {
382
+ // swallow errors & return null so callers can detect “no config”
383
+ return null;
384
+ }
385
+ });
386
+ }
387
+ // 2) Pull a single key out of that object
388
+ function getConfigVar() {
389
+ return __awaiter(this, arguments, void 0, function* (key = null) {
390
+ const cfg = yield getConfigContent();
391
+ if (cfg && typeof cfg === 'object' && key in cfg) {
392
+ return cfg[key];
393
+ }
394
+ return undefined;
395
+ });
396
+ }
397
+
398
+ // Constructs API URL from endpoint
399
+ /**
400
+ * Unwraps nested { result } fields until you hit a non-object or no more "result" keys.
401
+ */
402
+ function getResult(obj) {
403
+ let current = obj;
404
+ while (current &&
405
+ typeof current === "object" &&
406
+ Object.prototype.hasOwnProperty.call(current, "result")) {
407
+ current = current.result;
408
+ }
409
+ return current;
410
+ }
411
+ // Determines HTTP method, defaults to GET or POST based on body
412
+ function getMethod(method = null, body = null) {
413
+ const validMethods = ['GET', 'POST', 'PUT', 'PATCH', 'PULL'];
414
+ method = (method || '').toUpperCase();
415
+ if (!validMethods.includes(method)) {
416
+ method = body ? 'POST' : 'GET';
417
+ }
418
+ return method;
419
+ }
420
+ // Gets headers, skips JSON headers when body is FormData
421
+ function getHeaders(headers = {}, method = null, body = null) {
422
+ const result = Object.assign({}, headers);
423
+ // inject auth if missing
424
+ if (!result.Authorization) {
425
+ const token = getToken();
426
+ Object.assign(result, getAuthorizationHeader(result, token));
427
+ }
428
+ method = getMethod(method, body);
429
+ // if it’s a multipart FormData, let the browser set the boundary header
430
+ if (body instanceof FormData) {
431
+ return result;
432
+ }
433
+ // otherwise for POST/PUT/PATCH default to JSON
434
+ if (['POST', 'PUT', 'PATCH'].includes(method) && !result['Content-Type']) {
435
+ result['Content-Type'] = 'application/json';
436
+ }
437
+ return result;
438
+ }
439
+ // Prepares request body, serializes to JSON for non-GET requests
440
+ function getBody(body = null, method = null) {
441
+ method = getMethod(method, body);
442
+ if (method === 'GET') {
443
+ return undefined;
444
+ }
445
+ if (body) {
446
+ try {
447
+ return JSON.stringify(body);
448
+ }
449
+ catch (err) {
450
+ return body;
451
+ }
452
+ }
453
+ return undefined;
454
+ }
455
+ // Prepares fetch variables, passes FormData intact
456
+ function getFetchVars(headers = null, method = null, body = null) {
457
+ method = getMethod(method, body);
458
+ headers = getHeaders(headers || {}, method, body);
459
+ // only JSON-stringify non-FormData bodies
460
+ if (!(body instanceof FormData)) {
461
+ body = getBody(body, method);
462
+ }
463
+ return { method, headers, body };
464
+ }
465
+ /*
466
+ * parseResult no longer needs to worry about JSON vs HTML redirect errors;
467
+ * all 401/403 have already been handled above.
468
+ */
469
+ function parseResult(res) {
470
+ return __awaiter(this, void 0, void 0, function* () {
471
+ // runs checkResponse first, will throw if session is expired
472
+ res = checkResponse(res);
473
+ if (!res.ok) {
474
+ // for any other non-401 errors, you can still surface them
475
+ const errorText = yield res.text();
476
+ throw new Error(errorText || res.statusText);
477
+ }
478
+ // now safely parse JSON
479
+ return res.json();
480
+ });
481
+ }
482
+ /**
483
+ * Intercept 401/403 and force a clean redirect to login
484
+ * without ever showing an alert.
485
+ */
486
+ function checkResponse(res) {
487
+ if (res.status === 401 || res.status === 403) {
488
+ // 1) clear out the stale token
489
+ localStorage.removeItem("token");
490
+ // 2) replace history so "back" doesn’t re-trigger the protected route
491
+ window.history.replaceState({}, "", "/secure-files");
492
+ // 3) short-circuit all further fetch logic
493
+ throw new Error("SessionExpired");
494
+ }
495
+ return res;
496
+ }
497
+ function fetchIt(endpoint_1) {
498
+ return __awaiter(this, arguments, void 0, function* (endpoint, body = null, method = null, headers = null, blob = false, configUrl = false, withCredentials = true, returnJson = true, returnReult = true) {
499
+ method = (method || "GET").toUpperCase();
500
+ // 2) choose the URL
501
+ let url = endpoint;
502
+ // 3) prepare headers & body
503
+ headers = Object.assign(Object.assign(Object.assign({}, (body instanceof FormData ? {} : { "Content-Type": "application/json" })), getAuthorizationHeader()), headers);
504
+ const opts = {
505
+ method,
506
+ credentials: withCredentials ? "include" : "same-origin",
507
+ headers,
508
+ body: body instanceof FormData
509
+ ? body
510
+ : body != null && method !== "GET"
511
+ ? JSON.stringify(body)
512
+ : undefined,
513
+ };
514
+ console.debug("➡️ secureFetchIt →", url, opts);
515
+ const res = yield fetch(url, opts);
516
+ if (!res.ok) {
517
+ const err = yield res.text();
518
+ throw new Error(`HTTP ${res.status}: ${err}`);
519
+ }
520
+ if (blob)
521
+ return res.blob();
522
+ if (returnReult)
523
+ return getResult(res.json());
524
+ if (returnJson)
525
+ return res.json();
526
+ return res;
527
+ });
528
+ }
529
+ // Constructs HTML directory path
530
+ function getHtmlDirectory(directory, filename) {
531
+ return `${directory}/${filename}.html`;
532
+ }
533
+ // Fetches HTML content
534
+ function fetchIndexHtml(filename_1) {
535
+ return __awaiter(this, arguments, void 0, function* (filename, directory = 'sf_index', base = 'html') {
536
+ const url = `/${base}/${directory}/${filename}.html`;
537
+ const response = yield fetch(url);
538
+ return yield response.text();
539
+ });
540
+ }
541
+ // Fetches and injects HTML content into container
542
+ function fetchIndexHtmlContainer(filename_1) {
543
+ return __awaiter(this, arguments, void 0, function* (filename, doc = document, directory = 'html') {
544
+ const container = `${filename}-container`;
545
+ const html = yield fetchIndexHtml(filename, directory);
546
+ const el = doc.getElementById(container);
547
+ if (el) {
548
+ el.innerHTML = html;
549
+ }
550
+ else {
551
+ console.warn(`⚠️ No container found for: #${container}`);
552
+ }
553
+ });
554
+ }
555
+
322
556
  function assertPath(path) {
323
557
  if (typeof path !== 'string') {
324
558
  throw new TypeError('Path must be a string. Received ' + JSON.stringify(path));
@@ -1151,57 +1385,39 @@ function alertit(obj = null) {
1151
1385
  alert(msg);
1152
1386
  }
1153
1387
 
1154
- // src/functions/read_utils/src/read_utils.ts
1155
- /**
1156
- * Reads a JSON file, either via Node’s fs (if available)
1157
- * or via window.fetch in the browser. Never throws — returns
1158
- * the parsed object or null on any error.
1159
- */
1160
- function readJsonFile(relativeOrAbsolutePath) {
1161
- return __awaiter(this, void 0, void 0, function* () {
1162
- // 1) Try Node.js fs
1163
- if (typeof process !== 'undefined' &&
1164
- process.versions != null &&
1165
- process.versions.node) {
1166
- try {
1167
- const fs = yield import('fs');
1168
- const path = yield import('path');
1169
- const filePath = path.isAbsolute(relativeOrAbsolutePath)
1170
- ? relativeOrAbsolutePath
1171
- : path.resolve(process.cwd(), relativeOrAbsolutePath);
1172
- const text = yield fs.promises.readFile(filePath, 'utf8');
1173
- return JSON.parse(text);
1174
- }
1175
- catch (_a) {
1176
- // swallow and fall back to browser
1177
- }
1178
- }
1179
- // 2) Try browser fetch
1180
- const fetchFn = safeGlobalProp('fetch');
1181
- if (typeof fetchFn !== 'function') {
1182
- return null;
1183
- }
1184
- // Resolve URL against document.baseURI if possible
1185
- let url = relativeOrAbsolutePath;
1186
- const baseURI = safeGlobalProp('document', 'baseURI');
1187
- if (baseURI) {
1188
- try {
1189
- url = new URL(relativeOrAbsolutePath, baseURI).href;
1190
- }
1191
- catch (_b) {
1192
- // keep url as-is
1193
- }
1194
- }
1195
- try {
1196
- const res = yield fetchFn(url);
1197
- if (!res.ok)
1198
- return null;
1199
- return (yield res.json());
1200
- }
1201
- catch (_c) {
1202
- return null;
1203
- }
1204
- });
1388
+ function Button(_a) {
1389
+ var { children, color = 'gray', variant = 'default', className = '' } = _a, rest = __rest(_a, ["children", "color", "variant", "className"]);
1390
+ const base = 'rounded px-3 py-1 text-sm font-medium focus:outline-none focus:ring-2 focus:ring-offset-2 transition-colors duration-150';
1391
+ const variantStyles = {
1392
+ default: '',
1393
+ icon: 'p-1 bg-transparent hover:bg-gray-100',
1394
+ primary: 'text-white',
1395
+ secondary: '',
1396
+ };
1397
+ const palette = {
1398
+ gray: variant === 'primary'
1399
+ ? 'bg-gray-600 hover:bg-gray-700 focus:ring-gray-500'
1400
+ : 'bg-gray-200 hover:bg-gray-300 focus:ring-gray-400',
1401
+ green: 'bg-green-600 text-white hover:bg-green-700 focus:ring-green-500',
1402
+ blue: variant === 'primary'
1403
+ ? 'bg-blue-600 hover:bg-blue-700 focus:ring-blue-500'
1404
+ : 'bg-blue-200 hover:bg-blue-300 focus:ring-blue-400',
1405
+ };
1406
+ return (jsx("button", Object.assign({ className: `${base} ${variantStyles[variant]} ${palette[color]} ${className}` }, rest, { children: children })));
1407
+ }
1408
+
1409
+ function Checkbox(_a) {
1410
+ var { label } = _a, rest = __rest(_a, ["label"]);
1411
+ return (jsxs("label", { className: 'flex items-center gap-2 mb-4', children: [jsx("input", Object.assign({ type: 'checkbox' }, rest)), jsx("span", { children: label })] }));
1412
+ }
1413
+
1414
+ function Input(_a) {
1415
+ var { label, trailing } = _a, rest = __rest(_a, ["label", "trailing"]);
1416
+ return (jsxs("label", { className: 'mb-4 block', children: [jsx("span", { className: 'block text-sm font-medium mb-1', children: label }), jsxs("div", { className: 'flex gap-2', children: [jsx("input", Object.assign({ className: 'flex-1 rounded border px-2 py-1 disabled:bg-gray-100' }, rest)), trailing] })] }));
1417
+ }
1418
+
1419
+ function Spinner() {
1420
+ return (jsx("p", { className: 'animate-pulse', children: "Loading\u2026" }));
1205
1421
  }
1206
1422
 
1207
1423
  // src/functions/config_utils/src/config_utils.ts
@@ -1275,222 +1491,6 @@ function getConfig(key) {
1275
1491
  return key != null ? cfg[key] : cfg;
1276
1492
  });
1277
1493
  }
1278
- function getConfigContent() {
1279
- return __awaiter(this, void 0, void 0, function* () {
1280
- try {
1281
- // `readJsonFile` should throw if the file isn’t there or isn’t valid JSON
1282
- const cfg = yield readJsonFile('./config.json');
1283
- return cfg;
1284
- }
1285
- catch (_a) {
1286
- // swallow errors & return null so callers can detect “no config”
1287
- return null;
1288
- }
1289
- });
1290
- }
1291
- // 2) Pull a single key out of that object
1292
- function getConfigVar() {
1293
- return __awaiter(this, arguments, void 0, function* (key = null) {
1294
- const cfg = yield getConfigContent();
1295
- if (cfg && typeof cfg === 'object' && key in cfg) {
1296
- return cfg[key];
1297
- }
1298
- return undefined;
1299
- });
1300
- }
1301
-
1302
- // Constructs API URL from endpoint
1303
- /**
1304
- * Unwraps nested { result } fields until you hit a non-object or no more "result" keys.
1305
- */
1306
- function getResult(obj) {
1307
- let current = obj;
1308
- while (current &&
1309
- typeof current === "object" &&
1310
- Object.prototype.hasOwnProperty.call(current, "result")) {
1311
- current = current.result;
1312
- }
1313
- return current;
1314
- }
1315
- // Determines HTTP method, defaults to GET or POST based on body
1316
- function getMethod(method = null, body = null) {
1317
- const validMethods = ['GET', 'POST', 'PUT', 'PATCH', 'PULL'];
1318
- method = (method || '').toUpperCase();
1319
- if (!validMethods.includes(method)) {
1320
- method = body ? 'POST' : 'GET';
1321
- }
1322
- return method;
1323
- }
1324
- // Gets headers, skips JSON headers when body is FormData
1325
- function getHeaders(headers = {}, method = null, body = null) {
1326
- const result = Object.assign({}, headers);
1327
- // inject auth if missing
1328
- if (!result.Authorization) {
1329
- const token = getToken();
1330
- Object.assign(result, getAuthorizationHeader(result, token));
1331
- }
1332
- method = getMethod(method, body);
1333
- // if it’s a multipart FormData, let the browser set the boundary header
1334
- if (body instanceof FormData) {
1335
- return result;
1336
- }
1337
- // otherwise for POST/PUT/PATCH default to JSON
1338
- if (['POST', 'PUT', 'PATCH'].includes(method) && !result['Content-Type']) {
1339
- result['Content-Type'] = 'application/json';
1340
- }
1341
- return result;
1342
- }
1343
- // Prepares request body, serializes to JSON for non-GET requests
1344
- function getBody(body = null, method = null) {
1345
- method = getMethod(method, body);
1346
- if (method === 'GET') {
1347
- return undefined;
1348
- }
1349
- if (body) {
1350
- try {
1351
- return JSON.stringify(body);
1352
- }
1353
- catch (err) {
1354
- return body;
1355
- }
1356
- }
1357
- return undefined;
1358
- }
1359
- // Prepares fetch variables, passes FormData intact
1360
- function getFetchVars(headers = null, method = null, body = null) {
1361
- method = getMethod(method, body);
1362
- headers = getHeaders(headers || {}, method, body);
1363
- // only JSON-stringify non-FormData bodies
1364
- if (!(body instanceof FormData)) {
1365
- body = getBody(body, method);
1366
- }
1367
- return { method, headers, body };
1368
- }
1369
- /*
1370
- * parseResult no longer needs to worry about JSON vs HTML redirect errors;
1371
- * all 401/403 have already been handled above.
1372
- */
1373
- function parseResult(res) {
1374
- return __awaiter(this, void 0, void 0, function* () {
1375
- // runs checkResponse first, will throw if session is expired
1376
- res = checkResponse(res);
1377
- if (!res.ok) {
1378
- // for any other non-401 errors, you can still surface them
1379
- const errorText = yield res.text();
1380
- throw new Error(errorText || res.statusText);
1381
- }
1382
- // now safely parse JSON
1383
- return res.json();
1384
- });
1385
- }
1386
- /**
1387
- * Intercept 401/403 and force a clean redirect to login
1388
- * without ever showing an alert.
1389
- */
1390
- function checkResponse(res) {
1391
- if (res.status === 401 || res.status === 403) {
1392
- // 1) clear out the stale token
1393
- localStorage.removeItem("token");
1394
- // 2) replace history so "back" doesn’t re-trigger the protected route
1395
- window.history.replaceState({}, "", "/secure-files");
1396
- // 3) short-circuit all further fetch logic
1397
- throw new Error("SessionExpired");
1398
- }
1399
- return res;
1400
- }
1401
- function fetchIt(endpoint_1) {
1402
- return __awaiter(this, arguments, void 0, function* (endpoint, body = null, method = null, headers = null, blob = false, configUrl = false, withCredentials = true, returnJson = true, returnReult = true) {
1403
- method = (method || "GET").toUpperCase();
1404
- // 2) choose the URL
1405
- let url = endpoint;
1406
- // 3) prepare headers & body
1407
- headers = Object.assign(Object.assign(Object.assign({}, (body instanceof FormData ? {} : { "Content-Type": "application/json" })), getAuthorizationHeader()), headers);
1408
- const opts = {
1409
- method,
1410
- credentials: withCredentials ? "include" : "same-origin",
1411
- headers,
1412
- body: body instanceof FormData
1413
- ? body
1414
- : body != null && method !== "GET"
1415
- ? JSON.stringify(body)
1416
- : undefined,
1417
- };
1418
- console.debug("➡️ secureFetchIt →", url, opts);
1419
- const res = yield fetch(url, opts);
1420
- if (!res.ok) {
1421
- const err = yield res.text();
1422
- throw new Error(`HTTP ${res.status}: ${err}`);
1423
- }
1424
- if (blob)
1425
- return res.blob();
1426
- if (returnReult)
1427
- return getResult(res.json());
1428
- if (returnJson)
1429
- return res.json();
1430
- return res;
1431
- });
1432
- }
1433
- // Constructs HTML directory path
1434
- function getHtmlDirectory(directory, filename) {
1435
- return `${directory}/${filename}.html`;
1436
- }
1437
- // Fetches HTML content
1438
- function fetchIndexHtml(filename_1) {
1439
- return __awaiter(this, arguments, void 0, function* (filename, directory = 'sf_index', base = 'html') {
1440
- const url = `/${base}/${directory}/${filename}.html`;
1441
- const response = yield fetch(url);
1442
- return yield response.text();
1443
- });
1444
- }
1445
- // Fetches and injects HTML content into container
1446
- function fetchIndexHtmlContainer(filename_1) {
1447
- return __awaiter(this, arguments, void 0, function* (filename, doc = document, directory = 'html') {
1448
- const container = `${filename}-container`;
1449
- const html = yield fetchIndexHtml(filename, directory);
1450
- const el = doc.getElementById(container);
1451
- if (el) {
1452
- el.innerHTML = html;
1453
- }
1454
- else {
1455
- console.warn(`⚠️ No container found for: #${container}`);
1456
- }
1457
- });
1458
- }
1459
-
1460
- function Button(_a) {
1461
- var { children, color = 'gray', variant = 'default', className = '' } = _a, rest = __rest(_a, ["children", "color", "variant", "className"]);
1462
- const base = 'rounded px-3 py-1 text-sm font-medium focus:outline-none focus:ring-2 focus:ring-offset-2 transition-colors duration-150';
1463
- const variantStyles = {
1464
- default: '',
1465
- icon: 'p-1 bg-transparent hover:bg-gray-100',
1466
- primary: 'text-white',
1467
- secondary: '',
1468
- };
1469
- const palette = {
1470
- gray: variant === 'primary'
1471
- ? 'bg-gray-600 hover:bg-gray-700 focus:ring-gray-500'
1472
- : 'bg-gray-200 hover:bg-gray-300 focus:ring-gray-400',
1473
- green: 'bg-green-600 text-white hover:bg-green-700 focus:ring-green-500',
1474
- blue: variant === 'primary'
1475
- ? 'bg-blue-600 hover:bg-blue-700 focus:ring-blue-500'
1476
- : 'bg-blue-200 hover:bg-blue-300 focus:ring-blue-400',
1477
- };
1478
- return (jsx("button", Object.assign({ className: `${base} ${variantStyles[variant]} ${palette[color]} ${className}` }, rest, { children: children })));
1479
- }
1480
-
1481
- function Checkbox(_a) {
1482
- var { label } = _a, rest = __rest(_a, ["label"]);
1483
- return (jsxs("label", { className: 'flex items-center gap-2 mb-4', children: [jsx("input", Object.assign({ type: 'checkbox' }, rest)), jsx("span", { children: label })] }));
1484
- }
1485
-
1486
- function Input(_a) {
1487
- var { label, trailing } = _a, rest = __rest(_a, ["label", "trailing"]);
1488
- return (jsxs("label", { className: 'mb-4 block', children: [jsx("span", { className: 'block text-sm font-medium mb-1', children: label }), jsxs("div", { className: 'flex gap-2', children: [jsx("input", Object.assign({ className: 'flex-1 rounded border px-2 py-1 disabled:bg-gray-100' }, rest)), trailing] })] }));
1489
- }
1490
-
1491
- function Spinner() {
1492
- return (jsx("p", { className: 'animate-pulse', children: "Loading\u2026" }));
1493
- }
1494
1494
 
1495
1495
  export { API_PREFIX, BASE_URL, Button, Checkbox, DEV_PREFIX, DOMAIN_NAME, Input, PROD_PREFIX, PROTOCOL, SUB_DIR, Spinner, alertit, callStorage, callWindowMethod, checkResponse, create_list_string, currentUsername, currentUsernames, decodeJwt, eatAll, eatEnd, eatInner, eatOuter, ensure_list, fetchIndexHtml, fetchIndexHtmlContainer, fetchIt, geAuthsUtilsDirectory, geBackupsUtilsDirectory, geConstantsUtilsDirectory, geEnvUtilsDirectory, geFetchUtilsDirectory, geFileUtilsDirectory, gePathUtilsDirectory, geStaticDirectory, geStringUtilsDirectory, geTypeUtilsDirectory, getAbsDir, getAbsPath, getAuthorizationHeader, getBaseDir, getBody, getComponentsUtilsDirectory, getConfig, getConfigContent, getConfigVar, getDbConfigsPath, getDistDir, getDocumentProp, getEnvDir, getEnvPath, getFetchVars, getFunctionsDir, getFunctionsUtilsDirectory, getHeaders, getHooksUtilsDirectory, getHtmlDirectory, getLibUtilsDirectory, getMethod, getPublicDir, getResult, getSafeDocument, getSafeLocalStorage, getSafeWindow, getSchemasDirPath, getSchemasPath, getSrcDir, getSubstring, getToken, getWindowHost, getWindowProp, get_basename, get_dirname, get_extname, get_filename, get_splitext, get_window, get_window_location, get_window_parts, get_window_pathname, isLoggedIn, isTokenExpired, loadConfig, make_path, make_sanitized_path, normalizeUrl, parseResult, readJsonFile, requireToken, safeGlobalProp, safeStorage, sanitizeFilename, stripPrefixes, truncateString, tryParse };
1496
1496
  //# sourceMappingURL=index.js.map