@hot-updater/aws 0.16.2 → 0.16.4

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.
@@ -405,9 +405,9 @@ var require_path_key = __commonJS({
405
405
  }
406
406
  });
407
407
 
408
- // ../../node_modules/.pnpm/cross-spawn@7.0.3/node_modules/cross-spawn/lib/util/resolveCommand.js
408
+ // ../../node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/lib/util/resolveCommand.js
409
409
  var require_resolveCommand = __commonJS({
410
- "../../node_modules/.pnpm/cross-spawn@7.0.3/node_modules/cross-spawn/lib/util/resolveCommand.js"(exports2, module2) {
410
+ "../../node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/lib/util/resolveCommand.js"(exports2, module2) {
411
411
  "use strict";
412
412
  var path7 = require("path");
413
413
  var which = require_which();
@@ -447,9 +447,9 @@ var require_resolveCommand = __commonJS({
447
447
  }
448
448
  });
449
449
 
450
- // ../../node_modules/.pnpm/cross-spawn@7.0.3/node_modules/cross-spawn/lib/util/escape.js
450
+ // ../../node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/lib/util/escape.js
451
451
  var require_escape = __commonJS({
452
- "../../node_modules/.pnpm/cross-spawn@7.0.3/node_modules/cross-spawn/lib/util/escape.js"(exports2, module2) {
452
+ "../../node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/lib/util/escape.js"(exports2, module2) {
453
453
  "use strict";
454
454
  var metaCharsRegExp = /([()\][%!^"`<>&|;, *?])/g;
455
455
  function escapeCommand(arg) {
@@ -458,8 +458,8 @@ var require_escape = __commonJS({
458
458
  }
459
459
  function escapeArgument(arg, doubleEscapeMetaChars) {
460
460
  arg = `${arg}`;
461
- arg = arg.replace(/(\\*)"/g, '$1$1\\"');
462
- arg = arg.replace(/(\\*)$/, "$1$1");
461
+ arg = arg.replace(/(?=(\\+?)?)\1"/g, '$1$1\\"');
462
+ arg = arg.replace(/(?=(\\+?)?)\1$/, "$1$1");
463
463
  arg = `"${arg}"`;
464
464
  arg = arg.replace(metaCharsRegExp, "^$1");
465
465
  if (doubleEscapeMetaChars) {
@@ -500,9 +500,9 @@ var require_shebang_command = __commonJS({
500
500
  }
501
501
  });
502
502
 
503
- // ../../node_modules/.pnpm/cross-spawn@7.0.3/node_modules/cross-spawn/lib/util/readShebang.js
503
+ // ../../node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/lib/util/readShebang.js
504
504
  var require_readShebang = __commonJS({
505
- "../../node_modules/.pnpm/cross-spawn@7.0.3/node_modules/cross-spawn/lib/util/readShebang.js"(exports2, module2) {
505
+ "../../node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/lib/util/readShebang.js"(exports2, module2) {
506
506
  "use strict";
507
507
  var fs3 = require("fs");
508
508
  var shebangCommand = require_shebang_command();
@@ -522,9 +522,9 @@ var require_readShebang = __commonJS({
522
522
  }
523
523
  });
524
524
 
525
- // ../../node_modules/.pnpm/cross-spawn@7.0.3/node_modules/cross-spawn/lib/parse.js
525
+ // ../../node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/lib/parse.js
526
526
  var require_parse = __commonJS({
527
- "../../node_modules/.pnpm/cross-spawn@7.0.3/node_modules/cross-spawn/lib/parse.js"(exports2, module2) {
527
+ "../../node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/lib/parse.js"(exports2, module2) {
528
528
  "use strict";
529
529
  var path7 = require("path");
530
530
  var resolveCommand = require_resolveCommand();
@@ -584,9 +584,9 @@ var require_parse = __commonJS({
584
584
  }
585
585
  });
586
586
 
587
- // ../../node_modules/.pnpm/cross-spawn@7.0.3/node_modules/cross-spawn/lib/enoent.js
587
+ // ../../node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/lib/enoent.js
588
588
  var require_enoent = __commonJS({
589
- "../../node_modules/.pnpm/cross-spawn@7.0.3/node_modules/cross-spawn/lib/enoent.js"(exports2, module2) {
589
+ "../../node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/lib/enoent.js"(exports2, module2) {
590
590
  "use strict";
591
591
  var isWin = process.platform === "win32";
592
592
  function notFoundError(original, syscall) {
@@ -605,7 +605,7 @@ var require_enoent = __commonJS({
605
605
  const originalEmit = cp.emit;
606
606
  cp.emit = function(name, arg1) {
607
607
  if (name === "exit") {
608
- const err = verifyENOENT(arg1, parsed, "spawn");
608
+ const err = verifyENOENT(arg1, parsed);
609
609
  if (err) {
610
610
  return originalEmit.call(cp, "error", err);
611
611
  }
@@ -634,9 +634,9 @@ var require_enoent = __commonJS({
634
634
  }
635
635
  });
636
636
 
637
- // ../../node_modules/.pnpm/cross-spawn@7.0.3/node_modules/cross-spawn/index.js
637
+ // ../../node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/index.js
638
638
  var require_cross_spawn = __commonJS({
639
- "../../node_modules/.pnpm/cross-spawn@7.0.3/node_modules/cross-spawn/index.js"(exports2, module2) {
639
+ "../../node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/index.js"(exports2, module2) {
640
640
  "use strict";
641
641
  var cp = require("child_process");
642
642
  var parse = require_parse();
@@ -9334,7 +9334,7 @@ var SSMKeyPairManager = class {
9334
9334
 
9335
9335
  // iac/templates.ts
9336
9336
  var CONFIG_TEMPLATE_WITH_SESSION = `
9337
- import { metro } from "@hot-updater/metro";
9337
+ import { bare } from "@hot-updater/bare";
9338
9338
  import { s3Storage, s3Database } from "@hot-updater/aws";
9339
9339
  import { defineConfig } from "hot-updater";
9340
9340
  import "dotenv/config";
@@ -9351,7 +9351,7 @@ const commonOptions = {
9351
9351
  };
9352
9352
 
9353
9353
  export default defineConfig({
9354
- build: metro({ enableHermes: true }),
9354
+ build: bare({ enableHermes: true }),
9355
9355
  storage: s3Storage(commonOptions),
9356
9356
  database: s3Database({
9357
9357
  ...commonOptions,
@@ -9360,7 +9360,7 @@ export default defineConfig({
9360
9360
  });
9361
9361
  `;
9362
9362
  var CONFIG_TEMPLATE = `
9363
- import { metro } from "@hot-updater/metro";
9363
+ import { bare } from "@hot-updater/bare";
9364
9364
  import { s3Storage, s3Database } from "@hot-updater/aws";
9365
9365
  import { defineConfig } from "hot-updater";
9366
9366
  import "dotenv/config";
@@ -9375,7 +9375,7 @@ const options = {
9375
9375
  };
9376
9376
 
9377
9377
  export default defineConfig({
9378
- build: metro({ enableHermes: true }),
9378
+ build: bare({ enableHermes: true }),
9379
9379
  storage: s3Storage(options),
9380
9380
  database: s3Database(options),
9381
9381
  });
package/dist/iac/index.js CHANGED
@@ -405,9 +405,9 @@ var require_path_key = __commonJS({
405
405
  }
406
406
  });
407
407
 
408
- // ../../node_modules/.pnpm/cross-spawn@7.0.3/node_modules/cross-spawn/lib/util/resolveCommand.js
408
+ // ../../node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/lib/util/resolveCommand.js
409
409
  var require_resolveCommand = __commonJS({
410
- "../../node_modules/.pnpm/cross-spawn@7.0.3/node_modules/cross-spawn/lib/util/resolveCommand.js"(exports, module) {
410
+ "../../node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/lib/util/resolveCommand.js"(exports, module) {
411
411
  "use strict";
412
412
  var path7 = __require("path");
413
413
  var which = require_which();
@@ -447,9 +447,9 @@ var require_resolveCommand = __commonJS({
447
447
  }
448
448
  });
449
449
 
450
- // ../../node_modules/.pnpm/cross-spawn@7.0.3/node_modules/cross-spawn/lib/util/escape.js
450
+ // ../../node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/lib/util/escape.js
451
451
  var require_escape = __commonJS({
452
- "../../node_modules/.pnpm/cross-spawn@7.0.3/node_modules/cross-spawn/lib/util/escape.js"(exports, module) {
452
+ "../../node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/lib/util/escape.js"(exports, module) {
453
453
  "use strict";
454
454
  var metaCharsRegExp = /([()\][%!^"`<>&|;, *?])/g;
455
455
  function escapeCommand(arg) {
@@ -458,8 +458,8 @@ var require_escape = __commonJS({
458
458
  }
459
459
  function escapeArgument(arg, doubleEscapeMetaChars) {
460
460
  arg = `${arg}`;
461
- arg = arg.replace(/(\\*)"/g, '$1$1\\"');
462
- arg = arg.replace(/(\\*)$/, "$1$1");
461
+ arg = arg.replace(/(?=(\\+?)?)\1"/g, '$1$1\\"');
462
+ arg = arg.replace(/(?=(\\+?)?)\1$/, "$1$1");
463
463
  arg = `"${arg}"`;
464
464
  arg = arg.replace(metaCharsRegExp, "^$1");
465
465
  if (doubleEscapeMetaChars) {
@@ -500,9 +500,9 @@ var require_shebang_command = __commonJS({
500
500
  }
501
501
  });
502
502
 
503
- // ../../node_modules/.pnpm/cross-spawn@7.0.3/node_modules/cross-spawn/lib/util/readShebang.js
503
+ // ../../node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/lib/util/readShebang.js
504
504
  var require_readShebang = __commonJS({
505
- "../../node_modules/.pnpm/cross-spawn@7.0.3/node_modules/cross-spawn/lib/util/readShebang.js"(exports, module) {
505
+ "../../node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/lib/util/readShebang.js"(exports, module) {
506
506
  "use strict";
507
507
  var fs3 = __require("fs");
508
508
  var shebangCommand = require_shebang_command();
@@ -522,9 +522,9 @@ var require_readShebang = __commonJS({
522
522
  }
523
523
  });
524
524
 
525
- // ../../node_modules/.pnpm/cross-spawn@7.0.3/node_modules/cross-spawn/lib/parse.js
525
+ // ../../node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/lib/parse.js
526
526
  var require_parse = __commonJS({
527
- "../../node_modules/.pnpm/cross-spawn@7.0.3/node_modules/cross-spawn/lib/parse.js"(exports, module) {
527
+ "../../node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/lib/parse.js"(exports, module) {
528
528
  "use strict";
529
529
  var path7 = __require("path");
530
530
  var resolveCommand = require_resolveCommand();
@@ -584,9 +584,9 @@ var require_parse = __commonJS({
584
584
  }
585
585
  });
586
586
 
587
- // ../../node_modules/.pnpm/cross-spawn@7.0.3/node_modules/cross-spawn/lib/enoent.js
587
+ // ../../node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/lib/enoent.js
588
588
  var require_enoent = __commonJS({
589
- "../../node_modules/.pnpm/cross-spawn@7.0.3/node_modules/cross-spawn/lib/enoent.js"(exports, module) {
589
+ "../../node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/lib/enoent.js"(exports, module) {
590
590
  "use strict";
591
591
  var isWin = process.platform === "win32";
592
592
  function notFoundError(original, syscall) {
@@ -605,7 +605,7 @@ var require_enoent = __commonJS({
605
605
  const originalEmit = cp.emit;
606
606
  cp.emit = function(name, arg1) {
607
607
  if (name === "exit") {
608
- const err = verifyENOENT(arg1, parsed, "spawn");
608
+ const err = verifyENOENT(arg1, parsed);
609
609
  if (err) {
610
610
  return originalEmit.call(cp, "error", err);
611
611
  }
@@ -634,9 +634,9 @@ var require_enoent = __commonJS({
634
634
  }
635
635
  });
636
636
 
637
- // ../../node_modules/.pnpm/cross-spawn@7.0.3/node_modules/cross-spawn/index.js
637
+ // ../../node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/index.js
638
638
  var require_cross_spawn = __commonJS({
639
- "../../node_modules/.pnpm/cross-spawn@7.0.3/node_modules/cross-spawn/index.js"(exports, module) {
639
+ "../../node_modules/.pnpm/cross-spawn@7.0.6/node_modules/cross-spawn/index.js"(exports, module) {
640
640
  "use strict";
641
641
  var cp = __require("child_process");
642
642
  var parse = require_parse();
@@ -9346,7 +9346,7 @@ var SSMKeyPairManager = class {
9346
9346
 
9347
9347
  // iac/templates.ts
9348
9348
  var CONFIG_TEMPLATE_WITH_SESSION = `
9349
- import { metro } from "@hot-updater/metro";
9349
+ import { bare } from "@hot-updater/bare";
9350
9350
  import { s3Storage, s3Database } from "@hot-updater/aws";
9351
9351
  import { defineConfig } from "hot-updater";
9352
9352
  import "dotenv/config";
@@ -9363,7 +9363,7 @@ const commonOptions = {
9363
9363
  };
9364
9364
 
9365
9365
  export default defineConfig({
9366
- build: metro({ enableHermes: true }),
9366
+ build: bare({ enableHermes: true }),
9367
9367
  storage: s3Storage(commonOptions),
9368
9368
  database: s3Database({
9369
9369
  ...commonOptions,
@@ -9372,7 +9372,7 @@ export default defineConfig({
9372
9372
  });
9373
9373
  `;
9374
9374
  var CONFIG_TEMPLATE = `
9375
- import { metro } from "@hot-updater/metro";
9375
+ import { bare } from "@hot-updater/bare";
9376
9376
  import { s3Storage, s3Database } from "@hot-updater/aws";
9377
9377
  import { defineConfig } from "hot-updater";
9378
9378
  import "dotenv/config";
@@ -9387,7 +9387,7 @@ const options = {
9387
9387
  };
9388
9388
 
9389
9389
  export default defineConfig({
9390
- build: metro({ enableHermes: true }),
9390
+ build: bare({ enableHermes: true }),
9391
9391
  storage: s3Storage(options),
9392
9392
  database: s3Database(options),
9393
9393
  });
package/dist/index.cjs CHANGED
@@ -42,36 +42,6 @@ var import_client_s3 = require("@aws-sdk/client-s3");
42
42
  var import_lib_storage = require("@aws-sdk/lib-storage");
43
43
  var import_plugin_core = require("@hot-updater/plugin-core");
44
44
 
45
- // ../../node_modules/.pnpm/es-toolkit@1.32.0/node_modules/es-toolkit/dist/_internal/compareValues.mjs
46
- function compareValues(a, b, order) {
47
- if (a < b) {
48
- return order === "asc" ? -1 : 1;
49
- }
50
- if (a > b) {
51
- return order === "asc" ? 1 : -1;
52
- }
53
- return 0;
54
- }
55
-
56
- // ../../node_modules/.pnpm/es-toolkit@1.32.0/node_modules/es-toolkit/dist/array/orderBy.mjs
57
- function orderBy(arr, criteria, orders) {
58
- return arr.slice().sort((a, b) => {
59
- const ordersLength = orders.length;
60
- for (let i = 0; i < criteria.length; i++) {
61
- const order = ordersLength > i ? orders[i] : orders[ordersLength - 1];
62
- const criterion = criteria[i];
63
- const criterionIsFunction = typeof criterion === "function";
64
- const valueA = criterionIsFunction ? criterion(a) : a[criterion];
65
- const valueB = criterionIsFunction ? criterion(b) : b[criterion];
66
- const result = compareValues(valueA, valueB, order);
67
- if (result !== 0) {
68
- return result;
69
- }
70
- }
71
- return 0;
72
- });
73
- }
74
-
75
45
  // ../../node_modules/.pnpm/mime@4.0.4/node_modules/mime/dist/types/other.js
76
46
  var types = { "application/prs.cww": ["cww"], "application/prs.xsf+xml": ["xsf"], "application/vnd.1000minds.decision-model+xml": ["1km"], "application/vnd.3gpp.pic-bw-large": ["plb"], "application/vnd.3gpp.pic-bw-small": ["psb"], "application/vnd.3gpp.pic-bw-var": ["pvb"], "application/vnd.3gpp2.tcap": ["tcap"], "application/vnd.3m.post-it-notes": ["pwn"], "application/vnd.accpac.simply.aso": ["aso"], "application/vnd.accpac.simply.imp": ["imp"], "application/vnd.acucobol": ["acu"], "application/vnd.acucorp": ["atc", "acutc"], "application/vnd.adobe.air-application-installer-package+zip": ["air"], "application/vnd.adobe.formscentral.fcdt": ["fcdt"], "application/vnd.adobe.fxp": ["fxp", "fxpl"], "application/vnd.adobe.xdp+xml": ["xdp"], "application/vnd.adobe.xfdf": ["*xfdf"], "application/vnd.age": ["age"], "application/vnd.ahead.space": ["ahead"], "application/vnd.airzip.filesecure.azf": ["azf"], "application/vnd.airzip.filesecure.azs": ["azs"], "application/vnd.amazon.ebook": ["azw"], "application/vnd.americandynamics.acc": ["acc"], "application/vnd.amiga.ami": ["ami"], "application/vnd.android.package-archive": ["apk"], "application/vnd.anser-web-certificate-issue-initiation": ["cii"], "application/vnd.anser-web-funds-transfer-initiation": ["fti"], "application/vnd.antix.game-component": ["atx"], "application/vnd.apple.installer+xml": ["mpkg"], "application/vnd.apple.keynote": ["key"], "application/vnd.apple.mpegurl": ["m3u8"], "application/vnd.apple.numbers": ["numbers"], "application/vnd.apple.pages": ["pages"], "application/vnd.apple.pkpass": ["pkpass"], "application/vnd.aristanetworks.swi": ["swi"], "application/vnd.astraea-software.iota": ["iota"], "application/vnd.audiograph": ["aep"], "application/vnd.balsamiq.bmml+xml": ["bmml"], "application/vnd.blueice.multipass": ["mpm"], "application/vnd.bmi": ["bmi"], "application/vnd.businessobjects": ["rep"], "application/vnd.chemdraw+xml": ["cdxml"], "application/vnd.chipnuts.karaoke-mmd": ["mmd"], "application/vnd.cinderella": ["cdy"], "application/vnd.citationstyles.style+xml": ["csl"], "application/vnd.claymore": ["cla"], "application/vnd.cloanto.rp9": ["rp9"], "application/vnd.clonk.c4group": ["c4g", "c4d", "c4f", "c4p", "c4u"], "application/vnd.cluetrust.cartomobile-config": ["c11amc"], "application/vnd.cluetrust.cartomobile-config-pkg": ["c11amz"], "application/vnd.commonspace": ["csp"], "application/vnd.contact.cmsg": ["cdbcmsg"], "application/vnd.cosmocaller": ["cmc"], "application/vnd.crick.clicker": ["clkx"], "application/vnd.crick.clicker.keyboard": ["clkk"], "application/vnd.crick.clicker.palette": ["clkp"], "application/vnd.crick.clicker.template": ["clkt"], "application/vnd.crick.clicker.wordbank": ["clkw"], "application/vnd.criticaltools.wbs+xml": ["wbs"], "application/vnd.ctc-posml": ["pml"], "application/vnd.cups-ppd": ["ppd"], "application/vnd.curl.car": ["car"], "application/vnd.curl.pcurl": ["pcurl"], "application/vnd.dart": ["dart"], "application/vnd.data-vision.rdz": ["rdz"], "application/vnd.dbf": ["dbf"], "application/vnd.dece.data": ["uvf", "uvvf", "uvd", "uvvd"], "application/vnd.dece.ttml+xml": ["uvt", "uvvt"], "application/vnd.dece.unspecified": ["uvx", "uvvx"], "application/vnd.dece.zip": ["uvz", "uvvz"], "application/vnd.denovo.fcselayout-link": ["fe_launch"], "application/vnd.dna": ["dna"], "application/vnd.dolby.mlp": ["mlp"], "application/vnd.dpgraph": ["dpg"], "application/vnd.dreamfactory": ["dfac"], "application/vnd.ds-keypoint": ["kpxx"], "application/vnd.dvb.ait": ["ait"], "application/vnd.dvb.service": ["svc"], "application/vnd.dynageo": ["geo"], "application/vnd.ecowin.chart": ["mag"], "application/vnd.enliven": ["nml"], "application/vnd.epson.esf": ["esf"], "application/vnd.epson.msf": ["msf"], "application/vnd.epson.quickanime": ["qam"], "application/vnd.epson.salt": ["slt"], "application/vnd.epson.ssf": ["ssf"], "application/vnd.eszigno3+xml": ["es3", "et3"], "application/vnd.ezpix-album": ["ez2"], "application/vnd.ezpix-package": ["ez3"], "application/vnd.fdf": ["*fdf"], "application/vnd.fdsn.mseed": ["mseed"], "application/vnd.fdsn.seed": ["seed", "dataless"], "application/vnd.flographit": ["gph"], "application/vnd.fluxtime.clip": ["ftc"], "application/vnd.framemaker": ["fm", "frame", "maker", "book"], "application/vnd.frogans.fnc": ["fnc"], "application/vnd.frogans.ltf": ["ltf"], "application/vnd.fsc.weblaunch": ["fsc"], "application/vnd.fujitsu.oasys": ["oas"], "application/vnd.fujitsu.oasys2": ["oa2"], "application/vnd.fujitsu.oasys3": ["oa3"], "application/vnd.fujitsu.oasysgp": ["fg5"], "application/vnd.fujitsu.oasysprs": ["bh2"], "application/vnd.fujixerox.ddd": ["ddd"], "application/vnd.fujixerox.docuworks": ["xdw"], "application/vnd.fujixerox.docuworks.binder": ["xbd"], "application/vnd.fuzzysheet": ["fzs"], "application/vnd.genomatix.tuxedo": ["txd"], "application/vnd.geogebra.file": ["ggb"], "application/vnd.geogebra.tool": ["ggt"], "application/vnd.geometry-explorer": ["gex", "gre"], "application/vnd.geonext": ["gxt"], "application/vnd.geoplan": ["g2w"], "application/vnd.geospace": ["g3w"], "application/vnd.gmx": ["gmx"], "application/vnd.google-apps.document": ["gdoc"], "application/vnd.google-apps.presentation": ["gslides"], "application/vnd.google-apps.spreadsheet": ["gsheet"], "application/vnd.google-earth.kml+xml": ["kml"], "application/vnd.google-earth.kmz": ["kmz"], "application/vnd.grafeq": ["gqf", "gqs"], "application/vnd.groove-account": ["gac"], "application/vnd.groove-help": ["ghf"], "application/vnd.groove-identity-message": ["gim"], "application/vnd.groove-injector": ["grv"], "application/vnd.groove-tool-message": ["gtm"], "application/vnd.groove-tool-template": ["tpl"], "application/vnd.groove-vcard": ["vcg"], "application/vnd.hal+xml": ["hal"], "application/vnd.handheld-entertainment+xml": ["zmm"], "application/vnd.hbci": ["hbci"], "application/vnd.hhe.lesson-player": ["les"], "application/vnd.hp-hpgl": ["hpgl"], "application/vnd.hp-hpid": ["hpid"], "application/vnd.hp-hps": ["hps"], "application/vnd.hp-jlyt": ["jlt"], "application/vnd.hp-pcl": ["pcl"], "application/vnd.hp-pclxl": ["pclxl"], "application/vnd.hydrostatix.sof-data": ["sfd-hdstx"], "application/vnd.ibm.minipay": ["mpy"], "application/vnd.ibm.modcap": ["afp", "listafp", "list3820"], "application/vnd.ibm.rights-management": ["irm"], "application/vnd.ibm.secure-container": ["sc"], "application/vnd.iccprofile": ["icc", "icm"], "application/vnd.igloader": ["igl"], "application/vnd.immervision-ivp": ["ivp"], "application/vnd.immervision-ivu": ["ivu"], "application/vnd.insors.igm": ["igm"], "application/vnd.intercon.formnet": ["xpw", "xpx"], "application/vnd.intergeo": ["i2g"], "application/vnd.intu.qbo": ["qbo"], "application/vnd.intu.qfx": ["qfx"], "application/vnd.ipunplugged.rcprofile": ["rcprofile"], "application/vnd.irepository.package+xml": ["irp"], "application/vnd.is-xpr": ["xpr"], "application/vnd.isac.fcs": ["fcs"], "application/vnd.jam": ["jam"], "application/vnd.jcp.javame.midlet-rms": ["rms"], "application/vnd.jisp": ["jisp"], "application/vnd.joost.joda-archive": ["joda"], "application/vnd.kahootz": ["ktz", "ktr"], "application/vnd.kde.karbon": ["karbon"], "application/vnd.kde.kchart": ["chrt"], "application/vnd.kde.kformula": ["kfo"], "application/vnd.kde.kivio": ["flw"], "application/vnd.kde.kontour": ["kon"], "application/vnd.kde.kpresenter": ["kpr", "kpt"], "application/vnd.kde.kspread": ["ksp"], "application/vnd.kde.kword": ["kwd", "kwt"], "application/vnd.kenameaapp": ["htke"], "application/vnd.kidspiration": ["kia"], "application/vnd.kinar": ["kne", "knp"], "application/vnd.koan": ["skp", "skd", "skt", "skm"], "application/vnd.kodak-descriptor": ["sse"], "application/vnd.las.las+xml": ["lasxml"], "application/vnd.llamagraphics.life-balance.desktop": ["lbd"], "application/vnd.llamagraphics.life-balance.exchange+xml": ["lbe"], "application/vnd.lotus-1-2-3": ["123"], "application/vnd.lotus-approach": ["apr"], "application/vnd.lotus-freelance": ["pre"], "application/vnd.lotus-notes": ["nsf"], "application/vnd.lotus-organizer": ["org"], "application/vnd.lotus-screencam": ["scm"], "application/vnd.lotus-wordpro": ["lwp"], "application/vnd.macports.portpkg": ["portpkg"], "application/vnd.mapbox-vector-tile": ["mvt"], "application/vnd.mcd": ["mcd"], "application/vnd.medcalcdata": ["mc1"], "application/vnd.mediastation.cdkey": ["cdkey"], "application/vnd.mfer": ["mwf"], "application/vnd.mfmp": ["mfm"], "application/vnd.micrografx.flo": ["flo"], "application/vnd.micrografx.igx": ["igx"], "application/vnd.mif": ["mif"], "application/vnd.mobius.daf": ["daf"], "application/vnd.mobius.dis": ["dis"], "application/vnd.mobius.mbk": ["mbk"], "application/vnd.mobius.mqy": ["mqy"], "application/vnd.mobius.msl": ["msl"], "application/vnd.mobius.plc": ["plc"], "application/vnd.mobius.txf": ["txf"], "application/vnd.mophun.application": ["mpn"], "application/vnd.mophun.certificate": ["mpc"], "application/vnd.mozilla.xul+xml": ["xul"], "application/vnd.ms-artgalry": ["cil"], "application/vnd.ms-cab-compressed": ["cab"], "application/vnd.ms-excel": ["xls", "xlm", "xla", "xlc", "xlt", "xlw"], "application/vnd.ms-excel.addin.macroenabled.12": ["xlam"], "application/vnd.ms-excel.sheet.binary.macroenabled.12": ["xlsb"], "application/vnd.ms-excel.sheet.macroenabled.12": ["xlsm"], "application/vnd.ms-excel.template.macroenabled.12": ["xltm"], "application/vnd.ms-fontobject": ["eot"], "application/vnd.ms-htmlhelp": ["chm"], "application/vnd.ms-ims": ["ims"], "application/vnd.ms-lrm": ["lrm"], "application/vnd.ms-officetheme": ["thmx"], "application/vnd.ms-outlook": ["msg"], "application/vnd.ms-pki.seccat": ["cat"], "application/vnd.ms-pki.stl": ["*stl"], "application/vnd.ms-powerpoint": ["ppt", "pps", "pot"], "application/vnd.ms-powerpoint.addin.macroenabled.12": ["ppam"], "application/vnd.ms-powerpoint.presentation.macroenabled.12": ["pptm"], "application/vnd.ms-powerpoint.slide.macroenabled.12": ["sldm"], "application/vnd.ms-powerpoint.slideshow.macroenabled.12": ["ppsm"], "application/vnd.ms-powerpoint.template.macroenabled.12": ["potm"], "application/vnd.ms-project": ["*mpp", "mpt"], "application/vnd.ms-word.document.macroenabled.12": ["docm"], "application/vnd.ms-word.template.macroenabled.12": ["dotm"], "application/vnd.ms-works": ["wps", "wks", "wcm", "wdb"], "application/vnd.ms-wpl": ["wpl"], "application/vnd.ms-xpsdocument": ["xps"], "application/vnd.mseq": ["mseq"], "application/vnd.musician": ["mus"], "application/vnd.muvee.style": ["msty"], "application/vnd.mynfc": ["taglet"], "application/vnd.neurolanguage.nlu": ["nlu"], "application/vnd.nitf": ["ntf", "nitf"], "application/vnd.noblenet-directory": ["nnd"], "application/vnd.noblenet-sealer": ["nns"], "application/vnd.noblenet-web": ["nnw"], "application/vnd.nokia.n-gage.ac+xml": ["*ac"], "application/vnd.nokia.n-gage.data": ["ngdat"], "application/vnd.nokia.n-gage.symbian.install": ["n-gage"], "application/vnd.nokia.radio-preset": ["rpst"], "application/vnd.nokia.radio-presets": ["rpss"], "application/vnd.novadigm.edm": ["edm"], "application/vnd.novadigm.edx": ["edx"], "application/vnd.novadigm.ext": ["ext"], "application/vnd.oasis.opendocument.chart": ["odc"], "application/vnd.oasis.opendocument.chart-template": ["otc"], "application/vnd.oasis.opendocument.database": ["odb"], "application/vnd.oasis.opendocument.formula": ["odf"], "application/vnd.oasis.opendocument.formula-template": ["odft"], "application/vnd.oasis.opendocument.graphics": ["odg"], "application/vnd.oasis.opendocument.graphics-template": ["otg"], "application/vnd.oasis.opendocument.image": ["odi"], "application/vnd.oasis.opendocument.image-template": ["oti"], "application/vnd.oasis.opendocument.presentation": ["odp"], "application/vnd.oasis.opendocument.presentation-template": ["otp"], "application/vnd.oasis.opendocument.spreadsheet": ["ods"], "application/vnd.oasis.opendocument.spreadsheet-template": ["ots"], "application/vnd.oasis.opendocument.text": ["odt"], "application/vnd.oasis.opendocument.text-master": ["odm"], "application/vnd.oasis.opendocument.text-template": ["ott"], "application/vnd.oasis.opendocument.text-web": ["oth"], "application/vnd.olpc-sugar": ["xo"], "application/vnd.oma.dd2+xml": ["dd2"], "application/vnd.openblox.game+xml": ["obgx"], "application/vnd.openofficeorg.extension": ["oxt"], "application/vnd.openstreetmap.data+xml": ["osm"], "application/vnd.openxmlformats-officedocument.presentationml.presentation": ["pptx"], "application/vnd.openxmlformats-officedocument.presentationml.slide": ["sldx"], "application/vnd.openxmlformats-officedocument.presentationml.slideshow": ["ppsx"], "application/vnd.openxmlformats-officedocument.presentationml.template": ["potx"], "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": ["xlsx"], "application/vnd.openxmlformats-officedocument.spreadsheetml.template": ["xltx"], "application/vnd.openxmlformats-officedocument.wordprocessingml.document": ["docx"], "application/vnd.openxmlformats-officedocument.wordprocessingml.template": ["dotx"], "application/vnd.osgeo.mapguide.package": ["mgp"], "application/vnd.osgi.dp": ["dp"], "application/vnd.osgi.subsystem": ["esa"], "application/vnd.palm": ["pdb", "pqa", "oprc"], "application/vnd.pawaafile": ["paw"], "application/vnd.pg.format": ["str"], "application/vnd.pg.osasli": ["ei6"], "application/vnd.picsel": ["efif"], "application/vnd.pmi.widget": ["wg"], "application/vnd.pocketlearn": ["plf"], "application/vnd.powerbuilder6": ["pbd"], "application/vnd.previewsystems.box": ["box"], "application/vnd.proteus.magazine": ["mgz"], "application/vnd.publishare-delta-tree": ["qps"], "application/vnd.pvi.ptid1": ["ptid"], "application/vnd.pwg-xhtml-print+xml": ["xhtm"], "application/vnd.quark.quarkxpress": ["qxd", "qxt", "qwd", "qwt", "qxl", "qxb"], "application/vnd.rar": ["rar"], "application/vnd.realvnc.bed": ["bed"], "application/vnd.recordare.musicxml": ["mxl"], "application/vnd.recordare.musicxml+xml": ["musicxml"], "application/vnd.rig.cryptonote": ["cryptonote"], "application/vnd.rim.cod": ["cod"], "application/vnd.rn-realmedia": ["rm"], "application/vnd.rn-realmedia-vbr": ["rmvb"], "application/vnd.route66.link66+xml": ["link66"], "application/vnd.sailingtracker.track": ["st"], "application/vnd.seemail": ["see"], "application/vnd.sema": ["sema"], "application/vnd.semd": ["semd"], "application/vnd.semf": ["semf"], "application/vnd.shana.informed.formdata": ["ifm"], "application/vnd.shana.informed.formtemplate": ["itp"], "application/vnd.shana.informed.interchange": ["iif"], "application/vnd.shana.informed.package": ["ipk"], "application/vnd.simtech-mindmapper": ["twd", "twds"], "application/vnd.smaf": ["mmf"], "application/vnd.smart.teacher": ["teacher"], "application/vnd.software602.filler.form+xml": ["fo"], "application/vnd.solent.sdkm+xml": ["sdkm", "sdkd"], "application/vnd.spotfire.dxp": ["dxp"], "application/vnd.spotfire.sfs": ["sfs"], "application/vnd.stardivision.calc": ["sdc"], "application/vnd.stardivision.draw": ["sda"], "application/vnd.stardivision.impress": ["sdd"], "application/vnd.stardivision.math": ["smf"], "application/vnd.stardivision.writer": ["sdw", "vor"], "application/vnd.stardivision.writer-global": ["sgl"], "application/vnd.stepmania.package": ["smzip"], "application/vnd.stepmania.stepchart": ["sm"], "application/vnd.sun.wadl+xml": ["wadl"], "application/vnd.sun.xml.calc": ["sxc"], "application/vnd.sun.xml.calc.template": ["stc"], "application/vnd.sun.xml.draw": ["sxd"], "application/vnd.sun.xml.draw.template": ["std"], "application/vnd.sun.xml.impress": ["sxi"], "application/vnd.sun.xml.impress.template": ["sti"], "application/vnd.sun.xml.math": ["sxm"], "application/vnd.sun.xml.writer": ["sxw"], "application/vnd.sun.xml.writer.global": ["sxg"], "application/vnd.sun.xml.writer.template": ["stw"], "application/vnd.sus-calendar": ["sus", "susp"], "application/vnd.svd": ["svd"], "application/vnd.symbian.install": ["sis", "sisx"], "application/vnd.syncml+xml": ["xsm"], "application/vnd.syncml.dm+wbxml": ["bdm"], "application/vnd.syncml.dm+xml": ["xdm"], "application/vnd.syncml.dmddf+xml": ["ddf"], "application/vnd.tao.intent-module-archive": ["tao"], "application/vnd.tcpdump.pcap": ["pcap", "cap", "dmp"], "application/vnd.tmobile-livetv": ["tmo"], "application/vnd.trid.tpt": ["tpt"], "application/vnd.triscape.mxs": ["mxs"], "application/vnd.trueapp": ["tra"], "application/vnd.ufdl": ["ufd", "ufdl"], "application/vnd.uiq.theme": ["utz"], "application/vnd.umajin": ["umj"], "application/vnd.unity": ["unityweb"], "application/vnd.uoml+xml": ["uoml", "uo"], "application/vnd.vcx": ["vcx"], "application/vnd.visio": ["vsd", "vst", "vss", "vsw"], "application/vnd.visionary": ["vis"], "application/vnd.vsf": ["vsf"], "application/vnd.wap.wbxml": ["wbxml"], "application/vnd.wap.wmlc": ["wmlc"], "application/vnd.wap.wmlscriptc": ["wmlsc"], "application/vnd.webturbo": ["wtb"], "application/vnd.wolfram.player": ["nbp"], "application/vnd.wordperfect": ["wpd"], "application/vnd.wqd": ["wqd"], "application/vnd.wt.stf": ["stf"], "application/vnd.xara": ["xar"], "application/vnd.xfdl": ["xfdl"], "application/vnd.yamaha.hv-dic": ["hvd"], "application/vnd.yamaha.hv-script": ["hvs"], "application/vnd.yamaha.hv-voice": ["hvp"], "application/vnd.yamaha.openscoreformat": ["osf"], "application/vnd.yamaha.openscoreformat.osfpvg+xml": ["osfpvg"], "application/vnd.yamaha.smaf-audio": ["saf"], "application/vnd.yamaha.smaf-phrase": ["spf"], "application/vnd.yellowriver-custom-menu": ["cmp"], "application/vnd.zul": ["zir", "zirz"], "application/vnd.zzazz.deck+xml": ["zaz"], "application/x-7z-compressed": ["7z"], "application/x-abiword": ["abw"], "application/x-ace-compressed": ["ace"], "application/x-apple-diskimage": ["*dmg"], "application/x-arj": ["arj"], "application/x-authorware-bin": ["aab", "x32", "u32", "vox"], "application/x-authorware-map": ["aam"], "application/x-authorware-seg": ["aas"], "application/x-bcpio": ["bcpio"], "application/x-bdoc": ["*bdoc"], "application/x-bittorrent": ["torrent"], "application/x-blorb": ["blb", "blorb"], "application/x-bzip": ["bz"], "application/x-bzip2": ["bz2", "boz"], "application/x-cbr": ["cbr", "cba", "cbt", "cbz", "cb7"], "application/x-cdlink": ["vcd"], "application/x-cfs-compressed": ["cfs"], "application/x-chat": ["chat"], "application/x-chess-pgn": ["pgn"], "application/x-chrome-extension": ["crx"], "application/x-cocoa": ["cco"], "application/x-conference": ["nsc"], "application/x-cpio": ["cpio"], "application/x-csh": ["csh"], "application/x-debian-package": ["*deb", "udeb"], "application/x-dgc-compressed": ["dgc"], "application/x-director": ["dir", "dcr", "dxr", "cst", "cct", "cxt", "w3d", "fgd", "swa"], "application/x-doom": ["wad"], "application/x-dtbncx+xml": ["ncx"], "application/x-dtbook+xml": ["dtb"], "application/x-dtbresource+xml": ["res"], "application/x-dvi": ["dvi"], "application/x-envoy": ["evy"], "application/x-eva": ["eva"], "application/x-font-bdf": ["bdf"], "application/x-font-ghostscript": ["gsf"], "application/x-font-linux-psf": ["psf"], "application/x-font-pcf": ["pcf"], "application/x-font-snf": ["snf"], "application/x-font-type1": ["pfa", "pfb", "pfm", "afm"], "application/x-freearc": ["arc"], "application/x-futuresplash": ["spl"], "application/x-gca-compressed": ["gca"], "application/x-glulx": ["ulx"], "application/x-gnumeric": ["gnumeric"], "application/x-gramps-xml": ["gramps"], "application/x-gtar": ["gtar"], "application/x-hdf": ["hdf"], "application/x-httpd-php": ["php"], "application/x-install-instructions": ["install"], "application/x-iso9660-image": ["*iso"], "application/x-iwork-keynote-sffkey": ["*key"], "application/x-iwork-numbers-sffnumbers": ["*numbers"], "application/x-iwork-pages-sffpages": ["*pages"], "application/x-java-archive-diff": ["jardiff"], "application/x-java-jnlp-file": ["jnlp"], "application/x-keepass2": ["kdbx"], "application/x-latex": ["latex"], "application/x-lua-bytecode": ["luac"], "application/x-lzh-compressed": ["lzh", "lha"], "application/x-makeself": ["run"], "application/x-mie": ["mie"], "application/x-mobipocket-ebook": ["*prc", "mobi"], "application/x-ms-application": ["application"], "application/x-ms-shortcut": ["lnk"], "application/x-ms-wmd": ["wmd"], "application/x-ms-wmz": ["wmz"], "application/x-ms-xbap": ["xbap"], "application/x-msaccess": ["mdb"], "application/x-msbinder": ["obd"], "application/x-mscardfile": ["crd"], "application/x-msclip": ["clp"], "application/x-msdos-program": ["*exe"], "application/x-msdownload": ["*exe", "*dll", "com", "bat", "*msi"], "application/x-msmediaview": ["mvb", "m13", "m14"], "application/x-msmetafile": ["*wmf", "*wmz", "*emf", "emz"], "application/x-msmoney": ["mny"], "application/x-mspublisher": ["pub"], "application/x-msschedule": ["scd"], "application/x-msterminal": ["trm"], "application/x-mswrite": ["wri"], "application/x-netcdf": ["nc", "cdf"], "application/x-ns-proxy-autoconfig": ["pac"], "application/x-nzb": ["nzb"], "application/x-perl": ["pl", "pm"], "application/x-pilot": ["*prc", "*pdb"], "application/x-pkcs12": ["p12", "pfx"], "application/x-pkcs7-certificates": ["p7b", "spc"], "application/x-pkcs7-certreqresp": ["p7r"], "application/x-rar-compressed": ["*rar"], "application/x-redhat-package-manager": ["rpm"], "application/x-research-info-systems": ["ris"], "application/x-sea": ["sea"], "application/x-sh": ["sh"], "application/x-shar": ["shar"], "application/x-shockwave-flash": ["swf"], "application/x-silverlight-app": ["xap"], "application/x-sql": ["*sql"], "application/x-stuffit": ["sit"], "application/x-stuffitx": ["sitx"], "application/x-subrip": ["srt"], "application/x-sv4cpio": ["sv4cpio"], "application/x-sv4crc": ["sv4crc"], "application/x-t3vm-image": ["t3"], "application/x-tads": ["gam"], "application/x-tar": ["tar"], "application/x-tcl": ["tcl", "tk"], "application/x-tex": ["tex"], "application/x-tex-tfm": ["tfm"], "application/x-texinfo": ["texinfo", "texi"], "application/x-tgif": ["*obj"], "application/x-ustar": ["ustar"], "application/x-virtualbox-hdd": ["hdd"], "application/x-virtualbox-ova": ["ova"], "application/x-virtualbox-ovf": ["ovf"], "application/x-virtualbox-vbox": ["vbox"], "application/x-virtualbox-vbox-extpack": ["vbox-extpack"], "application/x-virtualbox-vdi": ["vdi"], "application/x-virtualbox-vhd": ["vhd"], "application/x-virtualbox-vmdk": ["vmdk"], "application/x-wais-source": ["src"], "application/x-web-app-manifest+json": ["webapp"], "application/x-x509-ca-cert": ["der", "crt", "pem"], "application/x-xfig": ["fig"], "application/x-xliff+xml": ["*xlf"], "application/x-xpinstall": ["xpi"], "application/x-xz": ["xz"], "application/x-zmachine": ["z1", "z2", "z3", "z4", "z5", "z6", "z7", "z8"], "audio/vnd.dece.audio": ["uva", "uvva"], "audio/vnd.digital-winds": ["eol"], "audio/vnd.dra": ["dra"], "audio/vnd.dts": ["dts"], "audio/vnd.dts.hd": ["dtshd"], "audio/vnd.lucent.voice": ["lvp"], "audio/vnd.ms-playready.media.pya": ["pya"], "audio/vnd.nuera.ecelp4800": ["ecelp4800"], "audio/vnd.nuera.ecelp7470": ["ecelp7470"], "audio/vnd.nuera.ecelp9600": ["ecelp9600"], "audio/vnd.rip": ["rip"], "audio/x-aac": ["*aac"], "audio/x-aiff": ["aif", "aiff", "aifc"], "audio/x-caf": ["caf"], "audio/x-flac": ["flac"], "audio/x-m4a": ["*m4a"], "audio/x-matroska": ["mka"], "audio/x-mpegurl": ["m3u"], "audio/x-ms-wax": ["wax"], "audio/x-ms-wma": ["wma"], "audio/x-pn-realaudio": ["ram", "ra"], "audio/x-pn-realaudio-plugin": ["rmp"], "audio/x-realaudio": ["*ra"], "audio/x-wav": ["*wav"], "chemical/x-cdx": ["cdx"], "chemical/x-cif": ["cif"], "chemical/x-cmdf": ["cmdf"], "chemical/x-cml": ["cml"], "chemical/x-csml": ["csml"], "chemical/x-xyz": ["xyz"], "image/prs.btif": ["btif", "btf"], "image/prs.pti": ["pti"], "image/vnd.adobe.photoshop": ["psd"], "image/vnd.airzip.accelerator.azv": ["azv"], "image/vnd.dece.graphic": ["uvi", "uvvi", "uvg", "uvvg"], "image/vnd.djvu": ["djvu", "djv"], "image/vnd.dvb.subtitle": ["*sub"], "image/vnd.dwg": ["dwg"], "image/vnd.dxf": ["dxf"], "image/vnd.fastbidsheet": ["fbs"], "image/vnd.fpx": ["fpx"], "image/vnd.fst": ["fst"], "image/vnd.fujixerox.edmics-mmr": ["mmr"], "image/vnd.fujixerox.edmics-rlc": ["rlc"], "image/vnd.microsoft.icon": ["ico"], "image/vnd.ms-dds": ["dds"], "image/vnd.ms-modi": ["mdi"], "image/vnd.ms-photo": ["wdp"], "image/vnd.net-fpx": ["npx"], "image/vnd.pco.b16": ["b16"], "image/vnd.tencent.tap": ["tap"], "image/vnd.valve.source.texture": ["vtf"], "image/vnd.wap.wbmp": ["wbmp"], "image/vnd.xiff": ["xif"], "image/vnd.zbrush.pcx": ["pcx"], "image/x-3ds": ["3ds"], "image/x-cmu-raster": ["ras"], "image/x-cmx": ["cmx"], "image/x-freehand": ["fh", "fhc", "fh4", "fh5", "fh7"], "image/x-icon": ["*ico"], "image/x-jng": ["jng"], "image/x-mrsid-image": ["sid"], "image/x-ms-bmp": ["*bmp"], "image/x-pcx": ["*pcx"], "image/x-pict": ["pic", "pct"], "image/x-portable-anymap": ["pnm"], "image/x-portable-bitmap": ["pbm"], "image/x-portable-graymap": ["pgm"], "image/x-portable-pixmap": ["ppm"], "image/x-rgb": ["rgb"], "image/x-tga": ["tga"], "image/x-xbitmap": ["xbm"], "image/x-xpixmap": ["xpm"], "image/x-xwindowdump": ["xwd"], "message/vnd.wfa.wsc": ["wsc"], "model/vnd.cld": ["cld"], "model/vnd.collada+xml": ["dae"], "model/vnd.dwf": ["dwf"], "model/vnd.gdl": ["gdl"], "model/vnd.gtw": ["gtw"], "model/vnd.mts": ["mts"], "model/vnd.opengex": ["ogex"], "model/vnd.parasolid.transmit.binary": ["x_b"], "model/vnd.parasolid.transmit.text": ["x_t"], "model/vnd.pytha.pyox": ["pyo", "pyox"], "model/vnd.sap.vds": ["vds"], "model/vnd.usda": ["usda"], "model/vnd.usdz+zip": ["usdz"], "model/vnd.valve.source.compiled-map": ["bsp"], "model/vnd.vtu": ["vtu"], "text/prs.lines.tag": ["dsc"], "text/vnd.curl": ["curl"], "text/vnd.curl.dcurl": ["dcurl"], "text/vnd.curl.mcurl": ["mcurl"], "text/vnd.curl.scurl": ["scurl"], "text/vnd.dvb.subtitle": ["sub"], "text/vnd.familysearch.gedcom": ["ged"], "text/vnd.fly": ["fly"], "text/vnd.fmi.flexstor": ["flx"], "text/vnd.graphviz": ["gv"], "text/vnd.in3d.3dml": ["3dml"], "text/vnd.in3d.spot": ["spot"], "text/vnd.sun.j2me.app-descriptor": ["jad"], "text/vnd.wap.wml": ["wml"], "text/vnd.wap.wmlscript": ["wmls"], "text/x-asm": ["s", "asm"], "text/x-c": ["c", "cc", "cxx", "cpp", "h", "hh", "dic"], "text/x-component": ["htc"], "text/x-fortran": ["f", "for", "f77", "f90"], "text/x-handlebars-template": ["hbs"], "text/x-java-source": ["java"], "text/x-lua": ["lua"], "text/x-markdown": ["mkd"], "text/x-nfo": ["nfo"], "text/x-opml": ["opml"], "text/x-org": ["*org"], "text/x-pascal": ["p", "pas"], "text/x-processing": ["pde"], "text/x-sass": ["sass"], "text/x-scss": ["scss"], "text/x-setext": ["etx"], "text/x-sfv": ["sfv"], "text/x-suse-ymp": ["ymp"], "text/x-uuencode": ["uu"], "text/x-vcalendar": ["vcs"], "text/x-vcard": ["vcf"], "video/vnd.dece.hd": ["uvh", "uvvh"], "video/vnd.dece.mobile": ["uvm", "uvvm"], "video/vnd.dece.pd": ["uvp", "uvvp"], "video/vnd.dece.sd": ["uvs", "uvvs"], "video/vnd.dece.video": ["uvv", "uvvv"], "video/vnd.dvb.file": ["dvb"], "video/vnd.fvt": ["fvt"], "video/vnd.mpegurl": ["mxu", "m4u"], "video/vnd.ms-playready.media.pyv": ["pyv"], "video/vnd.uvvu.mp4": ["uvu", "uvvu"], "video/vnd.vivo": ["viv"], "video/x-f4v": ["f4v"], "video/x-fli": ["fli"], "video/x-flv": ["flv"], "video/x-m4v": ["m4v"], "video/x-matroska": ["mkv", "mk3d", "mks"], "video/x-mng": ["mng"], "video/x-ms-asf": ["asf", "asx"], "video/x-ms-vob": ["vob"], "video/x-ms-wm": ["wm"], "video/x-ms-wmv": ["wmv"], "video/x-ms-wmx": ["wmx"], "video/x-ms-wvx": ["wvx"], "video/x-msvideo": ["avi"], "video/x-sgi-movie": ["movie"], "video/x-smv": ["smv"], "x-conference/x-cooltalk": ["ice"] };
77
47
  Object.freeze(types);
@@ -212,33 +182,9 @@ async function uploadJsonToS3(client, bucket, key, data) {
212
182
  });
213
183
  await upload.done();
214
184
  }
215
- async function invalidateCloudFront(client, distributionId, paths) {
216
- if (paths.length === 0) {
217
- return;
218
- }
219
- const timestamp = (/* @__PURE__ */ new Date()).getTime();
220
- await client.send(
221
- new import_client_cloudfront.CreateInvalidationCommand({
222
- DistributionId: distributionId,
223
- InvalidationBatch: {
224
- CallerReference: `invalidation-${timestamp}`,
225
- Paths: {
226
- Quantity: paths.length,
227
- Items: paths
228
- }
229
- }
230
- })
231
- );
232
- }
233
- function removeBundleInternalKeys(bundle) {
234
- const { _updateJsonKey, _oldUpdateJsonKey, ...pureBundle } = bundle;
235
- return pureBundle;
236
- }
237
- async function listUpdateJsonKeys(client, bucketName, platform, channel) {
185
+ async function listObjectsInS3(client, bucketName, prefix) {
238
186
  let continuationToken;
239
187
  const keys = [];
240
- const prefix = channel ? platform ? `${channel}/${platform}/` : `${channel}/` : "";
241
- const pattern = channel ? platform ? new RegExp(`^${channel}/${platform}/[^/]+/update\\.json$`) : new RegExp(`^${channel}/[^/]+/[^/]+/update\\.json$`) : platform ? new RegExp(`^[^/]+/${platform}/[^/]+/update\\.json$`) : /^[^\/]+\/[^\/]+\/[^\/]+\/update\.json$/;
242
188
  do {
243
189
  const response = await client.send(
244
190
  new import_client_s3.ListObjectsV2Command({
@@ -247,56 +193,37 @@ async function listUpdateJsonKeys(client, bucketName, platform, channel) {
247
193
  ContinuationToken: continuationToken
248
194
  })
249
195
  );
250
- const found = (response.Contents ?? []).map((item) => item.Key).filter((key) => !!key && pattern.test(key));
196
+ const found = (response.Contents ?? []).map((item) => item.Key).filter((key) => !!key);
251
197
  keys.push(...found);
252
198
  continuationToken = response.NextContinuationToken;
253
199
  } while (continuationToken);
254
200
  return keys;
255
201
  }
256
- async function updateTargetVersionsForPlatform(client, bucketName, platform) {
257
- let continuationToken;
258
- const keys = [];
259
- const pattern = new RegExp(`^[^/]+/${platform}/[^/]+/update\\.json$`);
260
- do {
261
- const response = await client.send(
262
- new import_client_s3.ListObjectsV2Command({
263
- Bucket: bucketName,
264
- Prefix: "",
265
- ContinuationToken: continuationToken
266
- })
267
- );
268
- const found = (response.Contents ?? []).map((item) => item.Key).filter((key) => !!key && pattern.test(key));
269
- keys.push(...found);
270
- continuationToken = response.NextContinuationToken;
271
- } while (continuationToken);
272
- const keysByChannel = keys.reduce(
273
- (acc, key) => {
274
- const parts = key.split("/");
275
- const channel = parts[0];
276
- acc[channel] = acc[channel] || [];
277
- acc[channel].push(key);
278
- return acc;
279
- },
280
- {}
202
+ async function deleteObjectInS3(client, bucketName, key) {
203
+ await client.send(
204
+ new import_client_s3.DeleteObjectCommand({
205
+ Bucket: bucketName,
206
+ Key: key
207
+ })
281
208
  );
282
- const updatedTargetFiles = /* @__PURE__ */ new Set();
283
- for (const channel of Object.keys(keysByChannel)) {
284
- const updateKeys = keysByChannel[channel];
285
- const targetKey = `${channel}/${platform}/target-app-versions.json`;
286
- const currentVersions = updateKeys.map((key) => key.split("/")[2]);
287
- const oldTargetVersions = await loadJsonFromS3(client, bucketName, targetKey) ?? [];
288
- const newTargetVersions = oldTargetVersions.filter(
289
- (v) => currentVersions.includes(v)
290
- );
291
- for (const v of currentVersions) {
292
- if (!newTargetVersions.includes(v)) newTargetVersions.push(v);
293
- }
294
- if (JSON.stringify(oldTargetVersions) !== JSON.stringify(newTargetVersions)) {
295
- await uploadJsonToS3(client, bucketName, targetKey, newTargetVersions);
296
- updatedTargetFiles.add(`/${targetKey}`);
297
- }
209
+ }
210
+ async function invalidateCloudFront(client, distributionId, paths) {
211
+ if (paths.length === 0) {
212
+ return;
298
213
  }
299
- return updatedTargetFiles;
214
+ const timestamp = (/* @__PURE__ */ new Date()).getTime();
215
+ await client.send(
216
+ new import_client_cloudfront.CreateInvalidationCommand({
217
+ DistributionId: distributionId,
218
+ InvalidationBatch: {
219
+ CallerReference: `invalidation-${timestamp}`,
220
+ Paths: {
221
+ Quantity: paths.length,
222
+ Items: paths
223
+ }
224
+ }
225
+ })
226
+ );
300
227
  }
301
228
  var s3Database = (config, hooks) => {
302
229
  const { bucketName, cloudfrontDistributionId, ...s3Config } = config;
@@ -308,193 +235,34 @@ var s3Database = (config, hooks) => {
308
235
  credentials: s3Config.credentials,
309
236
  region: s3Config.region
310
237
  });
311
- const bundlesMap = /* @__PURE__ */ new Map();
312
- const pendingBundlesMap = /* @__PURE__ */ new Map();
313
- const PLATFORMS = ["ios", "android"];
314
- async function reloadBundles() {
315
- bundlesMap.clear();
316
- const platformPromises = PLATFORMS.map(async (platform) => {
317
- const keys = await listUpdateJsonKeys(client, bucketName, platform);
318
- const filePromises = keys.map(async (key) => {
319
- const bundlesData = await loadJsonFromS3(client, bucketName, key) ?? [];
320
- return bundlesData.map((bundle) => ({
321
- ...bundle,
322
- _updateJsonKey: key
323
- }));
324
- });
325
- const results = await Promise.all(filePromises);
326
- return results.flat();
327
- });
328
- const allBundles = (await Promise.all(platformPromises)).flat();
329
- for (const bundle of allBundles) {
330
- bundlesMap.set(bundle.id, bundle);
331
- }
332
- for (const [id, bundle] of pendingBundlesMap.entries()) {
333
- bundlesMap.set(id, bundle);
238
+ const listObjects = (prefix) => listObjectsInS3(client, bucketName, prefix);
239
+ function loadObject(key) {
240
+ return loadJsonFromS3(client, bucketName, key);
241
+ }
242
+ function uploadObject(key, data) {
243
+ return uploadJsonToS3(client, bucketName, key, data);
244
+ }
245
+ function deleteObject(key) {
246
+ return deleteObjectInS3(client, bucketName, key);
247
+ }
248
+ async function invalidatePaths(pathsToInvalidate) {
249
+ if (cloudfrontClient && cloudfrontDistributionId && pathsToInvalidate.length > 0) {
250
+ await invalidateCloudFront(
251
+ cloudfrontClient,
252
+ cloudfrontDistributionId,
253
+ pathsToInvalidate
254
+ );
334
255
  }
335
- return orderBy(allBundles, [(v) => v.id], ["desc"]);
336
256
  }
337
- return (0, import_plugin_core.createDatabasePlugin)(
338
- "s3Database",
339
- {
340
- async getBundleById(bundleId) {
341
- const pendingBundle = pendingBundlesMap.get(bundleId);
342
- if (pendingBundle) {
343
- return removeBundleInternalKeys(pendingBundle);
344
- }
345
- const bundle = bundlesMap.get(bundleId);
346
- if (bundle) {
347
- return removeBundleInternalKeys(bundle);
348
- }
349
- const bundles = await reloadBundles();
350
- return bundles.find((bundle2) => bundle2.id === bundleId) ?? null;
351
- },
352
- async getBundles(options) {
353
- let bundles = await reloadBundles();
354
- const { where, limit, offset = 0 } = options ?? {};
355
- if (where) {
356
- bundles = bundles.filter((bundle) => {
357
- return Object.entries(where).every(
358
- ([key, value]) => value === void 0 || value === null || bundle[key] === value
359
- );
360
- });
361
- }
362
- if (offset > 0) {
363
- bundles = bundles.slice(offset);
364
- }
365
- if (limit) {
366
- bundles = bundles.slice(0, limit);
367
- }
368
- return bundles.map(removeBundleInternalKeys);
369
- },
370
- async getChannels() {
371
- const allBundles = await this.getBundles();
372
- return [...new Set(allBundles.map((bundle) => bundle.channel))];
373
- },
374
- async commitBundle({ changedSets }) {
375
- if (changedSets.length === 0) return;
376
- const changedBundlesByKey = {};
377
- const removalsByKey = {};
378
- const pathsToInvalidate = /* @__PURE__ */ new Set();
379
- for (const { operation, data } of changedSets) {
380
- if (operation === "insert") {
381
- const key = `${data.channel}/${data.platform}/${data.targetAppVersion}/update.json`;
382
- const bundleWithKey = {
383
- ...data,
384
- _updateJsonKey: key
385
- };
386
- bundlesMap.set(data.id, bundleWithKey);
387
- pendingBundlesMap.set(data.id, bundleWithKey);
388
- changedBundlesByKey[key] = changedBundlesByKey[key] || [];
389
- changedBundlesByKey[key].push(
390
- removeBundleInternalKeys(bundleWithKey)
391
- );
392
- pathsToInvalidate.add(`/${key}`);
393
- continue;
394
- }
395
- let bundle = pendingBundlesMap.get(data.id);
396
- if (!bundle) {
397
- bundle = bundlesMap.get(data.id);
398
- }
399
- if (!bundle) {
400
- throw new Error("targetBundleId not found");
401
- }
402
- if (operation === "update") {
403
- const newChannel = data.channel !== void 0 ? data.channel : bundle.channel;
404
- const newPlatform = data.platform !== void 0 ? data.platform : bundle.platform;
405
- const newTargetAppVersion = data.targetAppVersion !== void 0 ? data.targetAppVersion : bundle.targetAppVersion;
406
- const newKey = `${newChannel}/${newPlatform}/${newTargetAppVersion}/update.json`;
407
- if (newKey !== bundle._updateJsonKey) {
408
- const oldKey = bundle._updateJsonKey;
409
- removalsByKey[oldKey] = removalsByKey[oldKey] || [];
410
- removalsByKey[oldKey].push(bundle.id);
411
- changedBundlesByKey[newKey] = changedBundlesByKey[newKey] || [];
412
- const updatedBundle2 = { ...bundle, ...data };
413
- updatedBundle2._oldUpdateJsonKey = oldKey;
414
- updatedBundle2._updateJsonKey = newKey;
415
- bundlesMap.set(data.id, updatedBundle2);
416
- pendingBundlesMap.set(data.id, updatedBundle2);
417
- changedBundlesByKey[newKey].push(
418
- removeBundleInternalKeys(updatedBundle2)
419
- );
420
- pathsToInvalidate.add(`/${oldKey}`);
421
- pathsToInvalidate.add(`/${newKey}`);
422
- continue;
423
- }
424
- const currentKey = bundle._updateJsonKey;
425
- const updatedBundle = { ...bundle, ...data };
426
- bundlesMap.set(data.id, updatedBundle);
427
- pendingBundlesMap.set(data.id, updatedBundle);
428
- changedBundlesByKey[currentKey] = changedBundlesByKey[currentKey] || [];
429
- changedBundlesByKey[currentKey].push(
430
- removeBundleInternalKeys(updatedBundle)
431
- );
432
- pathsToInvalidate.add(`/${currentKey}`);
433
- }
434
- }
435
- for (const oldKey of Object.keys(removalsByKey)) {
436
- await (async () => {
437
- const currentBundles = await loadJsonFromS3(client, bucketName, oldKey) ?? [];
438
- const updatedBundles = currentBundles.filter(
439
- (b) => !removalsByKey[oldKey].includes(b.id)
440
- );
441
- updatedBundles.sort((a, b) => b.id.localeCompare(a.id));
442
- if (updatedBundles.length === 0) {
443
- await client.send(
444
- new import_client_s3.DeleteObjectCommand({ Bucket: bucketName, Key: oldKey })
445
- );
446
- } else {
447
- await uploadJsonToS3(client, bucketName, oldKey, updatedBundles);
448
- }
449
- })();
450
- }
451
- for (const key of Object.keys(changedBundlesByKey)) {
452
- await (async () => {
453
- const currentBundles = await loadJsonFromS3(client, bucketName, key) ?? [];
454
- const pureBundles = changedBundlesByKey[key].map(
455
- (bundle) => bundle
456
- );
457
- for (const changedBundle of pureBundles) {
458
- const index = currentBundles.findIndex(
459
- (b) => b.id === changedBundle.id
460
- );
461
- if (index >= 0) {
462
- currentBundles[index] = changedBundle;
463
- } else {
464
- currentBundles.push(changedBundle);
465
- }
466
- }
467
- currentBundles.sort((a, b) => b.id.localeCompare(a.id));
468
- await uploadJsonToS3(client, bucketName, key, currentBundles);
469
- })();
470
- }
471
- const updatedTargetFilePaths = /* @__PURE__ */ new Set();
472
- for (const platform of PLATFORMS) {
473
- const updatedPaths = await updateTargetVersionsForPlatform(
474
- client,
475
- bucketName,
476
- platform
477
- );
478
- for (const path2 of updatedPaths) {
479
- updatedTargetFilePaths.add(path2);
480
- }
481
- }
482
- for (const path2 of updatedTargetFilePaths) {
483
- pathsToInvalidate.add(path2);
484
- }
485
- if (cloudfrontClient && cloudfrontDistributionId && pathsToInvalidate.size > 0) {
486
- await invalidateCloudFront(
487
- cloudfrontClient,
488
- cloudfrontDistributionId,
489
- Array.from(pathsToInvalidate)
490
- );
491
- }
492
- pendingBundlesMap.clear();
493
- hooks?.onDatabaseUpdated?.();
494
- }
495
- },
257
+ return (0, import_plugin_core.createBlobDatabasePlugin)({
258
+ name: "s3Database",
259
+ listObjects,
260
+ loadObject,
261
+ uploadObject,
262
+ deleteObject,
263
+ invalidatePaths,
496
264
  hooks
497
- );
265
+ });
498
266
  };
499
267
 
500
268
  // src/s3Storage.ts
package/dist/index.js CHANGED
@@ -13,37 +13,7 @@ import {
13
13
  S3Client
14
14
  } from "@aws-sdk/client-s3";
15
15
  import { Upload } from "@aws-sdk/lib-storage";
16
- import { createDatabasePlugin } from "@hot-updater/plugin-core";
17
-
18
- // ../../node_modules/.pnpm/es-toolkit@1.32.0/node_modules/es-toolkit/dist/_internal/compareValues.mjs
19
- function compareValues(a, b, order) {
20
- if (a < b) {
21
- return order === "asc" ? -1 : 1;
22
- }
23
- if (a > b) {
24
- return order === "asc" ? 1 : -1;
25
- }
26
- return 0;
27
- }
28
-
29
- // ../../node_modules/.pnpm/es-toolkit@1.32.0/node_modules/es-toolkit/dist/array/orderBy.mjs
30
- function orderBy(arr, criteria, orders) {
31
- return arr.slice().sort((a, b) => {
32
- const ordersLength = orders.length;
33
- for (let i = 0; i < criteria.length; i++) {
34
- const order = ordersLength > i ? orders[i] : orders[ordersLength - 1];
35
- const criterion = criteria[i];
36
- const criterionIsFunction = typeof criterion === "function";
37
- const valueA = criterionIsFunction ? criterion(a) : a[criterion];
38
- const valueB = criterionIsFunction ? criterion(b) : b[criterion];
39
- const result = compareValues(valueA, valueB, order);
40
- if (result !== 0) {
41
- return result;
42
- }
43
- }
44
- return 0;
45
- });
46
- }
16
+ import { createBlobDatabasePlugin } from "@hot-updater/plugin-core";
47
17
 
48
18
  // ../../node_modules/.pnpm/mime@4.0.4/node_modules/mime/dist/types/other.js
49
19
  var types = { "application/prs.cww": ["cww"], "application/prs.xsf+xml": ["xsf"], "application/vnd.1000minds.decision-model+xml": ["1km"], "application/vnd.3gpp.pic-bw-large": ["plb"], "application/vnd.3gpp.pic-bw-small": ["psb"], "application/vnd.3gpp.pic-bw-var": ["pvb"], "application/vnd.3gpp2.tcap": ["tcap"], "application/vnd.3m.post-it-notes": ["pwn"], "application/vnd.accpac.simply.aso": ["aso"], "application/vnd.accpac.simply.imp": ["imp"], "application/vnd.acucobol": ["acu"], "application/vnd.acucorp": ["atc", "acutc"], "application/vnd.adobe.air-application-installer-package+zip": ["air"], "application/vnd.adobe.formscentral.fcdt": ["fcdt"], "application/vnd.adobe.fxp": ["fxp", "fxpl"], "application/vnd.adobe.xdp+xml": ["xdp"], "application/vnd.adobe.xfdf": ["*xfdf"], "application/vnd.age": ["age"], "application/vnd.ahead.space": ["ahead"], "application/vnd.airzip.filesecure.azf": ["azf"], "application/vnd.airzip.filesecure.azs": ["azs"], "application/vnd.amazon.ebook": ["azw"], "application/vnd.americandynamics.acc": ["acc"], "application/vnd.amiga.ami": ["ami"], "application/vnd.android.package-archive": ["apk"], "application/vnd.anser-web-certificate-issue-initiation": ["cii"], "application/vnd.anser-web-funds-transfer-initiation": ["fti"], "application/vnd.antix.game-component": ["atx"], "application/vnd.apple.installer+xml": ["mpkg"], "application/vnd.apple.keynote": ["key"], "application/vnd.apple.mpegurl": ["m3u8"], "application/vnd.apple.numbers": ["numbers"], "application/vnd.apple.pages": ["pages"], "application/vnd.apple.pkpass": ["pkpass"], "application/vnd.aristanetworks.swi": ["swi"], "application/vnd.astraea-software.iota": ["iota"], "application/vnd.audiograph": ["aep"], "application/vnd.balsamiq.bmml+xml": ["bmml"], "application/vnd.blueice.multipass": ["mpm"], "application/vnd.bmi": ["bmi"], "application/vnd.businessobjects": ["rep"], "application/vnd.chemdraw+xml": ["cdxml"], "application/vnd.chipnuts.karaoke-mmd": ["mmd"], "application/vnd.cinderella": ["cdy"], "application/vnd.citationstyles.style+xml": ["csl"], "application/vnd.claymore": ["cla"], "application/vnd.cloanto.rp9": ["rp9"], "application/vnd.clonk.c4group": ["c4g", "c4d", "c4f", "c4p", "c4u"], "application/vnd.cluetrust.cartomobile-config": ["c11amc"], "application/vnd.cluetrust.cartomobile-config-pkg": ["c11amz"], "application/vnd.commonspace": ["csp"], "application/vnd.contact.cmsg": ["cdbcmsg"], "application/vnd.cosmocaller": ["cmc"], "application/vnd.crick.clicker": ["clkx"], "application/vnd.crick.clicker.keyboard": ["clkk"], "application/vnd.crick.clicker.palette": ["clkp"], "application/vnd.crick.clicker.template": ["clkt"], "application/vnd.crick.clicker.wordbank": ["clkw"], "application/vnd.criticaltools.wbs+xml": ["wbs"], "application/vnd.ctc-posml": ["pml"], "application/vnd.cups-ppd": ["ppd"], "application/vnd.curl.car": ["car"], "application/vnd.curl.pcurl": ["pcurl"], "application/vnd.dart": ["dart"], "application/vnd.data-vision.rdz": ["rdz"], "application/vnd.dbf": ["dbf"], "application/vnd.dece.data": ["uvf", "uvvf", "uvd", "uvvd"], "application/vnd.dece.ttml+xml": ["uvt", "uvvt"], "application/vnd.dece.unspecified": ["uvx", "uvvx"], "application/vnd.dece.zip": ["uvz", "uvvz"], "application/vnd.denovo.fcselayout-link": ["fe_launch"], "application/vnd.dna": ["dna"], "application/vnd.dolby.mlp": ["mlp"], "application/vnd.dpgraph": ["dpg"], "application/vnd.dreamfactory": ["dfac"], "application/vnd.ds-keypoint": ["kpxx"], "application/vnd.dvb.ait": ["ait"], "application/vnd.dvb.service": ["svc"], "application/vnd.dynageo": ["geo"], "application/vnd.ecowin.chart": ["mag"], "application/vnd.enliven": ["nml"], "application/vnd.epson.esf": ["esf"], "application/vnd.epson.msf": ["msf"], "application/vnd.epson.quickanime": ["qam"], "application/vnd.epson.salt": ["slt"], "application/vnd.epson.ssf": ["ssf"], "application/vnd.eszigno3+xml": ["es3", "et3"], "application/vnd.ezpix-album": ["ez2"], "application/vnd.ezpix-package": ["ez3"], "application/vnd.fdf": ["*fdf"], "application/vnd.fdsn.mseed": ["mseed"], "application/vnd.fdsn.seed": ["seed", "dataless"], "application/vnd.flographit": ["gph"], "application/vnd.fluxtime.clip": ["ftc"], "application/vnd.framemaker": ["fm", "frame", "maker", "book"], "application/vnd.frogans.fnc": ["fnc"], "application/vnd.frogans.ltf": ["ltf"], "application/vnd.fsc.weblaunch": ["fsc"], "application/vnd.fujitsu.oasys": ["oas"], "application/vnd.fujitsu.oasys2": ["oa2"], "application/vnd.fujitsu.oasys3": ["oa3"], "application/vnd.fujitsu.oasysgp": ["fg5"], "application/vnd.fujitsu.oasysprs": ["bh2"], "application/vnd.fujixerox.ddd": ["ddd"], "application/vnd.fujixerox.docuworks": ["xdw"], "application/vnd.fujixerox.docuworks.binder": ["xbd"], "application/vnd.fuzzysheet": ["fzs"], "application/vnd.genomatix.tuxedo": ["txd"], "application/vnd.geogebra.file": ["ggb"], "application/vnd.geogebra.tool": ["ggt"], "application/vnd.geometry-explorer": ["gex", "gre"], "application/vnd.geonext": ["gxt"], "application/vnd.geoplan": ["g2w"], "application/vnd.geospace": ["g3w"], "application/vnd.gmx": ["gmx"], "application/vnd.google-apps.document": ["gdoc"], "application/vnd.google-apps.presentation": ["gslides"], "application/vnd.google-apps.spreadsheet": ["gsheet"], "application/vnd.google-earth.kml+xml": ["kml"], "application/vnd.google-earth.kmz": ["kmz"], "application/vnd.grafeq": ["gqf", "gqs"], "application/vnd.groove-account": ["gac"], "application/vnd.groove-help": ["ghf"], "application/vnd.groove-identity-message": ["gim"], "application/vnd.groove-injector": ["grv"], "application/vnd.groove-tool-message": ["gtm"], "application/vnd.groove-tool-template": ["tpl"], "application/vnd.groove-vcard": ["vcg"], "application/vnd.hal+xml": ["hal"], "application/vnd.handheld-entertainment+xml": ["zmm"], "application/vnd.hbci": ["hbci"], "application/vnd.hhe.lesson-player": ["les"], "application/vnd.hp-hpgl": ["hpgl"], "application/vnd.hp-hpid": ["hpid"], "application/vnd.hp-hps": ["hps"], "application/vnd.hp-jlyt": ["jlt"], "application/vnd.hp-pcl": ["pcl"], "application/vnd.hp-pclxl": ["pclxl"], "application/vnd.hydrostatix.sof-data": ["sfd-hdstx"], "application/vnd.ibm.minipay": ["mpy"], "application/vnd.ibm.modcap": ["afp", "listafp", "list3820"], "application/vnd.ibm.rights-management": ["irm"], "application/vnd.ibm.secure-container": ["sc"], "application/vnd.iccprofile": ["icc", "icm"], "application/vnd.igloader": ["igl"], "application/vnd.immervision-ivp": ["ivp"], "application/vnd.immervision-ivu": ["ivu"], "application/vnd.insors.igm": ["igm"], "application/vnd.intercon.formnet": ["xpw", "xpx"], "application/vnd.intergeo": ["i2g"], "application/vnd.intu.qbo": ["qbo"], "application/vnd.intu.qfx": ["qfx"], "application/vnd.ipunplugged.rcprofile": ["rcprofile"], "application/vnd.irepository.package+xml": ["irp"], "application/vnd.is-xpr": ["xpr"], "application/vnd.isac.fcs": ["fcs"], "application/vnd.jam": ["jam"], "application/vnd.jcp.javame.midlet-rms": ["rms"], "application/vnd.jisp": ["jisp"], "application/vnd.joost.joda-archive": ["joda"], "application/vnd.kahootz": ["ktz", "ktr"], "application/vnd.kde.karbon": ["karbon"], "application/vnd.kde.kchart": ["chrt"], "application/vnd.kde.kformula": ["kfo"], "application/vnd.kde.kivio": ["flw"], "application/vnd.kde.kontour": ["kon"], "application/vnd.kde.kpresenter": ["kpr", "kpt"], "application/vnd.kde.kspread": ["ksp"], "application/vnd.kde.kword": ["kwd", "kwt"], "application/vnd.kenameaapp": ["htke"], "application/vnd.kidspiration": ["kia"], "application/vnd.kinar": ["kne", "knp"], "application/vnd.koan": ["skp", "skd", "skt", "skm"], "application/vnd.kodak-descriptor": ["sse"], "application/vnd.las.las+xml": ["lasxml"], "application/vnd.llamagraphics.life-balance.desktop": ["lbd"], "application/vnd.llamagraphics.life-balance.exchange+xml": ["lbe"], "application/vnd.lotus-1-2-3": ["123"], "application/vnd.lotus-approach": ["apr"], "application/vnd.lotus-freelance": ["pre"], "application/vnd.lotus-notes": ["nsf"], "application/vnd.lotus-organizer": ["org"], "application/vnd.lotus-screencam": ["scm"], "application/vnd.lotus-wordpro": ["lwp"], "application/vnd.macports.portpkg": ["portpkg"], "application/vnd.mapbox-vector-tile": ["mvt"], "application/vnd.mcd": ["mcd"], "application/vnd.medcalcdata": ["mc1"], "application/vnd.mediastation.cdkey": ["cdkey"], "application/vnd.mfer": ["mwf"], "application/vnd.mfmp": ["mfm"], "application/vnd.micrografx.flo": ["flo"], "application/vnd.micrografx.igx": ["igx"], "application/vnd.mif": ["mif"], "application/vnd.mobius.daf": ["daf"], "application/vnd.mobius.dis": ["dis"], "application/vnd.mobius.mbk": ["mbk"], "application/vnd.mobius.mqy": ["mqy"], "application/vnd.mobius.msl": ["msl"], "application/vnd.mobius.plc": ["plc"], "application/vnd.mobius.txf": ["txf"], "application/vnd.mophun.application": ["mpn"], "application/vnd.mophun.certificate": ["mpc"], "application/vnd.mozilla.xul+xml": ["xul"], "application/vnd.ms-artgalry": ["cil"], "application/vnd.ms-cab-compressed": ["cab"], "application/vnd.ms-excel": ["xls", "xlm", "xla", "xlc", "xlt", "xlw"], "application/vnd.ms-excel.addin.macroenabled.12": ["xlam"], "application/vnd.ms-excel.sheet.binary.macroenabled.12": ["xlsb"], "application/vnd.ms-excel.sheet.macroenabled.12": ["xlsm"], "application/vnd.ms-excel.template.macroenabled.12": ["xltm"], "application/vnd.ms-fontobject": ["eot"], "application/vnd.ms-htmlhelp": ["chm"], "application/vnd.ms-ims": ["ims"], "application/vnd.ms-lrm": ["lrm"], "application/vnd.ms-officetheme": ["thmx"], "application/vnd.ms-outlook": ["msg"], "application/vnd.ms-pki.seccat": ["cat"], "application/vnd.ms-pki.stl": ["*stl"], "application/vnd.ms-powerpoint": ["ppt", "pps", "pot"], "application/vnd.ms-powerpoint.addin.macroenabled.12": ["ppam"], "application/vnd.ms-powerpoint.presentation.macroenabled.12": ["pptm"], "application/vnd.ms-powerpoint.slide.macroenabled.12": ["sldm"], "application/vnd.ms-powerpoint.slideshow.macroenabled.12": ["ppsm"], "application/vnd.ms-powerpoint.template.macroenabled.12": ["potm"], "application/vnd.ms-project": ["*mpp", "mpt"], "application/vnd.ms-word.document.macroenabled.12": ["docm"], "application/vnd.ms-word.template.macroenabled.12": ["dotm"], "application/vnd.ms-works": ["wps", "wks", "wcm", "wdb"], "application/vnd.ms-wpl": ["wpl"], "application/vnd.ms-xpsdocument": ["xps"], "application/vnd.mseq": ["mseq"], "application/vnd.musician": ["mus"], "application/vnd.muvee.style": ["msty"], "application/vnd.mynfc": ["taglet"], "application/vnd.neurolanguage.nlu": ["nlu"], "application/vnd.nitf": ["ntf", "nitf"], "application/vnd.noblenet-directory": ["nnd"], "application/vnd.noblenet-sealer": ["nns"], "application/vnd.noblenet-web": ["nnw"], "application/vnd.nokia.n-gage.ac+xml": ["*ac"], "application/vnd.nokia.n-gage.data": ["ngdat"], "application/vnd.nokia.n-gage.symbian.install": ["n-gage"], "application/vnd.nokia.radio-preset": ["rpst"], "application/vnd.nokia.radio-presets": ["rpss"], "application/vnd.novadigm.edm": ["edm"], "application/vnd.novadigm.edx": ["edx"], "application/vnd.novadigm.ext": ["ext"], "application/vnd.oasis.opendocument.chart": ["odc"], "application/vnd.oasis.opendocument.chart-template": ["otc"], "application/vnd.oasis.opendocument.database": ["odb"], "application/vnd.oasis.opendocument.formula": ["odf"], "application/vnd.oasis.opendocument.formula-template": ["odft"], "application/vnd.oasis.opendocument.graphics": ["odg"], "application/vnd.oasis.opendocument.graphics-template": ["otg"], "application/vnd.oasis.opendocument.image": ["odi"], "application/vnd.oasis.opendocument.image-template": ["oti"], "application/vnd.oasis.opendocument.presentation": ["odp"], "application/vnd.oasis.opendocument.presentation-template": ["otp"], "application/vnd.oasis.opendocument.spreadsheet": ["ods"], "application/vnd.oasis.opendocument.spreadsheet-template": ["ots"], "application/vnd.oasis.opendocument.text": ["odt"], "application/vnd.oasis.opendocument.text-master": ["odm"], "application/vnd.oasis.opendocument.text-template": ["ott"], "application/vnd.oasis.opendocument.text-web": ["oth"], "application/vnd.olpc-sugar": ["xo"], "application/vnd.oma.dd2+xml": ["dd2"], "application/vnd.openblox.game+xml": ["obgx"], "application/vnd.openofficeorg.extension": ["oxt"], "application/vnd.openstreetmap.data+xml": ["osm"], "application/vnd.openxmlformats-officedocument.presentationml.presentation": ["pptx"], "application/vnd.openxmlformats-officedocument.presentationml.slide": ["sldx"], "application/vnd.openxmlformats-officedocument.presentationml.slideshow": ["ppsx"], "application/vnd.openxmlformats-officedocument.presentationml.template": ["potx"], "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": ["xlsx"], "application/vnd.openxmlformats-officedocument.spreadsheetml.template": ["xltx"], "application/vnd.openxmlformats-officedocument.wordprocessingml.document": ["docx"], "application/vnd.openxmlformats-officedocument.wordprocessingml.template": ["dotx"], "application/vnd.osgeo.mapguide.package": ["mgp"], "application/vnd.osgi.dp": ["dp"], "application/vnd.osgi.subsystem": ["esa"], "application/vnd.palm": ["pdb", "pqa", "oprc"], "application/vnd.pawaafile": ["paw"], "application/vnd.pg.format": ["str"], "application/vnd.pg.osasli": ["ei6"], "application/vnd.picsel": ["efif"], "application/vnd.pmi.widget": ["wg"], "application/vnd.pocketlearn": ["plf"], "application/vnd.powerbuilder6": ["pbd"], "application/vnd.previewsystems.box": ["box"], "application/vnd.proteus.magazine": ["mgz"], "application/vnd.publishare-delta-tree": ["qps"], "application/vnd.pvi.ptid1": ["ptid"], "application/vnd.pwg-xhtml-print+xml": ["xhtm"], "application/vnd.quark.quarkxpress": ["qxd", "qxt", "qwd", "qwt", "qxl", "qxb"], "application/vnd.rar": ["rar"], "application/vnd.realvnc.bed": ["bed"], "application/vnd.recordare.musicxml": ["mxl"], "application/vnd.recordare.musicxml+xml": ["musicxml"], "application/vnd.rig.cryptonote": ["cryptonote"], "application/vnd.rim.cod": ["cod"], "application/vnd.rn-realmedia": ["rm"], "application/vnd.rn-realmedia-vbr": ["rmvb"], "application/vnd.route66.link66+xml": ["link66"], "application/vnd.sailingtracker.track": ["st"], "application/vnd.seemail": ["see"], "application/vnd.sema": ["sema"], "application/vnd.semd": ["semd"], "application/vnd.semf": ["semf"], "application/vnd.shana.informed.formdata": ["ifm"], "application/vnd.shana.informed.formtemplate": ["itp"], "application/vnd.shana.informed.interchange": ["iif"], "application/vnd.shana.informed.package": ["ipk"], "application/vnd.simtech-mindmapper": ["twd", "twds"], "application/vnd.smaf": ["mmf"], "application/vnd.smart.teacher": ["teacher"], "application/vnd.software602.filler.form+xml": ["fo"], "application/vnd.solent.sdkm+xml": ["sdkm", "sdkd"], "application/vnd.spotfire.dxp": ["dxp"], "application/vnd.spotfire.sfs": ["sfs"], "application/vnd.stardivision.calc": ["sdc"], "application/vnd.stardivision.draw": ["sda"], "application/vnd.stardivision.impress": ["sdd"], "application/vnd.stardivision.math": ["smf"], "application/vnd.stardivision.writer": ["sdw", "vor"], "application/vnd.stardivision.writer-global": ["sgl"], "application/vnd.stepmania.package": ["smzip"], "application/vnd.stepmania.stepchart": ["sm"], "application/vnd.sun.wadl+xml": ["wadl"], "application/vnd.sun.xml.calc": ["sxc"], "application/vnd.sun.xml.calc.template": ["stc"], "application/vnd.sun.xml.draw": ["sxd"], "application/vnd.sun.xml.draw.template": ["std"], "application/vnd.sun.xml.impress": ["sxi"], "application/vnd.sun.xml.impress.template": ["sti"], "application/vnd.sun.xml.math": ["sxm"], "application/vnd.sun.xml.writer": ["sxw"], "application/vnd.sun.xml.writer.global": ["sxg"], "application/vnd.sun.xml.writer.template": ["stw"], "application/vnd.sus-calendar": ["sus", "susp"], "application/vnd.svd": ["svd"], "application/vnd.symbian.install": ["sis", "sisx"], "application/vnd.syncml+xml": ["xsm"], "application/vnd.syncml.dm+wbxml": ["bdm"], "application/vnd.syncml.dm+xml": ["xdm"], "application/vnd.syncml.dmddf+xml": ["ddf"], "application/vnd.tao.intent-module-archive": ["tao"], "application/vnd.tcpdump.pcap": ["pcap", "cap", "dmp"], "application/vnd.tmobile-livetv": ["tmo"], "application/vnd.trid.tpt": ["tpt"], "application/vnd.triscape.mxs": ["mxs"], "application/vnd.trueapp": ["tra"], "application/vnd.ufdl": ["ufd", "ufdl"], "application/vnd.uiq.theme": ["utz"], "application/vnd.umajin": ["umj"], "application/vnd.unity": ["unityweb"], "application/vnd.uoml+xml": ["uoml", "uo"], "application/vnd.vcx": ["vcx"], "application/vnd.visio": ["vsd", "vst", "vss", "vsw"], "application/vnd.visionary": ["vis"], "application/vnd.vsf": ["vsf"], "application/vnd.wap.wbxml": ["wbxml"], "application/vnd.wap.wmlc": ["wmlc"], "application/vnd.wap.wmlscriptc": ["wmlsc"], "application/vnd.webturbo": ["wtb"], "application/vnd.wolfram.player": ["nbp"], "application/vnd.wordperfect": ["wpd"], "application/vnd.wqd": ["wqd"], "application/vnd.wt.stf": ["stf"], "application/vnd.xara": ["xar"], "application/vnd.xfdl": ["xfdl"], "application/vnd.yamaha.hv-dic": ["hvd"], "application/vnd.yamaha.hv-script": ["hvs"], "application/vnd.yamaha.hv-voice": ["hvp"], "application/vnd.yamaha.openscoreformat": ["osf"], "application/vnd.yamaha.openscoreformat.osfpvg+xml": ["osfpvg"], "application/vnd.yamaha.smaf-audio": ["saf"], "application/vnd.yamaha.smaf-phrase": ["spf"], "application/vnd.yellowriver-custom-menu": ["cmp"], "application/vnd.zul": ["zir", "zirz"], "application/vnd.zzazz.deck+xml": ["zaz"], "application/x-7z-compressed": ["7z"], "application/x-abiword": ["abw"], "application/x-ace-compressed": ["ace"], "application/x-apple-diskimage": ["*dmg"], "application/x-arj": ["arj"], "application/x-authorware-bin": ["aab", "x32", "u32", "vox"], "application/x-authorware-map": ["aam"], "application/x-authorware-seg": ["aas"], "application/x-bcpio": ["bcpio"], "application/x-bdoc": ["*bdoc"], "application/x-bittorrent": ["torrent"], "application/x-blorb": ["blb", "blorb"], "application/x-bzip": ["bz"], "application/x-bzip2": ["bz2", "boz"], "application/x-cbr": ["cbr", "cba", "cbt", "cbz", "cb7"], "application/x-cdlink": ["vcd"], "application/x-cfs-compressed": ["cfs"], "application/x-chat": ["chat"], "application/x-chess-pgn": ["pgn"], "application/x-chrome-extension": ["crx"], "application/x-cocoa": ["cco"], "application/x-conference": ["nsc"], "application/x-cpio": ["cpio"], "application/x-csh": ["csh"], "application/x-debian-package": ["*deb", "udeb"], "application/x-dgc-compressed": ["dgc"], "application/x-director": ["dir", "dcr", "dxr", "cst", "cct", "cxt", "w3d", "fgd", "swa"], "application/x-doom": ["wad"], "application/x-dtbncx+xml": ["ncx"], "application/x-dtbook+xml": ["dtb"], "application/x-dtbresource+xml": ["res"], "application/x-dvi": ["dvi"], "application/x-envoy": ["evy"], "application/x-eva": ["eva"], "application/x-font-bdf": ["bdf"], "application/x-font-ghostscript": ["gsf"], "application/x-font-linux-psf": ["psf"], "application/x-font-pcf": ["pcf"], "application/x-font-snf": ["snf"], "application/x-font-type1": ["pfa", "pfb", "pfm", "afm"], "application/x-freearc": ["arc"], "application/x-futuresplash": ["spl"], "application/x-gca-compressed": ["gca"], "application/x-glulx": ["ulx"], "application/x-gnumeric": ["gnumeric"], "application/x-gramps-xml": ["gramps"], "application/x-gtar": ["gtar"], "application/x-hdf": ["hdf"], "application/x-httpd-php": ["php"], "application/x-install-instructions": ["install"], "application/x-iso9660-image": ["*iso"], "application/x-iwork-keynote-sffkey": ["*key"], "application/x-iwork-numbers-sffnumbers": ["*numbers"], "application/x-iwork-pages-sffpages": ["*pages"], "application/x-java-archive-diff": ["jardiff"], "application/x-java-jnlp-file": ["jnlp"], "application/x-keepass2": ["kdbx"], "application/x-latex": ["latex"], "application/x-lua-bytecode": ["luac"], "application/x-lzh-compressed": ["lzh", "lha"], "application/x-makeself": ["run"], "application/x-mie": ["mie"], "application/x-mobipocket-ebook": ["*prc", "mobi"], "application/x-ms-application": ["application"], "application/x-ms-shortcut": ["lnk"], "application/x-ms-wmd": ["wmd"], "application/x-ms-wmz": ["wmz"], "application/x-ms-xbap": ["xbap"], "application/x-msaccess": ["mdb"], "application/x-msbinder": ["obd"], "application/x-mscardfile": ["crd"], "application/x-msclip": ["clp"], "application/x-msdos-program": ["*exe"], "application/x-msdownload": ["*exe", "*dll", "com", "bat", "*msi"], "application/x-msmediaview": ["mvb", "m13", "m14"], "application/x-msmetafile": ["*wmf", "*wmz", "*emf", "emz"], "application/x-msmoney": ["mny"], "application/x-mspublisher": ["pub"], "application/x-msschedule": ["scd"], "application/x-msterminal": ["trm"], "application/x-mswrite": ["wri"], "application/x-netcdf": ["nc", "cdf"], "application/x-ns-proxy-autoconfig": ["pac"], "application/x-nzb": ["nzb"], "application/x-perl": ["pl", "pm"], "application/x-pilot": ["*prc", "*pdb"], "application/x-pkcs12": ["p12", "pfx"], "application/x-pkcs7-certificates": ["p7b", "spc"], "application/x-pkcs7-certreqresp": ["p7r"], "application/x-rar-compressed": ["*rar"], "application/x-redhat-package-manager": ["rpm"], "application/x-research-info-systems": ["ris"], "application/x-sea": ["sea"], "application/x-sh": ["sh"], "application/x-shar": ["shar"], "application/x-shockwave-flash": ["swf"], "application/x-silverlight-app": ["xap"], "application/x-sql": ["*sql"], "application/x-stuffit": ["sit"], "application/x-stuffitx": ["sitx"], "application/x-subrip": ["srt"], "application/x-sv4cpio": ["sv4cpio"], "application/x-sv4crc": ["sv4crc"], "application/x-t3vm-image": ["t3"], "application/x-tads": ["gam"], "application/x-tar": ["tar"], "application/x-tcl": ["tcl", "tk"], "application/x-tex": ["tex"], "application/x-tex-tfm": ["tfm"], "application/x-texinfo": ["texinfo", "texi"], "application/x-tgif": ["*obj"], "application/x-ustar": ["ustar"], "application/x-virtualbox-hdd": ["hdd"], "application/x-virtualbox-ova": ["ova"], "application/x-virtualbox-ovf": ["ovf"], "application/x-virtualbox-vbox": ["vbox"], "application/x-virtualbox-vbox-extpack": ["vbox-extpack"], "application/x-virtualbox-vdi": ["vdi"], "application/x-virtualbox-vhd": ["vhd"], "application/x-virtualbox-vmdk": ["vmdk"], "application/x-wais-source": ["src"], "application/x-web-app-manifest+json": ["webapp"], "application/x-x509-ca-cert": ["der", "crt", "pem"], "application/x-xfig": ["fig"], "application/x-xliff+xml": ["*xlf"], "application/x-xpinstall": ["xpi"], "application/x-xz": ["xz"], "application/x-zmachine": ["z1", "z2", "z3", "z4", "z5", "z6", "z7", "z8"], "audio/vnd.dece.audio": ["uva", "uvva"], "audio/vnd.digital-winds": ["eol"], "audio/vnd.dra": ["dra"], "audio/vnd.dts": ["dts"], "audio/vnd.dts.hd": ["dtshd"], "audio/vnd.lucent.voice": ["lvp"], "audio/vnd.ms-playready.media.pya": ["pya"], "audio/vnd.nuera.ecelp4800": ["ecelp4800"], "audio/vnd.nuera.ecelp7470": ["ecelp7470"], "audio/vnd.nuera.ecelp9600": ["ecelp9600"], "audio/vnd.rip": ["rip"], "audio/x-aac": ["*aac"], "audio/x-aiff": ["aif", "aiff", "aifc"], "audio/x-caf": ["caf"], "audio/x-flac": ["flac"], "audio/x-m4a": ["*m4a"], "audio/x-matroska": ["mka"], "audio/x-mpegurl": ["m3u"], "audio/x-ms-wax": ["wax"], "audio/x-ms-wma": ["wma"], "audio/x-pn-realaudio": ["ram", "ra"], "audio/x-pn-realaudio-plugin": ["rmp"], "audio/x-realaudio": ["*ra"], "audio/x-wav": ["*wav"], "chemical/x-cdx": ["cdx"], "chemical/x-cif": ["cif"], "chemical/x-cmdf": ["cmdf"], "chemical/x-cml": ["cml"], "chemical/x-csml": ["csml"], "chemical/x-xyz": ["xyz"], "image/prs.btif": ["btif", "btf"], "image/prs.pti": ["pti"], "image/vnd.adobe.photoshop": ["psd"], "image/vnd.airzip.accelerator.azv": ["azv"], "image/vnd.dece.graphic": ["uvi", "uvvi", "uvg", "uvvg"], "image/vnd.djvu": ["djvu", "djv"], "image/vnd.dvb.subtitle": ["*sub"], "image/vnd.dwg": ["dwg"], "image/vnd.dxf": ["dxf"], "image/vnd.fastbidsheet": ["fbs"], "image/vnd.fpx": ["fpx"], "image/vnd.fst": ["fst"], "image/vnd.fujixerox.edmics-mmr": ["mmr"], "image/vnd.fujixerox.edmics-rlc": ["rlc"], "image/vnd.microsoft.icon": ["ico"], "image/vnd.ms-dds": ["dds"], "image/vnd.ms-modi": ["mdi"], "image/vnd.ms-photo": ["wdp"], "image/vnd.net-fpx": ["npx"], "image/vnd.pco.b16": ["b16"], "image/vnd.tencent.tap": ["tap"], "image/vnd.valve.source.texture": ["vtf"], "image/vnd.wap.wbmp": ["wbmp"], "image/vnd.xiff": ["xif"], "image/vnd.zbrush.pcx": ["pcx"], "image/x-3ds": ["3ds"], "image/x-cmu-raster": ["ras"], "image/x-cmx": ["cmx"], "image/x-freehand": ["fh", "fhc", "fh4", "fh5", "fh7"], "image/x-icon": ["*ico"], "image/x-jng": ["jng"], "image/x-mrsid-image": ["sid"], "image/x-ms-bmp": ["*bmp"], "image/x-pcx": ["*pcx"], "image/x-pict": ["pic", "pct"], "image/x-portable-anymap": ["pnm"], "image/x-portable-bitmap": ["pbm"], "image/x-portable-graymap": ["pgm"], "image/x-portable-pixmap": ["ppm"], "image/x-rgb": ["rgb"], "image/x-tga": ["tga"], "image/x-xbitmap": ["xbm"], "image/x-xpixmap": ["xpm"], "image/x-xwindowdump": ["xwd"], "message/vnd.wfa.wsc": ["wsc"], "model/vnd.cld": ["cld"], "model/vnd.collada+xml": ["dae"], "model/vnd.dwf": ["dwf"], "model/vnd.gdl": ["gdl"], "model/vnd.gtw": ["gtw"], "model/vnd.mts": ["mts"], "model/vnd.opengex": ["ogex"], "model/vnd.parasolid.transmit.binary": ["x_b"], "model/vnd.parasolid.transmit.text": ["x_t"], "model/vnd.pytha.pyox": ["pyo", "pyox"], "model/vnd.sap.vds": ["vds"], "model/vnd.usda": ["usda"], "model/vnd.usdz+zip": ["usdz"], "model/vnd.valve.source.compiled-map": ["bsp"], "model/vnd.vtu": ["vtu"], "text/prs.lines.tag": ["dsc"], "text/vnd.curl": ["curl"], "text/vnd.curl.dcurl": ["dcurl"], "text/vnd.curl.mcurl": ["mcurl"], "text/vnd.curl.scurl": ["scurl"], "text/vnd.dvb.subtitle": ["sub"], "text/vnd.familysearch.gedcom": ["ged"], "text/vnd.fly": ["fly"], "text/vnd.fmi.flexstor": ["flx"], "text/vnd.graphviz": ["gv"], "text/vnd.in3d.3dml": ["3dml"], "text/vnd.in3d.spot": ["spot"], "text/vnd.sun.j2me.app-descriptor": ["jad"], "text/vnd.wap.wml": ["wml"], "text/vnd.wap.wmlscript": ["wmls"], "text/x-asm": ["s", "asm"], "text/x-c": ["c", "cc", "cxx", "cpp", "h", "hh", "dic"], "text/x-component": ["htc"], "text/x-fortran": ["f", "for", "f77", "f90"], "text/x-handlebars-template": ["hbs"], "text/x-java-source": ["java"], "text/x-lua": ["lua"], "text/x-markdown": ["mkd"], "text/x-nfo": ["nfo"], "text/x-opml": ["opml"], "text/x-org": ["*org"], "text/x-pascal": ["p", "pas"], "text/x-processing": ["pde"], "text/x-sass": ["sass"], "text/x-scss": ["scss"], "text/x-setext": ["etx"], "text/x-sfv": ["sfv"], "text/x-suse-ymp": ["ymp"], "text/x-uuencode": ["uu"], "text/x-vcalendar": ["vcs"], "text/x-vcard": ["vcf"], "video/vnd.dece.hd": ["uvh", "uvvh"], "video/vnd.dece.mobile": ["uvm", "uvvm"], "video/vnd.dece.pd": ["uvp", "uvvp"], "video/vnd.dece.sd": ["uvs", "uvvs"], "video/vnd.dece.video": ["uvv", "uvvv"], "video/vnd.dvb.file": ["dvb"], "video/vnd.fvt": ["fvt"], "video/vnd.mpegurl": ["mxu", "m4u"], "video/vnd.ms-playready.media.pyv": ["pyv"], "video/vnd.uvvu.mp4": ["uvu", "uvvu"], "video/vnd.vivo": ["viv"], "video/x-f4v": ["f4v"], "video/x-fli": ["fli"], "video/x-flv": ["flv"], "video/x-m4v": ["m4v"], "video/x-matroska": ["mkv", "mk3d", "mks"], "video/x-mng": ["mng"], "video/x-ms-asf": ["asf", "asx"], "video/x-ms-vob": ["vob"], "video/x-ms-wm": ["wm"], "video/x-ms-wmv": ["wmv"], "video/x-ms-wmx": ["wmx"], "video/x-ms-wvx": ["wvx"], "video/x-msvideo": ["avi"], "video/x-sgi-movie": ["movie"], "video/x-smv": ["smv"], "x-conference/x-cooltalk": ["ice"] };
@@ -185,33 +155,9 @@ async function uploadJsonToS3(client, bucket, key, data) {
185
155
  });
186
156
  await upload.done();
187
157
  }
188
- async function invalidateCloudFront(client, distributionId, paths) {
189
- if (paths.length === 0) {
190
- return;
191
- }
192
- const timestamp = (/* @__PURE__ */ new Date()).getTime();
193
- await client.send(
194
- new CreateInvalidationCommand({
195
- DistributionId: distributionId,
196
- InvalidationBatch: {
197
- CallerReference: `invalidation-${timestamp}`,
198
- Paths: {
199
- Quantity: paths.length,
200
- Items: paths
201
- }
202
- }
203
- })
204
- );
205
- }
206
- function removeBundleInternalKeys(bundle) {
207
- const { _updateJsonKey, _oldUpdateJsonKey, ...pureBundle } = bundle;
208
- return pureBundle;
209
- }
210
- async function listUpdateJsonKeys(client, bucketName, platform, channel) {
158
+ async function listObjectsInS3(client, bucketName, prefix) {
211
159
  let continuationToken;
212
160
  const keys = [];
213
- const prefix = channel ? platform ? `${channel}/${platform}/` : `${channel}/` : "";
214
- const pattern = channel ? platform ? new RegExp(`^${channel}/${platform}/[^/]+/update\\.json$`) : new RegExp(`^${channel}/[^/]+/[^/]+/update\\.json$`) : platform ? new RegExp(`^[^/]+/${platform}/[^/]+/update\\.json$`) : /^[^\/]+\/[^\/]+\/[^\/]+\/update\.json$/;
215
161
  do {
216
162
  const response = await client.send(
217
163
  new ListObjectsV2Command({
@@ -220,56 +166,37 @@ async function listUpdateJsonKeys(client, bucketName, platform, channel) {
220
166
  ContinuationToken: continuationToken
221
167
  })
222
168
  );
223
- const found = (response.Contents ?? []).map((item) => item.Key).filter((key) => !!key && pattern.test(key));
169
+ const found = (response.Contents ?? []).map((item) => item.Key).filter((key) => !!key);
224
170
  keys.push(...found);
225
171
  continuationToken = response.NextContinuationToken;
226
172
  } while (continuationToken);
227
173
  return keys;
228
174
  }
229
- async function updateTargetVersionsForPlatform(client, bucketName, platform) {
230
- let continuationToken;
231
- const keys = [];
232
- const pattern = new RegExp(`^[^/]+/${platform}/[^/]+/update\\.json$`);
233
- do {
234
- const response = await client.send(
235
- new ListObjectsV2Command({
236
- Bucket: bucketName,
237
- Prefix: "",
238
- ContinuationToken: continuationToken
239
- })
240
- );
241
- const found = (response.Contents ?? []).map((item) => item.Key).filter((key) => !!key && pattern.test(key));
242
- keys.push(...found);
243
- continuationToken = response.NextContinuationToken;
244
- } while (continuationToken);
245
- const keysByChannel = keys.reduce(
246
- (acc, key) => {
247
- const parts = key.split("/");
248
- const channel = parts[0];
249
- acc[channel] = acc[channel] || [];
250
- acc[channel].push(key);
251
- return acc;
252
- },
253
- {}
175
+ async function deleteObjectInS3(client, bucketName, key) {
176
+ await client.send(
177
+ new DeleteObjectCommand({
178
+ Bucket: bucketName,
179
+ Key: key
180
+ })
254
181
  );
255
- const updatedTargetFiles = /* @__PURE__ */ new Set();
256
- for (const channel of Object.keys(keysByChannel)) {
257
- const updateKeys = keysByChannel[channel];
258
- const targetKey = `${channel}/${platform}/target-app-versions.json`;
259
- const currentVersions = updateKeys.map((key) => key.split("/")[2]);
260
- const oldTargetVersions = await loadJsonFromS3(client, bucketName, targetKey) ?? [];
261
- const newTargetVersions = oldTargetVersions.filter(
262
- (v) => currentVersions.includes(v)
263
- );
264
- for (const v of currentVersions) {
265
- if (!newTargetVersions.includes(v)) newTargetVersions.push(v);
266
- }
267
- if (JSON.stringify(oldTargetVersions) !== JSON.stringify(newTargetVersions)) {
268
- await uploadJsonToS3(client, bucketName, targetKey, newTargetVersions);
269
- updatedTargetFiles.add(`/${targetKey}`);
270
- }
182
+ }
183
+ async function invalidateCloudFront(client, distributionId, paths) {
184
+ if (paths.length === 0) {
185
+ return;
271
186
  }
272
- return updatedTargetFiles;
187
+ const timestamp = (/* @__PURE__ */ new Date()).getTime();
188
+ await client.send(
189
+ new CreateInvalidationCommand({
190
+ DistributionId: distributionId,
191
+ InvalidationBatch: {
192
+ CallerReference: `invalidation-${timestamp}`,
193
+ Paths: {
194
+ Quantity: paths.length,
195
+ Items: paths
196
+ }
197
+ }
198
+ })
199
+ );
273
200
  }
274
201
  var s3Database = (config, hooks) => {
275
202
  const { bucketName, cloudfrontDistributionId, ...s3Config } = config;
@@ -281,193 +208,34 @@ var s3Database = (config, hooks) => {
281
208
  credentials: s3Config.credentials,
282
209
  region: s3Config.region
283
210
  });
284
- const bundlesMap = /* @__PURE__ */ new Map();
285
- const pendingBundlesMap = /* @__PURE__ */ new Map();
286
- const PLATFORMS = ["ios", "android"];
287
- async function reloadBundles() {
288
- bundlesMap.clear();
289
- const platformPromises = PLATFORMS.map(async (platform) => {
290
- const keys = await listUpdateJsonKeys(client, bucketName, platform);
291
- const filePromises = keys.map(async (key) => {
292
- const bundlesData = await loadJsonFromS3(client, bucketName, key) ?? [];
293
- return bundlesData.map((bundle) => ({
294
- ...bundle,
295
- _updateJsonKey: key
296
- }));
297
- });
298
- const results = await Promise.all(filePromises);
299
- return results.flat();
300
- });
301
- const allBundles = (await Promise.all(platformPromises)).flat();
302
- for (const bundle of allBundles) {
303
- bundlesMap.set(bundle.id, bundle);
304
- }
305
- for (const [id, bundle] of pendingBundlesMap.entries()) {
306
- bundlesMap.set(id, bundle);
211
+ const listObjects = (prefix) => listObjectsInS3(client, bucketName, prefix);
212
+ function loadObject(key) {
213
+ return loadJsonFromS3(client, bucketName, key);
214
+ }
215
+ function uploadObject(key, data) {
216
+ return uploadJsonToS3(client, bucketName, key, data);
217
+ }
218
+ function deleteObject(key) {
219
+ return deleteObjectInS3(client, bucketName, key);
220
+ }
221
+ async function invalidatePaths(pathsToInvalidate) {
222
+ if (cloudfrontClient && cloudfrontDistributionId && pathsToInvalidate.length > 0) {
223
+ await invalidateCloudFront(
224
+ cloudfrontClient,
225
+ cloudfrontDistributionId,
226
+ pathsToInvalidate
227
+ );
307
228
  }
308
- return orderBy(allBundles, [(v) => v.id], ["desc"]);
309
229
  }
310
- return createDatabasePlugin(
311
- "s3Database",
312
- {
313
- async getBundleById(bundleId) {
314
- const pendingBundle = pendingBundlesMap.get(bundleId);
315
- if (pendingBundle) {
316
- return removeBundleInternalKeys(pendingBundle);
317
- }
318
- const bundle = bundlesMap.get(bundleId);
319
- if (bundle) {
320
- return removeBundleInternalKeys(bundle);
321
- }
322
- const bundles = await reloadBundles();
323
- return bundles.find((bundle2) => bundle2.id === bundleId) ?? null;
324
- },
325
- async getBundles(options) {
326
- let bundles = await reloadBundles();
327
- const { where, limit, offset = 0 } = options ?? {};
328
- if (where) {
329
- bundles = bundles.filter((bundle) => {
330
- return Object.entries(where).every(
331
- ([key, value]) => value === void 0 || value === null || bundle[key] === value
332
- );
333
- });
334
- }
335
- if (offset > 0) {
336
- bundles = bundles.slice(offset);
337
- }
338
- if (limit) {
339
- bundles = bundles.slice(0, limit);
340
- }
341
- return bundles.map(removeBundleInternalKeys);
342
- },
343
- async getChannels() {
344
- const allBundles = await this.getBundles();
345
- return [...new Set(allBundles.map((bundle) => bundle.channel))];
346
- },
347
- async commitBundle({ changedSets }) {
348
- if (changedSets.length === 0) return;
349
- const changedBundlesByKey = {};
350
- const removalsByKey = {};
351
- const pathsToInvalidate = /* @__PURE__ */ new Set();
352
- for (const { operation, data } of changedSets) {
353
- if (operation === "insert") {
354
- const key = `${data.channel}/${data.platform}/${data.targetAppVersion}/update.json`;
355
- const bundleWithKey = {
356
- ...data,
357
- _updateJsonKey: key
358
- };
359
- bundlesMap.set(data.id, bundleWithKey);
360
- pendingBundlesMap.set(data.id, bundleWithKey);
361
- changedBundlesByKey[key] = changedBundlesByKey[key] || [];
362
- changedBundlesByKey[key].push(
363
- removeBundleInternalKeys(bundleWithKey)
364
- );
365
- pathsToInvalidate.add(`/${key}`);
366
- continue;
367
- }
368
- let bundle = pendingBundlesMap.get(data.id);
369
- if (!bundle) {
370
- bundle = bundlesMap.get(data.id);
371
- }
372
- if (!bundle) {
373
- throw new Error("targetBundleId not found");
374
- }
375
- if (operation === "update") {
376
- const newChannel = data.channel !== void 0 ? data.channel : bundle.channel;
377
- const newPlatform = data.platform !== void 0 ? data.platform : bundle.platform;
378
- const newTargetAppVersion = data.targetAppVersion !== void 0 ? data.targetAppVersion : bundle.targetAppVersion;
379
- const newKey = `${newChannel}/${newPlatform}/${newTargetAppVersion}/update.json`;
380
- if (newKey !== bundle._updateJsonKey) {
381
- const oldKey = bundle._updateJsonKey;
382
- removalsByKey[oldKey] = removalsByKey[oldKey] || [];
383
- removalsByKey[oldKey].push(bundle.id);
384
- changedBundlesByKey[newKey] = changedBundlesByKey[newKey] || [];
385
- const updatedBundle2 = { ...bundle, ...data };
386
- updatedBundle2._oldUpdateJsonKey = oldKey;
387
- updatedBundle2._updateJsonKey = newKey;
388
- bundlesMap.set(data.id, updatedBundle2);
389
- pendingBundlesMap.set(data.id, updatedBundle2);
390
- changedBundlesByKey[newKey].push(
391
- removeBundleInternalKeys(updatedBundle2)
392
- );
393
- pathsToInvalidate.add(`/${oldKey}`);
394
- pathsToInvalidate.add(`/${newKey}`);
395
- continue;
396
- }
397
- const currentKey = bundle._updateJsonKey;
398
- const updatedBundle = { ...bundle, ...data };
399
- bundlesMap.set(data.id, updatedBundle);
400
- pendingBundlesMap.set(data.id, updatedBundle);
401
- changedBundlesByKey[currentKey] = changedBundlesByKey[currentKey] || [];
402
- changedBundlesByKey[currentKey].push(
403
- removeBundleInternalKeys(updatedBundle)
404
- );
405
- pathsToInvalidate.add(`/${currentKey}`);
406
- }
407
- }
408
- for (const oldKey of Object.keys(removalsByKey)) {
409
- await (async () => {
410
- const currentBundles = await loadJsonFromS3(client, bucketName, oldKey) ?? [];
411
- const updatedBundles = currentBundles.filter(
412
- (b) => !removalsByKey[oldKey].includes(b.id)
413
- );
414
- updatedBundles.sort((a, b) => b.id.localeCompare(a.id));
415
- if (updatedBundles.length === 0) {
416
- await client.send(
417
- new DeleteObjectCommand({ Bucket: bucketName, Key: oldKey })
418
- );
419
- } else {
420
- await uploadJsonToS3(client, bucketName, oldKey, updatedBundles);
421
- }
422
- })();
423
- }
424
- for (const key of Object.keys(changedBundlesByKey)) {
425
- await (async () => {
426
- const currentBundles = await loadJsonFromS3(client, bucketName, key) ?? [];
427
- const pureBundles = changedBundlesByKey[key].map(
428
- (bundle) => bundle
429
- );
430
- for (const changedBundle of pureBundles) {
431
- const index = currentBundles.findIndex(
432
- (b) => b.id === changedBundle.id
433
- );
434
- if (index >= 0) {
435
- currentBundles[index] = changedBundle;
436
- } else {
437
- currentBundles.push(changedBundle);
438
- }
439
- }
440
- currentBundles.sort((a, b) => b.id.localeCompare(a.id));
441
- await uploadJsonToS3(client, bucketName, key, currentBundles);
442
- })();
443
- }
444
- const updatedTargetFilePaths = /* @__PURE__ */ new Set();
445
- for (const platform of PLATFORMS) {
446
- const updatedPaths = await updateTargetVersionsForPlatform(
447
- client,
448
- bucketName,
449
- platform
450
- );
451
- for (const path2 of updatedPaths) {
452
- updatedTargetFilePaths.add(path2);
453
- }
454
- }
455
- for (const path2 of updatedTargetFilePaths) {
456
- pathsToInvalidate.add(path2);
457
- }
458
- if (cloudfrontClient && cloudfrontDistributionId && pathsToInvalidate.size > 0) {
459
- await invalidateCloudFront(
460
- cloudfrontClient,
461
- cloudfrontDistributionId,
462
- Array.from(pathsToInvalidate)
463
- );
464
- }
465
- pendingBundlesMap.clear();
466
- hooks?.onDatabaseUpdated?.();
467
- }
468
- },
230
+ return createBlobDatabasePlugin({
231
+ name: "s3Database",
232
+ listObjects,
233
+ loadObject,
234
+ uploadObject,
235
+ deleteObject,
236
+ invalidatePaths,
469
237
  hooks
470
- );
238
+ });
471
239
  };
472
240
 
473
241
  // src/s3Storage.ts
@@ -1891,10 +1891,8 @@ var __webpack_modules__ = {
1891
1891
  }
1892
1892
  constructor(comp, options) {
1893
1893
  options = parseOptions(options);
1894
- if (comp instanceof Comparator) {
1895
- if (!!options.loose === comp.loose) return comp;
1896
- comp = comp.value;
1897
- }
1894
+ if (comp instanceof Comparator) if (!!options.loose === comp.loose) return comp;
1895
+ else comp = comp.value;
1898
1896
  comp = comp.trim().split(/\s+/).join(" ");
1899
1897
  debug("comparator", comp, options);
1900
1898
  this.options = options;
@@ -1960,10 +1958,8 @@ var __webpack_modules__ = {
1960
1958
  class Range {
1961
1959
  constructor(range, options) {
1962
1960
  options = parseOptions(options);
1963
- if (range instanceof Range) {
1964
- if (!!options.loose === range.loose && !!options.includePrerelease === range.includePrerelease) return range;
1965
- return new Range(range.raw, options);
1966
- }
1961
+ if (range instanceof Range) if (!!options.loose === range.loose && !!options.includePrerelease === range.includePrerelease) return range;
1962
+ else return new Range(range.raw, options);
1967
1963
  if (range instanceof Comparator) {
1968
1964
  this.raw = range.value;
1969
1965
  this.set = [
@@ -2222,10 +2218,9 @@ var __webpack_modules__ = {
2222
2218
  class SemVer {
2223
2219
  constructor(version, options) {
2224
2220
  options = parseOptions(options);
2225
- if (version instanceof SemVer) {
2226
- if (!!options.loose === version.loose && !!options.includePrerelease === version.includePrerelease) return version;
2227
- version = version.version;
2228
- } else if ("string" != typeof version) throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version}".`);
2221
+ if (version instanceof SemVer) if (!!options.loose === version.loose && !!options.includePrerelease === version.includePrerelease) return version;
2222
+ else version = version.version;
2223
+ else if ("string" != typeof version) throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version}".`);
2229
2224
  if (version.length > MAX_LENGTH) throw new TypeError(`version is longer than ${MAX_LENGTH} characters`);
2230
2225
  debug("SemVer", version, options);
2231
2226
  this.options = options;
@@ -3069,12 +3064,10 @@ var __webpack_modules__ = {
3069
3064
  ]);
3070
3065
  const ranges = [];
3071
3066
  for (const [min, max] of set) if (min === max) ranges.push(min);
3072
- else if (max || min !== v[0]) {
3073
- if (max) {
3074
- if (min === v[0]) ranges.push(`<=${max}`);
3075
- else ranges.push(`${min} - ${max}`);
3076
- } else ranges.push(`>=${min}`);
3077
- } else ranges.push("*");
3067
+ else if (max || min !== v[0]) if (max) if (min === v[0]) ranges.push(`<=${max}`);
3068
+ else ranges.push(`${min} - ${max}`);
3069
+ else ranges.push(`>=${min}`);
3070
+ else ranges.push("*");
3078
3071
  const simplified = ranges.join(" || ");
3079
3072
  const original = "string" == typeof range.raw ? range.raw : String(range);
3080
3073
  return simplified.length < original.length ? simplified : range;
@@ -3109,14 +3102,10 @@ var __webpack_modules__ = {
3109
3102
  ];
3110
3103
  const simpleSubset = (sub, dom, options) => {
3111
3104
  if (sub === dom) return true;
3112
- if (1 === sub.length && sub[0].semver === ANY) {
3113
- if (1 === dom.length && dom[0].semver === ANY) return true;
3114
- sub = options.includePrerelease ? minimumVersionWithPreRelease : minimumVersion;
3115
- }
3116
- if (1 === dom.length && dom[0].semver === ANY) {
3117
- if (options.includePrerelease) return true;
3118
- dom = minimumVersion;
3119
- }
3105
+ if (1 === sub.length && sub[0].semver === ANY) if (1 === dom.length && dom[0].semver === ANY) return true;
3106
+ else sub = options.includePrerelease ? minimumVersionWithPreRelease : minimumVersion;
3107
+ if (1 === dom.length && dom[0].semver === ANY) if (options.includePrerelease) return true;
3108
+ else dom = minimumVersion;
3120
3109
  const eqSet = /* @__PURE__ */ new Set();
3121
3110
  let gt, lt;
3122
3111
  for (const c of sub) if (">" === c.operator || ">=" === c.operator) gt = higherGT(gt, c, options);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@hot-updater/aws",
3
3
  "type": "module",
4
- "version": "0.16.2",
4
+ "version": "0.16.4",
5
5
  "description": "React Native OTA solution for self-hosted",
6
6
  "main": "dist/index.cjs",
7
7
  "module": "dist/index.js",
@@ -36,8 +36,8 @@
36
36
  ],
37
37
  "devDependencies": {
38
38
  "@aws-sdk/cloudfront-signer": "3.772.0",
39
- "@hot-updater/core": "0.16.2",
40
- "@hot-updater/js": "0.16.2",
39
+ "@hot-updater/core": "0.16.4",
40
+ "@hot-updater/js": "0.16.4",
41
41
  "@types/aws-lambda": "^8.10.147",
42
42
  "@types/node": "^22.13.1",
43
43
  "aws-sdk-client-mock": "^4.1.0",
@@ -56,7 +56,7 @@
56
56
  "@aws-sdk/client-ssm": "3.772.0",
57
57
  "@aws-sdk/credential-providers": "3.772.0",
58
58
  "@aws-sdk/lib-storage": "3.772.0",
59
- "@hot-updater/plugin-core": "0.16.2",
59
+ "@hot-updater/plugin-core": "0.16.4",
60
60
  "aws-lambda": "1.0.7"
61
61
  },
62
62
  "scripts": {