@tinycloud/sdk-core 2.2.0-beta.9 → 2.2.1-beta.0

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/index.js CHANGED
@@ -728,6 +728,23 @@ function validateServerSpaceInfoResponse(data) {
728
728
  return { ok: true, data: result.data };
729
729
  }
730
730
 
731
+ // src/expiry.ts
732
+ var EPHEMERAL_MS = 60 * 60 * 1e3;
733
+ var SIGNED_READ_URL_MS = 5 * 60 * 1e3;
734
+ var SESSION_MS = 7 * 24 * 60 * 60 * 1e3;
735
+ var SHARE_MS = 7 * 24 * 60 * 60 * 1e3;
736
+ var APP_MS = 30 * 24 * 60 * 60 * 1e3;
737
+ var MAX_MS = 10 * 365 * 24 * 60 * 60 * 1e3;
738
+ var EXPIRY = {
739
+ EPHEMERAL_MS,
740
+ SIGNED_READ_URL_MS,
741
+ SESSION_MS,
742
+ SHARE_MS,
743
+ APP_MS,
744
+ MAX_MS
745
+ };
746
+ var DEFAULT_SIGNED_READ_URL_EXPIRY_MS = EXPIRY.SIGNED_READ_URL_MS;
747
+
731
748
  // src/spaces/SpaceService.ts
732
749
  var SERVICE_NAME = "space";
733
750
  var SpaceErrorCodes = {
@@ -804,7 +821,7 @@ function transformServerDelegations(validatedData, defaultSpaceId) {
804
821
  spaceId,
805
822
  path,
806
823
  actions,
807
- expiry: info.expiry ? new Date(info.expiry) : new Date(Date.now() + 24 * 60 * 60 * 1e3),
824
+ expiry: info.expiry ? new Date(info.expiry) : new Date(Date.now() + EXPIRY.SHARE_MS),
808
825
  isRevoked: false,
809
826
  createdAt: info.issued_at ? new Date(info.issued_at) : void 0,
810
827
  parentCid: firstStringParent
@@ -1664,6 +1681,22 @@ var TinyCloud = class _TinyCloud {
1664
1681
  }
1665
1682
  return service;
1666
1683
  }
1684
+ /**
1685
+ * Get the Encryption service.
1686
+ * @throws Error if services are not initialized or encryption service is not registered
1687
+ */
1688
+ get encryption() {
1689
+ if (!this._servicesInitialized) {
1690
+ throw new Error(
1691
+ "Services not initialized. Call initializeServices() first, or use TinyCloudWeb/TinyCloudNode which handles this automatically."
1692
+ );
1693
+ }
1694
+ const service = this._services.get("encryption");
1695
+ if (!service) {
1696
+ throw new Error("Encryption service is not registered.");
1697
+ }
1698
+ return service;
1699
+ }
1667
1700
  /**
1668
1701
  * Notify services of session change.
1669
1702
  * Called internally after sign-in and sign-out.
@@ -2019,7 +2052,51 @@ import {
2019
2052
  VaultHeaders,
2020
2053
  VaultPublicSpaceKVActions,
2021
2054
  createVaultCrypto,
2022
- SecretsService
2055
+ SecretsService,
2056
+ SECRET_NAME_RE as SECRET_NAME_RE2,
2057
+ canonicalizeSecretScope,
2058
+ resolveSecretListPrefix,
2059
+ resolveSecretPath as resolveSecretPath2,
2060
+ EncryptionService,
2061
+ parseNetworkId,
2062
+ buildNetworkId,
2063
+ isNetworkId,
2064
+ networkDiscoveryKey,
2065
+ NetworkIdError,
2066
+ ENCRYPTION_NETWORK_URN_PREFIX,
2067
+ NETWORK_NAME_PATTERN,
2068
+ canonicalizeEncryptionJson,
2069
+ canonicalHashHex,
2070
+ hexEncode,
2071
+ hexDecode,
2072
+ base64Encode,
2073
+ base64Decode,
2074
+ utf8Encode,
2075
+ utf8Decode,
2076
+ encryptToNetwork,
2077
+ decryptEnvelopeWithKey,
2078
+ validateEnvelope,
2079
+ generateRandomReceiverKey,
2080
+ deriveSignedReceiverKey,
2081
+ buildCanonicalDecryptRequest,
2082
+ buildDecryptFacts,
2083
+ buildDecryptAttenuation,
2084
+ buildDecryptInvocation,
2085
+ checkDecryptInvocationInput,
2086
+ verifyDecryptResponse,
2087
+ canonicalSignedResponse,
2088
+ openWrappedKey,
2089
+ discoverNetwork,
2090
+ ensureNetworkUsableForDecrypt,
2091
+ DEFAULT_ENCRYPTION_ALG,
2092
+ ENVELOPE_VERSION,
2093
+ DEFAULT_KEY_VERSION,
2094
+ DECRYPT_FACT_TYPE,
2095
+ DECRYPT_RESULT_TYPE,
2096
+ DECRYPT_ACTION,
2097
+ ENCRYPTION_SERVICE,
2098
+ ENCRYPTION_SERVICE_SHORT,
2099
+ encryptionError
2023
2100
  } from "@tinycloud/sdk-services";
2024
2101
 
2025
2102
  // src/space.ts
@@ -2209,7 +2286,7 @@ var DelegationManager = class {
2209
2286
  spaceId: this.session.spaceId,
2210
2287
  path: params.path,
2211
2288
  actions: params.actions,
2212
- expiry: params.expiry ?? new Date(Date.now() + 24 * 60 * 60 * 1e3),
2289
+ expiry: params.expiry ?? new Date(Date.now() + EXPIRY.SHARE_MS),
2213
2290
  isRevoked: false,
2214
2291
  allowSubDelegation: !(params.disableSubDelegation ?? false),
2215
2292
  createdAt: /* @__PURE__ */ new Date()
@@ -2688,6 +2765,7 @@ function validateEncodedShareData(data) {
2688
2765
 
2689
2766
  // src/manifest.ts
2690
2767
  import ms from "ms";
2768
+ import { resolveSecretPath, SECRET_NAME_RE } from "@tinycloud/sdk-services";
2691
2769
  var ManifestValidationError = class extends Error {
2692
2770
  constructor(message) {
2693
2771
  super(`Manifest validation failed: ${message}`);
@@ -2701,15 +2779,17 @@ var DEFAULT_MANIFEST_SPACE = "applications";
2701
2779
  var ACCOUNT_REGISTRY_SPACE = "account";
2702
2780
  var ACCOUNT_REGISTRY_PATH = "applications/";
2703
2781
  var SECRETS_SPACE = "secrets";
2704
- var SECRET_NAME_RE = /^[A-Z][A-Z0-9_]*$/;
2705
2782
  var VAULT_PERMISSION_SERVICE = "tinycloud.vault";
2706
2783
  var SERVICE_SHORT_TO_LONG = Object.freeze({
2707
2784
  kv: "tinycloud.kv",
2708
2785
  sql: "tinycloud.sql",
2709
2786
  duckdb: "tinycloud.duckdb",
2710
2787
  capabilities: "tinycloud.capabilities",
2711
- hooks: "tinycloud.hooks"
2788
+ hooks: "tinycloud.hooks",
2789
+ encryption: "tinycloud.encryption"
2712
2790
  });
2791
+ var ENCRYPTION_PERMISSION_SERVICE = "tinycloud.encryption";
2792
+ var ENCRYPTION_MANIFEST_SPACE = "encryption";
2713
2793
  var SERVICE_LONG_TO_SHORT = Object.freeze(
2714
2794
  Object.fromEntries(
2715
2795
  Object.entries(SERVICE_SHORT_TO_LONG).map(([s, l]) => [l, s])
@@ -2786,6 +2866,9 @@ function expandActionShortNames(service, actions) {
2786
2866
  });
2787
2867
  }
2788
2868
  function expandPermissionEntry(entry) {
2869
+ if (entry.service === ENCRYPTION_PERMISSION_SERVICE) {
2870
+ return expandEncryptionPermissionEntry(entry);
2871
+ }
2789
2872
  if (entry.service !== VAULT_PERMISSION_SERVICE) {
2790
2873
  return [
2791
2874
  {
@@ -2796,6 +2879,55 @@ function expandPermissionEntry(entry) {
2796
2879
  }
2797
2880
  return expandVaultPermissionEntry(entry);
2798
2881
  }
2882
+ function expandEncryptionPermissionEntry(entry) {
2883
+ if (typeof entry.path !== "string" || !entry.path.startsWith("urn:tinycloud:encryption:")) {
2884
+ throw new ManifestValidationError(
2885
+ `tinycloud.encryption entries require path to be a networkId URN (got ${JSON.stringify(entry.path)})`
2886
+ );
2887
+ }
2888
+ const normalizedActions = [];
2889
+ for (const action of entry.actions) {
2890
+ if (action === "decrypt" || action === "tinycloud.encryption/decrypt") {
2891
+ normalizedActions.push("tinycloud.encryption/decrypt");
2892
+ continue;
2893
+ }
2894
+ if (action === "network.create" || action === "tinycloud.encryption/network.create") {
2895
+ normalizedActions.push("tinycloud.encryption/network.create");
2896
+ continue;
2897
+ }
2898
+ if (action === "network.revoke" || action === "tinycloud.encryption/network.revoke") {
2899
+ normalizedActions.push("tinycloud.encryption/network.revoke");
2900
+ continue;
2901
+ }
2902
+ if (action.includes("/")) {
2903
+ throw new ManifestValidationError(
2904
+ `unknown encryption action ${JSON.stringify(action)}; expected decrypt, network.create, or network.revoke`
2905
+ );
2906
+ }
2907
+ throw new ManifestValidationError(
2908
+ `unknown encryption action ${JSON.stringify(action)}; expected decrypt, network.create, or network.revoke`
2909
+ );
2910
+ }
2911
+ const dedupedActions = [];
2912
+ const seen = /* @__PURE__ */ new Set();
2913
+ for (const a of normalizedActions) {
2914
+ if (!seen.has(a)) {
2915
+ dedupedActions.push(a);
2916
+ seen.add(a);
2917
+ }
2918
+ }
2919
+ return [
2920
+ {
2921
+ service: ENCRYPTION_PERMISSION_SERVICE,
2922
+ space: ENCRYPTION_MANIFEST_SPACE,
2923
+ path: entry.path,
2924
+ actions: dedupedActions,
2925
+ skipPrefix: true,
2926
+ ...entry.expiry !== void 0 ? { expiry: entry.expiry } : {},
2927
+ ...entry.description !== void 0 ? { description: entry.description } : {}
2928
+ }
2929
+ ];
2930
+ }
2799
2931
  function expandPermissionEntries(entries) {
2800
2932
  return entries.flatMap(expandPermissionEntry);
2801
2933
  }
@@ -2885,6 +3017,16 @@ function validateManifestSecrets(secrets) {
2885
3017
  `manifest.secrets.${name} must match ${SECRET_NAME_RE.source}`
2886
3018
  );
2887
3019
  }
3020
+ try {
3021
+ resolveSecretPath(
3022
+ secretNameFromSpec(name, spec),
3023
+ { scope: secretScopeFromSpec(spec) }
3024
+ );
3025
+ } catch (error) {
3026
+ throw new ManifestValidationError(
3027
+ `manifest.secrets.${name}: ${error instanceof Error ? error.message : String(error)}`
3028
+ );
3029
+ }
2888
3030
  const actions = secretActionsFromSpec(name, spec);
2889
3031
  if (actions.length === 0) {
2890
3032
  throw new ManifestValidationError(
@@ -3041,6 +3183,18 @@ function normalizeSecretActions(actions) {
3041
3183
  }
3042
3184
  return out;
3043
3185
  }
3186
+ function secretNameFromSpec(fallbackName, spec) {
3187
+ if (spec !== null && typeof spec === "object" && !Array.isArray(spec)) {
3188
+ return spec.name ?? fallbackName;
3189
+ }
3190
+ return fallbackName;
3191
+ }
3192
+ function secretScopeFromSpec(spec) {
3193
+ if (spec !== null && typeof spec === "object" && !Array.isArray(spec)) {
3194
+ return spec.scope;
3195
+ }
3196
+ return void 0;
3197
+ }
3044
3198
  function secretActionsFromSpec(name, spec) {
3045
3199
  if (spec === true) {
3046
3200
  return ["read"];
@@ -3076,27 +3230,26 @@ function secretEntriesForManifest(secrets) {
3076
3230
  const entries = [];
3077
3231
  for (const [name, spec] of Object.entries(secrets)) {
3078
3232
  const actions = secretActionsFromSpec(name, spec);
3233
+ const secretPath = resolveSecretPath(
3234
+ secretNameFromSpec(name, spec),
3235
+ { scope: secretScopeFromSpec(spec) }
3236
+ );
3079
3237
  const extra = spec !== true && typeof spec === "object" && !Array.isArray(spec) ? spec : {};
3080
- for (const base of ["keys", "vault"]) {
3081
- entries.push({
3082
- service: "tinycloud.kv",
3083
- space: SECRETS_SPACE,
3084
- path: `${base}/secrets/${name}`,
3085
- actions: normalizeSecretActions(actions),
3086
- skipPrefix: true,
3087
- ...extra.expiry !== void 0 ? { expiry: extra.expiry } : {},
3088
- ...extra.description !== void 0 ? { description: extra.description } : {}
3089
- });
3090
- }
3238
+ entries.push({
3239
+ service: VAULT_PERMISSION_SERVICE,
3240
+ space: SECRETS_SPACE,
3241
+ path: secretPath.vaultKey,
3242
+ actions: normalizeSecretActions(actions),
3243
+ skipPrefix: true,
3244
+ ...extra.expiry !== void 0 ? { expiry: extra.expiry } : {},
3245
+ ...extra.description !== void 0 ? { description: extra.description } : {}
3246
+ });
3091
3247
  }
3092
3248
  return entries;
3093
3249
  }
3094
3250
  function resolveEntry(entry, prefix, _inheritedExpiryMs, inheritedSpace) {
3095
- const resolvedPath = applyPrefix(
3096
- prefix,
3097
- entry.path,
3098
- entry.skipPrefix === true
3099
- );
3251
+ const skipPrefixForEntry = entry.skipPrefix === true || entry.service === ENCRYPTION_PERMISSION_SERVICE;
3252
+ const resolvedPath = applyPrefix(prefix, entry.path, skipPrefixForEntry);
3100
3253
  const entryExpiryMs = entry.expiry !== void 0 ? parseExpiry(entry.expiry) : void 0;
3101
3254
  return expandPermissionEntry({
3102
3255
  ...entry,
@@ -3138,13 +3291,13 @@ function expandVaultPermissionEntry(entry) {
3138
3291
  function vaultActionExpansion(action) {
3139
3292
  const normalized = normalizeVaultAction(action);
3140
3293
  if (normalized === "read" || normalized === "get") {
3141
- return { bases: ["keys", "vault"], action: "tinycloud.kv/get" };
3294
+ return { bases: ["vault"], action: "tinycloud.kv/get" };
3142
3295
  }
3143
3296
  if (normalized === "write" || normalized === "put") {
3144
- return { bases: ["keys", "vault"], action: "tinycloud.kv/put" };
3297
+ return { bases: ["vault"], action: "tinycloud.kv/put" };
3145
3298
  }
3146
3299
  if (normalized === "delete" || normalized === "del") {
3147
- return { bases: ["keys", "vault"], action: "tinycloud.kv/del" };
3300
+ return { bases: ["vault"], action: "tinycloud.kv/del" };
3148
3301
  }
3149
3302
  if (normalized === "list") {
3150
3303
  return { bases: ["vault"], action: "tinycloud.kv/list" };
@@ -3232,7 +3385,9 @@ function withCapabilitiesReadForSpaces(resources) {
3232
3385
  if (resources.length === 0) {
3233
3386
  return [];
3234
3387
  }
3235
- const spaces = new Set(resources.map((resource) => resource.space));
3388
+ const spaces = new Set(
3389
+ resources.filter((resource) => resource.service !== ENCRYPTION_PERMISSION_SERVICE).map((resource) => resource.space)
3390
+ );
3236
3391
  return dedupeResources([
3237
3392
  ...resources,
3238
3393
  ...[...spaces].map(capabilitiesReadPermission)
@@ -3364,7 +3519,7 @@ function inferShortServiceFromActionUrns(actions) {
3364
3519
  return short;
3365
3520
  }
3366
3521
  var DEFAULT_READ_ACTIONS = ["tinycloud.kv/get", "tinycloud.kv/metadata"];
3367
- var DEFAULT_EXPIRY_MS = 24 * 60 * 60 * 1e3;
3522
+ var DEFAULT_EXPIRY_MS = EXPIRY.SHARE_MS;
3368
3523
  var BASE64_PREFIX = "tc1:";
3369
3524
  function createError2(code, message, cause, meta) {
3370
3525
  return {
@@ -4493,6 +4648,7 @@ async function checkNodeInfo(host, sdkProtocol, fetchFn = globalThis.fetch.bind(
4493
4648
  }
4494
4649
  return {
4495
4650
  features: data.features ?? [],
4651
+ nodeId: data.nodeId,
4496
4652
  quotaUrl: data.quota_url
4497
4653
  };
4498
4654
  }
@@ -4829,6 +4985,10 @@ function verifyDidKeySignature(did, payload, signature) {
4829
4985
  publicKey
4830
4986
  );
4831
4987
  }
4988
+ function verifyDidKeyEd25519Signature(did, payload, signature) {
4989
+ const publicKey = ed25519PublicKeyFromDidKey(did);
4990
+ return ed25519.verify(signature, payload, publicKey);
4991
+ }
4832
4992
  function ed25519PublicKeyFromDidKey(did) {
4833
4993
  const identifier = did.slice("did:key:".length);
4834
4994
  if (!identifier.startsWith("z")) {
@@ -4837,12 +4997,15 @@ function ed25519PublicKeyFromDidKey(did) {
4837
4997
  );
4838
4998
  }
4839
4999
  const bytes = bases.base58btc.decode(identifier);
4840
- if (bytes.length !== 34 || bytes[0] !== 237 || bytes[1] !== 1) {
4841
- throw new LocationRecordValidationError(
4842
- "did:key must be an Ed25519 public key"
4843
- );
5000
+ if (bytes.length === 34 && bytes[0] === 237 && bytes[1] === 1) {
5001
+ return bytes.slice(2);
5002
+ }
5003
+ if (bytes.length === 33 && bytes[0] === 237) {
5004
+ return bytes.slice(1);
4844
5005
  }
4845
- return bytes.slice(2);
5006
+ throw new LocationRecordValidationError(
5007
+ "did:key must be an Ed25519 public key"
5008
+ );
4846
5009
  }
4847
5010
  function base64UrlEncode2(bytes) {
4848
5011
  const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
@@ -5006,10 +5169,16 @@ export {
5006
5169
  CapabilityKeyRegistryErrorCodes,
5007
5170
  ClientSessionSchema,
5008
5171
  CloudLocationResolutionError,
5172
+ DECRYPT_ACTION,
5173
+ DECRYPT_FACT_TYPE,
5174
+ DECRYPT_RESULT_TYPE,
5009
5175
  DEFAULT_DEFAULTS,
5176
+ DEFAULT_ENCRYPTION_ALG,
5010
5177
  DEFAULT_EXPIRY,
5178
+ DEFAULT_KEY_VERSION,
5011
5179
  DEFAULT_MANIFEST_SPACE,
5012
5180
  DEFAULT_MANIFEST_VERSION,
5181
+ DEFAULT_SIGNED_READ_URL_EXPIRY_MS,
5013
5182
  DEFAULT_TINYCLOUD_FALLBACK_HOST,
5014
5183
  DEFAULT_TINYCLOUD_LOCATION_REGISTRY_URL,
5015
5184
  DataVaultService,
@@ -5019,15 +5188,26 @@ export {
5019
5188
  DuckDbAction,
5020
5189
  DuckDbDatabaseHandle,
5021
5190
  DuckDbService2 as DuckDbService,
5191
+ ENCRYPTION_MANIFEST_SPACE,
5192
+ ENCRYPTION_NETWORK_URN_PREFIX,
5193
+ ENCRYPTION_PERMISSION_SERVICE,
5194
+ ENCRYPTION_SERVICE,
5195
+ ENCRYPTION_SERVICE_SHORT,
5196
+ ENVELOPE_VERSION,
5197
+ EXPIRY,
5198
+ EncryptionService,
5022
5199
  EnsDataSchema,
5023
5200
  ErrorCodes2 as ErrorCodes,
5024
5201
  HooksService2 as HooksService,
5025
5202
  KVService2 as KVService,
5026
5203
  LocationRecordValidationError,
5027
5204
  ManifestValidationError,
5205
+ NETWORK_NAME_PATTERN,
5206
+ NetworkIdError,
5028
5207
  PermissionNotInManifestError,
5029
5208
  PrefixedKVService,
5030
5209
  ProtocolMismatchError,
5210
+ SECRET_NAME_RE2 as SECRET_NAME_RE,
5031
5211
  SERVICE_LONG_TO_SHORT,
5032
5212
  SERVICE_SHORT_TO_LONG,
5033
5213
  SQLAction,
@@ -5050,37 +5230,66 @@ export {
5050
5230
  VersionCheckError,
5051
5231
  activateSessionWithHost,
5052
5232
  applyPrefix,
5233
+ buildCanonicalDecryptRequest,
5234
+ buildDecryptAttenuation,
5235
+ buildDecryptFacts,
5236
+ buildDecryptInvocation,
5237
+ buildNetworkId,
5053
5238
  buildSpaceUri,
5239
+ canonicalHashHex,
5054
5240
  canonicalLocationPayload,
5241
+ canonicalSignedResponse,
5242
+ canonicalizeEncryptionJson,
5243
+ canonicalizeSecretScope,
5244
+ checkDecryptInvocationInput,
5055
5245
  checkNodeInfo,
5056
5246
  composeManifestRequest,
5057
5247
  createCapabilityKeyRegistry,
5058
5248
  createSharingService,
5059
5249
  createSpaceService,
5060
5250
  createVaultCrypto,
5251
+ decryptEnvelopeWithKey,
5061
5252
  defaultRetryPolicy2 as defaultRetryPolicy,
5062
5253
  defaultSignStrategy,
5063
5254
  defaultSpaceCreationHandler,
5255
+ deriveSignedReceiverKey,
5256
+ discoverNetwork,
5257
+ encryptToNetwork,
5258
+ base64Decode as encryptionBase64Decode,
5259
+ base64Encode as encryptionBase64Encode,
5260
+ encryptionError,
5261
+ utf8Decode as encryptionUtf8Decode,
5262
+ utf8Encode as encryptionUtf8Encode,
5263
+ ensureNetworkUsableForDecrypt,
5064
5264
  err4 as err,
5065
5265
  expandActionShortNames,
5066
5266
  expandPermissionEntries,
5067
5267
  expandPermissionEntry,
5068
5268
  fetchLocationRecord,
5069
5269
  fetchPeerId,
5270
+ generateRandomReceiverKey,
5271
+ hexDecode,
5272
+ hexEncode,
5070
5273
  httpUrlToMultiaddr,
5071
5274
  isCapabilitySubset,
5275
+ isNetworkId,
5072
5276
  loadManifest,
5073
5277
  locationPayloadForRecord,
5074
5278
  makePublicSpaceId,
5075
5279
  manifestAbilitiesUnion,
5076
5280
  multiaddrToHttpUrl,
5281
+ networkDiscoveryKey,
5077
5282
  normalizeDefaults,
5078
5283
  ok4 as ok,
5284
+ openWrappedKey,
5079
5285
  parseExpiry,
5286
+ parseNetworkId,
5080
5287
  parseRecapCapabilities,
5081
5288
  parseSpaceUri,
5082
5289
  resolveCloudLocation,
5083
5290
  resolveManifest,
5291
+ resolveSecretListPrefix,
5292
+ resolveSecretPath2 as resolveSecretPath,
5084
5293
  resolveTinyCloudHosts,
5085
5294
  resourceCapabilitiesToAbilitiesMap,
5086
5295
  resourceCapabilitiesToSpaceAbilitiesMap,
@@ -5088,10 +5297,13 @@ export {
5088
5297
  signLocationRecord,
5089
5298
  submitHostDelegation,
5090
5299
  validateClientSession,
5300
+ validateEnvelope,
5091
5301
  validateLocationRecord,
5092
5302
  validateLocationRecordPayload,
5093
5303
  validateManifest,
5094
5304
  validatePersistedSessionData,
5305
+ verifyDecryptResponse,
5306
+ verifyDidKeyEd25519Signature,
5095
5307
  verifyLocationRecord
5096
5308
  };
5097
5309
  //# sourceMappingURL=index.js.map